@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
@@ -138,10 +138,8 @@ const TILE_BASE =
138
138
  FOCUS_RING +
139
139
  " focus-visible:ring-offset-2 focus-visible:ring-offset-surface " +
140
140
  "disabled:cursor-not-allowed disabled:opacity-50";
141
- const TILE_IDLE =
142
- "border-subtle bg-surface hover:border-strong hover:bg-hover";
143
- const TILE_SELECTED =
144
- "border-[var(--text-primary)] bg-surface ring-1 ring-[var(--text-primary)]";
141
+ const TILE_IDLE = "border-subtle bg-surface hover:border-strong hover:bg-hover";
142
+ const TILE_SELECTED = "border-[var(--text-primary)] bg-surface ring-1 ring-[var(--text-primary)]";
145
143
  /** A locked tile: the disabled look without `disabled` — dimmed, a not-allowed cursor. */
146
144
  const TILE_LOCKED = "cursor-not-allowed opacity-50";
147
145
  /** …and no hover offer on an idle one, which cannot be chosen. Not on the selected
@@ -180,15 +178,11 @@ export function TileRadioGroup<T extends string>({
180
178
  const noteId = useId();
181
179
  const reasonId = useId();
182
180
  const s = TILE_SIZE[size];
183
- const checkedIndex =
184
- checked === undefined ? -1 : items.findIndex((it) => it.key === checked);
181
+ const checkedIndex = checked === undefined ? -1 : items.findIndex((it) => it.key === checked);
185
182
  // The ONE tab stop: the checked tile, else the first that can be reached — the APG
186
183
  // rule, so Tab into a group with nothing checked still lands somewhere. A locked
187
184
  // tile is reachable: landing on it is how its reason is read.
188
- const tabStop =
189
- checkedIndex >= 0 && !isOff(items[checkedIndex])
190
- ? checkedIndex
191
- : items.findIndex((it) => !isOff(it));
185
+ const tabStop = checkedIndex >= 0 && !isOff(items[checkedIndex]) ? checkedIndex : items.findIndex((it) => !isOff(it));
192
186
 
193
187
  const onKeyDown = (e: KeyboardEvent<HTMLButtonElement>, index: number) => {
194
188
  // Left and right are VISUAL directions: in a right-to-left page the row runs the
@@ -269,19 +263,12 @@ export function TileRadioGroup<T extends string>({
269
263
  tileClassName?.(item, selected),
270
264
  )}
271
265
  >
272
- {item.key === null ? (
273
- <Ban aria-hidden className={cn(s.glyph, "text-muted")} />
274
- ) : (
275
- renderTile(item, selected)
276
- )}
266
+ {item.key === null ? <Ban aria-hidden className={cn(s.glyph, "text-muted")} /> : renderTile(item, selected)}
277
267
  {item.note && (
278
268
  <>
279
269
  {/* A dot rather than a dimmed tile: dimming reads as "disabled", and a
280
270
  tile with a note is entirely available. */}
281
- <span
282
- aria-hidden
283
- className="absolute end-0.5 top-0.5 size-1.5 rounded-full bg-[var(--text-muted)]"
284
- />
271
+ <span aria-hidden className="absolute end-0.5 top-0.5 size-1.5 rounded-full bg-[var(--text-muted)]" />
285
272
  {/* `hidden` still serves as a description: aria-describedby reads
286
273
  hidden text, which is what keeps it out of the layout. */}
287
274
  <span id={`${noteId}-${i}`} hidden>
@@ -35,11 +35,10 @@ import { cn } from "../lib/cn";
35
35
  * at the site"), a {@link FieldHint} rides the label line. `showCount` is typed out — a
36
36
  * time has no length worth counting.
37
37
  */
