basalt-ui 1.27.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 (1063) hide show
  1. package/AGENTS.md +23 -23
  2. package/CHANGELOG.md +59 -0
  3. package/MIGRATING.md +613 -20
  4. package/README.md +33 -3
  5. package/agent/rules/basalt-batteries.md +25 -10
  6. package/agent/rules/basalt-controls.md +56 -31
  7. package/agent/rules/basalt-mantine.md +17 -6
  8. package/agent/rules/basalt-tokens.md +1 -1
  9. package/configs/oxlint-plugin.js +1056 -28
  10. package/configs/oxlint-plugin.test.ts +1066 -0
  11. package/configs/oxlint.json +7 -0
  12. package/dist/agent/coalesce.d.ts.map +1 -1
  13. package/dist/agent/coalesce.js +2 -1
  14. package/dist/agent/merge.d.ts.map +1 -1
  15. package/dist/agent/merge.js +2 -1
  16. package/dist/agent/part-list.d.ts.map +1 -1
  17. package/dist/agent/part-list.js +2 -0
  18. package/dist/agent/stick-to-bottom.d.ts +3 -6
  19. package/dist/agent/stick-to-bottom.d.ts.map +1 -1
  20. package/dist/agent/stick-to-bottom.js +6 -3
  21. package/dist/agent-chat/composer.d.ts +6 -2
  22. package/dist/agent-chat/composer.d.ts.map +1 -1
  23. package/dist/agent-chat/composer.js +49 -33
  24. package/dist/agent-chat/relative-time.d.ts +0 -9
  25. package/dist/agent-chat/relative-time.d.ts.map +1 -1
  26. package/dist/agent-chat/relative-time.js +2 -1
  27. package/dist/agent-chat/thread-detail-panel.d.ts +3 -2
  28. package/dist/agent-chat/thread-detail-panel.d.ts.map +1 -1
  29. package/dist/agent-chat/thread-detail-panel.js +8 -5
  30. package/dist/agent-chat/thread-feed-row.d.ts +2 -1
  31. package/dist/agent-chat/thread-feed-row.d.ts.map +1 -1
  32. package/dist/agent-chat/thread-feed-row.js +92 -92
  33. package/dist/agent-chat/thread-feed.d.ts +3 -2
  34. package/dist/agent-chat/thread-feed.d.ts.map +1 -1
  35. package/dist/agent-chat/thread-feed.js +8 -3
  36. package/dist/agent-chat/thread-message.d.ts +4 -3
  37. package/dist/agent-chat/thread-message.d.ts.map +1 -1
  38. package/dist/agent-chat/thread-message.js +70 -31
  39. package/dist/agent-chat/thread-outcome-card.d.ts +3 -2
  40. package/dist/agent-chat/thread-outcome-card.d.ts.map +1 -1
  41. package/dist/agent-chat/thread-outcome-card.js +9 -2
  42. package/dist/agent-chat/thread-workspace.d.ts +7 -2
  43. package/dist/agent-chat/thread-workspace.d.ts.map +1 -1
  44. package/dist/agent-chat/thread-workspace.js +62 -29
  45. package/dist/agent-chat/tool-chip.d.ts +3 -2
  46. package/dist/agent-chat/tool-chip.d.ts.map +1 -1
  47. package/dist/agent-chat/tool-chip.js +7 -2
  48. package/dist/charts/hooks/useBandPlot.d.ts.map +1 -1
  49. package/dist/charts/hooks/useBandPlot.js +15 -8
  50. package/dist/charts/index.d.ts +8 -7
  51. package/dist/charts/index.d.ts.map +1 -1
  52. package/dist/charts/index.js +45 -5
  53. package/dist/charts/kinds/BandStrip.d.ts +10 -7
  54. package/dist/charts/kinds/BandStrip.d.ts.map +1 -1
  55. package/dist/charts/kinds/BandStrip.js +12 -7
  56. package/dist/charts/kinds/Bars.d.ts +12 -6
  57. package/dist/charts/kinds/Bars.d.ts.map +1 -1
  58. package/dist/charts/kinds/Bars.js +37 -11
  59. package/dist/charts/kinds/Donut.d.ts +6 -5
  60. package/dist/charts/kinds/Donut.d.ts.map +1 -1
  61. package/dist/charts/kinds/Donut.js +19 -2
  62. package/dist/charts/kinds/DualPanel.d.ts +6 -5
  63. package/dist/charts/kinds/DualPanel.d.ts.map +1 -1
  64. package/dist/charts/kinds/DualPanel.js +36 -8
  65. package/dist/charts/kinds/Heatmap.d.ts +10 -6
  66. package/dist/charts/kinds/Heatmap.d.ts.map +1 -1
  67. package/dist/charts/kinds/Heatmap.js +58 -31
  68. package/dist/charts/kinds/MirroredBars.d.ts +6 -5
  69. package/dist/charts/kinds/MirroredBars.d.ts.map +1 -1
  70. package/dist/charts/kinds/MirroredBars.js +9 -2
  71. package/dist/charts/kinds/MultiLine.d.ts +11 -6
  72. package/dist/charts/kinds/MultiLine.d.ts.map +1 -1
  73. package/dist/charts/kinds/MultiLine.js +24 -15
  74. package/dist/charts/kinds/StackedArea.d.ts +18 -8
  75. package/dist/charts/kinds/StackedArea.d.ts.map +1 -1
  76. package/dist/charts/kinds/StackedArea.js +29 -4
  77. package/dist/charts/kinds/ZonedLine.d.ts +12 -8
  78. package/dist/charts/kinds/ZonedLine.d.ts.map +1 -1
  79. package/dist/charts/kinds/ZonedLine.js +33 -23
  80. package/dist/charts/layout/auto-margin.d.ts +65 -8
  81. package/dist/charts/layout/auto-margin.d.ts.map +1 -1
  82. package/dist/charts/layout/auto-margin.js +45 -10
  83. package/dist/charts/layout/log-ticks.d.ts +27 -0
  84. package/dist/charts/layout/log-ticks.d.ts.map +1 -0
  85. package/dist/charts/layout/log-ticks.js +42 -0
  86. package/dist/charts/primitives/Axes.d.ts +11 -2
  87. package/dist/charts/primitives/Axes.d.ts.map +1 -1
  88. package/dist/charts/primitives/Axes.js +15 -5
  89. package/dist/charts/primitives/CartesianChart.d.ts +45 -7
  90. package/dist/charts/primitives/CartesianChart.d.ts.map +1 -1
  91. package/dist/charts/primitives/CartesianChart.js +86 -28
  92. package/dist/charts/primitives/ChartCard.d.ts +27 -2
  93. package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
  94. package/dist/charts/primitives/ChartCard.js +37 -17
  95. package/dist/charts/primitives/ChartFrame.d.ts +30 -4
  96. package/dist/charts/primitives/ChartFrame.d.ts.map +1 -1
  97. package/dist/charts/primitives/ChartFrame.js +45 -15
  98. package/dist/charts/primitives/ChartLegend.d.ts +13 -2
  99. package/dist/charts/primitives/ChartLegend.d.ts.map +1 -1
  100. package/dist/charts/primitives/ChartLegend.js +33 -13
  101. package/dist/charts/primitives/ChartPending.d.ts +77 -4
  102. package/dist/charts/primitives/ChartPending.d.ts.map +1 -1
  103. package/dist/charts/primitives/ChartPending.js +100 -6
  104. package/dist/charts/primitives/ChartTooltip.d.ts +7 -0
  105. package/dist/charts/primitives/ChartTooltip.d.ts.map +1 -1
  106. package/dist/charts/primitives/ChartTooltip.js +18 -5
  107. package/dist/charts/primitives/Crosshair.d.ts +3 -0
  108. package/dist/charts/primitives/Crosshair.d.ts.map +1 -1
  109. package/dist/charts/primitives/Crosshair.js +3 -1
  110. package/dist/charts/primitives/chart-frame-layout.d.ts +95 -0
  111. package/dist/charts/primitives/chart-frame-layout.d.ts.map +1 -0
  112. package/dist/charts/primitives/chart-frame-layout.js +89 -0
  113. package/dist/charts/primitives/chart-tier.d.ts +16 -0
  114. package/dist/charts/primitives/chart-tier.d.ts.map +1 -0
  115. package/dist/charts/primitives/chart-tier.js +20 -0
  116. package/dist/charts/series.d.ts +55 -1
  117. package/dist/charts/series.d.ts.map +1 -1
  118. package/dist/charts/series.js +27 -1
  119. package/dist/charts/sparklines/BarSparkline.d.ts +3 -3
  120. package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
  121. package/dist/charts/sparklines/BarSparkline.js +9 -3
  122. package/dist/charts/sparklines/LineSparkline.d.ts +3 -3
  123. package/dist/charts/sparklines/LineSparkline.d.ts.map +1 -1
  124. package/dist/charts/sparklines/LineSparkline.js +15 -3
  125. package/dist/charts/sparklines/index.d.ts +2 -2
  126. package/dist/charts/sparklines/index.d.ts.map +1 -1
  127. package/dist/charts/utils/format.d.ts +92 -2
  128. package/dist/charts/utils/format.d.ts.map +1 -1
  129. package/dist/charts/utils/format.js +64 -1
  130. package/dist/charts/utils/ticks.d.ts +81 -2
  131. package/dist/charts/utils/ticks.d.ts.map +1 -1
  132. package/dist/charts/utils/ticks.js +54 -4
  133. package/dist/cli/index.d.ts.map +1 -1
  134. package/dist/cli/index.js +2 -2
  135. package/dist/commands/ShortcutsHelp.d.ts +3 -2
  136. package/dist/commands/ShortcutsHelp.d.ts.map +1 -1
  137. package/dist/commands/ShortcutsHelp.js +8 -2
  138. package/dist/commands/define-commands.d.ts.map +1 -1
  139. package/dist/commands/define-commands.js +2 -2
  140. package/dist/commands/define-overlays.d.ts +102 -0
  141. package/dist/commands/define-overlays.d.ts.map +1 -1
  142. package/dist/commands/define-overlays.js +102 -2
  143. package/dist/commands/index.d.ts +10 -1
  144. package/dist/commands/index.d.ts.map +1 -1
  145. package/dist/commands/index.js +3 -1
  146. package/dist/commands/overlays-mount.d.ts +13 -6
  147. package/dist/commands/overlays-mount.d.ts.map +1 -1
  148. package/dist/commands/overlays-mount.js +23 -14
  149. package/dist/common/errors.d.ts +34 -0
  150. package/dist/common/errors.d.ts.map +1 -0
  151. package/dist/common/errors.js +36 -0
  152. package/dist/common/index.d.ts +15 -0
  153. package/dist/common/index.d.ts.map +1 -0
  154. package/dist/common/index.js +29 -0
  155. package/dist/common/props.d.ts +63 -0
  156. package/dist/common/props.d.ts.map +1 -0
  157. package/dist/common/props.js +6 -0
  158. package/dist/common/query-state-like.d.ts +43 -0
  159. package/dist/common/query-state-like.d.ts.map +1 -0
  160. package/dist/common/query-state-like.js +20 -0
  161. package/dist/common/refs.d.ts +29 -0
  162. package/dist/common/refs.d.ts.map +1 -0
  163. package/dist/common/refs.js +29 -0
  164. package/dist/common/scroll-parent.d.ts +23 -0
  165. package/dist/common/scroll-parent.d.ts.map +1 -0
  166. package/dist/common/scroll-parent.js +21 -0
  167. package/dist/common/validate.d.ts +38 -0
  168. package/dist/common/validate.d.ts.map +1 -0
  169. package/dist/common/validate.js +36 -0
  170. package/dist/connectivity/connectivity-indicator.d.ts +3 -1
  171. package/dist/connectivity/connectivity-indicator.d.ts.map +1 -1
  172. package/dist/connectivity/connectivity-indicator.js +3 -1
  173. package/dist/connectivity/connectivity-provider.d.ts.map +1 -1
  174. package/dist/connectivity/connectivity-provider.js +4 -1
  175. package/dist/connectivity/index.d.ts +1 -0
  176. package/dist/connectivity/index.d.ts.map +1 -1
  177. package/dist/connectivity/types.d.ts +2 -2
  178. package/dist/connectivity/types.d.ts.map +1 -1
  179. package/dist/connectivity/use-connectivity.d.ts.map +1 -1
  180. package/dist/content/article-layout.module.css +11 -4
  181. package/dist/content/callout.d.ts +8 -4
  182. package/dist/content/callout.d.ts.map +1 -1
  183. package/dist/content/callout.js +15 -8
  184. package/dist/content/guide.d.ts +5 -4
  185. package/dist/content/guide.d.ts.map +1 -1
  186. package/dist/content/guide.js +13 -4
  187. package/dist/content/heading-anchor.d.ts +24 -2
  188. package/dist/content/heading-anchor.d.ts.map +1 -1
  189. package/dist/content/heading-anchor.js +23 -9
  190. package/dist/content/index.d.ts.map +1 -1
  191. package/dist/content/markdown.d.ts.map +1 -1
  192. package/dist/content/markdown.js +2 -0
  193. package/dist/content/prose.module.css +9 -7
  194. package/dist/content/reading-progress.d.ts +10 -4
  195. package/dist/content/reading-progress.d.ts.map +1 -1
  196. package/dist/content/reading-progress.js +26 -10
  197. package/dist/content/slug.d.ts +4 -0
  198. package/dist/content/slug.d.ts.map +1 -1
  199. package/dist/content/toc.d.ts +11 -0
  200. package/dist/content/toc.d.ts.map +1 -1
  201. package/dist/content/toc.js +23 -10
  202. package/dist/controls/actions.d.ts +49 -6
  203. package/dist/controls/actions.d.ts.map +1 -1
  204. package/dist/controls/actions.js +39 -8
  205. package/dist/controls/compare-filter.d.ts +3 -2
  206. package/dist/controls/compare-filter.d.ts.map +1 -1
  207. package/dist/controls/compare-filter.js +17 -2
  208. package/dist/controls/control-group.d.ts +3 -3
  209. package/dist/controls/control-group.d.ts.map +1 -1
  210. package/dist/controls/control-group.js +9 -2
  211. package/dist/controls/controls.module.css +169 -186
  212. package/dist/controls/controls.module.css.d.ts +9 -11
  213. package/dist/controls/enum-filter.d.ts +3 -2
  214. package/dist/controls/enum-filter.d.ts.map +1 -1
  215. package/dist/controls/enum-filter.js +28 -13
  216. package/dist/controls/filter-context.d.ts +8 -4
  217. package/dist/controls/filter-context.d.ts.map +1 -1
  218. package/dist/controls/filter-pill.d.ts +3 -3
  219. package/dist/controls/filter-pill.d.ts.map +1 -1
  220. package/dist/controls/filter-pill.js +4 -1
  221. package/dist/controls/filter-set.d.ts +3 -2
  222. package/dist/controls/filter-set.d.ts.map +1 -1
  223. package/dist/controls/filter-set.js +66 -41
  224. package/dist/controls/filter-sheet.d.ts +20 -80
  225. package/dist/controls/filter-sheet.d.ts.map +1 -1
  226. package/dist/controls/filter-sheet.js +9 -95
  227. package/dist/controls/index.d.ts +2 -0
  228. package/dist/controls/index.d.ts.map +1 -1
  229. package/dist/controls/index.js +4 -0
  230. package/dist/controls/multi-select-filter.d.ts +18 -2
  231. package/dist/controls/multi-select-filter.d.ts.map +1 -1
  232. package/dist/controls/multi-select-filter.js +122 -20
  233. package/dist/controls/number-filter.d.ts +7 -5
  234. package/dist/controls/number-filter.d.ts.map +1 -1
  235. package/dist/controls/number-filter.js +40 -11
  236. package/dist/controls/panel-row.d.ts +132 -0
  237. package/dist/controls/panel-row.d.ts.map +1 -0
  238. package/dist/controls/panel-row.js +173 -0
  239. package/dist/controls/panel-row.module.css +86 -0
  240. package/dist/controls/panel-row.module.css.d.ts +13 -0
  241. package/dist/controls/range-filter.d.ts +2 -1
  242. package/dist/controls/range-filter.d.ts.map +1 -1
  243. package/dist/controls/range-filter.js +57 -35
  244. package/dist/controls/search-filter.d.ts +3 -2
  245. package/dist/controls/search-filter.d.ts.map +1 -1
  246. package/dist/controls/search-filter.js +25 -10
  247. package/dist/controls/select-filter.d.ts +2 -1
  248. package/dist/controls/select-filter.d.ts.map +1 -1
  249. package/dist/controls/select-filter.js +4 -0
  250. package/dist/controls/slider-control.d.ts +36 -0
  251. package/dist/controls/slider-control.d.ts.map +1 -0
  252. package/dist/controls/slider-control.js +64 -0
  253. package/dist/controls/sync-button.d.ts +3 -2
  254. package/dist/controls/sync-button.d.ts.map +1 -1
  255. package/dist/controls/sync-button.js +16 -3
  256. package/dist/controls/toggle-filter.d.ts +3 -2
  257. package/dist/controls/toggle-filter.d.ts.map +1 -1
  258. package/dist/controls/toggle-filter.js +28 -11
  259. package/dist/controls/view-tabs.d.ts +3 -2
  260. package/dist/controls/view-tabs.d.ts.map +1 -1
  261. package/dist/controls/view-tabs.js +43 -11
  262. package/dist/controls-dates/date-range-picker.d.ts +1 -1
  263. package/dist/controls-dates/date-range-picker.d.ts.map +1 -1
  264. package/dist/controls-dates/date-range-picker.js +6 -1
  265. package/dist/dashboard/delta-badge.d.ts +5 -1
  266. package/dist/dashboard/delta-badge.d.ts.map +1 -1
  267. package/dist/dashboard/empty-state.d.ts +10 -3
  268. package/dist/dashboard/empty-state.d.ts.map +1 -1
  269. package/dist/dashboard/empty-state.js +37 -6
  270. package/dist/dashboard/index.d.ts +6 -4
  271. package/dist/dashboard/index.d.ts.map +1 -1
  272. package/dist/dashboard/index.js +7 -1
  273. package/dist/dashboard/query-state.d.ts +48 -27
  274. package/dist/dashboard/query-state.d.ts.map +1 -1
  275. package/dist/dashboard/query-state.js +111 -57
  276. package/dist/dashboard/settings-section.d.ts +19 -9
  277. package/dist/dashboard/settings-section.d.ts.map +1 -1
  278. package/dist/dashboard/settings-section.js +74 -25
  279. package/dist/dashboard/stat-card.d.ts +44 -38
  280. package/dist/dashboard/stat-card.d.ts.map +1 -1
  281. package/dist/dashboard/stat-card.js +55 -42
  282. package/dist/dashboard/stat-card.module.css +46 -31
  283. package/dist/dashboard/stat-card.module.css.d.ts +1 -0
  284. package/dist/dashboard/stat-group.d.ts +41 -0
  285. package/dist/dashboard/stat-group.d.ts.map +1 -0
  286. package/dist/dashboard/stat-group.js +30 -0
  287. package/dist/dashboard/stat-group.module.css +66 -0
  288. package/dist/dashboard/stat-group.module.css.d.ts +8 -0
  289. package/dist/dashboard/widget-grid.d.ts +27 -0
  290. package/dist/dashboard/widget-grid.d.ts.map +1 -0
  291. package/dist/dashboard/widget-grid.js +41 -0
  292. package/dist/dashboard/widget-grid.module.css +53 -0
  293. package/dist/dashboard/widget-grid.module.css.d.ts +9 -0
  294. package/dist/data/data-table.d.ts +151 -12
  295. package/dist/data/data-table.d.ts.map +1 -1
  296. package/dist/data/data-table.js +384 -138
  297. package/dist/data/data-table.module.css +64 -0
  298. package/dist/data/data-table.module.css.d.ts +11 -0
  299. package/dist/data/index.d.ts +2 -2
  300. package/dist/data/index.d.ts.map +1 -1
  301. package/dist/data/index.js +24 -2
  302. package/dist/data/query-branch.d.ts +28 -0
  303. package/dist/data/query-branch.d.ts.map +1 -0
  304. package/dist/data/query-branch.js +10 -0
  305. package/dist/data/table.d.ts +2 -2
  306. package/dist/data/table.d.ts.map +1 -1
  307. package/dist/data/virtual-list.d.ts +65 -6
  308. package/dist/data/virtual-list.d.ts.map +1 -1
  309. package/dist/data/virtual-list.js +89 -38
  310. package/dist/data/virtual.d.ts +1 -1
  311. package/dist/data/virtual.d.ts.map +1 -1
  312. package/dist/forms/FormErrorSummary.d.ts +4 -3
  313. package/dist/forms/FormErrorSummary.d.ts.map +1 -1
  314. package/dist/forms/FormErrorSummary.js +6 -4
  315. package/dist/forms/create-form.d.ts +2 -2
  316. package/dist/forms/field.d.ts +46 -6
  317. package/dist/forms/field.d.ts.map +1 -1
  318. package/dist/forms/field.js +10 -5
  319. package/dist/forms/form-layout.d.ts +142 -0
  320. package/dist/forms/form-layout.d.ts.map +1 -0
  321. package/dist/forms/form-layout.js +110 -0
  322. package/dist/forms/form-layout.module.css +145 -0
  323. package/dist/forms/form-layout.module.css.d.ts +20 -0
  324. package/dist/forms/form-state.d.ts +42 -0
  325. package/dist/forms/form-state.d.ts.map +1 -0
  326. package/dist/forms/form-state.js +26 -0
  327. package/dist/forms/index.d.ts +22 -6
  328. package/dist/forms/index.d.ts.map +1 -1
  329. package/dist/forms/index.js +19 -3
  330. package/dist/forms/use-field-array.d.ts +60 -0
  331. package/dist/forms/use-field-array.d.ts.map +1 -0
  332. package/dist/forms/use-field-array.js +20 -0
  333. package/dist/forms/use-form-draft.d.ts +25 -10
  334. package/dist/forms/use-form-draft.d.ts.map +1 -1
  335. package/dist/forms/use-form-draft.js +55 -18
  336. package/dist/forms/use-form-submit.d.ts +88 -0
  337. package/dist/forms/use-form-submit.d.ts.map +1 -0
  338. package/dist/forms/use-form-submit.js +63 -0
  339. package/dist/guard/index.d.ts.map +1 -1
  340. package/dist/guard/index.js +26 -6
  341. package/dist/index.d.ts +10 -8
  342. package/dist/index.d.ts.map +1 -1
  343. package/dist/index.js +44 -4
  344. package/dist/nav/types.d.ts +15 -6
  345. package/dist/nav/types.d.ts.map +1 -1
  346. package/dist/notifications/bell.d.ts +3 -2
  347. package/dist/notifications/bell.d.ts.map +1 -1
  348. package/dist/notifications/bell.js +73 -56
  349. package/dist/notifications/center.d.ts +15 -4
  350. package/dist/notifications/center.d.ts.map +1 -1
  351. package/dist/notifications/center.js +5 -2
  352. package/dist/notifications/define-notifications.d.ts +56 -14
  353. package/dist/notifications/define-notifications.d.ts.map +1 -1
  354. package/dist/notifications/define-notifications.js +2 -1
  355. package/dist/notifications/index.d.ts +6 -2
  356. package/dist/notifications/index.d.ts.map +1 -1
  357. package/dist/notifications/index.js +5 -1
  358. package/dist/notifications/mount-guard.d.ts +8 -0
  359. package/dist/notifications/mount-guard.d.ts.map +1 -0
  360. package/dist/notifications/mount-guard.js +19 -0
  361. package/dist/notifications/notify.d.ts +58 -1
  362. package/dist/notifications/notify.d.ts.map +1 -1
  363. package/dist/notifications/notify.js +46 -2
  364. package/dist/notifications/overlay.d.ts.map +1 -1
  365. package/dist/notifications/overlay.js +2 -0
  366. package/dist/notifications/store.d.ts +7 -0
  367. package/dist/notifications/store.d.ts.map +1 -1
  368. package/dist/provider/index.d.ts +37 -5
  369. package/dist/provider/index.d.ts.map +1 -1
  370. package/dist/provider/index.js +66 -28
  371. package/dist/provider/lab-theme.d.ts.map +1 -1
  372. package/dist/provider/lab-theme.js +2 -1
  373. package/dist/query/devtools.d.ts.map +1 -1
  374. package/dist/query/devtools.js +1 -0
  375. package/dist/router-tanstack/field.d.ts +1 -1
  376. package/dist/router-tanstack/field.d.ts.map +1 -1
  377. package/dist/router-tanstack/search-store.d.ts.map +1 -1
  378. package/dist/router-tanstack/search-store.js +1 -1
  379. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  380. package/dist/router-tanstack/use-nav.js +1 -1
  381. package/dist/section/index.d.ts +1 -1
  382. package/dist/section/index.d.ts.map +1 -1
  383. package/dist/section/section.d.ts +36 -2
  384. package/dist/section/section.d.ts.map +1 -1
  385. package/dist/section/section.js +49 -57
  386. package/dist/section/section.module.css +11 -0
  387. package/dist/shell/account-types.d.ts +5 -2
  388. package/dist/shell/account-types.d.ts.map +1 -1
  389. package/dist/shell/app-brand.d.ts +13 -0
  390. package/dist/shell/app-brand.d.ts.map +1 -0
  391. package/dist/shell/app-brand.js +94 -0
  392. package/dist/shell/app-brand.module.css +109 -0
  393. package/dist/shell/app-brand.module.css.d.ts +14 -0
  394. package/dist/shell/app-breadcrumbs.d.ts +4 -2
  395. package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
  396. package/dist/shell/app-breadcrumbs.js +33 -22
  397. package/dist/shell/app-header.module.css +10 -5
  398. package/dist/shell/app-main.module.css +107 -0
  399. package/dist/shell/app-main.module.css.d.ts +11 -0
  400. package/dist/shell/app-mobile-nav.d.ts +3 -2
  401. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  402. package/dist/shell/app-mobile-nav.js +29 -15
  403. package/dist/shell/app-mobile-nav.module.css +48 -27
  404. package/dist/shell/app-mobile-nav.module.css.d.ts +0 -1
  405. package/dist/shell/app-sidebar-account.d.ts +2 -1
  406. package/dist/shell/app-sidebar-account.d.ts.map +1 -1
  407. package/dist/shell/app-sidebar-account.js +57 -22
  408. package/dist/shell/app-sidebar.d.ts +9 -3
  409. package/dist/shell/app-sidebar.d.ts.map +1 -1
  410. package/dist/shell/app-sidebar.js +55 -109
  411. package/dist/shell/app-sidebar.module.css +53 -96
  412. package/dist/shell/app-sidebar.module.css.d.ts +0 -5
  413. package/dist/shell/index.d.ts +14 -6
  414. package/dist/shell/index.d.ts.map +1 -1
  415. package/dist/shell/index.js +47 -12
  416. package/dist/shell/isomorphic-layout-effect.d.ts +14 -0
  417. package/dist/shell/isomorphic-layout-effect.d.ts.map +1 -0
  418. package/dist/shell/isomorphic-layout-effect.js +5 -0
  419. package/dist/shell/mobile-nav-model.d.ts.map +1 -1
  420. package/dist/shell/mobile-nav-model.js +27 -6
  421. package/dist/shell/nav-count-badge.d.ts +5 -3
  422. package/dist/shell/nav-count-badge.d.ts.map +1 -1
  423. package/dist/shell/nav-count-badge.js +3 -1
  424. package/dist/shell/page-aside.d.ts +43 -0
  425. package/dist/shell/page-aside.d.ts.map +1 -0
  426. package/dist/shell/page-aside.js +202 -0
  427. package/dist/shell/page-aside.module.css +174 -0
  428. package/dist/shell/page-aside.module.css.d.ts +14 -0
  429. package/dist/shell/page-bar.d.ts +55 -15
  430. package/dist/shell/page-bar.d.ts.map +1 -1
  431. package/dist/shell/page-bar.js +130 -41
  432. package/dist/shell/page-bar.module.css +107 -13
  433. package/dist/shell/page-bar.module.css.d.ts +4 -1
  434. package/dist/shell/sidebar-search.d.ts +4 -2
  435. package/dist/shell/sidebar-search.d.ts.map +1 -1
  436. package/dist/shell/sidebar-search.js +9 -4
  437. package/dist/shell/sidebar-search.module.css +1 -1
  438. package/dist/state/fields.d.ts +23 -3
  439. package/dist/state/fields.d.ts.map +1 -1
  440. package/dist/state/fields.js +13 -2
  441. package/dist/state/persisted-or-local.d.ts +9 -0
  442. package/dist/state/persisted-or-local.d.ts.map +1 -0
  443. package/dist/state/persisted-or-local.js +24 -0
  444. package/dist/state.d.ts +1 -1
  445. package/dist/state.d.ts.map +1 -1
  446. package/dist/state.js +2 -6
  447. package/dist/surfaces.d.ts +12 -11
  448. package/dist/surfaces.d.ts.map +1 -1
  449. package/dist/surfaces.js +42 -12
  450. package/dist/theme/ctl-theme.d.ts.map +1 -1
  451. package/dist/theme/index.d.ts.map +1 -1
  452. package/dist/theme/index.js +102 -17
  453. package/dist/theme/nav-link.module.css +37 -26
  454. package/dist/theme/segmented-control.module.css +22 -0
  455. package/dist/theme/segmented-control.module.css.d.ts +1 -0
  456. package/dist/theme-lab/boot.d.ts +66 -0
  457. package/dist/theme-lab/boot.d.ts.map +1 -0
  458. package/dist/theme-lab/boot.js +82 -0
  459. package/dist/theme-lab/index.d.ts +4 -43
  460. package/dist/theme-lab/index.d.ts.map +1 -1
  461. package/dist/theme-lab/index.js +9 -69
  462. package/dist/theme-toggle/index.d.ts +3 -2
  463. package/dist/theme-toggle/index.d.ts.map +1 -1
  464. package/dist/theme-toggle/index.js +8 -2
  465. package/dist/tokens/index.d.ts +42 -0
  466. package/dist/tokens/index.d.ts.map +1 -1
  467. package/dist/tokens/index.js +35 -6
  468. package/dist/tokens/palette.d.ts +45 -25
  469. package/dist/tokens/palette.d.ts.map +1 -1
  470. package/dist/tokens/palette.js +31 -14
  471. package/dist/tokens.css +4 -5
  472. package/dist/utils/is-dev.d.ts +3 -0
  473. package/dist/utils/is-dev.d.ts.map +1 -0
  474. package/dist/utils/is-dev.js +6 -0
  475. package/dist/widget-header/delta-badge.d.ts +7 -1
  476. package/dist/widget-header/delta-badge.d.ts.map +1 -1
  477. package/dist/widget-header/delta-badge.js +8 -1
  478. package/dist/widget-header/index.d.ts +2 -2
  479. package/dist/widget-header/index.d.ts.map +1 -1
  480. package/dist/widget-header/index.js +3 -1
  481. package/dist/widget-header/widget-header.d.ts +69 -4
  482. package/dist/widget-header/widget-header.d.ts.map +1 -1
  483. package/dist/widget-header/widget-header.js +42 -27
  484. package/dist/widget-header/widget-header.module.css +72 -7
  485. package/llms.txt +6 -6
  486. package/package.json +49 -25
  487. package/src/agent/coalesce.ts +2 -1
  488. package/src/agent/merge.ts +2 -1
  489. package/src/agent/part-list.tsx +2 -0
  490. package/src/agent/stick-to-bottom.tsx +9 -11
  491. package/src/agent-chat/composer.tsx +124 -103
  492. package/src/agent-chat/relative-time.ts +2 -1
  493. package/src/agent-chat/thread-detail-panel.tsx +9 -5
  494. package/src/agent-chat/thread-feed-row.tsx +17 -9
  495. package/src/agent-chat/thread-feed.tsx +9 -3
  496. package/src/agent-chat/thread-message.tsx +48 -13
  497. package/src/agent-chat/thread-outcome-card.tsx +9 -1
  498. package/src/agent-chat/thread-workspace.tsx +72 -33
  499. package/src/agent-chat/tool-chip.tsx +8 -2
  500. package/src/charts/hooks/useBandPlot.ts +26 -8
  501. package/src/charts/index.ts +39 -4
  502. package/src/charts/kinds/BandStrip.tsx +36 -14
  503. package/src/charts/kinds/Bars.tsx +67 -16
  504. package/src/charts/kinds/Donut.tsx +30 -3
  505. package/src/charts/kinds/DualPanel.tsx +56 -10
  506. package/src/charts/kinds/Heatmap.tsx +90 -33
  507. package/src/charts/kinds/MirroredBars.tsx +21 -3
  508. package/src/charts/kinds/MultiLine.tsx +61 -18
  509. package/src/charts/kinds/StackedArea.tsx +77 -6
  510. package/src/charts/kinds/ZonedLine.tsx +71 -31
  511. package/src/charts/layout/auto-margin.ts +134 -21
  512. package/src/charts/layout/log-ticks.ts +90 -0
  513. package/src/charts/primitives/Axes.tsx +33 -5
  514. package/src/charts/primitives/CartesianChart.tsx +194 -41
  515. package/src/charts/primitives/ChartCard.tsx +66 -25
  516. package/src/charts/primitives/ChartFrame.tsx +107 -26
  517. package/src/charts/primitives/ChartLegend.tsx +43 -13
  518. package/src/charts/primitives/ChartPending.tsx +185 -7
  519. package/src/charts/primitives/ChartTooltip.tsx +37 -5
  520. package/src/charts/primitives/Crosshair.tsx +6 -3
  521. package/src/charts/primitives/chart-frame-layout.ts +212 -0
  522. package/src/charts/primitives/chart-tier.tsx +37 -0
  523. package/src/charts/series.ts +77 -1
  524. package/src/charts/sparklines/BarSparkline.tsx +11 -3
  525. package/src/charts/sparklines/LineSparkline.tsx +18 -4
  526. package/src/charts/sparklines/index.ts +2 -2
  527. package/src/charts/utils/format.ts +163 -2
  528. package/src/charts/utils/ticks.ts +149 -4
  529. package/src/cli/index.ts +8 -3
  530. package/src/commands/ShortcutsHelp.tsx +10 -3
  531. package/src/commands/define-commands.ts +2 -2
  532. package/src/commands/define-overlays.ts +216 -1
  533. package/src/commands/index.ts +12 -0
  534. package/src/commands/overlays-mount.tsx +60 -26
  535. package/src/common/errors.ts +73 -0
  536. package/src/common/index.ts +21 -0
  537. package/src/common/props.ts +71 -0
  538. package/src/common/query-state-like.ts +64 -0
  539. package/src/common/refs.ts +58 -0
  540. package/src/common/scroll-parent.ts +42 -0
  541. package/src/common/validate.ts +94 -0
  542. package/src/connectivity/connectivity-indicator.tsx +6 -1
  543. package/src/connectivity/connectivity-provider.tsx +4 -1
  544. package/src/connectivity/index.ts +1 -0
  545. package/src/connectivity/types.ts +5 -2
  546. package/src/connectivity/use-connectivity.ts +3 -2
  547. package/src/content/article-layout.module.css +11 -4
  548. package/src/content/callout.tsx +13 -7
  549. package/src/content/guide.tsx +14 -4
  550. package/src/content/heading-anchor.tsx +14 -3
  551. package/src/content/index.ts +2 -0
  552. package/src/content/markdown.tsx +2 -0
  553. package/src/content/prose.module.css +9 -7
  554. package/src/content/reading-progress.tsx +40 -15
  555. package/src/content/slug.ts +4 -0
  556. package/src/content/toc.tsx +47 -10
  557. package/src/controls/actions.tsx +89 -9
  558. package/src/controls/compare-filter.tsx +20 -3
  559. package/src/controls/control-group.tsx +11 -4
  560. package/src/controls/controls.module.css +169 -186
  561. package/src/controls/controls.module.css.d.ts +9 -11
  562. package/src/controls/enum-filter.tsx +32 -16
  563. package/src/controls/filter-context.tsx +14 -6
  564. package/src/controls/filter-pill.tsx +6 -3
  565. package/src/controls/filter-set.tsx +32 -13
  566. package/src/controls/filter-sheet.tsx +44 -194
  567. package/src/controls/index.ts +7 -0
  568. package/src/controls/multi-select-filter.tsx +177 -27
  569. package/src/controls/number-filter.tsx +61 -23
  570. package/src/controls/panel-row.module.css +86 -0
  571. package/src/controls/panel-row.module.css.d.ts +13 -0
  572. package/src/controls/panel-row.tsx +392 -0
  573. package/src/controls/range-filter.tsx +76 -39
  574. package/src/controls/search-filter.tsx +30 -12
  575. package/src/controls/select-filter.tsx +11 -1
  576. package/src/controls/slider-control.tsx +159 -0
  577. package/src/controls/sync-button.tsx +13 -3
  578. package/src/controls/toggle-filter.tsx +36 -16
  579. package/src/controls/view-tabs.tsx +63 -11
  580. package/src/controls-dates/date-range-picker.tsx +8 -1
  581. package/src/dashboard/delta-badge.tsx +5 -1
  582. package/src/dashboard/empty-state.tsx +72 -25
  583. package/src/dashboard/index.ts +13 -1
  584. package/src/dashboard/query-state.tsx +154 -84
  585. package/src/dashboard/settings-section.tsx +87 -31
  586. package/src/dashboard/stat-card.module.css +46 -31
  587. package/src/dashboard/stat-card.module.css.d.ts +1 -0
  588. package/src/dashboard/stat-card.tsx +185 -127
  589. package/src/dashboard/stat-group.module.css +66 -0
  590. package/src/dashboard/stat-group.module.css.d.ts +8 -0
  591. package/src/dashboard/stat-group.tsx +74 -0
  592. package/src/dashboard/widget-grid.module.css +53 -0
  593. package/src/dashboard/widget-grid.module.css.d.ts +9 -0
  594. package/src/dashboard/widget-grid.tsx +127 -0
  595. package/src/data/data-table.module.css +64 -0
  596. package/src/data/data-table.module.css.d.ts +11 -0
  597. package/src/data/data-table.tsx +919 -346
  598. package/src/data/index.ts +30 -2
  599. package/src/data/query-branch.ts +53 -0
  600. package/src/data/table.ts +5 -0
  601. package/src/data/virtual-list.tsx +189 -55
  602. package/src/data/virtual.ts +5 -1
  603. package/src/forms/FormErrorSummary.tsx +13 -6
  604. package/src/forms/create-form.ts +2 -2
  605. package/src/forms/field.ts +60 -11
  606. package/src/forms/form-layout.module.css +145 -0
  607. package/src/forms/form-layout.module.css.d.ts +20 -0
  608. package/src/forms/form-layout.tsx +305 -0
  609. package/src/forms/form-state.tsx +94 -0
  610. package/src/forms/index.ts +38 -7
  611. package/src/forms/use-field-array.ts +94 -0
  612. package/src/forms/use-form-draft.ts +145 -53
  613. package/src/forms/use-form-submit.ts +199 -0
  614. package/src/guard/index.ts +73 -18
  615. package/src/index.ts +74 -10
  616. package/src/nav/types.ts +15 -6
  617. package/src/notifications/bell.tsx +18 -4
  618. package/src/notifications/center.tsx +18 -5
  619. package/src/notifications/define-notifications.ts +64 -18
  620. package/src/notifications/index.ts +12 -1
  621. package/src/notifications/mount-guard.ts +41 -0
  622. package/src/notifications/notify.tsx +122 -3
  623. package/src/notifications/overlay.tsx +2 -0
  624. package/src/notifications/store.ts +7 -0
  625. package/src/provider/index.tsx +101 -13
  626. package/src/provider/lab-theme.ts +2 -1
  627. package/src/query/devtools.tsx +1 -0
  628. package/src/router-tanstack/field.ts +1 -0
  629. package/src/router-tanstack/search-store.ts +3 -10
  630. package/src/router-tanstack/use-nav.ts +18 -13
  631. package/src/section/index.ts +1 -1
  632. package/src/section/section.module.css +11 -0
  633. package/src/section/section.tsx +163 -96
  634. package/src/shell/account-types.ts +5 -2
  635. package/src/shell/app-brand.module.css +109 -0
  636. package/src/shell/app-brand.module.css.d.ts +14 -0
  637. package/src/shell/app-brand.tsx +140 -0
  638. package/src/shell/app-breadcrumbs.tsx +19 -9
  639. package/src/shell/app-header.module.css +10 -5
  640. package/src/shell/app-main.module.css +107 -0
  641. package/src/shell/app-main.module.css.d.ts +11 -0
  642. package/src/shell/app-mobile-nav.module.css +48 -27
  643. package/src/shell/app-mobile-nav.module.css.d.ts +0 -1
  644. package/src/shell/app-mobile-nav.tsx +43 -11
  645. package/src/shell/app-sidebar-account.tsx +29 -6
  646. package/src/shell/app-sidebar.module.css +53 -96
  647. package/src/shell/app-sidebar.module.css.d.ts +0 -5
  648. package/src/shell/app-sidebar.tsx +40 -113
  649. package/src/shell/index.tsx +156 -65
  650. package/src/shell/isomorphic-layout-effect.ts +14 -0
  651. package/src/shell/mobile-nav-model.ts +66 -10
  652. package/src/shell/nav-count-badge.tsx +6 -1
  653. package/src/shell/page-aside.module.css +174 -0
  654. package/src/shell/page-aside.module.css.d.ts +14 -0
  655. package/src/shell/page-aside.tsx +377 -0
  656. package/src/shell/page-bar.module.css +107 -13
  657. package/src/shell/page-bar.module.css.d.ts +4 -1
  658. package/src/shell/page-bar.tsx +294 -94
  659. package/src/shell/sidebar-search.module.css +1 -1
  660. package/src/shell/sidebar-search.tsx +13 -4
  661. package/src/state/fields.ts +43 -10
  662. package/src/state/persisted-or-local.ts +50 -0
  663. package/src/state.ts +0 -9
  664. package/src/surfaces.ts +42 -12
  665. package/src/theme/ctl-theme.tsx +10 -0
  666. package/src/theme/index.ts +129 -16
  667. package/src/theme/nav-link.module.css +37 -26
  668. package/src/theme/segmented-control.module.css +22 -0
  669. package/src/theme/segmented-control.module.css.d.ts +1 -0
  670. package/src/theme-lab/boot.ts +140 -0
  671. package/src/theme-lab/index.tsx +21 -112
  672. package/src/theme-toggle/index.tsx +10 -3
  673. package/src/tokens/index.ts +50 -6
  674. package/src/tokens/palette.ts +58 -30
  675. package/src/utils/is-dev.ts +4 -0
  676. package/src/widget-header/delta-badge.tsx +25 -5
  677. package/src/widget-header/index.ts +10 -2
  678. package/src/widget-header/widget-header.module.css +72 -7
  679. package/src/widget-header/widget-header.tsx +150 -71
  680. package/dist/agent/adapter.test.d.ts +0 -2
  681. package/dist/agent/adapter.test.d.ts.map +0 -1
  682. package/dist/agent/ai-sdk-transport.test.d.ts +0 -2
  683. package/dist/agent/ai-sdk-transport.test.d.ts.map +0 -1
  684. package/dist/agent/coalesce.test.d.ts +0 -2
  685. package/dist/agent/coalesce.test.d.ts.map +0 -1
  686. package/dist/agent/foreign.test.d.ts +0 -2
  687. package/dist/agent/foreign.test.d.ts.map +0 -1
  688. package/dist/agent/id.test.d.ts +0 -2
  689. package/dist/agent/id.test.d.ts.map +0 -1
  690. package/dist/agent/merge.test.d.ts +0 -2
  691. package/dist/agent/merge.test.d.ts.map +0 -1
  692. package/dist/agent/part-list.test.d.ts +0 -2
  693. package/dist/agent/part-list.test.d.ts.map +0 -1
  694. package/dist/agent/parts.test.d.ts +0 -2
  695. package/dist/agent/parts.test.d.ts.map +0 -1
  696. package/dist/agent/thread.test.d.ts +0 -2
  697. package/dist/agent/thread.test.d.ts.map +0 -1
  698. package/dist/agent/transport.test.d.ts +0 -2
  699. package/dist/agent/transport.test.d.ts.map +0 -1
  700. package/dist/agent/use-agent-stream.test.d.ts +0 -2
  701. package/dist/agent/use-agent-stream.test.d.ts.map +0 -1
  702. package/dist/agent/use-agent-thread-runs.foreign.test.d.ts +0 -2
  703. package/dist/agent/use-agent-thread-runs.foreign.test.d.ts.map +0 -1
  704. package/dist/agent/use-agent-thread-runs.resume.test.d.ts +0 -2
  705. package/dist/agent/use-agent-thread-runs.resume.test.d.ts.map +0 -1
  706. package/dist/agent/use-agent-thread-runs.test.d.ts +0 -2
  707. package/dist/agent/use-agent-thread-runs.test.d.ts.map +0 -1
  708. package/dist/agent/use-agent-thread-runs.wedge.test.d.ts +0 -2
  709. package/dist/agent/use-agent-thread-runs.wedge.test.d.ts.map +0 -1
  710. package/dist/agent-chat/composer.test.d.ts +0 -2
  711. package/dist/agent-chat/composer.test.d.ts.map +0 -1
  712. package/dist/agent-chat/relative-time.test.d.ts +0 -2
  713. package/dist/agent-chat/relative-time.test.d.ts.map +0 -1
  714. package/dist/agent-chat/thread-feed-row.test.d.ts +0 -2
  715. package/dist/agent-chat/thread-feed-row.test.d.ts.map +0 -1
  716. package/dist/agent-chat/thread-feed.test.d.ts +0 -2
  717. package/dist/agent-chat/thread-feed.test.d.ts.map +0 -1
  718. package/dist/agent-chat/thread-message.test.d.ts +0 -2
  719. package/dist/agent-chat/thread-message.test.d.ts.map +0 -1
  720. package/dist/agent-chat/thread-workspace.test.d.ts +0 -2
  721. package/dist/agent-chat/thread-workspace.test.d.ts.map +0 -1
  722. package/dist/agent-chat/tool-chip.test.d.ts +0 -2
  723. package/dist/agent-chat/tool-chip.test.d.ts.map +0 -1
  724. package/dist/agent-chat/virtualize.type-guard.test.d.ts +0 -2
  725. package/dist/agent-chat/virtualize.type-guard.test.d.ts.map +0 -1
  726. package/dist/charts/cursor/resolve.test.d.ts +0 -2
  727. package/dist/charts/cursor/resolve.test.d.ts.map +0 -1
  728. package/dist/charts/cursor/store.test.d.ts +0 -2
  729. package/dist/charts/cursor/store.test.d.ts.map +0 -1
  730. package/dist/charts/kinds/BandStrip.test.d.ts +0 -2
  731. package/dist/charts/kinds/BandStrip.test.d.ts.map +0 -1
  732. package/dist/charts/kinds/Bars.test.d.ts +0 -2
  733. package/dist/charts/kinds/Bars.test.d.ts.map +0 -1
  734. package/dist/charts/kinds/DualPanel.test.d.ts +0 -2
  735. package/dist/charts/kinds/DualPanel.test.d.ts.map +0 -1
  736. package/dist/charts/kinds/MirroredBars.test.d.ts +0 -2
  737. package/dist/charts/kinds/MirroredBars.test.d.ts.map +0 -1
  738. package/dist/charts/kinds/MultiLine.test.d.ts +0 -2
  739. package/dist/charts/kinds/MultiLine.test.d.ts.map +0 -1
  740. package/dist/charts/kinds/StackedArea.test.d.ts +0 -2
  741. package/dist/charts/kinds/StackedArea.test.d.ts.map +0 -1
  742. package/dist/charts/kinds/ZonedLine.test.d.ts +0 -2
  743. package/dist/charts/kinds/ZonedLine.test.d.ts.map +0 -1
  744. package/dist/charts/layout/auto-margin.test.d.ts +0 -2
  745. package/dist/charts/layout/auto-margin.test.d.ts.map +0 -1
  746. package/dist/charts/primitives/CartesianChart.test.d.ts +0 -2
  747. package/dist/charts/primitives/CartesianChart.test.d.ts.map +0 -1
  748. package/dist/charts/primitives/ChartCard.test.d.ts +0 -2
  749. package/dist/charts/primitives/ChartCard.test.d.ts.map +0 -1
  750. package/dist/charts/primitives/ChartFrame.test.d.ts +0 -2
  751. package/dist/charts/primitives/ChartFrame.test.d.ts.map +0 -1
  752. package/dist/charts/primitives/ChartLegend.test.d.ts +0 -2
  753. package/dist/charts/primitives/ChartLegend.test.d.ts.map +0 -1
  754. package/dist/charts/primitives/ChartTooltip.test.d.ts +0 -2
  755. package/dist/charts/primitives/ChartTooltip.test.d.ts.map +0 -1
  756. package/dist/charts/primitives/XZoneRects.test.d.ts +0 -2
  757. package/dist/charts/primitives/XZoneRects.test.d.ts.map +0 -1
  758. package/dist/charts/series.test.d.ts +0 -2
  759. package/dist/charts/series.test.d.ts.map +0 -1
  760. package/dist/charts/utils/domain.test.d.ts +0 -2
  761. package/dist/charts/utils/domain.test.d.ts.map +0 -1
  762. package/dist/charts/utils/measure-text.test.d.ts +0 -2
  763. package/dist/charts/utils/measure-text.test.d.ts.map +0 -1
  764. package/dist/cli/check-coverage.test.d.ts +0 -2
  765. package/dist/cli/check-coverage.test.d.ts.map +0 -1
  766. package/dist/cli/check-theme.test.d.ts +0 -2
  767. package/dist/cli/check-theme.test.d.ts.map +0 -1
  768. package/dist/cli/help.test.d.ts +0 -2
  769. package/dist/cli/help.test.d.ts.map +0 -1
  770. package/dist/cli/init-sync.test.d.ts +0 -2
  771. package/dist/cli/init-sync.test.d.ts.map +0 -1
  772. package/dist/cli/placement-engine.test.d.ts +0 -2
  773. package/dist/cli/placement-engine.test.d.ts.map +0 -1
  774. package/dist/cli/shipped-versions.test.d.ts +0 -2
  775. package/dist/cli/shipped-versions.test.d.ts.map +0 -1
  776. package/dist/cli/tarball-parity.test.d.ts +0 -2
  777. package/dist/cli/tarball-parity.test.d.ts.map +0 -1
  778. package/dist/cli/template-format.test.d.ts +0 -2
  779. package/dist/cli/template-format.test.d.ts.map +0 -1
  780. package/dist/cli/template-ledger.test.d.ts +0 -2
  781. package/dist/cli/template-ledger.test.d.ts.map +0 -1
  782. package/dist/cli/tokens-css.test.d.ts +0 -2
  783. package/dist/cli/tokens-css.test.d.ts.map +0 -1
  784. package/dist/cli/toolchain-wiring.test.d.ts +0 -2
  785. package/dist/cli/toolchain-wiring.test.d.ts.map +0 -1
  786. package/dist/cli/waiver-audit.test.d.ts +0 -2
  787. package/dist/cli/waiver-audit.test.d.ts.map +0 -1
  788. package/dist/content/article-actions.test.d.ts +0 -2
  789. package/dist/content/article-actions.test.d.ts.map +0 -1
  790. package/dist/content/article-model.test.d.ts +0 -2
  791. package/dist/content/article-model.test.d.ts.map +0 -1
  792. package/dist/content/block-split.test.d.ts +0 -2
  793. package/dist/content/block-split.test.d.ts.map +0 -1
  794. package/dist/content/heading-components.test.d.ts +0 -2
  795. package/dist/content/heading-components.test.d.ts.map +0 -1
  796. package/dist/content/markdown.test.d.ts +0 -2
  797. package/dist/content/markdown.test.d.ts.map +0 -1
  798. package/dist/content/prose.module.css.test.d.ts +0 -2
  799. package/dist/content/prose.module.css.test.d.ts.map +0 -1
  800. package/dist/content/sanitize.test.d.ts +0 -2
  801. package/dist/content/sanitize.test.d.ts.map +0 -1
  802. package/dist/content/slug.test.d.ts +0 -2
  803. package/dist/content/slug.test.d.ts.map +0 -1
  804. package/dist/controls/actions.test.d.ts +0 -2
  805. package/dist/controls/actions.test.d.ts.map +0 -1
  806. package/dist/controls/actions.type-guard.test.d.ts +0 -2
  807. package/dist/controls/actions.type-guard.test.d.ts.map +0 -1
  808. package/dist/controls/control-group.test.d.ts +0 -2
  809. package/dist/controls/control-group.test.d.ts.map +0 -1
  810. package/dist/controls/controls.router.test.d.ts +0 -2
  811. package/dist/controls/controls.router.test.d.ts.map +0 -1
  812. package/dist/controls/filter-set.test.d.ts +0 -2
  813. package/dist/controls/filter-set.test.d.ts.map +0 -1
  814. package/dist/controls/peer-boundary.test.d.ts +0 -2
  815. package/dist/controls/peer-boundary.test.d.ts.map +0 -1
  816. package/dist/controls/props-contract.test.d.ts +0 -2
  817. package/dist/controls/props-contract.test.d.ts.map +0 -1
  818. package/dist/controls/range-filter.type-guard.test.d.ts +0 -2
  819. package/dist/controls/range-filter.type-guard.test.d.ts.map +0 -1
  820. package/dist/controls/sync-button.test.d.ts +0 -2
  821. package/dist/controls/sync-button.test.d.ts.map +0 -1
  822. package/dist/dashboard/query-state.test.d.ts +0 -2
  823. package/dist/dashboard/query-state.test.d.ts.map +0 -1
  824. package/dist/dashboard/settings-section.test.d.ts +0 -2
  825. package/dist/dashboard/settings-section.test.d.ts.map +0 -1
  826. package/dist/dashboard/stat-card.test.d.ts +0 -2
  827. package/dist/dashboard/stat-card.test.d.ts.map +0 -1
  828. package/dist/data/data-table.test.d.ts +0 -2
  829. package/dist/data/data-table.test.d.ts.map +0 -1
  830. package/dist/guard/check-source.test.d.ts +0 -2
  831. package/dist/guard/check-source.test.d.ts.map +0 -1
  832. package/dist/guard/grace.test.d.ts +0 -20
  833. package/dist/guard/grace.test.d.ts.map +0 -1
  834. package/dist/guard/guard-hook.test.d.ts +0 -2
  835. package/dist/guard/guard-hook.test.d.ts.map +0 -1
  836. package/dist/provider/index.test.d.ts +0 -2
  837. package/dist/provider/index.test.d.ts.map +0 -1
  838. package/dist/provider/lab-theme.test.d.ts +0 -2
  839. package/dist/provider/lab-theme.test.d.ts.map +0 -1
  840. package/dist/query/error-message.test.d.ts +0 -2
  841. package/dist/query/error-message.test.d.ts.map +0 -1
  842. package/dist/router-tanstack/multi-search-param-store.test.d.ts +0 -2
  843. package/dist/router-tanstack/multi-search-param-store.test.d.ts.map +0 -1
  844. package/dist/router-tanstack/nav.test.d.ts +0 -2
  845. package/dist/router-tanstack/nav.test.d.ts.map +0 -1
  846. package/dist/router-tanstack/search-param-store.test.d.ts +0 -2
  847. package/dist/router-tanstack/search-param-store.test.d.ts.map +0 -1
  848. package/dist/router-tanstack/search-store.router.test.d.ts +0 -2
  849. package/dist/router-tanstack/search-store.router.test.d.ts.map +0 -1
  850. package/dist/router-tanstack/search-store.test.d.ts +0 -2
  851. package/dist/router-tanstack/search-store.test.d.ts.map +0 -1
  852. package/dist/router-tanstack/use-nav.test.d.ts +0 -2
  853. package/dist/router-tanstack/use-nav.test.d.ts.map +0 -1
  854. package/dist/section/section.test.d.ts +0 -2
  855. package/dist/section/section.test.d.ts.map +0 -1
  856. package/dist/shell/app-mobile-nav.test.d.ts +0 -2
  857. package/dist/shell/app-mobile-nav.test.d.ts.map +0 -1
  858. package/dist/shell/app-sidebar.test.d.ts +0 -2
  859. package/dist/shell/app-sidebar.test.d.ts.map +0 -1
  860. package/dist/shell/index.test.d.ts +0 -2
  861. package/dist/shell/index.test.d.ts.map +0 -1
  862. package/dist/shell/mobile-nav-model.test.d.ts +0 -2
  863. package/dist/shell/mobile-nav-model.test.d.ts.map +0 -1
  864. package/dist/shell/page-bar.test.d.ts +0 -2
  865. package/dist/shell/page-bar.test.d.ts.map +0 -1
  866. package/dist/state/fields.test.d.ts +0 -2
  867. package/dist/state/fields.test.d.ts.map +0 -1
  868. package/dist/state/persisted.test.d.ts +0 -2
  869. package/dist/state/persisted.test.d.ts.map +0 -1
  870. package/dist/styles.floor.test.d.ts +0 -2
  871. package/dist/styles.floor.test.d.ts.map +0 -1
  872. package/dist/theme/border-coverage.test.d.ts +0 -18
  873. package/dist/theme/border-coverage.test.d.ts.map +0 -1
  874. package/dist/theme/contrast.test.d.ts +0 -2
  875. package/dist/theme/contrast.test.d.ts.map +0 -1
  876. package/dist/theme/ctl-theme.test.d.ts +0 -2
  877. package/dist/theme/ctl-theme.test.d.ts.map +0 -1
  878. package/dist/theme/ctl-tier-coverage.test.d.ts +0 -2
  879. package/dist/theme/ctl-tier-coverage.test.d.ts.map +0 -1
  880. package/dist/theme/density-option.test.d.ts +0 -2
  881. package/dist/theme/density-option.test.d.ts.map +0 -1
  882. package/dist/theme/density-relations.test.d.ts +0 -2
  883. package/dist/theme/density-relations.test.d.ts.map +0 -1
  884. package/dist/theme/derive-theme.test.d.ts +0 -2
  885. package/dist/theme/derive-theme.test.d.ts.map +0 -1
  886. package/dist/theme/divider-law.test.d.ts +0 -2
  887. package/dist/theme/divider-law.test.d.ts.map +0 -1
  888. package/dist/theme/fonts-option.test.d.ts +0 -2
  889. package/dist/theme/fonts-option.test.d.ts.map +0 -1
  890. package/dist/theme/icon-slot.test.d.ts +0 -2
  891. package/dist/theme/icon-slot.test.d.ts.map +0 -1
  892. package/dist/theme/layout-rhythm-css.test.d.ts +0 -2
  893. package/dist/theme/layout-rhythm-css.test.d.ts.map +0 -1
  894. package/dist/theme/radius-option.test.d.ts +0 -2
  895. package/dist/theme/radius-option.test.d.ts.map +0 -1
  896. package/dist/theme/radius.test.d.ts +0 -2
  897. package/dist/theme/radius.test.d.ts.map +0 -1
  898. package/dist/theme/shadow-surfaces.test.d.ts +0 -26
  899. package/dist/theme/shadow-surfaces.test.d.ts.map +0 -1
  900. package/dist/theme/spacing.test.d.ts +0 -2
  901. package/dist/theme/spacing.test.d.ts.map +0 -1
  902. package/dist/theme/use-basalt-spacing.test.d.ts +0 -2
  903. package/dist/theme/use-basalt-spacing.test.d.ts.map +0 -1
  904. package/dist/theme-lab/derive-controls.test.d.ts +0 -2
  905. package/dist/theme-lab/derive-controls.test.d.ts.map +0 -1
  906. package/dist/theme-lab/derive-state.test.d.ts +0 -2
  907. package/dist/theme-lab/derive-state.test.d.ts.map +0 -1
  908. package/dist/theme-lab/theme-lab.test.d.ts +0 -2
  909. package/dist/theme-lab/theme-lab.test.d.ts.map +0 -1
  910. package/dist/tokens/build-fonts-css.test.d.ts +0 -2
  911. package/dist/tokens/build-fonts-css.test.d.ts.map +0 -1
  912. package/dist/tokens/build-radius-css.test.d.ts +0 -2
  913. package/dist/tokens/build-radius-css.test.d.ts.map +0 -1
  914. package/dist/tokens/chart-margin.test.d.ts +0 -2
  915. package/dist/tokens/chart-margin.test.d.ts.map +0 -1
  916. package/dist/tokens/density.test.d.ts +0 -2
  917. package/dist/tokens/density.test.d.ts.map +0 -1
  918. package/dist/tokens/derive-radius.test.d.ts +0 -2
  919. package/dist/tokens/derive-radius.test.d.ts.map +0 -1
  920. package/dist/tokens/derive.test.d.ts +0 -2
  921. package/dist/tokens/derive.test.d.ts.map +0 -1
  922. package/dist/tokens/palette.test.d.ts +0 -2
  923. package/dist/tokens/palette.test.d.ts.map +0 -1
  924. package/dist/tokens/text-scale.test.d.ts +0 -2
  925. package/dist/tokens/text-scale.test.d.ts.map +0 -1
  926. package/dist/vite-color-mix.test.d.ts +0 -2
  927. package/dist/vite-color-mix.test.d.ts.map +0 -1
  928. package/dist/vite.test.d.ts +0 -2
  929. package/dist/vite.test.d.ts.map +0 -1
  930. package/dist/widget-header/delta-badge.test.d.ts +0 -2
  931. package/dist/widget-header/delta-badge.test.d.ts.map +0 -1
  932. package/dist/widget-header/no-mantine.test.d.ts +0 -2
  933. package/dist/widget-header/no-mantine.test.d.ts.map +0 -1
  934. package/dist/widget-header/widget-header.test.d.ts +0 -2
  935. package/dist/widget-header/widget-header.test.d.ts.map +0 -1
  936. package/src/agent/adapter.test.ts +0 -1640
  937. package/src/agent/ai-sdk-transport.test.ts +0 -658
  938. package/src/agent/coalesce.test.ts +0 -387
  939. package/src/agent/foreign.test.ts +0 -51
  940. package/src/agent/id.test.ts +0 -169
  941. package/src/agent/merge.test.ts +0 -206
  942. package/src/agent/part-list.test.tsx +0 -112
  943. package/src/agent/parts.test.ts +0 -720
  944. package/src/agent/thread.test.ts +0 -220
  945. package/src/agent/transport.test.ts +0 -70
  946. package/src/agent/use-agent-stream.test.tsx +0 -287
  947. package/src/agent/use-agent-thread-runs.foreign.test.tsx +0 -138
  948. package/src/agent/use-agent-thread-runs.resume.test.tsx +0 -294
  949. package/src/agent/use-agent-thread-runs.test.tsx +0 -1120
  950. package/src/agent/use-agent-thread-runs.wedge.test.tsx +0 -387
  951. package/src/agent-chat/composer.test.tsx +0 -924
  952. package/src/agent-chat/relative-time.test.ts +0 -95
  953. package/src/agent-chat/thread-feed-row.test.tsx +0 -510
  954. package/src/agent-chat/thread-feed.test.tsx +0 -241
  955. package/src/agent-chat/thread-message.test.tsx +0 -1285
  956. package/src/agent-chat/thread-workspace.test.tsx +0 -169
  957. package/src/agent-chat/tool-chip.test.tsx +0 -139
  958. package/src/agent-chat/virtualize.type-guard.test.ts +0 -49
  959. package/src/charts/cursor/resolve.test.ts +0 -151
  960. package/src/charts/cursor/store.test.ts +0 -64
  961. package/src/charts/kinds/BandStrip.test.tsx +0 -282
  962. package/src/charts/kinds/Bars.test.tsx +0 -183
  963. package/src/charts/kinds/DualPanel.test.tsx +0 -527
  964. package/src/charts/kinds/MirroredBars.test.tsx +0 -232
  965. package/src/charts/kinds/MultiLine.test.tsx +0 -218
  966. package/src/charts/kinds/StackedArea.test.tsx +0 -114
  967. package/src/charts/kinds/ZonedLine.test.tsx +0 -147
  968. package/src/charts/layout/auto-margin.test.ts +0 -42
  969. package/src/charts/primitives/CartesianChart.test.tsx +0 -647
  970. package/src/charts/primitives/ChartCard.test.tsx +0 -66
  971. package/src/charts/primitives/ChartFrame.test.tsx +0 -142
  972. package/src/charts/primitives/ChartLegend.test.tsx +0 -78
  973. package/src/charts/primitives/ChartTooltip.test.tsx +0 -44
  974. package/src/charts/primitives/XZoneRects.test.tsx +0 -123
  975. package/src/charts/series.test.ts +0 -112
  976. package/src/charts/utils/domain.test.ts +0 -54
  977. package/src/charts/utils/measure-text.test.ts +0 -36
  978. package/src/cli/check-coverage.test.ts +0 -297
  979. package/src/cli/check-theme.test.ts +0 -837
  980. package/src/cli/help.test.ts +0 -170
  981. package/src/cli/init-sync.test.ts +0 -343
  982. package/src/cli/placement-engine.test.ts +0 -298
  983. package/src/cli/shipped-versions.test.ts +0 -83
  984. package/src/cli/tarball-parity.test.ts +0 -44
  985. package/src/cli/template-format.test.ts +0 -64
  986. package/src/cli/template-ledger.test.ts +0 -219
  987. package/src/cli/tokens-css.test.ts +0 -249
  988. package/src/cli/toolchain-wiring.test.ts +0 -1358
  989. package/src/cli/waiver-audit.test.ts +0 -215
  990. package/src/content/article-actions.test.ts +0 -78
  991. package/src/content/article-model.test.ts +0 -119
  992. package/src/content/block-split.test.ts +0 -75
  993. package/src/content/heading-components.test.tsx +0 -65
  994. package/src/content/markdown.test.tsx +0 -603
  995. package/src/content/prose.module.css.test.ts +0 -39
  996. package/src/content/sanitize.test.ts +0 -659
  997. package/src/content/slug.test.ts +0 -62
  998. package/src/controls/actions.test.tsx +0 -252
  999. package/src/controls/actions.type-guard.test.ts +0 -63
  1000. package/src/controls/control-group.test.tsx +0 -229
  1001. package/src/controls/controls.router.test.tsx +0 -1053
  1002. package/src/controls/filter-set.test.tsx +0 -472
  1003. package/src/controls/peer-boundary.test.ts +0 -85
  1004. package/src/controls/props-contract.test.tsx +0 -137
  1005. package/src/controls/range-filter.type-guard.test.tsx +0 -122
  1006. package/src/controls/sync-button.test.tsx +0 -183
  1007. package/src/dashboard/query-state.test.tsx +0 -152
  1008. package/src/dashboard/settings-section.test.tsx +0 -56
  1009. package/src/dashboard/stat-card.test.tsx +0 -385
  1010. package/src/data/data-table.test.tsx +0 -434
  1011. package/src/guard/check-source.test.ts +0 -3388
  1012. package/src/guard/grace.test.ts +0 -158
  1013. package/src/guard/guard-hook.test.ts +0 -203
  1014. package/src/provider/index.test.tsx +0 -101
  1015. package/src/provider/lab-theme.test.ts +0 -147
  1016. package/src/query/error-message.test.ts +0 -67
  1017. package/src/router-tanstack/multi-search-param-store.test.ts +0 -124
  1018. package/src/router-tanstack/nav.test.ts +0 -111
  1019. package/src/router-tanstack/search-param-store.test.ts +0 -135
  1020. package/src/router-tanstack/search-store.router.test.tsx +0 -882
  1021. package/src/router-tanstack/search-store.test.ts +0 -578
  1022. package/src/router-tanstack/use-nav.test.tsx +0 -187
  1023. package/src/section/section.test.tsx +0 -204
  1024. package/src/shell/app-mobile-nav.test.tsx +0 -403
  1025. package/src/shell/app-sidebar.test.tsx +0 -509
  1026. package/src/shell/index.test.tsx +0 -428
  1027. package/src/shell/mobile-nav-model.test.ts +0 -517
  1028. package/src/shell/page-bar.test.tsx +0 -316
  1029. package/src/state/fields.test.tsx +0 -512
  1030. package/src/state/persisted.test.ts +0 -91
  1031. package/src/styles.floor.test.ts +0 -36
  1032. package/src/theme/border-coverage.test.ts +0 -272
  1033. package/src/theme/contrast.test.ts +0 -354
  1034. package/src/theme/ctl-theme.test.tsx +0 -275
  1035. package/src/theme/ctl-tier-coverage.test.ts +0 -170
  1036. package/src/theme/density-option.test.ts +0 -96
  1037. package/src/theme/density-relations.test.ts +0 -506
  1038. package/src/theme/derive-theme.test.ts +0 -101
  1039. package/src/theme/divider-law.test.ts +0 -259
  1040. package/src/theme/fonts-option.test.ts +0 -75
  1041. package/src/theme/icon-slot.test.tsx +0 -275
  1042. package/src/theme/layout-rhythm-css.test.ts +0 -72
  1043. package/src/theme/radius-option.test.ts +0 -86
  1044. package/src/theme/radius.test.ts +0 -142
  1045. package/src/theme/shadow-surfaces.test.ts +0 -488
  1046. package/src/theme/spacing.test.ts +0 -495
  1047. package/src/theme/use-basalt-spacing.test.tsx +0 -55
  1048. package/src/theme-lab/derive-controls.test.ts +0 -94
  1049. package/src/theme-lab/derive-state.test.ts +0 -71
  1050. package/src/theme-lab/theme-lab.test.ts +0 -46
  1051. package/src/tokens/build-fonts-css.test.ts +0 -52
  1052. package/src/tokens/build-radius-css.test.ts +0 -25
  1053. package/src/tokens/chart-margin.test.ts +0 -39
  1054. package/src/tokens/density.test.ts +0 -259
  1055. package/src/tokens/derive-radius.test.ts +0 -62
  1056. package/src/tokens/derive.test.ts +0 -30
  1057. package/src/tokens/palette.test.ts +0 -114
  1058. package/src/tokens/text-scale.test.ts +0 -51
  1059. package/src/vite-color-mix.test.ts +0 -46
  1060. package/src/vite.test.ts +0 -423
  1061. package/src/widget-header/delta-badge.test.tsx +0 -60
  1062. package/src/widget-header/no-mantine.test.ts +0 -33
  1063. 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
- })