@eifi1/ui-kit 0.51.4 → 0.51.6

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 (759) hide show
  1. package/README.md +5 -5
  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.d.ts +24 -2
  276. package/dist/components/treemap.js +28 -4
  277. package/dist/components/treemap.js.map +1 -1
  278. package/dist/components/trigger-aria.js.map +1 -1
  279. package/dist/components/use-table-state.js +14 -11
  280. package/dist/components/use-table-state.js.map +1 -1
  281. package/dist/components/user-avatar.js +3 -26
  282. package/dist/components/user-avatar.js.map +1 -1
  283. package/dist/demo/demo-start.js +8 -4
  284. package/dist/demo/demo-start.js.map +1 -1
  285. package/dist/eslint/index.js +1 -1
  286. package/dist/feedback/feedback-attachment-labels.js.map +1 -1
  287. package/dist/feedback/feedback-attachment.js +1 -8
  288. package/dist/feedback/feedback-attachment.js.map +1 -1
  289. package/dist/feedback/feedback-capture.d.ts +1 -1
  290. package/dist/feedback/feedback-capture.js +3 -1
  291. package/dist/feedback/feedback-capture.js.map +1 -1
  292. package/dist/feedback/feedback-comment-thread.js +27 -13
  293. package/dist/feedback/feedback-comment-thread.js.map +1 -1
  294. package/dist/feedback/feedback-context.js +1 -4
  295. package/dist/feedback/feedback-context.js.map +1 -1
  296. package/dist/feedback/feedback-dialog.js.map +1 -1
  297. package/dist/feedback/feedback-inbox.js.map +1 -1
  298. package/dist/feedback/feedback-public-list.js +7 -1
  299. package/dist/feedback/feedback-public-list.js.map +1 -1
  300. package/dist/feedback/feedback-record.js +1 -5
  301. package/dist/feedback/feedback-record.js.map +1 -1
  302. package/dist/feedback/feedback-replies.js +25 -10
  303. package/dist/feedback/feedback-replies.js.map +1 -1
  304. package/dist/feedback/feedback-row-detail.js.map +1 -1
  305. package/dist/feedback/feedback-status-undo.js.map +1 -1
  306. package/dist/feedback/feedback-submit-dialog.js.map +1 -1
  307. package/dist/feedback/feedback-table.js +4 -1
  308. package/dist/feedback/feedback-table.js.map +1 -1
  309. package/dist/feedback/feedback-thread.js +2 -13
  310. package/dist/feedback/feedback-thread.js.map +1 -1
  311. package/dist/feedback/feedback-vocabulary.js.map +1 -1
  312. package/dist/feedback/feedback-vote-button.js.map +1 -1
  313. package/dist/hooks/use-anchored-rect.js.map +1 -1
  314. package/dist/hooks/use-document-title.js.map +1 -1
  315. package/dist/hooks/use-file-drop.js.map +1 -1
  316. package/dist/hooks/use-file-picker-labels.js.map +1 -1
  317. package/dist/hooks/use-file-picker.js.map +1 -1
  318. package/dist/hooks/use-focus-trap.js.map +1 -1
  319. package/dist/hooks/use-overlay-history.js +10 -5
  320. package/dist/hooks/use-overlay-history.js.map +1 -1
  321. package/dist/hooks/use-row-swipe.d.ts +1 -1
  322. package/dist/hooks/use-row-swipe.js +1 -6
  323. package/dist/hooks/use-row-swipe.js.map +1 -1
  324. package/dist/i18n/defaults.js +1 -4
  325. package/dist/i18n/defaults.js.map +1 -1
  326. package/dist/i18n/german.js +4 -1
  327. package/dist/i18n/german.js.map +1 -1
  328. package/dist/i18n/kit-labels.js +2 -8
  329. package/dist/i18n/kit-labels.js.map +1 -1
  330. package/dist/i18n/languages.js.map +1 -1
  331. package/dist/i18n/locales/en.js +4 -1
  332. package/dist/i18n/locales/en.js.map +2 -2
  333. package/dist/i18n/locales/es.js +4 -1
  334. package/dist/i18n/locales/es.js.map +1 -1
  335. package/dist/i18n/locales/fr.js +4 -1
  336. package/dist/i18n/locales/fr.js.map +1 -1
  337. package/dist/i18n/locales/hu.js +4 -1
  338. package/dist/i18n/locales/hu.js.map +1 -1
  339. package/dist/i18n/locales/it.js +4 -1
  340. package/dist/i18n/locales/it.js.map +1 -1
  341. package/dist/i18n/locales/zh.js.map +1 -1
  342. package/dist/i18n/plurals.js.map +1 -1
  343. package/dist/i18n/review.js +13 -7
  344. package/dist/i18n/review.js.map +1 -1
  345. package/dist/i18n/shared-labels.js.map +1 -1
  346. package/dist/index.d.ts +16 -16
  347. package/dist/index.js +40 -23
  348. package/dist/index.js.map +1 -1
  349. package/dist/landing/access.js +1 -4
  350. package/dist/landing/access.js.map +1 -1
  351. package/dist/landing/landing-sections.js +35 -38
  352. package/dist/landing/landing-sections.js.map +1 -1
  353. package/dist/landing/page-seo.js.map +1 -1
  354. package/dist/lib/calc.js.map +1 -1
  355. package/dist/lib/clipboard-minus.js.map +1 -1
  356. package/dist/lib/dates.js.map +1 -1
  357. package/dist/lib/decimal-marks.js.map +1 -1
  358. package/dist/lib/device-settings.js +2 -1
  359. package/dist/lib/device-settings.js.map +1 -1
  360. package/dist/lib/direction.js.map +1 -1
  361. package/dist/lib/iban.js.map +1 -1
  362. package/dist/lib/logger.js +1 -5
  363. package/dist/lib/logger.js.map +1 -1
  364. package/dist/lib/person-name.js.map +1 -1
  365. package/dist/lib/phone.js.map +1 -1
  366. package/dist/lib/qr-encode.js +344 -8
  367. package/dist/lib/qr-encode.js.map +1 -1
  368. package/dist/lib/session-refresh.js.map +1 -1
  369. package/dist/lib/table-text.js +15 -3
  370. package/dist/lib/table-text.js.map +1 -1
  371. package/dist/lib/text-match.d.ts +4 -0
  372. package/dist/lib/text-match.js.map +1 -1
  373. package/dist/lib/translation-review.js.map +1 -1
  374. package/dist/notifications/notification-inbox.js +63 -44
  375. package/dist/notifications/notification-inbox.js.map +1 -1
  376. package/dist/notifications/notification-parts.js.map +1 -1
  377. package/dist/notifications/notification-types-setting.js.map +1 -1
  378. package/dist/notifications/notifications-labels.js.map +1 -1
  379. package/dist/notifications/push-device-setting.js +6 -1
  380. package/dist/notifications/push-device-setting.js.map +1 -1
  381. package/dist/notifications/push-devices-setting.js.map +1 -1
  382. package/dist/notifications/push-worker.js.map +1 -1
  383. package/dist/notifications/quiet-hours-setting.js.map +1 -1
  384. package/dist/notifications/use-push-device.js +4 -1
  385. package/dist/notifications/use-push-device.js.map +1 -1
  386. package/dist/offline/pwa-update-prompt.d.ts +1 -1
  387. package/dist/offline/pwa-update-prompt.js +7 -1
  388. package/dist/offline/pwa-update-prompt.js.map +1 -1
  389. package/dist/offline/query-persistence.js.map +1 -1
  390. package/dist/offline.d.ts +1 -1
  391. package/dist/offline.js +6 -1
  392. package/dist/offline.js.map +1 -1
  393. package/dist/pay/pay.css +8 -1
  394. package/dist/rhf/fields.d.ts +1 -2
  395. package/dist/rhf/fields.js +1 -10
  396. package/dist/rhf/fields.js.map +1 -1
  397. package/dist/rhf/form-core.js +1 -4
  398. package/dist/rhf/form-core.js.map +1 -1
  399. package/dist/rhf/line-items.js.map +1 -1
  400. package/dist/rhf/use-rhf-wizard-step.js.map +1 -1
  401. package/dist/search/command-palette.js +71 -62
  402. package/dist/search/command-palette.js.map +1 -1
  403. package/dist/search/global-search.js +34 -5
  404. package/dist/search/global-search.js.map +1 -1
  405. package/dist/search/search-index.js.map +1 -1
  406. package/dist/settings/device-reset-setting.js +1 -6
  407. package/dist/settings/device-reset-setting.js.map +1 -1
  408. package/dist/settings/settings-heading.js.map +1 -1
  409. package/dist/settings/settings-layout.js +9 -20
  410. package/dist/settings/settings-layout.js.map +1 -1
  411. package/dist/settings/use-settings-route.js.map +1 -1
  412. package/dist/shell/app-shell.js +62 -31
  413. package/dist/shell/app-shell.js.map +1 -1
  414. package/dist/shell/auth-layout.js +1 -10
  415. package/dist/shell/auth-layout.js.map +1 -1
  416. package/dist/shell/dev-menu.js +12 -6
  417. package/dist/shell/dev-menu.js.map +1 -1
  418. package/dist/shell/option-switcher-menu.js.map +1 -1
  419. package/dist/shell/sync-status-indicator.js +7 -6
  420. package/dist/shell/sync-status-indicator.js.map +1 -1
  421. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  422. package/dist/shell/topbar-action-menu.js.map +1 -1
  423. package/dist/shell/topbar-controls.js +1 -10
  424. package/dist/shell/topbar-controls.js.map +1 -1
  425. package/dist/shell/tour-menu.js +9 -1
  426. package/dist/shell/tour-menu.js.map +1 -1
  427. package/dist/sync/db.js.map +1 -1
  428. package/dist/sync/engine.js +24 -6
  429. package/dist/sync/engine.js.map +1 -1
  430. package/dist/sync.d.ts +2 -2
  431. package/dist/sync.js +7 -1
  432. package/dist/sync.js.map +1 -1
  433. package/dist/testing/css-variables.js.map +1 -1
  434. package/dist/testing/index.d.ts +1 -1
  435. package/dist/testing/index.js +1 -3
  436. package/dist/testing/index.js.map +1 -1
  437. package/dist/testing/react.js.map +1 -1
  438. package/dist/testing/viewport.js +7 -4
  439. package/dist/testing/viewport.js.map +1 -1
  440. package/dist/theme/contrast-tokens.js +13 -2
  441. package/dist/theme/contrast-tokens.js.map +1 -1
  442. package/dist/theme/contrast.d.ts +2 -2
  443. package/dist/theme/palette-derive.d.ts +1 -1
  444. package/dist/theme/palette-derive.js +18 -29
  445. package/dist/theme/palette-derive.js.map +1 -1
  446. package/dist/theme/palette-presets.js.map +1 -1
  447. package/dist/theme/palette-store.js.map +1 -1
  448. package/dist/theme/text-size.js.map +1 -1
  449. package/dist/theme/theme-store.js +1 -3
  450. package/dist/theme/theme-store.js.map +1 -1
  451. package/dist/tour/tour-catalogue.js.map +1 -1
  452. package/dist/tour/tour-dock.js +5 -1
  453. package/dist/tour/tour-dock.js.map +1 -1
  454. package/dist/tour/tour-engine.js +1 -4
  455. package/dist/tour/tour-engine.js.map +1 -1
  456. package/dist/tour/tour.js +21 -12
  457. package/dist/tour/tour.js.map +1 -1
  458. package/dist/tour/use-tour-progress.js.map +1 -1
  459. package/dist/tour/use-tour-url-sync.js.map +1 -1
  460. package/dist/wizard/stepper-nav.js +3 -24
  461. package/dist/wizard/stepper-nav.js.map +1 -1
  462. package/dist/wizard/types.js.map +1 -1
  463. package/dist/wizard/use-wizard.js +24 -28
  464. package/dist/wizard/use-wizard.js.map +1 -1
  465. package/dist/wizard/validation.js.map +1 -1
  466. package/dist/wizard/wizard-context.js.map +1 -1
  467. package/dist/wizard/wizard-step.d.ts +1 -1
  468. package/dist/wizard/wizard-step.js +1 -8
  469. package/dist/wizard/wizard-step.js.map +1 -1
  470. package/dist/wizard/wizard-summary.js.map +1 -1
  471. package/package.json +5 -2
  472. package/src/account/account-settings-labels.ts +1 -2
  473. package/src/account/account-settings.tsx +11 -17
  474. package/src/account/delete-account-setting.tsx +1 -6
  475. package/src/account/email-change-setting-labels.ts +1 -2
  476. package/src/account/email-change-setting.tsx +3 -1
  477. package/src/account/passkeys-setting.tsx +1 -3
  478. package/src/account/sessions-setting.tsx +4 -2
  479. package/src/admin/admin-action-confirm.tsx +4 -7
  480. package/src/admin/admin-action-log.tsx +29 -29
  481. package/src/admin/admin-area-labels.ts +4 -1
  482. package/src/admin/admin-overview.tsx +8 -2
  483. package/src/admin/admin-sections.tsx +3 -1
  484. package/src/admin/admin-tool-links.tsx +7 -1
  485. package/src/admin/invitations-panel.tsx +5 -11
  486. package/src/admin/mail-test-card.tsx +1 -2
  487. package/src/admin/reviewer-scope-editor.tsx +4 -9
  488. package/src/admin/role-select.tsx +4 -2
  489. package/src/admin/user-roster.tsx +2 -11
  490. package/src/auth/accept-invitation.tsx +1 -7
  491. package/src/auth/auth-errors.ts +1 -6
  492. package/src/auth/forgot-password-form.tsx +2 -7
  493. package/src/auth/register-form.tsx +7 -8
  494. package/src/auth/reset-password-form.tsx +2 -5
  495. package/src/auth/sign-in-form.tsx +15 -14
  496. package/src/auth/verify-email.tsx +2 -7
  497. package/src/billing/billing-banner.tsx +3 -7
  498. package/src/billing/billing-labels.ts +6 -4
  499. package/src/billing/checkout-processing.ts +0 -1
  500. package/src/billing/plan-card.tsx +9 -8
  501. package/src/billing/plan-limit-toast.tsx +1 -2
  502. package/src/billing/plan-limit.ts +1 -2
  503. package/src/billing/plan-price.ts +1 -4
  504. package/src/billing/plan-switch.tsx +1 -2
  505. package/src/billing/subscription-actions.tsx +5 -2
  506. package/src/components/account-chips.tsx +1 -7
  507. package/src/components/alert-banner.tsx +2 -8
  508. package/src/components/amount-input.tsx +206 -178
  509. package/src/components/authed-image.tsx +7 -4
  510. package/src/components/autocomplete.tsx +7 -9
  511. package/src/components/bulk-action-bar.tsx +2 -7
  512. package/src/components/button-group.tsx +1 -2
  513. package/src/components/button-look.ts +6 -17
  514. package/src/components/button.tsx +1 -4
  515. package/src/components/calculator.tsx +6 -9
  516. package/src/components/calendar-heatmap.tsx +5 -10
  517. package/src/components/card.tsx +9 -13
  518. package/src/components/chart-zoom-core.tsx +6 -33
  519. package/src/components/chart.tsx +8 -31
  520. package/src/components/checkbox-group.tsx +1 -4
  521. package/src/components/chip-input.tsx +6 -6
  522. package/src/components/chip.tsx +14 -26
  523. package/src/components/choice-card.tsx +4 -18
  524. package/src/components/column-mapper-labels.ts +3 -10
  525. package/src/components/column-mapper.tsx +33 -122
  526. package/src/components/combobox-core.tsx +12 -42
  527. package/src/components/combobox.tsx +2 -6
  528. package/src/components/confirm-dialog.tsx +1 -3
  529. package/src/components/copy-button.tsx +2 -4
  530. package/src/components/country-select.tsx +9 -21
  531. package/src/components/currency-option-list.tsx +13 -14
  532. package/src/components/currency-select.tsx +2 -7
  533. package/src/components/danger-confirm.tsx +8 -9
  534. package/src/components/data-table-cells.tsx +1 -2
  535. package/src/components/data-table-column-settings.tsx +1 -3
  536. package/src/components/data-table-filter-popover.tsx +5 -19
  537. package/src/components/data-table-filters.ts +1 -6
  538. package/src/components/data-table-fit.ts +1 -3
  539. package/src/components/data-table-groups.tsx +3 -1
  540. package/src/components/data-table-head.tsx +27 -45
  541. package/src/components/data-table-mobile.tsx +99 -108
  542. package/src/components/data-table-pagination.tsx +2 -6
  543. package/src/components/data-table-row-actions.tsx +25 -24
  544. package/src/components/data-table-row.tsx +16 -17
  545. package/src/components/data-table-shared.tsx +10 -16
  546. package/src/components/data-table-sort.ts +1 -2
  547. package/src/components/data-table-virtual.ts +9 -4
  548. package/src/components/data-table.tsx +489 -501
  549. package/src/components/date-picker.tsx +1 -7
  550. package/src/components/date-range-picker.tsx +3 -13
  551. package/src/components/description-list.tsx +7 -13
  552. package/src/components/dialog-frame.tsx +12 -3
  553. package/src/components/disclosure.tsx +8 -12
  554. package/src/components/dropdown.tsx +3 -11
  555. package/src/components/empty-state.tsx +1 -3
  556. package/src/components/entity-combobox.tsx +2 -6
  557. package/src/components/error-boundary.tsx +7 -7
  558. package/src/components/field-base.tsx +8 -14
  559. package/src/components/field-parts.tsx +12 -23
  560. package/src/components/field-sync.tsx +7 -11
  561. package/src/components/file-button.tsx +7 -3
  562. package/src/components/file-dropzone.tsx +7 -12
  563. package/src/components/floating-panel.tsx +44 -51
  564. package/src/components/focus-ring.ts +1 -2
  565. package/src/components/form-actions.tsx +1 -4
  566. package/src/components/grouped-picker.tsx +6 -8
  567. package/src/components/hover-menu.tsx +1 -4
  568. package/src/components/iban-input-labels.ts +1 -2
  569. package/src/components/icon-button.tsx +46 -48
  570. package/src/components/icon-picker.tsx +4 -17
  571. package/src/components/image-grid.tsx +1 -6
  572. package/src/components/inline-edit-field.tsx +1 -5
  573. package/src/components/inline-entity-combobox.tsx +6 -21
  574. package/src/components/input.tsx +14 -2
  575. package/src/components/jump-calendar.tsx +2 -6
  576. package/src/components/legal-labels.ts +1 -2
  577. package/src/components/legal-page.tsx +18 -7
  578. package/src/components/legal.tsx +14 -5
  579. package/src/components/lightbox.tsx +1 -3
  580. package/src/components/line-items.tsx +7 -15
  581. package/src/components/list.tsx +29 -25
  582. package/src/components/measured-grid.tsx +8 -30
  583. package/src/components/menu-item.tsx +1 -3
  584. package/src/components/mini-calendar.tsx +129 -159
  585. package/src/components/money-field.tsx +4 -2
  586. package/src/components/month-picker.tsx +14 -21
  587. package/src/components/multi-entity-combobox.tsx +6 -26
  588. package/src/components/multi-select.tsx +5 -9
  589. package/src/components/nav-pills.tsx +10 -2
  590. package/src/components/number-field.tsx +18 -15
  591. package/src/components/number-input.tsx +3 -19
  592. package/src/components/numpad-sheet.tsx +9 -13
  593. package/src/components/one-time-code-input.tsx +6 -11
  594. package/src/components/page-contents.tsx +2 -9
  595. package/src/components/page-header.tsx +5 -10
  596. package/src/components/password-strength-labels.ts +1 -2
  597. package/src/components/password-strength.tsx +6 -9
  598. package/src/components/phone-input.tsx +2 -13
  599. package/src/components/picker-sheet.tsx +2 -5
  600. package/src/components/pie-chart.tsx +6 -12
  601. package/src/components/popover.tsx +2 -1
  602. package/src/components/progress-bar.tsx +16 -25
  603. package/src/components/qr-code.tsx +2 -9
  604. package/src/components/row-actions.tsx +9 -1
  605. package/src/components/search-field.tsx +4 -5
  606. package/src/components/select.tsx +2 -10
  607. package/src/components/separator.tsx +1 -5
  608. package/src/components/series-chart-axes.ts +5 -5
  609. package/src/components/series-chart-budget.ts +1 -4
  610. package/src/components/series-chart-ticks.ts +1 -4
  611. package/src/components/series-chart.tsx +43 -83
  612. package/src/components/settings-fields.tsx +20 -15
  613. package/src/components/share-card.tsx +6 -14
  614. package/src/components/sign-chip.tsx +16 -16
  615. package/src/components/signature-pad.tsx +21 -13
  616. package/src/components/signed-amount.tsx +6 -14
  617. package/src/components/skeleton.tsx +2 -13
  618. package/src/components/slider.tsx +9 -20
  619. package/src/components/sparkline.tsx +2 -13
  620. package/src/components/stat-tile.tsx +13 -24
  621. package/src/components/swatch-picker.tsx +8 -3
  622. package/src/components/swipeable-row.tsx +2 -11
  623. package/src/components/table-skeleton.tsx +4 -1
  624. package/src/components/table.tsx +12 -8
  625. package/src/components/tabs.tsx +24 -39
  626. package/src/components/text-link.tsx +6 -6
  627. package/src/components/text.tsx +1 -2
  628. package/src/components/tile-radio.tsx +6 -19
  629. package/src/components/time-input.tsx +4 -5
  630. package/src/components/toast.tsx +3 -12
  631. package/src/components/toggle-group.tsx +9 -9
  632. package/src/components/toggle-legend.tsx +4 -16
  633. package/src/components/tooltip.tsx +9 -48
  634. package/src/components/translation-review-editor.tsx +4 -4
  635. package/src/components/translation-review-parts.tsx +7 -1
  636. package/src/components/translation-review.tsx +15 -16
  637. package/src/components/tree-view.tsx +17 -20
  638. package/src/components/treemap.tsx +59 -9
  639. package/src/components/trigger-aria.ts +1 -4
  640. package/src/components/use-table-state.ts +16 -17
  641. package/src/components/user-avatar.tsx +4 -21
  642. package/src/demo/demo-start.tsx +8 -4
  643. package/src/feedback/feedback-attachment-labels.ts +2 -1
  644. package/src/feedback/feedback-attachment.tsx +16 -29
  645. package/src/feedback/feedback-capture.ts +3 -1
  646. package/src/feedback/feedback-comment-thread.tsx +9 -6
  647. package/src/feedback/feedback-context.tsx +1 -4
  648. package/src/feedback/feedback-dialog.tsx +3 -4
  649. package/src/feedback/feedback-inbox.tsx +3 -9
  650. package/src/feedback/feedback-public-list.tsx +7 -1
  651. package/src/feedback/feedback-record.ts +6 -14
  652. package/src/feedback/feedback-replies.tsx +10 -5
  653. package/src/feedback/feedback-row-detail.tsx +2 -5
  654. package/src/feedback/feedback-status-undo.ts +1 -4
  655. package/src/feedback/feedback-submit-dialog.tsx +4 -4
  656. package/src/feedback/feedback-table.tsx +12 -8
  657. package/src/feedback/feedback-thread.tsx +4 -16
  658. package/src/feedback/feedback-vocabulary.ts +72 -82
  659. package/src/feedback/feedback-vote-button.tsx +9 -8
  660. package/src/hooks/use-anchored-rect.ts +1 -4
  661. package/src/hooks/use-document-title.ts +3 -1
  662. package/src/hooks/use-file-drop.ts +1 -3
  663. package/src/hooks/use-file-picker-labels.ts +1 -2
  664. package/src/hooks/use-file-picker.tsx +1 -5
  665. package/src/hooks/use-focus-trap.ts +1 -2
  666. package/src/hooks/use-overlay-history.ts +10 -5
  667. package/src/hooks/use-row-swipe.ts +1 -6
  668. package/src/i18n/defaults.ts +1 -4
  669. package/src/i18n/german.ts +33 -49
  670. package/src/i18n/kit-labels.tsx +5 -20
  671. package/src/i18n/languages.ts +2 -8
  672. package/src/i18n/locales/en.ts +11 -31
  673. package/src/i18n/locales/es.ts +35 -49
  674. package/src/i18n/locales/fr.ts +34 -51
  675. package/src/i18n/locales/hu.ts +26 -37
  676. package/src/i18n/locales/it.ts +35 -52
  677. package/src/i18n/locales/zh.ts +14 -32
  678. package/src/i18n/plurals.ts +4 -1
  679. package/src/i18n/review.ts +18 -7
  680. package/src/i18n/shared-labels.ts +1 -2
  681. package/src/index.ts +106 -32
  682. package/src/landing/access.ts +2 -7
  683. package/src/landing/landing-sections.tsx +14 -15
  684. package/src/landing/page-seo.ts +1 -3
  685. package/src/lib/calc.ts +4 -1
  686. package/src/lib/clipboard-minus.ts +4 -1
  687. package/src/lib/dates.ts +2 -10
  688. package/src/lib/decimal-marks.ts +1 -3
  689. package/src/lib/device-settings.ts +2 -1
  690. package/src/lib/direction.ts +1 -3
  691. package/src/lib/iban.ts +89 -9
  692. package/src/lib/logger.ts +1 -5
  693. package/src/lib/person-name.ts +1 -3
  694. package/src/lib/phone.ts +5 -8
  695. package/src/lib/qr-encode.ts +32 -8
  696. package/src/lib/session-refresh.ts +5 -6
  697. package/src/lib/table-text.ts +24 -6
  698. package/src/lib/text-match.ts +15 -3
  699. package/src/lib/translation-review.ts +1 -3
  700. package/src/notifications/notification-inbox.tsx +17 -4
  701. package/src/notifications/notification-parts.tsx +1 -2
  702. package/src/notifications/notification-types-setting.tsx +19 -18
  703. package/src/notifications/notifications-labels.ts +1 -2
  704. package/src/notifications/push-device-setting.tsx +7 -1
  705. package/src/notifications/push-devices-setting.tsx +7 -3
  706. package/src/notifications/push-worker.ts +10 -2
  707. package/src/notifications/quiet-hours-setting.tsx +4 -1
  708. package/src/notifications/use-push-device.ts +4 -1
  709. package/src/offline/pwa-update-prompt.tsx +7 -1
  710. package/src/offline/query-persistence.ts +9 -6
  711. package/src/offline.ts +6 -1
  712. package/src/rhf/fields.tsx +50 -19
  713. package/src/rhf/form-core.tsx +2 -6
  714. package/src/rhf/line-items.tsx +5 -7
  715. package/src/rhf/use-rhf-wizard-step.ts +3 -12
  716. package/src/search/command-palette.tsx +15 -23
  717. package/src/search/global-search.tsx +38 -8
  718. package/src/search/search-index.ts +5 -1
  719. package/src/settings/device-reset-setting.tsx +5 -8
  720. package/src/settings/settings-heading.tsx +3 -1
  721. package/src/settings/settings-layout.tsx +6 -13
  722. package/src/settings/use-settings-route.ts +4 -3
  723. package/src/shell/app-shell.tsx +48 -24
  724. package/src/shell/auth-layout.tsx +1 -6
  725. package/src/shell/dev-menu.tsx +12 -6
  726. package/src/shell/option-switcher-menu.tsx +1 -3
  727. package/src/shell/sync-status-indicator.tsx +14 -12
  728. package/src/shell/top-bar-parts-labels.ts +1 -3
  729. package/src/shell/topbar-action-menu.tsx +9 -8
  730. package/src/shell/topbar-controls.tsx +5 -19
  731. package/src/shell/tour-menu.tsx +9 -1
  732. package/src/sync/db.ts +5 -1
  733. package/src/sync/engine.ts +44 -12
  734. package/src/sync.ts +16 -2
  735. package/src/testing/css-variables.ts +1 -2
  736. package/src/testing/index.ts +1 -6
  737. package/src/testing/react.ts +1 -2
  738. package/src/testing/viewport.ts +9 -9
  739. package/src/theme/contrast-tokens.ts +13 -2
  740. package/src/theme/palette-derive.ts +24 -50
  741. package/src/theme/palette-presets.ts +0 -1
  742. package/src/theme/palette-store.ts +1 -4
  743. package/src/theme/text-size.ts +1 -1
  744. package/src/theme/theme-store.ts +2 -6
  745. package/src/tour/tour-catalogue.tsx +4 -2
  746. package/src/tour/tour-dock.ts +5 -1
  747. package/src/tour/tour-engine.ts +2 -6
  748. package/src/tour/tour.tsx +28 -12
  749. package/src/tour/use-tour-progress.ts +8 -2
  750. package/src/tour/use-tour-url-sync.ts +3 -1
  751. package/src/vite-env.d.ts +1 -4
  752. package/src/wizard/stepper-nav.tsx +10 -35
  753. package/src/wizard/types.ts +1 -4
  754. package/src/wizard/use-wizard.ts +28 -43
  755. package/src/wizard/validation.ts +1 -5
  756. package/src/wizard/wizard-context.tsx +2 -6
  757. package/src/wizard/wizard-step.tsx +1 -8
  758. package/src/wizard/wizard-summary.tsx +2 -6
  759. package/tokens.css +393 -152