38
- export interface TimeInputProps
39
- extends Omit<
40
- InputProps,
41
- "type" | "value" | "defaultValue" | "min" | "max" | "step" | "variant" | "showCount" | "countLabels"
42
- > {
38
+ export interface TimeInputProps extends Omit<
39
+ InputProps,
40
+ "type" | "value" | "defaultValue" | "min" | "max" | "step" | "variant" | "showCount" | "countLabels"
41
+ > {
43
42
  /** `"HH:mm"` (or `"HH:mm:ss"` with a sub-minute `step`); `""` is "no time". */
44
43
  value: string;
45
44
  /** The normalised value on every change the browser reports — which for a time
@@ -140,8 +140,7 @@ const privately = (node: ReactNode) => <span data-private="">{node}</span>;
140
140
  * whitespace-free class token.
141
141
  */
142
142
  const ID_CLASS = "kit-toast-id-";
143
- const idClass = (id: ToastId) =>
144
- `${ID_CLASS}${typeof id === "number" ? "n" : "s"}-${encodeURIComponent(String(id))}`;
143
+ const idClass = (id: ToastId) => `${ID_CLASS}${typeof id === "number" ? "n" : "s"}-${encodeURIComponent(String(id))}`;
145
144
 
146
145
  /** The id {@link idClass} stamped on a toast element, or null for a toast the kit did
147
146
  * not make (an app still calling sonner directly). */
@@ -284,13 +283,7 @@ export const toast = Object.assign(
284
283
 
285
284
  /* ── The Toaster ─────────────────────────────────────────────────────────── */
286
285
 
287
- export type ToastPosition =
288
- | "top-left"
289
- | "top-center"
290
- | "top-right"
291
- | "bottom-left"
292
- | "bottom-center"
293
- | "bottom-right";
286
+ export type ToastPosition = "top-left" | "top-center" | "top-right" | "bottom-left" | "bottom-center" | "bottom-right";
294
287
 
295
288
  export type ToastSwipeDirection = "top" | "right" | "bottom" | "left";
296
289
 
@@ -381,9 +374,7 @@ const ALL_DIRECTIONS: ToastSwipeDirection[] = ["top", "right", "bottom", "left"]
381
374
 
382
375
  /** Light or dark, as the `.dark` class on `<html>` says right now. */
383
376
  function readDocumentTheme(): "light" | "dark" {
384
- return typeof document !== "undefined" && document.documentElement.classList.contains("dark")
385
- ? "dark"
386
- : "light";
377
+ return typeof document !== "undefined" && document.documentElement.classList.contains("dark") ? "dark" : "light";
387
378
  }
388
379
 
389
380
  function subscribeDocumentTheme(onChange: () => void): () => void {
@@ -37,8 +37,7 @@ export interface ToggleOption<T extends string> {
37
37
  * worse than one that does not compile.
38
38
  */
39
39
  export interface ToggleGroupBaseProps<T extends string>
40
- extends Omit<ComponentPropsWithoutRef<"div">, "onChange" | "children">,
41
- FieldHelpProps {
40
+ extends Omit<ComponentPropsWithoutRef<"div">, "onChange" | "children">, FieldHelpProps {
42
41
  options: ToggleOption<T>[];
43
42
  className?: string;
44
43
  /** Applied to every option button (e.g. to tune height/rounding to match
@@ -354,9 +353,7 @@ export interface ToggleGroupClearableProps<T extends string> extends ToggleGroup
354
353
 
355
354
  /** `allowEmpty` picks the shape, so `onChange` is typed `(T) => void` unless the group
356
355
  * can actually emit `null` — no existing caller has a `null` to handle. */
357
- export type ToggleGroupProps<T extends string> =
358
- | ToggleGroupRequiredProps<T>
359
- | ToggleGroupClearableProps<T>;
356
+ export type ToggleGroupProps<T extends string> = ToggleGroupRequiredProps<T> | ToggleGroupClearableProps<T>;
360
357
 
361
358
  /**
362
359
  * Overloaded rather than typed by the union alone (keksdose, "Gaps found adopting
@@ -542,9 +539,7 @@ export function ToggleGroup<T extends string>(props: ToggleGroupProps<T>): React
542
539
  field && CHROME_SEGMENT[size],
543
540
  // In the strip placement: a 22px group under a 20px strip — STRIP_SEGMENT.
544
541
  strip && STRIP_SEGMENT[size],
545
- active
546
- ? "bg-inverse text-inverse"
547
- : "text-secondary hover:bg-hover",
542
+ active ? "bg-inverse text-inverse" : "text-secondary hover:bg-hover",
548
543
  // No hover fill on a group that cannot be changed — a segment that
549
544
  // lights up under the pointer is an offer, and there is none here. Not on
550
545
  // the chosen segment: its fill IS its state, and its inverse text would
@@ -578,7 +573,12 @@ export function ToggleGroup<T extends string>(props: ToggleGroupProps<T>): React
578
573
  aria-labelledby={labelled && ariaLabelAttr === undefined ? labelId : rest["aria-labelledby"]}
579
574
  aria-invalid={hasError || rest["aria-invalid"] || undefined}
580
575
  aria-describedby={
581
- [rest["aria-describedby"], hintAsCaption !== undefined && hintCaptionId, hasCaption && captionId, hasError && errorId]
576
+ [
577
+ rest["aria-describedby"],
578
+ hintAsCaption !== undefined && hintCaptionId,
579
+ hasCaption && captionId,
580
+ hasError && errorId,
581
+ ]
582
582
  .filter(Boolean)
583
583
  .join(" ") || undefined
584
584
  }
@@ -26,13 +26,7 @@ import { DEFAULT_SERIES_CHART_LABELS, type SeriesChartLabels } from "./series-ch
26
26
  * Kept here, beside the legend's own mark, and read by `SeriesChart` from here — so
27
27
  * the key under a chart and the lines on it cannot disagree.
28
28
  */
29
- export const STROKE_PATTERNS: readonly (string | undefined)[] = [
30
- undefined,
31
- "5 4",
32
- "1 3",
33
- "9 3 2 3",
34
- "9 3 2 3 2 3",
35
- ];
29
+ export const STROKE_PATTERNS: readonly (string | undefined)[] = [undefined, "5 4", "1 3", "9 3 2 3", "9 3 2 3 2 3"];
36
30
 
37
31
  /** The dash array for the nth pattern, wrapping past the fifth. */
38
32
  export function strokeDash(order: number): string | undefined {
@@ -79,8 +73,7 @@ export function toggleHidden(hidden: ReadonlySet<string>, key: string): Readonly
79
73
  * A caller that places its legend itself and wants it kept beside the chart at every
80
74
  * size overrides with `large:col-auto large:basis-auto`.
81
75
  */
82
- const UNDER_THE_CHART_AT_LARGE =
83
- "large:order-last large:col-span-full large:basis-full large:[*:has(>&)]:flex-wrap";
76
+ const UNDER_THE_CHART_AT_LARGE = "large:order-last large:col-span-full large:basis-full large:[*:has(>&)]:flex-wrap";
84
77
 
85
78
  /** A vertical legend's entries from Large up: across, wrapping — it is under the chart
86
79
  * now (see {@link UNDER_THE_CHART_AT_LARGE}), where a column of entries would be a
@@ -284,10 +277,7 @@ export function StaticLegend({
284
277
  {entries.map((entry) => (
285
278
  <Item
286
279
  key={entry.key}
287
- className={cn(
288
- "flex items-center gap-1.5 text-caption text-secondary",
289
- entry.align === "end" && "ms-auto",
290
- )}
280
+ className={cn("flex items-center gap-1.5 text-caption text-secondary", entry.align === "end" && "ms-auto")}
291
281
  >
292
282
  <LegendMark entry={entry} off={false} />
293
283
  {entry.label}
@@ -335,9 +325,7 @@ export function LegendColumn({ children, className }: { children: ReactNode; cla
335
325
  export function LegendGroup({ title, children }: { title: ReactNode; children: ReactNode }) {
336
326
  return (
337
327
  <div className="flex min-w-0 flex-col items-start gap-1">
338
- <span className="text-micro font-semibold uppercase tracking-wide text-muted">
339
- {title}
340
- </span>
328
+ <span className="text-micro font-semibold uppercase tracking-wide text-muted">{title}</span>
341
329
  <div className="flex flex-col items-start gap-y-0.5">{children}</div>
342
330
  </div>
343
331
  );
@@ -382,14 +382,7 @@ export function Tooltip({
382
382
  if (isEmptyLabel(label)) return <>{children}</>;
383
383
  if (portal === true) {
384
384
  return (
385
- <PortalTooltip
386
- label={label}
387
- side={side}
388
- className={className}
389
- redact={redact}
390
- tap={tap}
391
- {...rest}
392
- >
385
+ <PortalTooltip label={label} side={side} className={className} redact={redact} tap={tap} {...rest}>
393
386
  {children}
394
387
  </PortalTooltip>
395
388
  );
@@ -413,7 +406,6 @@ export function Tooltip({
413
406
  );
414
407
  }
415
408
 
416
-
417
409
  /** The pointer handlers a caller may hand {@link Tooltip} that the trigger also needs:
418
410
  * both run, the trigger's first. (The mouse and focus handlers are the trigger's alone,
419
411
  * as they have always been.) */
@@ -731,9 +723,7 @@ function InPlaceTooltip({
731
723
  {/* In place the bubble is always there to point at; portalled or lazy, only while up. */}
732
724
  {describedBy(children, clipped || lazy ? (open ? id : undefined) : dismissed ? undefined : id)}
733
725
  {clipped ? (
734
- open && (
735
- <PortalBubble triggerRef={triggerRef} id={id} label={label} side={side} dir={dir} redact={redact} />
736
- )
726
+ open && <PortalBubble triggerRef={triggerRef} id={id} label={label} side={side} dir={dir} redact={redact} />
737
727
  ) : lazy ? (
738
728
  // keksdose F6: the in-place slot and classes, the portalled lifetime. Mounted only
739
729
  // while up, so it is visible whenever it exists.
@@ -795,11 +785,7 @@ function describedBy(children: ReactNode, id: string | undefined): ReactNode {
795
785
  * it has nothing to say — `""`, `null`, `undefined`, `false` from a `&&` guard. A
796
786
  * numeric `0` is a real label and stays one. */
797
787
  function isEmptyLabel(label: ReactNode): boolean {
798
- return (
799
- label == null ||
800
- label === false ||
801
- (typeof label === "string" && label.trim() === "")
802
- );
788
+ return label == null || label === false || (typeof label === "string" && label.trim() === "");
803
789
  }
804
790
 
805
791
  const TOOLTIP_GAP = 4;
@@ -878,10 +864,7 @@ function useViewportClamp(
878
864
  // new label, side or direction — is not measured yet, and renders clipped until it is.
879
865
  const [placement, setPlacement] = useState<Placement>(UNPLACED);
880
866
  const measured =
881
- placement.for !== null &&
882
- placement.for.side === side &&
883
- placement.for.label === label &&
884
- placement.for.dir === dir;
867
+ placement.for !== null && placement.for.side === side && placement.for.label === label && placement.for.dir === dir;
885
868
  useLayoutEffect(() => {
886
869
  const el = bubbleRef.current;
887
870
  if (!active || !el) {
@@ -939,10 +922,7 @@ const portalTransformBySide: Record<PhysicalSide, string> = {
939
922
 
940
923
  /** Anchor point (viewport px) for the tooltip on the given side of `r`. Paired
941
924
  * with {@link portalTransformBySide}, which shifts the box onto that point. */
942
- function tooltipAnchor(
943
- r: AnchorRect,
944
- side: PhysicalSide,
945
- ): { left: number; top: number } {
925
+ function tooltipAnchor(r: AnchorRect, side: PhysicalSide): { left: number; top: number } {
946
926
  switch (side) {
947
927
  case "right":
948
928
  return { left: r.right + TOOLTIP_GAP, top: r.top + r.height / 2 };
@@ -980,12 +960,7 @@ const opposite: Record<PhysicalSide, PhysicalSide> = {
980
960
  };
981
961
 
982
962
  /** Whether the bubble clears the viewport edge on `side` of the trigger. */
983
- function roomOn(
984
- r: AnchorRect,
985
- side: PhysicalSide,
986
- size: TooltipSize,
987
- viewport: TooltipViewport,
988
- ): boolean {
963
+ function roomOn(r: AnchorRect, side: PhysicalSide, size: TooltipSize, viewport: TooltipViewport): boolean {
989
964
  switch (side) {
990
965
  case "left":
991
966
  return r.left - TOOLTIP_GAP - size.width >= TOOLTIP_MARGIN;
@@ -1045,10 +1020,7 @@ export function placeTooltip(
1045
1020
  size: TooltipSize,
1046
1021
  viewport: TooltipViewport,
1047
1022
  ): TooltipPlacement {
1048
- const chosen =
1049
- roomOn(r, side, size, viewport) || !roomOn(r, opposite[side], size, viewport)
1050
- ? side
1051
- : opposite[side];
1023
+ const chosen = roomOn(r, side, size, viewport) || !roomOn(r, opposite[side], size, viewport) ? side : opposite[side];
1052
1024
  const point = tooltipAnchor(r, chosen);
1053
1025
  const box =
1054
1026
  chosen === "left"
@@ -1065,16 +1037,7 @@ export function placeTooltip(
1065
1037
  };
1066
1038
  }
1067
1039
 
1068
- function PortalTooltip({
1069
- label,
1070
- side,
1071
- className,
1072
- redact,
1073
- tap,
1074
- children,
1075
- ref,
1076
- ...rest
1077
- }: TooltipVariantProps) {
1040
+ function PortalTooltip({ label, side, className, redact, tap, children, ref, ...rest }: TooltipVariantProps) {
1078
1041
  const { triggerRef, setTrigger } = useTriggerRef(ref);
1079
1042
  // The trigger's reading direction, read when the bubble is asked for (an event, not a
1080
1043
  // render): it resolves `start` / `end`, and the portalled bubble — which has left the
@@ -1103,9 +1066,7 @@ function PortalTooltip({
1103
1066
  >
1104
1067
  {describedBy(children, open ? id : undefined)}
1105
1068
  </span>
1106
- {open && (
1107
- <PortalBubble triggerRef={triggerRef} id={id} label={label} side={side} dir={dir} redact={redact} />
1108
- )}
1069
+ {open && <PortalBubble triggerRef={triggerRef} id={id} label={label} side={side} dir={dir} redact={redact} />}
1109
1070
  </>
1110
1071
  );
1111
1072
  }
@@ -147,9 +147,7 @@ export function TranslationReviewEditor({
147
147
  const trimmedNote = note.trim() || null;
148
148
  // Approving says the text is right as it stands: there is no wording to suggest.
149
149
  const sent = verdict === "APPROVED" ? null : suggestion.trim() || null;
150
- void run(verdict === "APPROVED" ? "approve" : "flag", () =>
151
- onSave(reviewWrite(row, verdict, trimmedNote, sent)),
152
- );
150
+ void run(verdict === "APPROVED" ? "approve" : "flag", () => onSave(reviewWrite(row, verdict, trimmedNote, sent)));
153
151
  };
154
152
 
155
153
  return (
@@ -212,7 +210,9 @@ export function TranslationReviewEditor({
212
210
  {/* Read-only: what the reviewer said, as text — the fields are for saying it. */}
213
211
  {!editable && review?.verdict === "NEEDS_CHANGE" && (review.suggestion || review.note) && (
214
212
  <div className="space-y-2">
215
- {review.suggestion && <Then label={missing ? labels.translation : labels.suggestion} text={review.suggestion} />}
213
+ {review.suggestion && (
214
+ <Then label={missing ? labels.translation : labels.suggestion} text={review.suggestion} />
215
+ )}
216
216
  {review.note && <Then label={labels.note} text={review.note} />}
217
217
  </div>
218
218
  )}
@@ -173,7 +173,13 @@ export interface TranslationLocaleTabsProps {
173
173
  * strip's caret saying it goes on (`overflowCue`). Nothing for a single locale:
174
174
  * a strip with one tab is a heading that looks clickable.
175
175
  */
176
- export function TranslationLocaleTabs({ locales, active, onChange, className, labels: labelsProp }: TranslationLocaleTabsProps) {
176
+ export function TranslationLocaleTabs({
177
+ locales,
178
+ active,
179
+ onChange,
180
+ className,
181
+ labels: labelsProp,
182
+ }: TranslationLocaleTabsProps) {
177
183
  const labels = useKitLabels("translationReview", DEFAULT_TRANSLATION_REVIEW_LABELS, labelsProp);
178
184
  if (locales.length < 2) return null;
179
185
  return (
@@ -324,7 +324,6 @@ export interface TranslationReviewPanelProps {
324
324
  labels?: LabelOverride<TranslationReviewLabels>;
325
325
  }
326
326
 
327
-
328
327
  /**
329
328
  * How many rows the groups may render at once on a wide screen before they start folded
330
329
  * ({@link TranslationReviewPanelProps.defaultGroupsOpen}): two of the default 50-row pages.
@@ -432,7 +431,10 @@ function TextCell({ row, labels, clamp }: { row: TranslationRow; labels: Transla
432
431
  return row.text === "" ? (
433
432
  <span className="italic text-muted">{labels.missingText}</span>
434
433
  ) : (
435
- <span lang={row.locale} className={cn("whitespace-pre-line break-words", clamp && "line-clamp-3 large:line-clamp-none")}>
434
+ <span
435
+ lang={row.locale}
436
+ className={cn("whitespace-pre-line break-words", clamp && "line-clamp-3 large:line-clamp-none")}
437
+ >
436
438
  {row.text}
437
439
  </span>
438
440
  );
@@ -670,7 +672,12 @@ export function TranslationReviewPanel({
670
672
  ): Promise<boolean> => {
671
673
  if (!onSave || targets.length === 0) return false;
672
674
  const save = onSave;
673
- const ok = await run(key, () => save(targets.map((r) => reviewWrite(r, "APPROVED")), { origin, toasted: undoOn }));
675
+ const ok = await run(key, () =>
676
+ save(
677
+ targets.map((r) => reviewWrite(r, "APPROVED")),
678
+ { origin, toasted: undoOn },
679
+ ),
680
+ );
674
681
  if (ok && undoOn) sayDone(targets, description);
675
682
  return ok;
676
683
  };
@@ -764,9 +771,7 @@ export function TranslationReviewPanel({
764
771
  {
765
772
  key: "reference",
766
773
  header: referenceLabel,
767
- cell: (r) => (
768
- <span className="line-clamp-3 whitespace-pre-line break-words text-secondary">{r.reference}</span>
769
- ),
774
+ cell: (r) => <span className="line-clamp-3 whitespace-pre-line break-words text-secondary">{r.reference}</span>,
770
775
  mobileHidden: true,
771
776
  },
772
777
  {
@@ -805,11 +810,9 @@ export function TranslationReviewPanel({
805
810
  name: (r) => r.key,
806
811
  tooltipSide: "start",
807
812
  actions: (r) =>
808
- translationReviewSwipePlan(
809
- { end: ["approve", ...(binding.end ?? []), ...(binding.start ?? [])] },
810
- r,
811
- { canClear: onClear !== undefined },
812
- ).end.map((id): RowAction => {
813
+ translationReviewSwipePlan({ end: ["approve", ...(binding.end ?? []), ...(binding.start ?? [])] }, r, {
814
+ canClear: onClear !== undefined,
815
+ }).end.map((id): RowAction => {
813
816
  const swipe = swipeAction(r, id);
814
817
  // `edit` only opens the editor, whose own Save is the commit.
815
818
  const writes = id !== "edit";
@@ -1230,11 +1233,7 @@ export function TranslationReviewPanel({
1230
1233
  </BulkActionBar>
1231
1234
  )}
1232
1235
 
1233
- {groups && groups.length > 0 ? (
1234
- <div className="space-y-3">{groups.map(groupSection)}</div>
1235
- ) : (
1236
- table(visible)
1237
- )}
1236
+ {groups && groups.length > 0 ? <div className="space-y-3">{groups.map(groupSection)}</div> : table(visible)}
1238
1237
  </div>
1239
1238
  );
1240
1239
  }
@@ -153,9 +153,7 @@ export function TreeRow({
153
153
  style={{ paddingInlineStart: ROW_PAD + depth * indent, ...style }}
154
154
  className={cn(
155
155
  "relative flex min-h-8 items-center gap-1.5 rounded pe-2 text-sm",
156
- selected
157
- ? "bg-active font-medium text-primary"
158
- : "text-secondary",
156
+ selected ? "bg-active font-medium text-primary" : "text-secondary",
159
157
  className,
160
158
  )}
161
159
  >
@@ -183,12 +181,18 @@ export function TreeRow({
183
181
  e.stopPropagation();
184
182
  onToggle();
185
183
  }}
186
- className={cn("flex size-4 shrink-0 items-center justify-center rounded text-muted outline-none hover:text-primary", FOCUS_RING)}
184
+ className={cn(
185
+ "flex size-4 shrink-0 items-center justify-center rounded text-muted outline-none hover:text-primary",
186
+ FOCUS_RING,
187
+ )}
187
188
  >
188
189
  {chevron}
189
190
  </button>
190
191
  ) : expandable ? (
191
- <span data-tree-toggle="" className="flex size-4 shrink-0 cursor-pointer items-center justify-center text-muted">
192
+ <span
193
+ data-tree-toggle=""
194
+ className="flex size-4 shrink-0 cursor-pointer items-center justify-center text-muted"
195
+ >
192
196
  {chevron}
193
197
  </span>
194
198
  ) : (
@@ -203,9 +207,7 @@ export function TreeRow({
203
207
  {label}
204
208
  </span>
205
209
  {trailing !== undefined && trailing !== null && (
206
- <span className="ms-auto flex shrink-0 items-center gap-1 text-xs tabular-nums text-muted">
207
- {trailing}
208
- </span>
210
+ <span className="ms-auto flex shrink-0 items-center gap-1 text-xs tabular-nums text-muted">{trailing}</span>
209
211
  )}
210
212
  </>
211
213
  )}
@@ -215,8 +217,10 @@ export function TreeRow({
215
217
 
216
218
  /* ── TreeView ────────────────────────────────────────────────────────────── */
217
219
 
218
- export interface TreeViewProps<T = unknown>
219
- extends Omit<ComponentPropsWithRef<"ul">, "onSelect" | "children" | "defaultValue"> {
220
+ export interface TreeViewProps<T = unknown> extends Omit<
221
+ ComponentPropsWithRef<"ul">,
222
+ "onSelect" | "children" | "defaultValue"
223
+ > {
220
224
  items: readonly TreeNode<T>[];
221
225
  /** Open nodes, controlled. */
222
226
  expanded?: readonly string[];
@@ -285,14 +289,8 @@ export function TreeView<T = unknown>({
285
289
  onClick,
286
290
  ...rest
287
291
  }: TreeViewProps<T>) {
288
- const [expandedList, setExpandedOwn] = useControllable<readonly string[]>(
289
- expandedProp,
290
- defaultExpanded ?? [],
291
- );
292
- const [selected, setSelectedOwn] = useControllable<string | null>(
293
- selectedProp,
294
- defaultSelected ?? null,
295
- );
292
+ const [expandedList, setExpandedOwn] = useControllable<readonly string[]>(expandedProp, defaultExpanded ?? []);
293
+ const [selected, setSelectedOwn] = useControllable<string | null>(selectedProp, defaultSelected ?? null);
296
294
  const expandedSet = useMemo(() => new Set(expandedList), [expandedList]);
297
295
  const [loading, setLoading] = useState<ReadonlySet<string>>(() => new Set());
298
296
  const [focusedId, setFocusedId] = useState<string | null>(null);
@@ -327,8 +325,7 @@ export function TreeView<T = unknown>({
327
325
  while (cur && !visibleIds.has(cur)) cur = byId.get(cur)?.parentId ?? null;
328
326
  return cur;
329
327
  };
330
- const tabbable =
331
- nearestVisible(focusedId) ?? nearestVisible(selected) ?? visible[0]?.node.id ?? null;
328
+ const tabbable = nearestVisible(focusedId) ?? nearestVisible(selected) ?? visible[0]?.node.id ?? null;
332
329
 
333
330
  useEffect(() => {
334
331
  const id = pendingFocus.current;
@@ -111,6 +111,44 @@ export interface TreemapProps extends Omit<ComponentPropsWithoutRef<"div">, "chi
111
111
  * so a caller colouring a legend beside the map is guaranteed the same list.
112
112
  */
113
113
  colors?: readonly string[];
114
+ /**
115
+ * How tiles are parted (0.51.6, keksdose dev #642, Marcel: "The borders do not look
116
+ * nice when changing from tile to tile. Can this be uniform black?" — and then, on the
117
+ * contrast rule that would go with it: follow the contrast setting).
118
+ *
119
+ * - `"auto"` (default): `"uniform"` at Standard contrast, `"contrast"` while More
120
+ * contrast is in force (`<html data-contrast="more">`: the reader chose it, or chose
121
+ * System on a device that asks for more). Followed live.
122
+ * - `"uniform"`: one 2px gutter in the page's ground colour (`--bg-page`, near-black
123
+ * in the dark theme) round every tile, and nothing else. Tiles always abut, so the
124
+ * gutter parts them; each tile is named by its label.
125
+ * - `"contrast"`: the 0.49 rule. The gutter is the card's colour (`--bg-surface`),
126
+ * and a tile whose hue is under 3:1 against the card gets a 1px ink edge inside it
127
+ * (WCAG 1.4.11, `useChartEdge`). In the dark theme that ink is light, so some tiles
128
+ * carry a white outline and their neighbours none — the unevenness #642 saw, and
129
+ * the price of the edge for a reader who asked for it.
130
+ */
131
+ edges?: TreemapEdges;
132
+ }
133
+
134
+ /** {@link TreemapProps.edges}. */
135
+ export type TreemapEdges = "auto" | "uniform" | "contrast";
136
+
137
+ // `<html data-contrast>`, followed live: what `edges="auto"` keys on. Read here rather
138
+ // than through theme/contrast, whose store would come into the chart entry with it.
139
+ function subscribeContrast(onChange: () => void): () => void {
140
+ if (typeof MutationObserver === "undefined" || typeof document === "undefined") return () => {};
141
+ const observer = new MutationObserver(onChange);
142
+ observer.observe(document.documentElement, { attributes: true, attributeFilter: ["data-contrast"] });
143
+ return () => observer.disconnect();
144
+ }
145
+ const readMoreContrast = () =>
146
+ typeof document !== "undefined" && document.documentElement.getAttribute("data-contrast") === "more";
147
+
148
+ /** The edges a tile draws: `auto` resolved against the contrast in force. */
149
+ function useTileEdges(edges: TreemapEdges): "uniform" | "contrast" {
150
+ const more = useSyncExternalStore(subscribeContrast, readMoreContrast, () => false);
151
+ return edges === "auto" ? (more ? "contrast" : "uniform") : edges;
114
152
  }
115
153
 
116
154
  // ── The categorical ramp, as concrete hex ──────────────────────────────────
@@ -218,6 +256,8 @@ export interface TreemapCellProps {
218
256
  * the label stands in the tile's top RIGHT corner and is shaped right-to-left, so a
219
257
  * clipped name ends in its ellipsis on the reading end. Default `ltr`. */
220
258
  dir?: Direction;
259
+ /** See {@link TreemapProps.edges}. Default `auto`. */
260
+ edges?: TreemapEdges;
221
261
  }
222
262
 
223
263
  /**
@@ -245,11 +285,13 @@ export function TreemapCell({
245
285
  redactNames,
246
286
  nodeNote,
247
287
  dir = "ltr",
288
+ edges: edgesProp = "auto",
248
289
  }: TreemapCellProps) {
249
290
  // Before the early return: a hook has to run on every render of the cell.
250
291
  const tokenHex = useChartTokenHex();
251
292
  const { scale } = useTextSize();
252
293
  const edgeFor = useChartEdge();
294
+ const edges = useTileEdges(edgesProp);
253
295
  // Depth 0 is recharts' synthetic root, which spans the whole chart.
254
296
  if (!depth) return null;
255
297
  // Whole pixels: a rect on a half pixel renders its edge across two half-lit
@@ -261,9 +303,10 @@ export function TreemapCell({
261
303
  const tileFill = fill ?? "var(--chart-1)";
262
304
  const measured = measurableFill(tileFill, tokenHex);
263
305
  const ink = labelColor ?? (measured ? textOn(measured) : "currentColor");
264
- // A tile in a hue under 3:1 against the card gets a 1px ink edge inside the gutter
265
- // (WCAG 1.4.11, anyplot's rule); a hue that clears it stays bare.
266
- const edge = measured ? edgeFor(measured) : undefined;
306
+ // `contrast`: a tile in a hue under 3:1 against the card gets a 1px ink edge inside
307
+ // the gutter (WCAG 1.4.11, anyplot's rule); a hue that clears it stays bare.
308
+ // `uniform`: no per-tile edge; every tile is parted by the same gutter.
309
+ const edge = edges === "contrast" && measured ? edgeFor(measured) : undefined;
267
310
  // The halo only on an OPAQUE fill we could measure. A translucent fill (a
268
311
  // `color-mix(… transparent)`) composited twice — once as the tile, once as the halo
269
312
  // over it — draws a darker ring round every glyph, which read as doubled text on the
@@ -279,8 +322,7 @@ export function TreemapCell({
279
322
  // 29px down and an 11px glyph hangs ~2px below it, so 36 leaves the same ~5px under
280
323
  // the note that the label keeps under itself at the 20px floor.
281
324
  const rawNote = id != null && nodeNote ? nodeNote(id) : undefined;
282
- const note =
283
- label != null && rawNote != null && ph >= 36 * scale ? fitLabel(rawNote, pw, noteSize) : null;
325
+ const note = label != null && rawNote != null && ph >= 36 * scale ? fitLabel(rawNote, pw, noteSize) : null;
284
326
  // The label's START edge, 6px in from the tile's. The tiles themselves are laid out
285
327
  // physically (the plot is not mirrored, see `ChartContainer`) and the chart's SVG is
286
328
  // pinned `ltr`, so the direction is set on each <text> explicitly: `start` is then
@@ -310,15 +352,16 @@ export function TreemapCell({
310
352
  // for as long as the tile has keyboard focus.
311
353
  className={activate ? "outline-none [&:focus-visible>rect]:stroke-[var(--brand)]" : undefined}
312
354
  >
313
- {/* The 2px gutter is the card showing through, not a white grid — on a dark
314
- surface white lines glare harder than the tiles. */}
355
+ {/* The 2px gutter: the page's ground (`uniform`, the same dark line round every
356
+ tile in the dark theme) or the card showing through (`contrast`). Never a white
357
+ grid: on a dark surface white lines glare harder than the tiles. */}
315
358
  <rect
316
359
  x={px}
317
360
  y={py}
318
361
  width={pw}
319
362
  height={ph}
320
363
  fill={tileFill}
321
- stroke="var(--bg-surface)"
364
+ stroke={edges === "contrast" ? "var(--bg-surface)" : "var(--bg-page)"}
322
365
  strokeWidth={2}
323
366
  rx={3}
324
367
  />
@@ -428,6 +471,7 @@ export function Treemap({
428
471
  nodeNote,
429
472
  maxTiles,
430
473
  colors,
474
+ edges = "auto",
431
475
  style,
432
476
  ...rest
433
477
  }: TreemapProps) {
@@ -482,7 +526,13 @@ export function Treemap({
482
526
  fill="var(--chart-1)"
483
527
  isAnimationActive={false}
484
528
  content={
485
- <TreemapCell onNodeClick={onNodeClick} redactNames={redactNames} nodeNote={nodeNote} dir={dir} />
529
+ <TreemapCell
530
+ onNodeClick={onNodeClick}
531
+ redactNames={redactNames}
532
+ nodeNote={nodeNote}
533
+ dir={dir}
534
+ edges={edges}
535
+ />
486
536
  }
487
537
  >
488
538
  <ChartTooltip content={<Content hideLabel valueFormatter={format} />} />