@eifi1/ui-kit 0.51.4 → 0.51.5

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 (757) hide show
  1. package/README.md +3 -3
  2. package/dist/account/account-settings-labels.js.map +1 -1
  3. package/dist/account/account-settings.js +11 -9
  4. package/dist/account/account-settings.js.map +1 -1
  5. package/dist/account/delete-account-setting.js +56 -65
  6. package/dist/account/delete-account-setting.js.map +1 -1
  7. package/dist/account/email-change-setting-labels.js.map +1 -1
  8. package/dist/account/email-change-setting.js.map +1 -1
  9. package/dist/account/passkeys-setting.js.map +1 -1
  10. package/dist/account/sessions-setting.js.map +1 -1
  11. package/dist/admin/admin-action-confirm.js +1 -3
  12. package/dist/admin/admin-action-confirm.js.map +1 -1
  13. package/dist/admin/admin-action-log.js.map +1 -1
  14. package/dist/admin/admin-area-labels.js +4 -1
  15. package/dist/admin/admin-area-labels.js.map +1 -1
  16. package/dist/admin/admin-overview.js +19 -11
  17. package/dist/admin/admin-overview.js.map +1 -1
  18. package/dist/admin/admin-sections.js.map +1 -1
  19. package/dist/admin/admin-tool-links.d.ts +1 -1
  20. package/dist/admin/admin-tool-links.js +7 -1
  21. package/dist/admin/admin-tool-links.js.map +1 -1
  22. package/dist/admin/invitations-panel.js +2 -13
  23. package/dist/admin/invitations-panel.js.map +1 -1
  24. package/dist/admin/mail-test-card.js.map +1 -1
  25. package/dist/admin/reviewer-scope-editor.js +4 -11
  26. package/dist/admin/reviewer-scope-editor.js.map +1 -1
  27. package/dist/admin/role-select.js.map +1 -1
  28. package/dist/admin/user-roster.js +1 -9
  29. package/dist/admin/user-roster.js.map +1 -1
  30. package/dist/auth/accept-invitation.js.map +1 -1
  31. package/dist/auth/auth-errors.js.map +1 -1
  32. package/dist/auth/forgot-password-form.js +23 -31
  33. package/dist/auth/forgot-password-form.js.map +1 -1
  34. package/dist/auth/register-form.js.map +1 -1
  35. package/dist/auth/reset-password-form.js.map +1 -1
  36. package/dist/auth/sign-in-form.js +13 -5
  37. package/dist/auth/sign-in-form.js.map +1 -1
  38. package/dist/auth/verify-email.js +1 -8
  39. package/dist/auth/verify-email.js.map +1 -1
  40. package/dist/billing/billing-banner.js.map +1 -1
  41. package/dist/billing/billing-labels.js.map +1 -1
  42. package/dist/billing/checkout-processing.js.map +1 -1
  43. package/dist/billing/plan-card.js +91 -85
  44. package/dist/billing/plan-card.js.map +1 -1
  45. package/dist/billing/plan-limit-toast.js.map +1 -1
  46. package/dist/billing/plan-limit.js.map +1 -1
  47. package/dist/billing/plan-price.js.map +1 -1
  48. package/dist/billing/plan-switch.js.map +1 -1
  49. package/dist/billing/subscription-actions.js.map +1 -1
  50. package/dist/bin/eifi1-pay-page.mjs +6 -1
  51. package/dist/components/account-chips.js.map +1 -1
  52. package/dist/components/alert-banner.js +1 -5
  53. package/dist/components/alert-banner.js.map +1 -1
  54. package/dist/components/amount-input.js +29 -12
  55. package/dist/components/amount-input.js.map +1 -1
  56. package/dist/components/authed-image.js.map +1 -1
  57. package/dist/components/autocomplete.js.map +1 -1
  58. package/dist/components/bulk-action-bar.js +1 -4
  59. package/dist/components/bulk-action-bar.js.map +1 -1
  60. package/dist/components/button-group.js.map +1 -1
  61. package/dist/components/button-look.js.map +1 -1
  62. package/dist/components/button.js +1 -7
  63. package/dist/components/button.js.map +1 -1
  64. package/dist/components/calculator.js +5 -5
  65. package/dist/components/calculator.js.map +1 -1
  66. package/dist/components/calendar-heatmap.js +4 -10
  67. package/dist/components/calendar-heatmap.js.map +1 -1
  68. package/dist/components/card.js +1 -8
  69. package/dist/components/card.js.map +1 -1
  70. package/dist/components/chart-zoom-core.js +3 -17
  71. package/dist/components/chart-zoom-core.js.map +1 -1
  72. package/dist/components/chart.d.ts +1 -1
  73. package/dist/components/chart.js +4 -22
  74. package/dist/components/chart.js.map +1 -1
  75. package/dist/components/checkbox-group.js +1 -4
  76. package/dist/components/checkbox-group.js.map +1 -1
  77. package/dist/components/chip-input.js +4 -1
  78. package/dist/components/chip-input.js.map +1 -1
  79. package/dist/components/chip.js +10 -5
  80. package/dist/components/chip.js.map +1 -1
  81. package/dist/components/choice-card.js +58 -74
  82. package/dist/components/choice-card.js.map +1 -1
  83. package/dist/components/column-mapper-labels.js.map +1 -1
  84. package/dist/components/column-mapper.js +167 -227
  85. package/dist/components/column-mapper.js.map +1 -1
  86. package/dist/components/combobox-core.js +1 -4
  87. package/dist/components/combobox-core.js.map +1 -1
  88. package/dist/components/combobox.js +1 -4
  89. package/dist/components/combobox.js.map +1 -1
  90. package/dist/components/confirm-dialog.js.map +1 -1
  91. package/dist/components/copy-button.js.map +1 -1
  92. package/dist/components/country-select.d.ts +5 -4
  93. package/dist/components/country-select.js +3 -19
  94. package/dist/components/country-select.js.map +1 -1
  95. package/dist/components/currency-option-list.js +10 -8
  96. package/dist/components/currency-option-list.js.map +1 -1
  97. package/dist/components/currency-select.js +1 -6
  98. package/dist/components/currency-select.js.map +1 -1
  99. package/dist/components/danger-confirm.js.map +1 -1
  100. package/dist/components/data-table-cells.js.map +1 -1
  101. package/dist/components/data-table-column-settings.js.map +1 -1
  102. package/dist/components/data-table-filter-popover.js +2 -18
  103. package/dist/components/data-table-filter-popover.js.map +1 -1
  104. package/dist/components/data-table-filters.js.map +1 -1
  105. package/dist/components/data-table-fit.js.map +1 -1
  106. package/dist/components/data-table-groups.js +3 -1
  107. package/dist/components/data-table-groups.js.map +1 -1
  108. package/dist/components/data-table-head.js +44 -56
  109. package/dist/components/data-table-head.js.map +1 -1
  110. package/dist/components/data-table-mobile.js +31 -44
  111. package/dist/components/data-table-mobile.js.map +1 -1
  112. package/dist/components/data-table-pagination.js.map +1 -1
  113. package/dist/components/data-table-row-actions.js +19 -16
  114. package/dist/components/data-table-row-actions.js.map +1 -1
  115. package/dist/components/data-table-row.js.map +1 -1
  116. package/dist/components/data-table-shared.js.map +1 -1
  117. package/dist/components/data-table-sort.js.map +1 -1
  118. package/dist/components/data-table-virtual.js +4 -1
  119. package/dist/components/data-table-virtual.js.map +1 -1
  120. package/dist/components/data-table.js +30 -39
  121. package/dist/components/data-table.js.map +1 -1
  122. package/dist/components/date-picker.js +1 -6
  123. package/dist/components/date-picker.js.map +1 -1
  124. package/dist/components/date-range-picker.js.map +1 -1
  125. package/dist/components/description-list.js +10 -10
  126. package/dist/components/description-list.js.map +1 -1
  127. package/dist/components/dialog-frame.js +9 -2
  128. package/dist/components/dialog-frame.js.map +1 -1
  129. package/dist/components/disclosure.js +17 -27
  130. package/dist/components/disclosure.js.map +1 -1
  131. package/dist/components/dropdown.js +25 -35
  132. package/dist/components/dropdown.js.map +1 -1
  133. package/dist/components/empty-state.js.map +1 -1
  134. package/dist/components/entity-combobox.js.map +1 -1
  135. package/dist/components/error-boundary.js.map +1 -1
  136. package/dist/components/field-base.js +5 -5
  137. package/dist/components/field-base.js.map +1 -1
  138. package/dist/components/field-parts.d.ts +1 -1
  139. package/dist/components/field-parts.js +10 -14
  140. package/dist/components/field-parts.js.map +1 -1
  141. package/dist/components/field-sync.js +8 -10
  142. package/dist/components/field-sync.js.map +1 -1
  143. package/dist/components/file-button.js.map +1 -1
  144. package/dist/components/file-dropzone.js.map +1 -1
  145. package/dist/components/floating-panel.js +4 -1
  146. package/dist/components/floating-panel.js.map +1 -1
  147. package/dist/components/focus-ring.js.map +1 -1
  148. package/dist/components/form-actions.js.map +1 -1
  149. package/dist/components/grouped-picker.js +6 -8
  150. package/dist/components/grouped-picker.js.map +1 -1
  151. package/dist/components/hover-menu.js +1 -4
  152. package/dist/components/hover-menu.js.map +1 -1
  153. package/dist/components/iban-input-labels.js.map +1 -1
  154. package/dist/components/icon-button.js +4 -1
  155. package/dist/components/icon-button.js.map +1 -1
  156. package/dist/components/icon-picker.js +2 -7
  157. package/dist/components/icon-picker.js.map +1 -1
  158. package/dist/components/image-grid.js +41 -50
  159. package/dist/components/image-grid.js.map +1 -1
  160. package/dist/components/inline-edit-field.js.map +1 -1
  161. package/dist/components/inline-entity-combobox.js +2 -8
  162. package/dist/components/inline-entity-combobox.js.map +1 -1
  163. package/dist/components/input.js +14 -2
  164. package/dist/components/input.js.map +1 -1
  165. package/dist/components/jump-calendar.js +1 -7
  166. package/dist/components/jump-calendar.js.map +1 -1
  167. package/dist/components/legal-labels.js.map +1 -1
  168. package/dist/components/legal-page.js +14 -2
  169. package/dist/components/legal-page.js.map +1 -1
  170. package/dist/components/legal.js +12 -2
  171. package/dist/components/legal.js.map +1 -1
  172. package/dist/components/lightbox.js.map +1 -1
  173. package/dist/components/line-items.js +26 -36
  174. package/dist/components/line-items.js.map +1 -1
  175. package/dist/components/list.js +22 -10
  176. package/dist/components/list.js.map +1 -1
  177. package/dist/components/measured-grid.js +29 -53
  178. package/dist/components/measured-grid.js.map +1 -1
  179. package/dist/components/menu-item.js.map +1 -1
  180. package/dist/components/mini-calendar.js +13 -31
  181. package/dist/components/mini-calendar.js.map +1 -1
  182. package/dist/components/money-field.js.map +1 -1
  183. package/dist/components/month-picker.js +10 -21
  184. package/dist/components/month-picker.js.map +1 -1
  185. package/dist/components/multi-entity-combobox.js +3 -16
  186. package/dist/components/multi-entity-combobox.js.map +1 -1
  187. package/dist/components/multi-select.js.map +1 -1
  188. package/dist/components/nav-pills.js +10 -1
  189. package/dist/components/nav-pills.js.map +1 -1
  190. package/dist/components/number-field.js.map +1 -1
  191. package/dist/components/number-input.js +1 -7
  192. package/dist/components/number-input.js.map +1 -1
  193. package/dist/components/numpad-sheet.js +1 -4
  194. package/dist/components/numpad-sheet.js.map +1 -1
  195. package/dist/components/one-time-code-input.js +1 -7
  196. package/dist/components/one-time-code-input.js.map +1 -1
  197. package/dist/components/page-contents.js +13 -22
  198. package/dist/components/page-contents.js.map +1 -1
  199. package/dist/components/page-header.js +1 -11
  200. package/dist/components/page-header.js.map +1 -1
  201. package/dist/components/password-strength-labels.js.map +1 -1
  202. package/dist/components/password-strength.js +2 -8
  203. package/dist/components/password-strength.js.map +1 -1
  204. package/dist/components/phone-input.js +42 -57
  205. package/dist/components/phone-input.js.map +1 -1
  206. package/dist/components/picker-sheet.js.map +1 -1
  207. package/dist/components/pie-chart.js +1 -8
  208. package/dist/components/pie-chart.js.map +1 -1
  209. package/dist/components/popover.js.map +1 -1
  210. package/dist/components/progress-bar.js +16 -9
  211. package/dist/components/progress-bar.js.map +1 -1
  212. package/dist/components/qr-code.js +1 -8
  213. package/dist/components/qr-code.js.map +1 -1
  214. package/dist/components/row-actions.js +5 -1
  215. package/dist/components/row-actions.js.map +1 -1
  216. package/dist/components/search-field.js.map +1 -1
  217. package/dist/components/select.js +28 -38
  218. package/dist/components/select.js.map +1 -1
  219. package/dist/components/separator.js +1 -5
  220. package/dist/components/separator.js.map +1 -1
  221. package/dist/components/series-chart-axes.js +4 -1
  222. package/dist/components/series-chart-axes.js.map +1 -1
  223. package/dist/components/series-chart-budget.js.map +1 -1
  224. package/dist/components/series-chart-ticks.js.map +1 -1
  225. package/dist/components/series-chart.js +29 -45
  226. package/dist/components/series-chart.js.map +1 -1
  227. package/dist/components/settings-fields.js +21 -17
  228. package/dist/components/settings-fields.js.map +1 -1
  229. package/dist/components/share-card.js +4 -9
  230. package/dist/components/share-card.js.map +1 -1
  231. package/dist/components/sign-chip.js.map +1 -1
  232. package/dist/components/signature-pad.js +4 -13
  233. package/dist/components/signature-pad.js.map +1 -1
  234. package/dist/components/signed-amount.js +12 -5
  235. package/dist/components/signed-amount.js.map +1 -1
  236. package/dist/components/skeleton.js +2 -17
  237. package/dist/components/skeleton.js.map +1 -1
  238. package/dist/components/slider.js +13 -36
  239. package/dist/components/slider.js.map +1 -1
  240. package/dist/components/sparkline.js.map +1 -1
  241. package/dist/components/stat-tile.js +14 -10
  242. package/dist/components/stat-tile.js.map +1 -1
  243. package/dist/components/swatch-picker.js +14 -4
  244. package/dist/components/swatch-picker.js.map +1 -1
  245. package/dist/components/swipeable-row.d.ts +1 -1
  246. package/dist/components/swipeable-row.js +1 -8
  247. package/dist/components/swipeable-row.js.map +1 -1
  248. package/dist/components/table-skeleton.js +4 -1
  249. package/dist/components/table-skeleton.js.map +1 -1
  250. package/dist/components/table.js +12 -9
  251. package/dist/components/table.js.map +1 -1
  252. package/dist/components/tabs.js +5 -24
  253. package/dist/components/tabs.js.map +1 -1
  254. package/dist/components/text-link.js.map +1 -1
  255. package/dist/components/text.js.map +1 -1
  256. package/dist/components/tile-radio.js +1 -7
  257. package/dist/components/tile-radio.js.map +1 -1
  258. package/dist/components/time-input.js.map +1 -1
  259. package/dist/components/toast.js.map +1 -1
  260. package/dist/components/toggle-group.js +6 -1
  261. package/dist/components/toggle-group.js.map +1 -1
  262. package/dist/components/toggle-legend.js +2 -11
  263. package/dist/components/toggle-legend.js.map +1 -1
  264. package/dist/components/tooltip.js +2 -22
  265. package/dist/components/tooltip.js.map +1 -1
  266. package/dist/components/translation-review-editor.js +1 -4
  267. package/dist/components/translation-review-editor.js.map +1 -1
  268. package/dist/components/translation-review-parts.d.ts +1 -1
  269. package/dist/components/translation-review-parts.js +7 -1
  270. package/dist/components/translation-review-parts.js.map +1 -1
  271. package/dist/components/translation-review.js +18 -7
  272. package/dist/components/translation-review.js.map +1 -1
  273. package/dist/components/tree-view.js +14 -10
  274. package/dist/components/tree-view.js.map +1 -1
  275. package/dist/components/treemap.js +1 -13
  276. package/dist/components/treemap.js.map +1 -1
  277. package/dist/components/trigger-aria.js.map +1 -1
  278. package/dist/components/use-table-state.js +14 -11
  279. package/dist/components/use-table-state.js.map +1 -1
  280. package/dist/components/user-avatar.js +3 -26
  281. package/dist/components/user-avatar.js.map +1 -1
  282. package/dist/demo/demo-start.js +8 -4
  283. package/dist/demo/demo-start.js.map +1 -1
  284. package/dist/eslint/index.js +1 -1
  285. package/dist/feedback/feedback-attachment-labels.js.map +1 -1
  286. package/dist/feedback/feedback-attachment.js +1 -8
  287. package/dist/feedback/feedback-attachment.js.map +1 -1
  288. package/dist/feedback/feedback-capture.d.ts +1 -1
  289. package/dist/feedback/feedback-capture.js +3 -1
  290. package/dist/feedback/feedback-capture.js.map +1 -1
  291. package/dist/feedback/feedback-comment-thread.js +27 -13
  292. package/dist/feedback/feedback-comment-thread.js.map +1 -1
  293. package/dist/feedback/feedback-context.js +1 -4
  294. package/dist/feedback/feedback-context.js.map +1 -1
  295. package/dist/feedback/feedback-dialog.js.map +1 -1
  296. package/dist/feedback/feedback-inbox.js.map +1 -1
  297. package/dist/feedback/feedback-public-list.js +7 -1
  298. package/dist/feedback/feedback-public-list.js.map +1 -1
  299. package/dist/feedback/feedback-record.js +1 -5
  300. package/dist/feedback/feedback-record.js.map +1 -1
  301. package/dist/feedback/feedback-replies.js +25 -10
  302. package/dist/feedback/feedback-replies.js.map +1 -1
  303. package/dist/feedback/feedback-row-detail.js.map +1 -1
  304. package/dist/feedback/feedback-status-undo.js.map +1 -1
  305. package/dist/feedback/feedback-submit-dialog.js.map +1 -1
  306. package/dist/feedback/feedback-table.js +4 -1
  307. package/dist/feedback/feedback-table.js.map +1 -1
  308. package/dist/feedback/feedback-thread.js +2 -13
  309. package/dist/feedback/feedback-thread.js.map +1 -1
  310. package/dist/feedback/feedback-vocabulary.js.map +1 -1
  311. package/dist/feedback/feedback-vote-button.js.map +1 -1
  312. package/dist/hooks/use-anchored-rect.js.map +1 -1
  313. package/dist/hooks/use-document-title.js.map +1 -1
  314. package/dist/hooks/use-file-drop.js.map +1 -1
  315. package/dist/hooks/use-file-picker-labels.js.map +1 -1
  316. package/dist/hooks/use-file-picker.js.map +1 -1
  317. package/dist/hooks/use-focus-trap.js.map +1 -1
  318. package/dist/hooks/use-overlay-history.js +10 -5
  319. package/dist/hooks/use-overlay-history.js.map +1 -1
  320. package/dist/hooks/use-row-swipe.d.ts +1 -1
  321. package/dist/hooks/use-row-swipe.js +1 -6
  322. package/dist/hooks/use-row-swipe.js.map +1 -1
  323. package/dist/i18n/defaults.js +1 -4
  324. package/dist/i18n/defaults.js.map +1 -1
  325. package/dist/i18n/german.js +4 -1
  326. package/dist/i18n/german.js.map +1 -1
  327. package/dist/i18n/kit-labels.js +2 -8
  328. package/dist/i18n/kit-labels.js.map +1 -1
  329. package/dist/i18n/languages.js.map +1 -1
  330. package/dist/i18n/locales/en.js +4 -1
  331. package/dist/i18n/locales/en.js.map +2 -2
  332. package/dist/i18n/locales/es.js +4 -1
  333. package/dist/i18n/locales/es.js.map +1 -1
  334. package/dist/i18n/locales/fr.js +4 -1
  335. package/dist/i18n/locales/fr.js.map +1 -1
  336. package/dist/i18n/locales/hu.js +4 -1
  337. package/dist/i18n/locales/hu.js.map +1 -1
  338. package/dist/i18n/locales/it.js +4 -1
  339. package/dist/i18n/locales/it.js.map +1 -1
  340. package/dist/i18n/locales/zh.js.map +1 -1
  341. package/dist/i18n/plurals.js.map +1 -1
  342. package/dist/i18n/review.js +13 -7
  343. package/dist/i18n/review.js.map +1 -1
  344. package/dist/i18n/shared-labels.js.map +1 -1
  345. package/dist/index.d.ts +16 -16
  346. package/dist/index.js +40 -23
  347. package/dist/index.js.map +1 -1
  348. package/dist/landing/access.js +1 -4
  349. package/dist/landing/access.js.map +1 -1
  350. package/dist/landing/landing-sections.js +35 -38
  351. package/dist/landing/landing-sections.js.map +1 -1
  352. package/dist/landing/page-seo.js.map +1 -1
  353. package/dist/lib/calc.js.map +1 -1
  354. package/dist/lib/clipboard-minus.js.map +1 -1
  355. package/dist/lib/dates.js.map +1 -1
  356. package/dist/lib/decimal-marks.js.map +1 -1
  357. package/dist/lib/device-settings.js +2 -1
  358. package/dist/lib/device-settings.js.map +1 -1
  359. package/dist/lib/direction.js.map +1 -1
  360. package/dist/lib/iban.js.map +1 -1
  361. package/dist/lib/logger.js +1 -5
  362. package/dist/lib/logger.js.map +1 -1
  363. package/dist/lib/person-name.js.map +1 -1
  364. package/dist/lib/phone.js.map +1 -1
  365. package/dist/lib/qr-encode.js +344 -8
  366. package/dist/lib/qr-encode.js.map +1 -1
  367. package/dist/lib/session-refresh.js.map +1 -1
  368. package/dist/lib/table-text.js +15 -3
  369. package/dist/lib/table-text.js.map +1 -1
  370. package/dist/lib/text-match.d.ts +4 -0
  371. package/dist/lib/text-match.js.map +1 -1
  372. package/dist/lib/translation-review.js.map +1 -1
  373. package/dist/notifications/notification-inbox.js +63 -44
  374. package/dist/notifications/notification-inbox.js.map +1 -1
  375. package/dist/notifications/notification-parts.js.map +1 -1
  376. package/dist/notifications/notification-types-setting.js.map +1 -1
  377. package/dist/notifications/notifications-labels.js.map +1 -1
  378. package/dist/notifications/push-device-setting.js +6 -1
  379. package/dist/notifications/push-device-setting.js.map +1 -1
  380. package/dist/notifications/push-devices-setting.js.map +1 -1
  381. package/dist/notifications/push-worker.js.map +1 -1
  382. package/dist/notifications/quiet-hours-setting.js.map +1 -1
  383. package/dist/notifications/use-push-device.js +4 -1
  384. package/dist/notifications/use-push-device.js.map +1 -1
  385. package/dist/offline/pwa-update-prompt.d.ts +1 -1
  386. package/dist/offline/pwa-update-prompt.js +7 -1
  387. package/dist/offline/pwa-update-prompt.js.map +1 -1
  388. package/dist/offline/query-persistence.js.map +1 -1
  389. package/dist/offline.d.ts +1 -1
  390. package/dist/offline.js +6 -1
  391. package/dist/offline.js.map +1 -1
  392. package/dist/pay/pay.css +8 -1
  393. package/dist/rhf/fields.d.ts +1 -2
  394. package/dist/rhf/fields.js +1 -10
  395. package/dist/rhf/fields.js.map +1 -1
  396. package/dist/rhf/form-core.js +1 -4
  397. package/dist/rhf/form-core.js.map +1 -1
  398. package/dist/rhf/line-items.js.map +1 -1
  399. package/dist/rhf/use-rhf-wizard-step.js.map +1 -1
  400. package/dist/search/command-palette.js +71 -62
  401. package/dist/search/command-palette.js.map +1 -1
  402. package/dist/search/global-search.js +34 -5
  403. package/dist/search/global-search.js.map +1 -1
  404. package/dist/search/search-index.js.map +1 -1
  405. package/dist/settings/device-reset-setting.js +1 -6
  406. package/dist/settings/device-reset-setting.js.map +1 -1
  407. package/dist/settings/settings-heading.js.map +1 -1
  408. package/dist/settings/settings-layout.js +9 -20
  409. package/dist/settings/settings-layout.js.map +1 -1
  410. package/dist/settings/use-settings-route.js.map +1 -1
  411. package/dist/shell/app-shell.js +62 -31
  412. package/dist/shell/app-shell.js.map +1 -1
  413. package/dist/shell/auth-layout.js +1 -10
  414. package/dist/shell/auth-layout.js.map +1 -1
  415. package/dist/shell/dev-menu.js +12 -6
  416. package/dist/shell/dev-menu.js.map +1 -1
  417. package/dist/shell/option-switcher-menu.js.map +1 -1
  418. package/dist/shell/sync-status-indicator.js +7 -6
  419. package/dist/shell/sync-status-indicator.js.map +1 -1
  420. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  421. package/dist/shell/topbar-action-menu.js.map +1 -1
  422. package/dist/shell/topbar-controls.js +1 -10
  423. package/dist/shell/topbar-controls.js.map +1 -1
  424. package/dist/shell/tour-menu.js +9 -1
  425. package/dist/shell/tour-menu.js.map +1 -1
  426. package/dist/sync/db.js.map +1 -1
  427. package/dist/sync/engine.js +24 -6
  428. package/dist/sync/engine.js.map +1 -1
  429. package/dist/sync.d.ts +2 -2
  430. package/dist/sync.js +7 -1
  431. package/dist/sync.js.map +1 -1
  432. package/dist/testing/css-variables.js.map +1 -1
  433. package/dist/testing/index.d.ts +1 -1
  434. package/dist/testing/index.js +1 -3
  435. package/dist/testing/index.js.map +1 -1
  436. package/dist/testing/react.js.map +1 -1
  437. package/dist/testing/viewport.js +7 -4
  438. package/dist/testing/viewport.js.map +1 -1
  439. package/dist/theme/contrast-tokens.js +13 -2
  440. package/dist/theme/contrast-tokens.js.map +1 -1
  441. package/dist/theme/palette-derive.d.ts +1 -1
  442. package/dist/theme/palette-derive.js +18 -29
  443. package/dist/theme/palette-derive.js.map +1 -1
  444. package/dist/theme/palette-presets.js.map +1 -1
  445. package/dist/theme/palette-store.js.map +1 -1
  446. package/dist/theme/text-size.js.map +1 -1
  447. package/dist/theme/theme-store.js +1 -3
  448. package/dist/theme/theme-store.js.map +1 -1
  449. package/dist/tour/tour-catalogue.js.map +1 -1
  450. package/dist/tour/tour-dock.js +5 -1
  451. package/dist/tour/tour-dock.js.map +1 -1
  452. package/dist/tour/tour-engine.js +1 -4
  453. package/dist/tour/tour-engine.js.map +1 -1
  454. package/dist/tour/tour.js +21 -12
  455. package/dist/tour/tour.js.map +1 -1
  456. package/dist/tour/use-tour-progress.js.map +1 -1
  457. package/dist/tour/use-tour-url-sync.js.map +1 -1
  458. package/dist/wizard/stepper-nav.js +3 -24
  459. package/dist/wizard/stepper-nav.js.map +1 -1
  460. package/dist/wizard/types.js.map +1 -1
  461. package/dist/wizard/use-wizard.js +24 -28
  462. package/dist/wizard/use-wizard.js.map +1 -1
  463. package/dist/wizard/validation.js.map +1 -1
  464. package/dist/wizard/wizard-context.js.map +1 -1
  465. package/dist/wizard/wizard-step.d.ts +1 -1
  466. package/dist/wizard/wizard-step.js +1 -8
  467. package/dist/wizard/wizard-step.js.map +1 -1
  468. package/dist/wizard/wizard-summary.js.map +1 -1
  469. package/package.json +5 -2
  470. package/src/account/account-settings-labels.ts +1 -2
  471. package/src/account/account-settings.tsx +11 -17
  472. package/src/account/delete-account-setting.tsx +1 -6
  473. package/src/account/email-change-setting-labels.ts +1 -2
  474. package/src/account/email-change-setting.tsx +3 -1
  475. package/src/account/passkeys-setting.tsx +1 -3
  476. package/src/account/sessions-setting.tsx +4 -2
  477. package/src/admin/admin-action-confirm.tsx +4 -7
  478. package/src/admin/admin-action-log.tsx +29 -29
  479. package/src/admin/admin-area-labels.ts +4 -1
  480. package/src/admin/admin-overview.tsx +8 -2
  481. package/src/admin/admin-sections.tsx +3 -1
  482. package/src/admin/admin-tool-links.tsx +7 -1
  483. package/src/admin/invitations-panel.tsx +5 -11
  484. package/src/admin/mail-test-card.tsx +1 -2
  485. package/src/admin/reviewer-scope-editor.tsx +4 -9
  486. package/src/admin/role-select.tsx +4 -2
  487. package/src/admin/user-roster.tsx +2 -11
  488. package/src/auth/accept-invitation.tsx +1 -7
  489. package/src/auth/auth-errors.ts +1 -6
  490. package/src/auth/forgot-password-form.tsx +2 -7
  491. package/src/auth/register-form.tsx +7 -8
  492. package/src/auth/reset-password-form.tsx +2 -5
  493. package/src/auth/sign-in-form.tsx +15 -14
  494. package/src/auth/verify-email.tsx +2 -7
  495. package/src/billing/billing-banner.tsx +3 -7
  496. package/src/billing/billing-labels.ts +6 -4
  497. package/src/billing/checkout-processing.ts +0 -1
  498. package/src/billing/plan-card.tsx +9 -8
  499. package/src/billing/plan-limit-toast.tsx +1 -2
  500. package/src/billing/plan-limit.ts +1 -2
  501. package/src/billing/plan-price.ts +1 -4
  502. package/src/billing/plan-switch.tsx +1 -2
  503. package/src/billing/subscription-actions.tsx +5 -2
  504. package/src/components/account-chips.tsx +1 -7
  505. package/src/components/alert-banner.tsx +2 -8
  506. package/src/components/amount-input.tsx +206 -178
  507. package/src/components/authed-image.tsx +7 -4
  508. package/src/components/autocomplete.tsx +7 -9
  509. package/src/components/bulk-action-bar.tsx +2 -7
  510. package/src/components/button-group.tsx +1 -2
  511. package/src/components/button-look.ts +6 -17
  512. package/src/components/button.tsx +1 -4
  513. package/src/components/calculator.tsx +6 -9
  514. package/src/components/calendar-heatmap.tsx +5 -10
  515. package/src/components/card.tsx +9 -13
  516. package/src/components/chart-zoom-core.tsx +6 -33
  517. package/src/components/chart.tsx +8 -31
  518. package/src/components/checkbox-group.tsx +1 -4
  519. package/src/components/chip-input.tsx +6 -6
  520. package/src/components/chip.tsx +14 -26
  521. package/src/components/choice-card.tsx +4 -18
  522. package/src/components/column-mapper-labels.ts +3 -10
  523. package/src/components/column-mapper.tsx +33 -122
  524. package/src/components/combobox-core.tsx +12 -42
  525. package/src/components/combobox.tsx +2 -6
  526. package/src/components/confirm-dialog.tsx +1 -3
  527. package/src/components/copy-button.tsx +2 -4
  528. package/src/components/country-select.tsx +9 -21
  529. package/src/components/currency-option-list.tsx +13 -14
  530. package/src/components/currency-select.tsx +2 -7
  531. package/src/components/danger-confirm.tsx +8 -9
  532. package/src/components/data-table-cells.tsx +1 -2
  533. package/src/components/data-table-column-settings.tsx +1 -3
  534. package/src/components/data-table-filter-popover.tsx +5 -19
  535. package/src/components/data-table-filters.ts +1 -6
  536. package/src/components/data-table-fit.ts +1 -3
  537. package/src/components/data-table-groups.tsx +3 -1
  538. package/src/components/data-table-head.tsx +27 -45
  539. package/src/components/data-table-mobile.tsx +99 -108
  540. package/src/components/data-table-pagination.tsx +2 -6
  541. package/src/components/data-table-row-actions.tsx +25 -24
  542. package/src/components/data-table-row.tsx +16 -17
  543. package/src/components/data-table-shared.tsx +10 -16
  544. package/src/components/data-table-sort.ts +1 -2
  545. package/src/components/data-table-virtual.ts +9 -4
  546. package/src/components/data-table.tsx +489 -501
  547. package/src/components/date-picker.tsx +1 -7
  548. package/src/components/date-range-picker.tsx +3 -13
  549. package/src/components/description-list.tsx +7 -13
  550. package/src/components/dialog-frame.tsx +12 -3
  551. package/src/components/disclosure.tsx +8 -12
  552. package/src/components/dropdown.tsx +3 -11
  553. package/src/components/empty-state.tsx +1 -3
  554. package/src/components/entity-combobox.tsx +2 -6
  555. package/src/components/error-boundary.tsx +7 -7
  556. package/src/components/field-base.tsx +8 -14
  557. package/src/components/field-parts.tsx +12 -23
  558. package/src/components/field-sync.tsx +7 -11
  559. package/src/components/file-button.tsx +7 -3
  560. package/src/components/file-dropzone.tsx +7 -12
  561. package/src/components/floating-panel.tsx +44 -51
  562. package/src/components/focus-ring.ts +1 -2
  563. package/src/components/form-actions.tsx +1 -4
  564. package/src/components/grouped-picker.tsx +6 -8
  565. package/src/components/hover-menu.tsx +1 -4
  566. package/src/components/iban-input-labels.ts +1 -2
  567. package/src/components/icon-button.tsx +46 -48
  568. package/src/components/icon-picker.tsx +4 -17
  569. package/src/components/image-grid.tsx +1 -6
  570. package/src/components/inline-edit-field.tsx +1 -5
  571. package/src/components/inline-entity-combobox.tsx +6 -21
  572. package/src/components/input.tsx +14 -2
  573. package/src/components/jump-calendar.tsx +2 -6
  574. package/src/components/legal-labels.ts +1 -2
  575. package/src/components/legal-page.tsx +18 -7
  576. package/src/components/legal.tsx +14 -5
  577. package/src/components/lightbox.tsx +1 -3
  578. package/src/components/line-items.tsx +7 -15
  579. package/src/components/list.tsx +29 -25
  580. package/src/components/measured-grid.tsx +8 -30
  581. package/src/components/menu-item.tsx +1 -3
  582. package/src/components/mini-calendar.tsx +129 -159
  583. package/src/components/money-field.tsx +4 -2
  584. package/src/components/month-picker.tsx +14 -21
  585. package/src/components/multi-entity-combobox.tsx +6 -26
  586. package/src/components/multi-select.tsx +5 -9
  587. package/src/components/nav-pills.tsx +10 -2
  588. package/src/components/number-field.tsx +18 -15
  589. package/src/components/number-input.tsx +3 -19
  590. package/src/components/numpad-sheet.tsx +9 -13
  591. package/src/components/one-time-code-input.tsx +6 -11
  592. package/src/components/page-contents.tsx +2 -9
  593. package/src/components/page-header.tsx +5 -10
  594. package/src/components/password-strength-labels.ts +1 -2
  595. package/src/components/password-strength.tsx +6 -9
  596. package/src/components/phone-input.tsx +2 -13
  597. package/src/components/picker-sheet.tsx +2 -5
  598. package/src/components/pie-chart.tsx +6 -12
  599. package/src/components/popover.tsx +2 -1
  600. package/src/components/progress-bar.tsx +16 -25
  601. package/src/components/qr-code.tsx +2 -9
  602. package/src/components/row-actions.tsx +9 -1
  603. package/src/components/search-field.tsx +4 -5
  604. package/src/components/select.tsx +2 -10
  605. package/src/components/separator.tsx +1 -5
  606. package/src/components/series-chart-axes.ts +5 -5
  607. package/src/components/series-chart-budget.ts +1 -4
  608. package/src/components/series-chart-ticks.ts +1 -4
  609. package/src/components/series-chart.tsx +43 -83
  610. package/src/components/settings-fields.tsx +20 -15
  611. package/src/components/share-card.tsx +6 -14
  612. package/src/components/sign-chip.tsx +16 -16
  613. package/src/components/signature-pad.tsx +21 -13
  614. package/src/components/signed-amount.tsx +6 -14
  615. package/src/components/skeleton.tsx +2 -13
  616. package/src/components/slider.tsx +9 -20
  617. package/src/components/sparkline.tsx +2 -13
  618. package/src/components/stat-tile.tsx +13 -24
  619. package/src/components/swatch-picker.tsx +8 -3
  620. package/src/components/swipeable-row.tsx +2 -11
  621. package/src/components/table-skeleton.tsx +4 -1
  622. package/src/components/table.tsx +12 -8
  623. package/src/components/tabs.tsx +24 -39
  624. package/src/components/text-link.tsx +6 -6
  625. package/src/components/text.tsx +1 -2
  626. package/src/components/tile-radio.tsx +6 -19
  627. package/src/components/time-input.tsx +4 -5
  628. package/src/components/toast.tsx +3 -12
  629. package/src/components/toggle-group.tsx +9 -9
  630. package/src/components/toggle-legend.tsx +4 -16
  631. package/src/components/tooltip.tsx +9 -48
  632. package/src/components/translation-review-editor.tsx +4 -4
  633. package/src/components/translation-review-parts.tsx +7 -1
  634. package/src/components/translation-review.tsx +15 -16
  635. package/src/components/tree-view.tsx +17 -20
  636. package/src/components/treemap.tsx +3 -15
  637. package/src/components/trigger-aria.ts +1 -4
  638. package/src/components/use-table-state.ts +16 -17
  639. package/src/components/user-avatar.tsx +4 -21
  640. package/src/demo/demo-start.tsx +8 -4
  641. package/src/feedback/feedback-attachment-labels.ts +2 -1
  642. package/src/feedback/feedback-attachment.tsx +16 -29
  643. package/src/feedback/feedback-capture.ts +3 -1
  644. package/src/feedback/feedback-comment-thread.tsx +9 -6
  645. package/src/feedback/feedback-context.tsx +1 -4
  646. package/src/feedback/feedback-dialog.tsx +3 -4
  647. package/src/feedback/feedback-inbox.tsx +3 -9
  648. package/src/feedback/feedback-public-list.tsx +7 -1
  649. package/src/feedback/feedback-record.ts +6 -14
  650. package/src/feedback/feedback-replies.tsx +10 -5
  651. package/src/feedback/feedback-row-detail.tsx +2 -5
  652. package/src/feedback/feedback-status-undo.ts +1 -4
  653. package/src/feedback/feedback-submit-dialog.tsx +4 -4
  654. package/src/feedback/feedback-table.tsx +12 -8
  655. package/src/feedback/feedback-thread.tsx +4 -16
  656. package/src/feedback/feedback-vocabulary.ts +72 -82
  657. package/src/feedback/feedback-vote-button.tsx +9 -8
  658. package/src/hooks/use-anchored-rect.ts +1 -4
  659. package/src/hooks/use-document-title.ts +3 -1
  660. package/src/hooks/use-file-drop.ts +1 -3
  661. package/src/hooks/use-file-picker-labels.ts +1 -2
  662. package/src/hooks/use-file-picker.tsx +1 -5
  663. package/src/hooks/use-focus-trap.ts +1 -2
  664. package/src/hooks/use-overlay-history.ts +10 -5
  665. package/src/hooks/use-row-swipe.ts +1 -6
  666. package/src/i18n/defaults.ts +1 -4
  667. package/src/i18n/german.ts +33 -49
  668. package/src/i18n/kit-labels.tsx +5 -20
  669. package/src/i18n/languages.ts +2 -8
  670. package/src/i18n/locales/en.ts +11 -31
  671. package/src/i18n/locales/es.ts +35 -49
  672. package/src/i18n/locales/fr.ts +34 -51
  673. package/src/i18n/locales/hu.ts +26 -37
  674. package/src/i18n/locales/it.ts +35 -52
  675. package/src/i18n/locales/zh.ts +14 -32
  676. package/src/i18n/plurals.ts +4 -1
  677. package/src/i18n/review.ts +18 -7
  678. package/src/i18n/shared-labels.ts +1 -2
  679. package/src/index.ts +106 -32
  680. package/src/landing/access.ts +2 -7
  681. package/src/landing/landing-sections.tsx +14 -15
  682. package/src/landing/page-seo.ts +1 -3
  683. package/src/lib/calc.ts +4 -1
  684. package/src/lib/clipboard-minus.ts +4 -1
  685. package/src/lib/dates.ts +2 -10
  686. package/src/lib/decimal-marks.ts +1 -3
  687. package/src/lib/device-settings.ts +2 -1
  688. package/src/lib/direction.ts +1 -3
  689. package/src/lib/iban.ts +89 -9
  690. package/src/lib/logger.ts +1 -5
  691. package/src/lib/person-name.ts +1 -3
  692. package/src/lib/phone.ts +5 -8
  693. package/src/lib/qr-encode.ts +32 -8
  694. package/src/lib/session-refresh.ts +5 -6
  695. package/src/lib/table-text.ts +24 -6
  696. package/src/lib/text-match.ts +15 -3
  697. package/src/lib/translation-review.ts +1 -3
  698. package/src/notifications/notification-inbox.tsx +17 -4
  699. package/src/notifications/notification-parts.tsx +1 -2
  700. package/src/notifications/notification-types-setting.tsx +19 -18
  701. package/src/notifications/notifications-labels.ts +1 -2
  702. package/src/notifications/push-device-setting.tsx +7 -1
  703. package/src/notifications/push-devices-setting.tsx +7 -3
  704. package/src/notifications/push-worker.ts +10 -2
  705. package/src/notifications/quiet-hours-setting.tsx +4 -1
  706. package/src/notifications/use-push-device.ts +4 -1
  707. package/src/offline/pwa-update-prompt.tsx +7 -1
  708. package/src/offline/query-persistence.ts +9 -6
  709. package/src/offline.ts +6 -1
  710. package/src/rhf/fields.tsx +50 -19
  711. package/src/rhf/form-core.tsx +2 -6
  712. package/src/rhf/line-items.tsx +5 -7
  713. package/src/rhf/use-rhf-wizard-step.ts +3 -12
  714. package/src/search/command-palette.tsx +15 -23
  715. package/src/search/global-search.tsx +38 -8
  716. package/src/search/search-index.ts +5 -1
  717. package/src/settings/device-reset-setting.tsx +5 -8
  718. package/src/settings/settings-heading.tsx +3 -1
  719. package/src/settings/settings-layout.tsx +6 -13
  720. package/src/settings/use-settings-route.ts +4 -3
  721. package/src/shell/app-shell.tsx +48 -24
  722. package/src/shell/auth-layout.tsx +1 -6
  723. package/src/shell/dev-menu.tsx +12 -6
  724. package/src/shell/option-switcher-menu.tsx +1 -3
  725. package/src/shell/sync-status-indicator.tsx +14 -12
  726. package/src/shell/top-bar-parts-labels.ts +1 -3
  727. package/src/shell/topbar-action-menu.tsx +9 -8
  728. package/src/shell/topbar-controls.tsx +5 -19
  729. package/src/shell/tour-menu.tsx +9 -1
  730. package/src/sync/db.ts +5 -1
  731. package/src/sync/engine.ts +44 -12
  732. package/src/sync.ts +16 -2
  733. package/src/testing/css-variables.ts +1 -2
  734. package/src/testing/index.ts +1 -6
  735. package/src/testing/react.ts +1 -2
  736. package/src/testing/viewport.ts +9 -9
  737. package/src/theme/contrast-tokens.ts +13 -2
  738. package/src/theme/palette-derive.ts +24 -50
  739. package/src/theme/palette-presets.ts +0 -1
  740. package/src/theme/palette-store.ts +1 -4
  741. package/src/theme/text-size.ts +1 -1
  742. package/src/theme/theme-store.ts +2 -6
  743. package/src/tour/tour-catalogue.tsx +4 -2
  744. package/src/tour/tour-dock.ts +5 -1
  745. package/src/tour/tour-engine.ts +2 -6
  746. package/src/tour/tour.tsx +28 -12
  747. package/src/tour/use-tour-progress.ts +8 -2
  748. package/src/tour/use-tour-url-sync.ts +3 -1
  749. package/src/vite-env.d.ts +1 -4
  750. package/src/wizard/stepper-nav.tsx +10 -35
  751. package/src/wizard/types.ts +1 -4
  752. package/src/wizard/use-wizard.ts +28 -43
  753. package/src/wizard/validation.ts +1 -5
  754. package/src/wizard/wizard-context.tsx +2 -6
  755. package/src/wizard/wizard-step.tsx +1 -8
  756. package/src/wizard/wizard-summary.tsx +2 -6
  757. package/tokens.css +393 -152