@@ -29,7 +29,13 @@ import {
29
29
  type RowGroup,
30
30
  } from "./data-table-groups";
31
31
  export type { DataTableGroupBy, DataTableLoadMore } from "./data-table-groups";
32
- import { VIRTUAL_SELECT_COL, rowNavTarget, useRowWindow, type DataTableVirtualize, type VirtualGroup } from "./data-table-virtual";
32
+ import {
33
+ VIRTUAL_SELECT_COL,
34
+ rowNavTarget,
35
+ useRowWindow,
36
+ type DataTableVirtualize,
37
+ type VirtualGroup,
38
+ } from "./data-table-virtual";
33
39
  export type { DataTableVirtualize } from "./data-table-virtual";
34
40
  import { ColumnSettingsPanel } from "./data-table-column-settings";
35
41
  import { useLargeText } from "../hooks/use-large-text";
@@ -46,7 +52,12 @@ import { FullBleedDialog } from "./full-bleed-dialog";
46
52
  import { usePhoneLayout } from "../hooks/use-breakpoint";
47
53
  import { useAnnounce } from "../hooks/use-announce";
48
54
  import { DEFAULT_DATA_TABLE_LABELS, type DataTableLabels } from "./data-table-labels";
49
- import { useKitLabelOverrides, useKitLocale, useKitTableStorageKeyPrefix, type LabelOverride } from "../i18n/kit-labels";
55
+ import {
56
+ useKitLabelOverrides,
57
+ useKitLocale,
58
+ useKitTableStorageKeyPrefix,
59
+ type LabelOverride,
60
+ } from "../i18n/kit-labels";
50
61
  import { useEdgeFade } from "../lib/strip-fade";
