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