@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,551 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
nav-shell.css — state machinery for <NavShell/> (components/NavShell.tsx).
|
|
3
|
+
Import once in an app's globals.css, after web-theme.css:
|
|
4
|
+
@import "@digithings-ai/ui/styles/nav-shell.css";
|
|
5
|
+
|
|
6
|
+
Static layout (row, lead, brand, links strip, tail cluster) is token-backed
|
|
7
|
+
Tailwind utilities in the component. Everything here is what utilities can't
|
|
8
|
+
express cleanly: the fixed bar's settle/yield transitions and its two-colour
|
|
9
|
+
color-mix backdrop band, the JS-toggled state classes (.is-scrolled,
|
|
10
|
+
.is-hidden, .is-menu-open), the hamburger's parent-state span transforms,
|
|
11
|
+
descendant dressing of slotted content (.theme-toggle, .btn-icon, sheet
|
|
12
|
+
links), the dropdown group (trigger, caret, panel) and its sheet counterpart
|
|
13
|
+
(a labelled section), the portal overlay pair (scrim + sheet), and the
|
|
14
|
+
breakpoint / reduced-motion guards.
|
|
15
|
+
|
|
16
|
+
Layering contract — one hidden-state idiom, used three times: an overlay
|
|
17
|
+
surface stays in the DOM and is parked with `visibility: hidden` +
|
|
18
|
+
`pointer-events: none` (plus opacity/transform for the travel), then
|
|
19
|
+
unparked by an `.is-open` class. The scrim, the sheet and the dropdown panel
|
|
20
|
+
all follow it, so every one of them can transition, and none of them can
|
|
21
|
+
trap a tab stop while closed.
|
|
22
|
+
|
|
23
|
+
The bar reads --nav-shell-h (fallback 62px) so apps can retune height in one
|
|
24
|
+
place — and reuse it for scroll-padding-top / anchor offsets.
|
|
25
|
+
========================================================================== */
|
|
26
|
+
|
|
27
|
+
/* ── the bar: settle after 8px, yield past 180px (scroll-down only) ─────── */
|
|
28
|
+
.nav-shell {
|
|
29
|
+
/* component tokens — nav bar geometry (the bar height stays the
|
|
30
|
+
consumer's --nav-shell-h, fallback 62px) */
|
|
31
|
+
--nav-group-gap: 0.34rem;
|
|
32
|
+
--nav-caret: 0.3rem;
|
|
33
|
+
--nav-menu-min-w: 11rem;
|
|
34
|
+
--nav-menu-gap: 0.2rem;
|
|
35
|
+
--nav-menu-pad: 0.4rem;
|
|
36
|
+
--nav-menu-item-pad-block: 0.45rem;
|
|
37
|
+
--nav-menu-item-pad-inline: 0.7rem;
|
|
38
|
+
--nav-icon-pad: 0.5rem;
|
|
39
|
+
--nav-toggle-gap: 5px;
|
|
40
|
+
--nav-toggle-line-w: 18px;
|
|
41
|
+
--nav-toggle-line-h: 1.5px;
|
|
42
|
+
--nav-toggle-shift: 3.25px;
|
|
43
|
+
|
|
44
|
+
position: fixed;
|
|
45
|
+
top: 0;
|
|
46
|
+
inset-inline-start: 0;
|
|
47
|
+
inset-inline-end: 0;
|
|
48
|
+
height: var(--nav-shell-h, 62px);
|
|
49
|
+
z-index: 210;
|
|
50
|
+
display: flex;
|
|
51
|
+
align-items: center;
|
|
52
|
+
border-bottom: 1px solid transparent;
|
|
53
|
+
transition:
|
|
54
|
+
transform 0.4s var(--ease),
|
|
55
|
+
background 0.3s var(--ease),
|
|
56
|
+
border-color 0.3s var(--ease);
|
|
57
|
+
}
|
|
58
|
+
.nav-shell.is-scrolled {
|
|
59
|
+
background: color-mix(in srgb, var(--bg) 72%, transparent);
|
|
60
|
+
backdrop-filter: blur(14px);
|
|
61
|
+
-webkit-backdrop-filter: blur(14px);
|
|
62
|
+
border-bottom-color: var(--hair);
|
|
63
|
+
}
|
|
64
|
+
.nav-shell.is-hidden {
|
|
65
|
+
transform: translateY(calc(-1 * var(--nav-shell-h, 62px) - 1px));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/* ── clipped band: the backdrop + hairline live on a frame-width child ────
|
|
69
|
+
For a document drawn between the persistent LayoutLines, a full-bleed bar
|
|
70
|
+
would paint across the rules that define the page. The bar itself stays
|
|
71
|
+
fixed and full-width (nothing about the row's layout changes); only its
|
|
72
|
+
*dress* — the scrolled backdrop and the bottom hairline — moves onto a
|
|
73
|
+
pseudo-element inset to the same column as LayoutLines, so the band's edges
|
|
74
|
+
land exactly on the rules. The header's own background/border are cleared so
|
|
75
|
+
nothing shows outside the column.
|
|
76
|
+
|
|
77
|
+
z-index: -1 keeps the dress behind the row (the row is z-[56]) while the
|
|
78
|
+
header's 210 still sits above page content. */
|
|
79
|
+
.nav-shell.is-clipped {
|
|
80
|
+
border-bottom-color: transparent;
|
|
81
|
+
}
|
|
82
|
+
.nav-shell.is-clipped::before {
|
|
83
|
+
content: "";
|
|
84
|
+
position: absolute;
|
|
85
|
+
inset-block: 0;
|
|
86
|
+
/* Centred, capped to the rails — mirrors LayoutLines' geometry
|
|
87
|
+
(`max-w-[calc(var(--frame-w)+2*var(--line-pad))]`, where `--line-pad`
|
|
88
|
+
is the page gutter), so the band's edges land exactly on the rules and
|
|
89
|
+
the bar reads full-width between the vertical grid. */
|
|
90
|
+
inset-inline-start: 50%;
|
|
91
|
+
translate: -50% 0;
|
|
92
|
+
width: 100%;
|
|
93
|
+
/* One hairline short on each side, so the rails' own 1px columns stay
|
|
94
|
+
visible through the blurred band. */
|
|
95
|
+
max-width: calc(
|
|
96
|
+
var(--frame-w, var(--wrap, 1180px)) + 2 * var(--page-pad, var(--gutter, 1.5rem)) - 2px
|
|
97
|
+
);
|
|
98
|
+
z-index: -1;
|
|
99
|
+
pointer-events: none;
|
|
100
|
+
background: transparent;
|
|
101
|
+
border-bottom: 1px solid transparent;
|
|
102
|
+
transition:
|
|
103
|
+
background 0.3s var(--ease),
|
|
104
|
+
border-color 0.3s var(--ease);
|
|
105
|
+
}
|
|
106
|
+
.nav-shell.is-clipped.is-scrolled {
|
|
107
|
+
background: transparent;
|
|
108
|
+
backdrop-filter: none;
|
|
109
|
+
-webkit-backdrop-filter: none;
|
|
110
|
+
border-bottom-color: transparent;
|
|
111
|
+
}
|
|
112
|
+
.nav-shell.is-clipped.is-scrolled::before {
|
|
113
|
+
background: color-mix(in srgb, var(--bg) 72%, transparent);
|
|
114
|
+
backdrop-filter: blur(14px);
|
|
115
|
+
-webkit-backdrop-filter: blur(14px);
|
|
116
|
+
border-bottom-color: var(--hair);
|
|
117
|
+
}
|
|
118
|
+
/* An open dropdown pins the bar: yielding would take the panel with it. */
|
|
119
|
+
.nav-shell[data-group-open="true"].is-hidden {
|
|
120
|
+
transform: none;
|
|
121
|
+
}
|
|
122
|
+
/* A translated-offscreen bar is still in tab order (unlike visibility:hidden
|
|
123
|
+
or display:none) — Tab reaches its links same as always, this just makes
|
|
124
|
+
sure they scroll into view once focused, for both hide grammars. Same
|
|
125
|
+
backdrop as .is-scrolled: a keyboard-revealed bar overlays content exactly
|
|
126
|
+
like a hover-revealed one, and JS never got a mousemove to add that class. */
|
|
127
|
+
.nav-shell.is-hidden:focus-within {
|
|
128
|
+
transform: none;
|
|
129
|
+
background: color-mix(in srgb, var(--bg) 72%, transparent);
|
|
130
|
+
backdrop-filter: blur(14px);
|
|
131
|
+
-webkit-backdrop-filter: blur(14px);
|
|
132
|
+
border-bottom-color: var(--hair);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* ── inline links: hover ink on descendants ─────────────────────────────── */
|
|
136
|
+
.nav-shell-links a {
|
|
137
|
+
transition: color 0.2s var(--ease);
|
|
138
|
+
}
|
|
139
|
+
.nav-shell-links a:hover {
|
|
140
|
+
color: var(--ink);
|
|
141
|
+
}
|
|
142
|
+
/* The current route (NavShell marks it from currentPath via hrefIsCurrent):
|
|
143
|
+
ink weight plus an accent hairline, so "you are here" reads distinctly from
|
|
144
|
+
hover. An inset shadow, not a border — a border would grow the anchor's box
|
|
145
|
+
and nudge the row. */
|
|
146
|
+
.nav-shell-links a[aria-current="page"] {
|
|
147
|
+
color: var(--ink);
|
|
148
|
+
box-shadow: inset 0 -1px 0 var(--accent);
|
|
149
|
+
}
|
|
150
|
+
.nav-shell-menu-item[aria-current="page"],
|
|
151
|
+
.nav-shell-sheet-links a[aria-current="page"] {
|
|
152
|
+
color: var(--ink);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/* ── dropdown group (wide bar only; the sheet gets sections instead) ──────
|
|
156
|
+
The panel is positioned against its group box, so the anchor chain is
|
|
157
|
+
stretched to the bar's full height — row → strip → group — and `top: 100%`
|
|
158
|
+
then lands exactly on the bar's bottom hairline instead of floating
|
|
159
|
+
mid-bar. Each stretched box re-centres its own content, so nothing moves.
|
|
160
|
+
─────────────────────────────────────────────────────────────────────── */
|
|
161
|
+
.nav-shell-row {
|
|
162
|
+
align-self: stretch;
|
|
163
|
+
}
|
|
164
|
+
.nav-shell-links {
|
|
165
|
+
align-self: stretch;
|
|
166
|
+
align-items: center;
|
|
167
|
+
}
|
|
168
|
+
.nav-shell-group {
|
|
169
|
+
position: relative;
|
|
170
|
+
align-self: stretch;
|
|
171
|
+
display: inline-flex;
|
|
172
|
+
align-items: center;
|
|
173
|
+
}
|
|
174
|
+
.nav-shell-group-trigger {
|
|
175
|
+
display: inline-flex;
|
|
176
|
+
align-items: center;
|
|
177
|
+
gap: var(--nav-group-gap);
|
|
178
|
+
margin: 0;
|
|
179
|
+
padding: 0;
|
|
180
|
+
border: 0;
|
|
181
|
+
background: transparent;
|
|
182
|
+
font: inherit;
|
|
183
|
+
color: inherit;
|
|
184
|
+
cursor: pointer;
|
|
185
|
+
transition: color 0.2s var(--ease);
|
|
186
|
+
}
|
|
187
|
+
.nav-shell-group-trigger:hover,
|
|
188
|
+
.nav-shell-group[data-open="true"] .nav-shell-group-trigger {
|
|
189
|
+
color: var(--ink);
|
|
190
|
+
}
|
|
191
|
+
/* borders, not a glyph: the caret follows ink through [data-theme] and needs
|
|
192
|
+
no font metrics to sit straight. Physical borders on purpose — the caret is
|
|
193
|
+
a vertical (down/up) affordance built from a rotated corner, so mirroring it
|
|
194
|
+
under dir=rtl would tilt it the wrong way. */
|
|
195
|
+
.nav-shell-group-caret {
|
|
196
|
+
width: var(--nav-caret);
|
|
197
|
+
height: var(--nav-caret);
|
|
198
|
+
border-right: 1.2px solid currentColor;
|
|
199
|
+
border-bottom: 1.2px solid currentColor;
|
|
200
|
+
transform: translateY(calc(-1 * var(--nav-caret) / 3)) rotate(45deg);
|
|
201
|
+
transition: transform 0.2s var(--ease);
|
|
202
|
+
}
|
|
203
|
+
.nav-shell-group[data-open="true"] .nav-shell-group-caret {
|
|
204
|
+
transform: translateY(0.02rem) rotate(-135deg);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/* the panel: same parked-then-unparked contract as the sheet below. Hairline +
|
|
208
|
+
blurred band, no drop shadow — quiet by default. */
|
|
209
|
+
.nav-shell-menu {
|
|
210
|
+
position: absolute;
|
|
211
|
+
top: 100%;
|
|
212
|
+
/* physical on purpose: centering pairs left:50% with a physical
|
|
213
|
+
translateX(-50%), so it must not mirror (it is direction-neutral). */
|
|
214
|
+
left: 50%;
|
|
215
|
+
z-index: 1; /* the tail cluster follows the strip in the DOM */
|
|
216
|
+
display: flex;
|
|
217
|
+
flex-direction: column;
|
|
218
|
+
min-width: max(var(--nav-menu-min-w), 100%);
|
|
219
|
+
margin-top: var(--nav-menu-gap);
|
|
220
|
+
padding: var(--nav-menu-pad);
|
|
221
|
+
border: 1px solid var(--hair);
|
|
222
|
+
border-radius: 0;
|
|
223
|
+
background: color-mix(in srgb, var(--bg) 92%, transparent);
|
|
224
|
+
backdrop-filter: blur(14px);
|
|
225
|
+
-webkit-backdrop-filter: blur(14px);
|
|
226
|
+
opacity: 0;
|
|
227
|
+
visibility: hidden;
|
|
228
|
+
pointer-events: none;
|
|
229
|
+
transform: translateX(-50%) translateY(calc(-1 * var(--nav-caret)));
|
|
230
|
+
/* visibility is stepped, not interpolated: on close it waits out the fade
|
|
231
|
+
(0s delayed by 0.2s); on open it flips at once, with no transition at all.
|
|
232
|
+
A transitioned `visibility` would still compute as `hidden` at t=0, and the
|
|
233
|
+
first thing an opening menu does is focus an item — focus() on a hidden
|
|
234
|
+
element is a silent no-op, so the keyboard would appear dead. */
|
|
235
|
+
transition:
|
|
236
|
+
opacity 0.2s var(--ease),
|
|
237
|
+
transform 0.2s var(--ease),
|
|
238
|
+
visibility 0s linear 0.2s;
|
|
239
|
+
}
|
|
240
|
+
.nav-shell-menu.is-open {
|
|
241
|
+
opacity: 1;
|
|
242
|
+
visibility: visible;
|
|
243
|
+
pointer-events: auto;
|
|
244
|
+
transform: translateX(-50%);
|
|
245
|
+
transition:
|
|
246
|
+
opacity 0.2s var(--ease),
|
|
247
|
+
transform 0.2s var(--ease);
|
|
248
|
+
}
|
|
249
|
+
.nav-shell-menu-item {
|
|
250
|
+
display: block;
|
|
251
|
+
padding: var(--nav-menu-item-pad-block) var(--nav-menu-item-pad-inline);
|
|
252
|
+
border-radius: 0;
|
|
253
|
+
color: var(--ink-soft);
|
|
254
|
+
white-space: nowrap;
|
|
255
|
+
transition:
|
|
256
|
+
color 0.2s var(--ease),
|
|
257
|
+
background 0.2s var(--ease);
|
|
258
|
+
}
|
|
259
|
+
.nav-shell-menu-item:hover,
|
|
260
|
+
.nav-shell-menu-item:focus-visible {
|
|
261
|
+
color: var(--ink);
|
|
262
|
+
background: color-mix(in srgb, var(--ink) 7%, transparent);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/* ── tail cluster: theme toggle, slotted actions, hamburger — borderless,
|
|
266
|
+
no fill, glyph/lines only (descendant overrides of slotted content) ── */
|
|
267
|
+
.nav-shell-tail .theme-toggle,
|
|
268
|
+
.nav-shell-tail .btn-icon,
|
|
269
|
+
.nav-shell-toggle {
|
|
270
|
+
display: inline-flex;
|
|
271
|
+
align-items: center;
|
|
272
|
+
justify-content: center;
|
|
273
|
+
padding: var(--nav-icon-pad, 0.5rem);
|
|
274
|
+
background: transparent;
|
|
275
|
+
border: none;
|
|
276
|
+
box-shadow: none;
|
|
277
|
+
color: var(--ink-mute);
|
|
278
|
+
cursor: pointer;
|
|
279
|
+
transition: color 0.2s var(--ease);
|
|
280
|
+
}
|
|
281
|
+
.nav-shell-tail .theme-toggle:hover,
|
|
282
|
+
.nav-shell-tail .btn-icon:hover,
|
|
283
|
+
.nav-shell-toggle:hover {
|
|
284
|
+
color: var(--ink);
|
|
285
|
+
background: transparent;
|
|
286
|
+
}
|
|
287
|
+
.nav-shell-tail .btn-icon svg {
|
|
288
|
+
display: block;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/* Quiet company-profile row — the same borderless glyph buttons as the nav
|
|
292
|
+
tail, usable in a contact band or footer. Phosphor (`--accent`) only on
|
|
293
|
+
:focus-visible; hover stays ink. Radius 0, no fill. */
|
|
294
|
+
.social-row {
|
|
295
|
+
--nav-social-gap: 0.1rem;
|
|
296
|
+
|
|
297
|
+
display: inline-flex;
|
|
298
|
+
align-items: center;
|
|
299
|
+
gap: var(--nav-social-gap);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
.btn-icon {
|
|
303
|
+
--nav-icon-pad: 0.5rem;
|
|
304
|
+
|
|
305
|
+
display: inline-flex;
|
|
306
|
+
align-items: center;
|
|
307
|
+
justify-content: center;
|
|
308
|
+
padding: var(--nav-icon-pad);
|
|
309
|
+
background: transparent;
|
|
310
|
+
border: none;
|
|
311
|
+
border-radius: 0;
|
|
312
|
+
color: var(--ink-mute);
|
|
313
|
+
cursor: pointer;
|
|
314
|
+
text-decoration: none;
|
|
315
|
+
transition: color 0.2s var(--ease);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
.btn-icon:hover {
|
|
319
|
+
color: var(--ink);
|
|
320
|
+
background: transparent;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
.btn-icon:focus-visible {
|
|
324
|
+
color: var(--accent);
|
|
325
|
+
outline: 1px solid var(--accent);
|
|
326
|
+
outline-offset: 2px;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
.btn-icon svg {
|
|
330
|
+
display: block;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
/* ── hamburger: two lines folding to an × from the parent state ─────────── */
|
|
334
|
+
.nav-shell-toggle {
|
|
335
|
+
display: none; /* wide viewports; media query below re-enables */
|
|
336
|
+
--nav-toggle-offset-sm: 0.65rem;
|
|
337
|
+
flex-direction: column;
|
|
338
|
+
gap: var(--nav-toggle-gap, 5px);
|
|
339
|
+
flex-shrink: 0;
|
|
340
|
+
margin: 0;
|
|
341
|
+
}
|
|
342
|
+
.nav-shell-toggle span {
|
|
343
|
+
display: block;
|
|
344
|
+
width: var(--nav-toggle-line-w, 18px);
|
|
345
|
+
height: var(--nav-toggle-line-h, 1.5px);
|
|
346
|
+
background: currentColor;
|
|
347
|
+
border-radius: 0;
|
|
348
|
+
transition:
|
|
349
|
+
transform 0.25s var(--ease),
|
|
350
|
+
opacity 0.2s var(--ease);
|
|
351
|
+
}
|
|
352
|
+
.nav-shell.is-menu-open .nav-shell-toggle span:first-child {
|
|
353
|
+
transform: translateY(var(--nav-toggle-shift, 3.25px)) rotate(45deg);
|
|
354
|
+
}
|
|
355
|
+
.nav-shell.is-menu-open .nav-shell-toggle span:last-child {
|
|
356
|
+
transform: translateY(calc(-1 * var(--nav-toggle-shift, 3.25px))) rotate(-45deg);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/* ── menu-open bar dress: solid enough to read over the scrim ───────────── */
|
|
360
|
+
.nav-shell.is-menu-open {
|
|
361
|
+
border-bottom-color: var(--hair);
|
|
362
|
+
background: color-mix(in srgb, var(--bg) 92%, transparent);
|
|
363
|
+
backdrop-filter: blur(14px);
|
|
364
|
+
-webkit-backdrop-filter: blur(14px);
|
|
365
|
+
}
|
|
366
|
+
.nav-shell.is-menu-open.is-hidden {
|
|
367
|
+
transform: none;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/* ── portal overlay: full-viewport scrim — dims + aggressively blurs the
|
|
371
|
+
page behind the menu ──────────────────────────────────────────────── */
|
|
372
|
+
.nav-shell-backdrop {
|
|
373
|
+
position: fixed;
|
|
374
|
+
inset: 0;
|
|
375
|
+
z-index: 200;
|
|
376
|
+
margin: 0;
|
|
377
|
+
padding: 0;
|
|
378
|
+
border: 0;
|
|
379
|
+
cursor: pointer;
|
|
380
|
+
background: color-mix(in srgb, var(--bg) 90%, transparent);
|
|
381
|
+
backdrop-filter: blur(40px) saturate(1.3);
|
|
382
|
+
-webkit-backdrop-filter: blur(40px) saturate(1.3);
|
|
383
|
+
opacity: 0;
|
|
384
|
+
visibility: hidden;
|
|
385
|
+
pointer-events: none;
|
|
386
|
+
transition:
|
|
387
|
+
opacity 0.28s var(--ease),
|
|
388
|
+
visibility 0.28s;
|
|
389
|
+
}
|
|
390
|
+
.nav-shell-backdrop.is-open {
|
|
391
|
+
opacity: 1;
|
|
392
|
+
visibility: visible;
|
|
393
|
+
pointer-events: auto;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/* ── portal overlay: the sheet — right-aligned serif link stack + CTA ───── */
|
|
397
|
+
.nav-shell-sheet {
|
|
398
|
+
/* component tokens — the portalled sheet is not a .nav-shell descendant,
|
|
399
|
+
so it carries its own */
|
|
400
|
+
--nav-sheet-pad-top-gap: 1.5rem;
|
|
401
|
+
--nav-sheet-pad-inline: clamp(1.25rem, 5vw, 2rem);
|
|
402
|
+
--nav-sheet-pad-bottom: 1.25rem;
|
|
403
|
+
--nav-sheet-links-w: 20rem;
|
|
404
|
+
--nav-sheet-link-font: 1.35rem;
|
|
405
|
+
--nav-sheet-link-pad: 0.85rem;
|
|
406
|
+
|
|
407
|
+
position: fixed;
|
|
408
|
+
inset: 0;
|
|
409
|
+
z-index: 201;
|
|
410
|
+
display: flex;
|
|
411
|
+
flex-direction: column;
|
|
412
|
+
align-items: flex-end;
|
|
413
|
+
text-align: end;
|
|
414
|
+
padding: calc(var(--nav-shell-h, 62px) + var(--nav-sheet-pad-top-gap))
|
|
415
|
+
var(--nav-sheet-pad-inline) max(var(--nav-sheet-pad-bottom), env(safe-area-inset-bottom));
|
|
416
|
+
background: transparent;
|
|
417
|
+
visibility: hidden;
|
|
418
|
+
pointer-events: none;
|
|
419
|
+
transform: translateY(-6px);
|
|
420
|
+
transition:
|
|
421
|
+
visibility 0.28s,
|
|
422
|
+
transform 0.28s var(--ease);
|
|
423
|
+
}
|
|
424
|
+
.nav-shell-sheet.is-open {
|
|
425
|
+
visibility: visible;
|
|
426
|
+
transform: none;
|
|
427
|
+
}
|
|
428
|
+
.nav-shell-sheet-links {
|
|
429
|
+
display: flex;
|
|
430
|
+
flex-direction: column;
|
|
431
|
+
align-items: flex-end;
|
|
432
|
+
gap: 0.35rem;
|
|
433
|
+
flex: 1;
|
|
434
|
+
min-height: 0;
|
|
435
|
+
overflow-y: auto;
|
|
436
|
+
overscroll-behavior: contain;
|
|
437
|
+
width: min(100%, var(--nav-sheet-links-w, 20rem));
|
|
438
|
+
margin-inline-start: auto;
|
|
439
|
+
font-size: var(--nav-sheet-link-font, 1.35rem);
|
|
440
|
+
font-family: var(--font-mono);
|
|
441
|
+
color: var(--ink);
|
|
442
|
+
pointer-events: auto;
|
|
443
|
+
}
|
|
444
|
+
.nav-shell-sheet-links a {
|
|
445
|
+
display: block;
|
|
446
|
+
width: 100%;
|
|
447
|
+
padding: var(--nav-sheet-link-pad, 0.85rem) 0;
|
|
448
|
+
border-bottom: 1px solid var(--hair);
|
|
449
|
+
color: var(--ink-soft);
|
|
450
|
+
text-align: end;
|
|
451
|
+
text-shadow: 0 1px 12px color-mix(in srgb, var(--bg) 70%, transparent);
|
|
452
|
+
transition: color 0.2s var(--ease);
|
|
453
|
+
}
|
|
454
|
+
.nav-shell-sheet-links a:hover {
|
|
455
|
+
color: var(--ink);
|
|
456
|
+
}
|
|
457
|
+
/* a NavGroup in the sheet: a kicker-cased label over its own links. No
|
|
458
|
+
disclosure — the sheet is already the vertical index a dropdown would open. */
|
|
459
|
+
.nav-shell-sheet-group {
|
|
460
|
+
display: flex;
|
|
461
|
+
flex-direction: column;
|
|
462
|
+
align-items: flex-end;
|
|
463
|
+
width: 100%;
|
|
464
|
+
}
|
|
465
|
+
.nav-shell-sheet-group-label {
|
|
466
|
+
--nav-sheet-group-label-font: 0.6rem;
|
|
467
|
+
|
|
468
|
+
margin: 0.9rem 0 0.1rem;
|
|
469
|
+
font-family: var(--font-mono, ui-monospace, monospace);
|
|
470
|
+
font-size: var(--nav-sheet-group-label-font);
|
|
471
|
+
text-transform: uppercase;
|
|
472
|
+
letter-spacing: 0.14em;
|
|
473
|
+
color: var(--ink-mute);
|
|
474
|
+
}
|
|
475
|
+
.nav-shell-sheet-cta {
|
|
476
|
+
--nav-sheet-cta-top: 1.5rem;
|
|
477
|
+
--nav-sheet-cta-bottom: 1rem;
|
|
478
|
+
|
|
479
|
+
display: flex;
|
|
480
|
+
justify-content: flex-end;
|
|
481
|
+
width: min(100%, var(--nav-sheet-links-w, 20rem));
|
|
482
|
+
margin-inline-start: auto;
|
|
483
|
+
padding-top: var(--nav-sheet-cta-top);
|
|
484
|
+
padding-bottom: max(var(--nav-sheet-cta-bottom), env(safe-area-inset-bottom));
|
|
485
|
+
pointer-events: auto;
|
|
486
|
+
}
|
|
487
|
+
/* No descendant dress here any more: the CTA arrives as a kit-buttonVariants
|
|
488
|
+
link (digithings) or a kit <Button/> (digiquant), both already `inline-flex
|
|
489
|
+
shrink-0 justify-center` — the old `.nav-shell-sheet-cta .btn { width:auto;
|
|
490
|
+
justify-content:center }` shim was only for the retired `.btn` pill. */
|
|
491
|
+
|
|
492
|
+
/* ── breakpoints (identical to the app navs this supersedes) ────────────── */
|
|
493
|
+
@media (min-width: 881px) {
|
|
494
|
+
.nav-shell-backdrop,
|
|
495
|
+
.nav-shell-sheet {
|
|
496
|
+
display: none;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
@media (max-width: 880px) {
|
|
500
|
+
.nav-shell-toggle {
|
|
501
|
+
display: inline-flex;
|
|
502
|
+
margin-inline-start: var(--space-2);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
@media (max-width: 560px) {
|
|
506
|
+
.nav-shell-toggle {
|
|
507
|
+
margin-inline-start: var(--nav-toggle-offset-sm, 0.65rem);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
/* Never hide the bar on small screens: thumb-scroll jitters direction, and
|
|
511
|
+
the bar is the only route back to the menu. `autoHide="hover"` reveals the
|
|
512
|
+
bar via a `mousemove` listener alone (see NavShell.tsx) -- touch input never
|
|
513
|
+
fires that event, so a touch-only device with no mouse gets the bar hidden
|
|
514
|
+
on mount with no way to bring it back. max-width alone only catches phones;
|
|
515
|
+
a touch-primary tablet in landscape (iPad ~1024px, most Android tablets)
|
|
516
|
+
is wider than 768px, has no mouse, and hits neither this rule nor a
|
|
517
|
+
mousemove event -- `(hover: none)` is the correct, width-independent way to
|
|
518
|
+
ask "can this pointer even hover", so it catches those devices too. */
|
|
519
|
+
@media (max-width: 768px), (hover: none) {
|
|
520
|
+
/* Only the hover grammar needs this neutralisation: it hides the bar on
|
|
521
|
+
mount and a touch device has no mouse to reveal it. The scroll grammar
|
|
522
|
+
hides/reveals on scroll, so it must keep its transform on touch too. */
|
|
523
|
+
.nav-shell[data-autohide="hover"].is-hidden {
|
|
524
|
+
transform: none;
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/* ── reduced motion: same states, instant — the bar still settles, yields
|
|
529
|
+
and returns; dropdowns still open, close and dress their caret; nothing
|
|
530
|
+
slides or fades ──────────────────────────────────────────────────── */
|
|
531
|
+
@media (prefers-reduced-motion: reduce) {
|
|
532
|
+
.nav-shell,
|
|
533
|
+
.nav-shell-toggle span,
|
|
534
|
+
.nav-shell-links a,
|
|
535
|
+
.nav-shell-group-trigger,
|
|
536
|
+
.nav-shell-group-caret,
|
|
537
|
+
.nav-shell-menu,
|
|
538
|
+
/* the open state re-declares transition (see the panel rule), so it needs
|
|
539
|
+
naming here too — a bare .nav-shell-menu would lose the specificity duel */
|
|
540
|
+
.nav-shell-menu.is-open,
|
|
541
|
+
.nav-shell-menu-item,
|
|
542
|
+
.nav-shell-sheet-links a,
|
|
543
|
+
.nav-shell-backdrop,
|
|
544
|
+
.nav-shell-sheet {
|
|
545
|
+
transition: none;
|
|
546
|
+
}
|
|
547
|
+
/* no travel either: the panel simply is, or is not, there */
|
|
548
|
+
.nav-shell-menu {
|
|
549
|
+
transform: translateX(-50%);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
pricing.css — CSS leave-rules for the pricing family
|
|
3
|
+
(components/pricing/Pricing.tsx + components/pricing/PricingMatrix.tsx).
|
|
4
|
+
Import once in an app's globals.css, after web-theme.css:
|
|
5
|
+
@import "@digithings-ai/ui/styles/pricing.css";
|
|
6
|
+
|
|
7
|
+
Static structure is token-backed Tailwind utilities in the components.
|
|
8
|
+
Only what utilities can't express lives here: the accent tier's two-color
|
|
9
|
+
color-mix wash, the ✓ check-marker ::before on feature rows, and the
|
|
10
|
+
billing toggle (ancestor `.on` state pairing + two-color mix + knob
|
|
11
|
+
translate).
|
|
12
|
+
========================================================================== */
|
|
13
|
+
|
|
14
|
+
/* ── accent (featured) tier card: two-color mixes on border + wash ──────── */
|
|
15
|
+
.pricing-tier-accent {
|
|
16
|
+
border-color: color-mix(in srgb, var(--accent) 50%, var(--hair));
|
|
17
|
+
background: color-mix(in srgb, var(--accent) 6%, var(--surface));
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* ── popular matrix column: the reference treatment is the kit-native tint +
|
|
21
|
+
accent top rule (`pm-popular rounded-none border-t-2 border-t-accent
|
|
22
|
+
bg-accent/6` in PricingMatrix) — no gradient; the design reference
|
|
23
|
+
highlights featured tiers with tint, not a wash gradient. */
|
|
24
|
+
|
|
25
|
+
/* ── ✓ check-marker grammar on feature rows (li.pricing-feature) ────────── */
|
|
26
|
+
/* --accent, not --up: this marks "feature included," a generic positive/
|
|
27
|
+
selection signal, not a P&L read — --up/--down stay reserved for money. */
|
|
28
|
+
.pricing-feature::before {
|
|
29
|
+
content: "✓";
|
|
30
|
+
flex: 0 0 auto;
|
|
31
|
+
color: var(--accent);
|
|
32
|
+
font-weight: 600;
|
|
33
|
+
line-height: 1.4;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* ── billing toggle: .pm-toggle.on drives the knob (state + translate) ──── */
|
|
37
|
+
.pm-toggle {
|
|
38
|
+
/* component tokens — billing toggle geometry */
|
|
39
|
+
--pm-toggle-w: 38px;
|
|
40
|
+
--pm-toggle-h: 21px;
|
|
41
|
+
--pm-knob: 15px;
|
|
42
|
+
--pm-knob-inset: 2px;
|
|
43
|
+
--pm-knob-travel: 17px;
|
|
44
|
+
|
|
45
|
+
width: var(--pm-toggle-w);
|
|
46
|
+
height: var(--pm-toggle-h);
|
|
47
|
+
border-radius: 0;
|
|
48
|
+
border: 1px solid var(--hair);
|
|
49
|
+
background: var(--surface);
|
|
50
|
+
position: relative;
|
|
51
|
+
cursor: pointer;
|
|
52
|
+
transition: background-color 0.2s var(--ease), border-color 0.2s var(--ease);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.pm-toggle .pm-knob {
|
|
56
|
+
position: absolute;
|
|
57
|
+
top: var(--pm-knob-inset, 2px);
|
|
58
|
+
inset-inline-start: var(--pm-knob-inset, 2px);
|
|
59
|
+
width: var(--pm-knob, 15px);
|
|
60
|
+
height: var(--pm-knob, 15px);
|
|
61
|
+
border-radius: 0;
|
|
62
|
+
background: var(--ink-mute);
|
|
63
|
+
transition: transform 0.2s var(--ease), background-color 0.2s var(--ease);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.pm-toggle.on {
|
|
67
|
+
border-color: color-mix(in srgb, var(--accent) 55%, var(--hair));
|
|
68
|
+
background: var(--accent-weak);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.pm-toggle.on .pm-knob {
|
|
72
|
+
transform: translateX(var(--pm-knob-travel, 17px));
|
|
73
|
+
background: var(--accent);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* knob anchors at inline-start; checked travel is physical → mirror in RTL */
|
|
77
|
+
[dir="rtl"] .pm-toggle.on .pm-knob {
|
|
78
|
+
transform: translateX(calc(-1 * var(--pm-knob-travel, 17px)));
|
|
79
|
+
}
|