basalt-ui 1.25.0 → 1.27.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 (476) hide show
  1. package/AGENTS.md +8 -6
  2. package/CHANGELOG.md +26 -0
  3. package/MIGRATING.md +815 -23
  4. package/README.md +45 -32
  5. package/agent/rules/basalt-batteries.md +205 -0
  6. package/agent/rules/basalt-charts.md +125 -555
  7. package/agent/rules/basalt-controls.md +160 -0
  8. package/agent/rules/basalt-mantine.md +146 -439
  9. package/agent/rules/basalt-state.md +118 -96
  10. package/agent/rules/basalt-tokens.md +126 -288
  11. package/agent/skills/basalt-app/SKILL.md +70 -195
  12. package/agent/skills/basalt-charts/SKILL.md +54 -234
  13. package/agent/skills/basalt-design/SKILL.md +56 -248
  14. package/agent/templates/CLAUDE-block.md.tpl +31 -40
  15. package/agent/templates/DESIGN.md.tpl +22 -51
  16. package/configs/oxlint-plugin.js +1465 -36
  17. package/configs/oxlint-plugin.test.ts +1190 -11
  18. package/configs/oxlint.json +11 -3
  19. package/dist/charts/cursor/resolve.d.ts +18 -0
  20. package/dist/charts/cursor/resolve.d.ts.map +1 -1
  21. package/dist/charts/cursor/resolve.js +15 -6
  22. package/dist/charts/cursor/scope.d.ts +6 -3
  23. package/dist/charts/cursor/scope.d.ts.map +1 -1
  24. package/dist/charts/cursor/store.d.ts +5 -1
  25. package/dist/charts/cursor/store.d.ts.map +1 -1
  26. package/dist/charts/cursor/store.js +4 -4
  27. package/dist/charts/hooks/useChartCursor.d.ts.map +1 -1
  28. package/dist/charts/hooks/useChartCursor.js +9 -8
  29. package/dist/charts/index.d.ts +2 -2
  30. package/dist/charts/index.d.ts.map +1 -1
  31. package/dist/charts/primitives/ChartCard.d.ts +34 -9
  32. package/dist/charts/primitives/ChartCard.d.ts.map +1 -1
  33. package/dist/charts/primitives/ChartCard.js +29 -114
  34. package/dist/charts/primitives/ChartCard.test.d.ts +2 -0
  35. package/dist/charts/primitives/ChartCard.test.d.ts.map +1 -0
  36. package/dist/charts/sparklines/BarSparkline.d.ts +26 -2
  37. package/dist/charts/sparklines/BarSparkline.d.ts.map +1 -1
  38. package/dist/charts/sparklines/BarSparkline.js +18 -4
  39. package/dist/cli/check-coverage.test.d.ts +2 -0
  40. package/dist/cli/check-coverage.test.d.ts.map +1 -0
  41. package/dist/cli/index.d.ts +67 -4
  42. package/dist/cli/index.d.ts.map +1 -1
  43. package/dist/cli/index.js +225 -7
  44. package/dist/connectivity/connectivity-indicator.d.ts +4 -1
  45. package/dist/connectivity/connectivity-indicator.d.ts.map +1 -1
  46. package/dist/connectivity/connectivity-indicator.js +1 -1
  47. package/dist/content/index.d.ts +5 -3
  48. package/dist/content/index.d.ts.map +1 -1
  49. package/dist/content/index.js +4 -2
  50. package/dist/content/prose.module.css +7 -28
  51. package/dist/controls/actions.d.ts +169 -0
  52. package/dist/controls/actions.d.ts.map +1 -0
  53. package/dist/controls/actions.js +287 -0
  54. package/dist/controls/actions.module.css +62 -0
  55. package/dist/controls/actions.module.css.d.ts +13 -0
  56. package/dist/controls/actions.test.d.ts +2 -0
  57. package/dist/controls/actions.test.d.ts.map +1 -0
  58. package/dist/controls/actions.type-guard.test.d.ts +2 -0
  59. package/dist/controls/actions.type-guard.test.d.ts.map +1 -0
  60. package/dist/controls/compare-filter.d.ts +41 -0
  61. package/dist/controls/compare-filter.d.ts.map +1 -0
  62. package/dist/controls/compare-filter.js +23 -0
  63. package/dist/controls/control-group.d.ts +19 -0
  64. package/dist/controls/control-group.d.ts.map +1 -0
  65. package/dist/controls/control-group.js +20 -0
  66. package/dist/controls/control-group.test.d.ts +2 -0
  67. package/dist/controls/control-group.test.d.ts.map +1 -0
  68. package/dist/controls/controls.module.css +542 -0
  69. package/dist/controls/controls.module.css.d.ts +35 -0
  70. package/dist/controls/controls.router.test.d.ts +2 -0
  71. package/dist/controls/controls.router.test.d.ts.map +1 -0
  72. package/dist/controls/enum-filter.d.ts +39 -0
  73. package/dist/controls/enum-filter.d.ts.map +1 -0
  74. package/dist/controls/enum-filter.js +93 -0
  75. package/dist/controls/filter-context.d.ts +60 -0
  76. package/dist/controls/filter-context.d.ts.map +1 -0
  77. package/dist/controls/filter-context.js +69 -0
  78. package/dist/controls/filter-pill.d.ts +28 -0
  79. package/dist/controls/filter-pill.d.ts.map +1 -0
  80. package/dist/controls/filter-pill.js +70 -0
  81. package/dist/controls/filter-set.d.ts +13 -0
  82. package/dist/controls/filter-set.d.ts.map +1 -0
  83. package/dist/controls/filter-set.js +125 -0
  84. package/dist/controls/filter-set.test.d.ts +2 -0
  85. package/dist/controls/filter-set.test.d.ts.map +1 -0
  86. package/dist/controls/filter-sheet.d.ts +117 -0
  87. package/dist/controls/filter-sheet.d.ts.map +1 -0
  88. package/dist/controls/filter-sheet.js +146 -0
  89. package/dist/controls/glyphs.d.ts +27 -0
  90. package/dist/controls/glyphs.d.ts.map +1 -0
  91. package/dist/controls/glyphs.js +49 -0
  92. package/dist/controls/index.d.ts +20 -0
  93. package/dist/controls/index.d.ts.map +1 -0
  94. package/dist/controls/index.js +46 -0
  95. package/dist/controls/multi-select-filter.d.ts +23 -0
  96. package/dist/controls/multi-select-filter.d.ts.map +1 -0
  97. package/dist/controls/multi-select-filter.js +89 -0
  98. package/dist/controls/number-filter.d.ts +26 -0
  99. package/dist/controls/number-filter.d.ts.map +1 -0
  100. package/dist/controls/number-filter.js +143 -0
  101. package/dist/controls/peer-boundary.test.d.ts +2 -0
  102. package/dist/controls/peer-boundary.test.d.ts.map +1 -0
  103. package/dist/controls/props-contract.test.d.ts +2 -0
  104. package/dist/controls/props-contract.test.d.ts.map +1 -0
  105. package/dist/controls/range-filter.d.ts +43 -0
  106. package/dist/controls/range-filter.d.ts.map +1 -0
  107. package/dist/controls/range-filter.js +135 -0
  108. package/dist/controls/range-filter.type-guard.test.d.ts +2 -0
  109. package/dist/controls/range-filter.type-guard.test.d.ts.map +1 -0
  110. package/dist/controls/search-filter.d.ts +10 -0
  111. package/dist/controls/search-filter.d.ts.map +1 -0
  112. package/dist/controls/search-filter.js +81 -0
  113. package/dist/controls/select-filter.d.ts +74 -0
  114. package/dist/controls/select-filter.d.ts.map +1 -0
  115. package/dist/controls/select-filter.js +10 -0
  116. package/dist/controls/sync-button.d.ts +38 -0
  117. package/dist/controls/sync-button.d.ts.map +1 -0
  118. package/dist/controls/sync-button.js +119 -0
  119. package/dist/controls/sync-button.module.css +63 -0
  120. package/dist/controls/sync-button.module.css.d.ts +11 -0
  121. package/dist/controls/sync-button.test.d.ts +2 -0
  122. package/dist/controls/sync-button.test.d.ts.map +1 -0
  123. package/dist/controls/toggle-filter.d.ts +9 -0
  124. package/dist/controls/toggle-filter.d.ts.map +1 -0
  125. package/dist/controls/toggle-filter.js +42 -0
  126. package/dist/controls/view-tabs.d.ts +23 -0
  127. package/dist/controls/view-tabs.d.ts.map +1 -0
  128. package/dist/controls/view-tabs.js +59 -0
  129. package/dist/controls-dates/date-range-picker.d.ts +4 -0
  130. package/dist/controls-dates/date-range-picker.d.ts.map +1 -0
  131. package/dist/controls-dates/date-range-picker.js +18 -0
  132. package/dist/controls-dates/index.d.ts +9 -0
  133. package/dist/controls-dates/index.d.ts.map +1 -0
  134. package/dist/controls-dates/index.js +4 -0
  135. package/dist/dashboard/delta-badge.d.ts +6 -12
  136. package/dist/dashboard/delta-badge.d.ts.map +1 -1
  137. package/dist/dashboard/delta-badge.js +1 -50
  138. package/dist/dashboard/index.d.ts +1 -1
  139. package/dist/dashboard/index.d.ts.map +1 -1
  140. package/dist/dashboard/index.js +3 -1
  141. package/dist/dashboard/settings-section.d.ts +6 -4
  142. package/dist/dashboard/settings-section.d.ts.map +1 -1
  143. package/dist/dashboard/settings-section.js +23 -16
  144. package/dist/dashboard/settings-section.module.css +10 -0
  145. package/dist/dashboard/settings-section.module.css.d.ts +1 -0
  146. package/dist/dashboard/settings-section.test.d.ts +2 -0
  147. package/dist/dashboard/settings-section.test.d.ts.map +1 -0
  148. package/dist/dashboard/stat-card.d.ts +95 -9
  149. package/dist/dashboard/stat-card.d.ts.map +1 -1
  150. package/dist/dashboard/stat-card.js +108 -49
  151. package/dist/dashboard/stat-card.module.css +153 -0
  152. package/dist/dashboard/stat-card.module.css.d.ts +15 -0
  153. package/dist/data/data-table.d.ts +37 -15
  154. package/dist/data/data-table.d.ts.map +1 -1
  155. package/dist/data/data-table.js +96 -58
  156. package/dist/guard/grace.test.d.ts +20 -0
  157. package/dist/guard/grace.test.d.ts.map +1 -0
  158. package/dist/guard/index.d.ts +66 -3
  159. package/dist/guard/index.d.ts.map +1 -1
  160. package/dist/guard/index.js +78 -7
  161. package/dist/guard/types.d.ts +3 -3
  162. package/dist/guard/types.d.ts.map +1 -1
  163. package/dist/index.d.ts +13 -3
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js +13 -10
  166. package/dist/nav/types.d.ts +78 -2
  167. package/dist/nav/types.d.ts.map +1 -1
  168. package/dist/notifications/bell.d.ts +4 -1
  169. package/dist/notifications/bell.d.ts.map +1 -1
  170. package/dist/notifications/index.d.ts +1 -1
  171. package/dist/router-tanstack/field.d.ts +14 -0
  172. package/dist/router-tanstack/field.d.ts.map +1 -0
  173. package/dist/router-tanstack/field.js +4 -0
  174. package/dist/router-tanstack/index.d.ts +6 -2
  175. package/dist/router-tanstack/index.d.ts.map +1 -1
  176. package/dist/router-tanstack/index.js +4 -0
  177. package/dist/router-tanstack/multi-search-param-store.d.ts +4 -52
  178. package/dist/router-tanstack/multi-search-param-store.d.ts.map +1 -1
  179. package/dist/router-tanstack/multi-search-param-store.js +19 -27
  180. package/dist/router-tanstack/search-param-store.d.ts +3 -87
  181. package/dist/router-tanstack/search-param-store.d.ts.map +1 -1
  182. package/dist/router-tanstack/search-param-store.js +16 -45
  183. package/dist/router-tanstack/search-store.d.ts +84 -0
  184. package/dist/router-tanstack/search-store.d.ts.map +1 -0
  185. package/dist/router-tanstack/search-store.js +271 -0
  186. package/dist/router-tanstack/search-store.router.test.d.ts +2 -0
  187. package/dist/router-tanstack/search-store.router.test.d.ts.map +1 -0
  188. package/dist/router-tanstack/search-store.test.d.ts +2 -0
  189. package/dist/router-tanstack/search-store.test.d.ts.map +1 -0
  190. package/dist/router-tanstack/use-nav.d.ts +0 -2
  191. package/dist/router-tanstack/use-nav.d.ts.map +1 -1
  192. package/dist/router-tanstack/use-nav.js +34 -12
  193. package/dist/router-tanstack/use-nav.test.d.ts +2 -0
  194. package/dist/router-tanstack/use-nav.test.d.ts.map +1 -0
  195. package/dist/section/index.d.ts +2 -0
  196. package/dist/section/index.d.ts.map +1 -0
  197. package/dist/section/index.js +4 -0
  198. package/dist/section/section.d.ts +24 -0
  199. package/dist/section/section.d.ts.map +1 -0
  200. package/dist/section/section.js +126 -0
  201. package/dist/section/section.module.css +104 -0
  202. package/dist/section/section.module.css.d.ts +11 -0
  203. package/dist/section/section.test.d.ts +2 -0
  204. package/dist/section/section.test.d.ts.map +1 -0
  205. package/dist/shell/app-breadcrumbs.d.ts.map +1 -1
  206. package/dist/shell/app-breadcrumbs.js +18 -15
  207. package/dist/shell/app-header.module.css +77 -37
  208. package/dist/shell/app-header.module.css.d.ts +2 -1
  209. package/dist/shell/app-mobile-nav.d.ts +9 -2
  210. package/dist/shell/app-mobile-nav.d.ts.map +1 -1
  211. package/dist/shell/app-mobile-nav.js +98 -11
  212. package/dist/shell/app-mobile-nav.module.css +8 -0
  213. package/dist/shell/app-mobile-nav.module.css.d.ts +1 -0
  214. package/dist/shell/app-sidebar.d.ts +55 -28
  215. package/dist/shell/app-sidebar.d.ts.map +1 -1
  216. package/dist/shell/app-sidebar.js +116 -67
  217. package/dist/shell/app-sidebar.module.css +303 -20
  218. package/dist/shell/app-sidebar.module.css.d.ts +19 -1
  219. package/dist/shell/index.d.ts +55 -21
  220. package/dist/shell/index.d.ts.map +1 -1
  221. package/dist/shell/index.js +40 -18
  222. package/dist/shell/mobile-nav-model.d.ts +13 -2
  223. package/dist/shell/mobile-nav-model.d.ts.map +1 -1
  224. package/dist/shell/mobile-nav-model.js +15 -1
  225. package/dist/shell/nav-count-badge.d.ts +1 -1
  226. package/dist/shell/page-bar.d.ts +51 -0
  227. package/dist/shell/page-bar.d.ts.map +1 -0
  228. package/dist/shell/page-bar.js +154 -0
  229. package/dist/shell/page-bar.module.css +178 -0
  230. package/dist/shell/page-bar.module.css.d.ts +17 -0
  231. package/dist/shell/page-bar.test.d.ts +2 -0
  232. package/dist/shell/page-bar.test.d.ts.map +1 -0
  233. package/dist/shell/sidebar-block-model.d.ts +48 -0
  234. package/dist/shell/sidebar-block-model.d.ts.map +1 -0
  235. package/dist/shell/sidebar-block-model.js +39 -0
  236. package/dist/shell/sidebar-blocks.d.ts +32 -0
  237. package/dist/shell/sidebar-blocks.d.ts.map +1 -0
  238. package/dist/shell/sidebar-blocks.js +169 -0
  239. package/dist/shell/sidebar-search.d.ts +13 -1
  240. package/dist/shell/sidebar-search.d.ts.map +1 -1
  241. package/dist/shell/sidebar-search.js +34 -1
  242. package/dist/shell/sidebar-search.module.css +26 -0
  243. package/dist/shell/sidebar-search.module.css.d.ts +2 -0
  244. package/dist/state/fields.d.ts +565 -0
  245. package/dist/state/fields.d.ts.map +1 -0
  246. package/dist/state/fields.js +405 -0
  247. package/dist/state/fields.test.d.ts +2 -0
  248. package/dist/state/fields.test.d.ts.map +1 -0
  249. package/dist/state/persisted.d.ts +60 -0
  250. package/dist/state/persisted.d.ts.map +1 -0
  251. package/dist/state/persisted.js +123 -0
  252. package/dist/state/persisted.test.d.ts +2 -0
  253. package/dist/state/persisted.test.d.ts.map +1 -0
  254. package/dist/state.d.ts +11 -56
  255. package/dist/state.d.ts.map +1 -1
  256. package/dist/state.js +14 -120
  257. package/dist/styles.css +13 -0
  258. package/dist/surfaces.d.ts +106 -24
  259. package/dist/surfaces.d.ts.map +1 -1
  260. package/dist/surfaces.js +156 -19
  261. package/dist/theme/controls.module.css +16 -1
  262. package/dist/theme/ctl-theme.d.ts +32 -0
  263. package/dist/theme/ctl-theme.d.ts.map +1 -0
  264. package/dist/theme/ctl-theme.js +54 -0
  265. package/dist/theme/ctl-theme.test.d.ts +2 -0
  266. package/dist/theme/ctl-theme.test.d.ts.map +1 -0
  267. package/dist/theme/ctl-tier-coverage.test.d.ts +2 -0
  268. package/dist/theme/ctl-tier-coverage.test.d.ts.map +1 -0
  269. package/dist/theme/divider-law.test.d.ts +2 -0
  270. package/dist/theme/divider-law.test.d.ts.map +1 -0
  271. package/dist/theme/icon-slot.d.ts +44 -0
  272. package/dist/theme/icon-slot.d.ts.map +1 -0
  273. package/dist/theme/icon-slot.js +21 -0
  274. package/dist/theme/icon-slot.module.css +47 -0
  275. package/dist/theme/icon-slot.module.css.d.ts +8 -0
  276. package/dist/theme/icon-slot.test.d.ts +2 -0
  277. package/dist/theme/icon-slot.test.d.ts.map +1 -0
  278. package/dist/theme/index.d.ts +1 -0
  279. package/dist/theme/index.d.ts.map +1 -1
  280. package/dist/theme/index.js +82 -5
  281. package/dist/theme/layout-rhythm-css.test.d.ts +2 -0
  282. package/dist/theme/layout-rhythm-css.test.d.ts.map +1 -0
  283. package/dist/theme/segmented-control.module.css +20 -0
  284. package/dist/theme/shadow-surfaces.test.d.ts.map +1 -1
  285. package/dist/tokens/index.d.ts +12 -0
  286. package/dist/tokens/index.d.ts.map +1 -1
  287. package/dist/tokens/index.js +38 -8
  288. package/dist/tokens/palette.d.ts +97 -61
  289. package/dist/tokens/palette.d.ts.map +1 -1
  290. package/dist/tokens/palette.js +76 -38
  291. package/dist/tokens.css +10 -2
  292. package/dist/widget-header/delta-badge.d.ts +13 -0
  293. package/dist/widget-header/delta-badge.d.ts.map +1 -0
  294. package/dist/widget-header/delta-badge.js +29 -0
  295. package/dist/widget-header/delta-badge.test.d.ts +2 -0
  296. package/dist/widget-header/delta-badge.test.d.ts.map +1 -0
  297. package/dist/widget-header/index.d.ts +3 -0
  298. package/dist/widget-header/index.d.ts.map +1 -0
  299. package/dist/widget-header/index.js +6 -0
  300. package/dist/widget-header/no-mantine.test.d.ts +2 -0
  301. package/dist/widget-header/no-mantine.test.d.ts.map +1 -0
  302. package/dist/widget-header/widget-header.d.ts +67 -0
  303. package/dist/widget-header/widget-header.d.ts.map +1 -0
  304. package/dist/widget-header/widget-header.js +89 -0
  305. package/dist/widget-header/widget-header.module.css +350 -0
  306. package/dist/widget-header/widget-header.module.css.d.ts +25 -0
  307. package/dist/widget-header/widget-header.test.d.ts +2 -0
  308. package/dist/widget-header/widget-header.test.d.ts.map +1 -0
  309. package/llms.txt +30 -17
  310. package/package.json +14 -1
  311. package/src/charts/cursor/resolve.test.ts +29 -1
  312. package/src/charts/cursor/resolve.ts +38 -6
  313. package/src/charts/cursor/scope.tsx +6 -3
  314. package/src/charts/cursor/store.test.ts +19 -1
  315. package/src/charts/cursor/store.ts +10 -5
  316. package/src/charts/hooks/useChartCursor.ts +16 -8
  317. package/src/charts/index.ts +2 -2
  318. package/src/charts/primitives/CartesianChart.test.tsx +124 -0
  319. package/src/charts/primitives/ChartCard.test.tsx +66 -0
  320. package/src/charts/primitives/ChartCard.tsx +86 -146
  321. package/src/charts/sparklines/BarSparkline.tsx +43 -5
  322. package/src/cli/check-coverage.test.ts +297 -0
  323. package/src/cli/check-theme.test.ts +38 -14
  324. package/src/cli/index.ts +392 -16
  325. package/src/cli/init-sync.test.ts +97 -0
  326. package/src/connectivity/connectivity-indicator.tsx +16 -9
  327. package/src/content/index.ts +16 -3
  328. package/src/content/prose.module.css +7 -28
  329. package/src/content/prose.module.css.test.ts +8 -24
  330. package/src/controls/actions.module.css +62 -0
  331. package/src/controls/actions.module.css.d.ts +13 -0
  332. package/src/controls/actions.test.tsx +252 -0
  333. package/src/controls/actions.tsx +655 -0
  334. package/src/controls/actions.type-guard.test.ts +63 -0
  335. package/src/controls/compare-filter.tsx +64 -0
  336. package/src/controls/control-group.test.tsx +229 -0
  337. package/src/controls/control-group.tsx +63 -0
  338. package/src/controls/controls.module.css +542 -0
  339. package/src/controls/controls.module.css.d.ts +35 -0
  340. package/src/controls/controls.router.test.tsx +1053 -0
  341. package/src/controls/enum-filter.tsx +170 -0
  342. package/src/controls/filter-context.tsx +158 -0
  343. package/src/controls/filter-pill.tsx +120 -0
  344. package/src/controls/filter-set.test.tsx +472 -0
  345. package/src/controls/filter-set.tsx +225 -0
  346. package/src/controls/filter-sheet.tsx +285 -0
  347. package/src/controls/glyphs.tsx +81 -0
  348. package/src/controls/index.ts +49 -0
  349. package/src/controls/multi-select-filter.tsx +140 -0
  350. package/src/controls/number-filter.tsx +291 -0
  351. package/src/controls/peer-boundary.test.ts +85 -0
  352. package/src/controls/props-contract.test.tsx +137 -0
  353. package/src/controls/range-filter.tsx +237 -0
  354. package/src/controls/range-filter.type-guard.test.tsx +122 -0
  355. package/src/controls/search-filter.tsx +123 -0
  356. package/src/controls/select-filter.tsx +89 -0
  357. package/src/controls/sync-button.module.css +63 -0
  358. package/src/controls/sync-button.module.css.d.ts +11 -0
  359. package/src/controls/sync-button.test.tsx +183 -0
  360. package/src/controls/sync-button.tsx +197 -0
  361. package/src/controls/toggle-filter.tsx +60 -0
  362. package/src/controls/view-tabs.tsx +110 -0
  363. package/src/controls-dates/date-range-picker.tsx +42 -0
  364. package/src/controls-dates/index.ts +8 -0
  365. package/src/dashboard/delta-badge.tsx +4 -74
  366. package/src/dashboard/index.ts +6 -1
  367. package/src/dashboard/settings-section.module.css +10 -0
  368. package/src/dashboard/settings-section.module.css.d.ts +1 -0
  369. package/src/dashboard/settings-section.test.tsx +56 -0
  370. package/src/dashboard/settings-section.tsx +33 -30
  371. package/src/dashboard/stat-card.module.css +153 -0
  372. package/src/dashboard/stat-card.module.css.d.ts +15 -0
  373. package/src/dashboard/stat-card.test.tsx +298 -1
  374. package/src/dashboard/stat-card.tsx +289 -67
  375. package/src/data/data-table.test.tsx +96 -11
  376. package/src/data/data-table.tsx +228 -84
  377. package/src/guard/check-source.test.ts +159 -13
  378. package/src/guard/grace.test.ts +158 -0
  379. package/src/guard/index.ts +185 -29
  380. package/src/guard/types.ts +4 -2
  381. package/src/index.ts +51 -5
  382. package/src/nav/types.ts +84 -2
  383. package/src/notifications/bell.tsx +6 -3
  384. package/src/notifications/index.ts +1 -1
  385. package/src/router-tanstack/field.ts +35 -0
  386. package/src/router-tanstack/index.ts +28 -2
  387. package/src/router-tanstack/multi-search-param-store.test.ts +71 -3
  388. package/src/router-tanstack/multi-search-param-store.ts +46 -77
  389. package/src/router-tanstack/search-param-store.ts +42 -159
  390. package/src/router-tanstack/search-store.router.test.tsx +882 -0
  391. package/src/router-tanstack/search-store.test.ts +578 -0
  392. package/src/router-tanstack/search-store.ts +546 -0
  393. package/src/router-tanstack/use-nav.test.tsx +187 -0
  394. package/src/router-tanstack/use-nav.ts +72 -14
  395. package/src/section/index.ts +1 -0
  396. package/src/section/section.module.css +104 -0
  397. package/src/section/section.module.css.d.ts +11 -0
  398. package/src/section/section.test.tsx +204 -0
  399. package/src/section/section.tsx +220 -0
  400. package/src/shell/app-breadcrumbs.tsx +44 -31
  401. package/src/shell/app-header.module.css +77 -37
  402. package/src/shell/app-header.module.css.d.ts +2 -1
  403. package/src/shell/app-mobile-nav.module.css +8 -0
  404. package/src/shell/app-mobile-nav.module.css.d.ts +1 -0
  405. package/src/shell/app-mobile-nav.tsx +147 -8
  406. package/src/shell/app-sidebar-account.tsx +2 -2
  407. package/src/shell/app-sidebar.module.css +303 -20
  408. package/src/shell/app-sidebar.module.css.d.ts +19 -1
  409. package/src/shell/app-sidebar.test.tsx +456 -41
  410. package/src/shell/app-sidebar.tsx +276 -140
  411. package/src/shell/index.test.tsx +291 -5
  412. package/src/shell/index.tsx +137 -38
  413. package/src/shell/mobile-nav-model.test.ts +228 -7
  414. package/src/shell/mobile-nav-model.ts +53 -3
  415. package/src/shell/nav-count-badge.tsx +1 -1
  416. package/src/shell/page-bar.module.css +178 -0
  417. package/src/shell/page-bar.module.css.d.ts +17 -0
  418. package/src/shell/page-bar.test.tsx +316 -0
  419. package/src/shell/page-bar.tsx +315 -0
  420. package/src/shell/sidebar-block-model.ts +83 -0
  421. package/src/shell/sidebar-blocks.tsx +301 -0
  422. package/src/shell/sidebar-search.module.css +26 -0
  423. package/src/shell/sidebar-search.module.css.d.ts +2 -0
  424. package/src/shell/sidebar-search.tsx +71 -2
  425. package/src/state/fields.test.tsx +512 -0
  426. package/src/state/fields.ts +1150 -0
  427. package/src/state/persisted.test.ts +91 -0
  428. package/src/state/persisted.ts +261 -0
  429. package/src/state.ts +52 -240
  430. package/src/styles.css +13 -0
  431. package/src/surfaces.ts +204 -36
  432. package/src/theme/controls.module.css +16 -1
  433. package/src/theme/ctl-theme.test.tsx +275 -0
  434. package/src/theme/ctl-theme.tsx +138 -0
  435. package/src/theme/ctl-tier-coverage.test.ts +170 -0
  436. package/src/theme/density-relations.test.ts +106 -51
  437. package/src/theme/divider-law.test.ts +259 -0
  438. package/src/theme/icon-slot.module.css +47 -0
  439. package/src/theme/icon-slot.module.css.d.ts +8 -0
  440. package/src/theme/icon-slot.test.tsx +275 -0
  441. package/src/theme/icon-slot.tsx +59 -0
  442. package/src/theme/index.ts +165 -3
  443. package/src/theme/layout-rhythm-css.test.ts +72 -0
  444. package/src/theme/radius.test.ts +11 -1
  445. package/src/theme/segmented-control.module.css +20 -0
  446. package/src/theme/shadow-surfaces.test.ts +20 -7
  447. package/src/theme/spacing.test.ts +75 -27
  448. package/src/theme/use-basalt-spacing.ts +2 -2
  449. package/src/tokens/density.test.ts +7 -25
  450. package/src/tokens/index.ts +48 -8
  451. package/src/tokens/palette.ts +107 -73
  452. package/src/widget-header/delta-badge.test.tsx +60 -0
  453. package/src/widget-header/delta-badge.tsx +57 -0
  454. package/src/widget-header/index.ts +2 -0
  455. package/src/widget-header/no-mantine.test.ts +33 -0
  456. package/src/widget-header/widget-header.module.css +350 -0
  457. package/src/widget-header/widget-header.module.css.d.ts +25 -0
  458. package/src/widget-header/widget-header.test.tsx +187 -0
  459. package/src/widget-header/widget-header.tsx +213 -0
  460. package/agent/rules/basalt-agent.md +0 -452
  461. package/agent/rules/basalt-app.md +0 -246
  462. package/agent/rules/basalt-commands.md +0 -320
  463. package/agent/rules/basalt-content.md +0 -409
  464. package/agent/rules/basalt-data.md +0 -329
  465. package/agent/rules/basalt-forms.md +0 -186
  466. package/agent/rules/basalt-notifications.md +0 -264
  467. package/agent/rules/basalt-query.md +0 -187
  468. package/agent/rules/basalt-router.md +0 -336
  469. package/dist/content/article-filter-bar.d.ts +0 -40
  470. package/dist/content/article-filter-bar.d.ts.map +0 -1
  471. package/dist/content/article-filter-bar.js +0 -56
  472. package/dist/shell/page-header.d.ts +0 -13
  473. package/dist/shell/page-header.d.ts.map +0 -1
  474. package/dist/shell/page-header.js +0 -23
  475. package/src/content/article-filter-bar.tsx +0 -88
  476. package/src/shell/page-header.tsx +0 -35
