@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,71 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* EquityCurve — the tearsheet's headline promoted from the design reference
|
|
5
|
+
* (finance/equity-curve): cumulative equity as an area series on TradingView
|
|
6
|
+
* Lightweight Charts. It wears the module accent — identity, not a single
|
|
7
|
+
* P&L read, so the money colors stay out of it — with a gradient fill that
|
|
8
|
+
* thins toward the baseline, and re-themes live on `data-theme` flips.
|
|
9
|
+
*
|
|
10
|
+
* Data comes in via the required `data` prop (ISO-dated points, ascending);
|
|
11
|
+
* `EQUITY_CURVE_DEMO` is the exported reference filler. The host fills its
|
|
12
|
+
* pane (`autoSize`) — give the pane a definite height. Client component —
|
|
13
|
+
* chart lifecycle effect; no motion/react surface.
|
|
14
|
+
*
|
|
15
|
+
* Wiring (consuming app): `lightweight-charts` dependency, plus
|
|
16
|
+
* globals.css @source "<path-to>/packages/ui/src/components/finance-charts";
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { useCallback } from "react";
|
|
20
|
+
import { AreaSeries, type AreaData, type IChartApi } from "lightweight-charts";
|
|
21
|
+
import {
|
|
22
|
+
toChartTime,
|
|
23
|
+
tokenAlpha,
|
|
24
|
+
useFinanceChart,
|
|
25
|
+
type FinanceChartPalette,
|
|
26
|
+
type FinanceSeriesPoint,
|
|
27
|
+
} from "./chart-host";
|
|
28
|
+
|
|
29
|
+
export type EquityCurveProps = {
|
|
30
|
+
/** Cumulative-equity series, ISO `yyyy-mm-dd` ascending. */
|
|
31
|
+
data: FinanceSeriesPoint[];
|
|
32
|
+
/** Extra classes on the chart host (it is `h-full w-full` by default). */
|
|
33
|
+
className?: string;
|
|
34
|
+
/** Accessible name; omitted → decorative (`aria-hidden`). */
|
|
35
|
+
label?: string;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export function EquityCurve({ data, className, label }: EquityCurveProps) {
|
|
39
|
+
const setup = useCallback(
|
|
40
|
+
(chart: IChartApi, p: FinanceChartPalette) => {
|
|
41
|
+
const area = chart.addSeries(AreaSeries, {
|
|
42
|
+
lineColor: p.accent,
|
|
43
|
+
topColor: tokenAlpha(p.accent, 0.28),
|
|
44
|
+
bottomColor: tokenAlpha(p.accent, 0.02),
|
|
45
|
+
lineWidth: 2,
|
|
46
|
+
priceLineVisible: false,
|
|
47
|
+
});
|
|
48
|
+
area.setData(
|
|
49
|
+
data.map((pt): AreaData => ({ time: toChartTime(pt.time), value: pt.value }))
|
|
50
|
+
);
|
|
51
|
+
return (next: FinanceChartPalette) => {
|
|
52
|
+
area.applyOptions({
|
|
53
|
+
lineColor: next.accent,
|
|
54
|
+
topColor: tokenAlpha(next.accent, 0.28),
|
|
55
|
+
bottomColor: tokenAlpha(next.accent, 0.02),
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
[data]
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const hostRef = useFinanceChart(setup, "accent");
|
|
63
|
+
|
|
64
|
+
return (
|
|
65
|
+
<div
|
|
66
|
+
ref={hostRef}
|
|
67
|
+
className={`h-full w-full${className ? ` ${className}` : ""}`}
|
|
68
|
+
{...(label ? { role: "img", "aria-label": label } : { "aria-hidden": true })}
|
|
69
|
+
/>
|
|
70
|
+
);
|
|
71
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* PriceChart — the standard price-plotting primitive promoted from the design
|
|
5
|
+
* reference (finance/price-chart): candlesticks (plus an optional volume
|
|
6
|
+
* histogram tucked under the price pane) on TradingView Lightweight Charts.
|
|
7
|
+
* Candles and volume wear the digiquant chart scale (`--up` / `--down`) —
|
|
8
|
+
* this IS a P&L read. Volume follows the candle at the same time: up when
|
|
9
|
+
* the close is at or above the open. Everything re-themes live on
|
|
10
|
+
* `data-theme` flips. Custom SVG candles are retired (see the finance
|
|
11
|
+
* reference page's charting rules).
|
|
12
|
+
*
|
|
13
|
+
* Data comes in via the required `candles` prop (ISO-dated OHLC, ascending);
|
|
14
|
+
* `volume` is optional — omit it for a candles-only pane. `PRICE_CHART_DEMO`
|
|
15
|
+
* is the exported reference filler carrying both. The host fills its pane
|
|
16
|
+
* (`autoSize`) — give the pane a definite height. Client component — chart
|
|
17
|
+
* lifecycle effect; no motion/react surface.
|
|
18
|
+
*
|
|
19
|
+
* Wiring (consuming app): `lightweight-charts` dependency, plus
|
|
20
|
+
* globals.css @source "<path-to>/packages/ui/src/components/finance-charts";
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { useCallback } from "react";
|
|
24
|
+
import {
|
|
25
|
+
CandlestickSeries,
|
|
26
|
+
HistogramSeries,
|
|
27
|
+
type CandlestickData,
|
|
28
|
+
type HistogramData,
|
|
29
|
+
type IChartApi,
|
|
30
|
+
} from "lightweight-charts";
|
|
31
|
+
import {
|
|
32
|
+
toChartTime,
|
|
33
|
+
useFinanceChart,
|
|
34
|
+
type FinanceChartPalette,
|
|
35
|
+
type FinanceSeriesPoint,
|
|
36
|
+
type OhlcPoint,
|
|
37
|
+
} from "./chart-host";
|
|
38
|
+
|
|
39
|
+
export type PriceChartProps = {
|
|
40
|
+
/** OHLC candles, ISO `yyyy-mm-dd` ascending. */
|
|
41
|
+
candles: OhlcPoint[];
|
|
42
|
+
/** Optional volume bars (same time axis); omitted → candles only. */
|
|
43
|
+
volume?: FinanceSeriesPoint[];
|
|
44
|
+
/** Extra classes on the chart host (it is `h-full w-full` by default). */
|
|
45
|
+
className?: string;
|
|
46
|
+
/** Accessible name; omitted → decorative (`aria-hidden`). */
|
|
47
|
+
label?: string;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export function PriceChart({ candles, volume, className, label }: PriceChartProps) {
|
|
51
|
+
const setup = useCallback(
|
|
52
|
+
(chart: IChartApi, p: FinanceChartPalette) => {
|
|
53
|
+
const candleSeries = chart.addSeries(CandlestickSeries, {
|
|
54
|
+
upColor: p.up,
|
|
55
|
+
downColor: p.down,
|
|
56
|
+
borderUpColor: p.up,
|
|
57
|
+
borderDownColor: p.down,
|
|
58
|
+
wickUpColor: p.up,
|
|
59
|
+
wickDownColor: p.down,
|
|
60
|
+
});
|
|
61
|
+
candleSeries.setData(
|
|
62
|
+
candles.map(
|
|
63
|
+
(c): CandlestickData => ({
|
|
64
|
+
time: toChartTime(c.time),
|
|
65
|
+
open: c.open,
|
|
66
|
+
high: c.high,
|
|
67
|
+
low: c.low,
|
|
68
|
+
close: c.close,
|
|
69
|
+
})
|
|
70
|
+
)
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
const volumeSeries = volume
|
|
74
|
+
? chart.addSeries(HistogramSeries, {
|
|
75
|
+
priceFormat: { type: "volume" },
|
|
76
|
+
priceScaleId: "vol",
|
|
77
|
+
})
|
|
78
|
+
: null;
|
|
79
|
+
const paintVolume = (palette: FinanceChartPalette) => {
|
|
80
|
+
if (!volumeSeries || !volume) return;
|
|
81
|
+
const direction = new Map(candles.map((c) => [c.time, c.close >= c.open]));
|
|
82
|
+
volumeSeries.setData(
|
|
83
|
+
volume.map((v): HistogramData => ({
|
|
84
|
+
time: toChartTime(v.time),
|
|
85
|
+
value: v.value,
|
|
86
|
+
color: direction.get(v.time) === false ? palette.down : palette.up,
|
|
87
|
+
}))
|
|
88
|
+
);
|
|
89
|
+
};
|
|
90
|
+
paintVolume(p);
|
|
91
|
+
if (volumeSeries) {
|
|
92
|
+
chart.priceScale("vol").applyOptions({ scaleMargins: { top: 0.82, bottom: 0 } });
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return (next: FinanceChartPalette) => {
|
|
96
|
+
candleSeries.applyOptions({
|
|
97
|
+
upColor: next.up,
|
|
98
|
+
downColor: next.down,
|
|
99
|
+
borderUpColor: next.up,
|
|
100
|
+
borderDownColor: next.down,
|
|
101
|
+
wickUpColor: next.up,
|
|
102
|
+
wickDownColor: next.down,
|
|
103
|
+
});
|
|
104
|
+
paintVolume(next);
|
|
105
|
+
};
|
|
106
|
+
},
|
|
107
|
+
[candles, volume]
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
const hostRef = useFinanceChart(setup, "accent");
|
|
111
|
+
|
|
112
|
+
return (
|
|
113
|
+
<div
|
|
114
|
+
ref={hostRef}
|
|
115
|
+
className={`h-full w-full${className ? ` ${className}` : ""}`}
|
|
116
|
+
{...(label ? { role: "img", "aria-label": label } : { "aria-hidden": true })}
|
|
117
|
+
/>
|
|
118
|
+
);
|
|
119
|
+
}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Finance-charts host scaffold (#1450) — the family's shared TradingView
|
|
5
|
+
* Lightweight Charts lifecycle, promoted from the design reference
|
|
6
|
+
* (finance/price-chart · equity-curve · drawdown). Since batch E this IS the
|
|
7
|
+
* chart-scaffold canon: dashboard's `lib/lw-chart.tsx` is a thin adapter over
|
|
8
|
+
* this family (see lw-chart.tsx here for the persistent-chart lifecycle).
|
|
9
|
+
* Token-themed via CSS-variable reads with SSR fallbacks, `autoSize: true`,
|
|
10
|
+
* transparent canvas, attribution logo off, a MutationObserver on
|
|
11
|
+
* `data-theme` re-applies the palette live, and kinetic-scroll inertia is
|
|
12
|
+
* disabled under prefers-reduced-motion.
|
|
13
|
+
*
|
|
14
|
+
* Charts draw on canvas, so there is no CSS file for them — the host div
|
|
15
|
+
* carries `h-full w-full` utilities and fills whatever definite-height pane
|
|
16
|
+
* the consumer provides. `lightweight-charts` must be a dependency of the
|
|
17
|
+
* consuming app (it is a peer of this family).
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { useEffect, useRef, useSyncExternalStore, type RefObject } from "react";
|
|
21
|
+
import {
|
|
22
|
+
createChart,
|
|
23
|
+
type ChartOptions,
|
|
24
|
+
type DeepPartial,
|
|
25
|
+
type IChartApi,
|
|
26
|
+
type Time,
|
|
27
|
+
} from "lightweight-charts";
|
|
28
|
+
import { chartChromeOptions } from "./lw-chart";
|
|
29
|
+
|
|
30
|
+
/** ISO-dated series point — the wire shape every finance chart accepts. */
|
|
31
|
+
export type FinanceSeriesPoint = {
|
|
32
|
+
/** ISO `yyyy-mm-dd`, ascending and unique across the series. */
|
|
33
|
+
time: string;
|
|
34
|
+
value: number;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/** ISO-dated OHLC candle for <PriceChart/>. */
|
|
38
|
+
export type OhlcPoint = {
|
|
39
|
+
/** ISO `yyyy-mm-dd`, ascending and unique across the series. */
|
|
40
|
+
time: string;
|
|
41
|
+
open: number;
|
|
42
|
+
high: number;
|
|
43
|
+
low: number;
|
|
44
|
+
close: number;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/** Resolved design tokens a finance chart paints with. */
|
|
48
|
+
export type FinanceChartPalette = {
|
|
49
|
+
ink: string;
|
|
50
|
+
inkMute: string;
|
|
51
|
+
hair: string;
|
|
52
|
+
accent: string;
|
|
53
|
+
up: string;
|
|
54
|
+
down: string;
|
|
55
|
+
mono: string;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/** Which palette token backs the crosshair's axis labels. */
|
|
59
|
+
export type CrosshairLabelToken = "accent" | "up" | "down";
|
|
60
|
+
|
|
61
|
+
/** ISO `yyyy-mm-dd` → lightweight-charts `Time`. */
|
|
62
|
+
export function toChartTime(iso: string): Time {
|
|
63
|
+
return iso as unknown as Time;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Token reads off the host element, with SSR-safe fallbacks mirroring the
|
|
67
|
+
* dark theme in @digithings-ai/design/tokens.css (the sanctioned cssVar
|
|
68
|
+
* fallback pattern — see scripts/check_frontend_canon.py). Fallbacks track
|
|
69
|
+
* tokens.css:161,166,175,182-183; the light theme intentionally renders
|
|
70
|
+
* from the dark snapshot until the client re-reads. Pass `null`
|
|
71
|
+
* (or call on the server) to get the fallback palette verbatim. */
|
|
72
|
+
export function readFinancePalette(host: HTMLElement | null): FinanceChartPalette {
|
|
73
|
+
const cs = host && typeof window !== "undefined" ? getComputedStyle(host) : null;
|
|
74
|
+
const cssVar = (name: string, fallback: string) =>
|
|
75
|
+
cs?.getPropertyValue(name).trim() || fallback;
|
|
76
|
+
return {
|
|
77
|
+
ink: cssVar("--ink", "#ECEEF0"),
|
|
78
|
+
inkMute: cssVar("--ink-mute", "#7D8389"),
|
|
79
|
+
hair: cssVar("--hair", "rgba(255,255,255,0.09)"),
|
|
80
|
+
accent: cssVar("--accent", "#3dd6c4"),
|
|
81
|
+
up: cssVar("--up", "#3DD6C4"),
|
|
82
|
+
down: cssVar("--down", "#E5533E"),
|
|
83
|
+
mono: cssVar("--font-mono", "monospace"),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Re-emit a resolved token color at `alpha` — the gradient fills read the
|
|
89
|
+
* accent/money tokens, then thin them out. Handles both token spellings in
|
|
90
|
+
* tokens.css: `#rgb`/`#rrggbb` hex (accents, money colors) and `rgb()`/
|
|
91
|
+
* `rgba()` functions (hairlines). Unparseable values pass through.
|
|
92
|
+
*/
|
|
93
|
+
export function tokenAlpha(color: string, alpha: number): string {
|
|
94
|
+
if (color.startsWith("#")) {
|
|
95
|
+
const hex = color.slice(1);
|
|
96
|
+
const full =
|
|
97
|
+
hex.length === 3 || hex.length === 4
|
|
98
|
+
? [...hex.slice(0, 3)].map((c) => c + c).join("")
|
|
99
|
+
: hex.slice(0, 6);
|
|
100
|
+
if (!/^[0-9a-fA-F]{6}$/.test(full)) return color;
|
|
101
|
+
const r = parseInt(full.slice(0, 2), 16);
|
|
102
|
+
const g = parseInt(full.slice(2, 4), 16);
|
|
103
|
+
const b = parseInt(full.slice(4, 6), 16);
|
|
104
|
+
return `rgba(${r},${g},${b},${alpha})`;
|
|
105
|
+
}
|
|
106
|
+
const channels = color.match(/[\d.]+/g);
|
|
107
|
+
if (!channels || channels.length < 3) return color;
|
|
108
|
+
return `rgba(${channels[0]},${channels[1]},${channels[2]},${alpha})`;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Chart-wide options derived from the tokens: transparent canvas, hair
|
|
112
|
+
* grid + scale borders, ink-mute mono text and crosshair lines, token-backed
|
|
113
|
+
* crosshair labels. Re-applied wholesale on theme flips. Thin binding of the
|
|
114
|
+
* palette onto the family's unified chrome builder (lw-chart.tsx). */
|
|
115
|
+
export function financeChartOptions(
|
|
116
|
+
p: FinanceChartPalette,
|
|
117
|
+
crosshairLabel: CrosshairLabelToken
|
|
118
|
+
): DeepPartial<ChartOptions> {
|
|
119
|
+
return chartChromeOptions({
|
|
120
|
+
text: p.inkMute,
|
|
121
|
+
hair: p.hair,
|
|
122
|
+
label: p[crosshairLabel],
|
|
123
|
+
fontFamily: p.mono,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/* ── Theme-reactive document-level palette ─────────────────────────────── */
|
|
128
|
+
|
|
129
|
+
/** SSR / pre-mount snapshot — the fallback palette, referentially stable. */
|
|
130
|
+
const SSR_PALETTE = readFinancePalette(null);
|
|
131
|
+
|
|
132
|
+
let paletteCache: { theme: string | null; palette: FinanceChartPalette } | null = null;
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Resolved document-level palette, re-read once per `data-theme` flip and
|
|
136
|
+
* referentially stable between flips (safe as an effect dependency). This is
|
|
137
|
+
* the live-read companion to `useFinanceChartPalette` — pass it as
|
|
138
|
+
* `readColors` when composing with `useLightweightChart`.
|
|
139
|
+
*/
|
|
140
|
+
export function getFinancePalette(): FinanceChartPalette {
|
|
141
|
+
if (typeof window === "undefined") return SSR_PALETTE;
|
|
142
|
+
const theme = document.documentElement.getAttribute("data-theme");
|
|
143
|
+
if (!paletteCache || paletteCache.theme !== theme) {
|
|
144
|
+
paletteCache = { theme, palette: readFinancePalette(document.documentElement) };
|
|
145
|
+
}
|
|
146
|
+
return paletteCache.palette;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function subscribeToThemeFlips(onStoreChange: () => void): () => void {
|
|
150
|
+
const observer = new MutationObserver(onStoreChange);
|
|
151
|
+
observer.observe(document.documentElement, {
|
|
152
|
+
attributes: true,
|
|
153
|
+
attributeFilter: ["data-theme"],
|
|
154
|
+
});
|
|
155
|
+
return () => observer.disconnect();
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Theme-reactive palette hook: serves the fallback palette on the server
|
|
160
|
+
* (hydration-safe), the live document-level token values on the client, and
|
|
161
|
+
* re-reads when `data-theme` flips on `<html>`. Pairs with the persistent
|
|
162
|
+
* `useLightweightChart` scaffold (lw-chart.tsx) for dashboard surfaces.
|
|
163
|
+
* Note: document-level reads — scoped liveries (`.accent-digiquant { … }`)
|
|
164
|
+
* resolve per-host only through `useFinanceChart`'s host reads.
|
|
165
|
+
*/
|
|
166
|
+
export function useFinanceChartPalette(): FinanceChartPalette {
|
|
167
|
+
return useSyncExternalStore(subscribeToThemeFlips, getFinancePalette, () => SSR_PALETTE);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Owns a chart's lifecycle against the returned host ref: create with the
|
|
172
|
+
* token theme, hand the chart to `setup` (add series + set data there, return
|
|
173
|
+
* a re-tint callback for the series' own colors), fit content, re-theme on
|
|
174
|
+
* `data-theme` flips, dispose on unmount.
|
|
175
|
+
*
|
|
176
|
+
* `setup` is an effect dependency — memoize it with `useCallback` keyed on
|
|
177
|
+
* the data props. A data change tears the chart down and rebuilds it, which
|
|
178
|
+
* matches the reference specimens' lifecycle (these are display surfaces;
|
|
179
|
+
* dashboards with live-updating series should use the persistent
|
|
180
|
+
* `useLightweightChart` scaffold from lw-chart.tsx instead).
|
|
181
|
+
*/
|
|
182
|
+
export function useFinanceChart(
|
|
183
|
+
setup: (
|
|
184
|
+
chart: IChartApi,
|
|
185
|
+
palette: FinanceChartPalette
|
|
186
|
+
) => (palette: FinanceChartPalette) => void,
|
|
187
|
+
crosshairLabel: CrosshairLabelToken = "accent"
|
|
188
|
+
): RefObject<HTMLDivElement | null> {
|
|
189
|
+
const hostRef = useRef<HTMLDivElement | null>(null);
|
|
190
|
+
|
|
191
|
+
useEffect(() => {
|
|
192
|
+
const host = hostRef.current;
|
|
193
|
+
if (!host) return;
|
|
194
|
+
|
|
195
|
+
const reducedMotion =
|
|
196
|
+
window.matchMedia?.("(prefers-reduced-motion: reduce)").matches === true;
|
|
197
|
+
let palette = readFinancePalette(host);
|
|
198
|
+
|
|
199
|
+
const chart: IChartApi = createChart(host, {
|
|
200
|
+
autoSize: true,
|
|
201
|
+
...financeChartOptions(palette, crosshairLabel),
|
|
202
|
+
// These are display specimens embedded in scrolling prose (design
|
|
203
|
+
// reference / marketing surfaces), never a live dashboard — see this
|
|
204
|
+
// file's own docblock. A reader's wheel/touch scroll landing on the
|
|
205
|
+
// canvas should keep moving the page, not pan/zoom a chart nobody
|
|
206
|
+
// asked to interact with. useLightweightChart (lw-chart.tsx), the
|
|
207
|
+
// dashboard-facing sibling, is untouched and keeps full pan/zoom.
|
|
208
|
+
handleScroll: { mouseWheel: false, pressedMouseMove: false, horzTouchDrag: false, vertTouchDrag: false },
|
|
209
|
+
handleScale: { axisPressedMouseMove: false, mouseWheel: false, pinch: false },
|
|
210
|
+
// Reduced motion: no kinetic-scroll inertia (the final state is the
|
|
211
|
+
// same chart — panning still works, it just stops with the pointer).
|
|
212
|
+
...(reducedMotion ? { kineticScroll: { touch: false, mouse: false } } : {}),
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
const retintSeries = setup(chart, palette);
|
|
216
|
+
chart.timeScale().fitContent();
|
|
217
|
+
|
|
218
|
+
const retheme = () => {
|
|
219
|
+
palette = readFinancePalette(host);
|
|
220
|
+
chart.applyOptions(financeChartOptions(palette, crosshairLabel));
|
|
221
|
+
retintSeries(palette);
|
|
222
|
+
};
|
|
223
|
+
const themeObs = new MutationObserver(retheme);
|
|
224
|
+
themeObs.observe(document.documentElement, {
|
|
225
|
+
attributes: true,
|
|
226
|
+
attributeFilter: ["data-theme"],
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
return () => {
|
|
230
|
+
themeObs.disconnect();
|
|
231
|
+
chart.remove();
|
|
232
|
+
};
|
|
233
|
+
}, [setup, crosshairLabel]);
|
|
234
|
+
|
|
235
|
+
return hostRef;
|
|
236
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One digiquant chart scale. Candles, volume, and price moves use the
|
|
3
|
+
* design-canon pair already declared as `--up` and `--down` in
|
|
4
|
+
* `@digithings-ai/design/tokens.css` (dark teal `#3DD6C4` / red `#E5533E`,
|
|
5
|
+
* light `#0C7C71` / `#B2452E`).
|
|
6
|
+
*
|
|
7
|
+
* Studies use a teal-led palette — spring, cyan, yellow, lime, orange,
|
|
8
|
+
* green, azure — so each indicator keeps its own hue. Grid and axis stay
|
|
9
|
+
* on the neutral hair and mute tokens.
|
|
10
|
+
*
|
|
11
|
+
* Canvas engines need a resolved color. `DIGIQUANT_CHART` is the dark-theme
|
|
12
|
+
* snapshot (the same fallback `readFinancePalette` uses). Call
|
|
13
|
+
* `readDigiquantChartScale` when a document is available so a theme flip
|
|
14
|
+
* resolves the live custom properties.
|
|
15
|
+
*
|
|
16
|
+
* Import path: `@digithings-ai/ui/chart-scale`.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
export type DigiquantChartScale = {
|
|
20
|
+
candleUp: string;
|
|
21
|
+
candleDown: string;
|
|
22
|
+
volumeUp: string;
|
|
23
|
+
volumeDown: string;
|
|
24
|
+
sma: string;
|
|
25
|
+
ema: string;
|
|
26
|
+
vwap: string;
|
|
27
|
+
bollingerBasis: string;
|
|
28
|
+
bollingerBand: string;
|
|
29
|
+
supertrendUp: string;
|
|
30
|
+
supertrendDown: string;
|
|
31
|
+
grid: string;
|
|
32
|
+
axis: string;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/** Dark-theme snapshot. The token name on each line is the canon-guard escape. */
|
|
36
|
+
function role(token: `--${string}`, fallback: string): string {
|
|
37
|
+
void token;
|
|
38
|
+
return fallback;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const DIGIQUANT_CHART: DigiquantChartScale = {
|
|
42
|
+
candleUp: role("--chart-candle-up", "#3DD6C4"),
|
|
43
|
+
candleDown: role("--chart-candle-down", "#E5533E"),
|
|
44
|
+
volumeUp: role("--chart-volume-up", "#3DD6C4"),
|
|
45
|
+
volumeDown: role("--chart-volume-down", "#E5533E"),
|
|
46
|
+
sma: role("--chart-sma", "#1EC98A"),
|
|
47
|
+
ema: role("--chart-ema", "#5AD4F0"),
|
|
48
|
+
vwap: role("--chart-vwap", "#F0D44A"),
|
|
49
|
+
bollingerBasis: role("--chart-bollinger", "#B0DC3A"),
|
|
50
|
+
bollingerBand: role("--chart-bollinger-band", "#F09238"),
|
|
51
|
+
supertrendUp: role("--chart-supertrend-up", "#54DC62"),
|
|
52
|
+
supertrendDown: role("--chart-supertrend-down", "#6A96F0"),
|
|
53
|
+
grid: role("--chart-grid", "rgba(255, 255, 255, 0.09)"),
|
|
54
|
+
axis: role("--chart-axis", "#7D8389"),
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/** Live chart roles off `host`, or the dark snapshot when there is no document. */
|
|
58
|
+
export function readDigiquantChartScale(host: HTMLElement | null): DigiquantChartScale {
|
|
59
|
+
const cs = host && typeof window !== "undefined" ? getComputedStyle(host) : null;
|
|
60
|
+
const cssVar = (name: keyof typeof TOKEN, fallback: string) =>
|
|
61
|
+
cs?.getPropertyValue(TOKEN[name]).trim() || fallback;
|
|
62
|
+
return {
|
|
63
|
+
candleUp: cssVar("candleUp", DIGIQUANT_CHART.candleUp),
|
|
64
|
+
candleDown: cssVar("candleDown", DIGIQUANT_CHART.candleDown),
|
|
65
|
+
volumeUp: cssVar("volumeUp", DIGIQUANT_CHART.volumeUp),
|
|
66
|
+
volumeDown: cssVar("volumeDown", DIGIQUANT_CHART.volumeDown),
|
|
67
|
+
sma: cssVar("sma", DIGIQUANT_CHART.sma),
|
|
68
|
+
ema: cssVar("ema", DIGIQUANT_CHART.ema),
|
|
69
|
+
vwap: cssVar("vwap", DIGIQUANT_CHART.vwap),
|
|
70
|
+
bollingerBasis: cssVar("bollingerBasis", DIGIQUANT_CHART.bollingerBasis),
|
|
71
|
+
bollingerBand: cssVar("bollingerBand", DIGIQUANT_CHART.bollingerBand),
|
|
72
|
+
supertrendUp: cssVar("supertrendUp", DIGIQUANT_CHART.supertrendUp),
|
|
73
|
+
supertrendDown: cssVar("supertrendDown", DIGIQUANT_CHART.supertrendDown),
|
|
74
|
+
grid: cssVar("grid", DIGIQUANT_CHART.grid),
|
|
75
|
+
axis: cssVar("axis", DIGIQUANT_CHART.axis),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const TOKEN = {
|
|
80
|
+
candleUp: "--chart-candle-up",
|
|
81
|
+
candleDown: "--chart-candle-down",
|
|
82
|
+
volumeUp: "--chart-volume-up",
|
|
83
|
+
volumeDown: "--chart-volume-down",
|
|
84
|
+
sma: "--chart-sma",
|
|
85
|
+
ema: "--chart-ema",
|
|
86
|
+
vwap: "--chart-vwap",
|
|
87
|
+
bollingerBasis: "--chart-bollinger",
|
|
88
|
+
bollingerBand: "--chart-bollinger-band",
|
|
89
|
+
supertrendUp: "--chart-supertrend-up",
|
|
90
|
+
supertrendDown: "--chart-supertrend-down",
|
|
91
|
+
grid: "--chart-grid",
|
|
92
|
+
axis: "--chart-axis",
|
|
93
|
+
} as const;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DEMO DATA ONLY (#1450) — deterministic filler series for the finance-charts
|
|
3
|
+
* family, the exact LCG walks the reference specimens shipped with, so the
|
|
4
|
+
* promoted charts render pixel-identical on the reference pages. Marketing /
|
|
5
|
+
* catalog surfaces may pass these; anything showing real performance passes
|
|
6
|
+
* its own series — the chart components take data via required props precisely
|
|
7
|
+
* so demo numbers can never ship by omission.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { FinanceSeriesPoint, OhlcPoint } from "./chart-host";
|
|
11
|
+
|
|
12
|
+
/** Deterministic LCG in [0, 1) — stable across renders and runtimes. */
|
|
13
|
+
function lcg(seed: number): () => number {
|
|
14
|
+
let s = seed;
|
|
15
|
+
return () => {
|
|
16
|
+
s = (s * 1103515245 + 12345) & 0x7fffffff;
|
|
17
|
+
return s / 0x7fffffff;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function isoOffset(startUtc: Date, days: number): string {
|
|
22
|
+
const date = new Date(startUtc);
|
|
23
|
+
date.setUTCDate(startUtc.getUTCDate() + days);
|
|
24
|
+
return date.toISOString().slice(0, 10);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Cumulative-equity walk: starts at 100, drifts up with dips (weekly bars). */
|
|
28
|
+
function equityCurveDemo(n: number): FinanceSeriesPoint[] {
|
|
29
|
+
const rnd = lcg(730217);
|
|
30
|
+
const start = new Date(Date.UTC(2022, 0, 1));
|
|
31
|
+
const data: FinanceSeriesPoint[] = [];
|
|
32
|
+
let equity = 100;
|
|
33
|
+
for (let i = 0; i < n; i++) {
|
|
34
|
+
equity *= 1 + (rnd() - 0.44) * 0.05;
|
|
35
|
+
data.push({ time: isoOffset(start, i * 7), value: Math.max(40, equity) });
|
|
36
|
+
}
|
|
37
|
+
return data;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Underwater curve: % below the running peak of an equity walk — every
|
|
41
|
+
* value is ≤ 0. */
|
|
42
|
+
function drawdownDemo(n: number): FinanceSeriesPoint[] {
|
|
43
|
+
const rnd = lcg(5150);
|
|
44
|
+
const start = new Date(Date.UTC(2022, 0, 1));
|
|
45
|
+
const data: FinanceSeriesPoint[] = [];
|
|
46
|
+
let equity = 100;
|
|
47
|
+
let peak = 100;
|
|
48
|
+
for (let i = 0; i < n; i++) {
|
|
49
|
+
equity *= 1 + (rnd() - 0.44) * 0.05;
|
|
50
|
+
peak = Math.max(peak, equity);
|
|
51
|
+
data.push({
|
|
52
|
+
time: isoOffset(start, i * 7),
|
|
53
|
+
value: Math.round((equity / peak - 1) * 1000) / 10,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return data;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Daily OHLC + volume walk. */
|
|
60
|
+
function priceChartDemo(n: number): { candles: OhlcPoint[]; volume: FinanceSeriesPoint[] } {
|
|
61
|
+
const rnd = lcg(20260101);
|
|
62
|
+
const start = new Date(Date.UTC(2026, 0, 1));
|
|
63
|
+
const candles: OhlcPoint[] = [];
|
|
64
|
+
const volume: FinanceSeriesPoint[] = [];
|
|
65
|
+
let price = 92;
|
|
66
|
+
for (let i = 0; i < n; i++) {
|
|
67
|
+
const time = isoOffset(start, i);
|
|
68
|
+
const drift = (rnd() - 0.47) * 3.4;
|
|
69
|
+
const open = price;
|
|
70
|
+
const close = Math.max(6, open + drift);
|
|
71
|
+
const high = Math.max(open, close) + rnd() * 2.1;
|
|
72
|
+
const low = Math.min(open, close) - rnd() * 2.1;
|
|
73
|
+
candles.push({ time, open, high, low, close });
|
|
74
|
+
volume.push({ time, value: 40 + rnd() * 120 });
|
|
75
|
+
price = close;
|
|
76
|
+
}
|
|
77
|
+
return { candles, volume };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Demo cumulative-equity series (210 weekly points from 2022-01-01). */
|
|
81
|
+
export const EQUITY_CURVE_DEMO: FinanceSeriesPoint[] = equityCurveDemo(210);
|
|
82
|
+
|
|
83
|
+
/** Demo underwater-drawdown series (210 weekly points, all ≤ 0). */
|
|
84
|
+
export const DRAWDOWN_DEMO: FinanceSeriesPoint[] = drawdownDemo(210);
|
|
85
|
+
|
|
86
|
+
/** Demo OHLC candles + volume bars (120 daily points from 2026-01-01). */
|
|
87
|
+
export const PRICE_CHART_DEMO: { candles: OhlcPoint[]; volume: FinanceSeriesPoint[] } =
|
|
88
|
+
priceChartDemo(120);
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* finance-charts family barrel (#1450) — canvas dashboard chart surfaces
|
|
3
|
+
* promoted from the design reference's finance page. Time-series charts ride
|
|
4
|
+
* TradingView Lightweight Charts (the engine ruling — see
|
|
5
|
+
* packages/ui/CHARTS.md for the canvas-vs-SVG split; print-grade
|
|
6
|
+
* surfaces compose the finance-tearsheet family instead). MonthlyReturns was
|
|
7
|
+
* deprecated into finance-tearsheet's ReturnsMatrix (#1463) — one matrix
|
|
8
|
+
* grammar, no app consumers existed. Re-exported from the package root by
|
|
9
|
+
* src/index.ts.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export { PriceChart, type PriceChartProps } from "./PriceChart";
|
|
13
|
+
export { EquityCurve, type EquityCurveProps } from "./EquityCurve";
|
|
14
|
+
export { DrawdownPlot, type DrawdownPlotProps } from "./DrawdownPlot";
|
|
15
|
+
export {
|
|
16
|
+
useFinanceChart,
|
|
17
|
+
useFinanceChartPalette,
|
|
18
|
+
getFinancePalette,
|
|
19
|
+
readFinancePalette,
|
|
20
|
+
financeChartOptions,
|
|
21
|
+
tokenAlpha,
|
|
22
|
+
toChartTime,
|
|
23
|
+
type FinanceChartPalette,
|
|
24
|
+
type FinanceSeriesPoint,
|
|
25
|
+
type OhlcPoint,
|
|
26
|
+
type CrosshairLabelToken,
|
|
27
|
+
} from "./chart-host";
|
|
28
|
+
export {
|
|
29
|
+
useLightweightChart,
|
|
30
|
+
chartChromeOptions,
|
|
31
|
+
hostMonoFont,
|
|
32
|
+
toLineData,
|
|
33
|
+
timeToISO,
|
|
34
|
+
useChartTip,
|
|
35
|
+
ChartTipShell,
|
|
36
|
+
type ChartChrome,
|
|
37
|
+
type ChartTip,
|
|
38
|
+
type UseLightweightChartConfig,
|
|
39
|
+
type UseLightweightChartResult,
|
|
40
|
+
} from "./lw-chart";
|
|
41
|
+
export { PRICE_CHART_DEMO, EQUITY_CURVE_DEMO, DRAWDOWN_DEMO } from "./demo-data";
|
|
42
|
+
export {
|
|
43
|
+
DIGIQUANT_CHART,
|
|
44
|
+
readDigiquantChartScale,
|
|
45
|
+
type DigiquantChartScale,
|
|
46
|
+
} from "./chart-scale";
|