@eifi1/ui-kit 0.54.0 → 0.55.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 (847) hide show
  1. package/README.md +90 -76
  2. package/dist/admin/plan-change.js +2 -2
  3. package/dist/admin/plan-change.js.map +1 -1
  4. package/dist/admin/user-roster.d.ts +6 -0
  5. package/dist/admin/user-roster.js +4 -0
  6. package/dist/admin/user-roster.js.map +1 -1
  7. package/dist/billing/billing-labels.d.ts +26 -0
  8. package/dist/billing/billing-labels.js +9 -0
  9. package/dist/billing/billing-labels.js.map +1 -1
  10. package/dist/billing/subscription-standing.d.ts +61 -0
  11. package/dist/billing/subscription-standing.js +51 -0
  12. package/dist/billing/subscription-standing.js.map +1 -0
  13. package/dist/billing/usage-meter.d.ts +52 -0
  14. package/dist/billing/usage-meter.js +52 -0
  15. package/dist/billing/usage-meter.js.map +1 -0
  16. package/dist/chart.d.ts +1 -0
  17. package/dist/chart.js +4 -0
  18. package/dist/chart.js.map +1 -1
  19. package/dist/components/alert-banner.js +2 -3
  20. package/dist/components/alert-banner.js.map +1 -1
  21. package/dist/components/amount-input.js +3 -15
  22. package/dist/components/amount-input.js.map +1 -1
  23. package/dist/components/autocomplete.js +2 -2
  24. package/dist/components/autocomplete.js.map +1 -1
  25. package/dist/components/bulk-action-bar.js +2 -1
  26. package/dist/components/bulk-action-bar.js.map +1 -1
  27. package/dist/components/button.d.ts +35 -1
  28. package/dist/components/button.js +5 -9
  29. package/dist/components/button.js.map +1 -1
  30. package/dist/components/calendar-heatmap.js +2 -2
  31. package/dist/components/calendar-heatmap.js.map +1 -1
  32. package/dist/components/camera-button.d.ts +89 -0
  33. package/dist/components/camera-button.js +122 -0
  34. package/dist/components/camera-button.js.map +1 -0
  35. package/dist/components/camera-capture.d.ts +66 -0
  36. package/dist/components/camera-capture.js +190 -0
  37. package/dist/components/camera-capture.js.map +1 -0
  38. package/dist/components/camera-labels.d.ts +20 -0
  39. package/dist/components/camera-labels.js +15 -0
  40. package/dist/components/camera-labels.js.map +1 -0
  41. package/dist/components/chart-edge.d.ts +9 -0
  42. package/dist/components/chart-edge.js +14 -3
  43. package/dist/components/chart-edge.js.map +1 -1
  44. package/dist/components/chart-zoom-core.js +34 -29
  45. package/dist/components/chart-zoom-core.js.map +1 -1
  46. package/dist/components/checkbox-group.js +1 -1
  47. package/dist/components/checkbox-group.js.map +1 -1
  48. package/dist/components/combobox-core.js +3 -2
  49. package/dist/components/combobox-core.js.map +1 -1
  50. package/dist/components/combobox.js +2 -2
  51. package/dist/components/combobox.js.map +1 -1
  52. package/dist/components/consent-again-notice-labels.d.ts +25 -0
  53. package/dist/components/consent-again-notice-labels.js +15 -0
  54. package/dist/components/consent-again-notice-labels.js.map +1 -0
  55. package/dist/components/consent-again-notice.d.ts +85 -0
  56. package/dist/components/consent-again-notice.js +94 -0
  57. package/dist/components/consent-again-notice.js.map +1 -0
  58. package/dist/components/country-select.js +2 -7
  59. package/dist/components/country-select.js.map +1 -1
  60. package/dist/components/currency-select.js +2 -2
  61. package/dist/components/currency-select.js.map +1 -1
  62. package/dist/components/danger-confirm.js +2 -2
  63. package/dist/components/danger-confirm.js.map +1 -1
  64. package/dist/components/data-table-column-settings.js +2 -2
  65. package/dist/components/data-table-column-settings.js.map +1 -1
  66. package/dist/components/data-table-fit.js.map +1 -1
  67. package/dist/components/data-table-virtual.js +13 -3
  68. package/dist/components/data-table-virtual.js.map +1 -1
  69. package/dist/components/date-field.js +2 -2
  70. package/dist/components/date-field.js.map +1 -1
  71. package/dist/components/date-picker.js +2 -2
  72. package/dist/components/date-picker.js.map +1 -1
  73. package/dist/components/date-range-picker.js +2 -6
  74. package/dist/components/date-range-picker.js.map +1 -1
  75. package/dist/components/dialog-frame.d.ts +3 -1
  76. package/dist/components/dialog-frame.js.map +1 -1
  77. package/dist/components/dropdown.js +7 -3
  78. package/dist/components/dropdown.js.map +1 -1
  79. package/dist/components/entity-combobox.js +2 -2
  80. package/dist/components/entity-combobox.js.map +1 -1
  81. package/dist/components/field-parts.d.ts +108 -6
  82. package/dist/components/field-parts.js +59 -6
  83. package/dist/components/field-parts.js.map +1 -1
  84. package/dist/components/field-suggestion-labels.d.ts +2 -0
  85. package/dist/components/field-suggestion-labels.js +10 -0
  86. package/dist/components/field-suggestion-labels.js.map +1 -0
  87. package/dist/components/field.js +1 -1
  88. package/dist/components/field.js.map +1 -1
  89. package/dist/components/file-button.d.ts +1 -1
  90. package/dist/components/file-button.js.map +1 -1
  91. package/dist/components/floating-panel.d.ts +7 -6
  92. package/dist/components/floating-panel.js +3 -17
  93. package/dist/components/floating-panel.js.map +1 -1
  94. package/dist/components/form-actions.d.ts +3 -2
  95. package/dist/components/form-actions.js.map +1 -1
  96. package/dist/components/hover-menu.js +3 -2
  97. package/dist/components/hover-menu.js.map +1 -1
  98. package/dist/components/icon-button.d.ts +23 -5
  99. package/dist/components/icon-button.js +6 -8
  100. package/dist/components/icon-button.js.map +1 -1
  101. package/dist/components/inline-confirm.js +2 -1
  102. package/dist/components/inline-confirm.js.map +1 -1
  103. package/dist/components/inline-entity-combobox.js +2 -2
  104. package/dist/components/inline-entity-combobox.js.map +1 -1
  105. package/dist/components/input.js +2 -2
  106. package/dist/components/input.js.map +1 -1
  107. package/dist/components/jump-calendar.js +3 -3
  108. package/dist/components/jump-calendar.js.map +1 -1
  109. package/dist/components/legal.d.ts +13 -1
  110. package/dist/components/legal.js +12 -0
  111. package/dist/components/legal.js.map +1 -1
  112. package/dist/components/legended-series-chart.d.ts +80 -0
  113. package/dist/components/legended-series-chart.js +70 -0
  114. package/dist/components/legended-series-chart.js.map +1 -0
  115. package/dist/components/lightbox.js +2 -1
  116. package/dist/components/lightbox.js.map +1 -1
  117. package/dist/components/mini-calendar.js +13 -5
  118. package/dist/components/mini-calendar.js.map +1 -1
  119. package/dist/components/modal.d.ts +23 -2
  120. package/dist/components/modal.js +24 -6
  121. package/dist/components/modal.js.map +1 -1
  122. package/dist/components/month-picker.d.ts +1 -1
  123. package/dist/components/month-picker.js +6 -6
  124. package/dist/components/month-picker.js.map +1 -1
  125. package/dist/components/multi-entity-combobox.js +2 -2
  126. package/dist/components/multi-entity-combobox.js.map +1 -1
  127. package/dist/components/multi-select.js +2 -6
  128. package/dist/components/multi-select.js.map +1 -1
  129. package/dist/components/number-input.js +2 -2
  130. package/dist/components/number-input.js.map +1 -1
  131. package/dist/components/page-header-layout.d.ts +18 -0
  132. package/dist/components/page-header-layout.js +23 -0
  133. package/dist/components/page-header-layout.js.map +1 -0
  134. package/dist/components/page-header-skeleton.d.ts +41 -0
  135. package/dist/components/page-header-skeleton.js +52 -0
  136. package/dist/components/page-header-skeleton.js.map +1 -0
  137. package/dist/components/page-header.js +4 -17
  138. package/dist/components/page-header.js.map +1 -1
  139. package/dist/components/popover.js +7 -2
  140. package/dist/components/popover.js.map +1 -1
  141. package/dist/components/release-notes-labels.d.ts +16 -0
  142. package/dist/components/release-notes-labels.js +18 -0
  143. package/dist/components/release-notes-labels.js.map +1 -0
  144. package/dist/components/release-notes.d.ts +65 -0
  145. package/dist/components/release-notes.js +65 -0
  146. package/dist/components/release-notes.js.map +1 -0
  147. package/dist/components/select.js +2 -2
  148. package/dist/components/select.js.map +1 -1
  149. package/dist/components/series-chart-labels.d.ts +9 -0
  150. package/dist/components/series-chart-labels.js +3 -1
  151. package/dist/components/series-chart-labels.js.map +1 -1
  152. package/dist/components/series-chart.d.ts +5 -0
  153. package/dist/components/series-chart.js +89 -36
  154. package/dist/components/series-chart.js.map +1 -1
  155. package/dist/components/toggle-group.js +3 -2
  156. package/dist/components/toggle-group.js.map +1 -1
  157. package/dist/components/treemap-layout.js.map +1 -1
  158. package/dist/components/treemap.d.ts +17 -15
  159. package/dist/components/treemap.js +167 -85
  160. package/dist/components/treemap.js.map +1 -1
  161. package/dist/eslint/index.js +1 -1
  162. package/dist/eslint/role-utilities.d.ts +2 -2
  163. package/dist/eslint/role-utilities.js.map +1 -1
  164. package/dist/feedback/feedback-inbox-page.d.ts +260 -0
  165. package/dist/feedback/feedback-inbox-page.js +207 -0
  166. package/dist/feedback/feedback-inbox-page.js.map +1 -0
  167. package/dist/feedback/feedback-vocabulary.js +2 -2
  168. package/dist/feedback/feedback-vocabulary.js.map +1 -1
  169. package/dist/feedback.d.ts +1 -0
  170. package/dist/feedback.js +6 -0
  171. package/dist/feedback.js.map +1 -1
  172. package/dist/hooks/use-debounce.d.ts +32 -5
  173. package/dist/hooks/use-debounce.js +6 -5
  174. package/dist/hooks/use-debounce.js.map +1 -1
  175. package/dist/hooks/use-file-picker.d.ts +3 -1
  176. package/dist/hooks/use-file-picker.js.map +1 -1
  177. package/dist/hooks/use-focus-trap.d.ts +19 -3
  178. package/dist/hooks/use-focus-trap.js +15 -5
  179. package/dist/hooks/use-focus-trap.js.map +1 -1
  180. package/dist/hooks/use-has-camera.d.ts +36 -0
  181. package/dist/hooks/use-has-camera.js +53 -0
  182. package/dist/hooks/use-has-camera.js.map +1 -0
  183. package/dist/hooks/use-hotkey.js +1 -10
  184. package/dist/hooks/use-hotkey.js.map +1 -1
  185. package/dist/hooks/use-overlay-history.d.ts +6 -1
  186. package/dist/hooks/use-overlay-history.js +10 -2
  187. package/dist/hooks/use-overlay-history.js.map +1 -1
  188. package/dist/i18n/defaults.js +11 -1
  189. package/dist/i18n/defaults.js.map +1 -1
  190. package/dist/i18n/german.js +75 -3
  191. package/dist/i18n/german.js.map +1 -1
  192. package/dist/i18n/kit-labels.d.ts +20 -0
  193. package/dist/i18n/kit-labels.js.map +1 -1
  194. package/dist/i18n/locales/en.js +92 -4
  195. package/dist/i18n/locales/en.js.map +3 -3
  196. package/dist/i18n/locales/es.js +71 -3
  197. package/dist/i18n/locales/es.js.map +1 -1
  198. package/dist/i18n/locales/fr.js +72 -2
  199. package/dist/i18n/locales/fr.js.map +1 -1
  200. package/dist/i18n/locales/hu.js +74 -3
  201. package/dist/i18n/locales/hu.js.map +1 -1
  202. package/dist/i18n/locales/it.js +74 -3
  203. package/dist/i18n/locales/it.js.map +1 -1
  204. package/dist/i18n/locales/zh.js +71 -3
  205. package/dist/i18n/locales/zh.js.map +1 -1
  206. package/dist/i18n/review.js +22 -1
  207. package/dist/i18n/review.js.map +1 -1
  208. package/dist/index.d.ts +24 -5
  209. package/dist/index.js +35 -1
  210. package/dist/index.js.map +1 -1
  211. package/dist/landing/landing-labels.d.ts +8 -0
  212. package/dist/landing/landing-labels.js +2 -1
  213. package/dist/landing/landing-labels.js.map +1 -1
  214. package/dist/lib/changelog.d.ts +130 -0
  215. package/dist/lib/changelog.js +137 -0
  216. package/dist/lib/changelog.js.map +1 -0
  217. package/dist/lib/clipboard-minus.js +2 -2
  218. package/dist/lib/clipboard-minus.js.map +1 -1
  219. package/dist/lib/dates.d.ts +29 -3
  220. package/dist/lib/dates.js +41 -12
  221. package/dist/lib/dates.js.map +1 -1
  222. package/dist/lib/editable-content.d.ts +33 -0
  223. package/dist/lib/editable-content.js +15 -0
  224. package/dist/lib/editable-content.js.map +1 -0
  225. package/dist/lib/focus-left.d.ts +47 -1
  226. package/dist/lib/focus-left.js +11 -2
  227. package/dist/lib/focus-left.js.map +1 -1
  228. package/dist/lib/server-wake.d.ts +49 -9
  229. package/dist/lib/server-wake.js +25 -14
  230. package/dist/lib/server-wake.js.map +1 -1
  231. package/dist/lib/session-refresh.d.ts +53 -0
  232. package/dist/lib/session-refresh.js +27 -1
  233. package/dist/lib/session-refresh.js.map +1 -1
  234. package/dist/rhf/fields.js +3 -3
  235. package/dist/rhf/fields.js.map +1 -1
  236. package/dist/shell/app-shell.d.ts +25 -1
  237. package/dist/shell/app-shell.js +3 -1
  238. package/dist/shell/app-shell.js.map +1 -1
  239. package/dist/shell/dev-menu.d.ts +3 -0
  240. package/dist/shell/dev-menu.js +4 -2
  241. package/dist/shell/dev-menu.js.map +1 -1
  242. package/dist/shell/held-changes-banner-labels.d.ts +23 -0
  243. package/dist/shell/held-changes-banner-labels.js +14 -0
  244. package/dist/shell/held-changes-banner-labels.js.map +1 -0
  245. package/dist/shell/held-changes-banner.d.ts +75 -0
  246. package/dist/shell/held-changes-banner.js +106 -0
  247. package/dist/shell/held-changes-banner.js.map +1 -0
  248. package/dist/shell/sync-status-indicator.d.ts +27 -12
  249. package/dist/shell/sync-status-indicator.js +13 -4
  250. package/dist/shell/sync-status-indicator.js.map +1 -1
  251. package/dist/shell/top-bar-parts-labels.d.ts +5 -0
  252. package/dist/shell/top-bar-parts-labels.js +3 -1
  253. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  254. package/dist/shell.d.ts +2 -0
  255. package/dist/shell.js +3 -0
  256. package/dist/shell.js.map +1 -1
  257. package/dist/sync/engine.d.ts +11 -2
  258. package/dist/sync/engine.js +13 -5
  259. package/dist/sync/engine.js.map +1 -1
  260. package/dist/sync/hooks.d.ts +3 -2
  261. package/dist/sync/hooks.js +4 -2
  262. package/dist/sync/hooks.js.map +1 -1
  263. package/dist/testing/css-variables.generated.d.ts +2 -2
  264. package/dist/testing/css-variables.generated.js +1 -1
  265. package/dist/testing/css-variables.generated.js.map +1 -1
  266. package/dist/theme/chart-palette.d.ts +18 -0
  267. package/dist/theme/chart-palette.js +17 -1
  268. package/dist/theme/chart-palette.js.map +1 -1
  269. package/dist/theme/contrast-tokens.d.ts +3 -3
  270. package/dist/theme/contrast-tokens.js.map +1 -1
  271. package/dist/theme/contrast.d.ts +4 -4
  272. package/dist/theme/contrast.js.map +1 -1
  273. package/dist/tour/tour-overlay.js +2 -1
  274. package/dist/tour/tour-overlay.js.map +1 -1
  275. package/package.json +5 -9
  276. package/tokens.css +19 -54
  277. package/src/account/account-parts.ts +0 -47
  278. package/src/account/account-settings-labels.ts +0 -240
  279. package/src/account/account-settings.tsx +0 -698
  280. package/src/account/data-export-setting-labels.ts +0 -20
  281. package/src/account/data-export-setting.tsx +0 -200
  282. package/src/account/delete-account-setting-labels.ts +0 -33
  283. package/src/account/delete-account-setting.tsx +0 -342
  284. package/src/account/email-change-setting-labels.ts +0 -31
  285. package/src/account/email-change-setting.tsx +0 -443
  286. package/src/account/passkeys-setting.tsx +0 -445
  287. package/src/account/sessions-setting-labels.ts +0 -24
  288. package/src/account/sessions-setting.tsx +0 -283
  289. package/src/admin/admin-action-confirm-labels.ts +0 -19
  290. package/src/admin/admin-action-confirm.tsx +0 -509
  291. package/src/admin/admin-action-log-labels.ts +0 -83
  292. package/src/admin/admin-action-log.tsx +0 -464
  293. package/src/admin/admin-area-labels.ts +0 -114
  294. package/src/admin/admin-forbidden.tsx +0 -75
  295. package/src/admin/admin-overview.tsx +0 -258
  296. package/src/admin/admin-parts.ts +0 -68
  297. package/src/admin/admin-sections.tsx +0 -208
  298. package/src/admin/admin-tool-links.tsx +0 -90
  299. package/src/admin/invitations-panel-labels.ts +0 -31
  300. package/src/admin/invitations-panel.tsx +0 -516
  301. package/src/admin/mail-test-card-labels.ts +0 -19
  302. package/src/admin/mail-test-card.tsx +0 -189
  303. package/src/admin/plan-change-labels.ts +0 -5
  304. package/src/admin/plan-change.tsx +0 -474
  305. package/src/admin/reviewer-scope-editor-labels.ts +0 -16
  306. package/src/admin/reviewer-scope-editor.tsx +0 -224
  307. package/src/admin/role-select-labels.ts +0 -16
  308. package/src/admin/role-select.tsx +0 -282
  309. package/src/admin/transfer-ownership-dialog-labels.ts +0 -20
  310. package/src/admin/transfer-ownership-dialog.tsx +0 -162
  311. package/src/admin/user-roster-labels.ts +0 -17
  312. package/src/admin/user-roster.tsx +0 -559
  313. package/src/auth/accept-invitation-labels.ts +0 -21
  314. package/src/auth/accept-invitation.tsx +0 -210
  315. package/src/auth/auth-errors-labels.ts +0 -23
  316. package/src/auth/auth-errors.ts +0 -439
  317. package/src/auth/complete-name-dialog-labels.ts +0 -16
  318. package/src/auth/complete-name-dialog.tsx +0 -253
  319. package/src/auth/email-tag.ts +0 -75
  320. package/src/auth/forgot-password-form-labels.ts +0 -20
  321. package/src/auth/forgot-password-form.tsx +0 -221
  322. package/src/auth/form-rules.ts +0 -40
  323. package/src/auth/new-password-fields.tsx +0 -85
  324. package/src/auth/not-found-page-labels.ts +0 -12
  325. package/src/auth/not-found-page.tsx +0 -95
  326. package/src/auth/register-form-labels.ts +0 -31
  327. package/src/auth/register-form.tsx +0 -456
  328. package/src/auth/reset-password-form-labels.ts +0 -27
  329. package/src/auth/reset-password-form.tsx +0 -341
  330. package/src/auth/sign-in-form-labels.ts +0 -44
  331. package/src/auth/sign-in-form.tsx +0 -858
  332. package/src/auth/status-parts.tsx +0 -132
  333. package/src/auth/verify-email-labels.ts +0 -26
  334. package/src/auth/verify-email.tsx +0 -445
  335. package/src/billing/billing-banner.tsx +0 -258
  336. package/src/billing/billing-labels.ts +0 -381
  337. package/src/billing/billing-lock.ts +0 -108
  338. package/src/billing/billing-overview.ts +0 -157
  339. package/src/billing/billing-standing.ts +0 -80
  340. package/src/billing/cancel-request.ts +0 -97
  341. package/src/billing/cancel-subscription.tsx +0 -98
  342. package/src/billing/checkout-processing.ts +0 -394
  343. package/src/billing/checkout-return.ts +0 -90
  344. package/src/billing/pay-page.ts +0 -330
  345. package/src/billing/plan-card.tsx +0 -562
  346. package/src/billing/plan-change-labels.ts +0 -66
  347. package/src/billing/plan-limit-notice.tsx +0 -148
  348. package/src/billing/plan-limit-toast.tsx +0 -90
  349. package/src/billing/plan-limit.ts +0 -52
  350. package/src/billing/plan-price.ts +0 -98
  351. package/src/billing/plan-switch.tsx +0 -216
  352. package/src/billing/provider-page.ts +0 -84
  353. package/src/billing/subscription-actions.tsx +0 -247
  354. package/src/billing/subscription-status-chip.tsx +0 -95
  355. package/src/chart.ts +0 -103
  356. package/src/components/account-chips-labels.ts +0 -16
  357. package/src/components/account-chips.tsx +0 -474
  358. package/src/components/alert-banner.tsx +0 -670
  359. package/src/components/amount-input.tsx +0 -816
  360. package/src/components/appearance-labels.ts +0 -63
  361. package/src/components/authed-image-labels.ts +0 -11
  362. package/src/components/authed-image.tsx +0 -209
  363. package/src/components/autocomplete.tsx +0 -645
  364. package/src/components/breadcrumbs-labels.ts +0 -10
  365. package/src/components/breadcrumbs.tsx +0 -205
  366. package/src/components/bulk-action-bar-labels.ts +0 -11
  367. package/src/components/bulk-action-bar.tsx +0 -443
  368. package/src/components/button-group.tsx +0 -223
  369. package/src/components/button-look.ts +0 -256
  370. package/src/components/button.tsx +0 -339
  371. package/src/components/calculator.tsx +0 -341
  372. package/src/components/calendar-heatmap-labels.ts +0 -15
  373. package/src/components/calendar-heatmap.tsx +0 -600
  374. package/src/components/card.tsx +0 -377
  375. package/src/components/chart-edge.ts +0 -106
  376. package/src/components/chart-figure.tsx +0 -35
  377. package/src/components/chart-height.ts +0 -30
  378. package/src/components/chart-zoom-core.tsx +0 -627
  379. package/src/components/chart-zoom.tsx +0 -22
  380. package/src/components/chart.tsx +0 -554
  381. package/src/components/checkbox-group.tsx +0 -247
  382. package/src/components/checkbox.tsx +0 -346
  383. package/src/components/chip-input.tsx +0 -370
  384. package/src/components/chip-labels.ts +0 -13
  385. package/src/components/chip.tsx +0 -843
  386. package/src/components/choice-card.tsx +0 -544
  387. package/src/components/column-mapper-labels.ts +0 -38
  388. package/src/components/column-mapper.tsx +0 -655
  389. package/src/components/combobox-core.tsx +0 -1321
  390. package/src/components/combobox-suggestions.tsx +0 -131
  391. package/src/components/combobox.tsx +0 -716
  392. package/src/components/confirm-context.ts +0 -7
  393. package/src/components/confirm-dialog-labels.ts +0 -13
  394. package/src/components/confirm-dialog.tsx +0 -341
  395. package/src/components/copy-button-labels.ts +0 -13
  396. package/src/components/copy-button.tsx +0 -192
  397. package/src/components/country-select-labels.ts +0 -11
  398. package/src/components/country-select.tsx +0 -539
  399. package/src/components/currency-option-list.tsx +0 -188
  400. package/src/components/currency-select.tsx +0 -343
  401. package/src/components/danger-confirm-labels.ts +0 -20
  402. package/src/components/danger-confirm.tsx +0 -987
  403. package/src/components/data-table-cells.tsx +0 -118
  404. package/src/components/data-table-column-settings.tsx +0 -198
  405. package/src/components/data-table-filter-popover.tsx +0 -289
  406. package/src/components/data-table-filters.ts +0 -315
  407. package/src/components/data-table-fit.ts +0 -301
  408. package/src/components/data-table-groups.tsx +0 -288
  409. package/src/components/data-table-head.tsx +0 -280
  410. package/src/components/data-table-labels.ts +0 -198
  411. package/src/components/data-table-leading-row.tsx +0 -58
  412. package/src/components/data-table-mobile.tsx +0 -1117
  413. package/src/components/data-table-pagination.tsx +0 -202
  414. package/src/components/data-table-resize.ts +0 -188
  415. package/src/components/data-table-row-actions.tsx +0 -302
  416. package/src/components/data-table-row.tsx +0 -496
  417. package/src/components/data-table-selection.ts +0 -71
  418. package/src/components/data-table-shared.tsx +0 -287
  419. package/src/components/data-table-sort.ts +0 -163
  420. package/src/components/data-table-virtual.ts +0 -576
  421. package/src/components/data-table.tsx +0 -2598
  422. package/src/components/date-field.tsx +0 -684
  423. package/src/components/date-format-setting.tsx +0 -64
  424. package/src/components/date-picker.tsx +0 -404
  425. package/src/components/date-range-picker.tsx +0 -518
  426. package/src/components/description-list-labels.ts +0 -9
  427. package/src/components/description-list.tsx +0 -386
  428. package/src/components/dialog-frame-labels.ts +0 -7
  429. package/src/components/dialog-frame.tsx +0 -284
  430. package/src/components/disclosure.tsx +0 -476
  431. package/src/components/dropdown.tsx +0 -461
  432. package/src/components/empty-state.tsx +0 -136
  433. package/src/components/entity-combobox.tsx +0 -422
  434. package/src/components/error-boundary-labels.ts +0 -20
  435. package/src/components/error-boundary.tsx +0 -675
  436. package/src/components/facing-pair.ts +0 -93
  437. package/src/components/field-base-labels.ts +0 -20
  438. package/src/components/field-base.tsx +0 -656
  439. package/src/components/field-parts.tsx +0 -825
  440. package/src/components/field-strip.tsx +0 -129
  441. package/src/components/field.tsx +0 -206
  442. package/src/components/file-button.tsx +0 -295
  443. package/src/components/file-dropzone.tsx +0 -559
  444. package/src/components/floating-panel-labels.ts +0 -10
  445. package/src/components/floating-panel.tsx +0 -828
  446. package/src/components/focus-ring.ts +0 -16
  447. package/src/components/form-actions-labels.ts +0 -11
  448. package/src/components/form-actions.tsx +0 -578
  449. package/src/components/full-bleed-dialog.tsx +0 -294
  450. package/src/components/grouped-picker.tsx +0 -184
  451. package/src/components/help-popover.tsx +0 -117
  452. package/src/components/hover-menu.tsx +0 -343
  453. package/src/components/iban-input-labels.ts +0 -14
  454. package/src/components/iban-input.tsx +0 -236
  455. package/src/components/icon-button.tsx +0 -959
  456. package/src/components/icon-picker-labels.ts +0 -13
  457. package/src/components/icon-picker.tsx +0 -232
  458. package/src/components/image-grid-labels.ts +0 -11
  459. package/src/components/image-grid.tsx +0 -202
  460. package/src/components/inline-confirm.tsx +0 -116
  461. package/src/components/inline-edit-field-labels.ts +0 -11
  462. package/src/components/inline-edit-field.tsx +0 -552
  463. package/src/components/inline-entity-combobox.tsx +0 -849
  464. package/src/components/input.tsx +0 -394
  465. package/src/components/jump-calendar.tsx +0 -265
  466. package/src/components/language-select.tsx +0 -93
  467. package/src/components/legal-labels.ts +0 -105
  468. package/src/components/legal-page.tsx +0 -711
  469. package/src/components/legal.tsx +0 -668
  470. package/src/components/lightbox-labels.ts +0 -18
  471. package/src/components/lightbox.tsx +0 -399
  472. package/src/components/line-items-labels.ts +0 -14
  473. package/src/components/line-items.tsx +0 -602
  474. package/src/components/list-labels.ts +0 -12
  475. package/src/components/list.tsx +0 -870
  476. package/src/components/loading-state.tsx +0 -78
  477. package/src/components/measured-grid-labels.ts +0 -25
  478. package/src/components/measured-grid.tsx +0 -837
  479. package/src/components/menu-item.tsx +0 -241
  480. package/src/components/mini-calendar-labels.ts +0 -17
  481. package/src/components/mini-calendar.tsx +0 -792
  482. package/src/components/modal.tsx +0 -534
  483. package/src/components/money-draft.ts +0 -83
  484. package/src/components/money-field.tsx +0 -76
  485. package/src/components/month-grid.tsx +0 -229
  486. package/src/components/month-picker-labels.ts +0 -22
  487. package/src/components/month-picker.tsx +0 -1087
  488. package/src/components/multi-entity-combobox.tsx +0 -369
  489. package/src/components/multi-select.tsx +0 -376
  490. package/src/components/nav-pills.tsx +0 -198
  491. package/src/components/number-field.tsx +0 -327
  492. package/src/components/number-input.tsx +0 -559
  493. package/src/components/numeric-field.ts +0 -169
  494. package/src/components/numpad-sheet.tsx +0 -285
  495. package/src/components/one-time-code-input.tsx +0 -270
  496. package/src/components/page-contents-labels.ts +0 -9
  497. package/src/components/page-contents.tsx +0 -282
  498. package/src/components/page-header-context.ts +0 -8
  499. package/src/components/page-header.tsx +0 -298
  500. package/src/components/password-strength-labels.ts +0 -22
  501. package/src/components/password-strength.tsx +0 -241
  502. package/src/components/phone-input-labels.ts +0 -10
  503. package/src/components/phone-input.tsx +0 -282
  504. package/src/components/picker-sheet.tsx +0 -330
  505. package/src/components/pie-chart-labels.ts +0 -40
  506. package/src/components/pie-chart.tsx +0 -480
  507. package/src/components/popover-labels.ts +0 -14
  508. package/src/components/popover.tsx +0 -268
  509. package/src/components/progress-bar-labels.ts +0 -10
  510. package/src/components/progress-bar.tsx +0 -479
  511. package/src/components/qr-code.tsx +0 -76
  512. package/src/components/reauth-dialog-labels.ts +0 -13
  513. package/src/components/reauth-dialog.tsx +0 -265
  514. package/src/components/row-actions-labels.ts +0 -12
  515. package/src/components/row-actions.tsx +0 -795
  516. package/src/components/scroll-area.tsx +0 -123
  517. package/src/components/search-field.tsx +0 -192
  518. package/src/components/select.tsx +0 -294
  519. package/src/components/separator.tsx +0 -33
  520. package/src/components/series-chart-axes.ts +0 -342
  521. package/src/components/series-chart-budget.ts +0 -150
  522. package/src/components/series-chart-labels.ts +0 -33
  523. package/src/components/series-chart-thin.ts +0 -180
  524. package/src/components/series-chart-ticks.ts +0 -194
  525. package/src/components/series-chart.tsx +0 -1906
  526. package/src/components/server-wake-labels.ts +0 -11
  527. package/src/components/server-wake.tsx +0 -129
  528. package/src/components/settings-fields.tsx +0 -237
  529. package/src/components/share-card-labels.ts +0 -30
  530. package/src/components/share-card.tsx +0 -675
  531. package/src/components/signature-pad-labels.ts +0 -24
  532. package/src/components/signature-pad.tsx +0 -747
  533. package/src/components/signed-amount-labels.ts +0 -10
  534. package/src/components/signed-amount.tsx +0 -336
  535. package/src/components/skeleton.tsx +0 -80
  536. package/src/components/slider.tsx +0 -338
  537. package/src/components/sparkline-labels.ts +0 -14
  538. package/src/components/sparkline.tsx +0 -322
  539. package/src/components/spinner.tsx +0 -81
  540. package/src/components/stat-tile-labels.ts +0 -15
  541. package/src/components/stat-tile.tsx +0 -754
  542. package/src/components/status-dot.tsx +0 -170
  543. package/src/components/swatch-picker-labels.ts +0 -10
  544. package/src/components/swatch-picker.tsx +0 -283
  545. package/src/components/swipeable-row.tsx +0 -386
  546. package/src/components/switch.tsx +0 -273
  547. package/src/components/table-skeleton.tsx +0 -136
  548. package/src/components/table.tsx +0 -647
  549. package/src/components/tabs-labels.ts +0 -13
  550. package/src/components/tabs.tsx +0 -693
  551. package/src/components/text-link.tsx +0 -359
  552. package/src/components/text.tsx +0 -150
  553. package/src/components/textarea.tsx +0 -330
  554. package/src/components/tile-radio.tsx +0 -332
  555. package/src/components/time-input.tsx +0 -121
  556. package/src/components/toast-labels.ts +0 -12
  557. package/src/components/toast.tsx +0 -519
  558. package/src/components/toggle-group.tsx +0 -752
  559. package/src/components/toggle-legend.tsx +0 -394
  560. package/src/components/tooltip.tsx +0 -1149
  561. package/src/components/translation-review-editor.tsx +0 -290
  562. package/src/components/translation-review-labels.ts +0 -181
  563. package/src/components/translation-review-parts.tsx +0 -272
  564. package/src/components/translation-review.tsx +0 -1240
  565. package/src/components/tree-view.tsx +0 -589
  566. package/src/components/treemap-labels.ts +0 -47
  567. package/src/components/treemap-layout.ts +0 -210
  568. package/src/components/treemap.tsx +0 -1184
  569. package/src/components/trigger-aria.ts +0 -44
  570. package/src/components/use-anchor-dir.ts +0 -20
  571. package/src/components/use-mobile-reveal.ts +0 -62
  572. package/src/components/use-table-state.ts +0 -753
  573. package/src/components/user-avatar.tsx +0 -116
  574. package/src/components/wizard-stepper.tsx +0 -42
  575. package/src/components/write-lock-labels.ts +0 -10
  576. package/src/components/write-lock.tsx +0 -253
  577. package/src/currencies.ts +0 -90
  578. package/src/data-table.ts +0 -42
  579. package/src/demo/demo-banner.tsx +0 -153
  580. package/src/demo/demo-countdown.ts +0 -136
  581. package/src/demo/demo-ended.tsx +0 -90
  582. package/src/demo/demo-labels.ts +0 -78
  583. package/src/demo/demo-session.ts +0 -32
  584. package/src/demo/demo-start.tsx +0 -156
  585. package/src/eslint/index.ts +0 -161
  586. package/src/eslint/role-utilities.generated.ts +0 -146
  587. package/src/eslint/role-utilities.ts +0 -233
  588. package/src/feedback/feedback-attachment-download.tsx +0 -77
  589. package/src/feedback/feedback-attachment-labels.ts +0 -37
  590. package/src/feedback/feedback-attachment.tsx +0 -1239
  591. package/src/feedback/feedback-capture.ts +0 -287
  592. package/src/feedback/feedback-comment-thread.tsx +0 -353
  593. package/src/feedback/feedback-context-labels.ts +0 -11
  594. package/src/feedback/feedback-context.tsx +0 -245
  595. package/src/feedback/feedback-crash.ts +0 -547
  596. package/src/feedback/feedback-diagnostics.tsx +0 -41
  597. package/src/feedback/feedback-dialog-labels.ts +0 -29
  598. package/src/feedback/feedback-dialog.tsx +0 -452
  599. package/src/feedback/feedback-entry-file.tsx +0 -150
  600. package/src/feedback/feedback-inbox.tsx +0 -552
  601. package/src/feedback/feedback-labels.ts +0 -144
  602. package/src/feedback/feedback-menu-labels.ts +0 -12
  603. package/src/feedback/feedback-menu.tsx +0 -177
  604. package/src/feedback/feedback-mutation.ts +0 -20
  605. package/src/feedback/feedback-page-link.ts +0 -90
  606. package/src/feedback/feedback-public-labels.ts +0 -81
  607. package/src/feedback/feedback-public-list.tsx +0 -524
  608. package/src/feedback/feedback-public-switch.tsx +0 -102
  609. package/src/feedback/feedback-public-types.ts +0 -101
  610. package/src/feedback/feedback-record.ts +0 -428
  611. package/src/feedback/feedback-replies-context.ts +0 -9
  612. package/src/feedback/feedback-replies.tsx +0 -343
  613. package/src/feedback/feedback-rework-entry-chip.tsx +0 -18
  614. package/src/feedback/feedback-row-detail-labels.ts +0 -31
  615. package/src/feedback/feedback-row-detail.tsx +0 -871
  616. package/src/feedback/feedback-status-undo.ts +0 -109
  617. package/src/feedback/feedback-submit-dialog.tsx +0 -131
  618. package/src/feedback/feedback-submit.tsx +0 -270
  619. package/src/feedback/feedback-swipe.tsx +0 -192
  620. package/src/feedback/feedback-table-labels.ts +0 -27
  621. package/src/feedback/feedback-table.tsx +0 -912
  622. package/src/feedback/feedback-thread-labels.ts +0 -22
  623. package/src/feedback/feedback-thread-parts-labels.ts +0 -41
  624. package/src/feedback/feedback-thread.tsx +0 -905
  625. package/src/feedback/feedback-vocabulary.ts +0 -263
  626. package/src/feedback/feedback-vote-button.tsx +0 -124
  627. package/src/feedback.ts +0 -116
  628. package/src/hooks/use-anchored-panel.ts +0 -396
  629. package/src/hooks/use-anchored-rect.ts +0 -77
  630. package/src/hooks/use-announce.ts +0 -85
  631. package/src/hooks/use-authed-src.ts +0 -167
  632. package/src/hooks/use-body-scroll-lock.ts +0 -119
  633. package/src/hooks/use-breakpoint.ts +0 -133
  634. package/src/hooks/use-close-transition.ts +0 -107
  635. package/src/hooks/use-copy-to-clipboard.ts +0 -122
  636. package/src/hooks/use-debounce.ts +0 -114
  637. package/src/hooks/use-dismiss.ts +0 -371
  638. package/src/hooks/use-document-title.ts +0 -33
  639. package/src/hooks/use-file-drop.ts +0 -121
  640. package/src/hooks/use-file-picker-labels.ts +0 -28
  641. package/src/hooks/use-file-picker.tsx +0 -359
  642. package/src/hooks/use-focus-trap.ts +0 -199
  643. package/src/hooks/use-hotkey.ts +0 -212
  644. package/src/hooks/use-large-text.ts +0 -41
  645. package/src/hooks/use-long-press.ts +0 -140
  646. package/src/hooks/use-media-query.ts +0 -39
  647. package/src/hooks/use-mounted.ts +0 -39
  648. package/src/hooks/use-noindex.ts +0 -37
  649. package/src/hooks/use-overlay-history.ts +0 -714
  650. package/src/hooks/use-row-swipe.ts +0 -207
  651. package/src/hooks/use-search-param-state.ts +0 -434
  652. package/src/hooks/use-windowed-rows.ts +0 -225
  653. package/src/i18n/defaults.ts +0 -267
  654. package/src/i18n/german.ts +0 -2059
  655. package/src/i18n/kit-labels.tsx +0 -1003
  656. package/src/i18n/languages.ts +0 -349
  657. package/src/i18n/locales/de-CH.ts +0 -24
  658. package/src/i18n/locales/en.ts +0 -267
  659. package/src/i18n/locales/es.ts +0 -1999
  660. package/src/i18n/locales/fr.ts +0 -2037
  661. package/src/i18n/locales/hu.ts +0 -2004
  662. package/src/i18n/locales/it.ts +0 -2014
  663. package/src/i18n/locales/zh.ts +0 -1912
  664. package/src/i18n/plurals.ts +0 -86
  665. package/src/i18n/review.ts +0 -475
  666. package/src/i18n/shared-labels.ts +0 -138
  667. package/src/i18n/swiss.ts +0 -29
  668. package/src/index.ts +0 -1191
  669. package/src/landing/access.ts +0 -93
  670. package/src/landing/landing-actions.tsx +0 -97
  671. package/src/landing/landing-labels.ts +0 -59
  672. package/src/landing/landing-sections.tsx +0 -341
  673. package/src/landing/page-seo.ts +0 -261
  674. package/src/landing/public-header.tsx +0 -121
  675. package/src/landing/public-page.tsx +0 -106
  676. package/src/landing/routing.tsx +0 -225
  677. package/src/lib/broadcast.ts +0 -52
  678. package/src/lib/calc.ts +0 -323
  679. package/src/lib/chip-edge-snap.ts +0 -212
  680. package/src/lib/clipboard-minus.ts +0 -107
  681. package/src/lib/clipping.ts +0 -34
  682. package/src/lib/cn.ts +0 -28
  683. package/src/lib/column-mapping.ts +0 -234
  684. package/src/lib/countries.ts +0 -91
  685. package/src/lib/data-attributes.ts +0 -14
  686. package/src/lib/date-format.ts +0 -227
  687. package/src/lib/dates.ts +0 -288
  688. package/src/lib/day-format.ts +0 -96
  689. package/src/lib/decimal-marks.ts +0 -108
  690. package/src/lib/describe-failure.ts +0 -18
  691. package/src/lib/device-settings.ts +0 -147
  692. package/src/lib/direction.ts +0 -74
  693. package/src/lib/document-navigation.ts +0 -17
  694. package/src/lib/document-title.ts +0 -41
  695. package/src/lib/download.ts +0 -172
  696. package/src/lib/float-clearance.ts +0 -70
  697. package/src/lib/floating-stack.ts +0 -70
  698. package/src/lib/focus-left.ts +0 -156
  699. package/src/lib/format.ts +0 -585
  700. package/src/lib/http-status.ts +0 -38
  701. package/src/lib/iban.ts +0 -251
  702. package/src/lib/ime.ts +0 -24
  703. package/src/lib/intl-cache.ts +0 -27
  704. package/src/lib/iso-day.ts +0 -13
  705. package/src/lib/lazy-with-fallback.ts +0 -82
  706. package/src/lib/logger.ts +0 -69
  707. package/src/lib/minus.ts +0 -50
  708. package/src/lib/path-pattern.ts +0 -55
  709. package/src/lib/person-name.ts +0 -155
  710. package/src/lib/phone.ts +0 -208
  711. package/src/lib/plain-text.ts +0 -22
  712. package/src/lib/presence.ts +0 -18
  713. package/src/lib/qr-encode.ts +0 -444
  714. package/src/lib/quiet-focus.ts +0 -32
  715. package/src/lib/reduced-motion.ts +0 -22
  716. package/src/lib/refs.ts +0 -22
  717. package/src/lib/round.ts +0 -43
  718. package/src/lib/safe-storage.ts +0 -119
  719. package/src/lib/server-wake.ts +0 -315
  720. package/src/lib/session-refresh.ts +0 -472
  721. package/src/lib/share-format.ts +0 -18
  722. package/src/lib/status-tone.ts +0 -43
  723. package/src/lib/strip-fade.ts +0 -287
  724. package/src/lib/table-text.ts +0 -554
  725. package/src/lib/text-case.ts +0 -19
  726. package/src/lib/text-match.ts +0 -169
  727. package/src/lib/thenable.ts +0 -19
  728. package/src/lib/translation-review.ts +0 -769
  729. package/src/notifications/device-zone-report.ts +0 -67
  730. package/src/notifications/feedback-notification-types-labels.ts +0 -33
  731. package/src/notifications/feedback-notification-types.ts +0 -71
  732. package/src/notifications/notification-bell.tsx +0 -119
  733. package/src/notifications/notification-inbox.tsx +0 -309
  734. package/src/notifications/notification-parts.tsx +0 -81
  735. package/src/notifications/notification-types-setting.tsx +0 -406
  736. package/src/notifications/notification-types.ts +0 -89
  737. package/src/notifications/notifications-labels.ts +0 -287
  738. package/src/notifications/push-device-setting.tsx +0 -230
  739. package/src/notifications/push-devices-setting.tsx +0 -374
  740. package/src/notifications/push-worker.ts +0 -168
  741. package/src/notifications/quiet-hours-setting.tsx +0 -238
  742. package/src/notifications/unsubscribe-panel.tsx +0 -200
  743. package/src/notifications/use-push-device.ts +0 -448
  744. package/src/offline/local-first.ts +0 -100
  745. package/src/offline/pwa-update-prompt-labels.ts +0 -9
  746. package/src/offline/pwa-update-prompt.tsx +0 -78
  747. package/src/offline/query-persistence.ts +0 -391
  748. package/src/offline/service-worker-updates.ts +0 -81
  749. package/src/offline/shared-computer-labels.ts +0 -8
  750. package/src/offline/shared-computer.tsx +0 -87
  751. package/src/offline/sign-out-pending-dialog-labels.ts +0 -21
  752. package/src/offline/sign-out-pending-dialog.tsx +0 -135
  753. package/src/offline.ts +0 -37
  754. package/src/push-worker.ts +0 -25
  755. package/src/rhf/fields.tsx +0 -2187
  756. package/src/rhf/form-core.tsx +0 -324
  757. package/src/rhf/form.tsx +0 -12
  758. package/src/rhf/line-items.tsx +0 -135
  759. package/src/rhf/use-rhf-wizard-step.ts +0 -104
  760. package/src/rhf.ts +0 -21
  761. package/src/search/command-palette-labels.ts +0 -16
  762. package/src/search/command-palette.tsx +0 -624
  763. package/src/search/global-search-labels.ts +0 -13
  764. package/src/search/global-search.tsx +0 -660
  765. package/src/search/search-index.ts +0 -283
  766. package/src/search/use-command-key.ts +0 -23
  767. package/src/search.ts +0 -14
  768. package/src/settings/device-reset-setting-labels.ts +0 -20
  769. package/src/settings/device-reset-setting.tsx +0 -116
  770. package/src/settings/settings-card-classes.ts +0 -11
  771. package/src/settings/settings-catalogue.ts +0 -150
  772. package/src/settings/settings-context.ts +0 -33
  773. package/src/settings/settings-heading.tsx +0 -67
  774. package/src/settings/settings-labels.ts +0 -87
  775. package/src/settings/settings-layout.tsx +0 -471
  776. package/src/settings/settings-section.tsx +0 -108
  777. package/src/settings/use-account-appearance.ts +0 -148
  778. package/src/settings/use-account-language.ts +0 -146
  779. package/src/settings/use-settings-focus.ts +0 -128
  780. package/src/settings/use-settings-route.ts +0 -258
  781. package/src/shell/account-menu-language.tsx +0 -130
  782. package/src/shell/account-menu-text-size.tsx +0 -80
  783. package/src/shell/admin-menu.tsx +0 -183
  784. package/src/shell/app-shell-labels.ts +0 -11
  785. package/src/shell/app-shell.tsx +0 -1560
  786. package/src/shell/auth-layout.tsx +0 -186
  787. package/src/shell/company-switcher-labels.ts +0 -13
  788. package/src/shell/company-switcher.tsx +0 -136
  789. package/src/shell/dev-menu.tsx +0 -257
  790. package/src/shell/fill-height.tsx +0 -45
  791. package/src/shell/language-code.ts +0 -5
  792. package/src/shell/option-switcher-menu.tsx +0 -84
  793. package/src/shell/sync-status-indicator.tsx +0 -303
  794. package/src/shell/top-bar-actions.tsx +0 -87
  795. package/src/shell/top-bar-brand.tsx +0 -78
  796. package/src/shell/top-bar-parts-labels.ts +0 -148
  797. package/src/shell/top-bar.tsx +0 -40
  798. package/src/shell/topbar-action-menu.tsx +0 -567
  799. package/src/shell/topbar-controls.tsx +0 -269
  800. package/src/shell/tour-menu.tsx +0 -187
  801. package/src/shell.ts +0 -108
  802. package/src/sync/db.ts +0 -129
  803. package/src/sync/engine.ts +0 -1011
  804. package/src/sync/hooks.ts +0 -98
  805. package/src/sync/testing.ts +0 -73
  806. package/src/sync/wire.ts +0 -61
  807. package/src/sync.ts +0 -37
  808. package/src/table-text.ts +0 -8
  809. package/src/testing/css-variables.generated.ts +0 -112
  810. package/src/testing/css-variables.ts +0 -189
  811. package/src/testing/index.ts +0 -29
  812. package/src/testing/react.ts +0 -58
  813. package/src/testing/tour.ts +0 -41
  814. package/src/testing/viewport.ts +0 -357
  815. package/src/theme/chart-palette.ts +0 -232
  816. package/src/theme/color.ts +0 -272
  817. package/src/theme/contrast-tokens.ts +0 -268
  818. package/src/theme/contrast.ts +0 -250
  819. package/src/theme/palette-derive.ts +0 -825
  820. package/src/theme/palette-presets.ts +0 -544
  821. package/src/theme/palette-store.ts +0 -108
  822. package/src/theme/text-size.ts +0 -289
  823. package/src/theme/theme-store.ts +0 -157
  824. package/src/tour/tour-catalogue-labels.ts +0 -75
  825. package/src/tour/tour-catalogue.tsx +0 -335
  826. package/src/tour/tour-dock.ts +0 -134
  827. package/src/tour/tour-engine.ts +0 -37
  828. package/src/tour/tour-gates.ts +0 -218
  829. package/src/tour/tour-guide-button.tsx +0 -64
  830. package/src/tour/tour-guide-labels.ts +0 -15
  831. package/src/tour/tour-info.ts +0 -144
  832. package/src/tour/tour-labels.ts +0 -23
  833. package/src/tour/tour-overlay.tsx +0 -1170
  834. package/src/tour/tour.tsx +0 -750
  835. package/src/tour/use-tour-progress.ts +0 -671
  836. package/src/tour/use-tour-url-sync.ts +0 -266
  837. package/src/tour.ts +0 -21
  838. package/src/vite-env.d.ts +0 -23
  839. package/src/wizard/stepper-nav.tsx +0 -360
  840. package/src/wizard/types.ts +0 -275
  841. package/src/wizard/use-wizard.ts +0 -560
  842. package/src/wizard/validation.ts +0 -39
  843. package/src/wizard/wizard-context.tsx +0 -74
  844. package/src/wizard/wizard-labels.ts +0 -29
  845. package/src/wizard/wizard-step.tsx +0 -76
  846. package/src/wizard/wizard-summary.tsx +0 -84
  847. package/src/wizard.ts +0 -15
