@eifi1/ui-kit 0.54.0 → 0.56.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 +6 -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 +7 -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 +83 -0
  113. package/dist/components/legended-series-chart.js +77 -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 +9 -12
  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,816 +0,0 @@
1
- import { useId, useMemo, useRef } from "react";
2
- import { ChevronDown } from "lucide-react";
3
- import type { ReactNode, Ref } from "react";
4
- import { CurrencyOptionList, getCurrency } from "./currency-option-list";
5
- import { useComboboxCore } from "./combobox-core";
6
- import { FIELD_BASE, FIELD_DISPLAY, FIELD_INVALID, FLOATING_INPUT_CLASS, FloatingField } from "./field-base";
7
- import { cn } from "../lib/cn";
8
- import { currencyMinorDigits } from "../lib/format";
9
- import { roundHalfAway } from "../lib/round";
10
- import { CalculatorButton, type CalculatorButtonLabels } from "./calculator";
11
- import { NumberPadSheet, type NumberPadSheetLabels } from "./numpad-sheet";
12
- import {
13
- DEFAULT_COMMON_LABELS,
14
- DEFAULT_CURRENCY_LABELS,
15
- useKitLabels,
16
- useKitLocale,
17
- type CurrencyLabels,
18
- } from "../i18n/kit-labels";
19
- import {
20
- commitExpression,
21
- evaluateExpression,
22
- formatResult,
23
- isBareAmount,
24
- looksLikeExpression,
25
- sanitizeLive,
26
- splitLeadingSign,
27
- } from "../lib/calc";
28
- import {
29
- FieldCaption,
30
- LockedReason,
31
- mergeRefs,
32
- type DisabledReasonDisplay,
33
- type FieldHelpProps,
34
- type LockReason,
35
- } from "./field-parts";
36
- import { useEndWidth, useNumericField } from "./numeric-field";
37
- import type { CommitScope } from "./write-lock";
38
- import { dataAttributes, type DataAttributes } from "../lib/data-attributes";
39
-
40
- /** {@link AmountInput}'s props — exported since 0.34 (refactor audit 2026-10, API-9): a
41
- * wrapper typed itself off `ComponentProps<typeof AmountInput>` until then. */
42
- export interface AmountInputProps extends FieldHelpProps, DataAttributes {
43
- value: string;
44
- onChange: (value: string) => void;
45
- currency?: string;
46
- onCurrencyChange?: (code: string) => void;
47
- placeholder?: string;
48
- label?: ReactNode;
49
- disabled?: boolean;
50
- /** Required and unanswered — {@link FIELD_INVALID}. See {@link Input}'s `invalid`. */
51
- invalid?: boolean;
52
- /**
53
- * What is wrong with the amount, in the caller's own words — {@link Input}'s `error`
54
- * (keksdose K4: "exceeds the outstanding balance" was a loose `<p>` beside the field
55
- * that nothing pointed at). Rendered under the field, after a text `hint`; merged into
56
- * `aria-describedby` after the caller's ids and the hint's; implies `invalid`, so the
57
- * field paints as well as announces. `null`, `false` and `""` are no message.
58
- * {@link MoneyField} takes it too.
59
- */
60
- error?: ReactNode;
61
- /**
62
- * Show the desktop calculator trigger (default `true`). `false` for an amount in an
63
- * ephemeral close-on-blur editor — a budget's assigned cell, a VAT cell (keksdose K6)
64
- * — where a click on the icon blurs the field and tears the editor down before the
65
- * popover can open. Typing a calculation ("200+50", then Enter) still evaluates, and
66
- * a phone keeps its numpad, exactly as {@link NumberInput}'s `calculator={false}`.
67
- */
68
- calculator?: boolean;
69
- /** The field's WRAPPER — width, a margin, a flex share. The `<input>` is
70
- * `inputClassName`'s. */
71
- className?: string;
72
- /**
73
- * Classes for the `<input>` itself — {@link NumberInput}'s and {@link Input}'s prop of
74
- * the same name, merged the same way: after everything the field sets for LOOKS — the
75
- * base classes, the plain end padding, the display shape's centring and the `tone`
76
- * colour — so it can restyle the figure (`text-end` for a money column whose decimal
77
- * points line up, `font-medium`, a tighter `py-1` or a symmetric `px-2` in a table
78
- * cell, `text-transparent` while a figure is being re-fetched), and before what the
79
- * field needs to WORK: the end padding the calculator and the currency chip reserve,
80
- * and the invalid border. Neither of those can be taken away by accident — a caller's
81
- * `px-2` keeps its start edge and the digits still stop short of the chip, and a
82
- * borderless cell's `border-transparent` still turns red when the value is wrong.
83
- *
84
- * keksdose G7: the invoice's VAT cell right-aligns its figure, and with only
85
- * `className` (the wrapper) it reached the element through `[&_input]:text-end` — a
86
- * descendant selector that depends on the field's inner markup, which the kit is free
87
- * to change, and that a reader of the call site has to decode. {@link MoneyField}
88
- * passes it through, and `RhfMoneyField` takes it too.
89
- *
90
- * keksdose 0.24: until then it sat BEFORE the plain end padding (`pe-3`) and the tone,
91
- * so the budget's assigned cell could not make its padding symmetric (`px-2` came out
92
- * `px-2 pe-3`) and the holdings price could not hide an outflow-toned figure while
93
- * re-fetching — both were back on `[&_input]:` selectors on the wrapper.
94
- */
95
- inputClassName?: string;
96
- id?: string;
97
- /** Names the field when it has no visible `label` (a table cell, the display shape). */
98
- "aria-label"?: string;
99
- /**
100
- * Set on the `<input>`, with `id` above. Declared so `Field`'s render-prop spread —
101
- * `{(ids) => <AmountInput {...ids} … />}` — is typed and reaches the input: the
102
- * hint and error are described, a required amount is announced as required, and
103
- * `aria-invalid` paints {@link FIELD_INVALID} the way `invalid` does.
104
- */
105
- "aria-describedby"?: string;
106
- "aria-invalid"?: boolean | "true" | "false";
107
- "aria-required"?: boolean | "true" | "false";
108
- /**
109
- * BCP 47 tag for this field — {@link NumberInput}'s `locale` (0.34, DUP-10): the decimal
110
- * mark the field SHOWS and reads typing in ("1,5" for fr-CH, "1.5" for de-CH, as `Intl`
111
- * decides), and the language of the currency picker's search. Default the
112
- * `<UiKitProvider locale>`, else the runtime's. `value` and `onChange` stay
113
- * dot-decimal.
114
- */
115
- locale?: string;
116
- /** {@link NumberInput}'s `hint`, the same rule: a {@link FieldHint} "?" rides the
117
- * label's own line, beside the label (not at the far end, where the calculator and
118
- * the currency chip live); plain TEXT (a string or a number) is a caption UNDER
119
- * the field, attached through `aria-describedby` after the caller's own. A phone's
120
- * `variant="display"` has no visible label, so a FieldHint is dropped there; a
121
- * caption still shows.
122
- *
123
- * Since 0.34 a FieldHint is that caption at Large and on a touch screen, as on
124
- * NumberInput since 0.32 (`useInlineHint`, docs/text-size-harmonization.md §4: a fact
125
- * a finger cannot hover open is printed). A `HelpPopover` — help, not a fact (§10.23)
126
- * — stays on the label line at every size. */
127
- hint?: ReactNode;
128
- /** Every user-facing string this component and the two it composes own, so a
129
- * translating host can supply its own. Each key optional, and each a per-field
130
- * override of the kit-wide translation in `<UiKitProvider labels>`: `currency`
131
- * and `currencySearch` of its `currency` namespace, the rest of `calculator`.
132
- * `currency` names the picker chip, composed with the selected code through
133
- * `common.fieldValue`; the rest are pass-through. */
134
- labels?: {
135
- currency?: string;
136
- currencySearch?: string;
137
- /** Names the calculator TRIGGER this component renders. `calculator` below
138
- * names the controls inside the popover it opens. */
139
- calculatorTrigger?: string;
140
- pad?: NumberPadSheetLabels;
141
- calculator?: CalculatorButtonLabels;
142
- };
143
- /** Translated currency names for the chip's picker, keyed by ISO code. The same
144
- * sparse override `CurrencySelect` takes, and for the same reason: the names in
145
- * `CURRENCIES` are shipped data, so without this they are the one English word
146
- * left in a translated row. Not part of `labels` because it is keyed by DATA
147
- * rather than by a fixed set of slots, and an app passes the same map to both
148
- * pickers. */
149
- currencyNames?: Record<string, string>;
150
- /** Offer only these ISO codes in the chip's list, in this order — `CurrencySelect`'s
151
- * `options`, since the chip renders CurrencySelect's list (round 0.34 Wave 2, DUP-4).
152
- * Default every currency the kit knows but a `retired` one (the lev), which only the
153
- * field that holds it lists. */
154
- currencyOptions?: string[];
155
- /** Focus the field on mount — on mobile this also opens the numpad sheet, so a
156
- * new-transaction form can jump straight to amount entry (feedback #70). */
157
- autoFocus?: boolean;
158
- /**
159
- * Tint the typed figure by what it will DO (Keksdose feedback #167).
160
- *
161
- * The direction is chosen with a toggle beside the field rather than typed, so
162
- * the digits alone say nothing about which way the money goes — on the one screen
163
- * where getting that backwards is the expensive mistake. Colour says it
164
- * continuously, and it costs no layout. It stays the MAIN indication (live #201
165
- * rework: *"The main indication shall still be the color"*); {@link negative}
166
- * renders the sign as a second, quieter signal in front of the figure.
167
- *
168
- * Never the ONLY signal: the toggle it mirrors is right there, labelled, so this
169
- * is reinforcement rather than the sole carrier of the meaning.
170
- */
171
- tone?: "neutral" | "outflow" | "inflow";
172
- /**
173
- * The SIGN of the figure, owned by the caller's direction control (Keksdose live
174
- * #201 rework: *"Outflow should be negative and inflow positive … the sign shall
175
- * be displayed but not necessarily be typed in"*).
176
- *
177
- * `value` stays the MAGNITUDE. The minus is glued on at render time and stripped
178
- * off again before anything is reported back, so the caller never sees its own
179
- * prefix echoed and no code path can end up applying it twice. That is the whole
180
- * cure: there is exactly ONE place the sign lives, and it is not the text.
181
- *
182
- * Because it is rendered rather than stored it cannot be deleted (the next render
183
- * puts it back), a select-all-and-retype keeps the direction, and the caret needs
184
- * no minding.
185
- *
186
- * Since 0.15.5 it is drawn on its own too, for a read-only or disabled signed figure
187
- * (an "Items total" of −5.18): no `onNegativeChange` needed just to show the minus.
188
- */
189
- negative?: boolean;
190
- /**
191
- * A sign the user TYPED, or a calculation that resolved to a signed number.
192
- *
193
- * SET, never flip. A "-" means *"this is an outflow"*, so typing it twice says the
194
- * same thing twice — which is exactly what the rework asks for (*"Subtracting
195
- * values twice resulting in inflow -> outflow and back to inflow seems not
196
- * reasonable"*). "+" says the other direction.
197
- *
198
- * Its presence is what ARMS the whole sign behaviour. A field with no direction
199
- * control — an account's starting balance, a loan payment, a holding's cost —
200
- * passes neither prop and keeps a text that is the whole truth, minus included.
201
- */
202
- onNegativeChange?: (negative: boolean) => void;
203
- /**
204
- * How the field presents itself ON A PHONE (Keksdose feedback #176).
205
- *
206
- * `"field"` (default) is the labelled, bordered input used everywhere else.
207
- *
208
- * `"display"` keeps every mechanic — the same `<input>`, the same numpad sheet,
209
- * the same currency picker, the same commit/blur contract — and only drops the
210
- * chrome: no border, no fill, no floating label, the figure set at display size.
211
- * On a form whose whole point is one number, a bordered `text-sm` box draws the
212
- * amount at the same weight as the memo beside it; this makes it the headline
213
- * instead. It stays fully editable — the underline and the caret are what say so.
214
- *
215
- * Phone-only by construction: it keys off the same breakpoint as the numpad, so
216
- * from `md` up the field is byte-for-byte the normal one and a desktop grid keeps
217
- * its column rhythm.
218
- */
219
- variant?: "field" | "display";
220
- /**
221
- * Where the figure sits in its row, for `variant="display"` only (Keksdose
222
- * feedback #176 rework).
223
- *
224
- * `"start"` (default) keeps it flush left, in the reading column the fields
225
- * below it share — and it is what the entry forms use, because a figure that
226
- * starts at a known edge is legible at any width: when the value outgrows the
227
- * field, the digits that scroll out of sight are the trailing ones, not the
228
- * magnitude (Keksdose feedback #430 rework).
229
- *
230
- * `"center"` makes it a centred headline. It centres in the width that REMAINS
231
- * after the trailing currency control, not in the whole box: the control is
232
- * pinned to the right edge, so a plain `text-center` would centre the figure
233
- * under it and the last digits would sit behind the chip. This used to mirror
234
- * the control's reservation onto the left instead, which centred correctly but
235
- * spent twice the control's width on padding — fatal on a 375px screen, where
236
- * it left a 36px figure 16px to live in.
237
- */
238
- align?: "start" | "center";
239
- /**
240
- * Decimals the committed amount is rounded to (kastlan 0.12: "12.345" and a
241
- * calculator's "100/3" reached a `Numeric(10,2)` column unrounded and failed with a
242
- * 422). Default: the currency's minor unit, from `Intl` (CHF and EUR 2, JPY 0). With
243
- * no `currency`, nothing is rounded unless this is set. Rounding is half away from
244
- * zero (12.345 → 12.35, -12.345 → -12.35) and happens when the figure settles: on
245
- * blur, on Enter, and on every result the calculator writes back. Keystrokes are left
246
- * alone, so "12.3" can still become "12.34".
247
- *
248
- * ⚠️ **A unit price or a rate needs `digits`.** The default is right for an amount of
249
- * money and silently wrong for a price per unit: a fund's NAV of 123.4567 or fuel at
250
- * 1.789 €/l is stored as 123.46 / 1.79, and no test fails (keksdose G2, a
251
- * `Numeric(18,6)` holding price and a `Numeric(18,4)` unit price). Pass the column's
252
- * scale: `digits={4}`, `digits={6}`.
253
- *
254
- * **Set `digits` for any sub-currency scale** — not only a price: any field whose
255
- * column holds more decimals than the currency's minor unit. A split line stored at
256
- * the ledger's 4dp (`Numeric(18,4)`) and loaded as 12.3456 is SHOWN as 12.35, and
257
- * committed as 12.35 as soon as the user tabs through it (blur settles) — so the form
258
- * no longer equals what the server holds: the lines stop summing to the 4dp total,
259
- * and Save is held (keksdose live #240). With a `currency`, every commit rounds to that currency's
260
- * minor unit unless `digits` says otherwise: pass the column's scale (`digits={4}`).
261
- */
262
- digits?: number;
263
- /** The smallest amount the field settles on. A lower figure is raised to it when it
264
- * settles, like `digits`. Compared with the signed figure. */
265
- min?: number;
266
- /** The largest amount the field settles on (a deposit release capped at the
267
- * balance). A higher figure is lowered to it when it settles. */
268
- max?: number;
269
- /**
270
- * The SETTLED figure, dot-decimal, sign included — fired on blur, on Enter, on the
271
- * numpad's "=" and once per calculator session (its "=" or Enter in its display, or
272
- * the pad closing on a result not committed yet), never on a keystroke ("1200+" is
273
- * not a figure yet). `onChange` still reports every keystroke and every result the
274
- * calculator writes back; this is for a host that stores a number and must not see
275
- * drafts (kastlan 52; see {@link MoneyField}, which is built on it).
276
- *
277
- * Refactor audit 2026-10-30, INP-1: every calculator keystroke that resolved used to
278
- * commit, so "100+50" committed 105 on its way to 150 — keksdose saved both, and its
279
- * threshold field, `disabled` while it saves, lost the calculator to the first.
280
- */
281
- onCommit?: (value: string) => void;
282
- /**
283
- * Why the amount cannot be changed — {@link NumberInput}'s `disabledReason` (0.34,
284
- * round 0.34 C2), for an amount that SAVES itself: a budget row's assigned cell, a
285
- * price committed on blur. `disabled` takes the field out of the tab order, so the
286
- * reason never reached a keyboard.
287
- *
288
- * With a reason the field stays in the tab order and shows its figure, `readOnly` (the
289
- * settled grey FIELD_BASE gives a `[readonly]` field) and `aria-disabled`. Nothing
290
- * changes the amount: the calculator and the phone's numpad are not offered, the
291
- * currency chip is a read-out rather than a picker, and neither blur nor Enter
292
- * settles — so `onChange`, `onCommit`, `onNegativeChange` and `onCurrencyChange` are
293
- * never called. Enter is swallowed, so the field does not submit the form around it.
294
- * The reason is a line under the field at Large and on a touch screen, else in the kit
295
- * {@link Tooltip} (`disabledReasonDisplay`), and on the input's `aria-describedby`,
296
- * between the caption and the error. Wins over `disabled`. {@link MoneyField} and
297
- * `RhfMoneyField` take it too.
298
- */
299
- disabledReason?: ReactNode;
300
- /**
301
- * Where the reason shows — {@link Button}'s `disabledReasonDisplay`: by default a line
302
- * under the field at Large and on a touch screen, the tooltip otherwise (§4 "No fact
303
- * only in a tooltip"; DUP-3, refactor audit 2026-10).
304
- */
305
- disabledReasonDisplay?: DisabledReasonDisplay;
306
- /**
307
- * This amount COMMITS — {@link Button}'s `commit`, NumberInput's: under a locked
308
- * {@link WriteLockProvider} it is locked the `disabledReason` way with the lock's reason
309
- * (which wins over its own). An amount that only reaches the server through its form's
310
- * Save leaves this off and stays editable under the lock; the Save takes `commit`. No
311
- * provider, or an unlocked one: no effect.
312
- */
313
- commit?: CommitScope;
314
- /** The `<input>`. A React 19 ref prop since 0.34 (MOD-4, refactor audit 2026-10); it
315
- * was `forwardRef`. */
316
- ref?: Ref<HTMLInputElement>;
317
- }
318
-
319
- /**
320
- * A settled figure, rounded to `digits` (half away from zero) and clamped to
321
- * `min`/`max`. Only a plain number is touched. A half-typed draft or an expression
322
- * comes back as it was. Rounding is `lib/round.ts`'s, shared with `roundToCurrency`
323
- * (BUG-11: this copy blanked "0.0000001" and a 22-digit figure on blur).
324
- */
325
- function settleAmount(text: string, digits: number | undefined, min?: number, max?: number): string {
326
- const t = text.trim();
327
- if (!/^-?\d*\.?\d*$/.test(t) || !/\d/.test(t)) return text;
328
- let n = Number(t);
329
- if (!Number.isFinite(n)) return text;
330
- if (digits !== undefined) n = roundHalfAway(n, digits);
331
- if (min !== undefined && n < min) n = min;
332
- if (max !== undefined && n > max) n = max;
333
- const out = formatResult(n);
334
- // Unchanged figures keep their own spelling ("12.50" stays "12.50").
335
- return Number(out) === Number(t) ? text : out;
336
- }
337
-
338
- // The locale's decimal mark and the grouping parse (kastlan 40, keksdose G1) live in
339
- // `lib/decimal-marks.ts`, read through the engine NumberInput and this field share
340
- // (`numeric-field.ts`, DUP-10).
341
-
342
- /**
343
- * The figure's colour per {@link AmountInputProps.tone} — public as `AMOUNT_TONE_CLASS`,
344
- * for a table cell or a test that must paint the same figure the same way (keksdose's
345
- * receipt lines, dev#556).
346
- *
347
- * The consuming app's ONE money palette (`--money-expense` / `--money-income`), not a
348
- * bespoke rose/emerald pairing: a figure being typed has to wear the same colour the same
349
- * figure will wear once it is a row in the table behind the form (Keksdose dev#434). The
350
- * utilities are unlayered and theme-aware, so no `dark:` variant is needed and they win
351
- * over the field's own text colour regardless of where `cn` puts them.
352
- */
353
- const TONE_CLASS: Readonly<Record<NonNullable<AmountInputProps["tone"]>, string>> = {
354
- neutral: "",
355
- outflow: "text-money-neg",
356
- inflow: "text-money-pos",
357
- };
358
- // Exported in 0.52 because keksdose's tests read it out of dist/components/amount-input.js
359
- // with a regex for `const TONE_CLASS` — the one reach into the kit's dist in three apps,
360
- // which a rename or a moved module breaks with no public change (MOD-8, refactor audit
361
- // 2026-10-30; 0.34's move failed 91 of keksdose's test files that way). The local name
362
- // stays until keksdose imports the export, so the bump itself breaks nothing.
363
- export { TONE_CLASS as AMOUNT_TONE_CLASS };
364
-
365
- // The shared chrome-less treatment at money size. `tabular-nums` so digits don't
366
- // reflow the figure as they are typed; FIELD_DISPLAY's own muted placeholder
367
- // colour is what keeps an EMPTY form from painting its zero in the direction tint
368
- // (`tone` is computed from 0, which reads as an inflow).
369
- const DISPLAY_INPUT_CLASS = cn(FIELD_DISPLAY, "text-4xl font-semibold leading-tight tracking-tight tabular-nums");
370
-
371
- /**
372
- * Is `text` the ANSWER to `previous`, or something typed OVER it?
373
- *
374
- * "The old text was a sum and the new one is bare" cannot tell those apart, and both
375
- * gestures are ordinary: select-all-and-retype after a typo, or backspacing "-20+"
376
- * back down to a fresh figure. Read as an answer, they move the direction chip — so
377
- * an outflow of 7 quietly booked +7.00 (live #201 rework).
378
- *
379
- * The question that does separate them is arithmetic, not shape: evaluate what the
380
- * text replaced and see whether this IS that number. "-12+30" → "18" still is, so a
381
- * sum that comes out positive still takes the chip with it; "-20+50" → "7" is not,
382
- * and "-20+" evaluates to nothing at all.
383
- */
384
- function isResultOf(previous: string, text: string, settle: (text: string) => string): boolean {
385
- const n = evaluateExpression(previous);
386
- // Compared settled, since the field rounds what the calculator hands it.
387
- return n !== null && settle(formatResult(n)) === text.trim();
388
- }
389
-
390
- export function AmountInput(props: AmountInputProps) {
391
- const {
392
- ref,
393
- value,
394
- onChange,
395
- currency,
396
- onCurrencyChange,
397
- placeholder,
398
- label,
399
- className,
400
- inputClassName,
401
- id,
402
- "aria-label": ariaLabel,
403
- "aria-required": ariaRequired,
404
- autoFocus,
405
- tone = "neutral",
406
- negative = false,
407
- onNegativeChange,
408
- align = "start",
409
- labels,
410
- currencyNames,
411
- currencyOptions,
412
- digits: digitsProp,
413
- min,
414
- max,
415
- onCommit,
416
- disabledReasonDisplay,
417
- } = props;
418
- const generatedId = useId();
419
- const fieldId = id ?? generatedId;
420
- // The sign is DISPLAYED, not stored (live #201 rework). `value` is the
421
- // magnitude; the minus is glued on here and taken off again in handleText, so
422
- // the two can never disagree and the caller can never double-apply it. Only in
423
- // front of a bare amount: an expression being typed ("12-30") owns its own
424
- // minus and has to survive keystroke-for-keystroke.
425
- const signOwned = onNegativeChange !== undefined;
426
- // The sign is DRAWN whenever `negative` says so, handler or not (keksdose live #366):
427
- // a read-only or disabled total ("−5.18") used to need a dummy `onNegativeChange`
428
- // just to show its minus. Without the handler there is nothing to toggle — a typed
429
- // minus simply stays in the text, as in any field without a direction control.
430
- const shown = negative && isBareAmount(value) ? `-${value}` : value;
431
- // What the user SEES is `shown` with the locale's decimal mark (kastlan 40: a
432
- // fr-CH user typed "1,5" and watched it turn into "1.5" under their fingers). Display only — `value`, `onChange`, the sign split and the settle all
433
- // stay dot-decimal, because that string is the contract: RhfMoneyField's
434
- // `parseAmount`, every app's `Number(value)` and the calculator's evaluator read
435
- // it. The way back is free: {@link sanitizeLive} already folds a typed "," into
436
- // ".", so a comma typed, pasted or tapped on the numpad lands as a dot.
437
- //
438
- // One character for one character, and no digit grouping: the caret stays where
439
- // the typist put it, and "1.000" cannot be read back as a thousand in one locale
440
- // and as one in the other. de-CH and it-CH are "." — CLDR says so, and this
441
- // follows `Intl` rather than a guess about a country. The field's own `locale`,
442
- // else the provider's (0.34, DUP-10).
443
- const locale = useKitLocale(props.locale);
444
- // Decimals the figure settles to: `digits`, else the currency's minor unit.
445
- const digits = digitsProp ?? currencyMinorDigits(currency);
446
- const settle = (text: string) => settleAmount(text, digits, min, max);
447
- // The engine NumberInput shares (DUP-10): the lock (focusable, `readOnly`, nothing
448
- // changes or settles — see `disabledReason`), the hint — a FieldHint is its words at
449
- // Large and on touch, §4 — the error, the description's order, the typist's draft
450
- // in the locale's mark, the calculator and the numpad. On a phone the OS keyboard
451
- // is suppressed for the numpad sheet (feedback #334), and the display shape keys off
452
- // the SAME phone layout, so the two can never drift apart on the breakpoint.
453
- //
454
- // A value the HOST set (not one typed here) is shown at the currency's minor unit
455
- // while the field is not being edited: an FX estimate of 93.4213 showed four
456
- // decimals (keksdose live #356). Display only — `value` is the host's, untouched.
457
- const numeric = useNumericField(props, {
458
- settle,
459
- display: (focused) => (focused ? shown : settleAmount(shown, digits)),
460
- });
461
- const { lock, locked, off, isMobile, asDisplay, showCalc, showNumpad, setFocused, mark, draft, setDraft, derived } =
462
- numeric;
463
- const invalid = numeric.isInvalid;
464
- // A locked or disabled chip is a read-out: picking a currency is a change too.
465
- const editable = !!onCurrencyChange && !locked && !off;
466
- // Room for the trailing controls — the calculator and the currency chip — once
467
- // measured, as NumberInput reserves its own (keksdose live #367, DUP-10): their
468
- // width, the track's `end-1` inset in the boxed shape, and NumberInput's 4px gap.
469
- // Before that (the first paint, and wherever there is no layout) the classes below
470
- // stand in. showCalc is always false on a phone, so the display shape only has to
471
- // clear the chip, by its own width rather than the boxed shape's room (feedback #430
472
- // rework: on a 375px screen 16px decide between a readable figure and a clipped one).
473
- const hasEnd = showCalc || Boolean(currency);
474
- const [endRef, endWidth] = useEndWidth(hasEnd);
475
- const trailingRoom = asDisplay
476
- ? currency
477
- ? editable
478
- ? "pe-16"
479
- : "pe-12"
480
- : undefined
481
- : showCalc
482
- ? currency
483
- ? editable
484
- ? "pe-24"
485
- : "pe-16"
486
- : "pe-10"
487
- : currency
488
- ? editable
489
- ? "pe-20"
490
- : "pe-14"
491
- : undefined;
492
- const innerRef = useRef<HTMLInputElement>(null);
493
- const setRefs = useMemo(() => mergeRefs(innerRef, ref), [ref]);
494
- // While the typist is typing, the field shows THEIR text ("1.234,5" stays exactly
495
- // that), not the value re-spelt: re-spelling turned a grouping "." into a "," under
496
- // their fingers, after which no rule could tell the two apart (keksdose G1). The
497
- // draft only while it says what the field holds AND holds nothing the live
498
- // sanitising would drop — a letter, a second decimal point (see `showsTyped`); a
499
- // value set from outside, a calculator result or a commit shows the derived spelling.
500
- const display =
501
- draft === null
502
- ? derived
503
- : (numeric.typedFor(shown) ??
504
- // The caller owns the sign: the typed "12" is shown as the "-12" it is.
505
- (signOwned && negative && shown.startsWith("-") && numeric.typedFor(shown.slice(1)) !== null
506
- ? `-${draft}`
507
- : derived));
508
- // Every route into the field — typing, the numpad sheet, the desktop
509
- // calculator, the blur/Enter commit — funnels through here, so the split is
510
- // written once and the four entry paths cannot drift.
511
- //
512
- // `previous` is the text this one REPLACES, and it is what says whether a bare
513
- // figure arriving here is an answer or a magnitude. For the three paths that
514
- // edit the field's own text that is simply what the field was showing; the
515
- // desktop calculator keeps its expression in a popover the field never sees,
516
- // so it passes it in (see `CalculatorButton`'s `onChange`).
517
- const handleText = (raw: string, previous: string = shown) => {
518
- const text = sanitizeLive(raw);
519
- if (!signOwned) {
520
- onChange(text);
521
- return;
522
- }
523
- const { sign, rest } = splitLeadingSign(text);
524
- if (sign) {
525
- // SET, not flip: re-reporting the same sign on every keystroke is a no-op.
526
- onNegativeChange(sign === "-");
527
- } else if (looksLikeExpression(previous) && isBareAmount(text) && isResultOf(previous, text, settle)) {
528
- // A calculation that just RESOLVED states its sign in both directions. The
529
- // figure it ran on is the SIGNED one the user could see — "-12+30" is +18 —
530
- // so a positive result has to move the chip too, or the field would answer
531
- // that sum with "-18" and contradict the arithmetic it just showed.
532
- //
533
- // Only when it really resolved, though: see {@link isResultOf}. A bare figure
534
- // arriving on top of an expression is far more often a replacement than an
535
- // answer, and reading it as an answer flips the direction of money.
536
- onNegativeChange(false);
537
- }
538
- onChange(sign ? rest : text);
539
- };
540
- const commit = () => {
541
- setDraft(null);
542
- const settled = settle(commitExpression(shown));
543
- handleText(settled);
544
- onCommit?.(settled);
545
- };
546
- const typed = (raw: string) => handleText(numeric.read(raw));
547
- // The currency list is CurrencySelect's (round 0.34 Wave 2, DUP-4) on the picker
548
- // family's core: the chip was a hand copy of it and had drifted (no wrap at Large, no
549
- // `options` subset, no check mark, no listbox id, no #308 width), and both were plain
550
- // buttons under a listbox promise. `filter: false`: the list filters its own rows.
551
- const core = useComboboxCore<string>({ filter: false, backCloses: true });
552
- // `chipRef`: the chip the currency list hangs off (Keksdose dev#548: portalled, so the
553
- // panel needs a real trigger rect rather than a relative parent). It is also where
554
- // Escape and a pick hand focus back (round 0.34 BUG-1): Safari does not focus a
555
- // clicked button, so "whatever held focus" is not the chip.
556
- const { open, setOpen, closeToTrigger, triggerRef: chipRef } = core;
557
- const listboxId = `${generatedId}-currencies`;
558
- // A lock arriving while the list is up closes it, as on CountrySelect — adjusted
559
- // while rendering, so no frame shows a list that can no longer be used.
560
- if (!editable && open) setOpen(false);
561
-
562
- // The currency chip's strings are the `currency` namespace — the same two
563
- // `CurrencySelect` resolves, under this component's older key names. The
564
- // calculator and the numpad resolve `calculator` themselves; `labels.calculator`
565
- // and `labels.pad` are handed straight through to them as overrides.
566
- // The two strings read out first, so the memo depends on them and not on the
567
- // caller's `labels` object (a new one every render) — what the React Compiler infers.
568
- const currencyLabel = labels?.currency;
569
- const currencySearchLabel = labels?.currencySearch;
570
- const currencyOverrides = useMemo(() => {
571
- const out: Partial<CurrencyLabels> = {};
572
- if (currencyLabel !== undefined) out.currency = currencyLabel;
573
- if (currencySearchLabel !== undefined) out.search = currencySearchLabel;
574
- return out;
575
- }, [currencyLabel, currencySearchLabel]);
576
- const currencyText = useKitLabels("currency", DEFAULT_CURRENCY_LABELS, currencyOverrides);
577
- const common = useKitLabels("common", DEFAULT_COMMON_LABELS);
578
-
579
- const selected = getCurrency(currency);
580
-
581
- return (
582
- <div {...dataAttributes(props)} className={cn("w-full", className)}>
583
- {/* Inner relative box holds the input + its absolutely-positioned
584
- trailing controls (calculator / currency), so those stay anchored to
585
- the INPUT even when the mobile math bar is rendered below (#334). It is
586
- the kit's FloatingField, which draws the label — floating, or sr-only in
587
- the display shape — and puts a FieldHint on the label's line, as it does
588
- for NumberInput. */}
589
- {/* Locked, the field sits in the reason's frame (LockedReason: the line, or the
590
- Tooltip), as NumberInput does; the root above keeps `className`, so nothing
591
- reflows. */}
592
- <LockedOrNot lock={lock} display={disabledReasonDisplay}>
593
- <FloatingField
594
- className="w-full"
595
- htmlFor={fieldId}
596
- label={label}
597
- srOnlyLabel={asDisplay}
598
- hint={numeric.hint.labelHint}
599
- >
600
- <input
601
- ref={setRefs}
602
- id={fieldId}
603
- aria-label={ariaLabel}
604
- type="text"
605
- // eslint-disable-next-line jsx-a11y/no-autofocus -- opt-in per call site (feedback #70)
606
- autoFocus={autoFocus}
607
- // On mobile suppress the OS keyboard so our numpad sheet owns entry; the
608
- // field keeps focus/caret. Desktop keeps the native decimal keypad.
609
- inputMode={isMobile ? "none" : "decimal"}
610
- autoComplete="off"
611
- disabled={off}
612
- // Locked: focusable, `readOnly`, `aria-disabled` — see `disabledReason`.
613
- readOnly={locked || undefined}
614
- aria-disabled={locked || undefined}
615
- // The floating-label pattern needs a blank placeholder for its
616
- // peer-placeholder-shown trick. The display shape has no floating label,
617
- // so it spends the placeholder on what an empty borderless form actually
618
- // needs: a zero to aim at, at full size. The caller supplies it because
619
- // only the app knows the locale's decimal separator.
620
- placeholder={asDisplay ? (placeholder ?? "0") : label !== undefined ? " " : placeholder}
621
- value={display}
622
- onChange={(e) => {
623
- if (!locked) typed(e.target.value);
624
- }}
625
- onFocus={() => setFocused(true)}
626
- onBlur={() => {
627
- // Nothing settles under the lock — not even a draft typed before it arrived,
628
- // which stays in the field for when it lifts.
629
- if (!locked) commit();
630
- setFocused(false);
631
- }}
632
- onKeyDown={(e) => {
633
- if (e.key !== "Enter") return;
634
- // Locked: Enter submits no form and settles nothing.
635
- if (locked) e.preventDefault();
636
- else commit();
637
- }}
638
- className={cn(
639
- // With a label, use the floating-input padding (pt-4 pb-1) like every
640
- // other labelled field so the value sits BELOW the floated label rather
641
- // than vertically centred where it overlaps the resting label
642
- // (feedback #314). FLOATING_INPUT_CLASS already bundles the peer +
643
- // transparent-placeholder bits.
644
- asDisplay ? DISPLAY_INPUT_CLASS : label !== undefined ? FLOATING_INPUT_CLASS : FIELD_BASE,
645
- // The plain end padding, with nothing trailing: cosmetic, so the caller's
646
- // to change (keksdose 0.24 — a symmetric `px-2` in a budget cell).
647
- !trailingRoom && (asDisplay ? "pe-0" : "pe-3"),
648
- // Centred display shape: centre in what is LEFT of the currency chip.
649
- // `text-center` alone would centre the figure in the whole box, i.e.
650
- // partly underneath the chip; the padding below is what takes the chip
651
- // out of the centring, and nothing is added at the start because a
652
- // mirrored reservation would spend the width twice (see `align`).
653
- asDisplay && align === "center" && "text-center",
654
- // Over the base class's own text colour.
655
- TONE_CLASS[tone],
656
- // The caller's, over all of the above — base, plain padding, alignment and
657
- // tone — and under only what the field needs to work (see `inputClassName`).
658
- inputClassName,
659
- // Room for the trailing controls, after the caller's so a `px-2` cannot run
660
- // the digits under the chip (NumberInput's order, which reserves its unit
661
- // and calculator the same way).
662
- trailingRoom,
663
- invalid && FIELD_INVALID,
664
- locked && "cursor-not-allowed",
665
- )}
666
- // The classes above are the fallback; once measured the field reserves exactly
667
- // its trailing controls' width, inline so it wins over every class (see
668
- // `trailingRoom`).
669
- style={hasEnd && endWidth != null ? { paddingInlineEnd: endWidth + (asDisplay ? 4 : 8) } : undefined}
670
- aria-invalid={invalid || undefined}
671
- aria-describedby={numeric.describedBy}
672
- aria-required={ariaRequired}
673
- />
674
- {/* The label is FloatingField's, after these children (the floating trick
675
- reads the input through `peer-*`). The display shape drops it VISUALLY,
676
- not from the accessibility tree: a 36px tinted figure at the top of a
677
- transaction form is legibly the amount, but a screen reader still needs
678
- the name, and callers that pass `label` without `aria-label` would
679
- otherwise be left with none. */}
680
- {/* Trailing controls share one flex track so the calculator icon and the
681
- currency suffix/picker sit side by side without overlapping. */}
682
- {/* The display shape has no box to inset from, so the controls align to the
683
- figure's own end edge and its baseline strip (`bottom-1`, matching the
684
- input's pb-1) instead of floating inside a field. */}
685
- <div
686
- // Measured for the input's end padding (see `trailingRoom`).
687
- ref={endRef}
688
- className={cn(
689
- "absolute flex items-center gap-0.5",
690
- // Logical `end-*`: the chip and the calculator are the figure's trailing
691
- // controls, so a right-to-left form carries them on the left.
692
- asDisplay ? "bottom-1 end-0" : "inset-y-1 end-1",
693
- )}
694
- >
695
- {showCalc && (
696
- <CalculatorButton
697
- // The mark the field shows but not the typist's grouping: the evaluator
698
- // reads either mark, and "1.234,5" is two of them. The result comes back
699
- // dot-decimal.
700
- value={derived}
701
- // Live: every result, settled, so the field never shows more decimals than
702
- // it will keep. The commit is the session's one (INP-1): its "=", or the pad
703
- // closing on a newer result — not each figure on the way to the result.
704
- onChange={(result, expression) => {
705
- setDraft(null);
706
- handleText(settle(result), expression);
707
- }}
708
- onCommit={(result) => onCommit?.(settle(result))}
709
- className="px-1.5"
710
- aria-label={labels?.calculatorTrigger}
711
- labels={labels?.calculator}
712
- />
713
- )}
714
- {currency && !editable && (
715
- <span
716
- aria-hidden
717
- className={cn(
718
- "pointer-events-none px-1 font-medium text-muted",
719
- // A text-xs chip next to a 36px figure reads as a stray footnote.
720
- asDisplay ? "text-sm" : "text-xs",
721
- )}
722
- >
723
- {currency}
724
- </span>
725
- )}
726
- {currency && editable && (
727
- <button
728
- ref={chipRef}
729
- type="button"
730
- onClick={() => setOpen((v) => !v)}
731
- // A button that opens a listbox, and says so: the chip is a control inside
732
- // a text field, not a field of its own, so not a combobox.
733
- aria-haspopup="listbox"
734
- aria-expanded={open}
735
- aria-controls={listboxId}
736
- aria-label={
737
- // "Currency: EUR" through `common.fieldValue`, not a template literal:
738
- // the colon-and-space is punctuation a translation has to own.
739
- selected ? common.fieldValue(currencyText.currency, selected.code) : currencyText.currency
740
- }
741
- className={cn(
742
- "flex items-center gap-1 rounded px-2 py-1 font-medium text-secondary hover:bg-hover",
743
- asDisplay ? "text-sm" : "text-xs",
744
- )}
745
- >
746
- {currency}
747
- <ChevronDown className="size-3" />
748
- </button>
749
- )}
750
- </div>
751
- {editable && (
752
- <CurrencyOptionList
753
- core={core}
754
- listboxId={listboxId}
755
- value={currency}
756
- codes={currencyOptions}
757
- currencyNames={currencyNames}
758
- locale={locale}
759
- searchPlaceholder={currencyText.search}
760
- // The phone sheet's title: what the chip is for.
761
- sheetTitle={currencyText.currency}
762
- onChoose={(code) => {
763
- onCurrencyChange?.(code);
764
- closeToTrigger();
765
- }}
766
- />
767
- )}
768
- </FloatingField>
769
- </LockedOrNot>
770
- {/* Outside the relative box, as NumberInput's caption is: the trailing
771
- controls are `inset-y-1` in it and would stretch down over a second line. */}
772
- <FieldCaption parts={numeric.hint} />
773
- {/* The news after the standing advice, as Select orders them. The root is
774
- already a steady box, so the message coming and going remounts nothing. */}
775
- {numeric.errorEl}
776
- {showNumpad && (
777
- <NumberPadSheet
778
- // Localised like the field it mirrors. Keys are typing, read by the
779
- // locale's marks like the keyboard's; "=" is a result, dot-decimal.
780
- value={display}
781
- onChange={typed}
782
- onResult={(result) => {
783
- setDraft(null);
784
- const settled = settle(result);
785
- handleText(settled);
786
- onCommit?.(settled);
787
- }}
788
- onDone={() => innerRef.current?.blur()}
789
- label={label}
790
- labels={labels?.pad}
791
- decimalMark={mark}
792
- />
793
- )}
794
- </div>
795
- );
796
- }
797
-
798
- /** The field in its lock's {@link LockedReason} while locked, as it is otherwise. A
799
- * component rather than a ternary so the field's JSX is written once. `block w-full`:
800
- * the frame's box stands where the field's own did. */
801
- function LockedOrNot({
802
- lock,
803
- display,
804
- children,
805
- }: {
806
- lock: LockReason;
807
- display: DisabledReasonDisplay | undefined;
808
- children: ReactNode;
809
- }) {
810
- if (!lock.locked) return <>{children}</>;
811
- return (
812
- <LockedReason lock={lock} display={display} className="block w-full">
813
- {children}
814
- </LockedReason>
815
- );
816
- }