@eifi1/ui-kit 0.31.1 → 0.32.1

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 (565) hide show
  1. package/README.md +51 -28
  2. package/dist/account/delete-account-setting.d.ts +8 -3
  3. package/dist/admin/admin-action-confirm.d.ts +8 -3
  4. package/dist/admin/admin-action-log.d.ts +1 -1
  5. package/dist/admin/admin-action-log.js +4 -2
  6. package/dist/admin/admin-action-log.js.map +1 -1
  7. package/dist/admin/invitations-panel.d.ts +8 -3
  8. package/dist/admin/invitations-panel.js +29 -26
  9. package/dist/admin/invitations-panel.js.map +1 -1
  10. package/dist/admin/reviewer-scope-editor.d.ts +8 -3
  11. package/dist/admin/role-select.d.ts +10 -5
  12. package/dist/admin/transfer-ownership-dialog.d.ts +8 -3
  13. package/dist/admin/user-roster.d.ts +10 -5
  14. package/dist/admin/user-roster.js +8 -47
  15. package/dist/admin/user-roster.js.map +1 -1
  16. package/dist/auth/auth-errors.d.ts +43 -8
  17. package/dist/auth/auth-errors.js +24 -1
  18. package/dist/auth/auth-errors.js.map +1 -1
  19. package/dist/auth/register-form.d.ts +8 -3
  20. package/dist/billing/billing-banner.d.ts +184 -0
  21. package/dist/billing/billing-banner.js +98 -0
  22. package/dist/billing/billing-banner.js.map +1 -0
  23. package/dist/billing/billing-labels.d.ts +100 -0
  24. package/dist/billing/billing-labels.js +76 -0
  25. package/dist/billing/billing-labels.js.map +1 -0
  26. package/dist/billing/billing-lock.d.ts +158 -0
  27. package/dist/billing/billing-lock.js +17 -0
  28. package/dist/billing/billing-lock.js.map +1 -0
  29. package/dist/billing/billing-standing.d.ts +149 -0
  30. package/dist/billing/billing-standing.js +28 -0
  31. package/dist/billing/billing-standing.js.map +1 -0
  32. package/dist/billing/plan-card.d.ts +248 -0
  33. package/dist/billing/plan-card.js +248 -0
  34. package/dist/billing/plan-card.js.map +1 -0
  35. package/dist/billing/plan-limit-notice.d.ts +156 -0
  36. package/dist/billing/plan-limit-notice.js +76 -0
  37. package/dist/billing/plan-limit-notice.js.map +1 -0
  38. package/dist/billing/plan-limit.d.ts +34 -0
  39. package/dist/billing/plan-limit.js +20 -0
  40. package/dist/billing/plan-limit.js.map +1 -0
  41. package/dist/billing/plan-price.d.ts +61 -0
  42. package/dist/billing/plan-price.js +45 -0
  43. package/dist/billing/plan-price.js.map +1 -0
  44. package/dist/billing/subscription-actions.d.ts +133 -0
  45. package/dist/billing/subscription-actions.js +28 -0
  46. package/dist/billing/subscription-actions.js.map +1 -0
  47. package/dist/billing/subscription-status-chip.d.ts +149 -0
  48. package/dist/billing/subscription-status-chip.js +48 -0
  49. package/dist/billing/subscription-status-chip.js.map +1 -0
  50. package/dist/chart.d.ts +9 -3
  51. package/dist/chart.js.map +1 -1
  52. package/dist/components/account-chips.d.ts +16 -4
  53. package/dist/components/account-chips.js +21 -3
  54. package/dist/components/account-chips.js.map +1 -1
  55. package/dist/components/alert-banner.d.ts +6 -1
  56. package/dist/components/alert-banner.js +5 -4
  57. package/dist/components/alert-banner.js.map +1 -1
  58. package/dist/components/amount-input.d.ts +8 -3
  59. package/dist/components/amount-input.js +5 -5
  60. package/dist/components/amount-input.js.map +1 -1
  61. package/dist/components/appearance-labels.d.ts +38 -0
  62. package/dist/components/appearance-labels.js +19 -0
  63. package/dist/components/appearance-labels.js.map +1 -0
  64. package/dist/components/autocomplete.js +2 -2
  65. package/dist/components/autocomplete.js.map +1 -1
  66. package/dist/components/breadcrumbs.js +3 -2
  67. package/dist/components/breadcrumbs.js.map +1 -1
  68. package/dist/components/bulk-action-bar.d.ts +2 -2
  69. package/dist/components/bulk-action-bar.js +7 -12
  70. package/dist/components/bulk-action-bar.js.map +1 -1
  71. package/dist/components/button-group.d.ts +8 -3
  72. package/dist/components/button-group.js +7 -1
  73. package/dist/components/button-group.js.map +1 -1
  74. package/dist/components/calculator.d.ts +8 -3
  75. package/dist/components/calculator.js +4 -3
  76. package/dist/components/calculator.js.map +1 -1
  77. package/dist/components/calendar-heatmap.js +5 -5
  78. package/dist/components/calendar-heatmap.js.map +1 -1
  79. package/dist/components/chart-height.d.ts +23 -0
  80. package/dist/components/chart-height.js +15 -0
  81. package/dist/components/chart-height.js.map +1 -0
  82. package/dist/components/chart-zoom.js +6 -1
  83. package/dist/components/chart-zoom.js.map +1 -1
  84. package/dist/components/checkbox-group.js +2 -2
  85. package/dist/components/checkbox-group.js.map +1 -1
  86. package/dist/components/checkbox.d.ts +10 -0
  87. package/dist/components/checkbox.js +25 -10
  88. package/dist/components/checkbox.js.map +1 -1
  89. package/dist/components/chip.d.ts +19 -3
  90. package/dist/components/chip.js +54 -23
  91. package/dist/components/chip.js.map +1 -1
  92. package/dist/components/choice-card.d.ts +1 -1
  93. package/dist/components/choice-card.js +9 -8
  94. package/dist/components/choice-card.js.map +1 -1
  95. package/dist/components/column-mapper.js +1 -1
  96. package/dist/components/column-mapper.js.map +1 -1
  97. package/dist/components/combobox-core.js +8 -7
  98. package/dist/components/combobox-core.js.map +1 -1
  99. package/dist/components/combobox.js +8 -8
  100. package/dist/components/combobox.js.map +1 -1
  101. package/dist/components/confirm-dialog.d.ts +8 -3
  102. package/dist/components/copy-button.d.ts +10 -5
  103. package/dist/components/country-select.js +1 -1
  104. package/dist/components/country-select.js.map +1 -1
  105. package/dist/components/currency-select.js +3 -3
  106. package/dist/components/currency-select.js.map +1 -1
  107. package/dist/components/danger-confirm.d.ts +8 -3
  108. package/dist/components/data-table-cells.d.ts +1 -1
  109. package/dist/components/data-table-filter-popover.d.ts +1 -1
  110. package/dist/components/data-table-filter-popover.js +4 -1
  111. package/dist/components/data-table-filter-popover.js.map +1 -1
  112. package/dist/components/data-table-filters.d.ts +1 -1
  113. package/dist/components/data-table-labels.d.ts +1 -1
  114. package/dist/components/data-table-pagination.d.ts +3 -2
  115. package/dist/components/data-table-pagination.js +15 -6
  116. package/dist/components/data-table-pagination.js.map +1 -1
  117. package/dist/components/data-table.d.ts +1 -1
  118. package/dist/components/data-table.js +123 -52
  119. package/dist/components/data-table.js.map +1 -1
  120. package/dist/components/date-picker.d.ts +1 -1
  121. package/dist/components/date-picker.js +18 -6
  122. package/dist/components/date-picker.js.map +1 -1
  123. package/dist/components/description-list.js +2 -2
  124. package/dist/components/description-list.js.map +1 -1
  125. package/dist/components/dialog-frame.js +2 -1
  126. package/dist/components/dialog-frame.js.map +1 -1
  127. package/dist/components/disclosure.js +3 -2
  128. package/dist/components/disclosure.js.map +1 -1
  129. package/dist/components/dropdown.d.ts +1 -1
  130. package/dist/components/dropdown.js +7 -1
  131. package/dist/components/dropdown.js.map +1 -1
  132. package/dist/components/facing-pair.d.ts +19 -6
  133. package/dist/components/facing-pair.js +3 -2
  134. package/dist/components/facing-pair.js.map +1 -1
  135. package/dist/components/field-parts.d.ts +102 -6
  136. package/dist/components/field-parts.js +81 -6
  137. package/dist/components/field-parts.js.map +1 -1
  138. package/dist/components/field-sync.d.ts +4 -1
  139. package/dist/components/field-sync.js +12 -2
  140. package/dist/components/field-sync.js.map +1 -1
  141. package/dist/components/field.js +2 -2
  142. package/dist/components/field.js.map +1 -1
  143. package/dist/components/file-button.d.ts +8 -3
  144. package/dist/components/file-dropzone.d.ts +8 -3
  145. package/dist/components/floating-panel.js +7 -4
  146. package/dist/components/floating-panel.js.map +1 -1
  147. package/dist/components/focus-ring.d.ts +12 -0
  148. package/dist/components/focus-ring.js +8 -0
  149. package/dist/components/focus-ring.js.map +1 -0
  150. package/dist/components/form-actions.d.ts +8 -3
  151. package/dist/components/form-actions.js +33 -19
  152. package/dist/components/form-actions.js.map +1 -1
  153. package/dist/components/full-bleed-dialog.d.ts +11 -1
  154. package/dist/components/full-bleed-dialog.js +3 -1
  155. package/dist/components/full-bleed-dialog.js.map +1 -1
  156. package/dist/components/iban-input.d.ts +8 -3
  157. package/dist/components/image-grid.js +1 -1
  158. package/dist/components/image-grid.js.map +1 -1
  159. package/dist/components/inline-edit-field.js +10 -4
  160. package/dist/components/inline-edit-field.js.map +1 -1
  161. package/dist/components/language-select.d.ts +8 -3
  162. package/dist/components/legal-page.d.ts +26 -5
  163. package/dist/components/legal-page.js +3 -1
  164. package/dist/components/legal-page.js.map +1 -1
  165. package/dist/components/legal.d.ts +8 -3
  166. package/dist/components/legal.js +2 -1
  167. package/dist/components/legal.js.map +1 -1
  168. package/dist/components/lightbox.js +24 -2
  169. package/dist/components/lightbox.js.map +1 -1
  170. package/dist/components/line-items.js +2 -1
  171. package/dist/components/line-items.js.map +1 -1
  172. package/dist/components/list.d.ts +5 -0
  173. package/dist/components/list.js +13 -9
  174. package/dist/components/list.js.map +1 -1
  175. package/dist/components/measured-grid.d.ts +3 -1
  176. package/dist/components/measured-grid.js +38 -20
  177. package/dist/components/measured-grid.js.map +1 -1
  178. package/dist/components/menu-item.js +2 -1
  179. package/dist/components/menu-item.js.map +1 -1
  180. package/dist/components/mini-calendar.js +8 -4
  181. package/dist/components/mini-calendar.js.map +1 -1
  182. package/dist/components/money-field.d.ts +8 -3
  183. package/dist/components/month-picker.js +50 -39
  184. package/dist/components/month-picker.js.map +1 -1
  185. package/dist/components/nav-pills.js +1 -1
  186. package/dist/components/nav-pills.js.map +1 -1
  187. package/dist/components/number-field.d.ts +8 -3
  188. package/dist/components/number-input.d.ts +11 -4
  189. package/dist/components/number-input.js +8 -6
  190. package/dist/components/number-input.js.map +1 -1
  191. package/dist/components/numpad-sheet.d.ts +8 -3
  192. package/dist/components/numpad-sheet.js +2 -1
  193. package/dist/components/numpad-sheet.js.map +1 -1
  194. package/dist/components/one-time-code-input.js +2 -2
  195. package/dist/components/one-time-code-input.js.map +1 -1
  196. package/dist/components/page-contents.js +2 -2
  197. package/dist/components/page-contents.js.map +1 -1
  198. package/dist/components/phone-input.d.ts +8 -3
  199. package/dist/components/phone-input.js +4 -4
  200. package/dist/components/phone-input.js.map +1 -1
  201. package/dist/components/pie-chart.d.ts +8 -2
  202. package/dist/components/pie-chart.js +11 -7
  203. package/dist/components/pie-chart.js.map +1 -1
  204. package/dist/components/popover.d.ts +9 -1
  205. package/dist/components/popover.js +8 -4
  206. package/dist/components/popover.js.map +1 -1
  207. package/dist/components/row-actions.d.ts +100 -0
  208. package/dist/components/row-actions.js +231 -0
  209. package/dist/components/row-actions.js.map +1 -0
  210. package/dist/components/scroll-area.js +1 -1
  211. package/dist/components/scroll-area.js.map +1 -1
  212. package/dist/components/search-field.js +3 -2
  213. package/dist/components/search-field.js.map +1 -1
  214. package/dist/components/series-chart-budget.d.ts +30 -7
  215. package/dist/components/series-chart-budget.js +12 -4
  216. package/dist/components/series-chart-budget.js.map +1 -1
  217. package/dist/components/series-chart-ticks.d.ts +7 -1
  218. package/dist/components/series-chart-ticks.js +6 -0
  219. package/dist/components/series-chart-ticks.js.map +1 -1
  220. package/dist/components/series-chart.d.ts +58 -28
  221. package/dist/components/series-chart.js +42 -32
  222. package/dist/components/series-chart.js.map +1 -1
  223. package/dist/components/settings-fields.d.ts +57 -8
  224. package/dist/components/settings-fields.js +39 -1
  225. package/dist/components/settings-fields.js.map +1 -1
  226. package/dist/components/share-card.d.ts +11 -6
  227. package/dist/components/share-card.js +8 -2
  228. package/dist/components/share-card.js.map +1 -1
  229. package/dist/components/sign-chip.d.ts +4 -0
  230. package/dist/components/sign-chip.js +17 -4
  231. package/dist/components/sign-chip.js.map +1 -1
  232. package/dist/components/signature-pad.d.ts +3 -1
  233. package/dist/components/signature-pad.js +8 -5
  234. package/dist/components/signature-pad.js.map +1 -1
  235. package/dist/components/slider.js +7 -6
  236. package/dist/components/slider.js.map +1 -1
  237. package/dist/components/sparkline.d.ts +5 -1
  238. package/dist/components/sparkline.js +4 -2
  239. package/dist/components/sparkline.js.map +1 -1
  240. package/dist/components/stat-tile.d.ts +17 -1
  241. package/dist/components/stat-tile.js +48 -20
  242. package/dist/components/stat-tile.js.map +1 -1
  243. package/dist/components/status-dot.d.ts +4 -0
  244. package/dist/components/status-dot.js +9 -2
  245. package/dist/components/status-dot.js.map +1 -1
  246. package/dist/components/swipeable-row.js +10 -2
  247. package/dist/components/swipeable-row.js.map +1 -1
  248. package/dist/components/switch.d.ts +21 -7
  249. package/dist/components/switch.js +24 -11
  250. package/dist/components/switch.js.map +1 -1
  251. package/dist/components/table.js +2 -2
  252. package/dist/components/table.js.map +1 -1
  253. package/dist/components/text-link.d.ts +8 -3
  254. package/dist/components/text-link.js +1 -1
  255. package/dist/components/text-link.js.map +1 -1
  256. package/dist/components/text.d.ts +7 -2
  257. package/dist/components/text.js +5 -5
  258. package/dist/components/text.js.map +1 -1
  259. package/dist/components/tile-radio.js +2 -1
  260. package/dist/components/tile-radio.js.map +1 -1
  261. package/dist/components/time-input.d.ts +8 -3
  262. package/dist/components/toast.d.ts +18 -2
  263. package/dist/components/toast.js +8 -5
  264. package/dist/components/toast.js.map +1 -1
  265. package/dist/components/toggle-group.d.ts +25 -3
  266. package/dist/components/toggle-group.js +40 -11
  267. package/dist/components/toggle-group.js.map +1 -1
  268. package/dist/components/toggle-legend.d.ts +10 -1
  269. package/dist/components/toggle-legend.js +21 -7
  270. package/dist/components/toggle-legend.js.map +1 -1
  271. package/dist/components/translation-review-editor.js +1 -1
  272. package/dist/components/translation-review-editor.js.map +1 -1
  273. package/dist/components/translation-review-parts.d.ts +4 -0
  274. package/dist/components/translation-review.d.ts +4 -0
  275. package/dist/components/translation-review.js +3 -3
  276. package/dist/components/translation-review.js.map +1 -1
  277. package/dist/components/tree-view.js +3 -2
  278. package/dist/components/tree-view.js.map +1 -1
  279. package/dist/components/treemap.d.ts +5 -2
  280. package/dist/components/treemap.js +33 -16
  281. package/dist/components/treemap.js.map +1 -1
  282. package/dist/components/ui.d.ts +8 -3
  283. package/dist/components/ui.js +207 -119
  284. package/dist/components/ui.js.map +1 -1
  285. package/dist/components/use-table-state.d.ts +1 -1
  286. package/dist/components/user-avatar.d.ts +5 -1
  287. package/dist/components/user-avatar.js +1 -1
  288. package/dist/components/user-avatar.js.map +1 -1
  289. package/dist/components/wizard-stepper.js +20 -14
  290. package/dist/components/wizard-stepper.js.map +1 -1
  291. package/dist/{data-table-labels-DUELeXpa.d.ts → data-table-labels-kpAAVi6g.d.ts} +26 -2
  292. package/dist/data-table.d.ts +1 -1
  293. package/dist/{delete-account-setting-CpIhzxxZ.d.ts → delete-account-setting-FLyJf-kZ.d.ts} +642 -60
  294. package/dist/demo/demo-banner.js +1 -0
  295. package/dist/demo/demo-banner.js.map +1 -1
  296. package/dist/feedback/feedback-attachment.d.ts +8 -3
  297. package/dist/feedback/feedback-context.d.ts +8 -3
  298. package/dist/feedback/feedback-crash.d.ts +8 -3
  299. package/dist/feedback/feedback-dialog.d.ts +8 -3
  300. package/dist/feedback/feedback-dialog.js +3 -3
  301. package/dist/feedback/feedback-dialog.js.map +1 -1
  302. package/dist/feedback/feedback-inbox.d.ts +8 -3
  303. package/dist/feedback/feedback-inbox.js +2 -2
  304. package/dist/feedback/feedback-inbox.js.map +1 -1
  305. package/dist/feedback/feedback-labels.d.ts +8 -3
  306. package/dist/feedback/feedback-menu.d.ts +9 -4
  307. package/dist/feedback/feedback-record.d.ts +8 -3
  308. package/dist/feedback/feedback-row-detail.d.ts +8 -3
  309. package/dist/feedback/feedback-status-undo.d.ts +8 -3
  310. package/dist/feedback/feedback-submit.d.ts +8 -3
  311. package/dist/feedback/feedback-swipe.d.ts +8 -3
  312. package/dist/feedback/feedback-table.d.ts +8 -3
  313. package/dist/feedback/feedback-thread.d.ts +8 -3
  314. package/dist/feedback/feedback-thread.js +3 -3
  315. package/dist/feedback/feedback-thread.js.map +1 -1
  316. package/dist/feedback.d.ts +8 -3
  317. package/dist/hooks/use-anchored-panel.d.ts +32 -3
  318. package/dist/hooks/use-anchored-panel.js +21 -3
  319. package/dist/hooks/use-anchored-panel.js.map +1 -1
  320. package/dist/hooks/use-breakpoint.d.ts +88 -0
  321. package/dist/hooks/use-breakpoint.js +50 -0
  322. package/dist/hooks/use-breakpoint.js.map +1 -0
  323. package/dist/hooks/use-file-drop.d.ts +8 -3
  324. package/dist/hooks/use-large-text.d.ts +29 -0
  325. package/dist/hooks/use-large-text.js +20 -0
  326. package/dist/hooks/use-large-text.js.map +1 -0
  327. package/dist/hooks/use-windowed-rows.d.ts +52 -8
  328. package/dist/hooks/use-windowed-rows.js +94 -5
  329. package/dist/hooks/use-windowed-rows.js.map +1 -1
  330. package/dist/i18n/defaults.d.ts +8 -3
  331. package/dist/i18n/defaults.js +8 -0
  332. package/dist/i18n/defaults.js.map +1 -1
  333. package/dist/i18n/german.d.ts +8 -3
  334. package/dist/i18n/german.js +94 -3
  335. package/dist/i18n/german.js.map +1 -1
  336. package/dist/i18n/kit-labels.d.ts +8 -3
  337. package/dist/i18n/kit-labels.js.map +1 -1
  338. package/dist/i18n/languages.d.ts +10 -5
  339. package/dist/i18n/locales/de-CH.d.ts +8 -3
  340. package/dist/i18n/locales/en.d.ts +8 -3
  341. package/dist/i18n/locales/es.d.ts +8 -3
  342. package/dist/i18n/locales/es.js +89 -3
  343. package/dist/i18n/locales/es.js.map +1 -1
  344. package/dist/i18n/locales/fr.d.ts +8 -3
  345. package/dist/i18n/locales/fr.js +91 -3
  346. package/dist/i18n/locales/fr.js.map +1 -1
  347. package/dist/i18n/locales/hu.d.ts +8 -3
  348. package/dist/i18n/locales/hu.js +91 -3
  349. package/dist/i18n/locales/hu.js.map +1 -1
  350. package/dist/i18n/locales/it.d.ts +8 -3
  351. package/dist/i18n/locales/it.js +92 -3
  352. package/dist/i18n/locales/it.js.map +1 -1
  353. package/dist/i18n/locales/zh.d.ts +8 -3
  354. package/dist/i18n/locales/zh.js +89 -3
  355. package/dist/i18n/locales/zh.js.map +1 -1
  356. package/dist/i18n/review.d.ts +8 -3
  357. package/dist/i18n/review.js +15 -1
  358. package/dist/i18n/review.js.map +1 -1
  359. package/dist/index.d.ts +27 -11
  360. package/dist/index.js +77 -4
  361. package/dist/index.js.map +1 -1
  362. package/dist/landing/landing-actions.d.ts +8 -3
  363. package/dist/landing/landing-sections.d.ts +8 -3
  364. package/dist/landing/landing-sections.js +7 -3
  365. package/dist/landing/landing-sections.js.map +1 -1
  366. package/dist/landing/public-header.d.ts +9 -4
  367. package/dist/landing/public-header.js +3 -3
  368. package/dist/landing/public-header.js.map +1 -1
  369. package/dist/landing/routing.d.ts +8 -3
  370. package/dist/lib/cn.js +3 -2
  371. package/dist/lib/cn.js.map +1 -1
  372. package/dist/rhf/fields.d.ts +8 -3
  373. package/dist/rhf/fields.js +1 -1
  374. package/dist/rhf/fields.js.map +1 -1
  375. package/dist/rhf/form.d.ts +8 -3
  376. package/dist/rhf/form.js +2 -2
  377. package/dist/rhf/form.js.map +1 -1
  378. package/dist/rhf.d.ts +8 -3
  379. package/dist/search/command-palette.d.ts +1 -1
  380. package/dist/search/command-palette.js +9 -8
  381. package/dist/search/command-palette.js.map +1 -1
  382. package/dist/settings/settings-layout.js +2 -1
  383. package/dist/settings/settings-layout.js.map +1 -1
  384. package/dist/settings/settings-section.d.ts +8 -3
  385. package/dist/settings/use-account-appearance.d.ts +92 -0
  386. package/dist/settings/use-account-appearance.js +63 -0
  387. package/dist/settings/use-account-appearance.js.map +1 -0
  388. package/dist/settings/use-settings-route.d.ts +1 -1
  389. package/dist/settings/use-settings-route.js +2 -3
  390. package/dist/settings/use-settings-route.js.map +1 -1
  391. package/dist/shell/app-shell.d.ts +12 -171
  392. package/dist/shell/app-shell.js +144 -28
  393. package/dist/shell/app-shell.js.map +1 -1
  394. package/dist/shell/auth-layout.js +1 -1
  395. package/dist/shell/auth-layout.js.map +1 -1
  396. package/dist/shell/option-switcher-menu.js +1 -1
  397. package/dist/shell/option-switcher-menu.js.map +1 -1
  398. package/dist/shell/top-bar-brand.d.ts +8 -3
  399. package/dist/shell/top-bar-brand.js +3 -1
  400. package/dist/shell/top-bar-brand.js.map +1 -1
  401. package/dist/shell/topbar-action-menu.d.ts +4 -0
  402. package/dist/shell/topbar-action-menu.js +3 -3
  403. package/dist/shell/topbar-action-menu.js.map +1 -1
  404. package/dist/shell/topbar-controls.js +4 -4
  405. package/dist/shell/topbar-controls.js.map +1 -1
  406. package/dist/shell.d.ts +9 -5
  407. package/dist/theme/contrast-tokens.d.ts +41 -0
  408. package/dist/theme/contrast-tokens.js +59 -0
  409. package/dist/theme/contrast-tokens.js.map +1 -0
  410. package/dist/theme/contrast.d.ts +110 -0
  411. package/dist/theme/contrast.js +128 -0
  412. package/dist/theme/contrast.js.map +1 -0
  413. package/dist/theme/palette-presets.d.ts +12 -1
  414. package/dist/theme/palette-presets.js +9 -4
  415. package/dist/theme/palette-presets.js.map +1 -1
  416. package/dist/theme/palette-store.js.map +1 -1
  417. package/dist/theme/text-size.d.ts +173 -0
  418. package/dist/theme/text-size.js +121 -0
  419. package/dist/theme/text-size.js.map +1 -0
  420. package/dist/wizard/stepper-nav.d.ts +8 -3
  421. package/dist/wizard/wizard-summary.js +1 -1
  422. package/dist/wizard/wizard-summary.js.map +1 -1
  423. package/dist/wizard.d.ts +8 -3
  424. package/package.json +1 -1
  425. package/src/admin/admin-action-log.tsx +6 -1
  426. package/src/admin/invitations-panel.tsx +36 -29
  427. package/src/admin/user-roster.tsx +17 -72
  428. package/src/auth/auth-errors.ts +68 -7
  429. package/src/billing/billing-banner.tsx +205 -0
  430. package/src/billing/billing-labels.ts +240 -0
  431. package/src/billing/billing-lock.ts +75 -0
  432. package/src/billing/billing-standing.ts +72 -0
  433. package/src/billing/plan-card.tsx +458 -0
  434. package/src/billing/plan-limit-notice.tsx +145 -0
  435. package/src/billing/plan-limit.ts +53 -0
  436. package/src/billing/plan-price.ts +101 -0
  437. package/src/billing/subscription-actions.tsx +76 -0
  438. package/src/billing/subscription-status-chip.tsx +95 -0
  439. package/src/chart.ts +2 -0
  440. package/src/components/account-chips.tsx +36 -10
  441. package/src/components/alert-banner.tsx +16 -7
  442. package/src/components/amount-input.tsx +5 -5
  443. package/src/components/appearance-labels.ts +47 -0
  444. package/src/components/autocomplete.tsx +2 -2
  445. package/src/components/breadcrumbs.tsx +3 -3
  446. package/src/components/bulk-action-bar.tsx +11 -14
  447. package/src/components/button-group.tsx +21 -0
  448. package/src/components/calculator.tsx +4 -3
  449. package/src/components/calendar-heatmap.tsx +5 -5
  450. package/src/components/chart-height.ts +30 -0
  451. package/src/components/chart-zoom.tsx +6 -1
  452. package/src/components/checkbox-group.tsx +2 -2
  453. package/src/components/checkbox.tsx +62 -20
  454. package/src/components/chip.tsx +139 -30
  455. package/src/components/choice-card.tsx +16 -11
  456. package/src/components/column-mapper.tsx +1 -1
  457. package/src/components/combobox-core.tsx +8 -7
  458. package/src/components/combobox.tsx +8 -8
  459. package/src/components/country-select.tsx +1 -1
  460. package/src/components/currency-select.tsx +3 -3
  461. package/src/components/data-table-filter-popover.tsx +7 -1
  462. package/src/components/data-table-pagination.tsx +60 -31
  463. package/src/components/data-table.tsx +164 -43
  464. package/src/components/date-picker.tsx +44 -10
  465. package/src/components/description-list.tsx +2 -2
  466. package/src/components/dialog-frame.tsx +2 -1
  467. package/src/components/disclosure.tsx +3 -2
  468. package/src/components/dropdown.tsx +10 -2
  469. package/src/components/facing-pair.ts +12 -5
  470. package/src/components/field-parts.tsx +190 -7
  471. package/src/components/field-sync.tsx +17 -3
  472. package/src/components/field.tsx +2 -2
  473. package/src/components/floating-panel.tsx +7 -4
  474. package/src/components/focus-ring.ts +12 -0
  475. package/src/components/form-actions.tsx +55 -18
  476. package/src/components/full-bleed-dialog.tsx +18 -4
  477. package/src/components/image-grid.tsx +1 -1
  478. package/src/components/inline-edit-field.tsx +26 -4
  479. package/src/components/legal-page.tsx +28 -2
  480. package/src/components/legal.tsx +19 -1
  481. package/src/components/lightbox.tsx +24 -2
  482. package/src/components/line-items.tsx +7 -1
  483. package/src/components/list.tsx +36 -10
  484. package/src/components/measured-grid.tsx +49 -24
  485. package/src/components/menu-item.tsx +2 -2
  486. package/src/components/mini-calendar.tsx +8 -4
  487. package/src/components/month-picker.tsx +15 -6
  488. package/src/components/nav-pills.tsx +1 -1
  489. package/src/components/number-input.tsx +14 -7
  490. package/src/components/numpad-sheet.tsx +2 -2
  491. package/src/components/one-time-code-input.tsx +2 -2
  492. package/src/components/page-contents.tsx +2 -2
  493. package/src/components/phone-input.tsx +9 -4
  494. package/src/components/pie-chart.tsx +19 -9
  495. package/src/components/popover.tsx +22 -5
  496. package/src/components/row-actions.tsx +450 -0
  497. package/src/components/scroll-area.tsx +1 -1
  498. package/src/components/search-field.tsx +4 -2
  499. package/src/components/series-chart-budget.ts +40 -8
  500. package/src/components/series-chart-ticks.ts +10 -0
  501. package/src/components/series-chart.tsx +123 -72
  502. package/src/components/settings-fields.tsx +89 -5
  503. package/src/components/share-card.tsx +31 -2
  504. package/src/components/sign-chip.tsx +28 -4
  505. package/src/components/signature-pad.tsx +13 -7
  506. package/src/components/slider.tsx +22 -9
  507. package/src/components/sparkline.tsx +11 -3
  508. package/src/components/stat-tile.tsx +70 -14
  509. package/src/components/status-dot.tsx +25 -2
  510. package/src/components/swipeable-row.tsx +10 -2
  511. package/src/components/switch.tsx +57 -23
  512. package/src/components/table.tsx +2 -2
  513. package/src/components/text-link.tsx +1 -1
  514. package/src/components/text.tsx +11 -6
  515. package/src/components/tile-radio.tsx +4 -1
  516. package/src/components/toast.tsx +27 -7
  517. package/src/components/toggle-group.tsx +115 -14
  518. package/src/components/toggle-legend.tsx +53 -8
  519. package/src/components/translation-review-editor.tsx +1 -1
  520. package/src/components/translation-review.tsx +11 -5
  521. package/src/components/tree-view.tsx +3 -2
  522. package/src/components/treemap.tsx +27 -10
  523. package/src/components/ui.tsx +353 -153
  524. package/src/components/user-avatar.tsx +1 -1
  525. package/src/components/wizard-stepper.tsx +5 -1
  526. package/src/demo/demo-banner.tsx +5 -0
  527. package/src/feedback/feedback-dialog.tsx +3 -3
  528. package/src/feedback/feedback-inbox.tsx +2 -2
  529. package/src/feedback/feedback-thread.tsx +3 -3
  530. package/src/hooks/use-anchored-panel.ts +67 -5
  531. package/src/hooks/use-breakpoint.ts +132 -0
  532. package/src/hooks/use-large-text.ts +41 -0
  533. package/src/hooks/use-windowed-rows.ts +168 -12
  534. package/src/i18n/defaults.ts +8 -0
  535. package/src/i18n/german.ts +107 -0
  536. package/src/i18n/kit-labels.tsx +12 -0
  537. package/src/i18n/locales/es.ts +98 -0
  538. package/src/i18n/locales/fr.ts +102 -0
  539. package/src/i18n/locales/hu.ts +100 -0
  540. package/src/i18n/locales/it.ts +103 -0
  541. package/src/i18n/locales/zh.ts +94 -0
  542. package/src/i18n/review.ts +14 -0
  543. package/src/index.ts +76 -6
  544. package/src/landing/landing-sections.tsx +7 -3
  545. package/src/landing/public-header.tsx +4 -4
  546. package/src/lib/cn.ts +13 -2
  547. package/src/rhf/fields.tsx +1 -1
  548. package/src/rhf/form.tsx +2 -2
  549. package/src/search/command-palette.tsx +10 -9
  550. package/src/settings/settings-layout.tsx +2 -1
  551. package/src/settings/use-account-appearance.ts +148 -0
  552. package/src/settings/use-settings-route.ts +3 -4
  553. package/src/shell/app-shell.tsx +278 -54
  554. package/src/shell/auth-layout.tsx +1 -1
  555. package/src/shell/option-switcher-menu.tsx +1 -1
  556. package/src/shell/top-bar-brand.tsx +3 -1
  557. package/src/shell/topbar-action-menu.tsx +3 -3
  558. package/src/shell/topbar-controls.tsx +4 -4
  559. package/src/theme/contrast-tokens.ts +112 -0
  560. package/src/theme/contrast.ts +225 -0
  561. package/src/theme/palette-presets.ts +24 -4
  562. package/src/theme/palette-store.ts +6 -1
  563. package/src/theme/text-size.ts +283 -0
  564. package/src/wizard/wizard-summary.tsx +4 -2
  565. package/tokens.css +158 -8
