@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
@@ -18,7 +18,8 @@ import { AdminActionConfirm } from "./admin-action-confirm";
18
18
  import type { AdminActionConfirmValues } from "./admin-action-confirm";
19
19
  import { personLabel, useDayText } from "./admin-parts";
20
20
  import type { AdminPerson, MaybePromise } from "./admin-parts";
21
- import { DEFAULT_PLAN_CHANGE_LABELS } from "./plan-change-labels";
21
+ import { DEFAULT_PLAN_CHANGE_LABELS } from "../billing/plan-change-labels";
22
+ import type { PlanChangeLabels } from "../billing/plan-change-labels";
22
23
 
23
24
  /**
24
25
  * The operator's plan parts (docs/billing-harmonization.md §14.12, decision 27):
@@ -34,49 +35,11 @@ import { DEFAULT_PLAN_CHANGE_LABELS } from "./plan-change-labels";
34
35
  * whatever the billing switch says.
35
36
  */
36
37
 
37
- /** The `planChange` namespace: the column, the grant dialog and the result's lines. */
38
- export interface PlanChangeLabels {
39
- /** The column's header: "Plan". */
40
- column: string;
41
- /** The dialog's title: "Change plan". */
42
- title: string;
43
- /** Its confirm button: "Change plan". */
44
- confirm: string;
45
- /** The plan select's label: "Plan". */
46
- plan: string;
47
- /** The line over the select: "Current plan: Free". */
48
- current: (plan: string) => string;
49
- /** Under the select — the fact that is not on the button. */
50
- keepsItems: string;
51
- /** The end of a free grant's field: "Free until". */
52
- until: string;
53
- /** Under it. */
54
- untilHint: string;
55
- /** Why the confirm is held while nothing would change. */
56
- needsChange: string;
57
- /** The result: the plan moved from one to another. */
58
- changed: (from: string, to: string) => string;
59
- /** The result: an account with no plan before, or the same plan again. */
60
- set: (to: string) => string;
61
- /** The result: a running beta kept its own end (§12.34); only the plan moved. */
62
- keptBeta: string;
63
- /** The result: the grant runs until `date` (formatted). */
64
- untilDone: (date: string) => string;
65
- /** The result: the account owns more than the new plan allows. */
66
- overLimit: string;
67
- /**
68
- * The column's usage, spelled out (its tooltip): "1 of 5 budgets". Figures arrive
69
- * formatted; `dimension` is the app's word, as `usage.label` gives it — since 0.33.1
70
- * in the form the LIMIT takes when the label gives its plural forms ("1 of 1 budget",
71
- * "1 of 5 budgets"): in every shipped language the word follows the limit, or heads
72
- * the line in German, whose `von` would want a dative plural no app form carries
73
- * ("Budgets: 1 von 5"). An override of yours gets the same word. Since 0.34 the grant
74
- * dialog's usage line too, when `usage` comes as the column's shape.
75
- */
76
- usageOf: (used: string, limit: string, dimension: string) => string;
77
- }
78
-
79
- // Defined in ./plan-change-labels, which holds no component code (0.34, KS U8).
38
+ // The words and their type live in billing/plan-change-labels, which holds no component
39
+ // code (0.34, KS U8): PlanSwitchConfirm reads them too, and billing importing admin while
40
+ // this module imports billing made the two folders import each other (refactor audit
41
+ // 2026-10-30, MOD-6).
42
+ export type { PlanChangeLabels };
80
43
  export { DEFAULT_PLAN_CHANGE_LABELS };
81
44
 
