@eifi1/ui-kit 0.51.7 → 0.53.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (775) hide show
  1. package/README.md +178 -67
  2. package/dist/account/account-parts.d.ts +10 -8
  3. package/dist/account/account-parts.js +1 -18
  4. package/dist/account/account-parts.js.map +1 -1
  5. package/dist/account/data-export-setting-labels.js +1 -1
  6. package/dist/account/data-export-setting-labels.js.map +1 -1
  7. package/dist/account/delete-account-setting-labels.js +1 -1
  8. package/dist/account/delete-account-setting-labels.js.map +1 -1
  9. package/dist/account/email-change-setting-labels.js +1 -1
  10. package/dist/account/email-change-setting-labels.js.map +1 -1
  11. package/dist/account/passkeys-setting.d.ts +9 -2
  12. package/dist/account/passkeys-setting.js +41 -29
  13. package/dist/account/passkeys-setting.js.map +1 -1
  14. package/dist/account/sessions-setting.d.ts +3 -2
  15. package/dist/account/sessions-setting.js +10 -8
  16. package/dist/account/sessions-setting.js.map +1 -1
  17. package/dist/admin/admin-action-confirm.js +1 -3
  18. package/dist/admin/admin-action-confirm.js.map +1 -1
  19. package/dist/admin/admin-parts.d.ts +6 -3
  20. package/dist/admin/admin-parts.js +6 -21
  21. package/dist/admin/admin-parts.js.map +1 -1
  22. package/dist/admin/mail-test-card-labels.js +1 -1
  23. package/dist/admin/mail-test-card-labels.js.map +1 -1
  24. package/dist/admin/plan-change-labels.d.ts +2 -2
  25. package/dist/admin/plan-change-labels.js +1 -17
  26. package/dist/admin/plan-change-labels.js.map +1 -1
  27. package/dist/admin/plan-change.d.ts +3 -42
  28. package/dist/admin/plan-change.js +1 -1
  29. package/dist/admin/plan-change.js.map +1 -1
  30. package/dist/admin/reviewer-scope-editor.js +3 -3
  31. package/dist/admin/reviewer-scope-editor.js.map +1 -1
  32. package/dist/auth/auth-errors-labels.d.ts +11 -0
  33. package/dist/auth/auth-errors-labels.js +13 -0
  34. package/dist/auth/auth-errors-labels.js.map +1 -0
  35. package/dist/auth/auth-errors.d.ts +7 -23
  36. package/dist/auth/auth-errors.js +2 -15
  37. package/dist/auth/auth-errors.js.map +1 -1
  38. package/dist/auth/complete-name-dialog.js +2 -1
  39. package/dist/auth/complete-name-dialog.js.map +1 -1
  40. package/dist/auth/forgot-password-form-labels.js +1 -1
  41. package/dist/auth/forgot-password-form-labels.js.map +1 -1
  42. package/dist/auth/forgot-password-form.js +7 -2
  43. package/dist/auth/forgot-password-form.js.map +1 -1
  44. package/dist/auth/register-form-labels.js +1 -1
  45. package/dist/auth/register-form-labels.js.map +1 -1
  46. package/dist/auth/reset-password-form-labels.js +1 -1
  47. package/dist/auth/reset-password-form-labels.js.map +1 -1
  48. package/dist/auth/reset-password-form.js +5 -1
  49. package/dist/auth/reset-password-form.js.map +1 -1
  50. package/dist/auth/sign-in-form-labels.js +1 -1
  51. package/dist/auth/sign-in-form-labels.js.map +1 -1
  52. package/dist/auth/status-parts.d.ts +0 -3
  53. package/dist/auth/status-parts.js +0 -4
  54. package/dist/auth/status-parts.js.map +1 -1
  55. package/dist/auth/verify-email-labels.js +1 -1
  56. package/dist/auth/verify-email-labels.js.map +1 -1
  57. package/dist/auth/verify-email.js +7 -2
  58. package/dist/auth/verify-email.js.map +1 -1
  59. package/dist/billing/cancel-subscription.d.ts +10 -7
  60. package/dist/billing/cancel-subscription.js +6 -6
  61. package/dist/billing/cancel-subscription.js.map +1 -1
  62. package/dist/billing/plan-card.d.ts +5 -3
  63. package/dist/billing/plan-card.js +7 -8
  64. package/dist/billing/plan-card.js.map +1 -1
  65. package/dist/billing/plan-change-labels.d.ts +42 -0
  66. package/dist/billing/plan-change-labels.js +22 -0
  67. package/dist/billing/plan-change-labels.js.map +1 -0
  68. package/dist/billing/plan-switch.d.ts +9 -6
  69. package/dist/billing/plan-switch.js +7 -5
  70. package/dist/billing/plan-switch.js.map +1 -1
  71. package/dist/chart.d.ts +4 -3
  72. package/dist/chart.js +72 -4
  73. package/dist/chart.js.map +1 -1
  74. package/dist/components/account-chips.d.ts +5 -5
  75. package/dist/components/account-chips.js +11 -13
  76. package/dist/components/account-chips.js.map +1 -1
  77. package/dist/components/alert-banner.d.ts +16 -5
  78. package/dist/components/alert-banner.js +46 -1
  79. package/dist/components/alert-banner.js.map +1 -1
  80. package/dist/components/amount-input.d.ts +13 -0
  81. package/dist/components/amount-input.js +1 -0
  82. package/dist/components/amount-input.js.map +1 -1
  83. package/dist/components/autocomplete.js +57 -65
  84. package/dist/components/autocomplete.js.map +1 -1
  85. package/dist/components/bulk-action-bar.d.ts +12 -2
  86. package/dist/components/bulk-action-bar.js +65 -21
  87. package/dist/components/bulk-action-bar.js.map +1 -1
  88. package/dist/components/button-look.d.ts +5 -5
  89. package/dist/components/button-look.js.map +1 -1
  90. package/dist/components/button.d.ts +2 -2
  91. package/dist/components/button.js.map +1 -1
  92. package/dist/components/chart-edge.d.ts +16 -0
  93. package/dist/components/chart-edge.js +14 -1
  94. package/dist/components/chart-edge.js.map +1 -1
  95. package/dist/components/chart-figure.d.ts +13 -0
  96. package/dist/components/chart-figure.js +15 -0
  97. package/dist/components/chart-figure.js.map +1 -0
  98. package/dist/components/chart-zoom-core.js +1 -4
  99. package/dist/components/chart-zoom-core.js.map +1 -1
  100. package/dist/components/chart.d.ts +8 -1
  101. package/dist/components/chart.js +19 -10
  102. package/dist/components/chart.js.map +1 -1
  103. package/dist/components/combobox-core.d.ts +111 -2
  104. package/dist/components/combobox-core.js +148 -42
  105. package/dist/components/combobox-core.js.map +1 -1
  106. package/dist/components/combobox.d.ts +1 -1
  107. package/dist/components/combobox.js +141 -130
  108. package/dist/components/combobox.js.map +1 -1
  109. package/dist/components/copy-button.d.ts +6 -5
  110. package/dist/components/copy-button.js +5 -3
  111. package/dist/components/copy-button.js.map +1 -1
  112. package/dist/components/country-select.js +2 -2
  113. package/dist/components/country-select.js.map +1 -1
  114. package/dist/components/data-table-column-settings.d.ts +1 -1
  115. package/dist/components/data-table-column-settings.js +33 -7
  116. package/dist/components/data-table-column-settings.js.map +1 -1
  117. package/dist/components/data-table-filters.d.ts +4 -2
  118. package/dist/components/data-table-filters.js +2 -2
  119. package/dist/components/data-table-filters.js.map +1 -1
  120. package/dist/components/data-table-fit.d.ts +6 -4
  121. package/dist/components/data-table-fit.js +4 -1
  122. package/dist/components/data-table-fit.js.map +1 -1
  123. package/dist/components/data-table-groups.d.ts +1 -1
  124. package/dist/components/data-table-groups.js.map +1 -1
  125. package/dist/components/data-table-head.d.ts +1 -1
  126. package/dist/components/data-table-head.js +15 -12
  127. package/dist/components/data-table-head.js.map +1 -1
  128. package/dist/components/data-table-mobile.d.ts +12 -7
  129. package/dist/components/data-table-mobile.js +43 -30
  130. package/dist/components/data-table-mobile.js.map +1 -1
  131. package/dist/components/data-table-pagination.js +11 -6
  132. package/dist/components/data-table-pagination.js.map +1 -1
  133. package/dist/components/data-table-resize.d.ts +1 -1
  134. package/dist/components/data-table-resize.js.map +1 -1
  135. package/dist/components/data-table-row-actions.d.ts +2 -2
  136. package/dist/components/data-table-row-actions.js.map +1 -1
  137. package/dist/components/data-table-row.d.ts +6 -2
  138. package/dist/components/data-table-row.js +17 -10
  139. package/dist/components/data-table-row.js.map +1 -1
  140. package/dist/components/data-table-selection.d.ts +1 -1
  141. package/dist/components/data-table-selection.js.map +1 -1
  142. package/dist/components/data-table-shared.d.ts +10 -2
  143. package/dist/components/data-table-shared.js +18 -0
  144. package/dist/components/data-table-shared.js.map +1 -1
  145. package/dist/components/data-table-sort.d.ts +21 -2
  146. package/dist/components/data-table-sort.js +24 -0
  147. package/dist/components/data-table-sort.js.map +1 -1
  148. package/dist/components/data-table-virtual.d.ts +1 -1
  149. package/dist/components/data-table-virtual.js +18 -6
  150. package/dist/components/data-table-virtual.js.map +1 -1
  151. package/dist/components/data-table.d.ts +13 -4
  152. package/dist/components/data-table.js +139 -36
  153. package/dist/components/data-table.js.map +1 -1
  154. package/dist/components/date-field.d.ts +25 -3
  155. package/dist/components/date-field.js +33 -8
  156. package/dist/components/date-field.js.map +1 -1
  157. package/dist/components/date-picker.d.ts +16 -3
  158. package/dist/components/date-picker.js +55 -26
  159. package/dist/components/date-picker.js.map +1 -1
  160. package/dist/components/date-range-picker.d.ts +38 -24
  161. package/dist/components/date-range-picker.js +23 -7
  162. package/dist/components/date-range-picker.js.map +1 -1
  163. package/dist/components/error-boundary.js +37 -30
  164. package/dist/components/error-boundary.js.map +1 -1
  165. package/dist/components/{ui-labels.d.ts → field-base-labels.d.ts} +0 -2
  166. package/dist/components/{ui-labels.js → field-base-labels.js} +2 -9
  167. package/dist/components/field-base-labels.js.map +1 -0
  168. package/dist/components/field-base.d.ts +4 -3
  169. package/dist/components/field-base.js +3 -3
  170. package/dist/components/field-base.js.map +1 -1
  171. package/dist/components/form-actions.js +11 -5
  172. package/dist/components/form-actions.js.map +1 -1
  173. package/dist/components/hover-menu.d.ts +3 -0
  174. package/dist/components/hover-menu.js +5 -3
  175. package/dist/components/hover-menu.js.map +1 -1
  176. package/dist/components/icon-button.js +14 -9
  177. package/dist/components/icon-button.js.map +1 -1
  178. package/dist/components/inline-confirm.d.ts +43 -0
  179. package/dist/components/inline-confirm.js +67 -0
  180. package/dist/components/inline-confirm.js.map +1 -0
  181. package/dist/components/inline-entity-combobox.d.ts +4 -3
  182. package/dist/components/inline-entity-combobox.js +148 -140
  183. package/dist/components/inline-entity-combobox.js.map +1 -1
  184. package/dist/components/input.js +1 -1
  185. package/dist/components/input.js.map +1 -1
  186. package/dist/components/jump-calendar.js +28 -112
  187. package/dist/components/jump-calendar.js.map +1 -1
  188. package/dist/components/legal-page.d.ts +3 -1
  189. package/dist/components/legal-page.js +3 -2
  190. package/dist/components/legal-page.js.map +1 -1
  191. package/dist/components/legal.d.ts +4 -2
  192. package/dist/components/legal.js.map +1 -1
  193. package/dist/components/lightbox.d.ts +2 -2
  194. package/dist/components/lightbox.js +17 -6
  195. package/dist/components/lightbox.js.map +1 -1
  196. package/dist/components/list.d.ts +6 -2
  197. package/dist/components/list.js +3 -2
  198. package/dist/components/list.js.map +1 -1
  199. package/dist/components/measured-grid.d.ts +1 -1
  200. package/dist/components/measured-grid.js +2 -1
  201. package/dist/components/measured-grid.js.map +1 -1
  202. package/dist/components/mini-calendar.js +3 -5
  203. package/dist/components/mini-calendar.js.map +1 -1
  204. package/dist/components/modal.js +3 -1
  205. package/dist/components/modal.js.map +1 -1
  206. package/dist/components/month-grid.d.ts +55 -0
  207. package/dist/components/month-grid.js +148 -0
  208. package/dist/components/month-grid.js.map +1 -0
  209. package/dist/components/month-picker.d.ts +36 -4
  210. package/dist/components/month-picker.js +123 -146
  211. package/dist/components/month-picker.js.map +1 -1
  212. package/dist/components/multi-select.d.ts +2 -2
  213. package/dist/components/multi-select.js +11 -6
  214. package/dist/components/multi-select.js.map +1 -1
  215. package/dist/components/nav-pills.d.ts +1 -1
  216. package/dist/components/nav-pills.js.map +1 -1
  217. package/dist/components/picker-sheet.js +2 -1
  218. package/dist/components/picker-sheet.js.map +1 -1
  219. package/dist/components/pie-chart-labels.d.ts +7 -0
  220. package/dist/components/pie-chart-labels.js +1 -0
  221. package/dist/components/pie-chart-labels.js.map +1 -1
  222. package/dist/components/pie-chart.d.ts +5 -3
  223. package/dist/components/pie-chart.js +7 -22
  224. package/dist/components/pie-chart.js.map +1 -1
  225. package/dist/components/popover.d.ts +3 -0
  226. package/dist/components/popover.js +7 -1
  227. package/dist/components/popover.js.map +1 -1
  228. package/dist/components/row-actions.js +2 -1
  229. package/dist/components/row-actions.js.map +1 -1
  230. package/dist/components/series-chart-axes.d.ts +4 -4
  231. package/dist/components/series-chart-axes.js.map +1 -1
  232. package/dist/components/series-chart-labels.d.ts +7 -4
  233. package/dist/components/series-chart-labels.js.map +1 -1
  234. package/dist/components/series-chart.d.ts +92 -23
  235. package/dist/components/series-chart.js +74 -30
  236. package/dist/components/series-chart.js.map +1 -1
  237. package/dist/components/share-card.js +3 -3
  238. package/dist/components/share-card.js.map +1 -1
  239. package/dist/components/tabs-labels.d.ts +2 -0
  240. package/dist/components/tabs-labels.js +11 -0
  241. package/dist/components/tabs-labels.js.map +1 -0
  242. package/dist/components/tabs.d.ts +1 -1
  243. package/dist/components/tabs.js +1 -1
  244. package/dist/components/tabs.js.map +1 -1
  245. package/dist/components/toggle-legend.d.ts +2 -2
  246. package/dist/components/toggle-legend.js +6 -6
  247. package/dist/components/toggle-legend.js.map +1 -1
  248. package/dist/components/translation-review-editor.d.ts +4 -2
  249. package/dist/components/translation-review-editor.js +2 -3
  250. package/dist/components/translation-review-editor.js.map +1 -1
  251. package/dist/components/translation-review.d.ts +2 -1
  252. package/dist/components/translation-review.js +2 -2
  253. package/dist/components/translation-review.js.map +1 -1
  254. package/dist/components/treemap-labels.d.ts +31 -0
  255. package/dist/components/treemap-labels.js +10 -0
  256. package/dist/components/treemap-labels.js.map +1 -0
  257. package/dist/components/treemap-layout.d.ts +62 -0
  258. package/dist/components/treemap-layout.js +126 -0
  259. package/dist/components/treemap-layout.js.map +1 -0
  260. package/dist/components/treemap.d.ts +167 -19
  261. package/dist/components/treemap.js +340 -100
  262. package/dist/components/treemap.js.map +1 -1
  263. package/dist/components/use-table-state.d.ts +5 -5
  264. package/dist/components/use-table-state.js +4 -1
  265. package/dist/components/use-table-state.js.map +1 -1
  266. package/dist/data-table.d.ts +1 -2
  267. package/dist/data-table.js +1 -4
  268. package/dist/data-table.js.map +1 -1
  269. package/dist/demo/demo-countdown.d.ts +0 -5
  270. package/dist/demo/demo-countdown.js +0 -4
  271. package/dist/demo/demo-countdown.js.map +1 -1
  272. package/dist/eslint/index.js +1 -1
  273. package/dist/eslint/role-utilities.d.ts +36 -7
  274. package/dist/eslint/role-utilities.js +42 -9
  275. package/dist/eslint/role-utilities.js.map +1 -1
  276. package/dist/feedback/feedback-dialog.d.ts +25 -16
  277. package/dist/feedback/feedback-dialog.js +6 -2
  278. package/dist/feedback/feedback-dialog.js.map +1 -1
  279. package/dist/feedback/feedback-mutation.d.ts +18 -0
  280. package/dist/feedback/feedback-mutation.js +8 -0
  281. package/dist/feedback/feedback-mutation.js.map +1 -0
  282. package/dist/feedback/feedback-page-link.d.ts +53 -0
  283. package/dist/feedback/feedback-page-link.js +37 -0
  284. package/dist/feedback/feedback-page-link.js.map +1 -0
  285. package/dist/feedback/feedback-public-list.d.ts +8 -4
  286. package/dist/feedback/feedback-public-list.js +2 -2
  287. package/dist/feedback/feedback-public-list.js.map +1 -1
  288. package/dist/feedback/feedback-replies.d.ts +3 -1
  289. package/dist/feedback/feedback-replies.js +5 -4
  290. package/dist/feedback/feedback-replies.js.map +1 -1
  291. package/dist/feedback/feedback-row-detail-labels.js +0 -3
  292. package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
  293. package/dist/feedback/feedback-row-detail.d.ts +33 -44
  294. package/dist/feedback/feedback-row-detail.js +28 -34
  295. package/dist/feedback/feedback-row-detail.js.map +1 -1
  296. package/dist/feedback/feedback-status-undo.d.ts +17 -14
  297. package/dist/feedback/feedback-status-undo.js +10 -15
  298. package/dist/feedback/feedback-status-undo.js.map +1 -1
  299. package/dist/feedback/feedback-submit-dialog.d.ts +1 -1
  300. package/dist/feedback/feedback-submit-dialog.js +1 -1
  301. package/dist/feedback/feedback-submit-dialog.js.map +1 -1
  302. package/dist/feedback/feedback-submit.js +9 -3
  303. package/dist/feedback/feedback-submit.js.map +1 -1
  304. package/dist/feedback/feedback-swipe.d.ts +1 -1
  305. package/dist/feedback/feedback-swipe.js.map +1 -1
  306. package/dist/feedback/feedback-table.d.ts +21 -9
  307. package/dist/feedback/feedback-table.js +45 -25
  308. package/dist/feedback/feedback-table.js.map +1 -1
  309. package/dist/feedback/feedback-thread-labels.d.ts +2 -2
  310. package/dist/feedback/feedback-thread-labels.js.map +1 -1
  311. package/dist/feedback/feedback-thread.d.ts +15 -23
  312. package/dist/feedback/feedback-thread.js +2 -1
  313. package/dist/feedback/feedback-thread.js.map +1 -1
  314. package/dist/feedback.d.ts +6 -6
  315. package/dist/feedback.js +90 -6
  316. package/dist/feedback.js.map +1 -1
  317. package/dist/hooks/use-focus-trap.d.ts +35 -0
  318. package/dist/hooks/use-focus-trap.js +6 -4
  319. package/dist/hooks/use-focus-trap.js.map +1 -1
  320. package/dist/hooks/use-hotkey.d.ts +5 -2
  321. package/dist/hooks/use-hotkey.js +5 -4
  322. package/dist/hooks/use-hotkey.js.map +1 -1
  323. package/dist/hooks/use-long-press.d.ts +7 -4
  324. package/dist/hooks/use-long-press.js +3 -0
  325. package/dist/hooks/use-long-press.js.map +1 -1
  326. package/dist/hooks/use-media-query.js +12 -4
  327. package/dist/hooks/use-media-query.js.map +1 -1
  328. package/dist/hooks/use-mounted.d.ts +22 -0
  329. package/dist/hooks/use-mounted.js +24 -0
  330. package/dist/hooks/use-mounted.js.map +1 -0
  331. package/dist/hooks/use-overlay-history.js +19 -3
  332. package/dist/hooks/use-overlay-history.js.map +1 -1
  333. package/dist/i18n/defaults.js +4 -9
  334. package/dist/i18n/defaults.js.map +1 -1
  335. package/dist/i18n/german.js +7 -18
  336. package/dist/i18n/german.js.map +1 -1
  337. package/dist/i18n/kit-labels.d.ts +9 -11
  338. package/dist/i18n/kit-labels.js.map +1 -1
  339. package/dist/i18n/locales/en.js +15 -64
  340. package/dist/i18n/locales/en.js.map +3 -3
  341. package/dist/i18n/locales/es.js +7 -18
  342. package/dist/i18n/locales/es.js.map +1 -1
  343. package/dist/i18n/locales/fr.js +20 -27
  344. package/dist/i18n/locales/fr.js.map +1 -1
  345. package/dist/i18n/locales/hu.js +9 -18
  346. package/dist/i18n/locales/hu.js.map +1 -1
  347. package/dist/i18n/locales/it.js +7 -19
  348. package/dist/i18n/locales/it.js.map +1 -1
  349. package/dist/i18n/locales/zh.js +8 -18
  350. package/dist/i18n/locales/zh.js.map +1 -1
  351. package/dist/i18n/review.js +12 -2
  352. package/dist/i18n/review.js.map +1 -1
  353. package/dist/i18n/shared-labels.js +0 -1
  354. package/dist/i18n/shared-labels.js.map +1 -1
  355. package/dist/index.d.ts +21 -23
  356. package/dist/index.js +50 -65
  357. package/dist/index.js.map +1 -1
  358. package/dist/landing/routing.d.ts +3 -1
  359. package/dist/landing/routing.js +4 -7
  360. package/dist/landing/routing.js.map +1 -1
  361. package/dist/lib/broadcast.d.ts +17 -0
  362. package/dist/lib/broadcast.js +30 -0
  363. package/dist/lib/broadcast.js.map +1 -0
  364. package/dist/lib/date-format.d.ts +37 -2
  365. package/dist/lib/date-format.js +34 -8
  366. package/dist/lib/date-format.js.map +1 -1
  367. package/dist/lib/day-format.d.ts +46 -0
  368. package/dist/lib/day-format.js +46 -0
  369. package/dist/lib/day-format.js.map +1 -0
  370. package/dist/lib/describe-failure.d.ts +14 -0
  371. package/dist/lib/describe-failure.js +9 -0
  372. package/dist/lib/describe-failure.js.map +1 -0
  373. package/dist/lib/direction.d.ts +16 -0
  374. package/dist/lib/direction.js +9 -1
  375. package/dist/lib/direction.js.map +1 -1
  376. package/dist/lib/focus-left.d.ts +63 -0
  377. package/dist/lib/focus-left.js +67 -0
  378. package/dist/lib/focus-left.js.map +1 -0
  379. package/dist/lib/format.js +5 -14
  380. package/dist/lib/format.js.map +1 -1
  381. package/dist/lib/http-status.d.ts +24 -0
  382. package/dist/lib/http-status.js +14 -0
  383. package/dist/lib/http-status.js.map +1 -0
  384. package/dist/lib/intl-cache.d.ts +14 -0
  385. package/dist/lib/intl-cache.js +15 -0
  386. package/dist/lib/intl-cache.js.map +1 -0
  387. package/dist/lib/iso-day.d.ts +11 -0
  388. package/dist/lib/iso-day.js +8 -0
  389. package/dist/lib/iso-day.js.map +1 -0
  390. package/dist/lib/lazy-with-fallback.d.ts +31 -0
  391. package/dist/lib/lazy-with-fallback.js +40 -0
  392. package/dist/lib/lazy-with-fallback.js.map +1 -0
  393. package/dist/lib/path-pattern.d.ts +34 -0
  394. package/dist/lib/path-pattern.js +24 -0
  395. package/dist/lib/path-pattern.js.map +1 -0
  396. package/dist/lib/reduced-motion.d.ts +2 -1
  397. package/dist/lib/reduced-motion.js.map +1 -1
  398. package/dist/lib/round.d.ts +2 -1
  399. package/dist/lib/round.js +2 -1
  400. package/dist/lib/round.js.map +1 -1
  401. package/dist/lib/safe-storage.d.ts +24 -5
  402. package/dist/lib/safe-storage.js +27 -2
  403. package/dist/lib/safe-storage.js.map +1 -1
  404. package/dist/lib/session-refresh.js +1 -1
  405. package/dist/lib/session-refresh.js.map +1 -1
  406. package/dist/lib/share-format.d.ts +13 -0
  407. package/dist/lib/share-format.js +10 -0
  408. package/dist/lib/share-format.js.map +1 -0
  409. package/dist/lib/text-case.d.ts +17 -0
  410. package/dist/lib/text-case.js +8 -0
  411. package/dist/lib/text-case.js.map +1 -0
  412. package/dist/lib/text-match.d.ts +29 -0
  413. package/dist/lib/text-match.js +20 -2
  414. package/dist/lib/text-match.js.map +1 -1
  415. package/dist/lib/thenable.d.ts +13 -0
  416. package/dist/lib/thenable.js +8 -0
  417. package/dist/lib/thenable.js.map +1 -0
  418. package/dist/lib/translation-review.d.ts +7 -2
  419. package/dist/lib/translation-review.js +4 -4
  420. package/dist/lib/translation-review.js.map +1 -1
  421. package/dist/notifications/device-zone-report.js +1 -1
  422. package/dist/notifications/device-zone-report.js.map +1 -1
  423. package/dist/notifications/notification-bell.d.ts +2 -1
  424. package/dist/notifications/notification-bell.js +3 -3
  425. package/dist/notifications/notification-bell.js.map +1 -1
  426. package/dist/notifications/notification-inbox.d.ts +10 -6
  427. package/dist/notifications/notification-inbox.js +26 -48
  428. package/dist/notifications/notification-inbox.js.map +1 -1
  429. package/dist/notifications/notification-parts.d.ts +3 -2
  430. package/dist/notifications/notification-parts.js +1 -3
  431. package/dist/notifications/notification-parts.js.map +1 -1
  432. package/dist/notifications/notification-types-setting.js +1 -1
  433. package/dist/notifications/notification-types-setting.js.map +1 -1
  434. package/dist/notifications/notifications-labels.d.ts +6 -0
  435. package/dist/notifications/notifications-labels.js +1 -0
  436. package/dist/notifications/notifications-labels.js.map +1 -1
  437. package/dist/notifications/push-device-setting.js +1 -1
  438. package/dist/notifications/push-device-setting.js.map +1 -1
  439. package/dist/notifications/push-devices-setting.d.ts +2 -1
  440. package/dist/notifications/push-devices-setting.js +27 -49
  441. package/dist/notifications/push-devices-setting.js.map +1 -1
  442. package/dist/notifications/quiet-hours-setting.d.ts +10 -3
  443. package/dist/notifications/quiet-hours-setting.js +65 -26
  444. package/dist/notifications/quiet-hours-setting.js.map +1 -1
  445. package/dist/notifications/unsubscribe-panel.js +4 -7
  446. package/dist/notifications/unsubscribe-panel.js.map +1 -1
  447. package/dist/notifications/use-push-device.d.ts +39 -1
  448. package/dist/notifications/use-push-device.js +28 -7
  449. package/dist/notifications/use-push-device.js.map +1 -1
  450. package/dist/offline/query-persistence.d.ts +3 -1
  451. package/dist/offline/query-persistence.js +19 -2
  452. package/dist/offline/query-persistence.js.map +1 -1
  453. package/dist/rhf/fields.d.ts +11 -4
  454. package/dist/rhf/fields.js.map +1 -1
  455. package/dist/search/command-palette.js +1 -1
  456. package/dist/search/command-palette.js.map +1 -1
  457. package/dist/search/global-search.js +19 -9
  458. package/dist/search/global-search.js.map +1 -1
  459. package/dist/search/search-index.d.ts +0 -6
  460. package/dist/search/search-index.js +0 -4
  461. package/dist/search/search-index.js.map +1 -1
  462. package/dist/search/use-command-key.d.ts +12 -1
  463. package/dist/search/use-command-key.js +3 -12
  464. package/dist/search/use-command-key.js.map +1 -1
  465. package/dist/search.d.ts +1 -1
  466. package/dist/search.js +6 -1
  467. package/dist/search.js.map +1 -1
  468. package/dist/settings/use-settings-focus.js +1 -0
  469. package/dist/settings/use-settings-focus.js.map +1 -1
  470. package/dist/shell/account-menu-language.d.ts +5 -3
  471. package/dist/shell/account-menu-language.js +2 -2
  472. package/dist/shell/account-menu-language.js.map +1 -1
  473. package/dist/shell/account-menu-text-size.d.ts +9 -6
  474. package/dist/shell/account-menu-text-size.js +2 -2
  475. package/dist/shell/account-menu-text-size.js.map +1 -1
  476. package/dist/shell/app-shell.d.ts +0 -10
  477. package/dist/shell/app-shell.js +1 -7
  478. package/dist/shell/app-shell.js.map +1 -1
  479. package/dist/shell/company-switcher.d.ts +1 -1
  480. package/dist/shell/company-switcher.js.map +1 -1
  481. package/dist/shell/dev-menu.d.ts +1 -1
  482. package/dist/shell/dev-menu.js +5 -18
  483. package/dist/shell/dev-menu.js.map +1 -1
  484. package/dist/shell/top-bar-actions.d.ts +1 -1
  485. package/dist/shell/top-bar-actions.js.map +1 -1
  486. package/dist/shell/top-bar-parts-labels.d.ts +1 -3
  487. package/dist/shell/top-bar-parts-labels.js +0 -1
  488. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  489. package/dist/shell.d.ts +7 -10
  490. package/dist/shell.js +14 -23
  491. package/dist/shell.js.map +1 -1
  492. package/dist/sync/engine.d.ts +30 -4
  493. package/dist/sync/engine.js +172 -52
  494. package/dist/sync/engine.js.map +1 -1
  495. package/dist/sync.d.ts +2 -2
  496. package/dist/sync.js +2 -10
  497. package/dist/sync.js.map +1 -1
  498. package/dist/testing/css-variables.js +3 -8
  499. package/dist/testing/css-variables.js.map +1 -1
  500. package/dist/theme/chart-palette.d.ts +0 -5
  501. package/dist/theme/chart-palette.js +0 -2
  502. package/dist/theme/chart-palette.js.map +1 -1
  503. package/dist/theme/contrast.d.ts +2 -1
  504. package/dist/theme/contrast.js +3 -8
  505. package/dist/theme/contrast.js.map +1 -1
  506. package/dist/theme/palette-store.js +6 -6
  507. package/dist/theme/palette-store.js.map +1 -1
  508. package/dist/theme/text-size.js +3 -8
  509. package/dist/theme/text-size.js.map +1 -1
  510. package/dist/theme/theme-store.js +3 -6
  511. package/dist/theme/theme-store.js.map +1 -1
  512. package/dist/tour/tour-catalogue.d.ts +7 -4
  513. package/dist/tour/tour-catalogue.js +12 -10
  514. package/dist/tour/tour-catalogue.js.map +1 -1
  515. package/dist/tour/tour-dock.d.ts +0 -2
  516. package/dist/tour/tour-dock.js +0 -2
  517. package/dist/tour/tour-dock.js.map +1 -1
  518. package/dist/tour/tour-gates.d.ts +4 -0
  519. package/dist/tour/tour-gates.js +14 -0
  520. package/dist/tour/tour-gates.js.map +1 -1
  521. package/dist/tour/tour-overlay.d.ts +27 -0
  522. package/dist/tour/tour-overlay.js +741 -0
  523. package/dist/tour/tour-overlay.js.map +1 -0
  524. package/dist/tour/tour.d.ts +13 -3
  525. package/dist/tour/tour.js +59 -781
  526. package/dist/tour/tour.js.map +1 -1
  527. package/dist/tour/use-tour-progress.js +1 -1
  528. package/dist/tour/use-tour-progress.js.map +1 -1
  529. package/dist/wizard/stepper-nav.d.ts +5 -1
  530. package/dist/wizard/stepper-nav.js.map +1 -1
  531. package/dist/wizard/types.d.ts +6 -2
  532. package/dist/wizard/types.js.map +1 -1
  533. package/dist/wizard/use-wizard.d.ts +3 -1
  534. package/dist/wizard/use-wizard.js.map +1 -1
  535. package/dist/wizard/validation.d.ts +3 -1
  536. package/dist/wizard/validation.js.map +1 -1
  537. package/package.json +10 -6
  538. package/src/account/account-parts.ts +5 -25
  539. package/src/account/data-export-setting-labels.ts +1 -1
  540. package/src/account/delete-account-setting-labels.ts +1 -1
  541. package/src/account/email-change-setting-labels.ts +1 -1
  542. package/src/account/passkeys-setting.tsx +60 -38
  543. package/src/account/sessions-setting.tsx +18 -12
  544. package/src/admin/admin-action-confirm.tsx +1 -5
  545. package/src/admin/admin-parts.ts +11 -25
  546. package/src/admin/mail-test-card-labels.ts +1 -1
  547. package/src/admin/plan-change-labels.ts +5 -23
  548. package/src/admin/plan-change.tsx +7 -44
  549. package/src/admin/reviewer-scope-editor.tsx +3 -3
  550. package/src/auth/auth-errors-labels.ts +23 -0
  551. package/src/auth/auth-errors.ts +11 -38
  552. package/src/auth/complete-name-dialog.tsx +4 -1
  553. package/src/auth/forgot-password-form-labels.ts +1 -1
  554. package/src/auth/forgot-password-form.tsx +11 -6
  555. package/src/auth/register-form-labels.ts +1 -1
  556. package/src/auth/reset-password-form-labels.ts +1 -1
  557. package/src/auth/reset-password-form.tsx +8 -4
  558. package/src/auth/sign-in-form-labels.ts +1 -1
  559. package/src/auth/status-parts.tsx +0 -6
  560. package/src/auth/verify-email-labels.ts +1 -1
  561. package/src/auth/verify-email.tsx +11 -6
  562. package/src/billing/cancel-subscription.tsx +15 -12
  563. package/src/billing/plan-card.tsx +18 -10
  564. package/src/billing/plan-change-labels.ts +66 -0
  565. package/src/billing/plan-switch.tsx +15 -12
  566. package/src/chart.ts +73 -6
  567. package/src/components/account-chips.tsx +20 -23
  568. package/src/components/alert-banner.tsx +82 -5
  569. package/src/components/amount-input.tsx +18 -7
  570. package/src/components/autocomplete.tsx +64 -70
  571. package/src/components/bulk-action-bar.tsx +70 -2
  572. package/src/components/button-look.ts +5 -5
  573. package/src/components/button.tsx +2 -2
  574. package/src/components/chart-edge.ts +34 -1
  575. package/src/components/chart-figure.tsx +35 -0
  576. package/src/components/chart-zoom-core.tsx +6 -5
  577. package/src/components/chart.tsx +26 -5
  578. package/src/components/combobox-core.tsx +293 -62
  579. package/src/components/combobox.tsx +183 -153
  580. package/src/components/copy-button.tsx +34 -23
  581. package/src/components/country-select.tsx +16 -11
  582. package/src/components/data-table-column-settings.tsx +52 -10
  583. package/src/components/data-table-filters.ts +6 -4
  584. package/src/components/data-table-fit.ts +19 -5
  585. package/src/components/data-table-groups.tsx +1 -1
  586. package/src/components/data-table-head.tsx +32 -22
  587. package/src/components/data-table-mobile.tsx +61 -26
  588. package/src/components/data-table-pagination.tsx +21 -6
  589. package/src/components/data-table-resize.ts +1 -1
  590. package/src/components/data-table-row-actions.tsx +3 -3
  591. package/src/components/data-table-row.tsx +25 -14
  592. package/src/components/data-table-selection.ts +1 -1
  593. package/src/components/data-table-shared.tsx +33 -1
  594. package/src/components/data-table-sort.ts +57 -2
  595. package/src/components/data-table-virtual.ts +32 -8
  596. package/src/components/data-table.tsx +239 -68
  597. package/src/components/date-field.tsx +66 -9
  598. package/src/components/date-picker.tsx +125 -49
  599. package/src/components/date-range-picker.tsx +71 -36
  600. package/src/components/error-boundary.tsx +53 -39
  601. package/src/components/field-base-labels.ts +20 -0
  602. package/src/components/field-base.tsx +13 -7
  603. package/src/components/form-actions.tsx +20 -5
  604. package/src/components/hover-menu.tsx +18 -8
  605. package/src/components/icon-button.tsx +14 -9
  606. package/src/components/inline-confirm.tsx +116 -0
  607. package/src/components/inline-entity-combobox.tsx +197 -153
  608. package/src/components/input.tsx +1 -1
  609. package/src/components/jump-calendar.tsx +30 -146
  610. package/src/components/legal-page.tsx +10 -7
  611. package/src/components/legal.tsx +4 -2
  612. package/src/components/lightbox.tsx +21 -8
  613. package/src/components/list.tsx +10 -4
  614. package/src/components/measured-grid.tsx +8 -4
  615. package/src/components/mini-calendar.tsx +6 -5
  616. package/src/components/modal.tsx +6 -1
  617. package/src/components/month-grid.tsx +229 -0
  618. package/src/components/month-picker.tsx +192 -200
  619. package/src/components/multi-select.tsx +21 -9
  620. package/src/components/nav-pills.tsx +1 -1
  621. package/src/components/picker-sheet.tsx +12 -9
  622. package/src/components/pie-chart-labels.ts +8 -0
  623. package/src/components/pie-chart.tsx +22 -28
  624. package/src/components/popover.tsx +18 -1
  625. package/src/components/row-actions.tsx +2 -1
  626. package/src/components/series-chart-axes.ts +9 -4
  627. package/src/components/series-chart-labels.ts +7 -4
  628. package/src/components/series-chart.tsx +253 -87
  629. package/src/components/share-card.tsx +6 -6
  630. package/src/components/tabs-labels.ts +13 -0
  631. package/src/components/tabs.tsx +2 -2
  632. package/src/components/toggle-legend.tsx +16 -11
  633. package/src/components/translation-review-editor.tsx +6 -5
  634. package/src/components/translation-review.tsx +4 -3
  635. package/src/components/treemap-labels.ts +47 -0
  636. package/src/components/treemap-layout.ts +210 -0
  637. package/src/components/treemap.tsx +780 -138
  638. package/src/components/use-table-state.ts +12 -9
  639. package/src/data-table.ts +1 -4
  640. package/src/demo/demo-countdown.ts +3 -8
  641. package/src/eslint/role-utilities.ts +97 -19
  642. package/src/feedback/feedback-dialog.tsx +30 -19
  643. package/src/feedback/feedback-mutation.ts +20 -0
  644. package/src/feedback/feedback-page-link.ts +90 -0
  645. package/src/feedback/feedback-public-list.tsx +13 -7
  646. package/src/feedback/feedback-replies.tsx +13 -6
  647. package/src/feedback/feedback-row-detail-labels.ts +0 -3
  648. package/src/feedback/feedback-row-detail.tsx +70 -84
  649. package/src/feedback/feedback-status-undo.ts +28 -28
  650. package/src/feedback/feedback-submit-dialog.tsx +2 -2
  651. package/src/feedback/feedback-submit.tsx +21 -7
  652. package/src/feedback/feedback-swipe.tsx +1 -1
  653. package/src/feedback/feedback-table.tsx +86 -38
  654. package/src/feedback/feedback-thread-labels.ts +2 -2
  655. package/src/feedback/feedback-thread.tsx +18 -26
  656. package/src/feedback.ts +89 -6
  657. package/src/hooks/use-focus-trap.ts +8 -24
  658. package/src/hooks/use-hotkey.ts +24 -7
  659. package/src/hooks/use-long-press.ts +16 -2
  660. package/src/hooks/use-media-query.ts +20 -4
  661. package/src/hooks/use-mounted.ts +39 -0
  662. package/src/hooks/use-overlay-history.ts +32 -3
  663. package/src/i18n/defaults.ts +4 -9
  664. package/src/i18n/german.ts +8 -19
  665. package/src/i18n/kit-labels.tsx +9 -11
  666. package/src/i18n/locales/es.ts +8 -19
  667. package/src/i18n/locales/fr.ts +21 -30
  668. package/src/i18n/locales/hu.ts +10 -19
  669. package/src/i18n/locales/it.ts +8 -20
  670. package/src/i18n/locales/zh.ts +9 -19
  671. package/src/i18n/review.ts +12 -2
  672. package/src/i18n/shared-labels.ts +0 -1
  673. package/src/index.ts +57 -49
  674. package/src/landing/routing.tsx +14 -10
  675. package/src/lib/broadcast.ts +52 -0
  676. package/src/lib/date-format.ts +89 -13
  677. package/src/lib/day-format.ts +96 -0
  678. package/src/lib/describe-failure.ts +18 -0
  679. package/src/lib/direction.ts +39 -0
  680. package/src/lib/focus-left.ts +156 -0
  681. package/src/lib/format.ts +5 -17
  682. package/src/lib/http-status.ts +38 -0
  683. package/src/lib/intl-cache.ts +25 -0
  684. package/src/lib/iso-day.ts +13 -0
  685. package/src/lib/lazy-with-fallback.ts +82 -0
  686. package/src/lib/path-pattern.ts +55 -0
  687. package/src/lib/reduced-motion.ts +2 -1
  688. package/src/lib/round.ts +7 -2
  689. package/src/lib/safe-storage.ts +48 -6
  690. package/src/lib/session-refresh.ts +1 -1
  691. package/src/lib/share-format.ts +18 -0
  692. package/src/lib/text-case.ts +19 -0
  693. package/src/lib/text-match.ts +57 -2
  694. package/src/lib/thenable.ts +19 -0
  695. package/src/lib/translation-review.ts +13 -5
  696. package/src/notifications/device-zone-report.ts +1 -1
  697. package/src/notifications/notification-bell.tsx +7 -4
  698. package/src/notifications/notification-inbox.tsx +40 -58
  699. package/src/notifications/notification-parts.tsx +3 -4
  700. package/src/notifications/notification-types-setting.tsx +1 -1
  701. package/src/notifications/notifications-labels.ts +7 -0
  702. package/src/notifications/push-device-setting.tsx +1 -1
  703. package/src/notifications/push-devices-setting.tsx +30 -55
  704. package/src/notifications/quiet-hours-setting.tsx +93 -31
  705. package/src/notifications/unsubscribe-panel.tsx +4 -7
  706. package/src/notifications/use-push-device.ts +76 -10
  707. package/src/offline/query-persistence.ts +35 -3
  708. package/src/rhf/fields.tsx +11 -4
  709. package/src/search/command-palette.tsx +2 -4
  710. package/src/search/global-search.tsx +36 -15
  711. package/src/search/search-index.ts +0 -15
  712. package/src/search/use-command-key.ts +13 -12
  713. package/src/search.ts +10 -1
  714. package/src/settings/use-settings-focus.ts +3 -0
  715. package/src/shell/account-menu-language.tsx +6 -4
  716. package/src/shell/account-menu-text-size.tsx +10 -7
  717. package/src/shell/app-shell.tsx +0 -13
  718. package/src/shell/company-switcher.tsx +1 -1
  719. package/src/shell/dev-menu.tsx +8 -22
  720. package/src/shell/top-bar-actions.tsx +1 -1
  721. package/src/shell/top-bar-parts-labels.ts +1 -4
  722. package/src/shell.ts +21 -17
  723. package/src/sync/engine.ts +339 -61
  724. package/src/sync.ts +2 -8
  725. package/src/testing/css-variables.ts +8 -9
  726. package/src/theme/chart-palette.ts +0 -2
  727. package/src/theme/contrast.ts +8 -9
  728. package/src/theme/palette-store.ts +9 -9
  729. package/src/theme/text-size.ts +6 -8
  730. package/src/theme/theme-store.ts +7 -9
  731. package/src/tour/tour-catalogue.tsx +26 -15
  732. package/src/tour/tour-dock.ts +0 -2
  733. package/src/tour/tour-gates.ts +23 -0
  734. package/src/tour/tour-overlay.tsx +1170 -0
  735. package/src/tour/tour.tsx +108 -1202
  736. package/src/tour/use-tour-progress.ts +1 -1
  737. package/src/wizard/stepper-nav.tsx +3 -1
  738. package/src/wizard/types.ts +11 -2
  739. package/src/wizard/use-wizard.ts +2 -1
  740. package/src/wizard/validation.ts +8 -2
  741. package/tokens.css +6 -5
  742. package/dist/components/field-sync-labels.d.ts +0 -2
  743. package/dist/components/field-sync-labels.js +0 -12
  744. package/dist/components/field-sync-labels.js.map +0 -1
  745. package/dist/components/field-sync.d.ts +0 -164
  746. package/dist/components/field-sync.js +0 -269
  747. package/dist/components/field-sync.js.map +0 -1
  748. package/dist/components/section-nav.d.ts +0 -37
  749. package/dist/components/section-nav.js +0 -33
  750. package/dist/components/section-nav.js.map +0 -1
  751. package/dist/components/sign-chip-labels.d.ts +0 -2
  752. package/dist/components/sign-chip-labels.js +0 -11
  753. package/dist/components/sign-chip-labels.js.map +0 -1
  754. package/dist/components/sign-chip.d.ts +0 -68
  755. package/dist/components/sign-chip.js +0 -47
  756. package/dist/components/sign-chip.js.map +0 -1
  757. package/dist/components/ui-labels.js.map +0 -1
  758. package/dist/lib/isin.d.ts +0 -28
  759. package/dist/lib/isin.js +0 -36
  760. package/dist/lib/isin.js.map +0 -1
  761. package/dist/shell/dev-switchers.d.ts +0 -6
  762. package/dist/shell/dev-switchers.js +0 -12
  763. package/dist/shell/dev-switchers.js.map +0 -1
  764. package/dist/shell/role-switcher.d.ts +0 -21
  765. package/dist/shell/role-switcher.js +0 -31
  766. package/dist/shell/role-switcher.js.map +0 -1
  767. package/src/components/field-sync-labels.ts +0 -13
  768. package/src/components/field-sync.tsx +0 -482
  769. package/src/components/section-nav.tsx +0 -65
  770. package/src/components/sign-chip-labels.ts +0 -12
  771. package/src/components/sign-chip.tsx +0 -124
  772. package/src/components/ui-labels.ts +0 -24
  773. package/src/lib/isin.ts +0 -62
  774. package/src/shell/dev-switchers.tsx +0 -18
  775. package/src/shell/role-switcher.tsx +0 -46
