@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,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One export model for every skin: a format (`md` | `html`) and a scope.
|
|
3
|
+
*
|
|
4
|
+
* - The message menu exports that assistant message only.
|
|
5
|
+
* - The chat menu (`/export`, the settings list) exports the whole
|
|
6
|
+
* conversation, user and assistant turns in order.
|
|
7
|
+
*
|
|
8
|
+
* Markdown is built from the runtime messages. HTML is a snapshot of the
|
|
9
|
+
* rendered thread (`replay/browser`), so it looks like the chat.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { serializeAssistantMarkdown, type TranscriptTurn } from "./transcript-markdown";
|
|
13
|
+
|
|
14
|
+
export type ChatExportFormat = "md" | "html";
|
|
15
|
+
|
|
16
|
+
export const CHAT_EXPORT_FORMATS: readonly ChatExportFormat[] = ["md", "html"];
|
|
17
|
+
|
|
18
|
+
/** `md`, `markdown`, `html`, case-insensitive. Empty means markdown. */
|
|
19
|
+
export function parseChatExportFormat(raw: string | null | undefined): ChatExportFormat | null {
|
|
20
|
+
const value = (raw ?? "").trim().toLowerCase().replace(/^\./, "");
|
|
21
|
+
if (value === "" || value === "md" || value === "markdown") return "md";
|
|
22
|
+
if (value === "html" || value === "htm") return "html";
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type ChatExportStrings = {
|
|
27
|
+
/** The submenu trigger: `Export`. */
|
|
28
|
+
export: string;
|
|
29
|
+
markdown: string;
|
|
30
|
+
html: string;
|
|
31
|
+
/** Hint under the chat-level `/export` row. */
|
|
32
|
+
conversationHint: string;
|
|
33
|
+
/** Turn headings in the markdown file. */
|
|
34
|
+
user: string;
|
|
35
|
+
assistant: string;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
const EN: ChatExportStrings = {
|
|
39
|
+
export: "Export",
|
|
40
|
+
markdown: "Markdown (.md)",
|
|
41
|
+
html: "HTML (.html)",
|
|
42
|
+
conversationHint: "Download this conversation as a file.",
|
|
43
|
+
user: "User",
|
|
44
|
+
assistant: "Assistant",
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const FR: ChatExportStrings = {
|
|
48
|
+
export: "Exporter",
|
|
49
|
+
markdown: "Markdown (.md)",
|
|
50
|
+
html: "HTML (.html)",
|
|
51
|
+
conversationHint: "Télécharger cette conversation dans un fichier.",
|
|
52
|
+
user: "Utilisateur",
|
|
53
|
+
assistant: "Assistant",
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export const CHAT_EXPORT_LOCALES: Readonly<Record<string, ChatExportStrings>> = { en: EN, fr: FR };
|
|
57
|
+
|
|
58
|
+
/** Strings for a language code (`fr`, `fr-CA`). Unknown languages get English. */
|
|
59
|
+
export function chatExportStrings(locale?: string | null): ChatExportStrings {
|
|
60
|
+
const code = (locale ?? "").split(/[-_]/)[0]?.toLowerCase() ?? "";
|
|
61
|
+
return CHAT_EXPORT_LOCALES[code] ?? EN;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function chatExportLabel(format: ChatExportFormat, strings: ChatExportStrings): string {
|
|
65
|
+
return format === "html" ? strings.html : strings.markdown;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Text turns from runtime messages (`content` or `parts`). Tool calls,
|
|
70
|
+
* reasoning and empty turns are left out.
|
|
71
|
+
*/
|
|
72
|
+
export function transcriptTurns(messages: readonly unknown[]): TranscriptTurn[] {
|
|
73
|
+
const out: TranscriptTurn[] = [];
|
|
74
|
+
for (const raw of messages) {
|
|
75
|
+
const turn = transcriptTurn(raw);
|
|
76
|
+
if (turn) out.push(turn);
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function transcriptTurn(raw: unknown): TranscriptTurn | null {
|
|
82
|
+
if (!raw || typeof raw !== "object") return null;
|
|
83
|
+
const m = raw as { role?: string; content?: unknown; parts?: unknown };
|
|
84
|
+
if (m.role !== "user" && m.role !== "assistant") return null;
|
|
85
|
+
const parts = Array.isArray(m.content) ? m.content : m.parts;
|
|
86
|
+
const text = Array.isArray(parts)
|
|
87
|
+
? parts
|
|
88
|
+
.filter((p): p is { type: string; text?: string } => !!p && typeof p === "object")
|
|
89
|
+
.filter((p) => p.type === "text" && typeof p.text === "string")
|
|
90
|
+
.map((p) => p.text ?? "")
|
|
91
|
+
.join("")
|
|
92
|
+
: typeof m.content === "string"
|
|
93
|
+
? m.content
|
|
94
|
+
: "";
|
|
95
|
+
if (!text.trim()) return null;
|
|
96
|
+
return { role: m.role, content: text };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* The conversation file: a `## User` / `## Assistant` heading per turn, in
|
|
101
|
+
* order, separated by a rule so the turns stay apart in any viewer.
|
|
102
|
+
*/
|
|
103
|
+
export function conversationMarkdown(
|
|
104
|
+
turns: readonly TranscriptTurn[],
|
|
105
|
+
strings: Pick<ChatExportStrings, "user" | "assistant"> = EN,
|
|
106
|
+
): string {
|
|
107
|
+
const blocks: string[] = [];
|
|
108
|
+
for (const turn of turns) {
|
|
109
|
+
const body =
|
|
110
|
+
turn.role === "assistant"
|
|
111
|
+
? serializeAssistantMarkdown(turn.content, turn.sources)
|
|
112
|
+
: turn.content.trim();
|
|
113
|
+
if (!body) continue;
|
|
114
|
+
const heading = turn.role === "user" ? strings.user : strings.assistant;
|
|
115
|
+
blocks.push(`## ${heading}\n\n${body}`);
|
|
116
|
+
}
|
|
117
|
+
return blocks.join("\n\n---\n\n");
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** One assistant message, as rendered: no heading, no question. */
|
|
121
|
+
export function messageMarkdown(turn: TranscriptTurn | null): string {
|
|
122
|
+
if (!turn || turn.role !== "assistant") return "";
|
|
123
|
+
return serializeAssistantMarkdown(turn.content, turn.sources);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Last user question in the turns, for the file name. */
|
|
127
|
+
export function lastQuestion(turns: readonly TranscriptTurn[]): string {
|
|
128
|
+
for (let i = turns.length - 1; i >= 0; i -= 1) {
|
|
129
|
+
const turn = turns[i];
|
|
130
|
+
if (turn?.role === "user") return turn.content;
|
|
131
|
+
}
|
|
132
|
+
return "";
|
|
133
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transcript serializers + activity rows for the package skins (WS4).
|
|
3
|
+
*
|
|
4
|
+
* Moved from `@digithings-ai/digichat-ui` (which re-exports this barrel for
|
|
5
|
+
* compat). The three modules share no export names, so `export *` is safe.
|
|
6
|
+
*/
|
|
7
|
+
export * from "./transcript-markdown";
|
|
8
|
+
export * from "./activity-view";
|
|
9
|
+
export * from "./types";
|
|
10
|
+
export * from "./chat-export";
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Save a generated text file (Markdown or HTML export) from the chat.
|
|
3
|
+
*
|
|
4
|
+
* Phones broke the plain `<a download>` path in two ways:
|
|
5
|
+
*
|
|
6
|
+
* 1. iOS Safari asks "Download …?" before it reads a blob URL. The old code
|
|
7
|
+
* revoked the URL two seconds after the click, so a visitor who took
|
|
8
|
+
* longer to confirm got an empty or failed download. The URL now lives
|
|
9
|
+
* for a minute.
|
|
10
|
+
* 2. A download or share started after the tap's user activation expired
|
|
11
|
+
* is dropped, silently, inside a cross-origin iframe (the OCC and
|
|
12
|
+
* digithings.ai embeds). The HTML export runs after the menu closes and
|
|
13
|
+
* after it inlines fonts and images, which on a phone network outlasts
|
|
14
|
+
* the activation. When activation is gone we show a "Save" button, so
|
|
15
|
+
* the save runs inside a fresh tap.
|
|
16
|
+
*
|
|
17
|
+
* On a touch device that can share files (and where the frame is allowed
|
|
18
|
+
* to), the system share sheet is used: it offers "Save to Files" on iOS
|
|
19
|
+
* and is the reliable path there. Desktop keeps the direct download.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/** How long a blob URL outlives its click. iOS reads it after the user confirms. */
|
|
23
|
+
export const SAVE_URL_LIFETIME_MS = 60_000;
|
|
24
|
+
|
|
25
|
+
export const SAVE_PROMPT_SLOT = "export-save-prompt";
|
|
26
|
+
|
|
27
|
+
type ShareNavigator = Navigator & {
|
|
28
|
+
canShare?: (data: ShareData) => boolean;
|
|
29
|
+
share?: (data: ShareData) => Promise<void>;
|
|
30
|
+
userActivation?: { isActive: boolean };
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
type FeaturePolicyDocument = Document & {
|
|
34
|
+
featurePolicy?: { allowsFeature: (feature: string) => boolean };
|
|
35
|
+
permissionsPolicy?: { allowsFeature: (feature: string) => boolean };
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
type Env = { navigator?: Navigator; matchMedia?: (q: string) => { matches: boolean } };
|
|
39
|
+
|
|
40
|
+
function coarsePointer(win: Env): boolean {
|
|
41
|
+
try {
|
|
42
|
+
return win.matchMedia?.("(pointer: coarse)").matches === true;
|
|
43
|
+
} catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function shareAllowedInFrame(doc: Document): boolean {
|
|
49
|
+
const policy =
|
|
50
|
+
(doc as FeaturePolicyDocument).permissionsPolicy ??
|
|
51
|
+
(doc as FeaturePolicyDocument).featurePolicy;
|
|
52
|
+
if (!policy) return true;
|
|
53
|
+
try {
|
|
54
|
+
return policy.allowsFeature("web-share");
|
|
55
|
+
} catch {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** False only when the browser says the tap's activation is gone. */
|
|
61
|
+
export function hasUserActivation(nav: Navigator | undefined): boolean {
|
|
62
|
+
const ua = (nav as ShareNavigator | undefined)?.userActivation;
|
|
63
|
+
return ua ? ua.isActive : true;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function canShareFile(win: Env, doc: Document, file: File): boolean {
|
|
67
|
+
const nav = win.navigator as ShareNavigator | undefined;
|
|
68
|
+
if (!nav || typeof File === "undefined") return false;
|
|
69
|
+
if (typeof nav.share !== "function" || typeof nav.canShare !== "function") return false;
|
|
70
|
+
if (!coarsePointer(win) || !shareAllowedInFrame(doc)) return false;
|
|
71
|
+
try {
|
|
72
|
+
return nav.canShare({ files: [file] });
|
|
73
|
+
} catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Anchor download. Needs to run inside a user activation in an iframe. */
|
|
79
|
+
export function anchorDownload(doc: Document, filename: string, blob: Blob): void {
|
|
80
|
+
const url = URL.createObjectURL(blob);
|
|
81
|
+
const a = doc.createElement("a");
|
|
82
|
+
a.href = url;
|
|
83
|
+
a.download = filename;
|
|
84
|
+
a.rel = "noopener";
|
|
85
|
+
(doc.body ?? doc.documentElement).appendChild(a);
|
|
86
|
+
a.click();
|
|
87
|
+
a.remove();
|
|
88
|
+
const later =
|
|
89
|
+
globalThis.setTimeout ??
|
|
90
|
+
((fn: () => void) => {
|
|
91
|
+
fn();
|
|
92
|
+
return 0;
|
|
93
|
+
});
|
|
94
|
+
later(() => URL.revokeObjectURL(url), SAVE_URL_LIFETIME_MS);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** Share sheet on a phone, else a download. Call from inside a tap. */
|
|
98
|
+
function saveNow(win: Env, doc: Document, filename: string, text: string, mime: string): void {
|
|
99
|
+
const blob = new Blob([text], { type: mime });
|
|
100
|
+
const file = typeof File === "undefined" ? null : new File([text], filename, { type: mime });
|
|
101
|
+
if (file && canShareFile(win, doc, file)) {
|
|
102
|
+
const nav = win.navigator as ShareNavigator;
|
|
103
|
+
const fallback = () => {
|
|
104
|
+
// The share was refused. A download now may be outside the tap, so ask
|
|
105
|
+
// for one more tap (download only) when the activation is gone.
|
|
106
|
+
if (hasUserActivation(win.navigator)) anchorDownload(doc, filename, file);
|
|
107
|
+
else showSavePrompt(doc, filename, () => anchorDownload(doc, filename, file));
|
|
108
|
+
};
|
|
109
|
+
let pending: Promise<void>;
|
|
110
|
+
try {
|
|
111
|
+
pending = nav.share!({ files: [file], title: filename });
|
|
112
|
+
} catch {
|
|
113
|
+
// WebKit throws synchronously for data it cannot share.
|
|
114
|
+
anchorDownload(doc, filename, file);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
pending.catch((error: unknown) => {
|
|
118
|
+
// The visitor closed the sheet: nothing to do.
|
|
119
|
+
if (error instanceof Error && error.name === "AbortError") return;
|
|
120
|
+
fallback();
|
|
121
|
+
});
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
anchorDownload(doc, filename, file ?? blob);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function removePrompt(doc: Document): void {
|
|
128
|
+
doc.querySelector(`[data-slot='${SAVE_PROMPT_SLOT}']`)?.remove();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* A one-tap "Save" button for an export that finished after the tap's
|
|
133
|
+
* activation expired. Replaces any earlier prompt.
|
|
134
|
+
*/
|
|
135
|
+
export function showSavePrompt(
|
|
136
|
+
doc: Document,
|
|
137
|
+
filename: string,
|
|
138
|
+
onSave: () => void,
|
|
139
|
+
): HTMLElement | null {
|
|
140
|
+
const host = doc.body ?? doc.documentElement;
|
|
141
|
+
if (!host) return null;
|
|
142
|
+
removePrompt(doc);
|
|
143
|
+
const box = doc.createElement("div");
|
|
144
|
+
box.setAttribute("role", "status");
|
|
145
|
+
box.setAttribute("aria-live", "polite");
|
|
146
|
+
box.setAttribute("data-slot", SAVE_PROMPT_SLOT);
|
|
147
|
+
box.style.cssText =
|
|
148
|
+
"position:fixed;left:50%;bottom:max(16px,env(safe-area-inset-bottom));transform:translateX(-50%);z-index:2147483000;display:flex;gap:8px;align-items:center;max-width:calc(100vw - 32px);padding:6px 6px 6px 12px;border:1px solid currentColor;background:Canvas;color:CanvasText;font:inherit;font-size:14px;";
|
|
149
|
+
const label = doc.createElement("span");
|
|
150
|
+
label.style.cssText = "overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;";
|
|
151
|
+
const target = "min-height:44px;min-width:44px;font:inherit;color:inherit;cursor:pointer;";
|
|
152
|
+
const save = doc.createElement("button");
|
|
153
|
+
save.type = "button";
|
|
154
|
+
save.textContent = "Save";
|
|
155
|
+
save.setAttribute("data-slot", `${SAVE_PROMPT_SLOT}-save`);
|
|
156
|
+
save.style.cssText = `${target}padding:0 14px;border:1px solid currentColor;background:transparent;`;
|
|
157
|
+
save.addEventListener("click", () => {
|
|
158
|
+
try {
|
|
159
|
+
onSave();
|
|
160
|
+
} finally {
|
|
161
|
+
removePrompt(doc);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
const close = doc.createElement("button");
|
|
165
|
+
close.type = "button";
|
|
166
|
+
close.textContent = "×";
|
|
167
|
+
close.setAttribute("aria-label", "Dismiss");
|
|
168
|
+
close.style.cssText = `${target}padding:0;border:0;background:transparent;`;
|
|
169
|
+
close.addEventListener("click", () => removePrompt(doc));
|
|
170
|
+
box.append(label, save, close);
|
|
171
|
+
// The live region exists before its text, so screen readers announce it.
|
|
172
|
+
host.appendChild(box);
|
|
173
|
+
label.textContent = `${filename} is ready. Tap Save to download it.`;
|
|
174
|
+
try {
|
|
175
|
+
save.focus({ preventScroll: true });
|
|
176
|
+
} catch {
|
|
177
|
+
/* focus is best effort */
|
|
178
|
+
}
|
|
179
|
+
return box;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** Inside a cross-origin frame or on a phone, a late save needs a fresh tap. */
|
|
183
|
+
function needsFreshTap(win: Env & { parent?: unknown; self?: unknown }): boolean {
|
|
184
|
+
let framed = false;
|
|
185
|
+
try {
|
|
186
|
+
framed = win.parent !== undefined && win.parent !== win.self;
|
|
187
|
+
} catch {
|
|
188
|
+
framed = true;
|
|
189
|
+
}
|
|
190
|
+
return framed || coarsePointer(win);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Save `text` as `filename`. Inside a live tap it shares (phone) or
|
|
195
|
+
* downloads (desktop) right away. After the activation expired it asks for
|
|
196
|
+
* one more tap instead of failing silently.
|
|
197
|
+
*/
|
|
198
|
+
export function saveTextFile(filename: string, text: string, mime: string): void {
|
|
199
|
+
if (typeof document === "undefined") {
|
|
200
|
+
throw new Error("downloadTextFile requires a document");
|
|
201
|
+
}
|
|
202
|
+
const doc = document;
|
|
203
|
+
const win = globalThis as unknown as Env;
|
|
204
|
+
if (!hasUserActivation(win.navigator) && needsFreshTap(win)) {
|
|
205
|
+
showSavePrompt(doc, filename, () => saveNow(win, doc, filename, text, mime));
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
saveNow(win, doc, filename, text, mime);
|
|
209
|
+
}
|