82
45
  /** A plan code as the parts compare it: lowercase (§12.16 — an older row's "FREE" is
@@ -8,6 +8,7 @@ import { CheckboxGroup } from "../components/checkbox-group";
8
8
  import type { CheckboxGroupOption } from "../components/checkbox-group";
9
9
  import { FormActions } from "../components/form-actions";
10
10
  import { Caption } from "../components/text";
11
+ import { describeFailure } from "../lib/describe-failure";
11
12
  import { hasContent } from "../lib/presence";
12
13
  import type { MaybePromise } from "./admin-parts";
13
14
  import type { CommitScope } from "../components/write-lock";
@@ -165,7 +166,7 @@ export function ReviewerScopeEditor({
165
166
  try {
166
167
  result = onSave(scope);
167
168
  } catch (error) {
168
- setFailure(describeError?.(error) ?? labels.failed);
169
+ setFailure(describeFailure(describeError?.(error), labels.failed));
169
170
  return;
170
171
  }
171
172
  if (!result || typeof result.then !== "function") return;
@@ -174,8 +175,7 @@ export function ReviewerScopeEditor({
174
175
  () => setPending(false),
175
176
  (error: unknown) => {
176
177
  setPending(false);
177
- const own = describeError?.(error);
178
- setFailure(hasContent(own) ? own : labels.failed);
178
+ setFailure(describeFailure(describeError?.(error), labels.failed));
179
179
  },
180
180
  );
181
181
  };
@@ -0,0 +1,23 @@
1
+ // The English of every `rateLimited` label, in a module with no component code and no
2
+ // error probing: the English catalogue (src/i18n/defaults.ts) reaches it through nine
3
+ // `*-labels.ts` modules, and until 0.52 that pulled `auth/auth-errors` — and since MOD-6
4
+ // its `lib/http-status` — into the `en` chunk (refactor audit 2026-10-30, MOD-6).
5
+ // auth/auth-errors re-exports both.
6
+
7
+ /**
8
+ * The English of every `rateLimited` label (0.30.0): "Too many attempts. Try again in
9
+ * 30 s." with a wait under a minute, in whole minutes from one minute up (keksdose's
10
+ * reset throttle answers in hours, and "3600 s" is a number nobody reads), and "Wait a
11
+ * moment and try again." without one — or with a `0`.
12
+ *
13
+ * @internal The namespaces' English; not part of the barrel.
14
+ */
15
+ export function englishRateLimited(seconds?: number): string {
16
+ if (!seconds || seconds <= 0) return "Too many attempts. Wait a moment and try again.";
17
+ return `Too many attempts. Try again in ${englishWait(seconds)}.`;
18
+ }
19
+
20
+ /** "30 s", "2 min" — a wait in English, rounded up. @internal */
21
+ export function englishWait(seconds: number): string {
22
+ return seconds < 60 ? `${Math.ceil(seconds)} s` : `${Math.ceil(seconds / 60)} min`;
23
+ }
@@ -1,3 +1,5 @@
1
+ import { httpStatusOf } from "../lib/http-status";
2
+
1
3
  /**
2
4
  * The coded refusals of sign-in and sign-up (docs/auth-harmonization.md §5.2): every
3
5
  * refusal the auth routes answer carries a machine-readable `code`, and the pages
@@ -274,29 +276,13 @@ export function errorBodyWithCode(
274
276
  return undefined;
275
277
  }
276
278
 
277
- /** An HTTP status as a number, or undefined. */
278
- function statusOf(value: unknown): number | undefined {
279
- return typeof value === "number" && Number.isInteger(value) ? value : undefined;
280
- }
281
-
282
279
  /**
283
- * The HTTP status a thrown error carries, wherever the apps' HTTP clients put it —
284
- * without depending on any of them:
285
- *
286
- * 1. `err.response.status` — axios (all three apps' clients);
287
- * 2. `err.status` — ofetch's `FetchError`, the generated OpenAPI clients' `ApiError`, and
288
- * a `Response` thrown as it came;
289
- * 3. `err.statusCode` — ofetch's alias, and Node-style errors.
290
- *
291
- * `undefined` when none is a whole number. Package-private — not re-exported from the
292
- * barrel; {@link isRateLimited} and the session refresh's classifier read it (DUP-11,
293
- * refactor audit 2026-10: the refresh carried its own copy of this probe).
280
+ * The HTTP status a thrown error carries ({@link httpStatusOf}): axios'
281
+ * `response.status`, then `status`, then `statusCode`. Lives in `lib/http-status.ts`
282
+ * since 0.52 (refactor audit 2026-10-30, MOD-6); re-exported here for the modules that
283
+ * import it from auth. Package-private — not re-exported from the barrel.
294
284
  */
