@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,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pricing — the open-core tier-card family. `PricingTierCard` is one hairline
|
|
3
|
+
* card: name, mono price line, soft description, ✓-marked feature list
|
|
4
|
+
* (check-marker grammar in styles/pricing.css), and a CTA slot; `accent`
|
|
5
|
+
* tints the featured tier (two-color mix, also styles/pricing.css). The
|
|
6
|
+
* `variant` picks a density: "compact" is the reference/catalog voice,
|
|
7
|
+
* "hero" the marketing-page voice (digiquant contact tiers). `Pricing` lays
|
|
8
|
+
* cards out on the two-up grid with an optional hairline trust line;
|
|
9
|
+
* `PrecisionTable` is the per-unit price table riding the tearsheet
|
|
10
|
+
* hairline-row, mono-numeral voice. Every name, price, feature and CTA
|
|
11
|
+
* arrives as a prop — nothing product-specific baked in. Static display
|
|
12
|
+
* components; no client state.
|
|
13
|
+
*/
|
|
14
|
+
import type { ElementType, ReactNode } from "react";
|
|
15
|
+
|
|
16
|
+
const cx = (...parts: Array<string | false | undefined>) => parts.filter(Boolean).join(" ");
|
|
17
|
+
|
|
18
|
+
export interface PricingTierCardProps {
|
|
19
|
+
/** Tier name, e.g. "Self-hosted". */
|
|
20
|
+
name: ReactNode;
|
|
21
|
+
/** Element rendered for the name (default "p"; marketing pages want "h3"). */
|
|
22
|
+
nameAs?: ElementType;
|
|
23
|
+
/** Mono sub-line under the name ("$40/mo", "open core · free", "contact us"). */
|
|
24
|
+
priceLine?: ReactNode;
|
|
25
|
+
/** Soft body copy under the name/price line. */
|
|
26
|
+
description?: ReactNode;
|
|
27
|
+
/** ✓-marked feature rows — the check-marker grammar. */
|
|
28
|
+
features?: ReactNode[];
|
|
29
|
+
/** CTA slot — the caller brings its own button/anchor dressing (btn-*). */
|
|
30
|
+
cta?: ReactNode;
|
|
31
|
+
/** Featured tier: accent-tinted border + wash (styles/pricing.css). */
|
|
32
|
+
accent?: boolean;
|
|
33
|
+
/** Density: "compact" (reference/catalog) or "hero" (marketing page). */
|
|
34
|
+
variant?: "compact" | "hero";
|
|
35
|
+
className?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** One pricing tier card. Composable alone (apps own their grid) or via <Pricing/>. */
|
|
39
|
+
export function PricingTierCard({
|
|
40
|
+
name,
|
|
41
|
+
nameAs: NameTag = "p",
|
|
42
|
+
priceLine,
|
|
43
|
+
description,
|
|
44
|
+
features,
|
|
45
|
+
cta,
|
|
46
|
+
accent = false,
|
|
47
|
+
variant = "compact",
|
|
48
|
+
className,
|
|
49
|
+
}: PricingTierCardProps) {
|
|
50
|
+
const hero = variant === "hero";
|
|
51
|
+
return (
|
|
52
|
+
<div
|
|
53
|
+
className={cx(
|
|
54
|
+
"border",
|
|
55
|
+
hero ? "rounded-none px-[1.8rem] py-[2rem]" : "rounded-none p-[1.1rem]",
|
|
56
|
+
accent ? "pricing-tier-accent" : "border-hair bg-surface",
|
|
57
|
+
className,
|
|
58
|
+
)}
|
|
59
|
+
>
|
|
60
|
+
<NameTag className={hero ? "text-[1.4rem] font-semibold tracking-[-0.02em]" : "text-[1rem]"}>
|
|
61
|
+
{name}
|
|
62
|
+
</NameTag>
|
|
63
|
+
{priceLine != null ? (
|
|
64
|
+
<p
|
|
65
|
+
className={cx(
|
|
66
|
+
"mt-[0.4rem] font-mono text-ink-soft",
|
|
67
|
+
hero ? "text-[0.95rem]" : "text-[0.78rem]",
|
|
68
|
+
)}
|
|
69
|
+
>
|
|
70
|
+
{priceLine}
|
|
71
|
+
</p>
|
|
72
|
+
) : null}
|
|
73
|
+
{description != null ? (
|
|
74
|
+
<p className="mt-[0.4rem] text-[0.85rem] text-ink-soft">{description}</p>
|
|
75
|
+
) : null}
|
|
76
|
+
{features && features.length > 0 ? (
|
|
77
|
+
<ul
|
|
78
|
+
className={cx(
|
|
79
|
+
"m-0 flex list-none flex-col gap-[0.55rem] p-0 text-[0.9rem] text-ink-soft",
|
|
80
|
+
hero ? "mt-[1.3rem]" : "mt-[0.8rem]",
|
|
81
|
+
)}
|
|
82
|
+
>
|
|
83
|
+
{features.map((feature, i) => (
|
|
84
|
+
<li key={i} className="pricing-feature flex items-start gap-[0.55rem]">
|
|
85
|
+
{feature}
|
|
86
|
+
</li>
|
|
87
|
+
))}
|
|
88
|
+
</ul>
|
|
89
|
+
) : null}
|
|
90
|
+
{cta != null ? <div className={hero ? "mt-[1.6rem]" : "mt-[0.9rem]"}>{cta}</div> : null}
|
|
91
|
+
</div>
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export interface PricingProps {
|
|
96
|
+
/** Tier cards, left to right. */
|
|
97
|
+
tiers: PricingTierCardProps[];
|
|
98
|
+
/** Hairline-ruled trust line under the grid ("Free for 30 days…"). */
|
|
99
|
+
footnote?: ReactNode;
|
|
100
|
+
/** Density forwarded to every tier card (a tier's own `variant` wins). */
|
|
101
|
+
variant?: "compact" | "hero";
|
|
102
|
+
/** Extra classes on the grid (e.g. "mt-[1.2rem]"). */
|
|
103
|
+
className?: string;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/** Tier cards on the reference two-up grid, plus the optional trust line. */
|
|
107
|
+
export function Pricing({ tiers, footnote, variant = "compact", className }: PricingProps) {
|
|
108
|
+
return (
|
|
109
|
+
<>
|
|
110
|
+
<div className={cx("grid grid-cols-2 gap-[0.9rem] max-[640px]:grid-cols-1", className)}>
|
|
111
|
+
{tiers.map((tier, i) => (
|
|
112
|
+
<PricingTierCard key={i} variant={variant} {...tier} />
|
|
113
|
+
))}
|
|
114
|
+
</div>
|
|
115
|
+
{footnote != null ? (
|
|
116
|
+
<p className="mt-[0.9rem] border-t border-hair pt-[0.9rem] text-[0.82rem] text-ink-mute">
|
|
117
|
+
{footnote}
|
|
118
|
+
</p>
|
|
119
|
+
) : null}
|
|
120
|
+
</>
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface PrecisionTableProps {
|
|
125
|
+
/** Column headers; the last column right-aligns (numerals live there). */
|
|
126
|
+
columns: ReactNode[];
|
|
127
|
+
/** Row cells, one array per row; the first cell carries full ink. */
|
|
128
|
+
rows: ReactNode[][];
|
|
129
|
+
/** Extra classes on the table (e.g. "mt-[1.2rem]"). */
|
|
130
|
+
className?: string;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Per-unit price table — hairline rows, mono numerals, right-aligned tail column. */
|
|
134
|
+
export function PrecisionTable({ columns, rows, className }: PrecisionTableProps) {
|
|
135
|
+
const last = columns.length - 1;
|
|
136
|
+
return (
|
|
137
|
+
<table className={cx("w-full border-collapse font-mono text-[0.76rem]", className)}>
|
|
138
|
+
<thead>
|
|
139
|
+
<tr>
|
|
140
|
+
{columns.map((column, i) => (
|
|
141
|
+
<th
|
|
142
|
+
key={i}
|
|
143
|
+
scope="col"
|
|
144
|
+
className={cx(
|
|
145
|
+
"border-b border-hair pb-[0.5rem] text-[0.6rem] uppercase tracking-[0.08em] text-ink-mute",
|
|
146
|
+
i === last ? "text-end" : "text-start",
|
|
147
|
+
)}
|
|
148
|
+
>
|
|
149
|
+
{column}
|
|
150
|
+
</th>
|
|
151
|
+
))}
|
|
152
|
+
</tr>
|
|
153
|
+
</thead>
|
|
154
|
+
<tbody>
|
|
155
|
+
{rows.map((row, ri) => (
|
|
156
|
+
<tr key={ri}>
|
|
157
|
+
{row.map((cell, ci) => (
|
|
158
|
+
<td
|
|
159
|
+
key={ci}
|
|
160
|
+
className={cx(
|
|
161
|
+
"border-b border-hair py-[0.55rem]",
|
|
162
|
+
ci === 0 ? "text-ink" : "text-ink-soft",
|
|
163
|
+
ci === last && "text-end",
|
|
164
|
+
)}
|
|
165
|
+
>
|
|
166
|
+
{cell}
|
|
167
|
+
</td>
|
|
168
|
+
))}
|
|
169
|
+
</tr>
|
|
170
|
+
))}
|
|
171
|
+
</tbody>
|
|
172
|
+
</table>
|
|
173
|
+
);
|
|
174
|
+
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
/**
|
|
3
|
+
* PricingMatrix — the grouped feature-comparison matrix (Graphite grammar):
|
|
4
|
+
* tier column headers with a mono price line + CTA slot, an optional billing
|
|
5
|
+
* toggle, uppercase group rows, plain-word cells ("✓ · Limited · Advanced";
|
|
6
|
+
* a "—" cell reads muted), and one continuous accent-tinted band down the
|
|
7
|
+
* `popular` tier (header + body). Billing-dependent prices arrive precomputed
|
|
8
|
+
* (`priceMonthly` / `priceAnnual`) so server components can pass plain nodes;
|
|
9
|
+
* the toggle only picks between them. Tier names, prices, CTAs, toggle and
|
|
10
|
+
* popular labels are all props — nothing product-specific baked in. Static
|
|
11
|
+
* structure is token-backed utilities; the toggle switch (ancestor `.on`
|
|
12
|
+
* state + two-color mix + knob translate) lives in styles/pricing.css.
|
|
13
|
+
*/
|
|
14
|
+
import { useId, useState, type ReactNode } from "react";
|
|
15
|
+
|
|
16
|
+
const cx = (...parts: Array<string | false | undefined>) => parts.filter(Boolean).join(" ");
|
|
17
|
+
|
|
18
|
+
export interface PricingMatrixTier {
|
|
19
|
+
name: ReactNode;
|
|
20
|
+
/** Billing-independent price line ("Free", "Let's talk"). Wins over the pair. */
|
|
21
|
+
price?: ReactNode;
|
|
22
|
+
/** Price line while the toggle is off (monthly billing). */
|
|
23
|
+
priceMonthly?: ReactNode;
|
|
24
|
+
/** Price line while the toggle is on (annual billing). */
|
|
25
|
+
priceAnnual?: ReactNode;
|
|
26
|
+
/** CTA slot — the caller brings its own button/anchor dressing (btn-*). */
|
|
27
|
+
cta?: ReactNode;
|
|
28
|
+
/** Tinted column band + accent top rule + the `popularLabel` flag. */
|
|
29
|
+
popular?: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface PricingMatrixRow {
|
|
33
|
+
label: ReactNode;
|
|
34
|
+
/** One cell per tier, in tier order; a cell that is exactly "—" renders muted. */
|
|
35
|
+
cells: ReactNode[];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface PricingMatrixGroup {
|
|
39
|
+
label: ReactNode;
|
|
40
|
+
rows: PricingMatrixRow[];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface PricingMatrixProps {
|
|
44
|
+
tiers: PricingMatrixTier[];
|
|
45
|
+
groups: PricingMatrixGroup[];
|
|
46
|
+
/** Billing-toggle label ("Annual billing (20% off)"); omit to hide the toggle. */
|
|
47
|
+
toggleLabel?: ReactNode;
|
|
48
|
+
/** Initial toggle state. Default true (annual). */
|
|
49
|
+
defaultAnnual?: boolean;
|
|
50
|
+
/** Flag under the popular tier's CTA (e.g. "Most popular"). */
|
|
51
|
+
popularLabel?: ReactNode;
|
|
52
|
+
/** Accessible name for the empty feature-label column header. */
|
|
53
|
+
featureColumnLabel?: string;
|
|
54
|
+
/** Extra classes on the toggle row (e.g. "mt-[1.2rem]"). */
|
|
55
|
+
toggleClassName?: string;
|
|
56
|
+
/** Extra classes on the table's scroll wrapper (e.g. "mt-4"). */
|
|
57
|
+
className?: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Grouped tier-comparison table with an optional annual-billing toggle. */
|
|
61
|
+
export function PricingMatrix({
|
|
62
|
+
tiers,
|
|
63
|
+
groups,
|
|
64
|
+
toggleLabel,
|
|
65
|
+
defaultAnnual = true,
|
|
66
|
+
popularLabel,
|
|
67
|
+
featureColumnLabel = "Feature",
|
|
68
|
+
toggleClassName,
|
|
69
|
+
className,
|
|
70
|
+
}: PricingMatrixProps) {
|
|
71
|
+
const [annual, setAnnual] = useState(defaultAnnual);
|
|
72
|
+
const toggleLabelId = useId();
|
|
73
|
+
const priceOf = (tier: PricingMatrixTier) =>
|
|
74
|
+
tier.price ?? (annual ? tier.priceAnnual : tier.priceMonthly);
|
|
75
|
+
|
|
76
|
+
return (
|
|
77
|
+
<>
|
|
78
|
+
{toggleLabel != null ? (
|
|
79
|
+
<div className={cx("flex items-center gap-[0.6rem]", toggleClassName)}>
|
|
80
|
+
<button
|
|
81
|
+
type="button"
|
|
82
|
+
className={`pm-toggle${annual ? " on" : ""}`}
|
|
83
|
+
role="switch"
|
|
84
|
+
aria-checked={annual}
|
|
85
|
+
aria-labelledby={toggleLabelId}
|
|
86
|
+
onClick={() => setAnnual((v) => !v)}
|
|
87
|
+
>
|
|
88
|
+
<span className="pm-knob" aria-hidden="true" />
|
|
89
|
+
</button>
|
|
90
|
+
<span id={toggleLabelId} className="font-mono text-[0.72rem] text-ink-soft">
|
|
91
|
+
{toggleLabel}
|
|
92
|
+
</span>
|
|
93
|
+
</div>
|
|
94
|
+
) : null}
|
|
95
|
+
|
|
96
|
+
{/* Narrow screens cannot hold four columns, so each tier is its own
|
|
97
|
+
card. The comparison table returns at md, where 640px fits. */}
|
|
98
|
+
<div className="grid gap-[0.85rem] md:hidden">
|
|
99
|
+
{tiers.map((tier, i) => (
|
|
100
|
+
<section
|
|
101
|
+
key={i}
|
|
102
|
+
className={cx(
|
|
103
|
+
"border border-hair bg-surface px-[1rem] py-[1.05rem]",
|
|
104
|
+
tier.popular && "border-t-2 border-t-accent bg-accent/6",
|
|
105
|
+
)}
|
|
106
|
+
>
|
|
107
|
+
<h3 className="m-0 text-[1.05rem] font-medium text-ink">{tier.name}</h3>
|
|
108
|
+
<p className="mt-[0.2rem] mb-[0.75rem] font-mono text-[0.8rem] text-ink-soft">
|
|
109
|
+
{priceOf(tier)}
|
|
110
|
+
</p>
|
|
111
|
+
<div className="[&_a]:flex [&_a]:w-full [&_a]:justify-center">{tier.cta}</div>
|
|
112
|
+
{tier.popular && popularLabel != null ? (
|
|
113
|
+
<p className="mt-[0.5rem] mb-0 font-mono text-[0.58rem] uppercase tracking-[0.08em] text-accent">
|
|
114
|
+
{popularLabel}
|
|
115
|
+
</p>
|
|
116
|
+
) : null}
|
|
117
|
+
{groups.map((group, gi) => (
|
|
118
|
+
<div key={gi} className="mt-[1rem]">
|
|
119
|
+
<p className="m-0 font-mono text-[0.62rem] font-normal uppercase tracking-[0.1em] text-ink-mute">
|
|
120
|
+
{group.label}
|
|
121
|
+
</p>
|
|
122
|
+
<dl className="m-0">
|
|
123
|
+
{group.rows.map((row, ri) => (
|
|
124
|
+
<div key={ri} className="border-b border-hair/60 py-[0.5rem]">
|
|
125
|
+
<dt className="text-[0.78rem] text-ink-mute">{row.label}</dt>
|
|
126
|
+
<dd
|
|
127
|
+
className={cx(
|
|
128
|
+
"m-0 mt-[0.12rem] font-mono text-[0.86rem] text-ink",
|
|
129
|
+
row.cells[i] === "—" && "text-ink-mute",
|
|
130
|
+
)}
|
|
131
|
+
>
|
|
132
|
+
{row.cells[i]}
|
|
133
|
+
</dd>
|
|
134
|
+
</div>
|
|
135
|
+
))}
|
|
136
|
+
</dl>
|
|
137
|
+
</div>
|
|
138
|
+
))}
|
|
139
|
+
</section>
|
|
140
|
+
))}
|
|
141
|
+
</div>
|
|
142
|
+
|
|
143
|
+
<div
|
|
144
|
+
tabIndex={0}
|
|
145
|
+
role="region"
|
|
146
|
+
aria-label="Pricing comparison"
|
|
147
|
+
className={cx("hidden overflow-x-auto md:block", className)}
|
|
148
|
+
>
|
|
149
|
+
<table className="w-full min-w-[640px] border-collapse text-[0.82rem]">
|
|
150
|
+
<thead>
|
|
151
|
+
<tr>
|
|
152
|
+
<th
|
|
153
|
+
scope="col"
|
|
154
|
+
aria-label={featureColumnLabel}
|
|
155
|
+
className="border-b border-hair pt-[0.8rem] pe-[0.9rem] pb-[1rem] ps-0 text-start align-top"
|
|
156
|
+
/>
|
|
157
|
+
{tiers.map((tier, i) => (
|
|
158
|
+
<th
|
|
159
|
+
scope="col"
|
|
160
|
+
key={i}
|
|
161
|
+
className={cx(
|
|
162
|
+
"border-b border-hair px-[0.9rem] pt-[0.8rem] pb-[1rem] text-start align-top",
|
|
163
|
+
tier.popular && "pm-popular rounded-none border-t-2 border-t-accent bg-accent/6",
|
|
164
|
+
)}
|
|
165
|
+
>
|
|
166
|
+
<span className="block text-[0.95rem]">{tier.name}</span>
|
|
167
|
+
<span className="mt-[0.25rem] mb-[0.7rem] block font-mono text-[0.78rem] text-ink-soft">
|
|
168
|
+
{priceOf(tier)}
|
|
169
|
+
</span>
|
|
170
|
+
{tier.cta}
|
|
171
|
+
{tier.popular && popularLabel != null ? (
|
|
172
|
+
<span className="mt-[0.5rem] block font-mono text-[0.58rem] uppercase tracking-[0.08em] text-accent">
|
|
173
|
+
{popularLabel}
|
|
174
|
+
</span>
|
|
175
|
+
) : null}
|
|
176
|
+
</th>
|
|
177
|
+
))}
|
|
178
|
+
</tr>
|
|
179
|
+
</thead>
|
|
180
|
+
{groups.map((group, gi) => (
|
|
181
|
+
<tbody key={gi}>
|
|
182
|
+
<tr>
|
|
183
|
+
<th
|
|
184
|
+
scope="rowgroup"
|
|
185
|
+
colSpan={tiers.length + 1}
|
|
186
|
+
className="px-0 pt-[1rem] pb-[0.4rem] text-start font-mono text-[0.62rem] font-normal uppercase tracking-[0.1em] text-ink-mute"
|
|
187
|
+
>
|
|
188
|
+
{group.label}
|
|
189
|
+
</th>
|
|
190
|
+
</tr>
|
|
191
|
+
{group.rows.map((row, ri) => (
|
|
192
|
+
<tr key={ri}>
|
|
193
|
+
<th
|
|
194
|
+
scope="row"
|
|
195
|
+
className="border-b border-hair/60 py-[0.55rem] pe-[0.9rem] ps-0 text-start font-normal text-ink-soft"
|
|
196
|
+
>
|
|
197
|
+
{row.label}
|
|
198
|
+
</th>
|
|
199
|
+
{row.cells.map((cell, ci) => (
|
|
200
|
+
<td
|
|
201
|
+
key={ci}
|
|
202
|
+
className={cx(
|
|
203
|
+
"border-b border-hair/60 px-[0.9rem] py-[0.55rem] font-mono text-[0.74rem]",
|
|
204
|
+
cell === "—" && "text-ink-mute",
|
|
205
|
+
tiers[ci]?.popular && "pm-popular bg-accent/6",
|
|
206
|
+
)}
|
|
207
|
+
>
|
|
208
|
+
{cell}
|
|
209
|
+
</td>
|
|
210
|
+
))}
|
|
211
|
+
</tr>
|
|
212
|
+
))}
|
|
213
|
+
</tbody>
|
|
214
|
+
))}
|
|
215
|
+
</table>
|
|
216
|
+
</div>
|
|
217
|
+
</>
|
|
218
|
+
);
|
|
219
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Prose atoms — the shared grammar for the long-form company / legal pages
|
|
5
|
+
* (`/about`, `/team`, `/security`, `/services`, `/legal/*`).
|
|
6
|
+
* Promoted verbatim from `apps/digithings-web/app/_company/prose.tsx` (D1,
|
|
7
|
+
* #4429) so the shape is authored once and assembled by every site instead of
|
|
8
|
+
* living app-locally.
|
|
9
|
+
*
|
|
10
|
+
* **Utilities only.** These emit no site/app CSS class — the reference canon
|
|
11
|
+
* imports neither `@digithings-ai/design/site/site.css` nor an app sheet — so the
|
|
12
|
+
* exact values of the legacy `.section` / `.wrap` / `.kicker` / `.hero-title`
|
|
13
|
+
* grammar are reproduced with token-backed utilities (source: `site.css`):
|
|
14
|
+
*
|
|
15
|
+
* .section `padding: clamp(4rem,9vw,7.5rem) 0` → `pt-[clamp(4rem,9vw,7.5rem)]`
|
|
16
|
+
* (the old call site added `pb-0`, so only the top half survives)
|
|
17
|
+
* .wrap → `w-full max-w-[var(--wrap)] mx-auto px-[var(--gutter)] relative z-[1]`
|
|
18
|
+
* .kicker → `font-mono text-[0.8rem] tracking-[0.02em] text-accent`
|
|
19
|
+
* .hero-title → `font-display font-normal text-[clamp(2.8rem,6.4vw,5rem)]
|
|
20
|
+
* leading-[1.02] tracking-[-0.02em] mt-[1.4rem] mb-[1.2rem]
|
|
21
|
+
* max-w-[16ch] [&_em]:italic [&_em]:text-accent`
|
|
22
|
+
*
|
|
23
|
+
* Server components — no hooks, no state. The consuming app still needs a
|
|
24
|
+
* Tailwind `@source` line for this directory because the parts carry
|
|
25
|
+
* utilities (Tailwind does not scan package sources on its own).
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
export type MonoProps = { children: ReactNode };
|
|
29
|
+
|
|
30
|
+
/** Inline code. The site reset styles no bare `code` element, so the mono face
|
|
31
|
+
* has to be asked for explicitly; `0.92em` keeps the mono x-height in line
|
|
32
|
+
* with the surrounding body copy. */
|
|
33
|
+
export function Mono({ children }: MonoProps) {
|
|
34
|
+
return <code className="font-mono text-[0.92em] text-ink">{children}</code>;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export type PageHeadProps = {
|
|
38
|
+
/** The `//` mono eyebrow above the title. */
|
|
39
|
+
kicker: string;
|
|
40
|
+
/** The page title; `<em>` renders italic + accent. */
|
|
41
|
+
title: ReactNode;
|
|
42
|
+
/** The lede paragraph under the title. */
|
|
43
|
+
children: ReactNode;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/** The standing long-form page opener: `//` kicker, display title, one lede
|
|
47
|
+
* paragraph. Mirrors the landing hero's shape at subpage scale. */
|
|
48
|
+
export function PageHead({ kicker, title, children }: PageHeadProps) {
|
|
49
|
+
return (
|
|
50
|
+
<section className="pt-[clamp(4rem,9vw,7.5rem)]">
|
|
51
|
+
<div className="relative z-[1] mx-auto w-full max-w-[var(--wrap)] px-[var(--gutter)]">
|
|
52
|
+
<span className="font-mono text-[0.8rem] tracking-[0.02em] text-accent">{kicker}</span>
|
|
53
|
+
<h1 className="mt-[1.4rem] mb-[1.2rem] max-w-[16ch] font-display text-[clamp(2.8rem,6.4vw,5rem)] font-normal leading-[1.02] tracking-[-0.02em] [&_em]:italic [&_em]:text-accent">
|
|
54
|
+
{title}
|
|
55
|
+
</h1>
|
|
56
|
+
<p className="max-w-[64ch] text-[1.08rem] leading-[1.7] text-ink-soft">{children}</p>
|
|
57
|
+
</div>
|
|
58
|
+
</section>
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export type RuledRowProps = {
|
|
63
|
+
/** The mono lead cell — a file, env var, rule or term the body describes. */
|
|
64
|
+
term: ReactNode;
|
|
65
|
+
children: ReactNode;
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
/** A hairline-ruled definition row — the shape used for control lists,
|
|
69
|
+
* compatibility lists, residual-risk lists and gate lists. `term` is mono
|
|
70
|
+
* (it names a file, an env var or a rule); the body is sans. */
|
|
71
|
+
export function RuledRow({ term, children }: RuledRowProps) {
|
|
72
|
+
return (
|
|
73
|
+
<li className="grid gap-[0.35rem] border-t border-hair py-[1rem] last:border-b sm:grid-cols-[15rem_1fr] sm:gap-[1.5rem]">
|
|
74
|
+
<span className="font-mono text-[0.86rem] leading-[1.5] text-ink">{term}</span>
|
|
75
|
+
<span className="text-[0.9rem] leading-[1.65] text-ink-soft">{children}</span>
|
|
76
|
+
</li>
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export type RuledListProps = { children: ReactNode; className?: string };
|
|
81
|
+
|
|
82
|
+
/** The list wrapper for `RuledRow` — resets the marker and collapses the gap
|
|
83
|
+
* so the hairlines butt against each other. */
|
|
84
|
+
export function RuledList({ children, className }: RuledListProps) {
|
|
85
|
+
return <ul className={[className, "m-0 grid list-none gap-0 p-0"].filter(Boolean).join(" ")}>{children}</ul>;
|
|
86
|
+
}
|