@@ -93,8 +93,10 @@ const CARD =
93
93
  // The focus mark is the CARD's, not the 16px box's: the card is what was clicked and
94
94
  // what the eye is on. An OUTLINE rather than a ring, because the checked state already
95
95
  // spends the ring — two `ring-*` widths on one element are decided by stylesheet
96
- // order, and the loser would be the focus mark. Offset, so the two never merge.
97
- "has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-2 has-[:focus-visible]:outline-[var(--brand)] " +
96
+ // order, and the loser would be the focus mark. Offset, so the two never merge. Its
97
+ // width is the kit's focus frame (0.32, §5: `--focus-ring-width`, 3 px under More
98
+ // contrast) — `FOCUS_RING` itself is a ring, which this mark cannot be.
99
+ "has-[:focus-visible]:outline-[length:var(--focus-ring-width)] has-[:focus-visible]:outline-offset-2 has-[:focus-visible]:outline-[var(--brand)] " +
98
100
  // Read from the input too, so a card disabled by its `<fieldset>` fades as well.
99
101
  "has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-60";
100
102
 
@@ -107,10 +109,12 @@ const CARD_INVALID =
107
109
  const BOX =
108
110
  "peer size-4 shrink-0 appearance-none border border-[var(--border-strong)] bg-[var(--bg-surface)] transition-colors " +