@@ -1,627 +0,0 @@
1
- // Drag-to-zoom for cartesian charts — the HOC, the shared x window, and the arithmetic.
2
- // Lifted out of lenkbank, where every plot in the app is one `SeriesChart` and zoom is
3
- // therefore wired in exactly once.
4
- //
5
- // **Which axes a drag zooms is read off the drag itself.** A selection that is roughly
6
- // square is a box: the reader framed a REGION and means both axes. A long thin one is a
7
- // band, and its own direction says which: a wide flat drag means "this stretch of the
8
- // abscissa", a tall narrow one "this range of values". Asking with a modifier key
9
- // instead would be asking people to remember a convention for something they have
10
- // already drawn.
11
- //
12
- // Squareness is measured **in fractions of the plot**, not pixels. These charts are
13
- // three times wider than they are tall, so a pixel-square selection is a very wide
14
- // slice of the data and would read as a band to anybody looking at it.
15
- //
16
- // The zoom is VIEW state and lives here, never in a query or a store: it is where
17
- // somebody is looking, and a chart whose data reloads should not lose it. It is cleared
18
- // by the reset button, by a double click, and by nothing else.
19
- //
20
- // Everything with a decision in it is a pure exported function below (`zoomAxesFor`,
21
- // `selectionFromDrag`, `zoomAfter`, `zoomDomains`, `fitYToX`, `fitXToY`); the
22
- // components are plumbing between a pointer and those.
23
- //
24
- // The kit's own module (0.34, refactor audit 2026-10, API-6b): SeriesChart, its axes and
25
- // the facing pair import from here. ./chart-zoom is the public face — `SharedXZoom`, the
26
- // types, and until 0.35 the deprecated arithmetic and HOC, which no app imports.
27
- import { createContext, useContext, useEffect, useRef, useState } from "react";
28
- import type { ComponentType, Dispatch, ReactNode, SetStateAction } from "react";
29
- import { usePlotArea, useXAxisInverseScale, useYAxisInverseScale, type InverseScaleFunction } from "recharts";
30
- import { X } from "lucide-react";
31
- import { cn } from "../lib/cn";
32
- import { FOCUS_RING } from "./focus-ring";
33
- import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
34
- import { DEFAULT_SERIES_CHART_LABELS, type SeriesChartLabels } from "./series-chart-labels";
35
-
36
- /** The y axis a series lands on when it names none — the single shared scale most
37
- * charts have. `SeriesChart` and the fit below agree on it by importing this. */
38
- export const DEFAULT_Y_AXIS = "y";
39
-
40
- /* ── The arithmetic ─────────────────────────────────────────────────────── */
41
-
42
- /**
43
- * How square a selection has to be before it counts as a box: the shorter side
44
- * against the longer, both as fractions of the plot. At 0.5 a selection twice as wide
45
- * as it is tall is still a box and one three times as wide is a band.
46
- */
47
- export const ZOOM_SQUARE_ENOUGH = 0.5;
48
-
49
- /** Below this a drag is a click that moved, not a selection. In fractions of the plot,
50
- * so it is the same gesture on a phone and on a wall display. */
51
- export const ZOOM_MIN_DRAG = 0.02;
52
-
53
- export type ZoomAxes = "both" | "x" | "y";
54
-
55
- /** Which axes a drag zooms — or `null` for a drag too small to mean one, or a plot
56
- * that has not been laid out yet. Direction does not matter; proportion does. */
57
- export function zoomAxesFor(
58
- dx: number,
59
- dy: number,
60
- width: number,
61
- height: number,
62
- threshold: number = ZOOM_SQUARE_ENOUGH,
63
- /** A chart that zooms ONE axis only (see {@link ZoomTarget.zoomAxes}): every drag is
64
- * a band along it, however it was drawn, and a drag with no extent along it is
65
- * nothing — a tall narrow drag over a bar chart names no stretch of the abscissa. */
66
- only?: "x" | "y",
67
- ): ZoomAxes | null {
68
- if (!(width > 0) || !(height > 0)) return null;
69
- const across = Math.abs(dx) / width;
70
- const down = Math.abs(dy) / height;
71
- if (only === "x") return across < ZOOM_MIN_DRAG ? null : "x";
72
- if (only === "y") return down < ZOOM_MIN_DRAG ? null : "y";
73
- if (across < ZOOM_MIN_DRAG && down < ZOOM_MIN_DRAG) return null;
74
- const longer = Math.max(across, down);
75
- const shorter = Math.min(across, down);
76
- if (shorter / longer >= threshold) return "both";
77
- return across > down ? "x" : "y";
78
- }
79
-
80
- /** What a drag chose, in DATA coordinates, and which axes it actually named — the
81
- * caller needs the second to know which of the two it may derive from the other. */
82
- export interface ZoomSelection {
83
- which: ZoomAxes;
84
- x?: [number, number];
85
- /** One window per y axis, keyed by axis id: they are in different units. */
86
- y: Record<string, [number, number]>;
87
- }
88
-
89
- /** A drag, in the chart's own pixel coordinates. */
90
- export interface ZoomDrag {
91
- fromX: number;
92
- fromY: number;
93
- toX: number;
94
- toY: number;
95
- }
96
-
97
- /** A pair as a domain, smallest first. Recharts wants an ascending domain whichever
98
- * way the drag went, and a y axis counts downward in pixels while its values count
99
- * upward — so both ends are read and sorted rather than one assumed to be low. */
100
- function ordered(a: number, b: number): [number, number] {
101
- return a <= b ? [a, b] : [b, a];
102
- }
103
-
104
- /**
105
- * A finished drag as a selection, or `null` when it selects nothing.
106
- *
107
- * `xInverse` and `yInverse(axisId)` are recharts' pixel→value functions; an axis whose
108
- * function is missing, or whose ends come back non-finite, is left out rather than
109
- * handed a NaN window.
110
- */
111
- export function selectionFromDrag(
112
- drag: ZoomDrag,
113
- plot: { width: number; height: number },
114
- xInverse: InverseScaleFunction | undefined,
115
- yInverse: (axisId: string) => InverseScaleFunction | undefined,
116
- axisIds: readonly string[],
117
- only?: "x" | "y",
118
- ): ZoomSelection | null {
119
- const which = zoomAxesFor(
120
- drag.toX - drag.fromX,
121
- drag.toY - drag.fromY,
122
- plot.width,
123
- plot.height,
124
- ZOOM_SQUARE_ENOUGH,
125
- only,
126
- );
127
- if (!which) return null;
128
- const next: ZoomSelection = { which, y: {} };
129
- if (which !== "y" && xInverse) {
130
- const from = Number(xInverse(drag.fromX));
131
- const to = Number(xInverse(drag.toX));
132
- if (Number.isFinite(from) && Number.isFinite(to)) next.x = ordered(from, to);
133
- }
134
- if (which !== "x") {
135
- for (const id of axisIds) {
136
- const inverse = yInverse(id);
137
- if (!inverse) continue;
138
- const from = Number(inverse(drag.fromY));
139
- const to = Number(inverse(drag.toY));
140
- if (Number.isFinite(from) && Number.isFinite(to)) next.y[id] = ordered(from, to);
141
- }
142
- }
143
- return next.x || Object.keys(next.y).length ? next : null;
144
- }
145
-
146
- /** One row of a zoomable chart. Loose on purpose: a row also carries what the chart
147
- * does not plot — keksdose's `rawPeriod` for a drilldown, a label for a category axis —
148
- * and only the finite NUMBERS in it are ever read as samples. */
149
- export type ZoomRow = Readonly<Record<string, unknown>>;
150
-
151
- /** A series as the fit sees it. `stack` groups bars/areas drawn on top of each other
152
- * (recharts' `stackId`), whose extent is their SUM, not any one of them. */
153
- export interface ZoomFitSeries {
154
- key: string;
155
- axis?: string;
156
- stack?: string;
157
- /** Only `"line"` matters here: recharts cannot stack a line, so a line's `stack` is
158
- * ignored rather than summed into a height nothing on the chart reaches. */
159
- type?: string;
160
- }
161
-
162
- /** What a band refit needs to know about the chart — a subset of `SeriesChart`'s own
163
- * props, so a chart hands its data straight over. */
164
- export interface ZoomFitSource {
165
- rows: readonly ZoomRow[];
166
- series: readonly ZoomFitSeries[];
167
- axes: readonly { id: string }[];
168
- xKey: string;
169
- }
170
-
171
- /** How much of a refitted span to leave as air, top and bottom. Without it the
172
- * highest sample sits exactly on the frame, where a line is half drawn and reads as
173
- * clipped rather than as the maximum. */
174
- const FIT_AIR = 0.05;
175
-
176
- /** A span with air around it — and a real span for a flat channel, which would
177
- * otherwise be a zero-height window recharts cannot scale. */
178
- function airy(low: number, high: number): [number, number] {
179
- const span = high - low;
180
- const air = span > 0 ? span * FIT_AIR : Math.max(Math.abs(high), 1) * FIT_AIR;
181
- return [low - air, high + air];
182
- }
183
-
184
- /** A running low/high pair. A pair rather than an array to take `Math.min(...)` of:
185
- * the spread passes one argument per sample, and V8 faults past ~125,000 of them. */
186
- type Span = [number, number] | undefined;
187
-
188
- /** A pair widened by one value. A non-finite one is not a value — one NaN would
189
- * otherwise take the whole window with it. */
190
- function widen(span: Span, value: unknown): Span {
191
- if (typeof value !== "number" || !Number.isFinite(value)) return span;
192
- if (!span) return [value, value];
193
- if (value < span[0]) span[0] = value;
194
- else if (value > span[1]) span[1] = value;
195
- return span;
196
- }
197
-
198
- /** Which series are measured on an axis. */
199
- function keysOn(source: ZoomFitSource, axisId: string): string[] {
200
- return source.series.filter((entry) => (entry.axis ?? DEFAULT_Y_AXIS) === axisId).map((entry) => entry.key);
201
- }
202
-
203
- /** A row's value as a sample, or 0 for a stack's missing layer — a stacked bar with no
204
- * value for one series draws the rest of the stack from where that one would end. */
205
- const layer = (value: unknown) => (typeof value === "number" && Number.isFinite(value) ? value : 0);
206
-
207
- /**
208
- * The lowest and highest value an axis DRAWS over the rows whose abscissa is inside
209
- * `window` (every row when there is none) — `undefined` when it draws nothing finite.
210
- *
211
- * Stack-aware, and that is why it exists: a stack of three bars reaches the SUM of
212
- * them, and fitting the axis to the tallest single layer (what fitting on values did)
213
- * cuts the top two thirds of every stack off. Positive and negative layers are summed
214
- * apart, as recharts draws them under `stackOffset="sign"` — a month with 900 income
215
- * and −300 expense stacks up to 900 and down to −300, not to 600. A stacked extent
216
- * therefore always contains the zero its layers stand on.
217
- *
218
- * `SeriesChart` fits its axes with this and the zoom refits them with it, so the two
219
- * cannot disagree about how tall a stack is.
220
- */
221
- export function axisExtent(
222
- source: ZoomFitSource,
223
- axisId: string,
224
- window?: readonly [number, number],
225
- ): [number, number] | undefined {
226
- const mine = source.series.filter((entry) => (entry.axis ?? DEFAULT_Y_AXIS) === axisId);
227
- const loose: string[] = [];
228
- const stacks = new Map<string, string[]>();
229
- for (const entry of mine) {
230
- if (entry.stack === undefined || entry.type === "line" || entry.type === undefined) {
231
- loose.push(entry.key);
232
- } else {
233
- stacks.set(entry.stack, [...(stacks.get(entry.stack) ?? []), entry.key]);
234
- }
235
- }
236
- let span: Span;
237
- for (const row of source.rows) {
238
- if (window) {
239
- const at = row[source.xKey];
240
- if (typeof at !== "number" || !(at >= window[0] && at <= window[1])) continue;
241
- }
242
- for (const key of loose) span = widen(span, row[key]);
243
- for (const keys of stacks.values()) {
244
- let up = 0;
245
- let down = 0;
246
- let any = false;
247
- for (const key of keys) {
248
- const value = layer(row[key]);
249
- any ||= typeof row[key] === "number" && Number.isFinite(row[key]);
250
- if (value >= 0) up += value;
251
- else down += value;
252
- }
253
- if (!any) continue;
254
- span = widen(widen(span, down), up);
255
- }
256
- }
257
- return span;
258
- }
259
-
260
- /**
261
- * Each y axis fitted to the samples inside an x window — what a band across x leaves
262
- * the axes nobody dragged showing. Zoom into a tenth of a sweep and a y axis still
263
- * scaled to the whole run draws that tenth as a flat line, which is the one thing the
264
- * zoom was for; so the unnamed axes are refitted, which is what "zoom" means everywhere
265
- * else.
266
- *
267
- * An axis with nothing inside the window is left OUT rather than collapsed: a window
268
- * between two samples is one where the chart should keep drawing the line across.
269
- */
270
- export function fitYToX(source: ZoomFitSource, window: readonly [number, number]): Record<string, [number, number]> {
271
- const fitted: Record<string, [number, number]> = {};
272
- for (const axis of source.axes) {
273
- const span = axisExtent(source, axis.id, window);
274
- if (span) fitted[axis.id] = airy(span[0], span[1]);
275
- }
276
- return fitted;
277
- }
278
-
279
- /**
280
- * The x window that holds every sample inside a set of y windows — the other direction
281
- * of the same idea. A channel crossing its band once gives a tight window; one that
282
- * oscillates through it gives back most of the sweep, which is the truthful answer.
283
- * `undefined` when no sample qualifies, rather than a guess.
284
- */
285
- export function fitXToY(
286
- source: ZoomFitSource,
287
- windows: Readonly<Record<string, readonly [number, number]>>,
288
- ): [number, number] | undefined {
289
- let hits: Span;
290
- for (const [axisId, [low, high]] of Object.entries(windows)) {
291
- for (const key of keysOn(source, axisId)) {
292
- for (const row of source.rows) {
293
- const value = row[key];
294
- if (typeof value === "number" && Number.isFinite(value) && value >= low && value <= high) {
295
- hits = widen(hits, row[source.xKey]);
296
- }
297
- }
298
- }
299
- }
300
- return hits ? airy(hits[0], hits[1]) : undefined;
301
- }
302
-
303
- /**
304
- * What a chart remembers about its zoom: the x window, and the y windows the reader
305
- * DRAGGED. `y: null` means "derive y from x" — the split is the whole design: what was
306
- * dragged is kept, and what follows from it is recomputed on every render, so a band
307
- * across x refits y here and in every chart sharing the window.
308
- */
309
- export interface ZoomState {
310
- x?: [number, number];
311
- y: Record<string, [number, number]> | null;
312
- }
313
-
314
- export const NO_ZOOM: ZoomState = { x: undefined, y: null };
315
-
316
- /**
317
- * The state after a selection. Two band drags COMPOSE rather than the second undoing
318
- * the first: a band down y keeps the x window when the band holds no samples, and
319
- * otherwise pulls x in to where they are.
320
- */
321
- export function zoomAfter(state: ZoomState, selection: ZoomSelection, source: ZoomFitSource): ZoomState {
322
- if (selection.which === "both") return { x: selection.x, y: selection.y };
323
- // Leave y derived, so it fits itself to what is inside the new window.
324
- if (selection.which === "x") return { x: selection.x, y: null };
325
- return { x: fitXToY(source, selection.y) ?? state.x, y: selection.y };
326
- }
327
-
328
- /** The domains a chart draws for a state: the x window as is, and each y axis either
329
- * as dragged or fitted to the x window. `{}` means "fit your own data". */
330
- export function zoomDomains(
331
- state: ZoomState,
332
- source: ZoomFitSource,
333
- ): { xDomain?: [number, number]; yDomains: Record<string, [number, number]> } {
334
- return {
335
- xDomain: state.x,
336
- yDomains: state.y ?? (state.x ? fitYToX(source, state.x) : {}),
337
- };
338
- }
339
-
340
- /* ── The components ─────────────────────────────────────────────────────── */
341
-
342
- /** What the wrapped chart is handed. It applies the domains to its own axes and renders
343
- * `layer` INSIDE the recharts chart, where recharts' hooks answer. */
344
- export interface ZoomBinding {
345
- xDomain?: [number, number];
346
- yDomains: Record<string, [number, number]>;
347
- layer: ReactNode;
348
- }
349
-
350
- /**
351
- * Which axes a chart lets a drag zoom. `"none"` draws no drag layer and no reset.
352
- * A drag on a one-axis chart is always a band along that axis (see {@link zoomAxesFor}).
353
- */
354
- export type ZoomAxesSetting = ZoomAxes | "none";
355
-
356
- /**
357
- * The zoom a chart gets when it does not say, read off what its series ARE.
358
- *
359
- * - Only lines: `"both"` — lenkbank's measurement plots, unchanged.
360
- * - Any area: `"x"`. An area's height is a length from zero, and a y window that cuts
361
- * the baseline off draws a band of 40 as three times one of 20 — so its y axis refits
362
- * to the x window (still from zero), and a drag never names a y range.
363
- * - Any bar: `"none"`. A bar chart is a handful of periods read one bar at a time, and
364
- * in keksdose every one of them is CLICKED — to drill into a payee, a month, a budget
365
- * line — which a drag layer over the plot would swallow. A chart of many bars opts
366
- * back in with `zoomAxes: "x"`; a click then reports the period, not the bar.
367
- */
368
- export function defaultZoomAxes(series: readonly { type?: string }[] | undefined): ZoomAxesSetting {
369
- if (series?.some((entry) => entry.type === "bar")) return "none";
370
- if (series?.some((entry) => entry.type === "area")) return "x";
371
- return "both";
372
- }
373
-
374
- /** The props `withChartZoom` reads off the chart it wraps. */
375
- export interface ZoomTarget {
376
- /** Default: the single axis {@link DEFAULT_Y_AXIS}. */
377
- axes?: readonly { id: string; hide?: boolean }[];
378
- /** The chart's own data, so a band can refit the axis it did not name. Optional: a
379
- * chart with nothing plotted has nothing to fit to. */
380
- rows?: readonly ZoomRow[];
381
- series?: readonly ZoomFitSeries[];
382
- x?: { key?: string };
383
- zoom?: ZoomBinding;
384
- labels?: LabelOverride<SeriesChartLabels>;
385
- /** Which axes a drag may zoom. Default: {@link defaultZoomAxes} of `series`. */
386
- zoomAxes?: ZoomAxesSetting;
387
- }
388
-
389
- const SharedX = createContext<{
390
- window?: [number, number];
391
- set: Dispatch<SetStateAction<[number, number] | undefined>>;
392
- } | null>(null);
393
-
394
- /**
395
- * One x window for several charts.
396
- *
397
- * A column of charts over one abscissa is one picture, and zooming one of them and not
398
- * the rest turns it into several pictures of different things. Every zoomable chart
399
- * inside this shares the x window: any drag in any of them moves all of them.
400
- *
401
- * **Only x.** The y axes stay each chart's own — they are in different units — and
402
- * each refits its own y to what is inside the shared window.
403
- */
404
- export function SharedXZoom({ children }: { children: ReactNode }) {
405
- const [window, set] = useState<[number, number] | undefined>(undefined);
406
- return <SharedX.Provider value={{ window, set }}>{children}</SharedX.Provider>;
407
- }
408
-
409
- /**
410
- * Wrap a chart in drag-to-zoom.
411
- *
412
- * The chart receives a `zoom` binding: it applies `xDomain`/`yDomains` to its axes
413
- * (with `allowDataOverflow`, so recharts clips to the window instead of widening it
414
- * back out) and renders `layer` as a child of its recharts chart. A reset button
415
- * appears over the chart's top end corner while it is zoomed — a real button, so the
416
- * keyboard can undo what the pointer did.
417
- */
418
- export function withChartZoom<P extends ZoomTarget>(Chart: ComponentType<P>) {
419
- function Zoomable(props: P) {
420
- const labels = useKitLabels("seriesChart", DEFAULT_SERIES_CHART_LABELS, props.labels);
421
- const group = useContext(SharedX);
422
- const [ownX, setOwnX] = useState<[number, number] | undefined>(undefined);
423
- const [ownY, setOwnY] = useState<Record<string, [number, number]> | null>(null);
424
- const xWindow = group ? group.window : ownX;
425
- const setXWindow = group ? group.set : setOwnX;
426
- const axes = props.axes ?? [{ id: DEFAULT_Y_AXIS }];
427
- const setting = props.zoomAxes ?? defaultZoomAxes(props.series);
428
- const only = setting === "x" || setting === "y" ? setting : undefined;
429
-
430
- // Every axis, hidden ones included: a hidden axis still scales its lines, and a
431
- // line whose axis did not refit is drawn as a flat streak inside the window.
432
- const source: ZoomFitSource = {
433
- rows: props.rows ?? [],
434
- series: [...(props.series ?? [])],
435
- axes: [...axes],
436
- xKey: props.x?.key ?? "x",
437
- };
438
- const state: ZoomState = { x: xWindow, y: ownY };
439
- const zoomed = xWindow !== undefined || ownY !== null;
440
- // A chart handed no rows or no series draws its empty state, not a plot — and a
441
- // "Reset zoom" floating over "No data" (every line toggled off while zoomed) offers
442
- // to undo something the reader cannot see. The zoom itself is KEPT: it is where they
443
- // were looking, and it applies again the moment a line comes back. Only an array
444
- // that is there and empty counts; a chart that does not pass its data is not known
445
- // to be empty.
446
- const empty = props.rows?.length === 0 || props.series?.length === 0;
447
-
448
- const clear = () => {
449
- setXWindow(undefined);
450
- setOwnY(null);
451
- };
452
-
453
- // Switched off, the chart still gets a binding — with no window and no layer — so a
454
- // chart whose series change type mid-life is not remounted by a different tree.
455
- if (setting === "none") {
456
- return (
457
- <div className="relative">
458
- <Chart {...props} zoom={{ yDomains: {}, layer: null }} />
459
- </div>
460
- );
461
- }
462
-
463
- const binding: ZoomBinding = {
464
- ...zoomDomains(state, source),
465
- layer: (
466
- <ZoomLayer
467
- axisIds={axes.map((axis) => axis.id)}
468
- only={only}
469
- onZoom={(selection) => {
470
- const next = zoomAfter(state, selection, source);
471
- if (next.x !== xWindow) setXWindow(next.x);
472
- setOwnY(next.y);
473
- }}
474
- onReset={clear}
475
- />
476
- ),
477
- };
478
-
479
- return (
480
- <div className="relative">
481
- <Chart {...props} zoom={binding} />
482
- {zoomed && !empty && (
483
- <button
484
- type="button"
485
- onClick={clear}
486
- className={cn(
487
- "absolute end-1 top-1 z-10 inline-flex items-center gap-1 rounded border border-subtle bg-surface/90 px-1.5 py-0.5 text-micro text-muted backdrop-blur transition-colors hover:text-primary",
488
- FOCUS_RING,
489
- )}
490
- >
491
- <X aria-hidden className="size-3" /> {labels.resetZoom}
492
- </button>
493
- )}
494
- </div>
495
- );
496
- }
497
- Zoomable.displayName = `withChartZoom(${Chart.displayName ?? Chart.name ?? "Chart"})`;
498
- return Zoomable;
499
- }
500
-
501
- /**
502
- * The part that lives INSIDE the recharts chart, where recharts will say where the plot
503
- * is and what value a pixel is.
504
- *
505
- * A transparent rectangle over the plot area that reads the drag. It does NOT stop the
506
- * event: recharts drives its tooltip from the same pointer move bubbling up to its own
507
- * wrapper, so swallowing it here would trade the tooltip for the zoom.
508
- *
509
- * Nothing to assistive technology (0.52, refactor audit 2026-10-30, DSP-5): it was a
510
- * `role="application"` named by the drag hint, which could not take focus — the one name
511
- * on an otherwise unnamed chart. The hint is in the chart's description now
512
- * (`SeriesChart`'s figure), and `data-zoom-surface` is how a test finds the rect.
513
- */
514
- function ZoomLayer({
515
- axisIds,
516
- only,
517
- onZoom,
518
- onReset,
519
- }: {
520
- axisIds: string[];
521
- only?: "x" | "y";
522
- onZoom: (selection: ZoomSelection) => void;
523
- onReset: () => void;
524
- }) {
525
- const plot = usePlotArea();
526
- const xInverse = useXAxisInverseScale();
527
- // One probe COMPONENT per axis rather than a hook in a loop: the number of axes
528
- // changes as series are toggled, and a hook count that changes with the data is the
529
- // one thing React will not forgive.
530
- const [scales] = useState(() => new Map<string, InverseScaleFunction | undefined>());
531
- const [drag, setDrag] = useState<ZoomDrag | null>(null);
532
- // A finished drag is followed by a click on the same element, and a chart with an
533
- // `onClick` (keksdose opens a drilldown on one) would read the zoom as a pick.
534
- const draggedRef = useRef(false);
535
-
536
- if (!plot || plot.width <= 0 || plot.height <= 0) return null;
537
-
538
- const at = (event: { clientX: number; clientY: number; currentTarget: Element }) => {
539
- // Against the overlay's own screen box, so padding around the container cannot
540
- // shift every reading — plus the plot's offset, because the scales are in the
541
- // chart's coordinates rather than the plot's.
542
- const box = event.currentTarget.getBoundingClientRect();
543
- return { x: event.clientX - box.left + plot.x, y: event.clientY - box.top + plot.y };
544
- };
545
-
546
- const finish = () => {
547
- if (!drag) return;
548
- setDrag(null);
549
- const selection = selectionFromDrag(drag, plot, xInverse, (id) => scales.get(id), axisIds, only);
550
- draggedRef.current = selection !== null;
551
- if (selection) onZoom(selection);
552
- };
553
-
554
- // What the drag would do, shown while it is being made: a band paints the full width
555
- // or height, so the reader sees it is about to let the other axis refit.
556
- const which = drag
557
- ? zoomAxesFor(drag.toX - drag.fromX, drag.toY - drag.fromY, plot.width, plot.height, ZOOM_SQUARE_ENOUGH, only)
558
- : null;
559
-
560
- return (
561
- <g>
562
- {axisIds.map((id) => (
563
- <AxisProbe key={id} axisId={id} scales={scales} />
564
- ))}
565
- {drag && which && (
566
- <rect
567
- x={which === "y" ? plot.x : Math.min(drag.fromX, drag.toX)}
568
- y={which === "x" ? plot.y : Math.min(drag.fromY, drag.toY)}
569
- width={which === "y" ? plot.width : Math.abs(drag.toX - drag.fromX)}
570
- height={which === "x" ? plot.height : Math.abs(drag.toY - drag.fromY)}
571
- className="fill-[var(--brand)]/15 stroke-[var(--brand)]"
572
- strokeDasharray="4 3"
573
- pointerEvents="none"
574
- />
575
- )}
576
- <rect
577
- x={plot.x}
578
- y={plot.y}
579
- width={plot.width}
580
- height={plot.height}
581
- // `transparent`, not `none`: an unpainted shape takes no pointer events.
582
- fill="transparent"
583
- data-zoom-surface=""
584
- style={{ cursor: "crosshair" }}
585
- onPointerDown={(event) => {
586
- if (event.button !== 0) return;
587
- draggedRef.current = false;
588
- const point = at(event);
589
- // Best effort: capture keeps a drag alive past the plot's edge, but a
590
- // pointer id the environment does not know throws — jsdom refuses them all —
591
- // and a zoom that threw on pointer-down would be a chart nobody could click.
592
- try {
593
- event.currentTarget.setPointerCapture(event.pointerId);
594
- } catch {
595
- /* the drag still works; it just stops at the edge of the plot */
596
- }
597
- setDrag({ fromX: point.x, fromY: point.y, toX: point.x, toY: point.y });
598
- }}
599
- onPointerMove={(event) => {
600
- if (!drag) return;
601
- const point = at(event);
602
- setDrag({ ...drag, toX: point.x, toY: point.y });
603
- }}
604
- onPointerUp={finish}
605
- onPointerCancel={() => setDrag(null)}
606
- onClick={(event) => {
607
- if (!draggedRef.current) return;
608
- draggedRef.current = false;
609
- event.stopPropagation();
610
- }}
611
- onDoubleClick={onReset}
612
- />
613
- </g>
614
- );
615
- }
616
-
617
- /** One axis's pixel→value function, parked where the pointer handler can reach it. */
618
- function AxisProbe({ axisId, scales }: { axisId: string; scales: Map<string, InverseScaleFunction | undefined> }) {
619
- const inverse = useYAxisInverseScale(axisId);
620
- useEffect(() => {
621
- scales.set(axisId, inverse);
622
- return () => {
623
- scales.delete(axisId);
624
- };
625
- }, [axisId, inverse, scales]);
626
- return null;
627
- }
@@ -1,22 +0,0 @@
1
- // Drag-to-zoom for cartesian charts — the public face of ./chart-zoom-core, which holds
2
- // the HOC, the shared x window and the arithmetic (its header says how a drag picks its
3
- // axes). `SeriesChart` is how an app zooms; `SharedXZoom` gives a column of charts one x
4
- // window.
5
- //
6
- // Those two and the zoom's types are all that is public. The arithmetic and the HOC were
7
- // too until 0.35 (refactor audit 2026-10, API-6b = MOD-10; deprecated in 0.34): exported
8
- // because lenkbank's, later Kurvenschmiede's, own tests used them, and named by no file in
9
- // any of the three apps since. The kit's own modules import them from the core.
10
- export { SharedXZoom } from "./chart-zoom-core";
11
- export type {
12
- ZoomAxes,
13
- ZoomAxesSetting,
14
- ZoomBinding,
15
- ZoomDrag,
16
- ZoomFitSeries,
17
- ZoomFitSource,
18
- ZoomRow,
19
- ZoomSelection,
20
- ZoomState,
21
- ZoomTarget,
22
- } from "./chart-zoom-core";