@@ -3,13 +3,7 @@ import { ChevronDown } from "lucide-react";
3
3
  import type { ReactNode, Ref } from "react";
4
4
  import { CurrencyOptionList, getCurrency } from "./currency-option-list";
5
5
  import { useComboboxCore } from "./combobox-core";
6
- import {
7
- FIELD_BASE,
8
- FIELD_DISPLAY,
9
- FIELD_INVALID,
10
- FLOATING_INPUT_CLASS,
11
- FloatingField,
12
- } from "./field-base";
6
+ import { FIELD_BASE, FIELD_DISPLAY, FIELD_INVALID, FLOATING_INPUT_CLASS, FloatingField } from "./field-base";
13
7
  import { cn } from "../lib/cn";
14
8
  import { currencyMinorDigits } from "../lib/format";
15
9
  import { roundHalfAway } from "../lib/round";
@@ -316,7 +310,6 @@ export interface AmountInputProps extends FieldHelpProps, DataAttributes {
316
310
  ref?: Ref<HTMLInputElement>;
317
311
  }
318
312
 
319
-
320
313
  /**
321
314
  * A settled figure, rounded to `digits` (half away from zero) and clamped to
322
315
  * `min`/`max`. Only a plain number is touched. A half-typed draft or an expression
@@ -356,10 +349,7 @@ const TONE_CLASS: Record<"neutral" | "outflow" | "inflow", string> = {
356
349
  // reflow the figure as they are typed; FIELD_DISPLAY's own muted placeholder
357
350
  // colour is what keeps an EMPTY form from painting its zero in the direction tint
358
351
  // (`tone` is computed from 0, which reads as an inflow).
359
- const DISPLAY_INPUT_CLASS = cn(
360
- FIELD_DISPLAY,
361
- "text-4xl font-semibold leading-tight tracking-tight tabular-nums",
362
- );
352
+ const DISPLAY_INPUT_CLASS = cn(FIELD_DISPLAY, "text-4xl font-semibold leading-tight tracking-tight tabular-nums");
363
353
 
364
354
  /**
365
355
  * Is `text` the ANSWER to `previous`, or something typed OVER it?
@@ -381,7 +371,33 @@ function isResultOf(previous: string, text: string, settle: (text: string) => st
381
371
  }
382
372
 
383
373
  export function AmountInput(props: AmountInputProps) {
384
- const { ref, value, onChange, currency, onCurrencyChange, placeholder, label, className, inputClassName, id, "aria-label": ariaLabel, "aria-required": ariaRequired, autoFocus, tone = "neutral", negative = false, onNegativeChange, align = "start", labels, currencyNames, currencyOptions, digits: digitsProp, min, max, onCommit, disabledReasonDisplay } = props;
374
+ const {
375
+ ref,
376
+ value,
377
+ onChange,
378
+ currency,
379
+ onCurrencyChange,
380
+ placeholder,
381
+ label,
382
+ className,
383
+ inputClassName,
384
+ id,
385
+ "aria-label": ariaLabel,
386
+ "aria-required": ariaRequired,
387
+ autoFocus,
388
+ tone = "neutral",
389
+ negative = false,
390
+ onNegativeChange,
391
+ align = "start",
392
+ labels,
393
+ currencyNames,
394
+ currencyOptions,
395
+ digits: digitsProp,
396
+ min,
397
+ max,
398
+ onCommit,
399
+ disabledReasonDisplay,
400
+ } = props;
385
401
  const generatedId = useId();
386
402
  const fieldId = id ?? generatedId;
387
403
  // The sign is DISPLAYED, not stored (live #201 rework). `value` is the
@@ -440,10 +456,22 @@ export function AmountInput(props: AmountInputProps) {
440
456
  const hasEnd = showCalc || Boolean(currency);
441
457
  const [endRef, endWidth] = useEndWidth(hasEnd);
442
458
  const trailingRoom = asDisplay
443
- ? currency ? (editable ? "pe-16" : "pe-12") : undefined
459
+ ? currency
460
+ ? editable
461
+ ? "pe-16"
462
+ : "pe-12"
463
+ : undefined
444
464
  : showCalc
445
- ? currency ? (editable ? "pe-24" : "pe-16") : "pe-10"
446
- : currency ? (editable ? "pe-20" : "pe-14") : undefined;
465
+ ? currency
466
+ ? editable
467
+ ? "pe-24"
468
+ : "pe-16"
469
+ : "pe-10"
470
+ : currency
471
+ ? editable
472
+ ? "pe-20"
473
+ : "pe-14"
474
+ : undefined;
447
475
  const innerRef = useRef<HTMLInputElement>(null);
448
476
  const setRefs = useMemo(() => mergeRefs(innerRef, ref), [ref]);
449
477
  // While the typist is typing, the field shows THEIR text ("1.234,5" stays exactly
@@ -545,180 +573,180 @@ export function AmountInput(props: AmountInputProps) {
545
573
  Tooltip), as NumberInput does; the root above keeps `className`, so nothing
546
574
  reflows. */}
