@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
package/src/tour/tour.tsx DELETED
@@ -1,750 +0,0 @@
1
- import {
2
- createContext,
3
- Suspense,
4
- useCallback,
5
- useContext,
6
- useEffect,
7
- useLayoutEffect,
8
- useMemo,
9
- useRef,
10
- useState,
11
- } from "react";
12
- import type { ReactNode } from "react";
13
- import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
14
- import { DEFAULT_TOUR_LABELS } from "./tour-labels";
15
- import type { TourInfo } from "./tour-info";
16
- import { completeStored, rememberAccount, rememberMigrate, type UseTourProgressOptions } from "./use-tour-progress";
17
- import { createGateRegistry, devWarnings, isShown, stepContext, TourInternalContext } from "./tour-gates";
18
- import { liveEngine } from "./tour-engine";
19
- import { lazyWithFallback } from "../lib/lazy-with-fallback";
20
- // Types only, gone from the built module: the overlay's modules load with the overlay.
21
- import type { Refusal } from "./tour-overlay";
22
-
23
- /**
24
- * The overlay — the card, the spotlight and its shields, the placement, the dock — loaded
25
- * when a tour first starts, not with the provider every app mounts above its routes
26
- * (refactor audit 2026-10-30, MOD-1: about 28.5 kB minified, 10.3 kB gzip of each app's
27
- * first load at 0.51.6). A LITERAL relative `import()`, as feedback-submit.tsx's dialog
28
- * is (0.34, MOD-1): the library build keeps the module its own (`bundle: false`), and a
29
- * path an app's bundler can read is a chunk it can split off.
30
- *
31
- * A fetch that fails — a tab left open across a deploy, a local-first app offline — ends
32
- * the run and leaves the page (0.52 code review, tour.tsx): the provider sits above the
33
- * routes, in keksdose and Kurvenschmiede above the app's own boundary, and the rejected
34
- * import unmounted the whole app — for a tour, whose start fetched nothing before 0.52.
35
- * `lazyWithFallback` logs it, and the next start fetches again.
36
- */
37
- const LazyTourOverlay = lazyWithFallback(
38
- () => import("./tour-overlay").then((module) => module.TourOverlay),
39
- TourOverlayUnavailable,
40
- );
41
-
42
- /** The provider's end of a run whose overlay did not load; see {@link TourOverlayUnavailable}. */
43
- const TourUnavailableContext = createContext<() => void>(() => {});
44
-
45
- /**
46
- * Stands in for an overlay whose chunk did not arrive: ends the run with the start's
47
- * `onSkip("unavailable")` and draws nothing. It ended with `stop()` at first, which calls
48
- * nothing — after the start's `onStart` had run, so what the app turned on for the run
49
- * stayed on: kastlan's practice mode, which its launcher turns on and its `onSkip` and
50
- * `onFinish` turn off (0.52 code review, tour.tsx).
51
- */
52
- function TourOverlayUnavailable() {
53
- const unavailable = useContext(TourUnavailableContext);
54
- useLayoutEffect(unavailable, [unavailable]);
55
- return null;
56
- }
57
-
58
- /**
59
- * Hears Escape while the overlay's chunk is on its way, as the overlay does before it has
60
- * located its step: the run is skipped. With nothing mounted the tour was `active` and
61
- * deaf, and on a slow first start the overlay came up seconds after the person had
62
- * pressed Escape and gone back to the page (0.52 code review, tour.tsx).
63
- */
64
- function TourOverlayLoading({ onSkip }: { onSkip: () => void }) {
65
- useEffect(() => {
66
- const onKey = (e: KeyboardEvent) => {
67
- if (e.key === "Escape") onSkip();
68
- };
69
- document.addEventListener("keydown", onKey);
70
- return () => document.removeEventListener("keydown", onKey);
71
- }, [onSkip]);
72
- return null;
73
- }
74
-
75
- export { useTourGate, useTourGateRelease } from "./tour-gates";
76
- export type { TourGateRelease } from "./tour-gates";
77
-
78
- /**
79
- * `start`/`end` follow the reading direction (`end` is the right side in LTR and the
80
- * left side in RTL) and are what a translated app wants. `left`/`right` stay physical
81
- * for the steps that genuinely mean a screen side.
82
- */
83
- export type TourPlacement = "top" | "right" | "bottom" | "left" | "start" | "end" | "center" | "dock";
84
-
85
- export interface TourStep {
86
- /** CSS selector for the element to spotlight. Omit for a centered step
87
- * (welcome/finish). If the target isn't found/visible, the step centers. */
88
- target?: string;
89
- title: string;
90
- body: ReactNode;
91
- /** Extra footer content, e.g. a "load sample data" shortcut. */
92
- action?: ReactNode;
93
- /** Spotlight padding around the target, px (default 8). On a field step the spot also
94
- * takes in the lines the field's `aria-describedby` names when they sit within the
95
- * ring's reach of it (a hint or warning line under the field, keksdose S1, §11.6). */
96
- padding?: number;
97
- /** Where the card sits relative to the target. Omit for auto placement
98
- * (below → above → centered). "center" ignores the target and centers on
99
- * screen. "start"/"end" are the logical sides and flip in RTL; "left"/"right"
100
- * are physical. An explicit side flips to the opposite side if it would
101
- * overflow, then clamps into the viewport.
102
- *
103
- * `"dock"` (0.50, §11.7): below `sm` (640 px at Normal text, 800 at Large, as
104
- * `max-sm:` since 0.52) the card is pinned full-width to the top or bottom edge of the
105
- * usable band — the visual viewport less the keyboard and any
106
- * `[data-tour-obstruction]` (the number pad) — on the edge away from the field, and the
107
- * field's scroll container brings it into the other half. From `sm` up it is auto
108
- * placement. On a phone a field step (`interactive`, `awaitInput`, `gate`, `awaitGate`)
109
- * with a target and no `placement` docks by default (`TourProvider dockOnPhones`). */
110
- placement?: TourPlacement;
111
- /** Advance only when the user clicks the spotlighted target itself (not the
112
- * card's Next button). Requires `target`: the real control's own handler runs
113
- * first, then the tour steps forward on a microtask. The spotlight hole stays
114
- * click-through to the target; the rest of the page does not. */
115
- awaitClick?: boolean;
116
- /**
117
- * The spotlighted control is for USING, not only for looking at (0.46, keksdose live
118
- * #436): the layers it opens sit above the scrim and work. A plain step's overlay is
119
- * `z-[60]`, over every kit layer, so a field whose number pad (`NumberPadSheet`), a
120
- * select's menu or a popover opens at `z-50` opened UNDER the shields, where nothing
121
- * could be tapped. Here the overlay drops to `z-[45]`: still over the top bar and the
122
- * page (`z-40` and below, still dimmed and shielded), under every `z-50` layer the
123
- * target opens — so an app's own layer wants `z-50` or more to clear it. Keys pressed
124
- * in the target or in such a layer are theirs (Escape closes the pad, arrows walk a
125
- * list); from the card the tour's keys work as on any step. The overlay is not
126
- * `aria-modal` then, and carries `data-tour-interactive`.
127
- *
128
- * The card is in the same layer as the scrim, so an open pad or sheet may cover it
129
- * until it closes. Requires `target`. A `HoverMenu` (`z-40`, the top bar's menus) stays
130
- * under the scrim: point an `awaitClick` step at its trigger instead.
131
- */
132
- interactive?: boolean;
133
- /**
134
- * Advance once a value was ENTERED in the spotlighted control (0.46, keksdose live
135
- * #436) — `awaitClick` for a field. Implies `interactive`. Counted when focus leaves
136
- * the target (the number pad's Done, a Tab, a tap elsewhere), or Enter is pressed in
137
- * it, and one of its fields (`input`, `textarea`, `select`: the target itself or
138
- * inside it) then holds another value than when the step began; a native `change`
139
- * (a select, a checkbox) counts at once. The card swaps Next for `awaitInputHint`,
140
- * as for `awaitClick`. A picker whose value is not a field's (the kit's `Select`
141
- * button) has nothing to compare: call `useTour().next()` from its `onChange`.
142
- */
143
- awaitInput?: boolean;
144
- /**
145
- * 0.50 (docs/tours-harmonization.md §11.1): Next stays locked until the gate `key` is
146
- * satisfied — the form publishes it with `useTourGate(key, satisfied)` beside the field.
147
- * Implies `interactive`. The locked Next is `aria-disabled` with {@link gateHint} under
148
- * it; pressing it focuses the field. Once satisfied the tour does NOT advance by itself:
149
- * Next, Enter in the field, or focus leaving the field to nowhere or to the card (the
150
- * number pad's Done) moves on. A key nobody publishes is not enforced (the form closed
151
- * under the tour): Next opens. A step may have a `gate` and no `target`.
152
- */
153
- gate?: string;
154
- /** Overrides `labels.gateHint` for this step. */
155
- gateHint?: string;
156
- /**
157
- * 0.50 (§11.4): wait for the app to RELEASE this key — `useTourGateRelease().release(key)`
158
- * from the save's `onSuccess`. Implies `interactive`; usually it targets the Save button,
159
- * whose hole stays click-through. Next is replaced by {@link awaitGateHint}, and a click
160
- * does not advance: only `release` does. A release that arrives on an earlier step (Enter
161
- * in the last field submitted the form) jumps past the first later step awaiting the key.
162
- * `refuse(key, reason)` keeps the step and shows the reason, with a "Back to …" link to the
163
- * first earlier field whose gate is now unsatisfied; the kit never jumps there itself.
164
- * A viewer who cannot save gets `awaitGate: undefined`, so a plain Next.
165
- */
166
- awaitGate?: string;
167
- /** Overrides `labels.awaitGateHint` for this step. */
168
- awaitGateHint?: string;
169
- /**
170
- * 0.50 (§11.2): the field may stay empty. While the `gate` is unsatisfied the card
171
- * offers "Leave empty" beside the locked Next, which moves on without touching the field
172
- * (the kit never writes app values); the title carries an "Optional" chip. Not a skip:
173
- * the run continues and can complete. Without a `gate`, only the chip.
174
- */
175
- optional?: boolean;
176
- /**
177
- * 0.50 (§11.3): shown only if this returns true on ARRIVAL (evaluated before
178
- * `beforeStep`, so a skipped step never navigates). Next walks forward to the first step
179
- * shown, Back to the nearest earlier one shown now. Branch facts are gates:
180
- * `when: (c) => c.gate("txn.transfer") === true`. Keep it pure and cheap: the counter
181
- * evaluates every step's `when` on each arrival. A throw counts as skipped.
182
- */
183
- when?: (ctx: TourStepContext) => boolean;
184
- /** Runs before the step is shown — e.g. navigate to a route, open a panel.
185
- * May be async; the step waits for it, then locates the target. Receives the
186
- * {@link TourStepContext} (0.50); a step entered by "Guide me" sees `via: "at"` and
187
- * should leave an open form alone. One that throws or rejects is logged to the
188
- * console, and the step is located and shown anyway. Enter and the arrows wait for
189
- * it; Escape does not. */
190
- beforeStep?: (ctx: TourStepContext) => void | Promise<void>;
191
- }
192
-
193
- /** What a step's `when` and `beforeStep` may ask on arrival (0.50, §11.3). */
194
- export interface TourStepContext {
195
- /** The gate's current value: true/false, or undefined while nobody publishes it. */
196
- gate(key: string): boolean | undefined;
197
- /** How this step is being entered. */
198
- via: "start" | "at" | "next" | "back" | "goto";
199
- }
200
-
201
- export interface TourLabels {
202
- next: string;
203
- back: string;
204
- skip: string;
205
- done: string;
206
- /** Shown in place of the Next button on an `awaitClick` step. */
207
- awaitClickHint: string;
208
- /** Shown in place of the Next button on an `awaitInput` step (0.46). */
209
- awaitInputHint: string;
210
- /** Step counter, e.g. (2, 7) => "2 / 7". Counts the steps the run shows (0.50). */
211
- step: (current: number, total: number) => string;
212
- /** 0.50: an `optional` gate step's button while the field is empty. */
213
- leaveEmpty: string;
214
- /** 0.50: the chip beside an `optional` step's title. */
215
- optional: string;
216
- /** 0.50: under a `gate` step's locked Next (`TourStep.gateHint` overrides it). */
217
- gateHint: string;
218
- /** 0.50: announced (screen readers only) when a gate step's field is filled. */
219
- gateReady: string;
220
- /** 0.50: in place of Next on an `awaitGate` step (`TourStep.awaitGateHint` overrides it). */
221
- awaitGateHint: string;
222
- /** 0.50: the warning when the app `refuse`s an `awaitGate` step without a reason. */
223
- awaitGateRefused: string;
224
- /** 0.50: the link to an earlier step whose field was emptied, after a refused save. */
225
- backToStep: (title: string) => string;
226
- }
227
-
228
- // Defined in ./tour-labels, which holds no component code (0.34, KS U8).
229
- export { DEFAULT_TOUR_LABELS };
230
-
231
- /** 0.50 (§11.5): a step index, or the `data-tour` value of the step's anchor. */
232
- export type TourAt = number | string;
233
-
234
- /** `useTour().start`, both forms: what `TourProvider` hands its `launch` as the third argument. */
235
- export type TourStart = TourContextValue["start"];
236
-
237
- /**
238
- * 0.50 (§11.5): the app's launcher — the shape `useTourUrlSync` already takes, plus `at`.
239
- * It builds the steps (`prepare()`, `build()`, `tour: tourInfo(def)`) and passes `at` on to
240
- * `start(steps, { …, at })`. Give the same function to `TourProvider launch` and to
241
- * `useTourUrlSync`.
242
- *
243
- * `start` is the provider's own `start` (keksdose N4), so the launcher needs no ref to a
244
- * component below the provider and may be defined above it. `engine` (0.50.1, keksdose N1)
245
- * is the rest of the engine — `stop`, `next`, `active`, … — read live, see {@link TourEngine}.
246
- * `useTourUrlSync` passes both (under a provider). A launcher taking fewer arguments still
247
- * works.
248
- */
249
- export type TourLauncher = (
250
- id: string,
251
- opts: { startIndex?: number; at?: TourAt },
252
- start: TourStart,
253
- engine: TourEngine,
254
- ) => void | Promise<unknown>;
255
-
256
- /**
257
- * 0.50.1 (keksdose N1): the whole engine `useTour()` returns, handed to a launcher as its
258
- * FOURTH argument by `TourProvider` and `useTourUrlSync`, so a tour built above the provider
259
- * can also `stop`, `next` or read `active` with no `useTour()` registered from below. One
260
- * object per provider whose fields read the latest render (`engine.active` after an
261
- * `await` is current); its methods are the provider's own. `start` (the third argument) is
262
- * `engine.start`.
263
- */
264
- export type TourEngine = TourContextValue;
265
-
266
- const ENGINE_KEYS = [
267
- "active",
268
- "activeId",
269
- "start",
270
- "stop",
271
- "next",
272
- "prev",
273
- "goToStep",
274
- "index",
275
- "total",
276
- "position",
277
- "count",
278
- ] as const satisfies readonly (keyof TourContextValue)[];
279
-
280
- interface StartOptions {
281
- /** Stable id of the tour, surfaced as `activeId` so the app can mirror it to
282
- * the URL (deep-link / evaluation tracking) and record completion. Defaults to
283
- * `tour.id`. */
284
- id?: string;
285
- /** The tour being started, as the app lists it (docs/tours-harmonization.md §9.6.1).
286
- * When its last step is finished, the provider records the completion in its
287
- * `progress` and hands this to `onComplete`. */
288
- tour?: TourInfo;
289
- /** Start at this step index instead of 0 (clamped) — for URL/deep-link resume. */
290
- startIndex?: number;
291
- /**
292
- * 0.50 (§11.5): start here AND make it the floor — earlier steps never run (nor their
293
- * `beforeStep`), Back stops here, `position`/`count` count from here, and the finish
294
- * records the completion as a full run does (Marcel, Q2). A number is a step index
295
- * (clamped); a string is the first step whose `target` contains `data-tour="<at>"`
296
- * verbatim (unknown: 0, with a development warning). The `at` step is entered with
297
- * `via: "at"`. With `startIndex` too, `startIndex` picks the step and `at` the floor.
298
- */
299
- at?: TourAt;
300
- /** Fires synchronously when the tour starts (e.g. enable a mock interceptor). */
301
- onStart?: () => void;
302
- /** After the last step: runs after the provider's progress write and `onComplete`. */
303
- onFinish?: () => void;
304
- /**
305
- * The run ended before its last step — undo here what `onStart` or the launcher turned
306
- * on. `reason` says why: `"skipped"`, the person left (Skip, Escape); `"unavailable"`
307
- * (0.52), the overlay's chunk did not load (a tab left open across a deploy, offline),
308
- * so no step was shown — the moment to say so, if the app wants to. `stop()` calls
309
- * nothing.
310
- */
311
- onSkip?: (reason?: TourSkipReason) => void;
312
- }
313
-
314
- /** Why a run ended before its last step, as `onSkip` hears it. */
315
- type TourSkipReason = "skipped" | "unavailable";
316
-
317
- /** What `TourProvider`'s `onComplete` learns besides the tour (§9.1, §9.6). */
318
- export interface TourCompletion {
319
- /**
320
- * `true` when the completion counts anew (the first time, or the first time after the
321
- * tour's update, §8): the moment for the app's points toast. `false` for a replay, and
322
- * when the stored text is in an old shape no `migrate` reads: nothing is overwritten
323
- * then, and the error goes to `console.error` (keksdose B-1). `undefined` when the provider has no `progress` or the start carried no `tour`, so
324
- * nothing was recorded.
325
- */
326
- awarded: boolean | undefined;
327
- }
328
-
329
- interface TourContextValue {
330
- active: boolean;
331
- /** Id of the running tour (from {@link StartOptions.id}), else null. */
332
- activeId: string | null;
333
- /**
334
- * Start a tour with the given steps — or, by id (0.50), through the provider's `launch`:
335
- * `start("create-transaction", { at: "txn-entry-mode" })`. Without a `launch` the id form
336
- * does nothing (a development build warns).
337
- */
338
- start: {
339
- // The id form first: `Parameters<typeof start>` reads the LAST overload, which stays
340
- // the 0.49 one.
341
- (id: string, opts?: { at?: TourAt }): void;
342
- (steps: TourStep[], opts?: StartOptions): void;
343
- };
344
- /** End the current tour (no callbacks fire). */
345
- stop: () => void;
346
- /** Advance one step; past the last step it finishes the tour (fires onFinish). */
347
- next: () => void;
348
- /** Go back one step (no-op on the first). */
349
- prev: () => void;
350
- /** Jump to a step by index, clamped to range — e.g. for URL/deep-link resume. */
351
- goToStep: (index: number) => void;
352
- /** Current step (0-based; 0 while inactive). */
353
- index: number;
354
- /** Total steps (0 while inactive). */
355
- total: number;
356
- /** 0.50: 1-based position among the steps this run shows, for "3 of 9"; 0 while inactive. */
357
- position: number;
358
- /** 0.50: how many steps this run shows, from its first (the `at` floor) to the end; 0 while inactive. */
359
- count: number;
360
- }
361
-
362
- const TourContext = createContext<TourContextValue | null>(null);
363
-
364
- export function useTour(): TourContextValue {
365
- const ctx = useContext(TourContext);
366
- if (!ctx) throw new Error("useTour must be used within <TourProvider>");
367
- return ctx;
368
- }
369
-
370
- /**
371
- * The tour engine if it is there, `null` if it is not — for a control that is a
372
- * DECORATION rather than a participant.
373
- *
374
- * {@link useTour}'s throw is correct and stays: a component that runs a tour cannot do
375
- * its job without the provider, and failing loudly is how that gets fixed. But the
376
- * throw's blast radius is whatever error boundary is above it, and for a launcher in
377
- * the app shell that is the whole app.
378
- *
379
- * Keksdose feedback dev#524 is what that costs: an `@hb/ui` module was edited while a
380
- * dev server was running, vite re-evaluated it, and the module's freshly created
381
- * context object was no longer the one the mounted provider was providing. React's
382
- * `useContext` then answers `null` for a provider that is, structurally, right there —
383
- * and the top bar's tour menu took the entire shell down with it. **Build-time module
384
- * graphs cannot produce that**, so it is a development-only failure; a menu that
385
- * disappears for a second is the proportionate response to it either way.
386
- *
387
- * Only for controls that can honestly render nothing. If a component would show a
388
- * broken half of itself without the tour, it wants {@link useTour}.
389
- */
390
- export function useTourOptional(): TourContextValue | null {
391
- return useContext(TourContext);
392
- }
393
-
394
- /**
395
- * Provides the guided-tour engine: a dimmed spotlight overlay + step card driven
396
- * by a list of {@link TourStep}s. Domain-free — the app supplies the steps (copy,
397
- * selectors, per-step navigation, placement) and the translated {@link TourLabels}.
398
- * Mount once inside the router; start a tour from anywhere via {@link useTour},
399
- * which also exposes step control (`next`/`prev`/`goToStep`) and the current
400
- * `index`/`total` for URL mirroring, `awaitClick` and deep-link resume.
401
- *
402
- * **Completion in one place** (docs/tours-harmonization.md §9.6): give the provider the
403
- * app's `progress` (the same `{storageKey, migrate}` as `useTourProgress`) and start each
404
- * tour with `start(steps, {tour})`. When the last step is finished the provider writes the
405
- * completion ONCE, through the store every `useTourProgress` reader of the key shares
406
- * (never a second copy), then calls `onComplete(tour, {awarded})`, then the start's own
407
- * `onFinish`. A skip or `stop()` records nothing and calls neither. The app removes its
408
- * own `complete()` from `onFinish`, or that second write answers `false`.
409
- *
410
- * Both props are optional: without `progress` or a `tour` on the start, `onComplete`
411
- * still fires, with `awarded: undefined` (and `tour` as given, possibly `undefined`). A
412
- * new `storageKey` (an account switch on a shared PC) is followed on the next
413
- * completion, without a remount.
414
- */
415
- export function TourProvider({
416
- children,
417
- labels,
418
- progress,
419
- onComplete,
420
- launch,
421
- dockOnPhones = true,
422
- }: {
423
- children: ReactNode;
424
- labels?: LabelOverride<TourLabels>;
425
- /**
426
- * 0.50 (§11.5): lets `start(id)` and `<TourGuideButton>` start a tour by id. Usually the
427
- * same function the app gives `useTourUrlSync`.
428
- */
429
- launch?: TourLauncher;
430
- /** The app's tour progress: the same options its `useTourProgress` readers use. */
431
- progress?: UseTourProgressOptions;
432
- /** A tour's last step was finished; see {@link TourCompletion}. */
433
- onComplete?: (tour: TourInfo | undefined, completion: TourCompletion) => void;
434
- /**
435
- * 0.50 (§11.7, Marcel's Q1): below `sm`, a field step with a target and no `placement`
436
- * docks. Default `true`; `false` makes docking strictly opt-in (`placement: "dock"`).
437
- */
438
- dockOnPhones?: boolean;
439
- }) {
440
- // `labels` over the provider's `tour` over English. Resolved once here and handed
441
- // down: the step card is portalled, but context crosses portals anyway — this is
442
- // simply the one place that already owned the merge.
443
- const merged = useKitLabels("tour", DEFAULT_TOUR_LABELS, labels);
444
- const [steps, setSteps] = useState<TourStep[] | null>(null);
445
- // Where the run is: the raw index (what `?tourStep=` mirrors), how it got there, and
446
- // its place among the steps shown (§11.3), computed once on arrival.
447
- const [nav, setNav] = useState<Nav>(NO_NAV);
448
- const index = nav.index;
449
- // The app's last `refuse` on the step awaiting its key; any arrival clears it.
450
- const [refusal, setRefusal] = useState<Refusal | null>(null);
451
- const [activeId, setActiveId] = useState<string | null>(null);
452
- const optsRef = useRef<StartOptions>({});
453
- // The latest props, read at the finish: a new `storageKey` or callback needs no remount.
454
- const progressRef = useRef(progress);
455
- const onCompleteRef = useRef(onComplete);
456
- const launchRef = useRef(launch);
457
- useLayoutEffect(() => {
458
- progressRef.current = progress;
459
- onCompleteRef.current = onComplete;
460
- launchRef.current = launch;
461
- });
462
- // The provider's migrate becomes the key's, for readers that pass none (keksdose B-2).
463
- const storageKey = progress?.storageKey;
464
- const migrate = progress?.migrate;
465
- // 0.45: and its `account` (§10.3), so a finish on an account key is sent as readers' are.
466
- const account = progress?.account;
467
- useLayoutEffect(() => {
468
- if (storageKey !== undefined) rememberMigrate(storageKey, migrate);
469
- if (storageKey !== undefined) rememberAccount(storageKey, account);
470
- }, [storageKey, migrate, account]);
471
- const warnedNoTourRef = useRef(false);
472
- // Live mirrors so the step-control callbacks can stay stable (identity-safe for
473
- // consumers) while still reading the current steps/index. Synced in a layout
474
- // effect — after the commit, before paint and before any passive effect or event
475
- // can call them — rather than written during render.
476
- const stepsRef = useRef<TourStep[] | null>(null);
477
- const indexRef = useRef(0);
478
- useLayoutEffect(() => {
479
- stepsRef.current = steps;
480
- indexRef.current = index;
481
- }, [steps, index]);
482
- /** The run's first step: earlier steps never run, Back stops here (the `at` floor). */
483
- const floorRef = useRef(0);
484
- const active = !!steps && steps.length > 0;
485
- const total = steps?.length ?? 0;
486
- // The gate registry (§11.1): one per provider, read by the overlay while a tour runs.
487
- const [gates] = useState(createGateRegistry);
488
- useLayoutEffect(() => {
489
- gates.setActive(active);
490
- }, [gates, active]);
491
- const canLaunch = !!launch;
492
- const internals = useMemo(() => ({ gates, canLaunch }), [gates, canLaunch]);
493
-
494
- /** Is step `i` shown, asked now (§11.3)? */
495
- const shown = useCallback(
496
- (s: TourStep[], i: number, via: TourStepContext["via"]) => isShown(s[i], stepContext(gates, via)),
497
- [gates],
498
- );
499
- /** Arrive at `i`: the counter is recomputed from every step's `when`, against the gates now. */
500
- const arrive = useCallback(
501
- (s: TourStep[], i: number, via: TourStepContext["via"]) => {
502
- const ctx = stepContext(gates, via);
503
- let position = 0;
504
- let count = 0;
505
- for (let j = floorRef.current; j < s.length; j++) {
506
- if (j !== i && !isShown(s[j], ctx)) continue;
507
- count++;
508
- if (j <= i) position++;
509
- }
510
- indexRef.current = i;
511
- setRefusal(null);
512
- setNav({ index: i, floor: floorRef.current, via, position, count });
513
- },
514
- [gates],
515
- );
516
- /** The first step shown at or after `from`, or -1. */
517
- const forward = useCallback(
518
- (s: TourStep[], from: number, via: TourStepContext["via"]) => {
519
- for (let j = Math.max(from, floorRef.current); j < s.length; j++) if (shown(s, j, via)) return j;
520
- return -1;
521
- },
522
- [shown],
523
- );
524
- /** The nearest step shown at or before `from`, not below the floor, or -1. */
525
- const backward = useCallback(
526
- (s: TourStep[], from: number, via: TourStepContext["via"]) => {
527
- for (let j = Math.min(from, s.length - 1); j >= floorRef.current; j--) if (shown(s, j, via)) return j;
528
- return -1;
529
- },
530
- [shown],
531
- );
532
-
533
- const startSteps = useCallback(
534
- (s: TourStep[], opts?: StartOptions) => {
535
- optsRef.current = opts ?? {};
536
- optsRef.current.onStart?.();
537
- const last = Math.max(0, s.length - 1);
538
- floorRef.current = opts?.at === undefined ? 0 : resolveAt(s, opts.at);
539
- const via: TourStepContext["via"] = opts?.at === undefined ? "start" : "at";
540
- // Floored, as `at` is (FLW-9): `steps[1.5]` is undefined, and `forward` threw on
541
- // its `when` — an edited `?tourStep=2.5` was enough.
542
- const asked = opts?.startIndex === undefined ? floorRef.current : Math.floor(opts.startIndex);
543
- const wanted = Math.min(Math.max(floorRef.current, asked), last);
544
- let to = forward(s, wanted, via);
545
- if (to < 0) to = backward(s, wanted, via);
546
- // Not one step of the run is shown: there is nothing to tour.
547
- if (to < 0) return;
548
- arrive(s, to, via);
549
- setActiveId(opts?.id ?? opts?.tour?.id ?? null);
550
- setSteps(s);
551
- },
552
- [arrive, forward, backward],
553
- );
554
- // The provider's own `start` and the live engine, handed to `launch` as its third and
555
- // fourth arguments (keksdose N4, N1).
556
- const ownStartRef = useRef<TourContextValue["start"] | null>(null);
557
- const [live] = useState(() => liveEngine<TourEngine>(ENGINE_KEYS));
558
- const engine = live.engine;
559
- const start = useCallback(
560
- (what: TourStep[] | string, opts?: StartOptions | { at?: TourAt }) => {
561
- if (typeof what !== "string") {
562
- startSteps(what, opts as StartOptions | undefined);
563
- return;
564
- }
565
- const run = launchRef.current;
566
- if (!run) {
567
- if (devWarnings()) console.warn(`[ui-kit] start("${what}") needs TourProvider's \`launch\` prop.`);
568
- return;
569
- }
570
- void Promise.resolve(run(what, { at: opts?.at }, ownStartRef.current!, engine)).catch((error: unknown) =>
571
- console.error(error),
572
- );
573
- },
574
- [startSteps, engine],
575
- ) as TourContextValue["start"];
576
- useLayoutEffect(() => {
577
- ownStartRef.current = start;
578
- }, [start]);
579
- const stop = useCallback(() => {
580
- setSteps(null);
581
- setActiveId(null);
582
- }, []);
583
- const finish = useCallback(() => {
584
- // Once per tour: a second "Done" before the overlay unmounts records nothing more.
585
- if (!stepsRef.current) return;
586
- stepsRef.current = null;
587
- const { tour, onFinish } = optsRef.current;
588
- const store = progressRef.current;
589
- // Exactly one write per completion (§9.6.2), so `awarded` is what `complete(tour)` answered.
590
- let awarded: boolean | undefined;
591
- if (store && tour) {
592
- try {
593
- awarded = completeStored(store.storageKey, store.migrate, tour);
594
- } catch (error) {
595
- // A stored text no migrate reads is left as it is (keksdose B-1); the tour still ends.
596
- console.error(error);
597
- awarded = false;
598
- }
599
- } else if (store && !tour && devWarnings() && !warnedNoTourRef.current) {
600
- warnedNoTourRef.current = true;
601
- console.warn(
602
- "[ui-kit] TourProvider has `progress`, but a finished tour's start carried no `tour`: " +
603
- "nothing was recorded and `awarded` is undefined. Start it with `start(steps, { tour })`.",
604
- );
605
- }
606
- onCompleteRef.current?.(tour, { awarded });
607
- onFinish?.();
608
- setSteps(null);
609
- setActiveId(null);
610
- }, []);
611
- // Takes no argument: the card's Skip passes its click event.
612
- const skip = useCallback(() => {
613
- optsRef.current.onSkip?.("skipped");
614
- setSteps(null);
615
- setActiveId(null);
616
- }, []);
617
- const unavailable = useCallback(() => {
618
- // Once per run: the fallback's layout effect runs twice under StrictMode.
619
- if (!stepsRef.current) return;
620
- stepsRef.current = null;
621
- optsRef.current.onSkip?.("unavailable");
622
- setSteps(null);
623
- setActiveId(null);
624
- }, []);
625
-
626
- // A step whose `when` is false is passed over: `goToStep` lands on the next step shown
627
- // after it, failing that the previous one; Next past the last shown step finishes.
628
- const goToStep = useCallback(
629
- (i: number) => {
630
- const s = stepsRef.current;
631
- if (!s || s.length === 0) return;
632
- const wanted = Math.min(Math.max(floorRef.current, Math.floor(i)), s.length - 1);
633
- let to = forward(s, wanted, "goto");
634
- if (to < 0) to = backward(s, wanted, "goto");
635
- if (to >= 0) arrive(s, to, "goto");
636
- },
637
- [arrive, forward, backward],
638
- );
639
- const next = useCallback(() => {
640
- const s = stepsRef.current;
641
- if (!s || s.length === 0) return;
642
- const to = forward(s, indexRef.current + 1, "next");
643
- if (to < 0) finish();
644
- else arrive(s, to, "next");
645
- }, [arrive, forward, finish]);
646
- const prev = useCallback(() => {
647
- const s = stepsRef.current;
648
- if (!s) return;
649
- const to = backward(s, indexRef.current - 1, "back");
650
- if (to >= 0) arrive(s, to, "back");
651
- }, [arrive, backward]);
652
-
653
- // awaitGate (§11.4): `release` and `refuse` are events, heard only while a tour runs.
654
- useEffect(() => {
655
- if (!active) return;
656
- let seq = 0;
657
- return gates.listen((signal) => {
658
- const s = stepsRef.current;
659
- if (!s) return;
660
- const i = indexRef.current;
661
- if (signal.kind === "refuse") {
662
- // On any other step the form's own errors speak.
663
- if (s[i]?.awaitGate === signal.key) setRefusal({ step: s[i], reason: signal.reason, seq: ++seq });
664
- return;
665
- }
666
- // The step awaiting it, or the first later one: the record is saved, so the fields
667
- // between are passed over.
668
- const awaiting =
669
- s[i]?.awaitGate === signal.key ? i : s.findIndex((st, k) => k > i && st.awaitGate === signal.key);
670
- if (awaiting < 0) return;
671
- const to = forward(s, awaiting + 1, "next");
672
- if (to < 0) finish();
673
- else arrive(s, to, "next");
674
- });
675
- }, [active, gates, arrive, forward, finish]);
676
-
677
- const value: TourContextValue = {
678
- active,
679
- activeId,
680
- start,
681
- stop,
682
- next,
683
- prev,
684
- goToStep,
685
- index,
686
- total,
687
- position: active ? nav.position : 0,
688
- count: active ? nav.count : 0,
689
- };
690
- // Read by the live engine (`launch`'s fourth argument) after this render commits.
691
- useLayoutEffect(() => {
692
- live.set(value);
693
- });
694
-
695
- return (
696
- <TourInternalContext.Provider value={internals}>
697
- <TourContext.Provider value={value}>
698
- {children}
699
- {active ? (
700
- // Its own boundary, so the first start's chunk fetch suspends nothing of the
701
- // app's; it shows nothing meanwhile, as the overlay itself does until it has
702
- // located the step, and hears Escape as it does. A failed fetch ends the run
703
- // (`TourOverlayUnavailable`).
704
- <Suspense fallback={<TourOverlayLoading onSkip={skip} />}>
705
- <TourUnavailableContext.Provider value={unavailable}>
706
- <LazyTourOverlay
707
- steps={steps!}
708
- index={index}
709
- via={nav.via}
710
- floor={nav.floor}
711
- position={nav.position}
712
- count={nav.count}
713
- refusal={refusal?.step === steps![index] ? refusal : null}
714
- onGoTo={goToStep}
715
- labels={merged}
716
- gates={gates}
717
- dockOnPhones={dockOnPhones}
718
- onNext={next}
719
- onPrev={prev}
720
- onSkip={skip}
721
- />
722
- </TourUnavailableContext.Provider>
723
- </Suspense>
724
- ) : null}
725
- </TourContext.Provider>
726
- </TourInternalContext.Provider>
727
- );
728
- }
729
-
730
- interface Nav {
731
- index: number;
732
- /** The run's first step (the `at` floor). */
733
- floor: number;
734
- via: TourStepContext["via"];
735
- position: number;
736
- count: number;
737
- }
738
-
739
- const NO_NAV: Nav = { index: 0, floor: 0, via: "start", position: 0, count: 0 };
740
-
741
- /** `StartOptions.at` as a step index: a number clamped, an anchor's first step, else 0. */
742
- function resolveAt(steps: TourStep[], at: TourAt): number {
743
- if (typeof at === "number") return Math.min(Math.max(0, Math.floor(at)), Math.max(0, steps.length - 1));
744
- const anchor = `data-tour="${at}"`;
745
- const found = steps.findIndex((step) => step.target?.includes(anchor));
746
- if (found >= 0) return found;
747
- if (devWarnings())
748
- console.warn(`[ui-kit] A tour was started at "${at}", but no step targets [${anchor}]: it starts at 0.`);
749
- return 0;
750
- }