@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
@@ -14,6 +14,8 @@ import { Button } from "../components/button";
14
14
  import { DialogFrame } from "../components/dialog-frame";
15
15
  import { useBillingLabels } from "./billing-labels";
16
16
  import type { BillingLabels } from "./billing-labels";
17
+ import { dialogClose } from "./dialog-close";
18
+ import type { WithDialogClose } from "./dialog-close";
17
19
  import { BILLING_INTERVALS, billingCurrencyFor, formatPlanPrice, planPrice } from "./plan-price";
18
20
  import type { BillingCurrency, BillingInterval, PlanPrices } from "./plan-price";
19
21
 
@@ -489,9 +491,7 @@ export function PlanPicker({
489
491
  {permanentGrant && !switching && (
490
492
  <GrantWarningConfirm
491
493
  open={warned !== null}
492
- onOpenChange={(open) => {
493
- if (!open) setWarned(null);
494
- }}
494
+ onClose={() => setWarned(null)}
495
495
  onConfirm={() => {
496
496
  if (warned) onChoose(warned);
497
497
  }}
@@ -502,11 +502,16 @@ export function PlanPicker({
502
502
  );
503
503
  }
504
504
 
505
- export interface GrantWarningConfirmProps {
505
+ /** {@link GrantWarningConfirmProps} before one of its two close props is required. */
506
+ interface GrantWarningConfirmFields {
506
507
  /** Shown, controlled. */
507
508
  open: boolean;
508
- /** `false` on "Back", Escape, the backdrop — and after "Buy anyway". */
509
- onOpenChange: (open: boolean) => void;
509
+ /** "Back", Escape, the backdrop — and after "Buy anyway". 0.52: every other kit
510
+ * dialog's `onClose` (CONTRIBUTING §4; refactor audit 2026-10-30, API-5). */
511
+ onClose?: () => void;
512
+ /** @deprecated 0.52 — `onClose`, as every other kit dialog; removed in 0.53. Called with
513
+ * `false` when there is no `onClose`. */
514
+ onOpenChange?: (open: boolean) => void;
510
515
  /** "Buy anyway": the app opens its checkout. The dialog closes itself after it. */
511
516
  onConfirm: () => void;
512
517
  /** Prop > `<UiKitProvider labels={{ billing }}>` > English: `grantWarningTitle`,
@@ -514,6 +519,11 @@ export interface GrantWarningConfirmProps {
514
519
  labels?: LabelOverride<BillingLabels>;
515
520
  }
516
521
 
522
+ /** What {@link GrantWarningConfirm} takes: `onClose`, or alone the deprecated
523
+ * `onOpenChange`, is required (0.52 code review: with neither it compiled, and nothing
524
+ * could dismiss it). */
525
+ export type GrantWarningConfirmProps = WithDialogClose<GrantWarningConfirmFields>;
526
+
517
527
  /**
518
528
  * 0.42 (§16.8 B): the permanent-grant warning before a checkout — `grantWarningTitle`,
519
529
  * `grantWarningBody`, "Back" and "Buy anyway" (`grantWarningAction`). {@link PlanPicker}
@@ -523,26 +533,41 @@ export interface GrantWarningConfirmProps {
523
533
  * to a checkout — show this before that checkout, so a permanent-grant holder is still
524
534
  * warned. Carries `data-grant-warning`.
525
535
  */
526
- export function GrantWarningConfirm({ open, onOpenChange, onConfirm, labels: labelsProp }: GrantWarningConfirmProps) {
536
+ export function GrantWarningConfirm({
537
+ open,
538
+ onClose,
539
+ onOpenChange,
540
+ onConfirm,
541
+ labels: labelsProp,
542
+ }: GrantWarningConfirmProps) {
527
543
  const labels = useBillingLabels(labelsProp);
528
544
  const common = useKitLabels("common", DEFAULT_COMMON_LABELS);
545
+ const close = dialogClose({ onClose, onOpenChange });
529
546
  return (
530
547
  <DialogFrame
531
548
  open={open}
532
549
  title={labels.grantWarningTitle}
533
550
  description={labels.grantWarningBody}
534
- onClose={() => onOpenChange(false)}
551
+ onClose={close}
535
552
  data-grant-warning=""
536
- actions={(close) => (
553
+ actions={(lower) => (
537
554
  <>
538
- <Button variant="secondary" onClick={close}>
555
+ <Button variant="secondary" onClick={lower}>
539
556
  {common.back}
540
557
  </Button>
541
558
  <Button
542
559
  variant="default"
543
560
  onClick={() => {
561
+ // Already closed, and lowering: a second press is no second checkout, for an
562
+ // app that shows this dialog itself as much as for PlanPicker.
563
+ if (!open) return;
544
564
  onConfirm();
545
- onOpenChange(false);
565
+ // The caller's close, at once — not `lower`, the panel's animated one, which
566
+ // reports the close 220 ms later. PlanPicker clears the warned choice in it,
567
+ // and the lowering panel is not inert: a double click on "Buy anyway" opened
568
+ // the checkout twice (0.52 code review, plan-card.tsx). The caller's `open`
569
+ // turning false still plays the exit.
570
+ close();
546
571
  }}
547
572
  >
548
573
  {labels.grantWarningAction}
@@ -0,0 +1,66 @@
1
+ // The words of admin/plan-change and their type, in a module with no component code: the
2
+ // English catalogue (src/i18n/defaults.ts) imports them without the component, so `en`
3
+ // loads as one chunk like the other languages (0.34, KS U8). In billing/ since 0.52:
4
+ // PlanSwitchConfirm reads them too, and with them in admin/ the billing and admin folders
5
+ // imported each other (refactor audit 2026-10-30, MOD-6). admin/plan-change re-exports
6
+ // both, and admin/plan-change-labels still answers for the old path.
7
+
8
+ /** The `planChange` namespace: the column, the grant dialog and the result's lines. */
9
+ export interface PlanChangeLabels {
10
+ /** The column's header: "Plan". */
11
+ column: string;
12
+ /** The dialog's title: "Change plan". */
13
+ title: string;
14
+ /** Its confirm button: "Change plan". */
15
+ confirm: string;
16
+ /** The plan select's label: "Plan". */
17
+ plan: string;
18
+ /** The line over the select: "Current plan: Free". */
19
+ current: (plan: string) => string;
20
+ /** Under the select — the fact that is not on the button. */
21
+ keepsItems: string;
22
+ /** The end of a free grant's field: "Free until". */
23
+ until: string;
24
+ /** Under it. */
25
+ untilHint: string;
26
+ /** Why the confirm is held while nothing would change. */
27
+ needsChange: string;
28
+ /** The result: the plan moved from one to another. */
29
+ changed: (from: string, to: string) => string;
30
+ /** The result: an account with no plan before, or the same plan again. */
31
+ set: (to: string) => string;
32
+ /** The result: a running beta kept its own end (§12.34); only the plan moved. */
33
+ keptBeta: string;
34
+ /** The result: the grant runs until `date` (formatted). */
35
+ untilDone: (date: string) => string;
36
+ /** The result: the account owns more than the new plan allows. */
37
+ overLimit: string;
38
+ /**
39
+ * The column's usage, spelled out (its tooltip): "1 of 5 budgets". Figures arrive
40
+ * formatted; `dimension` is the app's word, as `usage.label` gives it — since 0.33.1
41
+ * in the form the LIMIT takes when the label gives its plural forms ("1 of 1 budget",
42
+ * "1 of 5 budgets"): in every shipped language the word follows the limit, or heads
43
+ * the line in German, whose `von` would want a dative plural no app form carries
44
+ * ("Budgets: 1 von 5"). An override of yours gets the same word. Since 0.34 the grant
45
+ * dialog's usage line too, when `usage` comes as the column's shape.
46
+ */
47
+ usageOf: (used: string, limit: string, dimension: string) => string;
48
+ }
49
+
50
+ export const DEFAULT_PLAN_CHANGE_LABELS: PlanChangeLabels = {
51
+ column: "Plan",
52
+ title: "Change plan",
53
+ confirm: "Change plan",
54
+ plan: "Plan",
55
+ current: (plan) => `Current plan: ${plan}`,
56
+ keepsItems: "A smaller plan only blocks creating more; nothing is deleted.",
57
+ until: "Free until",
58
+ untilHint: "Leave empty for no end. A running beta keeps its own end.",
59
+ needsChange: "Pick another plan or an end date.",
60
+ changed: (from, to) => `Plan changed from ${from} to ${to}.`,
61
+ set: (to) => `Plan set to ${to}.`,
62
+ keptBeta: "The beta keeps its end; only the plan changed.",
63
+ untilDone: (date) => `Free until ${date}.`,
64
+ overLimit: "Above the new plan’s limit: nothing is removed, new items are blocked.",
65
+ usageOf: (used, limit, dimension) => `${used} of ${limit} ${dimension}`,
66
+ };
@@ -1,19 +1,20 @@
1
- import type { KeyboardEvent } from "react";
2
-
3
1
  import { useKitLabels, useKitLocale } from "../i18n/kit-labels";
4
2
  import type { LabelOverride } from "../i18n/kit-labels";
5
3
  import { DEFAULT_COMMON_LABELS } from "../i18n/shared-labels";
6
4
  import { pluralForm } from "../i18n/plurals";
7
5
  import type { PluralForms } from "../i18n/plurals";
8
- import { formatDate, formatMoney, formatNumber } from "../lib/format";
6
+ import { useDayFormatter } from "../lib/day-format";
7
+ import { formatMoney, formatNumber } from "../lib/format";
9
8
  import { AlertBanner } from "../components/alert-banner";
10
9
  import { Button } from "../components/button";
11
10
  import { DialogFrame } from "../components/dialog-frame";
12
11
  import { Spinner } from "../components/spinner";
13
12
  import { COMMIT_EXCEPT_BILLING } from "../components/write-lock";
14
- import { DEFAULT_PLAN_CHANGE_LABELS } from "../admin/plan-change-labels";
13
+ import { DEFAULT_PLAN_CHANGE_LABELS } from "./plan-change-labels";
15
14
  import { useBillingLabels } from "./billing-labels";
16
15
  import type { BillingLabels } from "./billing-labels";
16
+ import { dialogClose } from "./dialog-close";
17
+ import type { WithDialogClose } from "./dialog-close";
17
18
  import type { PlanSwitchPreview } from "./billing-overview";
18
19
  import { minorToMajor } from "./plan-price";
19
20
  import type { BillingInterval } from "./plan-price";
@@ -38,11 +39,16 @@ export interface PlanSwitchSide {
38
39
  interval: BillingInterval;
39
40
  }
40
41
 
41
- export interface PlanSwitchConfirmProps {
42
+ /** {@link PlanSwitchConfirmProps} before one of its two close props is required. */
43
+ interface PlanSwitchConfirmFields {
42
44
  open: boolean;
43
- /** `false` when the payer dismisses it — Cancel, Escape, the backdrop. Confirm leaves
44
- * it open: close it once the switch answers. */
45
- onOpenChange: (open: boolean) => void;
45
+ /** The payer dismissed it — Cancel, Escape, the backdrop. Confirm leaves it open: close
46
+ * it once the switch answers. 0.52: every other kit dialog's `onClose` (CONTRIBUTING
47
+ * §4; refactor audit 2026-10-30, API-5). */
48
+ onClose?: () => void;
49
+ /** @deprecated 0.52 — `onClose`, as every other kit dialog; removed in 0.53. Called with
50
+ * `false` when there is no `onClose`. */
51
+ onOpenChange?: (open: boolean) => void;
46
52
  /** What the payer pays now: the overview's `paid`. */
47
53
  from: PlanSwitchSide;
48
54
  /** The pick. */
@@ -50,8 +56,8 @@ export interface PlanSwitchConfirmProps {
50
56
  /** `POST /billing/plan/preview`'s answer. Undefined while it loads: a spinner, and
51
57
  * Confirm is held. */
52
58
  preview?: PlanSwitchPreview;
53
- /** `POST /billing/plan` is under way: Confirm's spinner, no second press, and Escape
54
- * doesn't close. */
59
+ /** `POST /billing/plan` is under way: Confirm's spinner, no second press, and neither
60
+ * Escape, the backdrop nor Back closes it. */
55
61
  pending?: boolean;
56
62
  /** The plan's display name, the app's (§3.1). Default: the code. */
57
63
  planName?: (code: string) => string;
@@ -66,7 +72,8 @@ export interface PlanSwitchConfirmProps {
66
72
  formatLimit?: (dimension: string, value: number) => string;
67
73
  /** Confirm: the app's `POST /billing/plan` with `{plan, interval}` of `to`. */
68
74
  onConfirm: () => void;
69
- /** The figures' and the date's locale. Default: the provider's. */
75
+ /** The figures' and the date's locale. Default: the provider's. The next charge's date
76
+ * is written by the `<UiKitProvider formatDate>` when the app set one (0.52). */
70
77
  locale?: string;
71
78
  /**
72
79
  * 0.42 (§16.2 decision 5, §16.8 B): the payer's free grant runs without an end —
@@ -81,6 +88,11 @@ export interface PlanSwitchConfirmProps {
81
88
  labels?: LabelOverride<BillingLabels>;
82
89
  }
83
90
 
91
+ /** What {@link PlanSwitchConfirm} takes: `onClose`, or alone the deprecated
92
+ * `onOpenChange`, is required (0.52 code review: with neither it compiled, and nothing
93
+ * could dismiss it). */
94
+ export type PlanSwitchConfirmProps = WithDialogClose<PlanSwitchConfirmFields>;
95
+
84
96
  /**
85
97
  * The confirm for a plan switch (§15.2.10): from → to, each with its billing period;
86
98
  * Paddle's preview — "Charged now" (an upgrade) or "Credited towards your next charges"
@@ -90,7 +102,7 @@ export interface PlanSwitchConfirmProps {
90
102
  * const preview = useMutation({ mutationFn: api.previewPlanSwitch });
91
103
  * <PlanSwitchConfirm
92
104
  * open={pick !== null}
93
- * onOpenChange={(open) => !open && setPick(null)}
105
+ * onClose={() => setPick(null)}
94
106
  * from={overview.paid}
95
107
  * to={pick}
96
108
  * preview={preview.data}
@@ -105,6 +117,7 @@ export interface PlanSwitchConfirmProps {
105
117
  */
106
118
  export function PlanSwitchConfirm({
107
119
  open,
120
+ onClose,
108
121
  onOpenChange,
109
122
  from,
110
123
  to,
@@ -122,6 +135,7 @@ export function PlanSwitchConfirm({
122
135
  const planChange = useKitLabels("planChange", DEFAULT_PLAN_CHANGE_LABELS);
123
136
  const common = useKitLabels("common", DEFAULT_COMMON_LABELS);
124
137
  const locale = useKitLocale(localeProp);
138
+ const day = useDayFormatter(undefined, localeProp);
125
139
 
126
140
  const period = (interval: BillingInterval) => (interval === "year" ? labels.yearly : labels.monthly);
127
141
  const side = (s: PlanSwitchSide) => `${planName(s.plan.toLowerCase())} (${period(s.interval)})`;
@@ -151,11 +165,10 @@ export function PlanSwitchConfirm({
151
165
  open={open}
152
166
  title={labels.switchTitle}
153
167
  description={labels.switchFromTo(side(from), side(to))}
154
- onClose={() => onOpenChange(false)}
155
- onKeyDown={(e: KeyboardEvent<HTMLDivElement>) => {
156
- if (pending && e.key === "Escape") e.preventDefault();
157
- }}
158
- aria-busy={preview === undefined || pending || undefined}
168
+ onClose={dialogClose({ onClose, onOpenChange })}
169
+ busy={pending}
170
+ // A preview that loads is busy too, but holds nothing: Cancel stays a way out.
171
+ aria-busy={preview === undefined || undefined}
159
172
  actions={(close) => (
160
173
  <>
161
174
  <Button variant="secondary" onClick={close} disabled={pending}>
@@ -192,9 +205,7 @@ export function PlanSwitchConfirm({
192
205
  </dd>
193
206
  {preview.next_billed_at && preview.next_minor != null && (
194
207
  <>
195
- <dt className="text-secondary">
196
- {labels.switchNextCharge(formatDate(preview.next_billed_at, "medium", { locale }))}
197
- </dt>
208
+ <dt className="text-secondary">{labels.switchNextCharge(day(preview.next_billed_at))}</dt>
198
209
  <dd className="text-right tabular-nums">{money(preview.next_minor, preview.currency)}</dd>
199
210
  </>
200
211
  )}
package/src/chart.ts CHANGED
@@ -2,22 +2,36 @@
2
2
  //
3
3
  // A re-slicing of what the main barrel already exports, not a new API. It exists so a
4
4
  // consumer can reach the chart kit WITHOUT the barrel: `import("@eifi1/ui-kit/chart")`
5
- // is a 31KB chunk, where the same lazy import through the barrel pulls 221KB, because
6
- // a dynamic import of the barrel cannot be tree-shaken down to one of its members.
5
+ // is a chunk of its own (50.4 KB min, 19.9 KB gzip at 0.51.6, refactor audit 2026-10-30
6
+ // MOD-7; it was 31KB when this was written), where the same lazy import through the barrel
7
+ // pulls the barrel, because a dynamic import of it cannot be tree-shaken down to one member.
7
8
  //
8
9
  // It is about chunk size, not about the peer: `recharts` is a REQUIRED peer (since 0.5.0),
9
10
  // because the main barrel re-exports everything here too, so `import { Button } from
10
11
  // "@eifi1/ui-kit"` reaches recharts as well (packaging-contract.test.ts asserts it).
11
12
  export * from "./components/chart";
12
13
  export * from "./theme/chart-palette";
14
+ // 0.52: the slice's share of the 55 names no app reads (refactor audit 2026-10-30, API-4,
15
+ // decision 4), tagged on their specifiers as the barrel's are — the modules keep them.
16
+ export {
17
+ /** @deprecated 0.52 — `chartEdge`, which measures a fill against it (API-4); removed in 0.53 */
18
+ EDGE_MIN_CONTRAST,
19
+ /** @deprecated 0.52 — `--chart-ink` (`CHART_ROLES.outline`), the same ink as a token (API-4); removed in 0.53 */
20
+ CHART_INK_HEX,
21
+ } from "./theme/chart-palette";
13
22
 
14
23
  // The tile chart (treemap) the apps share — moved here from keksdose so every consumer
15
- // derives it from the package rather than from a copy.
24
+ // derives it from the package rather than from a copy. 0.52: its `treemap` label namespace.
16
25
  export * from "./components/treemap";
26
+ export * from "./components/treemap-labels";
17
27
 
18
28
  // lenkbank's zoomable series chart, its synced x-zoom, the toggle legend and the
19
29
  // mirrored-pair axis geometry — moved here so the apps derive them from the package.
20
30
  export * from "./components/series-chart";
31
+ export {
32
+ /** @deprecated 0.52 — `SeriesChart`, which places its tooltip with it (API-4); removed in 0.53 */
33
+ resolveTooltipPlacement,
34
+ } from "./components/series-chart";
21
35
  // 0.32.1 (keksdose's 0.32 report): the height every chart takes, for an app's wrappers.
22
36
  export type { ChartHeight } from "./components/chart-height";
23
37
  // SharedXZoom and the zoom's types: the public face of ./chart-zoom-core, whose arithmetic
@@ -28,6 +42,10 @@ export * from "./components/chart-zoom";
28
42
  // recharts, so chart-zoom-core has to be one of them (MOD-6).
29
43
  export { SharedXZoom } from "./components/chart-zoom-core";
30
44
  export * from "./components/toggle-legend";
45
+ export {
46
+ /** @deprecated 0.52 — `strokeDash`, which picks a series' pattern from it (API-4); removed in 0.53 */
47
+ STROKE_PATTERNS,
48
+ } from "./components/toggle-legend";
31
49
  export * from "./components/facing-pair";
32
50
  export * from "./components/series-chart-labels";
33
51
 
@@ -1,9 +1,10 @@
1
1
  import type { ReactElement, ReactNode } from "react";
2
2
  import type { LucideIcon } from "lucide-react";
3
3
  import { cn } from "../lib/cn";
4
- import { formatDate, formatRelativeTime, toDate, EMPTY_FORMATTED_VALUE } from "../lib/format";
4
+ import { toDate, useKitFormat, EMPTY_FORMATTED_VALUE } from "../lib/format";
5
5
  import type { DateInput, FormatDateStyle, FormatRelativeTimeOptions } from "../lib/format";
6
- import { useKitDateFormatter, useKitLabels, useKitLocale, type LabelOverride } from "../i18n/kit-labels";
6
+ import { useDayFormatter } from "../lib/day-format";
7
+ import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
7
8
  import { toLocalIso } from "../lib/dates";
8
9
  import { Chip } from "./chip";
9
10
  import type { ChipLinkProps, ChipShape, ChipSize, ChipTone, ChipVariant } from "./chip";
@@ -292,17 +293,15 @@ export function AccountStateChip({
292
293
  // An `undefined` in the prop is skipped (the provider's merge does that), so an
293
294
  // optional value cannot blank a default.
294
295
  const labels = useKitLabels("accountState", DEFAULT_ACCOUNT_STATE_LABELS, labelsProp);
295
- const locale = useKitLocale(localeProp);
296
- const fromProvider = useKitDateFormatter();
296
+ // The kit's one day ladder: the provider's `formatDate`, else `Intl` in the provider's
297
+ // locale and `timeZone` (refactor audit 2026-10-30, DUP-2).
298
+ const day = useDayFormatter(null, localeProp);
297
299
  const when = state === "deletion" ? toDate(date ?? null) : null;
298
300
  let text: ReactNode;
299
301
  if (state !== "deletion") text = labels[state];
300
302
  else if (when) {
301
303
  // A date in a SENTENCE, so no weekday (keksdose's rule, KitDateFormatContext).
302
- const day =
303
- (fromProvider && fromProvider(toLocalIso(when), { unit: "day", source: "dateMark", locale, weekday: false })) ||
304
- formatDate(when, "medium", { locale });
305
- text = (labels.deletionOn ?? DEFAULT_ACCOUNT_STATE_LABELS.deletionOn)(day);
304
+ text = (labels.deletionOn ?? DEFAULT_ACCOUNT_STATE_LABELS.deletionOn)(day(date));
306
305
  } else text = labels.deletion ?? DEFAULT_ACCOUNT_STATE_LABELS.deletion;
307
306
  return (
308
307
  <Chip
@@ -355,14 +354,14 @@ export interface DateMarkProps {
355
354
 
356
355
  /**
357
356
  * A date in a table cell: a `<time>` with a machine-readable `dateTime`, nowrap and
358
- * tabular figures, in the provider's locale — or `empty` when there is none.
357
+ * tabular figures, in the provider's locale and `timeZone` — or `empty` when there is none.
359
358
  *
360
359
  * `display="date"` without a `dateStyle` is written by `<UiKitProvider formatDate>` when
361
360
  * the app set one (keksdose K12: its `DateCell` exists to put every column's date in the
362
- * app's date-format preference, weekday and all — dev#546), called with the LOCAL
363
- * calendar day of the value as `"YYYY-MM-DD"` and `weekday: true`. Without one, or for
364
- * an empty answer, it is `Intl`'s `medium` date as before. The relative display is not
365
- * a calendar day and keeps `formatRelativeTime`.
361
+ * app's date-format preference, weekday and all — dev#546), called with the calendar day
362
+ * of the value as `"YYYY-MM-DD"` (in the provider's `timeZone`, else the device's) and
363
+ * `weekday: true`. Without one, or for an empty answer, it is `Intl`'s `medium` date as
364
+ * before. The relative display is not a calendar day and keeps `formatRelativeTime`.
366
365
  */
367
366
  export function DateMark({
368
367
  value,
@@ -374,27 +373,25 @@ export function DateMark({
374
373
  locale: localeProp,
375
374
  className,
376
375
  }: DateMarkProps) {
377
- const locale = useKitLocale(localeProp);
378
- const fromProvider = useKitDateFormatter();
376
+ // The provider's `timeZone` (0.46) as well as its locale, also for the relative words
377
+ // and the exact line (refactor audit 2026-10-30, DUP-2: the raw formatters ignored it).
378
+ const { formatDate, formatRelativeTime } = useKitFormat(localeProp);
379
+ const day = useDayFormatter(null, localeProp);
379
380
  const date = toDate(value);
380
381
  const cls = cn("whitespace-nowrap tabular-nums", className);
381
382
  if (!date) return <span className={cn(cls, "text-muted")}>{empty}</span>;
382
383
  if (display === "date") {
383
- const own =
384
- dateStyle === undefined && fromProvider
385
- ? fromProvider(toLocalIso(date), { unit: "day", source: "dateMark", locale, weekday: true })
386
- : "";
387
384
  return (
388
385
  <time dateTime={date.toISOString()} className={cls}>
389
- {own || formatDate(date, dateStyle ?? "medium", { locale })}
386
+ {day(value, { weekday: true, style: dateStyle ?? "medium", preference: dateStyle === undefined })}
390
387
  </time>
391
388
  );
392
389
  }
393
- const text = formatRelativeTime(date, { ...relative, locale, absoluteStyle: dateStyle ?? "medium" });
394
- const exact = formatDate(date, dateStyle ?? "dateTime", { locale });
390
+ const text = formatRelativeTime(date, { ...relative, absoluteStyle: dateStyle ?? "medium" });
391
+ const exact = formatDate(date, dateStyle ?? "dateTime");
395
392
  // Past `absoluteAfterDays` the relative words already ARE the date; then the exact
396
393
  // line alone, rather than the same day twice.
397
- const sameDay = text === formatDate(date, dateStyle ?? "medium", { locale });
394
+ const sameDay = text === formatDate(date, dateStyle ?? "medium");
398
395
  const iso = date.toISOString();
399
396
  if (sameDay) {
400
397
  return (
@@ -1,9 +1,10 @@
1
- import { useId, useLayoutEffect, useRef, useState } from "react";
2
- import type { ComponentPropsWithoutRef, MouseEvent, ReactNode, Ref } from "react";
1
+ import { useEffect, useId, useLayoutEffect, useRef, useState } from "react";
2
+ import type { ComponentPropsWithoutRef, MouseEvent, ReactNode, Ref, RefObject } from "react";
3
3
  import { AlertTriangle, CheckCircle2, ChevronRight, Info, X } from "lucide-react";
4
4
  import { cn } from "../lib/cn";
5
5
  import { FOCUS_RING } from "./focus-ring";
6
6
  import { DEFAULT_COMMON_LABELS, useKitLabels } from "../i18n/kit-labels";
7
+ import { focusFirst, focusIsLost, tabStopsAround, whenFocusLeftForNothing } from "../lib/focus-left";
7
8
 
8
9
  /** `info` (0.8.0) is the sky family, for news that is neither good nor bad: keksdose's
9
10
  * preview and beta-performance banners, which borrowed `warning` for want of it and
@@ -185,10 +186,21 @@ interface AlertBannerBaseProps extends Omit<ComponentPropsWithoutRef<"div">, "on
185
186
  /** Replaces the tone's glyph — a `<Spinner label={null} />` for "Solving…", say.
186
187
  * `null` draws none. Always decorative; the text carries the message. */
187
188
  icon?: ReactNode;
188
- /** Renders an × at the end that calls this. The banner does not hide itself — the
189
- * caller removes it (and remembers that it did), as with every other kit control
190
- * whose state is app state. */
189
+ /**
190
+ * Renders an × at the end that calls this. The banner does not hide itself — the
191
+ * caller removes it (and remembers that it did), as with every other kit control
192
+ * whose state is app state.
193
+ *
194
+ * The focus (0.52, refactor audit 2026-10-30, DSP-15): the × that held it goes with the
195
+ * banner, and it fell to `<body>`. When the banner unmounts after its × was pressed and
196
+ * the focus has nowhere else, it moves on to the next control after the banner — where
197
+ * Tab from the × would have gone — or, at the end of the page, the one before it; to
198
+ * {@link dismissFocusRef} when given. A banner the caller keeps keeps its ×'s focus.
199
+ */
191
200
  onDismiss?: () => void;
201
+ /** Where the focus goes once the × has removed the banner (DSP-15) — a heading, the
202
+ * control the banner was about. Default: the next control after the banner. */
203
+ dismissFocusRef?: RefObject<HTMLElement | null>;
192
204
  /** Accessible name of the ×. Default: `common.dismiss` from the
193
205
  * {@link UiKitProvider}, else "Dismiss". */
194
206
  dismissLabel?: string;
@@ -278,6 +290,7 @@ export function AlertBanner({
278
290
  action,
279
291
  icon,
280
292
  onDismiss,
293
+ dismissFocusRef,
281
294
  dismissLabel,
282
295
  clampMobile = false,
283
296
  actionPlacement = "own-line",
@@ -318,6 +331,36 @@ export function AlertBanner({
318
331
  return () => ro?.disconnect();
319
332
  }, [clamp, expanded, children]);
320
333
 
334
+ // The ×'s focus, once the caller has removed the banner (DSP-15). Where it can go is read
335
+ // at the press, while the banner still has a place in the page to measure from; whether
336
+ // it must is decided at the unmount, in the cleanup of a passive effect — after React has
337
+ // taken the banner's DOM away, when a focus that fell with it is on <body>.
338
+ const dismissedFrom = useRef<HTMLElement[] | null>(null);
339
+ const dismissTarget = useRef(dismissFocusRef);
340
+ useLayoutEffect(() => {
341
+ dismissTarget.current = dismissFocusRef;
342
+ });
343
+ // The note lives until the focus lands outside the banner (0.52 code review,
344
+ // alert-banner.tsx). A caller that keeps the banner — an async dismiss that failed, a
345
+ // snooze — left it standing, and the banner's unmount long after, a route change with
346
+ // the focus on <body>, sent the focus to a stop noted at the press, over the app's own
347
+ // handling of a new page. A `focusin` on the document, not a `focusout` on the banner:
348
+ // a browser that blurs a removed node would drop the note at the very removal it is for.
349
+ // The one `focusout` heard is a move to nothing — a click on the page — and only once a
350
+ // microtask has shown the × still in place (`whenFocusLeftForNothing`). A focus that
351
+ // stays on the × keeps the note, however late the removal: that is DSP-15's own case,
352
+ // an async dismiss whose request resolves.
353
+ const unwatchFocus = useRef<(() => void) | null>(null);
354
+ useEffect(
355
+ () => () => {
356
+ unwatchFocus.current?.();
357
+ const around = dismissedFrom.current;
358
+ if (!around || !focusIsLost()) return;
359
+ focusFirst([dismissTarget.current?.current, ...around]);
360
+ },
361
+ [],
362
+ );
363
+
321
364
  const Glyph = TONE_GLYPH[tone];
322
365
  // Onto the first line of a box's text: 2px at 14px/20px, 1px at 12px/16px.
323
366
  const nudge = inlineRow || strip ? undefined : sm ? "mt-px" : "mt-0.5";
@@ -448,6 +491,40 @@ export function AlertBanner({
448
491
  // A dismiss inside a whole-row banner must not also follow the row.
449
492
  e.preventDefault();
450
493
  e.stopPropagation();
494
+ const frame = e.currentTarget.parentElement;
495
+ // Only a × that holds the focus has one to lose (0.52 code review, alert-banner.tsx):
496
+ // Safari focuses no button on a click, nor on an iOS tap, and with the focus on
497
+ // <body> already the removal sent it on — a ring, on a form field the on-screen
498
+ // keyboard, on a page the user was reading with the pointer.
499
+ if (frame && e.currentTarget.ownerDocument.activeElement === e.currentTarget) {
500
+ const { after, before } = tabStopsAround(frame);
501
+ dismissedFrom.current = [...after, ...before];
502
+ unwatchFocus.current?.();
503
+ const doc = frame.ownerDocument;
504
+ const forget = () => {
505
+ dismissedFrom.current = null;
506
+ unwatch();
507
+ };
508
+ const onFocusIn = (event: FocusEvent) => {
509
+ if (event.target instanceof Node && frame.contains(event.target)) return;
510
+ forget();
511
+ };
512
+ // Focus that left for nothing — a click on the page — took no `focusin` with it
513
+ // (0.52 code review): the user moved on all the same.
514
+ const onFocusOut = (event: FocusEvent) => {
515
+ whenFocusLeftForNothing(event, () => {
516
+ if (unwatchFocus.current === unwatch) forget();
517
+ });
518
+ };
519
+ const unwatch = () => {
520
+ doc.removeEventListener("focusin", onFocusIn, true);
521
+ frame.removeEventListener("focusout", onFocusOut);
522
+ unwatchFocus.current = null;
523
+ };
524
+ doc.addEventListener("focusin", onFocusIn, true);
525
+ frame.addEventListener("focusout", onFocusOut);
526
+ unwatchFocus.current = unwatch;
527
+ }
451
528
  onDismiss();
452
529
  }}
453
530
  className={cn(
@@ -267,10 +267,15 @@ export interface AmountInputProps extends FieldHelpProps, DataAttributes {
267
267
  max?: number;
268
268
  /**
269
269
  * The SETTLED figure, dot-decimal, sign included — fired on blur, on Enter, on the
270
- * numpad's "=" and on every result the calculator writes back, never on a keystroke
271
- * ("1200+" is not a figure yet). `onChange` still reports every keystroke; this is
272
- * for a host that stores a number and must not see drafts (kastlan 52; see
273
- * {@link MoneyField}, which is built on it).
270
+ * numpad's "=" and once per calculator session (its "=" or Enter in its display, or
271
+ * the pad closing on a result not committed yet), never on a keystroke ("1200+" is
272
+ * not a figure yet). `onChange` still reports every keystroke and every result the
273
+ * calculator writes back; this is for a host that stores a number and must not see
274
+ * drafts (kastlan 52; see {@link MoneyField}, which is built on it).
275
+ *
276
+ * Refactor audit 2026-10-30, INP-1: every calculator keystroke that resolved used to
277
+ * commit, so "100+50" committed 105 on its way to 150 — keksdose saved both, and its
278
+ * threshold field, `disabled` while it saves, lost the calculator to the first.
274
279
  */
275
280
  onCommit?: (value: string) => void;
276
281
  /**
@@ -333,17 +338,28 @@ function settleAmount(text: string, digits: number | undefined, min?: number, ma
333
338
  // `lib/decimal-marks.ts`, read through the engine NumberInput and this field share
334
339
  // (`numeric-field.ts`, DUP-10).
335
340
 
336
- // The consuming app's ONE money palette (`--money-expense` / `--money-income`),
337
- // not a bespoke rose/emerald pairing: a figure being typed has to wear the same
338
- // colour the same figure will wear once it is a row in the table behind the form
339
- // (Keksdose dev#434). The utilities are unlayered and theme-aware, so no `dark:`
340
- // variant is needed and they win over the field's own text colour regardless of
341
- // where `cn` puts them.
342
- const TONE_CLASS: Record<"neutral" | "outflow" | "inflow", string> = {
341
+ /**
342
+ * The figure's colour per {@link AmountInputProps.tone} — public as `AMOUNT_TONE_CLASS`,
343
+ * for a table cell or a test that must paint the same figure the same way (keksdose's
344
+ * receipt lines, dev#556).
345
+ *
346
+ * The consuming app's ONE money palette (`--money-expense` / `--money-income`), not a
347
+ * bespoke rose/emerald pairing: a figure being typed has to wear the same colour the same
348
+ * figure will wear once it is a row in the table behind the form (Keksdose dev#434). The
349
+ * utilities are unlayered and theme-aware, so no `dark:` variant is needed and they win
350
+ * over the field's own text colour regardless of where `cn` puts them.
351
+ */
352
+ const TONE_CLASS: Readonly<Record<NonNullable<AmountInputProps["tone"]>, string>> = {
343
353
  neutral: "",
344
354
  outflow: "text-money-neg",
345
355
  inflow: "text-money-pos",
346
356
  };
357
+ // Exported in 0.52 because keksdose's tests read it out of dist/components/amount-input.js
358
+ // with a regex for `const TONE_CLASS` — the one reach into the kit's dist in three apps,
359
+ // which a rename or a moved module breaks with no public change (MOD-8, refactor audit
360
+ // 2026-10-30; 0.34's move failed 91 of keksdose's test files that way). The local name
361
+ // stays until keksdose imports the export, so the bump itself breaks nothing.
362
+ export { TONE_CLASS as AMOUNT_TONE_CLASS };
347
363
 
348
364
  // The shared chrome-less treatment at money size. `tabular-nums` so digits don't
349
365
  // reflow the figure as they are typed; FIELD_DISPLAY's own muted placeholder
@@ -681,12 +697,14 @@ export function AmountInput(props: AmountInputProps) {
681
697
  // reads either mark, and "1.234,5" is two of them. The result comes back
682
698
  // dot-decimal.
683
699
  value={derived}
700
+ // Live: every result, settled, so the field never shows more decimals than
701
+ // it will keep. The commit is the session's one (INP-1): its "=", or the pad
702
+ // closing on a newer result — not each figure on the way to the result.
684
703
  onChange={(result, expression) => {
685
704
  setDraft(null);
686
- const settled = settle(result);
687
- handleText(settled, expression);
688
- onCommit?.(settled);
705
+ handleText(settle(result), expression);
689
706
  }}
707
+ onCommit={(result) => onCommit?.(settle(result))}
690
708
  className="px-1.5"
691
709
  aria-label={labels?.calculatorTrigger}
692
710
  labels={labels?.calculator}