@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
@@ -48,9 +48,9 @@ export interface MultiSelectOption<V extends string | number = string | number>
48
48
  * ids and `string[]` for string ones, and no call site casts. */
49
49
  export interface MultiSelectProps<V extends string | number = string | number>
50
50
  extends Omit<ComponentPropsWithoutRef<"div">, "onChange">, FieldHelpProps {
51
- options: MultiSelectOption<V>[];
51
+ options: readonly MultiSelectOption<V>[];
52
52
  /** The chosen values — the select family's `value` (API-4). */
53
- value?: V[];
53
+ value?: readonly V[];
54
54
  onChange: (next: V[]) => void;
55
55
  /** Singular/plural countable label, used when 1+ items are selected. Default:
56
56
  * `labels.selectedCount`, else `multiSelect.selectedCount` from the provider — the
@@ -116,6 +116,10 @@ export interface MultiSelectProps<V extends string | number = string | number>
116
116
  ref?: Ref<HTMLButtonElement>;
117
117
  }
118
118
 
119
+ /** "Select all" and "Clear": dimmed, with no hover, while there is nothing for them to do. */
120
+ const TOOLBAR_BUTTON =
121
+ "rounded px-2 py-0.5 text-secondary hover:bg-hover aria-disabled:cursor-not-allowed aria-disabled:opacity-40 aria-disabled:hover:bg-transparent";
122
+
119
123
  /**
120
124
  * Pick several of a fixed list — a filter's accounts, a comparison's data sets — with a
121
125
  * search box, "Select all" and "Clear"; nothing picked reads as "all".
@@ -158,7 +162,7 @@ export function MultiSelect<V extends string | number = string | number>(props:
158
162
  "aria-required": ariaRequired,
159
163
  ...rest
160
164
  } = props;
161
- const value = useMemo<V[]>(() => valueProp ?? [], [valueProp]);
165
+ const value = useMemo<readonly V[]>(() => valueProp ?? [], [valueProp]);
162
166
  // The rows as the family's options — the hint is the sublabel, searched like the label.
163
167
  const comboOptions = useMemo(
164
168
  () =>
@@ -338,21 +342,29 @@ export function MultiSelect<V extends string | number = string | number>(props:
338
342
  // hints are why it was widened at all (keksdose #147).
339
343
  width={{ minRem: 16, fit: true, maxRem: 32 }}
340
344
  className={panelClassName}
345
+ // Reached by Tab from the search box (the panel's rows are not tab stops), and
346
+ // `aria-disabled` with a guarded click rather than `disabled`: a pressed "Clear"
347
+ // with nothing left to clear disabled itself under the focus, which dropped it to
348
+ // <body> — JumpCalendar's arrows are the rule (refactor audit 2026-10-30, INP-9).
341
349
  toolbar={
342
350
  <div className="flex items-center justify-between gap-2 px-2 py-1.5 text-xs">
343
351
  <button
344
352
  type="button"
345
- onClick={selectAll}
346
- disabled={!canSelectAll}
347
- className="rounded px-2 py-0.5 text-secondary hover:bg-hover disabled:opacity-40"
353
+ onClick={() => {
354
+ if (canSelectAll) selectAll();
355
+ }}
356
+ aria-disabled={!canSelectAll || undefined}
357
+ className={TOOLBAR_BUTTON}
348
358
  >
349
359
  {text.selectAll}
350
360
  </button>
351
361
  <button
352
362
  type="button"
353
- onClick={clearAll}
354
- disabled={!canClear}
355
- className="rounded px-2 py-0.5 text-secondary hover:bg-hover disabled:opacity-40"
363
+ onClick={() => {
364
+ if (canClear) clearAll();
365
+ }}
366
+ aria-disabled={!canClear || undefined}
367
+ className={TOOLBAR_BUTTON}
356
368
  >
357
369
  {text.clear}
358
370
  </button>
@@ -12,12 +12,14 @@ export interface NumberFieldProps extends Omit<
12
12
  NumberInputProps,
13
13
  "value" | "onChange" | "onCommit" | "suffix" | "invalid" | "error" | "locale"
14
14
  > {
15
- /** The committed number. `null` is "no value" — shown as an empty field. */
15
+ /** The committed number. `null` is "no value" — shown as an empty field. So is a
16
+ * number that is not finite (NaN, ±Infinity). */
16
17
  value: number | null;
17
18
  /**
18
- * The parsed number, on blur or Enter — never per keystroke — and only when it
19
- * differs from the last one committed. Already rounded to `digits` and clamped
20
- * into `[min, max]`. `null` only when `nullable` and the field was emptied.
19
+ * The parsed number, on blur or Enter and once per calculator session (see
20
+ * {@link NumberInput}'s `onCommit`) — never per keystroke — and only when it differs
21
+ * from the last one committed. Already rounded to `digits` and clamped into
22
+ * `[min, max]`. `null` only when `nullable` and the field was emptied.
21
23
  */
22
24
  onCommit: (value: number | null) => void;
23
25
  /**
@@ -160,7 +162,7 @@ function roundTo(n: number, digits: number | undefined): number {
160
162
  */
161
163
  export function NumberField(props: NumberFieldProps) {
162
164
  const {
163
- value,
165
+ value: stored,
164
166
  onCommit,
165
167
  onValueChange,
166
168
  digits,
@@ -179,6 +181,10 @@ export function NumberField(props: NumberFieldProps) {
179
181
  "aria-required": ariaRequired,
180
182
  ...rest
181
183
  } = props;
184
+ // A number that is not finite is no value. NaN in particular never equals itself, and
185
+ // the external-change check below re-read it as new on every render until React threw
186
+ // "Too many re-renders" (refactor audit 2026-10-30, INP-11).
187
+ const value = stored === null || Number.isFinite(stored) ? stored : null;
182
188
  const locale = useKitLocale(localeProp);
183
189
  const mark = decimalMark(locale);
184
190
  const localize = (text: string) => (mark === "," ? text.replace(/\./g, ",") : text);
@@ -201,8 +207,9 @@ export function NumberField(props: NumberFieldProps) {
201
207
 
202
208
  // Adjust state during render rather than in an effect: React re-renders at once
203
209
  // with the new draft, before anything is painted, so there is no frame showing
204
- // the old text.
205
- if (seen.value !== value || seen.mark !== mark || seen.digits !== digits) {
210
+ // the old text. `Object.is`, not `!==`, under which NaN is new on every render: the
211
+ // value is read above, but a NaN `digits` looped the same way.
212
+ if (!Object.is(seen.value, value) || seen.mark !== mark || !Object.is(seen.digits, digits)) {
206
213
  setSeen({ value, mark, digits });
207
214
  // Live mode echoing back what it was just told: the draft already says it, in
208
215
  // the typist's own spelling ("1," or "12+5"), and reformatting would fight them.
@@ -25,7 +25,10 @@ export interface NumberInputProps extends FieldHelpProps, DataAttributes {
25
25
  * folded to a dot, operators kept so a typed expression survives. */
26
26
  onChange: (value: string) => void;
27
27
  /** Fired on blur/Enter with the *evaluated* value — use this for save-on-blur
28
- * fields so the save always sees the resolved number, never "10+5". */
28
+ * fields so the save always sees the resolved number, never "10+5". And once per
29
+ * calculator session — its "=", or closing it on a result not committed yet — never
30
+ * per calculator keystroke (refactor audit 2026-10-30, INP-1: a result used to reach
31
+ * `onChange` only, and the host kept the number from before the calculation). */
29
32
  onCommit?: (value: string) => void;
30
33
  label?: ReactNode;
31
34
  /** Names the field when it has no visible `label` (a table cell, a phone's display
@@ -377,9 +380,11 @@ export function NumberInput(props: NumberInputProps) {
377
380
  );
378
381
  }, [suffix, label, ariaLabel, placeholder]);
379
382
 
380
- const commit = () => {
383
+ // `text`: the calculator commits its session's result (INP-1), which on its "=" can be
384
+ // newer than this render's `value` — `onChange` was handed it in the same event.
385
+ const commit = (text: string = value) => {
381
386
  setDraft(null);
382
- const next = numeric.settle(commitExpression(value));
387
+ const next = numeric.settle(commitExpression(text));
383
388
  if (next !== value) onChange(next);
384
389
  onCommit?.(next);
385
390
  };
@@ -495,6 +500,7 @@ export function NumberInput(props: NumberInputProps) {
495
500
  // grouping: the evaluator reads either mark, but "1.234,5" is two of them.
496
501
  value={derived}
497
502
  onChange={result}
503
+ onCommit={commit}
498
504
  className="self-stretch px-2.5"
499
505
  aria-label={labels?.calculatorTrigger}
500
506
  labels={labels?.calculator}
@@ -46,9 +46,10 @@ type PadKey = { kind: "ins"; label: string; ins: string; accent?: boolean; name?
46
46
  /** The {@link CalculatorLabels} key naming a non-digit key; digits are their glyph. */
47
47
  type PadKeyName = "plus" | "minus" | "times" | "divide" | "decimal";
48
48
 
49
- // Insert chars that survive `sanitizeLive` (it keeps `× ÷` and ASCII `+ - * /`
50
- // but strips the unicode minus `−`, so minus inserts an ASCII "-" while showing
51
- // the nicer glyph). The evaluator normalises `× ÷` back to `* /`.
49
+ // Insert chars `sanitizeLive` keeps as they are (`× ÷` and ASCII `+ - * /`; it maps the
50
+ // unicode minus `−` to "-" since 0.51.7, INP-3), so minus inserts the ASCII "-" its
51
+ // field shows while the key shows the nicer glyph. The evaluator normalises `× ÷` back
52
+ // to `* /`.
52
53
  const PAD_KEYS: PadKey[] = [
53
54
  { kind: "ins", label: "7", ins: "7" },
54
55
  { kind: "ins", label: "8", ins: "8" },
@@ -3,6 +3,7 @@ import { createPortal } from "react-dom";
3
3
  import { X } from "lucide-react";
4
4
  import type { ComponentPropsWithoutRef, KeyboardEvent, ReactNode, Ref, RefObject } from "react";
5
5
  import { cn } from "../lib/cn";
6
+ import { hasContent } from "../lib/presence";
6
7
  import { mergeRefs } from "./field-parts";
7
8
  import { CLIPS_ATTRIBUTE } from "../lib/clipping";
8
9
  import { DropdownSearchHeader } from "./dropdown";
@@ -119,7 +120,8 @@ export function PickerSheet({
119
120
  // one way out of a full-screen sheet speak the app's language without each of
120
121
  // them having to (see the prop's note in `EntityCombobox`).
121
122
  const labels = useKitLabels("pickerSheet", DEFAULT_PICKER_SHEET_LABELS, { close: closeLabel, done: doneLabel });
122
- const hasFooter = (footer !== undefined && footer !== null && footer !== false) || Boolean(done);
123
+ // `hasContent`, so a `footer` of "" draws no empty bar (refactor audit 2026-10-30, DUP-14).
124
+ const hasFooter = hasContent(footer) || Boolean(done);
123
125
  useBodyScrollLock(open);
124
126
  /**
125
127
  * Back closes THE SHEET, not the dialog it was opened from (Keksdose live #309:
@@ -169,14 +171,15 @@ export function PickerSheet({
169
171
  * sheet knows when its own input exists. Popping the keyboard is the POINT here,
170
172
  * where in a form dialog it is the cost.
171
173
  *
172
- * **`restoreFocus` is off**, which is the uncomfortable half. Every caller in this
173
- * kit opens the sheet from the field's own `onFocus` handler, so handing focus back
174
- * to that field on close re-opens the sheet the user has just dismissed — a row tap
175
- * would select a value and immediately put the list back over it. The field that
176
- * opened it is the only thing that knows whether re-focusing it means "open"; a sheet
177
- * that cannot tell must not guess. The cost is that focus lands on `<body>` after a
178
- * dismissal, which on the phone this shape is for costs nothing, and on a pointer
179
- * device is what happened before this change too.
174
+ * **`restoreFocus` is off**, which is the uncomfortable half. `Combobox` and
175
+ * `InlineEntityCombobox` open the sheet from the field's own `onFocus` handler, so
176
+ * handing focus back to that field on close re-opens the sheet the user has just
177
+ * dismissed — a row tap would select a value and immediately put the list back over
178
+ * it. The field that opened it is the only thing that knows whether re-focusing it
179
+ * means "open"; a sheet that cannot tell must not guess. So the caller does it in
180
+ * `onClose` where it can: `ComboboxPanel`'s triggers open on a click, and its
181
+ * `onClose` hands focus back to the trigger (0.52, refactor audit 2026-10-30, INP-7) —
182
+ * a screen-reader user is in exactly this layout, and <body> was where they landed.
180
183
  */
181
184
  useFocusTrap(sheetRef, {
182
185
  active: open,
@@ -15,6 +15,13 @@ export interface PieChartLabels {
15
15
  * German, "42%" in English) — the function only arranges them.
16
16
  */
17
17
  slice: (label: string, value: string, percent: string) => string;
18
+ /**
19
+ * One slice's accessible name under `redact` (0.52): the label and the share, with no
20
+ * amount. `redact` blurs every figure on screen but not the ring, and the ring's names
21
+ * are attributes on untagged elements, which a session replay or a redaction keyed on
22
+ * `[data-private]` reads as they are. `percent` as for {@link PieChartLabels.slice}.
23
+ */
24
+ sliceShare: (label: string, percent: string) => string;
18
25
  /** The caption over the donut's centre figure. */
19
26
  total: string;
20
27
  /** What a chart with nothing to draw says, when the caller passes no `empty`. */
@@ -26,6 +33,7 @@ export interface PieChartLabels {
26
33
  export const DEFAULT_PIE_CHART_LABELS: PieChartLabels = {
27
34
  slices: "Chart slices",
28
35
  slice: (label, value, percent) => `${label}: ${value} (${percent})`,
36
+ sliceShare: (label, percent) => `${label}: ${percent}`,
29
37
  total: "Total",
30
38
  empty: "No data",
31
39
  legend: "Categories",
@@ -12,7 +12,8 @@ import type { ComponentProps, ComponentPropsWithRef, KeyboardEvent, ReactNode }
12
12
  import { Pie, PieChart as RechartsPieChart, Sector } from "recharts";
13
13
  import type { PieLabelRenderProps, PieSectorShapeProps } from "recharts";
14
14
  import { cn } from "../lib/cn";
15
- import { horizontalStep } from "../lib/direction";
15
+ import { dirOf, rovingTarget } from "../lib/direction";
16
+ import { shareFormat } from "../lib/share-format";
16
17
  import { useKitLabels, useKitLocale, type LabelOverride } from "../i18n/kit-labels";
17
18
  import { paletteFor } from "../theme/chart-palette";
18
19
  import { ChartContainer, ChartTooltip, ChartTooltipContent, type ChartConfig } from "./chart";
@@ -93,7 +94,8 @@ export interface PieChartProps extends Omit<ComponentPropsWithRef<"div">, "child
93
94
  * Tag every figure ON SCREEN `data-private` — the tooltip bubble, the centre and
94
95
  * `"value"` slice labels — so the host's demo-mode rule blurs it. A percentage alone
95
96
  * reveals no amount, so `"percent"` labels stay readable, and the slices themselves
96
- * are not tagged: a blurred ring is no picture at all.
97
+ * are not tagged: a blurred ring is no picture at all. So a slice's NAME says no
98
+ * amount either (0.52): "Occupied: 60%" (`labels.sliceShare`), not `labels.slice`.
97
99
  */
98
100
  redact?: boolean;
99
101
  /** What to show with nothing to draw. Default: `labels.empty`. */
@@ -138,8 +140,9 @@ function RedactedTooltipContent(props: ComponentProps<typeof ChartTooltipContent
138
140
  * clockwise from twelve o'clock, the order of the legend — with ←/→ following the
139
141
  * reading direction in RTL; Home/End go to the first and last. Each slice is named
140
142
  * "Label: value (xx%)" (`labels.slice`), because a colour and an angle are nothing a
141
- * screen reader can say, and focusing one reads it out in the donut's centre. With
142
- * `onSliceClick`, Enter and Space activate it as a click does.
143
+ * screen reader can say — under `redact` "Label: xx%" (`labels.sliceShare`) — and
144
+ * focusing one reads it out in the donut's centre. With `onSliceClick`, Enter and Space
145
+ * activate it as a click does.
143
146
  *
144
147
  * The legend switches slices off (`legend="toggle"`); the percentages are always of
145
148
  * what is drawn. The plot is not mirrored in RTL (see `ChartContainer`); the legend
@@ -177,25 +180,14 @@ export function PieChart({
177
180
  const { scale } = useTextSize();
178
181
  const box = chartHeightProps(height);
179
182
  const numberFormat = useMemo(() => new Intl.NumberFormat(locale), [locale]);
180
- const percentFormats = useMemo(
181
- () => ({
182
- whole: new Intl.NumberFormat(locale, { style: "percent", maximumFractionDigits: 0 }),
183
- fine: new Intl.NumberFormat(locale, { style: "percent", maximumFractionDigits: 1 }),
184
- }),
185
- [locale],
186
- );
187
183
  // Memoised, like everything the sectors are drawn from: they must not be rebuilt on
188
184
  // this component's own re-renders (see `pie` below).
189
185
  const formatValue = useCallback(
190
186
  (v: number) => (formatValueProp ? formatValueProp(v) : formatWithMinus(numberFormat, v)),
191
187
  [formatValueProp, numberFormat],
192
188
  );
193
- // One decimal under 10 %, where rounding to whole percents starts to lie — a slice
194
- // of 0.4 % labelled "0%" says it is not there.
195
- const formatShare = useCallback(
196
- (share: number) => (share < 0.1 ? percentFormats.fine : percentFormats.whole).format(share),
197
- [percentFormats],
198
- );
189
+ // One decimal under 10 %, the rule Treemap says its shares by too (lib/share-format).
190
+ const formatShare = useMemo(() => shareFormat(locale), [locale]);
199
191
 
200
192
  const [ownHidden, setOwnHidden] = useState<ReadonlySet<string>>(() => new Set());
201
193
  const hidden = hiddenProp ?? ownHidden;
@@ -273,17 +265,11 @@ export function PieChart({
273
265
  const d = drawn[index];
274
266
  if (!d) return <Sector key={key ?? undefined} {...sector} />;
275
267
  const onKeyDown = (event: KeyboardEvent<SVGGElement>) => {
276
- const step = horizontalStep(event.key, event.currentTarget);
277
- let target: number | undefined;
278
- if (step) target = index + step;
279
- else if (event.key === "ArrowDown") target = index + 1;
280
- else if (event.key === "ArrowUp") target = index - 1;
281
- else if (event.key === "Home") target = 0;
282
- else if (event.key === "End") target = drawn.length - 1;
268
+ // Round the circle: past the last slice is the first, as the eye goes.
269
+ const target = rovingTarget(event.key, dirOf(event.currentTarget), index, drawn.length, true);
283
270
  if (target !== undefined) {
284
271
  event.preventDefault();
285
- // Round the circle: past the last slice is the first, as the eye goes.
286
- refs.current[((target % drawn.length) + drawn.length) % drawn.length]?.focus();
272
+ refs.current[target]?.focus();
287
273
  } else if (clickable && (event.key === "Enter" || event.key === " ")) {
288
274
  event.preventDefault();
289
275
  clickRef.current?.(d.slice.key, d.slice);
@@ -297,7 +283,15 @@ export function PieChart({
297
283
  role={clickable ? "button" : "img"}
298
284
  // The first slice until the effect below moves the stop.
299
285
  tabIndex={index === 0 ? 0 : -1}
300
- aria-label={labels.slice(d.slice.label, formatValue(d.value), formatShare(d.share))}
286
+ // Under `redact` with no amount: the ring is left untagged so it stays a picture,
287
+ // and its names are attributes a session replay or a redaction keyed on
288
+ // `[data-private]` reads as they are — "Occupied: €6.00 (60%)" told the amount the
289
+ // blurred centre and tooltip hid (0.52 code review; Marcel's decision).
290
+ aria-label={
291
+ redact
292
+ ? labels.sliceShare(d.slice.label, formatShare(d.share))
293
+ : labels.slice(d.slice.label, formatValue(d.value), formatShare(d.share))
294
+ }
301
295
  data-slice={d.slice.key}
302
296
  onKeyDown={onKeyDown}
303
297
  onFocus={() => {
@@ -313,7 +307,7 @@ export function PieChart({
313
307
  </g>
314
308
  );
315
309
  },
316
- [drawn, labels, formatValue, formatShare, clickable],
310
+ [drawn, labels, formatValue, formatShare, clickable, redact],
317
311
  );
318
312
 
319
313
  const label = useCallback(
@@ -37,6 +37,9 @@ export { DEFAULT_POPOVER_LABELS };
37
37
  */
38
38
  export interface PopoverProps extends Omit<ComponentPropsWithoutRef<"div">, "children"> {
39
39
  trigger: (state: { open: boolean; toggle: () => void; ref: RefObject<HTMLButtonElement | null> }) => ReactNode;
40
+ /** The panel's content. `close` shuts the panel and, when focus is in it, puts focus
41
+ * on the trigger before returning — so a dialog the same handler opens gives it back
42
+ * there (0.52). */
40
43
  children: (close: () => void) => ReactNode;
41
44
  /**
42
45
  * The panel's width: `"18rem"` (the default) grows with the text size — the panel
@@ -125,6 +128,17 @@ export function Popover({
125
128
  // across a right-to-left calendar or filter rendered left-to-right.
126
129
  const [dir, setDir] = useState<Direction>("ltr");
127
130
  const close = () => setOpen(false);
131
+ // The `close` the children get also hands focus to the trigger, AT ONCE, when it is
132
+ // inside the panel. The trap restores it too, but only after the commit — and a dialog
133
+ // opened in the same handler records its own restore target during that commit's
134
+ // render: the menu item that is about to go. RowActions' "Delete" asks first, and the
135
+ // answered confirm dropped focus on <body>, mid-table (refactor audit 2026-10-30,
136
+ // INP-2). Escape and an outside press keep the plain close: nothing opens after them.
137
+ const closeFromPanel = () => {
138
+ const focusInside = panelRef.current?.contains(document.activeElement) ?? false;
139
+ setOpen(false);
140
+ if (focusInside) triggerRef.current?.focus();
141
+ };
128
142
  const toggle = () => {
129
143
  setDir(dirOf(triggerRef.current));
130
144
  setOpen((v) => !v);
@@ -242,7 +256,10 @@ export function Popover({
242
256
  className,
243
257
  )}
244
258
  >
245
- {children(close)}
259
+ {
260
+ // eslint-disable-next-line react-hooks/refs -- handed to the items' handlers: it reads the trigger and the focus when an item is chosen, never while rendering
261
+ children(closeFromPanel)
262
+ }
246
263
  </div>,
247
264
  document.body,
248
265
  )}
@@ -1,5 +1,5 @@
1
1
  import { useContext, useEffect, useId, useRef, useState } from "react";
2
- import type { KeyboardEvent, ReactNode } from "react";
2
+ import type { ReactNode } from "react";
3
3
 
4
4
  import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
5
5
  import { CurrentPasswordInput, usePromisePending } from "./danger-confirm";
@@ -41,8 +41,7 @@ export interface ReauthDialogProps {
41
41
  onSubmit: (password: string) => void | Promise<unknown>;
42
42
  /**
43
43
  * The dialog has closed: `true` after a resolved `onSubmit`, `false` for Cancel,
44
- * Escape, the backdrop and Back. A dismissal while `onSubmit` is still running also
45
- * answers `false`, and that call's late result is then ignored.
44
+ * Escape, the backdrop and Back — none of which closes it while the check runs.
46
45
  */
47
46
  onClose: (confirmed: boolean) => void;
48
47
  /**
@@ -93,9 +92,9 @@ export interface ReauthDialogProps {
93
92
  *
94
93
  * The field is a `<form>`, so Enter submits once something is typed. Focus starts in
95
94
  * the field and returns to the trigger through `Modal`'s trap. While a check runs,
96
- * the field is read-only, Cancel is disabled and Escape is held: a request that has
97
- * left cannot be cancelled by closing the dialog, and the dialog should not pretend it
98
- * can.
95
+ * the field is read-only, Cancel is disabled and the dialog is `busy` (Escape, the
96
+ * backdrop and Back are held, DUP-3): a request that has left cannot be cancelled by
97
+ * closing the dialog, and the dialog should not pretend it can.
99
98
  */
100
99
  export function ReauthDialog({
101
100
  onSubmit,
@@ -173,10 +172,7 @@ export function ReauthDialog({
173
172
  title={title ?? labels.title}
174
173
  description={description ?? labels.description}
175
174
  onClose={() => onClose(confirmed.current)}
176
- onKeyDown={(e: KeyboardEvent<HTMLDivElement>) => {
177
- if (busy && e.key === "Escape") e.preventDefault();
178
- }}
179
- aria-busy={busy || undefined}
175
+ busy={busy}
180
176
  actions={
181
177
  <ReauthActions
182
178
  formId={formId}
@@ -3,6 +3,7 @@ import type { KeyboardEvent, MouseEvent, ReactElement, ReactNode } from "react";
3
3
  import { MoreHorizontal } from "lucide-react";
4
4
  import type { LucideIcon } from "lucide-react";
5
5
  import { cn } from "../lib/cn";
6
+ import { hasContent } from "../lib/presence";
6
7
  import { useLargeText } from "../hooks/use-large-text";
7
8
  import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
8
9
  import { Popover } from "./popover";
@@ -466,7 +467,7 @@ function stopActivationKeys(e: KeyboardEvent) {
466
467
  */
467
468
  function useActionHref(action: RowAction): string | undefined {
468
469
  const reason = useCommitReason(action.commit, action.disabledReason);
469
- const refused = reason !== undefined && reason !== null && reason !== false && reason !== "";
470
+ const refused = hasContent(reason);
470
471
  return action.href !== undefined && !action.pending && !refused ? action.href : undefined;
471
472
  }
472
473
 
@@ -3,6 +3,8 @@ import { NavPills } from "./nav-pills";
3
3
  import type { NavPillItem, NavPillLinkProps } from "./nav-pills";
4
4
  import type { ReactElement, Ref } from "react";
5
5
 
6
+ /** @deprecated 0.52 — `NavPillsProps` with `layout="scroll"`, what SectionNav wraps; removed in
7
+ * 0.53 (no app renders SectionNav: refactor audit 2026-10-30, MOD-5). */
6
8
  export interface SectionNavProps<T extends string> {
7
9
  /** The section's pages, each with its `href` (a pill without one is a button that
8
10
  * calls `onSelect`). Labels short: the row is one line. */
@@ -37,6 +39,11 @@ export interface SectionNavProps<T extends string> {
37
39
  * Place it right under the page's title (`PageHeader`); the AppShell's own row of a
38
40
  * group's pages above the bar (`mobileSubNav`) is the shell-wide alternative — use one,
39
41
  * not both, for the same pages.
42
+ *
43
+ * @deprecated 0.52 — `<NavPills layout="scroll" itemClassName="min-h-11 focus-visible:ring-inset"
44
+ * className="md:hidden">`, the same row; removed in 0.53. kastlan, whose section pills it
45
+ * was made for (0.49 KIT-6), never adopted it: no app renders it (refactor audit
46
+ * 2026-10-30, MOD-5).
40
47
  */
41
48
  export function SectionNav<T extends string>({
42
49
  items,
@@ -143,8 +143,8 @@ export function oneAxis(
143
143
 
144
144
  /** One source's samples: an abscissa and the channels measured against it. */
145
145
  export interface SeriesSource {
146
- x: number[];
147
- channels: Record<string, number[]>;
146
+ x: readonly number[];
147
+ channels: Readonly<Record<string, readonly number[]>>;
148
148
  }
149
149
 
150
150
  /**
@@ -155,7 +155,7 @@ export interface SeriesSource {
155
155
  * has no sample the key is absent, and `connectNulls` bridges the hole with the same
156
156
  * straight segment an interpolation would have drawn — without claiming a measurement.
157
157
  */
158
- export function mergeSeries(sources: SeriesSource[]): Record<string, number>[] {
158
+ export function mergeSeries(sources: readonly SeriesSource[]): Record<string, number>[] {
159
159
  const byAbscissa = new Map<number, Record<string, number>>();
160
160
  for (const source of sources) {
161
161
  source.x.forEach((value, index) => {
@@ -187,11 +187,19 @@ export function seriesKey(...parts: (string | number)[]): string {
187
187
  * padded only on the sides that are not zero — bars standing on a frame's bottom edge,
188
188
  * not floating four per cent above it on a band of air nobody asked for.
189
189
  * `undefined` when there is nothing to fit.
190
+ *
191
+ * All-zero data (a quiet period, a zoom window over empty months) is `[0, 1]`: one unit
192
+ * on the free side, the unit {@link padBand} pads a zero extent by. d3 maps every value
193
+ * of a zero-height domain to the range's midpoint, so `[0, 0]` stood the bars on a
194
+ * baseline in the middle of the plot, the "0" tick beside it (audit 2026-10-30 DSP-10;
195
+ * keksdose's weekday pattern drew seven 4 px stubs mid-card for a period with no
196
+ * spending).
190
197
  */
191
198
  export function anchoredBand(extent: readonly [number, number] | undefined): [number, number] | undefined {
192
199
  if (!extent) return undefined;
193
200
  const low = Math.min(0, extent[0]);
194
201
  const high = Math.max(0, extent[1]);
202
+ if (low === 0 && high === 0) return [0, 1];
195
203
  const pad = (high - low) * AUTO_PAD || 1;
196
204
  return [low < 0 ? low - pad : 0, high > 0 ? high + pad : 0];
197
205
  }
@@ -8,15 +8,18 @@
8
8
  export interface SeriesChartLabels {
9
9
  /** The button that puts a zoomed chart back to its full extent. Visible text. */
10
10
  resetZoom: string;
11
- /** Accessible name of the drag surface laid over the plot. It is the only place the
12
- * gesture is explained, so it says how the drag is read and how to undo it. */
11
+ /** The drag-to-zoom gesture, said at the end of a zoomable chart's description (the
12
+ * figure's `aria-describedby`; until 0.52 the name of the drag surface, an
13
+ * `application` nothing could focus). It is the only place the gesture is explained,
14
+ * so it says how the drag is read and how to undo it. */
13
15
  zoomHint: string;
14
16
  /** What a chart with nothing to draw says, when the caller passes no `empty`. */
15
17
  empty: string;
16
18
  /** Accessible name of a `ToggleLegend` — a group of switches, one per series. */
17
19
  legend: string;
18
- /** Accessible name of the group of keyboard stops a clickable chart (`onPointClick`)
19
- * lays over its bars or periods — one tab stop, arrow keys between them. */
20
+ /** Accessible name of the group of keyboard stops a chart lays over its bars or
21
+ * periods — one tab stop, arrow keys between them; buttons with `onPointClick`, and
22
+ * since 0.52 images to read without. */
20
23
  points: string;
21
24
  }
22
25