@eifi1/ui-kit 0.51.7 → 0.53.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 (775) hide show
  1. package/README.md +178 -67
  2. package/dist/account/account-parts.d.ts +10 -8
  3. package/dist/account/account-parts.js +1 -18
  4. package/dist/account/account-parts.js.map +1 -1
  5. package/dist/account/data-export-setting-labels.js +1 -1
  6. package/dist/account/data-export-setting-labels.js.map +1 -1
  7. package/dist/account/delete-account-setting-labels.js +1 -1
  8. package/dist/account/delete-account-setting-labels.js.map +1 -1
  9. package/dist/account/email-change-setting-labels.js +1 -1
  10. package/dist/account/email-change-setting-labels.js.map +1 -1
  11. package/dist/account/passkeys-setting.d.ts +9 -2
  12. package/dist/account/passkeys-setting.js +41 -29
  13. package/dist/account/passkeys-setting.js.map +1 -1
  14. package/dist/account/sessions-setting.d.ts +3 -2
  15. package/dist/account/sessions-setting.js +10 -8
  16. package/dist/account/sessions-setting.js.map +1 -1
  17. package/dist/admin/admin-action-confirm.js +1 -3
  18. package/dist/admin/admin-action-confirm.js.map +1 -1
  19. package/dist/admin/admin-parts.d.ts +6 -3
  20. package/dist/admin/admin-parts.js +6 -21
  21. package/dist/admin/admin-parts.js.map +1 -1
  22. package/dist/admin/mail-test-card-labels.js +1 -1
  23. package/dist/admin/mail-test-card-labels.js.map +1 -1
  24. package/dist/admin/plan-change-labels.d.ts +2 -2
  25. package/dist/admin/plan-change-labels.js +1 -17
  26. package/dist/admin/plan-change-labels.js.map +1 -1
  27. package/dist/admin/plan-change.d.ts +3 -42
  28. package/dist/admin/plan-change.js +1 -1
  29. package/dist/admin/plan-change.js.map +1 -1
  30. package/dist/admin/reviewer-scope-editor.js +3 -3
  31. package/dist/admin/reviewer-scope-editor.js.map +1 -1
  32. package/dist/auth/auth-errors-labels.d.ts +11 -0
  33. package/dist/auth/auth-errors-labels.js +13 -0
  34. package/dist/auth/auth-errors-labels.js.map +1 -0
  35. package/dist/auth/auth-errors.d.ts +7 -23
  36. package/dist/auth/auth-errors.js +2 -15
  37. package/dist/auth/auth-errors.js.map +1 -1
  38. package/dist/auth/complete-name-dialog.js +2 -1
  39. package/dist/auth/complete-name-dialog.js.map +1 -1
  40. package/dist/auth/forgot-password-form-labels.js +1 -1
  41. package/dist/auth/forgot-password-form-labels.js.map +1 -1
  42. package/dist/auth/forgot-password-form.js +7 -2
  43. package/dist/auth/forgot-password-form.js.map +1 -1
  44. package/dist/auth/register-form-labels.js +1 -1
  45. package/dist/auth/register-form-labels.js.map +1 -1
  46. package/dist/auth/reset-password-form-labels.js +1 -1
  47. package/dist/auth/reset-password-form-labels.js.map +1 -1
  48. package/dist/auth/reset-password-form.js +5 -1
  49. package/dist/auth/reset-password-form.js.map +1 -1
  50. package/dist/auth/sign-in-form-labels.js +1 -1
  51. package/dist/auth/sign-in-form-labels.js.map +1 -1
  52. package/dist/auth/status-parts.d.ts +0 -3
  53. package/dist/auth/status-parts.js +0 -4
  54. package/dist/auth/status-parts.js.map +1 -1
  55. package/dist/auth/verify-email-labels.js +1 -1
  56. package/dist/auth/verify-email-labels.js.map +1 -1
  57. package/dist/auth/verify-email.js +7 -2
  58. package/dist/auth/verify-email.js.map +1 -1
  59. package/dist/billing/cancel-subscription.d.ts +10 -7
  60. package/dist/billing/cancel-subscription.js +6 -6
  61. package/dist/billing/cancel-subscription.js.map +1 -1
  62. package/dist/billing/plan-card.d.ts +5 -3
  63. package/dist/billing/plan-card.js +7 -8
  64. package/dist/billing/plan-card.js.map +1 -1
  65. package/dist/billing/plan-change-labels.d.ts +42 -0
  66. package/dist/billing/plan-change-labels.js +22 -0
  67. package/dist/billing/plan-change-labels.js.map +1 -0
  68. package/dist/billing/plan-switch.d.ts +9 -6
  69. package/dist/billing/plan-switch.js +7 -5
  70. package/dist/billing/plan-switch.js.map +1 -1
  71. package/dist/chart.d.ts +4 -3
  72. package/dist/chart.js +72 -4
  73. package/dist/chart.js.map +1 -1
  74. package/dist/components/account-chips.d.ts +5 -5
  75. package/dist/components/account-chips.js +11 -13
  76. package/dist/components/account-chips.js.map +1 -1
  77. package/dist/components/alert-banner.d.ts +16 -5
  78. package/dist/components/alert-banner.js +46 -1
  79. package/dist/components/alert-banner.js.map +1 -1
  80. package/dist/components/amount-input.d.ts +13 -0
  81. package/dist/components/amount-input.js +1 -0
  82. package/dist/components/amount-input.js.map +1 -1
  83. package/dist/components/autocomplete.js +57 -65
  84. package/dist/components/autocomplete.js.map +1 -1
  85. package/dist/components/bulk-action-bar.d.ts +12 -2
  86. package/dist/components/bulk-action-bar.js +65 -21
  87. package/dist/components/bulk-action-bar.js.map +1 -1
  88. package/dist/components/button-look.d.ts +5 -5
  89. package/dist/components/button-look.js.map +1 -1
  90. package/dist/components/button.d.ts +2 -2
  91. package/dist/components/button.js.map +1 -1
  92. package/dist/components/chart-edge.d.ts +16 -0
  93. package/dist/components/chart-edge.js +14 -1
  94. package/dist/components/chart-edge.js.map +1 -1
  95. package/dist/components/chart-figure.d.ts +13 -0
  96. package/dist/components/chart-figure.js +15 -0
  97. package/dist/components/chart-figure.js.map +1 -0
  98. package/dist/components/chart-zoom-core.js +1 -4
  99. package/dist/components/chart-zoom-core.js.map +1 -1
  100. package/dist/components/chart.d.ts +8 -1
  101. package/dist/components/chart.js +19 -10
  102. package/dist/components/chart.js.map +1 -1
  103. package/dist/components/combobox-core.d.ts +111 -2
  104. package/dist/components/combobox-core.js +148 -42
  105. package/dist/components/combobox-core.js.map +1 -1
  106. package/dist/components/combobox.d.ts +1 -1
  107. package/dist/components/combobox.js +141 -130
  108. package/dist/components/combobox.js.map +1 -1
  109. package/dist/components/copy-button.d.ts +6 -5
  110. package/dist/components/copy-button.js +5 -3
  111. package/dist/components/copy-button.js.map +1 -1
  112. package/dist/components/country-select.js +2 -2
  113. package/dist/components/country-select.js.map +1 -1
  114. package/dist/components/data-table-column-settings.d.ts +1 -1
  115. package/dist/components/data-table-column-settings.js +33 -7
  116. package/dist/components/data-table-column-settings.js.map +1 -1
  117. package/dist/components/data-table-filters.d.ts +4 -2
  118. package/dist/components/data-table-filters.js +2 -2
  119. package/dist/components/data-table-filters.js.map +1 -1
  120. package/dist/components/data-table-fit.d.ts +6 -4
  121. package/dist/components/data-table-fit.js +4 -1
  122. package/dist/components/data-table-fit.js.map +1 -1
  123. package/dist/components/data-table-groups.d.ts +1 -1
  124. package/dist/components/data-table-groups.js.map +1 -1
  125. package/dist/components/data-table-head.d.ts +1 -1
  126. package/dist/components/data-table-head.js +15 -12
  127. package/dist/components/data-table-head.js.map +1 -1
  128. package/dist/components/data-table-mobile.d.ts +12 -7
  129. package/dist/components/data-table-mobile.js +43 -30
  130. package/dist/components/data-table-mobile.js.map +1 -1
  131. package/dist/components/data-table-pagination.js +11 -6
  132. package/dist/components/data-table-pagination.js.map +1 -1
  133. package/dist/components/data-table-resize.d.ts +1 -1
  134. package/dist/components/data-table-resize.js.map +1 -1
  135. package/dist/components/data-table-row-actions.d.ts +2 -2
  136. package/dist/components/data-table-row-actions.js.map +1 -1
  137. package/dist/components/data-table-row.d.ts +6 -2
  138. package/dist/components/data-table-row.js +17 -10
  139. package/dist/components/data-table-row.js.map +1 -1
  140. package/dist/components/data-table-selection.d.ts +1 -1
  141. package/dist/components/data-table-selection.js.map +1 -1
  142. package/dist/components/data-table-shared.d.ts +10 -2
  143. package/dist/components/data-table-shared.js +18 -0
  144. package/dist/components/data-table-shared.js.map +1 -1
  145. package/dist/components/data-table-sort.d.ts +21 -2
  146. package/dist/components/data-table-sort.js +24 -0
  147. package/dist/components/data-table-sort.js.map +1 -1
  148. package/dist/components/data-table-virtual.d.ts +1 -1
  149. package/dist/components/data-table-virtual.js +18 -6
  150. package/dist/components/data-table-virtual.js.map +1 -1
  151. package/dist/components/data-table.d.ts +13 -4
  152. package/dist/components/data-table.js +139 -36
  153. package/dist/components/data-table.js.map +1 -1
  154. package/dist/components/date-field.d.ts +25 -3
  155. package/dist/components/date-field.js +33 -8
  156. package/dist/components/date-field.js.map +1 -1
  157. package/dist/components/date-picker.d.ts +16 -3
  158. package/dist/components/date-picker.js +55 -26
  159. package/dist/components/date-picker.js.map +1 -1
  160. package/dist/components/date-range-picker.d.ts +38 -24
  161. package/dist/components/date-range-picker.js +23 -7
  162. package/dist/components/date-range-picker.js.map +1 -1
  163. package/dist/components/error-boundary.js +37 -30
  164. package/dist/components/error-boundary.js.map +1 -1
  165. package/dist/components/{ui-labels.d.ts → field-base-labels.d.ts} +0 -2
  166. package/dist/components/{ui-labels.js → field-base-labels.js} +2 -9
  167. package/dist/components/field-base-labels.js.map +1 -0
  168. package/dist/components/field-base.d.ts +4 -3
  169. package/dist/components/field-base.js +3 -3
  170. package/dist/components/field-base.js.map +1 -1
  171. package/dist/components/form-actions.js +11 -5
  172. package/dist/components/form-actions.js.map +1 -1
  173. package/dist/components/hover-menu.d.ts +3 -0
  174. package/dist/components/hover-menu.js +5 -3
  175. package/dist/components/hover-menu.js.map +1 -1
  176. package/dist/components/icon-button.js +14 -9
  177. package/dist/components/icon-button.js.map +1 -1
  178. package/dist/components/inline-confirm.d.ts +43 -0
  179. package/dist/components/inline-confirm.js +67 -0
  180. package/dist/components/inline-confirm.js.map +1 -0
  181. package/dist/components/inline-entity-combobox.d.ts +4 -3
  182. package/dist/components/inline-entity-combobox.js +148 -140
  183. package/dist/components/inline-entity-combobox.js.map +1 -1
  184. package/dist/components/input.js +1 -1
  185. package/dist/components/input.js.map +1 -1
  186. package/dist/components/jump-calendar.js +28 -112
  187. package/dist/components/jump-calendar.js.map +1 -1
  188. package/dist/components/legal-page.d.ts +3 -1
  189. package/dist/components/legal-page.js +3 -2
  190. package/dist/components/legal-page.js.map +1 -1
  191. package/dist/components/legal.d.ts +4 -2
  192. package/dist/components/legal.js.map +1 -1
  193. package/dist/components/lightbox.d.ts +2 -2
  194. package/dist/components/lightbox.js +17 -6
  195. package/dist/components/lightbox.js.map +1 -1
  196. package/dist/components/list.d.ts +6 -2
  197. package/dist/components/list.js +3 -2
  198. package/dist/components/list.js.map +1 -1
  199. package/dist/components/measured-grid.d.ts +1 -1
  200. package/dist/components/measured-grid.js +2 -1
  201. package/dist/components/measured-grid.js.map +1 -1
  202. package/dist/components/mini-calendar.js +3 -5
  203. package/dist/components/mini-calendar.js.map +1 -1
  204. package/dist/components/modal.js +3 -1
  205. package/dist/components/modal.js.map +1 -1
  206. package/dist/components/month-grid.d.ts +55 -0
  207. package/dist/components/month-grid.js +148 -0
  208. package/dist/components/month-grid.js.map +1 -0
  209. package/dist/components/month-picker.d.ts +36 -4
  210. package/dist/components/month-picker.js +123 -146
  211. package/dist/components/month-picker.js.map +1 -1
  212. package/dist/components/multi-select.d.ts +2 -2
  213. package/dist/components/multi-select.js +11 -6
  214. package/dist/components/multi-select.js.map +1 -1
  215. package/dist/components/nav-pills.d.ts +1 -1
  216. package/dist/components/nav-pills.js.map +1 -1
  217. package/dist/components/picker-sheet.js +2 -1
  218. package/dist/components/picker-sheet.js.map +1 -1
  219. package/dist/components/pie-chart-labels.d.ts +7 -0
  220. package/dist/components/pie-chart-labels.js +1 -0
  221. package/dist/components/pie-chart-labels.js.map +1 -1
  222. package/dist/components/pie-chart.d.ts +5 -3
  223. package/dist/components/pie-chart.js +7 -22
  224. package/dist/components/pie-chart.js.map +1 -1
  225. package/dist/components/popover.d.ts +3 -0
  226. package/dist/components/popover.js +7 -1
  227. package/dist/components/popover.js.map +1 -1
  228. package/dist/components/row-actions.js +2 -1
  229. package/dist/components/row-actions.js.map +1 -1
  230. package/dist/components/series-chart-axes.d.ts +4 -4
  231. package/dist/components/series-chart-axes.js.map +1 -1
  232. package/dist/components/series-chart-labels.d.ts +7 -4
  233. package/dist/components/series-chart-labels.js.map +1 -1
  234. package/dist/components/series-chart.d.ts +92 -23
  235. package/dist/components/series-chart.js +74 -30
  236. package/dist/components/series-chart.js.map +1 -1
  237. package/dist/components/share-card.js +3 -3
  238. package/dist/components/share-card.js.map +1 -1
  239. package/dist/components/tabs-labels.d.ts +2 -0
  240. package/dist/components/tabs-labels.js +11 -0
  241. package/dist/components/tabs-labels.js.map +1 -0
  242. package/dist/components/tabs.d.ts +1 -1
  243. package/dist/components/tabs.js +1 -1
  244. package/dist/components/tabs.js.map +1 -1
  245. package/dist/components/toggle-legend.d.ts +2 -2
  246. package/dist/components/toggle-legend.js +6 -6
  247. package/dist/components/toggle-legend.js.map +1 -1
  248. package/dist/components/translation-review-editor.d.ts +4 -2
  249. package/dist/components/translation-review-editor.js +2 -3
  250. package/dist/components/translation-review-editor.js.map +1 -1
  251. package/dist/components/translation-review.d.ts +2 -1
  252. package/dist/components/translation-review.js +2 -2
  253. package/dist/components/translation-review.js.map +1 -1
  254. package/dist/components/treemap-labels.d.ts +31 -0
  255. package/dist/components/treemap-labels.js +10 -0
  256. package/dist/components/treemap-labels.js.map +1 -0
  257. package/dist/components/treemap-layout.d.ts +62 -0
  258. package/dist/components/treemap-layout.js +126 -0
  259. package/dist/components/treemap-layout.js.map +1 -0
  260. package/dist/components/treemap.d.ts +167 -19
  261. package/dist/components/treemap.js +340 -100
  262. package/dist/components/treemap.js.map +1 -1
  263. package/dist/components/use-table-state.d.ts +5 -5
  264. package/dist/components/use-table-state.js +4 -1
  265. package/dist/components/use-table-state.js.map +1 -1
  266. package/dist/data-table.d.ts +1 -2
  267. package/dist/data-table.js +1 -4
  268. package/dist/data-table.js.map +1 -1
  269. package/dist/demo/demo-countdown.d.ts +0 -5
  270. package/dist/demo/demo-countdown.js +0 -4
  271. package/dist/demo/demo-countdown.js.map +1 -1
  272. package/dist/eslint/index.js +1 -1
  273. package/dist/eslint/role-utilities.d.ts +36 -7
  274. package/dist/eslint/role-utilities.js +42 -9
  275. package/dist/eslint/role-utilities.js.map +1 -1
  276. package/dist/feedback/feedback-dialog.d.ts +25 -16
  277. package/dist/feedback/feedback-dialog.js +6 -2
  278. package/dist/feedback/feedback-dialog.js.map +1 -1
  279. package/dist/feedback/feedback-mutation.d.ts +18 -0
  280. package/dist/feedback/feedback-mutation.js +8 -0
  281. package/dist/feedback/feedback-mutation.js.map +1 -0
  282. package/dist/feedback/feedback-page-link.d.ts +53 -0
  283. package/dist/feedback/feedback-page-link.js +37 -0
  284. package/dist/feedback/feedback-page-link.js.map +1 -0
  285. package/dist/feedback/feedback-public-list.d.ts +8 -4
  286. package/dist/feedback/feedback-public-list.js +2 -2
  287. package/dist/feedback/feedback-public-list.js.map +1 -1
  288. package/dist/feedback/feedback-replies.d.ts +3 -1
  289. package/dist/feedback/feedback-replies.js +5 -4
  290. package/dist/feedback/feedback-replies.js.map +1 -1
  291. package/dist/feedback/feedback-row-detail-labels.js +0 -3
  292. package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
  293. package/dist/feedback/feedback-row-detail.d.ts +33 -44
  294. package/dist/feedback/feedback-row-detail.js +28 -34
  295. package/dist/feedback/feedback-row-detail.js.map +1 -1
  296. package/dist/feedback/feedback-status-undo.d.ts +17 -14
  297. package/dist/feedback/feedback-status-undo.js +10 -15
  298. package/dist/feedback/feedback-status-undo.js.map +1 -1
  299. package/dist/feedback/feedback-submit-dialog.d.ts +1 -1
  300. package/dist/feedback/feedback-submit-dialog.js +1 -1
  301. package/dist/feedback/feedback-submit-dialog.js.map +1 -1
  302. package/dist/feedback/feedback-submit.js +9 -3
  303. package/dist/feedback/feedback-submit.js.map +1 -1
  304. package/dist/feedback/feedback-swipe.d.ts +1 -1
  305. package/dist/feedback/feedback-swipe.js.map +1 -1
  306. package/dist/feedback/feedback-table.d.ts +21 -9
  307. package/dist/feedback/feedback-table.js +45 -25
  308. package/dist/feedback/feedback-table.js.map +1 -1
  309. package/dist/feedback/feedback-thread-labels.d.ts +2 -2
  310. package/dist/feedback/feedback-thread-labels.js.map +1 -1
  311. package/dist/feedback/feedback-thread.d.ts +15 -23
  312. package/dist/feedback/feedback-thread.js +2 -1
  313. package/dist/feedback/feedback-thread.js.map +1 -1
  314. package/dist/feedback.d.ts +6 -6
  315. package/dist/feedback.js +90 -6
  316. package/dist/feedback.js.map +1 -1
  317. package/dist/hooks/use-focus-trap.d.ts +35 -0
  318. package/dist/hooks/use-focus-trap.js +6 -4
  319. package/dist/hooks/use-focus-trap.js.map +1 -1
  320. package/dist/hooks/use-hotkey.d.ts +5 -2
  321. package/dist/hooks/use-hotkey.js +5 -4
  322. package/dist/hooks/use-hotkey.js.map +1 -1
  323. package/dist/hooks/use-long-press.d.ts +7 -4
  324. package/dist/hooks/use-long-press.js +3 -0
  325. package/dist/hooks/use-long-press.js.map +1 -1
  326. package/dist/hooks/use-media-query.js +12 -4
  327. package/dist/hooks/use-media-query.js.map +1 -1
  328. package/dist/hooks/use-mounted.d.ts +22 -0
  329. package/dist/hooks/use-mounted.js +24 -0
  330. package/dist/hooks/use-mounted.js.map +1 -0
  331. package/dist/hooks/use-overlay-history.js +19 -3
  332. package/dist/hooks/use-overlay-history.js.map +1 -1
  333. package/dist/i18n/defaults.js +4 -9
  334. package/dist/i18n/defaults.js.map +1 -1
  335. package/dist/i18n/german.js +7 -18
  336. package/dist/i18n/german.js.map +1 -1
  337. package/dist/i18n/kit-labels.d.ts +9 -11
  338. package/dist/i18n/kit-labels.js.map +1 -1
  339. package/dist/i18n/locales/en.js +15 -64
  340. package/dist/i18n/locales/en.js.map +3 -3
  341. package/dist/i18n/locales/es.js +7 -18
  342. package/dist/i18n/locales/es.js.map +1 -1
  343. package/dist/i18n/locales/fr.js +20 -27
  344. package/dist/i18n/locales/fr.js.map +1 -1
  345. package/dist/i18n/locales/hu.js +9 -18
  346. package/dist/i18n/locales/hu.js.map +1 -1
  347. package/dist/i18n/locales/it.js +7 -19
  348. package/dist/i18n/locales/it.js.map +1 -1
  349. package/dist/i18n/locales/zh.js +8 -18
  350. package/dist/i18n/locales/zh.js.map +1 -1
  351. package/dist/i18n/review.js +12 -2
  352. package/dist/i18n/review.js.map +1 -1
  353. package/dist/i18n/shared-labels.js +0 -1
  354. package/dist/i18n/shared-labels.js.map +1 -1
  355. package/dist/index.d.ts +21 -23
  356. package/dist/index.js +50 -65
  357. package/dist/index.js.map +1 -1
  358. package/dist/landing/routing.d.ts +3 -1
  359. package/dist/landing/routing.js +4 -7
  360. package/dist/landing/routing.js.map +1 -1
  361. package/dist/lib/broadcast.d.ts +17 -0
  362. package/dist/lib/broadcast.js +30 -0
  363. package/dist/lib/broadcast.js.map +1 -0
  364. package/dist/lib/date-format.d.ts +37 -2
  365. package/dist/lib/date-format.js +34 -8
  366. package/dist/lib/date-format.js.map +1 -1
  367. package/dist/lib/day-format.d.ts +46 -0
  368. package/dist/lib/day-format.js +46 -0
  369. package/dist/lib/day-format.js.map +1 -0
  370. package/dist/lib/describe-failure.d.ts +14 -0
  371. package/dist/lib/describe-failure.js +9 -0
  372. package/dist/lib/describe-failure.js.map +1 -0
  373. package/dist/lib/direction.d.ts +16 -0
  374. package/dist/lib/direction.js +9 -1
  375. package/dist/lib/direction.js.map +1 -1
  376. package/dist/lib/focus-left.d.ts +63 -0
  377. package/dist/lib/focus-left.js +67 -0
  378. package/dist/lib/focus-left.js.map +1 -0
  379. package/dist/lib/format.js +5 -14
  380. package/dist/lib/format.js.map +1 -1
  381. package/dist/lib/http-status.d.ts +24 -0
  382. package/dist/lib/http-status.js +14 -0
  383. package/dist/lib/http-status.js.map +1 -0
  384. package/dist/lib/intl-cache.d.ts +14 -0
  385. package/dist/lib/intl-cache.js +15 -0
  386. package/dist/lib/intl-cache.js.map +1 -0
  387. package/dist/lib/iso-day.d.ts +11 -0
  388. package/dist/lib/iso-day.js +8 -0
  389. package/dist/lib/iso-day.js.map +1 -0
  390. package/dist/lib/lazy-with-fallback.d.ts +31 -0
  391. package/dist/lib/lazy-with-fallback.js +40 -0
  392. package/dist/lib/lazy-with-fallback.js.map +1 -0
  393. package/dist/lib/path-pattern.d.ts +34 -0
  394. package/dist/lib/path-pattern.js +24 -0
  395. package/dist/lib/path-pattern.js.map +1 -0
  396. package/dist/lib/reduced-motion.d.ts +2 -1
  397. package/dist/lib/reduced-motion.js.map +1 -1
  398. package/dist/lib/round.d.ts +2 -1
  399. package/dist/lib/round.js +2 -1
  400. package/dist/lib/round.js.map +1 -1
  401. package/dist/lib/safe-storage.d.ts +24 -5
  402. package/dist/lib/safe-storage.js +27 -2
  403. package/dist/lib/safe-storage.js.map +1 -1
  404. package/dist/lib/session-refresh.js +1 -1
  405. package/dist/lib/session-refresh.js.map +1 -1
  406. package/dist/lib/share-format.d.ts +13 -0
  407. package/dist/lib/share-format.js +10 -0
  408. package/dist/lib/share-format.js.map +1 -0
  409. package/dist/lib/text-case.d.ts +17 -0
  410. package/dist/lib/text-case.js +8 -0
  411. package/dist/lib/text-case.js.map +1 -0
  412. package/dist/lib/text-match.d.ts +29 -0
  413. package/dist/lib/text-match.js +20 -2
  414. package/dist/lib/text-match.js.map +1 -1
  415. package/dist/lib/thenable.d.ts +13 -0
  416. package/dist/lib/thenable.js +8 -0
  417. package/dist/lib/thenable.js.map +1 -0
  418. package/dist/lib/translation-review.d.ts +7 -2
  419. package/dist/lib/translation-review.js +4 -4
  420. package/dist/lib/translation-review.js.map +1 -1
  421. package/dist/notifications/device-zone-report.js +1 -1
  422. package/dist/notifications/device-zone-report.js.map +1 -1
  423. package/dist/notifications/notification-bell.d.ts +2 -1
  424. package/dist/notifications/notification-bell.js +3 -3
  425. package/dist/notifications/notification-bell.js.map +1 -1
  426. package/dist/notifications/notification-inbox.d.ts +10 -6
  427. package/dist/notifications/notification-inbox.js +26 -48
  428. package/dist/notifications/notification-inbox.js.map +1 -1
  429. package/dist/notifications/notification-parts.d.ts +3 -2
  430. package/dist/notifications/notification-parts.js +1 -3
  431. package/dist/notifications/notification-parts.js.map +1 -1
  432. package/dist/notifications/notification-types-setting.js +1 -1
  433. package/dist/notifications/notification-types-setting.js.map +1 -1
  434. package/dist/notifications/notifications-labels.d.ts +6 -0
  435. package/dist/notifications/notifications-labels.js +1 -0
  436. package/dist/notifications/notifications-labels.js.map +1 -1
  437. package/dist/notifications/push-device-setting.js +1 -1
  438. package/dist/notifications/push-device-setting.js.map +1 -1
  439. package/dist/notifications/push-devices-setting.d.ts +2 -1
  440. package/dist/notifications/push-devices-setting.js +27 -49
  441. package/dist/notifications/push-devices-setting.js.map +1 -1
  442. package/dist/notifications/quiet-hours-setting.d.ts +10 -3
  443. package/dist/notifications/quiet-hours-setting.js +65 -26
  444. package/dist/notifications/quiet-hours-setting.js.map +1 -1
  445. package/dist/notifications/unsubscribe-panel.js +4 -7
  446. package/dist/notifications/unsubscribe-panel.js.map +1 -1
  447. package/dist/notifications/use-push-device.d.ts +39 -1
  448. package/dist/notifications/use-push-device.js +28 -7
  449. package/dist/notifications/use-push-device.js.map +1 -1
  450. package/dist/offline/query-persistence.d.ts +3 -1
  451. package/dist/offline/query-persistence.js +19 -2
  452. package/dist/offline/query-persistence.js.map +1 -1
  453. package/dist/rhf/fields.d.ts +11 -4
  454. package/dist/rhf/fields.js.map +1 -1
  455. package/dist/search/command-palette.js +1 -1
  456. package/dist/search/command-palette.js.map +1 -1
  457. package/dist/search/global-search.js +19 -9
  458. package/dist/search/global-search.js.map +1 -1
  459. package/dist/search/search-index.d.ts +0 -6
  460. package/dist/search/search-index.js +0 -4
  461. package/dist/search/search-index.js.map +1 -1
  462. package/dist/search/use-command-key.d.ts +12 -1
  463. package/dist/search/use-command-key.js +3 -12
  464. package/dist/search/use-command-key.js.map +1 -1
  465. package/dist/search.d.ts +1 -1
  466. package/dist/search.js +6 -1
  467. package/dist/search.js.map +1 -1
  468. package/dist/settings/use-settings-focus.js +1 -0
  469. package/dist/settings/use-settings-focus.js.map +1 -1
  470. package/dist/shell/account-menu-language.d.ts +5 -3
  471. package/dist/shell/account-menu-language.js +2 -2
  472. package/dist/shell/account-menu-language.js.map +1 -1
  473. package/dist/shell/account-menu-text-size.d.ts +9 -6
  474. package/dist/shell/account-menu-text-size.js +2 -2
  475. package/dist/shell/account-menu-text-size.js.map +1 -1
  476. package/dist/shell/app-shell.d.ts +0 -10
  477. package/dist/shell/app-shell.js +1 -7
  478. package/dist/shell/app-shell.js.map +1 -1
  479. package/dist/shell/company-switcher.d.ts +1 -1
  480. package/dist/shell/company-switcher.js.map +1 -1
  481. package/dist/shell/dev-menu.d.ts +1 -1
  482. package/dist/shell/dev-menu.js +5 -18
  483. package/dist/shell/dev-menu.js.map +1 -1
  484. package/dist/shell/top-bar-actions.d.ts +1 -1
  485. package/dist/shell/top-bar-actions.js.map +1 -1
  486. package/dist/shell/top-bar-parts-labels.d.ts +1 -3
  487. package/dist/shell/top-bar-parts-labels.js +0 -1
  488. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  489. package/dist/shell.d.ts +7 -10
  490. package/dist/shell.js +14 -23
  491. package/dist/shell.js.map +1 -1
  492. package/dist/sync/engine.d.ts +30 -4
  493. package/dist/sync/engine.js +172 -52
  494. package/dist/sync/engine.js.map +1 -1
  495. package/dist/sync.d.ts +2 -2
  496. package/dist/sync.js +2 -10
  497. package/dist/sync.js.map +1 -1
  498. package/dist/testing/css-variables.js +3 -8
  499. package/dist/testing/css-variables.js.map +1 -1
  500. package/dist/theme/chart-palette.d.ts +0 -5
  501. package/dist/theme/chart-palette.js +0 -2
  502. package/dist/theme/chart-palette.js.map +1 -1
  503. package/dist/theme/contrast.d.ts +2 -1
  504. package/dist/theme/contrast.js +3 -8
  505. package/dist/theme/contrast.js.map +1 -1
  506. package/dist/theme/palette-store.js +6 -6
  507. package/dist/theme/palette-store.js.map +1 -1
  508. package/dist/theme/text-size.js +3 -8
  509. package/dist/theme/text-size.js.map +1 -1
  510. package/dist/theme/theme-store.js +3 -6
  511. package/dist/theme/theme-store.js.map +1 -1
  512. package/dist/tour/tour-catalogue.d.ts +7 -4
  513. package/dist/tour/tour-catalogue.js +12 -10
  514. package/dist/tour/tour-catalogue.js.map +1 -1
  515. package/dist/tour/tour-dock.d.ts +0 -2
  516. package/dist/tour/tour-dock.js +0 -2
  517. package/dist/tour/tour-dock.js.map +1 -1
  518. package/dist/tour/tour-gates.d.ts +4 -0
  519. package/dist/tour/tour-gates.js +14 -0
  520. package/dist/tour/tour-gates.js.map +1 -1
  521. package/dist/tour/tour-overlay.d.ts +27 -0
  522. package/dist/tour/tour-overlay.js +741 -0
  523. package/dist/tour/tour-overlay.js.map +1 -0
  524. package/dist/tour/tour.d.ts +13 -3
  525. package/dist/tour/tour.js +59 -781
  526. package/dist/tour/tour.js.map +1 -1
  527. package/dist/tour/use-tour-progress.js +1 -1
  528. package/dist/tour/use-tour-progress.js.map +1 -1
  529. package/dist/wizard/stepper-nav.d.ts +5 -1
  530. package/dist/wizard/stepper-nav.js.map +1 -1
  531. package/dist/wizard/types.d.ts +6 -2
  532. package/dist/wizard/types.js.map +1 -1
  533. package/dist/wizard/use-wizard.d.ts +3 -1
  534. package/dist/wizard/use-wizard.js.map +1 -1
  535. package/dist/wizard/validation.d.ts +3 -1
  536. package/dist/wizard/validation.js.map +1 -1
  537. package/package.json +10 -6
  538. package/src/account/account-parts.ts +5 -25
  539. package/src/account/data-export-setting-labels.ts +1 -1
  540. package/src/account/delete-account-setting-labels.ts +1 -1
  541. package/src/account/email-change-setting-labels.ts +1 -1
  542. package/src/account/passkeys-setting.tsx +60 -38
  543. package/src/account/sessions-setting.tsx +18 -12
  544. package/src/admin/admin-action-confirm.tsx +1 -5
  545. package/src/admin/admin-parts.ts +11 -25
  546. package/src/admin/mail-test-card-labels.ts +1 -1
  547. package/src/admin/plan-change-labels.ts +5 -23
  548. package/src/admin/plan-change.tsx +7 -44
  549. package/src/admin/reviewer-scope-editor.tsx +3 -3
  550. package/src/auth/auth-errors-labels.ts +23 -0
  551. package/src/auth/auth-errors.ts +11 -38
  552. package/src/auth/complete-name-dialog.tsx +4 -1
  553. package/src/auth/forgot-password-form-labels.ts +1 -1
  554. package/src/auth/forgot-password-form.tsx +11 -6
  555. package/src/auth/register-form-labels.ts +1 -1
  556. package/src/auth/reset-password-form-labels.ts +1 -1
  557. package/src/auth/reset-password-form.tsx +8 -4
  558. package/src/auth/sign-in-form-labels.ts +1 -1
  559. package/src/auth/status-parts.tsx +0 -6
  560. package/src/auth/verify-email-labels.ts +1 -1
  561. package/src/auth/verify-email.tsx +11 -6
  562. package/src/billing/cancel-subscription.tsx +15 -12
  563. package/src/billing/plan-card.tsx +18 -10
  564. package/src/billing/plan-change-labels.ts +66 -0
  565. package/src/billing/plan-switch.tsx +15 -12
  566. package/src/chart.ts +73 -6
  567. package/src/components/account-chips.tsx +20 -23
  568. package/src/components/alert-banner.tsx +82 -5
  569. package/src/components/amount-input.tsx +18 -7
  570. package/src/components/autocomplete.tsx +64 -70
  571. package/src/components/bulk-action-bar.tsx +70 -2
  572. package/src/components/button-look.ts +5 -5
  573. package/src/components/button.tsx +2 -2
  574. package/src/components/chart-edge.ts +34 -1
  575. package/src/components/chart-figure.tsx +35 -0
  576. package/src/components/chart-zoom-core.tsx +6 -5
  577. package/src/components/chart.tsx +26 -5
  578. package/src/components/combobox-core.tsx +293 -62
  579. package/src/components/combobox.tsx +183 -153
  580. package/src/components/copy-button.tsx +34 -23
  581. package/src/components/country-select.tsx +16 -11
  582. package/src/components/data-table-column-settings.tsx +52 -10
  583. package/src/components/data-table-filters.ts +6 -4
  584. package/src/components/data-table-fit.ts +19 -5
  585. package/src/components/data-table-groups.tsx +1 -1
  586. package/src/components/data-table-head.tsx +32 -22
  587. package/src/components/data-table-mobile.tsx +61 -26
  588. package/src/components/data-table-pagination.tsx +21 -6
  589. package/src/components/data-table-resize.ts +1 -1
  590. package/src/components/data-table-row-actions.tsx +3 -3
  591. package/src/components/data-table-row.tsx +25 -14
  592. package/src/components/data-table-selection.ts +1 -1
  593. package/src/components/data-table-shared.tsx +33 -1
  594. package/src/components/data-table-sort.ts +57 -2
  595. package/src/components/data-table-virtual.ts +32 -8
  596. package/src/components/data-table.tsx +239 -68
  597. package/src/components/date-field.tsx +66 -9
  598. package/src/components/date-picker.tsx +125 -49
  599. package/src/components/date-range-picker.tsx +71 -36
  600. package/src/components/error-boundary.tsx +53 -39
  601. package/src/components/field-base-labels.ts +20 -0
  602. package/src/components/field-base.tsx +13 -7
  603. package/src/components/form-actions.tsx +20 -5
  604. package/src/components/hover-menu.tsx +18 -8
  605. package/src/components/icon-button.tsx +14 -9
  606. package/src/components/inline-confirm.tsx +116 -0
  607. package/src/components/inline-entity-combobox.tsx +197 -153
  608. package/src/components/input.tsx +1 -1
  609. package/src/components/jump-calendar.tsx +30 -146
  610. package/src/components/legal-page.tsx +10 -7
  611. package/src/components/legal.tsx +4 -2
  612. package/src/components/lightbox.tsx +21 -8
  613. package/src/components/list.tsx +10 -4
  614. package/src/components/measured-grid.tsx +8 -4
  615. package/src/components/mini-calendar.tsx +6 -5
  616. package/src/components/modal.tsx +6 -1
  617. package/src/components/month-grid.tsx +229 -0
  618. package/src/components/month-picker.tsx +192 -200
  619. package/src/components/multi-select.tsx +21 -9
  620. package/src/components/nav-pills.tsx +1 -1
  621. package/src/components/picker-sheet.tsx +12 -9
  622. package/src/components/pie-chart-labels.ts +8 -0
  623. package/src/components/pie-chart.tsx +22 -28
  624. package/src/components/popover.tsx +18 -1
  625. package/src/components/row-actions.tsx +2 -1
  626. package/src/components/series-chart-axes.ts +9 -4
  627. package/src/components/series-chart-labels.ts +7 -4
  628. package/src/components/series-chart.tsx +253 -87
  629. package/src/components/share-card.tsx +6 -6
  630. package/src/components/tabs-labels.ts +13 -0
  631. package/src/components/tabs.tsx +2 -2
  632. package/src/components/toggle-legend.tsx +16 -11
  633. package/src/components/translation-review-editor.tsx +6 -5
  634. package/src/components/translation-review.tsx +4 -3
  635. package/src/components/treemap-labels.ts +47 -0
  636. package/src/components/treemap-layout.ts +210 -0
  637. package/src/components/treemap.tsx +780 -138
  638. package/src/components/use-table-state.ts +12 -9
  639. package/src/data-table.ts +1 -4
  640. package/src/demo/demo-countdown.ts +3 -8
  641. package/src/eslint/role-utilities.ts +97 -19
  642. package/src/feedback/feedback-dialog.tsx +30 -19
  643. package/src/feedback/feedback-mutation.ts +20 -0
  644. package/src/feedback/feedback-page-link.ts +90 -0
  645. package/src/feedback/feedback-public-list.tsx +13 -7
  646. package/src/feedback/feedback-replies.tsx +13 -6
  647. package/src/feedback/feedback-row-detail-labels.ts +0 -3
  648. package/src/feedback/feedback-row-detail.tsx +70 -84
  649. package/src/feedback/feedback-status-undo.ts +28 -28
  650. package/src/feedback/feedback-submit-dialog.tsx +2 -2
  651. package/src/feedback/feedback-submit.tsx +21 -7
  652. package/src/feedback/feedback-swipe.tsx +1 -1
  653. package/src/feedback/feedback-table.tsx +86 -38
  654. package/src/feedback/feedback-thread-labels.ts +2 -2
  655. package/src/feedback/feedback-thread.tsx +18 -26
  656. package/src/feedback.ts +89 -6
  657. package/src/hooks/use-focus-trap.ts +8 -24
  658. package/src/hooks/use-hotkey.ts +24 -7
  659. package/src/hooks/use-long-press.ts +16 -2
  660. package/src/hooks/use-media-query.ts +20 -4
  661. package/src/hooks/use-mounted.ts +39 -0
  662. package/src/hooks/use-overlay-history.ts +32 -3
  663. package/src/i18n/defaults.ts +4 -9
  664. package/src/i18n/german.ts +8 -19
  665. package/src/i18n/kit-labels.tsx +9 -11
  666. package/src/i18n/locales/es.ts +8 -19
  667. package/src/i18n/locales/fr.ts +21 -30
  668. package/src/i18n/locales/hu.ts +10 -19
  669. package/src/i18n/locales/it.ts +8 -20
  670. package/src/i18n/locales/zh.ts +9 -19
  671. package/src/i18n/review.ts +12 -2
  672. package/src/i18n/shared-labels.ts +0 -1
  673. package/src/index.ts +57 -49
  674. package/src/landing/routing.tsx +14 -10
  675. package/src/lib/broadcast.ts +52 -0
  676. package/src/lib/date-format.ts +89 -13
  677. package/src/lib/day-format.ts +96 -0
  678. package/src/lib/describe-failure.ts +18 -0
  679. package/src/lib/direction.ts +39 -0
  680. package/src/lib/focus-left.ts +156 -0
  681. package/src/lib/format.ts +5 -17
  682. package/src/lib/http-status.ts +38 -0
  683. package/src/lib/intl-cache.ts +25 -0
  684. package/src/lib/iso-day.ts +13 -0
  685. package/src/lib/lazy-with-fallback.ts +82 -0
  686. package/src/lib/path-pattern.ts +55 -0
  687. package/src/lib/reduced-motion.ts +2 -1
  688. package/src/lib/round.ts +7 -2
  689. package/src/lib/safe-storage.ts +48 -6
  690. package/src/lib/session-refresh.ts +1 -1
  691. package/src/lib/share-format.ts +18 -0
  692. package/src/lib/text-case.ts +19 -0
  693. package/src/lib/text-match.ts +57 -2
  694. package/src/lib/thenable.ts +19 -0
  695. package/src/lib/translation-review.ts +13 -5
  696. package/src/notifications/device-zone-report.ts +1 -1
  697. package/src/notifications/notification-bell.tsx +7 -4
  698. package/src/notifications/notification-inbox.tsx +40 -58
  699. package/src/notifications/notification-parts.tsx +3 -4
  700. package/src/notifications/notification-types-setting.tsx +1 -1
  701. package/src/notifications/notifications-labels.ts +7 -0
  702. package/src/notifications/push-device-setting.tsx +1 -1
  703. package/src/notifications/push-devices-setting.tsx +30 -55
  704. package/src/notifications/quiet-hours-setting.tsx +93 -31
  705. package/src/notifications/unsubscribe-panel.tsx +4 -7
  706. package/src/notifications/use-push-device.ts +76 -10
  707. package/src/offline/query-persistence.ts +35 -3
  708. package/src/rhf/fields.tsx +11 -4
  709. package/src/search/command-palette.tsx +2 -4
  710. package/src/search/global-search.tsx +36 -15
  711. package/src/search/search-index.ts +0 -15
  712. package/src/search/use-command-key.ts +13 -12
  713. package/src/search.ts +10 -1
  714. package/src/settings/use-settings-focus.ts +3 -0
  715. package/src/shell/account-menu-language.tsx +6 -4
  716. package/src/shell/account-menu-text-size.tsx +10 -7
  717. package/src/shell/app-shell.tsx +0 -13
  718. package/src/shell/company-switcher.tsx +1 -1
  719. package/src/shell/dev-menu.tsx +8 -22
  720. package/src/shell/top-bar-actions.tsx +1 -1
  721. package/src/shell/top-bar-parts-labels.ts +1 -4
  722. package/src/shell.ts +21 -17
  723. package/src/sync/engine.ts +339 -61
  724. package/src/sync.ts +2 -8
  725. package/src/testing/css-variables.ts +8 -9
  726. package/src/theme/chart-palette.ts +0 -2
  727. package/src/theme/contrast.ts +8 -9
  728. package/src/theme/palette-store.ts +9 -9
  729. package/src/theme/text-size.ts +6 -8
  730. package/src/theme/theme-store.ts +7 -9
  731. package/src/tour/tour-catalogue.tsx +26 -15
  732. package/src/tour/tour-dock.ts +0 -2
  733. package/src/tour/tour-gates.ts +23 -0
  734. package/src/tour/tour-overlay.tsx +1170 -0
  735. package/src/tour/tour.tsx +108 -1202
  736. package/src/tour/use-tour-progress.ts +1 -1
  737. package/src/wizard/stepper-nav.tsx +3 -1
  738. package/src/wizard/types.ts +11 -2
  739. package/src/wizard/use-wizard.ts +2 -1
  740. package/src/wizard/validation.ts +8 -2
  741. package/tokens.css +6 -5
  742. package/dist/components/field-sync-labels.d.ts +0 -2
  743. package/dist/components/field-sync-labels.js +0 -12
  744. package/dist/components/field-sync-labels.js.map +0 -1
  745. package/dist/components/field-sync.d.ts +0 -164
  746. package/dist/components/field-sync.js +0 -269
  747. package/dist/components/field-sync.js.map +0 -1
  748. package/dist/components/section-nav.d.ts +0 -37
  749. package/dist/components/section-nav.js +0 -33
  750. package/dist/components/section-nav.js.map +0 -1
  751. package/dist/components/sign-chip-labels.d.ts +0 -2
  752. package/dist/components/sign-chip-labels.js +0 -11
  753. package/dist/components/sign-chip-labels.js.map +0 -1
  754. package/dist/components/sign-chip.d.ts +0 -68
  755. package/dist/components/sign-chip.js +0 -47
  756. package/dist/components/sign-chip.js.map +0 -1
  757. package/dist/components/ui-labels.js.map +0 -1
  758. package/dist/lib/isin.d.ts +0 -28
  759. package/dist/lib/isin.js +0 -36
  760. package/dist/lib/isin.js.map +0 -1
  761. package/dist/shell/dev-switchers.d.ts +0 -6
  762. package/dist/shell/dev-switchers.js +0 -12
  763. package/dist/shell/dev-switchers.js.map +0 -1
  764. package/dist/shell/role-switcher.d.ts +0 -21
  765. package/dist/shell/role-switcher.js +0 -31
  766. package/dist/shell/role-switcher.js.map +0 -1
  767. package/src/components/field-sync-labels.ts +0 -13
  768. package/src/components/field-sync.tsx +0 -482
  769. package/src/components/section-nav.tsx +0 -65
  770. package/src/components/sign-chip-labels.ts +0 -12
  771. package/src/components/sign-chip.tsx +0 -124
  772. package/src/components/ui-labels.ts +0 -24
  773. package/src/lib/isin.ts +0 -62
  774. package/src/shell/dev-switchers.tsx +0 -18
  775. package/src/shell/role-switcher.tsx +0 -46
