@eifi1/ui-kit 0.4.0 → 0.5.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 (410) hide show
  1. package/LICENSE +32 -0
  2. package/README.md +498 -57
  3. package/dist/chart.d.ts +10 -0
  4. package/dist/chart.js +10 -0
  5. package/dist/chart.js.map +1 -0
  6. package/dist/components/account-settings.d.ts +11 -0
  7. package/dist/components/account-settings.js +19 -12
  8. package/dist/components/account-settings.js.map +1 -1
  9. package/dist/components/alert-banner.d.ts +10 -6
  10. package/dist/components/alert-banner.js +20 -16
  11. package/dist/components/alert-banner.js.map +1 -1
  12. package/dist/components/amount-input.d.ts +30 -4
  13. package/dist/components/amount-input.js +36 -14
  14. package/dist/components/amount-input.js.map +1 -1
  15. package/dist/components/calculator.d.ts +24 -7
  16. package/dist/components/calculator.js +37 -20
  17. package/dist/components/calculator.js.map +1 -1
  18. package/dist/components/chart-zoom.d.ts +156 -0
  19. package/dist/components/chart-zoom.js +262 -0
  20. package/dist/components/chart-zoom.js.map +1 -0
  21. package/dist/components/chart.d.ts +28 -3
  22. package/dist/components/chart.js +71 -32
  23. package/dist/components/chart.js.map +1 -1
  24. package/dist/components/checkbox.d.ts +51 -0
  25. package/dist/components/checkbox.js +123 -0
  26. package/dist/components/checkbox.js.map +1 -0
  27. package/dist/components/chip.d.ts +128 -0
  28. package/dist/components/chip.js +357 -0
  29. package/dist/components/chip.js.map +1 -0
  30. package/dist/components/choice-parts.d.ts +24 -0
  31. package/dist/components/choice-parts.js +18 -0
  32. package/dist/components/choice-parts.js.map +1 -0
  33. package/dist/components/combobox-core.d.ts +52 -9
  34. package/dist/components/combobox-core.js +91 -20
  35. package/dist/components/combobox-core.js.map +1 -1
  36. package/dist/components/combobox.d.ts +43 -33
  37. package/dist/components/combobox.js +409 -340
  38. package/dist/components/combobox.js.map +1 -1
  39. package/dist/components/currency-select.d.ts +48 -8
  40. package/dist/components/currency-select.js +107 -65
  41. package/dist/components/currency-select.js.map +1 -1
  42. package/dist/components/data-table-filter-popover.d.ts +15 -3
  43. package/dist/components/data-table-filter-popover.js +23 -17
  44. package/dist/components/data-table-filter-popover.js.map +1 -1
  45. package/dist/components/data-table-filters.d.ts +1 -1
  46. package/dist/components/data-table-filters.js +3 -2
  47. package/dist/components/data-table-filters.js.map +1 -1
  48. package/dist/components/data-table-labels.d.ts +53 -2
  49. package/dist/components/data-table-labels.js +31 -2
  50. package/dist/components/data-table-labels.js.map +1 -1
  51. package/dist/components/data-table-pagination.d.ts +3 -1
  52. package/dist/components/data-table-pagination.js +16 -10
  53. package/dist/components/data-table-pagination.js.map +1 -1
  54. package/dist/components/data-table-sort.js +1 -0
  55. package/dist/components/data-table-sort.js.map +1 -1
  56. package/dist/components/data-table.d.ts +1 -1
  57. package/dist/components/data-table.js +201 -85
  58. package/dist/components/data-table.js.map +1 -1
  59. package/dist/components/date-picker.d.ts +25 -9
  60. package/dist/components/date-picker.js +232 -94
  61. package/dist/components/date-picker.js.map +1 -1
  62. package/dist/components/dropdown.d.ts +96 -20
  63. package/dist/components/dropdown.js +77 -33
  64. package/dist/components/dropdown.js.map +1 -1
  65. package/dist/components/entity-combobox.d.ts +5 -4
  66. package/dist/components/entity-combobox.js +107 -76
  67. package/dist/components/entity-combobox.js.map +1 -1
  68. package/dist/components/facing-pair.d.ts +36 -0
  69. package/dist/components/facing-pair.js +40 -0
  70. package/dist/components/facing-pair.js.map +1 -0
  71. package/dist/components/field-sync.d.ts +164 -0
  72. package/dist/components/field-sync.js +264 -0
  73. package/dist/components/field-sync.js.map +1 -0
  74. package/dist/components/file-dropzone.d.ts +38 -6
  75. package/dist/components/file-dropzone.js +34 -9
  76. package/dist/components/file-dropzone.js.map +1 -1
  77. package/dist/components/full-bleed-dialog.d.ts +37 -26
  78. package/dist/components/full-bleed-dialog.js +20 -5
  79. package/dist/components/full-bleed-dialog.js.map +1 -1
  80. package/dist/components/grouped-picker.d.ts +21 -10
  81. package/dist/components/grouped-picker.js +66 -52
  82. package/dist/components/grouped-picker.js.map +1 -1
  83. package/dist/components/hover-menu.d.ts +20 -4
  84. package/dist/components/hover-menu.js +15 -4
  85. package/dist/components/hover-menu.js.map +1 -1
  86. package/dist/components/mini-calendar.d.ts +102 -14
  87. package/dist/components/mini-calendar.js +256 -70
  88. package/dist/components/mini-calendar.js.map +1 -1
  89. package/dist/components/modal.d.ts +9 -3
  90. package/dist/components/modal.js +34 -45
  91. package/dist/components/modal.js.map +1 -1
  92. package/dist/components/month-picker.d.ts +79 -0
  93. package/dist/components/month-picker.js +342 -0
  94. package/dist/components/month-picker.js.map +1 -0
  95. package/dist/components/multi-entity-combobox.d.ts +7 -6
  96. package/dist/components/multi-entity-combobox.js +112 -72
  97. package/dist/components/multi-entity-combobox.js.map +1 -1
  98. package/dist/components/multi-select.d.ts +13 -11
  99. package/dist/components/multi-select.js +161 -84
  100. package/dist/components/multi-select.js.map +1 -1
  101. package/dist/components/number-field.d.ts +92 -0
  102. package/dist/components/number-field.js +111 -0
  103. package/dist/components/number-field.js.map +1 -0
  104. package/dist/components/number-input.d.ts +28 -2
  105. package/dist/components/number-input.js +12 -2
  106. package/dist/components/number-input.js.map +1 -1
  107. package/dist/components/numpad-sheet.d.ts +32 -4
  108. package/dist/components/numpad-sheet.js +30 -13
  109. package/dist/components/numpad-sheet.js.map +1 -1
  110. package/dist/components/page-contents.d.ts +90 -0
  111. package/dist/components/page-contents.js +170 -0
  112. package/dist/components/page-contents.js.map +1 -0
  113. package/dist/components/password-strength.d.ts +106 -0
  114. package/dist/components/password-strength.js +132 -0
  115. package/dist/components/password-strength.js.map +1 -0
  116. package/dist/components/picker-sheet.d.ts +23 -15
  117. package/dist/components/picker-sheet.js +34 -14
  118. package/dist/components/picker-sheet.js.map +1 -1
  119. package/dist/components/popover.d.ts +62 -4
  120. package/dist/components/popover.js +52 -2
  121. package/dist/components/popover.js.map +1 -1
  122. package/dist/components/search-field.d.ts +25 -7
  123. package/dist/components/search-field.js +7 -5
  124. package/dist/components/search-field.js.map +1 -1
  125. package/dist/components/series-chart-labels.d.ts +14 -0
  126. package/dist/components/series-chart-labels.js +11 -0
  127. package/dist/components/series-chart-labels.js.map +1 -0
  128. package/dist/components/series-chart.d.ts +207 -0
  129. package/dist/components/series-chart.js +223 -0
  130. package/dist/components/series-chart.js.map +1 -0
  131. package/dist/components/settings-fields.d.ts +14 -4
  132. package/dist/components/settings-fields.js +19 -8
  133. package/dist/components/settings-fields.js.map +1 -1
  134. package/dist/components/signature-pad.d.ts +119 -0
  135. package/dist/components/signature-pad.js +405 -0
  136. package/dist/components/signature-pad.js.map +1 -0
  137. package/dist/components/slider.d.ts +80 -0
  138. package/dist/components/slider.js +155 -0
  139. package/dist/components/slider.js.map +1 -0
  140. package/dist/components/sparkline.d.ts +93 -0
  141. package/dist/components/sparkline.js +205 -0
  142. package/dist/components/sparkline.js.map +1 -0
  143. package/dist/components/stat-tile.d.ts +151 -0
  144. package/dist/components/stat-tile.js +236 -0
  145. package/dist/components/stat-tile.js.map +1 -0
  146. package/dist/components/swipeable-row.d.ts +25 -2
  147. package/dist/components/swipeable-row.js +31 -0
  148. package/dist/components/swipeable-row.js.map +1 -1
  149. package/dist/components/switch.d.ts +60 -0
  150. package/dist/components/switch.js +81 -0
  151. package/dist/components/switch.js.map +1 -0
  152. package/dist/components/time-input.d.ts +58 -0
  153. package/dist/components/time-input.js +50 -0
  154. package/dist/components/time-input.js.map +1 -0
  155. package/dist/components/toggle-group.d.ts +18 -3
  156. package/dist/components/toggle-group.js +10 -6
  157. package/dist/components/toggle-group.js.map +1 -1
  158. package/dist/components/toggle-legend.d.ts +115 -0
  159. package/dist/components/toggle-legend.js +114 -0
  160. package/dist/components/toggle-legend.js.map +1 -0
  161. package/dist/components/tooltip.d.ts +40 -11
  162. package/dist/components/tooltip.js +77 -20
  163. package/dist/components/tooltip.js.map +1 -1
  164. package/dist/components/treemap.d.ts +132 -0
  165. package/dist/components/treemap.js +179 -0
  166. package/dist/components/treemap.js.map +1 -0
  167. package/dist/components/ui.d.ts +159 -46
  168. package/dist/components/ui.js +220 -115
  169. package/dist/components/ui.js.map +1 -1
  170. package/dist/components/use-mobile-reveal.js +1 -0
  171. package/dist/components/use-mobile-reveal.js.map +1 -1
  172. package/dist/components/use-table-state.d.ts +1 -1
  173. package/dist/components/use-table-state.js +38 -17
  174. package/dist/components/use-table-state.js.map +1 -1
  175. package/dist/components/user-avatar.d.ts +15 -4
  176. package/dist/components/user-avatar.js +5 -4
  177. package/dist/components/user-avatar.js.map +1 -1
  178. package/dist/components/wizard-stepper.js +3 -2
  179. package/dist/components/wizard-stepper.js.map +1 -1
  180. package/dist/{data-table-filters-aXyf0Xub.d.ts → data-table-filters-DM1auUfH.d.ts} +27 -5
  181. package/dist/data-table.d.ts +7 -0
  182. package/dist/data-table.js +12 -0
  183. package/dist/data-table.js.map +1 -0
  184. package/dist/feedback/feedback-attachment.js +12 -11
  185. package/dist/feedback/feedback-attachment.js.map +1 -1
  186. package/dist/feedback/feedback-dialog.js +2 -1
  187. package/dist/feedback/feedback-dialog.js.map +1 -1
  188. package/dist/feedback/feedback-inbox.d.ts +33 -7
  189. package/dist/feedback/feedback-inbox.js +49 -37
  190. package/dist/feedback/feedback-inbox.js.map +1 -1
  191. package/dist/feedback.d.ts +5 -0
  192. package/dist/feedback.js +5 -0
  193. package/dist/feedback.js.map +1 -0
  194. package/dist/hooks/use-anchored-panel.js +1 -0
  195. package/dist/hooks/use-anchored-panel.js.map +1 -1
  196. package/dist/hooks/use-anchored-rect.js +1 -0
  197. package/dist/hooks/use-anchored-rect.js.map +1 -1
  198. package/dist/hooks/use-announce.d.ts +46 -0
  199. package/dist/hooks/use-announce.js +37 -0
  200. package/dist/hooks/use-announce.js.map +1 -0
  201. package/dist/hooks/use-body-scroll-lock.js +1 -0
  202. package/dist/hooks/use-body-scroll-lock.js.map +1 -1
  203. package/dist/hooks/use-close-transition.js +1 -0
  204. package/dist/hooks/use-close-transition.js.map +1 -1
  205. package/dist/hooks/use-dismiss.js +1 -0
  206. package/dist/hooks/use-dismiss.js.map +1 -1
  207. package/dist/hooks/use-focus-trap.d.ts +16 -0
  208. package/dist/hooks/use-focus-trap.js +67 -0
  209. package/dist/hooks/use-focus-trap.js.map +1 -0
  210. package/dist/hooks/use-media-query.js +1 -0
  211. package/dist/hooks/use-media-query.js.map +1 -1
  212. package/dist/hooks/use-overlay-history.js +27 -1
  213. package/dist/hooks/use-overlay-history.js.map +1 -1
  214. package/dist/hooks/use-row-swipe.js +1 -0
  215. package/dist/hooks/use-row-swipe.js.map +1 -1
  216. package/dist/i18n/defaults.d.ts +31 -0
  217. package/dist/i18n/defaults.js +63 -0
  218. package/dist/i18n/defaults.js.map +1 -0
  219. package/dist/i18n/kit-labels.d.ts +250 -0
  220. package/dist/i18n/kit-labels.js +184 -0
  221. package/dist/i18n/kit-labels.js.map +1 -0
  222. package/dist/index.d.ts +47 -22
  223. package/dist/index.js +28 -0
  224. package/dist/index.js.map +1 -1
  225. package/dist/lib/calc.js +1 -0
  226. package/dist/lib/calc.js.map +1 -1
  227. package/dist/lib/cn.js +1 -0
  228. package/dist/lib/cn.js.map +1 -1
  229. package/dist/lib/dates.js +1 -0
  230. package/dist/lib/dates.js.map +1 -1
  231. package/dist/lib/logger.js +1 -0
  232. package/dist/lib/logger.js.map +1 -1
  233. package/dist/lib/safe-storage.js +1 -0
  234. package/dist/lib/safe-storage.js.map +1 -1
  235. package/dist/search/command-palette.d.ts +11 -1
  236. package/dist/search/command-palette.js +21 -15
  237. package/dist/search/command-palette.js.map +1 -1
  238. package/dist/search.d.ts +2 -0
  239. package/dist/search.js +3 -0
  240. package/dist/search.js.map +1 -0
  241. package/dist/shell/app-shell.d.ts +33 -4
  242. package/dist/shell/app-shell.js +275 -78
  243. package/dist/shell/app-shell.js.map +1 -1
  244. package/dist/shell/option-switcher-menu.js +3 -2
  245. package/dist/shell/option-switcher-menu.js.map +1 -1
  246. package/dist/shell/role-switcher.d.ts +6 -0
  247. package/dist/shell/role-switcher.js +7 -4
  248. package/dist/shell/role-switcher.js.map +1 -1
  249. package/dist/shell/top-bar.d.ts +15 -7
  250. package/dist/shell/top-bar.js +3 -5
  251. package/dist/shell/top-bar.js.map +1 -1
  252. package/dist/shell/topbar-action-menu.js +3 -2
  253. package/dist/shell/topbar-action-menu.js.map +1 -1
  254. package/dist/shell/topbar-controls.d.ts +5 -2
  255. package/dist/shell/topbar-controls.js +20 -15
  256. package/dist/shell/topbar-controls.js.map +1 -1
  257. package/dist/shell.d.ts +13 -0
  258. package/dist/shell.js +8 -0
  259. package/dist/shell.js.map +1 -0
  260. package/dist/theme/chart-palette.d.ts +19 -12
  261. package/dist/theme/chart-palette.js +24 -30
  262. package/dist/theme/chart-palette.js.map +1 -1
  263. package/dist/theme/color.d.ts +78 -0
  264. package/dist/theme/color.js +148 -0
  265. package/dist/theme/color.js.map +1 -0
  266. package/dist/theme/palette-derive.d.ts +140 -0
  267. package/dist/theme/palette-derive.js +376 -0
  268. package/dist/theme/palette-derive.js.map +1 -0
  269. package/dist/theme/palette-presets.d.ts +27 -5
  270. package/dist/theme/palette-presets.js +231 -33
  271. package/dist/theme/palette-presets.js.map +1 -1
  272. package/dist/theme/palette-store.js +1 -0
  273. package/dist/theme/palette-store.js.map +1 -1
  274. package/dist/theme/theme-store.js +1 -0
  275. package/dist/theme/theme-store.js.map +1 -1
  276. package/dist/tour/tour.d.ts +2 -1
  277. package/dist/tour/tour.js +15 -9
  278. package/dist/tour/tour.js.map +1 -1
  279. package/dist/tour.d.ts +2 -0
  280. package/dist/tour.js +3 -0
  281. package/dist/tour.js.map +1 -0
  282. package/dist/wizard/stepper-nav.js +10 -8
  283. package/dist/wizard/stepper-nav.js.map +1 -1
  284. package/dist/wizard/types.d.ts +18 -2
  285. package/dist/wizard/types.js +4 -1
  286. package/dist/wizard/types.js.map +1 -1
  287. package/dist/wizard/use-wizard.js +12 -4
  288. package/dist/wizard/use-wizard.js.map +1 -1
  289. package/dist/wizard/validation.js +1 -0
  290. package/dist/wizard/validation.js.map +1 -1
  291. package/dist/wizard/wizard-context.js +1 -0
  292. package/dist/wizard/wizard-context.js.map +1 -1
  293. package/dist/wizard/wizard-step.js +1 -0
  294. package/dist/wizard/wizard-step.js.map +1 -1
  295. package/dist/wizard/wizard-summary.js +5 -3
  296. package/dist/wizard/wizard-summary.js.map +1 -1
  297. package/dist/wizard.d.ts +8 -0
  298. package/dist/wizard.js +9 -0
  299. package/dist/wizard.js.map +1 -0
  300. package/package.json +67 -14
  301. package/src/chart.ts +22 -0
  302. package/src/components/account-settings.tsx +275 -0
  303. package/src/components/alert-banner.tsx +75 -0
  304. package/src/components/amount-input.tsx +471 -0
  305. package/src/components/calculator.tsx +252 -0
  306. package/src/components/chart-zoom.tsx +499 -0
  307. package/src/components/chart.tsx +363 -0
  308. package/src/components/checkbox.tsx +222 -0
  309. package/src/components/chip.tsx +570 -0
  310. package/src/components/choice-parts.ts +33 -0
  311. package/src/components/combobox-core.tsx +540 -0
  312. package/src/components/combobox.tsx +1026 -0
  313. package/src/components/currency-select.tsx +269 -0
  314. package/src/components/data-table-filter-popover.tsx +252 -0
  315. package/src/components/data-table-filters.ts +176 -0
  316. package/src/components/data-table-labels.ts +190 -0
  317. package/src/components/data-table-pagination.tsx +126 -0
  318. package/src/components/data-table-sort.ts +70 -0
  319. package/src/components/data-table.tsx +1740 -0
  320. package/src/components/date-picker.tsx +631 -0
  321. package/src/components/dropdown.tsx +341 -0
  322. package/src/components/entity-combobox.tsx +215 -0
  323. package/src/components/facing-pair.ts +86 -0
  324. package/src/components/field-sync.tsx +472 -0
  325. package/src/components/file-dropzone.tsx +181 -0
  326. package/src/components/full-bleed-dialog.tsx +179 -0
  327. package/src/components/grouped-picker.tsx +157 -0
  328. package/src/components/hover-menu.tsx +183 -0
  329. package/src/components/mini-calendar.tsx +554 -0
  330. package/src/components/modal.tsx +287 -0
  331. package/src/components/month-picker.tsx +549 -0
  332. package/src/components/multi-entity-combobox.tsx +226 -0
  333. package/src/components/multi-select.tsx +303 -0
  334. package/src/components/number-field.tsx +225 -0
  335. package/src/components/number-input.tsx +211 -0
  336. package/src/components/numpad-sheet.tsx +264 -0
  337. package/src/components/page-contents.tsx +289 -0
  338. package/src/components/password-strength.tsx +258 -0
  339. package/src/components/picker-sheet.tsx +251 -0
  340. package/src/components/popover.tsx +195 -0
  341. package/src/components/search-field.tsx +146 -0
  342. package/src/components/series-chart-labels.ts +26 -0
  343. package/src/components/series-chart.tsx +481 -0
  344. package/src/components/settings-fields.tsx +68 -0
  345. package/src/components/signature-pad.tsx +630 -0
  346. package/src/components/slider.tsx +313 -0
  347. package/src/components/sparkline.tsx +329 -0
  348. package/src/components/stat-tile.tsx +448 -0
  349. package/src/components/swipeable-row.tsx +271 -0
  350. package/src/components/switch.tsx +170 -0
  351. package/src/components/time-input.tsx +107 -0
  352. package/src/components/toggle-group.tsx +153 -0
  353. package/src/components/toggle-legend.tsx +229 -0
  354. package/src/components/tooltip.tsx +477 -0
  355. package/src/components/treemap.tsx +390 -0
  356. package/src/components/ui.tsx +1284 -0
  357. package/src/components/use-mobile-reveal.ts +54 -0
  358. package/src/components/use-table-state.ts +295 -0
  359. package/src/components/user-avatar.tsx +61 -0
  360. package/src/components/wizard-stepper.tsx +37 -0
  361. package/src/data-table.ts +19 -0
  362. package/src/feedback/feedback-attachment.tsx +246 -0
  363. package/src/feedback/feedback-dialog.tsx +209 -0
  364. package/src/feedback/feedback-inbox.tsx +615 -0
  365. package/src/feedback.ts +8 -0
  366. package/src/hooks/use-anchored-panel.ts +169 -0
  367. package/src/hooks/use-anchored-rect.ts +78 -0
  368. package/src/hooks/use-announce.ts +85 -0
  369. package/src/hooks/use-body-scroll-lock.ts +94 -0
  370. package/src/hooks/use-close-transition.ts +99 -0
  371. package/src/hooks/use-dismiss.ts +77 -0
  372. package/src/hooks/use-focus-trap.ts +160 -0
  373. package/src/hooks/use-media-query.ts +23 -0
  374. package/src/hooks/use-overlay-history.ts +345 -0
  375. package/src/hooks/use-row-swipe.ts +212 -0
  376. package/src/i18n/defaults.ts +68 -0
  377. package/src/i18n/kit-labels.tsx +447 -0
  378. package/src/index.ts +169 -0
  379. package/src/lib/calc.ts +309 -0
  380. package/src/lib/cn.ts +5 -0
  381. package/src/lib/dates.ts +187 -0
  382. package/src/lib/logger.ts +73 -0
  383. package/src/lib/safe-storage.ts +37 -0
  384. package/src/search/command-palette.tsx +342 -0
  385. package/src/search.ts +3 -0
  386. package/src/shell/app-shell.tsx +772 -0
  387. package/src/shell/option-switcher-menu.tsx +72 -0
  388. package/src/shell/role-switcher.tsx +46 -0
  389. package/src/shell/top-bar.tsx +39 -0
  390. package/src/shell/topbar-action-menu.tsx +91 -0
  391. package/src/shell/topbar-controls.tsx +229 -0
  392. package/src/shell.ts +10 -0
  393. package/src/theme/chart-palette.ts +145 -0
  394. package/src/theme/color.ts +266 -0
  395. package/src/theme/palette-derive.ts +681 -0
  396. package/src/theme/palette-presets.ts +760 -0
  397. package/src/theme/palette-store.ts +94 -0
  398. package/src/theme/theme-store.ts +145 -0
  399. package/src/tour/tour.tsx +586 -0
  400. package/src/tour.ts +3 -0
  401. package/src/vite-env.d.ts +26 -0
  402. package/src/wizard/stepper-nav.tsx +221 -0
  403. package/src/wizard/types.ts +178 -0
  404. package/src/wizard/use-wizard.ts +345 -0
  405. package/src/wizard/validation.ts +37 -0
  406. package/src/wizard/wizard-context.tsx +29 -0
  407. package/src/wizard/wizard-step.tsx +14 -0
  408. package/src/wizard/wizard-summary.tsx +69 -0
  409. package/src/wizard.ts +14 -0
  410. package/tokens.css +222 -20
