@eifi1/ui-kit 0.51.6 → 0.52.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 (805) hide show
  1. package/README.md +146 -26
  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 +3 -7
  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.d.ts +3 -2
  39. package/dist/auth/complete-name-dialog.js +3 -5
  40. package/dist/auth/complete-name-dialog.js.map +1 -1
  41. package/dist/auth/forgot-password-form-labels.js +1 -1
  42. package/dist/auth/forgot-password-form-labels.js.map +1 -1
  43. package/dist/auth/forgot-password-form.js +7 -2
  44. package/dist/auth/forgot-password-form.js.map +1 -1
  45. package/dist/auth/register-form-labels.js +1 -1
  46. package/dist/auth/register-form-labels.js.map +1 -1
  47. package/dist/auth/reset-password-form-labels.js +1 -1
  48. package/dist/auth/reset-password-form-labels.js.map +1 -1
  49. package/dist/auth/reset-password-form.js +5 -1
  50. package/dist/auth/reset-password-form.js.map +1 -1
  51. package/dist/auth/sign-in-form-labels.js +1 -1
  52. package/dist/auth/sign-in-form-labels.js.map +1 -1
  53. package/dist/auth/status-parts.d.ts +0 -3
  54. package/dist/auth/status-parts.js +0 -4
  55. package/dist/auth/status-parts.js.map +1 -1
  56. package/dist/auth/verify-email-labels.js +1 -1
  57. package/dist/auth/verify-email-labels.js.map +1 -1
  58. package/dist/auth/verify-email.js +7 -2
  59. package/dist/auth/verify-email.js.map +1 -1
  60. package/dist/billing/cancel-request.d.ts +11 -2
  61. package/dist/billing/cancel-request.js +15 -3
  62. package/dist/billing/cancel-request.js.map +1 -1
  63. package/dist/billing/cancel-subscription.d.ts +22 -10
  64. package/dist/billing/cancel-subscription.js +8 -11
  65. package/dist/billing/cancel-subscription.js.map +1 -1
  66. package/dist/billing/dialog-close.d.ts +29 -0
  67. package/dist/billing/dialog-close.js +8 -0
  68. package/dist/billing/dialog-close.js.map +1 -0
  69. package/dist/billing/plan-card.d.ts +14 -4
  70. package/dist/billing/plan-card.js +15 -8
  71. package/dist/billing/plan-card.js.map +1 -1
  72. package/dist/billing/plan-change-labels.d.ts +42 -0
  73. package/dist/billing/plan-change-labels.js +22 -0
  74. package/dist/billing/plan-change-labels.js.map +1 -0
  75. package/dist/billing/plan-switch.d.ts +21 -9
  76. package/dist/billing/plan-switch.js +10 -8
  77. package/dist/billing/plan-switch.js.map +1 -1
  78. package/dist/chart.d.ts +12 -0
  79. package/dist/chart.js +16 -1
  80. package/dist/chart.js.map +1 -1
  81. package/dist/components/account-chips.d.ts +5 -5
  82. package/dist/components/account-chips.js +11 -13
  83. package/dist/components/account-chips.js.map +1 -1
  84. package/dist/components/alert-banner.d.ts +16 -5
  85. package/dist/components/alert-banner.js +46 -1
  86. package/dist/components/alert-banner.js.map +1 -1
  87. package/dist/components/amount-input.d.ts +22 -4
  88. package/dist/components/amount-input.js +3 -3
  89. package/dist/components/amount-input.js.map +1 -1
  90. package/dist/components/autocomplete.js +57 -65
  91. package/dist/components/autocomplete.js.map +1 -1
  92. package/dist/components/bulk-action-bar.d.ts +12 -2
  93. package/dist/components/bulk-action-bar.js +65 -21
  94. package/dist/components/bulk-action-bar.js.map +1 -1
  95. package/dist/components/button-look.d.ts +5 -5
  96. package/dist/components/button-look.js.map +1 -1
  97. package/dist/components/button.d.ts +2 -2
  98. package/dist/components/button.js.map +1 -1
  99. package/dist/components/calculator.d.ts +21 -2
  100. package/dist/components/calculator.js +53 -14
  101. package/dist/components/calculator.js.map +1 -1
  102. package/dist/components/chart-edge.d.ts +16 -0
  103. package/dist/components/chart-edge.js +14 -1
  104. package/dist/components/chart-edge.js.map +1 -1
  105. package/dist/components/chart-figure.d.ts +13 -0
  106. package/dist/components/chart-figure.js +15 -0
  107. package/dist/components/chart-figure.js.map +1 -0
  108. package/dist/components/chart-zoom-core.js +1 -4
  109. package/dist/components/chart-zoom-core.js.map +1 -1
  110. package/dist/components/chart.d.ts +8 -1
  111. package/dist/components/chart.js +19 -10
  112. package/dist/components/chart.js.map +1 -1
  113. package/dist/components/combobox-core.d.ts +119 -7
  114. package/dist/components/combobox-core.js +151 -46
  115. package/dist/components/combobox-core.js.map +1 -1
  116. package/dist/components/combobox.d.ts +1 -1
  117. package/dist/components/combobox.js +142 -131
  118. package/dist/components/combobox.js.map +1 -1
  119. package/dist/components/copy-button.d.ts +6 -5
  120. package/dist/components/copy-button.js +5 -3
  121. package/dist/components/copy-button.js.map +1 -1
  122. package/dist/components/country-select.js +2 -2
  123. package/dist/components/country-select.js.map +1 -1
  124. package/dist/components/data-table-column-settings.d.ts +1 -1
  125. package/dist/components/data-table-column-settings.js +33 -7
  126. package/dist/components/data-table-column-settings.js.map +1 -1
  127. package/dist/components/data-table-filters.d.ts +4 -2
  128. package/dist/components/data-table-filters.js +2 -2
  129. package/dist/components/data-table-filters.js.map +1 -1
  130. package/dist/components/data-table-fit.d.ts +6 -4
  131. package/dist/components/data-table-fit.js +4 -1
  132. package/dist/components/data-table-fit.js.map +1 -1
  133. package/dist/components/data-table-groups.d.ts +1 -1
  134. package/dist/components/data-table-groups.js.map +1 -1
  135. package/dist/components/data-table-head.d.ts +1 -1
  136. package/dist/components/data-table-head.js +15 -12
  137. package/dist/components/data-table-head.js.map +1 -1
  138. package/dist/components/data-table-mobile.d.ts +36 -7
  139. package/dist/components/data-table-mobile.js +63 -31
  140. package/dist/components/data-table-mobile.js.map +1 -1
  141. package/dist/components/data-table-pagination.js +11 -6
  142. package/dist/components/data-table-pagination.js.map +1 -1
  143. package/dist/components/data-table-resize.d.ts +1 -1
  144. package/dist/components/data-table-resize.js.map +1 -1
  145. package/dist/components/data-table-row-actions.d.ts +2 -2
  146. package/dist/components/data-table-row-actions.js.map +1 -1
  147. package/dist/components/data-table-row.d.ts +6 -2
  148. package/dist/components/data-table-row.js +17 -10
  149. package/dist/components/data-table-row.js.map +1 -1
  150. package/dist/components/data-table-selection.d.ts +1 -1
  151. package/dist/components/data-table-selection.js.map +1 -1
  152. package/dist/components/data-table-shared.d.ts +10 -2
  153. package/dist/components/data-table-shared.js +18 -0
  154. package/dist/components/data-table-shared.js.map +1 -1
  155. package/dist/components/data-table-sort.d.ts +21 -2
  156. package/dist/components/data-table-sort.js +24 -0
  157. package/dist/components/data-table-sort.js.map +1 -1
  158. package/dist/components/data-table-virtual.d.ts +1 -1
  159. package/dist/components/data-table-virtual.js +18 -6
  160. package/dist/components/data-table-virtual.js.map +1 -1
  161. package/dist/components/data-table.d.ts +25 -8
  162. package/dist/components/data-table.js +154 -25
  163. package/dist/components/data-table.js.map +1 -1
  164. package/dist/components/date-field.d.ts +24 -2
  165. package/dist/components/date-field.js +33 -8
  166. package/dist/components/date-field.js.map +1 -1
  167. package/dist/components/date-picker.d.ts +15 -2
  168. package/dist/components/date-picker.js +55 -26
  169. package/dist/components/date-picker.js.map +1 -1
  170. package/dist/components/date-range-picker.d.ts +47 -20
  171. package/dist/components/date-range-picker.js +23 -7
  172. package/dist/components/date-range-picker.js.map +1 -1
  173. package/dist/components/dialog-frame.d.ts +2 -1
  174. package/dist/components/dialog-frame.js.map +1 -1
  175. package/dist/components/entity-combobox.js +4 -2
  176. package/dist/components/entity-combobox.js.map +1 -1
  177. package/dist/components/error-boundary.js +37 -30
  178. package/dist/components/error-boundary.js.map +1 -1
  179. package/dist/components/{ui-labels.d.ts → field-base-labels.d.ts} +0 -2
  180. package/dist/components/{ui-labels.js → field-base-labels.js} +2 -9
  181. package/dist/components/field-base-labels.js.map +1 -0
  182. package/dist/components/field-base.d.ts +4 -3
  183. package/dist/components/field-base.js +3 -3
  184. package/dist/components/field-base.js.map +1 -1
  185. package/dist/components/field-sync-labels.d.ts +1 -0
  186. package/dist/components/field-sync-labels.js.map +1 -1
  187. package/dist/components/field-sync.d.ts +23 -1
  188. package/dist/components/field-sync.js.map +1 -1
  189. package/dist/components/form-actions.js +11 -5
  190. package/dist/components/form-actions.js.map +1 -1
  191. package/dist/components/hover-menu.d.ts +3 -0
  192. package/dist/components/hover-menu.js +5 -3
  193. package/dist/components/hover-menu.js.map +1 -1
  194. package/dist/components/icon-button.js +14 -9
  195. package/dist/components/icon-button.js.map +1 -1
  196. package/dist/components/inline-confirm.d.ts +43 -0
  197. package/dist/components/inline-confirm.js +67 -0
  198. package/dist/components/inline-confirm.js.map +1 -0
  199. package/dist/components/inline-entity-combobox.d.ts +4 -3
  200. package/dist/components/inline-entity-combobox.js +150 -141
  201. package/dist/components/inline-entity-combobox.js.map +1 -1
  202. package/dist/components/input.js +1 -1
  203. package/dist/components/input.js.map +1 -1
  204. package/dist/components/jump-calendar.js +28 -112
  205. package/dist/components/jump-calendar.js.map +1 -1
  206. package/dist/components/legal-page.d.ts +3 -1
  207. package/dist/components/legal-page.js +3 -2
  208. package/dist/components/legal-page.js.map +1 -1
  209. package/dist/components/legal.d.ts +4 -2
  210. package/dist/components/legal.js.map +1 -1
  211. package/dist/components/lightbox.d.ts +2 -2
  212. package/dist/components/lightbox.js +17 -6
  213. package/dist/components/lightbox.js.map +1 -1
  214. package/dist/components/list.d.ts +6 -2
  215. package/dist/components/list.js +4 -3
  216. package/dist/components/list.js.map +1 -1
  217. package/dist/components/measured-grid.d.ts +1 -1
  218. package/dist/components/measured-grid.js +2 -1
  219. package/dist/components/measured-grid.js.map +1 -1
  220. package/dist/components/mini-calendar.js +3 -5
  221. package/dist/components/mini-calendar.js.map +1 -1
  222. package/dist/components/modal.d.ts +24 -0
  223. package/dist/components/modal.js +12 -4
  224. package/dist/components/modal.js.map +1 -1
  225. package/dist/components/money-draft.js +7 -5
  226. package/dist/components/money-draft.js.map +1 -1
  227. package/dist/components/money-field.d.ts +2 -2
  228. package/dist/components/money-field.js.map +1 -1
  229. package/dist/components/month-grid.d.ts +55 -0
  230. package/dist/components/month-grid.js +148 -0
  231. package/dist/components/month-grid.js.map +1 -0
  232. package/dist/components/month-picker.d.ts +36 -4
  233. package/dist/components/month-picker.js +123 -146
  234. package/dist/components/month-picker.js.map +1 -1
  235. package/dist/components/multi-entity-combobox.js +2 -1
  236. package/dist/components/multi-entity-combobox.js.map +1 -1
  237. package/dist/components/multi-select.d.ts +2 -2
  238. package/dist/components/multi-select.js +11 -6
  239. package/dist/components/multi-select.js.map +1 -1
  240. package/dist/components/number-field.d.ts +6 -4
  241. package/dist/components/number-field.js +3 -2
  242. package/dist/components/number-field.js.map +1 -1
  243. package/dist/components/number-input.d.ts +4 -1
  244. package/dist/components/number-input.js +3 -2
  245. package/dist/components/number-input.js.map +1 -1
  246. package/dist/components/numpad-sheet.js.map +1 -1
  247. package/dist/components/picker-sheet.js +2 -1
  248. package/dist/components/picker-sheet.js.map +1 -1
  249. package/dist/components/pie-chart-labels.d.ts +7 -0
  250. package/dist/components/pie-chart-labels.js +1 -0
  251. package/dist/components/pie-chart-labels.js.map +1 -1
  252. package/dist/components/pie-chart.d.ts +5 -3
  253. package/dist/components/pie-chart.js +7 -22
  254. package/dist/components/pie-chart.js.map +1 -1
  255. package/dist/components/popover.d.ts +3 -0
  256. package/dist/components/popover.js +7 -1
  257. package/dist/components/popover.js.map +1 -1
  258. package/dist/components/reauth-dialog.d.ts +4 -5
  259. package/dist/components/reauth-dialog.js +1 -4
  260. package/dist/components/reauth-dialog.js.map +1 -1
  261. package/dist/components/row-actions.js +2 -1
  262. package/dist/components/row-actions.js.map +1 -1
  263. package/dist/components/section-nav.d.ts +7 -0
  264. package/dist/components/section-nav.js.map +1 -1
  265. package/dist/components/series-chart-axes.d.ts +10 -3
  266. package/dist/components/series-chart-axes.js +1 -0
  267. package/dist/components/series-chart-axes.js.map +1 -1
  268. package/dist/components/series-chart-labels.d.ts +7 -4
  269. package/dist/components/series-chart-labels.js.map +1 -1
  270. package/dist/components/series-chart.d.ts +31 -7
  271. package/dist/components/series-chart.js +72 -29
  272. package/dist/components/series-chart.js.map +1 -1
  273. package/dist/components/share-card.js +3 -3
  274. package/dist/components/share-card.js.map +1 -1
  275. package/dist/components/sign-chip-labels.d.ts +1 -0
  276. package/dist/components/sign-chip-labels.js.map +1 -1
  277. package/dist/components/sign-chip.d.ts +10 -1
  278. package/dist/components/sign-chip.js.map +1 -1
  279. package/dist/components/tabs-labels.d.ts +2 -0
  280. package/dist/components/tabs-labels.js +11 -0
  281. package/dist/components/tabs-labels.js.map +1 -0
  282. package/dist/components/tabs.d.ts +1 -1
  283. package/dist/components/tabs.js +13 -11
  284. package/dist/components/tabs.js.map +1 -1
  285. package/dist/components/toggle-legend.d.ts +2 -2
  286. package/dist/components/toggle-legend.js +6 -6
  287. package/dist/components/toggle-legend.js.map +1 -1
  288. package/dist/components/translation-review-editor.d.ts +4 -2
  289. package/dist/components/translation-review-editor.js +2 -3
  290. package/dist/components/translation-review-editor.js.map +1 -1
  291. package/dist/components/translation-review.d.ts +2 -1
  292. package/dist/components/translation-review.js +2 -2
  293. package/dist/components/translation-review.js.map +1 -1
  294. package/dist/components/treemap-labels.d.ts +26 -0
  295. package/dist/components/treemap-labels.js +10 -0
  296. package/dist/components/treemap-labels.js.map +1 -0
  297. package/dist/components/treemap-layout.d.ts +62 -0
  298. package/dist/components/treemap-layout.js +126 -0
  299. package/dist/components/treemap-layout.js.map +1 -0
  300. package/dist/components/treemap.d.ts +140 -17
  301. package/dist/components/treemap.js +324 -97
  302. package/dist/components/treemap.js.map +1 -1
  303. package/dist/components/use-table-state.d.ts +5 -5
  304. package/dist/components/use-table-state.js +4 -1
  305. package/dist/components/use-table-state.js.map +1 -1
  306. package/dist/data-table.d.ts +6 -2
  307. package/dist/data-table.js +7 -2
  308. package/dist/data-table.js.map +1 -1
  309. package/dist/eslint/index.js +1 -1
  310. package/dist/eslint/role-utilities.d.ts +36 -7
  311. package/dist/eslint/role-utilities.js +42 -9
  312. package/dist/eslint/role-utilities.js.map +1 -1
  313. package/dist/feedback/feedback-dialog.d.ts +25 -16
  314. package/dist/feedback/feedback-dialog.js +6 -2
  315. package/dist/feedback/feedback-dialog.js.map +1 -1
  316. package/dist/feedback/feedback-mutation.d.ts +30 -0
  317. package/dist/feedback/feedback-mutation.js +16 -0
  318. package/dist/feedback/feedback-mutation.js.map +1 -0
  319. package/dist/feedback/feedback-page-link.d.ts +53 -0
  320. package/dist/feedback/feedback-page-link.js +37 -0
  321. package/dist/feedback/feedback-page-link.js.map +1 -0
  322. package/dist/feedback/feedback-public-list.d.ts +12 -3
  323. package/dist/feedback/feedback-public-list.js +2 -1
  324. package/dist/feedback/feedback-public-list.js.map +1 -1
  325. package/dist/feedback/feedback-replies.d.ts +3 -1
  326. package/dist/feedback/feedback-replies.js +5 -4
  327. package/dist/feedback/feedback-replies.js.map +1 -1
  328. package/dist/feedback/feedback-row-detail-labels.js +5 -0
  329. package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
  330. package/dist/feedback/feedback-row-detail.d.ts +64 -28
  331. package/dist/feedback/feedback-row-detail.js +30 -28
  332. package/dist/feedback/feedback-row-detail.js.map +1 -1
  333. package/dist/feedback/feedback-status-undo.d.ts +30 -11
  334. package/dist/feedback/feedback-status-undo.js +10 -15
  335. package/dist/feedback/feedback-status-undo.js.map +1 -1
  336. package/dist/feedback/feedback-submit-dialog.d.ts +1 -1
  337. package/dist/feedback/feedback-submit-dialog.js +1 -1
  338. package/dist/feedback/feedback-submit-dialog.js.map +1 -1
  339. package/dist/feedback/feedback-submit.js +9 -3
  340. package/dist/feedback/feedback-submit.js.map +1 -1
  341. package/dist/feedback/feedback-swipe.d.ts +1 -1
  342. package/dist/feedback/feedback-swipe.js.map +1 -1
  343. package/dist/feedback/feedback-table.d.ts +21 -9
  344. package/dist/feedback/feedback-table.js +45 -25
  345. package/dist/feedback/feedback-table.js.map +1 -1
  346. package/dist/feedback/feedback-thread-labels.d.ts +2 -2
  347. package/dist/feedback/feedback-thread-labels.js.map +1 -1
  348. package/dist/feedback/feedback-thread.d.ts +24 -23
  349. package/dist/feedback/feedback-thread.js +2 -1
  350. package/dist/feedback/feedback-thread.js.map +1 -1
  351. package/dist/feedback.d.ts +34 -0
  352. package/dist/feedback.js +42 -0
  353. package/dist/feedback.js.map +1 -1
  354. package/dist/hooks/use-dismiss.js.map +1 -1
  355. package/dist/hooks/use-focus-trap.d.ts +35 -0
  356. package/dist/hooks/use-focus-trap.js +6 -4
  357. package/dist/hooks/use-focus-trap.js.map +1 -1
  358. package/dist/hooks/use-hotkey.d.ts +5 -2
  359. package/dist/hooks/use-hotkey.js +5 -4
  360. package/dist/hooks/use-hotkey.js.map +1 -1
  361. package/dist/hooks/use-long-press.d.ts +7 -4
  362. package/dist/hooks/use-long-press.js +3 -0
  363. package/dist/hooks/use-long-press.js.map +1 -1
  364. package/dist/hooks/use-media-query.js +12 -4
  365. package/dist/hooks/use-media-query.js.map +1 -1
  366. package/dist/hooks/use-mounted.d.ts +22 -0
  367. package/dist/hooks/use-mounted.js +24 -0
  368. package/dist/hooks/use-mounted.js.map +1 -0
  369. package/dist/hooks/use-overlay-history.d.ts +7 -1
  370. package/dist/hooks/use-overlay-history.js +35 -5
  371. package/dist/hooks/use-overlay-history.js.map +1 -1
  372. package/dist/i18n/defaults.js +4 -5
  373. package/dist/i18n/defaults.js.map +1 -1
  374. package/dist/i18n/german.js +7 -1
  375. package/dist/i18n/german.js.map +1 -1
  376. package/dist/i18n/kit-labels.d.ts +9 -2
  377. package/dist/i18n/kit-labels.js.map +1 -1
  378. package/dist/i18n/locales/en.js +20 -41
  379. package/dist/i18n/locales/en.js.map +3 -3
  380. package/dist/i18n/locales/es.js +7 -1
  381. package/dist/i18n/locales/es.js.map +1 -1
  382. package/dist/i18n/locales/fr.js +20 -10
  383. package/dist/i18n/locales/fr.js.map +1 -1
  384. package/dist/i18n/locales/hu.js +9 -1
  385. package/dist/i18n/locales/hu.js.map +1 -1
  386. package/dist/i18n/locales/it.js +7 -1
  387. package/dist/i18n/locales/it.js.map +1 -1
  388. package/dist/i18n/locales/zh.js +8 -1
  389. package/dist/i18n/locales/zh.js.map +1 -1
  390. package/dist/i18n/review.js +5 -0
  391. package/dist/i18n/review.js.map +1 -1
  392. package/dist/index.d.ts +64 -17
  393. package/dist/index.js +77 -12
  394. package/dist/index.js.map +1 -1
  395. package/dist/landing/routing.d.ts +3 -1
  396. package/dist/landing/routing.js +4 -7
  397. package/dist/landing/routing.js.map +1 -1
  398. package/dist/lib/broadcast.d.ts +17 -0
  399. package/dist/lib/broadcast.js +30 -0
  400. package/dist/lib/broadcast.js.map +1 -0
  401. package/dist/lib/calc.d.ts +7 -1
  402. package/dist/lib/calc.js +3 -1
  403. package/dist/lib/calc.js.map +1 -1
  404. package/dist/lib/clipboard-minus.d.ts +2 -2
  405. package/dist/lib/clipboard-minus.js +1 -1
  406. package/dist/lib/clipboard-minus.js.map +1 -1
  407. package/dist/lib/date-format.d.ts +37 -2
  408. package/dist/lib/date-format.js +34 -8
  409. package/dist/lib/date-format.js.map +1 -1
  410. package/dist/lib/day-format.d.ts +46 -0
  411. package/dist/lib/day-format.js +46 -0
  412. package/dist/lib/day-format.js.map +1 -0
  413. package/dist/lib/decimal-marks.d.ts +7 -1
  414. package/dist/lib/decimal-marks.js +5 -2
  415. package/dist/lib/decimal-marks.js.map +1 -1
  416. package/dist/lib/describe-failure.d.ts +14 -0
  417. package/dist/lib/describe-failure.js +9 -0
  418. package/dist/lib/describe-failure.js.map +1 -0
  419. package/dist/lib/direction.d.ts +16 -0
  420. package/dist/lib/direction.js +9 -1
  421. package/dist/lib/direction.js.map +1 -1
  422. package/dist/lib/focus-left.d.ts +63 -0
  423. package/dist/lib/focus-left.js +67 -0
  424. package/dist/lib/focus-left.js.map +1 -0
  425. package/dist/lib/format.d.ts +5 -3
  426. package/dist/lib/format.js +16 -13
  427. package/dist/lib/format.js.map +1 -1
  428. package/dist/lib/http-status.d.ts +24 -0
  429. package/dist/lib/http-status.js +14 -0
  430. package/dist/lib/http-status.js.map +1 -0
  431. package/dist/lib/intl-cache.d.ts +14 -0
  432. package/dist/lib/intl-cache.js +15 -0
  433. package/dist/lib/intl-cache.js.map +1 -0
  434. package/dist/lib/isin.d.ts +10 -0
  435. package/dist/lib/isin.js.map +1 -1
  436. package/dist/lib/iso-day.d.ts +11 -0
  437. package/dist/lib/iso-day.js +8 -0
  438. package/dist/lib/iso-day.js.map +1 -0
  439. package/dist/lib/lazy-with-fallback.d.ts +31 -0
  440. package/dist/lib/lazy-with-fallback.js +40 -0
  441. package/dist/lib/lazy-with-fallback.js.map +1 -0
  442. package/dist/lib/path-pattern.d.ts +34 -0
  443. package/dist/lib/path-pattern.js +24 -0
  444. package/dist/lib/path-pattern.js.map +1 -0
  445. package/dist/lib/reduced-motion.d.ts +2 -1
  446. package/dist/lib/reduced-motion.js.map +1 -1
  447. package/dist/lib/round.d.ts +2 -1
  448. package/dist/lib/round.js +2 -1
  449. package/dist/lib/round.js.map +1 -1
  450. package/dist/lib/safe-storage.d.ts +24 -5
  451. package/dist/lib/safe-storage.js +27 -2
  452. package/dist/lib/safe-storage.js.map +1 -1
  453. package/dist/lib/session-refresh.js +1 -1
  454. package/dist/lib/session-refresh.js.map +1 -1
  455. package/dist/lib/share-format.d.ts +13 -0
  456. package/dist/lib/share-format.js +10 -0
  457. package/dist/lib/share-format.js.map +1 -0
  458. package/dist/lib/text-case.d.ts +17 -0
  459. package/dist/lib/text-case.js +8 -0
  460. package/dist/lib/text-case.js.map +1 -0
  461. package/dist/lib/text-match.d.ts +38 -0
  462. package/dist/lib/text-match.js +24 -2
  463. package/dist/lib/text-match.js.map +1 -1
  464. package/dist/lib/thenable.d.ts +13 -0
  465. package/dist/lib/thenable.js +8 -0
  466. package/dist/lib/thenable.js.map +1 -0
  467. package/dist/lib/translation-review.d.ts +7 -2
  468. package/dist/lib/translation-review.js +4 -4
  469. package/dist/lib/translation-review.js.map +1 -1
  470. package/dist/notifications/device-zone-report.js +1 -1
  471. package/dist/notifications/device-zone-report.js.map +1 -1
  472. package/dist/notifications/notification-bell.d.ts +2 -1
  473. package/dist/notifications/notification-bell.js +3 -3
  474. package/dist/notifications/notification-bell.js.map +1 -1
  475. package/dist/notifications/notification-inbox.d.ts +10 -6
  476. package/dist/notifications/notification-inbox.js +26 -48
  477. package/dist/notifications/notification-inbox.js.map +1 -1
  478. package/dist/notifications/notification-parts.d.ts +3 -2
  479. package/dist/notifications/notification-parts.js +1 -3
  480. package/dist/notifications/notification-parts.js.map +1 -1
  481. package/dist/notifications/notification-types-setting.js +1 -1
  482. package/dist/notifications/notification-types-setting.js.map +1 -1
  483. package/dist/notifications/notifications-labels.d.ts +6 -0
  484. package/dist/notifications/notifications-labels.js +1 -0
  485. package/dist/notifications/notifications-labels.js.map +1 -1
  486. package/dist/notifications/push-device-setting.js +1 -1
  487. package/dist/notifications/push-device-setting.js.map +1 -1
  488. package/dist/notifications/push-devices-setting.d.ts +2 -1
  489. package/dist/notifications/push-devices-setting.js +27 -49
  490. package/dist/notifications/push-devices-setting.js.map +1 -1
  491. package/dist/notifications/quiet-hours-setting.d.ts +10 -3
  492. package/dist/notifications/quiet-hours-setting.js +65 -26
  493. package/dist/notifications/quiet-hours-setting.js.map +1 -1
  494. package/dist/notifications/unsubscribe-panel.js +4 -7
  495. package/dist/notifications/unsubscribe-panel.js.map +1 -1
  496. package/dist/notifications/use-push-device.d.ts +39 -1
  497. package/dist/notifications/use-push-device.js +28 -7
  498. package/dist/notifications/use-push-device.js.map +1 -1
  499. package/dist/offline/query-persistence.d.ts +3 -1
  500. package/dist/offline/query-persistence.js +19 -2
  501. package/dist/offline/query-persistence.js.map +1 -1
  502. package/dist/rhf/fields.d.ts +11 -4
  503. package/dist/rhf/fields.js.map +1 -1
  504. package/dist/search/command-palette.js +1 -1
  505. package/dist/search/command-palette.js.map +1 -1
  506. package/dist/search/global-search.js +19 -9
  507. package/dist/search/global-search.js.map +1 -1
  508. package/dist/search/use-command-key.d.ts +12 -1
  509. package/dist/search/use-command-key.js +3 -12
  510. package/dist/search/use-command-key.js.map +1 -1
  511. package/dist/search.d.ts +7 -0
  512. package/dist/search.js +10 -0
  513. package/dist/search.js.map +1 -1
  514. package/dist/settings/use-settings-focus.js +1 -0
  515. package/dist/settings/use-settings-focus.js.map +1 -1
  516. package/dist/shell/account-menu-language.d.ts +21 -5
  517. package/dist/shell/account-menu-language.js +3 -1
  518. package/dist/shell/account-menu-language.js.map +1 -1
  519. package/dist/shell/account-menu-text-size.d.ts +26 -9
  520. package/dist/shell/account-menu-text-size.js +3 -2
  521. package/dist/shell/account-menu-text-size.js.map +1 -1
  522. package/dist/shell/dev-menu.js +5 -18
  523. package/dist/shell/dev-menu.js.map +1 -1
  524. package/dist/shell/role-switcher.d.ts +7 -0
  525. package/dist/shell/role-switcher.js.map +1 -1
  526. package/dist/shell/top-bar-actions.d.ts +1 -1
  527. package/dist/shell/top-bar-actions.js.map +1 -1
  528. package/dist/shell/top-bar-parts-labels.d.ts +0 -2
  529. package/dist/shell/top-bar-parts-labels.js +0 -1
  530. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  531. package/dist/shell.d.ts +27 -8
  532. package/dist/shell.js +28 -7
  533. package/dist/shell.js.map +1 -1
  534. package/dist/sync/engine.d.ts +30 -4
  535. package/dist/sync/engine.js +172 -52
  536. package/dist/sync/engine.js.map +1 -1
  537. package/dist/sync.d.ts +6 -2
  538. package/dist/sync.js +6 -1
  539. package/dist/sync.js.map +1 -1
  540. package/dist/testing/css-variables.js +3 -8
  541. package/dist/testing/css-variables.js.map +1 -1
  542. package/dist/theme/contrast.d.ts +2 -1
  543. package/dist/theme/contrast.js +3 -8
  544. package/dist/theme/contrast.js.map +1 -1
  545. package/dist/theme/palette-store.js +6 -6
  546. package/dist/theme/palette-store.js.map +1 -1
  547. package/dist/theme/text-size.js +3 -8
  548. package/dist/theme/text-size.js.map +1 -1
  549. package/dist/theme/theme-store.js +3 -6
  550. package/dist/theme/theme-store.js.map +1 -1
  551. package/dist/tour/tour-catalogue.d.ts +7 -4
  552. package/dist/tour/tour-catalogue.js +12 -10
  553. package/dist/tour/tour-catalogue.js.map +1 -1
  554. package/dist/tour/tour-dock.d.ts +0 -2
  555. package/dist/tour/tour-dock.js +0 -2
  556. package/dist/tour/tour-dock.js.map +1 -1
  557. package/dist/tour/tour-gates.d.ts +4 -0
  558. package/dist/tour/tour-gates.js +14 -0
  559. package/dist/tour/tour-gates.js.map +1 -1
  560. package/dist/tour/tour-overlay.d.ts +27 -0
  561. package/dist/tour/tour-overlay.js +741 -0
  562. package/dist/tour/tour-overlay.js.map +1 -0
  563. package/dist/tour/tour.d.ts +16 -4
  564. package/dist/tour/tour.js +62 -778
  565. package/dist/tour/tour.js.map +1 -1
  566. package/dist/tour/use-tour-progress.js +1 -1
  567. package/dist/tour/use-tour-progress.js.map +1 -1
  568. package/dist/tour/use-tour-url-sync.js +2 -2
  569. package/dist/tour/use-tour-url-sync.js.map +1 -1
  570. package/dist/wizard/stepper-nav.d.ts +5 -1
  571. package/dist/wizard/stepper-nav.js.map +1 -1
  572. package/dist/wizard/types.d.ts +6 -2
  573. package/dist/wizard/types.js.map +1 -1
  574. package/dist/wizard/use-wizard.d.ts +3 -1
  575. package/dist/wizard/use-wizard.js.map +1 -1
  576. package/dist/wizard/validation.d.ts +3 -1
  577. package/dist/wizard/validation.js.map +1 -1
  578. package/package.json +12 -8
  579. package/src/account/account-parts.ts +5 -25
  580. package/src/account/data-export-setting-labels.ts +1 -1
  581. package/src/account/delete-account-setting-labels.ts +1 -1
  582. package/src/account/email-change-setting-labels.ts +1 -1
  583. package/src/account/passkeys-setting.tsx +60 -38
  584. package/src/account/sessions-setting.tsx +18 -12
  585. package/src/admin/admin-action-confirm.tsx +5 -10
  586. package/src/admin/admin-parts.ts +11 -25
  587. package/src/admin/mail-test-card-labels.ts +1 -1
  588. package/src/admin/plan-change-labels.ts +5 -23
  589. package/src/admin/plan-change.tsx +7 -44
  590. package/src/admin/reviewer-scope-editor.tsx +3 -3
  591. package/src/auth/auth-errors-labels.ts +23 -0
  592. package/src/auth/auth-errors.ts +11 -38
  593. package/src/auth/complete-name-dialog.tsx +9 -8
  594. package/src/auth/forgot-password-form-labels.ts +1 -1
  595. package/src/auth/forgot-password-form.tsx +11 -6
  596. package/src/auth/register-form-labels.ts +1 -1
  597. package/src/auth/reset-password-form-labels.ts +1 -1
  598. package/src/auth/reset-password-form.tsx +8 -4
  599. package/src/auth/sign-in-form-labels.ts +1 -1
  600. package/src/auth/status-parts.tsx +0 -6
  601. package/src/auth/verify-email-labels.ts +1 -1
  602. package/src/auth/verify-email.tsx +11 -6
  603. package/src/billing/cancel-request.ts +28 -6
  604. package/src/billing/cancel-subscription.tsx +29 -22
  605. package/src/billing/dialog-close.ts +34 -0
  606. package/src/billing/plan-card.tsx +36 -11
  607. package/src/billing/plan-change-labels.ts +66 -0
  608. package/src/billing/plan-switch.tsx +31 -20
  609. package/src/chart.ts +21 -3
  610. package/src/components/account-chips.tsx +20 -23
  611. package/src/components/alert-banner.tsx +82 -5
  612. package/src/components/amount-input.tsx +32 -14
  613. package/src/components/autocomplete.tsx +64 -70
  614. package/src/components/bulk-action-bar.tsx +70 -2
  615. package/src/components/button-look.ts +5 -5
  616. package/src/components/button.tsx +2 -2
  617. package/src/components/calculator.tsx +98 -17
  618. package/src/components/chart-edge.ts +34 -1
  619. package/src/components/chart-figure.tsx +35 -0
  620. package/src/components/chart-zoom-core.tsx +6 -5
  621. package/src/components/chart.tsx +26 -5
  622. package/src/components/combobox-core.tsx +303 -69
  623. package/src/components/combobox.tsx +184 -155
  624. package/src/components/copy-button.tsx +34 -23
  625. package/src/components/country-select.tsx +16 -11
  626. package/src/components/data-table-column-settings.tsx +52 -10
  627. package/src/components/data-table-filters.ts +6 -4
  628. package/src/components/data-table-fit.ts +19 -5
  629. package/src/components/data-table-groups.tsx +1 -1
  630. package/src/components/data-table-head.tsx +32 -22
  631. package/src/components/data-table-mobile.tsx +110 -27
  632. package/src/components/data-table-pagination.tsx +21 -6
  633. package/src/components/data-table-resize.ts +1 -1
  634. package/src/components/data-table-row-actions.tsx +3 -3
  635. package/src/components/data-table-row.tsx +25 -14
  636. package/src/components/data-table-selection.ts +1 -1
  637. package/src/components/data-table-shared.tsx +33 -1
  638. package/src/components/data-table-sort.ts +57 -2
  639. package/src/components/data-table-virtual.ts +32 -8
  640. package/src/components/data-table.tsx +267 -41
  641. package/src/components/date-field.tsx +65 -8
  642. package/src/components/date-picker.tsx +125 -48
  643. package/src/components/date-range-picker.tsx +82 -31
  644. package/src/components/dialog-frame.tsx +2 -1
  645. package/src/components/entity-combobox.tsx +4 -1
  646. package/src/components/error-boundary.tsx +53 -39
  647. package/src/components/field-base-labels.ts +20 -0
  648. package/src/components/field-base.tsx +13 -7
  649. package/src/components/field-sync-labels.ts +1 -0
  650. package/src/components/field-sync.tsx +23 -1
  651. package/src/components/form-actions.tsx +20 -5
  652. package/src/components/hover-menu.tsx +18 -8
  653. package/src/components/icon-button.tsx +14 -9
  654. package/src/components/inline-confirm.tsx +116 -0
  655. package/src/components/inline-entity-combobox.tsx +198 -152
  656. package/src/components/input.tsx +1 -1
  657. package/src/components/jump-calendar.tsx +30 -146
  658. package/src/components/legal-page.tsx +10 -7
  659. package/src/components/legal.tsx +4 -2
  660. package/src/components/lightbox.tsx +21 -8
  661. package/src/components/list.tsx +14 -5
  662. package/src/components/measured-grid.tsx +8 -4
  663. package/src/components/mini-calendar.tsx +6 -5
  664. package/src/components/modal.tsx +45 -4
  665. package/src/components/money-draft.ts +16 -5
  666. package/src/components/money-field.tsx +2 -2
  667. package/src/components/month-grid.tsx +229 -0
  668. package/src/components/month-picker.tsx +192 -200
  669. package/src/components/multi-entity-combobox.tsx +1 -0
  670. package/src/components/multi-select.tsx +21 -9
  671. package/src/components/number-field.tsx +14 -7
  672. package/src/components/number-input.tsx +9 -3
  673. package/src/components/numpad-sheet.tsx +4 -3
  674. package/src/components/picker-sheet.tsx +12 -9
  675. package/src/components/pie-chart-labels.ts +8 -0
  676. package/src/components/pie-chart.tsx +22 -28
  677. package/src/components/popover.tsx +18 -1
  678. package/src/components/reauth-dialog.tsx +6 -10
  679. package/src/components/row-actions.tsx +2 -1
  680. package/src/components/section-nav.tsx +7 -0
  681. package/src/components/series-chart-axes.ts +11 -3
  682. package/src/components/series-chart-labels.ts +7 -4
  683. package/src/components/series-chart.tsx +178 -69
  684. package/src/components/share-card.tsx +6 -6
  685. package/src/components/sign-chip-labels.ts +1 -0
  686. package/src/components/sign-chip.tsx +10 -1
  687. package/src/components/tabs-labels.ts +13 -0
  688. package/src/components/tabs.tsx +35 -19
  689. package/src/components/toggle-legend.tsx +16 -11
  690. package/src/components/translation-review-editor.tsx +6 -5
  691. package/src/components/translation-review.tsx +4 -3
  692. package/src/components/treemap-labels.ts +39 -0
  693. package/src/components/treemap-layout.ts +210 -0
  694. package/src/components/treemap.tsx +722 -133
  695. package/src/components/use-table-state.ts +12 -9
  696. package/src/data-table.ts +9 -2
  697. package/src/eslint/role-utilities.ts +97 -19
  698. package/src/feedback/feedback-dialog.tsx +30 -19
  699. package/src/feedback/feedback-mutation.ts +41 -0
  700. package/src/feedback/feedback-page-link.ts +90 -0
  701. package/src/feedback/feedback-public-list.tsx +17 -5
  702. package/src/feedback/feedback-replies.tsx +13 -6
  703. package/src/feedback/feedback-row-detail-labels.ts +5 -0
  704. package/src/feedback/feedback-row-detail.tsx +103 -67
  705. package/src/feedback/feedback-status-undo.ts +41 -27
  706. package/src/feedback/feedback-submit-dialog.tsx +2 -2
  707. package/src/feedback/feedback-submit.tsx +21 -7
  708. package/src/feedback/feedback-swipe.tsx +1 -1
  709. package/src/feedback/feedback-table.tsx +86 -38
  710. package/src/feedback/feedback-thread-labels.ts +2 -2
  711. package/src/feedback/feedback-thread.tsx +27 -25
  712. package/src/feedback.ts +42 -0
  713. package/src/hooks/use-dismiss.ts +3 -2
  714. package/src/hooks/use-focus-trap.ts +8 -24
  715. package/src/hooks/use-hotkey.ts +24 -7
  716. package/src/hooks/use-long-press.ts +16 -2
  717. package/src/hooks/use-media-query.ts +20 -4
  718. package/src/hooks/use-mounted.ts +39 -0
  719. package/src/hooks/use-overlay-history.ts +70 -5
  720. package/src/i18n/defaults.ts +4 -5
  721. package/src/i18n/german.ts +8 -2
  722. package/src/i18n/kit-labels.tsx +9 -2
  723. package/src/i18n/locales/es.ts +8 -2
  724. package/src/i18n/locales/fr.ts +21 -13
  725. package/src/i18n/locales/hu.ts +10 -2
  726. package/src/i18n/locales/it.ts +8 -2
  727. package/src/i18n/locales/zh.ts +9 -2
  728. package/src/i18n/review.ts +5 -0
  729. package/src/index.ts +103 -13
  730. package/src/landing/routing.tsx +14 -10
  731. package/src/lib/broadcast.ts +52 -0
  732. package/src/lib/calc.ts +13 -2
  733. package/src/lib/clipboard-minus.ts +14 -4
  734. package/src/lib/date-format.ts +89 -13
  735. package/src/lib/day-format.ts +96 -0
  736. package/src/lib/decimal-marks.ts +12 -3
  737. package/src/lib/describe-failure.ts +18 -0
  738. package/src/lib/direction.ts +39 -0
  739. package/src/lib/focus-left.ts +156 -0
  740. package/src/lib/format.ts +34 -19
  741. package/src/lib/http-status.ts +38 -0
  742. package/src/lib/intl-cache.ts +25 -0
  743. package/src/lib/isin.ts +10 -0
  744. package/src/lib/iso-day.ts +13 -0
  745. package/src/lib/lazy-with-fallback.ts +82 -0
  746. package/src/lib/path-pattern.ts +55 -0
  747. package/src/lib/reduced-motion.ts +2 -1
  748. package/src/lib/round.ts +7 -2
  749. package/src/lib/safe-storage.ts +48 -6
  750. package/src/lib/session-refresh.ts +1 -1
  751. package/src/lib/share-format.ts +18 -0
  752. package/src/lib/text-case.ts +19 -0
  753. package/src/lib/text-match.ts +69 -2
  754. package/src/lib/thenable.ts +19 -0
  755. package/src/lib/translation-review.ts +13 -5
  756. package/src/notifications/device-zone-report.ts +1 -1
  757. package/src/notifications/notification-bell.tsx +7 -4
  758. package/src/notifications/notification-inbox.tsx +40 -58
  759. package/src/notifications/notification-parts.tsx +3 -4
  760. package/src/notifications/notification-types-setting.tsx +1 -1
  761. package/src/notifications/notifications-labels.ts +7 -0
  762. package/src/notifications/push-device-setting.tsx +1 -1
  763. package/src/notifications/push-devices-setting.tsx +30 -55
  764. package/src/notifications/quiet-hours-setting.tsx +93 -31
  765. package/src/notifications/unsubscribe-panel.tsx +4 -7
  766. package/src/notifications/use-push-device.ts +76 -10
  767. package/src/offline/query-persistence.ts +35 -3
  768. package/src/rhf/fields.tsx +11 -4
  769. package/src/search/command-palette.tsx +2 -4
  770. package/src/search/global-search.tsx +36 -15
  771. package/src/search/use-command-key.ts +13 -12
  772. package/src/search.ts +9 -0
  773. package/src/settings/use-settings-focus.ts +3 -0
  774. package/src/shell/account-menu-language.tsx +27 -5
  775. package/src/shell/account-menu-text-size.tsx +32 -10
  776. package/src/shell/dev-menu.tsx +7 -21
  777. package/src/shell/role-switcher.tsx +7 -0
  778. package/src/shell/top-bar-actions.tsx +1 -1
  779. package/src/shell/top-bar-parts-labels.ts +0 -3
  780. package/src/shell.ts +40 -9
  781. package/src/sync/engine.ts +339 -61
  782. package/src/sync.ts +8 -1
  783. package/src/testing/css-variables.ts +8 -9
  784. package/src/theme/contrast.ts +8 -9
  785. package/src/theme/palette-store.ts +9 -9
  786. package/src/theme/text-size.ts +6 -8
  787. package/src/theme/theme-store.ts +7 -9
  788. package/src/tour/tour-catalogue.tsx +26 -15
  789. package/src/tour/tour-dock.ts +0 -2
  790. package/src/tour/tour-gates.ts +23 -0
  791. package/src/tour/tour-overlay.tsx +1170 -0
  792. package/src/tour/tour.tsx +116 -1193
  793. package/src/tour/use-tour-progress.ts +1 -1
  794. package/src/tour/use-tour-url-sync.ts +7 -3
  795. package/src/wizard/stepper-nav.tsx +3 -1
  796. package/src/wizard/types.ts +11 -2
  797. package/src/wizard/use-wizard.ts +2 -1
  798. package/src/wizard/validation.ts +8 -2
  799. package/tokens.css +2 -1
  800. package/dist/components/ui-labels.js.map +0 -1
  801. package/dist/shell/dev-switchers.d.ts +0 -6
  802. package/dist/shell/dev-switchers.js +0 -12
  803. package/dist/shell/dev-switchers.js.map +0 -1
  804. package/src/components/ui-labels.ts +0 -24
  805. package/src/shell/dev-switchers.tsx +0 -18
