basalt-ui 1.26.0 → 1.28.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 (1069) hide show
  1. package/AGENTS.md +23 -23
  2. package/CHANGELOG.md +67 -0
  3. package/MIGRATING.md +896 -37
  4. package/README.md +33 -3
  5. package/agent/rules/basalt-batteries.md +25 -10
  6. package/agent/rules/basalt-controls.md +73 -43
  7. package/agent/rules/basalt-mantine.md +17 -6
  8. package/agent/rules/basalt-state.md +5 -0
  9. package/agent/rules/basalt-tokens.md +1 -1
  10. package/configs/oxlint-plugin.js +1286 -73
  11. package/configs/oxlint-plugin.test.ts +1338 -29
  12. package/configs/oxlint.json +12 -5
  13. package/dist/agent/coalesce.d.ts.map +1 -1
  14. package/dist/agent/coalesce.js +2 -1
  15. package/dist/agent/merge.d.ts.map +1 -1
  16. package/dist/agent/merge.js +2 -1
  17. package/dist/agent/part-list.d.ts.map +1 -1
  18. package/dist/agent/part-list.js +2 -0
  19. package/dist/agent/stick-to-bottom.d.ts +3 -6
  20. package/dist/agent/stick-to-bottom.d.ts.map +1 -1
  21. package/dist/agent/stick-to-bottom.js +6 -3
  22. package/dist/agent-chat/composer.d.ts +6 -2
  23. package/dist/agent-chat/composer.d.ts.map +1 -1
  24. package/dist/agent-chat/composer.js +49 -33
  25. package/dist/agent-chat/relative-time.d.ts +0 -9
  26. package/dist/agent-chat/relative-time.d.ts.map +1 -1
  27. package/dist/agent-chat/relative-time.js +2 -1
  28. package/dist/agent-chat/thread-detail-panel.d.ts +3 -2
  29. package/dist/agent-chat/thread-detail-panel.d.ts.map +1 -1
  30. package/dist/agent-chat/thread-detail-panel.js +8 -5
  31. package/dist/agent-chat/thread-feed-row.d.ts +2 -1
  32. package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
  33. package/dist/agent-chat/thread-feed-row.js +92 -92
  34. package/dist/agent-chat/thread-feed.d.ts +3 -2
  35. package/dist/agent-chat/thread-feed.d.ts.map +1 -1
  36. package/dist/agent-chat/thread-feed.js +8 -3
  37. package/dist/agent-chat/thread-message.d.ts +4 -3
  38. package/dist/agent-chat/thread-message.d.ts.map +1 -1
  39. package/dist/agent-chat/thread-message.js +70 -31
  40. package/dist/agent-chat/thread-outcome-card.d.ts +3 -2
  41. package/dist/agent-chat/thread-outcome-card.d.ts.map +1 -1
  42. package/dist/agent-chat/thread-outcome-card.js +9 -2
  43. package/dist/agent-chat/thread-workspace.d.ts +7 -2
  44. package/dist/agent-chat/thread-workspace.d.ts.map +1 -1
  45. package/dist/agent-chat/thread-workspace.js +62 -29
  46. package/dist/agent-chat/tool-chip.d.ts +3 -2
  47. package/dist/agent-chat/tool-chip.d.ts.map +1 -1
  48. package/dist/agent-chat/tool-chip.js +7 -2
  49. package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
  50. package/dist/charts/hooks/useBandPlot.js +15 -8
  51. package/dist/charts/index.d.ts +8 -7
  52. package/dist/charts/index.d.ts.map +1 -1
  53. package/dist/charts/index.js +45 -5
  54. package/dist/charts/kinds/BandStrip.d.ts +10 -7
  55. package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
  56. package/dist/charts/kinds/BandStrip.js +12 -7
  57. package/dist/charts/kinds/Bars.d.ts +12 -6
  58. package/dist/charts/kinds/Bars.d.ts.map +1 -1
  59. package/dist/charts/kinds/Bars.js +37 -11
  60. package/dist/charts/kinds/Donut.d.ts +6 -5
  61. package/dist/charts/kinds/Donut.d.ts.map +1 -1
  62. package/dist/charts/kinds/Donut.js +19 -2
  63. package/dist/charts/kinds/DualPanel.d.ts +6 -5
  64. package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
  65. package/dist/charts/kinds/DualPanel.js +36 -8
  66. package/dist/charts/kinds/Heatmap.d.ts +10 -6
  67. package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
  68. package/dist/charts/kinds/Heatmap.js +58 -31
  69. package/dist/charts/kinds/MirroredBars.d.ts +6 -5
  70. package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
  71. package/dist/charts/kinds/MirroredBars.js +9 -2
  72. package/dist/charts/kinds/MultiLine.d.ts +11 -6
  73. package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
  74. package/dist/charts/kinds/MultiLine.js +24 -15
  75. package/dist/charts/kinds/StackedArea.d.ts +18 -8
  76. package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
  77. package/dist/charts/kinds/StackedArea.js +29 -4
  78. package/dist/charts/kinds/ZonedLine.d.ts +12 -8
  79. package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
  80. package/dist/charts/kinds/ZonedLine.js +33 -23
  81. package/dist/charts/layout/auto-margin.d.ts +65 -8
  82. package/dist/charts/layout/auto-margin.d.ts.map +1 -1
  83. package/dist/charts/layout/auto-margin.js +45 -10
  84. package/dist/charts/layout/log-ticks.d.ts +27 -0
  85. package/dist/charts/layout/log-ticks.d.ts.map +1 -0
  86. package/dist/charts/layout/log-ticks.js +42 -0
  87. package/dist/charts/primitives/Axes.d.ts +11 -2
  88. package/dist/charts/primitives/Axes.d.ts.map +1 -1
  89. package/dist/charts/primitives/Axes.js +15 -5
  90. package/dist/charts/primitives/CartesianChart.d.ts +45 -7
  91. package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
  92. package/dist/charts/primitives/CartesianChart.js +86 -28
  93. package/dist/charts/primitives/ChartCard.d.ts +27 -2
  94. package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
  95. package/dist/charts/primitives/ChartCard.js +37 -17
  96. package/dist/charts/primitives/ChartFrame.d.ts +30 -4
  97. package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
  98. package/dist/charts/primitives/ChartFrame.js +45 -15
  99. package/dist/charts/primitives/ChartLegend.d.ts +13 -2
  100. package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
  101. package/dist/charts/primitives/ChartLegend.js +33 -13
  102. package/dist/charts/primitives/ChartPending.d.ts +77 -4
  103. package/dist/charts/primitives/ChartPending.d.ts.map +1 -1
  104. package/dist/charts/primitives/ChartPending.js +100 -6
  105. package/dist/charts/primitives/ChartTooltip.d.ts +7 -0
  106. package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
  107. package/dist/charts/primitives/ChartTooltip.js +18 -5
  108. package/dist/charts/primitives/Crosshair.d.ts +3 -0
  109. package/dist/charts/primitives/Crosshair.d.ts.map +1 -1
  110. package/dist/charts/primitives/Crosshair.js +3 -1
  111. package/dist/charts/primitives/chart-frame-layout.d.ts +95 -0
  112. package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -0
  113. package/dist/charts/primitives/chart-frame-layout.js +89 -0
  114. package/dist/charts/primitives/chart-tier.d.ts +16 -0
  115. package/dist/charts/primitives/chart-tier.d.ts.map +1 -0
  116. package/dist/charts/primitives/chart-tier.js +20 -0
  117. package/dist/charts/series.d.ts +55 -1
  118. package/dist/charts/series.d.ts.map +1 -1
  119. package/dist/charts/series.js +27 -1
  120. package/dist/charts/sparklines/BarSparkline.d.ts +3 -3
  121. package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
  122. package/dist/charts/sparklines/BarSparkline.js +9 -3
  123. package/dist/charts/sparklines/LineSparkline.d.ts +3 -3
  124. package/dist/charts/sparklines/LineSparkline.d.ts.map +1 -1
  125. package/dist/charts/sparklines/LineSparkline.js +15 -3
  126. package/dist/charts/sparklines/index.d.ts +2 -2
  127. package/dist/charts/sparklines/index.d.ts.map +1 -1
  128. package/dist/charts/utils/format.d.ts +92 -2
  129. package/dist/charts/utils/format.d.ts.map +1 -1
  130. package/dist/charts/utils/format.js +64 -1
  131. package/dist/charts/utils/ticks.d.ts +81 -2
  132. package/dist/charts/utils/ticks.d.ts.map +1 -1
  133. package/dist/charts/utils/ticks.js +54 -4
  134. package/dist/cli/index.d.ts.map +1 -1
  135. package/dist/cli/index.js +2 -2
  136. package/dist/commands/ShortcutsHelp.d.ts +3 -2
  137. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  138. package/dist/commands/ShortcutsHelp.js +8 -2
  139. package/dist/commands/define-commands.d.ts.map +1 -1
  140. package/dist/commands/define-commands.js +2 -2
  141. package/dist/commands/define-overlays.d.ts +102 -0
  142. package/dist/commands/define-overlays.d.ts.map +1 -1
  143. package/dist/commands/define-overlays.js +102 -2
  144. package/dist/commands/index.d.ts +10 -1
  145. package/dist/commands/index.d.ts.map +1 -1
  146. package/dist/commands/index.js +3 -1
  147. package/dist/commands/overlays-mount.d.ts +13 -6
  148. package/dist/commands/overlays-mount.d.ts.map +1 -1
  149. package/dist/commands/overlays-mount.js +23 -14
  150. package/dist/common/errors.d.ts +34 -0
  151. package/dist/common/errors.d.ts.map +1 -0
  152. package/dist/common/errors.js +36 -0
  153. package/dist/common/index.d.ts +15 -0
  154. package/dist/common/index.d.ts.map +1 -0
  155. package/dist/common/index.js +29 -0
  156. package/dist/common/props.d.ts +63 -0
  157. package/dist/common/props.d.ts.map +1 -0
  158. package/dist/common/props.js +6 -0
  159. package/dist/common/query-state-like.d.ts +43 -0
  160. package/dist/common/query-state-like.d.ts.map +1 -0
  161. package/dist/common/query-state-like.js +20 -0
  162. package/dist/common/refs.d.ts +29 -0
  163. package/dist/common/refs.d.ts.map +1 -0
  164. package/dist/common/refs.js +29 -0
  165. package/dist/common/scroll-parent.d.ts +23 -0
  166. package/dist/common/scroll-parent.d.ts.map +1 -0
  167. package/dist/common/scroll-parent.js +21 -0
  168. package/dist/common/validate.d.ts +38 -0
  169. package/dist/common/validate.d.ts.map +1 -0
  170. package/dist/common/validate.js +36 -0
  171. package/dist/connectivity/connectivity-indicator.d.ts +3 -1
  172. package/dist/connectivity/connectivity-indicator.d.ts.map +1 -1
  173. package/dist/connectivity/connectivity-indicator.js +3 -1
  174. package/dist/connectivity/connectivity-provider.d.ts.map +1 -1
  175. package/dist/connectivity/connectivity-provider.js +4 -1
  176. package/dist/connectivity/index.d.ts +1 -0
  177. package/dist/connectivity/index.d.ts.map +1 -1
  178. package/dist/connectivity/types.d.ts +2 -2
  179. package/dist/connectivity/types.d.ts.map +1 -1
  180. package/dist/connectivity/use-connectivity.d.ts.map +1 -1
  181. package/dist/content/article-layout.module.css +11 -4
  182. package/dist/content/callout.d.ts +8 -4
  183. package/dist/content/callout.d.ts.map +1 -1
  184. package/dist/content/callout.js +15 -8
  185. package/dist/content/guide.d.ts +5 -4
  186. package/dist/content/guide.d.ts.map +1 -1
  187. package/dist/content/guide.js +13 -4
  188. package/dist/content/heading-anchor.d.ts +24 -2
  189. package/dist/content/heading-anchor.d.ts.map +1 -1
  190. package/dist/content/heading-anchor.js +23 -9
  191. package/dist/content/index.d.ts.map +1 -1
  192. package/dist/content/markdown.d.ts.map +1 -1
  193. package/dist/content/markdown.js +2 -0
  194. package/dist/content/prose.module.css +9 -7
  195. package/dist/content/reading-progress.d.ts +10 -4
  196. package/dist/content/reading-progress.d.ts.map +1 -1
  197. package/dist/content/reading-progress.js +26 -10
  198. package/dist/content/slug.d.ts +4 -0
  199. package/dist/content/slug.d.ts.map +1 -1
  200. package/dist/content/toc.d.ts +11 -0
  201. package/dist/content/toc.d.ts.map +1 -1
  202. package/dist/content/toc.js +23 -10
  203. package/dist/controls/actions.d.ts +49 -6
  204. package/dist/controls/actions.d.ts.map +1 -1
  205. package/dist/controls/actions.js +39 -8
  206. package/dist/controls/compare-filter.d.ts +3 -2
  207. package/dist/controls/compare-filter.d.ts.map +1 -1
  208. package/dist/controls/compare-filter.js +17 -2
  209. package/dist/controls/control-group.d.ts +3 -3
  210. package/dist/controls/control-group.d.ts.map +1 -1
  211. package/dist/controls/control-group.js +9 -2
  212. package/dist/controls/controls.module.css +169 -186
  213. package/dist/controls/controls.module.css.d.ts +9 -11
  214. package/dist/controls/enum-filter.d.ts +13 -3
  215. package/dist/controls/enum-filter.d.ts.map +1 -1
  216. package/dist/controls/enum-filter.js +32 -15
  217. package/dist/controls/filter-context.d.ts +15 -6
  218. package/dist/controls/filter-context.d.ts.map +1 -1
  219. package/dist/controls/filter-pill.d.ts +3 -3
  220. package/dist/controls/filter-pill.d.ts.map +1 -1
  221. package/dist/controls/filter-pill.js +4 -1
  222. package/dist/controls/filter-set.d.ts +3 -2
  223. package/dist/controls/filter-set.d.ts.map +1 -1
  224. package/dist/controls/filter-set.js +66 -41
  225. package/dist/controls/filter-sheet.d.ts +20 -80
  226. package/dist/controls/filter-sheet.d.ts.map +1 -1
  227. package/dist/controls/filter-sheet.js +9 -95
  228. package/dist/controls/index.d.ts +3 -0
  229. package/dist/controls/index.d.ts.map +1 -1
  230. package/dist/controls/index.js +6 -0
  231. package/dist/controls/multi-select-filter.d.ts +18 -2
  232. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  233. package/dist/controls/multi-select-filter.js +124 -22
  234. package/dist/controls/number-filter.d.ts +28 -0
  235. package/dist/controls/number-filter.d.ts.map +1 -0
  236. package/dist/controls/number-filter.js +172 -0
  237. package/dist/controls/panel-row.d.ts +132 -0
  238. package/dist/controls/panel-row.d.ts.map +1 -0
  239. package/dist/controls/panel-row.js +173 -0
  240. package/dist/controls/panel-row.module.css +86 -0
  241. package/dist/controls/panel-row.module.css.d.ts +13 -0
  242. package/dist/controls/range-filter.d.ts +20 -5
  243. package/dist/controls/range-filter.d.ts.map +1 -1
  244. package/dist/controls/range-filter.js +75 -38
  245. package/dist/controls/search-filter.d.ts +3 -2
  246. package/dist/controls/search-filter.d.ts.map +1 -1
  247. package/dist/controls/search-filter.js +26 -11
  248. package/dist/controls/select-filter.d.ts +2 -1
  249. package/dist/controls/select-filter.d.ts.map +1 -1
  250. package/dist/controls/select-filter.js +4 -0
  251. package/dist/controls/slider-control.d.ts +36 -0
  252. package/dist/controls/slider-control.d.ts.map +1 -0
  253. package/dist/controls/slider-control.js +64 -0
  254. package/dist/controls/sync-button.d.ts +3 -2
  255. package/dist/controls/sync-button.d.ts.map +1 -1
  256. package/dist/controls/sync-button.js +16 -3
  257. package/dist/controls/toggle-filter.d.ts +3 -2
  258. package/dist/controls/toggle-filter.d.ts.map +1 -1
  259. package/dist/controls/toggle-filter.js +29 -12
  260. package/dist/controls/view-tabs.d.ts +3 -2
  261. package/dist/controls/view-tabs.d.ts.map +1 -1
  262. package/dist/controls/view-tabs.js +43 -11
  263. package/dist/controls-dates/date-range-picker.d.ts +1 -1
  264. package/dist/controls-dates/date-range-picker.d.ts.map +1 -1
  265. package/dist/controls-dates/date-range-picker.js +6 -1
  266. package/dist/dashboard/delta-badge.d.ts +5 -1
  267. package/dist/dashboard/delta-badge.d.ts.map +1 -1
  268. package/dist/dashboard/empty-state.d.ts +10 -3
  269. package/dist/dashboard/empty-state.d.ts.map +1 -1
  270. package/dist/dashboard/empty-state.js +37 -6
  271. package/dist/dashboard/index.d.ts +6 -4
  272. package/dist/dashboard/index.d.ts.map +1 -1
  273. package/dist/dashboard/index.js +10 -2
  274. package/dist/dashboard/query-state.d.ts +48 -27
  275. package/dist/dashboard/query-state.d.ts.map +1 -1
  276. package/dist/dashboard/query-state.js +111 -57
  277. package/dist/dashboard/settings-section.d.ts +19 -9
  278. package/dist/dashboard/settings-section.d.ts.map +1 -1
  279. package/dist/dashboard/settings-section.js +74 -25
  280. package/dist/dashboard/stat-card.d.ts +76 -19
  281. package/dist/dashboard/stat-card.d.ts.map +1 -1
  282. package/dist/dashboard/stat-card.js +78 -38
  283. package/dist/dashboard/stat-card.module.css +112 -26
  284. package/dist/dashboard/stat-card.module.css.d.ts +5 -0
  285. package/dist/dashboard/stat-group.d.ts +41 -0
  286. package/dist/dashboard/stat-group.d.ts.map +1 -0
  287. package/dist/dashboard/stat-group.js +30 -0
  288. package/dist/dashboard/stat-group.module.css +66 -0
  289. package/dist/dashboard/stat-group.module.css.d.ts +8 -0
  290. package/dist/dashboard/widget-grid.d.ts +27 -0
  291. package/dist/dashboard/widget-grid.d.ts.map +1 -0
  292. package/dist/dashboard/widget-grid.js +41 -0
  293. package/dist/dashboard/widget-grid.module.css +53 -0
  294. package/dist/dashboard/widget-grid.module.css.d.ts +9 -0
  295. package/dist/data/data-table.d.ts +151 -12
  296. package/dist/data/data-table.d.ts.map +1 -1
  297. package/dist/data/data-table.js +392 -138
  298. package/dist/data/data-table.module.css +64 -0
  299. package/dist/data/data-table.module.css.d.ts +11 -0
  300. package/dist/data/index.d.ts +2 -2
  301. package/dist/data/index.d.ts.map +1 -1
  302. package/dist/data/index.js +24 -2
  303. package/dist/data/query-branch.d.ts +28 -0
  304. package/dist/data/query-branch.d.ts.map +1 -0
  305. package/dist/data/query-branch.js +10 -0
  306. package/dist/data/table.d.ts +2 -2
  307. package/dist/data/table.d.ts.map +1 -1
  308. package/dist/data/virtual-list.d.ts +65 -6
  309. package/dist/data/virtual-list.d.ts.map +1 -1
  310. package/dist/data/virtual-list.js +89 -38
  311. package/dist/data/virtual.d.ts +1 -1
  312. package/dist/data/virtual.d.ts.map +1 -1
  313. package/dist/forms/FormErrorSummary.d.ts +4 -3
  314. package/dist/forms/FormErrorSummary.d.ts.map +1 -1
  315. package/dist/forms/FormErrorSummary.js +6 -4
  316. package/dist/forms/create-form.d.ts +2 -2
  317. package/dist/forms/field.d.ts +46 -6
  318. package/dist/forms/field.d.ts.map +1 -1
  319. package/dist/forms/field.js +10 -5
  320. package/dist/forms/form-layout.d.ts +142 -0
  321. package/dist/forms/form-layout.d.ts.map +1 -0
  322. package/dist/forms/form-layout.js +110 -0
  323. package/dist/forms/form-layout.module.css +145 -0
  324. package/dist/forms/form-layout.module.css.d.ts +20 -0
  325. package/dist/forms/form-state.d.ts +42 -0
  326. package/dist/forms/form-state.d.ts.map +1 -0
  327. package/dist/forms/form-state.js +26 -0
  328. package/dist/forms/index.d.ts +22 -6
  329. package/dist/forms/index.d.ts.map +1 -1
  330. package/dist/forms/index.js +19 -3
  331. package/dist/forms/use-field-array.d.ts +60 -0
  332. package/dist/forms/use-field-array.d.ts.map +1 -0
  333. package/dist/forms/use-field-array.js +20 -0
  334. package/dist/forms/use-form-draft.d.ts +25 -10
  335. package/dist/forms/use-form-draft.d.ts.map +1 -1
  336. package/dist/forms/use-form-draft.js +55 -18
  337. package/dist/forms/use-form-submit.d.ts +88 -0
  338. package/dist/forms/use-form-submit.d.ts.map +1 -0
  339. package/dist/forms/use-form-submit.js +63 -0
  340. package/dist/guard/index.d.ts +1 -1
  341. package/dist/guard/index.d.ts.map +1 -1
  342. package/dist/guard/index.js +27 -11
  343. package/dist/index.d.ts +10 -8
  344. package/dist/index.d.ts.map +1 -1
  345. package/dist/index.js +44 -4
  346. package/dist/nav/types.d.ts +15 -6
  347. package/dist/nav/types.d.ts.map +1 -1
  348. package/dist/notifications/bell.d.ts +3 -2
  349. package/dist/notifications/bell.d.ts.map +1 -1
  350. package/dist/notifications/bell.js +73 -56
  351. package/dist/notifications/center.d.ts +15 -4
  352. package/dist/notifications/center.d.ts.map +1 -1
  353. package/dist/notifications/center.js +5 -2
  354. package/dist/notifications/define-notifications.d.ts +56 -14
  355. package/dist/notifications/define-notifications.d.ts.map +1 -1
  356. package/dist/notifications/define-notifications.js +2 -1
  357. package/dist/notifications/index.d.ts +6 -2
  358. package/dist/notifications/index.d.ts.map +1 -1
  359. package/dist/notifications/index.js +5 -1
  360. package/dist/notifications/mount-guard.d.ts +8 -0
  361. package/dist/notifications/mount-guard.d.ts.map +1 -0
  362. package/dist/notifications/mount-guard.js +19 -0
  363. package/dist/notifications/notify.d.ts +58 -1
  364. package/dist/notifications/notify.d.ts.map +1 -1
  365. package/dist/notifications/notify.js +46 -2
  366. package/dist/notifications/overlay.d.ts.map +1 -1
  367. package/dist/notifications/overlay.js +2 -0
  368. package/dist/notifications/store.d.ts +7 -0
  369. package/dist/notifications/store.d.ts.map +1 -1
  370. package/dist/provider/index.d.ts +37 -5
  371. package/dist/provider/index.d.ts.map +1 -1
  372. package/dist/provider/index.js +66 -28
  373. package/dist/provider/lab-theme.d.ts.map +1 -1
  374. package/dist/provider/lab-theme.js +2 -1
  375. package/dist/query/devtools.d.ts.map +1 -1
  376. package/dist/query/devtools.js +1 -0
  377. package/dist/router-tanstack/field.d.ts +1 -1
  378. package/dist/router-tanstack/field.d.ts.map +1 -1
  379. package/dist/router-tanstack/index.d.ts +1 -1
  380. package/dist/router-tanstack/index.d.ts.map +1 -1
  381. package/dist/router-tanstack/search-store.d.ts +4 -1
  382. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  383. package/dist/router-tanstack/search-store.js +92 -8
  384. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  385. package/dist/router-tanstack/use-nav.js +1 -1
  386. package/dist/section/index.d.ts +1 -1
  387. package/dist/section/index.d.ts.map +1 -1
  388. package/dist/section/section.d.ts +36 -2
  389. package/dist/section/section.d.ts.map +1 -1
  390. package/dist/section/section.js +49 -57
  391. package/dist/section/section.module.css +11 -0
  392. package/dist/shell/account-types.d.ts +5 -2
  393. package/dist/shell/account-types.d.ts.map +1 -1
  394. package/dist/shell/app-brand.d.ts +13 -0
  395. package/dist/shell/app-brand.d.ts.map +1 -0
  396. package/dist/shell/app-brand.js +94 -0
  397. package/dist/shell/app-brand.module.css +109 -0
  398. package/dist/shell/app-brand.module.css.d.ts +14 -0
  399. package/dist/shell/app-breadcrumbs.d.ts +4 -2
  400. package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
  401. package/dist/shell/app-breadcrumbs.js +33 -22
  402. package/dist/shell/app-header.module.css +10 -5
  403. package/dist/shell/app-main.module.css +107 -0
  404. package/dist/shell/app-main.module.css.d.ts +11 -0
  405. package/dist/shell/app-mobile-nav.d.ts +3 -2
  406. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  407. package/dist/shell/app-mobile-nav.js +29 -15
  408. package/dist/shell/app-mobile-nav.module.css +48 -27
  409. package/dist/shell/app-mobile-nav.module.css.d.ts +0 -1
  410. package/dist/shell/app-sidebar-account.d.ts +2 -1
  411. package/dist/shell/app-sidebar-account.d.ts.map +1 -1
  412. package/dist/shell/app-sidebar-account.js +57 -22
  413. package/dist/shell/app-sidebar.d.ts +9 -3
  414. package/dist/shell/app-sidebar.d.ts.map +1 -1
  415. package/dist/shell/app-sidebar.js +55 -109
  416. package/dist/shell/app-sidebar.module.css +53 -96
  417. package/dist/shell/app-sidebar.module.css.d.ts +0 -5
  418. package/dist/shell/index.d.ts +14 -6
  419. package/dist/shell/index.d.ts.map +1 -1
  420. package/dist/shell/index.js +47 -12
  421. package/dist/shell/isomorphic-layout-effect.d.ts +14 -0
  422. package/dist/shell/isomorphic-layout-effect.d.ts.map +1 -0
  423. package/dist/shell/isomorphic-layout-effect.js +5 -0
  424. package/dist/shell/mobile-nav-model.d.ts.map +1 -1
  425. package/dist/shell/mobile-nav-model.js +27 -6
  426. package/dist/shell/nav-count-badge.d.ts +5 -3
  427. package/dist/shell/nav-count-badge.d.ts.map +1 -1
  428. package/dist/shell/nav-count-badge.js +3 -1
  429. package/dist/shell/page-aside.d.ts +43 -0
  430. package/dist/shell/page-aside.d.ts.map +1 -0
  431. package/dist/shell/page-aside.js +202 -0
  432. package/dist/shell/page-aside.module.css +174 -0
  433. package/dist/shell/page-aside.module.css.d.ts +14 -0
  434. package/dist/shell/page-bar.d.ts +55 -15
  435. package/dist/shell/page-bar.d.ts.map +1 -1
  436. package/dist/shell/page-bar.js +130 -41
  437. package/dist/shell/page-bar.module.css +107 -13
  438. package/dist/shell/page-bar.module.css.d.ts +4 -1
  439. package/dist/shell/sidebar-search.d.ts +4 -2
  440. package/dist/shell/sidebar-search.d.ts.map +1 -1
  441. package/dist/shell/sidebar-search.js +9 -4
  442. package/dist/shell/sidebar-search.module.css +1 -1
  443. package/dist/state/fields.d.ts +227 -34
  444. package/dist/state/fields.d.ts.map +1 -1
  445. package/dist/state/fields.js +77 -30
  446. package/dist/state/persisted-or-local.d.ts +9 -0
  447. package/dist/state/persisted-or-local.d.ts.map +1 -0
  448. package/dist/state/persisted-or-local.js +24 -0
  449. package/dist/state/persisted.d.ts +12 -0
  450. package/dist/state/persisted.d.ts.map +1 -1
  451. package/dist/state/persisted.js +36 -18
  452. package/dist/state.d.ts +1 -1
  453. package/dist/state.d.ts.map +1 -1
  454. package/dist/state.js +2 -6
  455. package/dist/surfaces.d.ts +12 -11
  456. package/dist/surfaces.d.ts.map +1 -1
  457. package/dist/surfaces.js +43 -12
  458. package/dist/theme/ctl-theme.d.ts.map +1 -1
  459. package/dist/theme/index.d.ts.map +1 -1
  460. package/dist/theme/index.js +102 -17
  461. package/dist/theme/nav-link.module.css +37 -26
  462. package/dist/theme/segmented-control.module.css +22 -0
  463. package/dist/theme/segmented-control.module.css.d.ts +1 -0
  464. package/dist/theme-lab/boot.d.ts +66 -0
  465. package/dist/theme-lab/boot.d.ts.map +1 -0
  466. package/dist/theme-lab/boot.js +82 -0
  467. package/dist/theme-lab/index.d.ts +4 -43
  468. package/dist/theme-lab/index.d.ts.map +1 -1
  469. package/dist/theme-lab/index.js +9 -69
  470. package/dist/theme-toggle/index.d.ts +3 -2
  471. package/dist/theme-toggle/index.d.ts.map +1 -1
  472. package/dist/theme-toggle/index.js +8 -2
  473. package/dist/tokens/index.d.ts +42 -0
  474. package/dist/tokens/index.d.ts.map +1 -1
  475. package/dist/tokens/index.js +35 -6
  476. package/dist/tokens/palette.d.ts +45 -25
  477. package/dist/tokens/palette.d.ts.map +1 -1
  478. package/dist/tokens/palette.js +31 -14
  479. package/dist/tokens.css +4 -5
  480. package/dist/utils/is-dev.d.ts +3 -0
  481. package/dist/utils/is-dev.d.ts.map +1 -0
  482. package/dist/utils/is-dev.js +6 -0
  483. package/dist/widget-header/delta-badge.d.ts +7 -1
  484. package/dist/widget-header/delta-badge.d.ts.map +1 -1
  485. package/dist/widget-header/delta-badge.js +8 -1
  486. package/dist/widget-header/index.d.ts +2 -2
  487. package/dist/widget-header/index.d.ts.map +1 -1
  488. package/dist/widget-header/index.js +3 -1
  489. package/dist/widget-header/widget-header.d.ts +99 -4
  490. package/dist/widget-header/widget-header.d.ts.map +1 -1
  491. package/dist/widget-header/widget-header.js +45 -18
  492. package/dist/widget-header/widget-header.module.css +87 -7
  493. package/dist/widget-header/widget-header.module.css.d.ts +1 -0
  494. package/llms.txt +6 -6
  495. package/package.json +49 -25
  496. package/src/agent/coalesce.ts +2 -1
  497. package/src/agent/merge.ts +2 -1
  498. package/src/agent/part-list.tsx +2 -0
  499. package/src/agent/stick-to-bottom.tsx +9 -11
  500. package/src/agent-chat/composer.tsx +124 -103
  501. package/src/agent-chat/relative-time.ts +2 -1
  502. package/src/agent-chat/thread-detail-panel.tsx +9 -5
  503. package/src/agent-chat/thread-feed-row.tsx +17 -9
  504. package/src/agent-chat/thread-feed.tsx +9 -3
  505. package/src/agent-chat/thread-message.tsx +48 -13
  506. package/src/agent-chat/thread-outcome-card.tsx +9 -1
  507. package/src/agent-chat/thread-workspace.tsx +72 -33
  508. package/src/agent-chat/tool-chip.tsx +8 -2
  509. package/src/charts/hooks/useBandPlot.ts +26 -8
  510. package/src/charts/index.ts +39 -4
  511. package/src/charts/kinds/BandStrip.tsx +36 -14
  512. package/src/charts/kinds/Bars.tsx +67 -16
  513. package/src/charts/kinds/Donut.tsx +30 -3
  514. package/src/charts/kinds/DualPanel.tsx +56 -10
  515. package/src/charts/kinds/Heatmap.tsx +90 -33
  516. package/src/charts/kinds/MirroredBars.tsx +21 -3
  517. package/src/charts/kinds/MultiLine.tsx +61 -18
  518. package/src/charts/kinds/StackedArea.tsx +77 -6
  519. package/src/charts/kinds/ZonedLine.tsx +71 -31
  520. package/src/charts/layout/auto-margin.ts +134 -21
  521. package/src/charts/layout/log-ticks.ts +90 -0
  522. package/src/charts/primitives/Axes.tsx +33 -5
  523. package/src/charts/primitives/CartesianChart.tsx +194 -41
  524. package/src/charts/primitives/ChartCard.tsx +66 -25
  525. package/src/charts/primitives/ChartFrame.tsx +107 -26
  526. package/src/charts/primitives/ChartLegend.tsx +43 -13
  527. package/src/charts/primitives/ChartPending.tsx +185 -7
  528. package/src/charts/primitives/ChartTooltip.tsx +37 -5
  529. package/src/charts/primitives/Crosshair.tsx +6 -3
  530. package/src/charts/primitives/chart-frame-layout.ts +212 -0
  531. package/src/charts/primitives/chart-tier.tsx +37 -0
  532. package/src/charts/series.ts +77 -1
  533. package/src/charts/sparklines/BarSparkline.tsx +11 -3
  534. package/src/charts/sparklines/LineSparkline.tsx +18 -4
  535. package/src/charts/sparklines/index.ts +2 -2
  536. package/src/charts/utils/format.ts +163 -2
  537. package/src/charts/utils/ticks.ts +149 -4
  538. package/src/cli/index.ts +8 -3
  539. package/src/commands/ShortcutsHelp.tsx +10 -3
  540. package/src/commands/define-commands.ts +2 -2
  541. package/src/commands/define-overlays.ts +216 -1
  542. package/src/commands/index.ts +12 -0
  543. package/src/commands/overlays-mount.tsx +60 -26
  544. package/src/common/errors.ts +73 -0
  545. package/src/common/index.ts +21 -0
  546. package/src/common/props.ts +71 -0
  547. package/src/common/query-state-like.ts +64 -0
  548. package/src/common/refs.ts +58 -0
  549. package/src/common/scroll-parent.ts +42 -0
  550. package/src/common/validate.ts +94 -0
  551. package/src/connectivity/connectivity-indicator.tsx +6 -1
  552. package/src/connectivity/connectivity-provider.tsx +4 -1
  553. package/src/connectivity/index.ts +1 -0
  554. package/src/connectivity/types.ts +5 -2
  555. package/src/connectivity/use-connectivity.ts +3 -2
  556. package/src/content/article-layout.module.css +11 -4
  557. package/src/content/callout.tsx +13 -7
  558. package/src/content/guide.tsx +14 -4
  559. package/src/content/heading-anchor.tsx +14 -3
  560. package/src/content/index.ts +2 -0
  561. package/src/content/markdown.tsx +2 -0
  562. package/src/content/prose.module.css +9 -7
  563. package/src/content/reading-progress.tsx +40 -15
  564. package/src/content/slug.ts +4 -0
  565. package/src/content/toc.tsx +47 -10
  566. package/src/controls/actions.tsx +89 -9
  567. package/src/controls/compare-filter.tsx +20 -3
  568. package/src/controls/control-group.tsx +11 -4
  569. package/src/controls/controls.module.css +169 -186
  570. package/src/controls/controls.module.css.d.ts +9 -11
  571. package/src/controls/enum-filter.tsx +46 -19
  572. package/src/controls/filter-context.tsx +21 -8
  573. package/src/controls/filter-pill.tsx +6 -3
  574. package/src/controls/filter-set.tsx +32 -13
  575. package/src/controls/filter-sheet.tsx +44 -194
  576. package/src/controls/index.ts +8 -0
  577. package/src/controls/multi-select-filter.tsx +179 -29
  578. package/src/controls/number-filter.tsx +329 -0
  579. package/src/controls/panel-row.module.css +86 -0
  580. package/src/controls/panel-row.module.css.d.ts +13 -0
  581. package/src/controls/panel-row.tsx +392 -0
  582. package/src/controls/range-filter.tsx +133 -43
  583. package/src/controls/search-filter.tsx +31 -13
  584. package/src/controls/select-filter.tsx +11 -1
  585. package/src/controls/slider-control.tsx +159 -0
  586. package/src/controls/sync-button.tsx +13 -3
  587. package/src/controls/toggle-filter.tsx +37 -17
  588. package/src/controls/view-tabs.tsx +63 -11
  589. package/src/controls-dates/date-range-picker.tsx +8 -1
  590. package/src/dashboard/delta-badge.tsx +5 -1
  591. package/src/dashboard/empty-state.tsx +72 -25
  592. package/src/dashboard/index.ts +19 -2
  593. package/src/dashboard/query-state.tsx +154 -84
  594. package/src/dashboard/settings-section.tsx +87 -31
  595. package/src/dashboard/stat-card.module.css +112 -26
  596. package/src/dashboard/stat-card.module.css.d.ts +5 -0
  597. package/src/dashboard/stat-card.tsx +207 -68
  598. package/src/dashboard/stat-group.module.css +66 -0
  599. package/src/dashboard/stat-group.module.css.d.ts +8 -0
  600. package/src/dashboard/stat-group.tsx +74 -0
  601. package/src/dashboard/widget-grid.module.css +53 -0
  602. package/src/dashboard/widget-grid.module.css.d.ts +9 -0
  603. package/src/dashboard/widget-grid.tsx +127 -0
  604. package/src/data/data-table.module.css +64 -0
  605. package/src/data/data-table.module.css.d.ts +11 -0
  606. package/src/data/data-table.tsx +927 -346
  607. package/src/data/index.ts +30 -2
  608. package/src/data/query-branch.ts +53 -0
  609. package/src/data/table.ts +5 -0
  610. package/src/data/virtual-list.tsx +189 -55
  611. package/src/data/virtual.ts +5 -1
  612. package/src/forms/FormErrorSummary.tsx +13 -6
  613. package/src/forms/create-form.ts +2 -2
  614. package/src/forms/field.ts +60 -11
  615. package/src/forms/form-layout.module.css +145 -0
  616. package/src/forms/form-layout.module.css.d.ts +20 -0
  617. package/src/forms/form-layout.tsx +305 -0
  618. package/src/forms/form-state.tsx +94 -0
  619. package/src/forms/index.ts +38 -7
  620. package/src/forms/use-field-array.ts +94 -0
  621. package/src/forms/use-form-draft.ts +145 -53
  622. package/src/forms/use-form-submit.ts +199 -0
  623. package/src/guard/index.ts +91 -23
  624. package/src/index.ts +79 -10
  625. package/src/nav/types.ts +15 -6
  626. package/src/notifications/bell.tsx +18 -4
  627. package/src/notifications/center.tsx +18 -5
  628. package/src/notifications/define-notifications.ts +64 -18
  629. package/src/notifications/index.ts +12 -1
  630. package/src/notifications/mount-guard.ts +41 -0
  631. package/src/notifications/notify.tsx +122 -3
  632. package/src/notifications/overlay.tsx +2 -0
  633. package/src/notifications/store.ts +7 -0
  634. package/src/provider/index.tsx +101 -13
  635. package/src/provider/lab-theme.ts +2 -1
  636. package/src/query/devtools.tsx +1 -0
  637. package/src/router-tanstack/field.ts +5 -0
  638. package/src/router-tanstack/index.ts +4 -0
  639. package/src/router-tanstack/search-store.ts +171 -12
  640. package/src/router-tanstack/use-nav.ts +18 -13
  641. package/src/section/index.ts +1 -1
  642. package/src/section/section.module.css +11 -0
  643. package/src/section/section.tsx +163 -96
  644. package/src/shell/account-types.ts +5 -2
  645. package/src/shell/app-brand.module.css +109 -0
  646. package/src/shell/app-brand.module.css.d.ts +14 -0
  647. package/src/shell/app-brand.tsx +140 -0
  648. package/src/shell/app-breadcrumbs.tsx +19 -9
  649. package/src/shell/app-header.module.css +10 -5
  650. package/src/shell/app-main.module.css +107 -0
  651. package/src/shell/app-main.module.css.d.ts +11 -0
  652. package/src/shell/app-mobile-nav.module.css +48 -27
  653. package/src/shell/app-mobile-nav.module.css.d.ts +0 -1
  654. package/src/shell/app-mobile-nav.tsx +43 -11
  655. package/src/shell/app-sidebar-account.tsx +29 -6
  656. package/src/shell/app-sidebar.module.css +53 -96
  657. package/src/shell/app-sidebar.module.css.d.ts +0 -5
  658. package/src/shell/app-sidebar.tsx +40 -113
  659. package/src/shell/index.tsx +156 -65
  660. package/src/shell/isomorphic-layout-effect.ts +14 -0
  661. package/src/shell/mobile-nav-model.ts +66 -10
  662. package/src/shell/nav-count-badge.tsx +6 -1
  663. package/src/shell/page-aside.module.css +174 -0
  664. package/src/shell/page-aside.module.css.d.ts +14 -0
  665. package/src/shell/page-aside.tsx +377 -0
  666. package/src/shell/page-bar.module.css +107 -13
  667. package/src/shell/page-bar.module.css.d.ts +4 -1
  668. package/src/shell/page-bar.tsx +294 -94
  669. package/src/shell/sidebar-search.module.css +1 -1
  670. package/src/shell/sidebar-search.tsx +13 -4
  671. package/src/state/fields.ts +360 -69
  672. package/src/state/persisted-or-local.ts +50 -0
  673. package/src/state/persisted.ts +76 -26
  674. package/src/state.ts +4 -7
  675. package/src/surfaces.ts +43 -12
  676. package/src/theme/ctl-theme.tsx +10 -0
  677. package/src/theme/index.ts +129 -16
  678. package/src/theme/nav-link.module.css +37 -26
  679. package/src/theme/segmented-control.module.css +22 -0
  680. package/src/theme/segmented-control.module.css.d.ts +1 -0
  681. package/src/theme-lab/boot.ts +140 -0
  682. package/src/theme-lab/index.tsx +21 -112
  683. package/src/theme-toggle/index.tsx +10 -3
  684. package/src/tokens/index.ts +50 -6
  685. package/src/tokens/palette.ts +58 -30
  686. package/src/utils/is-dev.ts +4 -0
  687. package/src/widget-header/delta-badge.tsx +25 -5
  688. package/src/widget-header/index.ts +10 -2
  689. package/src/widget-header/widget-header.module.css +87 -7
  690. package/src/widget-header/widget-header.module.css.d.ts +1 -0
  691. package/src/widget-header/widget-header.tsx +166 -42
  692. package/dist/agent/adapter.test.d.ts +0 -2
  693. package/dist/agent/adapter.test.d.ts.map +0 -1
  694. package/dist/agent/ai-sdk-transport.test.d.ts +0 -2
  695. package/dist/agent/ai-sdk-transport.test.d.ts.map +0 -1
  696. package/dist/agent/coalesce.test.d.ts +0 -2
  697. package/dist/agent/coalesce.test.d.ts.map +0 -1
  698. package/dist/agent/foreign.test.d.ts +0 -2
  699. package/dist/agent/foreign.test.d.ts.map +0 -1
  700. package/dist/agent/id.test.d.ts +0 -2
  701. package/dist/agent/id.test.d.ts.map +0 -1
  702. package/dist/agent/merge.test.d.ts +0 -2
  703. package/dist/agent/merge.test.d.ts.map +0 -1
  704. package/dist/agent/part-list.test.d.ts +0 -2
  705. package/dist/agent/part-list.test.d.ts.map +0 -1
  706. package/dist/agent/parts.test.d.ts +0 -2
  707. package/dist/agent/parts.test.d.ts.map +0 -1
  708. package/dist/agent/thread.test.d.ts +0 -2
  709. package/dist/agent/thread.test.d.ts.map +0 -1
  710. package/dist/agent/transport.test.d.ts +0 -2
  711. package/dist/agent/transport.test.d.ts.map +0 -1
  712. package/dist/agent/use-agent-stream.test.d.ts +0 -2
  713. package/dist/agent/use-agent-stream.test.d.ts.map +0 -1
  714. package/dist/agent/use-agent-thread-runs.foreign.test.d.ts +0 -2
  715. package/dist/agent/use-agent-thread-runs.foreign.test.d.ts.map +0 -1
  716. package/dist/agent/use-agent-thread-runs.resume.test.d.ts +0 -2
  717. package/dist/agent/use-agent-thread-runs.resume.test.d.ts.map +0 -1
  718. package/dist/agent/use-agent-thread-runs.test.d.ts +0 -2
  719. package/dist/agent/use-agent-thread-runs.test.d.ts.map +0 -1
  720. package/dist/agent/use-agent-thread-runs.wedge.test.d.ts +0 -2
  721. package/dist/agent/use-agent-thread-runs.wedge.test.d.ts.map +0 -1
  722. package/dist/agent-chat/composer.test.d.ts +0 -2
  723. package/dist/agent-chat/composer.test.d.ts.map +0 -1
  724. package/dist/agent-chat/relative-time.test.d.ts +0 -2
  725. package/dist/agent-chat/relative-time.test.d.ts.map +0 -1
  726. package/dist/agent-chat/thread-feed-row.test.d.ts +0 -2
  727. package/dist/agent-chat/thread-feed-row.test.d.ts.map +0 -1
  728. package/dist/agent-chat/thread-feed.test.d.ts +0 -2
  729. package/dist/agent-chat/thread-feed.test.d.ts.map +0 -1
  730. package/dist/agent-chat/thread-message.test.d.ts +0 -2
  731. package/dist/agent-chat/thread-message.test.d.ts.map +0 -1
  732. package/dist/agent-chat/thread-workspace.test.d.ts +0 -2
  733. package/dist/agent-chat/thread-workspace.test.d.ts.map +0 -1
  734. package/dist/agent-chat/tool-chip.test.d.ts +0 -2
  735. package/dist/agent-chat/tool-chip.test.d.ts.map +0 -1
  736. package/dist/agent-chat/virtualize.type-guard.test.d.ts +0 -2
  737. package/dist/agent-chat/virtualize.type-guard.test.d.ts.map +0 -1
  738. package/dist/charts/cursor/resolve.test.d.ts +0 -2
  739. package/dist/charts/cursor/resolve.test.d.ts.map +0 -1
  740. package/dist/charts/cursor/store.test.d.ts +0 -2
  741. package/dist/charts/cursor/store.test.d.ts.map +0 -1
  742. package/dist/charts/kinds/BandStrip.test.d.ts +0 -2
  743. package/dist/charts/kinds/BandStrip.test.d.ts.map +0 -1
  744. package/dist/charts/kinds/Bars.test.d.ts +0 -2
  745. package/dist/charts/kinds/Bars.test.d.ts.map +0 -1
  746. package/dist/charts/kinds/DualPanel.test.d.ts +0 -2
  747. package/dist/charts/kinds/DualPanel.test.d.ts.map +0 -1
  748. package/dist/charts/kinds/MirroredBars.test.d.ts +0 -2
  749. package/dist/charts/kinds/MirroredBars.test.d.ts.map +0 -1
  750. package/dist/charts/kinds/MultiLine.test.d.ts +0 -2
  751. package/dist/charts/kinds/MultiLine.test.d.ts.map +0 -1
  752. package/dist/charts/kinds/StackedArea.test.d.ts +0 -2
  753. package/dist/charts/kinds/StackedArea.test.d.ts.map +0 -1
  754. package/dist/charts/kinds/ZonedLine.test.d.ts +0 -2
  755. package/dist/charts/kinds/ZonedLine.test.d.ts.map +0 -1
  756. package/dist/charts/layout/auto-margin.test.d.ts +0 -2
  757. package/dist/charts/layout/auto-margin.test.d.ts.map +0 -1
  758. package/dist/charts/primitives/CartesianChart.test.d.ts +0 -2
  759. package/dist/charts/primitives/CartesianChart.test.d.ts.map +0 -1
  760. package/dist/charts/primitives/ChartCard.test.d.ts +0 -2
  761. package/dist/charts/primitives/ChartCard.test.d.ts.map +0 -1
  762. package/dist/charts/primitives/ChartFrame.test.d.ts +0 -2
  763. package/dist/charts/primitives/ChartFrame.test.d.ts.map +0 -1
  764. package/dist/charts/primitives/ChartLegend.test.d.ts +0 -2
  765. package/dist/charts/primitives/ChartLegend.test.d.ts.map +0 -1
  766. package/dist/charts/primitives/ChartTooltip.test.d.ts +0 -2
  767. package/dist/charts/primitives/ChartTooltip.test.d.ts.map +0 -1
  768. package/dist/charts/primitives/XZoneRects.test.d.ts +0 -2
  769. package/dist/charts/primitives/XZoneRects.test.d.ts.map +0 -1
  770. package/dist/charts/series.test.d.ts +0 -2
  771. package/dist/charts/series.test.d.ts.map +0 -1
  772. package/dist/charts/utils/domain.test.d.ts +0 -2
  773. package/dist/charts/utils/domain.test.d.ts.map +0 -1
  774. package/dist/charts/utils/measure-text.test.d.ts +0 -2
  775. package/dist/charts/utils/measure-text.test.d.ts.map +0 -1
  776. package/dist/cli/check-coverage.test.d.ts +0 -2
  777. package/dist/cli/check-coverage.test.d.ts.map +0 -1
  778. package/dist/cli/check-theme.test.d.ts +0 -2
  779. package/dist/cli/check-theme.test.d.ts.map +0 -1
  780. package/dist/cli/help.test.d.ts +0 -2
  781. package/dist/cli/help.test.d.ts.map +0 -1
  782. package/dist/cli/init-sync.test.d.ts +0 -2
  783. package/dist/cli/init-sync.test.d.ts.map +0 -1
  784. package/dist/cli/placement-engine.test.d.ts +0 -2
  785. package/dist/cli/placement-engine.test.d.ts.map +0 -1
  786. package/dist/cli/shipped-versions.test.d.ts +0 -2
  787. package/dist/cli/shipped-versions.test.d.ts.map +0 -1
  788. package/dist/cli/tarball-parity.test.d.ts +0 -2
  789. package/dist/cli/tarball-parity.test.d.ts.map +0 -1
  790. package/dist/cli/template-format.test.d.ts +0 -2
  791. package/dist/cli/template-format.test.d.ts.map +0 -1
  792. package/dist/cli/template-ledger.test.d.ts +0 -2
  793. package/dist/cli/template-ledger.test.d.ts.map +0 -1
  794. package/dist/cli/tokens-css.test.d.ts +0 -2
  795. package/dist/cli/tokens-css.test.d.ts.map +0 -1
  796. package/dist/cli/toolchain-wiring.test.d.ts +0 -2
  797. package/dist/cli/toolchain-wiring.test.d.ts.map +0 -1
  798. package/dist/cli/waiver-audit.test.d.ts +0 -2
  799. package/dist/cli/waiver-audit.test.d.ts.map +0 -1
  800. package/dist/content/article-actions.test.d.ts +0 -2
  801. package/dist/content/article-actions.test.d.ts.map +0 -1
  802. package/dist/content/article-model.test.d.ts +0 -2
  803. package/dist/content/article-model.test.d.ts.map +0 -1
  804. package/dist/content/block-split.test.d.ts +0 -2
  805. package/dist/content/block-split.test.d.ts.map +0 -1
  806. package/dist/content/heading-components.test.d.ts +0 -2
  807. package/dist/content/heading-components.test.d.ts.map +0 -1
  808. package/dist/content/markdown.test.d.ts +0 -2
  809. package/dist/content/markdown.test.d.ts.map +0 -1
  810. package/dist/content/prose.module.css.test.d.ts +0 -2
  811. package/dist/content/prose.module.css.test.d.ts.map +0 -1
  812. package/dist/content/sanitize.test.d.ts +0 -2
  813. package/dist/content/sanitize.test.d.ts.map +0 -1
  814. package/dist/content/slug.test.d.ts +0 -2
  815. package/dist/content/slug.test.d.ts.map +0 -1
  816. package/dist/controls/actions.test.d.ts +0 -2
  817. package/dist/controls/actions.test.d.ts.map +0 -1
  818. package/dist/controls/actions.type-guard.test.d.ts +0 -2
  819. package/dist/controls/actions.type-guard.test.d.ts.map +0 -1
  820. package/dist/controls/control-group.test.d.ts +0 -2
  821. package/dist/controls/control-group.test.d.ts.map +0 -1
  822. package/dist/controls/controls.router.test.d.ts +0 -2
  823. package/dist/controls/controls.router.test.d.ts.map +0 -1
  824. package/dist/controls/filter-set.test.d.ts +0 -2
  825. package/dist/controls/filter-set.test.d.ts.map +0 -1
  826. package/dist/controls/peer-boundary.test.d.ts +0 -2
  827. package/dist/controls/peer-boundary.test.d.ts.map +0 -1
  828. package/dist/controls/props-contract.test.d.ts +0 -2
  829. package/dist/controls/props-contract.test.d.ts.map +0 -1
  830. package/dist/controls/sync-button.test.d.ts +0 -2
  831. package/dist/controls/sync-button.test.d.ts.map +0 -1
  832. package/dist/dashboard/query-state.test.d.ts +0 -2
  833. package/dist/dashboard/query-state.test.d.ts.map +0 -1
  834. package/dist/dashboard/settings-section.test.d.ts +0 -2
  835. package/dist/dashboard/settings-section.test.d.ts.map +0 -1
  836. package/dist/dashboard/stat-card.test.d.ts +0 -2
  837. package/dist/dashboard/stat-card.test.d.ts.map +0 -1
  838. package/dist/data/data-table.test.d.ts +0 -2
  839. package/dist/data/data-table.test.d.ts.map +0 -1
  840. package/dist/guard/check-source.test.d.ts +0 -2
  841. package/dist/guard/check-source.test.d.ts.map +0 -1
  842. package/dist/guard/grace.test.d.ts +0 -20
  843. package/dist/guard/grace.test.d.ts.map +0 -1
  844. package/dist/guard/guard-hook.test.d.ts +0 -2
  845. package/dist/guard/guard-hook.test.d.ts.map +0 -1
  846. package/dist/provider/index.test.d.ts +0 -2
  847. package/dist/provider/index.test.d.ts.map +0 -1
  848. package/dist/provider/lab-theme.test.d.ts +0 -2
  849. package/dist/provider/lab-theme.test.d.ts.map +0 -1
  850. package/dist/query/error-message.test.d.ts +0 -2
  851. package/dist/query/error-message.test.d.ts.map +0 -1
  852. package/dist/router-tanstack/multi-search-param-store.test.d.ts +0 -2
  853. package/dist/router-tanstack/multi-search-param-store.test.d.ts.map +0 -1
  854. package/dist/router-tanstack/nav.test.d.ts +0 -2
  855. package/dist/router-tanstack/nav.test.d.ts.map +0 -1
  856. package/dist/router-tanstack/search-param-store.test.d.ts +0 -2
  857. package/dist/router-tanstack/search-param-store.test.d.ts.map +0 -1
  858. package/dist/router-tanstack/search-store.router.test.d.ts +0 -2
  859. package/dist/router-tanstack/search-store.router.test.d.ts.map +0 -1
  860. package/dist/router-tanstack/search-store.test.d.ts +0 -2
  861. package/dist/router-tanstack/search-store.test.d.ts.map +0 -1
  862. package/dist/router-tanstack/use-nav.test.d.ts +0 -2
  863. package/dist/router-tanstack/use-nav.test.d.ts.map +0 -1
  864. package/dist/section/section.test.d.ts +0 -2
  865. package/dist/section/section.test.d.ts.map +0 -1
  866. package/dist/shell/app-mobile-nav.test.d.ts +0 -2
  867. package/dist/shell/app-mobile-nav.test.d.ts.map +0 -1
  868. package/dist/shell/app-sidebar.test.d.ts +0 -2
  869. package/dist/shell/app-sidebar.test.d.ts.map +0 -1
  870. package/dist/shell/index.test.d.ts +0 -2
  871. package/dist/shell/index.test.d.ts.map +0 -1
  872. package/dist/shell/mobile-nav-model.test.d.ts +0 -2
  873. package/dist/shell/mobile-nav-model.test.d.ts.map +0 -1
  874. package/dist/shell/page-bar.test.d.ts +0 -2
  875. package/dist/shell/page-bar.test.d.ts.map +0 -1
  876. package/dist/state/fields.test.d.ts +0 -2
  877. package/dist/state/fields.test.d.ts.map +0 -1
  878. package/dist/styles.floor.test.d.ts +0 -2
  879. package/dist/styles.floor.test.d.ts.map +0 -1
  880. package/dist/theme/border-coverage.test.d.ts +0 -18
  881. package/dist/theme/border-coverage.test.d.ts.map +0 -1
  882. package/dist/theme/contrast.test.d.ts +0 -2
  883. package/dist/theme/contrast.test.d.ts.map +0 -1
  884. package/dist/theme/ctl-theme.test.d.ts +0 -2
  885. package/dist/theme/ctl-theme.test.d.ts.map +0 -1
  886. package/dist/theme/ctl-tier-coverage.test.d.ts +0 -2
  887. package/dist/theme/ctl-tier-coverage.test.d.ts.map +0 -1
  888. package/dist/theme/density-option.test.d.ts +0 -2
  889. package/dist/theme/density-option.test.d.ts.map +0 -1
  890. package/dist/theme/density-relations.test.d.ts +0 -2
  891. package/dist/theme/density-relations.test.d.ts.map +0 -1
  892. package/dist/theme/derive-theme.test.d.ts +0 -2
  893. package/dist/theme/derive-theme.test.d.ts.map +0 -1
  894. package/dist/theme/divider-law.test.d.ts +0 -2
  895. package/dist/theme/divider-law.test.d.ts.map +0 -1
  896. package/dist/theme/fonts-option.test.d.ts +0 -2
  897. package/dist/theme/fonts-option.test.d.ts.map +0 -1
  898. package/dist/theme/icon-slot.test.d.ts +0 -2
  899. package/dist/theme/icon-slot.test.d.ts.map +0 -1
  900. package/dist/theme/layout-rhythm-css.test.d.ts +0 -2
  901. package/dist/theme/layout-rhythm-css.test.d.ts.map +0 -1
  902. package/dist/theme/radius-option.test.d.ts +0 -2
  903. package/dist/theme/radius-option.test.d.ts.map +0 -1
  904. package/dist/theme/radius.test.d.ts +0 -2
  905. package/dist/theme/radius.test.d.ts.map +0 -1
  906. package/dist/theme/shadow-surfaces.test.d.ts +0 -26
  907. package/dist/theme/shadow-surfaces.test.d.ts.map +0 -1
  908. package/dist/theme/spacing.test.d.ts +0 -2
  909. package/dist/theme/spacing.test.d.ts.map +0 -1
  910. package/dist/theme/use-basalt-spacing.test.d.ts +0 -2
  911. package/dist/theme/use-basalt-spacing.test.d.ts.map +0 -1
  912. package/dist/theme-lab/derive-controls.test.d.ts +0 -2
  913. package/dist/theme-lab/derive-controls.test.d.ts.map +0 -1
  914. package/dist/theme-lab/derive-state.test.d.ts +0 -2
  915. package/dist/theme-lab/derive-state.test.d.ts.map +0 -1
  916. package/dist/theme-lab/theme-lab.test.d.ts +0 -2
  917. package/dist/theme-lab/theme-lab.test.d.ts.map +0 -1
  918. package/dist/tokens/build-fonts-css.test.d.ts +0 -2
  919. package/dist/tokens/build-fonts-css.test.d.ts.map +0 -1
  920. package/dist/tokens/build-radius-css.test.d.ts +0 -2
  921. package/dist/tokens/build-radius-css.test.d.ts.map +0 -1
  922. package/dist/tokens/chart-margin.test.d.ts +0 -2
  923. package/dist/tokens/chart-margin.test.d.ts.map +0 -1
  924. package/dist/tokens/density.test.d.ts +0 -2
  925. package/dist/tokens/density.test.d.ts.map +0 -1
  926. package/dist/tokens/derive-radius.test.d.ts +0 -2
  927. package/dist/tokens/derive-radius.test.d.ts.map +0 -1
  928. package/dist/tokens/derive.test.d.ts +0 -2
  929. package/dist/tokens/derive.test.d.ts.map +0 -1
  930. package/dist/tokens/palette.test.d.ts +0 -2
  931. package/dist/tokens/palette.test.d.ts.map +0 -1
  932. package/dist/tokens/text-scale.test.d.ts +0 -2
  933. package/dist/tokens/text-scale.test.d.ts.map +0 -1
  934. package/dist/vite-color-mix.test.d.ts +0 -2
  935. package/dist/vite-color-mix.test.d.ts.map +0 -1
  936. package/dist/vite.test.d.ts +0 -2
  937. package/dist/vite.test.d.ts.map +0 -1
  938. package/dist/widget-header/delta-badge.test.d.ts +0 -2
  939. package/dist/widget-header/delta-badge.test.d.ts.map +0 -1
  940. package/dist/widget-header/no-mantine.test.d.ts +0 -2
  941. package/dist/widget-header/no-mantine.test.d.ts.map +0 -1
  942. package/dist/widget-header/widget-header.test.d.ts +0 -2
  943. package/dist/widget-header/widget-header.test.d.ts.map +0 -1
  944. package/src/agent/adapter.test.ts +0 -1640
  945. package/src/agent/ai-sdk-transport.test.ts +0 -658
  946. package/src/agent/coalesce.test.ts +0 -387
  947. package/src/agent/foreign.test.ts +0 -51
  948. package/src/agent/id.test.ts +0 -169
  949. package/src/agent/merge.test.ts +0 -206
  950. package/src/agent/part-list.test.tsx +0 -112
  951. package/src/agent/parts.test.ts +0 -720
  952. package/src/agent/thread.test.ts +0 -220
  953. package/src/agent/transport.test.ts +0 -70
  954. package/src/agent/use-agent-stream.test.tsx +0 -287
  955. package/src/agent/use-agent-thread-runs.foreign.test.tsx +0 -138
  956. package/src/agent/use-agent-thread-runs.resume.test.tsx +0 -294
  957. package/src/agent/use-agent-thread-runs.test.tsx +0 -1120
  958. package/src/agent/use-agent-thread-runs.wedge.test.tsx +0 -387
  959. package/src/agent-chat/composer.test.tsx +0 -924
  960. package/src/agent-chat/relative-time.test.ts +0 -95
  961. package/src/agent-chat/thread-feed-row.test.tsx +0 -510
  962. package/src/agent-chat/thread-feed.test.tsx +0 -241
  963. package/src/agent-chat/thread-message.test.tsx +0 -1285
  964. package/src/agent-chat/thread-workspace.test.tsx +0 -169
  965. package/src/agent-chat/tool-chip.test.tsx +0 -139
  966. package/src/agent-chat/virtualize.type-guard.test.ts +0 -49
  967. package/src/charts/cursor/resolve.test.ts +0 -151
  968. package/src/charts/cursor/store.test.ts +0 -64
  969. package/src/charts/kinds/BandStrip.test.tsx +0 -282
  970. package/src/charts/kinds/Bars.test.tsx +0 -183
  971. package/src/charts/kinds/DualPanel.test.tsx +0 -527
  972. package/src/charts/kinds/MirroredBars.test.tsx +0 -232
  973. package/src/charts/kinds/MultiLine.test.tsx +0 -218
  974. package/src/charts/kinds/StackedArea.test.tsx +0 -114
  975. package/src/charts/kinds/ZonedLine.test.tsx +0 -147
  976. package/src/charts/layout/auto-margin.test.ts +0 -42
  977. package/src/charts/primitives/CartesianChart.test.tsx +0 -647
  978. package/src/charts/primitives/ChartCard.test.tsx +0 -66
  979. package/src/charts/primitives/ChartFrame.test.tsx +0 -142
  980. package/src/charts/primitives/ChartLegend.test.tsx +0 -78
  981. package/src/charts/primitives/ChartTooltip.test.tsx +0 -44
  982. package/src/charts/primitives/XZoneRects.test.tsx +0 -123
  983. package/src/charts/series.test.ts +0 -112
  984. package/src/charts/utils/domain.test.ts +0 -54
  985. package/src/charts/utils/measure-text.test.ts +0 -36
  986. package/src/cli/check-coverage.test.ts +0 -297
  987. package/src/cli/check-theme.test.ts +0 -837
  988. package/src/cli/help.test.ts +0 -170
  989. package/src/cli/init-sync.test.ts +0 -343
  990. package/src/cli/placement-engine.test.ts +0 -298
  991. package/src/cli/shipped-versions.test.ts +0 -83
  992. package/src/cli/tarball-parity.test.ts +0 -44
  993. package/src/cli/template-format.test.ts +0 -64
  994. package/src/cli/template-ledger.test.ts +0 -219
  995. package/src/cli/tokens-css.test.ts +0 -249
  996. package/src/cli/toolchain-wiring.test.ts +0 -1358
  997. package/src/cli/waiver-audit.test.ts +0 -215
  998. package/src/content/article-actions.test.ts +0 -78
  999. package/src/content/article-model.test.ts +0 -119
  1000. package/src/content/block-split.test.ts +0 -75
  1001. package/src/content/heading-components.test.tsx +0 -65
  1002. package/src/content/markdown.test.tsx +0 -603
  1003. package/src/content/prose.module.css.test.ts +0 -39
  1004. package/src/content/sanitize.test.ts +0 -659
  1005. package/src/content/slug.test.ts +0 -62
  1006. package/src/controls/actions.test.tsx +0 -252
  1007. package/src/controls/actions.type-guard.test.ts +0 -63
  1008. package/src/controls/control-group.test.tsx +0 -229
  1009. package/src/controls/controls.router.test.tsx +0 -637
  1010. package/src/controls/filter-set.test.tsx +0 -472
  1011. package/src/controls/peer-boundary.test.ts +0 -85
  1012. package/src/controls/props-contract.test.tsx +0 -106
  1013. package/src/controls/sync-button.test.tsx +0 -183
  1014. package/src/dashboard/query-state.test.tsx +0 -152
  1015. package/src/dashboard/settings-section.test.tsx +0 -56
  1016. package/src/dashboard/stat-card.test.tsx +0 -154
  1017. package/src/data/data-table.test.tsx +0 -434
  1018. package/src/guard/check-source.test.ts +0 -3355
  1019. package/src/guard/grace.test.ts +0 -149
  1020. package/src/guard/guard-hook.test.ts +0 -203
  1021. package/src/provider/index.test.tsx +0 -101
  1022. package/src/provider/lab-theme.test.ts +0 -147
  1023. package/src/query/error-message.test.ts +0 -67
  1024. package/src/router-tanstack/multi-search-param-store.test.ts +0 -124
  1025. package/src/router-tanstack/nav.test.ts +0 -111
  1026. package/src/router-tanstack/search-param-store.test.ts +0 -135
  1027. package/src/router-tanstack/search-store.router.test.tsx +0 -661
  1028. package/src/router-tanstack/search-store.test.ts +0 -418
  1029. package/src/router-tanstack/use-nav.test.tsx +0 -187
  1030. package/src/section/section.test.tsx +0 -204
  1031. package/src/shell/app-mobile-nav.test.tsx +0 -403
  1032. package/src/shell/app-sidebar.test.tsx +0 -509
  1033. package/src/shell/index.test.tsx +0 -428
  1034. package/src/shell/mobile-nav-model.test.ts +0 -517
  1035. package/src/shell/page-bar.test.tsx +0 -316
  1036. package/src/state/fields.test.tsx +0 -258
  1037. package/src/styles.floor.test.ts +0 -36
  1038. package/src/theme/border-coverage.test.ts +0 -272
  1039. package/src/theme/contrast.test.ts +0 -354
  1040. package/src/theme/ctl-theme.test.tsx +0 -275
  1041. package/src/theme/ctl-tier-coverage.test.ts +0 -170
  1042. package/src/theme/density-option.test.ts +0 -96
  1043. package/src/theme/density-relations.test.ts +0 -506
  1044. package/src/theme/derive-theme.test.ts +0 -101
  1045. package/src/theme/divider-law.test.ts +0 -259
  1046. package/src/theme/fonts-option.test.ts +0 -75
  1047. package/src/theme/icon-slot.test.tsx +0 -275
  1048. package/src/theme/layout-rhythm-css.test.ts +0 -72
  1049. package/src/theme/radius-option.test.ts +0 -86
  1050. package/src/theme/radius.test.ts +0 -142
  1051. package/src/theme/shadow-surfaces.test.ts +0 -488
  1052. package/src/theme/spacing.test.ts +0 -495
  1053. package/src/theme/use-basalt-spacing.test.tsx +0 -55
  1054. package/src/theme-lab/derive-controls.test.ts +0 -94
  1055. package/src/theme-lab/derive-state.test.ts +0 -71
  1056. package/src/theme-lab/theme-lab.test.ts +0 -46
  1057. package/src/tokens/build-fonts-css.test.ts +0 -52
  1058. package/src/tokens/build-radius-css.test.ts +0 -25
  1059. package/src/tokens/chart-margin.test.ts +0 -39
  1060. package/src/tokens/density.test.ts +0 -259
  1061. package/src/tokens/derive-radius.test.ts +0 -62
  1062. package/src/tokens/derive.test.ts +0 -30
  1063. package/src/tokens/palette.test.ts +0 -114
  1064. package/src/tokens/text-scale.test.ts +0 -51
  1065. package/src/vite-color-mix.test.ts +0 -46
  1066. package/src/vite.test.ts +0 -423
  1067. package/src/widget-header/delta-badge.test.tsx +0 -60
  1068. package/src/widget-header/no-mantine.test.ts +0 -33
  1069. package/src/widget-header/widget-header.test.tsx +0 -187