package/tokens.css CHANGED
@@ -1,26 +1,32 @@
1
- /* @hb/ui design tokens + semantic utilities.
1
+ /* @eifi1/ui-kit design tokens + semantic utilities.
2
2
  *
3
3
  * The single source of truth for the shared appearance layer: brand + data
4
4
  * colours (theme-aware via `.dark`), the semantic money utilities, the brand
5
5
  * accent for checkboxes/radios, and the global keyframes/scrollbar chrome.
6
6
  *
7
7
  * Consumers import this ONCE (after their own `@import "tailwindcss"`):
8
- * @import "@hb/ui/tokens.css";
8
+ * @import "@eifi1/ui-kit/tokens.css";
9
9
  * and add the package to Tailwind's source scan so its class names are kept:
10
- * @source "../node_modules/@hb/ui/src";
10
+ * @source "../node_modules/@eifi1/ui-kit/dist";
11
+ * (relative to the importing CSS file — see README §2. An @source that resolves to
12
+ * nothing is silent, and the app renders unstyled rather than erroring.)
11
13
  *
12
14
  * NOTE: these :root/.dark values MIRROR DEFAULT_PRESET in the palette theme module,
13
15
  * which is what actually paints them — the palette layer writes the active preset
14
16
  * tokens inline on <html> at runtime (Tailwind v4 strips a root block that holds only
15
17
  * custom properties, so this block is a documentation mirror, not the live source).
16
18
  *
17
- * Because it is inert, it drifts silently, and it had: the surfaces and text colour
18
- * below still held the pre-#328 palette while DEFAULT_PRESET had moved to Solar Dusk.
19
- * They were resynced when --text-secondary/--text-muted were added (the new tones are
20
- * derived from these surfaces, so a stale mirror would have documented a contrast ratio
21
- * that was not the shipped one). The MONEY TRIO and the nine chart hues below are still
22
- * the older values and have not been touched — nothing reads them, but do not cite them
23
- * as the default without checking DEFAULT_PRESET first. */
19
+ * Because it is inert, it drifts silently, and it did — twice. The surfaces and text
20
+ * colour below still held the pre-#328 palette while DEFAULT_PRESET had moved to Solar
21
+ * Dusk; they were resynced when --text-secondary/--text-muted were added. The money
22
+ * trio and the dark brand accent were left behind that time and written off in this
23
+ * note as "nothing reads them" — nine values, including the accent a consumer copies
24
+ * when they want to know what the brand IS.
25
+ *
26
+ * They are resynced now, and theme/__tests__/tokens-css-mirror.test.ts compares every
27
+ * one of these 46 values against DEFAULT_PRESET on each run, so the next drift fails a
28
+ * test instead of earning a paragraph. The direction is one-way: the presets are the
29
+ * source, this file follows. */
24
30
 
