@eifi1/ui-kit 0.51.7 → 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 (746) hide show
  1. package/README.md +141 -23
  2. package/dist/account/account-parts.d.ts +10 -8
  3. package/dist/account/account-parts.js +1 -18
  4. package/dist/account/account-parts.js.map +1 -1
  5. package/dist/account/data-export-setting-labels.js +1 -1
  6. package/dist/account/data-export-setting-labels.js.map +1 -1
  7. package/dist/account/delete-account-setting-labels.js +1 -1
  8. package/dist/account/delete-account-setting-labels.js.map +1 -1
  9. package/dist/account/email-change-setting-labels.js +1 -1
  10. package/dist/account/email-change-setting-labels.js.map +1 -1
  11. package/dist/account/passkeys-setting.d.ts +9 -2
  12. package/dist/account/passkeys-setting.js +41 -29
  13. package/dist/account/passkeys-setting.js.map +1 -1
  14. package/dist/account/sessions-setting.d.ts +3 -2
  15. package/dist/account/sessions-setting.js +10 -8
  16. package/dist/account/sessions-setting.js.map +1 -1
  17. package/dist/admin/admin-action-confirm.js +1 -3
  18. package/dist/admin/admin-action-confirm.js.map +1 -1
  19. package/dist/admin/admin-parts.d.ts +6 -3
  20. package/dist/admin/admin-parts.js +6 -21
  21. package/dist/admin/admin-parts.js.map +1 -1
  22. package/dist/admin/mail-test-card-labels.js +1 -1
  23. package/dist/admin/mail-test-card-labels.js.map +1 -1
  24. package/dist/admin/plan-change-labels.d.ts +2 -2
  25. package/dist/admin/plan-change-labels.js +1 -17
  26. package/dist/admin/plan-change-labels.js.map +1 -1
  27. package/dist/admin/plan-change.d.ts +3 -42
  28. package/dist/admin/plan-change.js +1 -1
  29. package/dist/admin/plan-change.js.map +1 -1
  30. package/dist/admin/reviewer-scope-editor.js +3 -3
  31. package/dist/admin/reviewer-scope-editor.js.map +1 -1
  32. package/dist/auth/auth-errors-labels.d.ts +11 -0
  33. package/dist/auth/auth-errors-labels.js +13 -0
  34. package/dist/auth/auth-errors-labels.js.map +1 -0
  35. package/dist/auth/auth-errors.d.ts +7 -23
  36. package/dist/auth/auth-errors.js +2 -15
  37. package/dist/auth/auth-errors.js.map +1 -1
  38. package/dist/auth/complete-name-dialog.js +2 -1
  39. package/dist/auth/complete-name-dialog.js.map +1 -1
  40. package/dist/auth/forgot-password-form-labels.js +1 -1
  41. package/dist/auth/forgot-password-form-labels.js.map +1 -1
  42. package/dist/auth/forgot-password-form.js +7 -2
  43. package/dist/auth/forgot-password-form.js.map +1 -1
  44. package/dist/auth/register-form-labels.js +1 -1
  45. package/dist/auth/register-form-labels.js.map +1 -1
  46. package/dist/auth/reset-password-form-labels.js +1 -1
  47. package/dist/auth/reset-password-form-labels.js.map +1 -1
  48. package/dist/auth/reset-password-form.js +5 -1
  49. package/dist/auth/reset-password-form.js.map +1 -1
  50. package/dist/auth/sign-in-form-labels.js +1 -1
  51. package/dist/auth/sign-in-form-labels.js.map +1 -1
  52. package/dist/auth/status-parts.d.ts +0 -3
  53. package/dist/auth/status-parts.js +0 -4
  54. package/dist/auth/status-parts.js.map +1 -1
  55. package/dist/auth/verify-email-labels.js +1 -1
  56. package/dist/auth/verify-email-labels.js.map +1 -1
  57. package/dist/auth/verify-email.js +7 -2
  58. package/dist/auth/verify-email.js.map +1 -1
  59. package/dist/billing/cancel-subscription.d.ts +20 -8
  60. package/dist/billing/cancel-subscription.js +7 -5
  61. package/dist/billing/cancel-subscription.js.map +1 -1
  62. package/dist/billing/dialog-close.d.ts +29 -0
  63. package/dist/billing/dialog-close.js +8 -0
  64. package/dist/billing/dialog-close.js.map +1 -0
  65. package/dist/billing/plan-card.d.ts +14 -4
  66. package/dist/billing/plan-card.js +15 -8
  67. package/dist/billing/plan-card.js.map +1 -1
  68. package/dist/billing/plan-change-labels.d.ts +42 -0
  69. package/dist/billing/plan-change-labels.js +22 -0
  70. package/dist/billing/plan-change-labels.js.map +1 -0
  71. package/dist/billing/plan-switch.d.ts +19 -7
  72. package/dist/billing/plan-switch.js +8 -4
  73. package/dist/billing/plan-switch.js.map +1 -1
  74. package/dist/chart.d.ts +12 -0
  75. package/dist/chart.js +16 -1
  76. package/dist/chart.js.map +1 -1
  77. package/dist/components/account-chips.d.ts +5 -5
  78. package/dist/components/account-chips.js +11 -13
  79. package/dist/components/account-chips.js.map +1 -1
  80. package/dist/components/alert-banner.d.ts +16 -5
  81. package/dist/components/alert-banner.js +46 -1
  82. package/dist/components/alert-banner.js.map +1 -1
  83. package/dist/components/amount-input.d.ts +13 -0
  84. package/dist/components/amount-input.js +1 -0
  85. package/dist/components/amount-input.js.map +1 -1
  86. package/dist/components/autocomplete.js +57 -65
  87. package/dist/components/autocomplete.js.map +1 -1
  88. package/dist/components/bulk-action-bar.d.ts +12 -2
  89. package/dist/components/bulk-action-bar.js +65 -21
  90. package/dist/components/bulk-action-bar.js.map +1 -1
  91. package/dist/components/button-look.d.ts +5 -5
  92. package/dist/components/button-look.js.map +1 -1
  93. package/dist/components/button.d.ts +2 -2
  94. package/dist/components/button.js.map +1 -1
  95. package/dist/components/chart-edge.d.ts +16 -0
  96. package/dist/components/chart-edge.js +14 -1
  97. package/dist/components/chart-edge.js.map +1 -1
  98. package/dist/components/chart-figure.d.ts +13 -0
  99. package/dist/components/chart-figure.js +15 -0
  100. package/dist/components/chart-figure.js.map +1 -0
  101. package/dist/components/chart-zoom-core.js +1 -4
  102. package/dist/components/chart-zoom-core.js.map +1 -1
  103. package/dist/components/chart.d.ts +8 -1
  104. package/dist/components/chart.js +19 -10
  105. package/dist/components/chart.js.map +1 -1
  106. package/dist/components/combobox-core.d.ts +111 -2
  107. package/dist/components/combobox-core.js +148 -42
  108. package/dist/components/combobox-core.js.map +1 -1
  109. package/dist/components/combobox.d.ts +1 -1
  110. package/dist/components/combobox.js +141 -130
  111. package/dist/components/combobox.js.map +1 -1
  112. package/dist/components/copy-button.d.ts +6 -5
  113. package/dist/components/copy-button.js +5 -3
  114. package/dist/components/copy-button.js.map +1 -1
  115. package/dist/components/country-select.js +2 -2
  116. package/dist/components/country-select.js.map +1 -1
  117. package/dist/components/data-table-column-settings.d.ts +1 -1
  118. package/dist/components/data-table-column-settings.js +33 -7
  119. package/dist/components/data-table-column-settings.js.map +1 -1
  120. package/dist/components/data-table-filters.d.ts +4 -2
  121. package/dist/components/data-table-filters.js +2 -2
  122. package/dist/components/data-table-filters.js.map +1 -1
  123. package/dist/components/data-table-fit.d.ts +6 -4
  124. package/dist/components/data-table-fit.js +4 -1
  125. package/dist/components/data-table-fit.js.map +1 -1
  126. package/dist/components/data-table-groups.d.ts +1 -1
  127. package/dist/components/data-table-groups.js.map +1 -1
  128. package/dist/components/data-table-head.d.ts +1 -1
  129. package/dist/components/data-table-head.js +15 -12
  130. package/dist/components/data-table-head.js.map +1 -1
  131. package/dist/components/data-table-mobile.d.ts +12 -7
  132. package/dist/components/data-table-mobile.js +43 -30
  133. package/dist/components/data-table-mobile.js.map +1 -1
  134. package/dist/components/data-table-pagination.js +11 -6
  135. package/dist/components/data-table-pagination.js.map +1 -1
  136. package/dist/components/data-table-resize.d.ts +1 -1
  137. package/dist/components/data-table-resize.js.map +1 -1
  138. package/dist/components/data-table-row-actions.d.ts +2 -2
  139. package/dist/components/data-table-row-actions.js.map +1 -1
  140. package/dist/components/data-table-row.d.ts +6 -2
  141. package/dist/components/data-table-row.js +17 -10
  142. package/dist/components/data-table-row.js.map +1 -1
  143. package/dist/components/data-table-selection.d.ts +1 -1
  144. package/dist/components/data-table-selection.js.map +1 -1
  145. package/dist/components/data-table-shared.d.ts +10 -2
  146. package/dist/components/data-table-shared.js +18 -0
  147. package/dist/components/data-table-shared.js.map +1 -1
  148. package/dist/components/data-table-sort.d.ts +21 -2
  149. package/dist/components/data-table-sort.js +24 -0
  150. package/dist/components/data-table-sort.js.map +1 -1
  151. package/dist/components/data-table-virtual.d.ts +1 -1
  152. package/dist/components/data-table-virtual.js +18 -6
  153. package/dist/components/data-table-virtual.js.map +1 -1
  154. package/dist/components/data-table.d.ts +13 -4
  155. package/dist/components/data-table.js +139 -36
  156. package/dist/components/data-table.js.map +1 -1
  157. package/dist/components/date-field.d.ts +24 -2
  158. package/dist/components/date-field.js +33 -8
  159. package/dist/components/date-field.js.map +1 -1
  160. package/dist/components/date-picker.d.ts +15 -2
  161. package/dist/components/date-picker.js +55 -26
  162. package/dist/components/date-picker.js.map +1 -1
  163. package/dist/components/date-range-picker.d.ts +47 -20
  164. package/dist/components/date-range-picker.js +23 -7
  165. package/dist/components/date-range-picker.js.map +1 -1
  166. package/dist/components/error-boundary.js +37 -30
  167. package/dist/components/error-boundary.js.map +1 -1
  168. package/dist/components/{ui-labels.d.ts → field-base-labels.d.ts} +0 -2
  169. package/dist/components/{ui-labels.js → field-base-labels.js} +2 -9
  170. package/dist/components/field-base-labels.js.map +1 -0
  171. package/dist/components/field-base.d.ts +4 -3
  172. package/dist/components/field-base.js +3 -3
  173. package/dist/components/field-base.js.map +1 -1
  174. package/dist/components/field-sync-labels.d.ts +1 -0
  175. package/dist/components/field-sync-labels.js.map +1 -1
  176. package/dist/components/field-sync.d.ts +23 -1
  177. package/dist/components/field-sync.js.map +1 -1
  178. package/dist/components/form-actions.js +11 -5
  179. package/dist/components/form-actions.js.map +1 -1
  180. package/dist/components/hover-menu.d.ts +3 -0
  181. package/dist/components/hover-menu.js +5 -3
  182. package/dist/components/hover-menu.js.map +1 -1
  183. package/dist/components/icon-button.js +14 -9
  184. package/dist/components/icon-button.js.map +1 -1
  185. package/dist/components/inline-confirm.d.ts +43 -0
  186. package/dist/components/inline-confirm.js +67 -0
  187. package/dist/components/inline-confirm.js.map +1 -0
  188. package/dist/components/inline-entity-combobox.d.ts +4 -3
  189. package/dist/components/inline-entity-combobox.js +148 -140
  190. package/dist/components/inline-entity-combobox.js.map +1 -1
  191. package/dist/components/input.js +1 -1
  192. package/dist/components/input.js.map +1 -1
  193. package/dist/components/jump-calendar.js +28 -112
  194. package/dist/components/jump-calendar.js.map +1 -1
  195. package/dist/components/legal-page.d.ts +3 -1
  196. package/dist/components/legal-page.js +3 -2
  197. package/dist/components/legal-page.js.map +1 -1
  198. package/dist/components/legal.d.ts +4 -2
  199. package/dist/components/legal.js.map +1 -1
  200. package/dist/components/lightbox.d.ts +2 -2
  201. package/dist/components/lightbox.js +17 -6
  202. package/dist/components/lightbox.js.map +1 -1
  203. package/dist/components/list.d.ts +6 -2
  204. package/dist/components/list.js +3 -2
  205. package/dist/components/list.js.map +1 -1
  206. package/dist/components/measured-grid.d.ts +1 -1
  207. package/dist/components/measured-grid.js +2 -1
  208. package/dist/components/measured-grid.js.map +1 -1
  209. package/dist/components/mini-calendar.js +3 -5
  210. package/dist/components/mini-calendar.js.map +1 -1
  211. package/dist/components/modal.js +3 -1
  212. package/dist/components/modal.js.map +1 -1
  213. package/dist/components/month-grid.d.ts +55 -0
  214. package/dist/components/month-grid.js +148 -0
  215. package/dist/components/month-grid.js.map +1 -0
  216. package/dist/components/month-picker.d.ts +36 -4
  217. package/dist/components/month-picker.js +123 -146
  218. package/dist/components/month-picker.js.map +1 -1
  219. package/dist/components/multi-select.d.ts +2 -2
  220. package/dist/components/multi-select.js +11 -6
  221. package/dist/components/multi-select.js.map +1 -1
  222. package/dist/components/picker-sheet.js +2 -1
  223. package/dist/components/picker-sheet.js.map +1 -1
  224. package/dist/components/pie-chart-labels.d.ts +7 -0
  225. package/dist/components/pie-chart-labels.js +1 -0
  226. package/dist/components/pie-chart-labels.js.map +1 -1
  227. package/dist/components/pie-chart.d.ts +5 -3
  228. package/dist/components/pie-chart.js +7 -22
  229. package/dist/components/pie-chart.js.map +1 -1
  230. package/dist/components/popover.d.ts +3 -0
  231. package/dist/components/popover.js +7 -1
  232. package/dist/components/popover.js.map +1 -1
  233. package/dist/components/row-actions.js +2 -1
  234. package/dist/components/row-actions.js.map +1 -1
  235. package/dist/components/section-nav.d.ts +7 -0
  236. package/dist/components/section-nav.js.map +1 -1
  237. package/dist/components/series-chart-axes.d.ts +3 -3
  238. package/dist/components/series-chart-axes.js.map +1 -1
  239. package/dist/components/series-chart-labels.d.ts +7 -4
  240. package/dist/components/series-chart-labels.js.map +1 -1
  241. package/dist/components/series-chart.d.ts +31 -7
  242. package/dist/components/series-chart.js +72 -29
  243. package/dist/components/series-chart.js.map +1 -1
  244. package/dist/components/share-card.js +3 -3
  245. package/dist/components/share-card.js.map +1 -1
  246. package/dist/components/sign-chip-labels.d.ts +1 -0
  247. package/dist/components/sign-chip-labels.js.map +1 -1
  248. package/dist/components/sign-chip.d.ts +10 -1
  249. package/dist/components/sign-chip.js.map +1 -1
  250. package/dist/components/tabs-labels.d.ts +2 -0
  251. package/dist/components/tabs-labels.js +11 -0
  252. package/dist/components/tabs-labels.js.map +1 -0
  253. package/dist/components/tabs.d.ts +1 -1
  254. package/dist/components/tabs.js +1 -1
  255. package/dist/components/tabs.js.map +1 -1
  256. package/dist/components/toggle-legend.d.ts +2 -2
  257. package/dist/components/toggle-legend.js +6 -6
  258. package/dist/components/toggle-legend.js.map +1 -1
  259. package/dist/components/translation-review-editor.d.ts +4 -2
  260. package/dist/components/translation-review-editor.js +2 -3
  261. package/dist/components/translation-review-editor.js.map +1 -1
  262. package/dist/components/translation-review.d.ts +2 -1
  263. package/dist/components/translation-review.js +2 -2
  264. package/dist/components/translation-review.js.map +1 -1
  265. package/dist/components/treemap-labels.d.ts +26 -0
  266. package/dist/components/treemap-labels.js +10 -0
  267. package/dist/components/treemap-labels.js.map +1 -0
  268. package/dist/components/treemap-layout.d.ts +62 -0
  269. package/dist/components/treemap-layout.js +126 -0
  270. package/dist/components/treemap-layout.js.map +1 -0
  271. package/dist/components/treemap.d.ts +140 -17
  272. package/dist/components/treemap.js +324 -97
  273. package/dist/components/treemap.js.map +1 -1
  274. package/dist/components/use-table-state.d.ts +5 -5
  275. package/dist/components/use-table-state.js +4 -1
  276. package/dist/components/use-table-state.js.map +1 -1
  277. package/dist/data-table.d.ts +6 -2
  278. package/dist/data-table.js +7 -2
  279. package/dist/data-table.js.map +1 -1
  280. package/dist/eslint/index.js +1 -1
  281. package/dist/eslint/role-utilities.d.ts +36 -7
  282. package/dist/eslint/role-utilities.js +42 -9
  283. package/dist/eslint/role-utilities.js.map +1 -1
  284. package/dist/feedback/feedback-dialog.d.ts +25 -16
  285. package/dist/feedback/feedback-dialog.js +6 -2
  286. package/dist/feedback/feedback-dialog.js.map +1 -1
  287. package/dist/feedback/feedback-mutation.d.ts +30 -0
  288. package/dist/feedback/feedback-mutation.js +16 -0
  289. package/dist/feedback/feedback-mutation.js.map +1 -0
  290. package/dist/feedback/feedback-page-link.d.ts +53 -0
  291. package/dist/feedback/feedback-page-link.js +37 -0
  292. package/dist/feedback/feedback-page-link.js.map +1 -0
  293. package/dist/feedback/feedback-public-list.d.ts +12 -3
  294. package/dist/feedback/feedback-public-list.js +2 -1
  295. package/dist/feedback/feedback-public-list.js.map +1 -1
  296. package/dist/feedback/feedback-replies.d.ts +3 -1
  297. package/dist/feedback/feedback-replies.js +5 -4
  298. package/dist/feedback/feedback-replies.js.map +1 -1
  299. package/dist/feedback/feedback-row-detail-labels.js +5 -0
  300. package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
  301. package/dist/feedback/feedback-row-detail.d.ts +64 -28
  302. package/dist/feedback/feedback-row-detail.js +30 -28
  303. package/dist/feedback/feedback-row-detail.js.map +1 -1
  304. package/dist/feedback/feedback-status-undo.d.ts +30 -11
  305. package/dist/feedback/feedback-status-undo.js +10 -15
  306. package/dist/feedback/feedback-status-undo.js.map +1 -1
  307. package/dist/feedback/feedback-submit-dialog.d.ts +1 -1
  308. package/dist/feedback/feedback-submit-dialog.js +1 -1
  309. package/dist/feedback/feedback-submit-dialog.js.map +1 -1
  310. package/dist/feedback/feedback-submit.js +9 -3
  311. package/dist/feedback/feedback-submit.js.map +1 -1
  312. package/dist/feedback/feedback-swipe.d.ts +1 -1
  313. package/dist/feedback/feedback-swipe.js.map +1 -1
  314. package/dist/feedback/feedback-table.d.ts +21 -9
  315. package/dist/feedback/feedback-table.js +45 -25
  316. package/dist/feedback/feedback-table.js.map +1 -1
  317. package/dist/feedback/feedback-thread-labels.d.ts +2 -2
  318. package/dist/feedback/feedback-thread-labels.js.map +1 -1
  319. package/dist/feedback/feedback-thread.d.ts +24 -23
  320. package/dist/feedback/feedback-thread.js +2 -1
  321. package/dist/feedback/feedback-thread.js.map +1 -1
  322. package/dist/feedback.d.ts +34 -0
  323. package/dist/feedback.js +42 -0
  324. package/dist/feedback.js.map +1 -1
  325. package/dist/hooks/use-focus-trap.d.ts +35 -0
  326. package/dist/hooks/use-focus-trap.js +6 -4
  327. package/dist/hooks/use-focus-trap.js.map +1 -1
  328. package/dist/hooks/use-hotkey.d.ts +5 -2
  329. package/dist/hooks/use-hotkey.js +5 -4
  330. package/dist/hooks/use-hotkey.js.map +1 -1
  331. package/dist/hooks/use-long-press.d.ts +7 -4
  332. package/dist/hooks/use-long-press.js +3 -0
  333. package/dist/hooks/use-long-press.js.map +1 -1
  334. package/dist/hooks/use-media-query.js +12 -4
  335. package/dist/hooks/use-media-query.js.map +1 -1
  336. package/dist/hooks/use-mounted.d.ts +22 -0
  337. package/dist/hooks/use-mounted.js +24 -0
  338. package/dist/hooks/use-mounted.js.map +1 -0
  339. package/dist/hooks/use-overlay-history.js +19 -3
  340. package/dist/hooks/use-overlay-history.js.map +1 -1
  341. package/dist/i18n/defaults.js +4 -5
  342. package/dist/i18n/defaults.js.map +1 -1
  343. package/dist/i18n/german.js +7 -1
  344. package/dist/i18n/german.js.map +1 -1
  345. package/dist/i18n/kit-labels.d.ts +9 -2
  346. package/dist/i18n/kit-labels.js.map +1 -1
  347. package/dist/i18n/locales/en.js +20 -41
  348. package/dist/i18n/locales/en.js.map +3 -3
  349. package/dist/i18n/locales/es.js +7 -1
  350. package/dist/i18n/locales/es.js.map +1 -1
  351. package/dist/i18n/locales/fr.js +20 -10
  352. package/dist/i18n/locales/fr.js.map +1 -1
  353. package/dist/i18n/locales/hu.js +9 -1
  354. package/dist/i18n/locales/hu.js.map +1 -1
  355. package/dist/i18n/locales/it.js +7 -1
  356. package/dist/i18n/locales/it.js.map +1 -1
  357. package/dist/i18n/locales/zh.js +8 -1
  358. package/dist/i18n/locales/zh.js.map +1 -1
  359. package/dist/i18n/review.js +5 -0
  360. package/dist/i18n/review.js.map +1 -1
  361. package/dist/index.d.ts +64 -17
  362. package/dist/index.js +77 -12
  363. package/dist/index.js.map +1 -1
  364. package/dist/landing/routing.d.ts +3 -1
  365. package/dist/landing/routing.js +4 -7
  366. package/dist/landing/routing.js.map +1 -1
  367. package/dist/lib/broadcast.d.ts +17 -0
  368. package/dist/lib/broadcast.js +30 -0
  369. package/dist/lib/broadcast.js.map +1 -0
  370. package/dist/lib/date-format.d.ts +37 -2
  371. package/dist/lib/date-format.js +34 -8
  372. package/dist/lib/date-format.js.map +1 -1
  373. package/dist/lib/day-format.d.ts +46 -0
  374. package/dist/lib/day-format.js +46 -0
  375. package/dist/lib/day-format.js.map +1 -0
  376. package/dist/lib/describe-failure.d.ts +14 -0
  377. package/dist/lib/describe-failure.js +9 -0
  378. package/dist/lib/describe-failure.js.map +1 -0
  379. package/dist/lib/direction.d.ts +16 -0
  380. package/dist/lib/direction.js +9 -1
  381. package/dist/lib/direction.js.map +1 -1
  382. package/dist/lib/focus-left.d.ts +63 -0
  383. package/dist/lib/focus-left.js +67 -0
  384. package/dist/lib/focus-left.js.map +1 -0
  385. package/dist/lib/format.js +5 -14
  386. package/dist/lib/format.js.map +1 -1
  387. package/dist/lib/http-status.d.ts +24 -0
  388. package/dist/lib/http-status.js +14 -0
  389. package/dist/lib/http-status.js.map +1 -0
  390. package/dist/lib/intl-cache.d.ts +14 -0
  391. package/dist/lib/intl-cache.js +15 -0
  392. package/dist/lib/intl-cache.js.map +1 -0
  393. package/dist/lib/isin.d.ts +10 -0
  394. package/dist/lib/isin.js.map +1 -1
  395. package/dist/lib/iso-day.d.ts +11 -0
  396. package/dist/lib/iso-day.js +8 -0
  397. package/dist/lib/iso-day.js.map +1 -0
  398. package/dist/lib/lazy-with-fallback.d.ts +31 -0
  399. package/dist/lib/lazy-with-fallback.js +40 -0
  400. package/dist/lib/lazy-with-fallback.js.map +1 -0
  401. package/dist/lib/path-pattern.d.ts +34 -0
  402. package/dist/lib/path-pattern.js +24 -0
  403. package/dist/lib/path-pattern.js.map +1 -0
  404. package/dist/lib/reduced-motion.d.ts +2 -1
  405. package/dist/lib/reduced-motion.js.map +1 -1
  406. package/dist/lib/round.d.ts +2 -1
  407. package/dist/lib/round.js +2 -1
  408. package/dist/lib/round.js.map +1 -1
  409. package/dist/lib/safe-storage.d.ts +24 -5
  410. package/dist/lib/safe-storage.js +27 -2
  411. package/dist/lib/safe-storage.js.map +1 -1
  412. package/dist/lib/session-refresh.js +1 -1
  413. package/dist/lib/session-refresh.js.map +1 -1
  414. package/dist/lib/share-format.d.ts +13 -0
  415. package/dist/lib/share-format.js +10 -0
  416. package/dist/lib/share-format.js.map +1 -0
  417. package/dist/lib/text-case.d.ts +17 -0
  418. package/dist/lib/text-case.js +8 -0
  419. package/dist/lib/text-case.js.map +1 -0
  420. package/dist/lib/text-match.d.ts +29 -0
  421. package/dist/lib/text-match.js +20 -2
  422. package/dist/lib/text-match.js.map +1 -1
  423. package/dist/lib/thenable.d.ts +13 -0
  424. package/dist/lib/thenable.js +8 -0
  425. package/dist/lib/thenable.js.map +1 -0
  426. package/dist/lib/translation-review.d.ts +7 -2
  427. package/dist/lib/translation-review.js +4 -4
  428. package/dist/lib/translation-review.js.map +1 -1
  429. package/dist/notifications/device-zone-report.js +1 -1
  430. package/dist/notifications/device-zone-report.js.map +1 -1
  431. package/dist/notifications/notification-bell.d.ts +2 -1
  432. package/dist/notifications/notification-bell.js +3 -3
  433. package/dist/notifications/notification-bell.js.map +1 -1
  434. package/dist/notifications/notification-inbox.d.ts +10 -6
  435. package/dist/notifications/notification-inbox.js +26 -48
  436. package/dist/notifications/notification-inbox.js.map +1 -1
  437. package/dist/notifications/notification-parts.d.ts +3 -2
  438. package/dist/notifications/notification-parts.js +1 -3
  439. package/dist/notifications/notification-parts.js.map +1 -1
  440. package/dist/notifications/notification-types-setting.js +1 -1
  441. package/dist/notifications/notification-types-setting.js.map +1 -1
  442. package/dist/notifications/notifications-labels.d.ts +6 -0
  443. package/dist/notifications/notifications-labels.js +1 -0
  444. package/dist/notifications/notifications-labels.js.map +1 -1
  445. package/dist/notifications/push-device-setting.js +1 -1
  446. package/dist/notifications/push-device-setting.js.map +1 -1
  447. package/dist/notifications/push-devices-setting.d.ts +2 -1
  448. package/dist/notifications/push-devices-setting.js +27 -49
  449. package/dist/notifications/push-devices-setting.js.map +1 -1
  450. package/dist/notifications/quiet-hours-setting.d.ts +10 -3
  451. package/dist/notifications/quiet-hours-setting.js +65 -26
  452. package/dist/notifications/quiet-hours-setting.js.map +1 -1
  453. package/dist/notifications/unsubscribe-panel.js +4 -7
  454. package/dist/notifications/unsubscribe-panel.js.map +1 -1
  455. package/dist/notifications/use-push-device.d.ts +39 -1
  456. package/dist/notifications/use-push-device.js +28 -7
  457. package/dist/notifications/use-push-device.js.map +1 -1
  458. package/dist/offline/query-persistence.d.ts +3 -1
  459. package/dist/offline/query-persistence.js +19 -2
  460. package/dist/offline/query-persistence.js.map +1 -1
  461. package/dist/rhf/fields.d.ts +11 -4
  462. package/dist/rhf/fields.js.map +1 -1
  463. package/dist/search/command-palette.js +1 -1
  464. package/dist/search/command-palette.js.map +1 -1
  465. package/dist/search/global-search.js +19 -9
  466. package/dist/search/global-search.js.map +1 -1
  467. package/dist/search/use-command-key.d.ts +12 -1
  468. package/dist/search/use-command-key.js +3 -12
  469. package/dist/search/use-command-key.js.map +1 -1
  470. package/dist/search.d.ts +7 -0
  471. package/dist/search.js +10 -0
  472. package/dist/search.js.map +1 -1
  473. package/dist/settings/use-settings-focus.js +1 -0
  474. package/dist/settings/use-settings-focus.js.map +1 -1
  475. package/dist/shell/account-menu-language.d.ts +21 -5
  476. package/dist/shell/account-menu-language.js +3 -1
  477. package/dist/shell/account-menu-language.js.map +1 -1
  478. package/dist/shell/account-menu-text-size.d.ts +26 -9
  479. package/dist/shell/account-menu-text-size.js +3 -2
  480. package/dist/shell/account-menu-text-size.js.map +1 -1
  481. package/dist/shell/dev-menu.js +5 -18
  482. package/dist/shell/dev-menu.js.map +1 -1
  483. package/dist/shell/role-switcher.d.ts +7 -0
  484. package/dist/shell/role-switcher.js.map +1 -1
  485. package/dist/shell/top-bar-actions.d.ts +1 -1
  486. package/dist/shell/top-bar-actions.js.map +1 -1
  487. package/dist/shell/top-bar-parts-labels.d.ts +0 -2
  488. package/dist/shell/top-bar-parts-labels.js +0 -1
  489. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  490. package/dist/shell.d.ts +27 -8
  491. package/dist/shell.js +28 -7
  492. package/dist/shell.js.map +1 -1
  493. package/dist/sync/engine.d.ts +30 -4
  494. package/dist/sync/engine.js +172 -52
  495. package/dist/sync/engine.js.map +1 -1
  496. package/dist/sync.d.ts +6 -2
  497. package/dist/sync.js +6 -1
  498. package/dist/sync.js.map +1 -1
  499. package/dist/testing/css-variables.js +3 -8
  500. package/dist/testing/css-variables.js.map +1 -1
  501. package/dist/theme/contrast.d.ts +2 -1
  502. package/dist/theme/contrast.js +3 -8
  503. package/dist/theme/contrast.js.map +1 -1
  504. package/dist/theme/palette-store.js +6 -6
  505. package/dist/theme/palette-store.js.map +1 -1
  506. package/dist/theme/text-size.js +3 -8
  507. package/dist/theme/text-size.js.map +1 -1
  508. package/dist/theme/theme-store.js +3 -6
  509. package/dist/theme/theme-store.js.map +1 -1
  510. package/dist/tour/tour-catalogue.d.ts +7 -4
  511. package/dist/tour/tour-catalogue.js +12 -10
  512. package/dist/tour/tour-catalogue.js.map +1 -1
  513. package/dist/tour/tour-dock.d.ts +0 -2
  514. package/dist/tour/tour-dock.js +0 -2
  515. package/dist/tour/tour-dock.js.map +1 -1
  516. package/dist/tour/tour-gates.d.ts +4 -0
  517. package/dist/tour/tour-gates.js +14 -0
  518. package/dist/tour/tour-gates.js.map +1 -1
  519. package/dist/tour/tour-overlay.d.ts +27 -0
  520. package/dist/tour/tour-overlay.js +741 -0
  521. package/dist/tour/tour-overlay.js.map +1 -0
  522. package/dist/tour/tour.d.ts +13 -3
  523. package/dist/tour/tour.js +59 -781
  524. package/dist/tour/tour.js.map +1 -1
  525. package/dist/tour/use-tour-progress.js +1 -1
  526. package/dist/tour/use-tour-progress.js.map +1 -1
  527. package/dist/wizard/stepper-nav.d.ts +5 -1
  528. package/dist/wizard/stepper-nav.js.map +1 -1
  529. package/dist/wizard/types.d.ts +6 -2
  530. package/dist/wizard/types.js.map +1 -1
  531. package/dist/wizard/use-wizard.d.ts +3 -1
  532. package/dist/wizard/use-wizard.js.map +1 -1
  533. package/dist/wizard/validation.d.ts +3 -1
  534. package/dist/wizard/validation.js.map +1 -1
  535. package/package.json +10 -6
  536. package/src/account/account-parts.ts +5 -25
  537. package/src/account/data-export-setting-labels.ts +1 -1
  538. package/src/account/delete-account-setting-labels.ts +1 -1
  539. package/src/account/email-change-setting-labels.ts +1 -1
  540. package/src/account/passkeys-setting.tsx +60 -38
  541. package/src/account/sessions-setting.tsx +18 -12
  542. package/src/admin/admin-action-confirm.tsx +1 -5
  543. package/src/admin/admin-parts.ts +11 -25
  544. package/src/admin/mail-test-card-labels.ts +1 -1
  545. package/src/admin/plan-change-labels.ts +5 -23
  546. package/src/admin/plan-change.tsx +7 -44
  547. package/src/admin/reviewer-scope-editor.tsx +3 -3
  548. package/src/auth/auth-errors-labels.ts +23 -0
  549. package/src/auth/auth-errors.ts +11 -38
  550. package/src/auth/complete-name-dialog.tsx +4 -1
  551. package/src/auth/forgot-password-form-labels.ts +1 -1
  552. package/src/auth/forgot-password-form.tsx +11 -6
  553. package/src/auth/register-form-labels.ts +1 -1
  554. package/src/auth/reset-password-form-labels.ts +1 -1
  555. package/src/auth/reset-password-form.tsx +8 -4
  556. package/src/auth/sign-in-form-labels.ts +1 -1
  557. package/src/auth/status-parts.tsx +0 -6
  558. package/src/auth/verify-email-labels.ts +1 -1
  559. package/src/auth/verify-email.tsx +11 -6
  560. package/src/billing/cancel-subscription.tsx +26 -12
  561. package/src/billing/dialog-close.ts +34 -0
  562. package/src/billing/plan-card.tsx +36 -11
  563. package/src/billing/plan-change-labels.ts +66 -0
  564. package/src/billing/plan-switch.tsx +26 -12
  565. package/src/chart.ts +21 -3
  566. package/src/components/account-chips.tsx +20 -23
  567. package/src/components/alert-banner.tsx +82 -5
  568. package/src/components/amount-input.tsx +18 -7
  569. package/src/components/autocomplete.tsx +64 -70
  570. package/src/components/bulk-action-bar.tsx +70 -2
  571. package/src/components/button-look.ts +5 -5
  572. package/src/components/button.tsx +2 -2
  573. package/src/components/chart-edge.ts +34 -1
  574. package/src/components/chart-figure.tsx +35 -0
  575. package/src/components/chart-zoom-core.tsx +6 -5
  576. package/src/components/chart.tsx +26 -5
  577. package/src/components/combobox-core.tsx +293 -62
  578. package/src/components/combobox.tsx +183 -153
  579. package/src/components/copy-button.tsx +34 -23
  580. package/src/components/country-select.tsx +16 -11
  581. package/src/components/data-table-column-settings.tsx +52 -10
  582. package/src/components/data-table-filters.ts +6 -4
  583. package/src/components/data-table-fit.ts +19 -5
  584. package/src/components/data-table-groups.tsx +1 -1
  585. package/src/components/data-table-head.tsx +32 -22
  586. package/src/components/data-table-mobile.tsx +61 -26
  587. package/src/components/data-table-pagination.tsx +21 -6
  588. package/src/components/data-table-resize.ts +1 -1
  589. package/src/components/data-table-row-actions.tsx +3 -3
  590. package/src/components/data-table-row.tsx +25 -14
  591. package/src/components/data-table-selection.ts +1 -1
  592. package/src/components/data-table-shared.tsx +33 -1
  593. package/src/components/data-table-sort.ts +57 -2
  594. package/src/components/data-table-virtual.ts +32 -8
  595. package/src/components/data-table.tsx +239 -68
  596. package/src/components/date-field.tsx +65 -8
  597. package/src/components/date-picker.tsx +125 -48
  598. package/src/components/date-range-picker.tsx +82 -31
  599. package/src/components/error-boundary.tsx +53 -39
  600. package/src/components/field-base-labels.ts +20 -0
  601. package/src/components/field-base.tsx +13 -7
  602. package/src/components/field-sync-labels.ts +1 -0
  603. package/src/components/field-sync.tsx +23 -1
  604. package/src/components/form-actions.tsx +20 -5
  605. package/src/components/hover-menu.tsx +18 -8
  606. package/src/components/icon-button.tsx +14 -9
  607. package/src/components/inline-confirm.tsx +116 -0
  608. package/src/components/inline-entity-combobox.tsx +197 -153
  609. package/src/components/input.tsx +1 -1
  610. package/src/components/jump-calendar.tsx +30 -146
  611. package/src/components/legal-page.tsx +10 -7
  612. package/src/components/legal.tsx +4 -2
  613. package/src/components/lightbox.tsx +21 -8
  614. package/src/components/list.tsx +10 -4
  615. package/src/components/measured-grid.tsx +8 -4
  616. package/src/components/mini-calendar.tsx +6 -5
  617. package/src/components/modal.tsx +6 -1
  618. package/src/components/month-grid.tsx +229 -0
  619. package/src/components/month-picker.tsx +192 -200
  620. package/src/components/multi-select.tsx +21 -9
  621. package/src/components/picker-sheet.tsx +12 -9
  622. package/src/components/pie-chart-labels.ts +8 -0
  623. package/src/components/pie-chart.tsx +22 -28
  624. package/src/components/popover.tsx +18 -1
  625. package/src/components/row-actions.tsx +2 -1
  626. package/src/components/section-nav.tsx +7 -0
  627. package/src/components/series-chart-axes.ts +3 -3
  628. package/src/components/series-chart-labels.ts +7 -4
  629. package/src/components/series-chart.tsx +178 -69
  630. package/src/components/share-card.tsx +6 -6
  631. package/src/components/sign-chip-labels.ts +1 -0
  632. package/src/components/sign-chip.tsx +10 -1
  633. package/src/components/tabs-labels.ts +13 -0
  634. package/src/components/tabs.tsx +2 -2
  635. package/src/components/toggle-legend.tsx +16 -11
  636. package/src/components/translation-review-editor.tsx +6 -5
  637. package/src/components/translation-review.tsx +4 -3
  638. package/src/components/treemap-labels.ts +39 -0
  639. package/src/components/treemap-layout.ts +210 -0
  640. package/src/components/treemap.tsx +722 -133
  641. package/src/components/use-table-state.ts +12 -9
  642. package/src/data-table.ts +9 -2
  643. package/src/eslint/role-utilities.ts +97 -19
  644. package/src/feedback/feedback-dialog.tsx +30 -19
  645. package/src/feedback/feedback-mutation.ts +41 -0
  646. package/src/feedback/feedback-page-link.ts +90 -0
  647. package/src/feedback/feedback-public-list.tsx +17 -5
  648. package/src/feedback/feedback-replies.tsx +13 -6
  649. package/src/feedback/feedback-row-detail-labels.ts +5 -0
  650. package/src/feedback/feedback-row-detail.tsx +103 -67
  651. package/src/feedback/feedback-status-undo.ts +41 -27
  652. package/src/feedback/feedback-submit-dialog.tsx +2 -2
  653. package/src/feedback/feedback-submit.tsx +21 -7
  654. package/src/feedback/feedback-swipe.tsx +1 -1
  655. package/src/feedback/feedback-table.tsx +86 -38
  656. package/src/feedback/feedback-thread-labels.ts +2 -2
  657. package/src/feedback/feedback-thread.tsx +27 -25
  658. package/src/feedback.ts +42 -0
  659. package/src/hooks/use-focus-trap.ts +8 -24
  660. package/src/hooks/use-hotkey.ts +24 -7
  661. package/src/hooks/use-long-press.ts +16 -2
  662. package/src/hooks/use-media-query.ts +20 -4
  663. package/src/hooks/use-mounted.ts +39 -0
  664. package/src/hooks/use-overlay-history.ts +32 -3
  665. package/src/i18n/defaults.ts +4 -5
  666. package/src/i18n/german.ts +8 -2
  667. package/src/i18n/kit-labels.tsx +9 -2
  668. package/src/i18n/locales/es.ts +8 -2
  669. package/src/i18n/locales/fr.ts +21 -13
  670. package/src/i18n/locales/hu.ts +10 -2
  671. package/src/i18n/locales/it.ts +8 -2
  672. package/src/i18n/locales/zh.ts +9 -2
  673. package/src/i18n/review.ts +5 -0
  674. package/src/index.ts +103 -13
  675. package/src/landing/routing.tsx +14 -10
  676. package/src/lib/broadcast.ts +52 -0
  677. package/src/lib/date-format.ts +89 -13
  678. package/src/lib/day-format.ts +96 -0
  679. package/src/lib/describe-failure.ts +18 -0
  680. package/src/lib/direction.ts +39 -0
  681. package/src/lib/focus-left.ts +156 -0
  682. package/src/lib/format.ts +5 -17
  683. package/src/lib/http-status.ts +38 -0
  684. package/src/lib/intl-cache.ts +25 -0
  685. package/src/lib/isin.ts +10 -0
  686. package/src/lib/iso-day.ts +13 -0
  687. package/src/lib/lazy-with-fallback.ts +82 -0
  688. package/src/lib/path-pattern.ts +55 -0
  689. package/src/lib/reduced-motion.ts +2 -1
  690. package/src/lib/round.ts +7 -2
  691. package/src/lib/safe-storage.ts +48 -6
  692. package/src/lib/session-refresh.ts +1 -1
  693. package/src/lib/share-format.ts +18 -0
  694. package/src/lib/text-case.ts +19 -0
  695. package/src/lib/text-match.ts +57 -2
  696. package/src/lib/thenable.ts +19 -0
  697. package/src/lib/translation-review.ts +13 -5
  698. package/src/notifications/device-zone-report.ts +1 -1
  699. package/src/notifications/notification-bell.tsx +7 -4
  700. package/src/notifications/notification-inbox.tsx +40 -58
  701. package/src/notifications/notification-parts.tsx +3 -4
  702. package/src/notifications/notification-types-setting.tsx +1 -1
  703. package/src/notifications/notifications-labels.ts +7 -0
  704. package/src/notifications/push-device-setting.tsx +1 -1
  705. package/src/notifications/push-devices-setting.tsx +30 -55
  706. package/src/notifications/quiet-hours-setting.tsx +93 -31
  707. package/src/notifications/unsubscribe-panel.tsx +4 -7
  708. package/src/notifications/use-push-device.ts +76 -10
  709. package/src/offline/query-persistence.ts +35 -3
  710. package/src/rhf/fields.tsx +11 -4
  711. package/src/search/command-palette.tsx +2 -4
  712. package/src/search/global-search.tsx +36 -15
  713. package/src/search/use-command-key.ts +13 -12
  714. package/src/search.ts +9 -0
  715. package/src/settings/use-settings-focus.ts +3 -0
  716. package/src/shell/account-menu-language.tsx +27 -5
  717. package/src/shell/account-menu-text-size.tsx +32 -10
  718. package/src/shell/dev-menu.tsx +7 -21
  719. package/src/shell/role-switcher.tsx +7 -0
  720. package/src/shell/top-bar-actions.tsx +1 -1
  721. package/src/shell/top-bar-parts-labels.ts +0 -3
  722. package/src/shell.ts +40 -9
  723. package/src/sync/engine.ts +339 -61
  724. package/src/sync.ts +8 -1
  725. package/src/testing/css-variables.ts +8 -9
  726. package/src/theme/contrast.ts +8 -9
  727. package/src/theme/palette-store.ts +9 -9
  728. package/src/theme/text-size.ts +6 -8
  729. package/src/theme/theme-store.ts +7 -9
  730. package/src/tour/tour-catalogue.tsx +26 -15
  731. package/src/tour/tour-dock.ts +0 -2
  732. package/src/tour/tour-gates.ts +23 -0
  733. package/src/tour/tour-overlay.tsx +1170 -0
  734. package/src/tour/tour.tsx +108 -1202
  735. package/src/tour/use-tour-progress.ts +1 -1
  736. package/src/wizard/stepper-nav.tsx +3 -1
  737. package/src/wizard/types.ts +11 -2
  738. package/src/wizard/use-wizard.ts +2 -1
  739. package/src/wizard/validation.ts +8 -2
  740. package/tokens.css +2 -1
  741. package/dist/components/ui-labels.js.map +0 -1
  742. package/dist/shell/dev-switchers.d.ts +0 -6
  743. package/dist/shell/dev-switchers.js +0 -12
  744. package/dist/shell/dev-switchers.js.map +0 -1
  745. package/src/components/ui-labels.ts +0 -24
  746. package/src/shell/dev-switchers.tsx +0 -18