@@ -1,7 +1,8 @@
1
- import { Fragment, useId, useRef, useState } from "react";
1
+ import { useId, useRef, useState } from "react";
2
2
  import type { ComponentPropsWithoutRef, ReactNode, Ref } from "react";
3
3
  import { createPortal } from "react-dom";
4
4
  import { cn } from "../lib/cn";
5
+ import { hasContent } from "../lib/presence";
5
6
  import { FIELD_BASE, FIELD_FLOATING_PAD, FIELD_INVALID } from "./field-base";
6
7
  import { Spinner } from "./spinner";
7
8
  import { useAnchoredPanel } from "../hooks/use-anchored-panel";
@@ -10,10 +11,12 @@ import { isImeEnter } from "../lib/ime";
10
11
  import { isQuietFocus } from "../lib/quiet-focus";
11
12
  import { useAnchorDir } from "./use-anchor-dir";
12
13
  import {
14
+ anchoredHeadingClass,
13
15
  ComboboxFieldLabel,
14
16
  DISABLED_ROW_CLASS,
15
17
  endHintRowProps,
16
- GROUP_HEADING_STICKY,
18
+ GroupedOptions,
19
+ groupRuns,
17
20
  isOptionEnabled,
18
21
  stepEnabled,
19
22
  SUGGESTION_LIST_CLASS,
@@ -293,7 +296,7 @@ export function Autocomplete<V extends string | number = string>(props: Autocomp
293
296
  active: live,
294
297
  });