25
31
  @custom-variant dark (&:where(.dark, .dark *));
26
32
 
@@ -39,10 +45,37 @@
39
45
  --brand: #4f46e5; /* indigo-600 */
40
46
  --brand-hover: #4338ca; /* indigo-700 */
41
47
  --brand-contrast: #ffffff;
42
- --money-income: #0f766e; /* teal-700 */
43
- --money-expense: #b45309; /* amber-700 */
44
- --money-net: #6d28d9; /* violet-700 */
45
- --money-neutral: #6b6253; /* warm slate */
48
+ --money-income: #0b6650; /* deep teal — the preset's own, darker than
49
+ teal-700 so it clears AA as TEXT on --bg-page */
50
+ --money-expense: #905902; /* solved: amber-700 (#b45309) reached only 3.88:1 as
51
+ TEXT on --bg-page, below WCAG AA. See the preset
52
+ audit in theme/__tests__/palette-audit.test.ts. */
53
+ --money-net: #7a4fa3; /* muted violet, warmed to this palette */
54
+ --money-neutral: #6b6453; /* warm slate */
55
+
56
+ /* ── Field sync status ─────────────────────────────────────────────────────
57
+ The four states a database-backed field can be in. Deliberately NOT part of
58
+ `TokenSet` and NOT per-preset: these are functional signals, like a traffic
59
+ light, and a field that means "saved" must not change meaning because somebody
60
+ picked a different appearance preset. They do flip light/dark, because contrast
61
+ is not optional.
62
+
63
+ They mark a field's FRAME and an ICON at its end — non-text graphics, for which
64
+ WCAG 1.4.11 asks 3:1 against the surface — and all four clear it on the worst of
65
+ the three light surfaces. `--status-edited` is amber rather than the orange-800 it
66
+ was: beside red-700 that orange read as a second error colour, and "unsaved" has
67
+ to look like a caution, not an alarm. Amber is below 4.5:1, so it is not a TEXT
68
+ colour: `FieldSyncIndicator` prints its words in `--text-secondary` beside it.
69
+
70
+ GREEN AND RED ARE THE CLASSIC CVD-UNSAFE PAIR, and the rest of this file goes out
71
+ of its way to avoid it — the money trio is teal/amber/violet for exactly this
72
+ reason. They are used here because the states were specified in these colours, so
73
+ `FieldSyncIndicator` gives every state its own ICON as well and colour is never
74
+ the only signal. Do not drop the icons. */
75
+ --status-synced: #166534; /* green-800 — persisted */
76
+ --status-pending: #1d4ed8; /* blue-700 — in flight */
77
+ --status-edited: #d97706; /* amber-600 — dirty, not yet saved */
78
+ --status-error: #b91c1c; /* red-700 — the save failed */
46
79
  --chart-1: #332288;