@@ -1,272 +0,0 @@
1
- /**
2
- * Border coverage — closes an ABSENCE the `check-theme` guard structurally cannot see.
3
- *
4
- * `check-theme`'s regex scans (src/guard/index.ts) can only flag violations that are PRESENT in
5
- * consumer source — a raw hex, an inline border, a `withBorder` on Card. They can never flag a
6
- * theme `.extend()` block that was simply never written: Button and ActionIcon shipped with NO
7
- * entry in `baseTheme.components` at all, so they silently fell through to Mantine's stock
8
- * `variant="default"` 1px hairline — a real, shipped bug (docs/DESIGN-SPEC.md doctrine inversion
9
- * #1: depth is `shadow-card`, never a hairline, for every default-variant panel/control; borders-
10
- * as-borders stay reserved for layout dividers). Nothing short of a mechanical inventory of
11
- * Mantine's OWN shipped CSS would have caught it before ship.
12
- *
13
- * This test IS that inventory: it enumerates every `@mantine/core` component whose shipped CSS
14
- * declares a real border (`border:` / `border-color:` / a directional `border-*:` / a `--*-bd`
15
- * custom property — never `border-radius`, which is shape, not edge) and asserts each one is
16
- * EITHER a themed key in `baseTheme.components` OR carries a written, reasoned entry in
17
- * `BORDER_ALLOWLIST` below. Mantine's CSS is resolved via the module system
18
- * (`import.meta.resolve('@mantine/core/styles.css')`), never a hardcoded `node_modules/.bun/…`
19
- * path, which differs per install/lockfile and would be brittle.
20
- *
21
- * THIS TEST IS DELIBERATELY COUPLED TO MANTINE'S INTERNAL CSS. A future Mantine upgrade that
22
- * introduces a new bordered component (or removes a border from an existing one) SHOULD fail this
23
- * test — that failure IS the point: it forces a deliberate theme-or-allowlist decision instead of
24
- * silently shipping a consumer-visible hairline the doctrine says shouldn't exist. Do NOT "fix" a
25
- * future failure here by loosening the scan, widening the regex, or bulk-allowlisting — classify
26
- * the new/changed component the same way every entry below was classified: read its shipped CSS,
27
- * decide whether the border is a real panel/control edge (theme it), a layout divider (allowlist),
28
- * or not a surface at all (allowlist), and write a one-line reason.
29
- */
30
- import { readdirSync, readFileSync } from 'node:fs'
31
- import { dirname, join } from 'node:path'
32
- import { fileURLToPath } from 'node:url'
33
- import * as MantineCore from '@mantine/core'
34
- import { describe, expect, test } from 'bun:test'
35
- import { baseTheme } from './index'
36
-
37
- // ── Mantine CSS resolution ──────────────────────────────────────────────────────────────────────
38
-
39
- // Resolved via the module system — never a hardcoded `node_modules/.bun/@mantine+core@…` path,
40
- // which differs per install/lockfile hash and would be brittle across machines/CI.
41
- const MANTINE_CORE_ROOT = dirname(fileURLToPath(import.meta.resolve('@mantine/core/styles.css')))
42
- const MANTINE_STYLES_DIR = join(MANTINE_CORE_ROOT, 'styles')
43
-
44
- // A real border declaration: `border:`, a directional `border-top/-bottom/-left/-right/-inline-
45
- // start/-inline-end/-block-start/-block-end(-color)?:`, `border-color:`/`border-width:`/
46
- // `border-style:`, or a `--*-bd` custom property. The negative lookbehind on `[\w-]` excludes a
47
- // property NAME that merely ENDS in "border" (`--mantine-color-default-border:`,
48
- // `--app-shell-border-color:`, `--blockquote-border:`) — those are variable DEFINITIONS, not a
49
- // rendered edge; the file only counts if it also uses that variable in an actual border-family
50
- // property, which the same regex catches at its own declaration site. `border-radius` never
51
- // matches — shape, not edge.
52
- const BORDER_DECLARATION =
53
- /(?<![\w-])border(-top|-bottom|-left|-right|-inline-start|-inline-end|-block-start|-block-end|-color|-width|-style)?\s*:|(?<![\w-])--[\w-]*-bd(-[\w-]+)?\s*:/
54
-
55
- /** True if `name` is a real, themeable `@mantine/core` factory-component export (`.extend`
56
- * exists) — filters out non-component CSS files (`default-css-variables`, `global`, `baseline`)
57
- * and internal, unexported support components (`InlineInput`) that happen to ship their own CSS
58
- * file but can never be a `theme.components` key. */
59
- function isThemeableComponent(name: string): boolean {
60
- const candidate = (MantineCore as Record<string, unknown>)[name]
61
- return typeof candidate === 'function' && 'extend' in candidate
62
- }
63
-
64
- /** Every `@mantine/core` component whose OWN shipped CSS file declares a real border, per
65
- * `BORDER_DECLARATION` above. Scans the non-layer `.css` files only (`*.layer.css` duplicates the
66
- * same declarations under Mantine's CSS-layers build; scanning both would just double-count). */
67
- function borderedMantineComponents(): string[] {
68
- const found: string[] = []
69
- for (const file of readdirSync(MANTINE_STYLES_DIR)) {
70
- if (!file.endsWith('.css') || file.endsWith('.layer.css')) continue
71
- const name = file.slice(0, -'.css'.length)
72
- if (!isThemeableComponent(name)) continue
73
- const text = readFileSync(join(MANTINE_STYLES_DIR, file), 'utf8')
74
- if (BORDER_DECLARATION.test(text)) found.push(name)
75
- }
76
- return found.toSorted()
77
- }
78
-
79
- // ── BORDER_ALLOWLIST ────────────────────────────────────────────────────────────────────────────
80
-
81
- type BorderAllowlistEntry = {
82
- readonly component: string
83
- /** `layout-divider`: the border IS the component's job — a structural boundary between regions/
84
- * rows/panes (DESIGN-SPEC's own carve-out: "Layout dividers … still use plain borders — only
85
- * card/control depth moved to shadow"). `not-a-surface`: a reset (`border: 0`/`none`), a shape/
86
- * affordance ring on a non-panel element, or content styling inside `Typography` prose — never a
87
- * `variant="default"` panel/control edge. */
88
- readonly kind: 'layout-divider' | 'not-a-surface'
89
- readonly reason: string
90
- }
91
-
92
- /**
93
- * The closed registry of bordered `@mantine/core` components the theme deliberately does NOT
94
- * theme, each with a one-line reason. Modeled on `GUARD_RULES` (src/guard/index.ts) / `SURFACES`
95
- * (src/surfaces.ts): every entry is real, reviewable, and reasoned — never a bare string array.
96
- */
97
- export const BORDER_ALLOWLIST: readonly BorderAllowlistEntry[] = [
98
- // ── Layout dividers ──────────────────────────────────────────────────────────────────────────
99
- {
100
- component: 'AppShell',
101
- kind: 'layout-divider',
102
- reason:
103
- 'Border is opt-in via [data-with-border] on individual navbar/header/footer/aside sections — a structural boundary between page regions, not a default-variant control.',
104
- },
105
- {
106
- component: 'Divider',
107
- kind: 'layout-divider',
108
- reason:
109
- 'The layout-divider primitive itself — its border-top/border-inline-start IS the line it draws; already reads the hairline token via the strict-surface lever.',
110
- },
111
- {
112
- component: 'Fieldset',
113
- kind: 'layout-divider',
114
- reason:
115
- 'A <fieldset> group container — the border groups related form fields into a labeled section (a structural boundary, like AppShell/Table), not a floating card. Both the default and filled variants intentionally keep the hairline.',
116
- },
117
- {
118
- component: 'Splitter',
119
- kind: 'layout-divider',
120
- reason:
121
- 'The resize-handle bar between two panes IS a divider by definition — it separates two layout regions.',
122
- },
123
- {
124
- component: 'Tree',
125
- kind: 'layout-divider',
126
- reason:
127
- 'border-top is a tree-line connector drawn between hierarchical rows (--tree-line-color) — a structural row-relationship indicator, the same family as Table row dividers, not a panel surface.',
128
- },
129
- {
130
- component: 'TreeSelect',
131
- kind: 'layout-divider',
132
- reason:
133
- 'Same tree-line connector as Tree (--ts-line-color) — a structural row-relationship indicator, not a panel surface.',
134
- },
135
- // ── Not a surface at all ─────────────────────────────────────────────────────────────────────
136
- {
137
- component: 'Alert',
138
- kind: 'not-a-surface',
139
- reason:
140
- 'No variant="default" exists for Alert (filled | light | outline | transparent | white); its default (light) variant already ships --alert-bd: 1px solid transparent — no stock hairline to fix.',
141
- },
142
- {
143
- component: 'Anchor',
144
- kind: 'not-a-surface',
145
- reason: 'A text link — border: 0 is a reset, never a rendered edge.',
146
- },
147
- {
148
- component: 'Avatar',
149
- kind: 'not-a-surface',
150
- reason:
151
- 'The root avatar ships --avatar-bd: 1px solid transparent by default; the one real border (AvatarGroup, a 2px page-bg ring) separates overlapping stacked circles, not a panel edge.',
152
- },
153
- {
154
- component: 'BackgroundImage',
155
- kind: 'not-a-surface',
156
- reason: 'border: 0 reset plus a shape-only border-radius var — never a rendered edge.',
157
- },
158
- {
159
- component: 'Blockquote',
160
- kind: 'not-a-surface',
161
- reason:
162
- "A typography/content primitive — border-inline-start is the quote's colored accent bar, its defining visual feature, not a stock hairline.",
163
- },
164
- {
165
- component: 'CheckboxIndicator',
166
- kind: 'not-a-surface',
167
- reason:
168
- "The checkbox glyph box itself — its border is the control's shape/affordance (a native-checkbox-style outline), not a panel edge. Already reads --vx-surface-border via the existing gray-4/dark-4 strict-surface lever.",
169
- },
170
- {
171
- component: 'ColorPicker',
172
- kind: 'not-a-surface',
173
- reason:
174
- 'The selected-swatch preview ring (2px solid white) is a shape/preview accent, not a panel.',
175
- },
176
- {
177
- component: 'ColorSwatch',
178
- kind: 'not-a-surface',
179
- reason: 'border: none — swatch grid tiles are shape-only (border-radius), no rendered edge.',
180
- },
181
- {
182
- component: 'Loader',
183
- kind: 'not-a-surface',
184
- reason:
185
- "The spinner ring's border-color IS the animated graphic itself — a utility/a11y element, not a panel surface.",
186
- },
187
- {
188
- component: 'RadioIndicator',
189
- kind: 'not-a-surface',
190
- reason:
191
- "Same as CheckboxIndicator — the radio glyph's own shape/affordance border, not a panel edge.",
192
- },
193
- {
194
- component: 'Slider',
195
- kind: 'not-a-surface',
196
- reason:
197
- "The draggable thumb's border is its shape/affordance (a handle needs a visible edge to grab), not a panel surface.",
198
- },
199
- {
200
- component: 'ThemeIcon',
201
- kind: 'not-a-surface',
202
- reason:
203
- 'Ships border: var(--ti-bd, 1px solid transparent) — transparent by default; --ti-bd is a call-site escape hatch, not a stock hairline.',
204
- },
205
- {
206
- component: 'Typography',
207
- kind: 'not-a-surface',
208
- reason:
209
- "Prose/content styling (hr/table/code/kbd borders) — styles user-authored rich-text content inside .mantine-Typography-root, not the app's own UI chrome.",
210
- },
211
- {
212
- component: 'UnstyledButton',
213
- kind: 'not-a-surface',
214
- reason:
215
- 'border: 0 reset — the deliberately bare base every other button-like component (Button, Chip, CheckboxCard, RadioCard, …) builds on.',
216
- },
217
- {
218
- component: 'VisuallyHidden',
219
- kind: 'not-a-surface',
220
- reason: 'border: 0 reset on an a11y-only, visually hidden element — never rendered at all.',
221
- },
222
- ]
223
-
224
- // ── Tests ────────────────────────────────────────────────────────────────────────────────────────
225
-
226
- describe('BORDER_ALLOWLIST is well-formed', () => {
227
- test('every entry has a non-empty reason', () => {
228
- for (const entry of BORDER_ALLOWLIST) {
229
- expect(entry.reason.length).toBeGreaterThan(0)
230
- }
231
- })
232
-
233
- test('no duplicate component entries', () => {
234
- const names = BORDER_ALLOWLIST.map((e) => e.component)
235
- expect(new Set(names).size).toBe(names.length)
236
- })
237
- })
238
-
239
- describe('every bordered @mantine/core component is themed or allowlisted', () => {
240
- // The coverage assertion below is `expect(gaps).toEqual([])`, which passes VACUOUSLY if the scan
241
- // finds nothing — a silently-empty scan would report full coverage while checking zero components.
242
- // That is not hypothetical: an early version of this file filtered on `typeof === 'object'` (Mantine
243
- // factory components are FUNCTIONS with a static `.extend`) and enumerated nothing while staying
244
- // green. This test is the tripwire: if a Mantine upgrade restructures the dist and the scan stops
245
- // resolving, fail loudly here rather than quietly nodding the real assertion through.
246
- test('the scan actually resolves Mantine components (guards against a vacuous pass)', () => {
247
- const found = borderedMantineComponents()
248
- expect(found.length).toBeGreaterThan(20)
249
- // Card is the canonical bordered surface and the origin of doctrine inversion #1 — if the scan
250
- // can't see IT, the scan is broken, whatever its count says.
251
- expect(found).toContain('Card')
252
- })
253
-
254
- test('doctrine inversion #1 (docs/DESIGN-SPEC.md §8) has no unaddressed gap', () => {
255
- const themed = new Set(Object.keys(baseTheme.components ?? {}))
256
- const allowlisted = new Set(BORDER_ALLOWLIST.map((e) => e.component))
257
-
258
- const gaps = borderedMantineComponents()
259
- .filter((name) => !themed.has(name) && !allowlisted.has(name))
260
- .map(
261
- (name) =>
262
- `${name}: ships a stock Mantine border (@mantine/core/styles/${name}.css) but is neither ` +
263
- `a key in baseTheme.components (src/theme/index.ts) nor an entry in BORDER_ALLOWLIST ` +
264
- `(src/theme/border-coverage.test.ts). Classify it: theme it (panel bg + ` +
265
- `box-shadow: var(--vx-shadow-card), no border, scoped to variant="default" or its ` +
266
- `equivalent), or allowlist it as a layout divider / not-a-surface with a written reason. ` +
267
- `See docs/DESIGN-SPEC.md doctrine inversion #1.`,
268
- )
269
-
270
- expect(gaps).toEqual([])
271
- })
272
- })
@@ -1,354 +0,0 @@
1
- /**
2
- * The color gate — three invariants the theme cannot express in types, only in measurements.
3
- *
4
- * 1. THE FILL BAND. A filled control does not invert across schemes, so its color must satisfy
5
- * both pages at once while carrying a white label: ≥4.5:1 for the label, ≥3:1 against each
6
- * page. That pins every fill into one narrow luminance window (see `FILL` / `ACCENT` in
7
- * tokens/palette.ts). Untuned, five families sat below the page floor and three needed black
8
- * labels.
9
- *
10
- * 2. SINGLE SOURCE. Mantine's chrome must read the `--vx-*` tokens, not its own JS hex ramp —
11
- * otherwise the palette is dual-sourced, and retuning a token (in the theme lab, or anywhere)
12
- * moves the charts while the buttons stay put. That was a real, shipped bug.
13
- *
14
- * 3. ON-COLOR. Mantine picks a filled surface's FOREGROUND in JS, once, via `parseThemeColor()`
15
- * with no `colorScheme` — and via a BT.601 brightness heuristic that does not track WCAG
16
- * contrast (it handed white to lime at 2.24:1). Basalt decides it in CSS instead, per scheme,
17
- * by measurement.
18
- *
19
- * These are THEME-RESOLUTION invariants, not call-site patterns — no lint rule can see them; the
20
- * gate has to compute the two colors that actually meet on screen and measure them. The WCAG math
21
- * below is deliberately a SECOND, independent implementation: the theme is checked against the
22
- * standard, never against its own helper.
23
- */
24
- import { DEFAULT_THEME, getPrimaryShade, mergeMantineTheme } from '@mantine/core'
25
- import type { MantineTheme } from '@mantine/core'
26
- import { describe, expect, test } from 'bun:test'
27
- import { ACCENT, FILL, STATUS, SURFACE } from '../tokens/palette'
28
- import { baseTheme, cssVariablesResolver } from './index'
29
-
30
- const theme: MantineTheme = mergeMantineTheme(DEFAULT_THEME, baseTheme)
31
- const SCHEMES = ['light', 'dark'] as const
32
- const COLORS = Object.keys(theme.colors)
33
- const AA = 4.5 // WCAG 2.x AA, normal-size text
34
-
35
- /** WCAG 2.x relative luminance. */
36
- function relativeLuminance(hex: string): number {
37
- const n = Number.parseInt(hex.slice(1), 16)
38
- const channels = [(n >> 16) & 255, (n >> 8) & 255, n & 255].map((c) => {
39
- const s = c / 255
40
- return s <= 0.03928 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4
41
- })
42
- return 0.2126 * channels[0]! + 0.7152 * channels[1]! + 0.0722 * channels[2]!
43
- }
44
-
45
- /** WCAG 2.x contrast ratio. */
46
- function contrastRatio(a: string, b: string): number {
47
- const [hi, lo] = [relativeLuminance(a), relativeLuminance(b)].toSorted((x, y) => y - x)
48
- return (hi! + 0.05) / (lo! + 0.05)
49
- }
50
-
51
- /** The hex a filled surface of `color` actually paints in `scheme`. */
52
- function filledBackground(color: string, scheme: 'light' | 'dark'): string {
53
- return theme.colors[color]![getPrimaryShade(theme, scheme)]!
54
- }
55
-
56
- /** The `--vx-on-{color}` declaration the CSS-variables resolver emits for `scheme`. */
57
- function onColorVar(color: string, scheme: 'light' | 'dark'): string {
58
- return cssVariablesResolver(theme)[scheme][`--vx-on-${color}`]!
59
- }
60
-
61
- /** The hex `--vx-on-{color}` ultimately resolves to. */
62
- function onColorHex(color: string, scheme: 'light' | 'dark'): string {
63
- const declaration = onColorVar(color, scheme)
64
- if (color === theme.primaryColor) return ACCENT.onAccent[scheme]
65
- return declaration === 'var(--mantine-color-black)' ? theme.black : theme.white
66
- }
67
-
68
- describe('--vx-on-* is emitted for every theme color, in both schemes', () => {
69
- for (const scheme of SCHEMES) {
70
- test(scheme, () => {
71
- for (const color of COLORS) expect(onColorVar(color, scheme)).toBeDefined()
72
- })
73
- }
74
- })
75
-
76
- describe('the accent delegates to the palette, not to a computed guess', () => {
77
- // `ACCENT.onAccent` is the spec's declared "text on an accent fill" — the token stays the single
78
- // source (a palette retune must move the chrome with it), with a generated per-scheme fallback
79
- // for the `injectPalette={false}` window before the palette <style> lands.
80
- for (const scheme of SCHEMES) {
81
- test(scheme, () => {
82
- expect(onColorVar(theme.primaryColor, scheme)).toBe(
83
- `var(--vx-on-accent, ${ACCENT.onAccent[scheme]})`,
84
- )
85
- })
86
- }
87
- })
88
-
89
- describe('--vx-on-accent has no collision with the per-color --vx-on-* family', () => {
90
- // The 1.4.0 kebab-case rename moved the token layer's `--vx-onAccent` to `--vx-on-accent`.
91
- // `onColorVars` (above) ALSO emits a `--vx-on-{name}` per Mantine color name — but `theme.colors`
92
- // never registers a color literally named `'accent'` (the primary color is `'blue'`), so that
93
- // family can never itself produce a `--vx-on-accent` key. The two stay distinct sources, not a
94
- // merge: `--vx-on-accent` is exclusively the token layer's `ACCENT.onAccent` alias target.
95
- test('theme.colors has no color named "accent"', () => {
96
- expect(COLORS).not.toContain('accent')
97
- })
98
-
99
- for (const scheme of SCHEMES) {
100
- test(`the resolver's own --vx-on-* map carries no accent key (${scheme})`, () => {
101
- const vars = cssVariablesResolver(theme)[scheme]
102
- expect(vars['--vx-on-accent']).toBeUndefined()
103
- })
104
- }
105
- })
106
-
107
- describe('every filled surface is legible against its on-color', () => {
108
- // The floor is structural, not tuned: contrast(bg, white) * contrast(bg, black) is a constant
109
- // (~17.9 for this black), so always taking the larger of the two cannot drop below ~4.23.
110
- const FLOOR = 4.2
111
-
112
- for (const scheme of SCHEMES) {
113
- for (const color of COLORS) {
114
- test(`${color} / ${scheme}`, () => {
115
- const ratio = contrastRatio(filledBackground(color, scheme), onColorHex(color, scheme))
116
- expect(ratio).toBeGreaterThanOrEqual(FLOOR)
117
- })
118
- }
119
- }
120
-
121
- // The accent carries the primary CTA's label — it clears full AA in both schemes, and the light
122
- // accent hex is pinned to the depth that makes that true (see `ACCENT` in tokens/palette.ts).
123
- for (const scheme of SCHEMES) {
124
- test(`accent clears AA (${scheme})`, () => {
125
- const ratio = contrastRatio(
126
- filledBackground(theme.primaryColor, scheme),
127
- onColorHex(theme.primaryColor, scheme),
128
- )
129
- expect(ratio).toBeGreaterThanOrEqual(AA)
130
- })
131
- }
132
-
133
- // The accent is also a LINK/icon color on the bare page, not just a fill — same AA bar.
134
- test('accent is AA-legible as text on the light page', () => {
135
- expect(contrastRatio(ACCENT.accent.light, '#fafafa')).toBeGreaterThanOrEqual(AA)
136
- })
137
- })
138
-
139
- describe('every non-accent on-color is the higher-contrast of black/white', () => {
140
- // The exact property Mantine's brightness heuristic violates: it hands white to saturated
141
- // mid-tones (lime `#97ba2e` at 2.24:1) where black scores 7.91:1.
142
- for (const scheme of SCHEMES) {
143
- for (const color of COLORS.filter((c) => c !== theme.primaryColor)) {
144
- test(`${color} / ${scheme}`, () => {
145
- const background = filledBackground(color, scheme)
146
- const chosen = onColorHex(color, scheme)
147
- const rejected = chosen === theme.white ? theme.black : theme.white
148
- expect(contrastRatio(background, chosen)).toBeGreaterThanOrEqual(
149
- contrastRatio(background, rejected),
150
- )
151
- })
152
- }
153
- }
154
- })
155
-
156
- describe('the accent is split by role: ink inverts, surface does not', () => {
157
- const PAGE = { light: '#fafafa', dark: '#232326' }
158
-
159
- test('the accent SURFACE is the same hex in both schemes', () => {
160
- // It is squeezed from both sides (white text vs. the fill, and the fill vs. the page), and on
161
- // the dark page those constraints leave a single narrow window — the same one that works on
162
- // light. So the fill does NOT invert, and its label is white in both schemes.
163
- expect(filledBackground(theme.primaryColor, 'light')).toBe(
164
- filledBackground(theme.primaryColor, 'dark'),
165
- )
166
- expect(onColorHex(theme.primaryColor, 'light')).toBe(theme.white)
167
- expect(onColorHex(theme.primaryColor, 'dark')).toBe(theme.white)
168
- })
169
-
170
- test('the accent INK does invert — it is read against the page, not against a fill', () => {
171
- expect(ACCENT.accent.light).not.toBe(ACCENT.accent.dark)
172
- for (const scheme of SCHEMES) {
173
- expect(contrastRatio(ACCENT.accent[scheme], PAGE[scheme])).toBeGreaterThanOrEqual(AA)
174
- }
175
- })
176
-
177
- for (const scheme of SCHEMES) {
178
- test(`the accent surface stays visible AGAINST the ${scheme} page`, () => {
179
- // The reason the fill is not simply darkened until white text is comfortable: at 3:1 (WCAG
180
- // non-text) the control must be distinguishable from the page. Darkening the fill further
181
- // buys white-text contrast but can drop this ratio below 3 — a button fading into the
182
- // background.
183
- const ratio = contrastRatio(filledBackground(theme.primaryColor, scheme), PAGE[scheme])
184
- expect(ratio).toBeGreaterThanOrEqual(3)
185
- })
186
- }
187
-
188
- test('a hovered accent surface keeps its white label legible', () => {
189
- expect(contrastRatio(ACCENT.accentFillHover.dark, theme.white)).toBeGreaterThanOrEqual(AA)
190
- })
191
- })
192
-
193
- describe('THE FILL BAND: every filled surface reads white, on either page', () => {
194
- // The law that replaces per-color judgement (see FILL in tokens/palette.ts). A fill does not
195
- // invert across schemes, so it must satisfy BOTH pages at once, while carrying a white label:
196
- // white label ≥ 4.5:1 against the fill → luminance ≤ 0.183
197
- // control ≥ 3.0:1 against each page → luminance ≥ 0.150 (the dark page is the binding one)
198
- // Untuned, five families sat under the page floor (grape 2.17:1) and three needed black labels.
199
- const PAGE = { light: '#fafafa', dark: '#232326' }
200
- const BAND = Object.keys(FILL).concat(theme.primaryColor)
201
-
202
- for (const color of BAND) {
203
- const fill = filledBackground(color, 'light')
204
-
205
- test(`${color}: white label clears AA`, () => {
206
- expect(onColorHex(color, 'light')).toBe(theme.white)
207
- expect(onColorHex(color, 'dark')).toBe(theme.white)
208
- expect(contrastRatio(fill, theme.white)).toBeGreaterThanOrEqual(AA)
209
- })
210
-
211
- test(`${color}: visible against BOTH pages`, () => {
212
- for (const scheme of SCHEMES) {
213
- expect(contrastRatio(fill, PAGE[scheme])).toBeGreaterThanOrEqual(3)
214
- }
215
- })
216
-
217
- test(`${color}: the JS ramp and the --vx-fill-* token agree`, () => {
218
- // Shade 6 is pinned to the band hex, so `-outline` / light `-text` (which read the ramp)
219
- // cannot drift away from the fill the CSS token paints.
220
- expect(filledBackground(color, 'dark')).toBe(fill)
221
- })
222
- }
223
- })
224
-
225
- describe('the accent is single-sourced: Mantine chrome is bridged to --vx-*', () => {
226
- for (const scheme of SCHEMES) {
227
- test(`every non-primary family bridges its fill (${scheme})`, () => {
228
- const vars = cssVariablesResolver(theme)[scheme]
229
- for (const [name, hex] of Object.entries(FILL)) {
230
- expect(vars[`--mantine-color-${name}-filled`]).toBe(`var(--vx-fill-${name}, ${hex})`)
231
- expect(vars[`--mantine-color-${name}-filled-hover`]).toContain(
232
- `var(--vx-fill-hover-${name},`,
233
- )
234
- }
235
- })
236
- }
237
-
238
- // Why the theme lab looked broken: the accent was DUAL-SOURCED. The `--vx-*` layer drove charts
239
- // and links; Mantine's chrome drove buttons off a JS hex ramp that pointed at nothing. Overriding
240
- // `--vx-accent` restyled the charts and left every button untouched. These lock the bridge.
241
- for (const scheme of SCHEMES) {
242
- test(`the filled surface resolves through --vx-accent-fill (${scheme})`, () => {
243
- const vars = cssVariablesResolver(theme)[scheme]
244
- // `getThemeColor()` resolves any plain theme color to `-filled`, so this ONE var reaches the
245
- // variant resolver AND every component that fills from its own varsResolver.
246
- expect(vars[`--mantine-color-${theme.primaryColor}-filled`]).toBe(
247
- `var(--vx-accent-fill, ${ACCENT.accentFill[scheme]})`,
248
- )
249
- expect(vars[`--mantine-color-${theme.primaryColor}-filled-hover`]).toBe(
250
- `var(--vx-accent-fill-hover, ${ACCENT.accentFillHover[scheme]})`,
251
- )
252
- })
253
-
254
- test(`the ink roles resolve through --vx-accent (${scheme})`, () => {
255
- const vars = cssVariablesResolver(theme)[scheme]
256
- for (const role of ['text', 'outline', 'light-color']) {
257
- expect(vars[`--mantine-color-${theme.primaryColor}-${role}`]).toBe(
258
- `var(--vx-accent, ${ACCENT.accent[scheme]})`,
259
- )
260
- }
261
- })
262
- }
263
- })
264
-
265
- describe('the variant resolver hands off to CSS, never to a baked color', () => {
266
- const resolve = (color: string) => theme.variantColorResolver({ color, theme, variant: 'filled' })
267
-
268
- for (const color of COLORS) {
269
- test(`filled ${color} resolves to var(--vx-on-${color})`, () => {
270
- const { color: foreground } = resolve(color)
271
- // The bug in one assertion: a scheme-blind literal here is unreadable in one of the schemes.
272
- expect(foreground).not.toBe('var(--mantine-color-white)')
273
- expect(foreground).toBe(`var(--vx-on-${color})`)
274
- })
275
- }
276
-
277
- test('an indexed color keeps the Mantine default — its fill is scheme-static', () => {
278
- expect(resolve('blue.9').color).toBe('var(--mantine-color-white)')
279
- })
280
-
281
- test('a raw hex keeps the Mantine default — nothing to resolve per scheme', () => {
282
- expect(resolve('#ff0000').color).toBe('var(--mantine-color-white)')
283
- })
284
-
285
- test('autoContrast:false at the call site is still honored', () => {
286
- const { color } = theme.variantColorResolver({
287
- color: 'blue',
288
- theme,
289
- variant: 'filled',
290
- autoContrast: false,
291
- })
292
- expect(color).toBe('var(--mantine-color-white)')
293
- })
294
- })
295
-
296
- describe('doctrine inversion #1 reaches every default-variant CONTROL, not just Card/Paper', () => {
297
- // `defaultVariantColorsResolver`'s `variant === 'default'` branch draws its border from this ONE
298
- // var (`border: 1px solid var(--mantine-color-default-border)`) for every component that uses
299
- // it — Button, ActionIcon, Chip, CheckboxCard, RadioCard, … A future edit that re-points this at
300
- // a hairline token would silently reintroduce the stock 1px border on all of them at once; this
301
- // is the seam that catches it, since none of those components render their border any other way.
302
- for (const scheme of SCHEMES) {
303
- test(`--mantine-color-default-border is transparent (${scheme})`, () => {
304
- const vars = cssVariablesResolver(theme)[scheme]
305
- expect(vars['--mantine-color-default-border']).toBe('transparent')
306
- })
307
- }
308
-
309
- test('a default-variant control resolves through the transparent border, not a hairline', () => {
310
- // The variant resolver itself doesn't special-case `default` (see the `basaltVariantColorResolver`
311
- // early return above) — it hands off to `defaultVariantColorsResolver`, which is what actually
312
- // reads the var. Assert the var is what a `default`-variant Button/ActionIcon border resolves
313
- // through, closing the loop from token to the real render-path seam.
314
- const { border } = theme.variantColorResolver({
315
- color: theme.primaryColor,
316
- theme,
317
- variant: 'default',
318
- })
319
- expect(border).toContain('solid var(--mantine-color-default-border)')
320
- expect(border).not.toContain('surface-border')
321
- })
322
- })
323
-
324
- describe("the StatCard tone rail reads against the panel it's drawn on", () => {
325
- // The rail (`dashboard/stat-card.tsx`) is a 3px non-text mark carrying a threshold verdict, so it
326
- // takes WCAG's 3:1 non-text floor against `--vx-surface-panel` — the card background it overlays,
327
- // not the page — in BOTH schemes. Worth measuring rather than eyeballing for the same reason the
328
- // fill band is: the status solids are DERIVED, so retuning the generator could sink one of them
329
- // into the panel it sits on without anything else failing.
330
- const TONES = ['good', 'warn', 'bad'] as const
331
-
332
- for (const scheme of SCHEMES) {
333
- for (const tone of TONES) {
334
- test(`${tone} / ${scheme}`, () => {
335
- expect(contrastRatio(STATUS[tone][scheme], SURFACE.panel[scheme])).toBeGreaterThanOrEqual(3)
336
- })
337
- }
338
- }
339
- })
340
-
341
- describe('the shipped palette is the generator output at DEFAULT_DERIVE_CONFIG', () => {
342
- // A handful of exact hexes from `deriveTokens(DEFAULT_DERIVE_CONFIG)` (`tokens/derive.ts`) — the
343
- // shipped default identity (seed #0077bd, zinc, all four knobs at level 0). Drift here means
344
- // either the derive constants moved or `palette.ts` stopped reading the generator's output.
345
- test('accentFill (light + dark, same hex)', () => {
346
- expect(ACCENT.accentFill.light).toBe('#4374a6')
347
- expect(ACCENT.accentFill.dark).toBe('#4374a6')
348
- })
349
-
350
- test('surface-bg', () => {
351
- expect(SURFACE.bg.light).toBe('#f2f2f5')
352
- expect(SURFACE.bg.dark).toBe('#27272a')
353
- })
354
- })