109
111
  "checked:border-[var(--brand)] focus:outline-none disabled:cursor-not-allowed";
110
- const CHECKBOX = "rounded-[4px] checked:bg-[var(--brand)]";
111
- // A radio's dot is its BORDER: a 5px brand border round a surface-coloured 4px
112
- // centre. No glyph to lay over it, and it scales with the box.
113
- const RADIO = "rounded-full checked:border-[5px]";
112
+ const CHECKBOX = "rounded checked:bg-[var(--brand)]";
113
+ // A radio's dot is its BORDER: a 0.3125rem brand border (5px at Normal) round a
114
+ // surface-coloured 0.375rem centre. No glyph to lay over it, and in rem since 0.32
115
+ // (§3.2) it scales with the box — a 5px border on a 24px box at 150 % was a ring, not a
116
+ // dot.
117
+ const RADIO = "rounded-full checked:border-[0.3125rem]";
114
118
 
115
119
  export const ChoiceCard = forwardRef<HTMLInputElement, ChoiceCardProps>(function ChoiceCard(
116
120
  {
@@ -219,7 +223,7 @@ export const ChoiceCard = forwardRef<HTMLInputElement, ChoiceCardProps>(function
219
223
  </span>
220
224
  )}
221
225
  {showError && (
222
- <span id={errorId} className="mt-1 block text-[11px] leading-tight text-[var(--danger)]">
226
+ <span id={errorId} className="mt-1 block text-caption leading-tight text-[var(--danger)]">
223
227
  {error}
224
228
  </span>
225
229
  )}
@@ -341,8 +345,9 @@ export const ActionCard = forwardRef<HTMLButtonElement, ActionCardProps>(functio
341
345
  const look = cn(
342
346
  "flex w-full items-start gap-3 rounded-lg border border-[var(--border)] bg-[var(--bg-surface)] p-3 text-start shadow-sm transition-colors",
343
347
  "hover:border-[var(--brand)] hover:bg-[var(--bg-hover)]",
344
- // The outline, as on ChoiceCard: the card is what the eye is on.
345
- "focus:outline-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--brand)]",
348
+ // The outline, as on ChoiceCard: the card is what the eye is on — the focus frame's
349
+ // width (§5).
350
+ "focus:outline-none focus-visible:outline-[length:var(--focus-ring-width)] focus-visible:outline-offset-2 focus-visible:outline-[var(--brand)]",
346
351
  "disabled:cursor-not-allowed disabled:opacity-60 disabled:hover:border-[var(--border)] disabled:hover:bg-[var(--bg-surface)]",
347
352
  className,
348
353
  );
@@ -523,7 +528,7 @@ export function ChoiceCardGroup<T extends string>(props: ChoiceCardGroupProps<T>
523
528
  {required && <RequiredMark />}
524
529
  </legend>
525
530
  )}
526
- <div className={cn("grid gap-2 sm:grid-cols-2", className)}>
531
+ <div className={cn("grid grid-cols-1 gap-2 sm:grid-cols-2", className)}>
527
532
  {options.map((o) => (
528
533
  <ChoiceCard
529
534
  key={o.value}
@@ -543,7 +548,7 @@ export function ChoiceCardGroup<T extends string>(props: ChoiceCardGroupProps<T>
543
548
  ))}
544
549
  </div>
545
550
  {showError && (
546
- <p id={errorId} className="mt-1 text-[11px] leading-tight text-[var(--danger)]">
551
+ <p id={errorId} className="mt-1 text-caption leading-tight text-[var(--danger)]">
547
552
  {error}
548
553
  </p>
549
554
  )}
@@ -367,7 +367,7 @@ export function ColumnRoleTable<
367
367
  scope="col"
368
368
  className="min-w-36 py-2 align-top"
369
369
  >
370
- <span className="block max-w-56 truncate pb-1 text-[11px] font-normal text-[var(--text-muted)]">
370
+ <span className="block max-w-56 truncate pb-1 text-caption font-normal text-[var(--text-muted)]">
371
371
  {name}
372
372
  </span>
373
373
  <Select
@@ -13,8 +13,8 @@ import { cn } from "../lib/cn";
13
13
  import { CLIPS_ATTRIBUTE } from "../lib/clipping";
14
14
  import { DropdownSearchHeader } from "./dropdown";
15
15
  import { PickerSheet, SHEET_ROW_CLASS } from "./picker-sheet";
16
- import { useMediaQuery } from "../hooks/use-media-query";
17
- import { FLOATING_LABEL_STATIC, PHONE_QUERY, Spinner } from "./ui";
16
+ import { usePhoneLayout } from "../hooks/use-breakpoint";
17
+ import { FLOATING_LABEL_STATIC, Spinner } from "./ui";
18
18
  import { useAnchorDir } from "./use-anchor-dir";
19
19
  import { type AnchorRect } from "../hooks/use-anchored-rect";
20
20
  import { useAnchoredPanel, type AnchoredPanel } from "../hooks/use-anchored-panel";
@@ -364,7 +364,7 @@ export function useComboboxCore<V extends string | number>({
364
364
  // old value, and tapping the search box or the X was equally fatal. `PickerSheet`
365
365
  // stops `mousedown` for exactly this reason, but that guard was written for
366
366
  // `useDropdown`'s listener and never covered this hook.
367
- const isPhone = useMediaQuery(PHONE_QUERY, false);
367
+ const isPhone = usePhoneLayout();
368
368
  useOutsideClick([triggerRef, panelRef], close, open && !isPhone);
369
369
  useEscapeKey(closeToTrigger, open);
370
370
 
@@ -437,7 +437,7 @@ export function useComboboxCore<V extends string | number>({
437
437
 
438
438
  /** The error line under a field — the same type as `ui.tsx`'s (module-private) one,
439
439
  * so a combobox's message is indistinguishable from an Input's. */
440
- const FIELD_ERROR_CLASS = "mt-1 text-[11px] leading-tight text-[var(--danger)]";
440
+ const FIELD_ERROR_CLASS = "mt-1 text-caption leading-tight text-[var(--danger)]";
441
441
 
442
442
  /**
443
443
  * {@link Input}'s `error` for the combobox family: the message under the field, its
@@ -589,7 +589,7 @@ export function ComboboxPanel<V extends string | number>({
589
589
  // The phone gets a full-screen sheet instead of an anchored panel (live #200).
590
590
  // Same core, same results, same handlers — only the container differs, so the
591
591
  // two presentations cannot drift in what they offer.
592
- const isPhone = useMediaQuery(PHONE_QUERY, false);
592
+ const isPhone = usePhoneLayout();
593
593
  // Every row the keyboard can land on, the create row included — passed over, like a
594
594
  // disabled option, while a write lock holds it.
595
595
  const rows: readonly { disabled?: boolean }[] = showCreate
@@ -732,7 +732,7 @@ export function ComboboxPanel<V extends string | number>({
732
732
  role="presentation"
733
733
  className={cn(
734
734
  "font-semibold uppercase tracking-wide text-[var(--text-muted)]",
735
- isPhone ? "px-4 pb-1 pt-3 text-xs" : "px-3 pb-0.5 pt-2 text-[11px] first:pt-1",
735
+ isPhone ? "px-4 pb-1 pt-3 text-xs" : "px-3 pb-0.5 pt-2 text-caption first:pt-1",
736
736
  )}
737
737
  >
738
738
  {o.group}
@@ -906,7 +906,8 @@ export function ComboboxPanel<V extends string | number>({
906
906
  top: placement.top,
907
907
  ...inline,
908
908
  width: rect.width,
909
- minWidth: 220,
909
+ // 220 px at Normal, in rem so the panel's text keeps its room at Large (§3.2).
910
+ minWidth: "13.75rem",
910
911
  maxHeight: placement.maxHeight,
911
912
  }}
912
913
  className={cn(
@@ -2,12 +2,12 @@ import { Fragment, useId, useMemo, useRef, useState } from "react";
2
2
  import type { ComponentPropsWithoutRef, ReactNode, Ref, RefObject } from "react";
3
3
  import { createPortal } from "react-dom";
4
4
  import { ChevronDown, Plus, X } from "lucide-react";
5
- import { FIELD_BASE, FIELD_FLOATING_PAD, FIELD_INVALID, PHONE_QUERY } from "./ui";
5
+ import { FIELD_BASE, FIELD_FLOATING_PAD, FIELD_INVALID } from "./ui";
6
6
  import { cn } from "../lib/cn";
7
7
  import { useDropdown } from "./dropdown";
8
8
  import { useAnchoredPanel } from "../hooks/use-anchored-panel";
9
9
  import { useAnchorDir } from "./use-anchor-dir";
10
- import { useMediaQuery } from "../hooks/use-media-query";
10
+ import { usePhoneLayout } from "../hooks/use-breakpoint";
11
11
  import { PickerSheet, SHEET_ROW_CLASS } from "./picker-sheet";
12
12
  import {
13
13
  ComboboxFieldLabel,
@@ -339,7 +339,7 @@ export function Combobox(props: ComboboxProps) {
339
339
  // `backCloses` is the desktop half of live #309: the phone's list IS a
340
340
  // {@link PickerSheet}, which registers its own history entry, so registering a
341
341
  // second one here would cost two Back presses to dismiss one sheet.
342
- const isPhone = useMediaQuery(PHONE_QUERY, false);
342
+ const isPhone = usePhoneLayout();
343
343
  const { open, setOpen, wrapperRef, panelRef } = useDropdown({ backCloses: !isPhone });
344
344
  const primaryOnly = usePrimaryPressOnly();
345
345
  const [active, setActive] = useState(-1);
@@ -673,7 +673,7 @@ export function Combobox(props: ComboboxProps) {
673
673
  {group !== undefined && (
674
674
  <li
675
675
  role="presentation"
676
- className="px-4 pb-0.5 pt-3 text-[11px] font-semibold uppercase tracking-wide text-[var(--text-muted)]"
676
+ className="px-4 pb-0.5 pt-3 text-caption font-semibold uppercase tracking-wide text-[var(--text-muted)]"
677
677
  >
678
678
  {group}
679
679
  </li>
@@ -730,7 +730,7 @@ export function Combobox(props: ComboboxProps) {
730
730
  {group !== undefined && (
731
731
  <li
732
732
  role="presentation"
733
- className="px-3 pb-0.5 pt-2 text-[11px] font-semibold uppercase tracking-wide text-[var(--text-muted)] first:pt-1"
733
+ className="px-3 pb-0.5 pt-2 text-caption font-semibold uppercase tracking-wide text-[var(--text-muted)] first:pt-1"
734
734
  >
735
735
  {group}
736
736
  </li>
@@ -978,7 +978,7 @@ export function InlineEntityCombobox<V extends string | number, C extends ComboC
978
978
  // See the twin above on why these hang off the generated id.
979
979
  const listboxId = `${generated}-listbox`;
980
980
  const optionId = (index: number) => `${generated}-option-${index}`;
981
- const isPhone = useMediaQuery(PHONE_QUERY, false);
981
+ const isPhone = usePhoneLayout();
982
982
  // See the twin above: the phone sheet owns its own Back entry (live #309).
983
983
  const { open, setOpen, wrapperRef, panelRef } = useDropdown({ backCloses: !isPhone });
984
984
  const primaryOnly = usePrimaryPressOnly();
@@ -1357,7 +1357,7 @@ export function InlineEntityCombobox<V extends string | number, C extends ComboC
1357
1357
  {o.group && o.group !== matches[i - 1]?.group && (
1358
1358
  <li
1359
1359
  role="presentation"
1360
- className="px-4 pb-0.5 pt-3 text-[11px] font-semibold uppercase tracking-wide text-[var(--text-muted)]"
1360
+ className="px-4 pb-0.5 pt-3 text-caption font-semibold uppercase tracking-wide text-[var(--text-muted)]"
1361
1361
  >
1362
1362
  {o.group}
1363
1363
  </li>
@@ -1420,7 +1420,7 @@ export function InlineEntityCombobox<V extends string | number, C extends ComboC
1420
1420
  {o.group && o.group !== matches[i - 1]?.group && (
1421
1421
  <li
1422
1422
  role="presentation"
1423
- className="px-3 pb-0.5 pt-2 text-[11px] font-semibold uppercase tracking-wide text-[var(--text-muted)] first:pt-1"
1423
+ className="px-3 pb-0.5 pt-2 text-caption font-semibold uppercase tracking-wide text-[var(--text-muted)] first:pt-1"
1424
1424
  >
1425
1425
  {o.group}
1426
1426
  </li>
@@ -532,7 +532,7 @@ export function CountrySelect<Clearable extends boolean = false>({
532
532
  <div {...rest} className={className}>
533
533
  {box}
534
534
  {textHint && (
535
- <p id={hintId} className="mt-1 text-[11px] leading-tight text-[var(--text-muted)]">
535
+ <p id={hintId} className="mt-1 text-caption leading-tight text-[var(--text-muted)]">
536
536
  {hint}
537
537
  </p>
538
538
  )}
@@ -63,7 +63,7 @@ export function CurrencyFlag({ country, className, ...rest }: CurrencyFlagProps)
63
63
  // code printed next to it, and a reader that met both would hear the currency
64
64
  // twice.
65
65
  aria-hidden
66
- className={cn("fi inline-block w-5 h-[15px] rounded-sm shadow-[0_0_0_1px_rgba(0,0,0,0.08)] shrink-0", `fi-${country}`, className)}
66
+ className={cn("fi inline-block w-5 h-[0.9375rem] rounded-sm shadow-[0_0_0_1px_rgba(0,0,0,0.08)] shrink-0", `fi-${country}`, className)}
67
67
  />
68
68
  );
69
69
  }
@@ -341,7 +341,7 @@ export function CurrencySelect({
341
341
  is `absolute` with no `top`, so it opens at its place in the flow — under the
342
342
  caption, had the caption come first. */}
343
343
  {textHint && (
344
- <p id={hintId} className="mt-1 text-[11px] leading-tight text-[var(--text-muted)]">
344
+ <p id={hintId} className="mt-1 text-caption leading-tight text-[var(--text-muted)]">
345
345
  {hint}
346
346
  </p>
347
347
  )}
@@ -356,4 +356,4 @@ export function CurrencySelect({
356
356
 
357
357
  // The error line under a field — the type of `ui.tsx`'s (module-private) one, so a
358
358
  // CurrencySelect's message is indistinguishable from an Input's.
359
- const FIELD_ERROR_CLASS = "mt-1 text-[11px] leading-tight text-[var(--danger)]";
359
+ const FIELD_ERROR_CLASS = "mt-1 text-caption leading-tight text-[var(--danger)]";
@@ -1,6 +1,8 @@
1
1
  import { useCallback } from "react";
2
2
  import { X } from "lucide-react";
3
3
  import { cn } from "../lib/cn";
4
+ import { FIELD_TOUCH_TEXT } from "./ui";
5
+ import { FOCUS_RING } from "./focus-ring";
4
6
  import { MiniCalendar } from "./mini-calendar";
5
7
  import { dateRangePresets } from "../lib/dates";
6
8
  import { resolveFilter } from "./data-table-filters";
@@ -71,7 +73,11 @@ export function FilterPopover<T>({
71
73
  // border going from --border to --border-strong is not a location. The ring is, and it
72
74
  // is the package's brand focus colour, as on every field in ui.tsx.
73
75
  const inputBase =
74
- "block w-full rounded border border-[var(--border)] bg-[var(--bg-surface)] px-2 py-1.5 text-sm text-[var(--text-secondary)] placeholder:text-[var(--text-placeholder)] focus:border-[var(--border-strong)] focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--brand)]";
76
+ "block w-full rounded border border-[var(--border)] bg-[var(--bg-surface)] px-2 py-1.5 text-sm text-[var(--text-secondary)] placeholder:text-[var(--text-placeholder)] focus:border-[var(--border-strong)] focus:outline-none " +
77
+ FOCUS_RING +
78
+ " " +
79
+ // §10.1: a filter field is a field — 16 px on touch, or iOS zooms on focus.
80
+ FIELD_TOUCH_TEXT;
75
81
  const buttonBase =
76
82
  "rounded border border-[var(--border)] bg-[var(--bg-surface)] px-2 py-1 text-xs text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]";
77
83
 
@@ -3,6 +3,8 @@ import { ChevronLeft, ChevronRight } from "lucide-react";
3
3
  import { cn } from "../lib/cn";
4
4
  import { DEFAULT_DATA_TABLE_LABELS, type DataTableLabels } from "./data-table-labels";
5
5
  import { useKitLabels, useKitLocale } from "../i18n/kit-labels";
6
+ import { usePhoneLayout } from "../hooks/use-breakpoint";
7
+ import { useLargeText } from "../hooks/use-large-text";
6
8
 
7
9
  export const PAGE_SIZE_OPTIONS = [10, 25, 50, 100, 200] as const;
8
10
 
@@ -32,8 +34,28 @@ interface PaginationProps {
32
34
  density?: "comfortable" | "compact";
33
35
  }
34
36
 
37
+ /**
38
+ * How many page numbers flank the current one on the strip: ±2, and ±1 on a phone at
39
+ * Large and Extra large (0.32.1, the 360 px Extra-large sweep; docs/text-size-
40
+ * harmonization.md §4). At 150 % a number button is 42 px, and "‹ 1 2 3 … 494 ›" was
41
+ * 312 px on a 360 px phone's 262; one neighbour fewer on each side saves two buttons.
42
+ */
43
+ const PAGE_WINDOW = 2;
44
+ const PAGE_WINDOW_LARGE_PHONE = 1;
45
+
46
+ /**
47
+ * The strip's two parts (0.32.1, same sweep, §4 "nothing overflows"). The arrows keep
48
+ * the ends; the numbers between them wrap, centred, when even the narrower window does
49
+ * not fit — a middle page of a long list ("1 … 249 250 251 … 494") at Extra large, or at
50
+ * Normal on a narrow phone, where the one-row strip ran past the screen. Where the
51
+ * strip fits it is one row, as before.
52
+ */
53
+ const PAGE_STRIP = "flex min-w-0 max-w-full items-center gap-1";
54
+ const PAGE_NUMBERS = "flex min-w-0 flex-wrap items-center justify-center gap-1";
55
+
35
56
  /** Footer for {@link DataTable}: range summary, page-size select, and a
36
- * windowed page-number strip (first/last + ±2 around the current page). */
57
+ * windowed page-number strip (first/last + ±2 around the current page, ±1 on a phone
58
+ * at Large — see {@link PAGE_WINDOW}). */
37
59
  export function Pagination({
38
60
  page,
39
61
  totalPages,
@@ -57,15 +79,20 @@ export function Pagination({
57
79
  // summary is not formatted here — `pageRange` / `rowCount` take NUMBERS so the
58
80
  // translation can format them itself, alongside the words around them.
59
81
  const num = useMemo(() => new Intl.NumberFormat(locale), [locale]);
82
+ const large = useLargeText();
83
+ const phone = usePhoneLayout();
84
+ const radius = large && phone ? PAGE_WINDOW_LARGE_PHONE : PAGE_WINDOW;
60
85
  const visible = useMemo(() => {
61
- if (totalPages <= 7) return Array.from({ length: totalPages }, (_, i) => i);
86
+ // Every page when that is no longer than the window would be (first, last, the
87
+ // current one, its neighbours and two ellipses).
88
+ if (totalPages <= 2 * radius + 3) return Array.from({ length: totalPages }, (_, i) => i);
62
89
  const set = new Set<number>([0, totalPages - 1, page]);
63
- for (let d = 1; d <= 2; d++) {
90
+ for (let d = 1; d <= radius; d++) {
64
91
  if (page - d >= 0) set.add(page - d);
65
92
  if (page + d <= totalPages - 1) set.add(page + d);
66
93
  }
67
94
  return Array.from(set).sort((a, b) => a - b);
68
- }, [page, totalPages]);
95
+ }, [page, totalPages, radius]);
69
96
 
70
97
  const items: (number | "ellipsis")[] = [];
71
98
  visible.forEach((p, idx) => {
@@ -108,7 +135,7 @@ export function Pagination({
108
135
  )}
109
136
  </div>
110
137
  {pageSize !== Infinity && totalPages > 1 && (
111
- <div className="flex items-center gap-1">
138
+ <div data-slot="page-strip" className={PAGE_STRIP}>
112
139
  <button
113
140
  type="button"
114
141
  onClick={() => onPage(Math.max(0, page - 1))}
@@ -119,32 +146,34 @@ export function Pagination({
119
146
  {/* "Previous" points back along the line — left in LTR, right in RTL. */}
120
147
  <ChevronLeft className={cn("rtl:-scale-x-100", compact ? "size-3.5" : "size-4")} />
121
148
  </button>
122
- {items.map((it, i) =>
123
- it === "ellipsis" ? (
124
- <span key={`e${i}`} className="px-1 text-[var(--text-placeholder)]">
125
- …
126
- </span>
127
- ) : (
128
- <button
129
- key={it}
130
- type="button"
131
- onClick={() => onPage(it)}
132
- // Which page you are on is carried only by a background colour
133
- // otherwise, and the strip is a row of bare numbers with nothing
134
- // else to tell them apart.
135
- aria-current={it === page ? "page" : undefined}
136
- className={cn(
137
- "rounded",
138
- compact ? "min-w-6 px-1.5 py-0" : "min-w-7 px-2 py-0.5",
139
- it === page
140
- ? "bg-[var(--bg-inverse)] text-[var(--text-inverse)]"
141
- : "hover:bg-[var(--bg-hover)]",
142
- )}
143
- >
144
- {num.format(it + 1)}
145
- </button>
146
- ),
147
- )}
149
+ <div data-slot="page-numbers" className={PAGE_NUMBERS}>
150
+ {items.map((it, i) =>
151
+ it === "ellipsis" ? (
152
+ <span key={`e${i}`} className="px-1 text-[var(--text-placeholder)]">
153
+ …
154
+ </span>
155
+ ) : (
156
+ <button
157
+ key={it}
158
+ type="button"
159
+ onClick={() => onPage(it)}
160
+ // Which page you are on is carried only by a background colour
161
+ // otherwise, and the strip is a row of bare numbers with nothing
162
+ // else to tell them apart.
163
+ aria-current={it === page ? "page" : undefined}
164
+ className={cn(
165
+ "rounded",
166
+ compact ? "min-w-6 px-1.5 py-0" : "min-w-7 px-2 py-0.5",
167
+ it === page
168
+ ? "bg-[var(--bg-inverse)] text-[var(--text-inverse)]"
169
+ : "hover:bg-[var(--bg-hover)]",
170
+ )}
171
+ >
172
+ {num.format(it + 1)}
173
+ </button>
174
+ ),
175
+ )}
176
+ </div>
148
177
  <button
149
178
  type="button"
150
179
  onClick={() => onPage(Math.min(totalPages - 1, page + 1))}