47
80
  --chart-2: #88ccee;
48
81
  --chart-3: #44aa99;
@@ -63,10 +96,12 @@
63
96
  /* As in `:root` — 7.0:1 and 4.8:1 against the worst of the three dark surfaces. */
64
97
  --text-secondary: #adafbe;
65
98
  --text-muted: #8d90a0;
66
- --brand: #818cf8; /* indigo-400 */
67
- --brand-hover: #a5b4fc; /* indigo-300 */
68
- --brand-contrast: #1e1b4b; /* indigo-950 */
69
- --money-income: #2dd4bf; /* teal-400 */
99
+ --brand: #8b93f8; /* indigo, lifted off the Tailwind scale to sit at
100
+ the same OKLab lightness as the other dark tokens */
101
+ --brand-hover: #aab1fb;
102
+ --brand-contrast: #16182b; /* the dark page, not indigo-950: a filled brand
103
+ button reads as a hole in the surface it sits on */
104
+ --money-income: #22c3b6; /* teal, pulled down to the dark set's lightness */
70
105
  /* Deliberately NOT amber-400 (#fbbf24). Every other colour on a dark surface
71
106
  sits around OKLab L 0.68–0.74 (brand 0.68, net 0.70, neutral 0.71, income
72
107
  0.74); amber-400 lands at 0.84, so outflows — most rows in a register — shouted
@@ -74,8 +109,15 @@
74
109
  meaning. Same hue (84°) and chroma, pulled to L 0.785: still 8.9:1 on the card
75
110
  surface, still far from income in CVD space (Keksdose dev#434). */