547
575
  <LockedOrNot lock={lock} display={disabledReasonDisplay}>
548
- <FloatingField
549
- className="w-full"
550
- htmlFor={fieldId}
551
- label={label}
552
- srOnlyLabel={asDisplay}
553
- hint={numeric.hint.labelHint}
554
- >
555
- <input
556
- ref={setRefs}
557
- id={fieldId}
558
- aria-label={ariaLabel}
559
- type="text"
560
- // eslint-disable-next-line jsx-a11y/no-autofocus -- opt-in per call site (feedback #70)
561
- autoFocus={autoFocus}
562
- // On mobile suppress the OS keyboard so our numpad sheet owns entry; the
563
- // field keeps focus/caret. Desktop keeps the native decimal keypad.
564
- inputMode={isMobile ? "none" : "decimal"}
565
- autoComplete="off"
566
- disabled={off}
567
- // Locked: focusable, `readOnly`, `aria-disabled` — see `disabledReason`.
568
- readOnly={locked || undefined}
569
- aria-disabled={locked || undefined}
570
- // The floating-label pattern needs a blank placeholder for its
571
- // peer-placeholder-shown trick. The display shape has no floating label,
572
- // so it spends the placeholder on what an empty borderless form actually
573
- // needs: a zero to aim at, at full size. The caller supplies it because
574
- // only the app knows the locale's decimal separator.
575
- placeholder={asDisplay ? (placeholder ?? "0") : label !== undefined ? " " : placeholder}
576
- value={display}
577
- onChange={(e) => {
578
- if (!locked) typed(e.target.value);
579
- }}
580
- onFocus={() => setFocused(true)}
581
- onBlur={() => {
582
- // Nothing settles under the lock — not even a draft typed before it arrived,
583
- // which stays in the field for when it lifts.
584
- if (!locked) commit();
585
- setFocused(false);
586
- }}
587
- onKeyDown={(e) => {
588
- if (e.key !== "Enter") return;
589
- // Locked: Enter submits no form and settles nothing.
590
- if (locked) e.preventDefault();
591
- else commit();
592
- }}
593
- className={cn(
594
- // With a label, use the floating-input padding (pt-4 pb-1) like every
595
- // other labelled field so the value sits BELOW the floated label rather
596
- // than vertically centred where it overlaps the resting label
597
- // (feedback #314). FLOATING_INPUT_CLASS already bundles the peer +
598
- // transparent-placeholder bits.
599
- asDisplay ? DISPLAY_INPUT_CLASS : label !== undefined ? FLOATING_INPUT_CLASS : FIELD_BASE,
600
- // The plain end padding, with nothing trailing: cosmetic, so the caller's
601
- // to change (keksdose 0.24 — a symmetric `px-2` in a budget cell).
602
- !trailingRoom && (asDisplay ? "pe-0" : "pe-3"),
603
- // Centred display shape: centre in what is LEFT of the currency chip.
604
- // `text-center` alone would centre the figure in the whole box, i.e.
605
- // partly underneath the chip; the padding below is what takes the chip
606
- // out of the centring, and nothing is added at the start because a
607
- // mirrored reservation would spend the width twice (see `align`).
608
- asDisplay && align === "center" && "text-center",
609
- // Over the base class's own text colour.
610
- TONE_CLASS[tone],
611
- // The caller's, over all of the above — base, plain padding, alignment and
612
- // tone — and under only what the field needs to work (see `inputClassName`).
613
- inputClassName,
614
- // Room for the trailing controls, after the caller's so a `px-2` cannot run
615
- // the digits under the chip (NumberInput's order, which reserves its unit
616
- // and calculator the same way).
617
- trailingRoom,
618
- invalid && FIELD_INVALID,
619
- locked && "cursor-not-allowed",
620
- )}
621
- // The classes above are the fallback; once measured the field reserves exactly
622
- // its trailing controls' width, inline so it wins over every class (see
623
- // `trailingRoom`).
624
- style={hasEnd && endWidth != null ? { paddingInlineEnd: endWidth + (asDisplay ? 4 : 8) } : undefined}
625
- aria-invalid={invalid || undefined}
626
- aria-describedby={numeric.describedBy}
627
- aria-required={ariaRequired}
628
- />
629
- {/* The label is FloatingField's, after these children (the floating trick
576
+ <FloatingField
577
+ className="w-full"
578
+ htmlFor={fieldId}
579
+ label={label}
580
+ srOnlyLabel={asDisplay}
581
+ hint={numeric.hint.labelHint}
582
+ >
583
+ <input
584
+ ref={setRefs}
585
+ id={fieldId}
586
+ aria-label={ariaLabel}
587
+ type="text"
588
+ // eslint-disable-next-line jsx-a11y/no-autofocus -- opt-in per call site (feedback #70)
589
+ autoFocus={autoFocus}
590
+ // On mobile suppress the OS keyboard so our numpad sheet owns entry; the
591
+ // field keeps focus/caret. Desktop keeps the native decimal keypad.
592
+ inputMode={isMobile ? "none" : "decimal"}
593
+ autoComplete="off"
594
+ disabled={off}
595
+ // Locked: focusable, `readOnly`, `aria-disabled` — see `disabledReason`.
596
+ readOnly={locked || undefined}
597
+ aria-disabled={locked || undefined}
598
+ // The floating-label pattern needs a blank placeholder for its
599
+ // peer-placeholder-shown trick. The display shape has no floating label,
600
+ // so it spends the placeholder on what an empty borderless form actually
601
+ // needs: a zero to aim at, at full size. The caller supplies it because
602
+ // only the app knows the locale's decimal separator.
603
+ placeholder={asDisplay ? (placeholder ?? "0") : label !== undefined ? " " : placeholder}
604
+ value={display}
605
+ onChange={(e) => {
606
+ if (!locked) typed(e.target.value);
607
+ }}
608
+ onFocus={() => setFocused(true)}
609
+ onBlur={() => {
610
+ // Nothing settles under the lock — not even a draft typed before it arrived,
611
+ // which stays in the field for when it lifts.
612
+ if (!locked) commit();
613
+ setFocused(false);
614
+ }}
615
+ onKeyDown={(e) => {
616
+ if (e.key !== "Enter") return;
617
+ // Locked: Enter submits no form and settles nothing.
618
+ if (locked) e.preventDefault();
619
+ else commit();
620
+ }}
621
+ className={cn(
622
+ // With a label, use the floating-input padding (pt-4 pb-1) like every
623
+ // other labelled field so the value sits BELOW the floated label rather
624
+ // than vertically centred where it overlaps the resting label
625
+ // (feedback #314). FLOATING_INPUT_CLASS already bundles the peer +
626
+ // transparent-placeholder bits.
627
+ asDisplay ? DISPLAY_INPUT_CLASS : label !== undefined ? FLOATING_INPUT_CLASS : FIELD_BASE,
628
+ // The plain end padding, with nothing trailing: cosmetic, so the caller's
629
+ // to change (keksdose 0.24 — a symmetric `px-2` in a budget cell).
630
+ !trailingRoom && (asDisplay ? "pe-0" : "pe-3"),
631
+ // Centred display shape: centre in what is LEFT of the currency chip.
632
+ // `text-center` alone would centre the figure in the whole box, i.e.
633
+ // partly underneath the chip; the padding below is what takes the chip
634
+ // out of the centring, and nothing is added at the start because a
635
+ // mirrored reservation would spend the width twice (see `align`).
636
+ asDisplay && align === "center" && "text-center",
637
+ // Over the base class's own text colour.
638
+ TONE_CLASS[tone],
639
+ // The caller's, over all of the above — base, plain padding, alignment and
640
+ // tone — and under only what the field needs to work (see `inputClassName`).
641
+ inputClassName,
642
+ // Room for the trailing controls, after the caller's so a `px-2` cannot run
643
+ // the digits under the chip (NumberInput's order, which reserves its unit
644
+ // and calculator the same way).
645
+ trailingRoom,
646
+ invalid && FIELD_INVALID,
647
+ locked && "cursor-not-allowed",
648
+ )}
649
+ // The classes above are the fallback; once measured the field reserves exactly
650
+ // its trailing controls' width, inline so it wins over every class (see
651
+ // `trailingRoom`).
652
+ style={hasEnd && endWidth != null ? { paddingInlineEnd: endWidth + (asDisplay ? 4 : 8) } : undefined}
653
+ aria-invalid={invalid || undefined}
654
+ aria-describedby={numeric.describedBy}
655
+ aria-required={ariaRequired}
656
+ />
657
+ {/* The label is FloatingField's, after these children (the floating trick
630
658
  reads the input through `peer-*`). The display shape drops it VISUALLY,
631
659
  not from the accessibility tree: a 36px tinted figure at the top of a
632
660
  transaction form is legibly the amount, but a screen reader still needs
633
661
  the name, and callers that pass `label` without `aria-label` would
634
662
  otherwise be left with none. */}