295
- export function httpStatusOf(err: unknown): number | undefined {
296
- if (!isBag(err)) return undefined;
297
- const response = err.response;
298
- return (isBag(response) ? statusOf(response.status) : undefined) ?? statusOf(err.status) ?? statusOf(err.statusCode);
299
- }
285
+ export { httpStatusOf };
300
286
 
301
287
  /**
302
288
  * Whether `err` is a throttled request — HTTP `429 Too Many Requests` (0.30.0, from the
@@ -378,20 +364,7 @@ export function retryAfterSeconds(err: unknown, now: number | Date = Date.now())
378
364
  return value === undefined ? undefined : parseRetryAfter(value, at);
379
365
  }
380
366
 
381
- /**
382
- * The English of every `rateLimited` label (0.30.0): "Too many attempts. Try again in
383
- * 30 s." with a wait under a minute, in whole minutes from one minute up (keksdose's
384
- * reset throttle answers in hours, and "3600 s" is a number nobody reads), and "Wait a
385
- * moment and try again." without one — or with a `0`.
386
- *
387
- * @internal The namespaces' English; not part of the barrel.
388
- */
389
- export function englishRateLimited(seconds?: number): string {
390
- if (!seconds || seconds <= 0) return "Too many attempts. Wait a moment and try again.";
391
- return `Too many attempts. Try again in ${englishWait(seconds)}.`;
392
- }
393
-
394
- /** "30 s", "2 min" — a wait in English, rounded up. @internal */
395
- export function englishWait(seconds: number): string {
396
- return seconds < 60 ? `${Math.ceil(seconds)} s` : `${Math.ceil(seconds / 60)} min`;
397
- }
367
+ // The English of the `rateLimited` labels, in auth-errors-labels since 0.52: the English
368
+ // catalogue reached this module for them, and with it `lib/http-status` (refactor audit
369
+ // 2026-10-30, MOD-6). Re-exported for the modules that import them from here.
370
+ export { englishRateLimited, englishWait } from "./auth-errors-labels";
@@ -1,7 +1,8 @@
1
1
  import { useContext, useEffect, useId, useRef, useState } from "react";
2
- import type { KeyboardEvent, ReactNode } from "react";
2
+ import type { ReactNode } from "react";
3
3
 
4
4
  import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
5
+ import { describeFailure } from "../lib/describe-failure";
5
6
  import { usePromisePending } from "../components/danger-confirm";
6
7
  import { DialogFrame } from "../components/dialog-frame";
7
8
  import { ModalCloseContext } from "../components/modal";
@@ -74,8 +75,9 @@ export interface CompleteNameDialogProps {
74
75
  * complete name, no page is blocked, and the app asks again at the next sign-in.
75
76
  *
76
77
  * The promise handling is `ReauthDialog`'s: busy while `onSave` runs (the fields
77
- * read-only, "Later" disabled, Escape held — a request that has left cannot be called
78
- * back by closing the dialog), closed on resolve, kept open on reject. Save is a
78
+ * read-only, "Later" disabled, Escape, the backdrop and Back held — a request that has
79
+ * left cannot be called back by closing the dialog), closed on resolve, kept open on
80
+ * reject. Save is a
79
81
  * `commit` control, so a `WriteLockProvider` above it locks it with its reason — every
80
82
  * lock but a lapsed plan's (`COMMIT_EXCEPT_BILLING`, 0.33): one's own name is the