76
111
  --money-expense: #e4b035;
77
- --money-net: #a98fd6;
78
- --money-neutral: #a1a1aa; /* zinc-400 */
112
+ --money-net: #b39aef;
113
+ --money-neutral: #9aa1bd; /* the palette's own cool grey, not zinc-400 */
114
+
115
+ /* Field sync status — see the note in `:root`. Against the worst of the three dark
116
+ surfaces these run 8.7 / 9.1 / 6.7 / 8.0:1. */
117
+ --status-synced: #4ade80; /* green-400 */
118
+ --status-pending: #7dd3fc; /* sky-300 */
119
+ --status-edited: #fbbf24; /* amber-400 */
120
+ --status-error: #fca5a5; /* red-300 */
79
121
  --chart-1: #7e72d6;
80
122
  --chart-2: #9fd8f2;
81
123
  --chart-3: #5fc4b0;
@@ -87,6 +129,110 @@
87
129
  --chart-9: #cc78be;
88
130
  }
89
131
 
132
+ /* ── Derived surface / text roles ───────────────────────────────────────────
133
+ Everything here is computed FROM the tokens `applyTokenSet` writes inline on
134
+ <html>, so each one follows the active palette preset without being part of
135
+ `TokenSet` and without every preset having to spell it out. That is also why
136
+ they are `color-mix` rather than literals: one formula is correct in both
137
+ themes, because the inputs flip.
138
+
139
+ These exist because the components did not have them and reached for Tailwind's
140
+ slate scale instead — 815 hardcoded colour utilities against 85 token
141
+ references, which is the reason a consumer could not re-skin this kit without
142
+ forking it. See docs/module-audit-2026-09-22.md §theming. */
143
+ :root,
144
+ .dark {
145
+ /* Dimmer than `--text-muted`: placeholders, disabled text, the empty half of a
146
+ value. Mixing TOWARD the surface fades it in light and in dark alike. */
147
+ --text-placeholder: color-mix(in oklab, var(--text-muted) 65%, var(--bg-surface));
148
+
149
+ /* The wash under a hovered row, menu item or icon button. Mixing the TEXT colour
150
+ into the surface darkens it on a light theme and lightens it on a dark one,
151
+ which is the behaviour a fixed `slate-100`/`slate-800` pair was faking. */
152
+ --bg-hover: color-mix(in oklab, var(--text-primary) 7%, var(--bg-surface));
153
+ --bg-active: color-mix(in oklab, var(--text-primary) 12%, var(--bg-surface));
154
+
155
+ /* A chip that inverts against the page — a selected day, a keyboard hint. These
156
+ are literally the text and surface colours swapped, which is what
157
+ `bg-slate-900 dark:bg-slate-100` was approximating. */
158
+ --bg-inverse: var(--text-primary);
159
+ --text-inverse: var(--bg-surface);
160
+
161
+ /* A border that has to be seen rather than merely felt: a focused field, a
162
+ selected card. `--border` pulled toward the text colour. */
163
+ --border-strong: color-mix(in oklab, var(--border) 55%, var(--text-primary));
164
+
165
+ /* The SOFT brand: a tinted chip rather than a filled one — an active filter, a
166
+ selected day, a resize handle under the cursor. The kit had `--brand`,
167
+ `--brand-hover` and `--brand-contrast` but nothing for "brand, quietly", so
168
+ components reached for `bg-indigo-100 dark:bg-indigo-500/20` and a consumer
169
+ who changed `--brand` was left with an indigo island. Derived, so it follows
170
+ whatever the brand becomes. */
171
+ --brand-bg: color-mix(in oklab, var(--brand) 14%, var(--bg-surface));
172
+ --brand-bg-hover: color-mix(in oklab, var(--brand) 24%, var(--bg-surface));
173
+ /* Brand text ON `--brand-bg` — pulled away from the surface so it keeps contrast
174
+ against its own tint in both themes. */
175
+ --brand-muted: color-mix(in oklab, var(--brand) 70%, var(--text-primary));
176
+ }
177
+
178
+ /* ── Semantic status ────────────────────────────────────────────────────────
179
+ Destructive and cautionary UI. These are the values the components already
180
+ painted, lifted out of the class names so a consumer can change them — the kit
181
+ previously shipped two different destructive hues with no way to override
182
+ either. Not derived, because a warning is a specific colour, not a tint of the
183
+ page.
184
+
185
+ Distinct from the `--status-*` family above: those describe a FIELD's journey
186
+ to the database, these describe an ACTION's consequence. A row can be
187
+ `--status-error` (its last save failed) inside a form whose delete button is
188
+ `--danger` (it will destroy something), and they should not look identical. */
189
+ :root {
190
+ --danger: #be123c; /* rose-700 */
191
+ --danger-hover: #9f1239; /* rose-800 */
192
+ --danger-contrast: #ffffff;
193
+ --danger-border: #fb7185; /* rose-400 */
194
+ --danger-bg: #fff1f2; /* rose-50 */
195
+
196
+ --warning: #b45309; /* amber-700 */
197
+ --warning-border: #fcd34d; /* amber-300 */
198
+ --warning-bg: #fffbeb; /* amber-50 */
199
+
200
+ /* Informational, and deliberately NOT the brand: a count of active filters is
201
+ not a call to action, and painting it `--brand` would make every table look
202
+ like it had a primary button in the toolbar. */
203
+ --info: #0369a1; /* sky-700 */
204
+ --info-border: #7dd3fc; /* sky-300 */
205
+ --info-bg: #e0f2fe; /* sky-100 */
206
+
207
+ /* Done, resolved, accepted. Distinct from `--status-synced` for the same reason
208
+ `--danger` is distinct from `--status-error`: that family describes a FIELD's
209
+ journey to the database, this one an ACTION's outcome. Emerald rather than the
210
+ money teal, so a "resolved" chip cannot be misread as an inflow. */
211
+ --success: #047857; /* emerald-700 */
212
+ --success-border: #6ee7b7; /* emerald-300 */
213
+ --success-bg: #d1fae5; /* emerald-100 */
214
+ }
215
+
216
+ .dark {
217
+ --danger: #fda4af; /* rose-300 */
218
+ --danger-hover: #fecdd3; /* rose-200 */
219
+ --danger-contrast: #4c0519; /* rose-950 */
220
+ --danger-border: #e11d48; /* rose-600 */
221
+ --danger-bg: rgba(136, 19, 55, 0.2);
222
+
223
+ --warning: #fcd34d; /* amber-300 */
224
+ --warning-border: rgba(180, 83, 9, 0.6);
225
+ --warning-bg: rgba(120, 53, 15, 0.2);
226
+
227
+ --info: #7dd3fc; /* sky-300 */
228
+ --info-border: rgba(3, 105, 161, 0.6);
229
+ --info-bg: rgba(12, 74, 110, 0.25);
230
+
231
+ --success: #6ee7b7; /* emerald-300 */
232
+ --success-border: rgba(4, 120, 87, 0.6);
233
+ --success-bg: rgba(6, 78, 59, 0.25);
234
+ }
235
+
90
236
  /* Semantic colour utilities backed by the tokens above. Unlayered so they win
91
237
  over Tailwind's layered colour utilities, and theme-aware for free (the var
92
238
  flips under .dark) — no dark: variant needed at the call site. */
