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,837 +0,0 @@
1
- /**
2
- * Tests for the `basalt check-theme` guard — specifically the `raw-surface` check that flags
3
- * ad-hoc inline surface styling (border / borderRadius / boxShadow) in consumer code.
4
- *
5
- * `checkTheme(cwd)` scans the configured `roots` (from the consumer package.json `"basalt"` key)
6
- * and returns 0 (clean) / 1 (violations), printing findings to stderr. Each case writes a tiny
7
- * fixture repo into a temp dir, runs the guard against it, and asserts on the exit code plus the
8
- * captured `raw-surface` lines.
9
- */
10
- import { afterEach, beforeEach, describe, expect, it } from 'bun:test'
11
- import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
12
- import { tmpdir } from 'node:os'
13
- import { resolve } from 'node:path'
14
-
15
- import { checkTheme } from './index.ts'
16
-
17
- let dir: string
18
-
19
- /** Write a consumer fixture: a package.json pointing `roots` at `src`, plus one component file. */
20
- function fixture(source: string, basalt: Record<string, unknown> = { roots: ['src'] }): void {
21
- writeFileSync(resolve(dir, 'package.json'), JSON.stringify({ name: 'fixture', basalt }))
22
- mkdirSync(resolve(dir, 'src'), { recursive: true })
23
- writeFileSync(resolve(dir, 'src', 'Card.tsx'), source)
24
- }
25
-
26
- /**
27
- * Write a consumer fixture at an arbitrary path under the scanned root (e.g. a `charts/` subdir),
28
- * so the path-gated `raw-visx-axis` guard can be exercised. `relPath` is relative to `src`.
29
- */
30
- function fixtureAt(
31
- relPath: string,
32
- source: string,
33
- basalt: Record<string, unknown> = { roots: ['src'] },
34
- ): void {
35
- writeFileSync(resolve(dir, 'package.json'), JSON.stringify({ name: 'fixture', basalt }))
36
- const abs = resolve(dir, 'src', relPath)
37
- mkdirSync(resolve(abs, '..'), { recursive: true })
38
- writeFileSync(abs, source)
39
- }
40
-
41
- /** Run the guard against the fixture, capturing stderr so we can assert on the emitted kinds. */
42
- function run(): { code: number; err: string } {
43
- const original = console.error
44
- let err = ''
45
- console.error = (...args: unknown[]) => {
46
- err += `${args.join(' ')}\n`
47
- }
48
- try {
49
- return { code: checkTheme(dir), err }
50
- } finally {
51
- console.error = original
52
- }
53
- }
54
-
55
- beforeEach(() => {
56
- dir = mkdtempSync(resolve(tmpdir(), 'basalt-check-theme-'))
57
- })
58
-
59
- afterEach(() => {
60
- rmSync(dir, { recursive: true, force: true })
61
- })
62
-
63
- describe('check-theme raw-surface', () => {
64
- it('flags a raw inline border literal', () => {
65
- fixture(`export const C = () => <div style={{ border: '1px solid #ccc' }} />\n`)
66
- const { code, err } = run()
67
- expect(code).toBe(1)
68
- expect(err).toContain('raw-surface')
69
- })
70
-
71
- it('flags a numeric borderRadius literal', () => {
72
- fixture(`export const C = () => <div style={{ borderRadius: 8 }} />\n`)
73
- const { code, err } = run()
74
- expect(code).toBe(1)
75
- expect(err).toContain('raw-surface')
76
- })
77
-
78
- it('flags a boxShadow literal', () => {
79
- fixture(`export const C = () => <div style={{ boxShadow: '0 1px 3px rgba(0,0,0,.2)' }} />\n`)
80
- const { code, err } = run()
81
- expect(code).toBe(1)
82
- expect(err).toContain('raw-surface')
83
- })
84
-
85
- it('does NOT flag a line carrying a theme-allow comment', () => {
86
- fixture(
87
- `export const C = () => <div style={{ borderRadius: 8 }} /> // theme-allow raw-surface — legacy widget\n`,
88
- )
89
- const { code, err } = run()
90
- expect(code).toBe(0)
91
- expect(err).not.toContain('raw-surface')
92
- })
93
-
94
- it('does NOT flag a var(--…) radius token', () => {
95
- fixture(`export const C = () => <div style={{ borderRadius: 'var(--vx-radius-card)' }} />\n`)
96
- const { code, err } = run()
97
- expect(code).toBe(0)
98
- expect(err).not.toContain('raw-surface')
99
- })
100
-
101
- it('does NOT flag a var(--…) border token (regression: var() not adjacent to the quote)', () => {
102
- // Use a Mantine component (not a raw <div>) so this isolates raw-surface's var() lookahead
103
- // without also tripping the raw-html-layout guard (border is a layout/surface prop).
104
- fixture(
105
- `export const C = () => <Box style={{ border: '1px solid var(--vx-surface-border)' }} />\n`,
106
- )
107
- const { code, err } = run()
108
- expect(code).toBe(0)
109
- expect(err).not.toContain('raw-surface')
110
- })
111
-
112
- it('does NOT flag a var(--…) boxShadow token (regression)', () => {
113
- fixture(`export const C = () => <div style={{ boxShadow: 'var(--vx-shadow-card)' }} />\n`)
114
- const { code, err } = run()
115
- expect(code).toBe(0)
116
- expect(err).not.toContain('raw-surface')
117
- expect(err).not.toContain('surface-shadow-override')
118
- })
119
-
120
- it('does NOT flag a Mantine radius="md" prop (not inline surface styling)', () => {
121
- fixture(`export const C = () => <Card radius="md" />\n`)
122
- const { code, err } = run()
123
- expect(code).toBe(0)
124
- expect(err).not.toContain('raw-surface')
125
- })
126
-
127
- it('does NOT flag an unrelated inline style (display: flex)', () => {
128
- // A Mantine component with an inline flex/padding is not raw-surface. (display/spacing on a raw
129
- // <div> is covered by the dedicated inline-display / raw-html-layout / inline-spacing checks.)
130
- fixture(`export const C = () => <Box style={{ display: 'flex', padding: 8 }} />\n`, {
131
- roots: ['src'],
132
- inlineDisplay: false,
133
- inlineSpacing: false,
134
- })
135
- const { code, err } = run()
136
- expect(code).toBe(0)
137
- expect(err).not.toContain('raw-surface')
138
- })
139
-
140
- it('respects the rawSurface:false config knob', () => {
141
- fixture(`export const C = () => <div style={{ borderRadius: 8 }} />\n`, {
142
- roots: ['src'],
143
- rawSurface: false,
144
- })
145
- const { code, err } = run()
146
- expect(code).toBe(0)
147
- expect(err).not.toContain('raw-surface')
148
- })
149
- })
150
-
151
- describe('check-theme card-with-border', () => {
152
- it('fails the build on withBorder on a Card', () => {
153
- fixture(`export const C = () => <Card padding="md" withBorder />\n`)
154
- const { code, err } = run()
155
- expect(code).toBe(1)
156
- expect(err).toContain('card-with-border')
157
- })
158
-
159
- it('does NOT flag a Card that takes its depth from the theme', () => {
160
- fixture(`export const C = () => <Card padding="md" />\n`)
161
- const { code, err } = run()
162
- expect(code).toBe(0)
163
- expect(err).not.toContain('card-with-border')
164
- })
165
-
166
- it('respects the cardWithBorder:false config knob', () => {
167
- fixture(`export const C = () => <Card withBorder />\n`, {
168
- roots: ['src'],
169
- cardWithBorder: false,
170
- })
171
- const { code, err } = run()
172
- expect(code).toBe(0)
173
- expect(err).not.toContain('card-with-border')
174
- })
175
- })
176
-
177
- describe('check-theme off-system-surface-var', () => {
178
- it('flags a raw Mantine gray ramp step used for surface color', () => {
179
- fixture(
180
- `export const C = () => <Box style={{ borderColor: 'var(--mantine-color-gray-3)' }} />\n`,
181
- )
182
- const { code, err } = run()
183
- expect(code).toBe(1)
184
- expect(err).toContain('off-system-surface-var')
185
- })
186
-
187
- it('flags a raw Mantine dark ramp step', () => {
188
- fixture(`export const C = () => <Box bg="var(--mantine-color-dark-6)" />\n`)
189
- const { code, err } = run()
190
- expect(code).toBe(1)
191
- expect(err).toContain('off-system-surface-var')
192
- })
193
-
194
- it('does NOT flag a --vx-surface-* token', () => {
195
- fixture(`export const C = () => <Box bg="var(--vx-surface-panel)" />\n`)
196
- const { code, err } = run()
197
- expect(code).toBe(0)
198
- expect(err).not.toContain('off-system-surface-var')
199
- })
200
-
201
- it('does NOT flag a named Mantine surface var (default-border)', () => {
202
- fixture(`export const C = () => <Box bg="var(--mantine-color-default-border)" />\n`)
203
- const { code, err } = run()
204
- expect(code).toBe(0)
205
- expect(err).not.toContain('off-system-surface-var')
206
- })
207
-
208
- it('respects the offSystemSurfaceVar:false config knob', () => {
209
- fixture(`export const C = () => <Box bg="var(--mantine-color-gray-3)" />\n`, {
210
- roots: ['src'],
211
- offSystemSurfaceVar: false,
212
- })
213
- const { code, err } = run()
214
- expect(code).toBe(0)
215
- expect(err).not.toContain('off-system-surface-var')
216
- })
217
-
218
- it('does NOT flag a line carrying a theme-allow comment', () => {
219
- fixture(
220
- `export const C = () => <Box bg="var(--mantine-color-gray-3)" /> // theme-allow off-system-surface-var — legacy\n`,
221
- )
222
- const { code, err } = run()
223
- expect(code).toBe(0)
224
- expect(err).not.toContain('off-system-surface-var')
225
- })
226
- })
227
-
228
- describe('check-theme raw-html-layout', () => {
229
- it('flags a raw <div> with inline layout styling', () => {
230
- fixture(`export const C = () => <div style={{ display: 'flex', gap: 8 }} />\n`)
231
- const { code, err } = run()
232
- expect(code).toBe(1)
233
- expect(err).toContain('raw-html-layout')
234
- })
235
-
236
- it('flags a raw <section> with inline padding', () => {
237
- fixture(`export const C = () => <section style={{ padding: 16 }}>x</section>\n`)
238
- const { code, err } = run()
239
- expect(code).toBe(1)
240
- expect(err).toContain('raw-html-layout')
241
- })
242
-
243
- it('does NOT flag a bare <div ref={...}> with no style', () => {
244
- fixture(`export const C = (r) => <div ref={r} className="x" />\n`)
245
- const { code, err } = run()
246
- expect(code).toBe(0)
247
- expect(err).not.toContain('raw-html-layout')
248
- })
249
-
250
- it('does NOT flag an <img> (not a layout element)', () => {
251
- fixture(`export const C = () => <img style={{ width: 40, height: 40 }} src="a.png" />\n`)
252
- const { code, err } = run()
253
- expect(code).toBe(0)
254
- expect(err).not.toContain('raw-html-layout')
255
- })
256
-
257
- it('respects the rawHtmlLayout:false config knob', () => {
258
- fixture(`export const C = () => <div style={{ display: 'flex' }} />\n`, {
259
- roots: ['src'],
260
- rawHtmlLayout: false,
261
- // disable the overlapping checks so we isolate raw-html-layout
262
- inlineDisplay: false,
263
- })
264
- const { code, err } = run()
265
- expect(code).toBe(0)
266
- expect(err).not.toContain('raw-html-layout')
267
- })
268
-
269
- it('does NOT flag a line carrying a theme-allow comment', () => {
270
- fixture(
271
- `export const C = () => <div style={{ display: 'flex' }} /> // theme-allow raw-html-layout inline-display — legacy\n`,
272
- )
273
- const { code, err } = run()
274
- expect(code).toBe(0)
275
- expect(err).not.toContain('raw-html-layout')
276
- })
277
- })
278
-
279
- describe('check-theme inline-spacing', () => {
280
- it('flags an inline padding literal', () => {
281
- fixture(`export const C = () => <Box style={{ padding: 16 }} />\n`)
282
- const { code, err } = run()
283
- expect(code).toBe(1)
284
- expect(err).toContain('inline-spacing')
285
- })
286
-
287
- it('flags an inline marginTop string literal', () => {
288
- fixture(`export const C = () => <Box style={{ marginTop: '12px' }} />\n`)
289
- const { code, err } = run()
290
- expect(code).toBe(1)
291
- expect(err).toContain('inline-spacing')
292
- })
293
-
294
- it('does NOT flag a zero value', () => {
295
- fixture(`export const C = () => <Box style={{ padding: 0, color: 'red' }} />\n`)
296
- const { err } = run()
297
- expect(err).not.toContain('inline-spacing')
298
- })
299
-
300
- it('does NOT flag a var(--…) gap token', () => {
301
- fixture(`export const C = () => <Box style={{ gap: 'var(--mantine-spacing-md)' }} />\n`)
302
- const { err } = run()
303
- expect(err).not.toContain('inline-spacing')
304
- })
305
-
306
- it('respects the inlineSpacing:false config knob', () => {
307
- fixture(`export const C = () => <Box style={{ padding: 16 }} />\n`, {
308
- roots: ['src'],
309
- inlineSpacing: false,
310
- })
311
- const { err } = run()
312
- expect(err).not.toContain('inline-spacing')
313
- })
314
-
315
- it('does NOT flag a line carrying a theme-allow comment', () => {
316
- fixture(`export const C = () => <Box style={{ padding: 16 }} /> // theme-allow\n`)
317
- const { err } = run()
318
- expect(err).not.toContain('inline-spacing')
319
- })
320
- })
321
-
322
- describe('check-theme inline-display', () => {
323
- it('flags an inline display:flex', () => {
324
- fixture(`export const C = () => <Box style={{ display: 'flex' }} />\n`)
325
- const { code, err } = run()
326
- expect(code).toBe(1)
327
- expect(err).toContain('inline-display')
328
- })
329
-
330
- it('flags an inline display:grid', () => {
331
- fixture(`export const C = () => <Box style={{ display: "grid" }} />\n`)
332
- const { code, err } = run()
333
- expect(code).toBe(1)
334
- expect(err).toContain('inline-display')
335
- })
336
-
337
- it('does NOT flag display:block', () => {
338
- fixture(`export const C = () => <Box style={{ display: 'block' }} />\n`)
339
- const { err } = run()
340
- expect(err).not.toContain('inline-display')
341
- })
342
-
343
- it('respects the inlineDisplay:false config knob', () => {
344
- fixture(`export const C = () => <Box style={{ display: 'flex' }} />\n`, {
345
- roots: ['src'],
346
- inlineDisplay: false,
347
- })
348
- const { err } = run()
349
- expect(err).not.toContain('inline-display')
350
- })
351
-
352
- it('does NOT flag a line carrying a theme-allow comment', () => {
353
- fixture(`export const C = () => <Box style={{ display: 'flex' }} /> // theme-allow\n`)
354
- const { err } = run()
355
- expect(err).not.toContain('inline-display')
356
- })
357
- })
358
-
359
- describe('check-theme raw-visx-axis', () => {
360
- it('flags a raw <AxisLeft> in a chart file', () => {
361
- fixtureAt(
362
- 'charts/kinds/Foo.tsx',
363
- `export const Foo = () => <AxisLeft scale={s} numTicks={4} />\n`,
364
- )
365
- const { code, err } = run()
366
- expect(code).toBe(1)
367
- expect(err).toContain('raw-visx-axis')
368
- })
369
-
370
- it('flags a raw <AxisBottom> and <AxisRight> in a chart file', () => {
371
- fixtureAt(
372
- 'charts/kinds/Foo.tsx',
373
- `export const Foo = () => (\n <>\n <AxisBottom scale={x} />\n <AxisRight scale={y} />\n </>\n)\n`,
374
- )
375
- const { code, err } = run()
376
- expect(code).toBe(1)
377
- expect(err).toContain('raw-visx-axis')
378
- })
379
-
380
- it('does NOT flag a chart-path <AxisLeft> carrying a theme-allow comment', () => {
381
- fixtureAt(
382
- 'charts/kinds/Foo.tsx',
383
- `export const Foo = () => <AxisLeft scale={s} /> // theme-allow raw-visx-axis — bespoke dual-panel\n`,
384
- )
385
- const { code, err } = run()
386
- expect(code).toBe(0)
387
- expect(err).not.toContain('raw-visx-axis')
388
- })
389
-
390
- it('does NOT flag a raw <AxisLeft> in a NON-chart path', () => {
391
- fixtureAt('widgets/Foo.tsx', `export const Foo = () => <AxisLeft scale={s} />\n`)
392
- const { code, err } = run()
393
- expect(code).toBe(0)
394
- expect(err).not.toContain('raw-visx-axis')
395
- })
396
-
397
- it('does NOT flag AxisLeftNumeric usage in a chart file', () => {
398
- fixtureAt(
399
- 'charts/kinds/Foo.tsx',
400
- `export const Foo = () => <AxisLeftNumeric scale={s} numTicks={4} />\n`,
401
- )
402
- const { code, err } = run()
403
- expect(code).toBe(0)
404
- expect(err).not.toContain('raw-visx-axis')
405
- })
406
-
407
- it('does NOT flag raw <AxisLeft> in the Axes.tsx wrapper primitive', () => {
408
- fixtureAt(
409
- 'charts/primitives/Axes.tsx',
410
- `export const AxisLeftNumeric = (p) => <AxisLeft {...p} />\n`,
411
- )
412
- const { code, err } = run()
413
- expect(code).toBe(0)
414
- expect(err).not.toContain('raw-visx-axis')
415
- })
416
-
417
- it('respects the rawVisxAxis:false config knob', () => {
418
- fixtureAt('charts/kinds/Foo.tsx', `export const Foo = () => <AxisLeft scale={s} />\n`, {
419
- roots: ['src'],
420
- rawVisxAxis: false,
421
- })
422
- const { code, err } = run()
423
- expect(code).toBe(0)
424
- expect(err).not.toContain('raw-visx-axis')
425
- })
426
- })
427
-
428
- describe('check-theme unframed-chart', () => {
429
- it('flags a hand-rolled <ChartLegend items={[...]}> array literal', () => {
430
- fixtureAt(
431
- 'charts/kinds/Foo.tsx',
432
- `export const Foo = () => <ChartLegend items={[{ key: 'a', label: 'A', color: '#fff' }]} />\n`,
433
- )
434
- const { code, err } = run()
435
- expect(code).toBe(1)
436
- expect(err).toContain('unframed-chart')
437
- })
438
-
439
- it('flags a hand-rolled legend array literal formatted across multiple lines', () => {
440
- fixtureAt(
441
- 'charts/kinds/Foo.tsx',
442
- [
443
- 'export const Foo = () => (',
444
- ' <ChartLegend',
445
- " items={[{ key: 'a', label: 'A', color: VX.line }]}",
446
- ' placement="bottom"',
447
- ' />',
448
- ')',
449
- '',
450
- ].join('\n'),
451
- )
452
- const { code, err } = run()
453
- expect(code).toBe(1)
454
- expect(err).toContain('unframed-chart')
455
- })
456
-
457
- it('does NOT flag a derived legend (items={deriveLegend(series)})', () => {
458
- fixtureAt(
459
- 'charts/primitives/ChartFrame.tsx',
460
- [
461
- 'export const Foo = () => (',
462
- ' <ChartLegend',
463
- ' items={deriveLegend(series)}',
464
- ' placement={placement}',
465
- ' />',
466
- ')',
467
- '',
468
- ].join('\n'),
469
- )
470
- const { code, err } = run()
471
- expect(code).toBe(0)
472
- expect(err).not.toContain('unframed-chart')
473
- })
474
-
475
- it('does NOT flag an unrelated items={[...]} prop on a non-ChartLegend component', () => {
476
- fixtureAt('widgets/Menu.tsx', `export const Foo = () => <Menu items={[{ label: 'a' }]} />\n`)
477
- const { code, err } = run()
478
- expect(code).toBe(0)
479
- expect(err).not.toContain('unframed-chart')
480
- })
481
-
482
- it('respects the unframedChart:false config knob', () => {
483
- fixtureAt(
484
- 'charts/kinds/Foo.tsx',
485
- `export const Foo = () => <ChartLegend items={[{ key: 'a', label: 'A' }]} />\n`,
486
- { roots: ['src'], unframedChart: false },
487
- )
488
- const { code, err } = run()
489
- expect(code).toBe(0)
490
- expect(err).not.toContain('unframed-chart')
491
- })
492
-
493
- it('does NOT flag a line carrying a theme-allow comment', () => {
494
- fixtureAt(
495
- 'charts/kinds/Foo.tsx',
496
- `export const Foo = () => <ChartLegend items={[{ key: 'a', label: 'A' }]} /> // theme-allow unframed-chart — bespoke legend\n`,
497
- )
498
- const { code, err } = run()
499
- expect(code).toBe(0)
500
- expect(err).not.toContain('unframed-chart')
501
- })
502
- })
503
-
504
- describe('check-theme raw-form-control', () => {
505
- it('fails the build on a raw <input>', () => {
506
- fixture(`export const C = () => <input type="text" value={v} />\n`)
507
- const { code, err } = run()
508
- expect(code).toBe(1)
509
- expect(err).toContain('raw-form-control')
510
- })
511
-
512
- it('fails the build on a raw <select>', () => {
513
- fixture(`export const C = () => <select value={v}><option>A</option></select>\n`)
514
- const { code, err } = run()
515
- expect(code).toBe(1)
516
- expect(err).toContain('raw-form-control')
517
- })
518
-
519
- it('fails the build on a raw <textarea>', () => {
520
- fixture(`export const C = () => <textarea value={v} />\n`)
521
- const { code, err } = run()
522
- expect(code).toBe(1)
523
- expect(err).toContain('raw-form-control')
524
- })
525
-
526
- it('does NOT flag a Mantine TextInput', () => {
527
- fixture(`export const C = () => <TextInput value={v} onChange={onChange} />\n`)
528
- const { code, err } = run()
529
- expect(code).toBe(0)
530
- expect(err).not.toContain('raw-form-control')
531
- })
532
-
533
- it('respects the rawFormControl:false config knob', () => {
534
- fixture(`export const C = () => <input type="text" />\n`, {
535
- roots: ['src'],
536
- rawFormControl: false,
537
- })
538
- const { code, err } = run()
539
- expect(code).toBe(0)
540
- expect(err).not.toContain('raw-form-control')
541
- })
542
-
543
- it('does NOT flag a line carrying a theme-allow comment', () => {
544
- fixture(
545
- `export const C = () => <input type="text" /> // theme-allow raw-form-control — legacy widget\n`,
546
- )
547
- const { code, err } = run()
548
- expect(code).toBe(0)
549
- expect(err).not.toContain('raw-form-control')
550
- })
551
- })
552
-
553
- describe('check-theme sub-16-input-font', () => {
554
- it('fails the build on a sub-16 inline fontSize on a raw <input>', () => {
555
- fixture(`export const C = () => <input style={{ fontSize: 13, border: 'none' }} />\n`, {
556
- roots: ['src'],
557
- rawFormControl: false,
558
- })
559
- const { code, err } = run()
560
- expect(code).toBe(1)
561
- expect(err).toContain('sub-16-input-font')
562
- })
563
-
564
- it('fails the build on a Mantine styles={{ input: { fontSize } }} override', () => {
565
- fixture(`export const C = () => <TextInput styles={{ input: { fontSize: 12 } }} />\n`)
566
- const { code, err } = run()
567
- expect(code).toBe(1)
568
- expect(err).toContain('sub-16-input-font')
569
- })
570
-
571
- it('does NOT flag sub-16-input-font on a <Text> (not a form control)', () => {
572
- // The literal itself is still a raw font-size, so `inline-font-size` (an independent kind,
573
- // no `sub16InputFont` gate) reports it — only `sub-16-input-font`'s form-control scoping is
574
- // under test here.
575
- fixture(`export const C = () => <Text style={{ fontSize: 12 }}>caption</Text>\n`)
576
- const { code, err } = run()
577
- expect(code).toBe(1)
578
- expect(err).not.toContain('sub-16-input-font')
579
- expect(err).toContain('inline-font-size')
580
- })
581
-
582
- it('does NOT flag sub-16-input-font on a <span> (not a form control)', () => {
583
- // Same as the <Text> case above: `inline-font-size` fires independently of the form-control
584
- // scoping this test verifies for `sub-16-input-font`.
585
- fixture(`export const C = () => <span style={{ fontSize: 11 }}>micro</span>\n`)
586
- const { code, err } = run()
587
- expect(code).toBe(1)
588
- expect(err).not.toContain('sub-16-input-font')
589
- expect(err).toContain('inline-font-size')
590
- })
591
-
592
- it('respects the sub16InputFont:false config knob', () => {
593
- // `inline-font-size` has no config knob and fires on any raw literal regardless — only
594
- // `sub-16-input-font` itself is under test here.
595
- fixture(`export const C = () => <input style={{ fontSize: 12 }} />\n`, {
596
- roots: ['src'],
597
- rawFormControl: false,
598
- sub16InputFont: false,
599
- })
600
- const { code, err } = run()
601
- expect(code).toBe(1)
602
- expect(err).not.toContain('sub-16-input-font')
603
- expect(err).toContain('inline-font-size')
604
- })
605
-
606
- it('does NOT flag a line carrying a theme-allow comment', () => {
607
- // Names both kinds the literal can trip: sub-16-input-font (scoped by rawFormControl above)
608
- // and inline-font-size (ungated, fires on the literal regardless of element).
609
- fixture(
610
- `export const C = () => <input style={{ fontSize: 12 }} /> // theme-allow sub-16-input-font inline-font-size — legacy widget\n`,
611
- { roots: ['src'], rawFormControl: false },
612
- )
613
- const { code, err } = run()
614
- expect(code).toBe(0)
615
- expect(err).not.toContain('sub-16-input-font')
616
- })
617
- })
618
-
619
- describe('check-theme roots fail-loud', () => {
620
- it('exits non-zero when the built-in default roots match zero files', () => {
621
- // No "basalt.roots" in package.json — falls back to the built-in default (`src`), which
622
- // doesn't exist under this fixture at all (the fixture dir has no src/ of its own here).
623
- writeFileSync(resolve(dir, 'package.json'), JSON.stringify({ name: 'fixture' }))
624
- const { code, err } = run()
625
- expect(code).toBe(1)
626
- expect(err).toContain('basalt.roots')
627
- })
628
-
629
- it('exits non-zero when explicitly configured roots match zero files', () => {
630
- writeFileSync(
631
- resolve(dir, 'package.json'),
632
- JSON.stringify({ name: 'fixture', basalt: { roots: ['nonexistent-dir'] } }),
633
- )
634
- const { code, err } = run()
635
- expect(code).toBe(1)
636
- expect(err).toContain('nonexistent-dir')
637
- })
638
-
639
- it('stays green when the configured roots match at least one file', () => {
640
- fixture(`export const C = () => <Box p="md" />\n`)
641
- const { code } = run()
642
- expect(code).toBe(0)
643
- })
644
-
645
- it('scans a plain src/ layout by default with no "basalt.roots" configured', () => {
646
- // The built-in default root is `src` (a generic single-app layout), not an argo-shaped path
647
- // like `apps/dashboard/src` — a bare consumer with a normal src/ tree scans out of the box.
648
- writeFileSync(resolve(dir, 'package.json'), JSON.stringify({ name: 'fixture' }))
649
- mkdirSync(resolve(dir, 'src'), { recursive: true })
650
- writeFileSync(resolve(dir, 'src', 'Card.tsx'), `export const C = () => <Box p="md" />\n`)
651
- const { code } = run()
652
- expect(code).toBe(0)
653
- })
654
- })
655
-
656
- describe('check-theme scans .css', () => {
657
- it('flags a raw hex in a CSS module the walker collects', () => {
658
- fixtureAt('theme/controls.module.css', '.input {\n color: #ff0000;\n}\n')
659
- const { code, err } = run()
660
- expect(code).toBe(1)
661
- expect(err).toContain('raw-hex')
662
- expect(err).toContain('controls.module.css')
663
- })
664
-
665
- it('does NOT false-positive a JSX-shaped rule on genuine CSS', () => {
666
- // `border-radius: 8px` is a genuine, unrelated `css-raw-surface` violation (a raw literal
667
- // with no `--vx-radius-*` token) — the point of this test is that the JSX-shaped rules
668
- // (`inline-display`, `raw-html-layout`) do not also fire on plain CSS syntax.
669
- fixtureAt(
670
- 'theme/controls.module.css',
671
- '.foo {\n display: flex;\n border-radius: var(--vx-radius-card);\n}\n',
672
- )
673
- const { code, err } = run()
674
- expect(code).toBe(0)
675
- expect(err).not.toContain('inline-display')
676
- expect(err).not.toContain('raw-html-layout')
677
- expect(err).not.toContain('css-raw-surface')
678
- })
679
- })
680
-
681
- // Round 9, rollhook: `SCANNABLE_EXT` stopped at `tsx?|css|html?|webmanifest`, so the marketing
682
- // site's two `.astro` templates — its ENTIRE markup layer — were never opened, and check-theme
683
- // reported a clean 4-file scan. `.jsx` and `.vue` were missing from the same regex, so a plain-JS
684
- // or Vue consumer was unguarded end to end.
685
- describe('check-theme scans the component extensions it was skipping', () => {
686
- it('flags a raw hex in an .astro template', () => {
687
- fixtureAt('pages/index.astro', '<style>\n .hero { color: #ff0000; }\n</style>\n')
688
- const { code, err } = run()
689
- expect(code).toBe(1)
690
- expect(err).toContain('raw-hex')
691
- expect(err).toContain('index.astro')
692
- })
693
-
694
- it('flags a raw hex in a .vue single-file component', () => {
695
- fixtureAt('components/Hero.vue', '<style>\n .hero { color: #ff0000; }\n</style>\n')
696
- const { code, err } = run()
697
- expect(code).toBe(1)
698
- expect(err).toContain('Hero.vue')
699
- })
700
-
701
- it('flags a raw inline border in a .jsx component', () => {
702
- fixtureAt('Card.jsx', `export const C = () => <div style={{ border: '1px solid #ccc' }} />\n`)
703
- const { code, err } = run()
704
- expect(code).toBe(1)
705
- expect(err).toContain('raw-surface')
706
- expect(err).toContain('Card.jsx')
707
- })
708
-
709
- it('stays quiet on a clean .astro file — the extension is scanned, not condemned', () => {
710
- fixtureAt('pages/index.astro', '<style>\n .hero { color: var(--vx-ink); }\n</style>\n')
711
- expect(run().code).toBe(0)
712
- })
713
- })
714
-
715
- describe('check-theme comment skipping', () => {
716
- it('does NOT flag a banned element mentioned in a pure line comment', () => {
717
- fixtureAt(
718
- 'charts/kinds/Foo.tsx',
719
- `// never render a raw <AxisLeft> — use AxisLeftNumeric\nexport const Foo = () => <AxisLeftNumeric scale={s} />\n`,
720
- )
721
- const { code, err } = run()
722
- expect(code).toBe(0)
723
- expect(err).not.toContain('raw-visx-axis')
724
- })
725
-
726
- it('does NOT flag a banned token mentioned in a JSDoc body line', () => {
727
- fixture(
728
- `/**\n * Avoid var(--mantine-color-gray-3); use the surface token.\n */\nexport const C = 1\n`,
729
- )
730
- const { code, err } = run()
731
- expect(code).toBe(0)
732
- expect(err).not.toContain('off-system-surface-var')
733
- })
734
-
735
- it('still flags the real violation on a code line even when a comment mentions it too', () => {
736
- fixtureAt(
737
- 'charts/kinds/Foo.tsx',
738
- `// raw <AxisLeft> is banned\nexport const Foo = () => <AxisLeft scale={s} />\n`,
739
- )
740
- const { code, err } = run()
741
- expect(code).toBe(1)
742
- expect(err).toContain('raw-visx-axis')
743
- })
744
- })
745
-
746
- describe('severity — warnings report, errors fail', () => {
747
- const RAW_HEX = `export const C = () => <div style={{ color: '#ff0000' }} />`
748
-
749
- it('exits 1 on an error kind (the default)', () => {
750
- fixture(RAW_HEX)
751
- const { code, err } = run()
752
- expect(code).toBe(1)
753
- expect(err).toContain('✖ Theme guard')
754
- expect(err).toContain('raw-hex')
755
- })
756
-
757
- it('exits 0 when the only findings are warnings, and still prints them', () => {
758
- // The whole point of the grace minor: the consumer takes the upgrade on a green build and
759
- // schedules the fix, rather than the release scheduling it for them. This case is the OTHER
760
- // origin of a warning — a consumer override — so the heading must not promise promotion.
761
- fixture(RAW_HEX, { roots: ['src'], severity: { 'raw-hex': 'warn' } })
762
- const { code, err } = run()
763
- expect(code).toBe(0)
764
- expect(err).toContain('⚠ Theme guard')
765
- expect(err).toContain('reported, not fatal')
766
- expect(err).toContain('raw-hex')
767
- expect(err).not.toContain('✖ Theme guard')
768
- })
769
-
770
- it('still fails when errors accompany warnings, and reports both blocks', () => {
771
- fixture(`export const C = () => <div style={{ color: '#ff0000' }} p={18} />`, {
772
- roots: ['src'],
773
- spacingSteps: [18],
774
- severity: { 'raw-hex': 'warn' },
775
- })
776
- const { code, err } = run()
777
- expect(code).toBe(1)
778
- expect(err).toContain('⚠ Theme guard')
779
- expect(err).toContain('✖ Theme guard')
780
- // Warnings first — "what will break later" is the less urgent read.
781
- expect(err.indexOf('⚠ Theme guard')).toBeLessThan(err.indexOf('✖ Theme guard'))
782
- })
783
-
784
- it('ignores an unrecognized severity value instead of silently unguarding the kind', () => {
785
- // The one config typo that would REMOVE enforcement: 'warning' matches neither bucket, so the
786
- // finding would vanish and the command would exit 0 on a tree that is not clean.
787
- fixture(RAW_HEX, { roots: ['src'], severity: { 'raw-hex': 'warning' } })
788
- const { code, err } = run()
789
- expect(code).toBe(1)
790
- expect(err).toContain("not 'warn' or 'error'")
791
- expect(err).toContain('✖ Theme guard')
792
- expect(err).toContain('raw-hex')
793
- })
794
-
795
- it('ignores a severity block that is not an object', () => {
796
- fixture(RAW_HEX, { roots: ['src'], severity: 'warn' })
797
- const { code, err } = run()
798
- expect(code).toBe(1)
799
- expect(err).toContain('basalt.severity is not an object')
800
- expect(err).toContain('✖ Theme guard')
801
- })
802
- })
803
-
804
- // ── the manifest waiver hint, gated on the profile ────────────────────────────────────────────
805
- //
806
- // rollhook. The hint leads with `basaltAppPlugin`, which is right for a Mantine app — a hex in a
807
- // manifest can never be right, and the plugin removes the hand-copy entirely. A `tokens-only`
808
- // consumer has definitionally opted out of that layer: rollhook's Astro site has no index.html to
809
- // transform, imports no basalt JavaScript at all, and owns maskable icons the plugin does not emit.
810
- // Leading with it there is advice the consumer cannot take.
811
-
812
- describe('check-theme — the manifest waiver hint follows the profile', () => {
813
- function manifestFixture(basalt: Record<string, unknown>): void {
814
- writeFileSync(resolve(dir, 'package.json'), JSON.stringify({ name: 'fixture', basalt }))
815
- mkdirSync(resolve(dir, 'src'), { recursive: true })
816
- writeFileSync(resolve(dir, 'src', 'app.tsx'), 'export const App = () => null\n')
817
- mkdirSync(resolve(dir, 'public'), { recursive: true })
818
- writeFileSync(
819
- resolve(dir, 'public', 'site.webmanifest'),
820
- JSON.stringify({ name: 'x', theme_color: '#18181b' }, null, 2),
821
- )
822
- }
823
-
824
- it('offers basaltAppPlugin first to a framework consumer', () => {
825
- manifestFixture({ roots: ['src'] })
826
- const { err } = run()
827
- expect(err).toContain('let basaltAppPlugin emit it')
828
- })
829
-
830
- it('leads with the member for a tokens-only consumer, and says which remedy it withheld', () => {
831
- manifestFixture({ roots: ['src'], profile: 'tokens-only' })
832
- const { err } = run()
833
- expect(err).toContain('JSON has no comments — declare a deliberate exception')
834
- expect(err).not.toContain('let basaltAppPlugin emit it')
835
- expect(err).toContain('a tokens-only consumer has opted out of')
836
- })
837
- })