81
83
  * account's own settings, which billing never locks (docs/billing-harmonization.md §3.3,
@@ -152,7 +154,9 @@ export function CompleteNameDialog({
152
154
  setFailed(false);
153
155
  };
154
156
 
155
- const message = failed ? (error ?? labels.failed) : undefined;
157
+ // An app's `failed && words` before it has words is `false`, which `??` kept (refactor
158
+ // audit 2026-10-30, DUP-14): the kit's sentence unless the app's says something.
159
+ const message = failed ? describeFailure(error, labels.failed) : undefined;
156
160
 
157
161
  return (
158
162
  <DialogFrame
@@ -160,10 +164,7 @@ export function CompleteNameDialog({
160
164
  title={labels.title}
161
165
  description={labels.description}
162
166
  onClose={() => onClose(saved.current)}
163
- onKeyDown={(e: KeyboardEvent<HTMLDivElement>) => {
164
- if (pending && e.key === "Escape") e.preventDefault();
165
- }}
166
- aria-busy={pending || undefined}
167
+ busy={pending}
167
168
  actions={
168
169
  <CompleteNameActions
169
170
  formId={formId}
@@ -3,7 +3,7 @@
3
3
  // loads as one chunk like the other languages (0.34, KS U8). ./forgot-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 { ForgotPasswordLabels } from "./forgot-password-form";
8
8
 
9
9
  /** `Required`: every key, the 0.30 one included, has its English here. */
@@ -2,13 +2,15 @@ import { useId, useRef, useState } from "react";
2
2
  import type { ComponentPropsWithRef, FormEvent, ReactNode } from "react";
3
3
  import { MailCheck } 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 { TextLink } from "../components/text-link";
8
9
  import { Button } from "../components/button";
9
10
  import { Input } from "../components/input";
10
11
  import { isRateLimited, retryAfterSeconds } from "./auth-errors";
11
- import { FORM_HEADING_CLASS, INTRO_CLASS, OutcomeMessage, isThenable, useFocusWhen } from "./status-parts";
12
+ import { isThenable } from "../lib/thenable";
13
+ import { FORM_HEADING_CLASS, INTRO_CLASS, OutcomeMessage, useFocusWhen } from "./status-parts";
12
14
  import type { AuthHeadingLevel } from "./status-parts";
13
15
  import { DEFAULT_FORGOT_PASSWORD_LABELS } from "./forgot-password-form-labels";
14
16
 
@@ -146,12 +148,15 @@ export function ForgotPasswordForm({
146
148
  );
147
149
  }
148
150
 
149
- // The app's words first, then the throttle's, then the kit's catch-all.
151
+ // The app's words first, then the throttle's, then the kit's catch-all — an app's ""
152
+ // is no words (refactor audit 2026-10-30, DUP-14: `??` drew an empty alert).
150
153
  const failureFor = (error: unknown): ReactNode =>
151
- describeError?.(error) ??
152
- (isRateLimited(error)
153
- ? (labels.rateLimited ?? DEFAULT_FORGOT_PASSWORD_LABELS.rateLimited)(retryAfterSeconds(error))
154
- : labels.error);
154
+ describeFailure(
155
+ describeError?.(error),
156
+ isRateLimited(error)
157
+ ? (labels.rateLimited ?? DEFAULT_FORGOT_PASSWORD_LABELS.rateLimited)(retryAfterSeconds(error))
158
+ : labels.error,
159
+ );
155
160
 
156
161
  const submit = (e: FormEvent) => {
157
162
  e.preventDefault();
@@ -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,4 +1,4 @@
1
- import { useState } from "react";
1
+ import { useEffect, useState } from "react";
2
2
 
3
3
  /**
4
4
  * What the payer asked for in the app (0.43, kastlan `18bf4c0`): `"cancel"` after
@@ -8,6 +8,9 @@ import { useState } from "react";
8
8
  */
9
9
  export type CancelRequested = "cancel" | "resume" | null;
10
10
 
11
+ /** How long a request waits for the provider's webhook: `useCheckoutProcessing`'s bound. */
12
+ const WAIT_FOR = 10 * 60_000;
13
+
11
14
  /** What the page shows for the row as read now — `CancelRequest.view(rowScheduled)`. */
12
15
  export interface CancelRequestView {
13
16
  /** For `SubscriptionActions`' `cancelRequested`. */
@@ -23,7 +26,8 @@ export interface CancelRequestView {
23
26
  export interface CancelRequest {
24
27
  /** Read the overview again every few seconds while this is true — the overview query's
25
28
  * `waiting` (kastlan's `useBillingOverview({ waiting })`, a `refetchInterval` inside) —
26
- * so the page follows the provider. Needs no overview data: pass it to the query. */
29
+ * so the page follows the provider. Needs no overview data: pass it to the query.
30
+ * False again after `timeoutMs` with no move of the row. */
27
31
  waiting: boolean;
28
32
  /**
29
33
  * The row as read now (the overview's `cancel_at_period_end`; `undefined` while it
@@ -54,10 +58,25 @@ export interface CancelRequest {
54
58
  * onResume={() => resume.mutate(undefined, { onSuccess: view.noteAsked })}
55
59
  * …
56
60
  * />
61
+ *
62
+ * **Bounded,** as `useCheckoutProcessing` is (FLW-6): after `timeoutMs` (10 minutes)
63
+ * with no move of the row the request is dropped — the polling stops and the page shows
64
+ * the row as it is. Unbounded, a webhook that never landed kept kastlan re-reading the
65
+ * overview every 3 s for as long as the page was open, which also kept a Cloud Run
66
+ * instance awake, and the plan line said "Cancels on …" for a row that never moved.
57
67
  */
58
- export function useCancelRequest(): CancelRequest {
59
- // What was asked, kept with the row's state it was asked against.
60
- const [asked, setAsked] = useState<{ scheduled: boolean } | null>(null);
68
+ export function useCancelRequest({ timeoutMs = WAIT_FOR }: { timeoutMs?: number } = {}): CancelRequest {
69
+ // What was asked, kept with the row's state it was asked against and when.
70
+ const [asked, setAsked] = useState<{ scheduled: boolean; at: number } | null>(null);
71
+ useEffect(() => {
72
+ if (asked === null) return;
73
+ // Only THIS ask: one that a later ask or the row has replaced is not dropped twice.
74
+ const timer = setTimeout(
75
+ () => setAsked((current) => (current === asked ? null : current)),
76
+ Math.max(0, asked.at + timeoutMs - Date.now()),
77
+ );
78
+ return () => clearTimeout(timer);
79
+ }, [asked, timeoutMs]);
61
80
  const view = (row: boolean | null | undefined): CancelRequestView => {
62
81
  // Not read yet: nothing to show against, and nothing to drop.
63
82
  if (row === undefined || row === null) return { requested: null, cancelScheduled: false, noteAsked: () => {} };
@@ -68,7 +87,10 @@ export function useCancelRequest(): CancelRequest {
68
87
  return {
69
88
  requested: open ? (row ? "resume" : "cancel") : null,
70
89
  cancelScheduled: open ? !row : row,
71
- noteAsked: () => setAsked((a) => (a !== null && a.scheduled === row ? null : { scheduled: row })),
90
+ noteAsked: () => {
91
+ const at = Date.now();
92
+ setAsked((a) => (a !== null && a.scheduled === row ? null : { scheduled: row, at }));
93
+ },
72
94
  };
73
95
  };
74
96
  return { waiting: asked !== null, view };
@@ -1,28 +1,34 @@
1
- import type { KeyboardEvent } from "react";
2
-
3
- import { useKitLabels, useKitLocale } from "../i18n/kit-labels";
1
+ import { useKitLabels } from "../i18n/kit-labels";
4
2
  import type { LabelOverride } from "../i18n/kit-labels";
5
3
  import { DEFAULT_COMMON_LABELS } from "../i18n/shared-labels";
6
- import { formatDate } from "../lib/format";
4
+ import { useDayFormatter } from "../lib/day-format";
7
5
  import type { DateInput } from "../lib/format";
8
6
  import { Button } from "../components/button";
9
7
  import { DialogFrame } from "../components/dialog-frame";
10
8
  import { COMMIT_EXCEPT_BILLING } from "../components/write-lock";
11
9
  import { useBillingLabels } from "./billing-labels";
12
10
  import type { BillingLabels } from "./billing-labels";
11
+ import { dialogClose } from "./dialog-close";
12
+ import type { WithDialogClose } from "./dialog-close";
13
13
 
14
- export interface CancelSubscriptionConfirmProps {
14
+ /** {@link CancelSubscriptionConfirmProps} before one of its two close props is required. */
15
+ interface CancelSubscriptionConfirmFields {
15
16
  open: boolean;
16
- /** `false` when the admin dismisses it — Back, Escape, the backdrop. Confirm leaves it
17
- * open: close it once `POST /billing/cancel` answers. */
18
- onOpenChange: (open: boolean) => void;
19
- /** The overview's `current_period_end`: the day the subscription ends. Formatted with
20
- * the kit's date formatter (`formatDate`, `"medium"`). */
17
+ /** The admin dismissed it — Back, Escape, the backdrop. Confirm leaves it open: close it
18
+ * once `POST /billing/cancel` answers. 0.52: every other kit dialog's `onClose`
19
+ * (CONTRIBUTING §4; refactor audit 2026-10-30, API-5). */
20
+ onClose?: () => void;
21
+ /** @deprecated 0.52 — `onClose`, as every other kit dialog; removed in 0.53. Called with
22
+ * `false` when there is no `onClose`. */
23
+ onOpenChange?: (open: boolean) => void;
24
+ /** The overview's `current_period_end`: the day the subscription ends, in a sentence —
25
+ * the `<UiKitProvider formatDate>` (the app's date preference) when it set one, else the
26
+ * kit's `formatDate`, `"medium"`, in the provider's locale and `timeZone` (0.52). */
21
27
  periodEnd: DateInput;
22
28
  /** Confirm: the app's `POST /billing/cancel` (server-kit 0.14, §16.3). */
23
29
  onConfirm: () => void;
24
- /** The cancel is under way: Confirm's spinner, no second press, and Escape and Back
25
- * don't close. */
30
+ /** The cancel is under way: Confirm's spinner, no second press, and neither Escape,
31
+ * the backdrop nor Back closes it. */
26
32
  pending?: boolean;
27
33
  /** The date's locale. Default: the provider's. */
28
34
  locale?: string;
@@ -30,6 +36,11 @@ export interface CancelSubscriptionConfirmProps {
30
36
  labels?: LabelOverride<BillingLabels>;
31
37
  }
32
38
 
39
+ /** What {@link CancelSubscriptionConfirm} takes: `onClose`, or alone the deprecated
40
+ * `onOpenChange`, is required (0.52 code review: with neither it compiled, and nothing
41
+ * could dismiss it). */
42
+ export type CancelSubscriptionConfirmProps = WithDialogClose<CancelSubscriptionConfirmFields>;
43
+
33
44
  /**
34
45
  * The in-app cancel's confirm (docs/billing-harmonization.md §16.2 decision 2, §16.4,
35
46
  * ui-kit 0.42): "Cancel subscription" for an admin the provider's portal doesn't open for
@@ -40,7 +51,7 @@ export interface CancelSubscriptionConfirmProps {
40
51
  *
41
52
  * <CancelSubscriptionConfirm
42
53
  * open={asking}
43
- * onOpenChange={setAsking}
54
+ * onClose={() => setAsking(false)}
44
55
  * periodEnd={overview.current_period_end}
45
56
  * pending={cancel.isPending}
46
57
  * onConfirm={() => cancel.mutate()}
@@ -56,6 +67,7 @@ export interface CancelSubscriptionConfirmProps {
56
67
  */
57
68
  export function CancelSubscriptionConfirm({
58
69
  open,
70
+ onClose,
59
71
  onOpenChange,
60
72
  periodEnd,
61
73
  onConfirm,
@@ -65,20 +77,15 @@ export function CancelSubscriptionConfirm({
65
77
  }: CancelSubscriptionConfirmProps) {
66
78
  const labels = useBillingLabels(labelsProp);
67
79
  const common = useKitLabels("common", DEFAULT_COMMON_LABELS);
68
- const locale = useKitLocale(localeProp);
80
+ const day = useDayFormatter(undefined, localeProp);
69
81
 
70
82
  return (
71
83
  <DialogFrame
72
84
  open={open}
73
85
  title={labels.cancelConfirmTitle}
74
- description={labels.cancelConfirmBody(formatDate(periodEnd, "medium", { locale }))}
75
- onClose={() => {
76
- if (!pending) onOpenChange(false);
77
- }}
78
- onKeyDown={(e: KeyboardEvent<HTMLDivElement>) => {
79
- if (pending && e.key === "Escape") e.preventDefault();
80
- }}
81
- aria-busy={pending || undefined}
86
+ description={labels.cancelConfirmBody(day(periodEnd))}
87
+ onClose={dialogClose({ onClose, onOpenChange })}
88
+ busy={pending}
82
89
  data-cancel-subscription-confirm=""
83
90
  actions={(close) => (
84
91
  <>
@@ -0,0 +1,34 @@
1
+ /**
2
+ * How the three billing confirms — `CancelSubscriptionConfirm`, `PlanSwitchConfirm`,
3
+ * `GrantWarningConfirm` — are closed in 0.52: `onClose`, as every other kit dialog
4
+ * (CONTRIBUTING §4; refactor audit 2026-10-30, API-5), and for one minor the deprecated
5
+ * `onOpenChange`, called with `false` when there is no `onClose`.
6
+ *
7
+ * 0.52 made `onOpenChange` optional for its deprecation and gave `onClose` beside it as
8
+ * optional too, so a confirm given NEITHER compiled — `<CancelSubscriptionConfirm open
9
+ * periodEnd={…} onConfirm={…} />` — and Back, Escape and the backdrop then called nothing:
10
+ * a dialog nobody could dismiss, where 0.51's compiler had required `onOpenChange` (0.52
11
+ * code review, cancel-subscription.tsx). And the fallback between the two was written
12
+ * three times, once per dialog.
13
+ *
14
+ * @internal Not part of the barrel; each dialog's props type is.
15
+ */
16
+
17
+ /** The two close props as a dialog's own props interface declares them. */
18
+ interface CloseProps {
19
+ onClose?: () => void;
20
+ onOpenChange?: (open: boolean) => void;
21
+ }
22
+
23
+ /**
24
+ * `P` with ONE of its two close props required — `onClose`, or alone the deprecated
25
+ * `onOpenChange`; both may be given, and `onClose` is then the one called. Built from
26
+ * `P`'s own members (`Pick`), so their docs and the deprecation stay the ones `P` writes.
27
+ */
28
+ export type WithDialogClose<P extends CloseProps> = P &
29
+ (Required<Pick<P, "onClose">> | Required<Pick<P, "onOpenChange">>);
30
+
31
+ /** The dialog's close: `onClose`, else `onOpenChange(false)`. */
32
+ export function dialogClose({ onClose, onOpenChange }: CloseProps): () => void {
33
+ return () => (onClose ? onClose() : onOpenChange?.(false));
34
+ }