@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,204 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
@digithings-ai/ui — WordReveal structural CSS (components/typography/WordReveal).
|
|
3
|
+
Import AFTER the token bridge, in the app's globals.css:
|
|
4
|
+
@import "tailwindcss";
|
|
5
|
+
@import "@digithings-ai/design/tokens.css";
|
|
6
|
+
@import "@digithings-ai/ui/styles/web-theme.css";
|
|
7
|
+
@import "@digithings-ai/ui/styles/word-reveal.css";
|
|
8
|
+
@source "<path-to>/packages/ui/src/components/typography";
|
|
9
|
+
The @source line is load-bearing (path relative to the app's globals.css):
|
|
10
|
+
the component carries token-backed kicker/title utilities, and Tailwind does
|
|
11
|
+
not scan package sources on its own.
|
|
12
|
+
|
|
13
|
+
Utilities in <WordReveal/> carry the kicker/title type + the scroll→opacity/
|
|
14
|
+
blur mapping (inline MotionValues). This file holds only what must stay CSS:
|
|
15
|
+
the taller-than-viewport pinned track, the sticky pin, the display-line type,
|
|
16
|
+
and the reduced-motion + no-JS static fallbacks — the reveal must never gate
|
|
17
|
+
the claim; it reads fully with no JS.
|
|
18
|
+
|
|
19
|
+
Reference note: the muted/outline sibling variants (reference-only) reuse the
|
|
20
|
+
.wr-track / .wr-sticky / .word-line shell defined here and add their own
|
|
21
|
+
per-word color treatments in reference/app/typography/typography.css.
|
|
22
|
+
========================================================================== */
|
|
23
|
+
|
|
24
|
+
/* ── pinned track ──────────────────────────────────────────────────────────
|
|
25
|
+
.wr-track is taller than the viewport and .wr-sticky pins the line at
|
|
26
|
+
mid-viewport. The reveal itself rides the line's ENTRY (scroll offset
|
|
27
|
+
["start end","start start"] in WordReveal.tsx): words fill as the line
|
|
28
|
+
rises and finish by the time the pin engages, so the pinned remainder
|
|
29
|
+
(height − 100vh) is only a short hold before the page flows on — the text
|
|
30
|
+
can never leave the viewport half-revealed. Keep the track short: the tail
|
|
31
|
+
after the pin is dead scroll. */
|
|
32
|
+
.wr-track {
|
|
33
|
+
/* component tokens — pinned track + display line */
|
|
34
|
+
--wr-track-h: 150vh;
|
|
35
|
+
--wr-static-pad: 2.5rem;
|
|
36
|
+
--wr-line-font: clamp(1.55rem, 4.2vw, 2.6rem);
|
|
37
|
+
--wr-measure: 24ch;
|
|
38
|
+
--wr-word-gap: 0.35em;
|
|
39
|
+
--tw-caret-w: 0.55em;
|
|
40
|
+
--tw-caret-h: 1.05em;
|
|
41
|
+
--tw-caret-lead: 0.08em;
|
|
42
|
+
--tw-caret-trail: -0.63em;
|
|
43
|
+
|
|
44
|
+
position: relative;
|
|
45
|
+
height: var(--wr-track-h);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.wr-sticky {
|
|
49
|
+
position: sticky;
|
|
50
|
+
top: 0;
|
|
51
|
+
min-height: 100vh;
|
|
52
|
+
min-height: 100svh;
|
|
53
|
+
display: flex;
|
|
54
|
+
align-items: center;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* static branch (the useReducedMotion hook adds .is-static) */
|
|
58
|
+
.wr-track.is-static {
|
|
59
|
+
height: auto;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.wr-track.is-static .wr-sticky {
|
|
63
|
+
position: static;
|
|
64
|
+
min-height: 0;
|
|
65
|
+
padding: var(--wr-static-pad, 2.5rem) 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* ── display line ──────────────────────────────────────────────────────────── */
|
|
69
|
+
.word-line {
|
|
70
|
+
margin: 0;
|
|
71
|
+
font-family: var(--font-display);
|
|
72
|
+
font-size: var(--wr-line-font, clamp(1.55rem, 4.2vw, 2.6rem));
|
|
73
|
+
letter-spacing: -0.02em;
|
|
74
|
+
line-height: 1.15;
|
|
75
|
+
max-width: var(--wr-measure, 24ch);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.word {
|
|
79
|
+
display: inline-block;
|
|
80
|
+
margin-inline-end: var(--wr-word-gap, 0.35em);
|
|
81
|
+
will-change: transform, opacity, filter;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* ── reduced motion: final state, no pinned scroll gap ──────────────────────
|
|
85
|
+
The hook renders the static branch; this covers pre-hydration paint and
|
|
86
|
+
forces the finished state regardless of the inline MotionValues. */
|
|
87
|
+
@media (prefers-reduced-motion: reduce) {
|
|
88
|
+
.wr-track {
|
|
89
|
+
height: auto;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.wr-sticky {
|
|
93
|
+
position: static;
|
|
94
|
+
min-height: 0;
|
|
95
|
+
padding: var(--wr-static-pad, 2.5rem) 0;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.word {
|
|
99
|
+
opacity: 1 !important;
|
|
100
|
+
transform: none !important;
|
|
101
|
+
filter: none !important;
|
|
102
|
+
transition: none !important;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/* ── no JS: content-first (law 06) ──────────────────────────────────────────
|
|
107
|
+
With scripts off the reveal never runs AND the reduced-motion query may not
|
|
108
|
+
fire, so SSR's baked-in low opacity/blur would hide the claim. html.no-js
|
|
109
|
+
(set on <html>, stripped pre-paint when JS runs) neutralizes it: final text,
|
|
110
|
+
no 240vh empty scroll gap. Mirrors the hero's html.no-js fallback rules. */
|
|
111
|
+
html.no-js .wr-track {
|
|
112
|
+
height: auto;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
html.no-js .wr-sticky {
|
|
116
|
+
position: static;
|
|
117
|
+
min-height: 0;
|
|
118
|
+
padding: var(--wr-static-pad, 2.5rem) 0;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
html.no-js .word {
|
|
122
|
+
opacity: 1 !important;
|
|
123
|
+
transform: none !important;
|
|
124
|
+
filter: none !important;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/* ── TypewriterReveal ───────────────────────────────────────────────────────
|
|
128
|
+
The unpinned third sibling: characters appear in order with a caret as the
|
|
129
|
+
line travels. No track and no pin, so it adds no height to the band.
|
|
130
|
+
|
|
131
|
+
The ghost is the whole point. Revealing characters one at a time reflows the
|
|
132
|
+
paragraph on every tick, so the full text is laid out once in a `visibility:
|
|
133
|
+
hidden` copy and the typed copy is drawn on top of it — the box is the size of
|
|
134
|
+
the finished quote from the first frame, and nothing below it moves.
|
|
135
|
+
`visibility: hidden` rather than `display: none` or `opacity: 0`, because only
|
|
136
|
+
`visibility` keeps the text's layout contribution while taking it out of the
|
|
137
|
+
accessibility tree's way (the component also marks it aria-hidden, and the
|
|
138
|
+
visible layers with it, exposing the full line once in `.tw-sr`). */
|
|
139
|
+
.tw {
|
|
140
|
+
position: relative;
|
|
141
|
+
display: block;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.tw-ghost {
|
|
145
|
+
visibility: hidden;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/* Overlaid on the ghost, so the two wrap at exactly the same width. */
|
|
149
|
+
.tw-live {
|
|
150
|
+
position: absolute;
|
|
151
|
+
inset-block-start: 0;
|
|
152
|
+
inset-inline: 0;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* The caret rides at the type edge. Net-zero width, like the chat caret, so
|
|
156
|
+
appearing and retiring never rewraps the line it is attached to. */
|
|
157
|
+
.tw-caret {
|
|
158
|
+
display: inline-block;
|
|
159
|
+
width: var(--tw-caret-w, 0.55em);
|
|
160
|
+
height: var(--tw-caret-h, 1.05em);
|
|
161
|
+
margin-inline-start: var(--tw-caret-lead, 0.08em);
|
|
162
|
+
margin-inline-end: var(--tw-caret-trail, -0.63em);
|
|
163
|
+
vertical-align: text-bottom;
|
|
164
|
+
background: var(--accent);
|
|
165
|
+
animation: tw-caret-blink 1.06s steps(1) infinite;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
@keyframes tw-caret-blink {
|
|
169
|
+
0%,
|
|
170
|
+
49% {
|
|
171
|
+
opacity: 1;
|
|
172
|
+
}
|
|
173
|
+
50%,
|
|
174
|
+
100% {
|
|
175
|
+
opacity: 0;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/* The one readable copy. The visual layers are aria-hidden, so assistive tech
|
|
180
|
+
gets the finished quote exactly once rather than a partial, still-typing one. */
|
|
181
|
+
.tw-sr {
|
|
182
|
+
position: absolute;
|
|
183
|
+
width: 1px;
|
|
184
|
+
height: 1px;
|
|
185
|
+
margin: -1px;
|
|
186
|
+
padding: 0;
|
|
187
|
+
overflow: hidden;
|
|
188
|
+
clip-path: inset(50%);
|
|
189
|
+
white-space: nowrap;
|
|
190
|
+
border: 0;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/* Reduced motion never types (the component renders the whole line), so the
|
|
194
|
+
caret has nothing to point at — and a blinking cursor under a motion
|
|
195
|
+
preference is exactly the thing the preference is asking not to see. Both
|
|
196
|
+
declarations: `display: none` takes it out of the line, and `animation: none`
|
|
197
|
+
is what the reduced-motion contract test requires of any infinite animation
|
|
198
|
+
in this sheet, whether or not the element is painted. */
|
|
199
|
+
@media (prefers-reduced-motion: reduce) {
|
|
200
|
+
.tw-caret {
|
|
201
|
+
display: none;
|
|
202
|
+
animation: none;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform theme: mode (`dt-theme`) and palette (`dt-palette`).
|
|
3
|
+
*
|
|
4
|
+
* `dt-theme` stores only `light` or `dark`. Auto removes the key so the OS
|
|
5
|
+
* preference applies and live-updates. The dashboard writes the same key with
|
|
6
|
+
* the resolved light/dark value and never touches `dt-palette`.
|
|
7
|
+
*/
|
|
8
|
+
import { PALETTE_IDS, PALETTES, type PaletteId } from "./palette-registry";
|
|
9
|
+
|
|
10
|
+
export const THEME_STORAGE_KEY = "dt-theme";
|
|
11
|
+
/** Fired on the document's window after every applyDocumentTheme, so a provider can re-read it. */
|
|
12
|
+
export const THEME_CHANGE_EVENT = "dt-theme-change";
|
|
13
|
+
export const PALETTE_STORAGE_KEY = "dt-palette";
|
|
14
|
+
|
|
15
|
+
export type ThemePreference = "light" | "dark" | "auto";
|
|
16
|
+
export type ResolvedTheme = "light" | "dark";
|
|
17
|
+
export type PaletteName = PaletteId | "default";
|
|
18
|
+
|
|
19
|
+
/** Default canvas, matching tokens.css `--bg`. Read by `<meta name="theme-color">`. */
|
|
20
|
+
export const DEFAULT_THEME_COLOR: Record<ResolvedTheme, string> = {
|
|
21
|
+
light: "#FBFBF9", // canon-allow: default --bg for the browser theme-color meta
|
|
22
|
+
dark: "#0A0E0C", // canon-allow: default --bg for the browser theme-color meta
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export function isPaletteId(value: string): value is PaletteId {
|
|
26
|
+
return (PALETTE_IDS as readonly string[]).includes(value);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function isThemePreference(value: string): value is ThemePreference {
|
|
30
|
+
return value === "light" || value === "dark" || value === "auto";
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function normalizePalette(value: string | null | undefined): PaletteName {
|
|
34
|
+
if (!value) return "default";
|
|
35
|
+
const id = value.trim().toLowerCase();
|
|
36
|
+
if (id === "default") return "default";
|
|
37
|
+
return isPaletteId(id) ? id : "default";
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
type GetItem = { getItem(key: string): string | null };
|
|
41
|
+
|
|
42
|
+
function safeStorage(): GetItem | null {
|
|
43
|
+
try {
|
|
44
|
+
if (typeof localStorage === "undefined") return null;
|
|
45
|
+
return localStorage;
|
|
46
|
+
} catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function readPreference(storage: GetItem | null): ThemePreference {
|
|
52
|
+
if (!storage) return "auto";
|
|
53
|
+
try {
|
|
54
|
+
const raw = storage.getItem(THEME_STORAGE_KEY);
|
|
55
|
+
if (raw === "light" || raw === "dark") return raw;
|
|
56
|
+
} catch {
|
|
57
|
+
/* private mode */
|
|
58
|
+
}
|
|
59
|
+
return "auto";
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function readPalette(storage: GetItem | null): PaletteName {
|
|
63
|
+
if (!storage) return "default";
|
|
64
|
+
try {
|
|
65
|
+
return normalizePalette(storage.getItem(PALETTE_STORAGE_KEY));
|
|
66
|
+
} catch {
|
|
67
|
+
return "default";
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function resolveTheme(preference: ThemePreference, prefersLight: boolean): ResolvedTheme {
|
|
72
|
+
if (preference === "light" || preference === "dark") return preference;
|
|
73
|
+
return prefersLight ? "light" : "dark";
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export function themeColorFor(palette: string, resolved: ResolvedTheme): string {
|
|
77
|
+
const id = normalizePalette(palette);
|
|
78
|
+
if (id === "default") return DEFAULT_THEME_COLOR[resolved];
|
|
79
|
+
return PALETTES[id][resolved].bg;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export type ThemeState = {
|
|
83
|
+
preference: ThemePreference;
|
|
84
|
+
palette: PaletteName;
|
|
85
|
+
resolved: ResolvedTheme;
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
function prefersLightNow(): boolean {
|
|
89
|
+
if (typeof matchMedia !== "function") return false;
|
|
90
|
+
try {
|
|
91
|
+
return matchMedia("(prefers-color-scheme: light)").matches;
|
|
92
|
+
} catch {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** What the document is painting right now (the pre-paint script or a pin set it). */
|
|
98
|
+
export function readPaintedTheme(
|
|
99
|
+
doc: Document | null = typeof document === "undefined" ? null : document,
|
|
100
|
+
): { resolved: ResolvedTheme; palette: PaletteName } {
|
|
101
|
+
const root = doc?.documentElement;
|
|
102
|
+
return {
|
|
103
|
+
resolved: root?.getAttribute("data-theme") === "light" ? "light" : "dark",
|
|
104
|
+
palette: normalizePalette(root?.getAttribute("data-palette")),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function readThemeState(storage?: GetItem | null, prefersLight?: boolean): ThemeState {
|
|
109
|
+
const store = storage === undefined ? safeStorage() : storage;
|
|
110
|
+
const preference = readPreference(store);
|
|
111
|
+
const palette = readPalette(store);
|
|
112
|
+
const resolved = resolveTheme(preference, prefersLight ?? prefersLightNow());
|
|
113
|
+
return { preference, palette, resolved };
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function writeKey(storage: Storage, key: string, value: string | null): void {
|
|
117
|
+
try {
|
|
118
|
+
if (value === null) storage.removeItem(key);
|
|
119
|
+
else storage.setItem(key, value);
|
|
120
|
+
} catch {
|
|
121
|
+
/* ignore */
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Paint `data-theme` / `data-palette` and, for a user's choice, persist it.
|
|
127
|
+
* Auto clears `dt-theme`; the default palette clears `dt-palette`. Pass
|
|
128
|
+
* `{ persist: false }` to repaint without writing (an OS light/dark change).
|
|
129
|
+
*/
|
|
130
|
+
export function applyDocumentTheme(
|
|
131
|
+
preference: ThemePreference,
|
|
132
|
+
palette: string,
|
|
133
|
+
doc: Document | null = typeof document === "undefined" ? null : document,
|
|
134
|
+
options: { persist?: boolean } = {},
|
|
135
|
+
): ResolvedTheme {
|
|
136
|
+
const pal = normalizePalette(palette);
|
|
137
|
+
const resolved = resolveTheme(preference, prefersLightNow());
|
|
138
|
+
if (doc) {
|
|
139
|
+
const root = doc.documentElement;
|
|
140
|
+
root.setAttribute("data-theme", resolved);
|
|
141
|
+
if (pal === "default") root.removeAttribute("data-palette");
|
|
142
|
+
else root.setAttribute("data-palette", pal);
|
|
143
|
+
try {
|
|
144
|
+
let meta = doc.querySelector('meta[name="theme-color"]');
|
|
145
|
+
if (!meta) {
|
|
146
|
+
meta = doc.createElement("meta");
|
|
147
|
+
meta.setAttribute("name", "theme-color");
|
|
148
|
+
doc.head.appendChild(meta);
|
|
149
|
+
}
|
|
150
|
+
meta.setAttribute("content", themeColorFor(pal, resolved));
|
|
151
|
+
} catch {
|
|
152
|
+
/* ignore */
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const store = options.persist === false ? null : safeStorage();
|
|
156
|
+
if (store && "setItem" in store) {
|
|
157
|
+
const writable = store as Storage;
|
|
158
|
+
writeKey(writable, THEME_STORAGE_KEY, preference === "auto" ? null : preference);
|
|
159
|
+
writeKey(writable, PALETTE_STORAGE_KEY, pal === "default" ? null : pal);
|
|
160
|
+
}
|
|
161
|
+
if (doc) {
|
|
162
|
+
try {
|
|
163
|
+
doc.defaultView?.dispatchEvent(new Event(THEME_CHANGE_EVENT));
|
|
164
|
+
} catch {
|
|
165
|
+
/* ignore */
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return resolved;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** One stop on the shared cycle: default dark, default light, then each palette in dark and light. */
|
|
172
|
+
export type ThemeStep = {
|
|
173
|
+
id: string;
|
|
174
|
+
label: string;
|
|
175
|
+
mode: "dark" | "light";
|
|
176
|
+
palette: PaletteName;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
export function themeCycle(): readonly ThemeStep[] {
|
|
180
|
+
const steps: ThemeStep[] = [
|
|
181
|
+
{ id: "default:dark", label: "default · dark", mode: "dark", palette: "default" },
|
|
182
|
+
{ id: "default:light", label: "default · light", mode: "light", palette: "default" },
|
|
183
|
+
];
|
|
184
|
+
for (const id of PALETTE_IDS) {
|
|
185
|
+
steps.push({ id: `${id}:dark`, label: `${id} · dark`, mode: "dark", palette: id });
|
|
186
|
+
steps.push({ id: `${id}:light`, label: `${id} · light`, mode: "light", palette: id });
|
|
187
|
+
}
|
|
188
|
+
return steps;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** The cycle stop that matches the painted mode and palette. Auto uses the resolved mode. */
|
|
192
|
+
export function matchThemeStep(
|
|
193
|
+
preference: ThemePreference,
|
|
194
|
+
palette: PaletteName,
|
|
195
|
+
resolved: ResolvedTheme,
|
|
196
|
+
): ThemeStep {
|
|
197
|
+
const mode = preference === "auto" ? resolved : preference;
|
|
198
|
+
const steps = themeCycle();
|
|
199
|
+
return steps.find((step) => step.mode === mode && step.palette === palette) ?? steps[0];
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/** The next stop after the painted one. Wraps to default dark. */
|
|
203
|
+
export function nextThemeStep(
|
|
204
|
+
preference: ThemePreference,
|
|
205
|
+
palette: PaletteName,
|
|
206
|
+
resolved: ResolvedTheme,
|
|
207
|
+
): ThemeStep {
|
|
208
|
+
const steps = themeCycle();
|
|
209
|
+
const current = matchThemeStep(preference, palette, resolved);
|
|
210
|
+
const index = steps.findIndex((step) => step.id === current.id);
|
|
211
|
+
return steps[(index + 1) % steps.length];
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export { PALETTE_IDS, PALETTES, type PaletteId };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export {
|
|
2
|
+
applyDocumentTheme,
|
|
3
|
+
DEFAULT_THEME_COLOR,
|
|
4
|
+
isPaletteId,
|
|
5
|
+
isThemePreference,
|
|
6
|
+
matchThemeStep,
|
|
7
|
+
nextThemeStep,
|
|
8
|
+
normalizePalette,
|
|
9
|
+
PALETTE_IDS,
|
|
10
|
+
PALETTES,
|
|
11
|
+
PALETTE_STORAGE_KEY,
|
|
12
|
+
readPaintedTheme,
|
|
13
|
+
readPalette,
|
|
14
|
+
readPreference,
|
|
15
|
+
readThemeState,
|
|
16
|
+
resolveTheme,
|
|
17
|
+
THEME_CHANGE_EVENT,
|
|
18
|
+
THEME_STORAGE_KEY,
|
|
19
|
+
themeColorFor,
|
|
20
|
+
themeCycle,
|
|
21
|
+
type PaletteId,
|
|
22
|
+
type PaletteName,
|
|
23
|
+
type ResolvedTheme,
|
|
24
|
+
type ThemePreference,
|
|
25
|
+
type ThemeState,
|
|
26
|
+
type ThemeStep,
|
|
27
|
+
} from "./apply-theme";
|