@@ -105,6 +251,33 @@
105
251
  .bg-money-neutral { background-color: var(--money-neutral); }
106
252
  .border-brand { border-color: var(--brand); }
107
253
 
254
+ /* Visually hidden, like Tailwind's `sr-only`, but POSITION: FIXED rather than absolute.
255
+ *
256
+ * `sr-only` is `position: absolute`, so an element wearing it with no positioned
257
+ * ancestor resolves its containing block to the INITIAL one and is laid out at its own
258
+ * offset from the top of the document. Nothing looks wrong — it is 1x1 and clipped —
259
+ * but `documentElement.scrollHeight` grows to reach it, which on a long page produces a
260
+ * second, whole-document scrollbar beside the app shell's own, scrolling past the end of
261
+ * the content into nothing. Measured on the showcase: body 900px, document 47,919px,
262
+ * with the deepest escaped `input.sr-only` sitting at offsetTop 47,918.
263
+ *
264
+ * A fixed element is out of flow AND out of the document's scroll height, so this one
265
+ * can be dropped anywhere — a live region inside a table, a hidden input inside a
266
+ * dropzone — without its container having to remember to be `relative`. Prefer it for
267
+ * anything the kit renders on a consumer's behalf, where there is no wrapper to fix.
268
+ */
269
+ .sr-only-fixed {
270
+ position: fixed;
271
+ width: 1px;
272
+ height: 1px;
273
+ padding: 0;
274
+ margin: -1px;
275
+ overflow: hidden;
276
+ clip-path: inset(50%);
277
+ white-space: nowrap;
278
+ border-width: 0;
279
+ }
280
+
108
281
  html, body, #root {
