@eifi1/ui-kit 0.51.7 → 0.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (746) hide show
  1. package/README.md +141 -23
  2. package/dist/account/account-parts.d.ts +10 -8
  3. package/dist/account/account-parts.js +1 -18
  4. package/dist/account/account-parts.js.map +1 -1
  5. package/dist/account/data-export-setting-labels.js +1 -1
  6. package/dist/account/data-export-setting-labels.js.map +1 -1
  7. package/dist/account/delete-account-setting-labels.js +1 -1
  8. package/dist/account/delete-account-setting-labels.js.map +1 -1
  9. package/dist/account/email-change-setting-labels.js +1 -1
  10. package/dist/account/email-change-setting-labels.js.map +1 -1
  11. package/dist/account/passkeys-setting.d.ts +9 -2
  12. package/dist/account/passkeys-setting.js +41 -29
  13. package/dist/account/passkeys-setting.js.map +1 -1
  14. package/dist/account/sessions-setting.d.ts +3 -2
  15. package/dist/account/sessions-setting.js +10 -8
  16. package/dist/account/sessions-setting.js.map +1 -1
  17. package/dist/admin/admin-action-confirm.js +1 -3
  18. package/dist/admin/admin-action-confirm.js.map +1 -1
  19. package/dist/admin/admin-parts.d.ts +6 -3
  20. package/dist/admin/admin-parts.js +6 -21
  21. package/dist/admin/admin-parts.js.map +1 -1
  22. package/dist/admin/mail-test-card-labels.js +1 -1
  23. package/dist/admin/mail-test-card-labels.js.map +1 -1
  24. package/dist/admin/plan-change-labels.d.ts +2 -2
  25. package/dist/admin/plan-change-labels.js +1 -17
  26. package/dist/admin/plan-change-labels.js.map +1 -1
  27. package/dist/admin/plan-change.d.ts +3 -42
  28. package/dist/admin/plan-change.js +1 -1
  29. package/dist/admin/plan-change.js.map +1 -1
  30. package/dist/admin/reviewer-scope-editor.js +3 -3
  31. package/dist/admin/reviewer-scope-editor.js.map +1 -1
  32. package/dist/auth/auth-errors-labels.d.ts +11 -0
  33. package/dist/auth/auth-errors-labels.js +13 -0
  34. package/dist/auth/auth-errors-labels.js.map +1 -0
  35. package/dist/auth/auth-errors.d.ts +7 -23
  36. package/dist/auth/auth-errors.js +2 -15
  37. package/dist/auth/auth-errors.js.map +1 -1
  38. package/dist/auth/complete-name-dialog.js +2 -1
  39. package/dist/auth/complete-name-dialog.js.map +1 -1
  40. package/dist/auth/forgot-password-form-labels.js +1 -1
  41. package/dist/auth/forgot-password-form-labels.js.map +1 -1
  42. package/dist/auth/forgot-password-form.js +7 -2
  43. package/dist/auth/forgot-password-form.js.map +1 -1
  44. package/dist/auth/register-form-labels.js +1 -1
  45. package/dist/auth/register-form-labels.js.map +1 -1
  46. package/dist/auth/reset-password-form-labels.js +1 -1
  47. package/dist/auth/reset-password-form-labels.js.map +1 -1
  48. package/dist/auth/reset-password-form.js +5 -1
  49. package/dist/auth/reset-password-form.js.map +1 -1
  50. package/dist/auth/sign-in-form-labels.js +1 -1
  51. package/dist/auth/sign-in-form-labels.js.map +1 -1
  52. package/dist/auth/status-parts.d.ts +0 -3
  53. package/dist/auth/status-parts.js +0 -4
  54. package/dist/auth/status-parts.js.map +1 -1
  55. package/dist/auth/verify-email-labels.js +1 -1
  56. package/dist/auth/verify-email-labels.js.map +1 -1
  57. package/dist/auth/verify-email.js +7 -2
  58. package/dist/auth/verify-email.js.map +1 -1
  59. package/dist/billing/cancel-subscription.d.ts +20 -8
  60. package/dist/billing/cancel-subscription.js +7 -5
  61. package/dist/billing/cancel-subscription.js.map +1 -1
  62. package/dist/billing/dialog-close.d.ts +29 -0
  63. package/dist/billing/dialog-close.js +8 -0
  64. package/dist/billing/dialog-close.js.map +1 -0
  65. package/dist/billing/plan-card.d.ts +14 -4
  66. package/dist/billing/plan-card.js +15 -8
  67. package/dist/billing/plan-card.js.map +1 -1
  68. package/dist/billing/plan-change-labels.d.ts +42 -0
  69. package/dist/billing/plan-change-labels.js +22 -0
  70. package/dist/billing/plan-change-labels.js.map +1 -0
  71. package/dist/billing/plan-switch.d.ts +19 -7
  72. package/dist/billing/plan-switch.js +8 -4
  73. package/dist/billing/plan-switch.js.map +1 -1
  74. package/dist/chart.d.ts +12 -0
  75. package/dist/chart.js +16 -1
  76. package/dist/chart.js.map +1 -1
  77. package/dist/components/account-chips.d.ts +5 -5
  78. package/dist/components/account-chips.js +11 -13
  79. package/dist/components/account-chips.js.map +1 -1
  80. package/dist/components/alert-banner.d.ts +16 -5
  81. package/dist/components/alert-banner.js +46 -1
  82. package/dist/components/alert-banner.js.map +1 -1
  83. package/dist/components/amount-input.d.ts +13 -0
  84. package/dist/components/amount-input.js +1 -0
  85. package/dist/components/amount-input.js.map +1 -1
  86. package/dist/components/autocomplete.js +57 -65
  87. package/dist/components/autocomplete.js.map +1 -1
  88. package/dist/components/bulk-action-bar.d.ts +12 -2
  89. package/dist/components/bulk-action-bar.js +65 -21
  90. package/dist/components/bulk-action-bar.js.map +1 -1
  91. package/dist/components/button-look.d.ts +5 -5
  92. package/dist/components/button-look.js.map +1 -1
  93. package/dist/components/button.d.ts +2 -2
  94. package/dist/components/button.js.map +1 -1
  95. package/dist/components/chart-edge.d.ts +16 -0
  96. package/dist/components/chart-edge.js +14 -1
  97. package/dist/components/chart-edge.js.map +1 -1
  98. package/dist/components/chart-figure.d.ts +13 -0
  99. package/dist/components/chart-figure.js +15 -0
  100. package/dist/components/chart-figure.js.map +1 -0
  101. package/dist/components/chart-zoom-core.js +1 -4
  102. package/dist/components/chart-zoom-core.js.map +1 -1
  103. package/dist/components/chart.d.ts +8 -1
  104. package/dist/components/chart.js +19 -10
  105. package/dist/components/chart.js.map +1 -1
  106. package/dist/components/combobox-core.d.ts +111 -2
  107. package/dist/components/combobox-core.js +148 -42
  108. package/dist/components/combobox-core.js.map +1 -1
  109. package/dist/components/combobox.d.ts +1 -1
  110. package/dist/components/combobox.js +141 -130
  111. package/dist/components/combobox.js.map +1 -1
  112. package/dist/components/copy-button.d.ts +6 -5
  113. package/dist/components/copy-button.js +5 -3
  114. package/dist/components/copy-button.js.map +1 -1
  115. package/dist/components/country-select.js +2 -2
  116. package/dist/components/country-select.js.map +1 -1
  117. package/dist/components/data-table-column-settings.d.ts +1 -1
  118. package/dist/components/data-table-column-settings.js +33 -7
  119. package/dist/components/data-table-column-settings.js.map +1 -1
  120. package/dist/components/data-table-filters.d.ts +4 -2
  121. package/dist/components/data-table-filters.js +2 -2
  122. package/dist/components/data-table-filters.js.map +1 -1
  123. package/dist/components/data-table-fit.d.ts +6 -4
  124. package/dist/components/data-table-fit.js +4 -1
  125. package/dist/components/data-table-fit.js.map +1 -1
  126. package/dist/components/data-table-groups.d.ts +1 -1
  127. package/dist/components/data-table-groups.js.map +1 -1
  128. package/dist/components/data-table-head.d.ts +1 -1
  129. package/dist/components/data-table-head.js +15 -12
  130. package/dist/components/data-table-head.js.map +1 -1
  131. package/dist/components/data-table-mobile.d.ts +12 -7
  132. package/dist/components/data-table-mobile.js +43 -30
  133. package/dist/components/data-table-mobile.js.map +1 -1
  134. package/dist/components/data-table-pagination.js +11 -6
  135. package/dist/components/data-table-pagination.js.map +1 -1
  136. package/dist/components/data-table-resize.d.ts +1 -1
  137. package/dist/components/data-table-resize.js.map +1 -1
  138. package/dist/components/data-table-row-actions.d.ts +2 -2
  139. package/dist/components/data-table-row-actions.js.map +1 -1
  140. package/dist/components/data-table-row.d.ts +6 -2
  141. package/dist/components/data-table-row.js +17 -10
  142. package/dist/components/data-table-row.js.map +1 -1
  143. package/dist/components/data-table-selection.d.ts +1 -1
  144. package/dist/components/data-table-selection.js.map +1 -1
  145. package/dist/components/data-table-shared.d.ts +10 -2
  146. package/dist/components/data-table-shared.js +18 -0
  147. package/dist/components/data-table-shared.js.map +1 -1
  148. package/dist/components/data-table-sort.d.ts +21 -2
  149. package/dist/components/data-table-sort.js +24 -0
  150. package/dist/components/data-table-sort.js.map +1 -1
  151. package/dist/components/data-table-virtual.d.ts +1 -1
  152. package/dist/components/data-table-virtual.js +18 -6
  153. package/dist/components/data-table-virtual.js.map +1 -1
  154. package/dist/components/data-table.d.ts +13 -4
  155. package/dist/components/data-table.js +139 -36
  156. package/dist/components/data-table.js.map +1 -1
  157. package/dist/components/date-field.d.ts +24 -2
  158. package/dist/components/date-field.js +33 -8
  159. package/dist/components/date-field.js.map +1 -1
  160. package/dist/components/date-picker.d.ts +15 -2
  161. package/dist/components/date-picker.js +55 -26
  162. package/dist/components/date-picker.js.map +1 -1
  163. package/dist/components/date-range-picker.d.ts +47 -20
  164. package/dist/components/date-range-picker.js +23 -7
  165. package/dist/components/date-range-picker.js.map +1 -1
  166. package/dist/components/error-boundary.js +37 -30
  167. package/dist/components/error-boundary.js.map +1 -1
  168. package/dist/components/{ui-labels.d.ts → field-base-labels.d.ts} +0 -2
  169. package/dist/components/{ui-labels.js → field-base-labels.js} +2 -9
  170. package/dist/components/field-base-labels.js.map +1 -0
  171. package/dist/components/field-base.d.ts +4 -3
  172. package/dist/components/field-base.js +3 -3
  173. package/dist/components/field-base.js.map +1 -1
  174. package/dist/components/field-sync-labels.d.ts +1 -0
  175. package/dist/components/field-sync-labels.js.map +1 -1
  176. package/dist/components/field-sync.d.ts +23 -1
  177. package/dist/components/field-sync.js.map +1 -1
  178. package/dist/components/form-actions.js +11 -5
  179. package/dist/components/form-actions.js.map +1 -1
  180. package/dist/components/hover-menu.d.ts +3 -0
  181. package/dist/components/hover-menu.js +5 -3
  182. package/dist/components/hover-menu.js.map +1 -1
  183. package/dist/components/icon-button.js +14 -9
  184. package/dist/components/icon-button.js.map +1 -1
  185. package/dist/components/inline-confirm.d.ts +43 -0
  186. package/dist/components/inline-confirm.js +67 -0
  187. package/dist/components/inline-confirm.js.map +1 -0
  188. package/dist/components/inline-entity-combobox.d.ts +4 -3
  189. package/dist/components/inline-entity-combobox.js +148 -140
  190. package/dist/components/inline-entity-combobox.js.map +1 -1
  191. package/dist/components/input.js +1 -1
  192. package/dist/components/input.js.map +1 -1
  193. package/dist/components/jump-calendar.js +28 -112
  194. package/dist/components/jump-calendar.js.map +1 -1
  195. package/dist/components/legal-page.d.ts +3 -1
  196. package/dist/components/legal-page.js +3 -2
  197. package/dist/components/legal-page.js.map +1 -1
  198. package/dist/components/legal.d.ts +4 -2
  199. package/dist/components/legal.js.map +1 -1
  200. package/dist/components/lightbox.d.ts +2 -2
  201. package/dist/components/lightbox.js +17 -6
  202. package/dist/components/lightbox.js.map +1 -1
  203. package/dist/components/list.d.ts +6 -2
  204. package/dist/components/list.js +3 -2
  205. package/dist/components/list.js.map +1 -1
  206. package/dist/components/measured-grid.d.ts +1 -1
  207. package/dist/components/measured-grid.js +2 -1
  208. package/dist/components/measured-grid.js.map +1 -1
  209. package/dist/components/mini-calendar.js +3 -5
  210. package/dist/components/mini-calendar.js.map +1 -1
  211. package/dist/components/modal.js +3 -1
  212. package/dist/components/modal.js.map +1 -1
  213. package/dist/components/month-grid.d.ts +55 -0
  214. package/dist/components/month-grid.js +148 -0
  215. package/dist/components/month-grid.js.map +1 -0
  216. package/dist/components/month-picker.d.ts +36 -4
  217. package/dist/components/month-picker.js +123 -146
  218. package/dist/components/month-picker.js.map +1 -1
  219. package/dist/components/multi-select.d.ts +2 -2
  220. package/dist/components/multi-select.js +11 -6
  221. package/dist/components/multi-select.js.map +1 -1
  222. package/dist/components/picker-sheet.js +2 -1
  223. package/dist/components/picker-sheet.js.map +1 -1
  224. package/dist/components/pie-chart-labels.d.ts +7 -0
  225. package/dist/components/pie-chart-labels.js +1 -0
  226. package/dist/components/pie-chart-labels.js.map +1 -1
  227. package/dist/components/pie-chart.d.ts +5 -3
  228. package/dist/components/pie-chart.js +7 -22
  229. package/dist/components/pie-chart.js.map +1 -1
  230. package/dist/components/popover.d.ts +3 -0
  231. package/dist/components/popover.js +7 -1
  232. package/dist/components/popover.js.map +1 -1
  233. package/dist/components/row-actions.js +2 -1
  234. package/dist/components/row-actions.js.map +1 -1
  235. package/dist/components/section-nav.d.ts +7 -0
  236. package/dist/components/section-nav.js.map +1 -1
  237. package/dist/components/series-chart-axes.d.ts +3 -3
  238. package/dist/components/series-chart-axes.js.map +1 -1
  239. package/dist/components/series-chart-labels.d.ts +7 -4
  240. package/dist/components/series-chart-labels.js.map +1 -1
  241. package/dist/components/series-chart.d.ts +31 -7
  242. package/dist/components/series-chart.js +72 -29
  243. package/dist/components/series-chart.js.map +1 -1
  244. package/dist/components/share-card.js +3 -3
  245. package/dist/components/share-card.js.map +1 -1
  246. package/dist/components/sign-chip-labels.d.ts +1 -0
  247. package/dist/components/sign-chip-labels.js.map +1 -1
  248. package/dist/components/sign-chip.d.ts +10 -1
  249. package/dist/components/sign-chip.js.map +1 -1
  250. package/dist/components/tabs-labels.d.ts +2 -0
  251. package/dist/components/tabs-labels.js +11 -0
  252. package/dist/components/tabs-labels.js.map +1 -0
  253. package/dist/components/tabs.d.ts +1 -1
  254. package/dist/components/tabs.js +1 -1
  255. package/dist/components/tabs.js.map +1 -1
  256. package/dist/components/toggle-legend.d.ts +2 -2
  257. package/dist/components/toggle-legend.js +6 -6
  258. package/dist/components/toggle-legend.js.map +1 -1
  259. package/dist/components/translation-review-editor.d.ts +4 -2
  260. package/dist/components/translation-review-editor.js +2 -3
  261. package/dist/components/translation-review-editor.js.map +1 -1
  262. package/dist/components/translation-review.d.ts +2 -1
  263. package/dist/components/translation-review.js +2 -2
  264. package/dist/components/translation-review.js.map +1 -1
  265. package/dist/components/treemap-labels.d.ts +26 -0
  266. package/dist/components/treemap-labels.js +10 -0
  267. package/dist/components/treemap-labels.js.map +1 -0
  268. package/dist/components/treemap-layout.d.ts +62 -0
  269. package/dist/components/treemap-layout.js +126 -0
  270. package/dist/components/treemap-layout.js.map +1 -0
  271. package/dist/components/treemap.d.ts +140 -17
  272. package/dist/components/treemap.js +324 -97
  273. package/dist/components/treemap.js.map +1 -1
  274. package/dist/components/use-table-state.d.ts +5 -5
  275. package/dist/components/use-table-state.js +4 -1
  276. package/dist/components/use-table-state.js.map +1 -1
  277. package/dist/data-table.d.ts +6 -2
  278. package/dist/data-table.js +7 -2
  279. package/dist/data-table.js.map +1 -1
  280. package/dist/eslint/index.js +1 -1
  281. package/dist/eslint/role-utilities.d.ts +36 -7
  282. package/dist/eslint/role-utilities.js +42 -9
  283. package/dist/eslint/role-utilities.js.map +1 -1
  284. package/dist/feedback/feedback-dialog.d.ts +25 -16
  285. package/dist/feedback/feedback-dialog.js +6 -2
  286. package/dist/feedback/feedback-dialog.js.map +1 -1
  287. package/dist/feedback/feedback-mutation.d.ts +30 -0
  288. package/dist/feedback/feedback-mutation.js +16 -0
  289. package/dist/feedback/feedback-mutation.js.map +1 -0
  290. package/dist/feedback/feedback-page-link.d.ts +53 -0
  291. package/dist/feedback/feedback-page-link.js +37 -0
  292. package/dist/feedback/feedback-page-link.js.map +1 -0
  293. package/dist/feedback/feedback-public-list.d.ts +12 -3
  294. package/dist/feedback/feedback-public-list.js +2 -1
  295. package/dist/feedback/feedback-public-list.js.map +1 -1
  296. package/dist/feedback/feedback-replies.d.ts +3 -1
  297. package/dist/feedback/feedback-replies.js +5 -4
  298. package/dist/feedback/feedback-replies.js.map +1 -1
  299. package/dist/feedback/feedback-row-detail-labels.js +5 -0
  300. package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
  301. package/dist/feedback/feedback-row-detail.d.ts +64 -28
  302. package/dist/feedback/feedback-row-detail.js +30 -28
  303. package/dist/feedback/feedback-row-detail.js.map +1 -1
  304. package/dist/feedback/feedback-status-undo.d.ts +30 -11
  305. package/dist/feedback/feedback-status-undo.js +10 -15
  306. package/dist/feedback/feedback-status-undo.js.map +1 -1
  307. package/dist/feedback/feedback-submit-dialog.d.ts +1 -1
  308. package/dist/feedback/feedback-submit-dialog.js +1 -1
  309. package/dist/feedback/feedback-submit-dialog.js.map +1 -1
  310. package/dist/feedback/feedback-submit.js +9 -3
  311. package/dist/feedback/feedback-submit.js.map +1 -1
  312. package/dist/feedback/feedback-swipe.d.ts +1 -1
  313. package/dist/feedback/feedback-swipe.js.map +1 -1
  314. package/dist/feedback/feedback-table.d.ts +21 -9
  315. package/dist/feedback/feedback-table.js +45 -25
  316. package/dist/feedback/feedback-table.js.map +1 -1
  317. package/dist/feedback/feedback-thread-labels.d.ts +2 -2
  318. package/dist/feedback/feedback-thread-labels.js.map +1 -1
  319. package/dist/feedback/feedback-thread.d.ts +24 -23
  320. package/dist/feedback/feedback-thread.js +2 -1
  321. package/dist/feedback/feedback-thread.js.map +1 -1
  322. package/dist/feedback.d.ts +34 -0
  323. package/dist/feedback.js +42 -0
  324. package/dist/feedback.js.map +1 -1
  325. package/dist/hooks/use-focus-trap.d.ts +35 -0
  326. package/dist/hooks/use-focus-trap.js +6 -4
  327. package/dist/hooks/use-focus-trap.js.map +1 -1
  328. package/dist/hooks/use-hotkey.d.ts +5 -2
  329. package/dist/hooks/use-hotkey.js +5 -4
  330. package/dist/hooks/use-hotkey.js.map +1 -1
  331. package/dist/hooks/use-long-press.d.ts +7 -4
  332. package/dist/hooks/use-long-press.js +3 -0
  333. package/dist/hooks/use-long-press.js.map +1 -1
  334. package/dist/hooks/use-media-query.js +12 -4
  335. package/dist/hooks/use-media-query.js.map +1 -1
  336. package/dist/hooks/use-mounted.d.ts +22 -0
  337. package/dist/hooks/use-mounted.js +24 -0
  338. package/dist/hooks/use-mounted.js.map +1 -0
  339. package/dist/hooks/use-overlay-history.js +19 -3
  340. package/dist/hooks/use-overlay-history.js.map +1 -1
  341. package/dist/i18n/defaults.js +4 -5
  342. package/dist/i18n/defaults.js.map +1 -1
  343. package/dist/i18n/german.js +7 -1
  344. package/dist/i18n/german.js.map +1 -1
  345. package/dist/i18n/kit-labels.d.ts +9 -2
  346. package/dist/i18n/kit-labels.js.map +1 -1
  347. package/dist/i18n/locales/en.js +20 -41
  348. package/dist/i18n/locales/en.js.map +3 -3
  349. package/dist/i18n/locales/es.js +7 -1
  350. package/dist/i18n/locales/es.js.map +1 -1
  351. package/dist/i18n/locales/fr.js +20 -10
  352. package/dist/i18n/locales/fr.js.map +1 -1
  353. package/dist/i18n/locales/hu.js +9 -1
  354. package/dist/i18n/locales/hu.js.map +1 -1
  355. package/dist/i18n/locales/it.js +7 -1
  356. package/dist/i18n/locales/it.js.map +1 -1
  357. package/dist/i18n/locales/zh.js +8 -1
  358. package/dist/i18n/locales/zh.js.map +1 -1
  359. package/dist/i18n/review.js +5 -0
  360. package/dist/i18n/review.js.map +1 -1
  361. package/dist/index.d.ts +64 -17
  362. package/dist/index.js +77 -12
  363. package/dist/index.js.map +1 -1
  364. package/dist/landing/routing.d.ts +3 -1
  365. package/dist/landing/routing.js +4 -7
  366. package/dist/landing/routing.js.map +1 -1
  367. package/dist/lib/broadcast.d.ts +17 -0
  368. package/dist/lib/broadcast.js +30 -0
  369. package/dist/lib/broadcast.js.map +1 -0
  370. package/dist/lib/date-format.d.ts +37 -2
  371. package/dist/lib/date-format.js +34 -8
  372. package/dist/lib/date-format.js.map +1 -1
  373. package/dist/lib/day-format.d.ts +46 -0
  374. package/dist/lib/day-format.js +46 -0
  375. package/dist/lib/day-format.js.map +1 -0
  376. package/dist/lib/describe-failure.d.ts +14 -0
  377. package/dist/lib/describe-failure.js +9 -0
  378. package/dist/lib/describe-failure.js.map +1 -0
  379. package/dist/lib/direction.d.ts +16 -0
  380. package/dist/lib/direction.js +9 -1
  381. package/dist/lib/direction.js.map +1 -1
  382. package/dist/lib/focus-left.d.ts +63 -0
  383. package/dist/lib/focus-left.js +67 -0
  384. package/dist/lib/focus-left.js.map +1 -0
  385. package/dist/lib/format.js +5 -14
  386. package/dist/lib/format.js.map +1 -1
  387. package/dist/lib/http-status.d.ts +24 -0
  388. package/dist/lib/http-status.js +14 -0
  389. package/dist/lib/http-status.js.map +1 -0
  390. package/dist/lib/intl-cache.d.ts +14 -0
  391. package/dist/lib/intl-cache.js +15 -0
  392. package/dist/lib/intl-cache.js.map +1 -0
  393. package/dist/lib/isin.d.ts +10 -0
  394. package/dist/lib/isin.js.map +1 -1
  395. package/dist/lib/iso-day.d.ts +11 -0
  396. package/dist/lib/iso-day.js +8 -0
  397. package/dist/lib/iso-day.js.map +1 -0
  398. package/dist/lib/lazy-with-fallback.d.ts +31 -0
  399. package/dist/lib/lazy-with-fallback.js +40 -0
  400. package/dist/lib/lazy-with-fallback.js.map +1 -0
  401. package/dist/lib/path-pattern.d.ts +34 -0
  402. package/dist/lib/path-pattern.js +24 -0
  403. package/dist/lib/path-pattern.js.map +1 -0
  404. package/dist/lib/reduced-motion.d.ts +2 -1
  405. package/dist/lib/reduced-motion.js.map +1 -1
  406. package/dist/lib/round.d.ts +2 -1
  407. package/dist/lib/round.js +2 -1
  408. package/dist/lib/round.js.map +1 -1
  409. package/dist/lib/safe-storage.d.ts +24 -5
  410. package/dist/lib/safe-storage.js +27 -2
  411. package/dist/lib/safe-storage.js.map +1 -1
  412. package/dist/lib/session-refresh.js +1 -1
  413. package/dist/lib/session-refresh.js.map +1 -1
  414. package/dist/lib/share-format.d.ts +13 -0
  415. package/dist/lib/share-format.js +10 -0
  416. package/dist/lib/share-format.js.map +1 -0
  417. package/dist/lib/text-case.d.ts +17 -0
  418. package/dist/lib/text-case.js +8 -0
  419. package/dist/lib/text-case.js.map +1 -0
  420. package/dist/lib/text-match.d.ts +29 -0
  421. package/dist/lib/text-match.js +20 -2
  422. package/dist/lib/text-match.js.map +1 -1
  423. package/dist/lib/thenable.d.ts +13 -0
  424. package/dist/lib/thenable.js +8 -0
  425. package/dist/lib/thenable.js.map +1 -0
  426. package/dist/lib/translation-review.d.ts +7 -2
  427. package/dist/lib/translation-review.js +4 -4
  428. package/dist/lib/translation-review.js.map +1 -1
  429. package/dist/notifications/device-zone-report.js +1 -1
  430. package/dist/notifications/device-zone-report.js.map +1 -1
  431. package/dist/notifications/notification-bell.d.ts +2 -1
  432. package/dist/notifications/notification-bell.js +3 -3
  433. package/dist/notifications/notification-bell.js.map +1 -1
  434. package/dist/notifications/notification-inbox.d.ts +10 -6
  435. package/dist/notifications/notification-inbox.js +26 -48
  436. package/dist/notifications/notification-inbox.js.map +1 -1
  437. package/dist/notifications/notification-parts.d.ts +3 -2
  438. package/dist/notifications/notification-parts.js +1 -3
  439. package/dist/notifications/notification-parts.js.map +1 -1
  440. package/dist/notifications/notification-types-setting.js +1 -1
  441. package/dist/notifications/notification-types-setting.js.map +1 -1
  442. package/dist/notifications/notifications-labels.d.ts +6 -0
  443. package/dist/notifications/notifications-labels.js +1 -0
  444. package/dist/notifications/notifications-labels.js.map +1 -1
  445. package/dist/notifications/push-device-setting.js +1 -1
  446. package/dist/notifications/push-device-setting.js.map +1 -1
  447. package/dist/notifications/push-devices-setting.d.ts +2 -1
  448. package/dist/notifications/push-devices-setting.js +27 -49
  449. package/dist/notifications/push-devices-setting.js.map +1 -1
  450. package/dist/notifications/quiet-hours-setting.d.ts +10 -3
  451. package/dist/notifications/quiet-hours-setting.js +65 -26
  452. package/dist/notifications/quiet-hours-setting.js.map +1 -1
  453. package/dist/notifications/unsubscribe-panel.js +4 -7
  454. package/dist/notifications/unsubscribe-panel.js.map +1 -1
  455. package/dist/notifications/use-push-device.d.ts +39 -1
  456. package/dist/notifications/use-push-device.js +28 -7
  457. package/dist/notifications/use-push-device.js.map +1 -1
  458. package/dist/offline/query-persistence.d.ts +3 -1
  459. package/dist/offline/query-persistence.js +19 -2
  460. package/dist/offline/query-persistence.js.map +1 -1
  461. package/dist/rhf/fields.d.ts +11 -4
  462. package/dist/rhf/fields.js.map +1 -1
  463. package/dist/search/command-palette.js +1 -1
  464. package/dist/search/command-palette.js.map +1 -1
  465. package/dist/search/global-search.js +19 -9
  466. package/dist/search/global-search.js.map +1 -1
  467. package/dist/search/use-command-key.d.ts +12 -1
  468. package/dist/search/use-command-key.js +3 -12
  469. package/dist/search/use-command-key.js.map +1 -1
  470. package/dist/search.d.ts +7 -0
  471. package/dist/search.js +10 -0
  472. package/dist/search.js.map +1 -1
  473. package/dist/settings/use-settings-focus.js +1 -0
  474. package/dist/settings/use-settings-focus.js.map +1 -1
  475. package/dist/shell/account-menu-language.d.ts +21 -5
  476. package/dist/shell/account-menu-language.js +3 -1
  477. package/dist/shell/account-menu-language.js.map +1 -1
  478. package/dist/shell/account-menu-text-size.d.ts +26 -9
  479. package/dist/shell/account-menu-text-size.js +3 -2
  480. package/dist/shell/account-menu-text-size.js.map +1 -1
  481. package/dist/shell/dev-menu.js +5 -18
  482. package/dist/shell/dev-menu.js.map +1 -1
  483. package/dist/shell/role-switcher.d.ts +7 -0
  484. package/dist/shell/role-switcher.js.map +1 -1
  485. package/dist/shell/top-bar-actions.d.ts +1 -1
  486. package/dist/shell/top-bar-actions.js.map +1 -1
  487. package/dist/shell/top-bar-parts-labels.d.ts +0 -2
  488. package/dist/shell/top-bar-parts-labels.js +0 -1
  489. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  490. package/dist/shell.d.ts +27 -8
  491. package/dist/shell.js +28 -7
  492. package/dist/shell.js.map +1 -1
  493. package/dist/sync/engine.d.ts +30 -4
  494. package/dist/sync/engine.js +172 -52
  495. package/dist/sync/engine.js.map +1 -1
  496. package/dist/sync.d.ts +6 -2
  497. package/dist/sync.js +6 -1
  498. package/dist/sync.js.map +1 -1
  499. package/dist/testing/css-variables.js +3 -8
  500. package/dist/testing/css-variables.js.map +1 -1
  501. package/dist/theme/contrast.d.ts +2 -1
  502. package/dist/theme/contrast.js +3 -8
  503. package/dist/theme/contrast.js.map +1 -1
  504. package/dist/theme/palette-store.js +6 -6
  505. package/dist/theme/palette-store.js.map +1 -1
  506. package/dist/theme/text-size.js +3 -8
  507. package/dist/theme/text-size.js.map +1 -1
  508. package/dist/theme/theme-store.js +3 -6
  509. package/dist/theme/theme-store.js.map +1 -1
  510. package/dist/tour/tour-catalogue.d.ts +7 -4
  511. package/dist/tour/tour-catalogue.js +12 -10
  512. package/dist/tour/tour-catalogue.js.map +1 -1
  513. package/dist/tour/tour-dock.d.ts +0 -2
  514. package/dist/tour/tour-dock.js +0 -2
  515. package/dist/tour/tour-dock.js.map +1 -1
  516. package/dist/tour/tour-gates.d.ts +4 -0
  517. package/dist/tour/tour-gates.js +14 -0
  518. package/dist/tour/tour-gates.js.map +1 -1
  519. package/dist/tour/tour-overlay.d.ts +27 -0
  520. package/dist/tour/tour-overlay.js +741 -0
  521. package/dist/tour/tour-overlay.js.map +1 -0
  522. package/dist/tour/tour.d.ts +13 -3
  523. package/dist/tour/tour.js +59 -781
  524. package/dist/tour/tour.js.map +1 -1
  525. package/dist/tour/use-tour-progress.js +1 -1
  526. package/dist/tour/use-tour-progress.js.map +1 -1
  527. package/dist/wizard/stepper-nav.d.ts +5 -1
  528. package/dist/wizard/stepper-nav.js.map +1 -1
  529. package/dist/wizard/types.d.ts +6 -2
  530. package/dist/wizard/types.js.map +1 -1
  531. package/dist/wizard/use-wizard.d.ts +3 -1
  532. package/dist/wizard/use-wizard.js.map +1 -1
  533. package/dist/wizard/validation.d.ts +3 -1
  534. package/dist/wizard/validation.js.map +1 -1
  535. package/package.json +10 -6
  536. package/src/account/account-parts.ts +5 -25
  537. package/src/account/data-export-setting-labels.ts +1 -1
  538. package/src/account/delete-account-setting-labels.ts +1 -1
  539. package/src/account/email-change-setting-labels.ts +1 -1
  540. package/src/account/passkeys-setting.tsx +60 -38
  541. package/src/account/sessions-setting.tsx +18 -12
  542. package/src/admin/admin-action-confirm.tsx +1 -5
  543. package/src/admin/admin-parts.ts +11 -25
  544. package/src/admin/mail-test-card-labels.ts +1 -1
  545. package/src/admin/plan-change-labels.ts +5 -23
  546. package/src/admin/plan-change.tsx +7 -44
  547. package/src/admin/reviewer-scope-editor.tsx +3 -3
  548. package/src/auth/auth-errors-labels.ts +23 -0
  549. package/src/auth/auth-errors.ts +11 -38
  550. package/src/auth/complete-name-dialog.tsx +4 -1
  551. package/src/auth/forgot-password-form-labels.ts +1 -1
  552. package/src/auth/forgot-password-form.tsx +11 -6
  553. package/src/auth/register-form-labels.ts +1 -1
  554. package/src/auth/reset-password-form-labels.ts +1 -1
  555. package/src/auth/reset-password-form.tsx +8 -4
  556. package/src/auth/sign-in-form-labels.ts +1 -1
  557. package/src/auth/status-parts.tsx +0 -6
  558. package/src/auth/verify-email-labels.ts +1 -1
  559. package/src/auth/verify-email.tsx +11 -6
  560. package/src/billing/cancel-subscription.tsx +26 -12
  561. package/src/billing/dialog-close.ts +34 -0
  562. package/src/billing/plan-card.tsx +36 -11
  563. package/src/billing/plan-change-labels.ts +66 -0
  564. package/src/billing/plan-switch.tsx +26 -12
  565. package/src/chart.ts +21 -3
  566. package/src/components/account-chips.tsx +20 -23
  567. package/src/components/alert-banner.tsx +82 -5
  568. package/src/components/amount-input.tsx +18 -7
  569. package/src/components/autocomplete.tsx +64 -70
  570. package/src/components/bulk-action-bar.tsx +70 -2
  571. package/src/components/button-look.ts +5 -5
  572. package/src/components/button.tsx +2 -2
  573. package/src/components/chart-edge.ts +34 -1
  574. package/src/components/chart-figure.tsx +35 -0
  575. package/src/components/chart-zoom-core.tsx +6 -5
  576. package/src/components/chart.tsx +26 -5
  577. package/src/components/combobox-core.tsx +293 -62
  578. package/src/components/combobox.tsx +183 -153
  579. package/src/components/copy-button.tsx +34 -23
  580. package/src/components/country-select.tsx +16 -11
  581. package/src/components/data-table-column-settings.tsx +52 -10
  582. package/src/components/data-table-filters.ts +6 -4
  583. package/src/components/data-table-fit.ts +19 -5
  584. package/src/components/data-table-groups.tsx +1 -1
  585. package/src/components/data-table-head.tsx +32 -22
  586. package/src/components/data-table-mobile.tsx +61 -26
  587. package/src/components/data-table-pagination.tsx +21 -6
  588. package/src/components/data-table-resize.ts +1 -1
  589. package/src/components/data-table-row-actions.tsx +3 -3
  590. package/src/components/data-table-row.tsx +25 -14
  591. package/src/components/data-table-selection.ts +1 -1
  592. package/src/components/data-table-shared.tsx +33 -1
  593. package/src/components/data-table-sort.ts +57 -2
  594. package/src/components/data-table-virtual.ts +32 -8
  595. package/src/components/data-table.tsx +239 -68
  596. package/src/components/date-field.tsx +65 -8
  597. package/src/components/date-picker.tsx +125 -48
  598. package/src/components/date-range-picker.tsx +82 -31
  599. package/src/components/error-boundary.tsx +53 -39
  600. package/src/components/field-base-labels.ts +20 -0
  601. package/src/components/field-base.tsx +13 -7
  602. package/src/components/field-sync-labels.ts +1 -0
  603. package/src/components/field-sync.tsx +23 -1
  604. package/src/components/form-actions.tsx +20 -5
  605. package/src/components/hover-menu.tsx +18 -8
  606. package/src/components/icon-button.tsx +14 -9
  607. package/src/components/inline-confirm.tsx +116 -0
  608. package/src/components/inline-entity-combobox.tsx +197 -153
  609. package/src/components/input.tsx +1 -1
  610. package/src/components/jump-calendar.tsx +30 -146
  611. package/src/components/legal-page.tsx +10 -7
  612. package/src/components/legal.tsx +4 -2
  613. package/src/components/lightbox.tsx +21 -8
  614. package/src/components/list.tsx +10 -4
  615. package/src/components/measured-grid.tsx +8 -4
  616. package/src/components/mini-calendar.tsx +6 -5
  617. package/src/components/modal.tsx +6 -1
  618. package/src/components/month-grid.tsx +229 -0
  619. package/src/components/month-picker.tsx +192 -200
  620. package/src/components/multi-select.tsx +21 -9
  621. package/src/components/picker-sheet.tsx +12 -9
  622. package/src/components/pie-chart-labels.ts +8 -0
  623. package/src/components/pie-chart.tsx +22 -28
  624. package/src/components/popover.tsx +18 -1
  625. package/src/components/row-actions.tsx +2 -1
  626. package/src/components/section-nav.tsx +7 -0
  627. package/src/components/series-chart-axes.ts +3 -3
  628. package/src/components/series-chart-labels.ts +7 -4
  629. package/src/components/series-chart.tsx +178 -69
  630. package/src/components/share-card.tsx +6 -6
  631. package/src/components/sign-chip-labels.ts +1 -0
  632. package/src/components/sign-chip.tsx +10 -1
  633. package/src/components/tabs-labels.ts +13 -0
  634. package/src/components/tabs.tsx +2 -2
  635. package/src/components/toggle-legend.tsx +16 -11
  636. package/src/components/translation-review-editor.tsx +6 -5
  637. package/src/components/translation-review.tsx +4 -3
  638. package/src/components/treemap-labels.ts +39 -0
  639. package/src/components/treemap-layout.ts +210 -0
  640. package/src/components/treemap.tsx +722 -133
  641. package/src/components/use-table-state.ts +12 -9
  642. package/src/data-table.ts +9 -2
  643. package/src/eslint/role-utilities.ts +97 -19
  644. package/src/feedback/feedback-dialog.tsx +30 -19
  645. package/src/feedback/feedback-mutation.ts +41 -0
  646. package/src/feedback/feedback-page-link.ts +90 -0
  647. package/src/feedback/feedback-public-list.tsx +17 -5
  648. package/src/feedback/feedback-replies.tsx +13 -6
  649. package/src/feedback/feedback-row-detail-labels.ts +5 -0
  650. package/src/feedback/feedback-row-detail.tsx +103 -67
  651. package/src/feedback/feedback-status-undo.ts +41 -27
  652. package/src/feedback/feedback-submit-dialog.tsx +2 -2
  653. package/src/feedback/feedback-submit.tsx +21 -7
  654. package/src/feedback/feedback-swipe.tsx +1 -1
  655. package/src/feedback/feedback-table.tsx +86 -38
  656. package/src/feedback/feedback-thread-labels.ts +2 -2
  657. package/src/feedback/feedback-thread.tsx +27 -25
  658. package/src/feedback.ts +42 -0
  659. package/src/hooks/use-focus-trap.ts +8 -24
  660. package/src/hooks/use-hotkey.ts +24 -7
  661. package/src/hooks/use-long-press.ts +16 -2
  662. package/src/hooks/use-media-query.ts +20 -4
  663. package/src/hooks/use-mounted.ts +39 -0
  664. package/src/hooks/use-overlay-history.ts +32 -3
  665. package/src/i18n/defaults.ts +4 -5
  666. package/src/i18n/german.ts +8 -2
  667. package/src/i18n/kit-labels.tsx +9 -2
  668. package/src/i18n/locales/es.ts +8 -2
  669. package/src/i18n/locales/fr.ts +21 -13
  670. package/src/i18n/locales/hu.ts +10 -2
  671. package/src/i18n/locales/it.ts +8 -2
  672. package/src/i18n/locales/zh.ts +9 -2
  673. package/src/i18n/review.ts +5 -0
  674. package/src/index.ts +103 -13
  675. package/src/landing/routing.tsx +14 -10
  676. package/src/lib/broadcast.ts +52 -0
  677. package/src/lib/date-format.ts +89 -13
  678. package/src/lib/day-format.ts +96 -0
  679. package/src/lib/describe-failure.ts +18 -0
  680. package/src/lib/direction.ts +39 -0
  681. package/src/lib/focus-left.ts +156 -0
  682. package/src/lib/format.ts +5 -17
  683. package/src/lib/http-status.ts +38 -0
  684. package/src/lib/intl-cache.ts +25 -0
  685. package/src/lib/isin.ts +10 -0
  686. package/src/lib/iso-day.ts +13 -0
  687. package/src/lib/lazy-with-fallback.ts +82 -0
  688. package/src/lib/path-pattern.ts +55 -0
  689. package/src/lib/reduced-motion.ts +2 -1
  690. package/src/lib/round.ts +7 -2
  691. package/src/lib/safe-storage.ts +48 -6
  692. package/src/lib/session-refresh.ts +1 -1
  693. package/src/lib/share-format.ts +18 -0
  694. package/src/lib/text-case.ts +19 -0
  695. package/src/lib/text-match.ts +57 -2
  696. package/src/lib/thenable.ts +19 -0
  697. package/src/lib/translation-review.ts +13 -5
  698. package/src/notifications/device-zone-report.ts +1 -1
  699. package/src/notifications/notification-bell.tsx +7 -4
  700. package/src/notifications/notification-inbox.tsx +40 -58
  701. package/src/notifications/notification-parts.tsx +3 -4
  702. package/src/notifications/notification-types-setting.tsx +1 -1
  703. package/src/notifications/notifications-labels.ts +7 -0
  704. package/src/notifications/push-device-setting.tsx +1 -1
  705. package/src/notifications/push-devices-setting.tsx +30 -55
  706. package/src/notifications/quiet-hours-setting.tsx +93 -31
  707. package/src/notifications/unsubscribe-panel.tsx +4 -7
  708. package/src/notifications/use-push-device.ts +76 -10
  709. package/src/offline/query-persistence.ts +35 -3
  710. package/src/rhf/fields.tsx +11 -4
  711. package/src/search/command-palette.tsx +2 -4
  712. package/src/search/global-search.tsx +36 -15
  713. package/src/search/use-command-key.ts +13 -12
  714. package/src/search.ts +9 -0
  715. package/src/settings/use-settings-focus.ts +3 -0
  716. package/src/shell/account-menu-language.tsx +27 -5
  717. package/src/shell/account-menu-text-size.tsx +32 -10
  718. package/src/shell/dev-menu.tsx +7 -21
  719. package/src/shell/role-switcher.tsx +7 -0
  720. package/src/shell/top-bar-actions.tsx +1 -1
  721. package/src/shell/top-bar-parts-labels.ts +0 -3
  722. package/src/shell.ts +40 -9
  723. package/src/sync/engine.ts +339 -61
  724. package/src/sync.ts +8 -1
  725. package/src/testing/css-variables.ts +8 -9
  726. package/src/theme/contrast.ts +8 -9
  727. package/src/theme/palette-store.ts +9 -9
  728. package/src/theme/text-size.ts +6 -8
  729. package/src/theme/theme-store.ts +7 -9
  730. package/src/tour/tour-catalogue.tsx +26 -15
  731. package/src/tour/tour-dock.ts +0 -2
  732. package/src/tour/tour-gates.ts +23 -0
  733. package/src/tour/tour-overlay.tsx +1170 -0
  734. package/src/tour/tour.tsx +108 -1202
  735. package/src/tour/use-tour-progress.ts +1 -1
  736. package/src/wizard/stepper-nav.tsx +3 -1
  737. package/src/wizard/types.ts +11 -2
  738. package/src/wizard/use-wizard.ts +2 -1
  739. package/src/wizard/validation.ts +8 -2
  740. package/tokens.css +2 -1
  741. package/dist/components/ui-labels.js.map +0 -1
  742. package/dist/shell/dev-switchers.d.ts +0 -6
  743. package/dist/shell/dev-switchers.js +0 -12
  744. package/dist/shell/dev-switchers.js.map +0 -1
  745. package/src/components/ui-labels.ts +0 -24
  746. package/src/shell/dev-switchers.tsx +0 -18
