@eifi1/ui-kit 0.51.7 → 0.53.0

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