109
282
  height: 100%;
110
283
  }
@@ -214,6 +387,30 @@ body {
214
387
  .animate-overlay { animation-duration: 0.01ms; }
215
388
  }
216
389
 
390
+ /* The sidebar's flyout panel: a short fade and a 4px slide out of the sidebar, so it
391
+ reads as coming FROM the entry it belongs to rather than appearing beside it. The
392
+ slide uses the inline axis, so it runs the right way under `dir="rtl"` too. Under
393
+ reduced motion it only fades — nothing travels. */
394
+ @keyframes flyout-in {
395
+ from { opacity: 0; translate: var(--flyout-from, -4px) 0; }
396
+ to { opacity: 1; translate: 0 0; }
397
+ }
398
+ [dir="rtl"] .animate-flyout { --flyout-from: 4px; }
399
+ .animate-flyout { animation: flyout-in 0.14s ease-out; }
400
+ @media (prefers-reduced-motion: reduce) {
401
+ .animate-flyout { animation-name: overlay-fade-in; }
402
+ }
403
+
404
+ /* The phone's page row (AppShell `mobileSubNav`) rising out of the bottom bar. */
405
+ @keyframes subnav-in {
406
+ from { opacity: 0; transform: translateY(6px); }
407
+ to { opacity: 1; transform: none; }
408
+ }
409
+ .animate-subnav { animation: subnav-in 0.2s ease-out; }
410
+ @media (prefers-reduced-motion: reduce) {
411
+ .animate-subnav { animation-name: overlay-fade-in; }
412
+ }
413
+
217
414
  /* Chart drilldown fan-out/-in (feedback #260 rework): the remounted chart eases
218
415
  in instead of snapping. */
219
416
  @keyframes drill-in {
@@ -223,6 +420,11 @@ body {
223
420
  .animate-drill {
224
421
  animation: drill-in 0.25s ease-out;
225
422
  }
423
+ /* A drilldown still has to SAY the level changed, so under reduced motion the chart
424
+ fades in rather than appearing in one frame — but it no longer scales. */
425
+ @media (prefers-reduced-motion: reduce) {
426
+ .animate-drill { animation-name: overlay-fade-in; }
427
+ }
226
428
 
227
429
  /* Scrollbars: keep light defaults; theme to slate when dark mode is active. */
228
430
  .dark {