@eifi1/ui-kit 0.54.0 → 0.55.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 (847) hide show
  1. package/README.md +90 -76
  2. package/dist/admin/plan-change.js +2 -2
  3. package/dist/admin/plan-change.js.map +1 -1
  4. package/dist/admin/user-roster.d.ts +6 -0
  5. package/dist/admin/user-roster.js +4 -0
  6. package/dist/admin/user-roster.js.map +1 -1
  7. package/dist/billing/billing-labels.d.ts +26 -0
  8. package/dist/billing/billing-labels.js +9 -0
  9. package/dist/billing/billing-labels.js.map +1 -1
  10. package/dist/billing/subscription-standing.d.ts +61 -0
  11. package/dist/billing/subscription-standing.js +51 -0
  12. package/dist/billing/subscription-standing.js.map +1 -0
  13. package/dist/billing/usage-meter.d.ts +52 -0
  14. package/dist/billing/usage-meter.js +52 -0
  15. package/dist/billing/usage-meter.js.map +1 -0
  16. package/dist/chart.d.ts +1 -0
  17. package/dist/chart.js +4 -0
  18. package/dist/chart.js.map +1 -1
  19. package/dist/components/alert-banner.js +2 -3
  20. package/dist/components/alert-banner.js.map +1 -1
  21. package/dist/components/amount-input.js +3 -15
  22. package/dist/components/amount-input.js.map +1 -1
  23. package/dist/components/autocomplete.js +2 -2
  24. package/dist/components/autocomplete.js.map +1 -1
  25. package/dist/components/bulk-action-bar.js +2 -1
  26. package/dist/components/bulk-action-bar.js.map +1 -1
  27. package/dist/components/button.d.ts +35 -1
  28. package/dist/components/button.js +5 -9
  29. package/dist/components/button.js.map +1 -1
  30. package/dist/components/calendar-heatmap.js +2 -2
  31. package/dist/components/calendar-heatmap.js.map +1 -1
  32. package/dist/components/camera-button.d.ts +89 -0
  33. package/dist/components/camera-button.js +122 -0
  34. package/dist/components/camera-button.js.map +1 -0
  35. package/dist/components/camera-capture.d.ts +66 -0
  36. package/dist/components/camera-capture.js +190 -0
  37. package/dist/components/camera-capture.js.map +1 -0
  38. package/dist/components/camera-labels.d.ts +20 -0
  39. package/dist/components/camera-labels.js +15 -0
  40. package/dist/components/camera-labels.js.map +1 -0
  41. package/dist/components/chart-edge.d.ts +9 -0
  42. package/dist/components/chart-edge.js +14 -3
  43. package/dist/components/chart-edge.js.map +1 -1
  44. package/dist/components/chart-zoom-core.js +34 -29
  45. package/dist/components/chart-zoom-core.js.map +1 -1
  46. package/dist/components/checkbox-group.js +1 -1
  47. package/dist/components/checkbox-group.js.map +1 -1
  48. package/dist/components/combobox-core.js +3 -2
  49. package/dist/components/combobox-core.js.map +1 -1
  50. package/dist/components/combobox.js +2 -2
  51. package/dist/components/combobox.js.map +1 -1
  52. package/dist/components/consent-again-notice-labels.d.ts +25 -0
  53. package/dist/components/consent-again-notice-labels.js +15 -0
  54. package/dist/components/consent-again-notice-labels.js.map +1 -0
  55. package/dist/components/consent-again-notice.d.ts +85 -0
  56. package/dist/components/consent-again-notice.js +94 -0
  57. package/dist/components/consent-again-notice.js.map +1 -0
  58. package/dist/components/country-select.js +2 -7
  59. package/dist/components/country-select.js.map +1 -1
  60. package/dist/components/currency-select.js +2 -2
  61. package/dist/components/currency-select.js.map +1 -1
  62. package/dist/components/danger-confirm.js +2 -2
  63. package/dist/components/danger-confirm.js.map +1 -1
  64. package/dist/components/data-table-column-settings.js +2 -2
  65. package/dist/components/data-table-column-settings.js.map +1 -1
  66. package/dist/components/data-table-fit.js.map +1 -1
  67. package/dist/components/data-table-virtual.js +13 -3
  68. package/dist/components/data-table-virtual.js.map +1 -1
  69. package/dist/components/date-field.js +2 -2
  70. package/dist/components/date-field.js.map +1 -1
  71. package/dist/components/date-picker.js +2 -2
  72. package/dist/components/date-picker.js.map +1 -1
  73. package/dist/components/date-range-picker.js +2 -6
  74. package/dist/components/date-range-picker.js.map +1 -1
  75. package/dist/components/dialog-frame.d.ts +3 -1
  76. package/dist/components/dialog-frame.js.map +1 -1
  77. package/dist/components/dropdown.js +7 -3
  78. package/dist/components/dropdown.js.map +1 -1
  79. package/dist/components/entity-combobox.js +2 -2
  80. package/dist/components/entity-combobox.js.map +1 -1
  81. package/dist/components/field-parts.d.ts +108 -6
  82. package/dist/components/field-parts.js +59 -6
  83. package/dist/components/field-parts.js.map +1 -1
  84. package/dist/components/field-suggestion-labels.d.ts +2 -0
  85. package/dist/components/field-suggestion-labels.js +10 -0
  86. package/dist/components/field-suggestion-labels.js.map +1 -0
  87. package/dist/components/field.js +1 -1
  88. package/dist/components/field.js.map +1 -1
  89. package/dist/components/file-button.d.ts +1 -1
  90. package/dist/components/file-button.js.map +1 -1
  91. package/dist/components/floating-panel.d.ts +7 -6
  92. package/dist/components/floating-panel.js +3 -17
  93. package/dist/components/floating-panel.js.map +1 -1
  94. package/dist/components/form-actions.d.ts +3 -2
  95. package/dist/components/form-actions.js.map +1 -1
  96. package/dist/components/hover-menu.js +3 -2
  97. package/dist/components/hover-menu.js.map +1 -1
  98. package/dist/components/icon-button.d.ts +23 -5
  99. package/dist/components/icon-button.js +6 -8
  100. package/dist/components/icon-button.js.map +1 -1
  101. package/dist/components/inline-confirm.js +2 -1
  102. package/dist/components/inline-confirm.js.map +1 -1
  103. package/dist/components/inline-entity-combobox.js +2 -2
  104. package/dist/components/inline-entity-combobox.js.map +1 -1
  105. package/dist/components/input.js +2 -2
  106. package/dist/components/input.js.map +1 -1
  107. package/dist/components/jump-calendar.js +3 -3
  108. package/dist/components/jump-calendar.js.map +1 -1
  109. package/dist/components/legal.d.ts +13 -1
  110. package/dist/components/legal.js +12 -0
  111. package/dist/components/legal.js.map +1 -1
  112. package/dist/components/legended-series-chart.d.ts +80 -0
  113. package/dist/components/legended-series-chart.js +70 -0
  114. package/dist/components/legended-series-chart.js.map +1 -0
  115. package/dist/components/lightbox.js +2 -1
  116. package/dist/components/lightbox.js.map +1 -1
  117. package/dist/components/mini-calendar.js +13 -5
  118. package/dist/components/mini-calendar.js.map +1 -1
  119. package/dist/components/modal.d.ts +23 -2
  120. package/dist/components/modal.js +24 -6
  121. package/dist/components/modal.js.map +1 -1
  122. package/dist/components/month-picker.d.ts +1 -1
  123. package/dist/components/month-picker.js +6 -6
  124. package/dist/components/month-picker.js.map +1 -1
  125. package/dist/components/multi-entity-combobox.js +2 -2
  126. package/dist/components/multi-entity-combobox.js.map +1 -1
  127. package/dist/components/multi-select.js +2 -6
  128. package/dist/components/multi-select.js.map +1 -1
  129. package/dist/components/number-input.js +2 -2
  130. package/dist/components/number-input.js.map +1 -1
  131. package/dist/components/page-header-layout.d.ts +18 -0
  132. package/dist/components/page-header-layout.js +23 -0
  133. package/dist/components/page-header-layout.js.map +1 -0
  134. package/dist/components/page-header-skeleton.d.ts +41 -0
  135. package/dist/components/page-header-skeleton.js +52 -0
  136. package/dist/components/page-header-skeleton.js.map +1 -0
  137. package/dist/components/page-header.js +4 -17
  138. package/dist/components/page-header.js.map +1 -1
  139. package/dist/components/popover.js +7 -2
  140. package/dist/components/popover.js.map +1 -1
  141. package/dist/components/release-notes-labels.d.ts +16 -0
  142. package/dist/components/release-notes-labels.js +18 -0
  143. package/dist/components/release-notes-labels.js.map +1 -0
  144. package/dist/components/release-notes.d.ts +65 -0
  145. package/dist/components/release-notes.js +65 -0
  146. package/dist/components/release-notes.js.map +1 -0
  147. package/dist/components/select.js +2 -2
  148. package/dist/components/select.js.map +1 -1
  149. package/dist/components/series-chart-labels.d.ts +9 -0
  150. package/dist/components/series-chart-labels.js +3 -1
  151. package/dist/components/series-chart-labels.js.map +1 -1
  152. package/dist/components/series-chart.d.ts +5 -0
  153. package/dist/components/series-chart.js +89 -36
  154. package/dist/components/series-chart.js.map +1 -1
  155. package/dist/components/toggle-group.js +3 -2
  156. package/dist/components/toggle-group.js.map +1 -1
  157. package/dist/components/treemap-layout.js.map +1 -1
  158. package/dist/components/treemap.d.ts +17 -15
  159. package/dist/components/treemap.js +167 -85
  160. package/dist/components/treemap.js.map +1 -1
  161. package/dist/eslint/index.js +1 -1
  162. package/dist/eslint/role-utilities.d.ts +2 -2
  163. package/dist/eslint/role-utilities.js.map +1 -1
  164. package/dist/feedback/feedback-inbox-page.d.ts +260 -0
  165. package/dist/feedback/feedback-inbox-page.js +207 -0
  166. package/dist/feedback/feedback-inbox-page.js.map +1 -0
  167. package/dist/feedback/feedback-vocabulary.js +2 -2
  168. package/dist/feedback/feedback-vocabulary.js.map +1 -1
  169. package/dist/feedback.d.ts +1 -0
  170. package/dist/feedback.js +6 -0
  171. package/dist/feedback.js.map +1 -1
  172. package/dist/hooks/use-debounce.d.ts +32 -5
  173. package/dist/hooks/use-debounce.js +6 -5
  174. package/dist/hooks/use-debounce.js.map +1 -1
  175. package/dist/hooks/use-file-picker.d.ts +3 -1
  176. package/dist/hooks/use-file-picker.js.map +1 -1
  177. package/dist/hooks/use-focus-trap.d.ts +19 -3
  178. package/dist/hooks/use-focus-trap.js +15 -5
  179. package/dist/hooks/use-focus-trap.js.map +1 -1
  180. package/dist/hooks/use-has-camera.d.ts +36 -0
  181. package/dist/hooks/use-has-camera.js +53 -0
  182. package/dist/hooks/use-has-camera.js.map +1 -0
  183. package/dist/hooks/use-hotkey.js +1 -10
  184. package/dist/hooks/use-hotkey.js.map +1 -1
  185. package/dist/hooks/use-overlay-history.d.ts +6 -1
  186. package/dist/hooks/use-overlay-history.js +10 -2
  187. package/dist/hooks/use-overlay-history.js.map +1 -1
  188. package/dist/i18n/defaults.js +11 -1
  189. package/dist/i18n/defaults.js.map +1 -1
  190. package/dist/i18n/german.js +75 -3
  191. package/dist/i18n/german.js.map +1 -1
  192. package/dist/i18n/kit-labels.d.ts +20 -0
  193. package/dist/i18n/kit-labels.js.map +1 -1
  194. package/dist/i18n/locales/en.js +92 -4
  195. package/dist/i18n/locales/en.js.map +3 -3
  196. package/dist/i18n/locales/es.js +71 -3
  197. package/dist/i18n/locales/es.js.map +1 -1
  198. package/dist/i18n/locales/fr.js +72 -2
  199. package/dist/i18n/locales/fr.js.map +1 -1
  200. package/dist/i18n/locales/hu.js +74 -3
  201. package/dist/i18n/locales/hu.js.map +1 -1
  202. package/dist/i18n/locales/it.js +74 -3
  203. package/dist/i18n/locales/it.js.map +1 -1
  204. package/dist/i18n/locales/zh.js +71 -3
  205. package/dist/i18n/locales/zh.js.map +1 -1
  206. package/dist/i18n/review.js +22 -1
  207. package/dist/i18n/review.js.map +1 -1
  208. package/dist/index.d.ts +24 -5
  209. package/dist/index.js +35 -1
  210. package/dist/index.js.map +1 -1
  211. package/dist/landing/landing-labels.d.ts +8 -0
  212. package/dist/landing/landing-labels.js +2 -1
  213. package/dist/landing/landing-labels.js.map +1 -1
  214. package/dist/lib/changelog.d.ts +130 -0
  215. package/dist/lib/changelog.js +137 -0
  216. package/dist/lib/changelog.js.map +1 -0
  217. package/dist/lib/clipboard-minus.js +2 -2
  218. package/dist/lib/clipboard-minus.js.map +1 -1
  219. package/dist/lib/dates.d.ts +29 -3
  220. package/dist/lib/dates.js +41 -12
  221. package/dist/lib/dates.js.map +1 -1
  222. package/dist/lib/editable-content.d.ts +33 -0
  223. package/dist/lib/editable-content.js +15 -0
  224. package/dist/lib/editable-content.js.map +1 -0
  225. package/dist/lib/focus-left.d.ts +47 -1
  226. package/dist/lib/focus-left.js +11 -2
  227. package/dist/lib/focus-left.js.map +1 -1
  228. package/dist/lib/server-wake.d.ts +49 -9
  229. package/dist/lib/server-wake.js +25 -14
  230. package/dist/lib/server-wake.js.map +1 -1
  231. package/dist/lib/session-refresh.d.ts +53 -0
  232. package/dist/lib/session-refresh.js +27 -1
  233. package/dist/lib/session-refresh.js.map +1 -1
  234. package/dist/rhf/fields.js +3 -3
  235. package/dist/rhf/fields.js.map +1 -1
  236. package/dist/shell/app-shell.d.ts +25 -1
  237. package/dist/shell/app-shell.js +3 -1
  238. package/dist/shell/app-shell.js.map +1 -1
  239. package/dist/shell/dev-menu.d.ts +3 -0
  240. package/dist/shell/dev-menu.js +4 -2
  241. package/dist/shell/dev-menu.js.map +1 -1
  242. package/dist/shell/held-changes-banner-labels.d.ts +23 -0
  243. package/dist/shell/held-changes-banner-labels.js +14 -0
  244. package/dist/shell/held-changes-banner-labels.js.map +1 -0
  245. package/dist/shell/held-changes-banner.d.ts +75 -0
  246. package/dist/shell/held-changes-banner.js +106 -0
  247. package/dist/shell/held-changes-banner.js.map +1 -0
  248. package/dist/shell/sync-status-indicator.d.ts +27 -12
  249. package/dist/shell/sync-status-indicator.js +13 -4
  250. package/dist/shell/sync-status-indicator.js.map +1 -1
  251. package/dist/shell/top-bar-parts-labels.d.ts +5 -0
  252. package/dist/shell/top-bar-parts-labels.js +3 -1
  253. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  254. package/dist/shell.d.ts +2 -0
  255. package/dist/shell.js +3 -0
  256. package/dist/shell.js.map +1 -1
  257. package/dist/sync/engine.d.ts +11 -2
  258. package/dist/sync/engine.js +13 -5
  259. package/dist/sync/engine.js.map +1 -1
  260. package/dist/sync/hooks.d.ts +3 -2
  261. package/dist/sync/hooks.js +4 -2
  262. package/dist/sync/hooks.js.map +1 -1
  263. package/dist/testing/css-variables.generated.d.ts +2 -2
  264. package/dist/testing/css-variables.generated.js +1 -1
  265. package/dist/testing/css-variables.generated.js.map +1 -1
  266. package/dist/theme/chart-palette.d.ts +18 -0
  267. package/dist/theme/chart-palette.js +17 -1
  268. package/dist/theme/chart-palette.js.map +1 -1
  269. package/dist/theme/contrast-tokens.d.ts +3 -3
  270. package/dist/theme/contrast-tokens.js.map +1 -1
  271. package/dist/theme/contrast.d.ts +4 -4
  272. package/dist/theme/contrast.js.map +1 -1
  273. package/dist/tour/tour-overlay.js +2 -1
  274. package/dist/tour/tour-overlay.js.map +1 -1
  275. package/package.json +5 -9
  276. package/tokens.css +19 -54
  277. package/src/account/account-parts.ts +0 -47
  278. package/src/account/account-settings-labels.ts +0 -240
  279. package/src/account/account-settings.tsx +0 -698
  280. package/src/account/data-export-setting-labels.ts +0 -20
  281. package/src/account/data-export-setting.tsx +0 -200
  282. package/src/account/delete-account-setting-labels.ts +0 -33
  283. package/src/account/delete-account-setting.tsx +0 -342
  284. package/src/account/email-change-setting-labels.ts +0 -31
  285. package/src/account/email-change-setting.tsx +0 -443
  286. package/src/account/passkeys-setting.tsx +0 -445
  287. package/src/account/sessions-setting-labels.ts +0 -24
  288. package/src/account/sessions-setting.tsx +0 -283
  289. package/src/admin/admin-action-confirm-labels.ts +0 -19
  290. package/src/admin/admin-action-confirm.tsx +0 -509
  291. package/src/admin/admin-action-log-labels.ts +0 -83
  292. package/src/admin/admin-action-log.tsx +0 -464
  293. package/src/admin/admin-area-labels.ts +0 -114
  294. package/src/admin/admin-forbidden.tsx +0 -75
  295. package/src/admin/admin-overview.tsx +0 -258
  296. package/src/admin/admin-parts.ts +0 -68
  297. package/src/admin/admin-sections.tsx +0 -208
  298. package/src/admin/admin-tool-links.tsx +0 -90
  299. package/src/admin/invitations-panel-labels.ts +0 -31
  300. package/src/admin/invitations-panel.tsx +0 -516
  301. package/src/admin/mail-test-card-labels.ts +0 -19
  302. package/src/admin/mail-test-card.tsx +0 -189
  303. package/src/admin/plan-change-labels.ts +0 -5
  304. package/src/admin/plan-change.tsx +0 -474
  305. package/src/admin/reviewer-scope-editor-labels.ts +0 -16
  306. package/src/admin/reviewer-scope-editor.tsx +0 -224
  307. package/src/admin/role-select-labels.ts +0 -16
  308. package/src/admin/role-select.tsx +0 -282
  309. package/src/admin/transfer-ownership-dialog-labels.ts +0 -20
  310. package/src/admin/transfer-ownership-dialog.tsx +0 -162
  311. package/src/admin/user-roster-labels.ts +0 -17
  312. package/src/admin/user-roster.tsx +0 -559
  313. package/src/auth/accept-invitation-labels.ts +0 -21
  314. package/src/auth/accept-invitation.tsx +0 -210
  315. package/src/auth/auth-errors-labels.ts +0 -23
  316. package/src/auth/auth-errors.ts +0 -439
  317. package/src/auth/complete-name-dialog-labels.ts +0 -16
  318. package/src/auth/complete-name-dialog.tsx +0 -253
  319. package/src/auth/email-tag.ts +0 -75
  320. package/src/auth/forgot-password-form-labels.ts +0 -20
  321. package/src/auth/forgot-password-form.tsx +0 -221
  322. package/src/auth/form-rules.ts +0 -40
  323. package/src/auth/new-password-fields.tsx +0 -85
  324. package/src/auth/not-found-page-labels.ts +0 -12
  325. package/src/auth/not-found-page.tsx +0 -95
  326. package/src/auth/register-form-labels.ts +0 -31
  327. package/src/auth/register-form.tsx +0 -456
  328. package/src/auth/reset-password-form-labels.ts +0 -27
  329. package/src/auth/reset-password-form.tsx +0 -341
  330. package/src/auth/sign-in-form-labels.ts +0 -44
  331. package/src/auth/sign-in-form.tsx +0 -858
  332. package/src/auth/status-parts.tsx +0 -132
  333. package/src/auth/verify-email-labels.ts +0 -26
  334. package/src/auth/verify-email.tsx +0 -445
  335. package/src/billing/billing-banner.tsx +0 -258
  336. package/src/billing/billing-labels.ts +0 -381
  337. package/src/billing/billing-lock.ts +0 -108
  338. package/src/billing/billing-overview.ts +0 -157
  339. package/src/billing/billing-standing.ts +0 -80
  340. package/src/billing/cancel-request.ts +0 -97
  341. package/src/billing/cancel-subscription.tsx +0 -98
  342. package/src/billing/checkout-processing.ts +0 -394
  343. package/src/billing/checkout-return.ts +0 -90
  344. package/src/billing/pay-page.ts +0 -330
  345. package/src/billing/plan-card.tsx +0 -562
  346. package/src/billing/plan-change-labels.ts +0 -66
  347. package/src/billing/plan-limit-notice.tsx +0 -148
  348. package/src/billing/plan-limit-toast.tsx +0 -90
  349. package/src/billing/plan-limit.ts +0 -52
  350. package/src/billing/plan-price.ts +0 -98
  351. package/src/billing/plan-switch.tsx +0 -216
  352. package/src/billing/provider-page.ts +0 -84
  353. package/src/billing/subscription-actions.tsx +0 -247
  354. package/src/billing/subscription-status-chip.tsx +0 -95
  355. package/src/chart.ts +0 -103
  356. package/src/components/account-chips-labels.ts +0 -16
  357. package/src/components/account-chips.tsx +0 -474
  358. package/src/components/alert-banner.tsx +0 -670
  359. package/src/components/amount-input.tsx +0 -816
  360. package/src/components/appearance-labels.ts +0 -63
  361. package/src/components/authed-image-labels.ts +0 -11
  362. package/src/components/authed-image.tsx +0 -209
  363. package/src/components/autocomplete.tsx +0 -645
  364. package/src/components/breadcrumbs-labels.ts +0 -10
  365. package/src/components/breadcrumbs.tsx +0 -205
  366. package/src/components/bulk-action-bar-labels.ts +0 -11
  367. package/src/components/bulk-action-bar.tsx +0 -443
  368. package/src/components/button-group.tsx +0 -223
  369. package/src/components/button-look.ts +0 -256
  370. package/src/components/button.tsx +0 -339
  371. package/src/components/calculator.tsx +0 -341
  372. package/src/components/calendar-heatmap-labels.ts +0 -15
  373. package/src/components/calendar-heatmap.tsx +0 -600
  374. package/src/components/card.tsx +0 -377
  375. package/src/components/chart-edge.ts +0 -106
  376. package/src/components/chart-figure.tsx +0 -35
  377. package/src/components/chart-height.ts +0 -30
  378. package/src/components/chart-zoom-core.tsx +0 -627
  379. package/src/components/chart-zoom.tsx +0 -22
  380. package/src/components/chart.tsx +0 -554
  381. package/src/components/checkbox-group.tsx +0 -247
  382. package/src/components/checkbox.tsx +0 -346
  383. package/src/components/chip-input.tsx +0 -370
  384. package/src/components/chip-labels.ts +0 -13
  385. package/src/components/chip.tsx +0 -843
  386. package/src/components/choice-card.tsx +0 -544
  387. package/src/components/column-mapper-labels.ts +0 -38
  388. package/src/components/column-mapper.tsx +0 -655
  389. package/src/components/combobox-core.tsx +0 -1321
  390. package/src/components/combobox-suggestions.tsx +0 -131
  391. package/src/components/combobox.tsx +0 -716
  392. package/src/components/confirm-context.ts +0 -7
  393. package/src/components/confirm-dialog-labels.ts +0 -13
  394. package/src/components/confirm-dialog.tsx +0 -341
  395. package/src/components/copy-button-labels.ts +0 -13
  396. package/src/components/copy-button.tsx +0 -192
  397. package/src/components/country-select-labels.ts +0 -11
  398. package/src/components/country-select.tsx +0 -539
  399. package/src/components/currency-option-list.tsx +0 -188
  400. package/src/components/currency-select.tsx +0 -343
  401. package/src/components/danger-confirm-labels.ts +0 -20
  402. package/src/components/danger-confirm.tsx +0 -987
  403. package/src/components/data-table-cells.tsx +0 -118
  404. package/src/components/data-table-column-settings.tsx +0 -198
  405. package/src/components/data-table-filter-popover.tsx +0 -289
  406. package/src/components/data-table-filters.ts +0 -315
  407. package/src/components/data-table-fit.ts +0 -301
  408. package/src/components/data-table-groups.tsx +0 -288
  409. package/src/components/data-table-head.tsx +0 -280
  410. package/src/components/data-table-labels.ts +0 -198
  411. package/src/components/data-table-leading-row.tsx +0 -58
  412. package/src/components/data-table-mobile.tsx +0 -1117
  413. package/src/components/data-table-pagination.tsx +0 -202
  414. package/src/components/data-table-resize.ts +0 -188
  415. package/src/components/data-table-row-actions.tsx +0 -302
  416. package/src/components/data-table-row.tsx +0 -496
  417. package/src/components/data-table-selection.ts +0 -71
  418. package/src/components/data-table-shared.tsx +0 -287
  419. package/src/components/data-table-sort.ts +0 -163
  420. package/src/components/data-table-virtual.ts +0 -576
  421. package/src/components/data-table.tsx +0 -2598
  422. package/src/components/date-field.tsx +0 -684
  423. package/src/components/date-format-setting.tsx +0 -64
  424. package/src/components/date-picker.tsx +0 -404
  425. package/src/components/date-range-picker.tsx +0 -518
  426. package/src/components/description-list-labels.ts +0 -9
  427. package/src/components/description-list.tsx +0 -386
  428. package/src/components/dialog-frame-labels.ts +0 -7
  429. package/src/components/dialog-frame.tsx +0 -284
  430. package/src/components/disclosure.tsx +0 -476
  431. package/src/components/dropdown.tsx +0 -461
  432. package/src/components/empty-state.tsx +0 -136
  433. package/src/components/entity-combobox.tsx +0 -422
  434. package/src/components/error-boundary-labels.ts +0 -20
  435. package/src/components/error-boundary.tsx +0 -675
  436. package/src/components/facing-pair.ts +0 -93
  437. package/src/components/field-base-labels.ts +0 -20
  438. package/src/components/field-base.tsx +0 -656
  439. package/src/components/field-parts.tsx +0 -825
  440. package/src/components/field-strip.tsx +0 -129
  441. package/src/components/field.tsx +0 -206
  442. package/src/components/file-button.tsx +0 -295
  443. package/src/components/file-dropzone.tsx +0 -559
  444. package/src/components/floating-panel-labels.ts +0 -10
  445. package/src/components/floating-panel.tsx +0 -828
  446. package/src/components/focus-ring.ts +0 -16
  447. package/src/components/form-actions-labels.ts +0 -11
  448. package/src/components/form-actions.tsx +0 -578
  449. package/src/components/full-bleed-dialog.tsx +0 -294
  450. package/src/components/grouped-picker.tsx +0 -184
  451. package/src/components/help-popover.tsx +0 -117
  452. package/src/components/hover-menu.tsx +0 -343
  453. package/src/components/iban-input-labels.ts +0 -14
  454. package/src/components/iban-input.tsx +0 -236
  455. package/src/components/icon-button.tsx +0 -959
  456. package/src/components/icon-picker-labels.ts +0 -13
  457. package/src/components/icon-picker.tsx +0 -232
  458. package/src/components/image-grid-labels.ts +0 -11
  459. package/src/components/image-grid.tsx +0 -202
  460. package/src/components/inline-confirm.tsx +0 -116
  461. package/src/components/inline-edit-field-labels.ts +0 -11
  462. package/src/components/inline-edit-field.tsx +0 -552
  463. package/src/components/inline-entity-combobox.tsx +0 -849
  464. package/src/components/input.tsx +0 -394
  465. package/src/components/jump-calendar.tsx +0 -265
  466. package/src/components/language-select.tsx +0 -93
  467. package/src/components/legal-labels.ts +0 -105
  468. package/src/components/legal-page.tsx +0 -711
  469. package/src/components/legal.tsx +0 -668
  470. package/src/components/lightbox-labels.ts +0 -18
  471. package/src/components/lightbox.tsx +0 -399
  472. package/src/components/line-items-labels.ts +0 -14
  473. package/src/components/line-items.tsx +0 -602
  474. package/src/components/list-labels.ts +0 -12
  475. package/src/components/list.tsx +0 -870
  476. package/src/components/loading-state.tsx +0 -78
  477. package/src/components/measured-grid-labels.ts +0 -25
  478. package/src/components/measured-grid.tsx +0 -837
  479. package/src/components/menu-item.tsx +0 -241
  480. package/src/components/mini-calendar-labels.ts +0 -17
  481. package/src/components/mini-calendar.tsx +0 -792
  482. package/src/components/modal.tsx +0 -534
  483. package/src/components/money-draft.ts +0 -83
  484. package/src/components/money-field.tsx +0 -76
  485. package/src/components/month-grid.tsx +0 -229
  486. package/src/components/month-picker-labels.ts +0 -22
  487. package/src/components/month-picker.tsx +0 -1087
  488. package/src/components/multi-entity-combobox.tsx +0 -369
  489. package/src/components/multi-select.tsx +0 -376
  490. package/src/components/nav-pills.tsx +0 -198
  491. package/src/components/number-field.tsx +0 -327
  492. package/src/components/number-input.tsx +0 -559
  493. package/src/components/numeric-field.ts +0 -169
  494. package/src/components/numpad-sheet.tsx +0 -285
  495. package/src/components/one-time-code-input.tsx +0 -270
  496. package/src/components/page-contents-labels.ts +0 -9
  497. package/src/components/page-contents.tsx +0 -282
  498. package/src/components/page-header-context.ts +0 -8
  499. package/src/components/page-header.tsx +0 -298
  500. package/src/components/password-strength-labels.ts +0 -22
  501. package/src/components/password-strength.tsx +0 -241
  502. package/src/components/phone-input-labels.ts +0 -10
  503. package/src/components/phone-input.tsx +0 -282
  504. package/src/components/picker-sheet.tsx +0 -330
  505. package/src/components/pie-chart-labels.ts +0 -40
  506. package/src/components/pie-chart.tsx +0 -480
  507. package/src/components/popover-labels.ts +0 -14
  508. package/src/components/popover.tsx +0 -268
  509. package/src/components/progress-bar-labels.ts +0 -10
  510. package/src/components/progress-bar.tsx +0 -479
  511. package/src/components/qr-code.tsx +0 -76
  512. package/src/components/reauth-dialog-labels.ts +0 -13
  513. package/src/components/reauth-dialog.tsx +0 -265
  514. package/src/components/row-actions-labels.ts +0 -12
  515. package/src/components/row-actions.tsx +0 -795
  516. package/src/components/scroll-area.tsx +0 -123
  517. package/src/components/search-field.tsx +0 -192
  518. package/src/components/select.tsx +0 -294
  519. package/src/components/separator.tsx +0 -33
  520. package/src/components/series-chart-axes.ts +0 -342
  521. package/src/components/series-chart-budget.ts +0 -150
  522. package/src/components/series-chart-labels.ts +0 -33
  523. package/src/components/series-chart-thin.ts +0 -180
  524. package/src/components/series-chart-ticks.ts +0 -194
  525. package/src/components/series-chart.tsx +0 -1906
  526. package/src/components/server-wake-labels.ts +0 -11
  527. package/src/components/server-wake.tsx +0 -129
  528. package/src/components/settings-fields.tsx +0 -237
  529. package/src/components/share-card-labels.ts +0 -30
  530. package/src/components/share-card.tsx +0 -675
  531. package/src/components/signature-pad-labels.ts +0 -24
  532. package/src/components/signature-pad.tsx +0 -747
  533. package/src/components/signed-amount-labels.ts +0 -10
  534. package/src/components/signed-amount.tsx +0 -336
  535. package/src/components/skeleton.tsx +0 -80
  536. package/src/components/slider.tsx +0 -338
  537. package/src/components/sparkline-labels.ts +0 -14
  538. package/src/components/sparkline.tsx +0 -322
  539. package/src/components/spinner.tsx +0 -81
  540. package/src/components/stat-tile-labels.ts +0 -15
  541. package/src/components/stat-tile.tsx +0 -754
  542. package/src/components/status-dot.tsx +0 -170
  543. package/src/components/swatch-picker-labels.ts +0 -10
  544. package/src/components/swatch-picker.tsx +0 -283
  545. package/src/components/swipeable-row.tsx +0 -386
  546. package/src/components/switch.tsx +0 -273
  547. package/src/components/table-skeleton.tsx +0 -136
  548. package/src/components/table.tsx +0 -647
  549. package/src/components/tabs-labels.ts +0 -13
  550. package/src/components/tabs.tsx +0 -693
  551. package/src/components/text-link.tsx +0 -359
  552. package/src/components/text.tsx +0 -150
  553. package/src/components/textarea.tsx +0 -330
  554. package/src/components/tile-radio.tsx +0 -332
  555. package/src/components/time-input.tsx +0 -121
  556. package/src/components/toast-labels.ts +0 -12
  557. package/src/components/toast.tsx +0 -519
  558. package/src/components/toggle-group.tsx +0 -752
  559. package/src/components/toggle-legend.tsx +0 -394
  560. package/src/components/tooltip.tsx +0 -1149
  561. package/src/components/translation-review-editor.tsx +0 -290
  562. package/src/components/translation-review-labels.ts +0 -181
  563. package/src/components/translation-review-parts.tsx +0 -272
  564. package/src/components/translation-review.tsx +0 -1240
  565. package/src/components/tree-view.tsx +0 -589
  566. package/src/components/treemap-labels.ts +0 -47
  567. package/src/components/treemap-layout.ts +0 -210
  568. package/src/components/treemap.tsx +0 -1184
  569. package/src/components/trigger-aria.ts +0 -44
  570. package/src/components/use-anchor-dir.ts +0 -20
  571. package/src/components/use-mobile-reveal.ts +0 -62
  572. package/src/components/use-table-state.ts +0 -753
  573. package/src/components/user-avatar.tsx +0 -116
  574. package/src/components/wizard-stepper.tsx +0 -42
  575. package/src/components/write-lock-labels.ts +0 -10
  576. package/src/components/write-lock.tsx +0 -253
  577. package/src/currencies.ts +0 -90
  578. package/src/data-table.ts +0 -42
  579. package/src/demo/demo-banner.tsx +0 -153
  580. package/src/demo/demo-countdown.ts +0 -136
  581. package/src/demo/demo-ended.tsx +0 -90
  582. package/src/demo/demo-labels.ts +0 -78
  583. package/src/demo/demo-session.ts +0 -32
  584. package/src/demo/demo-start.tsx +0 -156
  585. package/src/eslint/index.ts +0 -161
  586. package/src/eslint/role-utilities.generated.ts +0 -146
  587. package/src/eslint/role-utilities.ts +0 -233
  588. package/src/feedback/feedback-attachment-download.tsx +0 -77
  589. package/src/feedback/feedback-attachment-labels.ts +0 -37
  590. package/src/feedback/feedback-attachment.tsx +0 -1239
  591. package/src/feedback/feedback-capture.ts +0 -287
  592. package/src/feedback/feedback-comment-thread.tsx +0 -353
  593. package/src/feedback/feedback-context-labels.ts +0 -11
  594. package/src/feedback/feedback-context.tsx +0 -245
  595. package/src/feedback/feedback-crash.ts +0 -547
  596. package/src/feedback/feedback-diagnostics.tsx +0 -41
  597. package/src/feedback/feedback-dialog-labels.ts +0 -29
  598. package/src/feedback/feedback-dialog.tsx +0 -452
  599. package/src/feedback/feedback-entry-file.tsx +0 -150
  600. package/src/feedback/feedback-inbox.tsx +0 -552
  601. package/src/feedback/feedback-labels.ts +0 -144
  602. package/src/feedback/feedback-menu-labels.ts +0 -12
  603. package/src/feedback/feedback-menu.tsx +0 -177
  604. package/src/feedback/feedback-mutation.ts +0 -20
  605. package/src/feedback/feedback-page-link.ts +0 -90
  606. package/src/feedback/feedback-public-labels.ts +0 -81
  607. package/src/feedback/feedback-public-list.tsx +0 -524
  608. package/src/feedback/feedback-public-switch.tsx +0 -102
  609. package/src/feedback/feedback-public-types.ts +0 -101
  610. package/src/feedback/feedback-record.ts +0 -428
  611. package/src/feedback/feedback-replies-context.ts +0 -9
  612. package/src/feedback/feedback-replies.tsx +0 -343
  613. package/src/feedback/feedback-rework-entry-chip.tsx +0 -18
  614. package/src/feedback/feedback-row-detail-labels.ts +0 -31
  615. package/src/feedback/feedback-row-detail.tsx +0 -871
  616. package/src/feedback/feedback-status-undo.ts +0 -109
  617. package/src/feedback/feedback-submit-dialog.tsx +0 -131
  618. package/src/feedback/feedback-submit.tsx +0 -270
  619. package/src/feedback/feedback-swipe.tsx +0 -192
  620. package/src/feedback/feedback-table-labels.ts +0 -27
  621. package/src/feedback/feedback-table.tsx +0 -912
  622. package/src/feedback/feedback-thread-labels.ts +0 -22
  623. package/src/feedback/feedback-thread-parts-labels.ts +0 -41
  624. package/src/feedback/feedback-thread.tsx +0 -905
  625. package/src/feedback/feedback-vocabulary.ts +0 -263
  626. package/src/feedback/feedback-vote-button.tsx +0 -124
  627. package/src/feedback.ts +0 -116
  628. package/src/hooks/use-anchored-panel.ts +0 -396
  629. package/src/hooks/use-anchored-rect.ts +0 -77
  630. package/src/hooks/use-announce.ts +0 -85
  631. package/src/hooks/use-authed-src.ts +0 -167
  632. package/src/hooks/use-body-scroll-lock.ts +0 -119
  633. package/src/hooks/use-breakpoint.ts +0 -133
  634. package/src/hooks/use-close-transition.ts +0 -107
  635. package/src/hooks/use-copy-to-clipboard.ts +0 -122
  636. package/src/hooks/use-debounce.ts +0 -114
  637. package/src/hooks/use-dismiss.ts +0 -371
  638. package/src/hooks/use-document-title.ts +0 -33
  639. package/src/hooks/use-file-drop.ts +0 -121
  640. package/src/hooks/use-file-picker-labels.ts +0 -28
  641. package/src/hooks/use-file-picker.tsx +0 -359
  642. package/src/hooks/use-focus-trap.ts +0 -199
  643. package/src/hooks/use-hotkey.ts +0 -212
  644. package/src/hooks/use-large-text.ts +0 -41
  645. package/src/hooks/use-long-press.ts +0 -140
  646. package/src/hooks/use-media-query.ts +0 -39
  647. package/src/hooks/use-mounted.ts +0 -39
  648. package/src/hooks/use-noindex.ts +0 -37
  649. package/src/hooks/use-overlay-history.ts +0 -714
  650. package/src/hooks/use-row-swipe.ts +0 -207
  651. package/src/hooks/use-search-param-state.ts +0 -434
  652. package/src/hooks/use-windowed-rows.ts +0 -225
  653. package/src/i18n/defaults.ts +0 -267
  654. package/src/i18n/german.ts +0 -2059
  655. package/src/i18n/kit-labels.tsx +0 -1003
  656. package/src/i18n/languages.ts +0 -349
  657. package/src/i18n/locales/de-CH.ts +0 -24
  658. package/src/i18n/locales/en.ts +0 -267
  659. package/src/i18n/locales/es.ts +0 -1999
  660. package/src/i18n/locales/fr.ts +0 -2037
  661. package/src/i18n/locales/hu.ts +0 -2004
  662. package/src/i18n/locales/it.ts +0 -2014
  663. package/src/i18n/locales/zh.ts +0 -1912
  664. package/src/i18n/plurals.ts +0 -86
  665. package/src/i18n/review.ts +0 -475
  666. package/src/i18n/shared-labels.ts +0 -138
  667. package/src/i18n/swiss.ts +0 -29
  668. package/src/index.ts +0 -1191
  669. package/src/landing/access.ts +0 -93
  670. package/src/landing/landing-actions.tsx +0 -97
  671. package/src/landing/landing-labels.ts +0 -59
  672. package/src/landing/landing-sections.tsx +0 -341
  673. package/src/landing/page-seo.ts +0 -261
  674. package/src/landing/public-header.tsx +0 -121
  675. package/src/landing/public-page.tsx +0 -106
  676. package/src/landing/routing.tsx +0 -225
  677. package/src/lib/broadcast.ts +0 -52
  678. package/src/lib/calc.ts +0 -323
  679. package/src/lib/chip-edge-snap.ts +0 -212
  680. package/src/lib/clipboard-minus.ts +0 -107
  681. package/src/lib/clipping.ts +0 -34
  682. package/src/lib/cn.ts +0 -28
  683. package/src/lib/column-mapping.ts +0 -234
  684. package/src/lib/countries.ts +0 -91
  685. package/src/lib/data-attributes.ts +0 -14
  686. package/src/lib/date-format.ts +0 -227
  687. package/src/lib/dates.ts +0 -288
  688. package/src/lib/day-format.ts +0 -96
  689. package/src/lib/decimal-marks.ts +0 -108
  690. package/src/lib/describe-failure.ts +0 -18
  691. package/src/lib/device-settings.ts +0 -147
  692. package/src/lib/direction.ts +0 -74
  693. package/src/lib/document-navigation.ts +0 -17
  694. package/src/lib/document-title.ts +0 -41
  695. package/src/lib/download.ts +0 -172
  696. package/src/lib/float-clearance.ts +0 -70
  697. package/src/lib/floating-stack.ts +0 -70
  698. package/src/lib/focus-left.ts +0 -156
  699. package/src/lib/format.ts +0 -585
  700. package/src/lib/http-status.ts +0 -38
  701. package/src/lib/iban.ts +0 -251
  702. package/src/lib/ime.ts +0 -24
  703. package/src/lib/intl-cache.ts +0 -27
  704. package/src/lib/iso-day.ts +0 -13
  705. package/src/lib/lazy-with-fallback.ts +0 -82
  706. package/src/lib/logger.ts +0 -69
  707. package/src/lib/minus.ts +0 -50
  708. package/src/lib/path-pattern.ts +0 -55
  709. package/src/lib/person-name.ts +0 -155
  710. package/src/lib/phone.ts +0 -208
  711. package/src/lib/plain-text.ts +0 -22
  712. package/src/lib/presence.ts +0 -18
  713. package/src/lib/qr-encode.ts +0 -444
  714. package/src/lib/quiet-focus.ts +0 -32
  715. package/src/lib/reduced-motion.ts +0 -22
  716. package/src/lib/refs.ts +0 -22
  717. package/src/lib/round.ts +0 -43
  718. package/src/lib/safe-storage.ts +0 -119
  719. package/src/lib/server-wake.ts +0 -315
  720. package/src/lib/session-refresh.ts +0 -472
  721. package/src/lib/share-format.ts +0 -18
  722. package/src/lib/status-tone.ts +0 -43
  723. package/src/lib/strip-fade.ts +0 -287
  724. package/src/lib/table-text.ts +0 -554
  725. package/src/lib/text-case.ts +0 -19
  726. package/src/lib/text-match.ts +0 -169
  727. package/src/lib/thenable.ts +0 -19
  728. package/src/lib/translation-review.ts +0 -769
  729. package/src/notifications/device-zone-report.ts +0 -67
  730. package/src/notifications/feedback-notification-types-labels.ts +0 -33
  731. package/src/notifications/feedback-notification-types.ts +0 -71
  732. package/src/notifications/notification-bell.tsx +0 -119
  733. package/src/notifications/notification-inbox.tsx +0 -309
  734. package/src/notifications/notification-parts.tsx +0 -81
  735. package/src/notifications/notification-types-setting.tsx +0 -406
  736. package/src/notifications/notification-types.ts +0 -89
  737. package/src/notifications/notifications-labels.ts +0 -287
  738. package/src/notifications/push-device-setting.tsx +0 -230
  739. package/src/notifications/push-devices-setting.tsx +0 -374
  740. package/src/notifications/push-worker.ts +0 -168
  741. package/src/notifications/quiet-hours-setting.tsx +0 -238
  742. package/src/notifications/unsubscribe-panel.tsx +0 -200
  743. package/src/notifications/use-push-device.ts +0 -448
  744. package/src/offline/local-first.ts +0 -100
  745. package/src/offline/pwa-update-prompt-labels.ts +0 -9
  746. package/src/offline/pwa-update-prompt.tsx +0 -78
  747. package/src/offline/query-persistence.ts +0 -391
  748. package/src/offline/service-worker-updates.ts +0 -81
  749. package/src/offline/shared-computer-labels.ts +0 -8
  750. package/src/offline/shared-computer.tsx +0 -87
  751. package/src/offline/sign-out-pending-dialog-labels.ts +0 -21
  752. package/src/offline/sign-out-pending-dialog.tsx +0 -135
  753. package/src/offline.ts +0 -37
  754. package/src/push-worker.ts +0 -25
  755. package/src/rhf/fields.tsx +0 -2187
  756. package/src/rhf/form-core.tsx +0 -324
  757. package/src/rhf/form.tsx +0 -12
  758. package/src/rhf/line-items.tsx +0 -135
  759. package/src/rhf/use-rhf-wizard-step.ts +0 -104
  760. package/src/rhf.ts +0 -21
  761. package/src/search/command-palette-labels.ts +0 -16
  762. package/src/search/command-palette.tsx +0 -624
  763. package/src/search/global-search-labels.ts +0 -13
  764. package/src/search/global-search.tsx +0 -660
  765. package/src/search/search-index.ts +0 -283
  766. package/src/search/use-command-key.ts +0 -23
  767. package/src/search.ts +0 -14
  768. package/src/settings/device-reset-setting-labels.ts +0 -20
  769. package/src/settings/device-reset-setting.tsx +0 -116
  770. package/src/settings/settings-card-classes.ts +0 -11
  771. package/src/settings/settings-catalogue.ts +0 -150
  772. package/src/settings/settings-context.ts +0 -33
  773. package/src/settings/settings-heading.tsx +0 -67
  774. package/src/settings/settings-labels.ts +0 -87
  775. package/src/settings/settings-layout.tsx +0 -471
  776. package/src/settings/settings-section.tsx +0 -108
  777. package/src/settings/use-account-appearance.ts +0 -148
  778. package/src/settings/use-account-language.ts +0 -146
  779. package/src/settings/use-settings-focus.ts +0 -128
  780. package/src/settings/use-settings-route.ts +0 -258
  781. package/src/shell/account-menu-language.tsx +0 -130
  782. package/src/shell/account-menu-text-size.tsx +0 -80
  783. package/src/shell/admin-menu.tsx +0 -183
  784. package/src/shell/app-shell-labels.ts +0 -11
  785. package/src/shell/app-shell.tsx +0 -1560
  786. package/src/shell/auth-layout.tsx +0 -186
  787. package/src/shell/company-switcher-labels.ts +0 -13
  788. package/src/shell/company-switcher.tsx +0 -136
  789. package/src/shell/dev-menu.tsx +0 -257
  790. package/src/shell/fill-height.tsx +0 -45
  791. package/src/shell/language-code.ts +0 -5
  792. package/src/shell/option-switcher-menu.tsx +0 -84
  793. package/src/shell/sync-status-indicator.tsx +0 -303
  794. package/src/shell/top-bar-actions.tsx +0 -87
  795. package/src/shell/top-bar-brand.tsx +0 -78
  796. package/src/shell/top-bar-parts-labels.ts +0 -148
  797. package/src/shell/top-bar.tsx +0 -40
  798. package/src/shell/topbar-action-menu.tsx +0 -567
  799. package/src/shell/topbar-controls.tsx +0 -269
  800. package/src/shell/tour-menu.tsx +0 -187
  801. package/src/shell.ts +0 -108
  802. package/src/sync/db.ts +0 -129
  803. package/src/sync/engine.ts +0 -1011
  804. package/src/sync/hooks.ts +0 -98
  805. package/src/sync/testing.ts +0 -73
  806. package/src/sync/wire.ts +0 -61
  807. package/src/sync.ts +0 -37
  808. package/src/table-text.ts +0 -8
  809. package/src/testing/css-variables.generated.ts +0 -112
  810. package/src/testing/css-variables.ts +0 -189
  811. package/src/testing/index.ts +0 -29
  812. package/src/testing/react.ts +0 -58
  813. package/src/testing/tour.ts +0 -41
  814. package/src/testing/viewport.ts +0 -357
  815. package/src/theme/chart-palette.ts +0 -232
  816. package/src/theme/color.ts +0 -272
  817. package/src/theme/contrast-tokens.ts +0 -268
  818. package/src/theme/contrast.ts +0 -250
  819. package/src/theme/palette-derive.ts +0 -825
  820. package/src/theme/palette-presets.ts +0 -544
  821. package/src/theme/palette-store.ts +0 -108
  822. package/src/theme/text-size.ts +0 -289
  823. package/src/theme/theme-store.ts +0 -157
  824. package/src/tour/tour-catalogue-labels.ts +0 -75
  825. package/src/tour/tour-catalogue.tsx +0 -335
  826. package/src/tour/tour-dock.ts +0 -134
  827. package/src/tour/tour-engine.ts +0 -37
  828. package/src/tour/tour-gates.ts +0 -218
  829. package/src/tour/tour-guide-button.tsx +0 -64
  830. package/src/tour/tour-guide-labels.ts +0 -15
  831. package/src/tour/tour-info.ts +0 -144
  832. package/src/tour/tour-labels.ts +0 -23
  833. package/src/tour/tour-overlay.tsx +0 -1170
  834. package/src/tour/tour.tsx +0 -750
  835. package/src/tour/use-tour-progress.ts +0 -671
  836. package/src/tour/use-tour-url-sync.ts +0 -266
  837. package/src/tour.ts +0 -21
  838. package/src/vite-env.d.ts +0 -23
  839. package/src/wizard/stepper-nav.tsx +0 -360
  840. package/src/wizard/types.ts +0 -275
  841. package/src/wizard/use-wizard.ts +0 -560
  842. package/src/wizard/validation.ts +0 -39
  843. package/src/wizard/wizard-context.tsx +0 -74
  844. package/src/wizard/wizard-labels.ts +0 -29
  845. package/src/wizard/wizard-step.tsx +0 -76
  846. package/src/wizard/wizard-summary.tsx +0 -84
  847. package/src/wizard.ts +0 -15
