@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,267 @@
|
|
|
1
|
+
import type { ComponentProps, CSSProperties } from "react";
|
|
2
|
+
import { cn } from "../../../../../lib/utils";
|
|
3
|
+
|
|
4
|
+
const GRID = 5;
|
|
5
|
+
const CENTER = (GRID - 1) / 2;
|
|
6
|
+
const DOT_INDEXES = Array.from({ length: GRID * GRID }, (_, i) => i);
|
|
7
|
+
|
|
8
|
+
/* Deterministic bit-mixing hash so server and client render identical markup; takes a range in milliseconds and returns seconds. A plain (i * prime) % range correlates indexes a grid-stride apart and renders as column-synchronized waves instead of a twinkle. */
|
|
9
|
+
const hash = (n: number, salt: number, range: number) => {
|
|
10
|
+
let h = (Math.imul(n, 374761393) + Math.imul(salt, 668265263)) >>> 0;
|
|
11
|
+
h = Math.imul(h ^ (h >>> 13), 1274126177) >>> 0;
|
|
12
|
+
return ((h ^ (h >>> 16)) % range) / 1000;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const glyph = (dots: [number, number][]) =>
|
|
16
|
+
new Set(dots.map(([row, col]) => row * GRID + col));
|
|
17
|
+
|
|
18
|
+
const CHECK = glyph([
|
|
19
|
+
[1, 4],
|
|
20
|
+
[2, 3],
|
|
21
|
+
[3, 0],
|
|
22
|
+
[3, 2],
|
|
23
|
+
[4, 1],
|
|
24
|
+
]);
|
|
25
|
+
const CROSS = glyph([
|
|
26
|
+
[0, 0],
|
|
27
|
+
[0, 4],
|
|
28
|
+
[1, 1],
|
|
29
|
+
[1, 3],
|
|
30
|
+
[2, 2],
|
|
31
|
+
[3, 1],
|
|
32
|
+
[3, 3],
|
|
33
|
+
[4, 0],
|
|
34
|
+
[4, 4],
|
|
35
|
+
]);
|
|
36
|
+
const BANG = glyph([
|
|
37
|
+
[0, 2],
|
|
38
|
+
[1, 2],
|
|
39
|
+
[2, 2],
|
|
40
|
+
[4, 2],
|
|
41
|
+
]);
|
|
42
|
+
const INFO = glyph([
|
|
43
|
+
[0, 2],
|
|
44
|
+
[2, 2],
|
|
45
|
+
[3, 2],
|
|
46
|
+
[4, 2],
|
|
47
|
+
]);
|
|
48
|
+
const PAUSE = glyph([
|
|
49
|
+
[1, 1],
|
|
50
|
+
[2, 1],
|
|
51
|
+
[3, 1],
|
|
52
|
+
[1, 3],
|
|
53
|
+
[2, 3],
|
|
54
|
+
[3, 3],
|
|
55
|
+
]);
|
|
56
|
+
const STOP = glyph([
|
|
57
|
+
[1, 1],
|
|
58
|
+
[1, 2],
|
|
59
|
+
[1, 3],
|
|
60
|
+
[2, 1],
|
|
61
|
+
[2, 2],
|
|
62
|
+
[2, 3],
|
|
63
|
+
[3, 1],
|
|
64
|
+
[3, 2],
|
|
65
|
+
[3, 3],
|
|
66
|
+
]);
|
|
67
|
+
const RECORD = glyph([
|
|
68
|
+
[1, 2],
|
|
69
|
+
[2, 1],
|
|
70
|
+
[2, 2],
|
|
71
|
+
[2, 3],
|
|
72
|
+
[3, 2],
|
|
73
|
+
]);
|
|
74
|
+
const ELLIPSIS = glyph([
|
|
75
|
+
[2, 0],
|
|
76
|
+
[2, 2],
|
|
77
|
+
[2, 4],
|
|
78
|
+
]);
|
|
79
|
+
|
|
80
|
+
type Blink = { duration: number; delay: number; lo: number };
|
|
81
|
+
|
|
82
|
+
type StateConfig = {
|
|
83
|
+
/** Text color class; dots inherit the surrounding color when omitted. */
|
|
84
|
+
color?: string;
|
|
85
|
+
/** Dots that render at full opacity; all others rest at `dim`. Omit for the full grid. */
|
|
86
|
+
glyph?: Set<number>;
|
|
87
|
+
/** Resting opacity of on dots. */
|
|
88
|
+
base?: number;
|
|
89
|
+
/** Resting opacity of off dots when a glyph is set. */
|
|
90
|
+
dim?: number;
|
|
91
|
+
/** Blink parameters per on dot, keyed by index and grid position. */
|
|
92
|
+
blink?: (i: number, row: number, col: number) => Blink;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const STATES = {
|
|
96
|
+
idle: { color: "text-muted-foreground", base: 0.3 },
|
|
97
|
+
loading: {
|
|
98
|
+
blink: (i) => ({
|
|
99
|
+
duration: 0.9 + hash(i, 2, 700),
|
|
100
|
+
delay: -hash(i, 1, 1200),
|
|
101
|
+
lo: 0.15,
|
|
102
|
+
}),
|
|
103
|
+
},
|
|
104
|
+
thinking: {
|
|
105
|
+
blink: (_i, row, col) => ({
|
|
106
|
+
duration: 1.2,
|
|
107
|
+
delay: -(row + col) * 0.09,
|
|
108
|
+
lo: 0.2,
|
|
109
|
+
}),
|
|
110
|
+
},
|
|
111
|
+
streaming: {
|
|
112
|
+
blink: (_i, row, col) => ({
|
|
113
|
+
duration: 0.9,
|
|
114
|
+
delay: -(row * 0.12 + hash(col, 3, 900)),
|
|
115
|
+
lo: 0.15,
|
|
116
|
+
}),
|
|
117
|
+
},
|
|
118
|
+
searching: {
|
|
119
|
+
blink: (_i, _row, col) => ({ duration: 1.1, delay: -col * 0.12, lo: 0.2 }),
|
|
120
|
+
},
|
|
121
|
+
syncing: {
|
|
122
|
+
blink: (_i, row, col) => {
|
|
123
|
+
const turn =
|
|
124
|
+
(Math.atan2(row - CENTER, col - CENTER) + Math.PI) / (2 * Math.PI);
|
|
125
|
+
return { duration: 1.3, delay: -turn * 1.3, lo: 0.2 };
|
|
126
|
+
},
|
|
127
|
+
},
|
|
128
|
+
connecting: {
|
|
129
|
+
blink: (_i, row, col) => ({
|
|
130
|
+
duration: 1.4,
|
|
131
|
+
delay: -Math.max(Math.abs(row - CENTER), Math.abs(col - CENTER)) * 0.18,
|
|
132
|
+
lo: 0.15,
|
|
133
|
+
}),
|
|
134
|
+
},
|
|
135
|
+
waiting: {
|
|
136
|
+
glyph: ELLIPSIS,
|
|
137
|
+
blink: (_i, _row, col) => ({
|
|
138
|
+
duration: 1.2,
|
|
139
|
+
delay: -col * 0.09,
|
|
140
|
+
lo: 0.2,
|
|
141
|
+
}),
|
|
142
|
+
},
|
|
143
|
+
uploading: {
|
|
144
|
+
blink: (_i, row) => ({
|
|
145
|
+
duration: 1,
|
|
146
|
+
delay: -(GRID - 1 - row) * 0.12,
|
|
147
|
+
lo: 0.2,
|
|
148
|
+
}),
|
|
149
|
+
},
|
|
150
|
+
downloading: {
|
|
151
|
+
blink: (_i, row) => ({ duration: 1, delay: -row * 0.12, lo: 0.2 }),
|
|
152
|
+
},
|
|
153
|
+
listening: {
|
|
154
|
+
blink: (_i, _row, col) => ({
|
|
155
|
+
duration: 0.7 + hash(col, 4, 500),
|
|
156
|
+
delay: -hash(col, 5, 900),
|
|
157
|
+
lo: 0.25,
|
|
158
|
+
}),
|
|
159
|
+
},
|
|
160
|
+
speaking: {
|
|
161
|
+
blink: (_i, _row, col) => ({
|
|
162
|
+
duration: 0.4 + hash(col, 6, 350),
|
|
163
|
+
delay: -hash(col, 7, 700),
|
|
164
|
+
lo: 0.2,
|
|
165
|
+
}),
|
|
166
|
+
},
|
|
167
|
+
recording: {
|
|
168
|
+
color: "text-red-500",
|
|
169
|
+
glyph: RECORD,
|
|
170
|
+
dim: 0.12,
|
|
171
|
+
blink: () => ({ duration: 1.4, delay: 0, lo: 0.3 }),
|
|
172
|
+
},
|
|
173
|
+
success: { color: "text-emerald-500", glyph: CHECK },
|
|
174
|
+
error: {
|
|
175
|
+
color: "text-red-500",
|
|
176
|
+
glyph: CROSS,
|
|
177
|
+
blink: () => ({ duration: 1.1, delay: 0, lo: 0.4 }),
|
|
178
|
+
},
|
|
179
|
+
warning: {
|
|
180
|
+
color: "text-amber-500",
|
|
181
|
+
glyph: BANG,
|
|
182
|
+
blink: () => ({ duration: 1.6, delay: 0, lo: 0.45 }),
|
|
183
|
+
},
|
|
184
|
+
info: { color: "text-blue-500", glyph: INFO },
|
|
185
|
+
paused: { color: "text-muted-foreground", glyph: PAUSE },
|
|
186
|
+
stopped: { color: "text-muted-foreground", glyph: STOP },
|
|
187
|
+
offline: { color: "text-muted-foreground", base: 0.15 },
|
|
188
|
+
} satisfies Record<string, StateConfig>;
|
|
189
|
+
|
|
190
|
+
export type DotMatrixState = keyof typeof STATES;
|
|
191
|
+
|
|
192
|
+
const dotMatrixStates = Object.keys(STATES) as readonly DotMatrixState[];
|
|
193
|
+
|
|
194
|
+
export type DotMatrixProps = Omit<ComponentProps<"span">, "children"> & {
|
|
195
|
+
state?: DotMatrixState;
|
|
196
|
+
label?: string;
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
/* The blink animation runs on every dot in every state (static states set hi = lo) and the registered hi/lo custom properties carry a transition, because removing or adding an animation never triggers a CSS transition on the animated property itself; transitioning the amplitude bounds is what makes state changes cross-fade. */
|
|
200
|
+
const DOT_MATRIX_CSS =
|
|
201
|
+
'@property --aui-dot-matrix-hi{syntax:"<number>";inherits:false;initial-value:1}@property --aui-dot-matrix-lo{syntax:"<number>";inherits:false;initial-value:0.15}@keyframes aui-dot-matrix-blink{0%,100%{opacity:var(--aui-dot-matrix-hi,1)}50%{opacity:var(--aui-dot-matrix-lo,0.15)}}';
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Tiny 5x5 dot-matrix status indicator with 20 built-in states. Dots inherit the text color and animate in state-specific patterns: twinkle, waves, ripples, sweeps, equalizer columns, and check/cross/bang glyphs. State changes cross-fade per dot.
|
|
205
|
+
*
|
|
206
|
+
* ```tsx
|
|
207
|
+
* <DotMatrix state={isRunning ? "loading" : "success"} />
|
|
208
|
+
* ```
|
|
209
|
+
*/
|
|
210
|
+
function DotMatrix({
|
|
211
|
+
className,
|
|
212
|
+
state = "loading",
|
|
213
|
+
label,
|
|
214
|
+
...props
|
|
215
|
+
}: DotMatrixProps) {
|
|
216
|
+
const config: StateConfig = STATES[state];
|
|
217
|
+
return (
|
|
218
|
+
<span
|
|
219
|
+
data-slot="dot-matrix"
|
|
220
|
+
data-state={state}
|
|
221
|
+
role="status"
|
|
222
|
+
className={cn("inline-block size-4 shrink-0", config.color, className)}
|
|
223
|
+
{...props}
|
|
224
|
+
>
|
|
225
|
+
<span className="sr-only">{label ?? state}</span>
|
|
226
|
+
{/* Hoisted and deduplicated across instances by React; must live in HTML scope, inside the SVG it would be an SVG-namespace element React does not hoist. */}
|
|
227
|
+
<style href="aui-dot-matrix" precedence="low">
|
|
228
|
+
{DOT_MATRIX_CSS}
|
|
229
|
+
</style>
|
|
230
|
+
<svg
|
|
231
|
+
aria-hidden
|
|
232
|
+
viewBox="0 0 20 20"
|
|
233
|
+
fill="currentColor"
|
|
234
|
+
className="size-full"
|
|
235
|
+
>
|
|
236
|
+
{DOT_INDEXES.map((i) => {
|
|
237
|
+
const row = Math.floor(i / GRID);
|
|
238
|
+
const col = i % GRID;
|
|
239
|
+
const on = !config.glyph || config.glyph.has(i);
|
|
240
|
+
const hi = on ? (config.base ?? 1) : (config.dim ?? 0.15);
|
|
241
|
+
const blink = on ? config.blink?.(i, row, col) : undefined;
|
|
242
|
+
return (
|
|
243
|
+
<circle
|
|
244
|
+
key={i}
|
|
245
|
+
data-slot="dot-matrix-dot"
|
|
246
|
+
cx={2 + col * 4}
|
|
247
|
+
cy={2 + row * 4}
|
|
248
|
+
r={1.3}
|
|
249
|
+
className="[transition-property:--aui-dot-matrix-hi,--aui-dot-matrix-lo,opacity] duration-300 [animation-iteration-count:infinite] [animation-name:aui-dot-matrix-blink] [animation-timing-function:ease-in-out] motion-reduce:[animation-name:none]"
|
|
250
|
+
style={
|
|
251
|
+
{
|
|
252
|
+
opacity: hi,
|
|
253
|
+
animationDuration: `${blink?.duration ?? 1}s`,
|
|
254
|
+
animationDelay: `${blink?.delay ?? 0}s`,
|
|
255
|
+
"--aui-dot-matrix-hi": hi,
|
|
256
|
+
"--aui-dot-matrix-lo": blink?.lo ?? hi,
|
|
257
|
+
} as CSSProperties
|
|
258
|
+
}
|
|
259
|
+
/>
|
|
260
|
+
);
|
|
261
|
+
})}
|
|
262
|
+
</svg>
|
|
263
|
+
</span>
|
|
264
|
+
);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
export { DotMatrix, dotMatrixStates };
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { Popover as PopoverPrimitive } from "@base-ui/react/popover";
|
|
5
|
+
|
|
6
|
+
import { cn } from "../../../../../lib/utils";
|
|
7
|
+
|
|
8
|
+
function Popover({ ...props }: PopoverPrimitive.Root.Props) {
|
|
9
|
+
return <PopoverPrimitive.Root data-slot="popover" {...props} />;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
function PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {
|
|
13
|
+
return <PopoverPrimitive.Trigger data-slot="popover-trigger" {...props} />;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const PopoverContent = React.forwardRef<
|
|
17
|
+
HTMLDivElement,
|
|
18
|
+
PopoverPrimitive.Popup.Props &
|
|
19
|
+
Pick<
|
|
20
|
+
PopoverPrimitive.Positioner.Props,
|
|
21
|
+
"align" | "alignOffset" | "side" | "sideOffset"
|
|
22
|
+
>
|
|
23
|
+
>(function PopoverContent(
|
|
24
|
+
{
|
|
25
|
+
className,
|
|
26
|
+
align = "center",
|
|
27
|
+
alignOffset = 0,
|
|
28
|
+
side = "bottom",
|
|
29
|
+
sideOffset = 4,
|
|
30
|
+
...props
|
|
31
|
+
},
|
|
32
|
+
ref,
|
|
33
|
+
) {
|
|
34
|
+
return (
|
|
35
|
+
<PopoverPrimitive.Portal>
|
|
36
|
+
<PopoverPrimitive.Positioner
|
|
37
|
+
align={align}
|
|
38
|
+
alignOffset={alignOffset}
|
|
39
|
+
side={side}
|
|
40
|
+
sideOffset={sideOffset}
|
|
41
|
+
className="isolate z-50"
|
|
42
|
+
>
|
|
43
|
+
<PopoverPrimitive.Popup
|
|
44
|
+
ref={ref}
|
|
45
|
+
data-slot="popover-content"
|
|
46
|
+
className={cn(
|
|
47
|
+
"bg-popover text-popover-foreground ring-foreground/10 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95 z-50 flex w-72 origin-(--transform-origin) flex-col gap-2.5 rounded-[var(--radius-surface,var(--radius-lg))] p-3 text-sm ring-1 outline-hidden duration-100",
|
|
48
|
+
className,
|
|
49
|
+
)}
|
|
50
|
+
{...props}
|
|
51
|
+
/>
|
|
52
|
+
</PopoverPrimitive.Positioner>
|
|
53
|
+
</PopoverPrimitive.Portal>
|
|
54
|
+
);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
function PopoverHeader({ className, ...props }: React.ComponentProps<"div">) {
|
|
58
|
+
return (
|
|
59
|
+
<div
|
|
60
|
+
data-slot="popover-header"
|
|
61
|
+
className={cn("flex flex-col gap-0.5 text-sm", className)}
|
|
62
|
+
{...props}
|
|
63
|
+
/>
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) {
|
|
68
|
+
return (
|
|
69
|
+
<PopoverPrimitive.Title
|
|
70
|
+
data-slot="popover-title"
|
|
71
|
+
className={cn("font-medium", className)}
|
|
72
|
+
{...props}
|
|
73
|
+
/>
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function PopoverDescription({
|
|
78
|
+
className,
|
|
79
|
+
...props
|
|
80
|
+
}: PopoverPrimitive.Description.Props) {
|
|
81
|
+
return (
|
|
82
|
+
<PopoverPrimitive.Description
|
|
83
|
+
data-slot="popover-description"
|
|
84
|
+
className={cn("text-muted-foreground", className)}
|
|
85
|
+
{...props}
|
|
86
|
+
/>
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export {
|
|
91
|
+
Popover,
|
|
92
|
+
PopoverContent,
|
|
93
|
+
PopoverDescription,
|
|
94
|
+
PopoverHeader,
|
|
95
|
+
PopoverTitle,
|
|
96
|
+
PopoverTrigger,
|
|
97
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base skin skeleton: the assistant-ui / shadcn default, drawn only from the theme
|
|
3
|
+
* tokens (background, foreground, popover, muted, primary, border, ring), so a
|
|
4
|
+
* tenant or brand theme restyles it. The stock (digichat) twin keeps its own
|
|
5
|
+
* square look; nothing in the base skin path may import it
|
|
6
|
+
* (base-skin-theme-surfaces.source.test.ts).
|
|
7
|
+
*/
|
|
8
|
+
import { cn } from "../../../../../lib/utils"
|
|
9
|
+
|
|
10
|
+
function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
|
|
11
|
+
return (
|
|
12
|
+
<div
|
|
13
|
+
data-slot="skeleton"
|
|
14
|
+
className={cn("animate-pulse rounded-md bg-muted", className)}
|
|
15
|
+
{...props}
|
|
16
|
+
/>
|
|
17
|
+
)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { Skeleton }
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base skin textarea: the assistant-ui / shadcn default, drawn only from the theme
|
|
3
|
+
* tokens (background, foreground, popover, muted, primary, border, ring), so a
|
|
4
|
+
* tenant or brand theme restyles it. The stock (digichat) twin keeps its own
|
|
5
|
+
* square look; nothing in the base skin path may import it
|
|
6
|
+
* (base-skin-theme-surfaces.source.test.ts).
|
|
7
|
+
*/
|
|
8
|
+
import * as React from "react"
|
|
9
|
+
import { cn } from "../../../../../lib/utils"
|
|
10
|
+
|
|
11
|
+
function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
|
|
12
|
+
return (
|
|
13
|
+
<textarea
|
|
14
|
+
data-slot="textarea"
|
|
15
|
+
className={cn(
|
|
16
|
+
"flex field-sizing-content min-h-16 w-full rounded-md border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
|
|
17
|
+
className
|
|
18
|
+
)}
|
|
19
|
+
{...props}
|
|
20
|
+
/>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { Textarea }
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Base skin tooltip: the assistant-ui / shadcn default, drawn only from the theme
|
|
5
|
+
* tokens (background, foreground, popover, muted, primary, border, ring), so a
|
|
6
|
+
* tenant or brand theme restyles it. The stock (digichat) twin keeps its own
|
|
7
|
+
* square look; nothing in the base skin path may import it
|
|
8
|
+
* (base-skin-theme-surfaces.source.test.ts).
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { Tooltip as TooltipPrimitive } from "@base-ui/react/tooltip"
|
|
12
|
+
import { cn } from "../../../../../lib/utils"
|
|
13
|
+
|
|
14
|
+
function TooltipProvider({
|
|
15
|
+
delay = 0,
|
|
16
|
+
...props
|
|
17
|
+
}: TooltipPrimitive.Provider.Props) {
|
|
18
|
+
return (
|
|
19
|
+
<TooltipPrimitive.Provider
|
|
20
|
+
data-slot="tooltip-provider"
|
|
21
|
+
delay={delay}
|
|
22
|
+
{...props}
|
|
23
|
+
/>
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function Tooltip({ ...props }: TooltipPrimitive.Root.Props) {
|
|
28
|
+
return <TooltipPrimitive.Root data-slot="tooltip" {...props} />
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) {
|
|
32
|
+
return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function TooltipContent({
|
|
36
|
+
className,
|
|
37
|
+
side = "top",
|
|
38
|
+
sideOffset = 4,
|
|
39
|
+
align = "center",
|
|
40
|
+
alignOffset = 0,
|
|
41
|
+
children,
|
|
42
|
+
...props
|
|
43
|
+
}: TooltipPrimitive.Popup.Props &
|
|
44
|
+
Pick<
|
|
45
|
+
TooltipPrimitive.Positioner.Props,
|
|
46
|
+
"align" | "alignOffset" | "side" | "sideOffset"
|
|
47
|
+
>) {
|
|
48
|
+
return (
|
|
49
|
+
<TooltipPrimitive.Portal>
|
|
50
|
+
<TooltipPrimitive.Positioner
|
|
51
|
+
align={align}
|
|
52
|
+
alignOffset={alignOffset}
|
|
53
|
+
side={side}
|
|
54
|
+
sideOffset={sideOffset}
|
|
55
|
+
className="isolate z-50"
|
|
56
|
+
>
|
|
57
|
+
<TooltipPrimitive.Popup
|
|
58
|
+
data-slot="tooltip-content"
|
|
59
|
+
className={cn(
|
|
60
|
+
"z-50 inline-flex w-fit max-w-xs origin-(--transform-origin) items-center gap-1.5 rounded-md bg-foreground px-3 py-1.5 text-xs text-background has-data-[slot=kbd]:pr-1.5 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 **:data-[slot=kbd]:relative **:data-[slot=kbd]:isolate **:data-[slot=kbd]:z-50 **:data-[slot=kbd]:rounded-sm data-[state=delayed-open]:animate-in data-[state=delayed-open]:fade-in-0 data-[state=delayed-open]:zoom-in-95 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
|
|
61
|
+
className
|
|
62
|
+
)}
|
|
63
|
+
{...props}
|
|
64
|
+
>
|
|
65
|
+
{children}
|
|
66
|
+
<TooltipPrimitive.Arrow data-slot="tooltip-arrow" className="z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px] bg-foreground fill-foreground data-[side=bottom]:top-1 data-[side=inline-end]:top-1/2! data-[side=inline-end]:-left-1 data-[side=inline-end]:-translate-y-1/2 data-[side=inline-start]:top-1/2! data-[side=inline-start]:-right-1 data-[side=inline-start]:-translate-y-1/2 data-[side=left]:top-1/2! data-[side=left]:-right-1 data-[side=left]:-translate-y-1/2 data-[side=right]:top-1/2! data-[side=right]:-left-1 data-[side=right]:-translate-y-1/2 data-[side=top]:-bottom-2.5" />
|
|
67
|
+
</TooltipPrimitive.Popup>
|
|
68
|
+
</TooltipPrimitive.Positioner>
|
|
69
|
+
</TooltipPrimitive.Portal>
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
createContext,
|
|
5
|
+
useContext,
|
|
6
|
+
type CSSProperties,
|
|
7
|
+
type ReactNode,
|
|
8
|
+
} from "react";
|
|
9
|
+
import {
|
|
10
|
+
defaultBaseConfig,
|
|
11
|
+
type ResolvedBaseConfig,
|
|
12
|
+
} from "./defaults";
|
|
13
|
+
|
|
14
|
+
const BaseConfigContext = createContext<ResolvedBaseConfig>(defaultBaseConfig);
|
|
15
|
+
|
|
16
|
+
export function BaseConfigProvider({
|
|
17
|
+
value,
|
|
18
|
+
children,
|
|
19
|
+
}: {
|
|
20
|
+
value: ResolvedBaseConfig;
|
|
21
|
+
children: ReactNode;
|
|
22
|
+
}) {
|
|
23
|
+
const theme = value.brandTheme;
|
|
24
|
+
const style = {
|
|
25
|
+
"--background": theme.background,
|
|
26
|
+
"--foreground": theme.text,
|
|
27
|
+
"--muted": theme.surface,
|
|
28
|
+
"--muted-foreground": colorMix(theme.text, theme.background, 0.7),
|
|
29
|
+
"--accent": colorMix(theme.accent, theme.background, 0.18),
|
|
30
|
+
"--accent-foreground": theme.text,
|
|
31
|
+
"--border": colorMix(theme.surface, theme.text, 0.82),
|
|
32
|
+
"--input": colorMix(theme.surface, theme.text, 0.82),
|
|
33
|
+
"--ring": theme.accent,
|
|
34
|
+
"--primary": theme.accent,
|
|
35
|
+
"--primary-foreground": bestContrast(theme.accent),
|
|
36
|
+
"--popover": theme.background,
|
|
37
|
+
"--popover-foreground": theme.text,
|
|
38
|
+
"--card": theme.background,
|
|
39
|
+
"--card-foreground": theme.text,
|
|
40
|
+
"--sidebar": theme.surface,
|
|
41
|
+
"--sidebar-foreground": theme.text,
|
|
42
|
+
"--sidebar-primary": theme.accent,
|
|
43
|
+
"--sidebar-primary-foreground": bestContrast(theme.accent),
|
|
44
|
+
"--sidebar-accent": colorMix(theme.accent, theme.surface, 0.2),
|
|
45
|
+
"--sidebar-accent-foreground": theme.text,
|
|
46
|
+
"--sidebar-border": colorMix(theme.surface, theme.accent, 0.78),
|
|
47
|
+
"--sidebar-ring": theme.accent,
|
|
48
|
+
} as CSSProperties;
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<BaseConfigContext.Provider value={value}>
|
|
52
|
+
<div className="dark h-full" style={style}>
|
|
53
|
+
{children}
|
|
54
|
+
</div>
|
|
55
|
+
</BaseConfigContext.Provider>
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function useBaseConfig() {
|
|
60
|
+
return useContext(BaseConfigContext);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function colorMix(first: string, second: string, firstWeight: number) {
|
|
64
|
+
const a = parseHex(first);
|
|
65
|
+
const b = parseHex(second);
|
|
66
|
+
if (!a || !b) return first;
|
|
67
|
+
|
|
68
|
+
const mix = a.map((value, index) =>
|
|
69
|
+
Math.round(value * firstWeight + b[index] * (1 - firstWeight)),
|
|
70
|
+
);
|
|
71
|
+
return `#${mix.map((value) => value.toString(16).padStart(2, "0")).join("")}`;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function bestContrast(hex: string) {
|
|
75
|
+
const rgb = parseHex(hex);
|
|
76
|
+
if (!rgb) return "#000000";
|
|
77
|
+
const luminance = (0.2126 * rgb[0] + 0.7152 * rgb[1] + 0.0722 * rgb[2]) / 255;
|
|
78
|
+
return luminance > 0.6 ? "#09090b" : "#ffffff";
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function parseHex(hex: string) {
|
|
82
|
+
const match = /^#([0-9a-f]{6})$/i.exec(hex);
|
|
83
|
+
if (!match) return null;
|
|
84
|
+
const value = match[1];
|
|
85
|
+
return [
|
|
86
|
+
Number.parseInt(value.slice(0, 2), 16),
|
|
87
|
+
Number.parseInt(value.slice(2, 4), 16),
|
|
88
|
+
Number.parseInt(value.slice(4, 6), 16),
|
|
89
|
+
];
|
|
90
|
+
}
|