51
62
  import { dirOf, type Direction } from "../lib/direction";
52
63
 
@@ -909,8 +920,7 @@ export interface DataTableDesktopSwipeActions<T> {
909
920
  * its borders, and a collapsed border belongs to the TABLE, not the cell, so it stays
910
921
  * behind at the bottom of the rows while the sticky cell rides over them.
911
922
  */
912
- const FOOTER_CELL =
913
- "sticky bottom-0 z-10 bg-surface-2 shadow-[inset_0_2px_0_var(--border-strong)]";
923
+ const FOOTER_CELL = "sticky bottom-0 z-10 bg-surface-2 shadow-[inset_0_2px_0_var(--border-strong)]";
914
924
 
915
925
  // ---------- Phone sort control (keksdose K10) ----------
916
926
 
@@ -954,8 +964,6 @@ const NO_VIRTUAL_OPTIONS: DataTableVirtualize = {};
954
964
 
955
965
  // ---------- Main DataTable ----------
956
966
 
957
-
958
-
959
967
  import { DEFAULT_PERSIST_PREFIX, useTableState, type TableUrlSync } from "./use-table-state";
960
968
  import { useMobileReveal } from "./use-mobile-reveal";
961
969
  import { GROW_CELL_CLASS, GROW_PEER_CELL_CLASS, useColumnFit } from "./data-table-fit";
@@ -1285,7 +1293,7 @@ export function DataTable<T>({
1285
1293
  // "clear all"). Only touches keys the table actually exposes as filters.
1286
1294
  const clearAllFilters = () => {
1287
1295
  const keys = columns
1288
- .filter((col) => ((!serverRows || onFiltersChange) ? resolveFilter(col) : null))
1296
+ .filter((col) => (!serverRows || onFiltersChange ? resolveFilter(col) : null))
1289
1297
  .map((col) => col.key);
1290
1298
  if (!keys.length) return;
1291
1299
  if (onFiltersChange) {
@@ -1548,8 +1556,7 @@ export function DataTable<T>({
1548
1556
  // and screen reader's way — enters the mode: every card shows its box and a tap
1549
1557
  // toggles it. The mode lasts while anything is selected, so emptying the selection
1550
1558
  // (the bulk bar's Clear, the last box unticked, Cancel) leaves it, as kk's does.
1551
- const anySelected =
1552
- !!selection && (selection.someSelected || (selection.allSelected && slice.length > 0));
1559
+ const anySelected = !!selection && (selection.someSelected || (selection.allSelected && slice.length > 0));
1553
1560
  const [phoneSelectMode, setPhoneSelectMode] = useState(false);
1554
1561
  const [hadSelection, setHadSelection] = useState(anySelected);
1555
1562
  if (anySelected !== hadSelection) {
@@ -1708,7 +1715,12 @@ export function DataTable<T>({
1708
1715
  continue;
1709
1716
  }
1710
1717
  g1.children.forEach((g2, j) => {
1711
- virtualGroups.push({ start: g2.start, end: g2.start + g2.rows.length, bands: j === 0 ? BAND_1_2 : BAND_2, first });
1718
+ virtualGroups.push({
1719
+ start: g2.start,
1720
+ end: g2.start + g2.rows.length,
1721
+ bands: j === 0 ? BAND_1_2 : BAND_2,
1722
+ first,
1723
+ });
1712
1724
  virtualBands.push({ g1, g2 });
1713
1725
  });
1714
1726
  }
@@ -1799,266 +1811,247 @@ export function DataTable<T>({
1799
1811
  data-table-toolbar=""
1800
1812
  className={cn(
1801
1813
  "flex flex-wrap items-center gap-2",
1802
- frame
1803
- ? cn("border-b border-subtle", compact ? "px-2 py-1.5" : "px-3 py-2")
1804
- : "pb-3",
1814
+ frame ? cn("border-b border-subtle", compact ? "px-2 py-1.5" : "px-3 py-2") : "pb-3",
1805
1815
  )}
1806
1816
  >
1807
1817
  {toolbar}
1808
1818
  </div>
1809
1819
  )}
1810
1820
  {!isMdUp && (
1811
- <div ref={mobileRootRef} className={cn(fillHeight && "flex min-h-0 flex-1 flex-col")}>
1812
- {/* Mobile filter access (feedback #299): the per-column filter popovers
1821
+ <div ref={mobileRootRef} className={cn(fillHeight && "flex min-h-0 flex-1 flex-col")}>
1822
+ {/* Mobile filter access (feedback #299): the per-column filter popovers
1813
1823
  live in the desktop header, which the card list doesn't render — so
1814
1824
  expose the same filters through a bottom sheet here. */}
1815
- {(!serverRows || onFiltersChange) && (
1816
- <MobileFilters
1817
- columns={columns}
1818
- filters={filters}
1819
- selectOptionsByKey={selectOptionsByKey}
1820
- isServer={serverRows}
1821
- hasFilterCallback={!!onFiltersChange}
1822
- onSetFilter={setFilterValue}
1823
- onClearFilter={clearFilter}
1824
- onClearAll={clearAllFilters}
1825
- labels={labels}
1826
- locale={locale}
1827
- />
1828
- )}
1829
- {mobileSort && (
1830
- <MobileSort
1831
- columns={visibleColumns.filter((c) => (!serverRows || !!onSortsChange) && !!c.sortBy)}
1832
- sorts={sorts}
1833
- sortCycle={sortCycle}
1834
- compact={compact}
1835
- labels={labels}
1836
- onPick={(key) => {
1837
- if (key === null) {
1838
- if (sorts.length > 0) commitSorts([], sorts[0].key);
1839
- return;
1840
- }
1841
- if (sorts[0]?.key === key) return;
1842
- // A newly picked column starts where its header's first click would.
1843
- const col = columns.find((c) => c.key === key);
1844
- commitSorts([{ key, dir: col?.firstSort ?? "asc" }], key);
1845
- }}
1846
- onFlip={() => {
1847
- if (sorts.length === 0) return;
1848
- commitSorts(
1849
- sorts.map((s, i) => (i === 0 ? { ...s, dir: flipDir(s.dir) } : s)),
1850
- sorts[0].key,
1851
- );
1852
- }}
1853
- />
1854
- )}
1855
- {selection && (
1856
- <MobileSelectBar
1857
- active={phoneSelecting}
1858
- allSelected={selection.allSelected}
1859
- someSelected={selection.someSelected}
1860
- compact={compact}
1861
- labels={labels}
1862
- onEnter={() => setPhoneSelectMode(true)}
1863
- onToggleAll={selection.onToggleAll}
1864
- onCancel={() => {
1865
- setPhoneSelectMode(false);
1866
- if (anySelected) selection.onToggleAll(false);
1867
- }}
1868
- />
1869
- )}
1870
- <ul
1871
- ref={phoneListRef}
1872
- className={cn(
1873
- "divide-y divide-subtle",
1874
- // Under `fillHeight` the list takes the room its parent gives it, and in a
1875
- // BOUNDED parent it is the scroller, as the table body is on a wide screen:
1876
- // the filter button stays above it and a server pager below. Only then —
1877
- // see `phoneListScrolls` (live #420). The endless-scroll sentinel still
1878
- // fires in here — an IntersectionObserver on the viewport sees through the
1879
- // clipping ancestor.
1880
- fillHeight && "min-h-0 flex-1",
1881
- fillHeight && phoneListScrolls && "overflow-y-auto overscroll-contain",
1882
- // Same busy treatment as the desktop body; see `isLoading` below.
1883
- isLoading && mobileSlice.length > 0 && "opacity-60 transition-opacity",
1884
- )}
1885
- aria-busy={isLoading || undefined}
1886
- >
1887
- {mobileGroups
1888
- ? mobileGroups.map((g) => (
1889
- <Fragment key={`hb-group:${g.key}`}>
1890
- <li className="sticky top-0 z-10 flex flex-wrap items-baseline justify-between gap-x-3 bg-surface-2 px-4 py-1.5 text-xs font-semibold uppercase tracking-wide text-muted backdrop-blur">
1891
- <span className="min-w-0">
1892
- {mobileGroupLabel
1893
- ? mobileGroupLabel(g.key)
1894
- : mobileLevel?.label
1895
- ? mobileLevel.label(g.key, g.rows)
1896
- : g.key}
1897
- </span>
1898
- {mobileLevel?.end && <span className="ms-auto tabular-nums">{mobileLevel.end(g.key, g.rows)}</span>}
1899
- </li>
1900
- {g.rows.map(renderMobileRow)}
1901
- </Fragment>
1902
- ))
1903
- : mobileSlice.map(renderMobileRow)}
1904
- {mobileSlice.length === 0 && (
1905
- <li
1906
- className={cn(
1907
- "text-center text-muted",
1908
- compact ? "px-3 py-3 text-xs" : "px-4 py-6 text-sm",
1909
- )}
1910
- >
1911
- {isLoading ? <LoadingText label={labels.loading} /> : (empty ?? labels.empty)}
1912
- </li>
1913
- )}
1914
- {/* Endless-scroll sentinel: observed by IntersectionObserver to pull in
1915
- the next chunk as it nears the viewport (feedback #232). */}
1916
- {canRevealMoreMobile && (
1917
- <li
1918
- ref={loadMoreRef}
1919
- className="px-4 py-4 text-center text-xs text-placeholder"
1920
- >
1921
- {/* Isolated for the reason spelled out on LoadingText. */}
1922
- <bdi>{labels.loading}</bdi>
1923
- </li>
1825
+ {(!serverRows || onFiltersChange) && (
1826
+ <MobileFilters
1827
+ columns={columns}
1828
+ filters={filters}
1829
+ selectOptionsByKey={selectOptionsByKey}
1830
+ isServer={serverRows}
1831
+ hasFilterCallback={!!onFiltersChange}
1832
+ onSetFilter={setFilterValue}
1833
+ onClearFilter={clearFilter}
1834
+ onClearAll={clearAllFilters}
1835
+ labels={labels}
1836
+ locale={locale}
1837
+ />
1924
1838
  )}
1925
- {/* The owner's next slice (0.48), once every row held is revealed. */}
1926
- {loadMore && !canRevealMoreMobile && (
1927
- <DataTableLoadMoreFooter
1928
- as="li"
1929
- loadMore={loadMore}
1930
- rowCount={sorted.length}
1839
+ {mobileSort && (
1840
+ <MobileSort
1841
+ columns={visibleColumns.filter((c) => (!serverRows || !!onSortsChange) && !!c.sortBy)}
1842
+ sorts={sorts}
1843
+ sortCycle={sortCycle}
1844
+ compact={compact}
1931
1845
  labels={labels}
1846
+ onPick={(key) => {
1847
+ if (key === null) {
1848
+ if (sorts.length > 0) commitSorts([], sorts[0].key);
1849
+ return;
1850
+ }
1851
+ if (sorts[0]?.key === key) return;
1852
+ // A newly picked column starts where its header's first click would.
1853
+ const col = columns.find((c) => c.key === key);
1854
+ commitSorts([{ key, dir: col?.firstSort ?? "asc" }], key);
1855
+ }}
1856
+ onFlip={() => {
1857
+ if (sorts.length === 0) return;
1858
+ commitSorts(
1859
+ sorts.map((s, i) => (i === 0 ? { ...s, dir: flipDir(s.dir) } : s)),
1860
+ sorts[0].key,
1861
+ );
1862
+ }}
1863
+ />
1864
+ )}
1865
+ {selection && (
1866
+ <MobileSelectBar
1867
+ active={phoneSelecting}
1868
+ allSelected={selection.allSelected}
1869
+ someSelected={selection.someSelected}
1932
1870
  compact={compact}
1871
+ labels={labels}
1872
+ onEnter={() => setPhoneSelectMode(true)}
1873
+ onToggleAll={selection.onToggleAll}
1874
+ onCancel={() => {
1875
+ setPhoneSelectMode(false);
1876
+ if (anySelected) selection.onToggleAll(false);
1877
+ }}
1933
1878
  />
1934
1879
  )}
1935
- </ul>
1936
- {/* The phone's totals: a summary card after the list rather than one more
1880
+ <ul
1881
+ ref={phoneListRef}
1882
+ className={cn(
1883
+ "divide-y divide-subtle",
1884
+ // Under `fillHeight` the list takes the room its parent gives it, and in a
1885
+ // BOUNDED parent it is the scroller, as the table body is on a wide screen:
1886
+ // the filter button stays above it and a server pager below. Only then —
1887
+ // see `phoneListScrolls` (live #420). The endless-scroll sentinel still
1888
+ // fires in here — an IntersectionObserver on the viewport sees through the
1889
+ // clipping ancestor.
1890
+ fillHeight && "min-h-0 flex-1",
1891
+ fillHeight && phoneListScrolls && "overflow-y-auto overscroll-contain",
1892
+ // Same busy treatment as the desktop body; see `isLoading` below.
1893
+ isLoading && mobileSlice.length > 0 && "opacity-60 transition-opacity",
1894
+ )}
1895
+ aria-busy={isLoading || undefined}
1896
+ >
1897
+ {mobileGroups
1898
+ ? mobileGroups.map((g) => (
1899
+ <Fragment key={`hb-group:${g.key}`}>
1900
+ <li className="sticky top-0 z-10 flex flex-wrap items-baseline justify-between gap-x-3 bg-surface-2 px-4 py-1.5 text-xs font-semibold uppercase tracking-wide text-muted backdrop-blur">
1901
+ <span className="min-w-0">
1902
+ {mobileGroupLabel
1903
+ ? mobileGroupLabel(g.key)
1904
+ : mobileLevel?.label
1905
+ ? mobileLevel.label(g.key, g.rows)
1906
+ : g.key}
1907
+ </span>
1908
+ {mobileLevel?.end && (
1909
+ <span className="ms-auto tabular-nums">{mobileLevel.end(g.key, g.rows)}</span>
1910
+ )}
1911
+ </li>
1912
+ {g.rows.map(renderMobileRow)}
1913
+ </Fragment>
1914
+ ))
1915
+ : mobileSlice.map(renderMobileRow)}
1916
+ {mobileSlice.length === 0 && (
1917
+ <li className={cn("text-center text-muted", compact ? "px-3 py-3 text-xs" : "px-4 py-6 text-sm")}>
1918
+ {isLoading ? <LoadingText label={labels.loading} /> : (empty ?? labels.empty)}
1919
+ </li>
1920
+ )}
1921
+ {/* Endless-scroll sentinel: observed by IntersectionObserver to pull in
1922
+ the next chunk as it nears the viewport (feedback #232). */}
1923
+ {canRevealMoreMobile && (
1924
+ <li ref={loadMoreRef} className="px-4 py-4 text-center text-xs text-placeholder">
1925
+ {/* Isolated for the reason spelled out on LoadingText. */}
1926
+ <bdi>{labels.loading}</bdi>
1927
+ </li>
1928
+ )}
1929
+ {/* The owner's next slice (0.48), once every row held is revealed. */}
1930
+ {loadMore && !canRevealMoreMobile && (
1931
+ <DataTableLoadMoreFooter
1932
+ as="li"
1933
+ loadMore={loadMore}
1934
+ rowCount={sorted.length}
1935
+ labels={labels}
1936
+ compact={compact}
1937
+ />
1938
+ )}
1939
+ </ul>
1940
+ {/* The phone's totals: a summary card after the list rather than one more
1937
1941
  `<li>` in it. The list reveals rows in chunks as it is scrolled, so a last
1938
1942
  item would sit mid-list until the end was reached; outside it, and under
1939
1943
  `fillHeight` outside the scroller too, the totals stay in view the way the
1940
1944
  sticky `<tfoot>` keeps them in view on a wide screen. Named by
1941
1945
  `footerLabel` so it is announced as what it is, not as a stray list of
1942
1946
  numbers; `mobileHidden` columns stay hidden here as on the cards. */}
1943
- {showFooter && mobileColumns.some((c) => c.footer) && (
1944
- <section
1945
- data-table-footer=""
1946
- aria-labelledby={footerLabel != null ? footerHeadingId : undefined}
1947
- className={cn(
1948
- "border-t-2 border-strong bg-surface-2",
1949
- compact ? "px-3 py-2" : "px-4 py-3",
1950
- isLoading && "opacity-60 transition-opacity",
1951
- )}
1952
- >
1953
- {footerLabel != null && (
1954
- <div id={footerHeadingId} className={cn("font-semibold", compact ? "mb-1 text-sm" : "mb-2")}>
1955
- {footerLabel}
1956
- </div>
1957
- )}
1958
- <dl
1947
+ {showFooter && mobileColumns.some((c) => c.footer) && (
1948
+ <section
1949
+ data-table-footer=""
1950
+ aria-labelledby={footerLabel != null ? footerHeadingId : undefined}
1959
1951
  className={cn(
1960
- "grid grid-cols-[auto_1fr] gap-x-3",
1961
- compact ? "gap-y-0.5 text-xs" : "gap-y-1 text-sm",
1952
+ "border-t-2 border-strong bg-surface-2",
1953
+ compact ? "px-3 py-2" : "px-4 py-3",
1954
+ isLoading && "opacity-60 transition-opacity",
1962
1955
  )}
1963
1956
  >
1964
- {mobileColumns
1965
- .filter((c) => c.footer)
1966
- .map((col) => (
1967
- <Fragment key={col.key}>
1968
- <dt className="self-center text-xs uppercase tracking-wide text-muted">
1969
- {col.header}
1970
- </dt>
1971
- <dd className="min-w-0 self-center font-semibold text-primary">
1972
- {footerValue(col)}
1973
- </dd>
1974
- </Fragment>
1975
- ))}
1976
- </dl>
1977
- </section>
1978
- )}
1979
- {/* Client-side mobile lists scroll endlessly (sentinel above); only
1957
+ {footerLabel != null && (
1958
+ <div id={footerHeadingId} className={cn("font-semibold", compact ? "mb-1 text-sm" : "mb-2")}>
1959
+ {footerLabel}
1960
+ </div>
1961
+ )}
1962
+ <dl
1963
+ className={cn("grid grid-cols-[auto_1fr] gap-x-3", compact ? "gap-y-0.5 text-xs" : "gap-y-1 text-sm")}
1964
+ >
1965
+ {mobileColumns
1966
+ .filter((c) => c.footer)
1967
+ .map((col) => (
1968
+ <Fragment key={col.key}>
1969
+ <dt className="self-center text-xs uppercase tracking-wide text-muted">{col.header}</dt>
1970
+ <dd className="min-w-0 self-center font-semibold text-primary">{footerValue(col)}</dd>
1971
+ </Fragment>
1972
+ ))}
1973
+ </dl>
1974
+ </section>
1975
+ )}
1976
+ {/* Client-side mobile lists scroll endlessly (sentinel above); only
1980
1977
  server-paginated tables keep the pager here. */}
1981
- {isServer && !loadMore && (
1982
- <Pagination
1983
- page={safePage}
1984
- totalPages={totalPages}
1985
- pageSize={paginationPageSize}
1986
- total={paginationTotal}
1987
- onPage={goToPage}
1988
- onPageSize={serverPagination!.onPageSizeChange}
1989
- labels={labels}
1990
- locale={locale}
1991
- density={density}
1992
- />
1993
- )}
1994
- {/* The row's own first column is this dialog's title — the same cell the card
1978
+ {isServer && !loadMore && (
1979
+ <Pagination
1980
+ page={safePage}
1981
+ totalPages={totalPages}
1982
+ pageSize={paginationPageSize}
1983
+ total={paginationTotal}
1984
+ onPage={goToPage}
1985
+ onPageSize={serverPagination!.onPageSizeChange}
1986
+ labels={labels}
1987
+ locale={locale}
1988
+ density={density}
1989
+ />
1990
+ )}
1991
+ {/* The row's own first column is this dialog's title — the same cell the card
1995
1992
  behind it shows, so the panel names the row it opened from. */}
1996
- <FullBleedDialog
1997
- open={dialogOpen}
1998
- onClose={closeDialog}
1999
- closeLabel={labels.close}
2000
- header={mobileDialogRow ? mobilePrimaryCol?.cell(mobileDialogRow) : null}
2001
- backCloses={mobileDialogBackCloses}
2002
- >
2003
- {mobileDialogContent}
2004
- </FullBleedDialog>
2005
- </div>
1993
+ <FullBleedDialog
1994
+ open={dialogOpen}
1995
+ onClose={closeDialog}
1996
+ closeLabel={labels.close}
1997
+ header={mobileDialogRow ? mobilePrimaryCol?.cell(mobileDialogRow) : null}
1998
+ backCloses={mobileDialogBackCloses}
1999
+ >
2000
+ {mobileDialogContent}
2001
+ </FullBleedDialog>
2002
+ </div>
2006
2003
  )}
2007
2004
  {isMdUp && (
2008
- <div className={cn("flex", fillHeight && "flex-1")}>
2009
- {/* Under `fillHeight` neither wrapper is `min-h-0`: a flex item's automatic
2005
+ <div className={cn("flex", fillHeight && "flex-1")}>
2006
+ {/* Under `fillHeight` neither wrapper is `min-h-0`: a flex item's automatic
2010
2007
  minimum is its content's, and the content's height counts the body at its
2011
2008
  basis (`basis-48`, below), not at its rows — so the floor carries up. */}
2012
- <div className={cn("relative min-w-0 flex-1", fillHeight && "flex flex-col")}>
2013
- {/* scrollbar-gutter:stable reserves the vertical-scrollbar space up
2009
+ <div className={cn("relative min-w-0 flex-1", fillHeight && "flex flex-col")}>
2010
+ {/* scrollbar-gutter:stable reserves the vertical-scrollbar space up
2014
2011
  front. Expanding a row adds height, which can bring the scrollbar
2015
2012
  in, which narrows the content box — and in an `auto` table layout
2016
2013
  that re-computes every column width. Reserving the gutter is the
2017
2014
  other half of the `w-0 min-w-full` fix on the expansion cell below
2018
2015
  (feedback #104: "expanding an item resizes the columns"). */}
2019
- <div
2020
- ref={desktopScroller}
2021
- // The scroller: marked for the Tooltip's auto-portal (see the root above).
2022
- data-clips=""
2023
- // Under `fillHeight` the body grows into the room from a 12rem basis (0.40,
2024
- // §1.3): about five rows is its floor. A window too short for the page's
2025
- // header and that much body scrolls `<main>` instead (keksdose's review).
2026
- className={cn("overflow-auto [scrollbar-gutter:stable]", fillHeight && "min-h-0 grow basis-48")}
2027
- // `edgeFade`: the mask, `data-overflow` and the focus handling; nothing
2028
- // while off. The height bound is merged over the mask, not replaced by it.
2029
- {...edgeFadeProps}
2030
- style={
2031
- fillHeight
2032
- ? edgeFadeProps.style
2033
- : { ...edgeFadeProps.style, maxHeight: maxBodyHeight }
2034
- }
2035
- >
2036
- {/* A table with no name is "table" in a screen reader's list of tables, and
2016
+ <div
2017
+ ref={desktopScroller}
2018
+ // The scroller: marked for the Tooltip's auto-portal (see the root above).
2019
+ data-clips=""
2020
+ // Under `fillHeight` the body grows into the room from a 12rem basis (0.40,
2021
+ // §1.3): about five rows is its floor. A window too short for the page's
2022
+ // header and that much body scrolls `<main>` instead (keksdose's review).
2023
+ className={cn("overflow-auto [scrollbar-gutter:stable]", fillHeight && "min-h-0 grow basis-48")}
2024
+ // `edgeFade`: the mask, `data-overflow` and the focus handling; nothing
2025
+ // while off. The height bound is merged over the mask, not replaced by it.
2026
+ {...edgeFadeProps}
2027
+ style={fillHeight ? edgeFadeProps.style : { ...edgeFadeProps.style, maxHeight: maxBodyHeight }}
2028
+ >
2029
+ {/* A table with no name is "table" in a screen reader's list of tables, and
2037
2030
  an app renders several. `labels.table` is how a call site says which. */}
2038
- {/* `aria-busy` while a server page is in flight: a reader holds off announcing
2031
+ {/* `aria-busy` while a server page is in flight: a reader holds off announcing
2039
2032
  the rows that are about to be replaced, and the dimmed body says the same
2040
2033
  to the eye. The pager stays live — see `ServerPagination.isLoading`. */}
2041
- <table
2042
- ref={tableRef}
2043
- className={cn("w-full", compact ? "text-xs" : "text-sm")}
2044
- data-fit-grow={growDrawn ? "" : undefined}
2045
- aria-label={labels.table}
2046
- aria-busy={isLoading || undefined}
2047
- // `virtualize` (0.48.2): every row counted, rendered or not.
2048
- aria-rowcount={rowWindow?.rowCount}
2049
- data-virtualized={rowWindow ? "" : undefined}
2050
- >
2051
- {/* The locked column widths (0.48.2, `virtualize`): rows coming and going no
2034
+ <table
2035
+ ref={tableRef}
2036
+ className={cn("w-full", compact ? "text-xs" : "text-sm")}
2037
+ data-fit-grow={growDrawn ? "" : undefined}
2038
+ aria-label={labels.table}
2039
+ aria-busy={isLoading || undefined}
2040
+ // `virtualize` (0.48.2): every row counted, rendered or not.
2041
+ aria-rowcount={rowWindow?.rowCount}
2042
+ data-virtualized={rowWindow ? "" : undefined}
2043
+ >
2044
+ {/* The locked column widths (0.48.2, `virtualize`): rows coming and going no
2052
2045
  longer move the columns. */}
2053
- {rowWindow && (
2054
- <colgroup>
2055
- {virtualColKeys.map((key) => {
2056
- const w = rowWindow.colWidths?.[key];
2057
- return <col key={key} style={w !== undefined ? { width: w } : undefined} />;
2058
- })}
2059
- </colgroup>
2060
- )}
2061
- {/* Sticky header. position:sticky pins to the nearest scroll-container
2046
+ {rowWindow && (
2047
+ <colgroup>
2048
+ {virtualColKeys.map((key) => {
2049
+ const w = rowWindow.colWidths?.[key];
2050
+ return <col key={key} style={w !== undefined ? { width: w } : undefined} />;
2051
+ })}
2052
+ </colgroup>
2053
+ )}
2054
+ {/* Sticky header. position:sticky pins to the nearest scroll-container
2062
2055
  ancestor — so the header can only stick to THIS wrapper, never the
2063
2056
  page. For that to actually hold the header in place, the wrapper
2064
2057
  must be the thing that scrolls vertically: hence overflow-auto +
@@ -2067,288 +2060,283 @@ export function DataTable<T>({
2067
2060
  header then stays put as you scroll the rows. position:sticky on
2068
2061
  <thead> isn't reliable across browsers, so we put it on each <th>
2069
2062
  (see DataTableHead, data-table-head.tsx). */}
2070
- <DataTableHead
2071
- visibleColumns={visibleColumns}
2072
- selection={selection}
2073
- compact={compact}
2074
- labels={labels}
2075
- locale={locale}
2076
- isServer={serverRows}
2077
- hasSortCallback={!!onSortsChange}
2078
- hasFilterCallback={!!onFiltersChange}
2079
- sorts={sorts}
2080
- filters={filters}
2081
- selectOptionsByKey={selectOptionsByKey}
2082
- multiSort={multiSort}
2083
- resizable={resizable}
2084
- widths={widths}
2085
- setWidths={setWidths}
2086
- headRefs={headRefs}
2087
- toggleSort={toggleSort}
2088
- setFilterValue={setFilterValue}
2089
- clearFilter={clearFilter}
2090
- startResize={startResize}
2091
- moveResize={moveResize}
2092
- finishResize={finishResize}
2093
- ariaRowIndex={rowWindow ? 1 : undefined}
2094
- lockedWidths={rowWindow?.colWidths}
2095
- selectionLockKey={VIRTUAL_SELECT_COL}
2096
- />
2097
- {(() => {
2098
- const bodyClass = cn(isLoading && slice.length > 0 && "opacity-60 transition-opacity");
2099
- const leading = leadingRow ? (
2100
- <DataTableLeadingRow
2101
- colSpan={totalColSpan}
2102
- sticky={leadingRowSticky}
2103
- ariaRowIndex={rowWindow ? 2 : undefined}
2104
- >
2105
- {leadingRow}
2106
- </DataTableLeadingRow>
2107
- ) : null;
2108
- // One memoised row each (0.48.2, K-052-2; data-table-row.tsx): the table
2109
- // derives each row's own inputs here, as primitives, so a tick re-renders
2110
- // only the rows whose inputs changed.
2111
- const renderRow = (row: T, rowIndex: number) => {
2112
- const expanded = isExpanded?.(row) ?? false;
2113
- const key = rowKey(row);
2114
- return (
2115
- <DataTableRow<T>
2116
- key={key}
2117
- row={row}
2118
- rowIndex={rowIndex}
2119
- rowKey={key}
2120
- ctx={rowCtx}
2121
- columns={visibleColumns}
2122
- widths={widths}
2123
- growDrawn={growDrawn}
2124
- linkColumn={linkColumn}
2125
- href={rowHref?.(row)}
2126
- selectionColumn={!!selection}
2127
- selectable={canSelect(row)}
2128
- selected={!!selection && selection.isSelected(row)}
2129
- expanded={expanded}
2130
- expansion={expanded ? expandedRow?.(row) : null}
2131
- disclosure={rowsFocusable && !!expandedRow}
2132
- detailId={`${detailIdBase}-${rowIndex}`}
2133
- rowsFocusable={rowsFocusable}
2134
- rowInteractive={!!onRowClick || !!selection}
2135
- tabbable={key === tabRowKey}
2136
- className={rowClassName?.(row)}
2137
- attrs={rowAttributes?.(row)}
2063
+ <DataTableHead
2064
+ visibleColumns={visibleColumns}
2065
+ selection={selection}
2138
2066
  compact={compact}
2139
- totalColSpan={totalColSpan}
2140
- rowDetailsLabel={labels.rowDetails}
2141
- selectRowLabel={labels.selectRow}
2142
- ariaRowIndex={rowWindow?.ariaRow(rowIndex)}
2067
+ labels={labels}
2068
+ locale={locale}
2069
+ isServer={serverRows}
2070
+ hasSortCallback={!!onSortsChange}
2071
+ hasFilterCallback={!!onFiltersChange}
2072
+ sorts={sorts}
2073
+ filters={filters}
2074
+ selectOptionsByKey={selectOptionsByKey}
2075
+ multiSort={multiSort}
2076
+ resizable={resizable}
2077
+ widths={widths}
2078
+ setWidths={setWidths}
2079
+ headRefs={headRefs}
2080
+ toggleSort={toggleSort}
2081
+ setFilterValue={setFilterValue}
2082
+ clearFilter={clearFilter}
2083
+ startResize={startResize}
2084
+ moveResize={moveResize}
2085
+ finishResize={finishResize}
2086
+ ariaRowIndex={rowWindow ? 1 : undefined}
2087
+ lockedWidths={rowWindow?.colWidths}
2088
+ selectionLockKey={VIRTUAL_SELECT_COL}
2143
2089
  />
2144
- );
2145
- };
2146
- const emptyRow =
2147
- slice.length === 0 ? (
2148
- <tr>
2149
- <td
2150
- colSpan={totalColSpan}
2151
- className={cn("text-center text-muted", compact ? "px-2 py-2" : "px-3 py-4")}
2152
- >
2153
- {/* Nothing is not the same as not-yet: "no results" while the first
2090
+ {(() => {
2091
+ const bodyClass = cn(isLoading && slice.length > 0 && "opacity-60 transition-opacity");
2092
+ const leading = leadingRow ? (
2093
+ <DataTableLeadingRow
2094
+ colSpan={totalColSpan}
2095
+ sticky={leadingRowSticky}
2096
+ ariaRowIndex={rowWindow ? 2 : undefined}
2097
+ >
2098
+ {leadingRow}
2099
+ </DataTableLeadingRow>
2100
+ ) : null;
2101
+ // One memoised row each (0.48.2, K-052-2; data-table-row.tsx): the table
2102
+ // derives each row's own inputs here, as primitives, so a tick re-renders
2103
+ // only the rows whose inputs changed.
2104
+ const renderRow = (row: T, rowIndex: number) => {
2105
+ const expanded = isExpanded?.(row) ?? false;
2106
+ const key = rowKey(row);
2107
+ return (
2108
+ <DataTableRow<T>
2109
+ key={key}
2110
+ row={row}
2111
+ rowIndex={rowIndex}
2112
+ rowKey={key}
2113
+ ctx={rowCtx}
2114
+ columns={visibleColumns}
2115
+ widths={widths}
2116
+ growDrawn={growDrawn}
2117
+ linkColumn={linkColumn}
2118
+ href={rowHref?.(row)}
2119
+ selectionColumn={!!selection}
2120
+ selectable={canSelect(row)}
2121
+ selected={!!selection && selection.isSelected(row)}
2122
+ expanded={expanded}
2123
+ expansion={expanded ? expandedRow?.(row) : null}
2124
+ disclosure={rowsFocusable && !!expandedRow}
2125
+ detailId={`${detailIdBase}-${rowIndex}`}
2126
+ rowsFocusable={rowsFocusable}
2127
+ rowInteractive={!!onRowClick || !!selection}
2128
+ tabbable={key === tabRowKey}
2129
+ className={rowClassName?.(row)}
2130
+ attrs={rowAttributes?.(row)}
2131
+ compact={compact}
2132
+ totalColSpan={totalColSpan}
2133
+ rowDetailsLabel={labels.rowDetails}
2134
+ selectRowLabel={labels.selectRow}
2135
+ ariaRowIndex={rowWindow?.ariaRow(rowIndex)}
2136
+ />
2137
+ );
2138
+ };
2139
+ const emptyRow =
2140
+ slice.length === 0 ? (
2141
+ <tr>
2142
+ <td
2143
+ colSpan={totalColSpan}
2144
+ className={cn("text-center text-muted", compact ? "px-2 py-2" : "px-3 py-4")}
2145
+ >
2146
+ {/* Nothing is not the same as not-yet: "no results" while the first
2154
2147
  page is still in flight is a claim the table cannot make. */}
2155
- {isLoading ? <LoadingText label={labels.loading} /> : (empty ?? labels.empty)}
2156
- </td>
2157
- </tr>
2158
- ) : null;
2159
- const band = (
2160
- level: 1 | 2,
2161
- def: DataTableGroupBy<T>,
2162
- g: { key: string; rows: T[] },
2163
- ariaRowIndex?: number,
2164
- ) => (
2165
- <DataTableGroupBand
2166
- level={level}
2167
- colSpan={totalColSpan}
2168
- top={level === 1 ? bandTops[0] : bandTops[1]}
2169
- compact={compact}
2170
- label={def.label ? def.label(g.key, g.rows) : g.key}
2171
- end={def.end?.(g.key, g.rows)}
2172
- ariaRowIndex={ariaRowIndex}
2173
- />
2174
- );
2175
- if (rowWindow) {
2176
- // Windowed (0.48.2): each group's own `<tbody>` with its bands and the
2177
- // rendered rows, spacer rows between; one spacer `<tbody>` per run of groups
2178
- // with nothing rendered. Spacers are hidden from the accessibility tree.
2179
- const spacer = (key: string, height: number) => (
2180
- <tr key={key} aria-hidden="true" data-vt-spacer="">
2181
- <td colSpan={totalColSpan} style={{ height, padding: 0, border: 0 }} />
2182
- </tr>
2183
- );
2184
- return (
2185
- <>
2186
- {leading && <tbody className={bodyClass}>{leading}</tbody>}
2187
- {rowWindow.bodies.map((b) => {
2188
- if (b.kind === "spacer")
2189
- return (
2190
- <tbody key={b.key} data-vt-body="" aria-hidden="true">
2191
- {spacer("s", b.height)}
2192
- </tbody>
2193
- );
2194
- const g = virtualGroups[b.group];
2195
- const vb = virtualBands[b.group];
2148
+ {isLoading ? <LoadingText label={labels.loading} /> : (empty ?? labels.empty)}
2149
+ </td>
2150
+ </tr>
2151
+ ) : null;
2152
+ const band = (
2153
+ level: 1 | 2,
2154
+ def: DataTableGroupBy<T>,
2155
+ g: { key: string; rows: T[] },
2156
+ ariaRowIndex?: number,
2157
+ ) => (
2158
+ <DataTableGroupBand
2159
+ level={level}
2160
+ colSpan={totalColSpan}
2161
+ top={level === 1 ? bandTops[0] : bandTops[1]}
2162
+ compact={compact}
2163
+ label={def.label ? def.label(g.key, g.rows) : g.key}
2164
+ end={def.end?.(g.key, g.rows)}
2165
+ ariaRowIndex={ariaRowIndex}
2166
+ />
2167
+ );
2168
+ if (rowWindow) {
2169
+ // Windowed (0.48.2): each group's own `<tbody>` with its bands and the
2170
+ // rendered rows, spacer rows between; one spacer `<tbody>` per run of groups
2171
+ // with nothing rendered. Spacers are hidden from the accessibility tree.
2172
+ const spacer = (key: string, height: number) => (
2173
+ <tr key={key} aria-hidden="true" data-vt-spacer="">
2174
+ <td colSpan={totalColSpan} style={{ height, padding: 0, border: 0 }} />
2175
+ </tr>
2176
+ );
2196
2177
  return (
2197
- <tbody
2198
- key={vb ? `vg:${vb.g1.key}:${vb.g2?.key ?? ""}:${g.start}` : "vg"}
2199
- data-vt-body=""
2200
- className={bodyClass}
2201
- >
2202
- {vb && g.bands.includes(1) && band(1, levels[0], vb.g1, rowWindow.ariaBand(b.group, 1))}
2203
- {vb?.g2 && band(2, levels[1], vb.g2, rowWindow.ariaBand(b.group, 2))}
2204
- {b.items.map((it) =>
2205
- it.kind === "gap" ? spacer(it.key, it.height) : renderRow(slice[it.index], it.index),
2206
- )}
2207
- </tbody>
2178
+ <>
2179
+ {leading && <tbody className={bodyClass}>{leading}</tbody>}
2180
+ {rowWindow.bodies.map((b) => {
2181
+ if (b.kind === "spacer")
2182
+ return (
2183
+ <tbody key={b.key} data-vt-body="" aria-hidden="true">
2184
+ {spacer("s", b.height)}
2185
+ </tbody>
2186
+ );
2187
+ const g = virtualGroups[b.group];
2188
+ const vb = virtualBands[b.group];
2189
+ return (
2190
+ <tbody
2191
+ key={vb ? `vg:${vb.g1.key}:${vb.g2?.key ?? ""}:${g.start}` : "vg"}
2192
+ data-vt-body=""
2193
+ className={bodyClass}
2194
+ >
2195
+ {vb && g.bands.includes(1) && band(1, levels[0], vb.g1, rowWindow.ariaBand(b.group, 1))}
2196
+ {vb?.g2 && band(2, levels[1], vb.g2, rowWindow.ariaBand(b.group, 2))}
2197
+ {b.items.map((it) =>
2198
+ it.kind === "gap" ? spacer(it.key, it.height) : renderRow(slice[it.index], it.index),
2199
+ )}
2200
+ </tbody>
2201
+ );
2202
+ })}
2203
+ </>
2208
2204
  );
2209
- })}
2210
- </>
2211
- );
2212
- }
2213
- if (!desktopGroups) {
2214
- return (
2215
- <tbody className={bodyClass}>
2216
- {leading}
2217
- {slice.map(renderRow)}
2218
- {emptyRow}
2219
- </tbody>
2220
- );
2221
- }
2222
- // Grouped (0.48, keksdose dev #605): one `<tbody>` per innermost group, its
2223
- // band the row header; the leading row (and the empty state) in their own
2224
- // before the first group.
2225
- const rowsOf = (g: { rows: T[]; start: number }) => g.rows.map((r, i) => renderRow(r, g.start + i));
2226
- return (
2227
- <>
2228
- {(leading || emptyRow) && (
2229
- <tbody className={bodyClass}>
2230
- {leading}
2231
- {emptyRow}
2232
- </tbody>
2233
- )}
2234
- {desktopGroups.map((g1) =>
2235
- g1.children ? (
2236
- g1.children.map((g2, j) => (
2237
- <tbody key={`g:${g1.key}:${g2.key}:${g2.start}`} className={bodyClass}>
2238
- {j === 0 && band(1, levels[0], g1)}
2239
- {band(2, levels[1], g2)}
2240
- {rowsOf(g2)}
2205
+ }
2206
+ if (!desktopGroups) {
2207
+ return (
2208
+ <tbody className={bodyClass}>
2209
+ {leading}
2210
+ {slice.map(renderRow)}
2211
+ {emptyRow}
2241
2212
  </tbody>
2242
- ))
2243
- ) : (
2244
- <tbody key={`g:${g1.key}:${g1.start}`} className={bodyClass}>
2245
- {band(1, levels[0], g1)}
2246
- {rowsOf(g1)}
2247
- </tbody>
2248
- ),
2249
- )}
2250
- </>
2251
- );
2252
- })()}
2253
- {showFooter && (
2254
- // Sticky to the scroller's bottom edge for the same reason the header is
2255
- // sticky to its top: the body scrolls inside a bounded wrapper, and a
2256
- // total that scrolls away with the last row is a total nobody sees on a
2257
- // 25-row page. Each cell carries its own background and its own `sticky`,
2258
- // as the header's do — `position: sticky` on a `<tfoot>` is not reliable.
2259
- <tfoot
2260
- data-table-footer=""
2261
- className={cn(
2262
- "font-semibold text-primary",
2263
- isLoading && "opacity-60 transition-opacity",
2264
- )}
2265
- >
2266
- <tr aria-rowindex={rowWindow?.rowCount}>
2267
- {/* The selection column has nothing to total: an empty cell keeps the
2268
- values under their own headers. */}
2269
- {selection && (
2270
- <td
2271
- className={cn(
2272
- FOOTER_CELL,
2273
- compact ? "w-8 px-2 py-1" : "w-10 px-3 py-2",
2274
- )}
2275
- />
2276
- )}
2277
- {visibleColumns.map((col) => {
2278
- const width = widths[col.key];
2279
- const pinned = width ? { width, minWidth: width, maxWidth: width } : undefined;
2280
- const isLabel = col === footerLabelCol;
2281
- const Cell = isLabel ? "th" : "td";
2213
+ );
2214
+ }
2215
+ // Grouped (0.48, keksdose dev #605): one `<tbody>` per innermost group, its
2216
+ // band the row header; the leading row (and the empty state) in their own
2217
+ // before the first group.
2218
+ const rowsOf = (g: { rows: T[]; start: number }) => g.rows.map((r, i) => renderRow(r, g.start + i));
2282
2219
  return (
2283
- <Cell
2284
- key={col.key}
2285
- data-col={col.key}
2286
- scope={isLabel ? "row" : undefined}
2287
- style={pinned}
2288
- className={cn(
2289
- FOOTER_CELL,
2290
- "align-top",
2291
- compact ? "px-2 py-1" : "px-3 py-2",
2292
- width && "overflow-hidden text-ellipsis",
2293
- // A `<th>` centres by default; the label reads from the start
2294
- // like the cells above it, unless the column says otherwise.
2295
- isLabel && "text-start",
2296
- col.grow ? GROW_CELL_CLASS : growDrawn && GROW_PEER_CELL_CLASS,
2297
- logicalAlign(col.className),
2220
+ <>
2221
+ {(leading || emptyRow) && (
2222
+ <tbody className={bodyClass}>
2223
+ {leading}
2224
+ {emptyRow}
2225
+ </tbody>
2298
2226
  )}
2299
- >
2300
- {col.footer ? footerValue(col) : isLabel ? footerLabel : null}
2301
- </Cell>
2227
+ {desktopGroups.map((g1) =>
2228
+ g1.children ? (
2229
+ g1.children.map((g2, j) => (
2230
+ <tbody key={`g:${g1.key}:${g2.key}:${g2.start}`} className={bodyClass}>
2231
+ {j === 0 && band(1, levels[0], g1)}
2232
+ {band(2, levels[1], g2)}
2233
+ {rowsOf(g2)}
2234
+ </tbody>
2235
+ ))
2236
+ ) : (
2237
+ <tbody key={`g:${g1.key}:${g1.start}`} className={bodyClass}>
2238
+ {band(1, levels[0], g1)}
2239
+ {rowsOf(g1)}
2240
+ </tbody>
2241
+ ),
2242
+ )}
2243
+ </>
2302
2244
  );
2303
- })}
2304
- </tr>
2305
- </tfoot>
2306
- )}
2307
- </table>
2308
- {/* In the scroller, after the rows (0.48): it comes into view as the last row
2245
+ })()}
2246
+ {showFooter && (
2247
+ // Sticky to the scroller's bottom edge for the same reason the header is
2248
+ // sticky to its top: the body scrolls inside a bounded wrapper, and a
2249
+ // total that scrolls away with the last row is a total nobody sees on a
2250
+ // 25-row page. Each cell carries its own background and its own `sticky`,
2251
+ // as the header's do — `position: sticky` on a `<tfoot>` is not reliable.
2252
+ <tfoot
2253
+ data-table-footer=""
2254
+ className={cn("font-semibold text-primary", isLoading && "opacity-60 transition-opacity")}
2255
+ >
2256
+ <tr aria-rowindex={rowWindow?.rowCount}>
2257
+ {/* The selection column has nothing to total: an empty cell keeps the
2258
+ values under their own headers. */}
2259
+ {selection && <td className={cn(FOOTER_CELL, compact ? "w-8 px-2 py-1" : "w-10 px-3 py-2")} />}
2260
+ {visibleColumns.map((col) => {
2261
+ const width = widths[col.key];
2262
+ const pinned = width ? { width, minWidth: width, maxWidth: width } : undefined;
2263
+ const isLabel = col === footerLabelCol;
2264
+ const Cell = isLabel ? "th" : "td";
2265
+ return (
2266
+ <Cell
2267
+ key={col.key}
2268
+ data-col={col.key}
2269
+ scope={isLabel ? "row" : undefined}
2270
+ style={pinned}
2271
+ className={cn(
2272
+ FOOTER_CELL,
2273
+ "align-top",
2274
+ compact ? "px-2 py-1" : "px-3 py-2",
2275
+ width && "overflow-hidden text-ellipsis",
2276
+ // A `<th>` centres by default; the label reads from the start
2277
+ // like the cells above it, unless the column says otherwise.
2278
+ isLabel && "text-start",
2279
+ col.grow ? GROW_CELL_CLASS : growDrawn && GROW_PEER_CELL_CLASS,
2280
+ logicalAlign(col.className),
2281
+ )}
2282
+ >
2283
+ {col.footer ? footerValue(col) : isLabel ? footerLabel : null}
2284
+ </Cell>
2285
+ );
2286
+ })}
2287
+ </tr>
2288
+ </tfoot>
2289
+ )}
2290
+ </table>
2291
+ {/* In the scroller, after the rows (0.48): it comes into view as the last row
2309
2292
  does, under `fillHeight` too, where the body is the scroller. */}
2310
- {loadMore && (
2311
- <DataTableLoadMoreFooter loadMore={loadMore} rowCount={sorted.length} labels={labels} compact={compact} />
2312
- )}
2313
- </div>
2314
- {!unpaged && !loadMore && (
2315
- <Pagination
2316
- page={safePage}
2317
- totalPages={totalPages}
2318
- pageSize={paginationPageSize}
2319
- total={paginationTotal}
2320
- onPage={goToPage}
2321
- onPageSize={
2322
- isServer
2323
- ? serverPagination!.onPageSizeChange
2324
- : (n) => {
2325
- // To the owner when it holds the page size, as `commitSorts` does.
2326
- if (onPageSizeChange) onPageSizeChange(n);
2327
- else setPageSize(n);
2328
- setPage(0);
2329
- }
2330
- }
2293
+ {loadMore && (
2294
+ <DataTableLoadMoreFooter
2295
+ loadMore={loadMore}
2296
+ rowCount={sorted.length}
2297
+ labels={labels}
2298
+ compact={compact}
2299
+ />
2300
+ )}
2301
+ </div>
2302
+ {!unpaged && !loadMore && (
2303
+ <Pagination
2304
+ page={safePage}
2305
+ totalPages={totalPages}
2306
+ pageSize={paginationPageSize}
2307
+ total={paginationTotal}
2308
+ onPage={goToPage}
2309
+ onPageSize={
2310
+ isServer
2311
+ ? serverPagination!.onPageSizeChange
2312
+ : (n) => {
2313
+ // To the owner when it holds the page size, as `commitSorts` does.
2314
+ if (onPageSizeChange) onPageSizeChange(n);
2315
+ else setPageSize(n);
2316
+ setPage(0);
2317
+ }
2318
+ }
2319
+ labels={labels}
2320
+ locale={locale}
2321
+ density={density}
2322
+ />
2323
+ )}
2324
+ </div>
2325
+ {columnSettings && (
2326
+ <ColumnSettingsPanel
2327
+ columns={columns}
2328
+ hiddenCols={hiddenCols}
2329
+ setHiddenCols={setHiddenCols}
2330
+ autoHidden={autoHidden}
2331
+ keepColumn={keepColumn}
2332
+ showSettings={showSettings}
2333
+ setShowSettings={setShowSettings}
2334
+ columnsCountLabel={columnsCountLabel}
2331
2335
  labels={labels}
2332
- locale={locale}
2333
- density={density}
2336
+ autoSizeAll={autoSizeAll}
2334
2337
  />
2335
2338
  )}
2336
2339
  </div>
2337
- {columnSettings && (
2338
- <ColumnSettingsPanel
2339
- columns={columns}
2340
- hiddenCols={hiddenCols}
2341
- setHiddenCols={setHiddenCols}
2342
- autoHidden={autoHidden}
2343
- keepColumn={keepColumn}
2344
- showSettings={showSettings}
2345
- setShowSettings={setShowSettings}
2346
- columnsCountLabel={columnsCountLabel}
2347
- labels={labels}
2348
- autoSizeAll={autoSizeAll}
2349
- />
2350
- )}
2351
- </div>
2352
2340
  )}
2353
2341
  </Root>
2354
2342
  );