@eifi1/ui-kit 0.51.6 → 0.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (805) hide show
  1. package/README.md +146 -26
  2. package/dist/account/account-parts.d.ts +10 -8
  3. package/dist/account/account-parts.js +1 -18
  4. package/dist/account/account-parts.js.map +1 -1
  5. package/dist/account/data-export-setting-labels.js +1 -1
  6. package/dist/account/data-export-setting-labels.js.map +1 -1
  7. package/dist/account/delete-account-setting-labels.js +1 -1
  8. package/dist/account/delete-account-setting-labels.js.map +1 -1
  9. package/dist/account/email-change-setting-labels.js +1 -1
  10. package/dist/account/email-change-setting-labels.js.map +1 -1
  11. package/dist/account/passkeys-setting.d.ts +9 -2
  12. package/dist/account/passkeys-setting.js +41 -29
  13. package/dist/account/passkeys-setting.js.map +1 -1
  14. package/dist/account/sessions-setting.d.ts +3 -2
  15. package/dist/account/sessions-setting.js +10 -8
  16. package/dist/account/sessions-setting.js.map +1 -1
  17. package/dist/admin/admin-action-confirm.js +3 -7
  18. package/dist/admin/admin-action-confirm.js.map +1 -1
  19. package/dist/admin/admin-parts.d.ts +6 -3
  20. package/dist/admin/admin-parts.js +6 -21
  21. package/dist/admin/admin-parts.js.map +1 -1
  22. package/dist/admin/mail-test-card-labels.js +1 -1
  23. package/dist/admin/mail-test-card-labels.js.map +1 -1
  24. package/dist/admin/plan-change-labels.d.ts +2 -2
  25. package/dist/admin/plan-change-labels.js +1 -17
  26. package/dist/admin/plan-change-labels.js.map +1 -1
  27. package/dist/admin/plan-change.d.ts +3 -42
  28. package/dist/admin/plan-change.js +1 -1
  29. package/dist/admin/plan-change.js.map +1 -1
  30. package/dist/admin/reviewer-scope-editor.js +3 -3
  31. package/dist/admin/reviewer-scope-editor.js.map +1 -1
  32. package/dist/auth/auth-errors-labels.d.ts +11 -0
  33. package/dist/auth/auth-errors-labels.js +13 -0
  34. package/dist/auth/auth-errors-labels.js.map +1 -0
  35. package/dist/auth/auth-errors.d.ts +7 -23
  36. package/dist/auth/auth-errors.js +2 -15
  37. package/dist/auth/auth-errors.js.map +1 -1
  38. package/dist/auth/complete-name-dialog.d.ts +3 -2
  39. package/dist/auth/complete-name-dialog.js +3 -5
  40. package/dist/auth/complete-name-dialog.js.map +1 -1
  41. package/dist/auth/forgot-password-form-labels.js +1 -1
  42. package/dist/auth/forgot-password-form-labels.js.map +1 -1
  43. package/dist/auth/forgot-password-form.js +7 -2
  44. package/dist/auth/forgot-password-form.js.map +1 -1
  45. package/dist/auth/register-form-labels.js +1 -1
  46. package/dist/auth/register-form-labels.js.map +1 -1
  47. package/dist/auth/reset-password-form-labels.js +1 -1
  48. package/dist/auth/reset-password-form-labels.js.map +1 -1
  49. package/dist/auth/reset-password-form.js +5 -1
  50. package/dist/auth/reset-password-form.js.map +1 -1
  51. package/dist/auth/sign-in-form-labels.js +1 -1
  52. package/dist/auth/sign-in-form-labels.js.map +1 -1
  53. package/dist/auth/status-parts.d.ts +0 -3
  54. package/dist/auth/status-parts.js +0 -4
  55. package/dist/auth/status-parts.js.map +1 -1
  56. package/dist/auth/verify-email-labels.js +1 -1
  57. package/dist/auth/verify-email-labels.js.map +1 -1
  58. package/dist/auth/verify-email.js +7 -2
  59. package/dist/auth/verify-email.js.map +1 -1
  60. package/dist/billing/cancel-request.d.ts +11 -2
  61. package/dist/billing/cancel-request.js +15 -3
  62. package/dist/billing/cancel-request.js.map +1 -1
  63. package/dist/billing/cancel-subscription.d.ts +22 -10
  64. package/dist/billing/cancel-subscription.js +8 -11
  65. package/dist/billing/cancel-subscription.js.map +1 -1
  66. package/dist/billing/dialog-close.d.ts +29 -0
  67. package/dist/billing/dialog-close.js +8 -0
  68. package/dist/billing/dialog-close.js.map +1 -0
  69. package/dist/billing/plan-card.d.ts +14 -4
  70. package/dist/billing/plan-card.js +15 -8
  71. package/dist/billing/plan-card.js.map +1 -1
  72. package/dist/billing/plan-change-labels.d.ts +42 -0
  73. package/dist/billing/plan-change-labels.js +22 -0
  74. package/dist/billing/plan-change-labels.js.map +1 -0
  75. package/dist/billing/plan-switch.d.ts +21 -9
  76. package/dist/billing/plan-switch.js +10 -8
  77. package/dist/billing/plan-switch.js.map +1 -1
  78. package/dist/chart.d.ts +12 -0
  79. package/dist/chart.js +16 -1
  80. package/dist/chart.js.map +1 -1
  81. package/dist/components/account-chips.d.ts +5 -5
  82. package/dist/components/account-chips.js +11 -13
  83. package/dist/components/account-chips.js.map +1 -1
  84. package/dist/components/alert-banner.d.ts +16 -5
  85. package/dist/components/alert-banner.js +46 -1
  86. package/dist/components/alert-banner.js.map +1 -1
  87. package/dist/components/amount-input.d.ts +22 -4
  88. package/dist/components/amount-input.js +3 -3
  89. package/dist/components/amount-input.js.map +1 -1
  90. package/dist/components/autocomplete.js +57 -65
  91. package/dist/components/autocomplete.js.map +1 -1
  92. package/dist/components/bulk-action-bar.d.ts +12 -2
  93. package/dist/components/bulk-action-bar.js +65 -21
  94. package/dist/components/bulk-action-bar.js.map +1 -1
  95. package/dist/components/button-look.d.ts +5 -5
  96. package/dist/components/button-look.js.map +1 -1
  97. package/dist/components/button.d.ts +2 -2
  98. package/dist/components/button.js.map +1 -1
  99. package/dist/components/calculator.d.ts +21 -2
  100. package/dist/components/calculator.js +53 -14
  101. package/dist/components/calculator.js.map +1 -1
  102. package/dist/components/chart-edge.d.ts +16 -0
  103. package/dist/components/chart-edge.js +14 -1
  104. package/dist/components/chart-edge.js.map +1 -1
  105. package/dist/components/chart-figure.d.ts +13 -0
  106. package/dist/components/chart-figure.js +15 -0
  107. package/dist/components/chart-figure.js.map +1 -0
  108. package/dist/components/chart-zoom-core.js +1 -4
  109. package/dist/components/chart-zoom-core.js.map +1 -1
  110. package/dist/components/chart.d.ts +8 -1
  111. package/dist/components/chart.js +19 -10
  112. package/dist/components/chart.js.map +1 -1
  113. package/dist/components/combobox-core.d.ts +119 -7
  114. package/dist/components/combobox-core.js +151 -46
  115. package/dist/components/combobox-core.js.map +1 -1
  116. package/dist/components/combobox.d.ts +1 -1
  117. package/dist/components/combobox.js +142 -131
  118. package/dist/components/combobox.js.map +1 -1
  119. package/dist/components/copy-button.d.ts +6 -5
  120. package/dist/components/copy-button.js +5 -3
  121. package/dist/components/copy-button.js.map +1 -1
  122. package/dist/components/country-select.js +2 -2
  123. package/dist/components/country-select.js.map +1 -1
  124. package/dist/components/data-table-column-settings.d.ts +1 -1
  125. package/dist/components/data-table-column-settings.js +33 -7
  126. package/dist/components/data-table-column-settings.js.map +1 -1
  127. package/dist/components/data-table-filters.d.ts +4 -2
  128. package/dist/components/data-table-filters.js +2 -2
  129. package/dist/components/data-table-filters.js.map +1 -1
  130. package/dist/components/data-table-fit.d.ts +6 -4
  131. package/dist/components/data-table-fit.js +4 -1
  132. package/dist/components/data-table-fit.js.map +1 -1
  133. package/dist/components/data-table-groups.d.ts +1 -1
  134. package/dist/components/data-table-groups.js.map +1 -1
  135. package/dist/components/data-table-head.d.ts +1 -1
  136. package/dist/components/data-table-head.js +15 -12
  137. package/dist/components/data-table-head.js.map +1 -1
  138. package/dist/components/data-table-mobile.d.ts +36 -7
  139. package/dist/components/data-table-mobile.js +63 -31
  140. package/dist/components/data-table-mobile.js.map +1 -1
  141. package/dist/components/data-table-pagination.js +11 -6
  142. package/dist/components/data-table-pagination.js.map +1 -1
  143. package/dist/components/data-table-resize.d.ts +1 -1
  144. package/dist/components/data-table-resize.js.map +1 -1
  145. package/dist/components/data-table-row-actions.d.ts +2 -2
  146. package/dist/components/data-table-row-actions.js.map +1 -1
  147. package/dist/components/data-table-row.d.ts +6 -2
  148. package/dist/components/data-table-row.js +17 -10
  149. package/dist/components/data-table-row.js.map +1 -1
  150. package/dist/components/data-table-selection.d.ts +1 -1
  151. package/dist/components/data-table-selection.js.map +1 -1
  152. package/dist/components/data-table-shared.d.ts +10 -2
  153. package/dist/components/data-table-shared.js +18 -0
  154. package/dist/components/data-table-shared.js.map +1 -1
  155. package/dist/components/data-table-sort.d.ts +21 -2
  156. package/dist/components/data-table-sort.js +24 -0
  157. package/dist/components/data-table-sort.js.map +1 -1
  158. package/dist/components/data-table-virtual.d.ts +1 -1
  159. package/dist/components/data-table-virtual.js +18 -6
  160. package/dist/components/data-table-virtual.js.map +1 -1
  161. package/dist/components/data-table.d.ts +25 -8
  162. package/dist/components/data-table.js +154 -25
  163. package/dist/components/data-table.js.map +1 -1
  164. package/dist/components/date-field.d.ts +24 -2
  165. package/dist/components/date-field.js +33 -8
  166. package/dist/components/date-field.js.map +1 -1
  167. package/dist/components/date-picker.d.ts +15 -2
  168. package/dist/components/date-picker.js +55 -26
  169. package/dist/components/date-picker.js.map +1 -1
  170. package/dist/components/date-range-picker.d.ts +47 -20
  171. package/dist/components/date-range-picker.js +23 -7
  172. package/dist/components/date-range-picker.js.map +1 -1
  173. package/dist/components/dialog-frame.d.ts +2 -1
  174. package/dist/components/dialog-frame.js.map +1 -1
  175. package/dist/components/entity-combobox.js +4 -2
  176. package/dist/components/entity-combobox.js.map +1 -1
  177. package/dist/components/error-boundary.js +37 -30
  178. package/dist/components/error-boundary.js.map +1 -1
  179. package/dist/components/{ui-labels.d.ts → field-base-labels.d.ts} +0 -2
  180. package/dist/components/{ui-labels.js → field-base-labels.js} +2 -9
  181. package/dist/components/field-base-labels.js.map +1 -0
  182. package/dist/components/field-base.d.ts +4 -3
  183. package/dist/components/field-base.js +3 -3
  184. package/dist/components/field-base.js.map +1 -1
  185. package/dist/components/field-sync-labels.d.ts +1 -0
  186. package/dist/components/field-sync-labels.js.map +1 -1
  187. package/dist/components/field-sync.d.ts +23 -1
  188. package/dist/components/field-sync.js.map +1 -1
  189. package/dist/components/form-actions.js +11 -5
  190. package/dist/components/form-actions.js.map +1 -1
  191. package/dist/components/hover-menu.d.ts +3 -0
  192. package/dist/components/hover-menu.js +5 -3
  193. package/dist/components/hover-menu.js.map +1 -1
  194. package/dist/components/icon-button.js +14 -9
  195. package/dist/components/icon-button.js.map +1 -1
  196. package/dist/components/inline-confirm.d.ts +43 -0
  197. package/dist/components/inline-confirm.js +67 -0
  198. package/dist/components/inline-confirm.js.map +1 -0
  199. package/dist/components/inline-entity-combobox.d.ts +4 -3
  200. package/dist/components/inline-entity-combobox.js +150 -141
  201. package/dist/components/inline-entity-combobox.js.map +1 -1
  202. package/dist/components/input.js +1 -1
  203. package/dist/components/input.js.map +1 -1
  204. package/dist/components/jump-calendar.js +28 -112
  205. package/dist/components/jump-calendar.js.map +1 -1
  206. package/dist/components/legal-page.d.ts +3 -1
  207. package/dist/components/legal-page.js +3 -2
  208. package/dist/components/legal-page.js.map +1 -1
  209. package/dist/components/legal.d.ts +4 -2
  210. package/dist/components/legal.js.map +1 -1
  211. package/dist/components/lightbox.d.ts +2 -2
  212. package/dist/components/lightbox.js +17 -6
  213. package/dist/components/lightbox.js.map +1 -1
  214. package/dist/components/list.d.ts +6 -2
  215. package/dist/components/list.js +4 -3
  216. package/dist/components/list.js.map +1 -1
  217. package/dist/components/measured-grid.d.ts +1 -1
  218. package/dist/components/measured-grid.js +2 -1
  219. package/dist/components/measured-grid.js.map +1 -1
  220. package/dist/components/mini-calendar.js +3 -5
  221. package/dist/components/mini-calendar.js.map +1 -1
  222. package/dist/components/modal.d.ts +24 -0
  223. package/dist/components/modal.js +12 -4
  224. package/dist/components/modal.js.map +1 -1
  225. package/dist/components/money-draft.js +7 -5
  226. package/dist/components/money-draft.js.map +1 -1
  227. package/dist/components/money-field.d.ts +2 -2
  228. package/dist/components/money-field.js.map +1 -1
  229. package/dist/components/month-grid.d.ts +55 -0
  230. package/dist/components/month-grid.js +148 -0
  231. package/dist/components/month-grid.js.map +1 -0
  232. package/dist/components/month-picker.d.ts +36 -4
  233. package/dist/components/month-picker.js +123 -146
  234. package/dist/components/month-picker.js.map +1 -1
  235. package/dist/components/multi-entity-combobox.js +2 -1
  236. package/dist/components/multi-entity-combobox.js.map +1 -1
  237. package/dist/components/multi-select.d.ts +2 -2
  238. package/dist/components/multi-select.js +11 -6
  239. package/dist/components/multi-select.js.map +1 -1
  240. package/dist/components/number-field.d.ts +6 -4
  241. package/dist/components/number-field.js +3 -2
  242. package/dist/components/number-field.js.map +1 -1
  243. package/dist/components/number-input.d.ts +4 -1
  244. package/dist/components/number-input.js +3 -2
  245. package/dist/components/number-input.js.map +1 -1
  246. package/dist/components/numpad-sheet.js.map +1 -1
  247. package/dist/components/picker-sheet.js +2 -1
  248. package/dist/components/picker-sheet.js.map +1 -1
  249. package/dist/components/pie-chart-labels.d.ts +7 -0
  250. package/dist/components/pie-chart-labels.js +1 -0
  251. package/dist/components/pie-chart-labels.js.map +1 -1
  252. package/dist/components/pie-chart.d.ts +5 -3
  253. package/dist/components/pie-chart.js +7 -22
  254. package/dist/components/pie-chart.js.map +1 -1
  255. package/dist/components/popover.d.ts +3 -0
  256. package/dist/components/popover.js +7 -1
  257. package/dist/components/popover.js.map +1 -1
  258. package/dist/components/reauth-dialog.d.ts +4 -5
  259. package/dist/components/reauth-dialog.js +1 -4
  260. package/dist/components/reauth-dialog.js.map +1 -1
  261. package/dist/components/row-actions.js +2 -1
  262. package/dist/components/row-actions.js.map +1 -1
  263. package/dist/components/section-nav.d.ts +7 -0
  264. package/dist/components/section-nav.js.map +1 -1
  265. package/dist/components/series-chart-axes.d.ts +10 -3
  266. package/dist/components/series-chart-axes.js +1 -0
  267. package/dist/components/series-chart-axes.js.map +1 -1
  268. package/dist/components/series-chart-labels.d.ts +7 -4
  269. package/dist/components/series-chart-labels.js.map +1 -1
  270. package/dist/components/series-chart.d.ts +31 -7
  271. package/dist/components/series-chart.js +72 -29
  272. package/dist/components/series-chart.js.map +1 -1
  273. package/dist/components/share-card.js +3 -3
  274. package/dist/components/share-card.js.map +1 -1
  275. package/dist/components/sign-chip-labels.d.ts +1 -0
  276. package/dist/components/sign-chip-labels.js.map +1 -1
  277. package/dist/components/sign-chip.d.ts +10 -1
  278. package/dist/components/sign-chip.js.map +1 -1
  279. package/dist/components/tabs-labels.d.ts +2 -0
  280. package/dist/components/tabs-labels.js +11 -0
  281. package/dist/components/tabs-labels.js.map +1 -0
  282. package/dist/components/tabs.d.ts +1 -1
  283. package/dist/components/tabs.js +13 -11
  284. package/dist/components/tabs.js.map +1 -1
  285. package/dist/components/toggle-legend.d.ts +2 -2
  286. package/dist/components/toggle-legend.js +6 -6
  287. package/dist/components/toggle-legend.js.map +1 -1
  288. package/dist/components/translation-review-editor.d.ts +4 -2
  289. package/dist/components/translation-review-editor.js +2 -3
  290. package/dist/components/translation-review-editor.js.map +1 -1
  291. package/dist/components/translation-review.d.ts +2 -1
  292. package/dist/components/translation-review.js +2 -2
  293. package/dist/components/translation-review.js.map +1 -1
  294. package/dist/components/treemap-labels.d.ts +26 -0
  295. package/dist/components/treemap-labels.js +10 -0
  296. package/dist/components/treemap-labels.js.map +1 -0
  297. package/dist/components/treemap-layout.d.ts +62 -0
  298. package/dist/components/treemap-layout.js +126 -0
  299. package/dist/components/treemap-layout.js.map +1 -0
  300. package/dist/components/treemap.d.ts +140 -17
  301. package/dist/components/treemap.js +324 -97
  302. package/dist/components/treemap.js.map +1 -1
  303. package/dist/components/use-table-state.d.ts +5 -5
  304. package/dist/components/use-table-state.js +4 -1
  305. package/dist/components/use-table-state.js.map +1 -1
  306. package/dist/data-table.d.ts +6 -2
  307. package/dist/data-table.js +7 -2
  308. package/dist/data-table.js.map +1 -1
  309. package/dist/eslint/index.js +1 -1
  310. package/dist/eslint/role-utilities.d.ts +36 -7
  311. package/dist/eslint/role-utilities.js +42 -9
  312. package/dist/eslint/role-utilities.js.map +1 -1
  313. package/dist/feedback/feedback-dialog.d.ts +25 -16
  314. package/dist/feedback/feedback-dialog.js +6 -2
  315. package/dist/feedback/feedback-dialog.js.map +1 -1
  316. package/dist/feedback/feedback-mutation.d.ts +30 -0
  317. package/dist/feedback/feedback-mutation.js +16 -0
  318. package/dist/feedback/feedback-mutation.js.map +1 -0
  319. package/dist/feedback/feedback-page-link.d.ts +53 -0
  320. package/dist/feedback/feedback-page-link.js +37 -0
  321. package/dist/feedback/feedback-page-link.js.map +1 -0
  322. package/dist/feedback/feedback-public-list.d.ts +12 -3
  323. package/dist/feedback/feedback-public-list.js +2 -1
  324. package/dist/feedback/feedback-public-list.js.map +1 -1
  325. package/dist/feedback/feedback-replies.d.ts +3 -1
  326. package/dist/feedback/feedback-replies.js +5 -4
  327. package/dist/feedback/feedback-replies.js.map +1 -1
  328. package/dist/feedback/feedback-row-detail-labels.js +5 -0
  329. package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
  330. package/dist/feedback/feedback-row-detail.d.ts +64 -28
  331. package/dist/feedback/feedback-row-detail.js +30 -28
  332. package/dist/feedback/feedback-row-detail.js.map +1 -1
  333. package/dist/feedback/feedback-status-undo.d.ts +30 -11
  334. package/dist/feedback/feedback-status-undo.js +10 -15
  335. package/dist/feedback/feedback-status-undo.js.map +1 -1
  336. package/dist/feedback/feedback-submit-dialog.d.ts +1 -1
  337. package/dist/feedback/feedback-submit-dialog.js +1 -1
  338. package/dist/feedback/feedback-submit-dialog.js.map +1 -1
  339. package/dist/feedback/feedback-submit.js +9 -3
  340. package/dist/feedback/feedback-submit.js.map +1 -1
  341. package/dist/feedback/feedback-swipe.d.ts +1 -1
  342. package/dist/feedback/feedback-swipe.js.map +1 -1
  343. package/dist/feedback/feedback-table.d.ts +21 -9
  344. package/dist/feedback/feedback-table.js +45 -25
  345. package/dist/feedback/feedback-table.js.map +1 -1
  346. package/dist/feedback/feedback-thread-labels.d.ts +2 -2
  347. package/dist/feedback/feedback-thread-labels.js.map +1 -1
  348. package/dist/feedback/feedback-thread.d.ts +24 -23
  349. package/dist/feedback/feedback-thread.js +2 -1
  350. package/dist/feedback/feedback-thread.js.map +1 -1
  351. package/dist/feedback.d.ts +34 -0
  352. package/dist/feedback.js +42 -0
  353. package/dist/feedback.js.map +1 -1
  354. package/dist/hooks/use-dismiss.js.map +1 -1
  355. package/dist/hooks/use-focus-trap.d.ts +35 -0
  356. package/dist/hooks/use-focus-trap.js +6 -4
  357. package/dist/hooks/use-focus-trap.js.map +1 -1
  358. package/dist/hooks/use-hotkey.d.ts +5 -2
  359. package/dist/hooks/use-hotkey.js +5 -4
  360. package/dist/hooks/use-hotkey.js.map +1 -1
  361. package/dist/hooks/use-long-press.d.ts +7 -4
  362. package/dist/hooks/use-long-press.js +3 -0
  363. package/dist/hooks/use-long-press.js.map +1 -1
  364. package/dist/hooks/use-media-query.js +12 -4
  365. package/dist/hooks/use-media-query.js.map +1 -1
  366. package/dist/hooks/use-mounted.d.ts +22 -0
  367. package/dist/hooks/use-mounted.js +24 -0
  368. package/dist/hooks/use-mounted.js.map +1 -0
  369. package/dist/hooks/use-overlay-history.d.ts +7 -1
  370. package/dist/hooks/use-overlay-history.js +35 -5
  371. package/dist/hooks/use-overlay-history.js.map +1 -1
  372. package/dist/i18n/defaults.js +4 -5
  373. package/dist/i18n/defaults.js.map +1 -1
  374. package/dist/i18n/german.js +7 -1
  375. package/dist/i18n/german.js.map +1 -1
  376. package/dist/i18n/kit-labels.d.ts +9 -2
  377. package/dist/i18n/kit-labels.js.map +1 -1
  378. package/dist/i18n/locales/en.js +20 -41
  379. package/dist/i18n/locales/en.js.map +3 -3
  380. package/dist/i18n/locales/es.js +7 -1
  381. package/dist/i18n/locales/es.js.map +1 -1
  382. package/dist/i18n/locales/fr.js +20 -10
  383. package/dist/i18n/locales/fr.js.map +1 -1
  384. package/dist/i18n/locales/hu.js +9 -1
  385. package/dist/i18n/locales/hu.js.map +1 -1
  386. package/dist/i18n/locales/it.js +7 -1
  387. package/dist/i18n/locales/it.js.map +1 -1
  388. package/dist/i18n/locales/zh.js +8 -1
  389. package/dist/i18n/locales/zh.js.map +1 -1
  390. package/dist/i18n/review.js +5 -0
  391. package/dist/i18n/review.js.map +1 -1
  392. package/dist/index.d.ts +64 -17
  393. package/dist/index.js +77 -12
  394. package/dist/index.js.map +1 -1
  395. package/dist/landing/routing.d.ts +3 -1
  396. package/dist/landing/routing.js +4 -7
  397. package/dist/landing/routing.js.map +1 -1
  398. package/dist/lib/broadcast.d.ts +17 -0
  399. package/dist/lib/broadcast.js +30 -0
  400. package/dist/lib/broadcast.js.map +1 -0
  401. package/dist/lib/calc.d.ts +7 -1
  402. package/dist/lib/calc.js +3 -1
  403. package/dist/lib/calc.js.map +1 -1
  404. package/dist/lib/clipboard-minus.d.ts +2 -2
  405. package/dist/lib/clipboard-minus.js +1 -1
  406. package/dist/lib/clipboard-minus.js.map +1 -1
  407. package/dist/lib/date-format.d.ts +37 -2
  408. package/dist/lib/date-format.js +34 -8
  409. package/dist/lib/date-format.js.map +1 -1
  410. package/dist/lib/day-format.d.ts +46 -0
  411. package/dist/lib/day-format.js +46 -0
  412. package/dist/lib/day-format.js.map +1 -0
  413. package/dist/lib/decimal-marks.d.ts +7 -1
  414. package/dist/lib/decimal-marks.js +5 -2
  415. package/dist/lib/decimal-marks.js.map +1 -1
  416. package/dist/lib/describe-failure.d.ts +14 -0
  417. package/dist/lib/describe-failure.js +9 -0
  418. package/dist/lib/describe-failure.js.map +1 -0
  419. package/dist/lib/direction.d.ts +16 -0
  420. package/dist/lib/direction.js +9 -1
  421. package/dist/lib/direction.js.map +1 -1
  422. package/dist/lib/focus-left.d.ts +63 -0
  423. package/dist/lib/focus-left.js +67 -0
  424. package/dist/lib/focus-left.js.map +1 -0
  425. package/dist/lib/format.d.ts +5 -3
  426. package/dist/lib/format.js +16 -13
  427. package/dist/lib/format.js.map +1 -1
  428. package/dist/lib/http-status.d.ts +24 -0
  429. package/dist/lib/http-status.js +14 -0
  430. package/dist/lib/http-status.js.map +1 -0
  431. package/dist/lib/intl-cache.d.ts +14 -0
  432. package/dist/lib/intl-cache.js +15 -0
  433. package/dist/lib/intl-cache.js.map +1 -0
  434. package/dist/lib/isin.d.ts +10 -0
  435. package/dist/lib/isin.js.map +1 -1
  436. package/dist/lib/iso-day.d.ts +11 -0
  437. package/dist/lib/iso-day.js +8 -0
  438. package/dist/lib/iso-day.js.map +1 -0
  439. package/dist/lib/lazy-with-fallback.d.ts +31 -0
  440. package/dist/lib/lazy-with-fallback.js +40 -0
  441. package/dist/lib/lazy-with-fallback.js.map +1 -0
  442. package/dist/lib/path-pattern.d.ts +34 -0
  443. package/dist/lib/path-pattern.js +24 -0
  444. package/dist/lib/path-pattern.js.map +1 -0
  445. package/dist/lib/reduced-motion.d.ts +2 -1
  446. package/dist/lib/reduced-motion.js.map +1 -1
  447. package/dist/lib/round.d.ts +2 -1
  448. package/dist/lib/round.js +2 -1
  449. package/dist/lib/round.js.map +1 -1
  450. package/dist/lib/safe-storage.d.ts +24 -5
  451. package/dist/lib/safe-storage.js +27 -2
  452. package/dist/lib/safe-storage.js.map +1 -1
  453. package/dist/lib/session-refresh.js +1 -1
  454. package/dist/lib/session-refresh.js.map +1 -1
  455. package/dist/lib/share-format.d.ts +13 -0
  456. package/dist/lib/share-format.js +10 -0
  457. package/dist/lib/share-format.js.map +1 -0
  458. package/dist/lib/text-case.d.ts +17 -0
  459. package/dist/lib/text-case.js +8 -0
  460. package/dist/lib/text-case.js.map +1 -0
  461. package/dist/lib/text-match.d.ts +38 -0
  462. package/dist/lib/text-match.js +24 -2
  463. package/dist/lib/text-match.js.map +1 -1
  464. package/dist/lib/thenable.d.ts +13 -0
  465. package/dist/lib/thenable.js +8 -0
  466. package/dist/lib/thenable.js.map +1 -0
  467. package/dist/lib/translation-review.d.ts +7 -2
  468. package/dist/lib/translation-review.js +4 -4
  469. package/dist/lib/translation-review.js.map +1 -1
  470. package/dist/notifications/device-zone-report.js +1 -1
  471. package/dist/notifications/device-zone-report.js.map +1 -1
  472. package/dist/notifications/notification-bell.d.ts +2 -1
  473. package/dist/notifications/notification-bell.js +3 -3
  474. package/dist/notifications/notification-bell.js.map +1 -1
  475. package/dist/notifications/notification-inbox.d.ts +10 -6
  476. package/dist/notifications/notification-inbox.js +26 -48
  477. package/dist/notifications/notification-inbox.js.map +1 -1
  478. package/dist/notifications/notification-parts.d.ts +3 -2
  479. package/dist/notifications/notification-parts.js +1 -3
  480. package/dist/notifications/notification-parts.js.map +1 -1
  481. package/dist/notifications/notification-types-setting.js +1 -1
  482. package/dist/notifications/notification-types-setting.js.map +1 -1
  483. package/dist/notifications/notifications-labels.d.ts +6 -0
  484. package/dist/notifications/notifications-labels.js +1 -0
  485. package/dist/notifications/notifications-labels.js.map +1 -1
  486. package/dist/notifications/push-device-setting.js +1 -1
  487. package/dist/notifications/push-device-setting.js.map +1 -1
  488. package/dist/notifications/push-devices-setting.d.ts +2 -1
  489. package/dist/notifications/push-devices-setting.js +27 -49
  490. package/dist/notifications/push-devices-setting.js.map +1 -1
  491. package/dist/notifications/quiet-hours-setting.d.ts +10 -3
  492. package/dist/notifications/quiet-hours-setting.js +65 -26
  493. package/dist/notifications/quiet-hours-setting.js.map +1 -1
  494. package/dist/notifications/unsubscribe-panel.js +4 -7
  495. package/dist/notifications/unsubscribe-panel.js.map +1 -1
  496. package/dist/notifications/use-push-device.d.ts +39 -1
  497. package/dist/notifications/use-push-device.js +28 -7
  498. package/dist/notifications/use-push-device.js.map +1 -1
  499. package/dist/offline/query-persistence.d.ts +3 -1
  500. package/dist/offline/query-persistence.js +19 -2
  501. package/dist/offline/query-persistence.js.map +1 -1
  502. package/dist/rhf/fields.d.ts +11 -4
  503. package/dist/rhf/fields.js.map +1 -1
  504. package/dist/search/command-palette.js +1 -1
  505. package/dist/search/command-palette.js.map +1 -1
  506. package/dist/search/global-search.js +19 -9
  507. package/dist/search/global-search.js.map +1 -1
  508. package/dist/search/use-command-key.d.ts +12 -1
  509. package/dist/search/use-command-key.js +3 -12
  510. package/dist/search/use-command-key.js.map +1 -1
  511. package/dist/search.d.ts +7 -0
  512. package/dist/search.js +10 -0
  513. package/dist/search.js.map +1 -1
  514. package/dist/settings/use-settings-focus.js +1 -0
  515. package/dist/settings/use-settings-focus.js.map +1 -1
  516. package/dist/shell/account-menu-language.d.ts +21 -5
  517. package/dist/shell/account-menu-language.js +3 -1
  518. package/dist/shell/account-menu-language.js.map +1 -1
  519. package/dist/shell/account-menu-text-size.d.ts +26 -9
  520. package/dist/shell/account-menu-text-size.js +3 -2
  521. package/dist/shell/account-menu-text-size.js.map +1 -1
  522. package/dist/shell/dev-menu.js +5 -18
  523. package/dist/shell/dev-menu.js.map +1 -1
  524. package/dist/shell/role-switcher.d.ts +7 -0
  525. package/dist/shell/role-switcher.js.map +1 -1
  526. package/dist/shell/top-bar-actions.d.ts +1 -1
  527. package/dist/shell/top-bar-actions.js.map +1 -1
  528. package/dist/shell/top-bar-parts-labels.d.ts +0 -2
  529. package/dist/shell/top-bar-parts-labels.js +0 -1
  530. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  531. package/dist/shell.d.ts +27 -8
  532. package/dist/shell.js +28 -7
  533. package/dist/shell.js.map +1 -1
  534. package/dist/sync/engine.d.ts +30 -4
  535. package/dist/sync/engine.js +172 -52
  536. package/dist/sync/engine.js.map +1 -1
  537. package/dist/sync.d.ts +6 -2
  538. package/dist/sync.js +6 -1
  539. package/dist/sync.js.map +1 -1
  540. package/dist/testing/css-variables.js +3 -8
  541. package/dist/testing/css-variables.js.map +1 -1
  542. package/dist/theme/contrast.d.ts +2 -1
  543. package/dist/theme/contrast.js +3 -8
  544. package/dist/theme/contrast.js.map +1 -1
  545. package/dist/theme/palette-store.js +6 -6
  546. package/dist/theme/palette-store.js.map +1 -1
  547. package/dist/theme/text-size.js +3 -8
  548. package/dist/theme/text-size.js.map +1 -1
  549. package/dist/theme/theme-store.js +3 -6
  550. package/dist/theme/theme-store.js.map +1 -1
  551. package/dist/tour/tour-catalogue.d.ts +7 -4
  552. package/dist/tour/tour-catalogue.js +12 -10
  553. package/dist/tour/tour-catalogue.js.map +1 -1
  554. package/dist/tour/tour-dock.d.ts +0 -2
  555. package/dist/tour/tour-dock.js +0 -2
  556. package/dist/tour/tour-dock.js.map +1 -1
  557. package/dist/tour/tour-gates.d.ts +4 -0
  558. package/dist/tour/tour-gates.js +14 -0
  559. package/dist/tour/tour-gates.js.map +1 -1
  560. package/dist/tour/tour-overlay.d.ts +27 -0
  561. package/dist/tour/tour-overlay.js +741 -0
  562. package/dist/tour/tour-overlay.js.map +1 -0
  563. package/dist/tour/tour.d.ts +16 -4
  564. package/dist/tour/tour.js +62 -778
  565. package/dist/tour/tour.js.map +1 -1
  566. package/dist/tour/use-tour-progress.js +1 -1
  567. package/dist/tour/use-tour-progress.js.map +1 -1
  568. package/dist/tour/use-tour-url-sync.js +2 -2
  569. package/dist/tour/use-tour-url-sync.js.map +1 -1
  570. package/dist/wizard/stepper-nav.d.ts +5 -1
  571. package/dist/wizard/stepper-nav.js.map +1 -1
  572. package/dist/wizard/types.d.ts +6 -2
  573. package/dist/wizard/types.js.map +1 -1
  574. package/dist/wizard/use-wizard.d.ts +3 -1
  575. package/dist/wizard/use-wizard.js.map +1 -1
  576. package/dist/wizard/validation.d.ts +3 -1
  577. package/dist/wizard/validation.js.map +1 -1
  578. package/package.json +12 -8
  579. package/src/account/account-parts.ts +5 -25
  580. package/src/account/data-export-setting-labels.ts +1 -1
  581. package/src/account/delete-account-setting-labels.ts +1 -1
  582. package/src/account/email-change-setting-labels.ts +1 -1
  583. package/src/account/passkeys-setting.tsx +60 -38
  584. package/src/account/sessions-setting.tsx +18 -12
  585. package/src/admin/admin-action-confirm.tsx +5 -10
  586. package/src/admin/admin-parts.ts +11 -25
  587. package/src/admin/mail-test-card-labels.ts +1 -1
  588. package/src/admin/plan-change-labels.ts +5 -23
  589. package/src/admin/plan-change.tsx +7 -44
  590. package/src/admin/reviewer-scope-editor.tsx +3 -3
  591. package/src/auth/auth-errors-labels.ts +23 -0
  592. package/src/auth/auth-errors.ts +11 -38
  593. package/src/auth/complete-name-dialog.tsx +9 -8
  594. package/src/auth/forgot-password-form-labels.ts +1 -1
  595. package/src/auth/forgot-password-form.tsx +11 -6
  596. package/src/auth/register-form-labels.ts +1 -1
  597. package/src/auth/reset-password-form-labels.ts +1 -1
  598. package/src/auth/reset-password-form.tsx +8 -4
  599. package/src/auth/sign-in-form-labels.ts +1 -1
  600. package/src/auth/status-parts.tsx +0 -6
  601. package/src/auth/verify-email-labels.ts +1 -1
  602. package/src/auth/verify-email.tsx +11 -6
  603. package/src/billing/cancel-request.ts +28 -6
  604. package/src/billing/cancel-subscription.tsx +29 -22
  605. package/src/billing/dialog-close.ts +34 -0
  606. package/src/billing/plan-card.tsx +36 -11
  607. package/src/billing/plan-change-labels.ts +66 -0
  608. package/src/billing/plan-switch.tsx +31 -20
  609. package/src/chart.ts +21 -3
  610. package/src/components/account-chips.tsx +20 -23
  611. package/src/components/alert-banner.tsx +82 -5
  612. package/src/components/amount-input.tsx +32 -14
  613. package/src/components/autocomplete.tsx +64 -70
  614. package/src/components/bulk-action-bar.tsx +70 -2
  615. package/src/components/button-look.ts +5 -5
  616. package/src/components/button.tsx +2 -2
  617. package/src/components/calculator.tsx +98 -17
  618. package/src/components/chart-edge.ts +34 -1
  619. package/src/components/chart-figure.tsx +35 -0
  620. package/src/components/chart-zoom-core.tsx +6 -5
  621. package/src/components/chart.tsx +26 -5
  622. package/src/components/combobox-core.tsx +303 -69
  623. package/src/components/combobox.tsx +184 -155
  624. package/src/components/copy-button.tsx +34 -23
  625. package/src/components/country-select.tsx +16 -11
  626. package/src/components/data-table-column-settings.tsx +52 -10
  627. package/src/components/data-table-filters.ts +6 -4
  628. package/src/components/data-table-fit.ts +19 -5
  629. package/src/components/data-table-groups.tsx +1 -1
  630. package/src/components/data-table-head.tsx +32 -22
  631. package/src/components/data-table-mobile.tsx +110 -27
  632. package/src/components/data-table-pagination.tsx +21 -6
  633. package/src/components/data-table-resize.ts +1 -1
  634. package/src/components/data-table-row-actions.tsx +3 -3
  635. package/src/components/data-table-row.tsx +25 -14
  636. package/src/components/data-table-selection.ts +1 -1
  637. package/src/components/data-table-shared.tsx +33 -1
  638. package/src/components/data-table-sort.ts +57 -2
  639. package/src/components/data-table-virtual.ts +32 -8
  640. package/src/components/data-table.tsx +267 -41
  641. package/src/components/date-field.tsx +65 -8
  642. package/src/components/date-picker.tsx +125 -48
  643. package/src/components/date-range-picker.tsx +82 -31
  644. package/src/components/dialog-frame.tsx +2 -1
  645. package/src/components/entity-combobox.tsx +4 -1
  646. package/src/components/error-boundary.tsx +53 -39
  647. package/src/components/field-base-labels.ts +20 -0
  648. package/src/components/field-base.tsx +13 -7
  649. package/src/components/field-sync-labels.ts +1 -0
  650. package/src/components/field-sync.tsx +23 -1
  651. package/src/components/form-actions.tsx +20 -5
  652. package/src/components/hover-menu.tsx +18 -8
  653. package/src/components/icon-button.tsx +14 -9
  654. package/src/components/inline-confirm.tsx +116 -0
  655. package/src/components/inline-entity-combobox.tsx +198 -152
  656. package/src/components/input.tsx +1 -1
  657. package/src/components/jump-calendar.tsx +30 -146
  658. package/src/components/legal-page.tsx +10 -7
  659. package/src/components/legal.tsx +4 -2
  660. package/src/components/lightbox.tsx +21 -8
  661. package/src/components/list.tsx +14 -5
  662. package/src/components/measured-grid.tsx +8 -4
  663. package/src/components/mini-calendar.tsx +6 -5
  664. package/src/components/modal.tsx +45 -4
  665. package/src/components/money-draft.ts +16 -5
  666. package/src/components/money-field.tsx +2 -2
  667. package/src/components/month-grid.tsx +229 -0
  668. package/src/components/month-picker.tsx +192 -200
  669. package/src/components/multi-entity-combobox.tsx +1 -0
  670. package/src/components/multi-select.tsx +21 -9
  671. package/src/components/number-field.tsx +14 -7
  672. package/src/components/number-input.tsx +9 -3
  673. package/src/components/numpad-sheet.tsx +4 -3
  674. package/src/components/picker-sheet.tsx +12 -9
  675. package/src/components/pie-chart-labels.ts +8 -0
  676. package/src/components/pie-chart.tsx +22 -28
  677. package/src/components/popover.tsx +18 -1
  678. package/src/components/reauth-dialog.tsx +6 -10
  679. package/src/components/row-actions.tsx +2 -1
  680. package/src/components/section-nav.tsx +7 -0
  681. package/src/components/series-chart-axes.ts +11 -3
  682. package/src/components/series-chart-labels.ts +7 -4
  683. package/src/components/series-chart.tsx +178 -69
  684. package/src/components/share-card.tsx +6 -6
  685. package/src/components/sign-chip-labels.ts +1 -0
  686. package/src/components/sign-chip.tsx +10 -1
  687. package/src/components/tabs-labels.ts +13 -0
  688. package/src/components/tabs.tsx +35 -19
  689. package/src/components/toggle-legend.tsx +16 -11
  690. package/src/components/translation-review-editor.tsx +6 -5
  691. package/src/components/translation-review.tsx +4 -3
  692. package/src/components/treemap-labels.ts +39 -0
  693. package/src/components/treemap-layout.ts +210 -0
  694. package/src/components/treemap.tsx +722 -133
  695. package/src/components/use-table-state.ts +12 -9
  696. package/src/data-table.ts +9 -2
  697. package/src/eslint/role-utilities.ts +97 -19
  698. package/src/feedback/feedback-dialog.tsx +30 -19
  699. package/src/feedback/feedback-mutation.ts +41 -0
  700. package/src/feedback/feedback-page-link.ts +90 -0
  701. package/src/feedback/feedback-public-list.tsx +17 -5
  702. package/src/feedback/feedback-replies.tsx +13 -6
  703. package/src/feedback/feedback-row-detail-labels.ts +5 -0
  704. package/src/feedback/feedback-row-detail.tsx +103 -67
  705. package/src/feedback/feedback-status-undo.ts +41 -27
  706. package/src/feedback/feedback-submit-dialog.tsx +2 -2
  707. package/src/feedback/feedback-submit.tsx +21 -7
  708. package/src/feedback/feedback-swipe.tsx +1 -1
  709. package/src/feedback/feedback-table.tsx +86 -38
  710. package/src/feedback/feedback-thread-labels.ts +2 -2
  711. package/src/feedback/feedback-thread.tsx +27 -25
  712. package/src/feedback.ts +42 -0
  713. package/src/hooks/use-dismiss.ts +3 -2
  714. package/src/hooks/use-focus-trap.ts +8 -24
  715. package/src/hooks/use-hotkey.ts +24 -7
  716. package/src/hooks/use-long-press.ts +16 -2
  717. package/src/hooks/use-media-query.ts +20 -4
  718. package/src/hooks/use-mounted.ts +39 -0
  719. package/src/hooks/use-overlay-history.ts +70 -5
  720. package/src/i18n/defaults.ts +4 -5
  721. package/src/i18n/german.ts +8 -2
  722. package/src/i18n/kit-labels.tsx +9 -2
  723. package/src/i18n/locales/es.ts +8 -2
  724. package/src/i18n/locales/fr.ts +21 -13
  725. package/src/i18n/locales/hu.ts +10 -2
  726. package/src/i18n/locales/it.ts +8 -2
  727. package/src/i18n/locales/zh.ts +9 -2
  728. package/src/i18n/review.ts +5 -0
  729. package/src/index.ts +103 -13
  730. package/src/landing/routing.tsx +14 -10
  731. package/src/lib/broadcast.ts +52 -0
  732. package/src/lib/calc.ts +13 -2
  733. package/src/lib/clipboard-minus.ts +14 -4
  734. package/src/lib/date-format.ts +89 -13
  735. package/src/lib/day-format.ts +96 -0
  736. package/src/lib/decimal-marks.ts +12 -3
  737. package/src/lib/describe-failure.ts +18 -0
  738. package/src/lib/direction.ts +39 -0
  739. package/src/lib/focus-left.ts +156 -0
  740. package/src/lib/format.ts +34 -19
  741. package/src/lib/http-status.ts +38 -0
  742. package/src/lib/intl-cache.ts +25 -0
  743. package/src/lib/isin.ts +10 -0
  744. package/src/lib/iso-day.ts +13 -0
  745. package/src/lib/lazy-with-fallback.ts +82 -0
  746. package/src/lib/path-pattern.ts +55 -0
  747. package/src/lib/reduced-motion.ts +2 -1
  748. package/src/lib/round.ts +7 -2
  749. package/src/lib/safe-storage.ts +48 -6
  750. package/src/lib/session-refresh.ts +1 -1
  751. package/src/lib/share-format.ts +18 -0
  752. package/src/lib/text-case.ts +19 -0
  753. package/src/lib/text-match.ts +69 -2
  754. package/src/lib/thenable.ts +19 -0
  755. package/src/lib/translation-review.ts +13 -5
  756. package/src/notifications/device-zone-report.ts +1 -1
  757. package/src/notifications/notification-bell.tsx +7 -4
  758. package/src/notifications/notification-inbox.tsx +40 -58
  759. package/src/notifications/notification-parts.tsx +3 -4
  760. package/src/notifications/notification-types-setting.tsx +1 -1
  761. package/src/notifications/notifications-labels.ts +7 -0
  762. package/src/notifications/push-device-setting.tsx +1 -1
  763. package/src/notifications/push-devices-setting.tsx +30 -55
  764. package/src/notifications/quiet-hours-setting.tsx +93 -31
  765. package/src/notifications/unsubscribe-panel.tsx +4 -7
  766. package/src/notifications/use-push-device.ts +76 -10
  767. package/src/offline/query-persistence.ts +35 -3
  768. package/src/rhf/fields.tsx +11 -4
  769. package/src/search/command-palette.tsx +2 -4
  770. package/src/search/global-search.tsx +36 -15
  771. package/src/search/use-command-key.ts +13 -12
  772. package/src/search.ts +9 -0
  773. package/src/settings/use-settings-focus.ts +3 -0
  774. package/src/shell/account-menu-language.tsx +27 -5
  775. package/src/shell/account-menu-text-size.tsx +32 -10
  776. package/src/shell/dev-menu.tsx +7 -21
  777. package/src/shell/role-switcher.tsx +7 -0
  778. package/src/shell/top-bar-actions.tsx +1 -1
  779. package/src/shell/top-bar-parts-labels.ts +0 -3
  780. package/src/shell.ts +40 -9
  781. package/src/sync/engine.ts +339 -61
  782. package/src/sync.ts +8 -1
  783. package/src/testing/css-variables.ts +8 -9
  784. package/src/theme/contrast.ts +8 -9
  785. package/src/theme/palette-store.ts +9 -9
  786. package/src/theme/text-size.ts +6 -8
  787. package/src/theme/theme-store.ts +7 -9
  788. package/src/tour/tour-catalogue.tsx +26 -15
  789. package/src/tour/tour-dock.ts +0 -2
  790. package/src/tour/tour-gates.ts +23 -0
  791. package/src/tour/tour-overlay.tsx +1170 -0
  792. package/src/tour/tour.tsx +116 -1193
  793. package/src/tour/use-tour-progress.ts +1 -1
  794. package/src/tour/use-tour-url-sync.ts +7 -3
  795. package/src/wizard/stepper-nav.tsx +3 -1
  796. package/src/wizard/types.ts +11 -2
  797. package/src/wizard/use-wizard.ts +2 -1
  798. package/src/wizard/validation.ts +8 -2
  799. package/tokens.css +2 -1
  800. package/dist/components/ui-labels.js.map +0 -1
  801. package/dist/shell/dev-switchers.d.ts +0 -6
  802. package/dist/shell/dev-switchers.js +0 -12
  803. package/dist/shell/dev-switchers.js.map +0 -1
  804. package/src/components/ui-labels.ts +0 -24
  805. package/src/shell/dev-switchers.tsx +0 -18
