@eifi1/ui-kit 0.53.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 (902) hide show
  1. package/README.md +96 -82
  2. package/dist/account/delete-account-setting.d.ts +3 -2
  3. package/dist/account/delete-account-setting.js.map +1 -1
  4. package/dist/admin/plan-change.js +2 -2
  5. package/dist/admin/plan-change.js.map +1 -1
  6. package/dist/admin/user-roster.d.ts +6 -0
  7. package/dist/admin/user-roster.js +4 -0
  8. package/dist/admin/user-roster.js.map +1 -1
  9. package/dist/auth/auth-errors.d.ts +36 -0
  10. package/dist/auth/auth-errors.js +20 -0
  11. package/dist/auth/auth-errors.js.map +1 -1
  12. package/dist/billing/billing-labels.d.ts +26 -0
  13. package/dist/billing/billing-labels.js +9 -0
  14. package/dist/billing/billing-labels.js.map +1 -1
  15. package/dist/billing/subscription-standing.d.ts +61 -0
  16. package/dist/billing/subscription-standing.js +51 -0
  17. package/dist/billing/subscription-standing.js.map +1 -0
  18. package/dist/billing/usage-meter.d.ts +52 -0
  19. package/dist/billing/usage-meter.js +52 -0
  20. package/dist/billing/usage-meter.js.map +1 -0
  21. package/dist/chart.d.ts +1 -0
  22. package/dist/chart.js +4 -0
  23. package/dist/chart.js.map +1 -1
  24. package/dist/components/alert-banner.js +2 -3
  25. package/dist/components/alert-banner.js.map +1 -1
  26. package/dist/components/amount-input.d.ts +2 -1
  27. package/dist/components/amount-input.js +3 -15
  28. package/dist/components/amount-input.js.map +1 -1
  29. package/dist/components/autocomplete.js +2 -2
  30. package/dist/components/autocomplete.js.map +1 -1
  31. package/dist/components/bulk-action-bar.js +2 -1
  32. package/dist/components/bulk-action-bar.js.map +1 -1
  33. package/dist/components/button.d.ts +35 -1
  34. package/dist/components/button.js +5 -9
  35. package/dist/components/button.js.map +1 -1
  36. package/dist/components/calendar-heatmap.js +6 -4
  37. package/dist/components/calendar-heatmap.js.map +1 -1
  38. package/dist/components/camera-button.d.ts +89 -0
  39. package/dist/components/camera-button.js +122 -0
  40. package/dist/components/camera-button.js.map +1 -0
  41. package/dist/components/camera-capture.d.ts +66 -0
  42. package/dist/components/camera-capture.js +190 -0
  43. package/dist/components/camera-capture.js.map +1 -0
  44. package/dist/components/camera-labels.d.ts +20 -0
  45. package/dist/components/camera-labels.js +15 -0
  46. package/dist/components/camera-labels.js.map +1 -0
  47. package/dist/components/chart-edge.d.ts +9 -0
  48. package/dist/components/chart-edge.js +14 -3
  49. package/dist/components/chart-edge.js.map +1 -1
  50. package/dist/components/chart-zoom-core.js +34 -29
  51. package/dist/components/chart-zoom-core.js.map +1 -1
  52. package/dist/components/checkbox-group.js +1 -1
  53. package/dist/components/checkbox-group.js.map +1 -1
  54. package/dist/components/combobox-core.js +3 -2
  55. package/dist/components/combobox-core.js.map +1 -1
  56. package/dist/components/combobox.js +2 -2
  57. package/dist/components/combobox.js.map +1 -1
  58. package/dist/components/consent-again-notice-labels.d.ts +25 -0
  59. package/dist/components/consent-again-notice-labels.js +15 -0
  60. package/dist/components/consent-again-notice-labels.js.map +1 -0
  61. package/dist/components/consent-again-notice.d.ts +85 -0
  62. package/dist/components/consent-again-notice.js +94 -0
  63. package/dist/components/consent-again-notice.js.map +1 -0
  64. package/dist/components/country-select.js +2 -7
  65. package/dist/components/country-select.js.map +1 -1
  66. package/dist/components/currency-option-list.d.ts +2 -1
  67. package/dist/components/currency-option-list.js +10 -3
  68. package/dist/components/currency-option-list.js.map +1 -1
  69. package/dist/components/currency-select.d.ts +3 -1
  70. package/dist/components/currency-select.js +2 -2
  71. package/dist/components/currency-select.js.map +1 -1
  72. package/dist/components/danger-confirm.d.ts +22 -1
  73. package/dist/components/danger-confirm.js +52 -30
  74. package/dist/components/danger-confirm.js.map +1 -1
  75. package/dist/components/data-table-column-settings.js +2 -2
  76. package/dist/components/data-table-column-settings.js.map +1 -1
  77. package/dist/components/data-table-filter-popover.d.ts +2 -1
  78. package/dist/components/data-table-filter-popover.js +3 -2
  79. package/dist/components/data-table-filter-popover.js.map +1 -1
  80. package/dist/components/data-table-filters.d.ts +33 -3
  81. package/dist/components/data-table-filters.js +6 -4
  82. package/dist/components/data-table-filters.js.map +1 -1
  83. package/dist/components/data-table-fit.js.map +1 -1
  84. package/dist/components/data-table-virtual.js +13 -3
  85. package/dist/components/data-table-virtual.js.map +1 -1
  86. package/dist/components/date-field.js +2 -2
  87. package/dist/components/date-field.js.map +1 -1
  88. package/dist/components/date-picker.js +2 -2
  89. package/dist/components/date-picker.js.map +1 -1
  90. package/dist/components/date-range-picker.js +2 -6
  91. package/dist/components/date-range-picker.js.map +1 -1
  92. package/dist/components/dialog-frame.d.ts +5 -1
  93. package/dist/components/dialog-frame.js +6 -2
  94. package/dist/components/dialog-frame.js.map +1 -1
  95. package/dist/components/dropdown.js +7 -3
  96. package/dist/components/dropdown.js.map +1 -1
  97. package/dist/components/entity-combobox.js +2 -2
  98. package/dist/components/entity-combobox.js.map +1 -1
  99. package/dist/components/field-parts.d.ts +108 -6
  100. package/dist/components/field-parts.js +59 -6
  101. package/dist/components/field-parts.js.map +1 -1
  102. package/dist/components/field-suggestion-labels.d.ts +2 -0
  103. package/dist/components/field-suggestion-labels.js +10 -0
  104. package/dist/components/field-suggestion-labels.js.map +1 -0
  105. package/dist/components/field.js +1 -1
  106. package/dist/components/field.js.map +1 -1
  107. package/dist/components/file-button.d.ts +1 -1
  108. package/dist/components/file-button.js.map +1 -1
  109. package/dist/components/floating-panel.d.ts +7 -6
  110. package/dist/components/floating-panel.js +3 -17
  111. package/dist/components/floating-panel.js.map +1 -1
  112. package/dist/components/form-actions.d.ts +3 -2
  113. package/dist/components/form-actions.js.map +1 -1
  114. package/dist/components/hover-menu.js +3 -2
  115. package/dist/components/hover-menu.js.map +1 -1
  116. package/dist/components/icon-button.d.ts +23 -5
  117. package/dist/components/icon-button.js +6 -8
  118. package/dist/components/icon-button.js.map +1 -1
  119. package/dist/components/inline-confirm.js +2 -1
  120. package/dist/components/inline-confirm.js.map +1 -1
  121. package/dist/components/inline-entity-combobox.js +2 -2
  122. package/dist/components/inline-entity-combobox.js.map +1 -1
  123. package/dist/components/input.js +2 -2
  124. package/dist/components/input.js.map +1 -1
  125. package/dist/components/jump-calendar.js +3 -3
  126. package/dist/components/jump-calendar.js.map +1 -1
  127. package/dist/components/legal.d.ts +13 -1
  128. package/dist/components/legal.js +12 -0
  129. package/dist/components/legal.js.map +1 -1
  130. package/dist/components/legended-series-chart.d.ts +80 -0
  131. package/dist/components/legended-series-chart.js +70 -0
  132. package/dist/components/legended-series-chart.js.map +1 -0
  133. package/dist/components/lightbox.js +2 -1
  134. package/dist/components/lightbox.js.map +1 -1
  135. package/dist/components/mini-calendar.js +16 -7
  136. package/dist/components/mini-calendar.js.map +1 -1
  137. package/dist/components/modal.d.ts +48 -0
  138. package/dist/components/modal.js +26 -6
  139. package/dist/components/modal.js.map +1 -1
  140. package/dist/components/month-picker.d.ts +1 -1
  141. package/dist/components/month-picker.js +6 -6
  142. package/dist/components/month-picker.js.map +1 -1
  143. package/dist/components/multi-entity-combobox.js +2 -2
  144. package/dist/components/multi-entity-combobox.js.map +1 -1
  145. package/dist/components/multi-select.js +2 -6
  146. package/dist/components/multi-select.js.map +1 -1
  147. package/dist/components/number-input.js +2 -2
  148. package/dist/components/number-input.js.map +1 -1
  149. package/dist/components/page-header-layout.d.ts +18 -0
  150. package/dist/components/page-header-layout.js +23 -0
  151. package/dist/components/page-header-layout.js.map +1 -0
  152. package/dist/components/page-header-skeleton.d.ts +41 -0
  153. package/dist/components/page-header-skeleton.js +52 -0
  154. package/dist/components/page-header-skeleton.js.map +1 -0
  155. package/dist/components/page-header.js +4 -17
  156. package/dist/components/page-header.js.map +1 -1
  157. package/dist/components/popover.js +7 -2
  158. package/dist/components/popover.js.map +1 -1
  159. package/dist/components/release-notes-labels.d.ts +16 -0
  160. package/dist/components/release-notes-labels.js +18 -0
  161. package/dist/components/release-notes-labels.js.map +1 -0
  162. package/dist/components/release-notes.d.ts +65 -0
  163. package/dist/components/release-notes.js +65 -0
  164. package/dist/components/release-notes.js.map +1 -0
  165. package/dist/components/select.js +2 -2
  166. package/dist/components/select.js.map +1 -1
  167. package/dist/components/series-chart-labels.d.ts +9 -0
  168. package/dist/components/series-chart-labels.js +3 -1
  169. package/dist/components/series-chart-labels.js.map +1 -1
  170. package/dist/components/series-chart.d.ts +5 -0
  171. package/dist/components/series-chart.js +89 -36
  172. package/dist/components/series-chart.js.map +1 -1
  173. package/dist/components/stat-tile.d.ts +21 -2
  174. package/dist/components/stat-tile.js +4 -2
  175. package/dist/components/stat-tile.js.map +1 -1
  176. package/dist/components/toggle-group.js +3 -2
  177. package/dist/components/toggle-group.js.map +1 -1
  178. package/dist/components/treemap-layout.js.map +1 -1
  179. package/dist/components/treemap.d.ts +17 -15
  180. package/dist/components/treemap.js +167 -85
  181. package/dist/components/treemap.js.map +1 -1
  182. package/dist/currencies.d.ts +16 -2
  183. package/dist/currencies.js +2 -1
  184. package/dist/currencies.js.map +1 -1
  185. package/dist/eslint/index.js +1 -1
  186. package/dist/eslint/role-utilities.d.ts +2 -2
  187. package/dist/eslint/role-utilities.js.map +1 -1
  188. package/dist/feedback/feedback-context-labels.js +2 -1
  189. package/dist/feedback/feedback-context-labels.js.map +1 -1
  190. package/dist/feedback/feedback-context.d.ts +19 -3
  191. package/dist/feedback/feedback-context.js +12 -1
  192. package/dist/feedback/feedback-context.js.map +1 -1
  193. package/dist/feedback/feedback-diagnostics.d.ts +17 -0
  194. package/dist/feedback/feedback-diagnostics.js +27 -0
  195. package/dist/feedback/feedback-diagnostics.js.map +1 -0
  196. package/dist/feedback/feedback-dialog.d.ts +10 -0
  197. package/dist/feedback/feedback-dialog.js +6 -4
  198. package/dist/feedback/feedback-dialog.js.map +1 -1
  199. package/dist/feedback/feedback-inbox-page.d.ts +260 -0
  200. package/dist/feedback/feedback-inbox-page.js +207 -0
  201. package/dist/feedback/feedback-inbox-page.js.map +1 -0
  202. package/dist/feedback/feedback-record.d.ts +5 -0
  203. package/dist/feedback/feedback-record.js.map +1 -1
  204. package/dist/feedback/feedback-row-detail-labels.js +1 -0
  205. package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
  206. package/dist/feedback/feedback-row-detail.d.ts +3 -0
  207. package/dist/feedback/feedback-row-detail.js +3 -0
  208. package/dist/feedback/feedback-row-detail.js.map +1 -1
  209. package/dist/feedback/feedback-submit-dialog.d.ts +5 -1
  210. package/dist/feedback/feedback-submit-dialog.js +15 -3
  211. package/dist/feedback/feedback-submit-dialog.js.map +1 -1
  212. package/dist/feedback/feedback-submit.d.ts +30 -2
  213. package/dist/feedback/feedback-submit.js +5 -2
  214. package/dist/feedback/feedback-submit.js.map +1 -1
  215. package/dist/feedback/feedback-vocabulary.js +2 -2
  216. package/dist/feedback/feedback-vocabulary.js.map +1 -1
  217. package/dist/feedback.d.ts +1 -0
  218. package/dist/feedback.js +6 -0
  219. package/dist/feedback.js.map +1 -1
  220. package/dist/hooks/use-debounce.d.ts +32 -5
  221. package/dist/hooks/use-debounce.js +6 -5
  222. package/dist/hooks/use-debounce.js.map +1 -1
  223. package/dist/hooks/use-file-picker.d.ts +3 -1
  224. package/dist/hooks/use-file-picker.js.map +1 -1
  225. package/dist/hooks/use-focus-trap.d.ts +19 -3
  226. package/dist/hooks/use-focus-trap.js +15 -5
  227. package/dist/hooks/use-focus-trap.js.map +1 -1
  228. package/dist/hooks/use-has-camera.d.ts +36 -0
  229. package/dist/hooks/use-has-camera.js +53 -0
  230. package/dist/hooks/use-has-camera.js.map +1 -0
  231. package/dist/hooks/use-hotkey.js +2 -1
  232. package/dist/hooks/use-hotkey.js.map +1 -1
  233. package/dist/hooks/use-overlay-history.d.ts +6 -1
  234. package/dist/hooks/use-overlay-history.js +10 -2
  235. package/dist/hooks/use-overlay-history.js.map +1 -1
  236. package/dist/i18n/defaults.js +11 -1
  237. package/dist/i18n/defaults.js.map +1 -1
  238. package/dist/i18n/german.js +78 -4
  239. package/dist/i18n/german.js.map +1 -1
  240. package/dist/i18n/kit-labels.d.ts +20 -0
  241. package/dist/i18n/kit-labels.js.map +1 -1
  242. package/dist/i18n/locales/en.js +95 -5
  243. package/dist/i18n/locales/en.js.map +3 -3
  244. package/dist/i18n/locales/es.js +74 -4
  245. package/dist/i18n/locales/es.js.map +1 -1
  246. package/dist/i18n/locales/fr.js +75 -3
  247. package/dist/i18n/locales/fr.js.map +1 -1
  248. package/dist/i18n/locales/hu.js +77 -4
  249. package/dist/i18n/locales/hu.js.map +1 -1
  250. package/dist/i18n/locales/it.js +77 -4
  251. package/dist/i18n/locales/it.js.map +1 -1
  252. package/dist/i18n/locales/zh.js +74 -4
  253. package/dist/i18n/locales/zh.js.map +1 -1
  254. package/dist/i18n/review.js +22 -1
  255. package/dist/i18n/review.js.map +1 -1
  256. package/dist/index.d.ts +27 -8
  257. package/dist/index.js +41 -2
  258. package/dist/index.js.map +1 -1
  259. package/dist/landing/landing-labels.d.ts +8 -0
  260. package/dist/landing/landing-labels.js +2 -1
  261. package/dist/landing/landing-labels.js.map +1 -1
  262. package/dist/lib/changelog.d.ts +130 -0
  263. package/dist/lib/changelog.js +137 -0
  264. package/dist/lib/changelog.js.map +1 -0
  265. package/dist/lib/clipboard-minus.js +2 -2
  266. package/dist/lib/clipboard-minus.js.map +1 -1
  267. package/dist/lib/dates.d.ts +36 -4
  268. package/dist/lib/dates.js +49 -13
  269. package/dist/lib/dates.js.map +1 -1
  270. package/dist/lib/editable-content.d.ts +33 -0
  271. package/dist/lib/editable-content.js +15 -0
  272. package/dist/lib/editable-content.js.map +1 -0
  273. package/dist/lib/focus-left.d.ts +47 -1
  274. package/dist/lib/focus-left.js +11 -2
  275. package/dist/lib/focus-left.js.map +1 -1
  276. package/dist/lib/format.d.ts +37 -2
  277. package/dist/lib/format.js +25 -1
  278. package/dist/lib/format.js.map +1 -1
  279. package/dist/lib/intl-cache.d.ts +4 -2
  280. package/dist/lib/intl-cache.js.map +1 -1
  281. package/dist/lib/server-wake.d.ts +49 -9
  282. package/dist/lib/server-wake.js +25 -14
  283. package/dist/lib/server-wake.js.map +1 -1
  284. package/dist/lib/session-refresh.d.ts +53 -0
  285. package/dist/lib/session-refresh.js +27 -1
  286. package/dist/lib/session-refresh.js.map +1 -1
  287. package/dist/lib/translation-review.d.ts +26 -0
  288. package/dist/lib/translation-review.js +14 -0
  289. package/dist/lib/translation-review.js.map +1 -1
  290. package/dist/rhf/fields.js +3 -3
  291. package/dist/rhf/fields.js.map +1 -1
  292. package/dist/shell/app-shell.d.ts +25 -1
  293. package/dist/shell/app-shell.js +3 -1
  294. package/dist/shell/app-shell.js.map +1 -1
  295. package/dist/shell/dev-menu.d.ts +3 -0
  296. package/dist/shell/dev-menu.js +4 -2
  297. package/dist/shell/dev-menu.js.map +1 -1
  298. package/dist/shell/held-changes-banner-labels.d.ts +23 -0
  299. package/dist/shell/held-changes-banner-labels.js +14 -0
  300. package/dist/shell/held-changes-banner-labels.js.map +1 -0
  301. package/dist/shell/held-changes-banner.d.ts +75 -0
  302. package/dist/shell/held-changes-banner.js +106 -0
  303. package/dist/shell/held-changes-banner.js.map +1 -0
  304. package/dist/shell/sync-status-indicator.d.ts +27 -12
  305. package/dist/shell/sync-status-indicator.js +13 -4
  306. package/dist/shell/sync-status-indicator.js.map +1 -1
  307. package/dist/shell/top-bar-parts-labels.d.ts +5 -0
  308. package/dist/shell/top-bar-parts-labels.js +3 -1
  309. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  310. package/dist/shell.d.ts +2 -0
  311. package/dist/shell.js +3 -0
  312. package/dist/shell.js.map +1 -1
  313. package/dist/sync/engine.d.ts +11 -2
  314. package/dist/sync/engine.js +13 -5
  315. package/dist/sync/engine.js.map +1 -1
  316. package/dist/sync/hooks.d.ts +3 -2
  317. package/dist/sync/hooks.js +4 -2
  318. package/dist/sync/hooks.js.map +1 -1
  319. package/dist/testing/css-variables.generated.d.ts +2 -2
  320. package/dist/testing/css-variables.generated.js +1 -1
  321. package/dist/testing/css-variables.generated.js.map +1 -1
  322. package/dist/theme/chart-palette.d.ts +18 -0
  323. package/dist/theme/chart-palette.js +17 -1
  324. package/dist/theme/chart-palette.js.map +1 -1
  325. package/dist/theme/contrast-tokens.d.ts +3 -3
  326. package/dist/theme/contrast-tokens.js.map +1 -1
  327. package/dist/theme/contrast.d.ts +4 -4
  328. package/dist/theme/contrast.js.map +1 -1
  329. package/dist/tour/tour-overlay.js +2 -1
  330. package/dist/tour/tour-overlay.js.map +1 -1
  331. package/package.json +5 -9
  332. package/tokens.css +19 -54
  333. package/src/account/account-parts.ts +0 -47
  334. package/src/account/account-settings-labels.ts +0 -240
  335. package/src/account/account-settings.tsx +0 -698
  336. package/src/account/data-export-setting-labels.ts +0 -20
  337. package/src/account/data-export-setting.tsx +0 -200
  338. package/src/account/delete-account-setting-labels.ts +0 -33
  339. package/src/account/delete-account-setting.tsx +0 -341
  340. package/src/account/email-change-setting-labels.ts +0 -31
  341. package/src/account/email-change-setting.tsx +0 -443
  342. package/src/account/passkeys-setting.tsx +0 -445
  343. package/src/account/sessions-setting-labels.ts +0 -24
  344. package/src/account/sessions-setting.tsx +0 -283
  345. package/src/admin/admin-action-confirm-labels.ts +0 -19
  346. package/src/admin/admin-action-confirm.tsx +0 -509
  347. package/src/admin/admin-action-log-labels.ts +0 -83
  348. package/src/admin/admin-action-log.tsx +0 -464
  349. package/src/admin/admin-area-labels.ts +0 -114
  350. package/src/admin/admin-forbidden.tsx +0 -75
  351. package/src/admin/admin-overview.tsx +0 -258
  352. package/src/admin/admin-parts.ts +0 -68
  353. package/src/admin/admin-sections.tsx +0 -208
  354. package/src/admin/admin-tool-links.tsx +0 -90
  355. package/src/admin/invitations-panel-labels.ts +0 -31
  356. package/src/admin/invitations-panel.tsx +0 -516
  357. package/src/admin/mail-test-card-labels.ts +0 -19
  358. package/src/admin/mail-test-card.tsx +0 -189
  359. package/src/admin/plan-change-labels.ts +0 -5
  360. package/src/admin/plan-change.tsx +0 -474
  361. package/src/admin/reviewer-scope-editor-labels.ts +0 -16
  362. package/src/admin/reviewer-scope-editor.tsx +0 -224
  363. package/src/admin/role-select-labels.ts +0 -16
  364. package/src/admin/role-select.tsx +0 -282
  365. package/src/admin/transfer-ownership-dialog-labels.ts +0 -20
  366. package/src/admin/transfer-ownership-dialog.tsx +0 -162
  367. package/src/admin/user-roster-labels.ts +0 -17
  368. package/src/admin/user-roster.tsx +0 -559
  369. package/src/auth/accept-invitation-labels.ts +0 -21
  370. package/src/auth/accept-invitation.tsx +0 -210
  371. package/src/auth/auth-errors-labels.ts +0 -23
  372. package/src/auth/auth-errors.ts +0 -370
  373. package/src/auth/complete-name-dialog-labels.ts +0 -16
  374. package/src/auth/complete-name-dialog.tsx +0 -253
  375. package/src/auth/email-tag.ts +0 -75
  376. package/src/auth/forgot-password-form-labels.ts +0 -20
  377. package/src/auth/forgot-password-form.tsx +0 -221
  378. package/src/auth/form-rules.ts +0 -40
  379. package/src/auth/new-password-fields.tsx +0 -85
  380. package/src/auth/not-found-page-labels.ts +0 -12
  381. package/src/auth/not-found-page.tsx +0 -95
  382. package/src/auth/register-form-labels.ts +0 -31
  383. package/src/auth/register-form.tsx +0 -456
  384. package/src/auth/reset-password-form-labels.ts +0 -27
  385. package/src/auth/reset-password-form.tsx +0 -341
  386. package/src/auth/sign-in-form-labels.ts +0 -44
  387. package/src/auth/sign-in-form.tsx +0 -858
  388. package/src/auth/status-parts.tsx +0 -132
  389. package/src/auth/verify-email-labels.ts +0 -26
  390. package/src/auth/verify-email.tsx +0 -445
  391. package/src/billing/billing-banner.tsx +0 -258
  392. package/src/billing/billing-labels.ts +0 -381
  393. package/src/billing/billing-lock.ts +0 -108
  394. package/src/billing/billing-overview.ts +0 -157
  395. package/src/billing/billing-standing.ts +0 -80
  396. package/src/billing/cancel-request.ts +0 -97
  397. package/src/billing/cancel-subscription.tsx +0 -98
  398. package/src/billing/checkout-processing.ts +0 -394
  399. package/src/billing/checkout-return.ts +0 -90
  400. package/src/billing/pay-page.ts +0 -330
  401. package/src/billing/plan-card.tsx +0 -562
  402. package/src/billing/plan-change-labels.ts +0 -66
  403. package/src/billing/plan-limit-notice.tsx +0 -148
  404. package/src/billing/plan-limit-toast.tsx +0 -90
  405. package/src/billing/plan-limit.ts +0 -52
  406. package/src/billing/plan-price.ts +0 -98
  407. package/src/billing/plan-switch.tsx +0 -216
  408. package/src/billing/provider-page.ts +0 -84
  409. package/src/billing/subscription-actions.tsx +0 -247
  410. package/src/billing/subscription-status-chip.tsx +0 -95
  411. package/src/chart.ts +0 -103
  412. package/src/components/account-chips-labels.ts +0 -16
  413. package/src/components/account-chips.tsx +0 -474
  414. package/src/components/alert-banner.tsx +0 -670
  415. package/src/components/amount-input.tsx +0 -815
  416. package/src/components/appearance-labels.ts +0 -63
  417. package/src/components/authed-image-labels.ts +0 -11
  418. package/src/components/authed-image.tsx +0 -209
  419. package/src/components/autocomplete.tsx +0 -645
  420. package/src/components/breadcrumbs-labels.ts +0 -10
  421. package/src/components/breadcrumbs.tsx +0 -205
  422. package/src/components/bulk-action-bar-labels.ts +0 -11
  423. package/src/components/bulk-action-bar.tsx +0 -443
  424. package/src/components/button-group.tsx +0 -223
  425. package/src/components/button-look.ts +0 -256
  426. package/src/components/button.tsx +0 -339
  427. package/src/components/calculator.tsx +0 -341
  428. package/src/components/calendar-heatmap-labels.ts +0 -15
  429. package/src/components/calendar-heatmap.tsx +0 -594
  430. package/src/components/card.tsx +0 -377
  431. package/src/components/chart-edge.ts +0 -106
  432. package/src/components/chart-figure.tsx +0 -35
  433. package/src/components/chart-height.ts +0 -30
  434. package/src/components/chart-zoom-core.tsx +0 -627
  435. package/src/components/chart-zoom.tsx +0 -22
  436. package/src/components/chart.tsx +0 -554
  437. package/src/components/checkbox-group.tsx +0 -247
  438. package/src/components/checkbox.tsx +0 -346
  439. package/src/components/chip-input.tsx +0 -370
  440. package/src/components/chip-labels.ts +0 -13
  441. package/src/components/chip.tsx +0 -843
  442. package/src/components/choice-card.tsx +0 -544
  443. package/src/components/column-mapper-labels.ts +0 -38
  444. package/src/components/column-mapper.tsx +0 -655
  445. package/src/components/combobox-core.tsx +0 -1321
  446. package/src/components/combobox-suggestions.tsx +0 -131
  447. package/src/components/combobox.tsx +0 -716
  448. package/src/components/confirm-context.ts +0 -7
  449. package/src/components/confirm-dialog-labels.ts +0 -13
  450. package/src/components/confirm-dialog.tsx +0 -341
  451. package/src/components/copy-button-labels.ts +0 -13
  452. package/src/components/copy-button.tsx +0 -192
  453. package/src/components/country-select-labels.ts +0 -11
  454. package/src/components/country-select.tsx +0 -539
  455. package/src/components/currency-option-list.tsx +0 -180
  456. package/src/components/currency-select.tsx +0 -341
  457. package/src/components/danger-confirm-labels.ts +0 -20
  458. package/src/components/danger-confirm.tsx +0 -934
  459. package/src/components/data-table-cells.tsx +0 -118
  460. package/src/components/data-table-column-settings.tsx +0 -198
  461. package/src/components/data-table-filter-popover.tsx +0 -281
  462. package/src/components/data-table-filters.ts +0 -287
  463. package/src/components/data-table-fit.ts +0 -301
  464. package/src/components/data-table-groups.tsx +0 -288
  465. package/src/components/data-table-head.tsx +0 -280
  466. package/src/components/data-table-labels.ts +0 -198
  467. package/src/components/data-table-leading-row.tsx +0 -58
  468. package/src/components/data-table-mobile.tsx +0 -1117
  469. package/src/components/data-table-pagination.tsx +0 -202
  470. package/src/components/data-table-resize.ts +0 -188
  471. package/src/components/data-table-row-actions.tsx +0 -302
  472. package/src/components/data-table-row.tsx +0 -496
  473. package/src/components/data-table-selection.ts +0 -71
  474. package/src/components/data-table-shared.tsx +0 -287
  475. package/src/components/data-table-sort.ts +0 -163
  476. package/src/components/data-table-virtual.ts +0 -576
  477. package/src/components/data-table.tsx +0 -2598
  478. package/src/components/date-field.tsx +0 -684
  479. package/src/components/date-format-setting.tsx +0 -64
  480. package/src/components/date-picker.tsx +0 -404
  481. package/src/components/date-range-picker.tsx +0 -518
  482. package/src/components/description-list-labels.ts +0 -9
  483. package/src/components/description-list.tsx +0 -386
  484. package/src/components/dialog-frame-labels.ts +0 -7
  485. package/src/components/dialog-frame.tsx +0 -276
  486. package/src/components/disclosure.tsx +0 -476
  487. package/src/components/dropdown.tsx +0 -461
  488. package/src/components/empty-state.tsx +0 -136
  489. package/src/components/entity-combobox.tsx +0 -422
  490. package/src/components/error-boundary-labels.ts +0 -20
  491. package/src/components/error-boundary.tsx +0 -675
  492. package/src/components/facing-pair.ts +0 -93
  493. package/src/components/field-base-labels.ts +0 -20
  494. package/src/components/field-base.tsx +0 -656
  495. package/src/components/field-parts.tsx +0 -825
  496. package/src/components/field-strip.tsx +0 -129
  497. package/src/components/field.tsx +0 -206
  498. package/src/components/file-button.tsx +0 -295
  499. package/src/components/file-dropzone.tsx +0 -559
  500. package/src/components/floating-panel-labels.ts +0 -10
  501. package/src/components/floating-panel.tsx +0 -828
  502. package/src/components/focus-ring.ts +0 -16
  503. package/src/components/form-actions-labels.ts +0 -11
  504. package/src/components/form-actions.tsx +0 -578
  505. package/src/components/full-bleed-dialog.tsx +0 -294
  506. package/src/components/grouped-picker.tsx +0 -184
  507. package/src/components/help-popover.tsx +0 -117
  508. package/src/components/hover-menu.tsx +0 -343
  509. package/src/components/iban-input-labels.ts +0 -14
  510. package/src/components/iban-input.tsx +0 -236
  511. package/src/components/icon-button.tsx +0 -959
  512. package/src/components/icon-picker-labels.ts +0 -13
  513. package/src/components/icon-picker.tsx +0 -232
  514. package/src/components/image-grid-labels.ts +0 -11
  515. package/src/components/image-grid.tsx +0 -202
  516. package/src/components/inline-confirm.tsx +0 -116
  517. package/src/components/inline-edit-field-labels.ts +0 -11
  518. package/src/components/inline-edit-field.tsx +0 -552
  519. package/src/components/inline-entity-combobox.tsx +0 -849
  520. package/src/components/input.tsx +0 -394
  521. package/src/components/jump-calendar.tsx +0 -265
  522. package/src/components/language-select.tsx +0 -93
  523. package/src/components/legal-labels.ts +0 -105
  524. package/src/components/legal-page.tsx +0 -711
  525. package/src/components/legal.tsx +0 -668
  526. package/src/components/lightbox-labels.ts +0 -18
  527. package/src/components/lightbox.tsx +0 -399
  528. package/src/components/line-items-labels.ts +0 -14
  529. package/src/components/line-items.tsx +0 -602
  530. package/src/components/list-labels.ts +0 -12
  531. package/src/components/list.tsx +0 -870
  532. package/src/components/loading-state.tsx +0 -78
  533. package/src/components/measured-grid-labels.ts +0 -25
  534. package/src/components/measured-grid.tsx +0 -837
  535. package/src/components/menu-item.tsx +0 -241
  536. package/src/components/mini-calendar-labels.ts +0 -17
  537. package/src/components/mini-calendar.tsx +0 -789
  538. package/src/components/modal.tsx +0 -505
  539. package/src/components/money-draft.ts +0 -83
  540. package/src/components/money-field.tsx +0 -76
  541. package/src/components/month-grid.tsx +0 -229
  542. package/src/components/month-picker-labels.ts +0 -22
  543. package/src/components/month-picker.tsx +0 -1087
  544. package/src/components/multi-entity-combobox.tsx +0 -369
  545. package/src/components/multi-select.tsx +0 -376
  546. package/src/components/nav-pills.tsx +0 -198
  547. package/src/components/number-field.tsx +0 -327
  548. package/src/components/number-input.tsx +0 -558
  549. package/src/components/numeric-field.ts +0 -169
  550. package/src/components/numpad-sheet.tsx +0 -285
  551. package/src/components/one-time-code-input.tsx +0 -270
  552. package/src/components/page-contents-labels.ts +0 -9
  553. package/src/components/page-contents.tsx +0 -282
  554. package/src/components/page-header-context.ts +0 -8
  555. package/src/components/page-header.tsx +0 -298
  556. package/src/components/password-strength-labels.ts +0 -22
  557. package/src/components/password-strength.tsx +0 -241
  558. package/src/components/phone-input-labels.ts +0 -10
  559. package/src/components/phone-input.tsx +0 -282
  560. package/src/components/picker-sheet.tsx +0 -330
  561. package/src/components/pie-chart-labels.ts +0 -40
  562. package/src/components/pie-chart.tsx +0 -480
  563. package/src/components/popover-labels.ts +0 -14
  564. package/src/components/popover.tsx +0 -268
  565. package/src/components/progress-bar-labels.ts +0 -10
  566. package/src/components/progress-bar.tsx +0 -479
  567. package/src/components/qr-code.tsx +0 -76
  568. package/src/components/reauth-dialog-labels.ts +0 -13
  569. package/src/components/reauth-dialog.tsx +0 -265
  570. package/src/components/row-actions-labels.ts +0 -12
  571. package/src/components/row-actions.tsx +0 -795
  572. package/src/components/scroll-area.tsx +0 -123
  573. package/src/components/search-field.tsx +0 -192
  574. package/src/components/select.tsx +0 -294
  575. package/src/components/separator.tsx +0 -33
  576. package/src/components/series-chart-axes.ts +0 -342
  577. package/src/components/series-chart-budget.ts +0 -150
  578. package/src/components/series-chart-labels.ts +0 -33
  579. package/src/components/series-chart-thin.ts +0 -180
  580. package/src/components/series-chart-ticks.ts +0 -194
  581. package/src/components/series-chart.tsx +0 -1906
  582. package/src/components/server-wake-labels.ts +0 -11
  583. package/src/components/server-wake.tsx +0 -129
  584. package/src/components/settings-fields.tsx +0 -237
  585. package/src/components/share-card-labels.ts +0 -30
  586. package/src/components/share-card.tsx +0 -675
  587. package/src/components/signature-pad-labels.ts +0 -24
  588. package/src/components/signature-pad.tsx +0 -747
  589. package/src/components/signed-amount-labels.ts +0 -10
  590. package/src/components/signed-amount.tsx +0 -336
  591. package/src/components/skeleton.tsx +0 -80
  592. package/src/components/slider.tsx +0 -338
  593. package/src/components/sparkline-labels.ts +0 -14
  594. package/src/components/sparkline.tsx +0 -322
  595. package/src/components/spinner.tsx +0 -81
  596. package/src/components/stat-tile-labels.ts +0 -15
  597. package/src/components/stat-tile.tsx +0 -725
  598. package/src/components/status-dot.tsx +0 -170
  599. package/src/components/swatch-picker-labels.ts +0 -10
  600. package/src/components/swatch-picker.tsx +0 -283
  601. package/src/components/swipeable-row.tsx +0 -386
  602. package/src/components/switch.tsx +0 -273
  603. package/src/components/table-skeleton.tsx +0 -136
  604. package/src/components/table.tsx +0 -647
  605. package/src/components/tabs-labels.ts +0 -13
  606. package/src/components/tabs.tsx +0 -693
  607. package/src/components/text-link.tsx +0 -359
  608. package/src/components/text.tsx +0 -150
  609. package/src/components/textarea.tsx +0 -330
  610. package/src/components/tile-radio.tsx +0 -332
  611. package/src/components/time-input.tsx +0 -121
  612. package/src/components/toast-labels.ts +0 -12
  613. package/src/components/toast.tsx +0 -519
  614. package/src/components/toggle-group.tsx +0 -752
  615. package/src/components/toggle-legend.tsx +0 -394
  616. package/src/components/tooltip.tsx +0 -1149
  617. package/src/components/translation-review-editor.tsx +0 -290
  618. package/src/components/translation-review-labels.ts +0 -181
  619. package/src/components/translation-review-parts.tsx +0 -272
  620. package/src/components/translation-review.tsx +0 -1240
  621. package/src/components/tree-view.tsx +0 -589
  622. package/src/components/treemap-labels.ts +0 -47
  623. package/src/components/treemap-layout.ts +0 -210
  624. package/src/components/treemap.tsx +0 -1184
  625. package/src/components/trigger-aria.ts +0 -44
  626. package/src/components/use-anchor-dir.ts +0 -20
  627. package/src/components/use-mobile-reveal.ts +0 -62
  628. package/src/components/use-table-state.ts +0 -753
  629. package/src/components/user-avatar.tsx +0 -116
  630. package/src/components/wizard-stepper.tsx +0 -42
  631. package/src/components/write-lock-labels.ts +0 -10
  632. package/src/components/write-lock.tsx +0 -253
  633. package/src/currencies.ts +0 -70
  634. package/src/data-table.ts +0 -42
  635. package/src/demo/demo-banner.tsx +0 -153
  636. package/src/demo/demo-countdown.ts +0 -136
  637. package/src/demo/demo-ended.tsx +0 -90
  638. package/src/demo/demo-labels.ts +0 -78
  639. package/src/demo/demo-session.ts +0 -32
  640. package/src/demo/demo-start.tsx +0 -156
  641. package/src/eslint/index.ts +0 -161
  642. package/src/eslint/role-utilities.generated.ts +0 -146
  643. package/src/eslint/role-utilities.ts +0 -233
  644. package/src/feedback/feedback-attachment-download.tsx +0 -77
  645. package/src/feedback/feedback-attachment-labels.ts +0 -37
  646. package/src/feedback/feedback-attachment.tsx +0 -1239
  647. package/src/feedback/feedback-capture.ts +0 -287
  648. package/src/feedback/feedback-comment-thread.tsx +0 -353
  649. package/src/feedback/feedback-context-labels.ts +0 -10
  650. package/src/feedback/feedback-context.tsx +0 -213
  651. package/src/feedback/feedback-crash.ts +0 -547
  652. package/src/feedback/feedback-dialog-labels.ts +0 -29
  653. package/src/feedback/feedback-dialog.tsx +0 -440
  654. package/src/feedback/feedback-entry-file.tsx +0 -150
  655. package/src/feedback/feedback-inbox.tsx +0 -552
  656. package/src/feedback/feedback-labels.ts +0 -144
  657. package/src/feedback/feedback-menu-labels.ts +0 -12
  658. package/src/feedback/feedback-menu.tsx +0 -177
  659. package/src/feedback/feedback-mutation.ts +0 -20
  660. package/src/feedback/feedback-page-link.ts +0 -90
  661. package/src/feedback/feedback-public-labels.ts +0 -81
  662. package/src/feedback/feedback-public-list.tsx +0 -524
  663. package/src/feedback/feedback-public-switch.tsx +0 -102
  664. package/src/feedback/feedback-public-types.ts +0 -101
  665. package/src/feedback/feedback-record.ts +0 -423
  666. package/src/feedback/feedback-replies-context.ts +0 -9
  667. package/src/feedback/feedback-replies.tsx +0 -343
  668. package/src/feedback/feedback-rework-entry-chip.tsx +0 -18
  669. package/src/feedback/feedback-row-detail-labels.ts +0 -30
  670. package/src/feedback/feedback-row-detail.tsx +0 -858
  671. package/src/feedback/feedback-status-undo.ts +0 -109
  672. package/src/feedback/feedback-submit-dialog.tsx +0 -118
  673. package/src/feedback/feedback-submit.tsx +0 -237
  674. package/src/feedback/feedback-swipe.tsx +0 -192
  675. package/src/feedback/feedback-table-labels.ts +0 -27
  676. package/src/feedback/feedback-table.tsx +0 -912
  677. package/src/feedback/feedback-thread-labels.ts +0 -22
  678. package/src/feedback/feedback-thread-parts-labels.ts +0 -41
  679. package/src/feedback/feedback-thread.tsx +0 -905
  680. package/src/feedback/feedback-vocabulary.ts +0 -263
  681. package/src/feedback/feedback-vote-button.tsx +0 -124
  682. package/src/feedback.ts +0 -116
  683. package/src/hooks/use-anchored-panel.ts +0 -396
  684. package/src/hooks/use-anchored-rect.ts +0 -77
  685. package/src/hooks/use-announce.ts +0 -85
  686. package/src/hooks/use-authed-src.ts +0 -167
  687. package/src/hooks/use-body-scroll-lock.ts +0 -119
  688. package/src/hooks/use-breakpoint.ts +0 -133
  689. package/src/hooks/use-close-transition.ts +0 -107
  690. package/src/hooks/use-copy-to-clipboard.ts +0 -122
  691. package/src/hooks/use-debounce.ts +0 -114
  692. package/src/hooks/use-dismiss.ts +0 -371
  693. package/src/hooks/use-document-title.ts +0 -33
  694. package/src/hooks/use-file-drop.ts +0 -121
  695. package/src/hooks/use-file-picker-labels.ts +0 -28
  696. package/src/hooks/use-file-picker.tsx +0 -359
  697. package/src/hooks/use-focus-trap.ts +0 -199
  698. package/src/hooks/use-hotkey.ts +0 -189
  699. package/src/hooks/use-large-text.ts +0 -41
  700. package/src/hooks/use-long-press.ts +0 -140
  701. package/src/hooks/use-media-query.ts +0 -39
  702. package/src/hooks/use-mounted.ts +0 -39
  703. package/src/hooks/use-noindex.ts +0 -37
  704. package/src/hooks/use-overlay-history.ts +0 -714
  705. package/src/hooks/use-row-swipe.ts +0 -207
  706. package/src/hooks/use-search-param-state.ts +0 -434
  707. package/src/hooks/use-windowed-rows.ts +0 -225
  708. package/src/i18n/defaults.ts +0 -267
  709. package/src/i18n/german.ts +0 -2057
  710. package/src/i18n/kit-labels.tsx +0 -1003
  711. package/src/i18n/languages.ts +0 -349
  712. package/src/i18n/locales/de-CH.ts +0 -24
  713. package/src/i18n/locales/en.ts +0 -267
  714. package/src/i18n/locales/es.ts +0 -1997
  715. package/src/i18n/locales/fr.ts +0 -2035
  716. package/src/i18n/locales/hu.ts +0 -2002
  717. package/src/i18n/locales/it.ts +0 -2012
  718. package/src/i18n/locales/zh.ts +0 -1910
  719. package/src/i18n/plurals.ts +0 -86
  720. package/src/i18n/review.ts +0 -475
  721. package/src/i18n/shared-labels.ts +0 -138
  722. package/src/i18n/swiss.ts +0 -29
  723. package/src/index.ts +0 -1179
  724. package/src/landing/access.ts +0 -93
  725. package/src/landing/landing-actions.tsx +0 -97
  726. package/src/landing/landing-labels.ts +0 -59
  727. package/src/landing/landing-sections.tsx +0 -341
  728. package/src/landing/page-seo.ts +0 -261
  729. package/src/landing/public-header.tsx +0 -121
  730. package/src/landing/public-page.tsx +0 -106
  731. package/src/landing/routing.tsx +0 -225
  732. package/src/lib/broadcast.ts +0 -52
  733. package/src/lib/calc.ts +0 -323
  734. package/src/lib/chip-edge-snap.ts +0 -212
  735. package/src/lib/clipboard-minus.ts +0 -107
  736. package/src/lib/clipping.ts +0 -34
  737. package/src/lib/cn.ts +0 -28
  738. package/src/lib/column-mapping.ts +0 -234
  739. package/src/lib/countries.ts +0 -91
  740. package/src/lib/data-attributes.ts +0 -14
  741. package/src/lib/date-format.ts +0 -227
  742. package/src/lib/dates.ts +0 -266
  743. package/src/lib/day-format.ts +0 -96
  744. package/src/lib/decimal-marks.ts +0 -108
  745. package/src/lib/describe-failure.ts +0 -18
  746. package/src/lib/device-settings.ts +0 -147
  747. package/src/lib/direction.ts +0 -74
  748. package/src/lib/document-navigation.ts +0 -17
  749. package/src/lib/document-title.ts +0 -41
  750. package/src/lib/download.ts +0 -172
  751. package/src/lib/float-clearance.ts +0 -70
  752. package/src/lib/floating-stack.ts +0 -70
  753. package/src/lib/focus-left.ts +0 -156
  754. package/src/lib/format.ts +0 -522
  755. package/src/lib/http-status.ts +0 -38
  756. package/src/lib/iban.ts +0 -251
  757. package/src/lib/ime.ts +0 -24
  758. package/src/lib/intl-cache.ts +0 -25
  759. package/src/lib/iso-day.ts +0 -13
  760. package/src/lib/lazy-with-fallback.ts +0 -82
  761. package/src/lib/logger.ts +0 -69
  762. package/src/lib/minus.ts +0 -50
  763. package/src/lib/path-pattern.ts +0 -55
  764. package/src/lib/person-name.ts +0 -155
  765. package/src/lib/phone.ts +0 -208
  766. package/src/lib/plain-text.ts +0 -22
  767. package/src/lib/presence.ts +0 -18
  768. package/src/lib/qr-encode.ts +0 -444
  769. package/src/lib/quiet-focus.ts +0 -32
  770. package/src/lib/reduced-motion.ts +0 -22
  771. package/src/lib/refs.ts +0 -22
  772. package/src/lib/round.ts +0 -43
  773. package/src/lib/safe-storage.ts +0 -119
  774. package/src/lib/server-wake.ts +0 -315
  775. package/src/lib/session-refresh.ts +0 -472
  776. package/src/lib/share-format.ts +0 -18
  777. package/src/lib/status-tone.ts +0 -43
  778. package/src/lib/strip-fade.ts +0 -287
  779. package/src/lib/table-text.ts +0 -554
  780. package/src/lib/text-case.ts +0 -19
  781. package/src/lib/text-match.ts +0 -169
  782. package/src/lib/thenable.ts +0 -19
  783. package/src/lib/translation-review.ts +0 -717
  784. package/src/notifications/device-zone-report.ts +0 -67
  785. package/src/notifications/feedback-notification-types-labels.ts +0 -33
  786. package/src/notifications/feedback-notification-types.ts +0 -71
  787. package/src/notifications/notification-bell.tsx +0 -119
  788. package/src/notifications/notification-inbox.tsx +0 -309
  789. package/src/notifications/notification-parts.tsx +0 -81
  790. package/src/notifications/notification-types-setting.tsx +0 -406
  791. package/src/notifications/notification-types.ts +0 -89
  792. package/src/notifications/notifications-labels.ts +0 -287
  793. package/src/notifications/push-device-setting.tsx +0 -230
  794. package/src/notifications/push-devices-setting.tsx +0 -374
  795. package/src/notifications/push-worker.ts +0 -168
  796. package/src/notifications/quiet-hours-setting.tsx +0 -238
  797. package/src/notifications/unsubscribe-panel.tsx +0 -200
  798. package/src/notifications/use-push-device.ts +0 -448
  799. package/src/offline/local-first.ts +0 -100
  800. package/src/offline/pwa-update-prompt-labels.ts +0 -9
  801. package/src/offline/pwa-update-prompt.tsx +0 -78
  802. package/src/offline/query-persistence.ts +0 -391
  803. package/src/offline/service-worker-updates.ts +0 -81
  804. package/src/offline/shared-computer-labels.ts +0 -8
  805. package/src/offline/shared-computer.tsx +0 -87
  806. package/src/offline/sign-out-pending-dialog-labels.ts +0 -21
  807. package/src/offline/sign-out-pending-dialog.tsx +0 -135
  808. package/src/offline.ts +0 -37
  809. package/src/push-worker.ts +0 -25
  810. package/src/rhf/fields.tsx +0 -2187
  811. package/src/rhf/form-core.tsx +0 -324
  812. package/src/rhf/form.tsx +0 -12
  813. package/src/rhf/line-items.tsx +0 -135
  814. package/src/rhf/use-rhf-wizard-step.ts +0 -104
  815. package/src/rhf.ts +0 -21
  816. package/src/search/command-palette-labels.ts +0 -16
  817. package/src/search/command-palette.tsx +0 -624
  818. package/src/search/global-search-labels.ts +0 -13
  819. package/src/search/global-search.tsx +0 -660
  820. package/src/search/search-index.ts +0 -283
  821. package/src/search/use-command-key.ts +0 -23
  822. package/src/search.ts +0 -14
  823. package/src/settings/device-reset-setting-labels.ts +0 -20
  824. package/src/settings/device-reset-setting.tsx +0 -116
  825. package/src/settings/settings-card-classes.ts +0 -11
  826. package/src/settings/settings-catalogue.ts +0 -150
  827. package/src/settings/settings-context.ts +0 -33
  828. package/src/settings/settings-heading.tsx +0 -67
  829. package/src/settings/settings-labels.ts +0 -87
  830. package/src/settings/settings-layout.tsx +0 -471
  831. package/src/settings/settings-section.tsx +0 -108
  832. package/src/settings/use-account-appearance.ts +0 -148
  833. package/src/settings/use-account-language.ts +0 -146
  834. package/src/settings/use-settings-focus.ts +0 -128
  835. package/src/settings/use-settings-route.ts +0 -258
  836. package/src/shell/account-menu-language.tsx +0 -130
  837. package/src/shell/account-menu-text-size.tsx +0 -80
  838. package/src/shell/admin-menu.tsx +0 -183
  839. package/src/shell/app-shell-labels.ts +0 -11
  840. package/src/shell/app-shell.tsx +0 -1560
  841. package/src/shell/auth-layout.tsx +0 -186
  842. package/src/shell/company-switcher-labels.ts +0 -13
  843. package/src/shell/company-switcher.tsx +0 -136
  844. package/src/shell/dev-menu.tsx +0 -257
  845. package/src/shell/fill-height.tsx +0 -45
  846. package/src/shell/language-code.ts +0 -5
  847. package/src/shell/option-switcher-menu.tsx +0 -84
  848. package/src/shell/sync-status-indicator.tsx +0 -303
  849. package/src/shell/top-bar-actions.tsx +0 -87
  850. package/src/shell/top-bar-brand.tsx +0 -78
  851. package/src/shell/top-bar-parts-labels.ts +0 -148
  852. package/src/shell/top-bar.tsx +0 -40
  853. package/src/shell/topbar-action-menu.tsx +0 -567
  854. package/src/shell/topbar-controls.tsx +0 -269
  855. package/src/shell/tour-menu.tsx +0 -187
  856. package/src/shell.ts +0 -108
  857. package/src/sync/db.ts +0 -129
  858. package/src/sync/engine.ts +0 -1011
  859. package/src/sync/hooks.ts +0 -98
  860. package/src/sync/testing.ts +0 -73
  861. package/src/sync/wire.ts +0 -61
  862. package/src/sync.ts +0 -37
  863. package/src/table-text.ts +0 -8
  864. package/src/testing/css-variables.generated.ts +0 -112
  865. package/src/testing/css-variables.ts +0 -189
  866. package/src/testing/index.ts +0 -29
  867. package/src/testing/react.ts +0 -58
  868. package/src/testing/tour.ts +0 -41
  869. package/src/testing/viewport.ts +0 -357
  870. package/src/theme/chart-palette.ts +0 -232
  871. package/src/theme/color.ts +0 -272
  872. package/src/theme/contrast-tokens.ts +0 -268
  873. package/src/theme/contrast.ts +0 -250
  874. package/src/theme/palette-derive.ts +0 -825
  875. package/src/theme/palette-presets.ts +0 -544
  876. package/src/theme/palette-store.ts +0 -108
  877. package/src/theme/text-size.ts +0 -289
  878. package/src/theme/theme-store.ts +0 -157
  879. package/src/tour/tour-catalogue-labels.ts +0 -75
  880. package/src/tour/tour-catalogue.tsx +0 -335
  881. package/src/tour/tour-dock.ts +0 -134
  882. package/src/tour/tour-engine.ts +0 -37
  883. package/src/tour/tour-gates.ts +0 -218
  884. package/src/tour/tour-guide-button.tsx +0 -64
  885. package/src/tour/tour-guide-labels.ts +0 -15
  886. package/src/tour/tour-info.ts +0 -144
  887. package/src/tour/tour-labels.ts +0 -23
  888. package/src/tour/tour-overlay.tsx +0 -1170
  889. package/src/tour/tour.tsx +0 -750
  890. package/src/tour/use-tour-progress.ts +0 -671
  891. package/src/tour/use-tour-url-sync.ts +0 -266
  892. package/src/tour.ts +0 -21
  893. package/src/vite-env.d.ts +0 -23
  894. package/src/wizard/stepper-nav.tsx +0 -360
  895. package/src/wizard/types.ts +0 -275
  896. package/src/wizard/use-wizard.ts +0 -560
  897. package/src/wizard/validation.ts +0 -39
  898. package/src/wizard/wizard-context.tsx +0 -74
  899. package/src/wizard/wizard-labels.ts +0 -29
  900. package/src/wizard/wizard-step.tsx +0 -76
  901. package/src/wizard/wizard-summary.tsx +0 -84
  902. 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
- }