295
298
 
296
- const hasStatus = status !== undefined && status !== null && status !== false && status !== "";
299
+ const hasStatus = hasContent(status);
297
300
  // The visible line under the rows. Nothing below `minChars` unless the caller has
298
301
  // something to say — an empty field opening a box that says "type more" is noise.
299
302
  const statusLine: ReactNode = hasStatus
@@ -559,75 +562,66 @@ export function Autocomplete<V extends string | number = string>(props: Autocomp
559
562
  aria-labelledby={labelledBy}
560
563
  className="min-h-0 flex-1 overflow-y-auto py-1"
561
564
  >
562
- {results.map((o, i) => {
563
- const startsGroup = o.group != null && o.group !== results[i - 1]?.group;
564
- return (
565
- // Keyed by group AND value, as in the core panel: an option may
566
- // appear once per group.
567
- <Fragment key={`${o.group ?? ""}|${String(o.value)}`}>
568
- {startsGroup && (
569
- <li
570
- role="presentation"
571
- className={cn(
572
- GROUP_HEADING_STICKY,
573
- "px-3 pb-0.5 pt-2 text-caption font-semibold uppercase tracking-wide text-muted first:pt-1",
574
- )}
575
- >
576
- {o.group}
577
- </li>
578
- )}
579
- <li role="presentation">
580
- <button
581
- type="button"
582
- id={optionId(i)}
583
- role="option"
584
- // CHOSEN, never "highlighted" — the family's rule. This
585
- // field holds no value, so the only row that can be chosen
586
- // is the one whose label the text already is.
587
- aria-selected={fillOnSelect && o.label === value}
588
- // Listed, announced as unavailable, never taken: `take`
589
- // refuses it and the arrows pass it over.
590
- aria-disabled={o.disabled || undefined}
591
- tabIndex={-1}
592
- onClick={() => take(o)}
593
- onMouseEnter={() => {
594
- if (!o.disabled) setActive(i);
595
- }}
596
- className={cn(
597
- // The family's suggestion row (DUP-4): it hand-rolled its
598
- // own with a plain `truncate`, so a long address was cut at
599
- // Large, where Combobox's rows wrap (text size §10.17, T1).
600
- // A flex row here, for the icon and the two lines.
601
- suggestionRowClass(i === active && !o.disabled),
602
- "flex items-center gap-2",
603
- small && "py-1 text-xs",
604
- o.disabled && DISABLED_ROW_CLASS,
605
- o.group != null && "ps-6",
606
- )}
607
- >
608
- {o.icon && (
609
- <span aria-hidden className="shrink-0 text-muted">
610
- {o.icon}
565
+ {/* One heading per group, a `role="group"` it names, as in the core panel
566
+ (refactor audit 2026-10-30, INP-8), drawn by the same renderer: an
567
+ option may appear once per group. */}
568
+ <GroupedOptions
569
+ runs={groupRuns(results, (o) => o.group)}
570
+ listboxId={listboxId}
571
+ rowKey={(o) => String(o.value)}
572
+ headingClassName={(run) => anchoredHeadingClass(run)}
573
+ row={(o, i) => (
574
+ <li role="presentation">
575
+ <button
576
+ type="button"
577
+ id={optionId(i)}
578
+ role="option"
579
+ // CHOSEN, never "highlighted" — the family's rule. This
580
+ // field holds no value, so the only row that can be chosen
581
+ // is the one whose label the text already is.
582
+ aria-selected={fillOnSelect && o.label === value}
583
+ // Listed, announced as unavailable, never taken: `take`
584
+ // refuses it and the arrows pass it over.
585
+ aria-disabled={o.disabled || undefined}
586
+ tabIndex={-1}
587
+ onClick={() => take(o)}
588
+ onMouseEnter={() => {
589
+ if (!o.disabled) setActive(i);
590
+ }}
591
+ className={cn(
592
+ // The family's suggestion row (DUP-4): it hand-rolled its
593
+ // own with a plain `truncate`, so a long address was cut at
594
+ // Large, where Combobox's rows wrap (text size §10.17, T1).
595
+ // A flex row here, for the icon and the two lines.
596
+ suggestionRowClass(i === active && !o.disabled),
597
+ "flex items-center gap-2",
598
+ small && "py-1 text-xs",
599
+ o.disabled && DISABLED_ROW_CLASS,
600
+ o.group && "ps-6",
601
+ )}
602
+ >
603
+ {o.icon && (
604
+ <span aria-hidden className="shrink-0 text-muted">
605
+ {o.icon}
606
+ </span>
607
+ )}
608
+ <span className="min-w-0 flex-1">
609
+ <span className="block truncate-until-large text-primary">{o.label}</span>
610
+ {o.sublabel && (
611
+ <span
612
+ className={cn(
613
+ "block truncate-until-large text-placeholder",
614
+ small ? "text-caption" : "text-xs",
615
+ )}
616
+ >
617
+ {o.sublabel}
611
618
  </span>
612
619
  )}
613
- <span className="min-w-0 flex-1">
614
- <span className="block truncate-until-large text-primary">{o.label}</span>
615
- {o.sublabel && (
616
- <span
617
- className={cn(
618
- "block truncate-until-large text-placeholder",
619
- small ? "text-caption" : "text-xs",
620
- )}
621
- >
622
- {o.sublabel}
623
- </span>
624
- )}
625
- </span>
626
- </button>
627
- </li>
628
- </Fragment>
629
- );
630
- })}
620
+ </span>
621
+ </button>
622
+ </li>
623
+ )}
624
+ />
631
625
  </ul>
632
626
  )}
633
627
  {statusLine !== null && (
@@ -1,5 +1,5 @@
1
1
  import { useEffect, useLayoutEffect, useRef, useState } from "react";
2
- import type { ComponentPropsWithRef, CSSProperties, KeyboardEvent, ReactNode } from "react";
2
+ import type { ComponentPropsWithRef, CSSProperties, FocusEvent, KeyboardEvent, ReactNode, RefObject } from "react";
3
3
  import { X } from "lucide-react";
4
4
 
5
5
  import { cn } from "../lib/cn";
@@ -8,6 +8,8 @@ import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
8
8
  import { useAnnounce } from "../hooks/use-announce";
9
9
  import { useBreakpoint } from "../hooks/use-breakpoint";
10
10
  import { OVERLAY_EXIT_MS, skipsExitAnimation } from "../hooks/use-close-transition";
11
+ import { focusFirst, focusIsLost, whenFocusLeftForNothing } from "../lib/focus-left";
12
+ import { hasContent } from "../lib/presence";
11
13
  import { Button } from "./button";
12
14
  import { IconButton } from "./icon-button";
13
15
  import { DEFAULT_BULK_ACTION_BAR_LABELS } from "./bulk-action-bar-labels";
@@ -124,6 +126,16 @@ export interface BulkActionBarProps extends Omit<ComponentPropsWithRef<"div">, "
124
126
  panel?: ReactNode;
125
127
  /** Default: `bulkActionBar` from the {@link UiKitProvider}, else English. */
126
128
  labels?: LabelOverride<BulkActionBarLabels>;
129
+ /**
130
+ * Where the focus goes when the bar leaves while it holds it — after Clear, or an action
131
+ * that empties the selection (0.52, refactor audit 2026-10-30, DSP-15). Without it, the
132
+ * control the focus came into the bar from (the row's box, say), if that is still on the
133
+ * page; with it, this first. Pass one where the selection takes that control with it — a
134
+ * bulk delete removes the rows whose boxes were ticked: the table, the list's heading,
135
+ * the "Select" button that entered selection mode. A bar that leaves without the focus
136
+ * in it moves nothing.
137
+ */
138
+ returnFocusRef?: RefObject<HTMLElement | null>;
127
139
  }
128
140
 
129
141
  /** Where the floating bar sits: clear of the phone nav and of the home indicator,
@@ -192,10 +204,12 @@ export function BulkActionBar({
192
204
  open,
193
205
  panel,
194
206
  labels: labelsProp,
207
+ returnFocusRef,
195
208
  className,
196
209
  style,
197
210
  onKeyDown,
198
211
  onFocus,
212
+ onBlur,
199
213
  ...rest
200
214
  }: BulkActionBarProps) {
201
215
  const labels = useKitLabels("bulkActionBar", DEFAULT_BULK_ACTION_BAR_LABELS, labelsProp);
@@ -245,6 +259,51 @@ export function BulkActionBar({
245
259
  rove(barRef.current, active);
246
260
  });
247
261
 
262
+ // Leaving with the focus in it (refactor audit 2026-10-30, DSP-15): the bar goes `inert`,
263
+ // which blurs the control it holds, then unmounts — and the focus fell to <body>; on a
264
+ // phone VoiceOver's cursor jumped to the top of the page (keksdose's register). Noted on
265
+ // the bar's outermost element, so the `panel`'s fields count: where the focus came in
266
+ // from (the first entry since the bar showed, replaced once that control is gone), and
267
+ // whether it is in the bar. Focus that leaves for nothing because the page took it —
268
+ // inert, a removal — still counts as in it; a real element elsewhere takes it out, and
269
+ // so does a click on the page that left it nowhere (0.52 code review,
270
+ // bulk-action-bar.tsx: the note outlived it, and the bar's hide long after — the last row
271
+ // unticked with the pointer — pulled the focus and the scroll back to the row's box).
272
+ const cameFrom = useRef<HTMLElement | null>(null);
273
+ const holdsFocus = useRef(false);
274
+ const trackFocus = {
275
+ onFocus: (e: FocusEvent<HTMLDivElement>) => {
276
+ holdsFocus.current = true;
277
+ const from = e.relatedTarget;
278
+ if (from instanceof HTMLElement && !e.currentTarget.contains(from) && !cameFrom.current?.isConnected)
279
+ cameFrom.current = from;
280
+ },
281
+ onBlur: (e: FocusEvent<HTMLDivElement>) => {
282
+ onBlur?.(e);
283
+ const to = e.relatedTarget;
284
+ if (to instanceof Element && !e.currentTarget.contains(to)) holdsFocus.current = false;
285
+ whenFocusLeftForNothing(e, () => {
286
+ holdsFocus.current = false;
287
+ });
288
+ },
289
+ };
290
+ // The commit that hides the bar: the focus goes back while the control holding it is
291
+ // still in place — before `inert` takes it, or, with no exit to play, before <body> does.
292
+ const wasShown = useRef(shown);
293
+ useLayoutEffect(() => {
294
+ if (wasShown.current === shown) return;
295
+ wasShown.current = shown;
296
+ const from = cameFrom.current;
297
+ const held = holdsFocus.current;
298
+ cameFrom.current = null;
299
+ holdsFocus.current = false;
300
+ if (shown) return;
301
+ // The outermost element: the toolbar, or with a `panel` the surface round both.
302
+ const surface = barRef.current?.closest("[data-bulk-action-bar]");
303
+ const inBar = !!surface && surface.contains(document.activeElement);
304
+ if (inBar || (held && focusIsLost())) focusFirst([returnFocusRef?.current, from]);
305
+ }, [shown, returnFocusRef]);
306
+
248
307
  const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {
249
308
  onKeyDown?.(e);
250
309
  if (e.defaultPrevented || ownsArrows(e.target as Element)) return;
@@ -279,7 +338,9 @@ export function BulkActionBar({
279
338
  </Button>
280
339
  );
281
340
 
282
- const hasPanel = panel !== undefined && panel !== null && panel !== false;
341
+ // `hasContent` (refactor audit 2026-10-30, DUP-14): an empty-string panel drew an empty
342
+ // bordered strip under the bar.
343
+ const hasPanel = hasContent(panel);
283
344
  // The surface — where the bar sits and what it looks like — and the toolbar row's
284
345
  // own layout. Without a panel they are one element, exactly as before 0.11.0; with
285
346
  // one the surface wraps the row and the panel, so both share its tint and position.
@@ -314,6 +375,7 @@ export function BulkActionBar({
314
375
  onKeyDown={handleKeyDown}
315
376
  onFocus={(e) => {
316
377
  onFocus?.(e);
378
+ if (!hasPanel) trackFocus.onFocus(e);
317
379
  // Clicking a control is using it: the stop follows the pointer too.
318
380
  const hit = itemsOf(barRef.current).find((el) => el === e.target);
319
381
  if (hit) {
@@ -321,6 +383,7 @@ export function BulkActionBar({
321
383
  rove(barRef.current, active);
322
384
  }
323
385
  }}
386
+ onBlur={hasPanel ? undefined : trackFocus.onBlur}
324
387
  style={hasPanel ? undefined : surfaceStyle}
325
388
  className={hasPanel ? rowClass : cn(rowClass, surfaceClass, className)}
326
389
  >
@@ -340,8 +403,13 @@ export function BulkActionBar({
340
403
  <>
341
404
  <span {...regionProps} />
342
405
  {hasPanel ? (
406
+ /* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- the focus is
407
+ only noted here (DSP-15): where it came from, whether it is in the bar; the
408
+ controls are the toolbar's and the panel's own. */
343
409
  <div
344
410
  {...rest}
411
+ onFocus={trackFocus.onFocus}
412
+ onBlur={trackFocus.onBlur}
345
413
  data-bulk-action-bar={variant}
346
414
  inert={!shown || undefined}
347
415
  style={surfaceStyle}
@@ -9,8 +9,8 @@ import type { KitLinkComponent, KitLinkProps } from "../i18n/kit-labels";
9
9
  * and its router link. Both now draw from this module, which renders nothing, so neither
10
10
  * imports the other.
11
11
  *
12
- * Public through ./ui by name: `buttonClasses`, `TOUCH_TARGET_LARGE` and the four types.
13
- * The other exports are the two buttons' shared parts (`@internal`).
12
+ * Public through the barrel (src/index.ts) by name: `buttonClasses`, `TOUCH_TARGET_LARGE`
13
+ * and the four types. The other exports are the two buttons' shared parts (`@internal`).
14
14
  */
15
15
 
16
16
  /**
@@ -24,9 +24,9 @@ import type { KitLinkComponent, KitLinkProps } from "../i18n/kit-labels";
24
24
  * (theme/palette-derive.ts), which no button paints.
25
25
  * - `secondary`: an outline. `ghost`: text or glyph only. `danger`: solid `--danger`,
26
26
  * for an action that destroys something. `link`: a text link that acts (a `<button>`).
27
- * - `primary` and `brand` are **deprecated** aliases of `default` and `accent` (0.49,
28
- * same look; a development build warns once per name). They are removed in 0.51, and
29
- * `primary` will not come back with another meaning.
27
+ *
28
+ * 0.49's `primary` and `brand` (aliases of `default` and `accent`) were removed in 0.51;
29
+ * `primary` will not come back with another meaning.
30
30
  */
31
31
  export type ButtonVariant = "default" | "accent" | "secondary" | "ghost" | "danger" | "link";
32
32
 
@@ -25,8 +25,8 @@ import type { ButtonSize, ButtonTone, ButtonVariant } from "./button-look";
25
25
  */
26
26
  export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
27
27
  /** `default` (the quiet action, what a Button without `variant` draws), `accent` (the
28
- * strong call to action, solid brand), `secondary`, `ghost`, `danger` or `link`.
29
- * `primary` / `brand` are deprecated aliases of `default` / `accent`. See {@link ButtonVariant}. */
28
+ * strong call to action, solid brand), `secondary`, `ghost`, `danger` or `link`. See
29
+ * {@link ButtonVariant}. */
30
30
  variant?: ButtonVariant;
31
31
  /** `md` (default) is the page's action button. `sm` is the compact one — 12px text
32
32
  * and `px-2 py-1` — for the secondary actions in a toolbar, a card header or a
@@ -1,4 +1,5 @@
1
- import { useEffect, useMemo, useRef, useState } from "react";
1
+ import { useEffect, useEffectEvent, useMemo, useRef, useState } from "react";
2
+ import type { RefObject } from "react";
2
3
  import { Calculator as CalculatorIcon, Delete } from "lucide-react";
3
4
  import { Popover } from "./popover";
4
5
  import { cn } from "../lib/cn";
@@ -30,6 +31,24 @@ interface CalculatorButtonProps {
30
31
  * the one argument and ignore this.
31
32
  */
32
33
  onChange: (value: string, expression?: string) => void;
34
+ /**
35
+ * Called ONCE per calculator session, with the result the host should keep: on "="
36
+ * (the key, or Enter in the display), and when the panel closes — Escape, a press
37
+ * outside, the trigger — on a result `onChange` reported after the last commit. Never
38
+ * per keystroke: `onChange` is the live channel, this is the one to save on.
39
+ *
40
+ * Not called when the button goes away with its panel open (a lock or `disabled`
41
+ * arriving, the field unmounting): those say the value must not move, and the result
42
+ * stays where `onChange` put it.
43
+ *
44
+ * Refactor audit 2026-10-30, INP-1: the pad had no commit point of its own, and the
45
+ * two field engines guessed in opposite directions. NumberInput never committed a
46
+ * result, so Kurvenschmiede's dialogs saved the number from before the calculation;
47
+ * AmountInput committed every keystroke that resolved, so "100+50" saved 105 on its way
48
+ * to 150, and keksdose's threshold field, `disabled` while it saves, lost its pad to the
49
+ * first of them.
50
+ */
51
+ onCommit?: (value: string) => void;
33
52
  className?: string;
34
53
  /** The trigger's accessible name; wins over `calculator.open` from the provider. */
35
54
  "aria-label"?: string;
@@ -89,10 +108,13 @@ function seed(initial: string): string {
89
108
  function CalculatorPanel({
90
109
  initial,
91
110
  onChange,
111
+ onEquals,
92
112
  labels,
93
113
  }: {
94
114
  initial: string;
95
115
  onChange: (value: string, expression?: string) => void;
116
+ /** "=" was pressed on a result: the session's commit point. */
117
+ onEquals: () => void;
96
118
  labels: CalculatorLabels;
97
119
  }) {
98
120
  const [expr, setExpr] = useState(() => seed(initial));
@@ -132,6 +154,7 @@ function CalculatorPanel({
132
154
  const out = formatResult(result);
133
155
  setExpr(out);
134
156
  onChange(out, text);
157
+ onEquals();
135
158
  };
136
159
 
137
160
  return (
@@ -213,15 +236,66 @@ function CalculatorPanel({
213
236
  );
214
237
  }
215
238
 
239
+ /**
240
+ * The trigger, and the place a session ends. The render in which `open` turns false is
241
+ * the panel closing, however it closed — Escape, a press outside, this button — and
242
+ * that is when a result the pad left unsettled is committed. A component of its own
243
+ * because `open` lives in Popover and reaches only the trigger.
244
+ *
245
+ * Not the panel's unmount: the panel also goes when a lock or `disabled` takes the
246
+ * calculator away, and nothing may commit then. Those unmount this button with it, so no
247
+ * render ever sees `open` turn false.
248
+ */
249
+ function CalculatorTrigger({
250
+ open,
251
+ onToggle,
252
+ onClosed,
253
+ buttonRef,
254
+ label,
255
+ className,
256
+ }: {
257
+ open: boolean;
258
+ onToggle: () => void;
259
+ onClosed: () => void;
260
+ buttonRef: RefObject<HTMLButtonElement | null>;
261
+ label: string;
262
+ className?: string;
263
+ }) {
264
+ const closed = useEffectEvent(onClosed);
265
+ const wasOpen = useRef(open);
266
+ useEffect(() => {
267
+ if (wasOpen.current && !open) closed();
268
+ wasOpen.current = open;
269
+ }, [open]);
270
+ return (
271
+ <button
272
+ ref={buttonRef}
273
+ type="button"
274
+ tabIndex={-1}
275
+ onClick={onToggle}
276
+ aria-label={label}
277
+ aria-expanded={open}
278
+ className={cn(
279
+ "flex items-center justify-center text-placeholder transition-colors hover:text-secondary",
280
+ className,
281
+ )}
282
+ >
283
+ <CalculatorIcon className="size-4" />
284
+ </button>
285
+ );
286
+ }
287
+
216
288
  /**
217
289
  * A calculator icon that opens a small keypad popover anchored to its host
218
290
  * field. Designed as a trailing-edge adornment: render it inside the field's
219
291
  * `relative` wrapper, positioned absolutely. The keypad seeds from the current
220
- * field value and writes evaluated results straight back through `onChange`.
292
+ * field value and writes evaluated results straight back through `onChange`, and
293
+ * commits the session once through `onCommit`.
221
294
  */
222
295
  export function CalculatorButton({
223
296
  value,
224
297
  onChange,
298
+ onCommit,
225
299
  className,
226
300
  "aria-label": ariaLabel,
227
301
  labels: labelsProp,
@@ -233,28 +307,35 @@ export function CalculatorButton({
233
307
  [ariaLabel, labelsProp],
234
308
  );
235
309
  const labels = useKitLabels("calculator", DEFAULT_CALCULATOR_LABELS, fromProps);
310
+ // The last result `onChange` reported that no commit has covered yet — what closing
311
+ // the panel commits. Written by the pad's handlers and read when it closes; never
312
+ // rendered, so a ref.
313
+ const unsettled = useRef<string | null>(null);
314
+ const change = (next: string, expression?: string) => {
315
+ unsettled.current = next;
316
+ onChange(next, expression);
317
+ };
318
+ const settle = () => {
319
+ const next = unsettled.current;
320
+ unsettled.current = null;
321
+ if (next !== null) onCommit?.(next);
322
+ };
236
323
  return (
237
324
  <Popover
238
325
  width="14rem"
239
326
  labels={{ panel: labels.panel }}
240
327
  trigger={({ open, toggle, ref }) => (
241
- <button
242
- ref={ref}
243
- type="button"
244
- tabIndex={-1}
245
- onClick={toggle}
246
- aria-label={labels.open}
247
- aria-expanded={open}
248
- className={cn(
249
- "flex items-center justify-center text-placeholder transition-colors hover:text-secondary",
250
- className,
251
- )}
252
- >
253
- <CalculatorIcon className="size-4" />
254
- </button>
328
+ <CalculatorTrigger
329
+ open={open}
330
+ onToggle={toggle}
331
+ onClosed={settle}
332
+ buttonRef={ref}
333
+ label={labels.open}
334
+ className={className}
335
+ />
255
336
  )}
256
337
  >
257
- {() => <CalculatorPanel initial={value} onChange={onChange} labels={labels} />}
338
+ {() => <CalculatorPanel initial={value} onChange={change} onEquals={settle} labels={labels} />}
258
339
  </Popover>
259
340
  );
260
341
  }
@@ -1,7 +1,8 @@
1
1
  // The live side of `chartEdge` (theme/chart-palette.ts): which colours a FILLED mark is
2
2
  // painted with and which grounds it sits on, read off <html> as the page resolves them —
3
3
  // so the 1px ink edge follows a theme toggle and a palette switch without the chart
4
- // knowing either store. Shared by SeriesChart (bars, areas) and Treemap (tiles).
4
+ // knowing either store. And WHETHER a mark gets one: `useEdgesInForce`, the contrast
5
+ // setting's switch. Shared by SeriesChart (bars, areas) and Treemap (tiles).
5
6
  import { useCallback, useSyncExternalStore } from "react";
6
7
  import { chartEdge } from "../theme/chart-palette";
7
8
  import { parseHex } from "../theme/color";
@@ -71,3 +72,35 @@ export function useChartEdge(): (fill: string | undefined) => string | undefined
71
72
  [snapshot],
72
73
  );
73
74
  }
75
+
76
+ /**
77
+ * How filled marks are parted — see `TreemapProps.edges` (0.51.6, keksdose dev #642).
78
+ * `"auto"`: `"uniform"` at Standard contrast, `"contrast"` while More contrast is in force.
79
+ */
80
+ export type ChartEdges = "auto" | "uniform" | "contrast";
81
+
82
+ // `<html data-contrast>`, followed live: what `"auto"` keys on. Read here rather than
83
+ // through theme/contrast, whose store would come into the chart entry with it.
84
+ function subscribeContrast(onChange: () => void): () => void {
85
+ if (typeof MutationObserver === "undefined" || typeof document === "undefined") return () => {};
86
+ const observer = new MutationObserver(onChange);
87
+ observer.observe(document.documentElement, { attributes: true, attributeFilter: ["data-contrast"] });
88
+ return () => observer.disconnect();
89
+ }
90
+ const readMoreContrast = () =>
91
+ typeof document !== "undefined" && document.documentElement.getAttribute("data-contrast") === "more";
92
+
93
+ /**
94
+ * The edges a filled mark draws: `"auto"` resolved against the contrast in force, live.
95
+ *
96
+ * Under `"contrast"` a mark whose hue is under 3:1 against the ground gets the 1px ink
97
+ * edge ({@link useChartEdge}); under `"uniform"` none does. The tiles took this rule in
98
+ * 0.51.6 (#642: "The borders do not look nice when changing from tile to tile"), and
99
+ * SeriesChart's bars and areas in 0.52 (refactor audit 2026-10-30, DSP-18, Marcel's
100
+ * decision 3): at Standard contrast the edge fell on 5 of 8 hues in light, and in dark on
101
+ * chart-5 and chart-7 alone — the same unevenness, in a bar chart.
102
+ */
103
+ export function useEdgesInForce(edges: ChartEdges = "auto"): "uniform" | "contrast" {
104
+ const more = useSyncExternalStore(subscribeContrast, readMoreContrast, () => false);
105
+ return edges === "auto" ? (more ? "contrast" : "uniform") : edges;
106
+ }
@@ -0,0 +1,35 @@
1
+ // A chart's accessible description — internal, not exported from the barrel.
2
+ //
3
+ // A chart is a `role="figure"` named by its `aria-label` and described by a sentence of
4
+ // what it shows (0.52, refactor audit 2026-10-30, DSP-5). SeriesChart and Treemap each
5
+ // built the `hidden` sentence and the `aria-describedby` that points at it, and already
6
+ // differed: Treemap kept a caller's own ids, SeriesChart had none to keep. Both put the
7
+ // sentence AFTER the figure, as its sibling, so the chart stopped being its parent's last
8
+ // child and a stack's `space-y-*` or `divide-y` gave it a margin or a rule underneath (0.52
9
+ // code review, deep, charts, findings 7 and 14). One copy now, rendered inside the root.
10
+ import { useId, type ReactNode } from "react";
11
+
12
+ export interface FigureDescription {
13
+ /** The root's `aria-describedby`: the caller's own ids, then the description's. */
14
+ describedBy: string | undefined;
15
+ /** The description, to render INSIDE the root; `null` when there is none. */
16
+ node: ReactNode;
17
+ }
18
+
19
+ /**
20
+ * The description of a figure, and the `aria-describedby` that reads it — after the
21
+ * caller's own ids (`describedBy`), which it keeps. The sentence is `hidden`: it is read
22
+ * through the reference, never a second time in browse mode, and takes no room.
23
+ */
24
+ export function useFigureDescription(description: string | undefined, describedBy?: string): FigureDescription {
25
+ const id = useId();
26
+ if (!description) return { describedBy, node: null };
27
+ return {
28
+ describedBy: describedBy ? `${describedBy} ${id}` : id,
29
+ node: (
30
+ <span id={id} hidden>
31
+ {description}
32
+ </span>
33
+ ),
34
+ };
35
+ }
@@ -466,7 +466,6 @@ export function withChartZoom<P extends ZoomTarget>(Chart: ComponentType<P>) {
466
466
  <ZoomLayer
467
467
  axisIds={axes.map((axis) => axis.id)}
468
468
  only={only}
469
- label={labels.zoomHint}
470
469
  onZoom={(selection) => {
471
470
  const next = zoomAfter(state, selection, source);
472
471
  if (next.x !== xWindow) setXWindow(next.x);
@@ -506,17 +505,20 @@ export function withChartZoom<P extends ZoomTarget>(Chart: ComponentType<P>) {
506
505
  * A transparent rectangle over the plot area that reads the drag. It does NOT stop the
507
506
  * event: recharts drives its tooltip from the same pointer move bubbling up to its own
508
507
  * wrapper, so swallowing it here would trade the tooltip for the zoom.
508
+ *
509
+ * Nothing to assistive technology (0.52, refactor audit 2026-10-30, DSP-5): it was a
510
+ * `role="application"` named by the drag hint, which could not take focus — the one name
511
+ * on an otherwise unnamed chart. The hint is in the chart's description now
512
+ * (`SeriesChart`'s figure), and `data-zoom-surface` is how a test finds the rect.
509
513
  */
510
514
  function ZoomLayer({
511
515
  axisIds,
512
516
  only,
513
- label,
514
517
  onZoom,
515
518
  onReset,
516
519
  }: {
517
520
  axisIds: string[];
518
521
  only?: "x" | "y";
519
- label: string;
520
522
  onZoom: (selection: ZoomSelection) => void;
521
523
  onReset: () => void;
522
524
  }) {
@@ -578,8 +580,7 @@ function ZoomLayer({
578
580
  height={plot.height}
579
581
  // `transparent`, not `none`: an unpainted shape takes no pointer events.
580
582
  fill="transparent"
581
- role="application"
582
- aria-label={label}
583
+ data-zoom-surface=""
583
584
  style={{ cursor: "crosshair" }}
584
585
  onPointerDown={(event) => {
585
586
  if (event.button !== 0) return;