@@ -2,7 +2,7 @@
2
2
  // catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one
3
3
  // chunk like the other languages (0.34, KS U8). ./register-form re-exports them.
4
4
 
5
- import { englishRateLimited } from "./auth-errors";
5
+ import { englishRateLimited } from "./auth-errors-labels";
6
6
  import type { RegisterLabels } from "./register-form";
7
7
 
8
8
  /** `Required`: every key, the 0.30 one included, has its English here. */
@@ -3,7 +3,7 @@
3
3
  // loads as one chunk like the other languages (0.34, KS U8). ./reset-password-form
4
4
  // re-exports them.
5
5
 
6
- import { englishRateLimited } from "./auth-errors";
6
+ import { englishRateLimited } from "./auth-errors-labels";
7
7
  import type { ResetPasswordLabels } from "./reset-password-form";
8
8
 
9
9
  /** `Required`: every key, the 0.30 one included, has its English here. */
@@ -2,6 +2,7 @@ import { useEffect, useId, useRef, useState } from "react";
2
2
  import type { ComponentPropsWithRef, FormEvent, ReactNode } from "react";
3
3
  import { CheckCircle2, XCircle } from "lucide-react";
4
4
  import { cn } from "../lib/cn";
5
+ import { describeFailure } from "../lib/describe-failure";
5
6
  import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