635
- {/* Trailing controls share one flex track so the calculator icon and the
663
+ {/* Trailing controls share one flex track so the calculator icon and the
636
664
  currency suffix/picker sit side by side without overlapping. */}
637
- {/* The display shape has no box to inset from, so the controls align to the
665
+ {/* The display shape has no box to inset from, so the controls align to the
638
666
  figure's own end edge and its baseline strip (`bottom-1`, matching the
639
667
  input's pb-1) instead of floating inside a field. */}
640
- <div
641
- // Measured for the input's end padding (see `trailingRoom`).
642
- ref={endRef}
643
- className={cn(
644
- "absolute flex items-center gap-0.5",
645
- // Logical `end-*`: the chip and the calculator are the figure's trailing
646
- // controls, so a right-to-left form carries them on the left.
647
- asDisplay ? "bottom-1 end-0" : "inset-y-1 end-1",
648
- )}
649
- >
650
- {showCalc && (
651
- <CalculatorButton
652
- // The mark the field shows but not the typist's grouping: the evaluator
653
- // reads either mark, and "1.234,5" is two of them. The result comes back
654
- // dot-decimal.
655
- value={derived}
656
- onChange={(result, expression) => {
657
- setDraft(null);
658
- const settled = settle(result);
659
- handleText(settled, expression);
660
- onCommit?.(settled);
661
- }}
662
- className="px-1.5"
663
- aria-label={labels?.calculatorTrigger}
664
- labels={labels?.calculator}
665
- />
666
- )}
667
- {currency && !editable && (
668
- <span
669
- aria-hidden
668
+ <div
669
+ // Measured for the input's end padding (see `trailingRoom`).
670
+ ref={endRef}
670
671
  className={cn(
671
- "pointer-events-none px-1 font-medium text-muted",
672
- // A text-xs chip next to a 36px figure reads as a stray footnote.
673
- asDisplay ? "text-sm" : "text-xs",
672
+ "absolute flex items-center gap-0.5",
673
+ // Logical `end-*`: the chip and the calculator are the figure's trailing
674
+ // controls, so a right-to-left form carries them on the left.
675
+ asDisplay ? "bottom-1 end-0" : "inset-y-1 end-1",
674
676
  )}
675
677
  >
676
- {currency}
677
- </span>
678
- )}
679
- {currency && editable && (
680
- <button
681
- ref={chipRef}
682
- type="button"
683
- onClick={() => setOpen((v) => !v)}
684
- // A button that opens a listbox, and says so: the chip is a control inside
685
- // a text field, not a field of its own, so not a combobox.
686
- aria-haspopup="listbox"
687
- aria-expanded={open}
688
- aria-controls={listboxId}
689
- aria-label={
690
- // "Currency: EUR" through `common.fieldValue`, not a template literal:
691
- // the colon-and-space is punctuation a translation has to own.
692
- selected ? common.fieldValue(currencyText.currency, selected.code) : currencyText.currency
693
- }
694
- className={cn(
695
- "flex items-center gap-1 rounded px-2 py-1 font-medium text-secondary hover:bg-hover",
696
- asDisplay ? "text-sm" : "text-xs",
678
+ {showCalc && (
679
+ <CalculatorButton
680
+ // The mark the field shows but not the typist's grouping: the evaluator
681
+ // reads either mark, and "1.234,5" is two of them. The result comes back
682
+ // dot-decimal.
683
+ value={derived}
684
+ onChange={(result, expression) => {
685
+ setDraft(null);
686
+ const settled = settle(result);
687
+ handleText(settled, expression);
688
+ onCommit?.(settled);
689
+ }}
690
+ className="px-1.5"
691
+ aria-label={labels?.calculatorTrigger}
692
+ labels={labels?.calculator}
693
+ />
697
694
  )}
698
- >
699
- {currency}
700
- <ChevronDown className="size-3" />
701
- </button>
702
- )}
703
- </div>
704
- {editable && (
705
- <CurrencyOptionList
706
- core={core}
707
- listboxId={listboxId}
708
- value={currency}
709
- codes={currencyOptions}
710
- currencyNames={currencyNames}
711
- locale={locale}
712
- searchPlaceholder={currencyText.search}
713
- // The phone sheet's title: what the chip is for.
714
- sheetTitle={currencyText.currency}
715
- onChoose={(code) => {
716
- onCurrencyChange?.(code);
717
- closeToTrigger();
718
- }}
719
- />
720
- )}
721
- </FloatingField>
695
+ {currency && !editable && (
696
+ <span
697
+ aria-hidden
698
+ className={cn(
699
+ "pointer-events-none px-1 font-medium text-muted",
700
+ // A text-xs chip next to a 36px figure reads as a stray footnote.
701
+ asDisplay ? "text-sm" : "text-xs",
702
+ )}
703
+ >
704
+ {currency}
705
+ </span>
706
+ )}
707
+ {currency && editable && (
708
+ <button
709
+ ref={chipRef}
710
+ type="button"
711
+ onClick={() => setOpen((v) => !v)}
712
+ // A button that opens a listbox, and says so: the chip is a control inside
713
+ // a text field, not a field of its own, so not a combobox.
714
+ aria-haspopup="listbox"
715
+ aria-expanded={open}
716
+ aria-controls={listboxId}
717
+ aria-label={
718
+ // "Currency: EUR" through `common.fieldValue`, not a template literal:
719
+ // the colon-and-space is punctuation a translation has to own.
720
+ selected ? common.fieldValue(currencyText.currency, selected.code) : currencyText.currency
721
+ }
722
+ className={cn(
723
+ "flex items-center gap-1 rounded px-2 py-1 font-medium text-secondary hover:bg-hover",
724
+ asDisplay ? "text-sm" : "text-xs",
725
+ )}
726
+ >
727
+ {currency}
728
+ <ChevronDown className="size-3" />
729
+ </button>
730
+ )}
731
+ </div>
732
+ {editable && (
733
+ <CurrencyOptionList
734
+ core={core}
735
+ listboxId={listboxId}
736
+ value={currency}
737
+ codes={currencyOptions}
738
+ currencyNames={currencyNames}
739
+ locale={locale}
740
+ searchPlaceholder={currencyText.search}
741
+ // The phone sheet's title: what the chip is for.
742
+ sheetTitle={currencyText.currency}
743
+ onChoose={(code) => {
744
+ onCurrencyChange?.(code);
745
+ closeToTrigger();
746
+ }}
747
+ />
748
+ )}
749
+ </FloatingField>
722
750
  </LockedOrNot>
723
751
  {/* Outside the relative box, as NumberInput's caption is: the trailing
724
752
  controls are `inset-y-1` in it and would stretch down over a second line. */}
@@ -22,8 +22,7 @@ export interface AuthedImageLabels {
22
22
  // Defined in ./authed-image-labels, which holds no component code (0.34, KS U8).
23
23
  export { DEFAULT_AUTHED_IMAGE_LABELS };
24
24
 
25
- export interface AuthedImageProps
26
- extends Omit<ImgHTMLAttributes<HTMLImageElement>, "src" | "alt" | "children"> {
25
+ export interface AuthedImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, "src" | "alt" | "children"> {
27
26
  /** The image's URL — an API path when a {@link fetcher} is given. */
28
27
  src: string | null | undefined;
29
28
  /** Required: an image without a text alternative is a gap a reader falls into.
@@ -188,7 +187,9 @@ export function ImageStates({
188
187
  ))}
189
188
  {failed &&
190
189
  // `=== undefined`, not `??`: `null` is the caller asking for nothing at all.
191
- (errorFallback !== undefined ? errorFallback : (
190
+ (errorFallback !== undefined ? (
191
+ errorFallback
192
+ ) : (
192
193
  <span
193
194
  // `role="img"` with the alt as its name: the picture that failed still
194
195
  // occupies its place in the reading order, and "couldn't be loaded" is
@@ -198,7 +199,9 @@ export function ImageStates({
198
199
  className="flex h-full min-h-16 w-full flex-col items-center justify-center gap-1 bg-hover p-2 text-center text-xs text-muted"
199
200
  >
200
201
  <ImageOff aria-hidden className="size-5 shrink-0" />
201
- <span aria-hidden className="line-clamp-2">{labels.loadError}</span>
202
+ <span aria-hidden className="line-clamp-2">
203
+ {labels.loadError}
204
+ </span>
202
205
  </span>
203
206
  ))}
204
207
  </span>
@@ -44,10 +44,11 @@ import type { CommitScope } from "./write-lock";
44
44
  * are omitted. Everything else reaches the `<input>`, the way it does on {@link Input}.
45
45
  */
46
46
  export interface AutocompleteProps<V extends string | number = string>
47
- extends Omit<
48
- ComponentPropsWithoutRef<"input">,
49
- "value" | "defaultValue" | "onChange" | "onSelect" | "children" | "type" | "size"
50
- >,
47
+ extends
48
+ Omit<
49
+ ComponentPropsWithoutRef<"input">,
50
+ "value" | "defaultValue" | "onChange" | "onSelect" | "children" | "type" | "size"
51
+ >,
51
52
  FieldHelpProps {
52
53
  /** What is in the field. Controlled, and never reset by the component: opening,
53
54
  * closing and a failed lookup all leave it exactly as typed. */
@@ -334,8 +335,7 @@ export function Autocomplete<V extends string | number = string>(props: Autocomp
334
335
  const nativeSize = typeof size === "number" ? size : undefined;
335
336
  // The caller's name wins; else the floating label, by reference so a non-string
336
337
  // label still names the field.
337
- const labelledBy =
338
- ariaLabel === undefined ? (ariaLabelledBy ?? (hasLabel ? labelId : undefined)) : undefined;
338
+ const labelledBy = ariaLabel === undefined ? (ariaLabelledBy ?? (hasLabel ? labelId : undefined)) : undefined;
339
339
  // While locked the field sits in the reason's Tooltip — in a fragment with a hidden
340
340
  // copy of the reason, Button's anatomy; `block` so a full-width field stays full width.
341
341
  const withLock = (box: ReactNode) =>
@@ -611,9 +611,7 @@ export function Autocomplete<V extends string | number = string>(props: Autocomp
611
611
  </span>
612
612
  )}
613
613
  <span className="min-w-0 flex-1">
614
- <span className="block truncate-until-large text-primary">
615
- {o.label}
616
- </span>
614
+ <span className="block truncate-until-large text-primary">{o.label}</span>
617
615
  {o.sublabel && (
618
616
  <span
619
617
  className={cn(
@@ -329,9 +329,7 @@ export function BulkActionBar({
329
329
  no room, so it was the item squeezed to nothing instead of a line breaking.
330
330
  Its own width is its basis now; `truncate` is left for a label too long for a
331
331
  line on its own. */}
332
- <span className="min-w-0 flex-auto truncate text-sm font-medium text-primary">
333
- {labels.selected(shownCount)}
334
- </span>
332
+ <span className="min-w-0 flex-auto truncate text-sm font-medium text-primary">{labels.selected(shownCount)}</span>
335
333
  {/* `contents`, so the caller's controls are flex items of the bar itself. */}
336
334
  <div className="contents">{children}</div>
337
335
  {!floating && clear}
@@ -352,10 +350,7 @@ export function BulkActionBar({
352
350
  {toolbar}
353
351
  <div
354
352
  data-bulk-action-bar-panel=""
355
- className={cn(
356
- "border-t border-subtle px-3 py-3",
357
- floating && "max-h-[60dvh] overflow-y-auto",
358
- )}
353
+ className={cn("border-t border-subtle px-3 py-3", floating && "max-h-[60dvh] overflow-y-auto")}
359
354
  >
360
355
  {panel}
361
356
  </div>
@@ -86,8 +86,7 @@ const ELEVATED_JOINED = "bg-surface shadow-lg";
86
86
  // `elevated`, gapped: there is no frame, so each disc carries the shadow. Aimed at the
87
87
  // control, not the tooltip's square wrapper span, whose shadow would be a box round a
88
88
  // round disc.
89
- const ELEVATED_GAPPED =
90
- "[&>button]:shadow-md [&>a]:shadow-md [&>*>button]:shadow-md [&>*>a]:shadow-md";
89
+ const ELEVATED_GAPPED = "[&>button]:shadow-md [&>a]:shadow-md [&>*>button]:shadow-md [&>*>a]:shadow-md";
91
90
 
92
91
  export interface ButtonGroupProps extends Omit<ComponentPropsWithRef<"div">, "role"> {
93
92
  /** `horizontal` (default): side by side, in reading order. `vertical`: stacked —
@@ -28,13 +28,7 @@ import type { KitLinkComponent, KitLinkProps } from "../i18n/kit-labels";
28
28
  * same look; a development build warns once per name). They are removed in 0.51, and
29
29
  * `primary` will not come back with another meaning.
30
30
  */
31
- export type ButtonVariant =
32
- | "default"
33
- | "accent"
34
- | "secondary"
35
- | "ghost"
36
- | "danger"
37
- | "link";
31
+ export type ButtonVariant = "default" | "accent" | "secondary" | "ghost" | "danger" | "link";
38
32
 
39
33
  // Shared base ring for every button-styled element. Kept as a named const so the
40
34
  // <Button> component and the {@link buttonClasses} helper draw from one source and
@@ -116,10 +110,8 @@ export const buttonVariantClasses: Record<ButtonVariant, string> = {
116
110
  "border border-subtle bg-surface-2 text-primary hover:bg-active focus-visible:ring-brand",
117
111
  secondary: `border border-subtle bg-transparent text-primary ${HOVER_INK} focus-visible:ring-brand`,
118
112
  ghost: `bg-transparent text-primary ${HOVER_INK} focus-visible:ring-brand`,
119
- danger:
120
- "bg-danger text-danger-contrast hover:bg-danger-hover focus-visible:ring-danger-strong",
121
- accent:
122
- "bg-brand text-brand-contrast hover:bg-brand-hover focus-visible:ring-brand",
113
+ danger: "bg-danger text-danger-contrast hover:bg-danger-hover focus-visible:ring-danger-strong",
114
+ accent: "bg-brand text-brand-contrast hover:bg-brand-hover focus-visible:ring-brand",
123
115
  // A text link that is still a `<button>` — keksdose's six hand-rolled
124
116
  // `<button className="text-brand underline">` sites ("Resend code", "Show all",
125
117
  // "Undo" in a toast…), which act rather than navigate and so must not be anchors.
@@ -132,8 +124,7 @@ export const buttonVariantClasses: Record<ButtonVariant, string> = {
132
124
  // colour-roles §13.3 decision 8): `--brand` is solved as a mark (3:1), and on More
133
125
  // contrast's darker light well Moss's read 3.68:1; the derived dark brands sit at 3.0
134
126
  // as text too. Both modes, since `contrast:` does not split them.
135
- link:
136
- "rounded-sm p-0 bg-transparent text-brand underline-offset-4 hover:underline focus-visible:ring-brand contrast:text-brand-muted",
127
+ link: "rounded-sm p-0 bg-transparent text-brand underline-offset-4 hover:underline focus-visible:ring-brand contrast:text-brand-muted",
137
128
  };
138
129
 
139
130
  /**
@@ -168,8 +159,7 @@ export type ButtonTone = "default" | "muted" | "danger";
168
159
  // so tailwind-merge drops the link's `contrast:text-brand-muted` (0.36): a quiet link
169
160
  // stays quiet under More contrast. On `ghost` it reads the same either way.
170
161
  const BUTTON_TONES: Record<Exclude<ButtonTone, "default">, string> = {
171
- muted:
172
- "text-secondary hover:text-primary disabled:hover:text-secondary contrast:text-secondary",
162
+ muted: "text-secondary hover:text-primary disabled:hover:text-secondary contrast:text-secondary",
173
163
  danger:
174
164
  "text-secondary hover:text-danger focus-visible:ring-danger-strong disabled:hover:text-secondary contrast:text-secondary",
175
165
  };
@@ -185,8 +175,7 @@ const BUTTON_BOXED_DANGER: Partial<Record<ButtonVariant, string>> = {
185
175
  // IconButton's danger tone (0.33). On B′'s translucent ink `--danger` fell to 4.2:1
186
176
  // over a light page.
187
177
  ghost: "hover:bg-danger-soft",
188
- secondary:
189
- "border-danger bg-transparent text-danger hover:bg-danger-soft focus-visible:ring-danger-strong",
178
+ secondary: "border-danger bg-transparent text-danger hover:bg-danger-soft focus-visible:ring-danger-strong",
190
179
  default:
191
180
  "border-danger bg-danger-soft text-danger hover:border-[var(--danger)] hover:bg-danger hover:text-danger-contrast focus-visible:ring-danger-strong disabled:hover:border-danger disabled:hover:bg-danger-soft disabled:hover:text-danger",
192
181
  };
@@ -319,10 +319,7 @@ function ButtonElement({
319
319
  keeps an icon + text spaced as the button spaces them. */}
320
320
  <span className="inline-flex items-center justify-center gap-[inherit] opacity-0">{children}</span>
321
321
  {/* Decorative: `aria-busy` says it, as on FileButton. */}
322
- <Spinner
323
- label={null}
324
- className="absolute inset-0 m-auto size-4 border-current/30 border-t-current"
325
- />
322
+ <Spinner label={null} className="absolute inset-0 m-auto size-4 border-current/30 border-t-current" />
326
323
  </>
327
324
  ) : (
328
325
  children