@@ -2,7 +2,7 @@
2
2
  // the clear button — and the props, label hook and trigger format the two share.
3
3
  // Moved out of date-picker.tsx as it was (MOD-9, refactor audit 2026-10); date-picker
4
4
  // still exports the one public name here, `DateTriggerAttributes`.
5
- import { useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
5
+ import { useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
6
6
  import type { ComponentPropsWithoutRef, ReactNode, Ref, RefObject } from "react";
7
7
  import { Calendar, X } from "lucide-react";
8
8
  import { cn } from "../lib/cn";
@@ -19,7 +19,13 @@ import {
19
19
  import { splitTriggerAria } from "./trigger-aria";
20
20
  import type { TriggerAria } from "./trigger-aria";
21
21
  import { FIELD_TRIGGER, FIELD_FLOATING_PAD, FIELD_INVALID } from "./field-base";
22
- import { assignRef, FieldLabelLine, LABEL_ABOVE_BOX, type FieldHelpProps } from "./field-parts";
22
+ import {
23
+ assignRef,
24
+ FieldLabelLine,
25
+ LABEL_ABOVE_BOX,
26
+ type DisabledReasonDisplay,
27
+ type FieldHelpProps,
28
+ } from "./field-parts";
23
29
  import { FullBleedDialog } from "./full-bleed-dialog";
24
30
  import type { RemLength } from "../hooks/use-breakpoint";
25
31
  import type { MiniCalendarProps } from "./mini-calendar";
@@ -50,6 +56,22 @@ export interface DatePickerBaseProps extends Omit<ComponentPropsWithoutRef<"div"
50
56
  * `<UiKitProvider labels>`; kept as a prop because it predates the provider. */
51
57
  clearLabel?: string;
52
58
  disabled?: boolean;
59
+ /**
60
+ * Why the date cannot be changed — {@link Select}'s `disabledReason`, for a picker that
61
+ * SAVES on change (a report's period kept per user, a filter persisted as it moves).
62
+ * The trigger stays focusable and `aria-disabled`, the calendar does not open, the ‹ ›
63
+ * and Today buttons refuse, the clear is not offered, and `onChange` never fires; the
64
+ * reason is a line under the field at Large and on a touch screen, else in the kit
65
+ * {@link Tooltip} (`disabledReasonDisplay`), and on the trigger's `aria-describedby`.
66
+ * Wins over `disabled`.
67
+ *
68
+ * 0.52 (refactor audit 2026-10-30, API-3): the date pickers and MonthPicker were the
69
+ * only value fields with no lock opt-in.
70
+ */
71
+ disabledReason?: ReactNode;
72
+ /** Where the reason shows — {@link Button}'s `disabledReasonDisplay`: a line under the
73
+ * field at Large and on a touch screen by default, the tooltip otherwise. */
74
+ disabledReasonDisplay?: DisabledReasonDisplay;
53
75
  /** Required and unanswered — {@link FIELD_INVALID}. See {@link Input}'s `invalid`. */
54
76
  invalid?: boolean;
55
77
  /**
@@ -185,6 +207,9 @@ export interface DateTriggerAttributes {
185
207
  /** The field's required state — `Field required` hands it down with the id pair. */
186
208
  "aria-required"?: boolean | "true" | "false";
187
209
  disabled?: boolean;
210
+ /** Locked by the write lock (0.52, `commit` / `disabledReason`): focusable, and the
211
+ * click opens nothing. Dress a custom trigger for it as for `disabled`. */
212
+ "aria-disabled"?: true;
188
213
  onClick: () => void;
189
214
  className: string;
190
215
  }
@@ -235,6 +260,7 @@ function DateFieldTrigger({
235
260
  valueId,
236
261
  padded,
237
262
  disabled,
263
+ locked,
238
264
  invalid,
239
265
  required,
240
266
  panelId,
@@ -260,6 +286,8 @@ function DateFieldTrigger({
260
286
  valueId: string;
261
287
  padded: boolean;
262
288
  disabled?: boolean;
289
+ /** The write lock: the focusable kind of disabled (see `disabledReason`). */
290
+ locked: boolean;
263
291
  invalid?: boolean;
264
292
  /** `aria-required`, on the trigger with the rest of the field's ARIA. */
265
293
  required?: boolean | "true" | "false";
@@ -300,8 +328,15 @@ function DateFieldTrigger({
300
328
  const attrs: DateTriggerAttributes = {
301
329
  ref: triggerRef,
302
330
  type: "button",
303
- disabled,
304
- onClick: toggle,
331
+ // The focusable kind of disabled while locked (Button's rule): native `disabled`
332
+ // would take the field out of the tab order, and the reason with it.
333
+ disabled: locked ? undefined : disabled,
334
+ "aria-disabled": locked || undefined,
335
+ // Locked, the calendar does not open. One open when the lock arrives closes: the
336
+ // picker moves the field into the reason's frame, which remounts it, as Select's.
337
+ onClick: () => {
338
+ if (!locked) toggle();
339
+ },
305
340
  // The name has to carry the VALUE. A bare `aria-label={label}` — which is what
306
341
  // this was — replaces the button's text outright, so the one field in the form
307
342
  // whose entire job is to show a date announced "Due date" and stopped there,
@@ -335,7 +370,7 @@ function DateFieldTrigger({
335
370
  FIELD_TRIGGER,
336
371
  "pe-9",
337
372
  padded && FIELD_FLOATING_PAD,
338
- disabled && "cursor-not-allowed opacity-50",
373
+ (disabled || locked) && "cursor-not-allowed opacity-50",
339
374
  // An `aria-invalid` from a Field spread paints too, as on Input and AmountInput.
340
375
  isInvalid && FIELD_INVALID,
341
376
  ),
@@ -389,6 +424,7 @@ export function DateField({
389
424
  hasValue,
390
425
  label,
391
426
  disabled,
427
+ locked = false,
392
428
  clearable,
393
429
  clearLabel,
394
430
  panelLabel,
@@ -416,6 +452,9 @@ export function DateField({
416
452
  /** A `FieldHint` for the label line, beside the label. */
417
453
  labelHint?: ReactNode;
418
454
  disabled?: boolean;
455
+ /** The write lock is on: the trigger is focusable and opens nothing, no clear. The
456
+ * picker draws the reason's frame around the field (or its step row). */
457
+ locked?: boolean;
419
458
  clearable?: boolean;
420
459
  /** Already resolved by the picker (prop > provider > English). */
421
460
  clearLabel: string;
@@ -435,8 +474,19 @@ export function DateField({
435
474
  renderTrigger?: TriggerRenderer;
436
475
  children: (close: () => void, frame: PanelFrame) => ReactNode;
437
476
  }) {
438
- const showClear = Boolean(clearable && hasValue && !disabled);
477
+ // A clear is a change like any other: not offered while locked.
478
+ const showClear = Boolean(clearable && hasValue && !disabled && !locked);
439
479
  const [aria, wrapperRest] = splitTriggerAria(rest);
480
+ // The trigger, for the clear to hand the focus to (INP-10, below), beside the picker's
481
+ // own `ref`.
482
+ const triggerEl = useRef<HTMLButtonElement | null>(null);
483
+ const toTrigger = useCallback(
484
+ (node: HTMLButtonElement | null) => {
485
+ triggerEl.current = node;
486
+ assignRef(fieldRef, node);
487
+ },
488
+ [fieldRef],
489
+ );
440
490
  // The panel is portalled to <body> and leaves the subtree whose `dir` it inherited,
441
491
  // so a calendar in an RTL form opened LTR — the grid's columns, its arrow keys and
442
492
  // its chevrons all the wrong way round. Read at the moment of opening (the only way
@@ -524,10 +574,11 @@ export function DateField({
524
574
  valueId={valueId}
525
575
  padded={label !== undefined}
526
576
  disabled={disabled}
577
+ locked={locked}
527
578
  invalid={invalid}
528
579
  required={ariaRequired}
529
580
  renderTrigger={renderTrigger}
530
- fieldRef={fieldRef}
581
+ fieldRef={toTrigger}
531
582
  />
532
583
  );
533
584
  return (
@@ -573,7 +624,13 @@ export function DateField({
573
624
  <button
574
625
  type="button"
575
626
  aria-label={clearLabel}
576
- onClick={onClear}
627
+ onClick={() => {
628
+ onClear();
629
+ // The × goes with the value, so a keyboard clear left the focus on a button
630
+ // that was about to unmount — and it fell to <body> (refactor audit
631
+ // 2026-10-30, INP-10). The trigger, as SearchField's clear does.
632
+ triggerEl.current?.focus();
633
+ }}
577
634
  className="absolute end-1.5 top-1/2 -translate-y-1/2 rounded p-1 text-placeholder hover:text-secondary"
578
635
  >
579
636
  <X className="size-4" />
@@ -1,12 +1,13 @@
1
- import type { ComponentType } from "react";
1
+ import type { ComponentType, ReactNode } from "react";
2
2
  import { CalendarClock, ChevronLeft, ChevronRight } from "lucide-react";
3
3
  import { cn } from "../lib/cn";
4
4
  import { addDaysIso } from "../lib/dates";
5
5
  import { useKitLocale } from "../i18n/kit-labels";
6
6
  import { splitTriggerAria } from "./trigger-aria";
7
7
  import { FIELD_BASE } from "./field-base";
8
- import { FieldBox, useFieldMessages } from "./field-parts";
8
+ import { FieldBox, LockedReason, useFieldMessages, useLockReason } from "./field-parts";
9
9
  import { Tooltip } from "./tooltip";
10
+ import type { CommitScope } from "./write-lock";
10
11
  import { DateField, useDatePickerLabels, useTriggerFormat, withEndHint, type DatePickerBaseProps } from "./date-field";
11
12
  import { PanelCalendar } from "./jump-calendar";
12
13
  // The shared field, the month-jump calendar and the range picker live in date-field.tsx,
@@ -61,18 +62,34 @@ const STEP_ROW_STACK_AT_LARGE = cn(
61
62
  // (`[&_button:focus]:ring-1 [&_button:focus]:ring-inset` on the row) also reached the
62
63
  // label's "?" and thinned its 2px focus frame to 1.
63
64
 
64
- /** One ‹ / › day-step button, sized to sit flush beside the field. */
65
+ /**
66
+ * One ‹ / › day-step (or today) button, sized to sit flush beside the field.
67
+ *
68
+ * Two kinds of "cannot" (refactor audit 2026-10-30, INP-4). `off` is natively `disabled`,
69
+ * out of the tab order: the field is `disabled`, or empty with nothing to step from — no
70
+ * press of these buttons gets there, so the focus is never on one as it turns. `refused`
71
+ * is `aria-disabled` with a click that does nothing, JumpCalendar's rule: › pressed onto
72
+ * `max`, ‹ onto `min` and Today onto today are refused by the very press the focus is on,
73
+ * and a focused button that turns `disabled` drops the focus to <body>, mid-form
74
+ * (keksdose's shared date field passes `step` and `today` in 14 files). A lock refuses
75
+ * too, and the lock's reason describes the button.
76
+ */
65
77
  function StepButton({
66
78
  icon: Icon,
67
79
  label,
68
- disabled,
80
+ off,
81
+ refused,
82
+ reasonId,
69
83
  onClick,
70
84
  mirror,
71
85
  className,
72
86
  }: {
73
87
  icon: ComponentType<{ className?: string }>;
74
88
  label: string;
75
- disabled: boolean;
89
+ off: boolean;
90
+ refused: boolean;
91
+ /** While locked: the id of the lock's reason, which the row's frame shows. */
92
+ reasonId?: string;
76
93
  onClick: () => void;
77
94
  /** Flip the icon in RTL — for the ‹ › day steps, whose "previous" points to the
78
95
  * reading start. Not for the today icon, which has no direction. */
@@ -80,29 +97,42 @@ function StepButton({
80
97
  /** The button's corners in the joined group (see DatePicker). */
81
98
  className?: string;
82
99
  }) {
100
+ const button = (
101
+ <button
102
+ type="button"
103
+ aria-label={label}
104
+ disabled={off}
105
+ aria-disabled={(!off && refused) || undefined}
106
+ aria-describedby={reasonId}
107
+ onClick={() => {
108
+ if (!refused) onClick();
109
+ }}
110
+ className={cn(
111
+ FIELD_BASE,
112
+ // FIELD_BASE is `block w-full` for text inputs; a step button is neither, and
113
+ // px-3 would make it wider than it needs to be. twMerge lets these win.
114
+ "relative flex h-full w-10 shrink-0 items-center justify-center px-0 text-muted",
115
+ "hover:bg-hover hover:text-secondary",
116
+ // Dimmed ICON, not a dimmed box: at 40% opacity the whole button — border
117
+ // included — faded out of the group and read as a broken, detached control. The
118
+ // same look for the focusable kind (INP-4).
119
+ "disabled:cursor-not-allowed disabled:text-placeholder disabled:opacity-60 disabled:hover:bg-surface",
120
+ "aria-disabled:cursor-not-allowed aria-disabled:text-placeholder aria-disabled:opacity-60 aria-disabled:hover:bg-surface",
121
+ // A part of a joined row: FIELD_BASE's 2px focus line, whole at 125 % (K5, the
122
+ // note above this function).
123
+ className,
124
+ )}
125
+ >
126
+ <Icon className={cn("size-4", mirror && "rtl:-scale-x-100")} />
127
+ </button>
128
+ );
129
+ // Locked, the row's frame holds the reason's bubble; a name bubble of its own as well
130
+ // would be two on one hover (IconButton drops its own the same way). The wrapper stays
131
+ // — STEP_ROW_STACK_AT_LARGE lays the buttons out by it.
132
+ if (reasonId) return <span className="relative inline-flex">{button}</span>;
83
133
  return (
84
134
  <Tooltip label={label} portal>
85
- <button
86
- type="button"
87
- aria-label={label}
88
- disabled={disabled}
89
- onClick={onClick}
90
- className={cn(
91
- FIELD_BASE,
92
- // FIELD_BASE is `block w-full` for text inputs; a step button is neither, and
93
- // px-3 would make it wider than it needs to be. twMerge lets these win.
94
- "relative flex h-full w-10 shrink-0 items-center justify-center px-0 text-muted",
95
- "hover:bg-hover hover:text-secondary",
96
- // Dimmed ICON, not a dimmed box: at 40% opacity the whole button — border
97
- // included — faded out of the group and read as a broken, detached control.
98
- "disabled:cursor-not-allowed disabled:text-placeholder disabled:opacity-60 disabled:hover:bg-surface",
99
- // A part of a joined row: FIELD_BASE's 2px focus line, whole at 125 % (K5, the
100
- // note above this function).
101
- className,
102
- )}
103
- >
104
- <Icon className={cn("size-4", mirror && "rtl:-scale-x-100")} />
105
- </button>
135
+ {button}
106
136
  </Tooltip>
107
137
  );
108
138
  }
@@ -114,7 +144,8 @@ export interface DatePickerProps extends DatePickerBaseProps {
114
144
  /**
115
145
  * Flank the field with ‹ › buttons that move the value one day. For fields whose
116
146
  * typical edit is a day or two — opening a calendar to go "yesterday" is three
117
- * interactions for what should be one.
147
+ * interactions for what should be one. A button whose day is outside `min` / `max` is
148
+ * refused (`aria-disabled`, still focusable — 0.52); with no value both are disabled.
118
149
  *
119
150
  * Off by default: on a filter or a far-away date the buttons are dead weight, and
120
151
  * they cost ~5rem of width that a narrow layout may not have.
@@ -127,7 +158,9 @@ export interface DatePickerProps extends DatePickerBaseProps {
127
158
  stepLabels?: { prev: string; next: string };
128
159
  /**
129
160
  * Today's date as ISO "YYYY-MM-DD". Adds a jump-to-today button beside the field,
130
- * disabled once the value already is that day.
161
+ * refused once the value already is that day — `aria-disabled`, so the focus stays on
162
+ * the button that was just pressed (0.52) — and disabled while that day is outside
163
+ * `min` / `max`.
131
164
  *
132
165
  * Passed in rather than read from a clock here: a component that decides what "today"
133
166
  * is cannot be tested at a fixed date, and the consumer already has one definition of
@@ -138,6 +171,15 @@ export interface DatePickerProps extends DatePickerBaseProps {
138
171
  today?: string;
139
172
  /** Accessible name for the today button; wins over `datePicker.today`. */
140
173
  todayLabel?: string;
174
+ /**
175
+ * This picker COMMITS — picking a date saves it (a row's date edited in place, a
176
+ * filter kept as it moves). Under a locked {@link WriteLockProvider} it is locked the
177
+ * `disabledReason` way, with the lock's reason; a {@link CommitScope}, as on every kit
178
+ * control. A date field inside a form with its own Save stays editable under the lock —
179
+ * leave this off there, and put `commit` on the Save. 0.52 (refactor audit 2026-10-30,
180
+ * API-3).
181
+ */
182
+ commit?: CommitScope;
141
183
  }
142
184
 
143
185
  /** Single-date picker: a field showing the formatted date, opening a calendar. */
@@ -162,6 +204,9 @@ export function DatePicker(props: DatePickerProps) {
162
204
  clearable,
163
205
  clearLabel,
164
206
  disabled,
207
+ disabledReason,
208
+ disabledReasonDisplay,
209
+ commit,
165
210
  invalid,
166
211
  hint,
167
212
  help,
@@ -176,8 +221,15 @@ export function DatePicker(props: DatePickerProps) {
176
221
  const locale = useKitLocale(localeProp);
177
222
  const text = useDatePickerLabels(clearLabel, stepLabels, todayLabel);
178
223
  const render = useTriggerFormat("datePicker", locale, formatOptions, formatValue);
224
+ // The write lock (API-3): Select's — the trigger stays reachable and says why.
225
+ const lock = useLockReason(commit, disabledReason);
226
+ const locked = lock.locked;
227
+ const change = (iso: string) => {
228
+ if (!locked) onChange(iso);
229
+ };
179
230
  // keksdose K4: the caption and the error under the field, attached to the TRIGGER
180
- // (the element a screen reader is on) after any description of the caller's own.
231
+ // (the element a screen reader is on) after any description of the caller's own; a
232
+ // lock's reason between the two, as on Select.
181
233
  const messages = useFieldMessages({
182
234
  hint,
183
235
  help,
@@ -186,6 +238,7 @@ export function DatePicker(props: DatePickerProps) {
186
238
  invalid,
187
239
  describedBy: rest["aria-describedby"],
188
240
  ariaInvalid: rest["aria-invalid"],
241
+ reasonId: locked && lock.reasonId,
189
242
  });
190
243
  // With a step or a today button beside it the field is no longer the outermost
191
244
  // element — the flex row at the bottom is, and a caller's attributes belong on
@@ -207,14 +260,18 @@ export function DatePicker(props: DatePickerProps) {
207
260
  clearLabel={text.clear}
208
261
  panelLabel={text.panel}
209
262
  disabled={disabled}
263
+ locked={locked}
210
264
  invalid={messages.isInvalid}
211
- className={step ? "min-w-0 flex-1" : className}
265
+ // In the row, the field fills what the buttons leave and the caller's classes are
266
+ // the row's — with `today` alone too: dressed on `step` alone, a today-only row put
267
+ // them on both (refactor audit 2026-10-30, INP-13). Locked, they are the frame's.
268
+ className={wrapped ? "min-w-0 flex-1" : locked ? undefined : className}
212
269
  // Named for STEP_ROW_STACK_AT_LARGE; only in the row, so a caller's own
213
270
  // `data-slot` on a bare field is left alone.
214
271
  {...(wrapped ? { "data-slot": "date-step-field" } : {})}
215
272
  hasValue={Boolean(value)}
216
273
  triggerText={value ? render(value) : (placeholder ?? "")}
217
- onClear={() => onChange("")}
274
+ onClear={() => change("")}
218
275
  >
219
276
  {(close) => (
220
277
  <PanelCalendar
@@ -228,7 +285,7 @@ export function DatePicker(props: DatePickerProps) {
228
285
  max={max}
229
286
  labels={calendarLabels}
230
287
  onSelect={(iso) => {
231
- onChange(iso);
288
+ change(iso);
232
289
  close();
233
290
  }}
234
291
  />
@@ -238,23 +295,32 @@ export function DatePicker(props: DatePickerProps) {
238
295
  // Passed at all — even as `undefined` — the field keeps its box; see FieldBox.
239
296
  const reserve = "error" in props || "hint" in props;
240
297
  const endHint = label === undefined ? messages.labelHint : undefined;
298
+ // Locked, the field — or the whole row, whose buttons change the value too — sits in
299
+ // the reason's frame (the line, or the Tooltip), which becomes the outermost box: the
300
+ // caller's classes move onto it, as on Select, so a lock does not reflow the form.
301
+ const withReason = (box: ReactNode) =>
302
+ locked ? (
303
+ <LockedReason lock={lock} display={disabledReasonDisplay} className={cn("block", className)}>
304
+ {box}
305
+ </LockedReason>
306
+ ) : (
307
+ box
308
+ );
241
309
  if (!wrapped) {
242
310
  return (
243
311
  <FieldBox below={messages.below} reserve={reserve}>
244
- {withEndHint(field, endHint)}
312
+ {withReason(withEndHint(field, endHint))}
245
313
  </FieldBox>
246
314
  );
247
315
  }
248
316
 
249
- // An empty field has nothing to step from, so both buttons are dead until a date
250
- // is picked. Bounds are compared as strings: "YYYY-MM-DD" sorts chronologically.
317
+ // An empty field has nothing to step from, so both buttons are off until a date is
318
+ // picked. Bounds are compared as strings: "YYYY-MM-DD" sorts chronologically.
251
319
  const target = (days: number) => (value ? addDaysIso(value, days) : "");
252
320
  const outOfBounds = (iso: string) => Boolean((min && iso < min) || (max && iso > max));
253
- const blocked = (days: number) => {
254
- const next = target(days);
255
- if (!next || disabled) return true;
256
- return outOfBounds(next);
257
- };
321
+ // A lock's reason wins over `disabled`, as on Select: the buttons stay focusable then.
322
+ const fieldOff = Boolean(disabled) && !locked;
323
+ const reasonId = locked ? lock.reasonId : undefined;
258
324
  const row = (
259
325
  // ONE joined control, not three boxes in a row: the buttons and the field share
260
326
  // their borders (each piece overlaps the previous by a pixel) and only the outer
@@ -283,7 +349,7 @@ export function DatePicker(props: DatePickerProps) {
283
349
  // …and its line is 2px, so no side of it reads half-strength at 125 % (live #394,
284
350
  // fourth round): FIELD_BASE's inset ring, which every part of the row carries.
285
351
  STEP_ROW_STACK_AT_LARGE,
286
- className,
352
+ !locked && className,
287
353
  )}
288
354
  >
289
355
  {step && (
@@ -291,8 +357,10 @@ export function DatePicker(props: DatePickerProps) {
291
357
  icon={ChevronLeft}
292
358
  mirror
293
359
  label={text.previousDay}
294
- disabled={blocked(-1)}
295
- onClick={() => onChange(target(-1))}
360
+ off={fieldOff || !value}
361
+ refused={locked || outOfBounds(target(-1))}
362
+ reasonId={reasonId}
363
+ onClick={() => change(target(-1))}
296
364
  className="rounded-e-none"
297
365
  />
298
366
  )}
@@ -302,17 +370,26 @@ export function DatePicker(props: DatePickerProps) {
302
370
  icon={ChevronRight}
303
371
  mirror
304
372
  label={text.nextDay}
305
- disabled={blocked(1)}
306
- onClick={() => onChange(target(1))}
373
+ off={fieldOff || !value}
374
+ refused={locked || outOfBounds(target(1))}
375
+ reasonId={reasonId}
376
+ onClick={() => change(target(1))}
307
377
  className={cn("rounded-s-none", today && "rounded-e-none")}
308
378
  />
309
379
  )}
310
380
  {today && (
381
+ // Refused once the value is today: pressable as a no-op would keep the focus too
382
+ // (INP-4), and this also says there is nothing to jump to. Today outside the
383
+ // bounds is `off`: no press here gets there, as MonthPicker's stepper has it — it
384
+ // was refused, a tab stop that could never do anything (0.52 code review,
385
+ // date-picker.tsx). A lock wins, focusable, to say why.
311
386
  <StepButton
312
387
  icon={CalendarClock}
313
388
  label={text.today}
314
- disabled={Boolean(disabled) || value === today || outOfBounds(today)}
315
- onClick={() => onChange(today)}
389
+ off={fieldOff || (!locked && outOfBounds(today))}
390
+ refused={locked || value === today}
391
+ reasonId={reasonId}
392
+ onClick={() => change(today)}
316
393
  className="rounded-s-none"
317
394
  />
318
395
  )}
@@ -322,7 +399,7 @@ export function DatePicker(props: DatePickerProps) {
322
399
  // the date, and the steppers are part of how it is entered.
323
400
  return (
324
401
  <FieldBox below={messages.below} reserve={reserve}>
325
- {withEndHint(row, endHint)}
402
+ {withReason(withEndHint(row, endHint))}
326
403
  </FieldBox>
327
404
  );
328
405
  }