@@ -0,0 +1,126 @@
1
+ "use client";
2
+ const PHI = (1 + Math.sqrt(5)) / 2;
3
+ const BAND = 20;
4
+ const FRAME_MARGIN = 3;
5
+ const BODY_SHARE = 1 / PHI;
6
+ function groupBody(box, scale) {
7
+ const band = BAND * scale;
8
+ const margin = Math.min(FRAME_MARGIN, Math.floor(box.width / 4), Math.floor(box.height / 4));
9
+ const banded = box.width >= 44 * scale && box.height - band - margin >= box.height * BODY_SHARE;
10
+ const top = banded ? band : margin;
11
+ return {
12
+ banded,
13
+ body: {
14
+ x: box.x + margin,
15
+ y: box.y + top,
16
+ width: Math.max(0, box.width - 2 * margin),
17
+ height: Math.max(0, box.height - top - margin)
18
+ }
19
+ };
20
+ }
21
+ function worst(area, min, max, side, ratio) {
22
+ const along = side * side;
23
+ const across = area * area;
24
+ if (across === 0 || min === 0) return Infinity;
25
+ return Math.max(along * max * ratio / across, across / (along * min * ratio));
26
+ }
27
+ function squarify(weights, rect, ratio = PHI) {
28
+ const out = weights.map(() => ({ x: rect.x, y: rect.y, width: 0, height: 0 }));
29
+ const sum = weights.reduce((acc, w) => acc + Math.max(0, w), 0);
30
+ if (!(sum > 0) || rect.width <= 0 || rect.height <= 0) return out;
31
+ const areas = weights.map((w) => Math.max(0, w) * rect.width * rect.height / sum);
32
+ let { x, y, width, height } = rect;
33
+ let i = 0;
34
+ while (i < areas.length) {
35
+ const side = Math.min(width, height);
36
+ let rowArea = 0;
37
+ let min = Infinity;
38
+ let max = 0;
39
+ let best = Infinity;
40
+ let j = i;
41
+ while (j < areas.length) {
42
+ const a = areas[j];
43
+ const score = worst(rowArea + a, Math.min(min, a), Math.max(max, a), side, ratio);
44
+ if (j > i && score > best) break;
45
+ rowArea += a;
46
+ min = Math.min(min, a);
47
+ max = Math.max(max, a);
48
+ best = score;
49
+ j += 1;
50
+ }
51
+ const last = j === areas.length;
52
+ if (side === width) {
53
+ const thick = last ? height : rowArea / width;
54
+ let at = x;
55
+ for (let k = i; k < j; k++) {
56
+ const len = k === j - 1 ? x + width - at : areas[k] / rowArea * width;
57
+ out[k] = { x: at, y, width: len, height: thick };
58
+ at += len;
59
+ }
60
+ y += thick;
61
+ height -= thick;
62
+ } else {
63
+ const thick = last ? width : rowArea / height;
64
+ let at = y;
65
+ for (let k = i; k < j; k++) {
66
+ const len = k === j - 1 ? y + height - at : areas[k] / rowArea * height;
67
+ out[k] = { x, y: at, width: thick, height: len };
68
+ at += len;
69
+ }
70
+ x += thick;
71
+ width -= thick;
72
+ }
73
+ i = j;
74
+ }
75
+ return out;
76
+ }
77
+ function snap(b) {
78
+ const x = Math.round(b.x);
79
+ const y = Math.round(b.y);
80
+ return { x, y, width: Math.round(b.x + b.width) - x, height: Math.round(b.y + b.height) - y };
81
+ }
82
+ const ROUNDS = 8;
83
+ function layoutTreemap(nodes, width, height, scale) {
84
+ const total = nodes.reduce((acc, n) => acc + n.size, 0);
85
+ const frames = /* @__PURE__ */ new Map();
86
+ let placed = /* @__PURE__ */ new Map();
87
+ for (let round = 0; round < ROUNDS; round++) {
88
+ const framed = [...frames.values()].reduce((acc, a) => acc + a, 0);
89
+ const spare = width * height - framed;
90
+ const density = total > 0 ? (spare > 0 ? spare : width * height) / total : 0;
91
+ const need = (n) => n.children ? (frames.get(n.path) ?? 0) + n.children.reduce((acc, c) => acc + need(c), 0) : n.size * density;
92
+ let moved = 0;
93
+ placed = /* @__PURE__ */ new Map();
94
+ const place = (list, rect) => {
95
+ const boxes = squarify(
96
+ list.map((n) => need(n)),
97
+ rect
98
+ );
99
+ list.forEach((n, i) => {
100
+ const box = snap(boxes[i]);
101
+ if (!n.children) {
102
+ placed.set(n.path, { box });
103
+ return;
104
+ }
105
+ const { banded, body } = groupBody(box, scale);
106
+ placed.set(n.path, { box, body, banded });
107
+ const frame = box.width * box.height - body.width * body.height;
108
+ moved = Math.max(moved, Math.abs(frame - (frames.get(n.path) ?? 0)));
109
+ frames.set(n.path, frame);
110
+ place(n.children, body);
111
+ });
112
+ };
113
+ place(nodes, { x: 0, y: 0, width, height });
114
+ if (moved < 1) break;
115
+ }
116
+ return placed;
117
+ }
118
+ export {
119
+ BAND,
120
+ BODY_SHARE,
121
+ FRAME_MARGIN,
122
+ groupBody,
123
+ layoutTreemap,
124
+ squarify
125
+ };
126
+ //# sourceMappingURL=treemap-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/components/treemap-layout.ts"],"sourcesContent":["// Where `Treemap` draws each node — a pure function of the nodes, the chart's size and the\n// text size, with no recharts in it (0.52 code review of treemap.tsx, findings 1 and 8).\n//\n// recharts lays nested data out itself, edge to edge, and 0.52 first made the groups' room\n// afterwards: a group's cell took its band and margin out of its rectangle and each child's\n// cell SQUEEZED the rectangle recharts gave it into what was left. Two faults followed.\n// A fixed 23px is a different share of every group, so a €100 tile in a 61px group was\n// drawn at two thirds of a €100 tile in a 300px one — in a chart whose one promise is that\n// area is share. And the squeeze ran through a cache the group's cell wrote during render\n// for its children's cells to read, which held only because recharts renders a group\n// before its children.\n//\n// So the layout is made here, up front: squarified as recharts does it, with each group\n// asking for its tiles' area PLUS its frame's, and its tiles laid out in its body. A\n// frame's area depends on the rectangle it gets, so the layout is run again with each\n// group's frame as measured until no frame moves by a pixel — two or three rounds.\n\nexport interface Box {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** What the layout needs of a node: its key, its value, and a group's nodes. */\nexport interface LayoutNode {\n path: string;\n size: number;\n children?: readonly LayoutNode[];\n}\n\n/** A node as drawn: its rectangle, and for a group the body its nodes fill and whether\n * its band is drawn. Whole pixels, on shared edges, so neighbours meet without a seam. */\nexport interface Placed {\n box: Box;\n body?: Box;\n banded?: boolean;\n}\n\nconst PHI = (1 + Math.sqrt(5)) / 2;\n\n/**\n * A group's band, in px at Normal, × the text size's scale: the 20px floor a tile keeps\n * for its own name, so the group's name sits in it as a tile's does in a tile.\n */\nexport const BAND = 20;\n/**\n * The frame's margin round its body, in px. Each tile keeps its 2px gutter, half of it\n * inside the tile, so 3 leaves one pixel of the frame's own colour between the group's\n * gutter and its tiles' — the frame reads as one outline round the group, not as a gutter\n * that happens to be wider.\n */\nexport const FRAME_MARGIN = 3;\n/**\n * The least of a group's height its body keeps under the band: 1/φ. At Normal that is a\n * group of 61px (20 band + 3 margin = 0.382 of it), whose body of 38px still holds a\n * tile's name and its second line (the note's 36px floor) — so a single row of tiles under\n * the band keeps both. A smaller group draws no band, and its name is in its tiles'\n * accessible names and its tooltip rather than over their area. Since the frame's area is\n * given to the group (above), this bounds the frame's share of the picture, not the tiles'.\n */\nexport const BODY_SHARE = 1 / PHI;\n\n/** A group drawn at `box`: whether it has the room for its band (see {@link BODY_SHARE};\n * and 44px across, the floor of a word), and the body its nodes are drawn into. */\nexport function groupBody(box: Box, scale: number): { banded: boolean; body: Box } {\n const band = BAND * scale;\n const margin = Math.min(FRAME_MARGIN, Math.floor(box.width / 4), Math.floor(box.height / 4));\n const banded = box.width >= 44 * scale && box.height - band - margin >= box.height * BODY_SHARE;\n const top = banded ? band : margin;\n return {\n banded,\n body: {\n x: box.x + margin,\n y: box.y + top,\n width: Math.max(0, box.width - 2 * margin),\n height: Math.max(0, box.height - top - margin),\n },\n };\n}\n\n/** The worst aspect ratio in a row of `area` along `side`, against the target `ratio`. */\nfunction worst(area: number, min: number, max: number, side: number, ratio: number): number {\n const along = side * side;\n const across = area * area;\n if (across === 0 || min === 0) return Infinity;\n return Math.max((along * max * ratio) / across, across / (along * min * ratio));\n}\n\n/**\n * Bruls, Huizing and van Wijk's squarified layout, as recharts runs it: `weights` share\n * out `rect` in order, a row at a time along its shorter side, and a row closes when the\n * next node would make its worst tile further from φ:1 (recharts' default ratio). Returns\n * one rectangle per weight, in order, in fractional pixels.\n */\nexport function squarify(weights: readonly number[], rect: Box, ratio = PHI): Box[] {\n const out: Box[] = weights.map(() => ({ x: rect.x, y: rect.y, width: 0, height: 0 }));\n const sum = weights.reduce((acc, w) => acc + Math.max(0, w), 0);\n if (!(sum > 0) || rect.width <= 0 || rect.height <= 0) return out;\n const areas = weights.map((w) => (Math.max(0, w) * rect.width * rect.height) / sum);\n let { x, y, width, height } = rect;\n let i = 0;\n while (i < areas.length) {\n const side = Math.min(width, height);\n let rowArea = 0;\n let min = Infinity;\n let max = 0;\n let best = Infinity;\n let j = i;\n while (j < areas.length) {\n const a = areas[j]!;\n const score = worst(rowArea + a, Math.min(min, a), Math.max(max, a), side, ratio);\n if (j > i && score > best) break;\n rowArea += a;\n min = Math.min(min, a);\n max = Math.max(max, a);\n best = score;\n j += 1;\n }\n // The last row takes what is left, so rounding never leaves a sliver unpainted.\n const last = j === areas.length;\n if (side === width) {\n // A row along the top, as wide as the space.\n const thick = last ? height : rowArea / width;\n let at = x;\n for (let k = i; k < j; k++) {\n const len = k === j - 1 ? x + width - at : (areas[k]! / rowArea) * width;\n out[k] = { x: at, y, width: len, height: thick };\n at += len;\n }\n y += thick;\n height -= thick;\n } else {\n // A column at the left, as tall as the space.\n const thick = last ? width : rowArea / height;\n let at = y;\n for (let k = i; k < j; k++) {\n const len = k === j - 1 ? y + height - at : (areas[k]! / rowArea) * height;\n out[k] = { x, y: at, width: thick, height: len };\n at += len;\n }\n x += thick;\n width -= thick;\n }\n i = j;\n }\n return out;\n}\n\n/** Whole pixels on the EDGES: neighbours share an edge, so they round it alike. */\nfunction snap(b: Box): Box {\n const x = Math.round(b.x);\n const y = Math.round(b.y);\n return { x, y, width: Math.round(b.x + b.width) - x, height: Math.round(b.y + b.height) - y };\n}\n\n/** The rounds the frames get to settle; three is usual, more only when a band switches. */\nconst ROUNDS = 8;\n\n/**\n * Every node of `nodes` placed in a `width` × `height` chart, by path.\n *\n * Each tile's area is its value's share of what is left for tiles once the frames have\n * theirs — the same density in every group and at the top. A group asks for its tiles'\n * area and its own frame's (band and margin, as {@link groupBody} measures them on the\n * rectangle it got last round), so its body holds exactly its tiles.\n */\nexport function layoutTreemap(\n nodes: readonly LayoutNode[],\n width: number,\n height: number,\n scale: number,\n): Map<string, Placed> {\n const total = nodes.reduce((acc, n) => acc + n.size, 0);\n const frames = new Map<string, number>();\n let placed = new Map<string, Placed>();\n for (let round = 0; round < ROUNDS; round++) {\n const framed = [...frames.values()].reduce((acc, a) => acc + a, 0);\n const spare = width * height - framed;\n // Frames that would take the whole chart (a tiny chart of many groups) leave nothing\n // to share; the tiles then take the density they would have without frames.\n const density = total > 0 ? (spare > 0 ? spare : width * height) / total : 0;\n const need = (n: LayoutNode): number =>\n n.children ? (frames.get(n.path) ?? 0) + n.children.reduce((acc, c) => acc + need(c), 0) : n.size * density;\n let moved = 0;\n placed = new Map();\n const place = (list: readonly LayoutNode[], rect: Box) => {\n const boxes = squarify(\n list.map((n) => need(n)),\n rect,\n );\n list.forEach((n, i) => {\n const box = snap(boxes[i]!);\n if (!n.children) {\n placed.set(n.path, { box });\n return;\n }\n const { banded, body } = groupBody(box, scale);\n placed.set(n.path, { box, body, banded });\n const frame = box.width * box.height - body.width * body.height;\n moved = Math.max(moved, Math.abs(frame - (frames.get(n.path) ?? 0)));\n frames.set(n.path, frame);\n place(n.children, body);\n });\n };\n place(nodes, { x: 0, y: 0, width, height });\n if (moved < 1) break;\n }\n return placed;\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,9 @@
1
1
  import type { ComponentPropsWithoutRef, ReactNode } from "react";