6
7
  import { AlertBanner } from "../components/alert-banner";
7
8
  import { LoadingState } from "../components/loading-state";
@@ -291,12 +292,15 @@ export function ResetPasswordForm({
291
292
  setPhase({ token, phase: { kind: "invalid" } });
292
293
  return;
293
294
  }
294
- // The app's words first, then the throttle's, then the kit's catch-all.
295
+ // The app's words first, then the throttle's, then the kit's catch-all — an app's
296
+ // "" is no words (refactor audit 2026-10-30, DUP-14: `??` drew an empty alert).
295
297
  setFailure(
296
- describeError?.(error) ??
297
- (isRateLimited(error)
298
+ describeFailure(
299
+ describeError?.(error),
300
+ isRateLimited(error)
298
301
  ? (labels.rateLimited ?? DEFAULT_RESET_PASSWORD_LABELS.rateLimited)(retryAfterSeconds(error))
299
- : labels.failed),
302
+ : labels.failed,
303
+ ),
300
304
  );
301
305
  },
302
306
  );
@@ -2,7 +2,7 @@
2
2
  // catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one
3
3
  // chunk like the other languages (0.34, KS U8). ./sign-in-form re-exports them.
4
4
 
5
- import { englishRateLimited } from "./auth-errors";
5
+ import { englishRateLimited } from "./auth-errors-labels";
6
6
  import type { SignInLabels } from "./sign-in-form";