@@ -1,12 +1,13 @@
1
- // The two-date range picker: presets beside the calendar, `commit="apply"` drafts, a
2
- // custom trigger. Moved out of date-picker.tsx as it was (MOD-9, refactor audit
1
+ // The two-date range picker: presets beside the calendar, `apply` drafts, a custom
2
+ // trigger. Moved out of date-picker.tsx as it was (MOD-9, refactor audit
3
3
  // 2026-10); date-picker still exports every public name here.
4
4
  import { useState } from "react";
5
5
  import type { ReactNode } from "react";
6
6
  import { cn } from "../lib/cn";
7
7
  import { useKitLocale, type DatePickerLabels } from "../i18n/kit-labels";
8
8
  import { Button } from "./button";
9
- import { FieldBox, useFieldMessages } from "./field-parts";
9
+ import { FieldBox, LockedReason, useFieldMessages, useLockReason } from "./field-parts";
10
+ import type { CommitScope } from "./write-lock";
10
11
  import { usePhoneLayout } from "../hooks/use-breakpoint";
11
12
  import {
12
13
  DateField,
@@ -40,19 +41,13 @@ export interface DateRangePickerPreset {
40
41
  }
41
42
 
42
43
  /**
43
- * When the picker hands its range to `onChange`.
44
+ * The 0.x values of DateRangePicker's `commit`, when it was the panel's mode:
45
+ * `"immediate"` is `apply` left out, `"apply"` is `apply`. See
46
+ * {@link DateRangePickerProps.apply}.
44
47
  *
45
- * - `"immediate"` (the default, and all of 0.7): a preset click commits and closes,
46
- * and each calendar click is reported as it happens — the half-made `(from, "")`
47
- * included. The right shape for quick ranges on a filter, where one click is one
48
- * answer.
49
- * - `"apply"`: the panel works on a DRAFT. A preset ARMS the calendar instead of
50
- * committing, days can then be nudged ("last 3 months, but end it last Friday"),
51
- * and nothing reaches `onChange` until Apply — which stays disabled until both ends
52
- * exist. Cancel, Escape and an outside click discard the draft, and every open
53
- * starts again from the committed value. keksdose's report range asked for exactly
54
- * this: each commit there re-runs a whole page of charts, so an intermediate state
55
- * must never escape the panel.
48
+ * @deprecated 0.52 — DateRangePicker's `apply` (`commit="apply"` → `apply`, `"immediate"`
49
+ * → nothing); removed in 0.53. `commit` is the write lock's opt-in on every other kit
50
+ * control, and since 0.52 on this one too (refactor audit 2026-10-30, API-3).
56
51
  */
57
52
  export type DateRangeCommit = "immediate" | "apply";
58
53
 
@@ -65,8 +60,9 @@ export interface DateRangePickerProps extends DatePickerBaseProps {
65
60
  onChange: (from: string, to: string, presetId?: string) => void;
66
61
  /** Separator between the two formatted dates in the trigger (default " – "). */
67
62
  separator?: string;
68
- /** Optional named ranges rendered as a start-side column (last month / YTD / …). */
69
- presets?: DateRangePickerPreset[];
63
+ /** Optional named ranges rendered as a start-side column (last month / YTD / …).
64
+ * `readonly` since 0.52 (API-7): the picker never changes the list. */
65
+ presets?: readonly DateRangePickerPreset[];
70
66
  /**
71
67
  * The active preset's `id`, controlled — e.g. straight from keksdose's `?preset=`.
72
68
  * `null` (or an id no preset has, such as `"custom"`) says "no preset": nothing in
@@ -77,8 +73,39 @@ export interface DateRangePickerProps extends DatePickerBaseProps {
77
73
  * itself; with no memory at all it falls back to the first preset whose dates match.
78
74
  */
79
75
  preset?: string | null;
80
- /** See {@link DateRangeCommit}. Default `"immediate"`. */
81
- commit?: DateRangeCommit;
76
+ /**
77
+ * When the picker hands its range to `onChange`.
78
+ *
79
+ * - Left out (the default, and all of 0.7): a preset click commits and closes, and
80
+ * each calendar click is reported as it happens — the half-made `(from, "")`
81
+ * included. The right shape for quick ranges on a filter, where one click is one
82
+ * answer.
83
+ * - `apply`: the panel works on a DRAFT. A preset ARMS the calendar instead of
84
+ * committing, days can then be nudged ("last 3 months, but end it last Friday"),
85
+ * and nothing reaches `onChange` until Apply — which stays disabled until both ends
86
+ * exist. Cancel, Escape and an outside click discard the draft, and every open
87
+ * starts again from the committed value. keksdose's report range asked for exactly
88
+ * this: each commit there re-runs a whole page of charts, so an intermediate state
89
+ * must never escape the panel.
90
+ *
91
+ * `commit="apply"` until 0.52 (refactor audit 2026-10-30, API-3): `commit` is the write
92
+ * lock's prop on every other kit control. The old spelling still works for 0.52 and
93
+ * goes in 0.53 ({@link DateRangeCommit}); `apply` wins where both are given.
94
+ */
95
+ apply?: boolean;
96
+ /**
97
+ * This picker COMMITS — picking a range saves it (a report's period kept per user, a
98
+ * filter persisted as it moves). Under a locked {@link WriteLockProvider} it is locked
99
+ * the `disabledReason` way, with the lock's reason; a {@link CommitScope}, as on every
100
+ * kit control since 0.33, and on this one since 0.52 (API-3). A range inside a form with
101
+ * its own Save stays editable under the lock — leave this off there.
102
+ *
103
+ * The strings `"immediate"` and `"apply"` are the panel's mode, the 0.x meaning of this
104
+ * prop: deprecated, read as `apply` for one minor, removed in 0.53 — see
105
+ * {@link DateRangeCommit}. They cannot be taken for a scope, which is a boolean or an
106
+ * object.
107
+ */
108
+ commit?: CommitScope | DateRangeCommit;
82
109
  /**
83
110
  * Draw the trigger yourself. keksdose's report range field
84
111
  * (reports/report-range-field.tsx, "Why this is app-level") is why: its trigger
@@ -103,7 +130,7 @@ export interface DateRangePickerProps extends DatePickerBaseProps {
103
130
  */
104
131
  sheetBackCloses?: boolean;
105
132
  /**
106
- * With `commit="apply"`: a line above the calendar saying what Apply would commit —
133
+ * With `apply`: a line above the calendar saying what Apply would commit —
107
134
  * keksdose's report range writes "Custom · 1 Mar 2026 – …" there
108
135
  * (report-range-field.tsx), the one place a preset armed and then nudged by a day is
109
136
  * seen to have become "Custom", and a half-made range to still lack its end. Called
@@ -112,7 +139,7 @@ export interface DateRangePickerProps extends DatePickerBaseProps {
112
139
  * `""` until the second click. The line is a polite live region, so a screen reader
113
140
  * hears the draft change as the calendar is used.
114
141
  *
115
- * Ignored in `"immediate"` mode, where there is no draft: every click is the value.
142
+ * Ignored without `apply`, where there is no draft: every click is the value.
116
143
  */
117
144
  renderDraftSummary?: (draft: DateRangeDraftSummary) => ReactNode;
118
145
  }
@@ -218,8 +245,8 @@ function PresetColumn({
218
245
  }
219
246
 
220
247
  /**
221
- * The panel's body. A component of its own so `commit="apply"` can keep its draft in
222
- * state that is born when the panel opens: `Popover` unmounts its children on close,
248
+ * The panel's body. A component of its own so `apply` can keep its draft in state that
249
+ * is born when the panel opens: `Popover` unmounts its children on close,
223
250
  * so the draft is re-seeded from the committed value on every open, and an abandoned
224
251
  * half-selection cannot survive into the next one.
225
252
  */
@@ -229,7 +256,7 @@ function RangePanel({
229
256
  presets,
230
257
  activeId,
231
258
  controlled,
232
- commit,
259
+ drafting,
233
260
  close,
234
261
  frame,
235
262
  sheet,
@@ -243,7 +270,8 @@ function RangePanel({
243
270
  presets: readonly DateRangePickerPreset[] | undefined;
244
271
  activeId: string | null | undefined;
245
272
  controlled: boolean;
246
- commit: DateRangeCommit;
273
+ /** `apply`: the panel works on a draft. */
274
+ drafting: boolean;
247
275
  close: () => void;
248
276
  /** Where the body and the Apply row go — see `PanelFrame`. */
249
277
  frame: PanelFrame;
@@ -253,7 +281,6 @@ function RangePanel({
253
281
  labels: DatePickerLabels;
254
282
  renderDraftSummary?: DateRangePickerProps["renderDraftSummary"];
255
283
  }) {
256
- const drafting = commit === "apply";
257
284
  const [draft, setDraft] = useState<RangeDraft>({
258
285
  from,
259
286
  to,
@@ -360,8 +387,8 @@ function RangePanel({
360
387
  }
361
388
 
362
389
  /** Two-date range picker: click a start then an end; closes once both are set.
363
- * With `presets`, a column of named ranges is shown beside the calendar; with
364
- * `commit="apply"` the panel drafts and commits on Apply (see {@link DateRangeCommit}). */
390
+ * With `presets`, a column of named ranges is shown beside the calendar; with `apply`
391
+ * the panel drafts and commits on Apply (see {@link DateRangePickerProps.apply}). */
365
392
  export function DateRangePicker(props: DateRangePickerProps) {
366
393
  const {
367
394
  from,
@@ -376,7 +403,8 @@ export function DateRangePicker(props: DateRangePickerProps) {
376
403
  separator = " – ",
377
404
  presets,
378
405
  preset,
379
- commit = "immediate",
406
+ apply,
407
+ commit,
380
408
  renderTrigger,
381
409
  sheetBackCloses,
382
410
  renderDraftSummary,
@@ -386,10 +414,13 @@ export function DateRangePicker(props: DateRangePickerProps) {
386
414
  clearable,
387
415
  clearLabel,
388
416
  disabled,
417
+ disabledReason,
418
+ disabledReasonDisplay,
389
419
  invalid,
390
420
  hint,
391
421
  help,
392
422
  error,
423
+ className,
393
424
  // The trigger's (API-3).
394
425
  ref,
395
426
  ...rest
@@ -397,6 +428,11 @@ export function DateRangePicker(props: DateRangePickerProps) {
397
428
  const locale = useKitLocale(localeProp);
398
429
  const text = useDatePickerLabels(clearLabel, undefined, undefined);
399
430
  const render = useTriggerFormat("dateRangePicker", locale, formatOptions, formatValue);
431
+ // `commit` is two props until 0.53: a string is the deprecated mode, anything else
432
+ // the write lock's scope (API-3).
433
+ const drafting = apply ?? commit === "apply";
434
+ const lock = useLockReason(typeof commit === "string" ? undefined : commit, disabledReason);
435
+ const locked = lock.locked;
400
436
  const messages = useFieldMessages({
401
437
  hint,
402
438
  help,
@@ -405,6 +441,8 @@ export function DateRangePicker(props: DateRangePickerProps) {
405
441
  invalid,
406
442
  describedBy: rest["aria-describedby"],
407
443
  ariaInvalid: rest["aria-invalid"],
444
+ // A lock's reason between the caption and the error, as on Select.
445
+ reasonId: locked && lock.reasonId,
408
446
  });
409
447
  // The preset this picker committed itself, for a caller that does not control
410
448
  // `preset`. Cleared by a hand-picked range or a clear.
@@ -417,6 +455,7 @@ export function DateRangePicker(props: DateRangePickerProps) {
417
455
  const hasPresets = Boolean(presets && presets.length > 0);
418
456
  const sheet = usePhoneLayout();
419
457
  const commitRange = (f: string, t: string, presetId: string | undefined) => {
458
+ if (locked) return;
420
459
  setOwnPreset(presetId);
421
460
  // Two arguments when no preset is involved — exactly the 0.7 call, so a caller's
422
461
  // `toHaveBeenCalledWith(from, to)` and a variadic handler see no difference.
@@ -434,6 +473,9 @@ export function DateRangePicker(props: DateRangePickerProps) {
434
473
  clearLabel={text.clear}
435
474
  panelLabel={text.rangePanel}
436
475
  disabled={disabled}
476
+ locked={locked}
477
+ // Locked, the caller's classes are the reason's frame's (below).
478
+ className={locked ? undefined : className}
437
479
  invalid={messages.isInvalid}
438
480
  // Widen so the preset column sits beside the calendar (default otherwise).
439
481
  width={hasPresets ? "27.5rem" : undefined}
@@ -463,7 +505,7 @@ export function DateRangePicker(props: DateRangePickerProps) {
463
505
  presets={presets}
464
506
  activeId={activeId}
465
507
  controlled={controlled}
466
- commit={commit}
508
+ drafting={drafting}
467
509
  close={close}
468
510
  frame={frame}
469
511
  sheet={sheet}
@@ -475,9 +517,18 @@ export function DateRangePicker(props: DateRangePickerProps) {
475
517
  )}
476
518
  </DateField>
477
519
  );
520
+ const box = withEndHint(field, label === undefined ? messages.labelHint : undefined);
478
521
  return (
479
522
  <FieldBox below={messages.below} reserve={"error" in props || "hint" in props}>
480
- {withEndHint(field, label === undefined ? messages.labelHint : undefined)}
523
+ {locked ? (
524
+ // DatePicker's frame: the line under the field, or the Tooltip with a hidden copy
525
+ // for `aria-describedby`; the outermost box, so it takes the caller's classes.
526
+ <LockedReason lock={lock} display={disabledReasonDisplay} className={cn("block", className)}>
527
+ {box}
528
+ </LockedReason>
529
+ ) : (
530
+ box
531
+ )}
481
532
  </FieldBox>
482
533
  );
483
534
  }
@@ -25,7 +25,8 @@ export { DEFAULT_DIALOG_FRAME_LABELS };
25
25
  * `PickerSheet` met first. Everything else, `size`, `draggable`, `fullBleed`,
26
26
  * `onKeyDown`, a `data-tour` anchor, still reaches the `Modal` — and since 0.35 `ref`
27
27
  * (round 0.35 R4): the panel, the `role="dialog"` element the frame's header, body and
28
- * actions sit in.
28
+ * actions sit in. `busy` too (DUP-3): it holds the frame's X and the `close` that
29
+ * `actions` and `headerActions` receive, since both are the `Modal`'s own close.
29
30
  */
30
31
  export interface DialogFrameProps extends Omit<ModalProps, "labelledBy" | "children" | "title"> {
31
32
  /** The heading, and therefore the dialog's accessible name (`aria-labelledby`). */
@@ -12,7 +12,7 @@ import {
12
12
  type ComboClearValue,
13
13
  type ComboOption,
14
14
  } from "./combobox-core";
15
- import { DEFAULT_COMBOBOX_LABELS, DEFAULT_COMMON_LABELS, useKitLabels } from "../i18n/kit-labels";
15
+ import { DEFAULT_COMBOBOX_LABELS, DEFAULT_COMMON_LABELS, useKitLabels, useKitLocale } from "../i18n/kit-labels";
16
16
  import {
17
17
  assignRef,
18
18
  EndHintRow,
@@ -248,11 +248,14 @@ export function EntityCombobox<V extends string | number, C extends ComboClearVa
248
248
  const chosen: V | null = value == null || value === clearValue ? null : (value as V);
249
249
  const selectedOption = chosen == null ? null : resolve(chosen);
250
250
  const q = query.trim();
251
+ // The create row's "is this name already listed" folds as the list's match does (DUP-5).
252
+ const locale = useKitLocale();
251
253
  const showCreate = offersCreate(
252
254
  onCreate,
253
255
  q,
254
256
  results.map((o) => o.label),
255
257
  createEmptyLabel,
258
+ locale,
256
259
  );
257
260
  const showClear = Boolean(clearable && chosen != null && !inert);
258
261
  /** What the closed control is showing — the second half of its accessible name. */
@@ -1,4 +1,4 @@
1
- import { Component } from "react";
1
+ import { Component, useEffect } from "react";
2
2
  import type { ErrorInfo, ReactNode } from "react";
3
3
  import { AlertTriangle, RefreshCw, WifiOff } from "lucide-react";
4
4
  import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
@@ -7,6 +7,7 @@ import { EmptyState } from "./empty-state";
7
7
  import { CopyButton } from "./copy-button";
8
8
  import { Disclosure } from "./disclosure";
9
9
  import { documentNavigation } from "../lib/document-navigation";
10
+ import { useAnnounce } from "../hooks/use-announce";
10
11
  import { DEFAULT_ERROR_BOUNDARY_LABELS } from "./error-boundary-labels";
11
12
 
12
13
  /** The words of the default fallback. */
@@ -605,6 +606,17 @@ function ErrorFallback({
605
606
  const reportText = report ? formatCrashReport(report) : null;
606
607
  const errorLine = details.message ? `${details.name}: ${details.message}` : details.name;
607
608
 
609
+ // The title and the hint, said once through an assertive region of their own (0.52,
610
+ // refactor audit 2026-10-30, DSP-17). `role="alert"` on the whole box put the actions
611
+ // in it, so each later insertion was read out as news: "Copy error report" and
612
+ // "Details" on `componentDidCatch`'s second render, "Reported as …", and on opening
613
+ // Details both stacks of the crash report. EmptyState has no wrapper for title and
614
+ // hint alone, and a region mounted with its message is often missed anyway.
615
+ const alert = useAnnounce({ politeness: "assertive" });
616
+ const { announce } = alert;
617
+ const spoken = `${title}. ${hint}`;
618
+ useEffect(() => announce(spoken), [announce, spoken]);
619
+
608
620
  const reloadButton = (
609
621
  <Button key="reload" variant={mode === "error" ? "secondary" : "default"} onClick={reloadPage}>
610
622
  {text.reload}
@@ -619,43 +631,45 @@ function ErrorFallback({
619
631
  );
620
632
 
621
633
  return (
622
- <EmptyState
623
- role="alert"
624
- tone={mode === "error" ? "danger" : undefined}
625
- headingAs={headingAs}
626
- className={className}
627
- icon={<Icon />}
628
- title={title}
629
- hint={hint}
630
- action={
631
- <>
632
- {showMessage && mode === "error" && (
633
- // A quotation, not prose: left-aligned and monospaced, so it reads as the
634
- // program's words and can be read out or screenshotted verbatim.
635
- <p
636
- data-error-message=""
637
- className="-mt-1 mb-1 basis-full whitespace-pre-wrap break-words rounded-md border border-danger-strong bg-danger-soft px-3 py-2 text-start font-mono text-xs text-primary"
638
- >
639
- {errorLine}
640
- </p>
641
- )}
642
- {filing === "filed" && (
643
- <p className="-mt-1 mb-1 basis-full text-xs">{reference ? text.reportedAs(reference) : text.reported}</p>
644
- )}
645
- {mode === "error" ? [retryButton, reloadButton] : [reloadButton, retryButton]}
646
- {copyReport && reportText !== null && filing !== "filed" && (
647
- <CopyButton variant="label" buttonVariant="ghost" label={text.copyReport} text={reportText} />
648
- )}
649
- {actions}
650
- {showDetails && reportText !== null && (
651
- <Disclosure variant="bare" title={text.details} className="basis-full text-start">
652
- <pre className="max-h-60 overflow-auto whitespace-pre-wrap break-words text-xs text-secondary">
653
- {reportText}
654
- </pre>
655
- </Disclosure>
656
- )}
657
- </>
658
- }
659
- />
634
+ <>
635
+ <span {...alert.regionProps} />
636
+ <EmptyState
637
+ tone={mode === "error" ? "danger" : undefined}
638
+ headingAs={headingAs}
639
+ className={className}
640
+ icon={<Icon />}
641
+ title={title}
642
+ hint={hint}
643
+ action={
644
+ <>
645
+ {showMessage && mode === "error" && (
646
+ // A quotation, not prose: left-aligned and monospaced, so it reads as the
647
+ // program's words and can be read out or screenshotted verbatim.
648
+ <p
649
+ data-error-message=""
650
+ className="-mt-1 mb-1 basis-full whitespace-pre-wrap break-words rounded-md border border-danger-strong bg-danger-soft px-3 py-2 text-start font-mono text-xs text-primary"
651
+ >
652
+ {errorLine}
653
+ </p>
654
+ )}
655
+ {filing === "filed" && (
656
+ <p className="-mt-1 mb-1 basis-full text-xs">{reference ? text.reportedAs(reference) : text.reported}</p>
657
+ )}
658
+ {mode === "error" ? [retryButton, reloadButton] : [reloadButton, retryButton]}
659
+ {copyReport && reportText !== null && filing !== "filed" && (
660
+ <CopyButton variant="label" buttonVariant="ghost" label={text.copyReport} text={reportText} />
661
+ )}
662
+ {actions}
663
+ {showDetails && reportText !== null && (
664
+ <Disclosure variant="bare" title={text.details} className="basis-full text-start">
665
+ <pre className="max-h-60 overflow-auto whitespace-pre-wrap break-words text-xs text-secondary">
666
+ {reportText}
667
+ </pre>
668
+ </Disclosure>
669
+ )}
670
+ </>
671
+ }
672
+ />
673
+ </>
660
674
  );
661
675
  }
@@ -0,0 +1,20 @@
1
+ // The English words of ./field-base, in a module with no component code: the English
2
+ // catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one
3
+ // chunk like the other languages (0.34, KS U8). ./field-base re-exports them.
4
+ //
5
+ // Until 0.52 they shared ui-labels.ts with the tabs' words, named after the ui.tsx that
6
+ // 0.34 split up (MOD-7, refactor audit 2026-10-30): one labels module per component now,
7
+ // as every other `*-labels.ts` is.
8
+
9
+ import type { CharacterCountLabels, PasswordRevealLabels } from "./field-base";
10
+
11
+ export const DEFAULT_PASSWORD_REVEAL_LABELS: PasswordRevealLabels = {
12
+ show: "Show password",
13
+ hide: "Hide password",
14
+ };
15
+
16
+ export const DEFAULT_CHARACTER_COUNT_LABELS: CharacterCountLabels = {
17
+ count: (used, max) => `${used} of ${max} characters`,
18
+ remaining: (left) => (left === 1 ? "1 character left" : `${left} characters left`),
19
+ limitReached: "Character limit reached",
20
+ };
@@ -11,7 +11,7 @@ import {
11
11
  STATIC_LABEL_TYPE,
12
12
  type FieldHintParts,
13
13
  } from "./field-parts";
14
- import { DEFAULT_CHARACTER_COUNT_LABELS, DEFAULT_PASSWORD_REVEAL_LABELS } from "./ui-labels";
14
+ import { DEFAULT_CHARACTER_COUNT_LABELS, DEFAULT_PASSWORD_REVEAL_LABELS } from "./field-base-labels";
15
15
 
16
16
  /**
17
17
  * The field base: what Input, Select and Textarea — and every kit field built on the same
@@ -20,7 +20,8 @@ import { DEFAULT_CHARACTER_COUNT_LABELS, DEFAULT_PASSWORD_REVEAL_LABELS } from "
20
20
  * reveal and the character counter. The message under a wrong field is field-parts'
21
21
  * `useFieldError`, every field's.
22
22
  *
23
- * Public through ./ui by name. `FieldGroup`, the counter and the placeholder helpers are
23
+ * Public through the barrel (src/index.ts) by name. `FieldGroup`, the counter and the
24
+ * placeholder helpers are
24
25
  * the three fields' shared parts (`@internal`), as are the Select's own classes and its
25
26
  * `SelectWidthFloor` (0.51).
26
27
  */
@@ -47,7 +48,12 @@ export const FIELD_BASE =
47
48
  // doubles the line inward — FIELD_INVALID's border-plus-ring (live #295), and the
48
49
  // DatePicker stepper's fix (0.34) — so every side keeps one fully covered device
49
50
  // pixel. Inset: nothing outside the field moves or is covered.
50
- "focus:ring-1 focus:ring-inset focus:ring-brand " +
51
+ //
52
+ // Under More contrast the ring is 2px, so the line is 3px — what `--focus-ring-width`
53
+ // gives every `FOCUS_RING` there, and what `appearance.contrastHelp` promises ("thickens
54
+ // focus frames"); before 0.52 a text field kept its 2px (refactor audit 2026-10-30,
55
+ // DOC-2). Still inset, so nothing moves.
56
+ "focus:ring-1 contrast:focus:ring-2 focus:ring-inset focus:ring-brand " +
51
57
  // §10.1: at least 16 px on a touch screen, or iOS zooms the page on focus.
52
58
  FIELD_TOUCH_TEXT +
53
59
  " " +
@@ -106,9 +112,9 @@ export const FIELD_FLOATING_PAD = "pt-4 pb-1 large:py-2";
106
112
  //
107
113
  // A ring rather than `border-2`: a box-shadow adds no layout, so an invalid field
108
114
  // stays exactly the size of a valid one and nothing beside it moves when the value
109
- // arrives.
115
+ // arrives. Under More contrast the ring is 2px, as FIELD_BASE's focus line (0.52, DOC-2).
110
116
  export const FIELD_INVALID =
111
- "border-danger-strong ring-1 ring-danger-strong focus:border-[var(--danger)] focus:ring-[var(--danger)]";
117
+ "border-danger-strong ring-1 contrast:ring-2 ring-danger-strong focus:border-[var(--danger)] focus:ring-[var(--danger)]";
112
118
 
113
119
  export const FLOATING_INPUT_CLASS = cn(FIELD_BASE, FIELD_FLOATING_PAD, "peer placeholder:text-transparent");
114
120
 
@@ -504,7 +510,7 @@ export interface PasswordRevealLabels {
504
510
  hide: string;
505
511
  }
506
512
 
507
- // Defined in ./ui-labels, which holds no component code (0.34, KS U8).
513
+ // Defined in ./field-base-labels, which holds no component code (0.34, KS U8).
508
514
  export { DEFAULT_PASSWORD_REVEAL_LABELS };
509
515
 
510
516
  /**
@@ -523,7 +529,7 @@ export interface CharacterCountLabels {
523
529
  limitReached: string;
524
530
  }
525
531
 
526
- // Defined in ./ui-labels, which holds no component code (0.34, KS U8).
532
+ // Defined in ./field-base-labels, which holds no component code (0.34, KS U8).
527
533
  export { DEFAULT_CHARACTER_COUNT_LABELS };
528
534
 
529
535
  /** The length the browser's own `maxLength` counts — UTF-16 code units — so the counter
@@ -4,6 +4,7 @@
4
4
 
5
5
  import type { FieldSyncLabels } from "./field-sync";
6
6
 
7
+ /** @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53. */
7
8
  export const DEFAULT_FIELD_SYNC_LABELS: FieldSyncLabels = {
8
9
  synced: "Saved",
9
10
  edited: "Unsaved changes",
@@ -23,9 +23,17 @@ import { DEFAULT_FIELD_SYNC_LABELS } from "./field-sync-labels";
23
23
  * because the state is useful without the dot — a form can disable its submit
24
24
  * button while any field is `pending`, and a router can block navigation while
25
25
  * any field is `edited`.
26
+ *
27
+ * Deprecated in 0.52 as a whole, removed in 0.53 (decision 4 of the refactor audit
28
+ * 2026-10-30, MOD-5): no app renders it or calls the hook — 483 lines and a namespace in
29
+ * seven catalogues that only this package's tests and showcase read. An app that wants
30
+ * it keeps a copy of this file.
31
+ *
32
+ * @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53.
26
33
  */
27
34
  export type FieldSyncState = "synced" | "edited" | "pending" | "error";
28
35
 
36
+ /** @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53. */
29
37
  export interface FieldSyncLabels {
30
38
  synced: string;
31
39
  edited: string;
@@ -38,6 +46,7 @@ export interface FieldSyncLabels {
38
46
  // Defined in ./field-sync-labels, which holds no component code (0.34, KS U8).
39
47
  export { DEFAULT_FIELD_SYNC_LABELS };
40
48
 
49
+ /** @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53. */
41
50
  export interface UseFieldSyncOptions<T> {
42
51
  /** What the database currently holds. Changing it re-seeds a CLEAN field. */
43
52
  value: T;
@@ -57,6 +66,7 @@ export interface UseFieldSyncOptions<T> {
57
66
  onError?: (error: Error) => void;
58
67
  }
59
68
 
69
+ /** @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53. */
60
70
  export interface UseFieldSyncReturn<T> {
61
71
  /** The draft — bind this to the input, not the `value` option. */
62
72
  value: T;
@@ -101,6 +111,8 @@ function toError(cause: unknown): Error {
101
111
  * may be gone — a row scrolled out of a virtualised table, a closed dialog.
102
112
  * 4. **`onSave` is read through a ref**, so an inline arrow — which every call
103
113
  * site will pass — does not restart the debounce on every render.
114
+ *
115
+ * @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53.
104
116
  */
105
117
  export function useFieldSync<T>({
106
118
  value,
@@ -240,6 +252,7 @@ const STATE_STYLE: Record<FieldSyncState, { color: string; Icon: typeof Check }>
240
252
  error: { color: "var(--status-error)", Icon: AlertCircle },
241
253
  };
242
254
 
255
+ /** @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53. */
243
256
  export interface FieldSyncIndicatorProps {
244
257
  state: FieldSyncState;
245
258
  /** The failure. Its message becomes the tooltip when `state === "error"`. */
@@ -269,6 +282,8 @@ export interface FieldSyncIndicatorProps {
269
282
  * The state is also announced: the wrapper is a polite live region, so a screen
270
283
  * reader hears "Saving…" then "Saved" without the user going looking. `error` is
271
284
  * assertive instead — a failed write is worth interrupting for.
285
+ *
286
+ * @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53.
272
287
  */
273
288
  export function FieldSyncIndicator({
274
289
  state,
@@ -340,6 +355,8 @@ export function FieldSyncIndicator({
340
355
  * colour does not.
341
356
  *
342
357
  * Every class is a literal so Tailwind's scanner can see it.
358
+ *
359
+ * @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53.
343
360
  */
344
361
  export const FIELD_SYNC_FRAME: Record<FieldSyncState, string> = {
345
362
  synced:
@@ -352,9 +369,12 @@ export const FIELD_SYNC_FRAME: Record<FieldSyncState, string> = {
352
369
  "[&_:is(input,select,textarea)]:border-[var(--status-error)] [&_:is(input,select,textarea)]:ring-1 [&_:is(input,select,textarea)]:ring-[var(--status-error)] [&_:is(input,select,textarea):focus]:border-[var(--status-error)] [&_:is(input,select,textarea):focus]:ring-[var(--status-error)]",
353
370
  };
354
371
 
355
- /** How long the green "saved" frame and check stay after a save lands, in ms. */
372
+ /** How long the green "saved" frame and check stay after a save lands, in ms.
373
+ *
374
+ * @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53. */
356
375
  export const FIELD_SYNC_SAVED_MS = 1500;
357
376
 
377
+ /** @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53. */
358
378
  export interface FieldSyncRowProps<T> extends Omit<FieldSyncIndicatorProps, "state" | "error" | "showLabel"> {
359
379
  sync: UseFieldSyncReturn<T>;
360
380
  children: ReactNode;
@@ -386,6 +406,8 @@ export interface FieldSyncRowProps<T> extends Omit<FieldSyncIndicatorProps, "sta
386
406
  * always in the DOM as a live region — polite for the ordinary states, assertive for
387
407
  * a failure. The input gets end padding for the icon whether or not one is showing,
388
408
  * so the text never reflows when the state changes.
409
+ *
410
+ * @deprecated 0.52 — none: no app uses the FieldSync family (MOD-5); removed in 0.53.
389
411
  */
390
412
  export function FieldSyncRow<T>({
391
413
  sync,
@@ -5,7 +5,9 @@ import { cn } from "../lib/cn";
5
5
  import { useKitLabels } from "../i18n/kit-labels";
6
6
  import { useBreakpoint, usePhoneLayout } from "../hooks/use-breakpoint";
7
7
  import { useLargeText } from "../hooks/use-large-text";
8
- import { isApplePlatform } from "../hooks/use-hotkey";
8
+ import { isApplePlatform, matchesHotkey, type ParsedHotkey } from "../hooks/use-hotkey";
9
+ import { isComposing } from "../lib/ime";
10
+ import { hasContent } from "../lib/presence";
9
11
  import { Button, type ButtonProps } from "./button";
10
12
  import { Spinner } from "./spinner";
11
13
  import type { ButtonSize, ButtonVariant } from "./button-look";
@@ -337,6 +339,17 @@ function shortcutScope(row: HTMLElement | null, formId: string | undefined): Ele
337
339
  return row.closest("form") ?? row.closest('[role="dialog"]') ?? row.parentElement;
338
340
  }
339
341
 
342
+ /**
343
+ * What {@link FormActionsProps.submitShortcut} answers, on every platform: Ctrl+Enter and
344
+ * Cmd+Enter with nothing else held, read by `matchesHotkey` as every kit shortcut is
345
+ * (refactor audit 2026-10-30, DUP-12). Literals, not `parseHotkey` calls: no module-scope
346
+ * call for a bundler to keep.
347
+ */
348
+ const SUBMIT_CHORDS: readonly ParsedHotkey[] = [
349
+ { ctrl: true, meta: false, shift: false, alt: false, key: "Enter" },
350
+ { ctrl: false, meta: true, shift: false, alt: false, key: "Enter" },
351
+ ];
352
+
340
353
  function isDestructiveData(value: unknown): value is FormActionsDestructive {
341
354
  return typeof value === "object" && value !== null && !isValidElement(value) && "onClick" in value;
342
355
  }
@@ -429,8 +442,9 @@ export function FormActions({
429
442
  useEffect(() => {
430
443
  if (submitShortcut !== "mod-enter") return;
431
444
  const onKeyDown = (e: KeyboardEvent) => {
432
- if (e.key !== "Enter" || !(e.ctrlKey || e.metaKey) || e.shiftKey || e.altKey) return;
433
- if (e.repeat || e.isComposing || e.defaultPrevented || !canSaveRef.current) return;
445
+ if (!SUBMIT_CHORDS.some((chord) => matchesHotkey(e, chord))) return;
446
+ // `isComposing` is lib/ime's: Safari's composition-ending Enter (keyCode 229) too.
447
+ if (e.repeat || isComposing(e) || e.defaultPrevented || !canSaveRef.current) return;
434
448
  const scope = shortcutScope(rootRef.current, form);
435
449
  if (!scope || !(e.target instanceof Node) || !scope.contains(e.target)) return;
436
450
  e.preventDefault();
@@ -442,8 +456,9 @@ export function FormActions({
442
456
  const apple = submitShortcut ? isApplePlatform() : false;
443
457
  const placement = useResolvedPlacement(placementProp);
444
458
  const bleedLength = bleed === undefined || bleed === "" ? undefined : cssLength(bleed);
445
- const hasDestructive = destructive !== undefined && destructive !== null && destructive !== false;
446
- const hasStart = startSlot !== undefined && startSlot !== null && startSlot !== false;
459
+ // `hasContent` (DUP-14): an empty string is no slot either, not an empty `me-auto` box.
460
+ const hasDestructive = isDestructiveData(destructive) || hasContent(destructive);
461
+ const hasStart = hasContent(startSlot);
447
462
  const justify = align ?? (hasDestructive || hasStart ? "between" : "end");
448
463
  const destructiveNode = !hasDestructive ? null : isDestructiveData(destructive) ? (
449
464
  <Button