2
+ import { type ChartEdges } from "./chart-edge.js";
2
3
  import { type Direction } from "../lib/direction.js";
3
4
  import { type ChartHeight } from "./chart-height.js";
5
+ import { type LabelOverride } from "../i18n/kit-labels.js";
6
+ import { type TreemapLabels } from "./treemap-labels.js";
4
7
  /**
5
8
  * One tile.
6
9
  *
@@ -11,13 +14,19 @@ import { type ChartHeight } from "./chart-height.js";
11
14
  */
12
15
  export interface TreemapNode {
13
16
  /** Stable key, handed back by {@link TreemapProps.onNodeClick} and
14
- * {@link TreemapProps.nodeNote}. Names can collide; ids must not. */
17
+ * {@link TreemapProps.nodeNote}. Names can collide; ids must not among a group's own
18
+ * nodes (or the top's). A group and a tile inside it may share one — chain 12 and shop
19
+ * 12 from two tables — and `onNodeClick`'s `groups` tells them apart (0.52). */
15
20
  id: string;
16
21
  name: string;
17
22
  /** The tile's area. A node whose value is not a positive finite number is NOT
18
23
  * drawn — an area cannot be negative, and recharts lays a negative size out as
19
24
  * nonsense rather than refusing it. Saying so is the caller's job: a group that
20
- * vanishes silently between two views of the same data is a bug report. */
25
+ * vanishes silently between two views of the same data is a bug report.
26
+ *
27
+ * A GROUP's own `value` is not read: its area is its drawn children's together. Pass
28
+ * that sum — the field stays required so that every reader of a `TreemapNode[]` keeps
29
+ * a `number`. */
21
30
  value: number;
22
31
  /** Overrides the by-index palette colour for this tile — e.g. to paint every child
23
32
  * in its parent group's colour, so the groups stay legible in one picture. A
@@ -25,42 +34,122 @@ export interface TreemapNode {
25
34
  * does `CHART_ROLES.other` (`var(--chart-muted)`), the colour for a "rest" bucket,
26
35
  * which should not wrap round to a hue the reader matches to a real node;
27
36
  * anything else (another var, a `color-mix()`) gets `currentColor` ink, because
28
- * there is nothing to measure — set `labelColor` then. */
37
+ * there is nothing to measure — set `labelColor` then.
38
+ *
39
+ * On a group, the colour of every tile inside it that sets none (0.52): keksdose's
40
+ * "hue = chain" is a `fill` per chain. A group left without one takes the ramp by its
41
+ * index, as a tile does, and hands that down; its frame is drawn in the page's own
42
+ * colours whatever it is. */
29
43
  fill?: string;
30
44
  /** The label's ink, for a `fill` the kit cannot measure (a `var()` or `color-mix()`):
31
45
  * keksdose's recency plot fills with `color-mix(in srgb, var(--chart-1) N%,
32
46
  * transparent)`, where `currentColor` put dark page text on full-strength indigo
33
- * (~1.5:1). Wins over the measured ink when given. */
47
+ * (~1.5:1). Wins over the measured ink when given. A tile that takes its group's
48
+ * `fill` takes the group's `labelColor` with it; one with a `fill` of its own, or one
49
+ * that `shade` turns into another colour, is measured again. */
34
50
  labelColor?: string;
51
+ /**
52
+ * The tile's colour strength, 0–1 (0.52): its `fill` mixed into the card's colour
53
+ * (`--bg-surface`) as a concrete hex, `1` the full hue. For a second, ordered quantity
54
+ * on top of the hue — keksdose's recency steps (1, 0.78, 0.55) over the chain's hue —
55
+ * without a `color-mix()`: the result is measured like any hex, so the label ink stays
56
+ * automatic and no `labelColor` is needed. keksdose found a tile under ~0.55 stops
57
+ * reading as its hue and passes for the muted "other" (#642).
58
+ *
59
+ * Only a fill the kit can measure is shaded (a hex, a bare `var(--chart-N)` or another
60
+ * bare token), and only on a page that declares `--bg-surface` as a hex; anything else
61
+ * keeps its full hue. On a group, the default for its tiles, as `fill` is.
62
+ */
63
+ shade?: number;
64
+ /**
65
+ * Makes this node a GROUP (0.52, keksdose dev #642: "Is there already a distinction
66
+ * between shop and chain?"): a labelled frame, its name in a band along the top, its
67
+ * tiles laid out inside it by the map's own layout, each at its share of the whole
68
+ * picture (see "Groups: a frame round their tiles"). Groups nest. A group with nothing
69
+ * drawable inside is not drawn; an empty array is a tile.
70
+ *
71
+ * The frame is in the page's colours (the well, `--bg-surface-2`, under
72
+ * `--text-primary`, at least 7.4:1 in every preset and contrast), and under More
73
+ * contrast it is outlined in `--chart-ink` as a pale tile is. Its band is drawn only
74
+ * where the group has the room for it — see `TreemapCell`.
75
+ */
76
+ children?: readonly TreemapNode[];
35
77
  }
36
78
  /**
37
79
  * Everything a `<div>` takes reaches the chart's root (`ChartContainer`), so a test id
38
80
  * or a `data-tour` anchor can find it. `children` is the chart's own.
81
+ *
82
+ * The root is a `role="figure"` (0.52, refactor audit 2026-10-30, DSP-5): name it with
83
+ * `aria-label` ("Spending by category"), and say what it shows with {@link
84
+ * TreemapProps.description}.
39
85
  */
40
86
  export interface TreemapProps extends Omit<ComponentPropsWithoutRef<"div">, "children"> {
41
- data: TreemapNode[];
87
+ data: readonly TreemapNode[];
42
88
  /**
43
89
  * Formats a node's value in the tooltip. Handed the node's SHARE of what is drawn
44
90
  * (0–1) as a second argument, because a tile is read for how big it is relative to
45
91
  * the rest, and "€412.30" alone makes the reader estimate that ratio off the areas.
46
92
  * The share is `undefined` when the drawn total is not positive.
47
93
  *
48
- * Default: the bare number through `Intl.NumberFormat` in the runtime's locale. A
49
- * host that has a currency or a locale passes this — the kit knows neither.
94
+ * A tile's and a group's accessible name (`labels.tile`, `labels.group`, 0.52) says the
95
+ * value too, asked of the formatter as the tooltip asks it, share and all, and its text
96
+ * is used; markup is said as the bare number. The name says the share itself, so a
97
+ * formatter that writes it into its text has it said twice.
98
+ *
99
+ * Default: the bare number through `Intl.NumberFormat` in the provider's locale (0.52,
100
+ * DOC-10: before, the runtime's). A host with a currency passes this — the kit knows
101
+ * none.
50
102
  */
51
103
  valueFormatter?: (value: number, share: number | undefined) => ReactNode;
104
+ /**
105
+ * What the map SHOWS, in a sentence — "Rent is three fifths of the month." — the
106
+ * figure's accessible description (0.52, DSP-5). Not drawn; a caption the eye should
107
+ * read too belongs in the page.
108
+ */
109
+ description?: string;
110
+ /** Per-map strings over `<UiKitProvider labels={{ treemap }}>`. */
111
+ labels?: LabelOverride<TreemapLabels>;
52
112
  /** Chart height: a CSS length (`"20rem"`, `"min(20rem, 50dvh)"`), a Tailwind class,
53
113
  * or px. Default `"20rem"` — 320 px at Normal, growing with the text size like the
54
114
  * labels in the tiles (0.32, docs/text-size-harmonization.md §10.10). */
55
115
  height?: ChartHeight;
56
- /** A tile was activated — by click, or by Enter/Space on a focused tile. Setting
57
- * this makes every tile a focusable `role="button"` named by its node name. */
58
- onNodeClick?: (id: string, name: string) => void;
116
+ /**
117
+ * A tile was activated — by click, or by Enter/Space on a focused tile. Setting this
118
+ * makes every tile a `role="button"`.
119
+ *
120
+ * Either way every tile is reachable (0.52, DSP-5): ONE tab stop for the map, the
121
+ * arrows (←/→ along the reading direction, ↓/↑), Home and End between tiles in the
122
+ * order given, each named "name: value (share)" (`labels.tile`) — a `role="img"` to read
123
+ * when nothing listens, as PieChart's slices. Before, a map nobody clicked was nothing
124
+ * to a screen reader, and a clickable tile said its name alone, one tab stop each.
125
+ *
126
+ * In a map with groups (`TreemapNode.children`, 0.52) the walk is the data's own order,
127
+ * depth first: a group's frame, then its tiles, then the next group. A frame is named
128
+ * by `labels.group` ("Interspar, group: €1,240 (40%)"), a tile inside one by
129
+ * `labels.inGroup` round its own name ("Rankweil: €412 (12%), in Interspar"). Only
130
+ * tiles reach this callback (a frame reaches `onGroupClick`); a tile inside a group is
131
+ * handed a third argument, the ids of its groups, outermost first. Optional in the type,
132
+ * so a forwarder calling this with two arguments still type-checks — and absent for a
133
+ * tile at the top, so a flat map calls it exactly as before.
134
+ */
135
+ onNodeClick?: (id: string, name: string, groups?: readonly string[]) => void;
136
+ /**
137
+ * A group's frame was activated — by click on its band or margin, or by Enter/Space on
138
+ * the focused frame (0.52). Setting this makes every frame a `role="button"`; without it
139
+ * a frame is a `role="img"`, still a stop of the map's keyboard so its total is heard.
140
+ * `groups` as for {@link TreemapProps.onNodeClick}: the groups round this one, passed
141
+ * only for a group inside another.
142
+ */
143
+ onGroupClick?: (id: string, name: string, groups?: readonly string[]) => void;
59
144
  /**
60
145
  * The node names are the user's own data (payees, not categories): the tile labels
61
146
  * and the whole tooltip bubble get `data-private`, the same attribute the kit's
62
147
  * `Tooltip redact` and `ChartTooltipContent`'s value cell carry, so the host's one
63
148
  * privacy rule reaches them. Off by default — a category name is a label of the app.
149
+ *
150
+ * Every tile is tagged as a whole too, clickable or not (0.52): its accessible name
151
+ * (`labels.tile`) says the name and the value, in an attribute a host's redaction
152
+ * reaches only through the tag.
64
153
  */
65
154
  redactNames?: boolean;
66
155
  /**
@@ -72,6 +161,8 @@ export interface TreemapProps extends Omit<ComponentPropsWithoutRef<"div">, "chi
72
161
  * node by name or by raw value, so a per-node note would be keyed on an amount (two
73
162
  * nodes of equal size would swap notes). And a tooltip is a pointer affordance: a
74
163
  * phone never hovers, so a figure that only exists on hover does not exist there.
164
+ *
165
+ * Asked for tiles only: a group's band holds its name and nothing else.
75
166
  */
76
167
  nodeNote?: (id: string) => string | undefined;
77
168
  /**
@@ -80,6 +171,9 @@ export interface TreemapProps extends Omit<ComponentPropsWithoutRef<"div">, "chi
80
171
  * and a map made of unlabelled rectangles answers nothing; around 24 is where the
81
172
  * smallest tile of a skewed series reaches that floor on a phone-width card. The
82
173
  * caller owns the "N more not shown" line, since it knows how many it passed.
174
+ *
175
+ * With groups, the tiles are counted across them in the order given, depth first; a
176
+ * group left with none is not drawn, and a group's frame is not a tile.
83
177
  */
84
178
  maxTiles?: number;
85
179
  /**
@@ -109,8 +203,9 @@ export interface TreemapProps extends Omit<ComponentPropsWithoutRef<"div">, "chi
109
203
  */
110
204
  edges?: TreemapEdges;
111
205
  }
112
- /** {@link TreemapProps.edges}. */
113
- export type TreemapEdges = "auto" | "uniform" | "contrast";
206
+ /** {@link TreemapProps.edges}. The switch itself is chart-edge's `useEdgesInForce`,
207
+ * which SeriesChart's bars and areas follow too since 0.52 (DSP-18). */
208
+ export type TreemapEdges = ChartEdges;
114
209
  /**
115
210
  * Fit a label to its tile: the text itself when it fits, an ellipsised head when it
116
211
  * does not, `null` when not even three characters would. Without this a long name ran
@@ -133,14 +228,28 @@ export interface TreemapCellProps {
133
228
  /** See {@link TreemapNode.labelColor}; recharts hands each node's fields to its cell. */
134
229
  labelColor?: string;
135
230
  id?: string;
136
- onNodeClick?: (id: string, name: string) => void;
231
+ /** Called with `groups` as its third argument when the cell has any; see
232
+ * {@link TreemapProps.onNodeClick}. */
233
+ onNodeClick?: (id: string, name: string, groups?: readonly string[]) => void;
234
+ /** A group's cell's click; see {@link TreemapProps.onGroupClick}. */
235
+ onGroupClick?: (id: string, name: string, groups?: readonly string[]) => void;
236
+ /** The ids of the groups round the node, outermost first. `Treemap` puts it on every
237
+ * node it hands recharts; a cell drawn in a caller's own map has it if the data does. */
238
+ groups?: readonly string[];
239
+ /** The node's place in the tree, which `Treemap` puts on every node it hands recharts:
240
+ * its key in the map's keyboard, where an id may repeat between a group and a tile. */
241
+ path?: string;
242
+ /** Filled in by recharts for a GROUP: the nodes laid out inside it. A cell with
243
+ * children draws a frame, not a tile (0.52). */
244
+ children?: readonly object[] | null;
137
245
  redactNames?: boolean;
138
246
  nodeNote?: (id: string) => string | undefined;
139
247
  /** The page's reading direction, which `Treemap` reads off its own root. In `rtl`
140
248
  * the label stands in the tile's top RIGHT corner and is shaped right-to-left, so a
141
249
  * clipped name ends in its ellipsis on the reading end. Default `ltr`. */
142
250
  dir?: Direction;
143
- /** See {@link TreemapProps.edges}. Default `auto`. */
251
+ /** See {@link TreemapProps.edges}. Default `auto`. Read by a cell drawn on its own; a
252
+ * `Treemap` hands its tiles its own `edges`. */
144
253
  edges?: TreemapEdges;
145
254
  }
