@eifi1/ui-kit 0.54.0 → 0.56.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 +6 -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 +7 -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 +83 -0
  113. package/dist/components/legended-series-chart.js +77 -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 +9 -12
  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,828 +0,0 @@
1
- import { useCallback, useEffect, useId, useLayoutEffect, useRef, useState } from "react";
2
- import { createPortal } from "react-dom";
3
- import type {
4
- AnchorHTMLAttributes,
5
- ButtonHTMLAttributes,
6
- CSSProperties,
7
- HTMLAttributes,
8
- KeyboardEvent,
9
- MouseEvent,
10
- ReactElement,
11
- ReactNode,
12
- Ref,
13
- } from "react";
14
- import { X } from "lucide-react";
15
-
16
- import { cn } from "../lib/cn";
17
- import { FOCUS_RING } from "./focus-ring";
18
- import { dirOf, type Direction } from "../lib/direction";
19
- import { registerFloating } from "../lib/floating-stack";
20
- import { useFloatClearance } from "../lib/float-clearance";
21
- import { isComposing } from "../lib/ime";
22
- import { takeEscape, useOverlayOpen } from "../hooks/use-dismiss";
23
- import { useKitLabels, useKitLink } from "../i18n/kit-labels";
24
- import { assignRef } from "./field-parts";
25
- import { pickLinkRenderer } from "./text-link";
26
- import { Tooltip, type TooltipSide } from "./tooltip";
27
- import { DEFAULT_FLOATING_PANEL_LABELS } from "./floating-panel-labels";
28
-
29
- export interface FloatingPanelLabels {
30
- /** Accessible name of the panel header's X. */
31
- close: string;
32
- /**
33
- * What a {@link FloatingAction}'s count badge adds to its accessible name ("3 new"),
34
- * read after the label: "Invoices, 3 new". The dot itself is hidden from a reader —
35
- * a bare "3" read out of context says nothing about what is counted.
36
- */
37
- badge: (count: number) => string;
38
- }
39
-
40
- // Defined in ./floating-panel-labels, which holds no component code (0.34, KS U8).
41
- export { DEFAULT_FLOATING_PANEL_LABELS };
42
-
43
- /** A LOGICAL corner: `bottom-end` is bottom-right in LTR and bottom-left in RTL. */
44
- export type FloatingCorner = "bottom-end" | "bottom-start";
45
-
46
- /**
47
- * How far off the bottom edge anything floating here sits: clear of `AppShell`'s phone
48
- * nav (`--app-nav-h`, `0px` above `md` where the nav is not rendered) and of the home
49
- * indicator, whichever reaches higher — the nav does not pad itself for the inset, so
50
- * with no nav on screen the inset is all there is to clear. `max`, not a sum: where the
51
- * nav does cover the inset, adding both would float the button a nav-height too high.
52
- */
53
- const BOTTOM_CLEARANCE = "max(var(--app-nav-h, 0px), env(safe-area-inset-bottom, 0px))";
54
- /** The side gutter, widened for a landscape notch. Both insets, because a logical
55
- * side has no one physical inset to name. */
56
- const SIDE_GUTTER = "max(1rem, env(safe-area-inset-left, 0px), env(safe-area-inset-right, 0px))";
57
-
58
- function cornerStyle(corner: FloatingCorner, lift: string): CSSProperties {
59
- return {
60
- bottom: `calc(${BOTTOM_CLEARANCE} + ${lift})`,
61
- // Logical properties, so the corner follows the reading direction with no JS. The
62
- // portal carries the `dir` across (see `usePortalDir`).
63
- [corner === "bottom-start" ? "insetInlineStart" : "insetInlineEnd"]: SIDE_GUTTER,
64
- };
65
- }
66
-
67
- /**
68
- * The reading direction where the component was RENDERED, for its portalled root: a
69
- * portal to `<body>` leaves the subtree whose `dir` it inherited, and a logical
70
- * `inset-inline-end` resolves against the portal's own direction. Read off a hidden
71
- * inline marker in a layout effect, so the first painted frame already has it.
72
- */
73
- function usePortalDir(): [Ref<HTMLSpanElement>, Direction | undefined] {
74
- const marker = useRef<HTMLSpanElement>(null);
75
- const [dir, setDir] = useState<Direction | undefined>(undefined);
76
- useLayoutEffect(() => {
77
- setDir(dirOf(marker.current));
78
- }, []);
79
- return [marker, dir];
80
- }
81
-
82
- export interface FloatingActionButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children"> {
83
- /** The accessible name — the button shows only its icon. */
84
- label: string;
85
- icon: ReactNode;
86
- /** Default `bottom-end`. */
87
- corner?: FloatingCorner;
88
- /**
89
- * Distance above the nav / home indicator, as a CSS length. Default `1rem`. Raise it
90
- * to stack above another floating control in the same corner — keksdose's assistant
91
- * clears the transactions page's own action group this way (`calc(1rem + 4rem)`).
92
- */
93
- offset?: string;
94
- /**
95
- * Whether the button carries the browser's own tooltip (`title`, the `label` unless a
96
- * `title` is passed). Default `true`, so an icon-only button keeps a hover hint for a
97
- * mouse user with no other way to learn what it is. `false` renders no `title` at all:
98
- * keksdose has ONE tooltip, the kit's `Tooltip` (dev#523), and its source scan fails a
99
- * native `title=` anywhere — so a flag, not `title=""`, which the scan would still
100
- * see. An empty `title` renders no attribute either, for the caller who has no scan.
101
- *
102
- * Not flipped to off by default: a FAB wrapped in nothing would lose the only hover
103
- * hint it has, silently, in every app already on it. And the kit cannot wrap itself
104
- * in its `Tooltip` — the bubble's anchor is a `relative inline-flex` span, and the
105
- * button is `fixed` and portalled — so the one-tooltip caller wraps it.
106
- */
107
- nativeTitle?: boolean;
108
- /**
109
- * Make it a toggle. `true`/`false` set `aria-pressed` and swap the solid brand disc for
110
- * a surface disc — the glyph in brand on the quiet brand fill when on, the secondary
111
- * text colour when off — the "on" look of `IconButton`'s `pressed` and of a selected
112
- * Chip. Left out, it is the ordinary action FAB. For keksdose's corner filter toggles
113
- * (feedback-page's "awaiting only", the /transactions pending and upcoming toggles),
114
- * which paint `text-[var(--brand)]` on a surface button by hand. Keep `label` the same
115
- * in both states; `aria-pressed` already says which one it is in.
116
- */
117
- pressed?: boolean;
118
- /**
119
- * Show `label` beside the icon: the EXTENDED FAB, a pill rather than a disc. For a
120
- * corner control whose words are the point — kastlan's offline indicator
121
- * (shared/offline/offline-indicator.tsx:39) is a pill saying "Offline — 2 photo(s)
122
- * queued" / "Syncing…", hand-placed at `fixed bottom-4 left-4`, i.e. over the
123
- * bottom nav and on the wrong side in RTL. Same height as the disc (3rem), so a
124
- * {@link FloatingPanel} card above it still clears it.
125
- */
126
- extended?: boolean;
127
- /**
128
- * Announce `label` whenever it changes, through a polite `role="status"` region — for
129
- * an extended FAB that REPORTS something (kastlan's offline/sync state), where a
130
- * sighted user sees the words change and a screen reader user otherwise hears
131
- * nothing until they happen to land on the button.
132
- *
133
- * ⚠️ A live region announces changes, not its own arrival: a FAB that mounts already
134
- * saying "Offline" says it to nobody. Keep it mounted and pass `hidden` while there
135
- * is nothing to report (kastlan returns `null` when online and idle); the region
136
- * stays in the page, and the first real status is heard.
137
- */
138
- live?: boolean;
139
- /**
140
- * `accent` (default): the solid brand disc of a page's main action, as Button's
141
- * `accent`. `surface`: the page's surface with a hairline border — for a FAB that is a
142
- * status rather than a call to action, as kastlan's offline pill is (a brand pill would
143
- * shout "press me" at a user who is merely offline). Ignored while `pressed` is set; a
144
- * toggle has its own two looks.
145
- */
146
- variant?: "accent" | "surface";
147
- /**
148
- * Hover and focus label in the kit {@link Tooltip}, instead of the native `title` —
149
- * keksdose has ONE tooltip (dev#523) and wrapped its assistant launcher by hand,
150
- * which cannot work: the tooltip's anchor is a `relative inline-flex` span, and this
151
- * button is `fixed` and portalled. With `tooltip` the FAB positions a fixed wrapper
152
- * instead and the button sits in the tooltip inside it. `true` shows the `label`;
153
- * any other content shows that. Implies no native `title` (whatever `nativeTitle`
154
- * says): one hover hint, not two. `style` stays on the button; the corner and
155
- * `offset` move to the wrapper.
156
- */
157
- tooltip?: ReactNode;
158
- /** Where the {@link tooltip} opens. Default `top`; the bubble is portalled and kept on
159
- * screen, so a corner button's label is not pushed off the edge. */
160
- tooltipSide?: TooltipSide;
161
- /**
162
- * 0.49 KIT-11: step aside (as `hidden` does: off screen, the room kept) while a dialog,
163
- * a sheet, a popover, a hover menu or a list is open, instead of floating over it or
164
- * beside it. Default `true`; `false` keeps it on screen. A tooltip does not count.
165
- */
166
- hideWhenOverlay?: boolean;
167
- ref?: Ref<HTMLButtonElement>;
168
- }
169
-
170
- /**
171
- * A round, icon-only button pinned to a corner of the viewport — the trigger of a
172
- * {@link FloatingPanel}, and usable alone for a page's one primary action.
173
- *
174
- * keksdose hand-placed each of its floating controls: the assistant launcher at
175
- * `fixed bottom-36 right-4 md:bottom-6`, the feedback page's and the transactions
176
- * page's action groups at `right-4 bottom-20`. Every one of those numbers is a guess
177
- * at the phone nav's height plus whatever else floats there (Keksdose live #314 found
178
- * out what such a guess is worth for a footer), `right` rather than `end` puts it over
179
- * the page's leading edge in RTL, and none allows for the home indicator. Here the
180
- * base is `--app-nav-h` and the safe-area inset, the corner is logical, and
181
- * {@link FloatingActionButtonProps.offset} is the one number left to the caller — the
182
- * height of whatever else it has to clear, not the nav's.
183
- *
184
- * Portalled, because `position: fixed` inside any transformed ancestor (an animated
185
- * page transition) is fixed to that ancestor, not to the screen.
186
- *
187
- * While mounted it reports its box (`lib/floating-stack.ts`), so `ServerWakeNotice`
188
- * stacks above it rather than over it.
189
- *
190
- * 0.48: while mounted, `hidden` or not, it also publishes the room it takes above the
191
- * nav (`offset` + 3rem + a 0.5rem gap) as `--app-float-clearance` on `<html>` (the
192
- * largest of several wins), and `AppShell` pads its `<main>` past it on a phone, so the
193
- * page's last row no longer ends under the button (keksdose dev#612).
194
- */
195
- export function FloatingActionButton({
196
- label,
197
- icon,
198
- corner = "bottom-end",
199
- offset = "1rem",
200
- nativeTitle = true,
201
- pressed,
202
- extended = false,
203
- live = false,
204
- variant = "accent",
205
- tooltip,
206
- tooltipSide = "top",
207
- hideWhenOverlay = true,
208
- className,
209
- style,
210
- type = "button",
211
- title,
212
- hidden: hiddenProp,
213
- ref,
214
- ...rest
215
- }: FloatingActionButtonProps) {
216
- const overlay = useOverlayOpen(hideWhenOverlay);
217
- const hidden = hiddenProp || overlay || undefined;
218
- const [marker, dir] = usePortalDir();
219
- const toggle = pressed !== undefined;
220
- const tip = tooltip === true ? label : tooltip === false || tooltip === "" ? undefined : tooltip;
221
- const wrapped = tip !== undefined && tip !== null;
222
- // The fixed element — the button, or the wrapper when there is a tooltip.
223
- const [fixed, setFixed] = useState<HTMLElement | null>(null);
224
- useEffect(() => (fixed ? registerFloating(fixed) : undefined), [fixed]);
225
- // The room it takes above the nav, for AppShell's <main> to pad past (keksdose
226
- // dev#612). Hidden too: the room is the launcher's while it is mounted, so the page
227
- // does not change length under the reader as it hides and shows.
228
- useFloatClearance(offset);
229
- const buttonRef = useCallback(
230
- (node: HTMLButtonElement | null) => {
231
- assignRef(ref, node);
232
- if (!wrapped) setFixed(node);
233
- },
234
- [ref, wrapped],
235
- );
236
- // An empty title is "no tooltip", not an attribute with nothing in it. The kit
237
- // tooltip replaces it outright.
238
- const nativeTip = !wrapped && nativeTitle && title !== "" ? (title ?? label) : undefined;
239
- const button = (
240
- <button
241
- {...rest}
242
- hidden={wrapped ? undefined : hidden}
243
- ref={buttonRef}
244
- type={type}
245
- dir={dir}
246
- aria-label={label}
247
- aria-pressed={pressed ?? rest["aria-pressed"]}
248
- title={nativeTip}
249
- style={wrapped ? style : { ...cornerStyle(corner, offset), ...style }}
250
- className={cn(
251
- // Wrapped, the wrapper is the fixed thing and the button sits in it.
252
- !wrapped && "fixed z-40",
253
- "inline-flex items-center justify-center rounded-full",
254
- extended ? "h-12 gap-2 px-4 text-sm font-medium [&_svg]:size-5" : "size-12 [&_svg]:size-6",
255
- "shadow-lg transition-colors disabled:cursor-default",
256
- !toggle && variant === "accent" && "bg-brand text-brand-contrast hover:bg-brand-hover",
257
- !toggle &&
258
- variant === "surface" &&
259
- "border border-subtle bg-surface text-primary hover:bg-hover disabled:hover:bg-surface",
260
- // A toggle sits on the page's surface — a solid brand disc would read as
261
- // "on" in both states — and says "on" in the brand family.
262
- toggle && "border border-subtle",
263
- pressed === false && "bg-surface text-secondary hover:bg-hover hover:text-primary",
264
- pressed === true && "border-brand bg-brand-soft text-brand hover:bg-brand-soft-hover hover:text-brand-muted",
265
- "outline-none focus-visible:ring-offset-2",
266
- FOCUS_RING,
267
- className,
268
- )}
269
- >
270
- {icon}
271
- {/* Visible words, not the name: `aria-label` already is the name, and the
272
- span would only repeat it. */}
273
- {extended && (
274
- <span aria-hidden className="whitespace-nowrap">
275
- {label}
276
- </span>
277
- )}
278
- </button>
279
- );
280
- return (
281
- <>
282
- <span ref={marker} hidden />
283
- {typeof document !== "undefined" &&
284
- createPortal(
285
- <>
286
- {wrapped ? (
287
- <div
288
- ref={setFixed}
289
- dir={dir}
290
- hidden={hidden}
291
- style={cornerStyle(corner, offset)}
292
- className="fixed z-40 inline-flex"
293
- >
294
- <Tooltip label={tip} side={tooltipSide} portal>
295
- {/* A fragment when the bubble says the name again, so the tooltip
296
- does not describe the button with its own label — a reader would
297
- hear it twice. Other text is a real description. */}
298
- {tip === label ? <>{button}</> : button}
299
- </Tooltip>
300
- </div>
301
- ) : (
302
- button
303
- )}
304
- {live && (
305
- <span role="status" className="sr-only">
306
- {label}
307
- </span>
308
- )}
309
- </>,
310
- document.body,
311
- )}
312
- </>
313
- );
314
- }
315
-
316
- export interface FloatingPanelProps {
317
- /** The panel's heading, and its accessible name. */
318
- title: ReactNode;
319
- /** The trigger's accessible name ("Assistant", "Send feedback"). */
320
- fabLabel: string;
321
- fabIcon: ReactNode;
322
- /** Controlled open state. Leave it out to let the panel own it. */
323
- open?: boolean;
324
- /** Uncontrolled initial state. Default closed. */
325
- defaultOpen?: boolean;
326
- /** Every request to open or close — the FAB, the X, Escape. */
327
- onOpenChange?: (open: boolean) => void;
328
- /** Default `bottom-end`. */
329
- corner?: FloatingCorner;
330
- /** The FAB's distance above the nav — see {@link FloatingActionButtonProps.offset}.
331
- * From `md` up the card sits above the FAB, so it moves with it. */
332
- offset?: string;
333
- /** The FAB's native `title` — see {@link FloatingActionButtonProps.nativeTitle}.
334
- * `false` for keksdose's assistant launcher, under its one-tooltip rule (dev#523). */
335
- fabNativeTitle?: boolean;
336
- /** The FAB's kit tooltip — see {@link FloatingActionButtonProps.tooltip}. `true` for
337
- * keksdose's assistant launcher, which wanted the kit bubble and had no way to
338
- * put one on a fixed, portalled button (dev#523). */
339
- fabTooltip?: ReactNode;
340
- /** Default: `floatingPanel.close` from the {@link UiKitProvider}, else "Close". */
341
- closeLabel?: string;
342
- /**
343
- * Where focus goes on open. Default the panel itself, so a phone's keyboard does not
344
- * rise over the sheet before the user has asked to type; pass the chat field for a
345
- * panel whose one job is typing.
346
- */
347
- initialFocus?: () => HTMLElement | null;
348
- /** Extra classes for the panel. */
349
- className?: string;
350
- /** Extra classes for the scrolling body. */
351
- bodyClassName?: string;
352
- /**
353
- * 0.48: take the FAB and the panel off screen while keeping both mounted — the open
354
- * state and the bottom room (`--app-float-clearance`) stay, and an open panel is back
355
- * when this turns `false`. keksdose's assistant launcher steps aside while an editor
356
- * or a modal covers its corner (dev#612); unmounting it instead would give the room
357
- * back and shorten the page under the reader's thumb.
358
- */
359
- hidden?: boolean;
360
- /**
361
- * 0.49 KIT-11: the FAB steps aside while a dialog, a sheet, a popover, a hover menu or
362
- * a list is open elsewhere (see {@link FloatingActionButtonProps.hideWhenOverlay}).
363
- * Default `true`. An OPEN panel stays: what opens from inside it (a select, a date
364
- * picker) is its own content.
365
- */
366
- hideWhenOverlay?: boolean;
367
- children: ReactNode;
368
- }
369
-
370
- /**
371
- * A docked, NON-MODAL panel in a corner of the screen, opened by a
372
- * {@link FloatingActionButton} — keksdose's assistant launcher and its feedback page,
373
- * which each built one.
374
- *
375
- * ## Not a Modal
376
- *
377
- * The page stays usable while it is open: that is the point of an assistant beside the
378
- * data it is asked about. So there is no backdrop, no scroll lock, no `aria-modal` and
379
- * no focus trap — Tab walks out of the panel into the page and back, and a click on the
380
- * page does not close it. It is `role="dialog"` without `aria-modal`, which is what
381
- * ARIA calls a non-modal dialog, named by its heading.
382
- *
383
- * What it keeps from a dialog is the focus HANDOFF: opening moves focus into it (a
384
- * keyboard user who pressed the FAB should not have to hunt for what appeared), and
385
- * closing gives it back to the FAB — but only when focus was in the panel, so a panel
386
- * closed from the page (a controlled owner) never pulls focus out of the field the
387
- * user is typing in. Escape closes it while focus is inside, and only then: on the
388
- * panel element, not the document, so Escape in the page keeps meaning whatever the
389
- * page means by it. A layer of the kit's Escape stack open over it — a tooltip, a list —
390
- * is handed the key first.
391
- *
392
- * ## Layout
393
- *
394
- * From `md` up, a card above the FAB in its corner. Below `md`, a full-width sheet
395
- * docked to the bottom, sitting ON the `AppShell` bottom nav (`--app-nav-h`) and
396
- * clear of the home indicator. Pure CSS — no width is measured in JavaScript.
397
- *
398
- * The FAB carries `aria-expanded` and, while the panel exists, `aria-controls`. The
399
- * panel unmounts when closed; an app that must keep a draft across a close keeps it in
400
- * its own state, where it also survives a reload.
401
- */
402
- export function FloatingPanel({
403
- title,
404
- fabLabel,
405
- fabIcon,
406
- open: openProp,
407
- defaultOpen = false,
408
- onOpenChange,
409
- corner = "bottom-end",
410
- offset = "1rem",
411
- fabNativeTitle,
412
- fabTooltip,
413
- closeLabel,
414
- initialFocus,
415
- className,
416
- bodyClassName,
417
- hidden: hiddenProp = false,
418
- hideWhenOverlay = true,
419
- children,
420
- }: FloatingPanelProps) {
421
- const labels = useKitLabels(
422
- "floatingPanel",
423
- DEFAULT_FLOATING_PANEL_LABELS,
424
- closeLabel === undefined ? undefined : { close: closeLabel },
425
- );
426
- const [ownOpen, setOwnOpen] = useState(defaultOpen);
427
- const open = openProp ?? ownOpen;
428
- const overlay = useOverlayOpen(hideWhenOverlay && !open);
429
- const hidden = hiddenProp || overlay;
430
- const setOpen = (next: boolean) => {
431
- if (openProp === undefined) setOwnOpen(next);
432
- onOpenChange?.(next);
433
- };
434
-
435
- const uid = useId();
436
- const panelId = `${uid}-panel`;
437
- const titleId = `${uid}-title`;
438
- const fabRef = useRef<HTMLButtonElement>(null);
439
- const panelRef = useRef<HTMLDivElement>(null);
440
- const [marker, dir] = usePortalDir();
441
-
442
- const initialFocusRef = useRef(initialFocus);
443
- useEffect(() => {
444
- initialFocusRef.current = initialFocus;
445
- });
446
-
447
- // Focus follows the open/closed TRANSITION, never the mount: a panel that renders
448
- // open (`defaultOpen`, a restored route) does not take the page's focus by existing.
449
- const wasOpen = useRef(open);
450
- // Whether focus was inside the panel when it last changed — read at close time, when
451
- // the panel (and whatever had focus in it) is already gone.
452
- const focusInside = useRef(false);
453
- useEffect(() => {
454
- const changed = wasOpen.current !== open;
455
- wasOpen.current = open;
456
- if (!changed) return;
457
- if (open) {
458
- (initialFocusRef.current?.() ?? panelRef.current)?.focus();
459
- return;
460
- }
461
- const active = document.activeElement;
462
- const lost = active === null || active === document.body;
463
- if (focusInside.current || lost) fabRef.current?.focus();
464
- focusInside.current = false;
465
- }, [open]);
466
-
467
- const onPanelKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {
468
- if (e.key !== "Escape") return;
469
- // The kit's one Escape stack first (round 0.34 Wave 2, DUP-1): a layer open above the
470
- // panel without focus — a tooltip, the numpad, a hover menu — is the topmost thing on
471
- // screen and is handed the key. This took it for itself and stopped it, so the
472
- // tooltip never heard it and one press closed the whole panel instead.
473
- if (takeEscape(e)) return;
474
- // Not a layer itself: it answers only while focus is inside it, and a layer would
475
- // also be handed an Escape pressed in the page. Kept by a child's claim (ChipInput
476
- // clearing its draft, `claimEscape`), and by an IME composition, as a layer is.
477
- if (e.defaultPrevented || isComposing(e)) return;
478
- // Stopped here, so an overlay underneath with a document-level Escape listener does
479
- // not close too — the innermost thing that has focus is the one that closes.
480
- e.stopPropagation();
481
- focusInside.current = true;
482
- setOpen(false);
483
- };
484
-
485
- return (
486
- <>
487
- <span ref={marker} hidden />
488
- <FloatingActionButton
489
- ref={fabRef}
490
- label={fabLabel}
491
- icon={fabIcon}
492
- corner={corner}
493
- offset={offset}
494
- nativeTitle={fabNativeTitle}
495
- tooltip={fabTooltip}
496
- hidden={hidden || undefined}
497
- hideWhenOverlay={false}
498
- aria-expanded={open}
499
- aria-controls={open && !hidden ? panelId : undefined}
500
- onClick={() => {
501
- // A press ON the FAB closing the panel: the FAB keeps focus by being clicked,
502
- // nothing to hand back.
503
- focusInside.current = false;
504
- setOpen(!open);
505
- }}
506
- />
507
- {open &&
508
- !hidden &&
509
- typeof document !== "undefined" &&
510
- createPortal(
511
- // A container for Escape bubbling up from anything inside it, as a dialog is.
512
- // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
513
- <div
514
- ref={panelRef}
515
- id={panelId}
516
- role="dialog"
517
- aria-labelledby={titleId}
518
- tabIndex={-1}
519
- dir={dir}
520
- data-corner={corner}
521
- onKeyDown={onPanelKeyDown}
522
- onFocus={() => {
523
- focusInside.current = true;
524
- }}
525
- onBlur={(e) => {
526
- if (!e.currentTarget.contains(e.relatedTarget as Node | null)) focusInside.current = false;
527
- }}
528
- // The phone's sheet sits on the nav; from `md` up the card floats above the
529
- // FAB (its offset + the 3rem button + a 0.75rem gap).
530
- style={
531
- {
532
- "--fp-bottom": `calc(${BOTTOM_CLEARANCE})`,
533
- "--fp-bottom-md": `calc(${BOTTOM_CLEARANCE} + ${offset} + 3.75rem)`,
534
- "--fp-side": SIDE_GUTTER,
535
- } as CSSProperties
536
- }
537
- className={cn(
538
- "animate-sheet fixed z-40 flex flex-col overflow-hidden outline-none",
539
- "border border-subtle bg-surface shadow-2xl",
540
- // Phone: full width, docked, rounded only where it meets the page.
541
- "inset-x-0 bottom-[var(--fp-bottom)] max-h-[min(85dvh,calc(100dvh_-_var(--fp-bottom)_-_1rem))] rounded-t-xl border-x-0 border-b-0",
542
- "pb-[env(safe-area-inset-bottom,0px)] md:pb-0",
543
- // md+: a card in the corner, above the FAB.
544
- "md:inset-x-auto md:bottom-[var(--fp-bottom-md)] md:w-[24rem] md:max-h-[min(36rem,calc(100dvh_-_var(--fp-bottom-md)_-_1rem))] md:rounded-xl md:border",
545
- corner === "bottom-start" ? "md:start-[var(--fp-side)]" : "md:end-[var(--fp-side)]",
546
- className,
547
- )}
548
- >
549
- <div className="flex shrink-0 items-center justify-between gap-2 border-b border-subtle px-4 py-3">
550
- <h2 id={titleId} className="min-w-0 truncate text-base font-semibold text-primary">
551
- {title}
552
- </h2>
553
- <button
554
- type="button"
555
- onClick={() => {
556
- focusInside.current = true;
557
- setOpen(false);
558
- }}
559
- aria-label={labels.close}
560
- className={cn(
561
- "-me-1.5 shrink-0 rounded p-1.5 text-muted outline-none hover:bg-hover hover:text-secondary",
562
- FOCUS_RING,
563
- )}
564
- >
565
- <X aria-hidden className="size-5" />
566
- </button>
567
- </div>
568
- <div className={cn("min-h-0 flex-1 overflow-y-auto overscroll-contain p-4", bodyClassName)}>{children}</div>
569
- </div>,
570
- document.body,
571
- )}
572
- </>
573
- );
574
- }
575
-
576
- export interface FloatingActionGroupProps extends Omit<HTMLAttributes<HTMLDivElement>, "role"> {
577
- /** Name the group ("Register actions"); a reader then introduces the members as one
578
- * set. A group with no name is one more unlabelled wrapper. */
579
- "aria-label"?: string;
580
- /** Default `bottom-end`. */
581
- corner?: FloatingCorner;
582
- /** Distance above the nav / home indicator — see {@link FloatingActionButtonProps.offset}. */
583
- offset?: string;
584
- /** {@link FloatingAction}s, in reading order. */
585
- children: ReactNode;
586
- /** 0.49 KIT-11: step aside while a dialog, a sheet, a popover, a hover menu or a list
587
- * is open — see {@link FloatingActionButtonProps.hideWhenOverlay}. Default `true`. */
588
- hideWhenOverlay?: boolean;
589
- ref?: Ref<HTMLDivElement>;
590
- }
591
-
592
- /**
593
- * A floating pill of {@link FloatingAction}s — one to four `size-12` toggles, actions
594
- * or links with hairline dividers — pinned to a corner exactly as the
595
- * {@link FloatingActionButton} is: `--app-nav-h` and the home indicator cleared, a
596
- * logical corner, portalled.
597
- *
598
- * keksdose built it twice by hand: the /transactions phone toolbar
599
- * (transactions-page.tsx:644 — upcoming and pending toggles, an invoices link with a
600
- * pending count, and the brand "+") and the feedback page's "awaiting only" toggle
601
- * (feedback-page.tsx:854, one button in the group anyway, so the two pages look
602
- * alike). Both at `right-4 bottom-20` — `right`, not `end`, so over the page's leading
603
- * edge in RTL — with `divide-x`, slate hovers, and each member's `Tooltip` spelled out.
604
- *
605
- * `role="group"`, NOT a toolbar: every member keeps its own tab stop, as the
606
- * hand-built ones did, and there is no arrow-key roving to learn. Hide it where it
607
- * does not belong with a class (`md:hidden`, as both keksdose pages do).
608
- */
609
- export function FloatingActionGroup({
610
- corner = "bottom-end",
611
- offset = "1rem",
612
- hideWhenOverlay = true,
613
- hidden,
614
- className,
615
- style,
616
- children,
617
- ...rest
618
- }: FloatingActionGroupProps) {
619
- const [marker, dir] = usePortalDir();
620
- const overlay = useOverlayOpen(hideWhenOverlay);
621
- // As the FAB's (keksdose dev#612): its 3rem members plus the frame's 1px borders.
622
- useFloatClearance(offset, "2px");
623
- return (
624
- <>
625
- <span ref={marker} hidden />
626
- {typeof document !== "undefined" &&
627
- createPortal(
628
- <div
629
- {...rest}
630
- hidden={hidden || overlay || undefined}
631
- role="group"
632
- dir={dir}
633
- data-corner={corner}
634
- style={{ ...cornerStyle(corner, offset), ...style }}
635
- className={cn(
636
- "fixed z-40 inline-flex flex-row overflow-hidden rounded-2xl",
637
- "border border-subtle bg-surface shadow-lg",
638
- // Dividers on the logical start edge of every member but the first, so
639
- // they sit between the same two members in RTL. The member is the
640
- // tooltip's wrapper span, which is the direct child.
641
- "[&>*:not(:first-child)]:border-s [&>*]:border-subtle",
642
- className,
643
- )}
644
- >
645
- {children}
646
- </div>,
647
- document.body,
648
- )}
649
- </>
650
- );
651
- }
652
-
653
- /** What {@link FloatingActionProps.renderLink} is handed. Spread it onto your router's
654
- * link, mapping `href` — `renderLink={({ href, ...p }) => <Link to={href} {...p} />}`. */
655
- export interface FloatingActionLinkProps {
656
- href: string;
657
- /** The member's whole look — keep it. */
658
- className: string;
659
- children: ReactNode;
660
- "aria-label": string;
661
- onClick?: (event: MouseEvent<HTMLAnchorElement>) => void;
662
- [key: `aria-${string}`]: string | boolean | number | undefined;
663
- [key: `data-${string}`]: unknown;
664
- }
665
-
666
- export interface FloatingActionProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children" | "onClick"> {
667
- /** The accessible name, and the tooltip's text. Keep it the same in both states of a
668
- * toggle; `aria-pressed` says which one it is in. */
669
- label: string;
670
- icon: ReactNode;
671
- /** Make it a toggle: `aria-pressed` and the brand "on" look (the brand glyph on the
672
- * quiet brand fill), as {@link FloatingActionButtonProps.pressed}. Ignored on a link.
673
- * For the state without the tint, see {@link pressedStyle}. */
674
- pressed?: boolean;
675
- /**
676
- * How `pressed` looks. `tint` (default): the brand "on" look. `plain`: the member
677
- * keeps its quiet look in both states and only `aria-pressed` changes — for a toggle
678
- * whose icon already says which state it is in (keksdose's /transactions "Upcoming"
679
- * swaps two icons; a tint on top said it twice). The same as passing `aria-pressed`
680
- * without `pressed`, which also rides through untinted.
681
- */
682
- pressedStyle?: "tint" | "plain";
683
- /**
684
- * `accent`: the brand-filled member, for the group's main action (the /transactions
685
- * "+"), as Button's `accent`. `default` (default): the quiet one.
686
- */
687
- variant?: "default" | "accent";
688
- /**
689
- * A count in a dot at the member's top end corner — the /transactions invoices link's
690
- * pending count. Nothing is drawn for `0` or less; above 99 it reads `99+`. The count
691
- * joins the accessible name through `floatingPanel.badge` ("Invoices, 3 new"), or
692
- * `badgeLabel` when passed.
693
- */
694
- badge?: number;
695
- /** The badge's words for a reader, replacing `floatingPanel.badge` — "3 to review". */
696
- badgeLabel?: string;
697
- /** The dot's colour. Default `warning`, the pending count's. */
698
- badgeTone?: "warning" | "danger" | "brand";
699
- /** Show `label` in the kit {@link Tooltip} on hover and focus. Default `true`: the
700
- * members are icon-only and this is their only visible label. */
701
- tooltip?: boolean;
702
- /** Where the tooltip opens. Default `top` — the group sits at the bottom of the screen. */
703
- tooltipSide?: TooltipSide;
704
- /** Make it a link — the /transactions invoices member. Drawn by `renderLink`, else
705
- * the `<UiKitProvider linkComponent>` (an in-app `href`), else a plain `<a>`. */
706
- href?: string;
707
- /** Render the link through your router's `Link` — see {@link FloatingActionLinkProps}. */
708
- renderLink?: (props: FloatingActionLinkProps) => ReactElement;
709
- onClick?: (event: MouseEvent<HTMLElement>) => void;
710
- ref?: Ref<HTMLButtonElement>;
711
- }
712
-
713
- // Each fill under its own foreground (0.33): warning borrowed `--text-inverse`, the
714
- // surface colour, which was 4.24:1 on the light warning fill.
715
- const BADGE_TONE: Record<NonNullable<FloatingActionProps["badgeTone"]>, string> = {
716
- warning: "bg-warning text-warning-contrast",
717
- danger: "bg-danger text-danger-contrast",
718
- brand: "bg-brand text-brand-contrast",
719
- };
720
-
721
- /**
722
- * One member of a {@link FloatingActionGroup}: a `size-12` icon button, toggle or link
723
- * with its label in a styled tooltip — what each keksdose member wrapped by hand in
724
- * `<Tooltip portal>`. The tooltip is portalled because the group clips (`overflow-hidden`
725
- * keeps the brand member's fill inside the pill's corners), and the focus ring is inset
726
- * for the same reason.
727
- */
728
- export function FloatingAction({
729
- label,
730
- icon,
731
- pressed,
732
- pressedStyle = "tint",
733
- variant = "default",
734
- badge,
735
- badgeLabel,
736
- badgeTone = "warning",
737
- tooltip = true,
738
- tooltipSide = "top",
739
- href,
740
- renderLink,
741
- className,
742
- type = "button",
743
- onClick,
744
- ref,
745
- ...rest
746
- }: FloatingActionProps) {
747
- const labels = useKitLabels("floatingPanel", DEFAULT_FLOATING_PANEL_LABELS);
748
- const kitLink = useKitLink();
749
- const counted = badge !== undefined && badge > 0;
750
- const name = counted ? `${label}, ${badgeLabel ?? labels.badge(badge)}` : label;
751
- const isLink = href !== undefined;
752
- const look = cn(
753
- "relative flex size-12 items-center justify-center transition-colors",
754
- "outline-none focus-visible:ring-inset",
755
- FOCUS_RING,
756
- "disabled:cursor-not-allowed disabled:opacity-50 [&_svg]:size-5",
757
- variant === "accent"
758
- ? "bg-brand text-brand-contrast hover:bg-brand-hover"
759
- : pressed && !isLink && pressedStyle === "tint"
760
- ? "bg-brand-soft text-brand hover:bg-brand-soft-hover hover:text-brand-muted"
761
- : "text-secondary hover:bg-hover hover:text-primary",
762
- className,
763
- );
764
- const body = (
765
- <>
766
- {icon}
767
- {counted && (
768
- <span
769
- aria-hidden
770
- data-badge=""
771
- className={cn(
772
- "pointer-events-none absolute end-1 top-1 h-4 min-w-4 rounded-full px-1 text-center text-micro leading-4 font-semibold",
773
- BADGE_TONE[badgeTone],
774
- )}
775
- >
776
- {badge > 99 ? "99+" : badge}
777
- </span>
778
- )}
779
- </>
780
- );
781
-
782
- let member: ReactElement;
783
- if (isLink) {
784
- // The button-only attributes stay behind; `aria-*`, `data-*` and the like ride along.
785
- const { disabled: _disabled, form: _form, value: _value, name: _name, ...anchorRest } = rest;
786
- const linkProps: FloatingActionLinkProps = {
787
- ...(anchorRest as AnchorHTMLAttributes<HTMLAnchorElement>),
788
- href,
789
- "aria-label": name,
790
- onClick,
791
- className: look,
792
- children: body,
793
- };
794
- const { children: content, ...anchor } = linkProps;
795
- const render = pickLinkRenderer(renderLink, kitLink, href);
796
- member = render ? <RenderedFloatingLink render={render} {...linkProps} /> : <a {...anchor}>{content}</a>;
797
- } else {
798
- member = (
799
- <button
800
- {...rest}
801
- ref={ref}
802
- type={type}
803
- aria-label={name}
804
- aria-pressed={pressed ?? rest["aria-pressed"]}
805
- onClick={onClick}
806
- className={look}
807
- >
808
- {body}
809
- </button>
810
- );
811
- }
812
- if (!tooltip) return member;
813
- return (
814
- // A fragment: the bubble says the member's name, and a description that repeats
815
- // the name is read twice.
816
- <Tooltip label={label} side={tooltipSide} portal>
817
- <>{member}</>
818
- </Tooltip>
819
- );
820
- }
821
-
822
- /** Calls `renderLink` as a component, so its hooks belong to the link, not to us. */
823
- function RenderedFloatingLink({
824
- render,
825
- ...props
826
- }: FloatingActionLinkProps & { render: (props: FloatingActionLinkProps) => ReactElement }) {
827
- return render(props);
828
- }