@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.
Files changed (424) hide show
  1. package/README.md +48 -2
  2. package/package.json +143 -4
  3. package/src/components/NavShell.tsx +776 -0
  4. package/src/components/SocialRow.tsx +87 -0
  5. package/src/components/Spinner.tsx +27 -0
  6. package/src/components/StackLogo.tsx +40 -0
  7. package/src/components/Terminal.tsx +110 -0
  8. package/src/components/TerminalManifest.tsx +212 -0
  9. package/src/components/ThemeProvider.tsx +271 -0
  10. package/src/components/account/AuthCard.tsx +309 -0
  11. package/src/components/assistant-ui/elements/mermaid-diagram.aui.tsx +63 -0
  12. package/src/components/assistant-ui/elements/mermaid-diagram.tsx +340 -0
  13. package/src/components/brand/BrandWordmark.tsx +32 -0
  14. package/src/components/changelog/ReleaseRail.tsx +81 -0
  15. package/src/components/changelog/index.ts +1 -0
  16. package/src/components/chat/ChatCodeBlock.tsx +67 -0
  17. package/src/components/chat/ChatMarkdown.tsx +66 -0
  18. package/src/components/chat/ChatMarkdownSource.tsx +203 -0
  19. package/src/components/chat/ChatMermaidBlock.tsx +202 -0
  20. package/src/components/chat/ChatMessage.tsx +77 -0
  21. package/src/components/chat/ChatPlayback.tsx +422 -0
  22. package/src/components/chat/ChatStreamCursor.tsx +25 -0
  23. package/src/components/chat/ChatThinking.tsx +113 -0
  24. package/src/components/chat/ChatToolCall.tsx +190 -0
  25. package/src/components/chat/ChatTranscript.tsx +60 -0
  26. package/src/components/chat/ChatWidgetFrame.tsx +107 -0
  27. package/src/components/chat/DigichatBootLoader.tsx +683 -0
  28. package/src/components/chat/DigichatLauncher.tsx +361 -0
  29. package/src/components/chat/DigichatThread.tsx +118 -0
  30. package/src/components/chat/DigichatThreadList.tsx +54 -0
  31. package/src/components/chat/DigichatWordmark.tsx +24 -0
  32. package/src/components/chat/DotMatrix.tsx +650 -0
  33. package/src/components/chat/boot-lab.tsx +766 -0
  34. package/src/components/chat/boot-signal.ts +144 -0
  35. package/src/components/chat/chat-surfaces.ts +52 -0
  36. package/src/components/chat/connection-status.ts +40 -0
  37. package/src/components/chat/digichat-wordmark.ts +355 -0
  38. package/src/components/chat/disclosure-chevron.tsx +49 -0
  39. package/src/components/chat/followable-href.ts +9 -0
  40. package/src/components/chat/gallery-thread/action-icons.tsx +25 -0
  41. package/src/components/chat/gallery-thread/attachment.aui.tsx +262 -0
  42. package/src/components/chat/gallery-thread/block-caret.tsx +439 -0
  43. package/src/components/chat/gallery-thread/cn.ts +1 -0
  44. package/src/components/chat/gallery-thread/composer-keyboard.ts +106 -0
  45. package/src/components/chat/gallery-thread/composer-trigger-popover.aui.tsx +235 -0
  46. package/src/components/chat/gallery-thread/css.d.ts +6 -0
  47. package/src/components/chat/gallery-thread/file.tsx +238 -0
  48. package/src/components/chat/gallery-thread/follow-up-suggestions.aui.tsx +92 -0
  49. package/src/components/chat/gallery-thread/format-json-dump.ts +112 -0
  50. package/src/components/chat/gallery-thread/hooks/use-attachment-src.ts +46 -0
  51. package/src/components/chat/gallery-thread/hooks/use-copy-to-clipboard.ts +9 -0
  52. package/src/components/chat/gallery-thread/image.tsx +519 -0
  53. package/src/components/chat/gallery-thread/markdown-text.tsx +278 -0
  54. package/src/components/chat/gallery-thread/message-error.aui.tsx +105 -0
  55. package/src/components/chat/gallery-thread/message-timing.aui.tsx +143 -0
  56. package/src/components/chat/gallery-thread/private-work-step.tsx +188 -0
  57. package/src/components/chat/gallery-thread/reasoning.tsx +332 -0
  58. package/src/components/chat/gallery-thread/scroll-mode.ts +174 -0
  59. package/src/components/chat/gallery-thread/source.tsx +76 -0
  60. package/src/components/chat/gallery-thread/thread.aui.tsx +1619 -0
  61. package/src/components/chat/gallery-thread/tooltip-icon-button.tsx +53 -0
  62. package/src/components/chat/gallery-thread/typed-welcome-copy.tsx +18 -0
  63. package/src/components/chat/gallery-thread/ui/tooltip.tsx +22 -0
  64. package/src/components/chat/gallery-thread/work-chain-summary.tsx +48 -0
  65. package/src/components/chat/gallery-thread/work-chain.tsx +110 -0
  66. package/src/components/chat/gallery-thread/work-status.ts +66 -0
  67. package/src/components/chat/overlay-scrollbar.tsx +86 -0
  68. package/src/components/chat/sanitize-mermaid-svg.ts +38 -0
  69. package/src/components/chat/skins/SOURCE.md +36 -0
  70. package/src/components/chat/skins/base/attachment.aui.tsx +287 -0
  71. package/src/components/chat/skins/base/aui-default/README.md +45 -0
  72. package/src/components/chat/skins/base/aui-default/collapsible-root.tsx +19 -0
  73. package/src/components/chat/skins/base/aui-default/collapsible.tsx +21 -0
  74. package/src/components/chat/skins/base/aui-default/reasoning.aui.tsx +120 -0
  75. package/src/components/chat/skins/base/aui-default/reasoning.tsx +331 -0
  76. package/src/components/chat/skins/base/aui-default/surfaces.ts +7 -0
  77. package/src/components/chat/skins/base/aui-default/tool-fallback.aui.tsx +772 -0
  78. package/src/components/chat/skins/base/aui-default/tool-group.aui.tsx +241 -0
  79. package/src/components/chat/skins/base/docs-model-options.ts +6 -0
  80. package/src/components/chat/skins/base/elements/assistant-trace.aui.tsx +169 -0
  81. package/src/components/chat/skins/base/elements/composer-trigger-popover.aui.tsx +271 -0
  82. package/src/components/chat/skins/base/elements/directive-text.aui.tsx +29 -0
  83. package/src/components/chat/skins/base/elements/directive-text.tsx +76 -0
  84. package/src/components/chat/skins/base/elements/message-timing.aui.tsx +104 -0
  85. package/src/components/chat/skins/base/elements/model-selector.aui.tsx +140 -0
  86. package/src/components/chat/skins/base/elements/model-selector.tsx +720 -0
  87. package/src/components/chat/skins/base/elements/quote.aui.tsx +290 -0
  88. package/src/components/chat/skins/base/elements/work-chain.tsx +100 -0
  89. package/src/components/chat/skins/base/markdown-text.tsx +294 -0
  90. package/src/components/chat/skins/base/model.ts +1 -0
  91. package/src/components/chat/skins/base/thread.tsx +1050 -0
  92. package/src/components/chat/skins/base/tooltip-icon-button.tsx +56 -0
  93. package/src/components/chat/skins/base/ui/avatar.tsx +115 -0
  94. package/src/components/chat/skins/base/ui/badge.tsx +51 -0
  95. package/src/components/chat/skins/base/ui/button.tsx +67 -0
  96. package/src/components/chat/skins/base/ui/command.tsx +185 -0
  97. package/src/components/chat/skins/base/ui/dialog.tsx +168 -0
  98. package/src/components/chat/skins/base/ui/dot-matrix.tsx +267 -0
  99. package/src/components/chat/skins/base/ui/popover.tsx +97 -0
  100. package/src/components/chat/skins/base/ui/skeleton.tsx +20 -0
  101. package/src/components/chat/skins/base/ui/textarea.tsx +24 -0
  102. package/src/components/chat/skins/base/ui/tooltip.tsx +73 -0
  103. package/src/components/chat/skins/base-assistant-ui/config-provider.tsx +90 -0
  104. package/src/components/chat/skins/base-assistant-ui/defaults.ts +419 -0
  105. package/src/components/chat/skins/base-assistant-ui/index.tsx +44 -0
  106. package/src/components/chat/skins/chatgpt.tsx +448 -0
  107. package/src/components/chat/skins/claude.tsx +380 -0
  108. package/src/components/chat/skins/digichat-composer-toolbar.tsx +151 -0
  109. package/src/components/chat/skins/digichat-context-meter-shares.ts +158 -0
  110. package/src/components/chat/skins/digichat-context-meter.tsx +243 -0
  111. package/src/components/chat/skins/digichat-meter-tone.ts +26 -0
  112. package/src/components/chat/skins/digichat-usage-meter.tsx +103 -0
  113. package/src/components/chat/skins/digichat.tsx +144 -0
  114. package/src/components/chat/skins/expo-react-native.tsx +29 -0
  115. package/src/components/chat/skins/gemini.tsx +322 -0
  116. package/src/components/chat/skins/grok-icon.tsx +34 -0
  117. package/src/components/chat/skins/grok.tsx +369 -0
  118. package/src/components/chat/skins/index.ts +46 -0
  119. package/src/components/chat/skins/perplexity.tsx +462 -0
  120. package/src/components/chat/skins/product-page-assistant/assistant-modal.tsx +73 -0
  121. package/src/components/chat/skins/product-page-assistant/index.tsx +19 -0
  122. package/src/components/chat/skins/product-page-assistant/product-dashboard.tsx +164 -0
  123. package/src/components/chat/skins/react-ink.tsx +97 -0
  124. package/src/components/chat/skins/thread-skin-host-contract.ts +102 -0
  125. package/src/components/chat/skins/thread-skin-view.tsx +156 -0
  126. package/src/components/chat/skins/thread-skins.ts +143 -0
  127. package/src/components/chat/skins/tooltip-icon-button.tsx +35 -0
  128. package/src/components/chat/skins/ui/dropdown-menu.tsx +272 -0
  129. package/src/components/chat/skins/webpage-assistant/assistant-config.ts +238 -0
  130. package/src/components/chat/skins/webpage-assistant/assistant-modal.tsx +78 -0
  131. package/src/components/chat/skins/webpage-assistant/config-provider.tsx +132 -0
  132. package/src/components/chat/skins/webpage-assistant/docs-app.tsx +106 -0
  133. package/src/components/chat/skins/webpage-assistant/docs-article.tsx +109 -0
  134. package/src/components/chat/skins/webpage-assistant/docs-assistant.tsx +73 -0
  135. package/src/components/chat/skins/webpage-assistant/docs-nav.tsx +81 -0
  136. package/src/components/chat/skins/webpage-assistant/host-ui.ts +79 -0
  137. package/src/components/chat/skins/webpage-assistant/index.tsx +12 -0
  138. package/src/components/chat/skins/webpage-assistant/markdown-page.tsx +11 -0
  139. package/src/components/chat/skins/webpage-assistant/pages.ts +9 -0
  140. package/src/components/chat/skins/webpage-assistant/types.ts +178 -0
  141. package/src/components/chat/skins/webpage-assistant/use-mobile.ts +19 -0
  142. package/src/components/chat/stock/SOURCE.md +90 -0
  143. package/src/components/chat/stock/artifacts-panel.tsx +305 -0
  144. package/src/components/chat/stock/attachment.aui.tsx +280 -0
  145. package/src/components/chat/stock/chat-notice.tsx +143 -0
  146. package/src/components/chat/stock/chat-private-mode.tsx +64 -0
  147. package/src/components/chat/stock/deploy-ui-context.tsx +89 -0
  148. package/src/components/chat/stock/embed-chat-prefs.tsx +471 -0
  149. package/src/components/chat/stock/file.tsx +265 -0
  150. package/src/components/chat/stock/follow-up-suggestions.aui.tsx +83 -0
  151. package/src/components/chat/stock/image.tsx +531 -0
  152. package/src/components/chat/stock/index.ts +129 -0
  153. package/src/components/chat/stock/json-view.tsx +140 -0
  154. package/src/components/chat/stock/markdown-text.tsx +319 -0
  155. package/src/components/chat/stock/message-error.aui.tsx +96 -0
  156. package/src/components/chat/stock/message-export-menu.tsx +156 -0
  157. package/src/components/chat/stock/palette-row-preview.tsx +26 -0
  158. package/src/components/chat/stock/reasoning.aui.tsx +120 -0
  159. package/src/components/chat/stock/reasoning.tsx +335 -0
  160. package/src/components/chat/stock/skin-chrome.tsx +81 -0
  161. package/src/components/chat/stock/skin-credit.tsx +63 -0
  162. package/src/components/chat/stock/skin-palette-bridge.tsx +235 -0
  163. package/src/components/chat/stock/skin-palette-context.ts +16 -0
  164. package/src/components/chat/stock/skin-runtime.tsx +52 -0
  165. package/src/components/chat/stock/skin-slash-palette.tsx +393 -0
  166. package/src/components/chat/stock/skin-types.ts +217 -0
  167. package/src/components/chat/stock/stock-chat-prefs-host.tsx +501 -0
  168. package/src/components/chat/stock/stock-send-gate.tsx +94 -0
  169. package/src/components/chat/stock/stock-shape.tsx +39 -0
  170. package/src/components/chat/stock/thread.aui.tsx +645 -0
  171. package/src/components/chat/stock/tool-display.ts +6 -0
  172. package/src/components/chat/stock/tool-fallback.aui.tsx +866 -0
  173. package/src/components/chat/stock/tool-group.aui.tsx +244 -0
  174. package/src/components/chat/stock/tool-surface.ts +120 -0
  175. package/src/components/chat/stock/tooltip-icon-button.tsx +49 -0
  176. package/src/components/chat/stock/ui/avatar.tsx +108 -0
  177. package/src/components/chat/stock/ui/button.tsx +81 -0
  178. package/src/components/chat/stock/ui/collapsible.tsx +21 -0
  179. package/src/components/chat/stock/ui/dialog.tsx +163 -0
  180. package/src/components/chat/stock/ui/skeleton.tsx +13 -0
  181. package/src/components/chat/stock/ui/textarea.tsx +20 -0
  182. package/src/components/chat/stock/ui/tooltip.tsx +68 -0
  183. package/src/components/chat/stock/use-attachment-src.ts +42 -0
  184. package/src/components/chat/stock/use-copy-to-clipboard.ts +29 -0
  185. package/src/components/chat/strip-model-boilerplate.ts +42 -0
  186. package/src/components/chat/suggestion-cycle.tsx +230 -0
  187. package/src/components/chat/suggestion-scroll-row.tsx +81 -0
  188. package/src/components/chat/trace-grouping/chain-group-by.ts +44 -0
  189. package/src/components/chat/trace-grouping/chain-state.ts +141 -0
  190. package/src/components/chat/trace-grouping/index.ts +32 -0
  191. package/src/components/chat/trace-grouping/tool-row.ts +74 -0
  192. package/src/components/chat/trace-grouping/use-deploy-work-disclosure.ts +35 -0
  193. package/src/components/chat/trace-grouping/use-work-chain.ts +103 -0
  194. package/src/components/chat/trace-i18n/core.ts +48 -0
  195. package/src/components/chat/trace-i18n/index.tsx +23 -0
  196. package/src/components/chat/trace-i18n/locales/en.ts +24 -0
  197. package/src/components/chat/trace-i18n/locales/fr.ts +28 -0
  198. package/src/components/chat/trace-i18n/types.ts +35 -0
  199. package/src/components/chat/trace-spacing.ts +249 -0
  200. package/src/components/chat/transcript/activity-view.ts +375 -0
  201. package/src/components/chat/transcript/chat-export.ts +133 -0
  202. package/src/components/chat/transcript/index.ts +10 -0
  203. package/src/components/chat/transcript/save-file.ts +209 -0
  204. package/src/components/chat/transcript/transcript-markdown.ts +428 -0
  205. package/src/components/chat/transcript/types.ts +81 -0
  206. package/src/components/chat/turn-outcome.ts +52 -0
  207. package/src/components/chat/use-warmup-phase.ts +18 -0
  208. package/src/components/chat/work-status-lead.tsx +49 -0
  209. package/src/components/chrome.tsx +264 -0
  210. package/src/components/command-palette/CommandPalette.tsx +404 -0
  211. package/src/components/command-palette/index.ts +6 -0
  212. package/src/components/contact/ContactMailto.tsx +112 -0
  213. package/src/components/contact/index.ts +5 -0
  214. package/src/components/conviction/ConvictionMeter.tsx +40 -0
  215. package/src/components/conviction/SignedConvictionBadge.tsx +26 -0
  216. package/src/components/conviction/index.ts +7 -0
  217. package/src/components/data-layout/BentoGrid.tsx +52 -0
  218. package/src/components/data-layout/CardRail.tsx +150 -0
  219. package/src/components/data-layout/DotMatrixStat.tsx +65 -0
  220. package/src/components/data-layout/FeatureCell.tsx +80 -0
  221. package/src/components/data-layout/MediaFrame.tsx +125 -0
  222. package/src/components/data-layout/ModuleGrid.tsx +735 -0
  223. package/src/components/data-layout/Odometer.tsx +149 -0
  224. package/src/components/data-layout/ProductFrame.tsx +79 -0
  225. package/src/components/data-layout/TestimonialWall.tsx +139 -0
  226. package/src/components/data-layout/index.ts +19 -0
  227. package/src/components/data-layout/treemap.ts +368 -0
  228. package/src/components/deck/DeckStack.tsx +243 -0
  229. package/src/components/desk/DataTable.tsx +373 -0
  230. package/src/components/desk/KpiGrid.tsx +80 -0
  231. package/src/components/desk/Sparkline.tsx +63 -0
  232. package/src/components/desk/StateBlock.tsx +132 -0
  233. package/src/components/desk/index.ts +18 -0
  234. package/src/components/diagrams/ArchitectureDiagram.tsx +350 -0
  235. package/src/components/diagrams/ArchitectureTour.tsx +912 -0
  236. package/src/components/diagrams/TerminalSchematic.tsx +192 -0
  237. package/src/components/diagrams/architecture-svg.tsx +384 -0
  238. package/src/components/diagrams/index.ts +30 -0
  239. package/src/components/diagrams/mermaid-theme.ts +115 -0
  240. package/src/components/diagrams/tour-camera.ts +171 -0
  241. package/src/components/docs/CodeTabs.tsx +90 -0
  242. package/src/components/docs/CopyCommand.tsx +151 -0
  243. package/src/components/docs/DocsLayout.tsx +197 -0
  244. package/src/components/docs/DocsSearch.tsx +97 -0
  245. package/src/components/docs/Endpoint.tsx +135 -0
  246. package/src/components/document/DocumentFrame.tsx +43 -0
  247. package/src/components/document/GlyphList.tsx +51 -0
  248. package/src/components/document/PageTitle.tsx +44 -0
  249. package/src/components/document/Prose.tsx +38 -0
  250. package/src/components/document/Section.tsx +55 -0
  251. package/src/components/document/index.ts +13 -0
  252. package/src/components/effects-chrome/AnnouncementBar.tsx +88 -0
  253. package/src/components/effects-chrome/HorizontalScrollTrack.tsx +461 -0
  254. package/src/components/effects-chrome/Pipeline.tsx +226 -0
  255. package/src/components/effects-chrome/RotatingPrompts.tsx +116 -0
  256. package/src/components/effects-chrome/StackingPanels.tsx +101 -0
  257. package/src/components/effects-chrome/TabStrip.tsx +232 -0
  258. package/src/components/effects-chrome/ToastStack.tsx +201 -0
  259. package/src/components/effects-chrome/horizontal-track-core.ts +70 -0
  260. package/src/components/effects-chrome/index.ts +35 -0
  261. package/src/components/emblems.tsx +188 -0
  262. package/src/components/faviconTheme.ts +23 -0
  263. package/src/components/figure/Figure.tsx +38 -0
  264. package/src/components/figure/index.ts +2 -0
  265. package/src/components/finance-charts/DrawdownPlot.tsx +76 -0
  266. package/src/components/finance-charts/EquityCurve.tsx +71 -0
  267. package/src/components/finance-charts/PriceChart.tsx +119 -0
  268. package/src/components/finance-charts/chart-host.tsx +236 -0
  269. package/src/components/finance-charts/chart-scale.ts +93 -0
  270. package/src/components/finance-charts/demo-data.ts +88 -0
  271. package/src/components/finance-charts/index.ts +46 -0
  272. package/src/components/finance-charts/lw-chart.tsx +292 -0
  273. package/src/components/finance-composites/MarketBar.tsx +243 -0
  274. package/src/components/finance-composites/OrderBook.tsx +133 -0
  275. package/src/components/finance-composites/PerformanceDashboard.tsx +185 -0
  276. package/src/components/finance-composites/SortableTable.tsx +144 -0
  277. package/src/components/finance-composites/StockTicker.tsx +65 -0
  278. package/src/components/finance-composites/SyncedTearsheet.tsx +226 -0
  279. package/src/components/finance-composites/index.ts +28 -0
  280. package/src/components/finance-tearsheet/KpiStrip.tsx +49 -0
  281. package/src/components/finance-tearsheet/LiveBadge.tsx +29 -0
  282. package/src/components/finance-tearsheet/ReturnsMatrix.tsx +321 -0
  283. package/src/components/finance-tearsheet/StrategyTearsheet.tsx +99 -0
  284. package/src/components/finance-tearsheet/TearsheetCard.tsx +54 -0
  285. package/src/components/finance-tearsheet/TradeLogTable.tsx +73 -0
  286. package/src/components/finance-tearsheet/charts.tsx +2624 -0
  287. package/src/components/finance-tearsheet/demo-data.ts +177 -0
  288. package/src/components/finance-tearsheet/format.ts +41 -0
  289. package/src/components/finance-tearsheet/index.ts +120 -0
  290. package/src/components/finance-tearsheet/print.ts +52 -0
  291. package/src/components/finance-tearsheet/risk-bands.ts +48 -0
  292. package/src/components/finance-tearsheet/stats.ts +35 -0
  293. package/src/components/finance-tearsheet/strategy-sheet-model.ts +238 -0
  294. package/src/components/finance-tearsheet/types.ts +58 -0
  295. package/src/components/footer/FooterCells.tsx +109 -0
  296. package/src/components/footer/index.ts +6 -0
  297. package/src/components/graph.tsx +158 -0
  298. package/src/components/icons.tsx +98 -0
  299. package/src/components/landing/PixelWordmark.tsx +36 -0
  300. package/src/components/logos.ts +39 -0
  301. package/src/components/marquee/Marquee.tsx +204 -0
  302. package/src/components/metrics/PerfMetrics.tsx +68 -0
  303. package/src/components/metrics/StatCounter.tsx +104 -0
  304. package/src/components/page-geometry.tsx +177 -0
  305. package/src/components/pricing/Pricing.tsx +174 -0
  306. package/src/components/pricing/PricingMatrix.tsx +219 -0
  307. package/src/components/prose/index.ts +2 -0
  308. package/src/components/prose/prose.tsx +86 -0
  309. package/src/components/repo-activity/RepoActivity.tsx +599 -0
  310. package/src/components/repo-activity/RepoHeatmap.tsx +225 -0
  311. package/src/components/repo-activity/demo.ts +201 -0
  312. package/src/components/repo-activity/fetch.ts +211 -0
  313. package/src/components/repo-activity/heatmap.ts +123 -0
  314. package/src/components/repo-activity/index.ts +28 -0
  315. package/src/components/repo-activity/types.ts +99 -0
  316. package/src/components/stages/NumberedStages.tsx +116 -0
  317. package/src/components/symbols/marks.tsx +116 -0
  318. package/src/components/symbols/terminal-lockup.tsx +136 -0
  319. package/src/components/symbols/terminal-marks.tsx +226 -0
  320. package/src/components/terminal/ChatResponseLoader.tsx +67 -0
  321. package/src/components/terminal/ContainerBootLoader.tsx +82 -0
  322. package/src/components/terminal/TerminalStepCaret.tsx +202 -0
  323. package/src/components/themeInit.ts +24 -0
  324. package/src/components/typography/MotionReveal.tsx +108 -0
  325. package/src/components/typography/TypewriterReveal.tsx +101 -0
  326. package/src/components/typography/WordReveal.tsx +143 -0
  327. package/src/data/modules.ts +378 -0
  328. package/src/data/subsystems.ts +101 -0
  329. package/src/index.ts +587 -0
  330. package/src/lib/base-path.ts +60 -0
  331. package/src/lib/cx.ts +25 -0
  332. package/src/lib/gloomberb.ts +69 -0
  333. package/src/lib/record.ts +19 -0
  334. package/src/lib/stub-payload.ts +183 -0
  335. package/src/lib/useBodyScrollLock.ts +44 -0
  336. package/src/lib/utils.ts +6 -0
  337. package/src/motion/primitives.tsx +105 -0
  338. package/src/motion/scroll-glide.ts +62 -0
  339. package/src/motion/scrolly-core.ts +38 -0
  340. package/src/motion/scrolly.tsx +95 -0
  341. package/src/navigation/HashScrollManager.tsx +167 -0
  342. package/src/navigation/hashScroll.ts +78 -0
  343. package/src/replay/browser.ts +280 -0
  344. package/src/replay/chat-export-run.ts +121 -0
  345. package/src/replay/export-format.ts +25 -0
  346. package/src/replay/export-mount.ts +32 -0
  347. package/src/replay/filename.ts +54 -0
  348. package/src/replay/index.ts +21 -0
  349. package/src/replay/redact-dom.ts +178 -0
  350. package/src/replay/redact.ts +113 -0
  351. package/src/replay/snapshot.ts +659 -0
  352. package/src/styles/account-auth.css +339 -0
  353. package/src/styles/brand-wordmark.css +11 -0
  354. package/src/styles/card-rail.css +120 -0
  355. package/src/styles/chat-aui.css +1143 -0
  356. package/src/styles/chat-core.css +469 -0
  357. package/src/styles/chat-digichat.css +2531 -0
  358. package/src/styles/chat-math.css +70 -0
  359. package/src/styles/chat-skin-palette.css +138 -0
  360. package/src/styles/chat-stock-menu.css +37 -0
  361. package/src/styles/chat-widgets.css +190 -0
  362. package/src/styles/command-palette.css +372 -0
  363. package/src/styles/controls-core.css +2261 -0
  364. package/src/styles/controls-overlay.css +603 -0
  365. package/src/styles/data-layout.css +288 -0
  366. package/src/styles/deck.css +141 -0
  367. package/src/styles/diagrams.css +1860 -0
  368. package/src/styles/digichat-app-theme.css +250 -0
  369. package/src/styles/digichat-boot-loader.css +487 -0
  370. package/src/styles/digichat-launcher.css +377 -0
  371. package/src/styles/docs.css +165 -0
  372. package/src/styles/effects-chrome.css +888 -0
  373. package/src/styles/finance-composites.css +214 -0
  374. package/src/styles/finance-tearsheet-overlay.css +90 -0
  375. package/src/styles/finance-tearsheet.css +945 -0
  376. package/src/styles/marquee.css +168 -0
  377. package/src/styles/metrics.css +82 -0
  378. package/src/styles/nav-shell.css +551 -0
  379. package/src/styles/pricing.css +79 -0
  380. package/src/styles/repo-activity.css +575 -0
  381. package/src/styles/stages.css +69 -0
  382. package/src/styles/terminal-loaders.css +122 -0
  383. package/src/styles/terminal-manifest.css +228 -0
  384. package/src/styles/web-theme.css +1007 -0
  385. package/src/styles/word-reveal.css +204 -0
  386. package/src/theme/apply-theme.ts +214 -0
  387. package/src/theme/index.ts +27 -0
  388. package/src/theme/palette-registry.ts +855 -0
  389. package/src/theme/tui-prefs.ts +64 -0
  390. package/src/ui/alert.tsx +78 -0
  391. package/src/ui/avatar.tsx +104 -0
  392. package/src/ui/badge.tsx +75 -0
  393. package/src/ui/breadcrumb.tsx +61 -0
  394. package/src/ui/button.tsx +67 -0
  395. package/src/ui/card.tsx +139 -0
  396. package/src/ui/checkbox.tsx +27 -0
  397. package/src/ui/collapsible.tsx +32 -0
  398. package/src/ui/date-pager.tsx +325 -0
  399. package/src/ui/dialog.tsx +157 -0
  400. package/src/ui/dropdown-menu.tsx +267 -0
  401. package/src/ui/empty-state.tsx +165 -0
  402. package/src/ui/field.tsx +104 -0
  403. package/src/ui/form.tsx +36 -0
  404. package/src/ui/icon-button.tsx +36 -0
  405. package/src/ui/index.ts +34 -0
  406. package/src/ui/input.tsx +33 -0
  407. package/src/ui/kbd.tsx +30 -0
  408. package/src/ui/label.tsx +32 -0
  409. package/src/ui/pager.tsx +119 -0
  410. package/src/ui/pagination.tsx +126 -0
  411. package/src/ui/radio-group.tsx +51 -0
  412. package/src/ui/search-bar.tsx +85 -0
  413. package/src/ui/segmented-control.tsx +76 -0
  414. package/src/ui/select.tsx +257 -0
  415. package/src/ui/separator.tsx +24 -0
  416. package/src/ui/sheet.tsx +141 -0
  417. package/src/ui/skeleton.tsx +76 -0
  418. package/src/ui/slider.tsx +76 -0
  419. package/src/ui/switch.tsx +31 -0
  420. package/src/ui/table.tsx +179 -0
  421. package/src/ui/tabs.tsx +89 -0
  422. package/src/ui/tags-input.tsx +168 -0
  423. package/src/ui/textarea.tsx +17 -0
  424. package/src/ui/tooltip.tsx +71 -0