146
255
  /**
@@ -153,17 +262,31 @@ export interface TreemapCellProps {
153
262
  * draws its own label with a halo in the TILE colour painted BEHIND the fill
154
263
  * (`paint-order: stroke`), which defeats any inherited stroke and keeps the text solid
155
264
  * where it overlaps a lighter or darker part of its own tile.
265
+ *
266
+ * Inside a `Treemap` it is one stop of the map's keyboard, named with its value and
267
+ * share (0.52); drawn on its own it is a stop only as a button (`onNodeClick`), named by
268
+ * `name`.
269
+ *
270
+ * A node with `children` is a GROUP (0.52): the cell draws a frame in the well's colour
271
+ * (`--bg-surface-2`), with the group's name in a band along its top where the group has
272
+ * the room (61px at Normal, treemap-layout's `BODY_SHARE`). Inside a `Treemap` its tiles are laid out
273
+ * in the frame's body; in a caller's own nested recharts `<Treemap>` they are drawn where
274
+ * recharts lays them, over the frame — only `Treemap` makes the room.
156
275
  */
157
- export declare function TreemapCell({ depth, x, y, width, height, name, fill, labelColor, id, onNodeClick, redactNames, nodeNote, dir, edges: edgesProp, }: TreemapCellProps): import("react").JSX.Element | null;
276
+ export declare function TreemapCell(props: TreemapCellProps): import("react").JSX.Element;
158
277
  /**
159
278
  * Tile chart: one rectangle per {@link TreemapNode}, sized by `value`, coloured by
160
279
  * index from the chart ramp (or by the node's own `fill`), labelled in whichever of the
161
280
  * kit's two inks measures better against it. Hover shows the name and the formatted
162
- * value; `onNodeClick` turns the tiles into buttons.
281
+ * value; every tile is a keyboard stop named with its value and share (see
282
+ * `onNodeClick`), and `onNodeClick` turns the tiles into buttons.
283
+ *
284
+ * A node with `children` is a group (0.52): a labelled frame with its tiles inside, in
285
+ * its colour unless they set their own — see {@link TreemapNode.children}.
163
286
  *
164
287
  * Renders nothing when no node has a positive value — an empty box is a hole in the
165
288
  * card, and the caller's own sentence is the better answer there.
166
289
  *
167
290
  * Needs `recharts`, like everything behind `@eifi1/ui-kit/chart`.
168
291
  */
169
- export declare function Treemap({ data, valueFormatter, height, onNodeClick, redactNames, nodeNote, maxTiles, colors, edges, style, ...rest }: TreemapProps): import("react").JSX.Element | null;
292
+ export declare function Treemap({ data, valueFormatter, height, onNodeClick, onGroupClick, redactNames, nodeNote, maxTiles, colors, edges, description, labels: labelsProp, style, ...rest }: TreemapProps): import("react").JSX.Element | null;