7
7
 
8
8
  /** `Required`: every key, the 0.30 ones included, has its English here. */
@@ -91,12 +91,6 @@ export function useOncePerKey<T>(
91
91
  }, [key]);
92
92
  }
93
93
 
94
- /** Whether a callback's return is a promise to wait for. A callback that returns
95
- * nothing is done when it returns. */
96
- export function isThenable(value: unknown): value is PromiseLike<unknown> {
97
- return typeof (value as PromiseLike<unknown> | null)?.then === "function";
98
- }
99
-
100
94
  /**
101
95
  * Move focus to `ref` when `active` turns true — the outcome a person's own submit led
102
96
  * to ("If an account exists … the link is on its way", "Your password has been
@@ -2,7 +2,7 @@
2
2
  // catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one
3
3
  // chunk like the other languages (0.34, KS U8). ./verify-email re-exports them.
4
4
 
5
- import { englishRateLimited } from "./auth-errors";
5
+ import { englishRateLimited } from "./auth-errors-labels";
6
6
  import type { VerifyEmailLabels } from "./verify-email";
7
7
 
8
8
  export const DEFAULT_VERIFY_EMAIL_LABELS: VerifyEmailLabels = {
@@ -2,13 +2,15 @@ import { useEffect, useState } from "react";
2
2
  import type { ComponentPropsWithRef, ReactNode } from "react";
3
3
  import { CheckCircle2, MailWarning, TimerOff, XCircle } from "lucide-react";
4
4
  import { cn } from "../lib/cn";
5
+ import { describeFailure } from "../lib/describe-failure";
5
6
  import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
6
7
  import { useAnnounce } from "../hooks/use-announce";
7
8
  import { AlertBanner } from "../components/alert-banner";
8
9
  import { LoadingState } from "../components/loading-state";
9
10
  import { Button } from "../components/button";
10
11
  import { EmptyState } from "../components/empty-state";
11
- import { OUTCOME_CLASS, STATUS_HEADING_CLASS, isThenable, useOncePerKey } from "./status-parts";
12
+ import { isThenable } from "../lib/thenable";
13
+ import { OUTCOME_CLASS, STATUS_HEADING_CLASS, useOncePerKey } from "./status-parts";
12
14
  import { authErrorCode, englishRateLimited, isRateLimited, retryAfterSeconds } from "./auth-errors";
13
15
  import type { AuthHeadingLevel } from "./status-parts";
14
16
  import { DEFAULT_VERIFY_EMAIL_LABELS } from "./verify-email-labels";
@@ -150,13 +152,16 @@ function ResendStatus({
150
152
  labels: VerifyEmailLabels;
151
153
  className?: string;
152
154
  }) {
153
- // The app's words first, then the throttle's, then the kit's catch-all.
155
+ // The app's words first, then the throttle's, then the kit's catch-all — an app's ""
156
+ // is no words (refactor audit 2026-10-30, DUP-14: `??` printed an empty status).
154
157
  const failed =
155
158
  phase === "failed"
156
- ? (describeError?.(error) ??
157
- (isRateLimited(error)
158
- ? (labels.rateLimited ?? englishRateLimited)(retryAfterSeconds(error))
159
- : labels.resendError))
159
+ ? describeFailure(
160
+ describeError?.(error),
161
+ isRateLimited(error)
162
+ ? (labels.rateLimited ?? englishRateLimited)(retryAfterSeconds(error))
163
+ : labels.resendError,
164
+ )
160
165
  : "";
161
166
  return (
162
167
  <span role="status" className={cn(phase === "failed" ? "text-danger" : "text-success", className)}>
@@ -1,7 +1,7 @@
1
- import { useKitLabels, useKitLocale } from "../i18n/kit-labels";
1
+ import { useKitLabels } from "../i18n/kit-labels";
2
2
  import type { LabelOverride } from "../i18n/kit-labels";
3
3
  import { DEFAULT_COMMON_LABELS } from "../i18n/shared-labels";
4
- import { formatDate } from "../lib/format";
4
+ import { useDayFormatter } from "../lib/day-format";
5
5
  import type { DateInput } from "../lib/format";
6
6
  import { Button } from "../components/button";
7
7
  import { DialogFrame } from "../components/dialog-frame";
@@ -11,11 +11,14 @@ import type { BillingLabels } from "./billing-labels";
11
11
 
12
12
  export interface CancelSubscriptionConfirmProps {
13
13
  open: boolean;
14
- /** `false` when the admin dismisses it — Back, Escape, the backdrop. Confirm leaves it
15
- * open: close it once `POST /billing/cancel` answers. */
16
- onOpenChange: (open: boolean) => void;
17
- /** The overview's `current_period_end`: the day the subscription ends. Formatted with
18
- * the kit's date formatter (`formatDate`, `"medium"`). */
14
+ /** The admin dismissed it — Back, Escape, the backdrop. Confirm leaves it open: close it
15
+ * once `POST /billing/cancel` answers. 0.52: every other kit dialog's `onClose`
16
+ * (CONTRIBUTING §4; refactor audit 2026-10-30, API-5); required since 0.53 removed
17
+ * `onOpenChange` (deprecated in 0.52). */
18
+ onClose: () => void;
19
+ /** The overview's `current_period_end`: the day the subscription ends, in a sentence —
20
+ * the `<UiKitProvider formatDate>` (the app's date preference) when it set one, else the
21
+ * kit's `formatDate`, `"medium"`, in the provider's locale and `timeZone` (0.52). */
19
22
  periodEnd: DateInput;