@@ -0,0 +1,565 @@
1
+ /**
2
+ * Which lanes a field lives on, declared ONCE at definition (C4).
3
+ *
4
+ * `url` is the truth; `persist` is the localStorage mirror UNDER it. `history` picks the entry a
5
+ * write creates. Declare the lane inline (`field.boolean(false, { url: false })`) — a lane held in
6
+ * a widened variable still behaves correctly at runtime, but the TYPE-level lane filter that keeps
7
+ * a local-only field out of `validateSearch` can only narrow a literal.
8
+ *
9
+ * @default `{ url: true, persist: true, history: 'replace' }`
10
+ */
11
+ export type FieldLane = {
12
+ /** Put the field in the URL search. `false` = the mirror-only lane (per-chart selects, compact). */
13
+ url?: boolean;
14
+ /**
15
+ * Mirror the field in localStorage. `false` = the URL-only lane (pagination, one-shot filters);
16
+ * with `url: false` as well, the MEMORY-only lane — shared across every mount of the store for
17
+ * the session, gone on reload, never in localStorage. `createLocalStore` ignores `url`, so
18
+ * `persist: false` alone lands a field there.
19
+ */
20
+ persist?: boolean;
21
+ /** History entry a write creates. @default 'replace' */
22
+ history?: 'push' | 'replace';
23
+ };
24
+ /** A `FieldLane` with every default applied — what a field descriptor actually carries. */
25
+ export type ResolvedLane = {
26
+ url: boolean;
27
+ persist: boolean;
28
+ history: 'push' | 'replace';
29
+ };
30
+ /** Lane defaults at the type level. Only an inline (const-inferred) lane object narrows. */
31
+ export type ResolveLane<L> = {
32
+ url: L extends {
33
+ url: false;
34
+ } ? false : true;
35
+ persist: L extends {
36
+ persist: false;
37
+ } ? false : true;
38
+ history: L extends {
39
+ history: 'push';
40
+ } ? 'push' : 'replace';
41
+ };
42
+ /**
43
+ * A field's fallback: the value, or a THUNK evaluated at read time (`field.string({ fallback: () =>
44
+ * todayIso() })`). A thunk is re-evaluated on every read while nothing is written, and is never
45
+ * itself persisted — a write stores the value the control produced, like any other.
46
+ *
47
+ * The LOCAL and MEMORY lanes only. `createSearchStore` throws at definition for a thunk on a
48
+ * URL-lane field: `validateSearch` would evaluate it on every navigation and pin the result into the
49
+ * URL, so a deep link would carry a value nobody chose.
50
+ */
51
+ export type FieldFallback<T> = T | (() => T);
52
+ /** Resolves a per-preset window at call time. Returns ISO dates — what `toWindow` hands an API. */
53
+ export type RangeWindow = (now: Date) => {
54
+ from: string;
55
+ to: string;
56
+ };
57
+ /**
58
+ * Per-preset window resolvers for a range field. A preset WITH one resolves through `toWindow()` to
59
+ * `{ from, to }`; a preset without keeps `{ window: preset }` — which is what lets a derived preset
60
+ * (`3m`, `ytd`) live in the same field as a server-understood one (`7d`) instead of forcing a
61
+ * hand-rolled `presetToParams` beside the store.
62
+ */
63
+ export type RangeWindows<P extends string> = Partial<Record<P, RangeWindow>>;
64
+ /** The value of a range field: one preset, plus two ISO dates when the preset is `'custom'`. */
65
+ export type RangeValue<P extends string> = {
66
+ preset: P;
67
+ from?: string | undefined;
68
+ to?: string | undefined;
69
+ };
70
+ /** Renamed URL params for a range field. Defaults: the field's own name, `from`, `to`. */
71
+ export type RangeParams = {
72
+ preset?: string;
73
+ from?: string;
74
+ to?: string;
75
+ };
76
+ export type EnumField<T extends string = string, Ln extends ResolvedLane = ResolvedLane> = {
77
+ readonly kind: 'enum';
78
+ readonly values: readonly T[];
79
+ readonly fallback: FieldFallback<T>;
80
+ readonly lane: Ln;
81
+ };
82
+ export type MultiField<T extends string = string, Ln extends ResolvedLane = ResolvedLane> = {
83
+ readonly kind: 'multi';
84
+ readonly values: readonly T[];
85
+ readonly fallback: FieldFallback<readonly T[]>;
86
+ readonly lane: Ln;
87
+ };
88
+ export type RangeField<P extends string = string, C extends boolean = boolean, Pm extends RangeParams = RangeParams, Ln extends ResolvedLane = ResolvedLane, W extends string = never> = {
89
+ readonly kind: 'range';
90
+ /** The declared presets — `'custom'` is NOT one of them, it is `custom: true`'s consequence. */
91
+ readonly presets: readonly P[];
92
+ readonly fallback: FieldFallback<RangeValue<P>>;
93
+ /** `true` → the preset `'custom'` plus `from`/`to` ISO dates are legal values. */
94
+ readonly custom: C;
95
+ readonly params: Pm;
96
+ /**
97
+ * The declared window resolvers, keyed by preset — `W` is exactly the presets that HAVE one, so
98
+ * `toWindow`'s return type can drop them from its `{ window }` branch and an API param type
99
+ * accepts the result with no cast.
100
+ *
101
+ * `W` defaults to `never` (`window: {}`), which is what keeps every `RangeField<P>` assignable to
102
+ * the widened `AnyField` a control's props take: a narrower resolver map is assignable to `{}`,
103
+ * and a widened handle's `toWindow` then excludes nothing rather than everything.
104
+ */
105
+ readonly window: RangeWindows<W>;
106
+ readonly lane: Ln;
107
+ };
108
+ /**
109
+ * The preset union a range field's VALUES range over: the declared presets, plus `'custom'` unless
110
+ * the field opted out.
111
+ *
112
+ * `C` widened to `boolean` (a bare `RangeField<P>`) keeps `'custom'` — but a PROP typed that way
113
+ * accepts only a custom-capable handle, because the handle's setter is contravariant in the value:
114
+ * `field.range` without `custom: true` hands out a `RangeField<P, false>`, whose setter refuses a
115
+ * `'custom'` preset. A wrapper that must take any range handle is generic over the flag
116
+ * (`<P extends string, C extends boolean>` + `FieldHandle<RangeField<P, C>>`); one that only ever
117
+ * takes the preset-only shape pins `RangeField<P, false>`.
118
+ */
119
+ export type RangePresets<P, C> = (P & string) | (C extends false ? never : 'custom');
120
+ export type NumberField<Ln extends ResolvedLane = ResolvedLane> = {
121
+ readonly kind: 'number';
122
+ readonly fallback: FieldFallback<number>;
123
+ readonly min: number | undefined;
124
+ readonly max: number | undefined;
125
+ readonly int: boolean;
126
+ readonly lane: Ln;
127
+ };
128
+ export type BooleanField<Ln extends ResolvedLane = ResolvedLane> = {
129
+ readonly kind: 'boolean';
130
+ readonly fallback: FieldFallback<boolean>;
131
+ readonly lane: Ln;
132
+ };
133
+ export type StringField<Ln extends ResolvedLane = ResolvedLane> = {
134
+ readonly kind: 'string';
135
+ readonly fallback: FieldFallback<string>;
136
+ readonly max: number | undefined;
137
+ readonly lane: Ln;
138
+ };
139
+ /** Every field kind, widened — the constraint a store's `fields` map satisfies. */
140
+ export type AnyField = EnumField | MultiField | RangeField | NumberField | BooleanField | StringField;
141
+ /** The value `use()` reads and writes for one field. Range fields deal in `RangeValue`. */
142
+ export type FieldValue<F extends AnyField> = F extends {
143
+ kind: 'enum';
144
+ values: readonly (infer T)[];
145
+ } ? T : F extends {
146
+ kind: 'multi';
147
+ values: readonly (infer T)[];
148
+ } ? readonly T[] : F extends {
149
+ kind: 'range';
150
+ presets: readonly (infer P)[];
151
+ custom: infer C;
152
+ } ? RangeValue<RangePresets<P, C>> : F extends {
153
+ kind: 'number';
154
+ } ? number : F extends {
155
+ kind: 'boolean';
156
+ } ? boolean : F extends {
157
+ kind: 'string';
158
+ } ? string : never;
159
+ /**
160
+ * The second, optional argument of a `FieldHandle` setter.
161
+ *
162
+ * @example field.tab.use()[1]('overview', { patch: { detailDate: undefined } })
163
+ */
164
+ export type FieldSetOptions = {
165
+ /**
166
+ * Extra search params merged into the SAME navigate as the field's own write — the URL lane only
167
+ * (a local/memory-lane write has no navigate to merge into, and ignores this). For keys the STORE
168
+ * DOES NOT OWN: clearing a sibling param the page put there (`{ detailDate: undefined }`) used to
169
+ * need a second `navigate` beside the setter, which either lost the field's write or produced two
170
+ * history entries. The field's own params always win, so a `patch` cannot corrupt the value being
171
+ * set.
172
+ *
173
+ * A key ANOTHER field of the same store owns is refused — it would reach the URL while the
174
+ * mirror kept the old value, so the next paramless visit and every `linkSearch` link disagree
175
+ * with the page the write happened on. `createSearchStore` throws in dev and logs in production;
176
+ * write that field through its own setter instead.
177
+ *
178
+ * A write from a route that does not validate the field persists only (A1) and drops the patch
179
+ * with it — there is no navigate to merge into. Dev warns once per field.
180
+ */
181
+ readonly patch?: Record<string, unknown>;
182
+ };
183
+ /** One option of an enum / multi / range field, labelled through `store.labels()`. */
184
+ export type FieldOption = {
185
+ value: string;
186
+ label: string;
187
+ };
188
+ /** `toWindow` exists on a range handle and nowhere else — it is not an optional convenience. */
189
+ type RangeHandleExtras<F> = F extends {
190
+ kind: 'range';
191
+ presets: readonly (infer P)[];
192
+ custom: infer C;
193
+ window: RangeWindows<infer W>;
194
+ } ? {
195
+ /**
196
+ * The API-facing projection of a range value: a preset becomes `{ window }`, a custom range
197
+ * becomes `{ from, to }`. Replaces every hand-rolled `presetToParams`.
198
+ *
199
+ * A preset declared with a `window` resolver (`field.range({ window: { '3m': ... } })`)
200
+ * becomes `{ from, to }` too — the resolver runs at CALL time with the current `Date`, so a
201
+ * derived window (`3m`, `ytd`) is never stale and never leaves the store.
202
+ *
203
+ * Those presets are EXCLUDED from the `{ window }` branch, so the result assigns to an API
204
+ * param type that only knows the server-understood windows with no cast — which is the half
205
+ * that lets a consumer delete the switch rather than move it. A `custom: true` field keeps
206
+ * `'custom'` in the union: a custom preset with no dates resolves to `{ window: 'custom' }`,
207
+ * so that one still needs a guard before it reaches such a type.
208
+ */
209
+ readonly toWindow: (v: RangeValue<RangePresets<P, C>>) => {
210
+ window: Exclude<RangePresets<P, C>, W>;
211
+ } | {
212
+ from: string;
213
+ to: string;
214
+ };
215
+ } : {
216
+ readonly toWindow?: undefined;
217
+ };
218
+ /**
219
+ * A number handle's declared bounds, republished from the field — `RangeHandleExtras`' shape for the
220
+ * numeric kind, and there for the same reason: a control cannot ask the field descriptor anything,
221
+ * it only ever sees the handle.
222
+ *
223
+ * The codec has always CLAMPED to these on write, so before this the only way a `NumberFilter` could
224
+ * learn its own limits was for the call site to pass them a second time — a second answer to a
225
+ * question the field already owns, and one that silently stops matching the moment the field moves.
226
+ * With them on the handle the input can bound its own stepper, which turns the clamp from a
227
+ * correction the user watches happen into a value they cannot type in the first place.
228
+ *
229
+ * `int` is the third member because it is the same class of fact: it decides the stepper's grain
230
+ * (`step` 1, decimals refused), and the codec already rejects a non-integer for that field.
231
+ */
232
+ type NumberHandleExtras<F> = F extends {
233
+ kind: 'number';
234
+ } ? {
235
+ /** The field's `min`, or `undefined` when it declared none. Clamped on write regardless. */
236
+ readonly min: number | undefined;
237
+ /** The field's `max`, or `undefined` when it declared none. Clamped on write regardless. */
238
+ readonly max: number | undefined;
239
+ /** `field.number({ int: true })` — a non-integer is refused by the codec, not rounded. */
240
+ readonly int: boolean;
241
+ } : {
242
+ readonly min?: undefined;
243
+ readonly max?: undefined;
244
+ readonly int?: undefined;
245
+ };
246
+ /**
247
+ * The binding every basalt control takes instead of `value`/`onChange` (C2). One field, both lanes,
248
+ * one resolution law. Handed out by `createSearchStore().field.<name>` /
249
+ * `createLocalStore().field.<name>`; never constructed by hand.
250
+ */
251
+ export type FieldHandle<F extends AnyField> = {
252
+ readonly kind: F['kind'];
253
+ readonly fallback: FieldValue<F>;
254
+ /** enum / multi / range options, labelled by `labels()`. Empty for the other kinds. */
255
+ readonly options: readonly FieldOption[];
256
+ /**
257
+ * Read + write. Reads the URL when the field is on the URL lane (`useSearch({ strict: false })`,
258
+ * so a control renders on a sibling or child route with no `from`), else localStorage, else the
259
+ * fallback. Writes navigate when the matched route validates the param, then persist.
260
+ */
261
+ use(): readonly [FieldValue<F>, (next: FieldValue<F>, opts?: FieldSetOptions) => void];
262
+ /**
263
+ * UNSET the field — what a control's reset calls, and deliberately not `set(fallback)`. The
264
+ * persist lane DELETES the field's key from the mirror, the memory lane drops its value, and the
265
+ * URL lane navigates back to the fallback params (plus dropping the mirror key under it).
266
+ *
267
+ * Writing the fallback instead pins it: a THUNK fallback (`() => todayIso()`) resolves at the
268
+ * moment of the reset, so a reader who pressed `Reset all` today was handed today's date
269
+ * tomorrow, with the field counted as active in `Filters (n)`. Unsetting lets the fallback keep
270
+ * resolving, which is what `FieldFallback`'s contract says it does.
271
+ *
272
+ * Callable outside render (an event handler is the only realistic caller); on the URL lane it
273
+ * navigates through the last render of `use()`, so a handle that no mount has read clears the
274
+ * mirror only.
275
+ */
276
+ clear(): void;
277
+ isDefault(v: FieldValue<F>): boolean;
278
+ } & RangeHandleExtras<F> & NumberHandleExtras<F>;
279
+ /**
280
+ * `field.range`'s options. `C` is the `custom` flag, pinned per overload — never inferred; `W` is
281
+ * inferred from `window`'s KEYS (constrained to the declared presets, so a typo is still an error
282
+ * here) and is what carries the resolved presets into `toWindow`'s return type.
283
+ */
284
+ type RangeOptions<P extends string, C extends boolean, Pm extends RangeParams, W extends P> = {
285
+ presets: readonly P[];
286
+ fallback: FieldFallback<NoInfer<P>>;
287
+ custom?: C;
288
+ params?: Pm;
289
+ /** Per-preset window resolvers — the presets `toWindow()` answers with `{ from, to }`. */
290
+ window?: RangeWindows<W>;
291
+ };
292
+ /**
293
+ * A time window: THREE URL params (preset + `from` + `to`, each renamable through `params`), so a
294
+ * consumer's existing deep links and loaders keep their shape. `custom: true` additionally
295
+ * allows the preset `'custom'` with two ISO dates. `window` resolves a DERIVED preset (`3m`, `ytd`)
296
+ * to `{ from, to }` through `toWindow()` while it stays one preset in the URL.
297
+ *
298
+ * A second `field.range` in the same store — or a second range store composed into the same
299
+ * route's `validateSearch` — MUST rename `from`/`to` via `params`: every range defaults to the
300
+ * literal param names `'from'`/`'to'`, and two fields silently sharing them makes the later one's
301
+ * `toSearch` overwrite the earlier one's dates. `createStoreCore` throws at definition for the
302
+ * in-store case; the cross-store case is not detectable by either store alone.
303
+ *
304
+ * THREE overloads, one per `custom` shape, because a single `custom?: C` signature is inferred
305
+ * against `AnyField` when the call sits inline in `createSearchStore({ fields })` — the contextual
306
+ * return type wins, `C` widens to `boolean`, and every value type gains a `'custom'` preset the
307
+ * field never allowed. Overloads have no `C` to widen: an omitted or `false` flag picks the first,
308
+ * a literal `true` the second, and a value typed `boolean` the third (widened, as declared).
309
+ */
310
+ declare function rangeField<const P extends string, const Pm extends RangeParams = RangeParams, const L extends FieldLane = FieldLane, const W extends P = never>(o: RangeOptions<P, false, Pm, W>, lane?: L): RangeField<P, false, Pm, ResolveLane<L>, W>;
311
+ declare function rangeField<const P extends string, const Pm extends RangeParams = RangeParams, const L extends FieldLane = FieldLane, const W extends P = never>(o: RangeOptions<P, true, Pm, W>, lane?: L): RangeField<P, true, Pm, ResolveLane<L>, W>;
312
+ declare function rangeField<const P extends string, const Pm extends RangeParams = RangeParams, const L extends FieldLane = FieldLane, const W extends P = never>(o: RangeOptions<P, boolean, Pm, W>, lane?: L): RangeField<P, boolean, Pm, ResolveLane<L>, W>;
313
+ /**
314
+ * The field vocabulary. Every builder returns plain declarative data — no closures, no router, no
315
+ * storage — which is what lets one field definition drive `createSearchStore` (URL + storage) and
316
+ * `createLocalStore` (storage only) without a second description of the same param.
317
+ *
318
+ * @example
319
+ * const store = createSearchStore({
320
+ * key: 'analytics',
321
+ * fields: {
322
+ * range: field.range({ presets: ['7d', '30d', '90d'], fallback: '30d', custom: true }),
323
+ * compare: field.enum(['none', 'previous'], 'none'),
324
+ * channels: field.multi(CHANNELS, []),
325
+ * minDuration: field.number({ fallback: 0, min: 0 }, { persist: false }),
326
+ * compact: field.boolean(false, { url: false }),
327
+ * },
328
+ * })
329
+ */
330
+ export declare const field: {
331
+ /** A closed string enum — a tab, a compare mode, a single-select filter. */
332
+ enum<const T extends string, const L extends FieldLane = FieldLane>(values: readonly T[], fallback: FieldFallback<NoInfer<T>>, lane?: L): EnumField<T, ResolveLane<L>>;
333
+ /** An any-of set over the same closed enum. Decoding is deduped and canonically re-sorted. */
334
+ multi<const T extends string, const L extends FieldLane = FieldLane>(values: readonly T[], fallback?: FieldFallback<readonly NoInfer<T>[]>, lane?: L): MultiField<T, ResolveLane<L>>;
335
+ range: typeof rangeField;
336
+ /** A number — pagination, a threshold. Out-of-range input clamps to `min`/`max`. */
337
+ number<const L extends FieldLane = FieldLane>(o: {
338
+ fallback: FieldFallback<number>;
339
+ min?: number;
340
+ max?: number;
341
+ int?: boolean;
342
+ }, lane?: L): NumberField<ResolveLane<L>>;
343
+ /** A toggle. Accepts `true`/`false` and the strings `'true'`/`'false'` from a hand-typed URL. */
344
+ boolean<const L extends FieldLane = FieldLane>(fallback: FieldFallback<boolean>, lane?: L): BooleanField<ResolveLane<L>>;
345
+ /** Free text — a search box. Defaults to `history: 'replace'` like every other field. */
346
+ string<const L extends FieldLane = FieldLane>(o?: {
347
+ fallback?: FieldFallback<string>;
348
+ max?: number;
349
+ }, lane?: L): StringField<ResolveLane<L>>;
350
+ };
351
+ type UnionToIntersection<U> = (U extends unknown ? (x: U) => void : never) extends (x: infer I) => void ? I : never;
352
+ type Prettify<T> = {
353
+ [K in keyof T]: T[K];
354
+ } & {};
355
+ type RangeParamName<Pm, K extends keyof RangeParams, D extends string> = Pm extends Record<K, infer N> ? (N extends string ? N : D) : D;
356
+ /** The param entries ONE field owns. A range field owns three; every other kind owns one. */
357
+ type FieldSearch<K extends string, F extends AnyField> = F extends {
358
+ kind: 'range';
359
+ presets: readonly (infer P)[];
360
+ custom: infer C;
361
+ params: infer Pm;
362
+ } ? {
363
+ [Q in RangeParamName<Pm, 'preset', K>]: RangePresets<P, C>;
364
+ } & {
365
+ [Q in RangeParamName<Pm, 'from', 'from'>]?: string | undefined;
366
+ } & {
367
+ [Q in RangeParamName<Pm, 'to', 'to'>]?: string | undefined;
368
+ } : {
369
+ [Q in K]: FieldValue<F>;
370
+ };
371
+ type FieldNames<S> = keyof S & string;
372
+ type UrlFieldNames<S> = {
373
+ [K in FieldNames<S>]: S[K] extends {
374
+ lane: {
375
+ url: false;
376
+ };
377
+ } ? never : K;
378
+ }[FieldNames<S>];
379
+ /** The search object of a store's URL-lane fields — `validateSearch`'s return, flat. */
380
+ export type SearchValues<S extends Record<string, AnyField>> = Prettify<UnionToIntersection<{
381
+ [K in UrlFieldNames<S>]: FieldSearch<K, S[K]>;
382
+ }[UrlFieldNames<S>]>>;
383
+ /** The same flat shape over EVERY field, both lanes — what `readStored()` can return. */
384
+ export type StoredValues<S extends Record<string, AnyField>> = Prettify<UnionToIntersection<{
385
+ [K in FieldNames<S>]: FieldSearch<K, S[K]>;
386
+ }[FieldNames<S>]>>;
387
+ /**
388
+ * Everything a store needs to move one field between the URL, localStorage and a control.
389
+ *
390
+ * @internal Reachable on `basalt-ui/state` only because `./router-tanstack`'s store is built on it
391
+ * — the two store factories are the public API, not this seam.
392
+ */
393
+ export type FieldCodec = {
394
+ readonly kind: AnyField['kind'];
395
+ readonly lane: ResolvedLane;
396
+ /** Every URL param this field owns. */
397
+ readonly params: readonly string[];
398
+ /**
399
+ * The param whose PRESENCE in the current search means "the matched route validates this field".
400
+ * A store's `validateSearch` always returns it, so a route that ran it has the key; a foreign
401
+ * route does not, and a write there persists only (A1).
402
+ */
403
+ readonly primary: string;
404
+ /**
405
+ * The fallback, ALREADY resolved — a getter, because `field.*({ fallback: () => … })` is a thunk
406
+ * that must run at read time and re-run while nothing is written. Every call site reads it as a
407
+ * plain value, which is why the laziness is invisible past this line.
408
+ */
409
+ readonly fallback: unknown;
410
+ /** Range only: the per-preset window resolvers `toWindow` answers a derived preset through. */
411
+ readonly windows?: RangeWindows<string>;
412
+ /**
413
+ * Number only: the declared bounds and grain the codec clamps to, republished so `handle` can put
414
+ * them on the handle. The codec is the only thing that reads the field descriptor, so a control
415
+ * that needs a limit has to be handed it from here — see {@link NumberHandleExtras}.
416
+ */
417
+ readonly bounds?: {
418
+ readonly min: number | undefined;
419
+ readonly max: number | undefined;
420
+ readonly int: boolean;
421
+ };
422
+ /**
423
+ * Validate a STORED (or caller-supplied) value. `null` = unusable.
424
+ *
425
+ * Deliberately a different function from `fromSearch` for one kind: the deprecated multi store
426
+ * reads an empty URL array as "absent", and reusing that rule on the storage side would turn a
427
+ * deliberately CLEARED filter into a miss and resurrect the fallback on upgrade.
428
+ */
429
+ decode(raw: unknown): unknown;
430
+ /** Pull the field out of a router search object. `null` = absent or invalid. */
431
+ fromSearch(search: Record<string, unknown>): unknown;
432
+ /** The param entries a write puts on the URL. `undefined` values clear a stale param. */
433
+ toSearch(value: unknown): Record<string, unknown>;
434
+ equals(a: unknown, b: unknown): boolean;
435
+ /** Option values in declaration order — enum, multi and range only. */
436
+ readonly optionValues: readonly string[];
437
+ };
438
+ /**
439
+ * Build the codec for one field. `legacyMultiEmpty` restores the DEPRECATED multi-store's rule that
440
+ * an EMPTY url array means "absent, fall through to storage" — the deprecated wrapper's contract,
441
+ * never the new store's, where an empty selection is a value like any other.
442
+ *
443
+ * @internal — see `FieldCodec`.
444
+ */
445
+ export declare function resolveFieldCodec(name: string, f: AnyField, opts?: {
446
+ legacyMultiEmpty?: boolean;
447
+ }): FieldCodec;
448
+ type StoreRecord = Record<string, unknown>;
449
+ /**
450
+ * A field's write, untyped — the shape both factories build and `handle` hands out. `opts` is the
451
+ * public `FieldSetOptions`; only the URL lane can act on it.
452
+ *
453
+ * @internal — see `FieldCodec`.
454
+ */
455
+ export type FieldWrite = (next: unknown, opts?: FieldSetOptions) => void;
456
+ /** One field's `use()`, untyped. @internal — see `FieldCodec`. */
457
+ export type FieldUse = () => readonly [unknown, FieldWrite];
458
+ /** One named field plus its codec, in declaration order. @internal — see `FieldCodec`. */
459
+ export type StoreEntry = {
460
+ readonly name: string;
461
+ readonly codec: FieldCodec;
462
+ };
463
+ export type StoreCoreOptions = {
464
+ readonly key: string;
465
+ readonly fields: Record<string, AnyField>;
466
+ readonly version?: number | undefined;
467
+ /**
468
+ * Legacy single-value storage layout: the whole envelope value IS this field's value, the shape
469
+ * `createSearchParamStore` has written since 1.0.0. Set ONLY by the deprecated wrappers — a
470
+ * consumer's already-persisted selection has to keep resolving byte-for-byte.
471
+ */
472
+ readonly legacyValueField?: string;
473
+ };
474
+ /**
475
+ * The storage + resolution kernel. Deliberately NOT exported from any barrel: it is the seam
476
+ * between `./state`'s router-free store and `./router-tanstack`'s router-coupled one, and both of
477
+ * those are the public API.
478
+ *
479
+ * @internal — see `FieldCodec`.
480
+ */
481
+ export type StoreCore = {
482
+ readonly entries: readonly StoreEntry[];
483
+ readonly urlEntries: readonly StoreEntry[];
484
+ readonly anyPersisted: boolean;
485
+ usePersistedRecord(): readonly [StoreRecord, (next: StoreRecord) => void];
486
+ readRecord(): StoreRecord;
487
+ setLabels(map: Record<string, Record<string, string> | undefined>): void;
488
+ optionsFor(entry: StoreEntry): readonly FieldOption[];
489
+ /** The resolution law, once: URL ⊳ localStorage ⊳ fallback. `search: null` skips the URL lane. */
490
+ resolve(entry: StoreEntry, search: StoreRecord | null, record: StoreRecord): unknown;
491
+ writeField(setRecord: (next: StoreRecord) => void, name: string, value: unknown): void;
492
+ /**
493
+ * The IN-MEMORY lane's `use()` for one field — a field with neither the URL nor the mirror.
494
+ * Lives here rather than in either factory because BOTH have such a field: `createLocalStore`'s
495
+ * `persist: false`, and `createSearchStore`'s `{ url: false, persist: false }`.
496
+ */
497
+ memoryUse(entry: StoreEntry): FieldUse;
498
+ /** The memory lane's value for one field, resolved — its fallback while nothing was written. */
499
+ readMemoryValue(entry: StoreEntry): unknown;
500
+ /** Subscribes to the whole memory lane. The snapshot is a write counter, so it is always stable. */
501
+ useMemoryVersion(): number;
502
+ /** Drops every memory value, so the next read resolves to the fallback. What `useReset` calls. */
503
+ resetMemory(): void;
504
+ /**
505
+ * Deletes ONE field's key from the localStorage record, so the next read falls through to the
506
+ * live fallback. Not a hook: `FieldHandle.clear()` runs in an event handler, where the persisted
507
+ * setter from `usePersistedRecord()` is not in reach — it writes through the same envelope and
508
+ * wakes the same per-key listeners (`writePersistedValue`).
509
+ */
510
+ clearField(name: string): void;
511
+ /** The memory lane's half of the same: drops ONE field's value. */
512
+ clearMemory(name: string): void;
513
+ /** Every stored field, flattened into URL-param shape, `undefined` entries dropped. */
514
+ readStoredFlat(): StoreRecord;
515
+ handle(entry: StoreEntry, use: FieldUse, clear: () => void): FieldHandle<AnyField>;
516
+ };
517
+ /** @internal — the seam behind `createSearchStore` and `createLocalStore`. */
518
+ export declare function createStoreCore(o: StoreCoreOptions): StoreCore;
519
+ /** `Pick<SearchStore<S>, 'field' | 'readStored' | 'labels'>` — the same handles, no router. */
520
+ export type LocalStore<S extends Record<string, AnyField>> = {
521
+ readonly field: {
522
+ [K in keyof S]: FieldHandle<S[K]>;
523
+ };
524
+ readStored: () => Partial<StoredValues<S>>;
525
+ /**
526
+ * Option labels for enum / multi / range fields — the same chainable contract
527
+ * `createSearchStore` has, so `SelectFilter`/`ViewTabs` read their option labels off a local
528
+ * store too. Call it once, at definition.
529
+ */
530
+ labels: (map: Partial<{
531
+ [K in keyof S]: Record<string, string>;
532
+ }>) => LocalStore<S>;
533
+ };
534
+ /**
535
+ * A store with no URL lane and no router import: per-chart selects, a section's view tab, a compact
536
+ * toggle. Same `field.*` vocabulary and the same `FieldHandle` every basalt control binds to, so a
537
+ * control cannot tell the two stores apart — which is the point, and why the local lane is not an
538
+ * excuse to reach for `useState` (C3).
539
+ *
540
+ * A field's `url` lane is ignored here (there is no URL to write); `persist: false` is the
541
+ * IN-MEMORY lane — shared across mounts for the session, gone on reload, never in localStorage.
542
+ * That is the honest home for a value a reader should not be handed back tomorrow (a scratch
543
+ * comparison, a temporary drill-down) without dropping to `useState` and losing the handle.
544
+ *
545
+ * A fallback may be a THUNK (`field.string({ fallback: () => todayIso() })`) — resolved at read
546
+ * time, re-resolved while nothing is written, and never persisted on its own. Every lane here
547
+ * qualifies; `createSearchStore` allows it off the URL lane only, and throws otherwise.
548
+ *
549
+ * @example
550
+ * const chart = createLocalStore({
551
+ * key: 'momentum-chart',
552
+ * fields: {
553
+ * metric: field.enum(['load', 'volume'], 'load'),
554
+ * zoomed: field.boolean(false, { persist: false }), // in-memory, this session only
555
+ * },
556
+ * }).labels({ metric: { load: 'Load', volume: 'Volume' } })
557
+ * // <SelectFilter field={chart.field.metric} label="Metric" />
558
+ */
559
+ export declare function createLocalStore<const S extends Record<string, AnyField>>(o: {
560
+ key: string;
561
+ fields: S;
562
+ version?: number;
563
+ }): LocalStore<S>;
564
+ export {};
565
+ //# sourceMappingURL=fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/state/fields.ts"],"names":[],"mappings":"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"}