@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,81 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Deploy chrome copy that official assistant-ui templates read at runtime.
|
|
5
|
+
* ProductStockShell provides it. /baseline preview has no provider — skins
|
|
6
|
+
* keep their catalog demo strings.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { createContext, useContext } from "react";
|
|
10
|
+
import { DEFAULT_THREAD_SKIN, type ThreadSkin } from "../skins/thread-skins";
|
|
11
|
+
import type { ChromeMode, PageContextMode } from "./skin-types";
|
|
12
|
+
|
|
13
|
+
export type SkinChromeValue = {
|
|
14
|
+
skin: ThreadSkin;
|
|
15
|
+
theme: "dark" | "light";
|
|
16
|
+
/** Deploy `chrome.mode`. Compact composer on embed / modal / sidebar. */
|
|
17
|
+
mode: ChromeMode;
|
|
18
|
+
title?: string;
|
|
19
|
+
welcome?: string;
|
|
20
|
+
welcomeBody?: readonly string[];
|
|
21
|
+
placeholder?: string;
|
|
22
|
+
suggestions: readonly string[];
|
|
23
|
+
accent: { color: string; foreground: string } | null;
|
|
24
|
+
modelPicker: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Deploy `features.pageContext`. `silent` keeps the system
|
|
27
|
+
* `page-context.html` attachment out of the composer and sent-message chips.
|
|
28
|
+
*/
|
|
29
|
+
pageContext: PageContextMode;
|
|
30
|
+
/**
|
|
31
|
+
* Whether the "powered by digichat" credit may render on this surface.
|
|
32
|
+
*
|
|
33
|
+
* Resolved by the host from the deployment / embed tenant
|
|
34
|
+
* (`chrome.attribution` / `tenantCfg.attribution`), so an explicit
|
|
35
|
+
* `attribution: false` opt-out suppresses the skin's credit. Without this the
|
|
36
|
+
* embed's opt-out was ignored (the skins mounted the credit unconditionally),
|
|
37
|
+
* and a titled opted-out tenant rendered two credits — the header
|
|
38
|
+
* parenthetical *and* the skin footer (m2502 review, M2).
|
|
39
|
+
*/
|
|
40
|
+
attribution: boolean;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export const DEFAULT_SKIN_CHROME: SkinChromeValue = {
|
|
44
|
+
skin: DEFAULT_THREAD_SKIN,
|
|
45
|
+
theme: "light",
|
|
46
|
+
mode: "embed",
|
|
47
|
+
suggestions: [],
|
|
48
|
+
accent: null,
|
|
49
|
+
modelPicker: false,
|
|
50
|
+
pageContext: "visible",
|
|
51
|
+
attribution: true,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
const SkinChromeContext = createContext<SkinChromeValue>(DEFAULT_SKIN_CHROME);
|
|
55
|
+
|
|
56
|
+
export const SkinChromeProvider = SkinChromeContext.Provider;
|
|
57
|
+
|
|
58
|
+
export function useSkinChrome(): SkinChromeValue {
|
|
59
|
+
return useContext(SkinChromeContext);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Whether the surface may render the credit. Defaults to `true` off the
|
|
64
|
+
* provider (`/baseline` preview, catalog demos) so the credit appears by
|
|
65
|
+
* default; a host that resolved `attribution: false` from config turns it off.
|
|
66
|
+
*/
|
|
67
|
+
export function useAttribution(): boolean {
|
|
68
|
+
return useContext(SkinChromeContext).attribution;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Catalog fallback when deploy YAML omits welcome / placeholder. */
|
|
72
|
+
export function useComposerCopy(fallbackWelcome: string, fallbackPlaceholder: string) {
|
|
73
|
+
const chrome = useSkinChrome();
|
|
74
|
+
return {
|
|
75
|
+
title: chrome.title?.trim() || undefined,
|
|
76
|
+
welcome: chrome.welcome?.trim() || fallbackWelcome,
|
|
77
|
+
welcomeBody: chrome.welcomeBody ?? [],
|
|
78
|
+
placeholder: chrome.placeholder?.trim() || fallbackPlaceholder,
|
|
79
|
+
suggestions: chrome.suggestions,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Shared "powered by digichat" branding line.
|
|
5
|
+
*
|
|
6
|
+
* Every skin renders this same component at the bottom of the page at all
|
|
7
|
+
* times — empty thread included. It is branding, not a disclaimer: the
|
|
8
|
+
* watermark stays visible from the very beginning. (Catalog products gate
|
|
9
|
+
* their own "can make mistakes" line on the first message; ours never
|
|
10
|
+
* gates.) Parents do the pinning: an absolute bottom wrapper in empty
|
|
11
|
+
* states, the sticky viewport footer once messages exist. One component
|
|
12
|
+
* (not per-skin copies) keeps the branding identical on every skin we
|
|
13
|
+
* ship.
|
|
14
|
+
*
|
|
15
|
+
* It paints no canvas of its own: tiny centered text inheriting the surface
|
|
16
|
+
* color at reduced opacity, no border or separator. It returns null when the
|
|
17
|
+
* host opted out (`chrome.attribution: false` / embed `attribution: false`),
|
|
18
|
+
* read from `SkinChromeProvider` (default on without a provider).
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import type { FC } from "react";
|
|
22
|
+
import { cn } from "../../../lib/utils";
|
|
23
|
+
import { useAttribution } from "./skin-chrome";
|
|
24
|
+
import { useEmbedChatPrefsOptional } from "./embed-chat-prefs";
|
|
25
|
+
|
|
26
|
+
export const SKIN_CREDIT_TEXT = "powered by digichat, a digithings product.";
|
|
27
|
+
|
|
28
|
+
export const SkinCredit: FC<{
|
|
29
|
+
className?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Explicit override for surfaces with no SkinChromeProvider — the embed's
|
|
32
|
+
* gate/paywall branch, which resolved placement itself. Omit everywhere
|
|
33
|
+
* else to read the host's resolved `attribution` from context.
|
|
34
|
+
*/
|
|
35
|
+
attribution?: boolean;
|
|
36
|
+
}> = ({ className, attribution }) => {
|
|
37
|
+
const fromContext = useAttribution();
|
|
38
|
+
// A tenant chat language may translate the words around the link.
|
|
39
|
+
const credit = useEmbedChatPrefsOptional()?.credit;
|
|
40
|
+
if (attribution !== undefined ? !attribution : !fromContext) return null;
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<p
|
|
44
|
+
data-testid="skin-credit"
|
|
45
|
+
data-slot="aui_credit"
|
|
46
|
+
className={cn(
|
|
47
|
+
"aui-skin-credit pt-0.5 text-center text-[0.6875rem] leading-3.5",
|
|
48
|
+
className,
|
|
49
|
+
)}
|
|
50
|
+
>
|
|
51
|
+
{credit?.lead ?? "powered by digichat, a"}{" "}
|
|
52
|
+
<a
|
|
53
|
+
href="https://digithings.ai"
|
|
54
|
+
target="_blank"
|
|
55
|
+
rel="noreferrer noopener"
|
|
56
|
+
className="pointer-events-auto font-medium text-inherit underline-offset-2 hover:underline"
|
|
57
|
+
>
|
|
58
|
+
digithings
|
|
59
|
+
</a>
|
|
60
|
+
{credit ? (/^[.,;:!?]/.test(credit.tail) ? "" : " ") + credit.tail : " product."}
|
|
61
|
+
</p>
|
|
62
|
+
);
|
|
63
|
+
};
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import "../../../styles/chat-skin-palette.css";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
useEffect,
|
|
7
|
+
useRef,
|
|
8
|
+
useState,
|
|
9
|
+
type ReactNode,
|
|
10
|
+
} from "react";
|
|
11
|
+
import { createPortal } from "react-dom";
|
|
12
|
+
import { ComposerPrimitive } from "@assistant-ui/react";
|
|
13
|
+
import { ComposerTriggerPopover } from "../gallery-thread/composer-trigger-popover.aui";
|
|
14
|
+
import {
|
|
15
|
+
useSkinSlashPalette,
|
|
16
|
+
type DigichatSkinSlash,
|
|
17
|
+
type SkinSlashPalette,
|
|
18
|
+
} from "./skin-slash-palette";
|
|
19
|
+
import { SkinPaletteContext } from "./skin-palette-context";
|
|
20
|
+
import { useEmbedChatPrefsOptional } from "./embed-chat-prefs";
|
|
21
|
+
|
|
22
|
+
/** Marks the thread composer form the shared palette is anchored to. */
|
|
23
|
+
export const SKIN_PALETTE_COMPOSER_ATTR = "data-skin-palette-composer";
|
|
24
|
+
|
|
25
|
+
function composerForms(root: ParentNode): HTMLFormElement[] {
|
|
26
|
+
return Array.from(root.querySelectorAll("form")).filter(
|
|
27
|
+
(form) =>
|
|
28
|
+
!form.closest("[data-message-id]") &&
|
|
29
|
+
Boolean(form.querySelector('textarea, [contenteditable="true"]')),
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Laid out (not `display: none` or inside a hidden layout branch). */
|
|
34
|
+
function isRendered(form: HTMLFormElement): boolean {
|
|
35
|
+
return form.getClientRects().length > 0;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The thread composer of the skin inside `scope`: a form holding a text
|
|
40
|
+
* input that is not an edit composer inside a message. Layout skins that
|
|
41
|
+
* open the thread in a popover (the assistant modal) portal it out of the
|
|
42
|
+
* scope, and some keep a hidden desktop thread next to the mobile popover
|
|
43
|
+
* one, so the pick is: the composer being typed in, else the last one on
|
|
44
|
+
* screen (in the scope first, then in a popover), else the last in the
|
|
45
|
+
* scope, else the last in a popover.
|
|
46
|
+
*/
|
|
47
|
+
export function findThreadComposer(scope: HTMLElement): HTMLFormElement | null {
|
|
48
|
+
const inScope = composerForms(scope);
|
|
49
|
+
const portaled = composerForms(scope.ownerDocument).filter(
|
|
50
|
+
(form) =>
|
|
51
|
+
!scope.contains(form) &&
|
|
52
|
+
Boolean(form.closest("[data-radix-popper-content-wrapper]")),
|
|
53
|
+
);
|
|
54
|
+
const active = scope.ownerDocument.activeElement;
|
|
55
|
+
const focused = active
|
|
56
|
+
? [...inScope, ...portaled].find((form) => form.contains(active))
|
|
57
|
+
: undefined;
|
|
58
|
+
return (
|
|
59
|
+
focused ??
|
|
60
|
+
inScope.filter(isRendered).at(-1) ??
|
|
61
|
+
portaled.filter(isRendered).at(-1) ??
|
|
62
|
+
inScope.at(-1) ??
|
|
63
|
+
portaled.at(-1) ??
|
|
64
|
+
null
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export type SkinPaletteBridgeProps = {
|
|
69
|
+
/** Product slash wiring from the host. Absent = the skin renders as is. */
|
|
70
|
+
slash?: DigichatSkinSlash | undefined;
|
|
71
|
+
privateMode?: boolean | undefined;
|
|
72
|
+
children: ReactNode;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Gives any skin the product `/` palette (and `@` tools) without the skin
|
|
77
|
+
* knowing about it. Same commands and submit behaviour as the digichat skin,
|
|
78
|
+
* which wires the palette into its own composer instead.
|
|
79
|
+
*
|
|
80
|
+
* - One `Unstable_TriggerPopoverRoot` around the skin, so whichever
|
|
81
|
+
* `ComposerPrimitive.Input` the skin renders registers with it.
|
|
82
|
+
* - The popovers portal into the thread composer form, which the stylesheet
|
|
83
|
+
* makes the positioning box, so they sit right above it like the digichat
|
|
84
|
+
* palette.
|
|
85
|
+
* - Slash submits (block, pane, force, run) are caught in the capture phase
|
|
86
|
+
* and never reach the skin's own send handler.
|
|
87
|
+
*/
|
|
88
|
+
/**
|
|
89
|
+
* The visual prefs a skin that is not digichat reads from its scope:
|
|
90
|
+
* `/density` respaces the messages and `/scrollbar` shows or hides the bars
|
|
91
|
+
* of the skin's scroll surfaces (chat-skin-palette.css). Prefs come through
|
|
92
|
+
* the provider overlay, so a hovered row in the `/` menu previews here too.
|
|
93
|
+
*/
|
|
94
|
+
function useSkinLook(): { density: string; scrollbars: "always" | "auto" } {
|
|
95
|
+
const chatPrefs = useEmbedChatPrefsOptional()?.prefs;
|
|
96
|
+
return {
|
|
97
|
+
density: chatPrefs?.density ?? "default",
|
|
98
|
+
scrollbars: chatPrefs?.scrollbars ?? "always",
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** The look attributes alone, for a skin mounted without the palette. */
|
|
103
|
+
function SkinLookScope({ children }: { children: ReactNode }) {
|
|
104
|
+
const { density, scrollbars } = useSkinLook();
|
|
105
|
+
return (
|
|
106
|
+
<div
|
|
107
|
+
data-skin-look-scope=""
|
|
108
|
+
data-skin-density={density}
|
|
109
|
+
data-skin-scrollbars={scrollbars}
|
|
110
|
+
style={{ display: "contents" }}
|
|
111
|
+
>
|
|
112
|
+
{children}
|
|
113
|
+
</div>
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function SkinPaletteBridge({
|
|
118
|
+
slash,
|
|
119
|
+
privateMode,
|
|
120
|
+
children,
|
|
121
|
+
}: SkinPaletteBridgeProps) {
|
|
122
|
+
const palette = useSkinSlashPalette({ slash, privateMode });
|
|
123
|
+
if (!palette.enabled) return <SkinLookScope>{children}</SkinLookScope>;
|
|
124
|
+
return <SkinPaletteScope palette={palette}>{children}</SkinPaletteScope>;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function SkinPaletteScope({
|
|
128
|
+
palette,
|
|
129
|
+
children,
|
|
130
|
+
}: {
|
|
131
|
+
palette: SkinSlashPalette;
|
|
132
|
+
children: ReactNode;
|
|
133
|
+
}) {
|
|
134
|
+
const scopeRef = useRef<HTMLDivElement | null>(null);
|
|
135
|
+
// `/density` for skins that are not digichat: the scope carries the choice
|
|
136
|
+
// and chat-skin-palette.css respaces the messages under it.
|
|
137
|
+
const { density, scrollbars } = useSkinLook();
|
|
138
|
+
const [anchor, setAnchor] = useState<HTMLFormElement | null>(null);
|
|
139
|
+
const submitRef = useRef(palette.handleSubmit);
|
|
140
|
+
submitRef.current = palette.handleSubmit;
|
|
141
|
+
const anchorRef = useRef<HTMLFormElement | null>(null);
|
|
142
|
+
anchorRef.current = anchor;
|
|
143
|
+
|
|
144
|
+
// Skins mount the composer lazily and swap it (welcome vs. thread), so the
|
|
145
|
+
// anchor is re-found after DOM changes, at most once per frame.
|
|
146
|
+
useEffect(() => {
|
|
147
|
+
const scope = scopeRef.current;
|
|
148
|
+
if (!scope) return;
|
|
149
|
+
let frame = 0;
|
|
150
|
+
const find = () => {
|
|
151
|
+
frame = 0;
|
|
152
|
+
const next = findThreadComposer(scope);
|
|
153
|
+
setAnchor((prev) => (prev === next ? prev : next));
|
|
154
|
+
};
|
|
155
|
+
find();
|
|
156
|
+
const observer = new MutationObserver(() => {
|
|
157
|
+
if (!frame) frame = requestAnimationFrame(find);
|
|
158
|
+
});
|
|
159
|
+
// The body, not the scope: a popover-hosted thread mounts in a portal.
|
|
160
|
+
observer.observe(scope.ownerDocument.body, { childList: true, subtree: true });
|
|
161
|
+
// Focus moving between composers (or a breakpoint hiding one) changes
|
|
162
|
+
// which one is live without touching the DOM tree.
|
|
163
|
+
const refind = () => {
|
|
164
|
+
if (!frame) frame = requestAnimationFrame(find);
|
|
165
|
+
};
|
|
166
|
+
scope.ownerDocument.addEventListener("focusin", refind);
|
|
167
|
+
window.addEventListener("resize", refind);
|
|
168
|
+
return () => {
|
|
169
|
+
observer.disconnect();
|
|
170
|
+
scope.ownerDocument.removeEventListener("focusin", refind);
|
|
171
|
+
window.removeEventListener("resize", refind);
|
|
172
|
+
if (frame) cancelAnimationFrame(frame);
|
|
173
|
+
};
|
|
174
|
+
}, []);
|
|
175
|
+
|
|
176
|
+
useEffect(() => {
|
|
177
|
+
if (!anchor) return;
|
|
178
|
+
anchor.setAttribute(SKIN_PALETTE_COMPOSER_ATTR, "");
|
|
179
|
+
return () => anchor.removeAttribute(SKIN_PALETTE_COMPOSER_ATTR);
|
|
180
|
+
}, [anchor]);
|
|
181
|
+
|
|
182
|
+
// Capture phase on the document, so it runs before the skin's own submit
|
|
183
|
+
// handler (React listens at the root) even for a portaled composer.
|
|
184
|
+
useEffect(() => {
|
|
185
|
+
const onSubmit = (event: Event) => {
|
|
186
|
+
if (!anchorRef.current || event.target !== anchorRef.current) return;
|
|
187
|
+
if (submitRef.current(event)) event.stopPropagation();
|
|
188
|
+
};
|
|
189
|
+
document.addEventListener("submit", onSubmit, true);
|
|
190
|
+
return () => document.removeEventListener("submit", onSubmit, true);
|
|
191
|
+
}, []);
|
|
192
|
+
|
|
193
|
+
return (
|
|
194
|
+
<SkinPaletteContext.Provider value={palette}>
|
|
195
|
+
<ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
196
|
+
<div
|
|
197
|
+
ref={scopeRef}
|
|
198
|
+
data-skin-palette-scope=""
|
|
199
|
+
data-skin-density={density}
|
|
200
|
+
data-skin-scrollbars={scrollbars}
|
|
201
|
+
style={{ display: "contents" }}
|
|
202
|
+
>
|
|
203
|
+
{children}
|
|
204
|
+
</div>
|
|
205
|
+
{anchor ? createPortal(<SkinPalettePopovers palette={palette} />, anchor) : null}
|
|
206
|
+
</ComposerPrimitive.Unstable_TriggerPopoverRoot>
|
|
207
|
+
</SkinPaletteContext.Provider>
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function SkinPalettePopovers({ palette }: { palette: SkinSlashPalette }) {
|
|
212
|
+
return (
|
|
213
|
+
<>
|
|
214
|
+
{palette.slash ? (
|
|
215
|
+
<ComposerTriggerPopover
|
|
216
|
+
char="/"
|
|
217
|
+
className="skin-palette"
|
|
218
|
+
adapter={palette.slash.adapter}
|
|
219
|
+
action={palette.slash.action}
|
|
220
|
+
matcher={palette.slash.matcher}
|
|
221
|
+
emptyItemsLabel="No matching commands"
|
|
222
|
+
/>
|
|
223
|
+
) : null}
|
|
224
|
+
{palette.mention ? (
|
|
225
|
+
<ComposerTriggerPopover
|
|
226
|
+
char="@"
|
|
227
|
+
className="skin-palette"
|
|
228
|
+
adapter={palette.mention.adapter}
|
|
229
|
+
directive={palette.mention.directive}
|
|
230
|
+
emptyItemsLabel="No matching tools"
|
|
231
|
+
/>
|
|
232
|
+
) : null}
|
|
233
|
+
</>
|
|
234
|
+
);
|
|
235
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { createContext, useContext } from "react";
|
|
4
|
+
import type { SkinSlashPalette } from "./skin-slash-palette";
|
|
5
|
+
|
|
6
|
+
/** Set by `SkinPaletteBridge` when the host wired the product palette. */
|
|
7
|
+
export const SkinPaletteContext = createContext<SkinSlashPalette | null>(null);
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The shared palette, when the host wired one. A skin that mounts its own
|
|
11
|
+
* `Unstable_TriggerPopoverRoot` reads this to drop that root (a nested root
|
|
12
|
+
* shadows the shared one) and leave the `/` menu to the bridge.
|
|
13
|
+
*/
|
|
14
|
+
export function useSkinPaletteOptional(): SkinSlashPalette | null {
|
|
15
|
+
return useContext(SkinPaletteContext);
|
|
16
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { createContext, useContext, type ReactNode } from "react";
|
|
4
|
+
|
|
5
|
+
// Host-injected runtime for the catalog skins (WS4 Step 3).
|
|
6
|
+
//
|
|
7
|
+
// Skins render inside many hosts (product shell, /baseline catalog, embeds).
|
|
8
|
+
// Anything a skin needs that lives in the host app — error copy, session
|
|
9
|
+
// config, menu panes — enters through this context, never through an `@/`
|
|
10
|
+
// import (packages cannot import app code). Hosts provide values at their
|
|
11
|
+
// ThreadSkinView mount points; fields stay optional so a host that does not
|
|
12
|
+
// care keeps today's rendering.
|
|
13
|
+
|
|
14
|
+
// String-compatible mirror of the app's ParsedEmbedChatError. The app's
|
|
15
|
+
// parse/format fns assign directly to SkinErrorParsers.
|
|
16
|
+
export type ParsedSkinError = {
|
|
17
|
+
code?: string;
|
|
18
|
+
message?: string;
|
|
19
|
+
detail?: string;
|
|
20
|
+
raw: string;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export type SkinErrorParsers = {
|
|
24
|
+
parseError: (error: Error | undefined) => ParsedSkinError | null;
|
|
25
|
+
formatError: (error: Error | undefined) => string | null;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export type SkinRuntimeValue = {
|
|
29
|
+
errorParsers?: SkinErrorParsers;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const SkinRuntimeContext = createContext<SkinRuntimeValue>({});
|
|
33
|
+
|
|
34
|
+
export const SkinRuntimeProvider = SkinRuntimeContext.Provider;
|
|
35
|
+
|
|
36
|
+
export function useSkinRuntime(): SkinRuntimeValue {
|
|
37
|
+
return useContext(SkinRuntimeContext);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function SkinRuntime({
|
|
41
|
+
value,
|
|
42
|
+
children,
|
|
43
|
+
}: {
|
|
44
|
+
value: SkinRuntimeValue;
|
|
45
|
+
children: ReactNode;
|
|
46
|
+
}) {
|
|
47
|
+
return (
|
|
48
|
+
<SkinRuntimeContext.Provider value={value}>
|
|
49
|
+
{children}
|
|
50
|
+
</SkinRuntimeContext.Provider>
|
|
51
|
+
);
|
|
52
|
+
}
|