@@ -57,6 +57,8 @@ import {
57
57
  type BarShapeProps,
58
58
  } from "recharts";
59
59
  import { ChartContainer, ChartTooltip, ChartTooltipContent, type ChartConfig } from "./chart";
60
+ import { useFigureDescription } from "./chart-figure";
61
+ import { rovingTarget } from "../lib/direction";
60
62
  import {
61
63
  DEFAULT_Y_AXIS,
62
64
  axisExtent,
@@ -123,11 +125,18 @@ import {
123
125
  import { useBreakpoint } from "../hooks/use-breakpoint";
124
126
  import { useTextSize } from "../theme/text-size";
125
127
  import { chartHeightProps, type ChartHeight } from "./chart-height";
126
- import { useChartEdge } from "./chart-edge";
128
+ import { useChartEdge, useEdgesInForce } from "./chart-edge";
127
129
  import { cn } from "../lib/cn";
128
130
  import { formatWithMinus } from "../lib/minus";
129
131
 
130
- export interface SeriesChartSeries {
132
+ /**
133
+ * One line, area or bar run of a {@link SeriesChart}.
134
+ *
135
+ * `TRow` is the chart's row type (0.53, keksdose after 0.52), and only `dot` reads it: its
136
+ * `point.row` is that type. Without a type argument a series is what it was, and a chart
137
+ * of typed rows still takes it — see {@link SeriesChartProps}.
138
+ */
139
+ export interface SeriesChartSeries<TRow extends object = object> {
131
140
  /** The row key this line reads — and the `--color-<key>` it is painted with, so it
132
141
  * must be a CSS identifier. Build keys out of data with {@link seriesKey}. */
133
142
  key: string;
@@ -175,8 +184,9 @@ export interface SeriesChartSeries {
175
184
  * point: `true` for the default dot, `false`/`null` for none, or any SVG node drawn
176
185
  * as-is at `point.cx`/`point.cy` — a buy/sell marker on keksdose's paper price.
177
186
  * Never called for a point with no value. Bars have no points, and ignore it.
187
+ * `point.row` is the caller's own row, typed as the chart's rows are (0.53).
178
188
  */
179
- dot?: boolean | ((point: SeriesChartPoint) => ReactNode);
189
+ dot?: boolean | ((point: SeriesChartPoint<TRow>) => ReactNode);
180
190
  /** Line (or area outline) weight in px. Default 2, or 1.5 for a `step`. keksdose
181
191
  * draws the subject of a chart at 2.5 and the reference it is read against at 1.5. */
182
192
  strokeWidth?: number;
@@ -211,14 +221,16 @@ export interface SeriesChartSeries {
211
221
  /** What a series draws. See {@link SeriesChartSeries.type}. */
212
222
  export type SeriesChartType = "line" | "bar" | "area";
213
223
 
214
- /** One point of a series, as a `dot` function is handed it. */
215
- export interface SeriesChartPoint {
224
+ /** One point of a series, as a `dot` function is handed it. `TRow` is the chart's row
225
+ * type (0.53); without one, `row` is a {@link SeriesChartRow}, as before. */
226
+ export interface SeriesChartPoint<TRow extends object = object> {
216
227
  /** The series' key. */
217
228
  key: string;
218
229
  /** The row's position in `rows`. */
219
230
  index: number;
220
- /** The caller's own row, with everything the chart did not plot still in it. */
221
- row: SeriesChartRow;
231
+ /** The caller's own row, with everything the chart did not plot still in it: the very
232
+ * object in `rows`, typed as `rows` is. */
233
+ row: SeriesChartRowOf<TRow>;
222
234
  /** The abscissa in the caller's terms: the number, the category, or (time) a Date. */
223
235
  x: SeriesChartXValue;
224
236
  value: number;
@@ -231,9 +243,32 @@ export interface SeriesChartPoint {
231
243
 
232
244
  /** A row of a series chart: one abscissa value and the series' values at it. Anything
233
245
  * else in it (a raw ISO period for a drilldown) rides along untouched and is handed
234
- * back in {@link SeriesChartPoint.row} and {@link SeriesChartHit.row}. */
246
+ * back in {@link SeriesChartPoint.row} and {@link SeriesChartHit.row} — typed as the
247
+ * caller's rows are since 0.53, and as this where their type names no keys. */
235
248
  export type SeriesChartRow = Readonly<Record<string, unknown>>;
236
249
 
250
+ /**
251
+ * The row a hit or a point hands back, for a chart whose rows are `TRow[]` (0.53, keksdose
252
+ * after 0.52): `TRow` itself, so a drilldown reads `hit.row.rawPeriod` as the string it
253
+ * is. A {@link SeriesChartRow} where `TRow` names no keys — `object`, the default, which
254
+ * keeps `SeriesChartHit` and `SeriesChartPoint` without a type argument what they were, and
255
+ * the `object[]` rows an app passes today; `{}`; and `any` or `never` (`rows={[]}`), which
256
+ * are both assignable to `null` while no object type is.
257
+ *
258
+ * Both tests take `TRow` in the CHECKED position, never in the `extends` one, so TypeScript
259
+ * measures every type below as covariant in it (`SeriesChartSeries`, through `dot`'s
260
+ * parameter, contravariant) and relates two of them by their type arguments alone: a
261
+ * `SeriesChartHit<Month>` is a `SeriesChartHit`, and a handler or a series typed without an
262
+ * argument fits a chart of `Month` rows, though an interface has no index signature and is
263
+ * not, field by field, a `SeriesChartRow`. Written `object extends TRow ?`, the type is
264
+ * invariant and both of those stop type-checking.
265
+ */
266
+ type SeriesChartRowOf<TRow> = [TRow] extends [null]
267
+ ? SeriesChartRow
268
+ : [keyof TRow] extends [never]
269
+ ? SeriesChartRow
270
+ : TRow;
271
+
237
272
  /** An abscissa value: a number (`x.type: "number"`), a category (a string, a number or
238
273
  * a Date standing for a period), or a time (a Date, epoch ms or an ISO string). */
239
274
  export type SeriesChartXValue = number | string | Date;
@@ -549,24 +584,44 @@ export interface SeriesChartMarker {
549
584
  r?: number;
550
585
  }
551
586
 
552
- /** What a click on the plot picked. */
553
- export interface SeriesChartHit {
587
+ /** What a click on the plot picked. `TRow` is the chart's row type (0.53); without one,
588
+ * `row` is a {@link SeriesChartRow}, as before. */
589
+ export interface SeriesChartHit<TRow extends object = object> {
554
590
  /** The row's position in `rows`. */
555
591
  index: number;
556
- /** The caller's own row — with its `rawPeriod`, id or whatever the drilldown needs. */
557
- row: SeriesChartRow;
592
+ /** The caller's own row — with its `rawPeriod`, id or whatever the drilldown needs: the
593
+ * very object in `rows`, typed as `rows` is, so it is read without a cast. */
594
+ row: SeriesChartRowOf<TRow>;
558
595
  x: SeriesChartXValue;
559
596
  /** The series, when the click landed ON a bar. A click anywhere else picks the slot
560
597
  * (the period), not a series. */
561
598
  key?: string;
562
599
  }
563
600
 
564
- export interface SeriesChartProps {
565
- /** One row per abscissa value. A missing key is a hole (see `connectNulls`). */
566
- rows: readonly SeriesChartRow[];
567
- series: SeriesChartSeries[];
601
+ /**
602
+ * The props of {@link SeriesChart} and {@link StaticSeriesChart}, for rows of type `TRow`.
603
+ *
604
+ * `TRow` is inferred from `rows` (0.53, keksdose after 0.52), and what the chart hands back
605
+ * — `hit.row` in `onPointClick`, `point.row` in a series' `dot` — is that type, so a
606
+ * drilldown reads its own fields without narrowing an `unknown`. Without a type argument,
607
+ * `SeriesChartProps` is what it was: any object is a row, and a row comes back as a
608
+ * {@link SeriesChartRow}. So is `ComponentProps<typeof SeriesChart>`, which reads the
609
+ * constraint, `object`. A series, a handler or a `dot` typed without an argument fits a
610
+ * chart of typed rows too.
611
+ */
612
+ export interface SeriesChartProps<TRow extends object = object> {
613
+ /**
614
+ * One row per abscissa value. A missing key is a hole (see `connectNulls`).
615
+ *
616
+ * Any object (0.52, refactor audit 2026-10-30, API-2): an `interface` has no index
617
+ * signature, so a typed sweep did not fit `SeriesChartRow` and Kurvenschmiede cast its
618
+ * Ackermann rows `as unknown as Record<string, number>[]`. The chart reads the keys
619
+ * `series` and `x` name, and hands the row back typed as these are (0.53).
620
+ */
621
+ rows: readonly TRow[];
622
+ series: readonly SeriesChartSeries<TRow>[];
568
623
  /** Default: one untitled axis, `"y"`. */
569
- axes?: SeriesChartAxis[];
624
+ axes?: readonly SeriesChartAxis[];
570
625
  x?: SeriesChartX;
571
626
  /** A value in the tooltip, where a number stands on its own and needs its unit.
572
627
  * Default: `Intl.NumberFormat` in the kit's locale. */
@@ -598,11 +653,11 @@ export interface SeriesChartProps {
598
653
  * as the curve twitching. Turn it on where series come and go by choice.
599
654
  */
600
655
  animationMs?: number;
601
- spans?: SeriesChartSpan[];
656
+ spans?: readonly SeriesChartSpan[];
602
657
  /** Lines across the plot at one value. */
603
- references?: SeriesChartReference[];
658
+ references?: readonly SeriesChartReference[];
604
659
  /** Single labelled points. */
605
- markers?: SeriesChartMarker[];
660
+ markers?: readonly SeriesChartMarker[];
606
661
  /**
607
662
  * Which axes a drag may zoom: `"both"`, `"x"`, `"y"` or `"none"`. Default: read off
608
663
  * the marks — see `defaultZoomAxes` (lines both, areas x, bars none). An axis carrying
@@ -614,8 +669,12 @@ export interface SeriesChartProps {
614
669
  * A click on the plot: the slot under the pointer, and the series when it landed on a
615
670
  * bar. keksdose's drilldowns — a payee's month, a budget line, a spending category.
616
671
  * A drag that zoomed is not a click.
672
+ *
673
+ * The keyboard's stops are there either way (0.52, DSP-5): one per bar, or per slot of
674
+ * a chart without bars, named "period — series: value", behind ONE tab stop. With this
675
+ * they are buttons that Enter and Space activate; without, images to read.
617
676
  */
618
- onPointClick?: (hit: SeriesChartHit) => void;
677
+ onPointClick?: (hit: SeriesChartHit<TRow>) => void;
619
678
  /** Where the tooltip may go: for a chart inside a scroll wrapper. See
620
679
  * {@link SeriesChartTooltip}. */
621
680
  tooltip?: SeriesChartTooltip;
@@ -662,6 +721,19 @@ export interface SeriesChartProps {
662
721
  labels?: LabelOverride<SeriesChartLabels>;
663
722
  /** BCP 47 tag for the default number formats. Default: the provider's. */
664
723
  locale?: string;
724
+ /**
725
+ * The chart's name. The chart is a `role="figure"` (0.52, refactor audit 2026-10-30,
726
+ * DSP-5), and a figure is found and told apart by its name — "Net worth", "Load over
727
+ * travel". Its values are read stop by stop (see {@link SeriesChartProps.onPointClick}).
728
+ */
729
+ "aria-label"?: string;
730
+ /**
731
+ * What the picture SHOWS, in a sentence — "Spending rose 12 % in May, led by rent." —
732
+ * the figure's accessible description: a line, an area and a ruler are nothing a screen
733
+ * reader can say. Followed, on a zoomable chart, by the drag gesture (`zoomHint`). Not
734
+ * drawn; a caption the eye should read too belongs in the page.
735
+ */
736
+ description?: string;
665
737
  /** Onto the chart's root (`ChartContainer`) — e.g. an app's own grid ink. */
666
738
  className?: string;
667
739
  /** The shortest bar drawn, in px, for every bar series that does not set its own
@@ -734,8 +806,10 @@ export interface SeriesLegendAxes {
734
806
  * series whose axis is not drawn says the unit that axis would have: "Velocity (mm/s)"
735
807
  * — see {@link SeriesChartAxis.unit}. Without them, the labels are as given.
736
808
  */
737
- export function seriesLegendEntries(
738
- series: readonly SeriesChartSeries[],
809
+ export function seriesLegendEntries<TRow extends object>(
810
+ // Generic only so a typed list fits (0.53): `SeriesChartSeries<Month>` is not a
811
+ // `SeriesChartSeries`, whose `dot` would be handed rows that are not `Month`s.
812
+ series: readonly SeriesChartSeries<TRow>[],
739
813
  { axes, budgeted }: SeriesLegendAxes = {},
740
814
  ): LegendEntry[] {
741
815
  const undrawn = new Map<string, string | undefined>();
@@ -778,9 +852,9 @@ const STEP_WIDTH = 1.5;
778
852
  const BAR_RADIUS: [number, number, number, number] = [3, 3, 0, 0];
779
853
 
780
854
  /**
781
- * One keyboard stop of a clickable chart: a bar, or (a chart with no bars) a whole slot.
782
- * `from`/`to` bound its slot on the plotted number line — half way to each neighbour,
783
- * or to the edge of the window on show.
855
+ * One keyboard stop: a bar, or (a chart with no bars) a whole slot. `from`/`to` bound its
856
+ * slot on the plotted number line — half way to each neighbour, or to the edge of the
857
+ * window on show.
784
858
  */
785
859
  interface PointStop {
786
860
  index: number;
@@ -788,10 +862,21 @@ interface PointStop {
788
862
  key?: string;
789
863
  from: number;
790
864
  to: number;
791
- /** The accessible name: where it is and what it says. */
792
- name: string;
865
+ /** The accessible name: where it is and what it says. Asked only of a stop that is
866
+ * drawn — see {@link ALL_STOPS_UP_TO}. */
867
+ name: () => string;
793
868
  }
794
869
 
870
+ /**
871
+ * Up to this many stops, every one is drawn; past it, only the roving one, its two
872
+ * neighbours and the two ends (0.52, DSP-5) — every stop is still reached, by the arrows,
873
+ * Home and End. Since every chart has stops, a measurement chart has one per row:
874
+ * Kurvenschmiede draws 2000-row profiles (`maxRows`), and 2000 named `<rect>`s, each
875
+ * named through `Intl` on every render, are a DOM and an accessibility tree nobody walks
876
+ * one by one. A year of months, or of weeks, stays whole for browse mode.
877
+ */
878
+ const ALL_STOPS_UP_TO = 100;
879
+
795
880
  /**
796
881
  * The shape of a series whose bar has keyboard focus: recharts' own rectangle, with an
797
882
  * outline on the one bar at `index` — drawn at the bar's exact geometry, which an
@@ -853,23 +938,25 @@ function MarkerLabel({ viewBox, value }: { viewBox?: { x?: number; y?: number; w
853
938
  }
854
939
 
855
940
  /**
856
- * The keyboard's way onto a clickable chart (`onPointClick`): one focusable `<rect>` per
857
- * bar, or per slot when there are no bars, laid over the plot INSIDE the recharts chart,
858
- * where the x scale answers.
941
+ * The keyboard's way onto a chart: one focusable `<rect>` per bar, or per slot when there
942
+ * are no bars, laid over the plot INSIDE the recharts chart, where the x scale answers.
859
943
  *
860
944
  * keksdose drew its weekday pattern as seven real `<button>`s (spending-tab.tsx) because
861
945
  * a recharts bar is reachable by nothing but the pointer. This is that, for every chart:
862
946
  *
863
947
  * - ONE tab stop (roving `tabIndex`): Tab moves past the chart, not through 30 bars.
864
948
  * - ←/→ step through the stops in order, ↑/↓ between the bars of one slot, Home/End.
865
- * - ↵ and Space report the stop as a click would — with the series for a bar.
866
- * - Each is a `role="button"` named "period — series: value".
949
+ * - Each is named "period — series: value".
950
+ * - With `onPointClick` (`onPick`) each is a `role="button"`, and ↵ and Space report the
951
+ * stop as a click would — with the series for a bar. Without (0.52, refactor audit
952
+ * 2026-10-30, DSP-5) each is a `role="img"` to read, as PieChart's slices are: before,
953
+ * such a chart was recharts' unnamed `role="application"` stop, whose arrows moved a
954
+ * tooltip nothing announced.
867
955
  *
868
956
  * The stops take NO pointer events, so the drag-to-zoom layer, the tooltip and the
869
957
  * pointer's own clicks underneath behave exactly as they did. Focus is shown by the
870
958
  * slot tinted and, for a bar, its own outline (`focusedBarShape`) — and by the tooltip,
871
- * moved to the stop through `defaultIndex`, which recharts honours until a pointer has
872
- * hovered the chart.
959
+ * which recharts' own pointer is stood on the stop for (`pointAt`).
873
960
  */
874
961
  function PointKeys({
875
962
  stops,
@@ -884,40 +971,30 @@ function PointKeys({
884
971
  label: string;
885
972
  onFocusStop: (at: number) => void;
886
973
  onBlurStops: () => void;
887
- onPick: (stop: PointStop) => void;
974
+ onPick?: (stop: PointStop) => void;
888
975
  }) {
889
976
  const plot = usePlotArea();
890
977
  const scale = useXAxisScale();
891
978
  const refs = useRef<(SVGRectElement | null)[]>([]);
892
979
  if (!plot || !scale || plot.width <= 0 || plot.height <= 0) return null;
893
980
 
894
- const move = (at: number) => {
895
- const next = Math.max(0, Math.min(stops.length - 1, at));
896
- refs.current[next]?.focus();
897
- };
898
981
  const onKeyDown = (at: number) => (event: KeyboardEvent<SVGRectElement>) => {
899
982
  const stop = stops[at];
900
983
  // ↑/↓ stay in the slot: the next or previous bar of the same period. The stops are
901
- // in slot order, so a slot's bars are neighbours.
984
+ // in slot order, so a slot's bars are neighbours. ←/→, Home and End as Treemap's tiles
985
+ // take them (0.52 code review, deep, charts, finding 14): → is the next stop in any
986
+ // page, since the plot runs left to right in an RTL one too (see `ChartContainer`).
902
987
  const inSlot = (step: 1 | -1) => (stops[at + step]?.index === stop.index ? at + step : at);
903
988
  const target =
904
- event.key === "ArrowRight"
905
- ? at + 1
906
- : event.key === "ArrowLeft"
907
- ? at - 1
908
- : event.key === "ArrowDown"
909
- ? inSlot(1)
910
- : event.key === "ArrowUp"
911
- ? inSlot(-1)
912
- : event.key === "Home"
913
- ? 0
914
- : event.key === "End"
915
- ? stops.length - 1
916
- : undefined;
989
+ event.key === "ArrowDown"
990
+ ? inSlot(1)
991
+ : event.key === "ArrowUp"
992
+ ? inSlot(-1)
993
+ : rovingTarget(event.key, "ltr", at, stops.length, false);
917
994
  if (target !== undefined) {
918
995
  event.preventDefault();
919
- move(target);
920
- } else if (event.key === "Enter" || event.key === " ") {
996
+ refs.current[target]?.focus();
997
+ } else if (onPick && (event.key === "Enter" || event.key === " ")) {
921
998
  event.preventDefault();
922
999
  onPick(stop);
923
1000
  }
@@ -925,9 +1002,14 @@ function PointKeys({
925
1002
 
926
1003
  const left = plot.x;
927
1004
  const right = plot.x + plot.width;
1005
+ const middle = plot.y + plot.height / 2;
1006
+ // Every target an arrow, Home or End can name from the roving stop — see ALL_STOPS_UP_TO.
1007
+ const drawn =
1008
+ stops.length <= ALL_STOPS_UP_TO ? undefined : new Set([0, current - 1, current, current + 1, stops.length - 1]);
928
1009
  return (
929
1010
  <g role="group" aria-label={label}>
930
1011
  {stops.map((stop, at) => {
1012
+ if (drawn && !drawn.has(at)) return null;
931
1013
  // An edge with no neighbour runs to the plot's edge.
932
1014
  const a = finite(scale(stop.from)) ?? left;
933
1015
  const b = finite(scale(stop.to)) ?? right;
@@ -939,9 +1021,9 @@ function PointKeys({
939
1021
  ref={(node) => {
940
1022
  refs.current[at] = node;
941
1023
  }}
942
- role="button"
1024
+ role={onPick ? "button" : "img"}
943
1025
  tabIndex={at === current ? 0 : -1}
944
- aria-label={stop.name}
1026
+ aria-label={stop.name()}
945
1027
  data-point-key={stop.key}
946
1028
  x={x0}
947
1029
  y={plot.y}
@@ -956,8 +1038,19 @@ function PointKeys({
956
1038
  // A bar outlines ITSELF (see `FOCUSED_BAR`); a slot has nothing else to.
957
1039
  stop.key === undefined && "focus-visible:stroke-[var(--brand)]",
958
1040
  )}
959
- onFocus={() => onFocusStop(at)}
960
- onBlur={onBlurStops}
1041
+ onFocus={(event) => {
1042
+ onFocusStop(at);
1043
+ pointAt(event.currentTarget, (x0 + x1) / 2, middle);
1044
+ }}
1045
+ onBlur={(event) => {
1046
+ onBlurStops();
1047
+ // On to another stop: that one stands the pointer on itself. (`refs` holds a
1048
+ // null for every stop not drawn, so a blur to nowhere is no stop.)
1049
+ const next = event.relatedTarget as SVGRectElement | null;
1050
+ if (!next || !refs.current.includes(next)) {
1051
+ pointAt(event.currentTarget, left - 1, middle);
1052
+ }
1053
+ }}
961
1054
  onKeyDown={onKeyDown(at)}
962
1055
  />
963
1056
  );
@@ -966,6 +1059,32 @@ function PointKeys({
966
1059
  );
967
1060
  }
968
1061
 
1062
+ /**
1063
+ * Stands recharts' pointer at (`x`, `y`) in the chart's own px, as a mouse moved there
1064
+ * would — what the keyboard's stops show their tooltip by (0.52 code review, deep, charts,
1065
+ * finding 4). Their `defaultIndex` alone moved it only until a pointer had hovered the
1066
+ * chart: recharts reads it no more once a hover has an index, and a mouse that has left
1067
+ * keeps its index. After one hover the arrows moved the tint, and the tooltip, the one
1068
+ * place the value is drawn, stayed where the mouse had left it. recharts' own keyboard
1069
+ * layer, which these stops replaced (DSP-5), drove the tooltip through its own state.
1070
+ *
1071
+ * A point off the plot (`x` left of it) takes the pointer off the chart: recharts hides
1072
+ * its tooltip there, through the same frame-throttled path a pending move takes, so a
1073
+ * blur right after a focus is never overtaken by it. recharts reads the pointer against
1074
+ * its wrapper's box, scaled as the box is drawn (`getRelativeCoordinate`); the point is
1075
+ * put back into that box.
1076
+ */
1077
+ function pointAt(within: Element, x: number, y: number) {
1078
+ const wrapper = within.closest<HTMLElement>(".recharts-wrapper");
1079
+ if (!wrapper) return;
1080
+ const box = wrapper.getBoundingClientRect();
1081
+ const scaleX = wrapper.offsetWidth > 0 ? box.width / wrapper.offsetWidth : 1;
1082
+ const scaleY = wrapper.offsetHeight > 0 ? box.height / wrapper.offsetHeight : 1;
1083
+ wrapper.dispatchEvent(
1084
+ new MouseEvent("mousemove", { bubbles: true, clientX: box.left + x * scaleX, clientY: box.top + y * scaleY }),
1085
+ );
1086
+ }
1087
+
969
1088
  interface PlotProps extends Omit<SeriesChartProps, "rows" | "x"> {
970
1089
  /** The rows AS PLOTTED — what the zoom fits on. The caller's are `model.source`. */
971
1090
  rows: readonly SeriesChartRow[];
@@ -1000,6 +1119,8 @@ function SeriesPlot({
1000
1119
  axisBudget = "auto",
1001
1120
  onAxisBudget,
1002
1121
  maxRows,
1122
+ "aria-label": ariaLabel,
1123
+ description,
1003
1124
  }: PlotProps) {
1004
1125
  const labels = useKitLabels("seriesChart", DEFAULT_SERIES_CHART_LABELS, labelsProp);
1005
1126
  const locale = useKitLocale(localeProp);
@@ -1010,6 +1131,10 @@ function SeriesPlot({
1010
1131
  // Strokes, dashes and the grid stay px.
1011
1132
  const { scale } = useTextSize();
1012
1133
  const edgeFor = useChartEdge();
1134
+ // The tiles' rule (0.52, DSP-18, Marcel's decision 3): the ink edge under More contrast
1135
+ // only — at Standard it fell on 5 of 8 hues in light and on 2 in dark, the unevenness
1136
+ // #642 took off the tiles.
1137
+ const edges = useEdgesInForce("auto");
1013
1138
  const ticksAim = tickTarget(scale);
1014
1139
  const grow = (px: number) => (scale === 1 ? px : Math.round(px * scale));
1015
1140
  // The keyboard stops' roving tab stop, and the one that has focus (see `PointKeys`).
@@ -1085,13 +1210,31 @@ function SeriesPlot({
1085
1210
  // one value sizes both the chart and its empty state.
1086
1211
  const { className: heightClass, style: heightStyle } = chartHeightProps(height);
1087
1212
 
1213
+ // A named figure, described by the caller's sentence and — where a drag zooms — the
1214
+ // gesture (0.52, refactor audit 2026-10-30, DSP-5). The hint used to be the name of the
1215
+ // zoom layer's rect, a `role="application"` that could not take focus. The description
1216
+ // is `hidden`: read through `aria-describedby`, never twice in browse mode.
1217
+ const drawable = model.source.length > 0 && series.length > 0;
1218
+ const spoken = [description, drawable && zoom?.layer ? labels.zoomHint : undefined].filter(Boolean).join(" ");
1219
+ // Inside the root, not after it as a sibling: a StaticSeriesChart then stopped being its
1220
+ // parent's last child, and a stack's `space-y-*` / `divide-y` gave it a margin or a rule
1221
+ // it never had (0.52 code review, deep, charts, findings 7 and 14 — Treemap's copy of this
1222
+ // went the same way). The plot's root is `ChartContainer`, which takes the sentence itself.
1223
+ const about = useFigureDescription(spoken || undefined);
1224
+ const figure = { role: "figure", "aria-label": ariaLabel, "aria-describedby": about.describedBy } as const;
1225
+
1088
1226
  // The empty state takes the chart's own height and is centred in it: a chart that
1089
1227
  // shrank to its "nothing to draw" sentence moved everything under it up the page
1090
1228
  // the moment a legend entry was switched off.
1091
- if (!model.source.length || !series.length) {
1229
+ if (!drawable) {
1092
1230
  return (
1093
- <div className={cn("flex w-full items-center justify-center px-2 text-center", heightClass)} style={heightStyle}>
1231
+ <div
1232
+ {...figure}
1233
+ className={cn("flex w-full items-center justify-center px-2 text-center", heightClass)}
1234
+ style={heightStyle}
1235
+ >
1094
1236
  {empty !== undefined ? empty : <p className="text-xs text-muted">{labels.empty}</p>}
1237
+ {about.node}
1095
1238
  </div>
1096
1239
  );
1097
1240
  }
@@ -1268,14 +1411,15 @@ function SeriesPlot({
1268
1411
  return row ? { index: origin(index), row, x: xOf(index), key } : undefined;
1269
1412
  };
1270
1413
 
1271
- // The keyboard stops of a clickable chart — every bar with a value, slot by slot; or,
1272
- // with no bars, every slot with any value. Only what is inside the window on show.
1414
+ // The keyboard stops — every bar with a value, slot by slot; or, with no bars, every
1415
+ // slot with any value. Only what is inside the window on show. Named on demand: past
1416
+ // ALL_STOPS_UP_TO only five are drawn, and naming is a date and a number format each.
1273
1417
  const stops: PointStop[] = [];
1274
- if (onPointClick) {
1418
+ {
1275
1419
  const valueText = valueFormat ?? number;
1276
1420
  const nameOf = (entry: SeriesChartSeries) =>
1277
1421
  typeof entry.label === "string" || typeof entry.label === "number" ? String(entry.label) : entry.key;
1278
- const said = (entry: SeriesChartSeries, value: number) => {
1422
+ const cellText = (entry: SeriesChartSeries, value: number) => {
1279
1423
  const name = nameOf(entry);
1280
1424
  return name ? `${name}: ${valueText(value)}` : valueText(value);
1281
1425
  };
@@ -1291,21 +1435,23 @@ function SeriesPlot({
1291
1435
  const from = k > 0 ? (placed[k - 1].at + at) / 2 : low;
1292
1436
  const to = k < placed.length - 1 ? (placed[k + 1].at + at) / 2 : high;
1293
1437
  // The heading the tooltip would give it, when that is text; else the tick.
1294
- const heading = xLabel(at);
1295
- const where = typeof heading === "string" && heading ? heading : xFormat(at);
1438
+ const where = () => {
1439
+ const heading = xLabel(at);
1440
+ return typeof heading === "string" && heading ? heading : xFormat(at);
1441
+ };
1296
1442
  const valued = (bars.length ? bars : series)
1297
1443
  .map((entry) => ({ entry, value: finite(rows[index]?.[entry.key]) }))
1298
1444
  .filter((cell): cell is { entry: SeriesChartSeries; value: number } => cell.value !== undefined);
1299
1445
  if (bars.length) {
1300
1446
  for (const { entry, value } of valued) {
1301
- stops.push({ index, key: entry.key, from, to, name: `${where} — ${said(entry, value)}` });
1447
+ stops.push({ index, key: entry.key, from, to, name: () => `${where()} — ${cellText(entry, value)}` });
1302
1448
  }
1303
1449
  } else if (valued.length) {
1304
1450
  stops.push({
1305
1451
  index,
1306
1452
  from,
1307
1453
  to,
1308
- name: `${where} — ${valued.map(({ entry, value }) => said(entry, value)).join(", ")}`,
1454
+ name: () => `${where()} — ${valued.map(({ entry, value }) => cellText(entry, value)).join(", ")}`,
1309
1455
  });
1310
1456
  }
1311
1457
  });
@@ -1359,6 +1505,7 @@ function SeriesPlot({
1359
1505
  const inRow = placement !== "cursor";
1360
1506
  const chart = (
1361
1507
  <ChartContainer
1508
+ {...(inRow ? {} : { role: "figure", "aria-label": ariaLabel, description: spoken || undefined })}
1362
1509
  ref={setBox}
1363
1510
  data-axis-budget={budgeted.length ? budgetKey.replace(/\n/g, " ") : undefined}
1364
1511
  // "drawn/all" while `maxRows` thins: what a reader of the DOM (a test, a bug
@@ -1381,9 +1528,10 @@ function SeriesPlot({
1381
1528
  // Positive and negative layers stacked apart, as `axisExtent` fits them — a
1382
1529
  // month's expenses hang below the axis instead of eating into its income.
1383
1530
  stackOffset="sign"
1384
- // recharts' own keyboard layer makes the whole surface a tab stop whose arrows
1385
- // move the tooltip — a second stop beside `PointKeys`, and one ↵ does nothing on.
1386
- accessibilityLayer={!onPointClick}
1531
+ // recharts' own keyboard layer makes the whole surface an unnamed
1532
+ // `role="application"` tab stop whose arrows move a tooltip nothing announces —
1533
+ // a second stop beside `PointKeys`, which every chart has since 0.52 (DSP-5).
1534
+ accessibilityLayer={false}
1387
1535
  onClick={
1388
1536
  onPointClick
1389
1537
  ? (state) => {
@@ -1515,9 +1663,10 @@ function SeriesPlot({
1515
1663
  const type = entry.type ?? "line";
1516
1664
  const yAxisId = entry.axis ?? DEFAULT_Y_AXIS;
1517
1665
  const color = `var(--color-${entry.key})`;
1518
- // A filled mark in a hue under 3:1 against the ground gets a 1px ink edge
1519
- // (WCAG 1.4.11, anyplot's rule) — measured on the colour the config paints.
1520
- const edge = edgeFor(config[entry.key]?.color);
1666
+ // Under More contrast, a filled mark in a hue under 3:1 against the ground gets
1667
+ // a 1px ink edge (WCAG 1.4.11, anyplot's rule) — measured on the colour the
1668
+ // config paints. At Standard none does (see `edges`).
1669
+ const edge = edges === "contrast" ? edgeFor(config[entry.key]?.color) : undefined;
1521
1670
  const own = entry.dash ?? (entry.dashed ? 1 : 0);
1522
1671
  const dash = entry.step ? strokeDash(STEP_DASH) : typeof own === "string" ? own : strokeDash(own);
1523
1672
  const curve = entry.step ? "stepAfter" : (entry.curve ?? "monotone");
@@ -1568,9 +1717,11 @@ function SeriesPlot({
1568
1717
  type={curve}
1569
1718
  dataKey={entry.key}
1570
1719
  stackId={entry.stack}
1571
- // The edge replaces the hue on the area's outline only; the fill keeps it.
1720
+ // The edge replaces the hue on the area's outline only; the fill keeps it,
1721
+ // and the outline its width (0.52, DSP-18: it was 1px, whatever
1722
+ // `strokeWidth` said).
1572
1723
  stroke={edge ?? color}
1573
- strokeWidth={edge ? 1 : width}
1724
+ strokeWidth={width}
1574
1725
  strokeDasharray={dash}
1575
1726
  fill={color}
1576
1727
  fillOpacity={entry.fillOpacity ?? (entry.stack !== undefined ? 0.55 : 0.2)}
@@ -1670,10 +1821,14 @@ function SeriesPlot({
1670
1821
  setKeyFocus(at);
1671
1822
  }}
1672
1823
  onBlurStops={() => setKeyFocus(undefined)}
1673
- onPick={(stop) => {
1674
- const hit = hitAt(stop.index, stop.key);
1675
- if (hit) onPointClick?.(hit);
1676
- }}
1824
+ onPick={
1825
+ onPointClick
1826
+ ? (stop) => {
1827
+ const hit = hitAt(stop.index, stop.key);
1828
+ if (hit) onPointClick(hit);
1829
+ }
1830
+ : undefined
1831
+ }
1677
1832
  />
1678
1833
  )}
1679
1834
  {zoom?.layer}
@@ -1695,10 +1850,11 @@ function SeriesPlot({
1695
1850
  />
1696
1851
  );
1697
1852
  return (
1698
- <div className={cn("flex w-full flex-col", heightClass)} style={heightStyle}>
1853
+ <div {...figure} className={cn("flex w-full flex-col", heightClass)} style={heightStyle}>
1699
1854
  {placement === "above" && row}
1700
1855
  {chart}
1701
1856
  {placement === "below" && row}
1857
+ {about.node}
1702
1858
  </div>
1703
1859
  );
1704
1860
  }
@@ -1711,11 +1867,17 @@ const ZoomablePlot = withChartZoom(SeriesPlot);
1711
1867
  * category or time chart otherwise re-maps every row on every render, and `maxRows`'
1712
1868
  * envelope would be worked out again with it.
1713
1869
  */
1714
- function usePlotProps(props: SeriesChartProps): PlotProps {
1870
+ function usePlotProps<TRow extends object>(typed: SeriesChartProps<TRow>): PlotProps {
1871
+ // `TRow` types only what the caller is handed back, and that is its own row objects,
1872
+ // untouched (0.53): the plot reads them as the `object` rows they are. Through `unknown`
1873
+ // because the two are not comparable for an unresolved `TRow`: `SeriesChartSeries` is
1874
+ // contravariant in it (its `dot` is handed rows) and `rows` covariant.
1875
+ const props = typed as unknown as SeriesChartProps;
1715
1876
  const x = props.x ?? {};
1716
1877
  const { rows } = props;
1717
1878
  const { type, key } = x;
1718
- const model = useMemo(() => xModel(rows, { type, key }), [rows, type, key]);
1879
+ // Read by key, so any object is a row (API-2); `SeriesChartRow` is how the plot reads it.
1880
+ const model = useMemo(() => xModel(rows as readonly SeriesChartRow[], { type, key }), [rows, type, key]);
1719
1881
  return { ...props, rows: model.rows, x: { key: model.plotKey }, model, xAxis: x };
1720
1882
  }
1721
1883
 
@@ -1724,7 +1886,7 @@ function usePlotProps(props: SeriesChartProps): PlotProps {
1724
1886
  * button. For a thumbnail, a print view, or a chart the consumer wraps in its own
1725
1887
  * interaction.
1726
1888
  */
1727
- export function StaticSeriesChart(props: SeriesChartProps) {
1889
+ export function StaticSeriesChart<TRow extends object = object>(props: SeriesChartProps<TRow>) {
1728
1890
  return <SeriesPlot {...usePlotProps(props)} />;
1729
1891
  }
1730
1892
 
@@ -1733,8 +1895,12 @@ export function StaticSeriesChart(props: SeriesChartProps) {
1733
1895
  * axes), double-click or press the reset button to go back; wrap several in
1734
1896
  * `SharedXZoom` to move their x windows together. Which axes zoom depends on the marks
1735
1897
  * — see {@link SeriesChartProps.zoomAxes}.
1898
+ *
1899
+ * Generic in its rows (0.53): `hit.row` and a `dot`'s `point.row` are typed as `rows` is —
1900
+ * see {@link SeriesChartProps}. A plain function, so the generic survives: a `memo` or a
1901
+ * `forwardRef` around it would read `TRow` as its constraint.
1736
1902
  */
1737
- export function SeriesChart(props: SeriesChartProps) {
1903
+ export function SeriesChart<TRow extends object = object>(props: SeriesChartProps<TRow>) {
1738
1904
  // The zoom fits the PLOTTED rows — slot indices and epoch ms, not the caller's labels.
1739
1905
  return <ZoomablePlot {...usePlotProps(props)} />;
1740
1906
  }
@@ -4,7 +4,7 @@ import { Trash2, UserPlus, UsersRound } from "lucide-react";
4
4
 
5
5
  import { useKitLabels, useKitLocale, type LabelOverride } from "../i18n/kit-labels";
6
6
  import { cn } from "../lib/cn";
7
- import { foldForSearch } from "../lib/text-match";
7
+ import { matchesSearch, searchWords } from "../lib/text-match";
8
8
  import { AlertBanner } from "./alert-banner";
9
9
  import { Autocomplete } from "./autocomplete";
10
10
  import type { ComboOption } from "./combobox-core";
@@ -368,11 +368,11 @@ export function SharePanel({
368
368
  // The completion is a convenience, not a search: an address that matches nobody is
369
369
  // the ordinary case (somebody new), so no "No results" box opens over the field —
370
370
  // and over its error. The same narrowing Autocomplete applies, asked first — folded as
371
- // every kit list folds (DUP-5).
372
- const needle = foldForSearch((target ? "" : email).trim(), locale);
373
- const offers =
374
- needle !== "" &&
375
- options.some((o) => [o.label, o.sublabel ?? ""].some((s) => foldForSearch(s, locale).includes(needle)));
371
+ // every kit list folds (DUP-5), and word by word as its list matches since 0.51.4
372
+ // (refactor audit 2026-10-30, DUP-4): "weber jonas" kept the list shut over a
373
+ // candidate the list itself would have shown.
374
+ const words = searchWords(target ? "" : email, locale);
375
+ const offers = words.length > 0 && options.some((o) => matchesSearch(words, [o.label, o.sublabel], locale));
376
376
 
377
377
  const captionNode = typeof caption === "function" ? caption(target) : caption;
378
378
  const shownError = error ?? failure;