20
23
  /** Confirm: the app's `POST /billing/cancel` (server-kit 0.14, §16.3). */
21
24
  onConfirm: () => void;
@@ -38,7 +41,7 @@ export interface CancelSubscriptionConfirmProps {
38
41
  *
39
42
  * <CancelSubscriptionConfirm
40
43
  * open={asking}
41
- * onOpenChange={setAsking}
44
+ * onClose={() => setAsking(false)}
42
45
  * periodEnd={overview.current_period_end}
43
46
  * pending={cancel.isPending}
44
47
  * onConfirm={() => cancel.mutate()}
@@ -54,7 +57,7 @@ export interface CancelSubscriptionConfirmProps {
54
57
  */
55
58
  export function CancelSubscriptionConfirm({
56
59
  open,
57
- onOpenChange,
60
+ onClose,
58
61
  periodEnd,
59
62
  onConfirm,
60
63
  pending = false,
@@ -63,14 +66,14 @@ export function CancelSubscriptionConfirm({
63
66
  }: CancelSubscriptionConfirmProps) {
64
67
  const labels = useBillingLabels(labelsProp);
65
68
  const common = useKitLabels("common", DEFAULT_COMMON_LABELS);
66
- const locale = useKitLocale(localeProp);
69
+ const day = useDayFormatter(undefined, localeProp);
67
70
 
68
71
  return (
69
72
  <DialogFrame
70
73
  open={open}
71
74
  title={labels.cancelConfirmTitle}
72
- description={labels.cancelConfirmBody(formatDate(periodEnd, "medium", { locale }))}
73
- onClose={() => onOpenChange(false)}
75
+ description={labels.cancelConfirmBody(day(periodEnd))}
76
+ onClose={onClose}
74
77
  busy={pending}
75
78
  data-cancel-subscription-confirm=""
76
79
  actions={(close) => (
@@ -489,9 +489,7 @@ export function PlanPicker({
489
489
  {permanentGrant && !switching && (
490
490
  <GrantWarningConfirm
491
491
  open={warned !== null}
492
- onOpenChange={(open) => {
493
- if (!open) setWarned(null);
494
- }}
492
+ onClose={() => setWarned(null)}
495
493
  onConfirm={() => {
496
494
  if (warned) onChoose(warned);
497
495
  }}
@@ -505,8 +503,10 @@ export function PlanPicker({
505
503
  export interface GrantWarningConfirmProps {
506
504
  /** Shown, controlled. */
507
505
  open: boolean;
508
- /** `false` on "Back", Escape, the backdrop — and after "Buy anyway". */
509
- onOpenChange: (open: boolean) => void;
506
+ /** "Back", Escape, the backdrop — and after "Buy anyway". 0.52: every other kit
507
+ * dialog's `onClose` (CONTRIBUTING §4; refactor audit 2026-10-30, API-5); required
508
+ * since 0.53 removed `onOpenChange` (deprecated in 0.52). */
509
+ onClose: () => void;
510
510
  /** "Buy anyway": the app opens its checkout. The dialog closes itself after it. */
511
511
  onConfirm: () => void;
512
512
  /** Prop > `<UiKitProvider labels={{ billing }}>` > English: `grantWarningTitle`,
@@ -523,7 +523,7 @@ export interface GrantWarningConfirmProps {
523
523
  * to a checkout — show this before that checkout, so a permanent-grant holder is still
524
524
  * warned. Carries `data-grant-warning`.
525
525
  */
526
- export function GrantWarningConfirm({ open, onOpenChange, onConfirm, labels: labelsProp }: GrantWarningConfirmProps) {
526
+ export function GrantWarningConfirm({ open, onClose, onConfirm, labels: labelsProp }: GrantWarningConfirmProps) {
527
527
  const labels = useBillingLabels(labelsProp);
528
528
  const common = useKitLabels("common", DEFAULT_COMMON_LABELS);
529
529
  return (
@@ -531,18 +531,26 @@ export function GrantWarningConfirm({ open, onOpenChange, onConfirm, labels: lab
531
531
  open={open}
532
532
  title={labels.grantWarningTitle}
533
533
  description={labels.grantWarningBody}
534
- onClose={() => onOpenChange(false)}
534
+ onClose={onClose}
535
535
  data-grant-warning=""
536
- actions={(close) => (
536
+ actions={(lower) => (
537
537
  <>
538
- <Button variant="secondary" onClick={close}>
538
+ <Button variant="secondary" onClick={lower}>
539
539
  {common.back}
540
540
  </Button>
541
541
  <Button
542
542
  variant="default"
543
543
  onClick={() => {
544
+ // Already closed, and lowering: a second press is no second checkout, for an
545
+ // app that shows this dialog itself as much as for PlanPicker.
546
+ if (!open) return;
544
547
  onConfirm();
545
- onOpenChange(false);
548
+ // The caller's close, at once — not `lower`, the panel's animated one, which
549
+ // reports the close 220 ms later. PlanPicker clears the warned choice in it,
550
+ // and the lowering panel is not inert: a double click on "Buy anyway" opened
551
+ // the checkout twice (0.52 code review, plan-card.tsx). The caller's `open`
552
+ // turning false still plays the exit.
553
+ onClose();
546
554
  }}
547
555
  >
548
556
  {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
+ };
@@ -3,13 +3,14 @@ import type { LabelOverride } from "../i18n/kit-labels";
3
3
  import { DEFAULT_COMMON_LABELS } from "../i18n/shared-labels";
4
4
  import { pluralForm } from "../i18n/plurals";
5
5
  import type { PluralForms } from "../i18n/plurals";
6
- import { formatDate, formatMoney, formatNumber } from "../lib/format";
6
+ import { useDayFormatter } from "../lib/day-format";
7
+ import { formatMoney, formatNumber } from "../lib/format";
7
8
  import { AlertBanner } from "../components/alert-banner";
8
9
  import { Button } from "../components/button";
9
10
  import { DialogFrame } from "../components/dialog-frame";
10
11
  import { Spinner } from "../components/spinner";
11
12
  import { COMMIT_EXCEPT_BILLING } from "../components/write-lock";
12
- import { DEFAULT_PLAN_CHANGE_LABELS } from "../admin/plan-change-labels";
13
+ import { DEFAULT_PLAN_CHANGE_LABELS } from "./plan-change-labels";
13
14
  import { useBillingLabels } from "./billing-labels";
14
15
  import type { BillingLabels } from "./billing-labels";
15
16
  import type { PlanSwitchPreview } from "./billing-overview";
@@ -38,9 +39,11 @@ export interface PlanSwitchSide {
38
39
 
39
40
  export interface PlanSwitchConfirmProps {
40
41
  open: boolean;
41
- /** `false` when the payer dismisses it — Cancel, Escape, the backdrop. Confirm leaves
42
- * it open: close it once the switch answers. */
43
- onOpenChange: (open: boolean) => void;
42
+ /** The payer dismissed it — Cancel, Escape, the backdrop. Confirm leaves it open: close
43
+ * it once the switch answers. 0.52: every other kit dialog's `onClose` (CONTRIBUTING
44
+ * §4; refactor audit 2026-10-30, API-5); required since 0.53 removed `onOpenChange`
45
+ * (deprecated in 0.52). */
46
+ onClose: () => void;
44
47
  /** What the payer pays now: the overview's `paid`. */
45
48
  from: PlanSwitchSide;
46
49
  /** The pick. */
@@ -64,7 +67,8 @@ export interface PlanSwitchConfirmProps {
64
67
  formatLimit?: (dimension: string, value: number) => string;
65
68
  /** Confirm: the app's `POST /billing/plan` with `{plan, interval}` of `to`. */
66
69
  onConfirm: () => void;
67
- /** The figures' and the date's locale. Default: the provider's. */
70
+ /** The figures' and the date's locale. Default: the provider's. The next charge's date
71
+ * is written by the `<UiKitProvider formatDate>` when the app set one (0.52). */
68
72
  locale?: string;
69
73
  /**
70
74
  * 0.42 (§16.2 decision 5, §16.8 B): the payer's free grant runs without an end —
@@ -88,7 +92,7 @@ export interface PlanSwitchConfirmProps {
88
92
  * const preview = useMutation({ mutationFn: api.previewPlanSwitch });
89
93
  * <PlanSwitchConfirm
90
94
  * open={pick !== null}
91
- * onOpenChange={(open) => !open && setPick(null)}
95
+ * onClose={() => setPick(null)}
92
96
  * from={overview.paid}
93
97
  * to={pick}
94
98
  * preview={preview.data}
@@ -103,7 +107,7 @@ export interface PlanSwitchConfirmProps {
103
107
  */
104
108
  export function PlanSwitchConfirm({
105
109
  open,
106
- onOpenChange,
110
+ onClose,
107
111
  from,
108
112
  to,
109
113
  preview,
@@ -120,6 +124,7 @@ export function PlanSwitchConfirm({
120
124
  const planChange = useKitLabels("planChange", DEFAULT_PLAN_CHANGE_LABELS);
121
125
  const common = useKitLabels("common", DEFAULT_COMMON_LABELS);
122
126
  const locale = useKitLocale(localeProp);
127
+ const day = useDayFormatter(undefined, localeProp);
123
128
 
124
129
  const period = (interval: BillingInterval) => (interval === "year" ? labels.yearly : labels.monthly);
125
130
  const side = (s: PlanSwitchSide) => `${planName(s.plan.toLowerCase())} (${period(s.interval)})`;
@@ -149,7 +154,7 @@ export function PlanSwitchConfirm({
149
154
  open={open}
150
155
  title={labels.switchTitle}
151
156
  description={labels.switchFromTo(side(from), side(to))}
152
- onClose={() => onOpenChange(false)}
157
+ onClose={onClose}
153
158
  busy={pending}
154
159
  // A preview that loads is busy too, but holds nothing: Cancel stays a way out.
155
160
  aria-busy={preview === undefined || undefined}
@@ -189,9 +194,7 @@ export function PlanSwitchConfirm({
189
194
  </dd>
190
195
  {preview.next_billed_at && preview.next_minor != null && (
191
196
  <>
192
- <dt className="text-secondary">
193
- {labels.switchNextCharge(formatDate(preview.next_billed_at, "medium", { locale }))}
194
- </dt>
197
+ <dt className="text-secondary">{labels.switchNextCharge(day(preview.next_billed_at))}</dt>
195
198
  <dd className="text-right tabular-nums">{money(preview.next_minor, preview.currency)}</dd>
196
199
  </>
197
200
  )}
package/src/chart.ts CHANGED
@@ -2,22 +2,78 @@
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
- export * from "./theme/chart-palette";
13
+ // Named, not `*`, for chart-palette, series-chart and toggle-legend: 0.53 took the slice's
14
+ // share of the 55 names no app reads off the surface (deprecated in 0.52, refactor audit
15
+ // 2026-10-30, API-4) — `EDGE_MIN_CONTRAST`, `resolveTooltipPlacement`, `STROKE_PATTERNS`,
16
+ // which their modules keep for the kit's own use.
17
+ export {
18
+ PALETTE_SIZE,
19
+ CVD_ORDER,
20
+ paletteFor,
21
+ CHART_COLORS,
22
+ CHART_ROLES,
23
+ CHART_MUTED_HEX,
24
+ chartEdge,
25
+ PALETTE_HEX,
26
+ HEATMAP_HEX,
27
+ lerpHex,
28
+ textOn,
29
+ type PaletteForOptions,
30
+ type HeatStops,
31
+ } from "./theme/chart-palette";
13
32
 
14
33
  // 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.
34
+ // derives it from the package rather than from a copy. 0.52: its `treemap` label namespace.
16
35
  export * from "./components/treemap";
36
+ export * from "./components/treemap-labels";
17
37
 
18
38
  // lenkbank's zoomable series chart, its synced x-zoom, the toggle legend and the
19
39
  // mirrored-pair axis geometry — moved here so the apps derive them from the package.
20
- export * from "./components/series-chart";
40
+ export {
41
+ AXIS_TICK_WIDTH,
42
+ AXIS_TITLE_STRIP,
43
+ anchoredBand,
44
+ axisBandWidth,
45
+ mergeSeries,
46
+ oneAxis,
47
+ padBand,
48
+ paddedDomain,
49
+ seriesKey,
50
+ soleSeriesColor,
51
+ visibleSeries,
52
+ seriesLegendEntries,
53
+ StaticSeriesChart,
54
+ SeriesChart,
55
+ type TimeTickUnit,
56
+ type SeriesChartAxisBudget,
57
+ type SeriesSource,
58
+ type SeriesChartSeries,
59
+ type SeriesChartType,
60
+ type SeriesChartPoint,
61
+ type SeriesChartRow,
62
+ type SeriesChartXValue,
63
+ type SeriesChartTickValues,
64
+ type SeriesChartAxis,
65
+ type SeriesChartXTick,
66
+ type SeriesChartX,
67
+ type SeriesChartTooltipPlacement,
68
+ type SeriesChartTooltip,
69
+ type SeriesChartSpan,
70
+ type SeriesChartTone,
71
+ type SeriesChartReference,
72
+ type SeriesChartMarker,
73
+ type SeriesChartHit,
74
+ type SeriesChartProps,
75
+ type SeriesLegendAxes,
76
+ } from "./components/series-chart";
21
77
  // 0.32.1 (keksdose's 0.32 report): the height every chart takes, for an app's wrappers.
22
78
  export type { ChartHeight } from "./components/chart-height";
23
79
  // SharedXZoom and the zoom's types: the public face of ./chart-zoom-core, whose arithmetic
@@ -27,7 +83,18 @@ export * from "./components/chart-zoom";
27
83
  // packaging contract reads this entry's own imports to know which modules may import
28
84
  // recharts, so chart-zoom-core has to be one of them (MOD-6).
29
85
  export { SharedXZoom } from "./components/chart-zoom-core";
30
- export * from "./components/toggle-legend";
86
+ export {
87
+ strokeDash,
88
+ STEP_DASH,
89
+ toggleHidden,
90
+ ToggleLegend,
91
+ StaticLegend,
92
+ LegendColumn,
93
+ LegendGroup,
94
+ type LegendEntry,
95
+ type ToggleLegendProps,
96
+ type StaticLegendProps,
97
+ } from "./components/toggle-legend";
31
98
  export * from "./components/facing-pair";
32
99
  export * from "./components/series-chart-labels";
33
100
 
@@ -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 (