@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,244 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
memo,
|
|
5
|
+
useCallback,
|
|
6
|
+
useRef,
|
|
7
|
+
useState,
|
|
8
|
+
type FC,
|
|
9
|
+
type PropsWithChildren,
|
|
10
|
+
} from "react";
|
|
11
|
+
import { DisclosureChevron } from "../disclosure-chevron";
|
|
12
|
+
import { DotMatrix } from "../DotMatrix";
|
|
13
|
+
import { cva, type VariantProps } from "class-variance-authority";
|
|
14
|
+
import { useScrollLock } from "@assistant-ui/react";
|
|
15
|
+
import {
|
|
16
|
+
Collapsible,
|
|
17
|
+
CollapsibleContent,
|
|
18
|
+
CollapsibleTrigger,
|
|
19
|
+
} from "./ui/collapsible";
|
|
20
|
+
import { cn } from "../../../lib/utils";
|
|
21
|
+
import { useExportKeepMounted } from "../../../replay/export-mount";
|
|
22
|
+
import { useTraceT } from "../trace-i18n";
|
|
23
|
+
import { stockRadius, useStockShape } from "./stock-shape";
|
|
24
|
+
|
|
25
|
+
const ANIMATION_DURATION = 200;
|
|
26
|
+
|
|
27
|
+
const toolGroupVariants = cva("aui-tool-group-root group/tool-group w-full", {
|
|
28
|
+
variants: {
|
|
29
|
+
variant: {
|
|
30
|
+
outline: "border py-3",
|
|
31
|
+
ghost: "",
|
|
32
|
+
muted: "border-hair-2 bg-surface-2/30 border py-3",
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
defaultVariants: { variant: "outline" },
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
export type ToolGroupRootProps = Omit<
|
|
39
|
+
React.ComponentProps<typeof Collapsible>,
|
|
40
|
+
"open" | "onOpenChange"
|
|
41
|
+
> &
|
|
42
|
+
VariantProps<typeof toolGroupVariants> & {
|
|
43
|
+
open?: boolean;
|
|
44
|
+
onOpenChange?: (open: boolean) => void;
|
|
45
|
+
defaultOpen?: boolean;
|
|
46
|
+
/** Open while this group is still streaming, auto-close on completion. */
|
|
47
|
+
streamingOpen?: boolean;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
function ToolGroupRoot({
|
|
51
|
+
className,
|
|
52
|
+
variant,
|
|
53
|
+
open: controlledOpen,
|
|
54
|
+
onOpenChange: controlledOnOpenChange,
|
|
55
|
+
defaultOpen = false,
|
|
56
|
+
streamingOpen = false,
|
|
57
|
+
children,
|
|
58
|
+
...props
|
|
59
|
+
}: ToolGroupRootProps) {
|
|
60
|
+
const stock = useStockShape();
|
|
61
|
+
const collapsibleRef = useRef<HTMLDivElement>(null);
|
|
62
|
+
const [initialOpen] = useState(defaultOpen);
|
|
63
|
+
const [userOpen, setUserOpen] = useState<boolean | null>(null);
|
|
64
|
+
const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION);
|
|
65
|
+
|
|
66
|
+
const isControlled = controlledOpen !== undefined;
|
|
67
|
+
const isOpen = isControlled
|
|
68
|
+
? controlledOpen
|
|
69
|
+
: (userOpen ?? (streamingOpen || initialOpen));
|
|
70
|
+
|
|
71
|
+
const handleOpenChange = useCallback(
|
|
72
|
+
(open: boolean) => {
|
|
73
|
+
lockScroll();
|
|
74
|
+
if (!isControlled) {
|
|
75
|
+
setUserOpen(open);
|
|
76
|
+
}
|
|
77
|
+
controlledOnOpenChange?.(open);
|
|
78
|
+
},
|
|
79
|
+
[lockScroll, isControlled, controlledOnOpenChange],
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
return (
|
|
83
|
+
<Collapsible
|
|
84
|
+
ref={collapsibleRef}
|
|
85
|
+
data-slot="tool-group-root"
|
|
86
|
+
data-variant={variant ?? "outline"}
|
|
87
|
+
open={isOpen}
|
|
88
|
+
onOpenChange={handleOpenChange}
|
|
89
|
+
className={cn(
|
|
90
|
+
toolGroupVariants({ variant }),
|
|
91
|
+
// assistant-ui's outline/muted tool group is rounded-lg.
|
|
92
|
+
(variant ?? "outline") !== "ghost" && stockRadius(stock, "rounded-lg"),
|
|
93
|
+
"group/tool-group-root",
|
|
94
|
+
className,
|
|
95
|
+
)}
|
|
96
|
+
style={
|
|
97
|
+
{
|
|
98
|
+
"--animation-duration": `${ANIMATION_DURATION}ms`,
|
|
99
|
+
} as React.CSSProperties
|
|
100
|
+
}
|
|
101
|
+
{...props}
|
|
102
|
+
>
|
|
103
|
+
{children}
|
|
104
|
+
</Collapsible>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function ToolGroupTrigger({
|
|
109
|
+
count,
|
|
110
|
+
active = false,
|
|
111
|
+
label,
|
|
112
|
+
className,
|
|
113
|
+
...props
|
|
114
|
+
}: React.ComponentProps<typeof CollapsibleTrigger> & {
|
|
115
|
+
count: number;
|
|
116
|
+
active?: boolean;
|
|
117
|
+
label?: string;
|
|
118
|
+
}) {
|
|
119
|
+
const tr = useTraceT();
|
|
120
|
+
const text = label ?? tr.plural("toolCalls", count);
|
|
121
|
+
|
|
122
|
+
return (
|
|
123
|
+
<CollapsibleTrigger
|
|
124
|
+
data-slot="tool-group-trigger"
|
|
125
|
+
className={cn(
|
|
126
|
+
"aui-tool-group-trigger group/trigger flex origin-left items-center gap-2 text-sm transition-[color,scale] active:scale-[0.98]",
|
|
127
|
+
"group-data-[variant=ghost]/tool-group-root:text-ink-mute group-data-[variant=ghost]/tool-group-root:hover:text-ink group-data-[variant=ghost]/tool-group-root:py-1.5",
|
|
128
|
+
"group-data-[variant=outline]/tool-group-root:w-full group-data-[variant=outline]/tool-group-root:px-4",
|
|
129
|
+
"group-data-[variant=muted]/tool-group-root:w-full group-data-[variant=muted]/tool-group-root:px-4",
|
|
130
|
+
className,
|
|
131
|
+
)}
|
|
132
|
+
// The group is collapsed while the tools run, so the trigger is the only
|
|
133
|
+
// thing on screen that knows about it. The state is on the control, not
|
|
134
|
+
// in a second copy of its name.
|
|
135
|
+
aria-busy={active || undefined}
|
|
136
|
+
{...props}
|
|
137
|
+
>
|
|
138
|
+
{/* Pixel braces, the same 5×5 grid and the same box as the reasoning
|
|
139
|
+
bulb, still in both states so the label does not shift. */}
|
|
140
|
+
<span data-slot="tool-group-trigger-loader" className="aui-tool-group-trigger-loader inline-flex shrink-0">
|
|
141
|
+
{/* The chain header carries the running state. The trigger is named
|
|
142
|
+
by its text, so the glyph carries no name of its own, and the
|
|
143
|
+
running state is exposed on the trigger as aria-busy. */}
|
|
144
|
+
<DotMatrix state="tools" decorative className="!size-3 shrink-0" />
|
|
145
|
+
</span>
|
|
146
|
+
<span
|
|
147
|
+
data-slot="tool-group-trigger-label"
|
|
148
|
+
className={cn(
|
|
149
|
+
"aui-tool-group-trigger-label-wrapper inline-block min-w-[4rem] text-start text-xs leading-none font-medium",
|
|
150
|
+
"group-data-[variant=ghost]/tool-group-root:font-normal",
|
|
151
|
+
"group-data-[variant=outline]/tool-group-root:grow",
|
|
152
|
+
"group-data-[variant=muted]/tool-group-root:grow",
|
|
153
|
+
)}
|
|
154
|
+
>
|
|
155
|
+
{text}
|
|
156
|
+
</span>
|
|
157
|
+
<DisclosureChevron />
|
|
158
|
+
</CollapsibleTrigger>
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function ToolGroupContent({
|
|
163
|
+
className,
|
|
164
|
+
children,
|
|
165
|
+
...props
|
|
166
|
+
}: React.ComponentProps<typeof CollapsibleContent>) {
|
|
167
|
+
const keepMounted = useExportKeepMounted();
|
|
168
|
+
return (
|
|
169
|
+
<CollapsibleContent
|
|
170
|
+
keepMounted={keepMounted}
|
|
171
|
+
data-slot="tool-group-content"
|
|
172
|
+
className={cn(
|
|
173
|
+
"aui-tool-group-content relative overflow-hidden text-sm outline-none",
|
|
174
|
+
"group/collapsible-content ease-[cubic-bezier(0.32,0.72,0,1)] motion-reduce:animate-none",
|
|
175
|
+
"data-closed:animate-collapsible-up",
|
|
176
|
+
"data-open:animate-collapsible-down",
|
|
177
|
+
"data-closed:fill-mode-forwards",
|
|
178
|
+
"data-closed:pointer-events-none",
|
|
179
|
+
"[--tw-duration:var(--animation-duration)]",
|
|
180
|
+
className,
|
|
181
|
+
)}
|
|
182
|
+
{...props}
|
|
183
|
+
>
|
|
184
|
+
<div
|
|
185
|
+
className={cn(
|
|
186
|
+
"mt-2 flex flex-col gap-2",
|
|
187
|
+
"group-data-[variant=ghost]/tool-group-root:mt-1 group-data-[variant=ghost]/tool-group-root:gap-1",
|
|
188
|
+
"group-data-[variant=outline]/tool-group-root:mt-3 group-data-[variant=outline]/tool-group-root:border-t group-data-[variant=outline]/tool-group-root:px-4 group-data-[variant=outline]/tool-group-root:pt-3",
|
|
189
|
+
"group-data-[variant=muted]/tool-group-root:mt-3 group-data-[variant=muted]/tool-group-root:border-t group-data-[variant=muted]/tool-group-root:px-4 group-data-[variant=muted]/tool-group-root:pt-3",
|
|
190
|
+
"[&>*]:animate-in [&>*]:fade-in-0 [&>*]:blur-in-[2px] [&>*]:slide-in-from-top-1 [&>*]:animation-duration-(--animation-duration) [&>*]:ease-[cubic-bezier(0.32,0.72,0,1)]",
|
|
191
|
+
"[&>*]:motion-reduce:animate-none",
|
|
192
|
+
"[&>*:nth-child(2)]:[animation-delay:40ms]",
|
|
193
|
+
"[&>*:nth-child(3)]:[animation-delay:80ms]",
|
|
194
|
+
"[&>*:nth-child(4)]:[animation-delay:120ms]",
|
|
195
|
+
"[&>*:nth-child(n+5)]:[animation-delay:160ms]",
|
|
196
|
+
)}
|
|
197
|
+
>
|
|
198
|
+
{children}
|
|
199
|
+
</div>
|
|
200
|
+
</CollapsibleContent>
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
type ToolGroupComponent = FC<
|
|
205
|
+
PropsWithChildren<{ startIndex: number; endIndex: number }>
|
|
206
|
+
> & {
|
|
207
|
+
Root: typeof ToolGroupRoot;
|
|
208
|
+
Trigger: typeof ToolGroupTrigger;
|
|
209
|
+
Content: typeof ToolGroupContent;
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
const ToolGroupImpl: FC<
|
|
213
|
+
PropsWithChildren<{ startIndex: number; endIndex: number }>
|
|
214
|
+
> = ({ children, startIndex, endIndex }) => {
|
|
215
|
+
const toolCount = endIndex - startIndex + 1;
|
|
216
|
+
|
|
217
|
+
return (
|
|
218
|
+
<ToolGroupRoot>
|
|
219
|
+
<ToolGroupTrigger count={toolCount} />
|
|
220
|
+
<ToolGroupContent>{children}</ToolGroupContent>
|
|
221
|
+
</ToolGroupRoot>
|
|
222
|
+
);
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* @deprecated This wrapper targets the legacy `components.ToolGroup` prop
|
|
227
|
+
* on `<MessagePrimitive.Parts>`. Use `<MessagePrimitive.GroupedParts>` with
|
|
228
|
+
* a `groupBy` returning `"group-tool"` and compose `ToolGroupRoot` /
|
|
229
|
+
* `ToolGroupTrigger` / `ToolGroupContent` directly. See `thread.tsx`.
|
|
230
|
+
*/
|
|
231
|
+
const ToolGroup = memo(ToolGroupImpl) as unknown as ToolGroupComponent;
|
|
232
|
+
|
|
233
|
+
ToolGroup.displayName = "ToolGroup";
|
|
234
|
+
ToolGroup.Root = ToolGroupRoot;
|
|
235
|
+
ToolGroup.Trigger = ToolGroupTrigger;
|
|
236
|
+
ToolGroup.Content = ToolGroupContent;
|
|
237
|
+
|
|
238
|
+
export {
|
|
239
|
+
ToolGroup,
|
|
240
|
+
ToolGroupRoot,
|
|
241
|
+
ToolGroupTrigger,
|
|
242
|
+
ToolGroupContent,
|
|
243
|
+
toolGroupVariants,
|
|
244
|
+
};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The tool set, expanded once (#tool-contract).
|
|
3
|
+
*
|
|
4
|
+
* The composer toolbar prints a tool count and `/tools` prints the rows behind
|
|
5
|
+
* it. They used to compute that set separately — the toolbar over
|
|
6
|
+
* `prefs.mcpServers` with its own formula, the menu over `allowedTools` plus a
|
|
7
|
+
* built-in substitution — and disagreed on the same deployment. This module is
|
|
8
|
+
* the only expansion: raw backend ids in, one row per server with its
|
|
9
|
+
* effective tools out, plus the count derived from the same rows.
|
|
10
|
+
*
|
|
11
|
+
* Every id here is a backend id. Nothing in this file humanises a name.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/** A row that can carry per-tool entries, as the host projects it. */
|
|
15
|
+
export type ToolSurfaceRowInput = {
|
|
16
|
+
id: string;
|
|
17
|
+
/** Individual tools under this row, raw backend ids. */
|
|
18
|
+
tools?: ReadonlyArray<{ id: string }>;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export type ToolSurfaceRow = {
|
|
22
|
+
id: string;
|
|
23
|
+
/** Effective tool ids under this row. Raw backend ids, never labels. */
|
|
24
|
+
tools: readonly string[];
|
|
25
|
+
/**
|
|
26
|
+
* True when `tools` is the house built-in set rather than a list the
|
|
27
|
+
* deployment named. A deployment that names no tools for a house service
|
|
28
|
+
* leaves the row governed by that service's switch, so its two built-ins
|
|
29
|
+
* are what the switch actually turns on and off
|
|
30
|
+
* (digigraph/src/digigraph/tool_policy.py).
|
|
31
|
+
*/
|
|
32
|
+
builtin: boolean;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The tools a house switch carries, by backend id. Kept in step with
|
|
37
|
+
* digigraph's `_DISABLE_TOOL_ALIASES` (digigraph/src/digigraph/tool_policy.py):
|
|
38
|
+
* disabling `digisearch` strips both of its pair, disabling `digivault` strips
|
|
39
|
+
* both of its pair.
|
|
40
|
+
*/
|
|
41
|
+
export const HOUSE_BUILTIN_TOOL_IDS: Readonly<Record<string, readonly string[]>> = {
|
|
42
|
+
digisearch: ["digisearch", "digisearch_fetch_all"],
|
|
43
|
+
digivault: ["digivault_search_notes", "digivault_get_note"],
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/** The house service ids that carry a built-in pair. */
|
|
47
|
+
export const HOUSE_SERVER_IDS: ReadonlySet<string> = new Set(Object.keys(HOUSE_BUILTIN_TOOL_IDS));
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* One row per server, with the tools a deployment actually gets under it:
|
|
51
|
+
* the declared `tools` when the row names any, else the house built-in pair
|
|
52
|
+
* for that service id, else nothing.
|
|
53
|
+
*/
|
|
54
|
+
export function expandToolRows(
|
|
55
|
+
rows: readonly ToolSurfaceRowInput[],
|
|
56
|
+
): ToolSurfaceRow[] {
|
|
57
|
+
return rows.map((row) => {
|
|
58
|
+
const declared = (row.tools ?? []).map((tool) => tool.id.trim()).filter(Boolean);
|
|
59
|
+
if (declared.length) return { id: row.id.trim(), tools: declared, builtin: false };
|
|
60
|
+
const builtin = HOUSE_BUILTIN_TOOL_IDS[row.id.trim()] ?? [];
|
|
61
|
+
return {
|
|
62
|
+
id: row.id.trim(),
|
|
63
|
+
tools: builtin,
|
|
64
|
+
builtin: builtin.length > 0,
|
|
65
|
+
};
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export type ToolSurfaceCount = {
|
|
70
|
+
servers: number;
|
|
71
|
+
tools: number;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The count the toolbar prints, derived from the rows `/tools` renders.
|
|
76
|
+
*
|
|
77
|
+
* A row counts once while it is on and carries at least one tool; a row with
|
|
78
|
+
* no tools is one tool, because a server nobody has broken down is still one
|
|
79
|
+
* thing the assistant can call.
|
|
80
|
+
*/
|
|
81
|
+
export function countToolSurface(
|
|
82
|
+
rows: readonly ToolSurfaceRowInput[],
|
|
83
|
+
input: {
|
|
84
|
+
isOn: (rowId: string) => boolean;
|
|
85
|
+
isToolOn: (toolId: string) => boolean;
|
|
86
|
+
},
|
|
87
|
+
): ToolSurfaceCount {
|
|
88
|
+
const counts: ToolSurfaceCount = { servers: 0, tools: 0 };
|
|
89
|
+
for (const row of expandToolRows(rows)) {
|
|
90
|
+
if (!input.isOn(row.id)) continue;
|
|
91
|
+
const enabled = row.tools.length
|
|
92
|
+
? row.tools.filter((id) => input.isToolOn(id)).length
|
|
93
|
+
: 1;
|
|
94
|
+
if (enabled === 0) continue;
|
|
95
|
+
counts.servers += 1;
|
|
96
|
+
counts.tools += enabled;
|
|
97
|
+
}
|
|
98
|
+
return counts;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Whether a row is on. Kept here, not in the host, so the toolbar and the menu
|
|
103
|
+
* answer with the same rule: a house service follows its own switch, web
|
|
104
|
+
* search follows the tenant's, everything else falls back to the session
|
|
105
|
+
* toggle.
|
|
106
|
+
*/
|
|
107
|
+
export function connectedToolIsOn(
|
|
108
|
+
id: string,
|
|
109
|
+
input: {
|
|
110
|
+
digisearch: boolean;
|
|
111
|
+
vault: boolean;
|
|
112
|
+
webSearch: boolean;
|
|
113
|
+
extraToolOn: (id: string) => boolean;
|
|
114
|
+
},
|
|
115
|
+
): boolean {
|
|
116
|
+
if (id === "digisearch") return input.digisearch;
|
|
117
|
+
if (id === "digivault") return input.vault;
|
|
118
|
+
if (id === "websearch" || id === "web_search") return input.webSearch;
|
|
119
|
+
return input.extraToolOn(id);
|
|
120
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { type ComponentPropsWithRef, forwardRef } from "react";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
Tooltip,
|
|
7
|
+
TooltipContent,
|
|
8
|
+
TooltipProvider,
|
|
9
|
+
TooltipTrigger,
|
|
10
|
+
} from "./ui/tooltip";
|
|
11
|
+
import { Button } from "./ui/button";
|
|
12
|
+
import { cn } from "../../../lib/utils";
|
|
13
|
+
|
|
14
|
+
export type TooltipIconButtonProps = ComponentPropsWithRef<typeof Button> & {
|
|
15
|
+
tooltip: string;
|
|
16
|
+
side?: "top" | "bottom" | "left" | "right";
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const TooltipIconButton = forwardRef<
|
|
20
|
+
HTMLButtonElement,
|
|
21
|
+
TooltipIconButtonProps
|
|
22
|
+
>(({ children, tooltip, side = "bottom", className, ...rest }, ref) => {
|
|
23
|
+
return (
|
|
24
|
+
<TooltipProvider>
|
|
25
|
+
<Tooltip>
|
|
26
|
+
<TooltipTrigger
|
|
27
|
+
render={
|
|
28
|
+
<Button
|
|
29
|
+
variant="ghost"
|
|
30
|
+
size="icon"
|
|
31
|
+
{...rest}
|
|
32
|
+
className={cn(
|
|
33
|
+
"aui-button-icon size-6 p-1 active:scale-90",
|
|
34
|
+
className,
|
|
35
|
+
)}
|
|
36
|
+
ref={ref}
|
|
37
|
+
/>
|
|
38
|
+
}
|
|
39
|
+
>
|
|
40
|
+
{children}
|
|
41
|
+
<span className="aui-sr-only sr-only">{tooltip}</span>
|
|
42
|
+
</TooltipTrigger>
|
|
43
|
+
<TooltipContent side={side}>{tooltip}</TooltipContent>
|
|
44
|
+
</Tooltip>
|
|
45
|
+
</TooltipProvider>
|
|
46
|
+
);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
TooltipIconButton.displayName = "TooltipIconButton";
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
import { Avatar as AvatarPrimitive } from "@base-ui/react/avatar"
|
|
5
|
+
import { cn } from "../../../../lib/utils"
|
|
6
|
+
|
|
7
|
+
function Avatar({
|
|
8
|
+
className,
|
|
9
|
+
size = "default",
|
|
10
|
+
...props
|
|
11
|
+
}: AvatarPrimitive.Root.Props & {
|
|
12
|
+
size?: "default" | "sm" | "lg"
|
|
13
|
+
}) {
|
|
14
|
+
return (
|
|
15
|
+
<AvatarPrimitive.Root
|
|
16
|
+
data-slot="avatar"
|
|
17
|
+
data-size={size}
|
|
18
|
+
className={cn(
|
|
19
|
+
"group/avatar relative flex size-8 shrink-0 rounded-full select-none after:absolute after:inset-0 after:rounded-full after:border after:border-hair after:mix-blend-darken data-[size=lg]:size-10 data-[size=sm]:size-6 dark:after:mix-blend-lighten",
|
|
20
|
+
className
|
|
21
|
+
)}
|
|
22
|
+
{...props}
|
|
23
|
+
/>
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) {
|
|
28
|
+
return (
|
|
29
|
+
<AvatarPrimitive.Image
|
|
30
|
+
data-slot="avatar-image"
|
|
31
|
+
className={cn(
|
|
32
|
+
"aspect-square size-full rounded-full object-cover",
|
|
33
|
+
className
|
|
34
|
+
)}
|
|
35
|
+
{...props}
|
|
36
|
+
/>
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function AvatarFallback({
|
|
41
|
+
className,
|
|
42
|
+
...props
|
|
43
|
+
}: AvatarPrimitive.Fallback.Props) {
|
|
44
|
+
return (
|
|
45
|
+
<AvatarPrimitive.Fallback
|
|
46
|
+
data-slot="avatar-fallback"
|
|
47
|
+
className={cn(
|
|
48
|
+
"flex size-full items-center justify-center rounded-full bg-surface-2 text-sm text-ink-mute group-data-[size=sm]/avatar:text-xs",
|
|
49
|
+
className
|
|
50
|
+
)}
|
|
51
|
+
{...props}
|
|
52
|
+
/>
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function AvatarBadge({ className, ...props }: React.ComponentProps<"span">) {
|
|
57
|
+
return (
|
|
58
|
+
<span
|
|
59
|
+
data-slot="avatar-badge"
|
|
60
|
+
className={cn(
|
|
61
|
+
"absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-accent text-on-accent bg-blend-color ring-2 ring-surface select-none",
|
|
62
|
+
"group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden",
|
|
63
|
+
"group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2",
|
|
64
|
+
"group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2",
|
|
65
|
+
className
|
|
66
|
+
)}
|
|
67
|
+
{...props}
|
|
68
|
+
/>
|
|
69
|
+
)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function AvatarGroup({ className, ...props }: React.ComponentProps<"div">) {
|
|
73
|
+
return (
|
|
74
|
+
<div
|
|
75
|
+
data-slot="avatar-group"
|
|
76
|
+
className={cn(
|
|
77
|
+
"group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-surface",
|
|
78
|
+
className
|
|
79
|
+
)}
|
|
80
|
+
{...props}
|
|
81
|
+
/>
|
|
82
|
+
)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function AvatarGroupCount({
|
|
86
|
+
className,
|
|
87
|
+
...props
|
|
88
|
+
}: React.ComponentProps<"div">) {
|
|
89
|
+
return (
|
|
90
|
+
<div
|
|
91
|
+
data-slot="avatar-group-count"
|
|
92
|
+
className={cn(
|
|
93
|
+
"relative flex size-8 shrink-0 items-center justify-center rounded-full bg-surface-2 text-sm text-ink-mute ring-2 ring-surface group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3",
|
|
94
|
+
className
|
|
95
|
+
)}
|
|
96
|
+
{...props}
|
|
97
|
+
/>
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export {
|
|
102
|
+
Avatar,
|
|
103
|
+
AvatarImage,
|
|
104
|
+
AvatarFallback,
|
|
105
|
+
AvatarGroup,
|
|
106
|
+
AvatarGroupCount,
|
|
107
|
+
AvatarBadge,
|
|
108
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { Button as ButtonPrimitive } from "@base-ui/react/button"
|
|
4
|
+
import { cva, type VariantProps } from "class-variance-authority"
|
|
5
|
+
import { cn } from "../../../../lib/utils"
|
|
6
|
+
import { useStockShape } from "../stock-shape"
|
|
7
|
+
|
|
8
|
+
const buttonVariants = cva(
|
|
9
|
+
"group/button inline-flex shrink-0 items-center justify-center rounded-none border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-colors outline-none select-none focus-visible:border-accent focus-visible:ring-3 focus-visible:ring-accent/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-danger aria-invalid:ring-3 aria-invalid:ring-danger/20 dark:aria-invalid:border-danger/50 dark:aria-invalid:ring-danger/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
|
|
10
|
+
{
|
|
11
|
+
variants: {
|
|
12
|
+
variant: {
|
|
13
|
+
default: "bg-accent text-on-accent hover:bg-accent/80",
|
|
14
|
+
outline:
|
|
15
|
+
"border-hair bg-surface hover:bg-surface-2 hover:text-ink aria-expanded:bg-surface-2 aria-expanded:text-ink dark:border-input dark:bg-surface-2/30 dark:hover:bg-surface-2/50",
|
|
16
|
+
secondary:
|
|
17
|
+
"bg-surface-2 text-ink hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-surface-2 aria-expanded:text-ink",
|
|
18
|
+
ghost:
|
|
19
|
+
"hover:bg-surface-2 hover:text-ink aria-expanded:bg-surface-2 aria-expanded:text-ink dark:hover:bg-surface-2/50",
|
|
20
|
+
destructive:
|
|
21
|
+
"bg-danger/10 text-danger hover:bg-danger/20 focus-visible:border-danger/40 focus-visible:ring-danger/20 dark:bg-danger/20 dark:hover:bg-danger/30 dark:focus-visible:ring-danger/40",
|
|
22
|
+
link: "text-accent underline-offset-4 hover:underline",
|
|
23
|
+
},
|
|
24
|
+
size: {
|
|
25
|
+
default:
|
|
26
|
+
"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
|
|
27
|
+
xs: "h-6 gap-1 rounded-none px-2 text-xs in-data-[slot=button-group]:rounded-none has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
|
|
28
|
+
sm: "h-7 gap-1 rounded-none px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-none has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
|
|
29
|
+
lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
|
|
30
|
+
icon: "size-8",
|
|
31
|
+
"icon-xs":
|
|
32
|
+
"size-6 rounded-none in-data-[slot=button-group]:rounded-none [&_svg:not([class*='size-'])]:size-3",
|
|
33
|
+
"icon-sm":
|
|
34
|
+
"size-7 rounded-none in-data-[slot=button-group]:rounded-none",
|
|
35
|
+
"icon-lg": "size-9",
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
defaultVariants: {
|
|
39
|
+
variant: "default",
|
|
40
|
+
size: "default",
|
|
41
|
+
},
|
|
42
|
+
}
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
// assistant-ui's shadcn base-nova radii, applied only inside the stock Thread
|
|
46
|
+
// (see ../stock-shape.tsx). Other skins that reuse this button keep the square
|
|
47
|
+
// house radius from buttonVariants above.
|
|
48
|
+
const STOCK_BUTTON_RADIUS = {
|
|
49
|
+
default: "rounded-lg",
|
|
50
|
+
xs: "rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg",
|
|
51
|
+
sm: "rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
|
|
52
|
+
lg: "rounded-lg",
|
|
53
|
+
icon: "rounded-lg",
|
|
54
|
+
"icon-xs":
|
|
55
|
+
"rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg",
|
|
56
|
+
"icon-sm":
|
|
57
|
+
"rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
|
|
58
|
+
"icon-lg": "rounded-lg",
|
|
59
|
+
} as const
|
|
60
|
+
|
|
61
|
+
function Button({
|
|
62
|
+
className,
|
|
63
|
+
variant = "default",
|
|
64
|
+
size = "default",
|
|
65
|
+
...props
|
|
66
|
+
}: ButtonPrimitive.Props & VariantProps<typeof buttonVariants>) {
|
|
67
|
+
const stock = useStockShape()
|
|
68
|
+
return (
|
|
69
|
+
<ButtonPrimitive
|
|
70
|
+
data-slot="button"
|
|
71
|
+
className={cn(
|
|
72
|
+
buttonVariants({ variant, size }),
|
|
73
|
+
stock && STOCK_BUTTON_RADIUS[size ?? "default"],
|
|
74
|
+
className
|
|
75
|
+
)}
|
|
76
|
+
{...props}
|
|
77
|
+
/>
|
|
78
|
+
)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export { Button, buttonVariants }
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import { Collapsible as CollapsiblePrimitive } from "@base-ui/react/collapsible"
|
|
4
|
+
|
|
5
|
+
function Collapsible({ ...props }: CollapsiblePrimitive.Root.Props) {
|
|
6
|
+
return <CollapsiblePrimitive.Root data-slot="collapsible" {...props} />
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function CollapsibleTrigger({ ...props }: CollapsiblePrimitive.Trigger.Props) {
|
|
10
|
+
return (
|
|
11
|
+
<CollapsiblePrimitive.Trigger data-slot="collapsible-trigger" {...props} />
|
|
12
|
+
)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function CollapsibleContent({ ...props }: CollapsiblePrimitive.Panel.Props) {
|
|
16
|
+
return (
|
|
17
|
+
<CollapsiblePrimitive.Panel data-slot="collapsible-content" {...props} />
|
|
18
|
+
)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { Collapsible, CollapsibleTrigger, CollapsibleContent }
|