@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,132 +0,0 @@
1
- import { useEffect, useRef } from "react";
2
- import type { ReactNode } from "react";
3
- import { cn } from "../lib/cn";
4
-
5
- /**
6
- * The pieces the signed-out status pages share — {@link ForgotPasswordForm},
7
- * {@link ResetPasswordForm}, {@link VerifyEmailStatus}, {@link AcceptInvitation} and
8
- * {@link NotFoundPage} (docs/auth-harmonization.md §7).
9
- *
10
- * @internal Not part of the barrel; the pages are.
11
- */
12
-
13
- /** A heading level a page part may take. Default `h2`, under the page's `h1`
14
- * (`AuthLayout`'s `title`, the app's name), as on `SignInForm`'s steps; deeper for a
15
- * page embedded in another (a preview, the docs). */
16
- export type AuthHeadingLevel = "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
17
-
18
- /** The form pages' heading: start-aligned, the size of `SignInForm`'s step headings. */
19
- export const FORM_HEADING_CLASS = "text-base font-semibold text-primary";
20
- /** The status pages' heading: centred over the centred outcome below it. */
21
- export const STATUS_HEADING_CLASS = "text-center text-base font-semibold text-primary";
22
- export const INTRO_CLASS = "text-sm text-secondary";
23
-
24
- /**
25
- * kastlan's outcome block (verify-email-page, reset-password-page): the kit's
26
- * `EmptyState` without its dashed box, because it already sits in `AuthLayout`'s card —
27
- * a box in a box. The icon and the title carry the tone.
28
- */
29
- export const OUTCOME_CLASS = "border-0 bg-transparent px-0 py-3";
30
-
31
- /** `href` with `key=value` added to its query, before any `#fragment`: the reset page's
32
- * "Sign in" carries the address (`/login?email=ada%40example.com`). */
33
- export function withQuery(href: string, key: string, value: string): string {
34
- const hash = href.indexOf("#");
35
- const base = hash === -1 ? href : href.slice(0, hash);
36
- const fragment = hash === -1 ? "" : href.slice(hash);
37
- const separator = base.includes("?") ? (base.endsWith("?") || base.endsWith("&") ? "" : "&") : "?";
38
- return `${base}${separator}${encodeURIComponent(key)}=${encodeURIComponent(value)}${fragment}`;
39
- }
40
-
41
- /** What a callback's promise came to. */
42
- export type Settled<T> = { ok: true; value: T } | { ok: false; error: unknown };
43
-
44
- /**
45
- * Run `start(key)` ONCE per key, and hand what it settles to into `settle` — unless the
46
- * key moved on in the meantime, when the stale answer is dropped.
47
- *
48
- * keksdose's verify-email and join pages fire their request from an effect behind a
49
- * `useRef` guard, and say why: the token is single-use, and StrictMode's
50
- * mount → unmount → remount would send it twice and turn a success into "invalid" on
51
- * the second answer. The guard is the same here; there is deliberately no "unmounted"
52
- * flag set in the cleanup, because StrictMode's simulated unmount would set it and the
53
- * remount would never clear the guard — the page would hang on its spinner (the bug
54
- * keksdose hit on /join with a react-query observer). A state update after a real
55
- * unmount is a no-op in React 18 and later.
56
- *
57
- * `key === null` runs nothing (no token, not signed in yet) and forgets the last key, so
58
- * the same token runs again once it is back.
59
- */
60
- export function useOncePerKey<T>(
61
- key: string | null,
62
- start: (key: string) => T | Promise<T>,
63
- settle: (key: string, result: Settled<T>) => void,
64
- ): void {
65
- const latest = useRef({ start, settle });
66
- useEffect(() => {
67
- latest.current = { start, settle };
68
- });
69
- const current = useRef<string | null>(null);
70
- useEffect(() => {
71
- if (key === null) {
72
- current.current = null;
73
- return;
74
- }
75
- if (current.current === key) return;
76
- current.current = key;
77
- const report = (result: Settled<T>) => {
78
- if (current.current === key) latest.current.settle(key, result);
79
- };
80
- let started: T | Promise<T>;
81
- try {
82
- started = latest.current.start(key);
83
- } catch (error) {
84
- report({ ok: false, error });
85
- return;
86
- }
87
- Promise.resolve(started).then(
88
- (value) => report({ ok: true, value }),
89
- (error: unknown) => report({ ok: false, error }),
90
- );
91
- }, [key]);
92
- }
93
-
94
- /**
95
- * Move focus to `ref` when `active` turns true — the outcome a person's own submit led
96
- * to ("If an account exists … the link is on its way", "Your password has been
97
- * changed"). The submit button they pressed is gone with the form, which drops focus to
98
- * `<body>`; a screen reader then hears nothing at all. Focusing the message (a
99
- * `tabIndex={-1}` box) reads it out and leaves the next Tab where the page continues.
100
- */
101
- export function useFocusWhen(active: boolean, ref: { current: HTMLElement | null }): void {
102
- useEffect(() => {
103
- if (active) ref.current?.focus();
104
- }, [active, ref]);
105
- }
106
-
107
- /** The box {@link useFocusWhen} focuses: centred, no focus ring of its own (it is not a
108
- * control; the ring would read as one). */
109
- export function OutcomeMessage({
110
- icon,
111
- children,
112
- focusRef,
113
- className,
114
- }: {
115
- icon: ReactNode;
116
- children: ReactNode;
117
- focusRef?: { current: HTMLDivElement | null };
118
- className?: string;
119
- }) {
120
- return (
121
- <div
122
- ref={focusRef}
123
- tabIndex={-1}
124
- className={cn("flex flex-col items-center gap-2 py-2 text-center outline-none", className)}
125
- >
126
- <span aria-hidden className="[&_svg]:size-10">
127
- {icon}
128
- </span>
129
- {children}
130
- </div>
131
- );
132
- }
@@ -1,26 +0,0 @@
1
- // The English words of ./verify-email, in a module with no component code: the English
2
- // catalogue (src/i18n/defaults.ts) imports them without the component, so `en` loads as one
3
- // chunk like the other languages (0.34, KS U8). ./verify-email re-exports them.
4
-
5
- import { englishRateLimited } from "./auth-errors-labels";
6
- import type { VerifyEmailLabels } from "./verify-email";
7
-
8
- export const DEFAULT_VERIFY_EMAIL_LABELS: VerifyEmailLabels = {
9
- title: "Confirm your email address",
10
- verifying: "Confirming…",
11
- verified: "Your email address is confirmed.",
12
- continue: "Continue",
13
- invalid: "This confirmation link is not valid",
14
- expired: "This confirmation link has expired",
15
- noToken: "This link is missing its confirmation token.",
16
- invalidHint: "The link may have expired or already been used.",
17
- requestInApp: "You can request a new one from inside the app.",
18
- requestHere: "You can request a new one here.",
19
- resend: "Send again",
20
- resendIn: (seconds) => `Send again in ${seconds} s`,
21
- resent: "Confirmation email sent",
22
- resendError: "Could not send the confirmation email",
23
- rateLimited: englishRateLimited,
24
- banner: "Please confirm your email address.",
25
- dismiss: "Not now",
26
- };
@@ -1,445 +0,0 @@
1
- import { useEffect, useState } from "react";
2
- import type { ComponentPropsWithRef, ReactNode } from "react";
3
- import { CheckCircle2, MailWarning, TimerOff, XCircle } from "lucide-react";
4
- import { cn } from "../lib/cn";
5
- import { describeFailure } from "../lib/describe-failure";
6
- import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
7
- import { useAnnounce } from "../hooks/use-announce";
8
- import { AlertBanner } from "../components/alert-banner";
9
- import { LoadingState } from "../components/loading-state";
10
- import { Button } from "../components/button";
11
- import { EmptyState } from "../components/empty-state";
12
- import { isThenable } from "../lib/thenable";
13
- import { OUTCOME_CLASS, STATUS_HEADING_CLASS, useOncePerKey } from "./status-parts";
14
- import { authErrorCode, englishRateLimited, isRateLimited, retryAfterSeconds } from "./auth-errors";
15
- import type { AuthHeadingLevel } from "./status-parts";
16
- import { DEFAULT_VERIFY_EMAIL_LABELS } from "./verify-email-labels";
17
-
18
- /* ── Labels ──────────────────────────────────────────────────────────────── */
19
-
20
- /** Every string the verification page and banner render — the `verifyEmail` namespace.
21
- * keksdose's words (`verify_email.*`, and its server's "has expired"). */
22
- export interface VerifyEmailLabels {
23
- /** The page's heading. */
24
- title: string;
25
- /** While the link is redeemed. */
26
- verifying: string;
27
- verified: string;
28
- /** The way on from the page — into the app, or to sign-in. */
29
- continue: string;
30
- invalid: string;
31
- expired: string;
32
- /** The page was opened without a `token`. */
33
- noToken: string;
34
- /** Under `invalid`: why a link stops working. */
35
- invalidHint: string;
36
- /** Under a dead link, signed out: where a new one comes from. */
37
- requestInApp: string;
38
- /** Under a dead link, signed in, beside "Send again". */
39
- requestHere: string;
40
- /** The resend button, on the page and in the banner. */
41
- resend: string;
42
- /** The resend button while a just-sent mail cools down, given the seconds left. */
43
- resendIn: (seconds: number) => string;
44
- /** Said (and shown) after a resend went out. */
45
- resent: string;
46
- /** Said (and shown) after a resend failed. */
47
- resendError: string;
48
- /** 0.31.1: a resend refused as throttled — HTTP 429 (`isRateLimited`) — given the
49
- * `Retry-After` seconds, when the app's `describeError` has no words of its own
50
- * (keksdose borrowed the sign-in namespace's). */
51
- rateLimited?: (seconds?: number) => string;
52
- /** The banner's message. */
53
- banner: string;
54
- /** The banner's ×: it defers, it does not close anything. */
55
- dismiss: string;
56
- }
57
-
58
- // Defined in ./verify-email-labels, which holds no component code (0.34, KS U8).
59
- export { DEFAULT_VERIFY_EMAIL_LABELS };
60
-
61
- /** A minute: long enough that an impatient second click does not mail twice, short
62
- * enough that a mail lost to a spam filter can be re-sent without leaving the page. The
63
- * server's own limit is the real one (kastlan: 3 an hour per address). */
64
- const DEFAULT_COOLDOWN = 60;
65
-
66
- /* ── Resend ──────────────────────────────────────────────────────────────── */
67
-
68
- type ResendPhase = "idle" | "sending" | "sent" | "failed";
69
-
70
- /**
71
- * "Send again" with its own memory: busy while the request runs, then — after a mail
72
- * went out — held for `cooldown` seconds with the countdown on the button, so a second
73
- * click cannot mail twice and a throttled server is not asked to refuse. A failure frees
74
- * it at once. The outcome is a polite live region that is always rendered (a region that
75
- * mounts with its message is often not read), and visible.
76
- */
77
- function useResend(onResend: (() => Promise<unknown> | void) | undefined, cooldown: number) {
78
- const [phase, setPhase] = useState<ResendPhase>("idle");
79
- // The refusal itself, for `describeError` (0.30.0): the server's own sentence — keksdose's
80
- // per-address throttle, "try again in N minutes" — beats a fixed "could not send".
81
- const [error, setError] = useState<unknown>(undefined);
82
- const [remaining, setRemaining] = useState(0);
83
- const counting = remaining > 0;
84
- useEffect(() => {
85
- if (!counting) return;
86
- const id = setInterval(() => setRemaining((r) => Math.max(0, r - 1)), 1000);
87
- return () => clearInterval(id);
88
- }, [counting]);
89
-
90
- const sent = () => {
91
- setPhase("sent");
92
- setRemaining(Math.max(0, Math.round(cooldown)));
93
- };
94
- const send = () => {
95
- if (!onResend || phase === "sending" || counting) return;
96
- let result: unknown;
97
- try {
98
- result = onResend();
99
- } catch (e) {
100
- setError(e);
101
- setPhase("failed");
102
- return;
103
- }
104
- if (!isThenable(result)) {
105
- sent();
106
- return;
107
- }
108
- setPhase("sending");
109
- result.then(sent, (e: unknown) => {
110
- setError(e);
111
- setPhase("failed");
112
- });
113
- };
114
- return { phase, remaining, send, error };
115
- }
116
-
117
- function ResendButton({
118
- state,
119
- labels,
120
- variant,
121
- }: {
122
- state: ReturnType<typeof useResend>;
123
- labels: VerifyEmailLabels;
124
- variant: "secondary" | "accent";
125
- }) {
126
- return (
127
- <Button
128
- type="button"
129
- variant={variant}
130
- size={variant === "secondary" ? "sm" : undefined}
131
- onClick={state.send}
132
- pending={state.phase === "sending"}
133
- // `disabledReason`, not `disabled`: the button just pressed has the focus, and a
134
- // native `disabled` would drop it to <body>. The reason is what just happened.
135
- disabledReason={state.remaining > 0 ? labels.resent : undefined}
136
- >
137
- {state.remaining > 0 ? labels.resendIn(state.remaining) : labels.resend}
138
- </Button>
139
- );
140
- }
141
-
142
- function ResendStatus({
143
- phase,
144
- error,
145
- describeError,
146
- labels,
147
- className,
148
- }: {
149
- phase: ResendPhase;
150
- error?: unknown;
151
- describeError?: (error: unknown) => string | undefined;
152
- labels: VerifyEmailLabels;
153
- className?: string;
154
- }) {
155
- // The app's words first, then the throttle's, then the kit's catch-all — an app's ""
156
- // is no words (refactor audit 2026-10-30, DUP-14: `??` printed an empty status).
157
- const failed =
158
- phase === "failed"
159
- ? describeFailure(
160
- describeError?.(error),
161
- isRateLimited(error)
162
- ? (labels.rateLimited ?? englishRateLimited)(retryAfterSeconds(error))
163
- : labels.resendError,
164
- )
165
- : "";
166
- return (
167
- <span role="status" className={cn(phase === "failed" ? "text-danger" : "text-success", className)}>
168
- {phase === "sent" ? labels.resent : failed}
169
- </span>
170
- );
171
- }
172
-
173
- /* ── The page ────────────────────────────────────────────────────────────── */
174
-
175
- /** What became of a confirmation link that did not verify. */
176
- export type VerifyEmailFailure = "invalid" | "expired";
177
-
178
- /** The default when the app gives no `classifyError`: the coded refusal decides. */
179
- function defaultVerifyFailure(error: unknown): VerifyEmailFailure {
180
- return authErrorCode(error) === "token_expired" ? "expired" : "invalid";
181
- }
182
-
183
- export interface VerifyEmailStatusProps extends Omit<ComponentPropsWithRef<"div">, "children" | "title"> {
184
- /** The link's token — the app's `?token=`. Empty: the link was cut short, and the
185
- * page says so without asking anyone. */
186
- token: string;
187
- /**
188
- * Redeem it — `POST /auth/verify-email {token}`, once per token, on mount. A POST and
189
- * not the link's own GET (§10.10): a mail scanner that opens every link must not
190
- * confirm an address nobody read. Resolve when it verified (an address that already
191
- * was counts: keksdose's redeem is idempotent); reject with the client's error.
192
- */
193
- onVerify: (token: string) => Promise<unknown>;
194
- /** Which dead end a rejection is. Default: `invalid` for everything — §5.2's servers
195
- * answer one `token_invalid`; an app whose server tells expiry apart maps it here. */
196
- classifyError?: (error: unknown) => VerifyEmailFailure;
197
- /** 0.30.0: the words for a refused resend — the server's own sentence (a throttle's
198
- * "try again in N minutes"), else the kit's `resendError`. */
199
- describeError?: (error: unknown) => string | undefined;
200
- /** Someone is signed in on this device: "Continue" goes into the app, and a dead link
201
- * offers "Send again" (with `onResend`). */
202
- signedIn?: boolean;
203
- /** Send a new confirmation mail (`POST /auth/verify-email/resend`) — offered on a dead
204
- * link while signed in. */
205
- onResend?: () => Promise<unknown> | void;
206
- /** Seconds "Send again" waits after a mail went out. Default 60; `0` never waits. */
207
- cooldown?: number;
208
- /** Where "Continue" goes. Default `/` signed in, `/login` signed out. */
209
- continueHref?: string;
210
- /** App content under "confirmed" — keksdose's "Others can now share a budget with you
211
- * directly." */
212
- verifiedContent?: ReactNode;
213
- /** The heading. Default `labels.title`; `null` draws none, for a page that puts it in
214
- * `AuthLayout`'s `title` instead. */
215
- title?: ReactNode;
216
- /** The heading's level. Default `h2`, under the page's `h1`. */
217
- headingAs?: AuthHeadingLevel;
218
- labels?: LabelOverride<VerifyEmailLabels>;
219
- }
220
-
221
- type VerifyOutcome = "verified" | VerifyEmailFailure;
222
-
223
- /**
224
- * Redeem an email-confirmation link (`/verify-email?token=…`, docs/auth-harmonization.md
225
- * §7) — keksdose's `VerifyEmailPage` (features/auth/verify-email-page.tsx), with
226
- * kastlan's outcome blocks and its separate "expired".
227
- *
228
- * Opened from an inbox, often in a browser with no session, so the token is the only
229
- * credential and the page renders signed-out. It redeems once per token on mount
230
- * (StrictMode's double effect included — the token is single-use) and shows one of:
231
- * confirmed; not valid; expired; or the link had no token at all. Verification gates
232
- * nothing (§2.8), so every outcome ends on "Continue". Signed in, a dead link also
233
- * offers "Send again", which waits `cooldown` seconds after a mail went out.
234
- *
235
- * The outcome replaces the spinner, which says nothing to a screen reader on its own,
236
- * so it is also announced.
237
- */
238
- export function VerifyEmailStatus({
239
- token,
240
- onVerify,
241
- classifyError,
242
- describeError,
243
- signedIn = false,
244
- onResend,
245
- cooldown = DEFAULT_COOLDOWN,
246
- continueHref,
247
- verifiedContent,
248
- title,
249
- headingAs: Heading = "h2",
250
- labels: labelsProp,
251
- className,
252
- ...rest
253
- }: VerifyEmailStatusProps) {
254
- const labels = useKitLabels("verifyEmail", DEFAULT_VERIFY_EMAIL_LABELS, labelsProp);
255
- const [settled, setSettled] = useState<{ token: string; outcome: VerifyOutcome } | null>(null);
256
- const outcome: VerifyOutcome | "verifying" =
257
- token === "" ? "invalid" : settled?.token === token ? settled.outcome : "verifying";
258
- const { announce, regionProps } = useAnnounce();
259
- const resend = useResend(onResend, cooldown);
260
-
261
- useOncePerKey(token === "" ? null : token, onVerify, (key, result) => {
262
- // Without a classifier, the coded refusal decides (0.30.0): `token_expired` is
263
- // "expired", anything else "invalid".
264
- const next: VerifyOutcome = result.ok ? "verified" : (classifyError ?? defaultVerifyFailure)(result.error);
265
- setSettled({ token: key, outcome: next });
266
- announce(labels[next]);
267
- });
268
-
269
- const href = continueHref ?? (signedIn ? "/" : "/login");
270
- // `replace`: the token is spent, so Back must not land on this page again (keksdose F1).
271
- const continueButton = (
272
- <Button href={href} replace variant={outcome === "verified" ? "accent" : "secondary"}>
273
- {labels.continue}
274
- </Button>
275
- );
276
- const canResend = signedIn && onResend !== undefined;
277
-
278
- let body: ReactNode;
279
- if (outcome === "verifying") {
280
- body = <LoadingState size="sm" label={labels.verifying} />;
281
- } else if (outcome === "verified") {
282
- body = (
283
- <EmptyState
284
- tone="success"
285
- icon={<CheckCircle2 />}
286
- title={labels.verified}
287
- hint={verifiedContent}
288
- action={continueButton}
289
- className={OUTCOME_CLASS}
290
- />
291
- );
292
- } else {
293
- const hint = (
294
- <>
295
- {outcome === "invalid" && token !== "" ? `${labels.invalidHint} ` : ""}
296
- {canResend ? labels.requestHere : labels.requestInApp}
297
- </>
298
- );
299
- body = (
300
- <EmptyState
301
- tone="danger"
302
- icon={outcome === "expired" ? <TimerOff /> : <XCircle />}
303
- title={token === "" ? labels.noToken : labels[outcome]}
304
- hint={hint}
305
- action={
306
- <>
307
- {canResend && <ResendButton state={resend} labels={labels} variant="accent" />}
308
- {continueButton}
309
- </>
310
- }
311
- className={OUTCOME_CLASS}
312
- />
313
- );
314
- }
315
-
316
- return (
317
- <div
318
- {...rest}
319
- data-state={outcome}
320
- aria-busy={outcome === "verifying" || undefined}
321
- className={cn("space-y-3", className)}
322
- >
323
- {title === null ? null : <Heading className={STATUS_HEADING_CLASS}>{title ?? labels.title}</Heading>}
324
- {body}
325
- {canResend && (
326
- <ResendStatus
327
- phase={resend.phase}
328
- error={resend.error}
329
- describeError={describeError}
330
- labels={labels}
331
- className="block text-center text-xs"
332
- />
333
- )}
334
- {/* Rendered from the start, so the outcome is read when it arrives. */}
335
- <div {...regionProps} />
336
- </div>
337
- );
338
- }
339
-
340
- /* ── The banner ──────────────────────────────────────────────────────────── */
341
-
342
- export interface EmailVerificationBannerProps {
343
- /** Send a new confirmation mail (`POST /auth/verify-email/resend`). Resolve when it
344
- * went out; reject and the banner says it could not. */
345
- onResend: () => Promise<unknown> | void;
346
- /** 0.30.0: the words for a refused resend — the server's own sentence, else the kit's. */
347
- describeError?: (error: unknown) => string | undefined;
348
- /** Seconds "Send again" waits after a mail went out. Default 60; `0` never waits. */
349
- cooldown?: number;
350
- /** The ×, "Not now". The banner does not hide itself: the app stops rendering it —
351
- * keksdose for the rest of the session. Left out, no ×. */
352
- onDismiss?: () => void;
353
- /** `strip` (default): keksdose's band across the top of the shell. `box`: kastlan's
354
- * callout inside the page. */
355
- variant?: "strip" | "box";
356
- /** The app's sentence after the kit's — keksdose's "Until you do, nobody can share a
357
- * budget with you directly." */
358
- children?: ReactNode;
359
- className?: string;
360
- labels?: LabelOverride<VerifyEmailLabels>;
361
- /**
362
- * 0.48: on a phone hold the message to one line with a More / Less toggle —
363
- * {@link AlertBanner}'s `clampMobile`, passed through (kastlan S2: its banner took ~110px
364
- * of a 390px phone). The resend's outcome ("Sent", the error) then moves out of the
365
- * message to sit after "Send again", at every width, so the line that answers the press
366
- * is never hidden behind "More". Default `false`: the outcome stays in the message.
367
- *
368
- * 0.51 (kastlan K1, KX-5): in the `strip` variant "Send again" then stays on the clamped
369
- * message's line on a phone — one line, 43px, on a 390px phone in all seven catalogues —
370
- * where it took a line of its own (71px). The box's equivalent is `actionPlacement`.
371
- */
372
- clampMobile?: boolean;
373
- /**
374
- * 0.50 (kastlan K1): where "Send again" goes on a phone in the `box` variant —
375
- * {@link AlertBanner}'s `actionPlacement`, passed through. `"flow"` keeps it on the
376
- * message's line while the message keeps 10rem, else at the end of the next line,
377
- * instead of a line of its own (kastlan's ≤ 56px banner on a 390px phone, KX-5).
378
- * Default `"own-line"`, as before. The `strip` variant flows like that already.
379
- */
380
- actionPlacement?: "own-line" | "flow";
381
- }
382
-
383
- /**
384
- * The nudge for a signed-in account whose address is not confirmed — keksdose's
385
- * `VerifyEmailBanner` (features/auth/verify-email-banner.tsx), kastlan's copy of it.
386
- *
387
- * A prompt, not a wall: verification gates nothing (§2.8). The app renders it while
388
- * `/auth/me` says `email_verified: false`, and stops when the user dismisses it or the
389
- * page above confirms the address. "Send again" waits `cooldown` seconds after a mail
390
- * went out (the button says how long), and its outcome is written into the banner and
391
- * read out — no toast needed.
392
- */
393
- export function EmailVerificationBanner({
394
- onResend,
395
- describeError,
396
- cooldown = DEFAULT_COOLDOWN,
397
- onDismiss,
398
- variant = "strip",
399
- children,
400
- className,
401
- labels: labelsProp,
402
- clampMobile = false,
403
- actionPlacement,
404
- }: EmailVerificationBannerProps) {
405
- const labels = useKitLabels("verifyEmail", DEFAULT_VERIFY_EMAIL_LABELS, labelsProp);
406
- const resend = useResend(onResend, cooldown);
407
- // One live region either way, mounted from the start (a region added later is often not
408
- // read out): in the message, or — clamped — after the button, outside the clamp.
409
- const status = (
410
- <ResendStatus
411
- phase={resend.phase}
412
- error={resend.error}
413
- describeError={describeError}
414
- labels={labels}
415
- className="font-medium"
416
- />
417
- );
418
- const button = <ResendButton state={resend} labels={labels} variant="secondary" />;
419
- return (
420
- <AlertBanner
421
- tone="warning"
422
- variant={variant}
423
- icon={<MailWarning />}
424
- action={
425
- clampMobile ? (
426
- <>
427
- {button}
428
- {status}
429
- </>
430
- ) : (
431
- button
432
- )
433
- }
434
- onDismiss={onDismiss}
435
- dismissLabel={onDismiss ? labels.dismiss : undefined}
436
- clampMobile={clampMobile}
437
- actionPlacement={actionPlacement}
438
- className={className}
439
- >
440
- {labels.banner}
441
- {children != null && children !== false && <> {children}</>}
442
- {!clampMobile && <> {status}</>}
443
- </AlertBanner>
444
- );
445
- }