@@ -0,0 +1,551 @@
1
+ /* ==========================================================================
2
+ nav-shell.css — state machinery for <NavShell/> (components/NavShell.tsx).
3
+ Import once in an app's globals.css, after web-theme.css:
4
+ @import "@digithings-ai/ui/styles/nav-shell.css";
5
+
6
+ Static layout (row, lead, brand, links strip, tail cluster) is token-backed
7
+ Tailwind utilities in the component. Everything here is what utilities can't
8
+ express cleanly: the fixed bar's settle/yield transitions and its two-colour
9
+ color-mix backdrop band, the JS-toggled state classes (.is-scrolled,
10
+ .is-hidden, .is-menu-open), the hamburger's parent-state span transforms,
11
+ descendant dressing of slotted content (.theme-toggle, .btn-icon, sheet
12
+ links), the dropdown group (trigger, caret, panel) and its sheet counterpart
13
+ (a labelled section), the portal overlay pair (scrim + sheet), and the
14
+ breakpoint / reduced-motion guards.
15
+
16
+ Layering contract — one hidden-state idiom, used three times: an overlay
17
+ surface stays in the DOM and is parked with `visibility: hidden` +
18
+ `pointer-events: none` (plus opacity/transform for the travel), then
19
+ unparked by an `.is-open` class. The scrim, the sheet and the dropdown panel
20
+ all follow it, so every one of them can transition, and none of them can
21
+ trap a tab stop while closed.
22
+
23
+ The bar reads --nav-shell-h (fallback 62px) so apps can retune height in one
24
+ place — and reuse it for scroll-padding-top / anchor offsets.
25
+ ========================================================================== */
26
+
27
+ /* ── the bar: settle after 8px, yield past 180px (scroll-down only) ─────── */
28
+ .nav-shell {
29
+ /* component tokens — nav bar geometry (the bar height stays the
30
+ consumer's --nav-shell-h, fallback 62px) */
31
+ --nav-group-gap: 0.34rem;
32
+ --nav-caret: 0.3rem;
33
+ --nav-menu-min-w: 11rem;
34
+ --nav-menu-gap: 0.2rem;
35
+ --nav-menu-pad: 0.4rem;
36
+ --nav-menu-item-pad-block: 0.45rem;
37
+ --nav-menu-item-pad-inline: 0.7rem;
38
+ --nav-icon-pad: 0.5rem;
39
+ --nav-toggle-gap: 5px;
40
+ --nav-toggle-line-w: 18px;
41
+ --nav-toggle-line-h: 1.5px;
42
+ --nav-toggle-shift: 3.25px;
43
+
44
+ position: fixed;
45
+ top: 0;
46
+ inset-inline-start: 0;
47
+ inset-inline-end: 0;
48
+ height: var(--nav-shell-h, 62px);
49
+ z-index: 210;
50
+ display: flex;
51
+ align-items: center;
52
+ border-bottom: 1px solid transparent;
53
+ transition:
54
+ transform 0.4s var(--ease),
55
+ background 0.3s var(--ease),
56
+ border-color 0.3s var(--ease);
57
+ }
58
+ .nav-shell.is-scrolled {
59
+ background: color-mix(in srgb, var(--bg) 72%, transparent);
60
+ backdrop-filter: blur(14px);
61
+ -webkit-backdrop-filter: blur(14px);
62
+ border-bottom-color: var(--hair);
63
+ }
64
+ .nav-shell.is-hidden {
65
+ transform: translateY(calc(-1 * var(--nav-shell-h, 62px) - 1px));
66
+ }
67
+
68
+ /* ── clipped band: the backdrop + hairline live on a frame-width child ────
69
+ For a document drawn between the persistent LayoutLines, a full-bleed bar
70
+ would paint across the rules that define the page. The bar itself stays
71
+ fixed and full-width (nothing about the row's layout changes); only its
72
+ *dress* — the scrolled backdrop and the bottom hairline — moves onto a
73
+ pseudo-element inset to the same column as LayoutLines, so the band's edges
74
+ land exactly on the rules. The header's own background/border are cleared so
75
+ nothing shows outside the column.
76
+
77
+ z-index: -1 keeps the dress behind the row (the row is z-[56]) while the
78
+ header's 210 still sits above page content. */
79
+ .nav-shell.is-clipped {
80
+ border-bottom-color: transparent;
81
+ }
82
+ .nav-shell.is-clipped::before {
83
+ content: "";
84
+ position: absolute;
85
+ inset-block: 0;
86
+ /* Centred, capped to the rails — mirrors LayoutLines' geometry
87
+ (`max-w-[calc(var(--frame-w)+2*var(--line-pad))]`, where `--line-pad`
88
+ is the page gutter), so the band's edges land exactly on the rules and
89
+ the bar reads full-width between the vertical grid. */
90
+ inset-inline-start: 50%;
91
+ translate: -50% 0;
92
+ width: 100%;
93
+ /* One hairline short on each side, so the rails' own 1px columns stay
94
+ visible through the blurred band. */
95
+ max-width: calc(
96
+ var(--frame-w, var(--wrap, 1180px)) + 2 * var(--page-pad, var(--gutter, 1.5rem)) - 2px
97
+ );
98
+ z-index: -1;
99
+ pointer-events: none;
100
+ background: transparent;
101
+ border-bottom: 1px solid transparent;
102
+ transition:
103
+ background 0.3s var(--ease),
104
+ border-color 0.3s var(--ease);
105
+ }
106
+ .nav-shell.is-clipped.is-scrolled {
107
+ background: transparent;
108
+ backdrop-filter: none;
109
+ -webkit-backdrop-filter: none;
110
+ border-bottom-color: transparent;
111
+ }
112
+ .nav-shell.is-clipped.is-scrolled::before {
113
+ background: color-mix(in srgb, var(--bg) 72%, transparent);
114
+ backdrop-filter: blur(14px);
115
+ -webkit-backdrop-filter: blur(14px);
116
+ border-bottom-color: var(--hair);
117
+ }
118
+ /* An open dropdown pins the bar: yielding would take the panel with it. */
119
+ .nav-shell[data-group-open="true"].is-hidden {
120
+ transform: none;
121
+ }
122
+ /* A translated-offscreen bar is still in tab order (unlike visibility:hidden
123
+ or display:none) — Tab reaches its links same as always, this just makes
124
+ sure they scroll into view once focused, for both hide grammars. Same
125
+ backdrop as .is-scrolled: a keyboard-revealed bar overlays content exactly
126
+ like a hover-revealed one, and JS never got a mousemove to add that class. */
127
+ .nav-shell.is-hidden:focus-within {
128
+ transform: none;
129
+ background: color-mix(in srgb, var(--bg) 72%, transparent);
130
+ backdrop-filter: blur(14px);
131
+ -webkit-backdrop-filter: blur(14px);
132
+ border-bottom-color: var(--hair);
133
+ }
134
+
135
+ /* ── inline links: hover ink on descendants ─────────────────────────────── */
136
+ .nav-shell-links a {
137
+ transition: color 0.2s var(--ease);
138
+ }
139
+ .nav-shell-links a:hover {
140
+ color: var(--ink);
141
+ }
142
+ /* The current route (NavShell marks it from currentPath via hrefIsCurrent):
143
+ ink weight plus an accent hairline, so "you are here" reads distinctly from
144
+ hover. An inset shadow, not a border — a border would grow the anchor's box
145
+ and nudge the row. */
146
+ .nav-shell-links a[aria-current="page"] {
147
+ color: var(--ink);
148
+ box-shadow: inset 0 -1px 0 var(--accent);
149
+ }
150
+ .nav-shell-menu-item[aria-current="page"],
151
+ .nav-shell-sheet-links a[aria-current="page"] {
152
+ color: var(--ink);
153
+ }
154
+
155
+ /* ── dropdown group (wide bar only; the sheet gets sections instead) ──────
156
+ The panel is positioned against its group box, so the anchor chain is
157
+ stretched to the bar's full height — row → strip → group — and `top: 100%`
158
+ then lands exactly on the bar's bottom hairline instead of floating
159
+ mid-bar. Each stretched box re-centres its own content, so nothing moves.
160
+ ─────────────────────────────────────────────────────────────────────── */
161
+ .nav-shell-row {
162
+ align-self: stretch;
163
+ }
164
+ .nav-shell-links {
165
+ align-self: stretch;
166
+ align-items: center;
167
+ }
168
+ .nav-shell-group {
169
+ position: relative;
170
+ align-self: stretch;
171
+ display: inline-flex;
172
+ align-items: center;
173
+ }
174
+ .nav-shell-group-trigger {
175
+ display: inline-flex;
176
+ align-items: center;
177
+ gap: var(--nav-group-gap);
178
+ margin: 0;
179
+ padding: 0;
180
+ border: 0;
181
+ background: transparent;
182
+ font: inherit;
183
+ color: inherit;
184
+ cursor: pointer;
185
+ transition: color 0.2s var(--ease);
186
+ }
187
+ .nav-shell-group-trigger:hover,
188
+ .nav-shell-group[data-open="true"] .nav-shell-group-trigger {
189
+ color: var(--ink);
190
+ }
191
+ /* borders, not a glyph: the caret follows ink through [data-theme] and needs
192
+ no font metrics to sit straight. Physical borders on purpose — the caret is
193
+ a vertical (down/up) affordance built from a rotated corner, so mirroring it
194
+ under dir=rtl would tilt it the wrong way. */
195
+ .nav-shell-group-caret {
196
+ width: var(--nav-caret);
197
+ height: var(--nav-caret);
198
+ border-right: 1.2px solid currentColor;
199
+ border-bottom: 1.2px solid currentColor;
200
+ transform: translateY(calc(-1 * var(--nav-caret) / 3)) rotate(45deg);
201
+ transition: transform 0.2s var(--ease);
202
+ }
203
+ .nav-shell-group[data-open="true"] .nav-shell-group-caret {
204
+ transform: translateY(0.02rem) rotate(-135deg);
205
+ }
206
+
207
+ /* the panel: same parked-then-unparked contract as the sheet below. Hairline +
208
+ blurred band, no drop shadow — quiet by default. */
209
+ .nav-shell-menu {
210
+ position: absolute;
211
+ top: 100%;
212
+ /* physical on purpose: centering pairs left:50% with a physical
213
+ translateX(-50%), so it must not mirror (it is direction-neutral). */
214
+ left: 50%;
215
+ z-index: 1; /* the tail cluster follows the strip in the DOM */
216
+ display: flex;
217
+ flex-direction: column;
218
+ min-width: max(var(--nav-menu-min-w), 100%);
219
+ margin-top: var(--nav-menu-gap);
220
+ padding: var(--nav-menu-pad);
221
+ border: 1px solid var(--hair);
222
+ border-radius: 0;
223
+ background: color-mix(in srgb, var(--bg) 92%, transparent);
224
+ backdrop-filter: blur(14px);
225
+ -webkit-backdrop-filter: blur(14px);
226
+ opacity: 0;
227
+ visibility: hidden;
228
+ pointer-events: none;
229
+ transform: translateX(-50%) translateY(calc(-1 * var(--nav-caret)));
230
+ /* visibility is stepped, not interpolated: on close it waits out the fade
231
+ (0s delayed by 0.2s); on open it flips at once, with no transition at all.
232
+ A transitioned `visibility` would still compute as `hidden` at t=0, and the
233
+ first thing an opening menu does is focus an item — focus() on a hidden
234
+ element is a silent no-op, so the keyboard would appear dead. */
235
+ transition:
236
+ opacity 0.2s var(--ease),
237
+ transform 0.2s var(--ease),
238
+ visibility 0s linear 0.2s;
239
+ }
240
+ .nav-shell-menu.is-open {
241
+ opacity: 1;
242
+ visibility: visible;
243
+ pointer-events: auto;
244
+ transform: translateX(-50%);
245
+ transition:
246
+ opacity 0.2s var(--ease),
247
+ transform 0.2s var(--ease);
248
+ }
249
+ .nav-shell-menu-item {
250
+ display: block;
251
+ padding: var(--nav-menu-item-pad-block) var(--nav-menu-item-pad-inline);
252
+ border-radius: 0;
253
+ color: var(--ink-soft);
254
+ white-space: nowrap;
255
+ transition:
256
+ color 0.2s var(--ease),
257
+ background 0.2s var(--ease);
258
+ }
259
+ .nav-shell-menu-item:hover,
260
+ .nav-shell-menu-item:focus-visible {
261
+ color: var(--ink);
262
+ background: color-mix(in srgb, var(--ink) 7%, transparent);
263
+ }
264
+
265
+ /* ── tail cluster: theme toggle, slotted actions, hamburger — borderless,
266
+ no fill, glyph/lines only (descendant overrides of slotted content) ── */
267
+ .nav-shell-tail .theme-toggle,
268
+ .nav-shell-tail .btn-icon,
269
+ .nav-shell-toggle {
270
+ display: inline-flex;
271
+ align-items: center;
272
+ justify-content: center;
273
+ padding: var(--nav-icon-pad, 0.5rem);
274
+ background: transparent;
275
+ border: none;
276
+ box-shadow: none;
277
+ color: var(--ink-mute);
278
+ cursor: pointer;
279
+ transition: color 0.2s var(--ease);
280
+ }
281
+ .nav-shell-tail .theme-toggle:hover,
282
+ .nav-shell-tail .btn-icon:hover,
283
+ .nav-shell-toggle:hover {
284
+ color: var(--ink);
285
+ background: transparent;
286
+ }
287
+ .nav-shell-tail .btn-icon svg {
288
+ display: block;
289
+ }
290
+
291
+ /* Quiet company-profile row — the same borderless glyph buttons as the nav
292
+ tail, usable in a contact band or footer. Phosphor (`--accent`) only on
293
+ :focus-visible; hover stays ink. Radius 0, no fill. */
294
+ .social-row {
295
+ --nav-social-gap: 0.1rem;
296
+
297
+ display: inline-flex;
298
+ align-items: center;
299
+ gap: var(--nav-social-gap);
300
+ }
301
+
302
+ .btn-icon {
303
+ --nav-icon-pad: 0.5rem;
304
+
305
+ display: inline-flex;
306
+ align-items: center;
307
+ justify-content: center;
308
+ padding: var(--nav-icon-pad);
309
+ background: transparent;
310
+ border: none;
311
+ border-radius: 0;
312
+ color: var(--ink-mute);
313
+ cursor: pointer;
314
+ text-decoration: none;
315
+ transition: color 0.2s var(--ease);
316
+ }
317
+
318
+ .btn-icon:hover {
319
+ color: var(--ink);
320
+ background: transparent;
321
+ }
322
+
323
+ .btn-icon:focus-visible {
324
+ color: var(--accent);
325
+ outline: 1px solid var(--accent);
326
+ outline-offset: 2px;
327
+ }
328
+
329
+ .btn-icon svg {
330
+ display: block;
331
+ }
332
+
333
+ /* ── hamburger: two lines folding to an × from the parent state ─────────── */
334
+ .nav-shell-toggle {
335
+ display: none; /* wide viewports; media query below re-enables */
336
+ --nav-toggle-offset-sm: 0.65rem;
337
+ flex-direction: column;
338
+ gap: var(--nav-toggle-gap, 5px);
339
+ flex-shrink: 0;
340
+ margin: 0;
341
+ }
342
+ .nav-shell-toggle span {
343
+ display: block;
344
+ width: var(--nav-toggle-line-w, 18px);
345
+ height: var(--nav-toggle-line-h, 1.5px);
346
+ background: currentColor;
347
+ border-radius: 0;
348
+ transition:
349
+ transform 0.25s var(--ease),
350
+ opacity 0.2s var(--ease);
351
+ }
352
+ .nav-shell.is-menu-open .nav-shell-toggle span:first-child {
353
+ transform: translateY(var(--nav-toggle-shift, 3.25px)) rotate(45deg);
354
+ }
355
+ .nav-shell.is-menu-open .nav-shell-toggle span:last-child {
356
+ transform: translateY(calc(-1 * var(--nav-toggle-shift, 3.25px))) rotate(-45deg);
357
+ }
358
+
359
+ /* ── menu-open bar dress: solid enough to read over the scrim ───────────── */
360
+ .nav-shell.is-menu-open {
361
+ border-bottom-color: var(--hair);
362
+ background: color-mix(in srgb, var(--bg) 92%, transparent);
363
+ backdrop-filter: blur(14px);
364
+ -webkit-backdrop-filter: blur(14px);
365
+ }
366
+ .nav-shell.is-menu-open.is-hidden {
367
+ transform: none;
368
+ }
369
+
370
+ /* ── portal overlay: full-viewport scrim — dims + aggressively blurs the
371
+ page behind the menu ──────────────────────────────────────────────── */
372
+ .nav-shell-backdrop {
373
+ position: fixed;
374
+ inset: 0;
375
+ z-index: 200;
376
+ margin: 0;
377
+ padding: 0;
378
+ border: 0;
379
+ cursor: pointer;
380
+ background: color-mix(in srgb, var(--bg) 90%, transparent);
381
+ backdrop-filter: blur(40px) saturate(1.3);
382
+ -webkit-backdrop-filter: blur(40px) saturate(1.3);
383
+ opacity: 0;
384
+ visibility: hidden;
385
+ pointer-events: none;
386
+ transition:
387
+ opacity 0.28s var(--ease),
388
+ visibility 0.28s;
389
+ }
390
+ .nav-shell-backdrop.is-open {
391
+ opacity: 1;
392
+ visibility: visible;
393
+ pointer-events: auto;
394
+ }
395
+
396
+ /* ── portal overlay: the sheet — right-aligned serif link stack + CTA ───── */
397
+ .nav-shell-sheet {
398
+ /* component tokens — the portalled sheet is not a .nav-shell descendant,
399
+ so it carries its own */
400
+ --nav-sheet-pad-top-gap: 1.5rem;
401
+ --nav-sheet-pad-inline: clamp(1.25rem, 5vw, 2rem);
402
+ --nav-sheet-pad-bottom: 1.25rem;
403
+ --nav-sheet-links-w: 20rem;
404
+ --nav-sheet-link-font: 1.35rem;
405
+ --nav-sheet-link-pad: 0.85rem;
406
+
407
+ position: fixed;
408
+ inset: 0;
409
+ z-index: 201;
410
+ display: flex;
411
+ flex-direction: column;
412
+ align-items: flex-end;
413
+ text-align: end;
414
+ padding: calc(var(--nav-shell-h, 62px) + var(--nav-sheet-pad-top-gap))
415
+ var(--nav-sheet-pad-inline) max(var(--nav-sheet-pad-bottom), env(safe-area-inset-bottom));
416
+ background: transparent;
417
+ visibility: hidden;
418
+ pointer-events: none;
419
+ transform: translateY(-6px);
420
+ transition:
421
+ visibility 0.28s,
422
+ transform 0.28s var(--ease);
423
+ }
424
+ .nav-shell-sheet.is-open {
425
+ visibility: visible;
426
+ transform: none;
427
+ }
428
+ .nav-shell-sheet-links {
429
+ display: flex;
430
+ flex-direction: column;
431
+ align-items: flex-end;
432
+ gap: 0.35rem;
433
+ flex: 1;
434
+ min-height: 0;
435
+ overflow-y: auto;
436
+ overscroll-behavior: contain;
437
+ width: min(100%, var(--nav-sheet-links-w, 20rem));
438
+ margin-inline-start: auto;
439
+ font-size: var(--nav-sheet-link-font, 1.35rem);
440
+ font-family: var(--font-mono);
441
+ color: var(--ink);
442
+ pointer-events: auto;
443
+ }
444
+ .nav-shell-sheet-links a {
445
+ display: block;
446
+ width: 100%;
447
+ padding: var(--nav-sheet-link-pad, 0.85rem) 0;
448
+ border-bottom: 1px solid var(--hair);
449
+ color: var(--ink-soft);
450
+ text-align: end;
451
+ text-shadow: 0 1px 12px color-mix(in srgb, var(--bg) 70%, transparent);
452
+ transition: color 0.2s var(--ease);
453
+ }
454
+ .nav-shell-sheet-links a:hover {
455
+ color: var(--ink);
456
+ }
457
+ /* a NavGroup in the sheet: a kicker-cased label over its own links. No
458
+ disclosure — the sheet is already the vertical index a dropdown would open. */
459
+ .nav-shell-sheet-group {
460
+ display: flex;
461
+ flex-direction: column;
462
+ align-items: flex-end;
463
+ width: 100%;
464
+ }
465
+ .nav-shell-sheet-group-label {
466
+ --nav-sheet-group-label-font: 0.6rem;
467
+
468
+ margin: 0.9rem 0 0.1rem;
469
+ font-family: var(--font-mono, ui-monospace, monospace);
470
+ font-size: var(--nav-sheet-group-label-font);
471
+ text-transform: uppercase;
472
+ letter-spacing: 0.14em;
473
+ color: var(--ink-mute);
474
+ }
475
+ .nav-shell-sheet-cta {
476
+ --nav-sheet-cta-top: 1.5rem;
477
+ --nav-sheet-cta-bottom: 1rem;
478
+
479
+ display: flex;
480
+ justify-content: flex-end;
481
+ width: min(100%, var(--nav-sheet-links-w, 20rem));
482
+ margin-inline-start: auto;
483
+ padding-top: var(--nav-sheet-cta-top);
484
+ padding-bottom: max(var(--nav-sheet-cta-bottom), env(safe-area-inset-bottom));
485
+ pointer-events: auto;
486
+ }
487
+ /* No descendant dress here any more: the CTA arrives as a kit-buttonVariants
488
+ link (digithings) or a kit <Button/> (digiquant), both already `inline-flex
489
+ shrink-0 justify-center` — the old `.nav-shell-sheet-cta .btn { width:auto;
490
+ justify-content:center }` shim was only for the retired `.btn` pill. */
491
+
492
+ /* ── breakpoints (identical to the app navs this supersedes) ────────────── */
493
+ @media (min-width: 881px) {
494
+ .nav-shell-backdrop,
495
+ .nav-shell-sheet {
496
+ display: none;
497
+ }
498
+ }
499
+ @media (max-width: 880px) {
500
+ .nav-shell-toggle {
501
+ display: inline-flex;
502
+ margin-inline-start: var(--space-2);
503
+ }
504
+ }
505
+ @media (max-width: 560px) {
506
+ .nav-shell-toggle {
507
+ margin-inline-start: var(--nav-toggle-offset-sm, 0.65rem);
508
+ }
509
+ }
510
+ /* Never hide the bar on small screens: thumb-scroll jitters direction, and
511
+ the bar is the only route back to the menu. `autoHide="hover"` reveals the
512
+ bar via a `mousemove` listener alone (see NavShell.tsx) -- touch input never
513
+ fires that event, so a touch-only device with no mouse gets the bar hidden
514
+ on mount with no way to bring it back. max-width alone only catches phones;
515
+ a touch-primary tablet in landscape (iPad ~1024px, most Android tablets)
516
+ is wider than 768px, has no mouse, and hits neither this rule nor a
517
+ mousemove event -- `(hover: none)` is the correct, width-independent way to
518
+ ask "can this pointer even hover", so it catches those devices too. */
519
+ @media (max-width: 768px), (hover: none) {
520
+ /* Only the hover grammar needs this neutralisation: it hides the bar on
521
+ mount and a touch device has no mouse to reveal it. The scroll grammar
522
+ hides/reveals on scroll, so it must keep its transform on touch too. */
523
+ .nav-shell[data-autohide="hover"].is-hidden {
524
+ transform: none;
525
+ }
526
+ }
527
+
528
+ /* ── reduced motion: same states, instant — the bar still settles, yields
529
+ and returns; dropdowns still open, close and dress their caret; nothing
530
+ slides or fades ──────────────────────────────────────────────────── */
531
+ @media (prefers-reduced-motion: reduce) {
532
+ .nav-shell,
533
+ .nav-shell-toggle span,
534
+ .nav-shell-links a,
535
+ .nav-shell-group-trigger,
536
+ .nav-shell-group-caret,
537
+ .nav-shell-menu,
538
+ /* the open state re-declares transition (see the panel rule), so it needs
539
+ naming here too — a bare .nav-shell-menu would lose the specificity duel */
540
+ .nav-shell-menu.is-open,
541
+ .nav-shell-menu-item,
542
+ .nav-shell-sheet-links a,
543
+ .nav-shell-backdrop,
544
+ .nav-shell-sheet {
545
+ transition: none;
546
+ }
547
+ /* no travel either: the panel simply is, or is not, there */
548
+ .nav-shell-menu {
549
+ transform: translateX(-50%);
550
+ }
551
+ }
@@ -0,0 +1,79 @@
1
+ /* ==========================================================================
2
+ pricing.css — CSS leave-rules for the pricing family
3
+ (components/pricing/Pricing.tsx + components/pricing/PricingMatrix.tsx).
4
+ Import once in an app's globals.css, after web-theme.css:
5
+ @import "@digithings-ai/ui/styles/pricing.css";
6
+
7
+ Static structure is token-backed Tailwind utilities in the components.
8
+ Only what utilities can't express lives here: the accent tier's two-color
9
+ color-mix wash, the ✓ check-marker ::before on feature rows, and the
10
+ billing toggle (ancestor `.on` state pairing + two-color mix + knob
11
+ translate).
12
+ ========================================================================== */
13
+
14
+ /* ── accent (featured) tier card: two-color mixes on border + wash ──────── */
15
+ .pricing-tier-accent {
16
+ border-color: color-mix(in srgb, var(--accent) 50%, var(--hair));
17
+ background: color-mix(in srgb, var(--accent) 6%, var(--surface));
18
+ }
19
+
20
+ /* ── popular matrix column: the reference treatment is the kit-native tint +
21
+ accent top rule (`pm-popular rounded-none border-t-2 border-t-accent
22
+ bg-accent/6` in PricingMatrix) — no gradient; the design reference
23
+ highlights featured tiers with tint, not a wash gradient. */
24
+
25
+ /* ── ✓ check-marker grammar on feature rows (li.pricing-feature) ────────── */
26
+ /* --accent, not --up: this marks "feature included," a generic positive/
27
+ selection signal, not a P&L read — --up/--down stay reserved for money. */
28
+ .pricing-feature::before {
29
+ content: "✓";
30
+ flex: 0 0 auto;
31
+ color: var(--accent);
32
+ font-weight: 600;
33
+ line-height: 1.4;
34
+ }
35
+
36
+ /* ── billing toggle: .pm-toggle.on drives the knob (state + translate) ──── */
37
+ .pm-toggle {
38
+ /* component tokens — billing toggle geometry */
39
+ --pm-toggle-w: 38px;
40
+ --pm-toggle-h: 21px;
41
+ --pm-knob: 15px;
42
+ --pm-knob-inset: 2px;
43
+ --pm-knob-travel: 17px;
44
+
45
+ width: var(--pm-toggle-w);
46
+ height: var(--pm-toggle-h);
47
+ border-radius: 0;
48
+ border: 1px solid var(--hair);
49
+ background: var(--surface);
50
+ position: relative;
51
+ cursor: pointer;
52
+ transition: background-color 0.2s var(--ease), border-color 0.2s var(--ease);
53
+ }
54
+
55
+ .pm-toggle .pm-knob {
56
+ position: absolute;
57
+ top: var(--pm-knob-inset, 2px);
58
+ inset-inline-start: var(--pm-knob-inset, 2px);
59
+ width: var(--pm-knob, 15px);
60
+ height: var(--pm-knob, 15px);
61
+ border-radius: 0;
62
+ background: var(--ink-mute);
63
+ transition: transform 0.2s var(--ease), background-color 0.2s var(--ease);
64
+ }
65
+
66
+ .pm-toggle.on {
67
+ border-color: color-mix(in srgb, var(--accent) 55%, var(--hair));
68
+ background: var(--accent-weak);
69
+ }
70
+
71
+ .pm-toggle.on .pm-knob {
72
+ transform: translateX(var(--pm-knob-travel, 17px));
73
+ background: var(--accent);
74
+ }
75
+
76
+ /* knob anchors at inline-start; checked travel is physical → mirror in RTL */
77
+ [dir="rtl"] .pm-toggle.on .pm-knob {
78
+ transform: translateX(calc(-1 * var(--pm-knob-travel, 17px)));
79
+ }