@@ -1,343 +0,0 @@
1
- import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
2
- import type { ComponentPropsWithoutRef, KeyboardEvent as ReactKeyboardEvent, ReactNode, Ref } from "react";
3
- import { cn } from "../lib/cn";
4
- import { mergeRefs } from "./field-parts";
5
- import { runOwnKeyDown, takeEscape, useDismissLayer, useOutsideClick } from "../hooks/use-dismiss";
6
- import { anchoredInline } from "../hooks/use-anchored-panel";
7
- import { dirOf } from "../lib/direction";
8
-
9
- /**
10
- * Exported and `<div>`-shaped: the top bar composes several of these side by side, and
11
- * telling them apart — in a test, in a guided tour, in an accessibility tree — needs an
12
- * attribute the kit does not know about. A closed prop list dropped every one of them.
13
- *
14
- * `children` is omitted from the div attributes because here it is a render prop taking
15
- * the panel's `close`, not a `ReactNode`.
16
- */
17
- export interface HoverMenuProps extends Omit<ComponentPropsWithoutRef<"div">, "children"> {
18
- /** The trigger. `toggle` for a button's click; `close` for a trigger that is a LINK —
19
- * following it should shut a panel hover opened (TopBarActionMenu `href`). */
20
- trigger: (state: { open: boolean; toggle: () => void; close: () => void }) => ReactNode;
21
- /** The menu's rows. `close` shuts the menu and, when focus is in it, puts focus on the
22
- * trigger before returning — so a dialog the same handler opens gives it back there
23
- * (0.52). */
24
- children: (close: () => void) => ReactNode;
25
- /**
26
- * Which edge of the trigger the panel lines up with, by the reading direction: `end`
27
- * is the right edge in LTR and the left in RTL. Default `end` — the same right-aligned
28
- * panel as before in LTR, mirrored in RTL. The physical `left` / `right` went in 0.35
29
- * (round 0.35 R1, refactor audit 2026-10, API-6e): `right` is `end` in a left-to-right
30
- * page, `left` is `start`.
31
- */
32
- align?: "start" | "end";
33
- panelClassName?: string;
34
- /** Extra classes for the WRAPPER (the panel has {@link panelClassName}). */
35
- className?: string;
36
- /** The WRAPPER, where the rest of the props go (0.34, API-2, refactor audit 2026-10) —
37
- * merged with its own ref, which the outside click and the hover are measured on. */
38
- ref?: Ref<HTMLDivElement>;
39
- }
40
-
41
- // Hovering waits briefly before opening so sweeping the cursor across a row of
42
- // triggers doesn't flash menus; closing waits so the cursor can travel from
43
- // trigger to panel. Click/keyboard toggling is instant (no "opening" phase).
44
- const OPEN_DELAY_MS = 120;
45
- const CLOSE_DELAY_MS = 120;
46
-
47
- type Phase = "closed" | "opening" | "open" | "closing";
48
-
49
- const ALIGN_CLASS = { start: "start-0", end: "end-0" } as const;
50
-
51
- /** Explicit menu-item roles a caller may already have written. */
52
- const ITEM_ROLES = '[role="menuitem"],[role="menuitemcheckbox"],[role="menuitemradio"]';
53
- /** What the panel promotes to `menuitem` when the caller wrote plain controls. */
54
- const PLAIN_ITEMS = "button:not([role]),a[href]:not([role])";
55
- /** The trigger: the first focusable in the wrapper that is not inside the panel. */
56
- const FOCUSABLE = 'a[href],button:not([disabled]),input:not([disabled]),[tabindex]:not([tabindex="-1"])';
57
-
58
- /**
59
- * Give the caller's markup menu semantics.
60
- *
61
- * `children` is arbitrary — every caller in the kit renders a `<ul>` of `<li>`s holding
62
- * `<button>`s and router `<Link>`s — so the panel was a `role="menu"` whose children
63
- * were a list, list items and plain buttons: no `menuitem` anywhere, which is a menu
64
- * with nothing in it as far as a screen reader is concerned. Rather than make every
65
- * caller rewrite its rows, the panel upgrades them after render: controls become
66
- * `menuitem`s out of the Tab order (the arrow keys move between them), and the list
67
- * markup in between becomes `role="none"` so the menu owns its items directly. An
68
- * element that already carries a role is the caller's decision and is left alone.
69
- */
70
- function applyMenuSemantics(menu: HTMLElement): HTMLElement[] {
71
- for (const el of menu.querySelectorAll<HTMLElement>(PLAIN_ITEMS)) el.setAttribute("role", "menuitem");
72
- const items = Array.from(menu.querySelectorAll<HTMLElement>(ITEM_ROLES));
73
- for (const item of items) {
74
- item.setAttribute("tabindex", "-1");
75
- for (let el = item.parentElement; el && el !== menu; el = el.parentElement) {
76
- if (!el.hasAttribute("role")) el.setAttribute("role", "none");
77
- }
78
- }
79
- for (const el of menu.querySelectorAll<HTMLElement>("ul:not([role]),ol:not([role]),li:not([role])")) {
80
- el.setAttribute("role", "none");
81
- }
82
- return items.filter((el) => !el.hasAttribute("disabled") && el.getAttribute("aria-disabled") !== "true");
83
- }
84
-
85
- // Only one hover menu may show its panel at a time across the app — opening
86
- // one closes whichever was open, so adjacent top-bar menus can't overlap
87
- // (feedback #251). Module-level is fine: there is one cursor per document.
88
- let activeClose: (() => void) | null = null;
89
-
90
- export function HoverMenu({
91
- trigger,
92
- children,
93
- align = "end",
94
- panelClassName,
95
- className,
96
- "aria-label": ariaLabel,
97
- ref,
98
- ...rest
99
- }: HoverMenuProps) {
100
- const wrapperRef = useRef<HTMLDivElement>(null);
101
- const setWrapper = useMemo(() => mergeRefs(wrapperRef, ref), [ref]);
102
- const [phase, setPhase] = useState<Phase>("closed");
103
- const open = phase === "open" || phase === "closing";
104
-
105
- // Whether the panel is open *because hover opened it*, vs. an explicit
106
- // click/keyboard toggle. A real mouse click on the trigger is always
107
- // preceded by a real mouseenter — the cursor has to land on the button
108
- // before it can be clicked — so once hover has opened the panel, the click
109
- // that inevitably follows is the same physical gesture, not a request to
110
- // close what was just opened (feedback #19). Toggling closed on click stays
111
- // for keyboard/touch activation, which reaches "open" without going through
112
- // the hover path.
113
- //
114
- // State rather than a ref: `close` is handed to the caller's render prop, and a
115
- // function that writes a ref must not be reachable from render.
116
- const [openedByHover, setOpenedByHover] = useState(false);
117
-
118
- const close = useCallback(() => {
119
- setOpenedByHover(false);
120
- setPhase("closed");
121
- }, []);
122
-
123
- const toggle = useCallback(() => {
124
- if (open) {
125
- if (!openedByHover) setPhase("closed");
126
- return;
127
- }
128
- setOpenedByHover(false);
129
- setPhase("open");
130
- }, [open, openedByHover]);
131
-
132
- const handleMouseEnter = useCallback(
133
- () => setPhase((p) => (p === "closing" ? "open" : p === "closed" ? "opening" : p)),
134
- [],
135
- );
136
-
137
- const handleMouseLeave = useCallback(
138
- () => setPhase((p) => (p === "opening" ? "closed" : p === "open" ? "closing" : p)),
139
- [],
140
- );
141
-
142
- // Drive the delayed transitions; unmount/phase changes cancel the timer.
143
- useEffect(() => {
144
- if (phase === "opening") {
145
- const id = setTimeout(() => {
146
- setOpenedByHover(true);
147
- setPhase("open");
148
- }, OPEN_DELAY_MS);
149
- return () => clearTimeout(id);
150
- }
151
- if (phase === "closing") {
152
- const id = setTimeout(() => setPhase("closed"), CLOSE_DELAY_MS);
153
- return () => clearTimeout(id);
154
- }
155
- }, [phase]);
156
-
157
- // Claim the "active menu" slot while our panel is visible, closing the
158
- // previous holder. Cleanup releases the slot only if we still hold it
159
- // (a successor that displaced us has already overwritten it).
160
- useEffect(() => {
161
- if (!open) return;
162
- if (activeClose !== close) activeClose?.();
163
- activeClose = close;
164
- return () => {
165
- if (activeClose === close) activeClose = null;
166
- };
167
- }, [open, close]);
168
-
169
- // A press in a panel opened from a row (a popover, its lists) is inside (dev#623).
170
- const markInside = useOutsideClick(wrapperRef, close, open);
171
-
172
- const menuRef = useRef<HTMLDivElement>(null);
173
- /** Set by a keyboard press on the trigger, so the open that follows moves focus into
174
- * the menu. A hover or a mouse click opens it without taking focus off the page. */
175
- const focusOnOpenRef = useRef<"first" | "last" | null>(null);
176
-
177
- const triggerEl = () =>
178
- Array.from(wrapperRef.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? []).find(
179
- (el) => !menuRef.current?.contains(el),
180
- ) ?? null;
181
- const items = () => (menuRef.current ? applyMenuSemantics(menuRef.current) : []);
182
-
183
- // Focus goes back to the trigger only when it was inside the menu: a panel opened by
184
- // hover while the user is typing elsewhere must not yank the caret over here on the
185
- // way out. At once, not after the commit: a row that closes the menu and opens a dialog
186
- // in one handler has the dialog record its restore target during that commit's render,
187
- // and the row it would record is about to go (refactor audit 2026-10-30, INP-2).
188
- const closeToTrigger = () => {
189
- const hadFocus = wrapperRef.current?.contains(document.activeElement) ?? false;
190
- close();
191
- if (hadFocus) triggerEl()?.focus();
192
- };
193
- // Escape closes, from anywhere — it did nothing at all before — as a layer on the kit's
194
- // Escape stack, so inside a dialog it closes the menu and not the dialog (Wave 2,
195
- // DUP-1).
196
- const layer = useDismissLayer(open, closeToTrigger);
197
-
198
- // Upgrade the markup every render while open (the caller's rows can change), then
199
- // honour a pending keyboard open.
200
- useLayoutEffect(() => {
201
- if (!open) return;
202
- const list = items();
203
- const want = focusOnOpenRef.current;
204
- focusOnOpenRef.current = null;
205
- if (want) (want === "last" ? list[list.length - 1] : list[0])?.focus();
206
- });
207
-
208
- // Trigger state for assistive technology, on whatever element the caller rendered.
209
- // Only where the caller has not said something of its own.
210
- useLayoutEffect(() => {
211
- const el = triggerEl();
212
- if (!el) return;
213
- if (!el.hasAttribute("aria-haspopup")) el.setAttribute("aria-haspopup", "menu");
214
- if (el.getAttribute("aria-haspopup") === "menu") el.setAttribute("aria-expanded", String(open));
215
- });
216
-
217
- /** ↑/↓ roving focus with wrap, Home/End, Tab leaves (and closes); on the trigger,
218
- * Enter/Space/↓ open onto the first item and ↑ onto the last. */
219
- const onKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>) => {
220
- const target = e.target as HTMLElement;
221
- const inMenu = menuRef.current?.contains(target) ?? false;
222
- if (!inMenu) {
223
- if (target !== triggerEl()) return;
224
- if (e.key === "Enter" || e.key === " ") {
225
- // The trigger's own click handler does the toggling; this only records that
226
- // the press came from a keyboard. Not for a link trigger: Enter follows it, and
227
- // a mark left here would pull focus into the panel the next time hover opens it.
228
- if (!open && !target.matches("a[href]")) focusOnOpenRef.current = "first";
229
- } else if (e.key === "ArrowDown" || e.key === "ArrowUp") {
230
- e.preventDefault();
231
- const edge = e.key === "ArrowDown" ? "first" : "last";
232
- if (open) {
233
- const list = items();
234
- (edge === "last" ? list[list.length - 1] : list[0])?.focus();
235
- } else {
236
- focusOnOpenRef.current = edge;
237
- setOpenedByHover(false);
238
- setPhase("open");
239
- }
240
- }
241
- return;
242
- }
243
- if (e.key === "Tab") {
244
- close();
245
- return;
246
- }
247
- const list = items();
248
- if (list.length === 0) return;
249
- const at = list.indexOf(document.activeElement as HTMLElement);
250
- let next: number | null = null;
251
- if (e.key === "ArrowDown") next = at < 0 ? 0 : (at + 1) % list.length;
252
- else if (e.key === "ArrowUp") next = at < 0 ? list.length - 1 : (at - 1 + list.length) % list.length;
253
- else if (e.key === "Home") next = 0;
254
- else if (e.key === "End") next = list.length - 1;
255
- if (next === null) return;
256
- e.preventDefault();
257
- list[next].focus();
258
- };
259
-
260
- // Keep the panel inside the viewport (feedback #85): a wide panel anchored to a
261
- // trigger near a screen edge would otherwise spill off it (on mobile the guided-
262
- // tours menu ran off the left). Once open, measure and translate it horizontally
263
- // just enough to sit within an 8px margin of the GLASS — `anchoredInline` against
264
- // the panel's own natural box, as every anchored panel clamps (Wave 2, DUP-7; it
265
- // measured against `innerWidth`, which on a phone is the grown layout viewport).
266
- // Recomputed on each open; `shiftX` is subtracted first so the measurement is
267
- // against the natural position.
268
- const panelRef = useRef<HTMLDivElement>(null);
269
- const [shiftX, setShiftX] = useState(0);
270
- // Back to 0 on close, adjusted while rendering against the previous `open`.
271
- const [wasOpen, setWasOpen] = useState(open);
272
- if (open !== wasOpen) {
273
- setWasOpen(open);
274
- if (!open) setShiftX(0);
275
- }
276
- useLayoutEffect(() => {
277
- if (!open) return;
278
- const el = panelRef.current;
279
- if (!el) return;
280
- const rect = el.getBoundingClientRect();
281
- if (rect.width === 0) return; // unmeasured (e.g. jsdom) — leave as-is
282
- const natural = { left: rect.left - shiftX, right: rect.right - shiftX };
283
- const { left } = anchoredInline(natural, rect.width, { dir: dirOf(el), align: "left" });
284
- setShiftX(left - natural.left);
285
- // eslint-disable-next-line react-hooks/exhaustive-deps -- recompute only on open/close
286
- }, [open]);
287
-
288
- return (
289
- /* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- never focused
290
- itself: the mouse handlers are the hover-to-open convenience, and `onKeyDown`
291
- catches keys bubbling from the caller's trigger button and the menuitems, which
292
- are the keyboard path (Enter/Space/arrows open, arrows move, Escape closes). */
293
- <div
294
- // `...rest` first: the hover handlers below are the whole component, and a caller
295
- // passing one of its own must not silently replace them.
296
- {...rest}
297
- ref={setWrapper}
298
- className={cn("relative", className)}
299
- onMouseEnter={handleMouseEnter}
300
- onMouseLeave={handleMouseLeave}
301
- onPointerDownCapture={(e) => {
302
- rest.onPointerDownCapture?.(e);
303
- markInside(e);
304
- }}
305
- onKeyDown={(e) => {
306
- // The caller's handler sees Escape only while this menu is the layer on top: a
307
- // tooltip on one of its rows takes that press first (round 0.35 R2, the rule
308
- // the dialogs got first). Every other key, and a closed menu's, as before.
309
- runOwnKeyDown(e, rest.onKeyDown, layer);
310
- // Focus on the trigger or in the menu: the key stops here, so a panel around
311
- // the menu does not close with it.
312
- if (open) takeEscape(e);
313
- onKeyDown(e);
314
- }}
315
- >
316
- {trigger({ open, toggle, close })}
317
- {open && (
318
- <div
319
- ref={panelRef}
320
- className={cn("absolute top-full z-40 pt-2", ALIGN_CLASS[align])}
321
- style={shiftX ? { transform: `translateX(${shiftX}px)` } : undefined}
322
- >
323
- <div
324
- ref={menuRef}
325
- role="menu"
326
- // On the element with the role. It used to sit on the role-less wrapper,
327
- // where no screen reader reads a name.
328
- aria-label={ariaLabel}
329
- className={cn(
330
- "min-w-44 max-w-[calc(100vw-1rem)] rounded-md border border-subtle bg-surface shadow-lg",
331
- panelClassName,
332
- )}
333
- >
334
- {
335
- // eslint-disable-next-line react-hooks/refs -- handed to the items' handlers: it reads the trigger and the focus when an item is chosen, never while rendering
336
- children(closeToTrigger)
337
- }
338
- </div>
339
- </div>
340
- )}
341
- </div>
342
- );
343
- }
@@ -1,14 +0,0 @@
1
- // The English words of ./iban-input, in a module with no component code: the English
2
- // catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one
3
- // chunk like the other languages (0.34, KS U8). ./iban-input re-exports them.
4
-
5
- import type { IbanInputLabels } from "./iban-input";
6
-
7
- export const DEFAULT_IBAN_INPUT_LABELS: IbanInputLabels = {
8
- format: "An IBAN starts with a two-letter country code and two check digits.",
9
- country: (code) => `“${code}” is not the country code of an IBAN.`,
10
- length: (actual, expected) => `An IBAN from this country has ${expected} characters — this one has ${actual}.`,
11
- checksum: "The check digits don’t match — a character is probably mistyped.",
12
- qrRequired: "This is a regular IBAN. A QR-bill needs the account’s QR-IBAN.",
13
- qrNotAllowed: "This is a QR-IBAN, which only receives QR-bill payments. Enter the account’s regular IBAN.",
14
- };
@@ -1,236 +0,0 @@
1
- import { useCallback, useLayoutEffect, useRef, useState } from "react";
2
- import type { ChangeEvent, FocusEvent, ReactNode } from "react";
3
- import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
4
- import { cn } from "../lib/cn";
5
- import { IBAN_LENGTHS, compactIban, formatIban, ibanProblem } from "../lib/iban";
6
- import type { IbanKind, IbanProblem } from "../lib/iban";
7
- import { hasContent } from "../lib/presence";
8
- import { assignRef } from "./field-parts";
9
- import { Input, type InputProps } from "./input";
10
- import { DEFAULT_IBAN_INPUT_LABELS } from "./iban-input-labels";
11
-
12
- // ── Labels ────────────────────────────────────────────────────────────────────
13
-
14
- /** The messages {@link IbanInput} shows under itself, one per {@link IbanProblem}. */
15
- export interface IbanInputLabels {
16
- /** The value does not start with a two-letter country code and two check digits. */
17
- format: string;
18
- /** The first two letters are no country in the IBAN registry. `code` is those two
19
- * letters, as typed (upper case). */
20
- country: (code: string) => string;
21
- /** The wrong length for the country: `actual` characters typed, `expected` for that
22
- * country (spaces not counted in either). */
23
- length: (actual: number, expected: number) => string;
24
- /** The mod-97 check digits do not match — a mistyped or swapped character. */
25
- checksum: string;
26
- /** `kind="qr"`: a valid IBAN, but not a QR-IBAN. */
27
- qrRequired: string;
28
- /** `kind="plain"`: a QR-IBAN, which cannot receive an ordinary transfer. */
29
- qrNotAllowed: string;
30
- }
31
-
32
- // Defined in ./iban-input-labels, which holds no component code (0.34, KS U8).
33
- export { DEFAULT_IBAN_INPUT_LABELS };
34
-
35
- /**
36
- * The `ibanInput` namespace: prop > `<UiKitProvider labels>` > English (0.22.0).
37
- */
38
- function useIbanInputLabels(prop: Partial<IbanInputLabels> | undefined): IbanInputLabels {
39
- const labels: IbanInputLabels = useKitLabels("ibanInput", DEFAULT_IBAN_INPUT_LABELS, prop);
40
- return labels;
41
- }
42
-
43
- // ── Helpers ───────────────────────────────────────────────────────────────────
44
-
45
- const alnumCount = (text: string) => text.replace(/[^0-9A-Za-z]/g, "").length;
46
-
47
- /** The index just after the `count`-th letter or digit of `text` — where the caret
48
- * goes once the grouping has moved the characters it was between. */
49
- function indexAfter(text: string, count: number): number {
50
- if (count <= 0) return 0;
51
- let seen = 0;
52
- for (let i = 0; i < text.length; i++) {
53
- if (/[0-9A-Za-z]/.test(text[i])) seen += 1;
54
- if (seen === count) return i + 1;
55
- }
56
- return text.length;
57
- }
58
-
59
- /**
60
- * The problem worth SHOWING right now. Settled (not focused): whatever is wrong. While
61
- * typing: only what more typing cannot fix — a broken start or an unknown country from
62
- * the fourth character, and the rest once the country's full length is there. A
63
- * half-typed IBAN is not wrong, and a field that says "wrong length" from the first
64
- * keystroke is a field people learn to ignore.
65
- */
66
- function visibleProblem(compact: string, kind: IbanKind, focused: boolean): IbanProblem | null {
67
- if (compact === "") return null;
68
- const problem = ibanProblem(compact, kind);
69
- if (problem === null || !focused) return problem;
70
- if (compact.length < 4) return null;
71
- if (problem === "format" || problem === "country") return problem;
72
- return compact.length >= IBAN_LENGTHS[compact.slice(0, 2)]! ? problem : null;
73
- }
74
-
75
- function messageFor(problem: IbanProblem, compact: string, labels: IbanInputLabels): string {
76
- switch (problem) {
77
- case "format":
78
- return labels.format;
79
- case "country":
80
- return labels.country(compact.slice(0, 2));
81
- case "length":
82
- return labels.length(compact.length, IBAN_LENGTHS[compact.slice(0, 2)]!);
83
- case "checksum":
84
- return labels.checksum;
85
- case "qrRequired":
86
- return labels.qrRequired;
87
- case "qrNotAllowed":
88
- return labels.qrNotAllowed;
89
- }
90
- }
91
-
92
- // ── Component ─────────────────────────────────────────────────────────────────
93
-
94
- export interface IbanInputProps extends Omit<InputProps, "type" | "value" | "defaultValue"> {
95
- /** The IBAN, compact or not — it is shown in groups of four either way. `""` is
96
- * "no IBAN". */
97
- value: string;
98
- /** The compact, upper-case IBAN (the electronic format, what to store) on every
99
- * change — valid or not: a half-typed IBAN is still the field's value. Plain
100
- * `onChange` still fires alongside it with the raw event, whose text is the GROUPED
101
- * one, so bind this rather than `onChange` to a form. */
102
- onValueChange?: (value: string) => void;
103
- /** Which IBANs the field accepts. Default `"any"`. `"qr"` / `"plain"`: see
104
- * {@link IbanKind} — and why the difference matters, {@link isQrIban}. */
105
- kind?: IbanKind;
106
- /** The messages, per field. See {@link IbanInputLabels}. */
107
- labels?: LabelOverride<IbanInputLabels>;
108
- /** The caller's own message, shown INSTEAD of the built-in one while it is set (a
109
- * server's "this account is already on file"). `null`, `false` and `""` are no
110
- * message, so `touched && errors.iban` can be passed as it is. */
111
- error?: ReactNode;
112
- }
113
-
114
- /**
115
- * An IBAN field (kastlan, keksdose): typed in any shape, shown in groups of four,
116
- * reported compact.
117
- *
118
- * Both apps had a text field and a regex. What that left out is everything between
119
- * the keyboard and the stored value: a pasted "ch09 0000-0000…" stayed lower case
120
- * with its hyphens, the grouping that makes 21 characters checkable by eye was
121
- * missing, and a wrong IBAN was found out by the bank. Here:
122
- *
123
- * - **Grouped as you type.** The field shows the paper format ({@link formatIban});
124
- * spaces, hyphens and lower case in what is typed or pasted are folded away, and
125
- * the caret stays between the same two characters while the groups move around it.
126
- * - **Compact out.** `onValueChange` gets the electronic format — upper case, no
127
- * spaces — which is the one to store and to compare.
128
- * - **Checked, never blocked.** A wrong country, length or checksum shows a message
129
- * under the field, through the kit's `error` (so it is the field's
130
- * `aria-describedby` and paints it), but every keystroke still lands: a field that
131
- * refuses characters cannot be corrected one character at a time. While the field
132
- * has focus only what more typing cannot fix is shown; the rest waits for the full
133
- * length or for blur. Whether the field is REQUIRED stays the form's rule — an empty
134
- * field says nothing.
135
- * - **QR-IBAN or not** (kastlan): `kind="qr"` refuses a regular IBAN and
136
- * `kind="plain"` refuses a QR-IBAN — a QR-bill can only be paid to a QR-IBAN, and a
137
- * QR-IBAN can receive nothing else. See {@link isQrIban}.
138
- *
139
- * It is {@link Input} underneath, so `label`, `hint`, `error`, `invalid` and the rest
140
- * are Input's own and the field reads like every other. A form that must not submit
141
- * an invalid IBAN checks {@link isValidIban} / {@link ibanProblem} itself — the field
142
- * shows the problem but does not own the submit.
143
- */
144
- export function IbanInput({
145
- // The `<input>` (InputProps'): a React 19 ref prop since 0.34 (MOD-4, refactor audit
146
- // 2026-10), where this was `forwardRef`.
147
- ref,
148
- value,
149
- onValueChange,
150
- onChange,
151
- onFocus,
152
- onBlur,
153
- kind = "any",
154
- labels,
155
- error,
156
- inputClassName,
157
- ...rest
158
- }: IbanInputProps) {
159
- const text = useIbanInputLabels(labels);
160
- const compact = compactIban(value);
161
- const shown = formatIban(compact);
162
- const [focused, setFocused] = useState(false);
163
- const innerRef = useRef<HTMLInputElement | null>(null);
164
- // Letters and digits before the caret, kept across the re-render that regroups.
165
- const caretRef = useRef<number | null>(null);
166
- const setRefs = useCallback(
167
- (el: HTMLInputElement | null) => {
168
- innerRef.current = el;
169
- assignRef(ref, el);
170
- },
171
- [ref],
172
- );
173
-
174
- // Every render: when a change moved the groups, put the caret back after the same
175
- // character it followed. Only while focused — a value set from outside moves nothing.
176
- useLayoutEffect(() => {
177
- const el = innerRef.current;
178
- const count = caretRef.current;
179
- if (el === null || count === null) return;
180
- caretRef.current = null;
181
- if (el.ownerDocument.activeElement !== el) return;
182
- const at = indexAfter(el.value, count);
183
- el.setSelectionRange(at, at);
184
- });
185
-
186
- const handleChange = (e: ChangeEvent<HTMLInputElement>) => {
187
- onChange?.(e);
188
- const el = e.target;
189
- const raw = el.value;
190
- const next = compactIban(raw);
191
- // Characters compactIban dropped from the front (a pasted "IBAN " label) are not
192
- // in the value, so they are not counted before the caret either.
193
- const dropped = alnumCount(raw) - next.length;
194
- const count = Math.max(0, alnumCount(raw.slice(0, el.selectionStart ?? raw.length)) - dropped);
195
- if (next === compact) {
196
- // Nothing the value holds changed — a space typed, a group's space deleted — so
197
- // no re-render will come to regroup it. Regroup now, and keep the caret: after
198
- // a Backspace on a group's space, that is just before it.
199
- el.value = shown;
200
- const at = indexAfter(shown, count);
201
- el.setSelectionRange(at, at);
202
- } else {
203
- caretRef.current = count;
204
- }
205
- onValueChange?.(next);
206
- };
207
-
208
- const problem = visibleProblem(compact, kind, focused);
209
- return (
210
- <Input
211
- ref={setRefs}
212
- {...rest}
213
- type="text"
214
- value={shown}
215
- onChange={handleChange}
216
- onFocus={(e: FocusEvent<HTMLInputElement>) => {
217
- setFocused(true);
218
- onFocus?.(e);
219
- }}
220
- onBlur={(e: FocusEvent<HTMLInputElement>) => {
221
- setFocused(false);
222
- onBlur?.(e);
223
- }}
224
- autoComplete={rest.autoComplete ?? "off"}
225
- autoCapitalize={rest.autoCapitalize ?? "characters"}
226
- autoCorrect={rest.autoCorrect ?? "off"}
227
- spellCheck={rest.spellCheck ?? false}
228
- // ALWAYS passed, even while there is no message: a field that takes `error`
229
- // keeps its box, so the message coming and going under the caret never remounts
230
- // the input (see Input's FieldGroup) — this one comes and goes as you type.
231
- error={hasContent(error) ? error : problem ? messageFor(problem, compact, text) : undefined}
232
- // Groups of four line up only when every digit is the same width.
233
- inputClassName={cn("tabular-nums", inputClassName)}
234
- />
235
- );
236
- }