@eifi1/ui-kit 0.54.0 → 0.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (847) hide show
  1. package/README.md +90 -76
  2. package/dist/admin/plan-change.js +2 -2
  3. package/dist/admin/plan-change.js.map +1 -1
  4. package/dist/admin/user-roster.d.ts +6 -0
  5. package/dist/admin/user-roster.js +4 -0
  6. package/dist/admin/user-roster.js.map +1 -1
  7. package/dist/billing/billing-labels.d.ts +26 -0
  8. package/dist/billing/billing-labels.js +9 -0
  9. package/dist/billing/billing-labels.js.map +1 -1
  10. package/dist/billing/subscription-standing.d.ts +61 -0
  11. package/dist/billing/subscription-standing.js +51 -0
  12. package/dist/billing/subscription-standing.js.map +1 -0
  13. package/dist/billing/usage-meter.d.ts +52 -0
  14. package/dist/billing/usage-meter.js +52 -0
  15. package/dist/billing/usage-meter.js.map +1 -0
  16. package/dist/chart.d.ts +1 -0
  17. package/dist/chart.js +4 -0
  18. package/dist/chart.js.map +1 -1
  19. package/dist/components/alert-banner.js +2 -3
  20. package/dist/components/alert-banner.js.map +1 -1
  21. package/dist/components/amount-input.js +3 -15
  22. package/dist/components/amount-input.js.map +1 -1
  23. package/dist/components/autocomplete.js +2 -2
  24. package/dist/components/autocomplete.js.map +1 -1
  25. package/dist/components/bulk-action-bar.js +2 -1
  26. package/dist/components/bulk-action-bar.js.map +1 -1
  27. package/dist/components/button.d.ts +35 -1
  28. package/dist/components/button.js +5 -9
  29. package/dist/components/button.js.map +1 -1
  30. package/dist/components/calendar-heatmap.js +2 -2
  31. package/dist/components/calendar-heatmap.js.map +1 -1
  32. package/dist/components/camera-button.d.ts +89 -0
  33. package/dist/components/camera-button.js +122 -0
  34. package/dist/components/camera-button.js.map +1 -0
  35. package/dist/components/camera-capture.d.ts +66 -0
  36. package/dist/components/camera-capture.js +190 -0
  37. package/dist/components/camera-capture.js.map +1 -0
  38. package/dist/components/camera-labels.d.ts +20 -0
  39. package/dist/components/camera-labels.js +15 -0
  40. package/dist/components/camera-labels.js.map +1 -0
  41. package/dist/components/chart-edge.d.ts +9 -0
  42. package/dist/components/chart-edge.js +14 -3
  43. package/dist/components/chart-edge.js.map +1 -1
  44. package/dist/components/chart-zoom-core.js +34 -29
  45. package/dist/components/chart-zoom-core.js.map +1 -1
  46. package/dist/components/checkbox-group.js +1 -1
  47. package/dist/components/checkbox-group.js.map +1 -1
  48. package/dist/components/combobox-core.js +3 -2
  49. package/dist/components/combobox-core.js.map +1 -1
  50. package/dist/components/combobox.js +2 -2
  51. package/dist/components/combobox.js.map +1 -1
  52. package/dist/components/consent-again-notice-labels.d.ts +25 -0
  53. package/dist/components/consent-again-notice-labels.js +15 -0
  54. package/dist/components/consent-again-notice-labels.js.map +1 -0
  55. package/dist/components/consent-again-notice.d.ts +85 -0
  56. package/dist/components/consent-again-notice.js +94 -0
  57. package/dist/components/consent-again-notice.js.map +1 -0
  58. package/dist/components/country-select.js +2 -7
  59. package/dist/components/country-select.js.map +1 -1
  60. package/dist/components/currency-select.js +2 -2
  61. package/dist/components/currency-select.js.map +1 -1
  62. package/dist/components/danger-confirm.js +2 -2
  63. package/dist/components/danger-confirm.js.map +1 -1
  64. package/dist/components/data-table-column-settings.js +2 -2
  65. package/dist/components/data-table-column-settings.js.map +1 -1
  66. package/dist/components/data-table-fit.js.map +1 -1
  67. package/dist/components/data-table-virtual.js +13 -3
  68. package/dist/components/data-table-virtual.js.map +1 -1
  69. package/dist/components/date-field.js +2 -2
  70. package/dist/components/date-field.js.map +1 -1
  71. package/dist/components/date-picker.js +2 -2
  72. package/dist/components/date-picker.js.map +1 -1
  73. package/dist/components/date-range-picker.js +2 -6
  74. package/dist/components/date-range-picker.js.map +1 -1
  75. package/dist/components/dialog-frame.d.ts +3 -1
  76. package/dist/components/dialog-frame.js.map +1 -1
  77. package/dist/components/dropdown.js +7 -3
  78. package/dist/components/dropdown.js.map +1 -1
  79. package/dist/components/entity-combobox.js +2 -2
  80. package/dist/components/entity-combobox.js.map +1 -1
  81. package/dist/components/field-parts.d.ts +108 -6
  82. package/dist/components/field-parts.js +59 -6
  83. package/dist/components/field-parts.js.map +1 -1
  84. package/dist/components/field-suggestion-labels.d.ts +2 -0
  85. package/dist/components/field-suggestion-labels.js +10 -0
  86. package/dist/components/field-suggestion-labels.js.map +1 -0
  87. package/dist/components/field.js +1 -1
  88. package/dist/components/field.js.map +1 -1
  89. package/dist/components/file-button.d.ts +1 -1
  90. package/dist/components/file-button.js.map +1 -1
  91. package/dist/components/floating-panel.d.ts +7 -6
  92. package/dist/components/floating-panel.js +3 -17
  93. package/dist/components/floating-panel.js.map +1 -1
  94. package/dist/components/form-actions.d.ts +3 -2
  95. package/dist/components/form-actions.js.map +1 -1
  96. package/dist/components/hover-menu.js +3 -2
  97. package/dist/components/hover-menu.js.map +1 -1
  98. package/dist/components/icon-button.d.ts +23 -5
  99. package/dist/components/icon-button.js +6 -8
  100. package/dist/components/icon-button.js.map +1 -1
  101. package/dist/components/inline-confirm.js +2 -1
  102. package/dist/components/inline-confirm.js.map +1 -1
  103. package/dist/components/inline-entity-combobox.js +2 -2
  104. package/dist/components/inline-entity-combobox.js.map +1 -1
  105. package/dist/components/input.js +2 -2
  106. package/dist/components/input.js.map +1 -1
  107. package/dist/components/jump-calendar.js +3 -3
  108. package/dist/components/jump-calendar.js.map +1 -1
  109. package/dist/components/legal.d.ts +13 -1
  110. package/dist/components/legal.js +12 -0
  111. package/dist/components/legal.js.map +1 -1
  112. package/dist/components/legended-series-chart.d.ts +80 -0
  113. package/dist/components/legended-series-chart.js +70 -0
  114. package/dist/components/legended-series-chart.js.map +1 -0
  115. package/dist/components/lightbox.js +2 -1
  116. package/dist/components/lightbox.js.map +1 -1
  117. package/dist/components/mini-calendar.js +13 -5
  118. package/dist/components/mini-calendar.js.map +1 -1
  119. package/dist/components/modal.d.ts +23 -2
  120. package/dist/components/modal.js +24 -6
  121. package/dist/components/modal.js.map +1 -1
  122. package/dist/components/month-picker.d.ts +1 -1
  123. package/dist/components/month-picker.js +6 -6
  124. package/dist/components/month-picker.js.map +1 -1
  125. package/dist/components/multi-entity-combobox.js +2 -2
  126. package/dist/components/multi-entity-combobox.js.map +1 -1
  127. package/dist/components/multi-select.js +2 -6
  128. package/dist/components/multi-select.js.map +1 -1
  129. package/dist/components/number-input.js +2 -2
  130. package/dist/components/number-input.js.map +1 -1
  131. package/dist/components/page-header-layout.d.ts +18 -0
  132. package/dist/components/page-header-layout.js +23 -0
  133. package/dist/components/page-header-layout.js.map +1 -0
  134. package/dist/components/page-header-skeleton.d.ts +41 -0
  135. package/dist/components/page-header-skeleton.js +52 -0
  136. package/dist/components/page-header-skeleton.js.map +1 -0
  137. package/dist/components/page-header.js +4 -17
  138. package/dist/components/page-header.js.map +1 -1
  139. package/dist/components/popover.js +7 -2
  140. package/dist/components/popover.js.map +1 -1
  141. package/dist/components/release-notes-labels.d.ts +16 -0
  142. package/dist/components/release-notes-labels.js +18 -0
  143. package/dist/components/release-notes-labels.js.map +1 -0
  144. package/dist/components/release-notes.d.ts +65 -0
  145. package/dist/components/release-notes.js +65 -0
  146. package/dist/components/release-notes.js.map +1 -0
  147. package/dist/components/select.js +2 -2
  148. package/dist/components/select.js.map +1 -1
  149. package/dist/components/series-chart-labels.d.ts +9 -0
  150. package/dist/components/series-chart-labels.js +3 -1
  151. package/dist/components/series-chart-labels.js.map +1 -1
  152. package/dist/components/series-chart.d.ts +5 -0
  153. package/dist/components/series-chart.js +89 -36
  154. package/dist/components/series-chart.js.map +1 -1
  155. package/dist/components/toggle-group.js +3 -2
  156. package/dist/components/toggle-group.js.map +1 -1
  157. package/dist/components/treemap-layout.js.map +1 -1
  158. package/dist/components/treemap.d.ts +17 -15
  159. package/dist/components/treemap.js +167 -85
  160. package/dist/components/treemap.js.map +1 -1
  161. package/dist/eslint/index.js +1 -1
  162. package/dist/eslint/role-utilities.d.ts +2 -2
  163. package/dist/eslint/role-utilities.js.map +1 -1
  164. package/dist/feedback/feedback-inbox-page.d.ts +260 -0
  165. package/dist/feedback/feedback-inbox-page.js +207 -0
  166. package/dist/feedback/feedback-inbox-page.js.map +1 -0
  167. package/dist/feedback/feedback-vocabulary.js +2 -2
  168. package/dist/feedback/feedback-vocabulary.js.map +1 -1
  169. package/dist/feedback.d.ts +1 -0
  170. package/dist/feedback.js +6 -0
  171. package/dist/feedback.js.map +1 -1
  172. package/dist/hooks/use-debounce.d.ts +32 -5
  173. package/dist/hooks/use-debounce.js +6 -5
  174. package/dist/hooks/use-debounce.js.map +1 -1
  175. package/dist/hooks/use-file-picker.d.ts +3 -1
  176. package/dist/hooks/use-file-picker.js.map +1 -1
  177. package/dist/hooks/use-focus-trap.d.ts +19 -3
  178. package/dist/hooks/use-focus-trap.js +15 -5
  179. package/dist/hooks/use-focus-trap.js.map +1 -1
  180. package/dist/hooks/use-has-camera.d.ts +36 -0
  181. package/dist/hooks/use-has-camera.js +53 -0
  182. package/dist/hooks/use-has-camera.js.map +1 -0
  183. package/dist/hooks/use-hotkey.js +1 -10
  184. package/dist/hooks/use-hotkey.js.map +1 -1
  185. package/dist/hooks/use-overlay-history.d.ts +6 -1
  186. package/dist/hooks/use-overlay-history.js +10 -2
  187. package/dist/hooks/use-overlay-history.js.map +1 -1
  188. package/dist/i18n/defaults.js +11 -1
  189. package/dist/i18n/defaults.js.map +1 -1
  190. package/dist/i18n/german.js +75 -3
  191. package/dist/i18n/german.js.map +1 -1
  192. package/dist/i18n/kit-labels.d.ts +20 -0
  193. package/dist/i18n/kit-labels.js.map +1 -1
  194. package/dist/i18n/locales/en.js +92 -4
  195. package/dist/i18n/locales/en.js.map +3 -3
  196. package/dist/i18n/locales/es.js +71 -3
  197. package/dist/i18n/locales/es.js.map +1 -1
  198. package/dist/i18n/locales/fr.js +72 -2
  199. package/dist/i18n/locales/fr.js.map +1 -1
  200. package/dist/i18n/locales/hu.js +74 -3
  201. package/dist/i18n/locales/hu.js.map +1 -1
  202. package/dist/i18n/locales/it.js +74 -3
  203. package/dist/i18n/locales/it.js.map +1 -1
  204. package/dist/i18n/locales/zh.js +71 -3
  205. package/dist/i18n/locales/zh.js.map +1 -1
  206. package/dist/i18n/review.js +22 -1
  207. package/dist/i18n/review.js.map +1 -1
  208. package/dist/index.d.ts +24 -5
  209. package/dist/index.js +35 -1
  210. package/dist/index.js.map +1 -1
  211. package/dist/landing/landing-labels.d.ts +8 -0
  212. package/dist/landing/landing-labels.js +2 -1
  213. package/dist/landing/landing-labels.js.map +1 -1
  214. package/dist/lib/changelog.d.ts +130 -0
  215. package/dist/lib/changelog.js +137 -0
  216. package/dist/lib/changelog.js.map +1 -0
  217. package/dist/lib/clipboard-minus.js +2 -2
  218. package/dist/lib/clipboard-minus.js.map +1 -1
  219. package/dist/lib/dates.d.ts +29 -3
  220. package/dist/lib/dates.js +41 -12
  221. package/dist/lib/dates.js.map +1 -1
  222. package/dist/lib/editable-content.d.ts +33 -0
  223. package/dist/lib/editable-content.js +15 -0
  224. package/dist/lib/editable-content.js.map +1 -0
  225. package/dist/lib/focus-left.d.ts +47 -1
  226. package/dist/lib/focus-left.js +11 -2
  227. package/dist/lib/focus-left.js.map +1 -1
  228. package/dist/lib/server-wake.d.ts +49 -9
  229. package/dist/lib/server-wake.js +25 -14
  230. package/dist/lib/server-wake.js.map +1 -1
  231. package/dist/lib/session-refresh.d.ts +53 -0
  232. package/dist/lib/session-refresh.js +27 -1
  233. package/dist/lib/session-refresh.js.map +1 -1
  234. package/dist/rhf/fields.js +3 -3
  235. package/dist/rhf/fields.js.map +1 -1
  236. package/dist/shell/app-shell.d.ts +25 -1
  237. package/dist/shell/app-shell.js +3 -1
  238. package/dist/shell/app-shell.js.map +1 -1
  239. package/dist/shell/dev-menu.d.ts +3 -0
  240. package/dist/shell/dev-menu.js +4 -2
  241. package/dist/shell/dev-menu.js.map +1 -1
  242. package/dist/shell/held-changes-banner-labels.d.ts +23 -0
  243. package/dist/shell/held-changes-banner-labels.js +14 -0
  244. package/dist/shell/held-changes-banner-labels.js.map +1 -0
  245. package/dist/shell/held-changes-banner.d.ts +75 -0
  246. package/dist/shell/held-changes-banner.js +106 -0
  247. package/dist/shell/held-changes-banner.js.map +1 -0
  248. package/dist/shell/sync-status-indicator.d.ts +27 -12
  249. package/dist/shell/sync-status-indicator.js +13 -4
  250. package/dist/shell/sync-status-indicator.js.map +1 -1
  251. package/dist/shell/top-bar-parts-labels.d.ts +5 -0
  252. package/dist/shell/top-bar-parts-labels.js +3 -1
  253. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  254. package/dist/shell.d.ts +2 -0
  255. package/dist/shell.js +3 -0
  256. package/dist/shell.js.map +1 -1
  257. package/dist/sync/engine.d.ts +11 -2
  258. package/dist/sync/engine.js +13 -5
  259. package/dist/sync/engine.js.map +1 -1
  260. package/dist/sync/hooks.d.ts +3 -2
  261. package/dist/sync/hooks.js +4 -2
  262. package/dist/sync/hooks.js.map +1 -1
  263. package/dist/testing/css-variables.generated.d.ts +2 -2
  264. package/dist/testing/css-variables.generated.js +1 -1
  265. package/dist/testing/css-variables.generated.js.map +1 -1
  266. package/dist/theme/chart-palette.d.ts +18 -0
  267. package/dist/theme/chart-palette.js +17 -1
  268. package/dist/theme/chart-palette.js.map +1 -1
  269. package/dist/theme/contrast-tokens.d.ts +3 -3
  270. package/dist/theme/contrast-tokens.js.map +1 -1
  271. package/dist/theme/contrast.d.ts +4 -4
  272. package/dist/theme/contrast.js.map +1 -1
  273. package/dist/tour/tour-overlay.js +2 -1
  274. package/dist/tour/tour-overlay.js.map +1 -1
  275. package/package.json +5 -9
  276. package/tokens.css +19 -54
  277. package/src/account/account-parts.ts +0 -47
  278. package/src/account/account-settings-labels.ts +0 -240
  279. package/src/account/account-settings.tsx +0 -698
  280. package/src/account/data-export-setting-labels.ts +0 -20
  281. package/src/account/data-export-setting.tsx +0 -200
  282. package/src/account/delete-account-setting-labels.ts +0 -33
  283. package/src/account/delete-account-setting.tsx +0 -342
  284. package/src/account/email-change-setting-labels.ts +0 -31
  285. package/src/account/email-change-setting.tsx +0 -443
  286. package/src/account/passkeys-setting.tsx +0 -445
  287. package/src/account/sessions-setting-labels.ts +0 -24
  288. package/src/account/sessions-setting.tsx +0 -283
  289. package/src/admin/admin-action-confirm-labels.ts +0 -19
  290. package/src/admin/admin-action-confirm.tsx +0 -509
  291. package/src/admin/admin-action-log-labels.ts +0 -83
  292. package/src/admin/admin-action-log.tsx +0 -464
  293. package/src/admin/admin-area-labels.ts +0 -114
  294. package/src/admin/admin-forbidden.tsx +0 -75
  295. package/src/admin/admin-overview.tsx +0 -258
  296. package/src/admin/admin-parts.ts +0 -68
  297. package/src/admin/admin-sections.tsx +0 -208
  298. package/src/admin/admin-tool-links.tsx +0 -90
  299. package/src/admin/invitations-panel-labels.ts +0 -31
  300. package/src/admin/invitations-panel.tsx +0 -516
  301. package/src/admin/mail-test-card-labels.ts +0 -19
  302. package/src/admin/mail-test-card.tsx +0 -189
  303. package/src/admin/plan-change-labels.ts +0 -5
  304. package/src/admin/plan-change.tsx +0 -474
  305. package/src/admin/reviewer-scope-editor-labels.ts +0 -16
  306. package/src/admin/reviewer-scope-editor.tsx +0 -224
  307. package/src/admin/role-select-labels.ts +0 -16
  308. package/src/admin/role-select.tsx +0 -282
  309. package/src/admin/transfer-ownership-dialog-labels.ts +0 -20
  310. package/src/admin/transfer-ownership-dialog.tsx +0 -162
  311. package/src/admin/user-roster-labels.ts +0 -17
  312. package/src/admin/user-roster.tsx +0 -559
  313. package/src/auth/accept-invitation-labels.ts +0 -21
  314. package/src/auth/accept-invitation.tsx +0 -210
  315. package/src/auth/auth-errors-labels.ts +0 -23
  316. package/src/auth/auth-errors.ts +0 -439
  317. package/src/auth/complete-name-dialog-labels.ts +0 -16
  318. package/src/auth/complete-name-dialog.tsx +0 -253
  319. package/src/auth/email-tag.ts +0 -75
  320. package/src/auth/forgot-password-form-labels.ts +0 -20
  321. package/src/auth/forgot-password-form.tsx +0 -221
  322. package/src/auth/form-rules.ts +0 -40
  323. package/src/auth/new-password-fields.tsx +0 -85
  324. package/src/auth/not-found-page-labels.ts +0 -12
  325. package/src/auth/not-found-page.tsx +0 -95
  326. package/src/auth/register-form-labels.ts +0 -31
  327. package/src/auth/register-form.tsx +0 -456
  328. package/src/auth/reset-password-form-labels.ts +0 -27
  329. package/src/auth/reset-password-form.tsx +0 -341
  330. package/src/auth/sign-in-form-labels.ts +0 -44
  331. package/src/auth/sign-in-form.tsx +0 -858
  332. package/src/auth/status-parts.tsx +0 -132
  333. package/src/auth/verify-email-labels.ts +0 -26
  334. package/src/auth/verify-email.tsx +0 -445
  335. package/src/billing/billing-banner.tsx +0 -258
  336. package/src/billing/billing-labels.ts +0 -381
  337. package/src/billing/billing-lock.ts +0 -108
  338. package/src/billing/billing-overview.ts +0 -157
  339. package/src/billing/billing-standing.ts +0 -80
  340. package/src/billing/cancel-request.ts +0 -97
  341. package/src/billing/cancel-subscription.tsx +0 -98
  342. package/src/billing/checkout-processing.ts +0 -394
  343. package/src/billing/checkout-return.ts +0 -90
  344. package/src/billing/pay-page.ts +0 -330
  345. package/src/billing/plan-card.tsx +0 -562
  346. package/src/billing/plan-change-labels.ts +0 -66
  347. package/src/billing/plan-limit-notice.tsx +0 -148
  348. package/src/billing/plan-limit-toast.tsx +0 -90
  349. package/src/billing/plan-limit.ts +0 -52
  350. package/src/billing/plan-price.ts +0 -98
  351. package/src/billing/plan-switch.tsx +0 -216
  352. package/src/billing/provider-page.ts +0 -84
  353. package/src/billing/subscription-actions.tsx +0 -247
  354. package/src/billing/subscription-status-chip.tsx +0 -95
  355. package/src/chart.ts +0 -103
  356. package/src/components/account-chips-labels.ts +0 -16
  357. package/src/components/account-chips.tsx +0 -474
  358. package/src/components/alert-banner.tsx +0 -670
  359. package/src/components/amount-input.tsx +0 -816
  360. package/src/components/appearance-labels.ts +0 -63
  361. package/src/components/authed-image-labels.ts +0 -11
  362. package/src/components/authed-image.tsx +0 -209
  363. package/src/components/autocomplete.tsx +0 -645
  364. package/src/components/breadcrumbs-labels.ts +0 -10
  365. package/src/components/breadcrumbs.tsx +0 -205
  366. package/src/components/bulk-action-bar-labels.ts +0 -11
  367. package/src/components/bulk-action-bar.tsx +0 -443
  368. package/src/components/button-group.tsx +0 -223
  369. package/src/components/button-look.ts +0 -256
  370. package/src/components/button.tsx +0 -339
  371. package/src/components/calculator.tsx +0 -341
  372. package/src/components/calendar-heatmap-labels.ts +0 -15
  373. package/src/components/calendar-heatmap.tsx +0 -600
  374. package/src/components/card.tsx +0 -377
  375. package/src/components/chart-edge.ts +0 -106
  376. package/src/components/chart-figure.tsx +0 -35
  377. package/src/components/chart-height.ts +0 -30
  378. package/src/components/chart-zoom-core.tsx +0 -627
  379. package/src/components/chart-zoom.tsx +0 -22
  380. package/src/components/chart.tsx +0 -554
  381. package/src/components/checkbox-group.tsx +0 -247
  382. package/src/components/checkbox.tsx +0 -346
  383. package/src/components/chip-input.tsx +0 -370
  384. package/src/components/chip-labels.ts +0 -13
  385. package/src/components/chip.tsx +0 -843
  386. package/src/components/choice-card.tsx +0 -544
  387. package/src/components/column-mapper-labels.ts +0 -38
  388. package/src/components/column-mapper.tsx +0 -655
  389. package/src/components/combobox-core.tsx +0 -1321
  390. package/src/components/combobox-suggestions.tsx +0 -131
  391. package/src/components/combobox.tsx +0 -716
  392. package/src/components/confirm-context.ts +0 -7
  393. package/src/components/confirm-dialog-labels.ts +0 -13
  394. package/src/components/confirm-dialog.tsx +0 -341
  395. package/src/components/copy-button-labels.ts +0 -13
  396. package/src/components/copy-button.tsx +0 -192
  397. package/src/components/country-select-labels.ts +0 -11
  398. package/src/components/country-select.tsx +0 -539
  399. package/src/components/currency-option-list.tsx +0 -188
  400. package/src/components/currency-select.tsx +0 -343
  401. package/src/components/danger-confirm-labels.ts +0 -20
  402. package/src/components/danger-confirm.tsx +0 -987
  403. package/src/components/data-table-cells.tsx +0 -118
  404. package/src/components/data-table-column-settings.tsx +0 -198
  405. package/src/components/data-table-filter-popover.tsx +0 -289
  406. package/src/components/data-table-filters.ts +0 -315
  407. package/src/components/data-table-fit.ts +0 -301
  408. package/src/components/data-table-groups.tsx +0 -288
  409. package/src/components/data-table-head.tsx +0 -280
  410. package/src/components/data-table-labels.ts +0 -198
  411. package/src/components/data-table-leading-row.tsx +0 -58
  412. package/src/components/data-table-mobile.tsx +0 -1117
  413. package/src/components/data-table-pagination.tsx +0 -202
  414. package/src/components/data-table-resize.ts +0 -188
  415. package/src/components/data-table-row-actions.tsx +0 -302
  416. package/src/components/data-table-row.tsx +0 -496
  417. package/src/components/data-table-selection.ts +0 -71
  418. package/src/components/data-table-shared.tsx +0 -287
  419. package/src/components/data-table-sort.ts +0 -163
  420. package/src/components/data-table-virtual.ts +0 -576
  421. package/src/components/data-table.tsx +0 -2598
  422. package/src/components/date-field.tsx +0 -684
  423. package/src/components/date-format-setting.tsx +0 -64
  424. package/src/components/date-picker.tsx +0 -404
  425. package/src/components/date-range-picker.tsx +0 -518
  426. package/src/components/description-list-labels.ts +0 -9
  427. package/src/components/description-list.tsx +0 -386
  428. package/src/components/dialog-frame-labels.ts +0 -7
  429. package/src/components/dialog-frame.tsx +0 -284
  430. package/src/components/disclosure.tsx +0 -476
  431. package/src/components/dropdown.tsx +0 -461
  432. package/src/components/empty-state.tsx +0 -136
  433. package/src/components/entity-combobox.tsx +0 -422
  434. package/src/components/error-boundary-labels.ts +0 -20
  435. package/src/components/error-boundary.tsx +0 -675
  436. package/src/components/facing-pair.ts +0 -93
  437. package/src/components/field-base-labels.ts +0 -20
  438. package/src/components/field-base.tsx +0 -656
  439. package/src/components/field-parts.tsx +0 -825
  440. package/src/components/field-strip.tsx +0 -129
  441. package/src/components/field.tsx +0 -206
  442. package/src/components/file-button.tsx +0 -295
  443. package/src/components/file-dropzone.tsx +0 -559
  444. package/src/components/floating-panel-labels.ts +0 -10
  445. package/src/components/floating-panel.tsx +0 -828
  446. package/src/components/focus-ring.ts +0 -16
  447. package/src/components/form-actions-labels.ts +0 -11
  448. package/src/components/form-actions.tsx +0 -578
  449. package/src/components/full-bleed-dialog.tsx +0 -294
  450. package/src/components/grouped-picker.tsx +0 -184
  451. package/src/components/help-popover.tsx +0 -117
  452. package/src/components/hover-menu.tsx +0 -343
  453. package/src/components/iban-input-labels.ts +0 -14
  454. package/src/components/iban-input.tsx +0 -236
  455. package/src/components/icon-button.tsx +0 -959
  456. package/src/components/icon-picker-labels.ts +0 -13
  457. package/src/components/icon-picker.tsx +0 -232
  458. package/src/components/image-grid-labels.ts +0 -11
  459. package/src/components/image-grid.tsx +0 -202
  460. package/src/components/inline-confirm.tsx +0 -116
  461. package/src/components/inline-edit-field-labels.ts +0 -11
  462. package/src/components/inline-edit-field.tsx +0 -552
  463. package/src/components/inline-entity-combobox.tsx +0 -849
  464. package/src/components/input.tsx +0 -394
  465. package/src/components/jump-calendar.tsx +0 -265
  466. package/src/components/language-select.tsx +0 -93
  467. package/src/components/legal-labels.ts +0 -105
  468. package/src/components/legal-page.tsx +0 -711
  469. package/src/components/legal.tsx +0 -668
  470. package/src/components/lightbox-labels.ts +0 -18
  471. package/src/components/lightbox.tsx +0 -399
  472. package/src/components/line-items-labels.ts +0 -14
  473. package/src/components/line-items.tsx +0 -602
  474. package/src/components/list-labels.ts +0 -12
  475. package/src/components/list.tsx +0 -870
  476. package/src/components/loading-state.tsx +0 -78
  477. package/src/components/measured-grid-labels.ts +0 -25
  478. package/src/components/measured-grid.tsx +0 -837
  479. package/src/components/menu-item.tsx +0 -241
  480. package/src/components/mini-calendar-labels.ts +0 -17
  481. package/src/components/mini-calendar.tsx +0 -792
  482. package/src/components/modal.tsx +0 -534
  483. package/src/components/money-draft.ts +0 -83
  484. package/src/components/money-field.tsx +0 -76
  485. package/src/components/month-grid.tsx +0 -229
  486. package/src/components/month-picker-labels.ts +0 -22
  487. package/src/components/month-picker.tsx +0 -1087
  488. package/src/components/multi-entity-combobox.tsx +0 -369
  489. package/src/components/multi-select.tsx +0 -376
  490. package/src/components/nav-pills.tsx +0 -198
  491. package/src/components/number-field.tsx +0 -327
  492. package/src/components/number-input.tsx +0 -559
  493. package/src/components/numeric-field.ts +0 -169
  494. package/src/components/numpad-sheet.tsx +0 -285
  495. package/src/components/one-time-code-input.tsx +0 -270
  496. package/src/components/page-contents-labels.ts +0 -9
  497. package/src/components/page-contents.tsx +0 -282
  498. package/src/components/page-header-context.ts +0 -8
  499. package/src/components/page-header.tsx +0 -298
  500. package/src/components/password-strength-labels.ts +0 -22
  501. package/src/components/password-strength.tsx +0 -241
  502. package/src/components/phone-input-labels.ts +0 -10
  503. package/src/components/phone-input.tsx +0 -282
  504. package/src/components/picker-sheet.tsx +0 -330
  505. package/src/components/pie-chart-labels.ts +0 -40
  506. package/src/components/pie-chart.tsx +0 -480
  507. package/src/components/popover-labels.ts +0 -14
  508. package/src/components/popover.tsx +0 -268
  509. package/src/components/progress-bar-labels.ts +0 -10
  510. package/src/components/progress-bar.tsx +0 -479
  511. package/src/components/qr-code.tsx +0 -76
  512. package/src/components/reauth-dialog-labels.ts +0 -13
  513. package/src/components/reauth-dialog.tsx +0 -265
  514. package/src/components/row-actions-labels.ts +0 -12
  515. package/src/components/row-actions.tsx +0 -795
  516. package/src/components/scroll-area.tsx +0 -123
  517. package/src/components/search-field.tsx +0 -192
  518. package/src/components/select.tsx +0 -294
  519. package/src/components/separator.tsx +0 -33
  520. package/src/components/series-chart-axes.ts +0 -342
  521. package/src/components/series-chart-budget.ts +0 -150
  522. package/src/components/series-chart-labels.ts +0 -33
  523. package/src/components/series-chart-thin.ts +0 -180
  524. package/src/components/series-chart-ticks.ts +0 -194
  525. package/src/components/series-chart.tsx +0 -1906
  526. package/src/components/server-wake-labels.ts +0 -11
  527. package/src/components/server-wake.tsx +0 -129
  528. package/src/components/settings-fields.tsx +0 -237
  529. package/src/components/share-card-labels.ts +0 -30
  530. package/src/components/share-card.tsx +0 -675
  531. package/src/components/signature-pad-labels.ts +0 -24
  532. package/src/components/signature-pad.tsx +0 -747
  533. package/src/components/signed-amount-labels.ts +0 -10
  534. package/src/components/signed-amount.tsx +0 -336
  535. package/src/components/skeleton.tsx +0 -80
  536. package/src/components/slider.tsx +0 -338
  537. package/src/components/sparkline-labels.ts +0 -14
  538. package/src/components/sparkline.tsx +0 -322
  539. package/src/components/spinner.tsx +0 -81
  540. package/src/components/stat-tile-labels.ts +0 -15
  541. package/src/components/stat-tile.tsx +0 -754
  542. package/src/components/status-dot.tsx +0 -170
  543. package/src/components/swatch-picker-labels.ts +0 -10
  544. package/src/components/swatch-picker.tsx +0 -283
  545. package/src/components/swipeable-row.tsx +0 -386
  546. package/src/components/switch.tsx +0 -273
  547. package/src/components/table-skeleton.tsx +0 -136
  548. package/src/components/table.tsx +0 -647
  549. package/src/components/tabs-labels.ts +0 -13
  550. package/src/components/tabs.tsx +0 -693
  551. package/src/components/text-link.tsx +0 -359
  552. package/src/components/text.tsx +0 -150
  553. package/src/components/textarea.tsx +0 -330
  554. package/src/components/tile-radio.tsx +0 -332
  555. package/src/components/time-input.tsx +0 -121
  556. package/src/components/toast-labels.ts +0 -12
  557. package/src/components/toast.tsx +0 -519
  558. package/src/components/toggle-group.tsx +0 -752
  559. package/src/components/toggle-legend.tsx +0 -394
  560. package/src/components/tooltip.tsx +0 -1149
  561. package/src/components/translation-review-editor.tsx +0 -290
  562. package/src/components/translation-review-labels.ts +0 -181
  563. package/src/components/translation-review-parts.tsx +0 -272
  564. package/src/components/translation-review.tsx +0 -1240
  565. package/src/components/tree-view.tsx +0 -589
  566. package/src/components/treemap-labels.ts +0 -47
  567. package/src/components/treemap-layout.ts +0 -210
  568. package/src/components/treemap.tsx +0 -1184
  569. package/src/components/trigger-aria.ts +0 -44
  570. package/src/components/use-anchor-dir.ts +0 -20
  571. package/src/components/use-mobile-reveal.ts +0 -62
  572. package/src/components/use-table-state.ts +0 -753
  573. package/src/components/user-avatar.tsx +0 -116
  574. package/src/components/wizard-stepper.tsx +0 -42
  575. package/src/components/write-lock-labels.ts +0 -10
  576. package/src/components/write-lock.tsx +0 -253
  577. package/src/currencies.ts +0 -90
  578. package/src/data-table.ts +0 -42
  579. package/src/demo/demo-banner.tsx +0 -153
  580. package/src/demo/demo-countdown.ts +0 -136
  581. package/src/demo/demo-ended.tsx +0 -90
  582. package/src/demo/demo-labels.ts +0 -78
  583. package/src/demo/demo-session.ts +0 -32
  584. package/src/demo/demo-start.tsx +0 -156
  585. package/src/eslint/index.ts +0 -161
  586. package/src/eslint/role-utilities.generated.ts +0 -146
  587. package/src/eslint/role-utilities.ts +0 -233
  588. package/src/feedback/feedback-attachment-download.tsx +0 -77
  589. package/src/feedback/feedback-attachment-labels.ts +0 -37
  590. package/src/feedback/feedback-attachment.tsx +0 -1239
  591. package/src/feedback/feedback-capture.ts +0 -287
  592. package/src/feedback/feedback-comment-thread.tsx +0 -353
  593. package/src/feedback/feedback-context-labels.ts +0 -11
  594. package/src/feedback/feedback-context.tsx +0 -245
  595. package/src/feedback/feedback-crash.ts +0 -547
  596. package/src/feedback/feedback-diagnostics.tsx +0 -41
  597. package/src/feedback/feedback-dialog-labels.ts +0 -29
  598. package/src/feedback/feedback-dialog.tsx +0 -452
  599. package/src/feedback/feedback-entry-file.tsx +0 -150
  600. package/src/feedback/feedback-inbox.tsx +0 -552
  601. package/src/feedback/feedback-labels.ts +0 -144
  602. package/src/feedback/feedback-menu-labels.ts +0 -12
  603. package/src/feedback/feedback-menu.tsx +0 -177
  604. package/src/feedback/feedback-mutation.ts +0 -20
  605. package/src/feedback/feedback-page-link.ts +0 -90
  606. package/src/feedback/feedback-public-labels.ts +0 -81
  607. package/src/feedback/feedback-public-list.tsx +0 -524
  608. package/src/feedback/feedback-public-switch.tsx +0 -102
  609. package/src/feedback/feedback-public-types.ts +0 -101
  610. package/src/feedback/feedback-record.ts +0 -428
  611. package/src/feedback/feedback-replies-context.ts +0 -9
  612. package/src/feedback/feedback-replies.tsx +0 -343
  613. package/src/feedback/feedback-rework-entry-chip.tsx +0 -18
  614. package/src/feedback/feedback-row-detail-labels.ts +0 -31
  615. package/src/feedback/feedback-row-detail.tsx +0 -871
  616. package/src/feedback/feedback-status-undo.ts +0 -109
  617. package/src/feedback/feedback-submit-dialog.tsx +0 -131
  618. package/src/feedback/feedback-submit.tsx +0 -270
  619. package/src/feedback/feedback-swipe.tsx +0 -192
  620. package/src/feedback/feedback-table-labels.ts +0 -27
  621. package/src/feedback/feedback-table.tsx +0 -912
  622. package/src/feedback/feedback-thread-labels.ts +0 -22
  623. package/src/feedback/feedback-thread-parts-labels.ts +0 -41
  624. package/src/feedback/feedback-thread.tsx +0 -905
  625. package/src/feedback/feedback-vocabulary.ts +0 -263
  626. package/src/feedback/feedback-vote-button.tsx +0 -124
  627. package/src/feedback.ts +0 -116
  628. package/src/hooks/use-anchored-panel.ts +0 -396
  629. package/src/hooks/use-anchored-rect.ts +0 -77
  630. package/src/hooks/use-announce.ts +0 -85
  631. package/src/hooks/use-authed-src.ts +0 -167
  632. package/src/hooks/use-body-scroll-lock.ts +0 -119
  633. package/src/hooks/use-breakpoint.ts +0 -133
  634. package/src/hooks/use-close-transition.ts +0 -107
  635. package/src/hooks/use-copy-to-clipboard.ts +0 -122
  636. package/src/hooks/use-debounce.ts +0 -114
  637. package/src/hooks/use-dismiss.ts +0 -371
  638. package/src/hooks/use-document-title.ts +0 -33
  639. package/src/hooks/use-file-drop.ts +0 -121
  640. package/src/hooks/use-file-picker-labels.ts +0 -28
  641. package/src/hooks/use-file-picker.tsx +0 -359
  642. package/src/hooks/use-focus-trap.ts +0 -199
  643. package/src/hooks/use-hotkey.ts +0 -212
  644. package/src/hooks/use-large-text.ts +0 -41
  645. package/src/hooks/use-long-press.ts +0 -140
  646. package/src/hooks/use-media-query.ts +0 -39
  647. package/src/hooks/use-mounted.ts +0 -39
  648. package/src/hooks/use-noindex.ts +0 -37
  649. package/src/hooks/use-overlay-history.ts +0 -714
  650. package/src/hooks/use-row-swipe.ts +0 -207
  651. package/src/hooks/use-search-param-state.ts +0 -434
  652. package/src/hooks/use-windowed-rows.ts +0 -225
  653. package/src/i18n/defaults.ts +0 -267
  654. package/src/i18n/german.ts +0 -2059
  655. package/src/i18n/kit-labels.tsx +0 -1003
  656. package/src/i18n/languages.ts +0 -349
  657. package/src/i18n/locales/de-CH.ts +0 -24
  658. package/src/i18n/locales/en.ts +0 -267
  659. package/src/i18n/locales/es.ts +0 -1999
  660. package/src/i18n/locales/fr.ts +0 -2037
  661. package/src/i18n/locales/hu.ts +0 -2004
  662. package/src/i18n/locales/it.ts +0 -2014
  663. package/src/i18n/locales/zh.ts +0 -1912
  664. package/src/i18n/plurals.ts +0 -86
  665. package/src/i18n/review.ts +0 -475
  666. package/src/i18n/shared-labels.ts +0 -138
  667. package/src/i18n/swiss.ts +0 -29
  668. package/src/index.ts +0 -1191
  669. package/src/landing/access.ts +0 -93
  670. package/src/landing/landing-actions.tsx +0 -97
  671. package/src/landing/landing-labels.ts +0 -59
  672. package/src/landing/landing-sections.tsx +0 -341
  673. package/src/landing/page-seo.ts +0 -261
  674. package/src/landing/public-header.tsx +0 -121
  675. package/src/landing/public-page.tsx +0 -106
  676. package/src/landing/routing.tsx +0 -225
  677. package/src/lib/broadcast.ts +0 -52
  678. package/src/lib/calc.ts +0 -323
  679. package/src/lib/chip-edge-snap.ts +0 -212
  680. package/src/lib/clipboard-minus.ts +0 -107
  681. package/src/lib/clipping.ts +0 -34
  682. package/src/lib/cn.ts +0 -28
  683. package/src/lib/column-mapping.ts +0 -234
  684. package/src/lib/countries.ts +0 -91
  685. package/src/lib/data-attributes.ts +0 -14
  686. package/src/lib/date-format.ts +0 -227
  687. package/src/lib/dates.ts +0 -288
  688. package/src/lib/day-format.ts +0 -96
  689. package/src/lib/decimal-marks.ts +0 -108
  690. package/src/lib/describe-failure.ts +0 -18
  691. package/src/lib/device-settings.ts +0 -147
  692. package/src/lib/direction.ts +0 -74
  693. package/src/lib/document-navigation.ts +0 -17
  694. package/src/lib/document-title.ts +0 -41
  695. package/src/lib/download.ts +0 -172
  696. package/src/lib/float-clearance.ts +0 -70
  697. package/src/lib/floating-stack.ts +0 -70
  698. package/src/lib/focus-left.ts +0 -156
  699. package/src/lib/format.ts +0 -585
  700. package/src/lib/http-status.ts +0 -38
  701. package/src/lib/iban.ts +0 -251
  702. package/src/lib/ime.ts +0 -24
  703. package/src/lib/intl-cache.ts +0 -27
  704. package/src/lib/iso-day.ts +0 -13
  705. package/src/lib/lazy-with-fallback.ts +0 -82
  706. package/src/lib/logger.ts +0 -69
  707. package/src/lib/minus.ts +0 -50
  708. package/src/lib/path-pattern.ts +0 -55
  709. package/src/lib/person-name.ts +0 -155
  710. package/src/lib/phone.ts +0 -208
  711. package/src/lib/plain-text.ts +0 -22
  712. package/src/lib/presence.ts +0 -18
  713. package/src/lib/qr-encode.ts +0 -444
  714. package/src/lib/quiet-focus.ts +0 -32
  715. package/src/lib/reduced-motion.ts +0 -22
  716. package/src/lib/refs.ts +0 -22
  717. package/src/lib/round.ts +0 -43
  718. package/src/lib/safe-storage.ts +0 -119
  719. package/src/lib/server-wake.ts +0 -315
  720. package/src/lib/session-refresh.ts +0 -472
  721. package/src/lib/share-format.ts +0 -18
  722. package/src/lib/status-tone.ts +0 -43
  723. package/src/lib/strip-fade.ts +0 -287
  724. package/src/lib/table-text.ts +0 -554
  725. package/src/lib/text-case.ts +0 -19
  726. package/src/lib/text-match.ts +0 -169
  727. package/src/lib/thenable.ts +0 -19
  728. package/src/lib/translation-review.ts +0 -769
  729. package/src/notifications/device-zone-report.ts +0 -67
  730. package/src/notifications/feedback-notification-types-labels.ts +0 -33
  731. package/src/notifications/feedback-notification-types.ts +0 -71
  732. package/src/notifications/notification-bell.tsx +0 -119
  733. package/src/notifications/notification-inbox.tsx +0 -309
  734. package/src/notifications/notification-parts.tsx +0 -81
  735. package/src/notifications/notification-types-setting.tsx +0 -406
  736. package/src/notifications/notification-types.ts +0 -89
  737. package/src/notifications/notifications-labels.ts +0 -287
  738. package/src/notifications/push-device-setting.tsx +0 -230
  739. package/src/notifications/push-devices-setting.tsx +0 -374
  740. package/src/notifications/push-worker.ts +0 -168
  741. package/src/notifications/quiet-hours-setting.tsx +0 -238
  742. package/src/notifications/unsubscribe-panel.tsx +0 -200
  743. package/src/notifications/use-push-device.ts +0 -448
  744. package/src/offline/local-first.ts +0 -100
  745. package/src/offline/pwa-update-prompt-labels.ts +0 -9
  746. package/src/offline/pwa-update-prompt.tsx +0 -78
  747. package/src/offline/query-persistence.ts +0 -391
  748. package/src/offline/service-worker-updates.ts +0 -81
  749. package/src/offline/shared-computer-labels.ts +0 -8
  750. package/src/offline/shared-computer.tsx +0 -87
  751. package/src/offline/sign-out-pending-dialog-labels.ts +0 -21
  752. package/src/offline/sign-out-pending-dialog.tsx +0 -135
  753. package/src/offline.ts +0 -37
  754. package/src/push-worker.ts +0 -25
  755. package/src/rhf/fields.tsx +0 -2187
  756. package/src/rhf/form-core.tsx +0 -324
  757. package/src/rhf/form.tsx +0 -12
  758. package/src/rhf/line-items.tsx +0 -135
  759. package/src/rhf/use-rhf-wizard-step.ts +0 -104
  760. package/src/rhf.ts +0 -21
  761. package/src/search/command-palette-labels.ts +0 -16
  762. package/src/search/command-palette.tsx +0 -624
  763. package/src/search/global-search-labels.ts +0 -13
  764. package/src/search/global-search.tsx +0 -660
  765. package/src/search/search-index.ts +0 -283
  766. package/src/search/use-command-key.ts +0 -23
  767. package/src/search.ts +0 -14
  768. package/src/settings/device-reset-setting-labels.ts +0 -20
  769. package/src/settings/device-reset-setting.tsx +0 -116
  770. package/src/settings/settings-card-classes.ts +0 -11
  771. package/src/settings/settings-catalogue.ts +0 -150
  772. package/src/settings/settings-context.ts +0 -33
  773. package/src/settings/settings-heading.tsx +0 -67
  774. package/src/settings/settings-labels.ts +0 -87
  775. package/src/settings/settings-layout.tsx +0 -471
  776. package/src/settings/settings-section.tsx +0 -108
  777. package/src/settings/use-account-appearance.ts +0 -148
  778. package/src/settings/use-account-language.ts +0 -146
  779. package/src/settings/use-settings-focus.ts +0 -128
  780. package/src/settings/use-settings-route.ts +0 -258
  781. package/src/shell/account-menu-language.tsx +0 -130
  782. package/src/shell/account-menu-text-size.tsx +0 -80
  783. package/src/shell/admin-menu.tsx +0 -183
  784. package/src/shell/app-shell-labels.ts +0 -11
  785. package/src/shell/app-shell.tsx +0 -1560
  786. package/src/shell/auth-layout.tsx +0 -186
  787. package/src/shell/company-switcher-labels.ts +0 -13
  788. package/src/shell/company-switcher.tsx +0 -136
  789. package/src/shell/dev-menu.tsx +0 -257
  790. package/src/shell/fill-height.tsx +0 -45
  791. package/src/shell/language-code.ts +0 -5
  792. package/src/shell/option-switcher-menu.tsx +0 -84
  793. package/src/shell/sync-status-indicator.tsx +0 -303
  794. package/src/shell/top-bar-actions.tsx +0 -87
  795. package/src/shell/top-bar-brand.tsx +0 -78
  796. package/src/shell/top-bar-parts-labels.ts +0 -148
  797. package/src/shell/top-bar.tsx +0 -40
  798. package/src/shell/topbar-action-menu.tsx +0 -567
  799. package/src/shell/topbar-controls.tsx +0 -269
  800. package/src/shell/tour-menu.tsx +0 -187
  801. package/src/shell.ts +0 -108
  802. package/src/sync/db.ts +0 -129
  803. package/src/sync/engine.ts +0 -1011
  804. package/src/sync/hooks.ts +0 -98
  805. package/src/sync/testing.ts +0 -73
  806. package/src/sync/wire.ts +0 -61
  807. package/src/sync.ts +0 -37
  808. package/src/table-text.ts +0 -8
  809. package/src/testing/css-variables.generated.ts +0 -112
  810. package/src/testing/css-variables.ts +0 -189
  811. package/src/testing/index.ts +0 -29
  812. package/src/testing/react.ts +0 -58
  813. package/src/testing/tour.ts +0 -41
  814. package/src/testing/viewport.ts +0 -357
  815. package/src/theme/chart-palette.ts +0 -232
  816. package/src/theme/color.ts +0 -272
  817. package/src/theme/contrast-tokens.ts +0 -268
  818. package/src/theme/contrast.ts +0 -250
  819. package/src/theme/palette-derive.ts +0 -825
  820. package/src/theme/palette-presets.ts +0 -544
  821. package/src/theme/palette-store.ts +0 -108
  822. package/src/theme/text-size.ts +0 -289
  823. package/src/theme/theme-store.ts +0 -157
  824. package/src/tour/tour-catalogue-labels.ts +0 -75
  825. package/src/tour/tour-catalogue.tsx +0 -335
  826. package/src/tour/tour-dock.ts +0 -134
  827. package/src/tour/tour-engine.ts +0 -37
  828. package/src/tour/tour-gates.ts +0 -218
  829. package/src/tour/tour-guide-button.tsx +0 -64
  830. package/src/tour/tour-guide-labels.ts +0 -15
  831. package/src/tour/tour-info.ts +0 -144
  832. package/src/tour/tour-labels.ts +0 -23
  833. package/src/tour/tour-overlay.tsx +0 -1170
  834. package/src/tour/tour.tsx +0 -750
  835. package/src/tour/use-tour-progress.ts +0 -671
  836. package/src/tour/use-tour-url-sync.ts +0 -266
  837. package/src/tour.ts +0 -21
  838. package/src/vite-env.d.ts +0 -23
  839. package/src/wizard/stepper-nav.tsx +0 -360
  840. package/src/wizard/types.ts +0 -275
  841. package/src/wizard/use-wizard.ts +0 -560
  842. package/src/wizard/validation.ts +0 -39
  843. package/src/wizard/wizard-context.tsx +0 -74
  844. package/src/wizard/wizard-labels.ts +0 -29
  845. package/src/wizard/wizard-step.tsx +0 -76
  846. package/src/wizard/wizard-summary.tsx +0 -84
  847. package/src/wizard.ts +0 -15
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/use-hotkey.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\n\n/**\n * A key combination: modifiers and one key, joined by \"+\", case-insensitive —\n * `\"Ctrl+Shift+F\"`, `\"Mod+K\"`, `\"Alt+ArrowUp\"`, `\"Escape\"`, `\"?\"`.\n *\n * Modifiers: `Ctrl` (`Control`), `Meta` (`Cmd`, `Command`), `Shift`, `Alt` (`Option`),\n * and `Mod` — Cmd on Apple platforms, Ctrl everywhere else, the one to use for an\n * app shortcut. The key is `KeyboardEvent.key` (\"f\", \"Enter\", \"ArrowUp\", \"/\"), or a\n * `KeyboardEvent.code` (\"KeyF\", \"Digit1\") when the physical key is what matters.\n * Several combos: pass an array.\n */\nexport type Hotkey = string;\n\nexport interface UseHotkeyOptions {\n /** Off while `false` (default `true`). */\n enabled?: boolean;\n /** Call `preventDefault()` on a match (default `true`): Ctrl+Shift+F must not also\n * open the browser's own dialog. */\n preventDefault?: boolean;\n /** Where to listen. Default `document`. A ref, an element, or `window`. */\n target?: EventTarget | null | { current: EventTarget | null };\n /**\n * Fire while the focus is in a text field, select or contenteditable too. Default\n * `false`: a shortcut must not steal the letters someone is typing. A combo with Ctrl,\n * Meta or Alt is not typing — those still fire unless this is `\"never\"`.\n */\n allowInInputs?: boolean | \"never\";\n /** `keydown` (default) or `keyup`. */\n event?: \"keydown\" | \"keyup\";\n}\n\nexport interface ParsedHotkey {\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n alt: boolean;\n key: string;\n}\n\n/** Whether this is an Apple platform, where `Mod` means Cmd. */\nexport function isApplePlatform(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const nav = navigator as Navigator & { userAgentData?: { platform?: string } };\n return /mac|iphone|ipad|ipod/i.test(nav.userAgentData?.platform || nav.platform || nav.userAgent);\n}\n\n/** Parse one combo. `apple` decides what `Mod` is. Throws on an empty key. */\nexport function parseHotkey(combo: Hotkey, apple = isApplePlatform()): ParsedHotkey {\n const parts = combo\n .split(\"+\")\n .map((p) => p.trim())\n // \"Ctrl++\" is Ctrl and \"+\": an empty part after a \"+\" is the plus key itself.\n .map((p, i, all) => (p === \"\" && i === all.length - 1 ? \"+\" : p))\n .filter((p) => p !== \"\");\n const out: ParsedHotkey = { ctrl: false, meta: false, shift: false, alt: false, key: \"\" };\n for (const part of parts) {\n switch (part.toLowerCase()) {\n case \"ctrl\":\n case \"control\":\n out.ctrl = true;\n break;\n case \"meta\":\n case \"cmd\":\n case \"command\":\n out.meta = true;\n break;\n case \"mod\":\n if (apple) out.meta = true;\n else out.ctrl = true;\n break;\n case \"shift\":\n out.shift = true;\n break;\n case \"alt\":\n case \"option\":\n out.alt = true;\n break;\n default:\n out.key = part;\n }\n }\n if (!out.key) throw new Error(`useHotkey: \"${combo}\" names no key`);\n return out;\n}\n\nconst KEY_ALIASES: Record<string, string> = {\n esc: \"escape\",\n space: \" \",\n del: \"delete\",\n up: \"arrowup\",\n down: \"arrowdown\",\n left: \"arrowleft\",\n right: \"arrowright\",\n};\n\n/** One letter of a script other than Latin: what a Russian, Greek or Hebrew layout's letter keys type. */\nconst NON_LATIN_LETTER = /^(?!\\p{Script=Latin})\\p{L}$/u;\n\n/** Whether `e` is `combo` — every modifier as named (no more, no fewer), and the key. */\nexport function matchesHotkey(e: KeyboardEvent, combo: ParsedHotkey): boolean {\n if (e.ctrlKey !== combo.ctrl || e.metaKey !== combo.meta || e.altKey !== combo.alt) return false;\n const want = KEY_ALIASES[combo.key.toLowerCase()] ?? combo.key.toLowerCase();\n const key = (e.key ?? \"\").toLowerCase();\n const code = (e.code ?? \"\").toLowerCase();\n // On a non-Latin layout `key` is the local letter — Ctrl+K types \"л\" on a Russian one —\n // so a letter chord never fired there, ⌘K included (0.52 code review, use-hotkey.ts; the\n // hand-written ⌘K listener before 0.52 compared `key` alone and missed it too). The\n // physical key stands in for the letter there, and only there: a Latin layout's letter\n // is wherever it types (Dvorak's K is on QWERTY's V).\n const physical = /^[a-z]$/.test(want) && NON_LATIN_LETTER.test(e.key ?? \"\") && code === `key${want}`;\n if (key !== want && code !== want && !physical) return false;\n // Shift must match exactly for a letter or a named key; for a symbol it is how the\n // symbol is typed (\"?\" is Shift+/ on a US layout, a plain key on others), so an\n // unnamed Shift is not held against it. Space is a named key, not a symbol, though its\n // alias is one character: \"Space\" fired on Shift+Space, the browser's page-up, and\n // cancelled it (0.52 code review, use-hotkey.ts).\n const symbol = want.length === 1 && !/[a-z0-9 ]/.test(want);\n return symbol && !combo.shift ? true : e.shiftKey === combo.shift;\n}\n\n/**\n * Whether `el` is editable content — `isContentEditable`, read from the attributes where\n * the engine has no such property (keksdose audit follow-up, 2026-11-01). jsdom is one:\n * there a hotkey fired while typing in a contenteditable, so a test could not show the\n * editor keeping its letters, and an engine without the property would do the same.\n *\n * The nearest element with a `contenteditable` that names a state decides: `\"\"`,\n * `\"true\"` and `\"plaintext-only\"` edit, `\"false\"` does not — a `false` island inside an\n * editor is not typed in. Any other value is the attribute's invalid-value default,\n * which inherits, so the search goes on to the next one up. Keywords are\n * case-insensitive. None at all: editable only in a `designMode` document.\n */\nfunction isEditableContent(el: HTMLElement): boolean {\n const native = (el as { isContentEditable?: boolean }).isContentEditable;\n if (native !== undefined) return native;\n for (let at = el.closest(\"[contenteditable]\"); at; at = at.parentElement?.closest(\"[contenteditable]\") ?? null) {\n const state = (at.getAttribute(\"contenteditable\") ?? \"\").toLowerCase();\n if (state === \"\" || state === \"true\" || state === \"plaintext-only\") return true;\n if (state === \"false\") return false;\n }\n return el.ownerDocument.designMode === \"on\";\n}\n\n/** Is the focus somewhere that takes typed characters? */\nfunction isTypingTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (isEditableContent(target)) return true;\n if (target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement) return true;\n if (target instanceof HTMLInputElement) {\n return ![\"button\", \"checkbox\", \"radio\", \"submit\", \"reset\", \"range\", \"color\", \"file\", \"image\"].includes(target.type);\n }\n return false;\n}\n\n/**\n * Call `handler` when `combo` is pressed — kastlan's feedback button (Ctrl+Shift+F,\n * feedback-button:60) wired it by hand, and so will every next shortcut.\n *\n * - `Mod` is Cmd on a Mac and Ctrl elsewhere, read once per mount.\n * - Modifiers match EXACTLY: `\"Ctrl+K\"` does not fire on Ctrl+Shift+K.\n * - Typing in a field is left alone unless `allowInInputs`, except for a combo with\n * Ctrl / Meta / Alt, which no one types as text.\n * - A key held down fires once, not on every repeat — and its repeats are cancelled as\n * the first press was, or the browser acts on them.\n * - The newest `handler` is always called; changing it does not re-attach the listener.\n *\n * `useCommandKey` (the ⌘K palette hook) is this with `\"Mod+K\"` and `allowInInputs`\n * since 0.52, and FormActions' Ctrl/Cmd+Enter is {@link matchesHotkey} (refactor audit\n * 2026-10-30, DUP-12): one reading of a chord.\n */\nexport function useHotkey(\n combo: Hotkey | ReadonlyArray<Hotkey>,\n handler: (event: KeyboardEvent) => void,\n options: UseHotkeyOptions = {},\n): void {\n const { enabled = true, preventDefault = true, target, allowInInputs = false, event = \"keydown\" } = options;\n const handlerRef = useRef(handler);\n useEffect(() => {\n handlerRef.current = handler;\n });\n const key = typeof combo === \"string\" ? combo : combo.join(\"\\u0000\");\n const targetEl = target && \"current\" in target ? undefined : target;\n const targetRef = target && \"current\" in target ? target : undefined;\n\n useEffect(() => {\n if (!enabled) return;\n const node: EventTarget | null =\n targetRef?.current ?? targetEl ?? (typeof document === \"undefined\" ? null : document);\n if (!node) return;\n const apple = isApplePlatform();\n const parsed = key.split(\"\\u0000\").map((c) => parseHotkey(c, apple));\n const listener = (raw: Event) => {\n const e = raw as KeyboardEvent;\n const hit = parsed.find((p) => matchesHotkey(e, p));\n if (!hit) return;\n if (allowInInputs !== true && isTypingTarget(e.target)) {\n const chorded = hit.ctrl || hit.meta || hit.alt;\n if (allowInInputs === \"never\" || !chorded) return;\n }\n if (preventDefault) e.preventDefault();\n // A held key's repeats are cancelled like its first press, and call nothing. They\n // returned before the `preventDefault` once, so a held Ctrl+K's repeats reached the\n // browser's own Ctrl+K and took the focus out of the palette ⌘K had just opened\n // (0.52 code review, use-hotkey.ts; the hand-written ⌘K listener cancelled them).\n if (e.repeat) return;\n handlerRef.current(e);\n };\n node.addEventListener(event, listener);\n return () => node.removeEventListener(event, listener);\n }, [key, enabled, preventDefault, allowInInputs, event, targetEl, targetRef]);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/hooks/use-hotkey.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { isEditableContent } from \"../lib/editable-content\";\n\n/**\n * A key combination: modifiers and one key, joined by \"+\", case-insensitive —\n * `\"Ctrl+Shift+F\"`, `\"Mod+K\"`, `\"Alt+ArrowUp\"`, `\"Escape\"`, `\"?\"`.\n *\n * Modifiers: `Ctrl` (`Control`), `Meta` (`Cmd`, `Command`), `Shift`, `Alt` (`Option`),\n * and `Mod` — Cmd on Apple platforms, Ctrl everywhere else, the one to use for an\n * app shortcut. The key is `KeyboardEvent.key` (\"f\", \"Enter\", \"ArrowUp\", \"/\"), or a\n * `KeyboardEvent.code` (\"KeyF\", \"Digit1\") when the physical key is what matters.\n * Several combos: pass an array.\n */\nexport type Hotkey = string;\n\nexport interface UseHotkeyOptions {\n /** Off while `false` (default `true`). */\n enabled?: boolean;\n /** Call `preventDefault()` on a match (default `true`): Ctrl+Shift+F must not also\n * open the browser's own dialog. */\n preventDefault?: boolean;\n /** Where to listen. Default `document`. A ref, an element, or `window`. */\n target?: EventTarget | null | { current: EventTarget | null };\n /**\n * Fire while the focus is in a text field, select or contenteditable too. Default\n * `false`: a shortcut must not steal the letters someone is typing. A combo with Ctrl,\n * Meta or Alt is not typing — those still fire unless this is `\"never\"`.\n */\n allowInInputs?: boolean | \"never\";\n /** `keydown` (default) or `keyup`. */\n event?: \"keydown\" | \"keyup\";\n}\n\nexport interface ParsedHotkey {\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n alt: boolean;\n key: string;\n}\n\n/** Whether this is an Apple platform, where `Mod` means Cmd. */\nexport function isApplePlatform(): boolean {\n if (typeof navigator === \"undefined\") return false;\n const nav = navigator as Navigator & { userAgentData?: { platform?: string } };\n return /mac|iphone|ipad|ipod/i.test(nav.userAgentData?.platform || nav.platform || nav.userAgent);\n}\n\n/** Parse one combo. `apple` decides what `Mod` is. Throws on an empty key. */\nexport function parseHotkey(combo: Hotkey, apple = isApplePlatform()): ParsedHotkey {\n const parts = combo\n .split(\"+\")\n .map((p) => p.trim())\n // \"Ctrl++\" is Ctrl and \"+\": an empty part after a \"+\" is the plus key itself.\n .map((p, i, all) => (p === \"\" && i === all.length - 1 ? \"+\" : p))\n .filter((p) => p !== \"\");\n const out: ParsedHotkey = { ctrl: false, meta: false, shift: false, alt: false, key: \"\" };\n for (const part of parts) {\n switch (part.toLowerCase()) {\n case \"ctrl\":\n case \"control\":\n out.ctrl = true;\n break;\n case \"meta\":\n case \"cmd\":\n case \"command\":\n out.meta = true;\n break;\n case \"mod\":\n if (apple) out.meta = true;\n else out.ctrl = true;\n break;\n case \"shift\":\n out.shift = true;\n break;\n case \"alt\":\n case \"option\":\n out.alt = true;\n break;\n default:\n out.key = part;\n }\n }\n if (!out.key) throw new Error(`useHotkey: \"${combo}\" names no key`);\n return out;\n}\n\nconst KEY_ALIASES: Record<string, string> = {\n esc: \"escape\",\n space: \" \",\n del: \"delete\",\n up: \"arrowup\",\n down: \"arrowdown\",\n left: \"arrowleft\",\n right: \"arrowright\",\n};\n\n/** One letter of a script other than Latin: what a Russian, Greek or Hebrew layout's letter keys type. */\nconst NON_LATIN_LETTER = /^(?!\\p{Script=Latin})\\p{L}$/u;\n\n/** Whether `e` is `combo` — every modifier as named (no more, no fewer), and the key. */\nexport function matchesHotkey(e: KeyboardEvent, combo: ParsedHotkey): boolean {\n if (e.ctrlKey !== combo.ctrl || e.metaKey !== combo.meta || e.altKey !== combo.alt) return false;\n const want = KEY_ALIASES[combo.key.toLowerCase()] ?? combo.key.toLowerCase();\n const key = (e.key ?? \"\").toLowerCase();\n const code = (e.code ?? \"\").toLowerCase();\n // On a non-Latin layout `key` is the local letter — Ctrl+K types \"л\" on a Russian one —\n // so a letter chord never fired there, ⌘K included (0.52 code review, use-hotkey.ts; the\n // hand-written ⌘K listener before 0.52 compared `key` alone and missed it too). The\n // physical key stands in for the letter there, and only there: a Latin layout's letter\n // is wherever it types (Dvorak's K is on QWERTY's V).\n const physical = /^[a-z]$/.test(want) && NON_LATIN_LETTER.test(e.key ?? \"\") && code === `key${want}`;\n if (key !== want && code !== want && !physical) return false;\n // Shift must match exactly for a letter or a named key; for a symbol it is how the\n // symbol is typed (\"?\" is Shift+/ on a US layout, a plain key on others), so an\n // unnamed Shift is not held against it. Space is a named key, not a symbol, though its\n // alias is one character: \"Space\" fired on Shift+Space, the browser's page-up, and\n // cancelled it (0.52 code review, use-hotkey.ts).\n const symbol = want.length === 1 && !/[a-z0-9 ]/.test(want);\n return symbol && !combo.shift ? true : e.shiftKey === combo.shift;\n}\n\n/** Is the focus somewhere that takes typed characters? Editable content by the kit's one\n * rule (lib/editable-content; written here in 0.54, moved there for the tour, the bulk\n * bar and the clipboard in its follow-up). */\nfunction isTypingTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n if (isEditableContent(target)) return true;\n if (target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement) return true;\n if (target instanceof HTMLInputElement) {\n return ![\"button\", \"checkbox\", \"radio\", \"submit\", \"reset\", \"range\", \"color\", \"file\", \"image\"].includes(target.type);\n }\n return false;\n}\n\n/**\n * Call `handler` when `combo` is pressed — kastlan's feedback button (Ctrl+Shift+F,\n * feedback-button:60) wired it by hand, and so will every next shortcut.\n *\n * - `Mod` is Cmd on a Mac and Ctrl elsewhere, read once per mount.\n * - Modifiers match EXACTLY: `\"Ctrl+K\"` does not fire on Ctrl+Shift+K.\n * - Typing in a field is left alone unless `allowInInputs`, except for a combo with\n * Ctrl / Meta / Alt, which no one types as text.\n * - A key held down fires once, not on every repeat — and its repeats are cancelled as\n * the first press was, or the browser acts on them.\n * - The newest `handler` is always called; changing it does not re-attach the listener.\n *\n * `useCommandKey` (the ⌘K palette hook) is this with `\"Mod+K\"` and `allowInInputs`\n * since 0.52, and FormActions' Ctrl/Cmd+Enter is {@link matchesHotkey} (refactor audit\n * 2026-10-30, DUP-12): one reading of a chord.\n */\nexport function useHotkey(\n combo: Hotkey | ReadonlyArray<Hotkey>,\n handler: (event: KeyboardEvent) => void,\n options: UseHotkeyOptions = {},\n): void {\n const { enabled = true, preventDefault = true, target, allowInInputs = false, event = \"keydown\" } = options;\n const handlerRef = useRef(handler);\n useEffect(() => {\n handlerRef.current = handler;\n });\n const key = typeof combo === \"string\" ? combo : combo.join(\"\\u0000\");\n const targetEl = target && \"current\" in target ? undefined : target;\n const targetRef = target && \"current\" in target ? target : undefined;\n\n useEffect(() => {\n if (!enabled) return;\n const node: EventTarget | null =\n targetRef?.current ?? targetEl ?? (typeof document === \"undefined\" ? null : document);\n if (!node) return;\n const apple = isApplePlatform();\n const parsed = key.split(\"\\u0000\").map((c) => parseHotkey(c, apple));\n const listener = (raw: Event) => {\n const e = raw as KeyboardEvent;\n const hit = parsed.find((p) => matchesHotkey(e, p));\n if (!hit) return;\n if (allowInInputs !== true && isTypingTarget(e.target)) {\n const chorded = hit.ctrl || hit.meta || hit.alt;\n if (allowInInputs === \"never\" || !chorded) return;\n }\n if (preventDefault) e.preventDefault();\n // A held key's repeats are cancelled like its first press, and call nothing. They\n // returned before the `preventDefault` once, so a held Ctrl+K's repeats reached the\n // browser's own Ctrl+K and took the focus out of the palette ⌘K had just opened\n // (0.52 code review, use-hotkey.ts; the hand-written ⌘K listener cancelled them).\n if (e.repeat) return;\n handlerRef.current(e);\n };\n node.addEventListener(event, listener);\n return () => node.removeEventListener(event, listener);\n }, [key, enabled, preventDefault, allowInInputs, event, targetEl, targetRef]);\n}\n"],"mappings":"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","names":[]}
@@ -8,7 +8,12 @@
8
8
  * is in flight, DUP-3): Back does not call `onClose`, and the entry the
9
9
  * press took is put back, so the overlay still has one for the next
10
10
  * Back. Read when Back is pressed. Default false.
11
+ * @param options.onRefused called once for each Back `held` refused, after its entry is
12
+ * put back — how a held `Modal` hears the press it dropped and passes
13
+ * it on as `onDismissRefused("back")` (0.54 follow-up, keksdose
14
+ * recovery-code-pane).
11
15
  */
12
- export declare function useOverlayHistory(open: boolean, onClose: () => void, { held }?: {
16
+ export declare function useOverlayHistory(open: boolean, onClose: () => void, { held, onRefused }?: {
13
17
  held?: boolean;
18
+ onRefused?: () => void;
14
19
  }): void;
@@ -173,6 +173,7 @@ function closeOnPop() {
173
173
  if (currentSentinel() === top.id) return;
174
174
  if (top.held()) {
175
175
  putBack(top.id);
176
+ top.refused();
176
177
  return;
177
178
  }
178
179
  stack.pop();
@@ -211,18 +212,25 @@ function syncGestureListeners() {
211
212
  for (const type of SEEN_EVENTS) window.removeEventListener(type, noteSeenNowAndLater);
212
213
  }
213
214
  }
214
- function useOverlayHistory(open, onClose, { held = false } = {}) {
215
+ function useOverlayHistory(open, onClose, { held = false, onRefused } = {}) {
215
216
  const closeRef = useRef(onClose);
216
217
  const heldRef = useRef(held);
218
+ const refusedRef = useRef(onRefused);
217
219
  useEffect(() => {
218
220
  closeRef.current = onClose;
219
221
  heldRef.current = held;
222
+ refusedRef.current = onRefused;
220
223
  });
221
224
  useEffect(() => {
222
225
  if (!open || typeof window === "undefined") return;
223
226
  ensureListening();
224
227
  const id = `overlay-${nextId += 1}`;
225
- const entry = { id, close: () => closeRef.current(), held: () => heldRef.current };
228
+ const entry = {
229
+ id,
230
+ close: () => closeRef.current(),
231
+ held: () => heldRef.current,
232
+ refused: () => refusedRef.current?.()
233
+ };
226
234
  stack.push(entry);
227
235
  syncGestureListeners();
228
236
  const prev = window.history.state;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hooks/use-overlay-history.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\n\n/**\n * Back closes the overlay, not the page (Keksdose feedback #172).\n *\n * On a phone the Back gesture is the universal \"dismiss this\" — so a dialog or a\n * full-screen search surface that ignores it doesn't merely fail to close: the\n * navigation lands somewhere else entirely, and on a route with nothing beneath it\n * that means leaving the app with the overlay still notionally open.\n *\n * The mechanism is one throwaway, SAME-URL history entry pushed while the overlay is\n * up. Back then pops a same-document entry — no route change, no re-render of the\n * page under it — and this hook turns that pop into `onClose()`. Same trick the\n * transactions page already uses for its unsaved-edit trap\n * (`use-soft-leave-guard.ts`); the two coexist because they use different marker\n * keys AND because `handlePop` only claims a pop that actually consumed OUR entry\n * — a foreign sentinel stacked on top of ours pops back ONTO us, and an overlay\n * that closed on that would vanish mid-edit (feedback #424/#426).\n *\n * Not a URL parameter, deliberately. Encoding \"a dialog is open\" in the address bar\n * makes it shareable and restorable, which is wrong for the overlays this covers —\n * nobody wants to send someone a link that opens a confirm dialog — and it would\n * fight the page-owned `?row=` / `f.*` params that ARE meaningful state.\n *\n * ## Ordering\n *\n * The stack is module-level because correctness here is about order ACROSS\n * instances: every mounted overlay hears the same `popstate`, but only the one whose\n * entry was actually popped may close. Overlays nest and unwind last-in-first-out —\n * a dialog opened from a search surface closes before the surface — so the top of\n * this stack is by construction the entry the browser just popped.\n *\n * ## Not undoing a real navigation\n *\n * The cleanup pops our entry when the overlay closes some other way (a button,\n * Escape, a backdrop click) so history doesn't silently accumulate dead entries. It\n * first checks that our marker is still the CURRENT entry: if the user followed a\n * link while the overlay was open, the router has pushed on top of us, and a blind\n * `history.back()` there would undo their navigation.\n *\n * ## Not undoing the owner's own close\n *\n * Nor when the address under the entry changed in the same breath as the close\n * (keksdose dev #584). A page that opens its editor by PUSHING `?row=x` and closes it\n * by REPLACING the clean URL over the top entry rewrites OUR entry — the overlay sits\n * above `?row=x` — and that rewrite is what unmounts the overlay. Going back from there\n * lands on `?row=x` and the router opens the editor that was just closed. See\n * {@link noteAddress}: an address the overlay LIVED THROUGH (a filter the table wrote\n * while its sheet was up) is still unwound, because the user has acted since.\n *\n * ## Not undoing the owner's replaces either\n *\n * An address the overlay lived through is unwound as an ENTRY, never as an address\n * (keksdose live #412). A report that writes each tick of its payee sheet into the query\n * with `setSearchParams(…, { replace: true })` rewrites the overlay's own entry, and the\n * page entry beneath still carries the address from before the sheet opened — so the\n * traversal that took our entry away also took every tick with it. See {@link carryOnto}:\n * whichever way the entry goes (the unwind after a press, or a Back press), the address it\n * last showed is carried onto the entry it lands on, and the router is told.\n *\n * ## The traversal is deferred\n *\n * And it is *scheduled* rather than issued, because `history.go()` lands a task\n * later while everything this module knows is written synchronously. See\n * {@link Unwind}: an overlay opening inside that window adopts the entry instead\n * of stacking a second one on it, which is what makes the hook survive React\n * StrictMode's mount → clean up → mount (steering-design feedback #49).\n */\nconst SENTINEL_KEY = \"__hbUiOverlayHistory\";\n\ninterface OverlayEntry {\n id: string;\n close: () => void;\n /** The overlay refuses to close right now — see the `held` option. */\n held: () => boolean;\n}\n\nconst stack: OverlayEntry[] = [];\n\n/**\n * The sentinels we have PUSHED and not yet unwound, oldest first.\n *\n * The stack above tracks live overlays; this tracks live history entries, and the\n * two come apart in exactly one case — which is the bug this list exists for.\n * Nested overlays that close in the same commit unwind parent-first, so the dialog's\n * cleanup runs while the sheet's entry is still on top of its own. It cannot call\n * `history.back()` there (that would consume the SHEET's entry, and the sheet is\n * about to consume it itself), so its entry was simply abandoned: a husk with no\n * live owner sitting between the user and the page.\n *\n * The user paid for it on the next Back press. It popped the husk, `handlePop` found\n * an empty stack and returned, and nothing visible happened — Back had to be pressed\n * twice to leave the page.\n *\n * So an abandoned entry is recorded as `dead` instead, and whichever overlay DOES\n * get to unwind pays the debt with a single `history.go(-n)`. `href` is what keeps\n * that safe: only dead entries pushed at the address we are still sitting at are\n * unwound, so a router navigation that landed between two sentinels is never\n * reversed on the user's behalf.\n */\ninterface PushedEntry {\n id: string;\n /** The full address of the entry (query and hash included) as of the last time the\n * user acted while it was current — see {@link noteAddress}. */\n href: string;\n /** Its overlay is gone but the entry is not — someone above owes this pop. */\n dead: boolean;\n /** The router's `idx` on this entry when the marker went on — see {@link locate}. */\n idx: number | undefined;\n /** The router's `key` copied from the page entry beneath ours. */\n key: string | undefined;\n /** {@link routeOf} the address the marker was placed at. */\n route: string;\n /** The entry's address as last OBSERVED, after the user's last gesture had run its\n * handlers — what a Back press must carry down (see {@link carryOnto}). `href` is\n * the snapshot BEFORE the gesture, which the owner's-close check needs instead. */\n seen: string;\n}\nconst pushed: PushedEntry[] = [];\n\n/**\n * Entries of ours that a ROUTER NAVIGATION made from inside the overlay has left\n * behind — ours, still in the history, but no longer on top and no longer anyone's.\n *\n * Nothing can take an entry out from under a newer one, so they cannot be unwound;\n * what can be done is to not let the user land on one. A traversal that comes to\n * rest on a buried entry is carried straight on over the whole run of them, in the\n * direction it was going (see `skipBuried`): Back from the new page lands on the page\n * the overlay was opened from, Forward from there lands on the new page, and no press\n * is spent on an entry with nothing on screen for it.\n *\n * `below` / `above` count the buried entries of the same run on either side. The\n * router's `idx` tells the direction apart — except after a REPLACE navigation, when\n * the page above the run shares the run's `idx`; the two keys decide there.\n */\ninterface BuriedEntry {\n idx: number;\n /** The `idx` of the router entry that buried the run: higher after a push, the\n * same after a replace. */\n aboveIdx: number;\n /** The key of the page entry directly beneath the run. */\n belowKey: string | undefined;\n /** The key of the router entry that buried the run, when it did. */\n aboveKey: string | undefined;\n below: number;\n above: number;\n}\nconst buried = new Map<string, BuriedEntry>();\n\n/** The router `{idx, key}` of the entry the last traversal (or burial) left us on —\n * what `skipBuried` compares against to know which way the user was going. */\nlet lastSeen: { idx: number | undefined; key: string | undefined } | null = null;\n\n/** Entries a real Back press already consumed. Their overlay's cleanup still has to\n * run, and it must not mistake \"my entry is not current\" for \"my entry is buried\"\n * — it has no entry left at all. */\nconst consumed = new Set<string>();\n\n/** Pops WE caused (a cleanup unwinding its own entries) — their `popstate` is\n * bookkeeping, not a user gesture, and must not close a second overlay. A\n * `history.go(-n)` traversal fires exactly ONE popstate however far it travels. */\nlet pendingProgrammatic = 0;\nlet listening = false;\n/** Whether the gesture listeners ({@link noteAddress}, {@link noteSeen}) are on — see\n * {@link syncGestureListeners}. */\nlet noting = false;\nlet nextId = 0;\n\n/**\n * The unwind a cleanup has asked for and not yet issued.\n *\n * **`history.go()` is asynchronous and everything above is written\n * synchronously**, which is the seam the whole of this block exists to close.\n * The traversal lands a task later, so an overlay that opens in the *same* tick\n * as one that closed used to push its sentinel on top of the entry that was\n * about to be popped — and the pop then took the NEW entry. The overlay left on\n * screen had no entry of its own (so Back no longer closed it) and the old one\n * stayed behind as a husk between the user and their page.\n *\n * That is not an exotic race. **React StrictMode remounts every effect** — mount,\n * clean up, mount again, all in one commit — so in development *every* dialog\n * anyone opened left a husk behind, the position drifted one entry further from\n * the page on each open, and the Back press that was meant to leave the page was\n * spent on something invisible instead (steering-design feedback #49).\n *\n * So the traversal is deferred by a task, and an overlay mounting inside that\n * window **adopts** the entry instead of pushing a second one (see the effect).\n * Adoption is `replaceState` on an entry that is already there: no traversal, no\n * window in which the count can be wrong, and the StrictMode remount costs\n * exactly nothing.\n */\ninterface Unwind {\n timer: ReturnType<typeof setTimeout>;\n /** The sentinel on the entry to leave — the top of `entries`. */\n id: string;\n href: string;\n /** That entry plus the abandoned ones directly beneath it, oldest first. */\n entries: PushedEntry[];\n}\nlet unwind: Unwind | null = null;\n\n/** Issue the deferred traversal, if the ground has not moved under it.\n *\n * A real Back press or a router navigation during the deferred task leaves us\n * somewhere that is not the entry we meant to leave, and going back from there\n * would take something that is not ours. The entries are then simply forgotten\n * rather than handed back as `dead`: a forgotten entry costs one dead Back\n * press, while an over-counted one costs the user a navigation they did make. */\nfunction runUnwind(): void {\n const job = unwind;\n unwind = null;\n if (!job) return;\n if (currentSentinel() !== job.id || currentHref() !== job.href) {\n // A router navigation landed between the cleanup and this task: the entries\n // are under it (or were replaced by it) rather than simply forgotten.\n if (taggedSentinel() === null) buryUnder(job.entries);\n return;\n }\n const bottom = job.entries[0];\n carry = { href: job.href, idx: bottom.idx, key: bottom.key };\n pendingProgrammatic += 1;\n window.history.go(-job.entries.length);\n}\n\n/** The address an unwind in flight must carry onto the entry it lands on. */\nlet carry: { href: string; idx: number | undefined; key: string | undefined } | null = null;\n\n/**\n * Put `href` — the address the overlay's entry last showed — onto the entry a traversal\n * has just landed on, and tell the router (keksdose live #412).\n *\n * Only the query and the hash can differ: an address naming another page is a\n * navigation, never carried. And only onto the page entry the overlay was opened over,\n * which our push copied the router's `{idx, key}` from — a traversal that came to rest\n * anywhere else is not ours to rewrite.\n *\n * The router heard the traversal land on the OLD address in this same event, so a\n * `replaceState` alone would leave it showing the old query under the new one. A\n * synthetic `popstate` makes it read the address again; both reads happen in one event\n * dispatch, so React commits only the second. Ours absorbs it as programmatic.\n */\nfunction carryOnto(href: string, mark: { idx: number | undefined; key: string | undefined }): void {\n const here = currentHref();\n if (here === href || routeOf(here) !== routeOf(href)) return;\n const now = routerMark();\n if (mark.idx !== undefined && now.idx !== undefined && mark.idx !== now.idx) return;\n if (mark.key !== undefined && now.key !== undefined && mark.key !== now.key) return;\n const state: unknown = window.history.state;\n window.history.replaceState(state, \"\", href);\n pendingProgrammatic += 1;\n window.dispatchEvent(new PopStateEvent(\"popstate\", { state }));\n}\n\nfunction currentHref(): string {\n return typeof window === \"undefined\" ? \"\" : window.location.href;\n}\n\n/** The router's own `{idx, key}` on the current entry, where a router has put them. */\nfunction routerMark(): { idx: number | undefined; key: string | undefined } {\n const state = typeof window !== \"undefined\" ? (window.history.state as unknown) : null;\n if (!state || typeof state !== \"object\") return { idx: undefined, key: undefined };\n const { idx, key } = state as Record<string, unknown>;\n return { idx: typeof idx === \"number\" ? idx : undefined, key: typeof key === \"string\" ? key : undefined };\n}\n\n/**\n * The part of an address that names the PAGE — the query string left out.\n *\n * A `setSearchParams(…, { replace: true })` rewrites the query on the entry the\n * overlay is standing on; that is a wipe to repair, not a move. Anything else changing\n * is a navigation. Under a hash router the page lives in the hash (`#/table?f.q=x`), so\n * a hash that starts with `#/` counts up to its own `?`; an ordinary `#fragment` does\n * not name a page and is left out.\n */\nfunction routeOf(href: string): string {\n try {\n const url = new URL(href);\n const hashRoute = url.hash.startsWith(\"#/\") ? url.hash.split(\"?\")[0] : \"\";\n return url.origin + url.pathname + hashRoute;\n } catch {\n return href;\n }\n}\n\n/**\n * Is the untagged entry we are standing on still `p`'s — merely wiped by the router —\n * or an entry the router NAVIGATED to from inside the overlay?\n *\n * The router's `idx` is the one per-entry fact that separates the two, because it is\n * the one the router itself keeps straight: a replace leaves it as it was, a push adds\n * one. Our own push copies the page's state, so our entry carries the page's `idx` and\n * a router push on top of it carries one more. The key would not do — every replace\n * mints a new one, so the wipe this repair exists for would already fail it. Neither\n * would the address alone: a push to the address we are already at is still a push.\n *\n * `idx` does not see one move, the router REPLACING our entry with a different page\n * (same `idx`), so the page named by the address must also be unchanged. Where there is\n * no `idx` to compare (no router, or one that keeps none) the address is all there is.\n */\nfunction isStillOn(p: PushedEntry): boolean {\n if (routeOf(currentHref()) !== p.route) return false;\n const { idx } = routerMark();\n return idx === undefined || p.idx === undefined || idx === p.idx;\n}\n\n/**\n * The router has navigated while our entries were on top: record which of `records`\n * (ours, oldest first, ending with the top one) it buried and which it replaced, and\n * drop them from `pushed` — none of them can be unwound any more. Returns whether it\n * recognised a navigation at all; when it cannot tell (no router `idx` to go by), it\n * leaves everything as it was and the caller falls back to marking the entry dead.\n */\nfunction buryUnder(records: PushedEntry[]): boolean {\n const top = records[records.length - 1];\n const here = routerMark();\n if (!top || top.idx === undefined || here.idx === undefined) return false;\n let run: PushedEntry[];\n if (here.idx > top.idx) {\n run = [];\n for (let i = records.length - 1; i >= 0 && records[i].idx === top.idx; i -= 1) run.unshift(records[i]);\n } else if (here.idx === top.idx && !isStillOn(top)) {\n // Replaced: the top entry IS the new page now, and gone as ours. Those beneath it\n // are buried under it.\n run = [];\n for (let i = records.length - 2; i >= 0 && records[i].idx === top.idx; i -= 1) run.unshift(records[i]);\n } else {\n return false;\n }\n run.forEach((r, i) => {\n buried.set(r.id, {\n idx: top.idx as number,\n aboveIdx: here.idx as number,\n belowKey: run[0].key,\n aboveKey: here.key,\n below: i,\n above: run.length - 1 - i,\n });\n });\n for (const r of records) forgetPushed(r.id);\n lastSeen = here;\n return true;\n}\n\n/**\n * A traversal came to rest on one of our buried entries: carry it on over the run, the\n * way it was going. Back from above (a higher `idx`, or the very entry that buried us)\n * continues down to the page beneath; Forward from that page continues up. A landing\n * from anywhere this cannot place is left alone — one idle press is the price of not\n * guessing, and a wrong guess would move the user somewhere they did not ask to go.\n */\nfunction skipBuried(from: typeof lastSeen): void {\n const tag = taggedSentinel();\n const rec = tag !== null ? buried.get(tag) : undefined;\n if (!rec || !from || stack.some((e) => e.id === tag)) return;\n let steps = 0;\n if ((from.idx !== undefined && from.idx > rec.idx) || (from.key !== undefined && from.key === rec.aboveKey)) {\n steps = -(rec.below + 1);\n } else if (\n from.idx !== undefined &&\n // Below the run, or level with it when nothing above it is (a push buried it),\n // or level with it and provably the page beneath (a replace buried it). The\n // router's first entry has no key at all, so an absent key is a key here.\n (from.idx < rec.idx || (from.idx === rec.idx && (rec.aboveIdx > rec.idx || from.key === rec.belowKey)))\n ) {\n steps = rec.above + 1;\n }\n if (steps === 0) return;\n pendingProgrammatic += 1;\n window.history.go(steps);\n}\n\nfunction forgetPushed(id: string): void {\n const at = pushed.findIndex((p) => p.id === id);\n if (at >= 0) pushed.splice(at, 1);\n}\n\n/**\n * The sentinel this module believes is on the entry we are standing on.\n *\n * `history.state` is where the tag physically sits, because it is the only\n * per-entry storage a browser has — but it is not this module's storage, so\n * since the 2026-09-22 audit it is no longer read as the last word.\n * The ROUTER owns that object and writes it WHOLE: every\n * `setSearchParams(…, { replace: true })` stamps `{usr, key, idx}` over\n * whatever was there. A `DataTable` with `urlSync` does exactly that, on mount\n * and on every filter change — so an overlay opened from such a table had its\n * tag wiped off the entry it was standing on, and then:\n *\n * * its cleanup read \"not my entry\" and abandoned a live entry as a husk;\n * * the push path below could not find itself in `pushed`, so it discarded\n * every record it had (`splice(0)`) and nothing was ever unwound again;\n * * the StrictMode adoption never matched, so in development every dialog\n * pushed a second entry and the deferred `go(-1)` ate the live one — which\n * is Back no longer closing the overlay at all.\n *\n * So `standing` answers when the tag is gone: a MISSING tag on an entry we have\n * not left is a wipe to repair rather than a verdict. The tag is still read\n * FIRST wherever it is there, because it is the one thing that can see a FOREIGN\n * same-URL entry stacked above ours (feedback #424/#426, below) — module-level\n * bookkeeping cannot, since nobody tells us about someone else's `pushState`.\n */\nlet standing: string | null = null;\n\n/** The tag actually on the current entry, with no repair and no belief. */\nfunction taggedSentinel(): string | null {\n const state = typeof window !== \"undefined\" ? window.history.state : null;\n if (!state || typeof state !== \"object\") return null;\n const id = (state as Record<string, unknown>)[SENTINEL_KEY];\n return typeof id === \"string\" ? id : null;\n}\n\n/** Put our tag back on the current entry, keeping whatever the router has since\n * written there — we are a passenger in that object, not its owner. */\nfunction retag(id: string): void {\n const prev = window.history.state;\n window.history.replaceState({ ...(prev && typeof prev === \"object\" ? prev : {}), [SENTINEL_KEY]: id }, \"\");\n}\n\nfunction currentSentinel(): string | null {\n const tag = taggedSentinel();\n if (tag !== null) {\n standing = tag;\n return tag;\n }\n if (standing === null || typeof window === \"undefined\") return null;\n // Only ever re-stamp an entry we still hold a record for. Without that guard a\n // belief left over from an overlay that is long gone — a tab that has since\n // navigated, a test file that ran another case — would be stamped onto a\n // stranger's entry, and the next cleanup would traverse off it.\n //\n // And only an entry that is still the one the marker was placed on. A row that\n // NAVIGATES (a palette result, a dialog's link) has the router push the new page\n // before the overlay's cleanup runs; that entry carries no tag either, and\n // re-stamping it made the cleanup \"unwind\" the navigation itself — the page\n // changed and changed straight back. See `isStillOn` for how the two are told apart.\n const record = pushed.find((p) => p.id === standing);\n if (!record || !isStillOn(record)) {\n standing = null;\n return null;\n }\n retag(standing);\n return standing;\n}\n\n/**\n * The user is about to act: what the current entry's address is NOW is what the\n * overlay standing on it has lived through.\n *\n * The cleanup needs to tell two same-page query rewrites apart, and the address alone\n * cannot. A `DataTable` with `urlSync` replaces `f.*` over the entry while its filter\n * sheet is up, and the sheet is closed LATER, by a press of its own — that entry is\n * still the sheet's and must be unwound (the audit's drift fix, below). A page whose\n * `?row=` drives the overlay replaces the clean URL over the entry and the overlay\n * unmounts BECAUSE of it (keksdose dev #584) — that entry is the owner's now, and\n * unwinding lands on `?row=` beneath and reopens what was just closed. What separates\n * them is whether the user acted in between: the rewrite that closes an overlay is\n * made by the very press that closes it, so it postdates this snapshot.\n *\n * Capture phase, so the snapshot is taken before any handler of the press runs.\n */\nfunction noteAddress(): void {\n const top = pushed[pushed.length - 1];\n if (!top || top.dead || !stack.some((e) => e.id === top.id)) return;\n const tag = taggedSentinel();\n // Read without `currentSentinel`'s repair: an observation must not write history.\n if (tag === top.id || (tag === null && standing === top.id && isStillOn(top))) {\n top.href = currentHref();\n top.seen = top.href;\n }\n}\n\n/** After the user's gesture has run its handlers: the address its entry now shows —\n * what a Back press must carry down (keksdose live #412). Again a little later, for a\n * handler that writes the address a task after the event. */\nfunction noteSeen(): void {\n const top = pushed[pushed.length - 1];\n if (!top || top.dead || !stack.some((e) => e.id === top.id)) return;\n const tag = taggedSentinel();\n if (tag === top.id || (tag === null && standing === top.id && isStillOn(top))) top.seen = currentHref();\n}\n\nfunction noteSeenNowAndLater(): void {\n noteSeen();\n setTimeout(noteSeen, 0);\n}\n\nfunction handlePop() {\n // A pop MOVES us, so the belief is stale by definition: re-read it from the\n // entry we have landed on before anything below consults it, or the repair in\n // `currentSentinel` would stamp the entry we just left onto the one we are on.\n standing = taggedSentinel();\n const from = lastSeen;\n lastSeen = routerMark();\n if (pendingProgrammatic > 0) {\n pendingProgrammatic -= 1;\n const job = carry;\n carry = null;\n if (job) carryOnto(job.href, job);\n return;\n }\n closeOnPop();\n skipBuried(from);\n}\n\nfunction closeOnPop() {\n // Nothing open → an ordinary navigation, which is none of our business.\n const top = stack[stack.length - 1];\n if (!top) return;\n // We landed back ON the top overlay's own entry, so that entry was NOT what the\n // pop consumed — something stacked ABOVE it was (Keksdose feedback #424/#426).\n // The app layers a second same-URL sentinel of its own on top of ours for the\n // unsaved-edit trap (`use-soft-leave-guard.ts`), and it pops that sentinel every\n // time the form goes back to clean — twice-toggling one field was enough to\n // close the whole dialog. A pop is only ours when the entry we came to rest on\n // is no longer ours: either the layer below (a different overlay's marker) or\n // the plain page entry (none at all).\n if (currentSentinel() === top.id) return;\n // Checked before anything below moves: a held overlay keeps its place and its record.\n if (top.held()) {\n putBack(top.id);\n return;\n }\n stack.pop();\n syncGestureListeners();\n // The browser consumed this entry, so the overlay's own cleanup has nothing left\n // to unwind and nothing to record as owed.\n consumed.add(top.id);\n const record = pushed.find((p) => p.id === top.id);\n forgetPushed(top.id);\n // What the page wrote into the address while we were up stays (#412).\n if (record && !record.dead) carryOnto(record.seen, record);\n top.close();\n}\n\n/**\n * A Back press the top overlay refuses (a busy `Modal`, DUP-3). A popstate cannot be\n * refused — the browser has already left our entry — so the entry is put back: what the\n * page wrote into the address while the overlay was up is carried down first (#412), as\n * for a close, and the same marker is pushed again over it, as the mount pushed it. Left\n * on the page entry, the overlay would stay up with no entry of its own, and the Back\n * after its request would leave the page under it.\n *\n * A push and not `history.go(1)` back onto the old entry: a traversal lands a task later\n * and fires nothing at all if a listener has pushed meanwhile, and a programmatic pop\n * counted for it would then swallow the user's next real Back.\n */\nfunction putBack(id: string): void {\n const record = pushed.find((p) => p.id === id);\n if (record && !record.dead) carryOnto(record.seen, record);\n const prev: unknown = window.history.state;\n window.history.pushState({ ...(prev && typeof prev === \"object\" ? prev : {}), [SENTINEL_KEY]: id }, \"\");\n standing = id;\n // The address the entry shows now is the one the user last acted on: the cleanup's\n // owner's-close check (#584) must not read the carried address as a rewrite.\n if (record) record.href = record.seen = currentHref();\n}\n\n/** `popstate` stays from the first overlay on: a traversal of ours (an unwind, a buried\n * run to skip) lands after the overlay that caused it has gone. */\nfunction ensureListening() {\n if (listening || typeof window === \"undefined\") return;\n window.addEventListener(\"popstate\", handlePop);\n listening = true;\n}\n\nconst SEEN_EVENTS = [\"click\", \"keyup\", \"change\", \"input\"] as const;\n\n/**\n * The gesture listeners, on while an overlay is open and off when the last one closes.\n * Both notes return at once with no overlay up, but the four bubbling ones scheduled a\n * timer for their second look even then — for every click and every keystroke in every\n * field, for the life of the page after its first dialog (refactor audit 2026-10-30,\n * INP-14). Called after each change to `stack`.\n */\nfunction syncGestureListeners(): void {\n const want = stack.length > 0;\n if (want === noting || typeof window === \"undefined\") return;\n noting = want;\n if (want) {\n window.addEventListener(\"pointerdown\", noteAddress, true);\n window.addEventListener(\"keydown\", noteAddress, true);\n for (const type of SEEN_EVENTS) window.addEventListener(type, noteSeenNowAndLater);\n } else {\n window.removeEventListener(\"pointerdown\", noteAddress, true);\n window.removeEventListener(\"keydown\", noteAddress, true);\n for (const type of SEEN_EVENTS) window.removeEventListener(type, noteSeenNowAndLater);\n }\n}\n\n/**\n * Make the platform Back gesture dismiss an overlay.\n *\n * @param open whether the overlay is currently showing. Components that mount\n * only while open (the common case) pass `true`.\n * @param onClose the overlay's own close handler — the same one Escape calls.\n * @param options.held the overlay refuses to close right now (a `Modal` whose request\n * is in flight, DUP-3): Back does not call `onClose`, and the entry the\n * press took is put back, so the overlay still has one for the next\n * Back. Read when Back is pressed. Default false.\n */\nexport function useOverlayHistory(open: boolean, onClose: () => void, { held = false }: { held?: boolean } = {}): void {\n // The listener fires outside React's render, so it reads the latest handler\n // through a ref rather than through the closure the effect captured.\n const closeRef = useRef(onClose);\n const heldRef = useRef(held);\n useEffect(() => {\n closeRef.current = onClose;\n heldRef.current = held;\n });\n\n useEffect(() => {\n if (!open || typeof window === \"undefined\") return;\n ensureListening();\n const id = `overlay-${(nextId += 1)}`;\n const entry: OverlayEntry = { id, close: () => closeRef.current(), held: () => heldRef.current };\n stack.push(entry);\n syncGestureListeners();\n const prev = window.history.state;\n const marked = { ...(prev && typeof prev === \"object\" ? prev : {}), [SENTINEL_KEY]: id };\n // An entry that is on its way out and that we are still standing on is ours\n // to take over: same URL, same slot, only the marker changes. Pushing a\n // second one on top of it is what used to leave a husk on every StrictMode\n // remount — see {@link Unwind}.\n const adopting = unwind && unwind.id === currentSentinel() && unwind.href === currentHref();\n if (adopting && unwind) {\n clearTimeout(unwind.timer);\n const inherited = unwind.entries;\n unwind = null;\n // Preserve react-router's own `{usr,key,idx}` — we only swap the marker,\n // and the entry we are swapping it on is the one the router is already on.\n window.history.replaceState(marked, \"\");\n // The abandoned ones beneath come back owed; ours takes the top slot.\n for (const owed of inherited.slice(0, -1)) pushed.push({ ...owed, dead: true });\n const was = inherited[inherited.length - 1];\n pushed.push({\n id,\n href: currentHref(),\n seen: currentHref(),\n dead: false,\n idx: was.idx,\n key: was.key,\n route: was.route,\n });\n standing = id;\n } else {\n // A push DESTROYS every entry ahead of the one we are on, so anything we\n // still had recorded above our own position is gone. Kept, those would be\n // counted into a later `history.go(-n)` and the overshoot would come out\n // of a navigation the user actually made. Where we cannot tell which of\n // ours are beneath us — we are standing on a plain page entry, or on a\n // husk nobody tracks — none of them can be proven to be, so none survive.\n const under = pushed.findIndex((p) => p.id === currentSentinel());\n pushed.splice(under + 1);\n // Preserve react-router's own `{usr,key,idx}` — we only tack a marker on, and\n // the URL is unchanged, so the router treats popping this as a no-op re-render.\n window.history.pushState(marked, \"\");\n const page = routerMark();\n const at = currentHref();\n pushed.push({ id, href: at, seen: at, dead: false, idx: page.idx, key: page.key, route: routeOf(at) });\n standing = id;\n }\n return () => {\n const at = stack.indexOf(entry);\n if (at >= 0) stack.splice(at, 1);\n syncGestureListeners();\n\n // A Back press already took this entry; there is nothing to unwind or to owe.\n if (consumed.delete(id)) return;\n\n const mine = pushed.findIndex((p) => p.id === id);\n // Still our entry — same page, same router `idx` — but its address is not the one\n // the user last acted on: the owner rewrote it as part of closing us (see\n // {@link noteAddress}). The entry is the owner's page now, and the one beneath is\n // the address it replaced — going back would restore exactly what was closed.\n // Nothing to unwind; forget the record rather than re-stamp a page we left.\n if (mine >= 0 && currentHref() !== pushed[mine].href) {\n const tag = taggedSentinel();\n if (tag === id || (tag === null && standing === id && isStillOn(pushed[mine]))) {\n pushed.splice(mine, 1);\n if (standing === id) standing = null;\n return;\n }\n }\n // Only unwind an entry that is still THE current one. If a router push landed\n // on top of it, going back would undo the user's navigation instead — and if\n // a SIBLING overlay's sentinel landed on top, that overlay is about to unwind\n // and is the one that can take ours with it.\n if (currentSentinel() !== id) {\n // A router navigation from inside the overlay: nothing to unwind — the\n // entries it left beneath the new page are skipped over instead.\n if (mine >= 0 && taggedSentinel() === null && buryUnder(pushed.slice(0, pushed.length))) return;\n if (mine >= 0) pushed[mine].dead = true;\n return;\n }\n\n // Ours plus every abandoned entry lying directly beneath it at this address.\n // One traversal, so one popstate, so one programmatic pop to absorb.\n const here = currentHref();\n let steps = 1;\n while (steps <= mine && pushed[mine - steps].dead && pushed[mine - steps].href === here) {\n steps += 1;\n }\n const leaving = pushed.splice(mine - (steps - 1), steps);\n // Scheduled, not issued: an overlay opening in this same tick takes the\n // entry over instead, which is what makes the hook survive a StrictMode\n // remount. An unwind already waiting is dropped rather than merged — it\n // was the entry ABOVE ours and something has since moved off it, so its\n // count can no longer be proven, and an over-counted traversal costs a\n // navigation the user made while an under-counted one costs one dead Back.\n if (unwind) clearTimeout(unwind.timer);\n unwind = { timer: setTimeout(runUnwind, 0), id, href: here, entries: leaving };\n };\n }, [open]);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/hooks/use-overlay-history.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\n\n/**\n * Back closes the overlay, not the page (Keksdose feedback #172).\n *\n * On a phone the Back gesture is the universal \"dismiss this\" — so a dialog or a\n * full-screen search surface that ignores it doesn't merely fail to close: the\n * navigation lands somewhere else entirely, and on a route with nothing beneath it\n * that means leaving the app with the overlay still notionally open.\n *\n * The mechanism is one throwaway, SAME-URL history entry pushed while the overlay is\n * up. Back then pops a same-document entry — no route change, no re-render of the\n * page under it — and this hook turns that pop into `onClose()`. Same trick the\n * transactions page already uses for its unsaved-edit trap\n * (`use-soft-leave-guard.ts`); the two coexist because they use different marker\n * keys AND because `handlePop` only claims a pop that actually consumed OUR entry\n * — a foreign sentinel stacked on top of ours pops back ONTO us, and an overlay\n * that closed on that would vanish mid-edit (feedback #424/#426).\n *\n * Not a URL parameter, deliberately. Encoding \"a dialog is open\" in the address bar\n * makes it shareable and restorable, which is wrong for the overlays this covers —\n * nobody wants to send someone a link that opens a confirm dialog — and it would\n * fight the page-owned `?row=` / `f.*` params that ARE meaningful state.\n *\n * ## Ordering\n *\n * The stack is module-level because correctness here is about order ACROSS\n * instances: every mounted overlay hears the same `popstate`, but only the one whose\n * entry was actually popped may close. Overlays nest and unwind last-in-first-out —\n * a dialog opened from a search surface closes before the surface — so the top of\n * this stack is by construction the entry the browser just popped.\n *\n * ## Not undoing a real navigation\n *\n * The cleanup pops our entry when the overlay closes some other way (a button,\n * Escape, a backdrop click) so history doesn't silently accumulate dead entries. It\n * first checks that our marker is still the CURRENT entry: if the user followed a\n * link while the overlay was open, the router has pushed on top of us, and a blind\n * `history.back()` there would undo their navigation.\n *\n * ## Not undoing the owner's own close\n *\n * Nor when the address under the entry changed in the same breath as the close\n * (keksdose dev #584). A page that opens its editor by PUSHING `?row=x` and closes it\n * by REPLACING the clean URL over the top entry rewrites OUR entry — the overlay sits\n * above `?row=x` — and that rewrite is what unmounts the overlay. Going back from there\n * lands on `?row=x` and the router opens the editor that was just closed. See\n * {@link noteAddress}: an address the overlay LIVED THROUGH (a filter the table wrote\n * while its sheet was up) is still unwound, because the user has acted since.\n *\n * ## Not undoing the owner's replaces either\n *\n * An address the overlay lived through is unwound as an ENTRY, never as an address\n * (keksdose live #412). A report that writes each tick of its payee sheet into the query\n * with `setSearchParams(…, { replace: true })` rewrites the overlay's own entry, and the\n * page entry beneath still carries the address from before the sheet opened — so the\n * traversal that took our entry away also took every tick with it. See {@link carryOnto}:\n * whichever way the entry goes (the unwind after a press, or a Back press), the address it\n * last showed is carried onto the entry it lands on, and the router is told.\n *\n * ## The traversal is deferred\n *\n * And it is *scheduled* rather than issued, because `history.go()` lands a task\n * later while everything this module knows is written synchronously. See\n * {@link Unwind}: an overlay opening inside that window adopts the entry instead\n * of stacking a second one on it, which is what makes the hook survive React\n * StrictMode's mount → clean up → mount (steering-design feedback #49).\n */\nconst SENTINEL_KEY = \"__hbUiOverlayHistory\";\n\ninterface OverlayEntry {\n id: string;\n close: () => void;\n /** The overlay refuses to close right now — see the `held` option. */\n held: () => boolean;\n /** A Back press `held` refused — see the `onRefused` option. */\n refused: () => void;\n}\n\nconst stack: OverlayEntry[] = [];\n\n/**\n * The sentinels we have PUSHED and not yet unwound, oldest first.\n *\n * The stack above tracks live overlays; this tracks live history entries, and the\n * two come apart in exactly one case — which is the bug this list exists for.\n * Nested overlays that close in the same commit unwind parent-first, so the dialog's\n * cleanup runs while the sheet's entry is still on top of its own. It cannot call\n * `history.back()` there (that would consume the SHEET's entry, and the sheet is\n * about to consume it itself), so its entry was simply abandoned: a husk with no\n * live owner sitting between the user and the page.\n *\n * The user paid for it on the next Back press. It popped the husk, `handlePop` found\n * an empty stack and returned, and nothing visible happened — Back had to be pressed\n * twice to leave the page.\n *\n * So an abandoned entry is recorded as `dead` instead, and whichever overlay DOES\n * get to unwind pays the debt with a single `history.go(-n)`. `href` is what keeps\n * that safe: only dead entries pushed at the address we are still sitting at are\n * unwound, so a router navigation that landed between two sentinels is never\n * reversed on the user's behalf.\n */\ninterface PushedEntry {\n id: string;\n /** The full address of the entry (query and hash included) as of the last time the\n * user acted while it was current — see {@link noteAddress}. */\n href: string;\n /** Its overlay is gone but the entry is not — someone above owes this pop. */\n dead: boolean;\n /** The router's `idx` on this entry when the marker went on — see {@link locate}. */\n idx: number | undefined;\n /** The router's `key` copied from the page entry beneath ours. */\n key: string | undefined;\n /** {@link routeOf} the address the marker was placed at. */\n route: string;\n /** The entry's address as last OBSERVED, after the user's last gesture had run its\n * handlers — what a Back press must carry down (see {@link carryOnto}). `href` is\n * the snapshot BEFORE the gesture, which the owner's-close check needs instead. */\n seen: string;\n}\nconst pushed: PushedEntry[] = [];\n\n/**\n * Entries of ours that a ROUTER NAVIGATION made from inside the overlay has left\n * behind — ours, still in the history, but no longer on top and no longer anyone's.\n *\n * Nothing can take an entry out from under a newer one, so they cannot be unwound;\n * what can be done is to not let the user land on one. A traversal that comes to\n * rest on a buried entry is carried straight on over the whole run of them, in the\n * direction it was going (see `skipBuried`): Back from the new page lands on the page\n * the overlay was opened from, Forward from there lands on the new page, and no press\n * is spent on an entry with nothing on screen for it.\n *\n * `below` / `above` count the buried entries of the same run on either side. The\n * router's `idx` tells the direction apart — except after a REPLACE navigation, when\n * the page above the run shares the run's `idx`; the two keys decide there.\n */\ninterface BuriedEntry {\n idx: number;\n /** The `idx` of the router entry that buried the run: higher after a push, the\n * same after a replace. */\n aboveIdx: number;\n /** The key of the page entry directly beneath the run. */\n belowKey: string | undefined;\n /** The key of the router entry that buried the run, when it did. */\n aboveKey: string | undefined;\n below: number;\n above: number;\n}\nconst buried = new Map<string, BuriedEntry>();\n\n/** The router `{idx, key}` of the entry the last traversal (or burial) left us on —\n * what `skipBuried` compares against to know which way the user was going. */\nlet lastSeen: { idx: number | undefined; key: string | undefined } | null = null;\n\n/** Entries a real Back press already consumed. Their overlay's cleanup still has to\n * run, and it must not mistake \"my entry is not current\" for \"my entry is buried\"\n * — it has no entry left at all. */\nconst consumed = new Set<string>();\n\n/** Pops WE caused (a cleanup unwinding its own entries) — their `popstate` is\n * bookkeeping, not a user gesture, and must not close a second overlay. A\n * `history.go(-n)` traversal fires exactly ONE popstate however far it travels. */\nlet pendingProgrammatic = 0;\nlet listening = false;\n/** Whether the gesture listeners ({@link noteAddress}, {@link noteSeen}) are on — see\n * {@link syncGestureListeners}. */\nlet noting = false;\nlet nextId = 0;\n\n/**\n * The unwind a cleanup has asked for and not yet issued.\n *\n * **`history.go()` is asynchronous and everything above is written\n * synchronously**, which is the seam the whole of this block exists to close.\n * The traversal lands a task later, so an overlay that opens in the *same* tick\n * as one that closed used to push its sentinel on top of the entry that was\n * about to be popped — and the pop then took the NEW entry. The overlay left on\n * screen had no entry of its own (so Back no longer closed it) and the old one\n * stayed behind as a husk between the user and their page.\n *\n * That is not an exotic race. **React StrictMode remounts every effect** — mount,\n * clean up, mount again, all in one commit — so in development *every* dialog\n * anyone opened left a husk behind, the position drifted one entry further from\n * the page on each open, and the Back press that was meant to leave the page was\n * spent on something invisible instead (steering-design feedback #49).\n *\n * So the traversal is deferred by a task, and an overlay mounting inside that\n * window **adopts** the entry instead of pushing a second one (see the effect).\n * Adoption is `replaceState` on an entry that is already there: no traversal, no\n * window in which the count can be wrong, and the StrictMode remount costs\n * exactly nothing.\n */\ninterface Unwind {\n timer: ReturnType<typeof setTimeout>;\n /** The sentinel on the entry to leave — the top of `entries`. */\n id: string;\n href: string;\n /** That entry plus the abandoned ones directly beneath it, oldest first. */\n entries: PushedEntry[];\n}\nlet unwind: Unwind | null = null;\n\n/** Issue the deferred traversal, if the ground has not moved under it.\n *\n * A real Back press or a router navigation during the deferred task leaves us\n * somewhere that is not the entry we meant to leave, and going back from there\n * would take something that is not ours. The entries are then simply forgotten\n * rather than handed back as `dead`: a forgotten entry costs one dead Back\n * press, while an over-counted one costs the user a navigation they did make. */\nfunction runUnwind(): void {\n const job = unwind;\n unwind = null;\n if (!job) return;\n if (currentSentinel() !== job.id || currentHref() !== job.href) {\n // A router navigation landed between the cleanup and this task: the entries\n // are under it (or were replaced by it) rather than simply forgotten.\n if (taggedSentinel() === null) buryUnder(job.entries);\n return;\n }\n const bottom = job.entries[0];\n carry = { href: job.href, idx: bottom.idx, key: bottom.key };\n pendingProgrammatic += 1;\n window.history.go(-job.entries.length);\n}\n\n/** The address an unwind in flight must carry onto the entry it lands on. */\nlet carry: { href: string; idx: number | undefined; key: string | undefined } | null = null;\n\n/**\n * Put `href` — the address the overlay's entry last showed — onto the entry a traversal\n * has just landed on, and tell the router (keksdose live #412).\n *\n * Only the query and the hash can differ: an address naming another page is a\n * navigation, never carried. And only onto the page entry the overlay was opened over,\n * which our push copied the router's `{idx, key}` from — a traversal that came to rest\n * anywhere else is not ours to rewrite.\n *\n * The router heard the traversal land on the OLD address in this same event, so a\n * `replaceState` alone would leave it showing the old query under the new one. A\n * synthetic `popstate` makes it read the address again; both reads happen in one event\n * dispatch, so React commits only the second. Ours absorbs it as programmatic.\n */\nfunction carryOnto(href: string, mark: { idx: number | undefined; key: string | undefined }): void {\n const here = currentHref();\n if (here === href || routeOf(here) !== routeOf(href)) return;\n const now = routerMark();\n if (mark.idx !== undefined && now.idx !== undefined && mark.idx !== now.idx) return;\n if (mark.key !== undefined && now.key !== undefined && mark.key !== now.key) return;\n const state: unknown = window.history.state;\n window.history.replaceState(state, \"\", href);\n pendingProgrammatic += 1;\n window.dispatchEvent(new PopStateEvent(\"popstate\", { state }));\n}\n\nfunction currentHref(): string {\n return typeof window === \"undefined\" ? \"\" : window.location.href;\n}\n\n/** The router's own `{idx, key}` on the current entry, where a router has put them. */\nfunction routerMark(): { idx: number | undefined; key: string | undefined } {\n const state = typeof window !== \"undefined\" ? (window.history.state as unknown) : null;\n if (!state || typeof state !== \"object\") return { idx: undefined, key: undefined };\n const { idx, key } = state as Record<string, unknown>;\n return { idx: typeof idx === \"number\" ? idx : undefined, key: typeof key === \"string\" ? key : undefined };\n}\n\n/**\n * The part of an address that names the PAGE — the query string left out.\n *\n * A `setSearchParams(…, { replace: true })` rewrites the query on the entry the\n * overlay is standing on; that is a wipe to repair, not a move. Anything else changing\n * is a navigation. Under a hash router the page lives in the hash (`#/table?f.q=x`), so\n * a hash that starts with `#/` counts up to its own `?`; an ordinary `#fragment` does\n * not name a page and is left out.\n */\nfunction routeOf(href: string): string {\n try {\n const url = new URL(href);\n const hashRoute = url.hash.startsWith(\"#/\") ? url.hash.split(\"?\")[0] : \"\";\n return url.origin + url.pathname + hashRoute;\n } catch {\n return href;\n }\n}\n\n/**\n * Is the untagged entry we are standing on still `p`'s — merely wiped by the router —\n * or an entry the router NAVIGATED to from inside the overlay?\n *\n * The router's `idx` is the one per-entry fact that separates the two, because it is\n * the one the router itself keeps straight: a replace leaves it as it was, a push adds\n * one. Our own push copies the page's state, so our entry carries the page's `idx` and\n * a router push on top of it carries one more. The key would not do — every replace\n * mints a new one, so the wipe this repair exists for would already fail it. Neither\n * would the address alone: a push to the address we are already at is still a push.\n *\n * `idx` does not see one move, the router REPLACING our entry with a different page\n * (same `idx`), so the page named by the address must also be unchanged. Where there is\n * no `idx` to compare (no router, or one that keeps none) the address is all there is.\n */\nfunction isStillOn(p: PushedEntry): boolean {\n if (routeOf(currentHref()) !== p.route) return false;\n const { idx } = routerMark();\n return idx === undefined || p.idx === undefined || idx === p.idx;\n}\n\n/**\n * The router has navigated while our entries were on top: record which of `records`\n * (ours, oldest first, ending with the top one) it buried and which it replaced, and\n * drop them from `pushed` — none of them can be unwound any more. Returns whether it\n * recognised a navigation at all; when it cannot tell (no router `idx` to go by), it\n * leaves everything as it was and the caller falls back to marking the entry dead.\n */\nfunction buryUnder(records: PushedEntry[]): boolean {\n const top = records[records.length - 1];\n const here = routerMark();\n if (!top || top.idx === undefined || here.idx === undefined) return false;\n let run: PushedEntry[];\n if (here.idx > top.idx) {\n run = [];\n for (let i = records.length - 1; i >= 0 && records[i].idx === top.idx; i -= 1) run.unshift(records[i]);\n } else if (here.idx === top.idx && !isStillOn(top)) {\n // Replaced: the top entry IS the new page now, and gone as ours. Those beneath it\n // are buried under it.\n run = [];\n for (let i = records.length - 2; i >= 0 && records[i].idx === top.idx; i -= 1) run.unshift(records[i]);\n } else {\n return false;\n }\n run.forEach((r, i) => {\n buried.set(r.id, {\n idx: top.idx as number,\n aboveIdx: here.idx as number,\n belowKey: run[0].key,\n aboveKey: here.key,\n below: i,\n above: run.length - 1 - i,\n });\n });\n for (const r of records) forgetPushed(r.id);\n lastSeen = here;\n return true;\n}\n\n/**\n * A traversal came to rest on one of our buried entries: carry it on over the run, the\n * way it was going. Back from above (a higher `idx`, or the very entry that buried us)\n * continues down to the page beneath; Forward from that page continues up. A landing\n * from anywhere this cannot place is left alone — one idle press is the price of not\n * guessing, and a wrong guess would move the user somewhere they did not ask to go.\n */\nfunction skipBuried(from: typeof lastSeen): void {\n const tag = taggedSentinel();\n const rec = tag !== null ? buried.get(tag) : undefined;\n if (!rec || !from || stack.some((e) => e.id === tag)) return;\n let steps = 0;\n if ((from.idx !== undefined && from.idx > rec.idx) || (from.key !== undefined && from.key === rec.aboveKey)) {\n steps = -(rec.below + 1);\n } else if (\n from.idx !== undefined &&\n // Below the run, or level with it when nothing above it is (a push buried it),\n // or level with it and provably the page beneath (a replace buried it). The\n // router's first entry has no key at all, so an absent key is a key here.\n (from.idx < rec.idx || (from.idx === rec.idx && (rec.aboveIdx > rec.idx || from.key === rec.belowKey)))\n ) {\n steps = rec.above + 1;\n }\n if (steps === 0) return;\n pendingProgrammatic += 1;\n window.history.go(steps);\n}\n\nfunction forgetPushed(id: string): void {\n const at = pushed.findIndex((p) => p.id === id);\n if (at >= 0) pushed.splice(at, 1);\n}\n\n/**\n * The sentinel this module believes is on the entry we are standing on.\n *\n * `history.state` is where the tag physically sits, because it is the only\n * per-entry storage a browser has — but it is not this module's storage, so\n * since the 2026-09-22 audit it is no longer read as the last word.\n * The ROUTER owns that object and writes it WHOLE: every\n * `setSearchParams(…, { replace: true })` stamps `{usr, key, idx}` over\n * whatever was there. A `DataTable` with `urlSync` does exactly that, on mount\n * and on every filter change — so an overlay opened from such a table had its\n * tag wiped off the entry it was standing on, and then:\n *\n * * its cleanup read \"not my entry\" and abandoned a live entry as a husk;\n * * the push path below could not find itself in `pushed`, so it discarded\n * every record it had (`splice(0)`) and nothing was ever unwound again;\n * * the StrictMode adoption never matched, so in development every dialog\n * pushed a second entry and the deferred `go(-1)` ate the live one — which\n * is Back no longer closing the overlay at all.\n *\n * So `standing` answers when the tag is gone: a MISSING tag on an entry we have\n * not left is a wipe to repair rather than a verdict. The tag is still read\n * FIRST wherever it is there, because it is the one thing that can see a FOREIGN\n * same-URL entry stacked above ours (feedback #424/#426, below) — module-level\n * bookkeeping cannot, since nobody tells us about someone else's `pushState`.\n */\nlet standing: string | null = null;\n\n/** The tag actually on the current entry, with no repair and no belief. */\nfunction taggedSentinel(): string | null {\n const state = typeof window !== \"undefined\" ? window.history.state : null;\n if (!state || typeof state !== \"object\") return null;\n const id = (state as Record<string, unknown>)[SENTINEL_KEY];\n return typeof id === \"string\" ? id : null;\n}\n\n/** Put our tag back on the current entry, keeping whatever the router has since\n * written there — we are a passenger in that object, not its owner. */\nfunction retag(id: string): void {\n const prev = window.history.state;\n window.history.replaceState({ ...(prev && typeof prev === \"object\" ? prev : {}), [SENTINEL_KEY]: id }, \"\");\n}\n\nfunction currentSentinel(): string | null {\n const tag = taggedSentinel();\n if (tag !== null) {\n standing = tag;\n return tag;\n }\n if (standing === null || typeof window === \"undefined\") return null;\n // Only ever re-stamp an entry we still hold a record for. Without that guard a\n // belief left over from an overlay that is long gone — a tab that has since\n // navigated, a test file that ran another case — would be stamped onto a\n // stranger's entry, and the next cleanup would traverse off it.\n //\n // And only an entry that is still the one the marker was placed on. A row that\n // NAVIGATES (a palette result, a dialog's link) has the router push the new page\n // before the overlay's cleanup runs; that entry carries no tag either, and\n // re-stamping it made the cleanup \"unwind\" the navigation itself — the page\n // changed and changed straight back. See `isStillOn` for how the two are told apart.\n const record = pushed.find((p) => p.id === standing);\n if (!record || !isStillOn(record)) {\n standing = null;\n return null;\n }\n retag(standing);\n return standing;\n}\n\n/**\n * The user is about to act: what the current entry's address is NOW is what the\n * overlay standing on it has lived through.\n *\n * The cleanup needs to tell two same-page query rewrites apart, and the address alone\n * cannot. A `DataTable` with `urlSync` replaces `f.*` over the entry while its filter\n * sheet is up, and the sheet is closed LATER, by a press of its own — that entry is\n * still the sheet's and must be unwound (the audit's drift fix, below). A page whose\n * `?row=` drives the overlay replaces the clean URL over the entry and the overlay\n * unmounts BECAUSE of it (keksdose dev #584) — that entry is the owner's now, and\n * unwinding lands on `?row=` beneath and reopens what was just closed. What separates\n * them is whether the user acted in between: the rewrite that closes an overlay is\n * made by the very press that closes it, so it postdates this snapshot.\n *\n * Capture phase, so the snapshot is taken before any handler of the press runs.\n */\nfunction noteAddress(): void {\n const top = pushed[pushed.length - 1];\n if (!top || top.dead || !stack.some((e) => e.id === top.id)) return;\n const tag = taggedSentinel();\n // Read without `currentSentinel`'s repair: an observation must not write history.\n if (tag === top.id || (tag === null && standing === top.id && isStillOn(top))) {\n top.href = currentHref();\n top.seen = top.href;\n }\n}\n\n/** After the user's gesture has run its handlers: the address its entry now shows —\n * what a Back press must carry down (keksdose live #412). Again a little later, for a\n * handler that writes the address a task after the event. */\nfunction noteSeen(): void {\n const top = pushed[pushed.length - 1];\n if (!top || top.dead || !stack.some((e) => e.id === top.id)) return;\n const tag = taggedSentinel();\n if (tag === top.id || (tag === null && standing === top.id && isStillOn(top))) top.seen = currentHref();\n}\n\nfunction noteSeenNowAndLater(): void {\n noteSeen();\n setTimeout(noteSeen, 0);\n}\n\nfunction handlePop() {\n // A pop MOVES us, so the belief is stale by definition: re-read it from the\n // entry we have landed on before anything below consults it, or the repair in\n // `currentSentinel` would stamp the entry we just left onto the one we are on.\n standing = taggedSentinel();\n const from = lastSeen;\n lastSeen = routerMark();\n if (pendingProgrammatic > 0) {\n pendingProgrammatic -= 1;\n const job = carry;\n carry = null;\n if (job) carryOnto(job.href, job);\n return;\n }\n closeOnPop();\n skipBuried(from);\n}\n\nfunction closeOnPop() {\n // Nothing open → an ordinary navigation, which is none of our business.\n const top = stack[stack.length - 1];\n if (!top) return;\n // We landed back ON the top overlay's own entry, so that entry was NOT what the\n // pop consumed — something stacked ABOVE it was (Keksdose feedback #424/#426).\n // The app layers a second same-URL sentinel of its own on top of ours for the\n // unsaved-edit trap (`use-soft-leave-guard.ts`), and it pops that sentinel every\n // time the form goes back to clean — twice-toggling one field was enough to\n // close the whole dialog. A pop is only ours when the entry we came to rest on\n // is no longer ours: either the layer below (a different overlay's marker) or\n // the plain page entry (none at all).\n if (currentSentinel() === top.id) return;\n // Checked before anything below moves: a held overlay keeps its place and its record.\n if (top.held()) {\n putBack(top.id);\n // Told after the entry is back, so what the overlay does about it (a `Modal`'s\n // `onDismissRefused`) runs on its own entry, not on the page under it.\n top.refused();\n return;\n }\n stack.pop();\n syncGestureListeners();\n // The browser consumed this entry, so the overlay's own cleanup has nothing left\n // to unwind and nothing to record as owed.\n consumed.add(top.id);\n const record = pushed.find((p) => p.id === top.id);\n forgetPushed(top.id);\n // What the page wrote into the address while we were up stays (#412).\n if (record && !record.dead) carryOnto(record.seen, record);\n top.close();\n}\n\n/**\n * A Back press the top overlay refuses (a busy `Modal`, DUP-3). A popstate cannot be\n * refused — the browser has already left our entry — so the entry is put back: what the\n * page wrote into the address while the overlay was up is carried down first (#412), as\n * for a close, and the same marker is pushed again over it, as the mount pushed it. Left\n * on the page entry, the overlay would stay up with no entry of its own, and the Back\n * after its request would leave the page under it.\n *\n * A push and not `history.go(1)` back onto the old entry: a traversal lands a task later\n * and fires nothing at all if a listener has pushed meanwhile, and a programmatic pop\n * counted for it would then swallow the user's next real Back.\n */\nfunction putBack(id: string): void {\n const record = pushed.find((p) => p.id === id);\n if (record && !record.dead) carryOnto(record.seen, record);\n const prev: unknown = window.history.state;\n window.history.pushState({ ...(prev && typeof prev === \"object\" ? prev : {}), [SENTINEL_KEY]: id }, \"\");\n standing = id;\n // The address the entry shows now is the one the user last acted on: the cleanup's\n // owner's-close check (#584) must not read the carried address as a rewrite.\n if (record) record.href = record.seen = currentHref();\n}\n\n/** `popstate` stays from the first overlay on: a traversal of ours (an unwind, a buried\n * run to skip) lands after the overlay that caused it has gone. */\nfunction ensureListening() {\n if (listening || typeof window === \"undefined\") return;\n window.addEventListener(\"popstate\", handlePop);\n listening = true;\n}\n\nconst SEEN_EVENTS = [\"click\", \"keyup\", \"change\", \"input\"] as const;\n\n/**\n * The gesture listeners, on while an overlay is open and off when the last one closes.\n * Both notes return at once with no overlay up, but the four bubbling ones scheduled a\n * timer for their second look even then — for every click and every keystroke in every\n * field, for the life of the page after its first dialog (refactor audit 2026-10-30,\n * INP-14). Called after each change to `stack`.\n */\nfunction syncGestureListeners(): void {\n const want = stack.length > 0;\n if (want === noting || typeof window === \"undefined\") return;\n noting = want;\n if (want) {\n window.addEventListener(\"pointerdown\", noteAddress, true);\n window.addEventListener(\"keydown\", noteAddress, true);\n for (const type of SEEN_EVENTS) window.addEventListener(type, noteSeenNowAndLater);\n } else {\n window.removeEventListener(\"pointerdown\", noteAddress, true);\n window.removeEventListener(\"keydown\", noteAddress, true);\n for (const type of SEEN_EVENTS) window.removeEventListener(type, noteSeenNowAndLater);\n }\n}\n\n/**\n * Make the platform Back gesture dismiss an overlay.\n *\n * @param open whether the overlay is currently showing. Components that mount\n * only while open (the common case) pass `true`.\n * @param onClose the overlay's own close handler — the same one Escape calls.\n * @param options.held the overlay refuses to close right now (a `Modal` whose request\n * is in flight, DUP-3): Back does not call `onClose`, and the entry the\n * press took is put back, so the overlay still has one for the next\n * Back. Read when Back is pressed. Default false.\n * @param options.onRefused called once for each Back `held` refused, after its entry is\n * put back — how a held `Modal` hears the press it dropped and passes\n * it on as `onDismissRefused(\"back\")` (0.54 follow-up, keksdose\n * recovery-code-pane).\n */\nexport function useOverlayHistory(\n open: boolean,\n onClose: () => void,\n { held = false, onRefused }: { held?: boolean; onRefused?: () => void } = {},\n): void {\n // The listener fires outside React's render, so it reads the latest handler\n // through a ref rather than through the closure the effect captured.\n const closeRef = useRef(onClose);\n const heldRef = useRef(held);\n const refusedRef = useRef(onRefused);\n useEffect(() => {\n closeRef.current = onClose;\n heldRef.current = held;\n refusedRef.current = onRefused;\n });\n\n useEffect(() => {\n if (!open || typeof window === \"undefined\") return;\n ensureListening();\n const id = `overlay-${(nextId += 1)}`;\n const entry: OverlayEntry = {\n id,\n close: () => closeRef.current(),\n held: () => heldRef.current,\n refused: () => refusedRef.current?.(),\n };\n stack.push(entry);\n syncGestureListeners();\n const prev = window.history.state;\n const marked = { ...(prev && typeof prev === \"object\" ? prev : {}), [SENTINEL_KEY]: id };\n // An entry that is on its way out and that we are still standing on is ours\n // to take over: same URL, same slot, only the marker changes. Pushing a\n // second one on top of it is what used to leave a husk on every StrictMode\n // remount — see {@link Unwind}.\n const adopting = unwind && unwind.id === currentSentinel() && unwind.href === currentHref();\n if (adopting && unwind) {\n clearTimeout(unwind.timer);\n const inherited = unwind.entries;\n unwind = null;\n // Preserve react-router's own `{usr,key,idx}` — we only swap the marker,\n // and the entry we are swapping it on is the one the router is already on.\n window.history.replaceState(marked, \"\");\n // The abandoned ones beneath come back owed; ours takes the top slot.\n for (const owed of inherited.slice(0, -1)) pushed.push({ ...owed, dead: true });\n const was = inherited[inherited.length - 1];\n pushed.push({\n id,\n href: currentHref(),\n seen: currentHref(),\n dead: false,\n idx: was.idx,\n key: was.key,\n route: was.route,\n });\n standing = id;\n } else {\n // A push DESTROYS every entry ahead of the one we are on, so anything we\n // still had recorded above our own position is gone. Kept, those would be\n // counted into a later `history.go(-n)` and the overshoot would come out\n // of a navigation the user actually made. Where we cannot tell which of\n // ours are beneath us — we are standing on a plain page entry, or on a\n // husk nobody tracks — none of them can be proven to be, so none survive.\n const under = pushed.findIndex((p) => p.id === currentSentinel());\n pushed.splice(under + 1);\n // Preserve react-router's own `{usr,key,idx}` — we only tack a marker on, and\n // the URL is unchanged, so the router treats popping this as a no-op re-render.\n window.history.pushState(marked, \"\");\n const page = routerMark();\n const at = currentHref();\n pushed.push({ id, href: at, seen: at, dead: false, idx: page.idx, key: page.key, route: routeOf(at) });\n standing = id;\n }\n return () => {\n const at = stack.indexOf(entry);\n if (at >= 0) stack.splice(at, 1);\n syncGestureListeners();\n\n // A Back press already took this entry; there is nothing to unwind or to owe.\n if (consumed.delete(id)) return;\n\n const mine = pushed.findIndex((p) => p.id === id);\n // Still our entry — same page, same router `idx` — but its address is not the one\n // the user last acted on: the owner rewrote it as part of closing us (see\n // {@link noteAddress}). The entry is the owner's page now, and the one beneath is\n // the address it replaced — going back would restore exactly what was closed.\n // Nothing to unwind; forget the record rather than re-stamp a page we left.\n if (mine >= 0 && currentHref() !== pushed[mine].href) {\n const tag = taggedSentinel();\n if (tag === id || (tag === null && standing === id && isStillOn(pushed[mine]))) {\n pushed.splice(mine, 1);\n if (standing === id) standing = null;\n return;\n }\n }\n // Only unwind an entry that is still THE current one. If a router push landed\n // on top of it, going back would undo the user's navigation instead — and if\n // a SIBLING overlay's sentinel landed on top, that overlay is about to unwind\n // and is the one that can take ours with it.\n if (currentSentinel() !== id) {\n // A router navigation from inside the overlay: nothing to unwind — the\n // entries it left beneath the new page are skipped over instead.\n if (mine >= 0 && taggedSentinel() === null && buryUnder(pushed.slice(0, pushed.length))) return;\n if (mine >= 0) pushed[mine].dead = true;\n return;\n }\n\n // Ours plus every abandoned entry lying directly beneath it at this address.\n // One traversal, so one popstate, so one programmatic pop to absorb.\n const here = currentHref();\n let steps = 1;\n while (steps <= mine && pushed[mine - steps].dead && pushed[mine - steps].href === here) {\n steps += 1;\n }\n const leaving = pushed.splice(mine - (steps - 1), steps);\n // Scheduled, not issued: an overlay opening in this same tick takes the\n // entry over instead, which is what makes the hook survive a StrictMode\n // remount. An unwind already waiting is dropped rather than merged — it\n // was the entry ABOVE ours and something has since moved off it, so its\n // count can no longer be proven, and an over-counted traversal costs a\n // navigation the user made while an under-counted one costs one dead Back.\n if (unwind) clearTimeout(unwind.timer);\n unwind = { timer: setTimeout(runUnwind, 0), id, href: here, entries: leaving };\n };\n }, [open]);\n}\n"],"mappings":"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","names":[]}
@@ -26,6 +26,7 @@ import { DEFAULT_SWATCH_PICKER_LABELS } from "../components/swatch-picker-labels
26
26
  import { DEFAULT_ICON_PICKER_LABELS } from "../components/icon-picker-labels.js";
27
27
  import { DEFAULT_DIALOG_FRAME_LABELS } from "../components/dialog-frame-labels.js";
28
28
  import { DEFAULT_FILE_PICKER_LABELS } from "../hooks/use-file-picker-labels.js";
29
+ import { DEFAULT_CAMERA_LABELS } from "../components/camera-labels.js";
29
30
  import { DEFAULT_MEASURED_GRID_LABELS } from "../components/measured-grid-labels.js";
30
31
  import { DEFAULT_CONFIRM_DIALOG_LABELS } from "../components/confirm-dialog-labels.js";
31
32
  import { DEFAULT_FLOATING_PANEL_LABELS } from "../components/floating-panel-labels.js";
@@ -101,6 +102,10 @@ import { DEFAULT_SIGN_OUT_PENDING_DIALOG_LABELS } from "../offline/sign-out-pend
101
102
  import { DEFAULT_PWA_UPDATE_PROMPT_LABELS } from "../offline/pwa-update-prompt-labels.js";
102
103
  import { DEFAULT_SHARED_COMPUTER_LABELS } from "../offline/shared-computer-labels.js";
103
104
  import { DEFAULT_TOP_BAR_PARTS_LABELS } from "../shell/top-bar-parts-labels.js";
105
+ import { DEFAULT_HELD_CHANGES_BANNER_LABELS } from "../shell/held-changes-banner-labels.js";
106
+ import { DEFAULT_FIELD_SUGGESTION_LABELS } from "../components/field-suggestion-labels.js";
107
+ import { DEFAULT_CONSENT_AGAIN_LABELS } from "../components/consent-again-notice-labels.js";
108
+ import { DEFAULT_RELEASE_NOTES_LABELS } from "../components/release-notes-labels.js";
104
109
  import { DEFAULT_SHARE_CARD_LABELS } from "../components/share-card-labels.js";
105
110
  import { DEFAULT_REAUTH_DIALOG_LABELS } from "../components/reauth-dialog-labels.js";
106
111
  import { DEFAULT_SERVER_WAKE_LABELS } from "../components/server-wake-labels.js";
@@ -163,6 +168,7 @@ const DEFAULT_UI_KIT_LABELS = {
163
168
  iconPicker: DEFAULT_ICON_PICKER_LABELS,
164
169
  dialogFrame: DEFAULT_DIALOG_FRAME_LABELS,
165
170
  filePicker: DEFAULT_FILE_PICKER_LABELS,
171
+ camera: DEFAULT_CAMERA_LABELS,
166
172
  measuredGrid: DEFAULT_MEASURED_GRID_LABELS,
167
173
  feedbackAttachment: DEFAULT_FEEDBACK_ATTACHMENT_LABELS,
168
174
  feedbackDialog: DEFAULT_FEEDBACK_DIALOG_LABELS,
@@ -245,7 +251,11 @@ const DEFAULT_UI_KIT_LABELS = {
245
251
  mailTestCard: DEFAULT_MAIL_TEST_CARD_LABELS,
246
252
  signOutPending: DEFAULT_SIGN_OUT_PENDING_DIALOG_LABELS,
247
253
  pwaUpdate: DEFAULT_PWA_UPDATE_PROMPT_LABELS,
248
- sharedComputer: DEFAULT_SHARED_COMPUTER_LABELS
254
+ sharedComputer: DEFAULT_SHARED_COMPUTER_LABELS,
255
+ heldChanges: DEFAULT_HELD_CHANGES_BANNER_LABELS,
256
+ fieldSuggestion: DEFAULT_FIELD_SUGGESTION_LABELS,
257
+ consentAgain: DEFAULT_CONSENT_AGAIN_LABELS,
258
+ releaseNotes: DEFAULT_RELEASE_NOTES_LABELS
249
259
  };
250
260
  export {
251
261
  DEFAULT_UI_KIT_LABELS
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/i18n/defaults.ts"],"sourcesContent":["import { DEFAULT_DATA_TABLE_LABELS } from \"../components/data-table-labels\";\nimport { DEFAULT_MINI_CALENDAR_LABELS } from \"../components/mini-calendar-labels\";\nimport { DEFAULT_CALENDAR_HEATMAP_LABELS } from \"../components/calendar-heatmap-labels\";\nimport { DEFAULT_MONTH_PICKER_LABELS } from \"../components/month-picker-labels\";\nimport { DEFAULT_PAGE_CONTENTS_LABELS } from \"../components/page-contents-labels\";\nimport { DEFAULT_POPOVER_LABELS } from \"../components/popover-labels\";\nimport { DEFAULT_CHIP_INPUT_LABELS } from \"../components/chip-labels\";\nimport { DEFAULT_CHARACTER_COUNT_LABELS, DEFAULT_PASSWORD_REVEAL_LABELS } from \"../components/field-base-labels\";\nimport { DEFAULT_TABS_LABELS } from \"../components/tabs-labels\";\nimport { DEFAULT_WIZARD_LABELS } from \"../wizard/wizard-labels\";\nimport { DEFAULT_TOUR_LABELS } from \"../tour/tour-labels\";\nimport { DEFAULT_TOUR_CATALOGUE_LABELS } from \"../tour/tour-catalogue-labels\";\nimport { DEFAULT_TOUR_GUIDE_LABELS } from \"../tour/tour-guide-labels\";\nimport { DEFAULT_COMMAND_PALETTE_LABELS } from \"../search/command-palette-labels\";\nimport { DEFAULT_GLOBAL_SEARCH_LABELS } from \"../search/global-search-labels\";\nimport { DEFAULT_SERIES_CHART_LABELS } from \"../components/series-chart-labels\";\nimport { DEFAULT_PIE_CHART_LABELS } from \"../components/pie-chart-labels\";\nimport { DEFAULT_TREEMAP_LABELS } from \"../components/treemap-labels\";\nimport { DEFAULT_SPARKLINE_LABELS } from \"../components/sparkline-labels\";\nimport { DEFAULT_STAT_TILE_LABELS } from \"../components/stat-tile-labels\";\nimport { DEFAULT_SIGNATURE_PAD_LABELS } from \"../components/signature-pad-labels\";\nimport { DEFAULT_PASSWORD_STRENGTH_LABELS } from \"../components/password-strength-labels\";\nimport { DEFAULT_DANGER_CONFIRM_LABELS } from \"../components/danger-confirm-labels\";\nimport { DEFAULT_SWATCH_PICKER_LABELS } from \"../components/swatch-picker-labels\";\nimport { DEFAULT_ICON_PICKER_LABELS } from \"../components/icon-picker-labels\";\nimport { DEFAULT_DIALOG_FRAME_LABELS } from \"../components/dialog-frame-labels\";\nimport { DEFAULT_FILE_PICKER_LABELS } from \"../hooks/use-file-picker-labels\";\nimport { DEFAULT_MEASURED_GRID_LABELS } from \"../components/measured-grid-labels\";\nimport { DEFAULT_CONFIRM_DIALOG_LABELS } from \"../components/confirm-dialog-labels\";\nimport { DEFAULT_FLOATING_PANEL_LABELS } from \"../components/floating-panel-labels\";\nimport { DEFAULT_FEEDBACK_ATTACHMENT_LABELS } from \"../feedback/feedback-attachment-labels\";\nimport { DEFAULT_FEEDBACK_DIALOG_LABELS } from \"../feedback/feedback-dialog-labels\";\nimport { DEFAULT_FEEDBACK_COMPOSER_LABELS, DEFAULT_FEEDBACK_THREAD_LABELS } from \"../feedback/feedback-thread-labels\";\nimport {\n DEFAULT_FEEDBACK_CATEGORY_LABELS,\n DEFAULT_FEEDBACK_STATUS_LABELS,\n DEFAULT_FEEDBACK_TOAST_LABELS,\n} from \"../feedback/feedback-labels\";\nimport { DEFAULT_FEEDBACK_MENU_LABELS } from \"../feedback/feedback-menu-labels\";\nimport { DEFAULT_FEEDBACK_PUBLIC_LABELS } from \"../feedback/feedback-public-labels\";\nimport { DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS } from \"../notifications/feedback-notification-types-labels\";\nimport { DEFAULT_FEEDBACK_CONTEXT_LABELS } from \"../feedback/feedback-context-labels\";\nimport { DEFAULT_FEEDBACK_PAGE_LABELS } from \"../feedback/feedback-table-labels\";\nimport { DEFAULT_FEEDBACK_DETAIL_LABELS } from \"../feedback/feedback-row-detail-labels\";\nimport {\n DEFAULT_FEEDBACK_COMMENTS_LABELS,\n DEFAULT_FEEDBACK_REPLIES_LABELS,\n DEFAULT_FEEDBACK_VOTE_LABELS,\n} from \"../feedback/feedback-thread-parts-labels\";\nimport { DEFAULT_ACCOUNT_SETTINGS_LABELS } from \"../account/account-settings-labels\";\nimport { DEFAULT_COPY_BUTTON_LABELS } from \"../components/copy-button-labels\";\nimport { DEFAULT_BULK_ACTION_BAR_LABELS } from \"../components/bulk-action-bar-labels\";\nimport { DEFAULT_LIST_LABELS } from \"../components/list-labels\";\nimport { DEFAULT_BREADCRUMBS_LABELS } from \"../components/breadcrumbs-labels\";\nimport { DEFAULT_TOAST_LABELS } from \"../components/toast-labels\";\nimport { DEFAULT_FORM_ACTIONS_LABELS } from \"../components/form-actions-labels\";\nimport { DEFAULT_DESCRIPTION_LIST_LABELS } from \"../components/description-list-labels\";\nimport { DEFAULT_LINE_ITEMS_LABELS } from \"../components/line-items-labels\";\nimport { DEFAULT_PROGRESS_BAR_LABELS } from \"../components/progress-bar-labels\";\nimport { DEFAULT_SIGNED_AMOUNT_LABELS } from \"../components/signed-amount-labels\";\nimport { DEFAULT_ERROR_BOUNDARY_LABELS } from \"../components/error-boundary-labels\";\nimport { DEFAULT_AUTHED_IMAGE_LABELS } from \"../components/authed-image-labels\";\nimport { DEFAULT_IMAGE_GRID_LABELS } from \"../components/image-grid-labels\";\nimport { DEFAULT_LIGHTBOX_LABELS } from \"../components/lightbox-labels\";\nimport { DEFAULT_WRITE_LOCK_LABELS } from \"../components/write-lock-labels\";\nimport { DEFAULT_LEGAL_LABELS } from \"../components/legal-labels\";\nimport { DEFAULT_SIGN_IN_LABELS } from \"../auth/sign-in-form-labels\";\nimport { DEFAULT_REGISTER_LABELS } from \"../auth/register-form-labels\";\nimport { DEFAULT_COMPLETE_NAME_LABELS } from \"../auth/complete-name-dialog-labels\";\nimport { DEFAULT_FORGOT_PASSWORD_LABELS } from \"../auth/forgot-password-form-labels\";\nimport { DEFAULT_RESET_PASSWORD_LABELS } from \"../auth/reset-password-form-labels\";\nimport { DEFAULT_VERIFY_EMAIL_LABELS } from \"../auth/verify-email-labels\";\nimport { DEFAULT_NOT_FOUND_LABELS } from \"../auth/not-found-page-labels\";\nimport { DEFAULT_ACCEPT_INVITATION_LABELS } from \"../auth/accept-invitation-labels\";\nimport { DEFAULT_COMPANY_SWITCHER_LABELS } from \"../shell/company-switcher-labels\";\nimport { DEFAULT_EMAIL_CHANGE_LABELS } from \"../account/email-change-setting-labels\";\nimport { DEFAULT_SESSIONS_LABELS } from \"../account/sessions-setting-labels\";\nimport { DEFAULT_DELETE_ACCOUNT_LABELS } from \"../account/delete-account-setting-labels\";\nimport { DEFAULT_DATA_EXPORT_LABELS } from \"../account/data-export-setting-labels\";\nimport { DEFAULT_USER_ROSTER_LABELS } from \"../admin/user-roster-labels\";\nimport { DEFAULT_ROLE_SELECT_LABELS } from \"../admin/role-select-labels\";\nimport { DEFAULT_REVIEWER_SCOPE_LABELS } from \"../admin/reviewer-scope-editor-labels\";\nimport { DEFAULT_ADMIN_ACTION_LABELS } from \"../admin/admin-action-confirm-labels\";\nimport { DEFAULT_ADMIN_ACTION_LOG_LABELS } from \"../admin/admin-action-log-labels\";\nimport { DEFAULT_TRANSFER_OWNERSHIP_LABELS } from \"../admin/transfer-ownership-dialog-labels\";\nimport { DEFAULT_INVITATIONS_LABELS } from \"../admin/invitations-panel-labels\";\nimport { DEFAULT_SETTINGS_LABELS } from \"../settings/settings-labels\";\nimport { DEFAULT_LANDING_LABELS } from \"../landing/landing-labels\";\nimport { DEFAULT_DEMO_LABELS } from \"../demo/demo-labels\";\nimport { DEFAULT_BILLING_LABELS } from \"../billing/billing-labels\";\nimport { DEFAULT_PLAN_CHANGE_LABELS } from \"../admin/plan-change-labels\";\nimport { DEFAULT_APPEARANCE_LABELS } from \"../components/appearance-labels\";\nimport { DEFAULT_DEVICE_RESET_LABELS } from \"../settings/device-reset-setting-labels\";\nimport { DEFAULT_ROW_ACTIONS_LABELS } from \"../components/row-actions-labels\";\nimport { DEFAULT_APP_SHELL_MORE_LABELS } from \"../shell/app-shell-labels\";\nimport { DEFAULT_ACCOUNT_STATE_LABELS } from \"../components/account-chips-labels\";\nimport { DEFAULT_ADMIN_AREA_LABELS } from \"../admin/admin-area-labels\";\nimport { DEFAULT_MAIL_TEST_CARD_LABELS } from \"../admin/mail-test-card-labels\";\nimport { DEFAULT_SIGN_OUT_PENDING_DIALOG_LABELS } from \"../offline/sign-out-pending-dialog-labels\";\nimport { DEFAULT_PWA_UPDATE_PROMPT_LABELS } from \"../offline/pwa-update-prompt-labels\";\nimport { DEFAULT_SHARED_COMPUTER_LABELS } from \"../offline/shared-computer-labels\";\nimport { DEFAULT_TOP_BAR_PARTS_LABELS } from \"../shell/top-bar-parts-labels\";\nimport { DEFAULT_SHARE_CARD_LABELS } from \"../components/share-card-labels\";\nimport { DEFAULT_REAUTH_DIALOG_LABELS } from \"../components/reauth-dialog-labels\";\nimport { DEFAULT_SERVER_WAKE_LABELS } from \"../components/server-wake-labels\";\nimport { DEFAULT_TRANSLATION_REVIEW_LABELS } from \"../components/translation-review-labels\";\nimport { DEFAULT_COUNTRY_SELECT_LABELS } from \"../components/country-select-labels\";\nimport { DEFAULT_INLINE_EDIT_LABELS } from \"../components/inline-edit-field-labels\";\nimport { DEFAULT_IBAN_INPUT_LABELS } from \"../components/iban-input-labels\";\nimport { DEFAULT_PHONE_INPUT_LABELS } from \"../components/phone-input-labels\";\nimport { DEFAULT_COLUMN_MAPPER_LABELS } from \"../components/column-mapper-labels\";\nimport { DEFAULT_NOTIFICATIONS_LABELS } from \"../notifications/notifications-labels\";\nimport {\n DEFAULT_APP_SHELL_LABELS,\n DEFAULT_CALCULATOR_LABELS,\n DEFAULT_COMBOBOX_LABELS,\n DEFAULT_COMMON_LABELS,\n DEFAULT_CURRENCY_LABELS,\n DEFAULT_DATE_PICKER_LABELS,\n DEFAULT_FILE_LABELS,\n DEFAULT_MULTI_SELECT_LABELS,\n DEFAULT_PICKER_SHEET_LABELS,\n DEFAULT_SWIPEABLE_ROW_LABELS,\n DEFAULT_TOP_BAR_LABELS,\n} from \"./shared-labels\";\nimport type { UiKitLabels } from \"./kit-labels\";\n\n/**\n * The whole English tree in one object: what a translation is written against, and\n * the `reference` for {@link missingKitLabels}.\n *\n * A separate module from the provider on purpose. Components import the provider's\n * hooks; this file imports the components' defaults. Kept together they would be an\n * import cycle through every component in the kit.\n *\n * Every import here is a module of WORDS — a `*-labels.ts` beside its component, which\n * the component re-exports (`shared-labels` for the namespaces the provider types\n * itself, which `kit-labels` re-exports) — never a component. The\n * English catalogue (`locales/en.ts`) is built on this object, so a component imported\n * here rides along with English: in 0.33 that was 79 of them, and an app fetching `en`\n * lazily fetched ~40 chunks of component code with it, where every other language is one\n * (0.34, KS U8). `__tests__/english-catalogue-graph.test.ts` holds the line, and the\n * build makes `dist/i18n/locales/en.js` one file (scripts/flatten-en.mjs).\n */\nexport const DEFAULT_UI_KIT_LABELS: UiKitLabels = {\n common: DEFAULT_COMMON_LABELS,\n dataTable: DEFAULT_DATA_TABLE_LABELS,\n miniCalendar: DEFAULT_MINI_CALENDAR_LABELS,\n calendarHeatmap: DEFAULT_CALENDAR_HEATMAP_LABELS,\n datePicker: DEFAULT_DATE_PICKER_LABELS,\n monthPicker: DEFAULT_MONTH_PICKER_LABELS,\n popover: DEFAULT_POPOVER_LABELS,\n combobox: DEFAULT_COMBOBOX_LABELS,\n multiSelect: DEFAULT_MULTI_SELECT_LABELS,\n calculator: DEFAULT_CALCULATOR_LABELS,\n currency: DEFAULT_CURRENCY_LABELS,\n chipInput: DEFAULT_CHIP_INPUT_LABELS,\n passwordReveal: DEFAULT_PASSWORD_REVEAL_LABELS,\n tabs: DEFAULT_TABS_LABELS,\n appShell: DEFAULT_APP_SHELL_LABELS,\n pageContents: DEFAULT_PAGE_CONTENTS_LABELS,\n topBar: DEFAULT_TOP_BAR_LABELS,\n pickerSheet: DEFAULT_PICKER_SHEET_LABELS,\n swipeableRow: DEFAULT_SWIPEABLE_ROW_LABELS,\n file: DEFAULT_FILE_LABELS,\n wizard: DEFAULT_WIZARD_LABELS,\n tour: DEFAULT_TOUR_LABELS,\n tourCatalogue: DEFAULT_TOUR_CATALOGUE_LABELS,\n tourGuide: DEFAULT_TOUR_GUIDE_LABELS,\n commandPalette: DEFAULT_COMMAND_PALETTE_LABELS,\n globalSearch: DEFAULT_GLOBAL_SEARCH_LABELS,\n seriesChart: DEFAULT_SERIES_CHART_LABELS,\n pieChart: DEFAULT_PIE_CHART_LABELS,\n treemap: DEFAULT_TREEMAP_LABELS,\n sparkline: DEFAULT_SPARKLINE_LABELS,\n statTile: DEFAULT_STAT_TILE_LABELS,\n signaturePad: DEFAULT_SIGNATURE_PAD_LABELS,\n passwordStrength: DEFAULT_PASSWORD_STRENGTH_LABELS,\n dangerConfirm: DEFAULT_DANGER_CONFIRM_LABELS,\n swatchPicker: DEFAULT_SWATCH_PICKER_LABELS,\n iconPicker: DEFAULT_ICON_PICKER_LABELS,\n dialogFrame: DEFAULT_DIALOG_FRAME_LABELS,\n filePicker: DEFAULT_FILE_PICKER_LABELS,\n measuredGrid: DEFAULT_MEASURED_GRID_LABELS,\n feedbackAttachment: DEFAULT_FEEDBACK_ATTACHMENT_LABELS,\n feedbackDialog: DEFAULT_FEEDBACK_DIALOG_LABELS,\n feedbackThread: DEFAULT_FEEDBACK_THREAD_LABELS,\n feedbackComposer: DEFAULT_FEEDBACK_COMPOSER_LABELS,\n feedbackStatus: DEFAULT_FEEDBACK_STATUS_LABELS,\n feedbackCategory: DEFAULT_FEEDBACK_CATEGORY_LABELS,\n feedbackToast: DEFAULT_FEEDBACK_TOAST_LABELS,\n feedbackMenu: DEFAULT_FEEDBACK_MENU_LABELS,\n feedbackPublic: DEFAULT_FEEDBACK_PUBLIC_LABELS,\n feedbackNotificationTypes: DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS,\n feedbackContext: DEFAULT_FEEDBACK_CONTEXT_LABELS,\n feedbackPage: DEFAULT_FEEDBACK_PAGE_LABELS,\n feedbackDetail: DEFAULT_FEEDBACK_DETAIL_LABELS,\n feedbackVote: DEFAULT_FEEDBACK_VOTE_LABELS,\n feedbackComments: DEFAULT_FEEDBACK_COMMENTS_LABELS,\n feedbackReplies: DEFAULT_FEEDBACK_REPLIES_LABELS,\n accountSettings: DEFAULT_ACCOUNT_SETTINGS_LABELS,\n confirmDialog: DEFAULT_CONFIRM_DIALOG_LABELS,\n floatingPanel: DEFAULT_FLOATING_PANEL_LABELS,\n copyButton: DEFAULT_COPY_BUTTON_LABELS,\n bulkActionBar: DEFAULT_BULK_ACTION_BAR_LABELS,\n list: DEFAULT_LIST_LABELS,\n breadcrumbs: DEFAULT_BREADCRUMBS_LABELS,\n toast: DEFAULT_TOAST_LABELS,\n form: DEFAULT_FORM_ACTIONS_LABELS,\n descriptionList: DEFAULT_DESCRIPTION_LIST_LABELS,\n lineItems: DEFAULT_LINE_ITEMS_LABELS,\n progressBar: DEFAULT_PROGRESS_BAR_LABELS,\n signedAmount: DEFAULT_SIGNED_AMOUNT_LABELS,\n errorBoundary: DEFAULT_ERROR_BOUNDARY_LABELS,\n authedImage: DEFAULT_AUTHED_IMAGE_LABELS,\n imageGrid: DEFAULT_IMAGE_GRID_LABELS,\n lightbox: DEFAULT_LIGHTBOX_LABELS,\n writeLock: DEFAULT_WRITE_LOCK_LABELS,\n accountState: DEFAULT_ACCOUNT_STATE_LABELS,\n shareCard: DEFAULT_SHARE_CARD_LABELS,\n reauthDialog: DEFAULT_REAUTH_DIALOG_LABELS,\n serverWake: DEFAULT_SERVER_WAKE_LABELS,\n translationReview: DEFAULT_TRANSLATION_REVIEW_LABELS,\n legal: DEFAULT_LEGAL_LABELS,\n signIn: DEFAULT_SIGN_IN_LABELS,\n register: DEFAULT_REGISTER_LABELS,\n completeName: DEFAULT_COMPLETE_NAME_LABELS,\n forgotPassword: DEFAULT_FORGOT_PASSWORD_LABELS,\n resetPassword: DEFAULT_RESET_PASSWORD_LABELS,\n verifyEmail: DEFAULT_VERIFY_EMAIL_LABELS,\n notFound: DEFAULT_NOT_FOUND_LABELS,\n acceptInvitation: DEFAULT_ACCEPT_INVITATION_LABELS,\n companySwitcher: DEFAULT_COMPANY_SWITCHER_LABELS,\n emailChange: DEFAULT_EMAIL_CHANGE_LABELS,\n sessions: DEFAULT_SESSIONS_LABELS,\n deleteAccount: DEFAULT_DELETE_ACCOUNT_LABELS,\n dataExport: DEFAULT_DATA_EXPORT_LABELS,\n userRoster: DEFAULT_USER_ROSTER_LABELS,\n roleSelect: DEFAULT_ROLE_SELECT_LABELS,\n reviewerScope: DEFAULT_REVIEWER_SCOPE_LABELS,\n adminAction: DEFAULT_ADMIN_ACTION_LABELS,\n adminActionLog: DEFAULT_ADMIN_ACTION_LOG_LABELS,\n transferOwnership: DEFAULT_TRANSFER_OWNERSHIP_LABELS,\n invitations: DEFAULT_INVITATIONS_LABELS,\n settings: DEFAULT_SETTINGS_LABELS,\n landing: DEFAULT_LANDING_LABELS,\n demo: DEFAULT_DEMO_LABELS,\n billing: DEFAULT_BILLING_LABELS,\n planChange: DEFAULT_PLAN_CHANGE_LABELS,\n appearance: DEFAULT_APPEARANCE_LABELS,\n deviceReset: DEFAULT_DEVICE_RESET_LABELS,\n rowActions: DEFAULT_ROW_ACTIONS_LABELS,\n appShellMore: DEFAULT_APP_SHELL_MORE_LABELS,\n characterCount: DEFAULT_CHARACTER_COUNT_LABELS,\n countrySelect: DEFAULT_COUNTRY_SELECT_LABELS,\n inlineEdit: DEFAULT_INLINE_EDIT_LABELS,\n ibanInput: DEFAULT_IBAN_INPUT_LABELS,\n phoneInput: DEFAULT_PHONE_INPUT_LABELS,\n columnMapper: DEFAULT_COLUMN_MAPPER_LABELS,\n notifications: DEFAULT_NOTIFICATIONS_LABELS,\n adminArea: DEFAULT_ADMIN_AREA_LABELS,\n topBarParts: DEFAULT_TOP_BAR_PARTS_LABELS,\n mailTestCard: DEFAULT_MAIL_TEST_CARD_LABELS,\n signOutPending: DEFAULT_SIGN_OUT_PENDING_DIALOG_LABELS,\n pwaUpdate: DEFAULT_PWA_UPDATE_PROMPT_LABELS,\n sharedComputer: DEFAULT_SHARED_COMPUTER_LABELS,\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/i18n/defaults.ts"],"sourcesContent":["import { DEFAULT_DATA_TABLE_LABELS } from \"../components/data-table-labels\";\nimport { DEFAULT_MINI_CALENDAR_LABELS } from \"../components/mini-calendar-labels\";\nimport { DEFAULT_CALENDAR_HEATMAP_LABELS } from \"../components/calendar-heatmap-labels\";\nimport { DEFAULT_MONTH_PICKER_LABELS } from \"../components/month-picker-labels\";\nimport { DEFAULT_PAGE_CONTENTS_LABELS } from \"../components/page-contents-labels\";\nimport { DEFAULT_POPOVER_LABELS } from \"../components/popover-labels\";\nimport { DEFAULT_CHIP_INPUT_LABELS } from \"../components/chip-labels\";\nimport { DEFAULT_CHARACTER_COUNT_LABELS, DEFAULT_PASSWORD_REVEAL_LABELS } from \"../components/field-base-labels\";\nimport { DEFAULT_TABS_LABELS } from \"../components/tabs-labels\";\nimport { DEFAULT_WIZARD_LABELS } from \"../wizard/wizard-labels\";\nimport { DEFAULT_TOUR_LABELS } from \"../tour/tour-labels\";\nimport { DEFAULT_TOUR_CATALOGUE_LABELS } from \"../tour/tour-catalogue-labels\";\nimport { DEFAULT_TOUR_GUIDE_LABELS } from \"../tour/tour-guide-labels\";\nimport { DEFAULT_COMMAND_PALETTE_LABELS } from \"../search/command-palette-labels\";\nimport { DEFAULT_GLOBAL_SEARCH_LABELS } from \"../search/global-search-labels\";\nimport { DEFAULT_SERIES_CHART_LABELS } from \"../components/series-chart-labels\";\nimport { DEFAULT_PIE_CHART_LABELS } from \"../components/pie-chart-labels\";\nimport { DEFAULT_TREEMAP_LABELS } from \"../components/treemap-labels\";\nimport { DEFAULT_SPARKLINE_LABELS } from \"../components/sparkline-labels\";\nimport { DEFAULT_STAT_TILE_LABELS } from \"../components/stat-tile-labels\";\nimport { DEFAULT_SIGNATURE_PAD_LABELS } from \"../components/signature-pad-labels\";\nimport { DEFAULT_PASSWORD_STRENGTH_LABELS } from \"../components/password-strength-labels\";\nimport { DEFAULT_DANGER_CONFIRM_LABELS } from \"../components/danger-confirm-labels\";\nimport { DEFAULT_SWATCH_PICKER_LABELS } from \"../components/swatch-picker-labels\";\nimport { DEFAULT_ICON_PICKER_LABELS } from \"../components/icon-picker-labels\";\nimport { DEFAULT_DIALOG_FRAME_LABELS } from \"../components/dialog-frame-labels\";\nimport { DEFAULT_FILE_PICKER_LABELS } from \"../hooks/use-file-picker-labels\";\nimport { DEFAULT_CAMERA_LABELS } from \"../components/camera-labels\";\nimport { DEFAULT_MEASURED_GRID_LABELS } from \"../components/measured-grid-labels\";\nimport { DEFAULT_CONFIRM_DIALOG_LABELS } from \"../components/confirm-dialog-labels\";\nimport { DEFAULT_FLOATING_PANEL_LABELS } from \"../components/floating-panel-labels\";\nimport { DEFAULT_FEEDBACK_ATTACHMENT_LABELS } from \"../feedback/feedback-attachment-labels\";\nimport { DEFAULT_FEEDBACK_DIALOG_LABELS } from \"../feedback/feedback-dialog-labels\";\nimport { DEFAULT_FEEDBACK_COMPOSER_LABELS, DEFAULT_FEEDBACK_THREAD_LABELS } from \"../feedback/feedback-thread-labels\";\nimport {\n DEFAULT_FEEDBACK_CATEGORY_LABELS,\n DEFAULT_FEEDBACK_STATUS_LABELS,\n DEFAULT_FEEDBACK_TOAST_LABELS,\n} from \"../feedback/feedback-labels\";\nimport { DEFAULT_FEEDBACK_MENU_LABELS } from \"../feedback/feedback-menu-labels\";\nimport { DEFAULT_FEEDBACK_PUBLIC_LABELS } from \"../feedback/feedback-public-labels\";\nimport { DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS } from \"../notifications/feedback-notification-types-labels\";\nimport { DEFAULT_FEEDBACK_CONTEXT_LABELS } from \"../feedback/feedback-context-labels\";\nimport { DEFAULT_FEEDBACK_PAGE_LABELS } from \"../feedback/feedback-table-labels\";\nimport { DEFAULT_FEEDBACK_DETAIL_LABELS } from \"../feedback/feedback-row-detail-labels\";\nimport {\n DEFAULT_FEEDBACK_COMMENTS_LABELS,\n DEFAULT_FEEDBACK_REPLIES_LABELS,\n DEFAULT_FEEDBACK_VOTE_LABELS,\n} from \"../feedback/feedback-thread-parts-labels\";\nimport { DEFAULT_ACCOUNT_SETTINGS_LABELS } from \"../account/account-settings-labels\";\nimport { DEFAULT_COPY_BUTTON_LABELS } from \"../components/copy-button-labels\";\nimport { DEFAULT_BULK_ACTION_BAR_LABELS } from \"../components/bulk-action-bar-labels\";\nimport { DEFAULT_LIST_LABELS } from \"../components/list-labels\";\nimport { DEFAULT_BREADCRUMBS_LABELS } from \"../components/breadcrumbs-labels\";\nimport { DEFAULT_TOAST_LABELS } from \"../components/toast-labels\";\nimport { DEFAULT_FORM_ACTIONS_LABELS } from \"../components/form-actions-labels\";\nimport { DEFAULT_DESCRIPTION_LIST_LABELS } from \"../components/description-list-labels\";\nimport { DEFAULT_LINE_ITEMS_LABELS } from \"../components/line-items-labels\";\nimport { DEFAULT_PROGRESS_BAR_LABELS } from \"../components/progress-bar-labels\";\nimport { DEFAULT_SIGNED_AMOUNT_LABELS } from \"../components/signed-amount-labels\";\nimport { DEFAULT_ERROR_BOUNDARY_LABELS } from \"../components/error-boundary-labels\";\nimport { DEFAULT_AUTHED_IMAGE_LABELS } from \"../components/authed-image-labels\";\nimport { DEFAULT_IMAGE_GRID_LABELS } from \"../components/image-grid-labels\";\nimport { DEFAULT_LIGHTBOX_LABELS } from \"../components/lightbox-labels\";\nimport { DEFAULT_WRITE_LOCK_LABELS } from \"../components/write-lock-labels\";\nimport { DEFAULT_LEGAL_LABELS } from \"../components/legal-labels\";\nimport { DEFAULT_SIGN_IN_LABELS } from \"../auth/sign-in-form-labels\";\nimport { DEFAULT_REGISTER_LABELS } from \"../auth/register-form-labels\";\nimport { DEFAULT_COMPLETE_NAME_LABELS } from \"../auth/complete-name-dialog-labels\";\nimport { DEFAULT_FORGOT_PASSWORD_LABELS } from \"../auth/forgot-password-form-labels\";\nimport { DEFAULT_RESET_PASSWORD_LABELS } from \"../auth/reset-password-form-labels\";\nimport { DEFAULT_VERIFY_EMAIL_LABELS } from \"../auth/verify-email-labels\";\nimport { DEFAULT_NOT_FOUND_LABELS } from \"../auth/not-found-page-labels\";\nimport { DEFAULT_ACCEPT_INVITATION_LABELS } from \"../auth/accept-invitation-labels\";\nimport { DEFAULT_COMPANY_SWITCHER_LABELS } from \"../shell/company-switcher-labels\";\nimport { DEFAULT_EMAIL_CHANGE_LABELS } from \"../account/email-change-setting-labels\";\nimport { DEFAULT_SESSIONS_LABELS } from \"../account/sessions-setting-labels\";\nimport { DEFAULT_DELETE_ACCOUNT_LABELS } from \"../account/delete-account-setting-labels\";\nimport { DEFAULT_DATA_EXPORT_LABELS } from \"../account/data-export-setting-labels\";\nimport { DEFAULT_USER_ROSTER_LABELS } from \"../admin/user-roster-labels\";\nimport { DEFAULT_ROLE_SELECT_LABELS } from \"../admin/role-select-labels\";\nimport { DEFAULT_REVIEWER_SCOPE_LABELS } from \"../admin/reviewer-scope-editor-labels\";\nimport { DEFAULT_ADMIN_ACTION_LABELS } from \"../admin/admin-action-confirm-labels\";\nimport { DEFAULT_ADMIN_ACTION_LOG_LABELS } from \"../admin/admin-action-log-labels\";\nimport { DEFAULT_TRANSFER_OWNERSHIP_LABELS } from \"../admin/transfer-ownership-dialog-labels\";\nimport { DEFAULT_INVITATIONS_LABELS } from \"../admin/invitations-panel-labels\";\nimport { DEFAULT_SETTINGS_LABELS } from \"../settings/settings-labels\";\nimport { DEFAULT_LANDING_LABELS } from \"../landing/landing-labels\";\nimport { DEFAULT_DEMO_LABELS } from \"../demo/demo-labels\";\nimport { DEFAULT_BILLING_LABELS } from \"../billing/billing-labels\";\nimport { DEFAULT_PLAN_CHANGE_LABELS } from \"../admin/plan-change-labels\";\nimport { DEFAULT_APPEARANCE_LABELS } from \"../components/appearance-labels\";\nimport { DEFAULT_DEVICE_RESET_LABELS } from \"../settings/device-reset-setting-labels\";\nimport { DEFAULT_ROW_ACTIONS_LABELS } from \"../components/row-actions-labels\";\nimport { DEFAULT_APP_SHELL_MORE_LABELS } from \"../shell/app-shell-labels\";\nimport { DEFAULT_ACCOUNT_STATE_LABELS } from \"../components/account-chips-labels\";\nimport { DEFAULT_ADMIN_AREA_LABELS } from \"../admin/admin-area-labels\";\nimport { DEFAULT_MAIL_TEST_CARD_LABELS } from \"../admin/mail-test-card-labels\";\nimport { DEFAULT_SIGN_OUT_PENDING_DIALOG_LABELS } from \"../offline/sign-out-pending-dialog-labels\";\nimport { DEFAULT_PWA_UPDATE_PROMPT_LABELS } from \"../offline/pwa-update-prompt-labels\";\nimport { DEFAULT_SHARED_COMPUTER_LABELS } from \"../offline/shared-computer-labels\";\nimport { DEFAULT_TOP_BAR_PARTS_LABELS } from \"../shell/top-bar-parts-labels\";\nimport { DEFAULT_HELD_CHANGES_BANNER_LABELS } from \"../shell/held-changes-banner-labels\";\nimport { DEFAULT_FIELD_SUGGESTION_LABELS } from \"../components/field-suggestion-labels\";\nimport { DEFAULT_CONSENT_AGAIN_LABELS } from \"../components/consent-again-notice-labels\";\nimport { DEFAULT_RELEASE_NOTES_LABELS } from \"../components/release-notes-labels\";\nimport { DEFAULT_SHARE_CARD_LABELS } from \"../components/share-card-labels\";\nimport { DEFAULT_REAUTH_DIALOG_LABELS } from \"../components/reauth-dialog-labels\";\nimport { DEFAULT_SERVER_WAKE_LABELS } from \"../components/server-wake-labels\";\nimport { DEFAULT_TRANSLATION_REVIEW_LABELS } from \"../components/translation-review-labels\";\nimport { DEFAULT_COUNTRY_SELECT_LABELS } from \"../components/country-select-labels\";\nimport { DEFAULT_INLINE_EDIT_LABELS } from \"../components/inline-edit-field-labels\";\nimport { DEFAULT_IBAN_INPUT_LABELS } from \"../components/iban-input-labels\";\nimport { DEFAULT_PHONE_INPUT_LABELS } from \"../components/phone-input-labels\";\nimport { DEFAULT_COLUMN_MAPPER_LABELS } from \"../components/column-mapper-labels\";\nimport { DEFAULT_NOTIFICATIONS_LABELS } from \"../notifications/notifications-labels\";\nimport {\n DEFAULT_APP_SHELL_LABELS,\n DEFAULT_CALCULATOR_LABELS,\n DEFAULT_COMBOBOX_LABELS,\n DEFAULT_COMMON_LABELS,\n DEFAULT_CURRENCY_LABELS,\n DEFAULT_DATE_PICKER_LABELS,\n DEFAULT_FILE_LABELS,\n DEFAULT_MULTI_SELECT_LABELS,\n DEFAULT_PICKER_SHEET_LABELS,\n DEFAULT_SWIPEABLE_ROW_LABELS,\n DEFAULT_TOP_BAR_LABELS,\n} from \"./shared-labels\";\nimport type { UiKitLabels } from \"./kit-labels\";\n\n/**\n * The whole English tree in one object: what a translation is written against, and\n * the `reference` for {@link missingKitLabels}.\n *\n * A separate module from the provider on purpose. Components import the provider's\n * hooks; this file imports the components' defaults. Kept together they would be an\n * import cycle through every component in the kit.\n *\n * Every import here is a module of WORDS — a `*-labels.ts` beside its component, which\n * the component re-exports (`shared-labels` for the namespaces the provider types\n * itself, which `kit-labels` re-exports) — never a component. The\n * English catalogue (`locales/en.ts`) is built on this object, so a component imported\n * here rides along with English: in 0.33 that was 79 of them, and an app fetching `en`\n * lazily fetched ~40 chunks of component code with it, where every other language is one\n * (0.34, KS U8). `__tests__/english-catalogue-graph.test.ts` holds the line, and the\n * build makes `dist/i18n/locales/en.js` one file (scripts/flatten-en.mjs).\n */\nexport const DEFAULT_UI_KIT_LABELS: UiKitLabels = {\n common: DEFAULT_COMMON_LABELS,\n dataTable: DEFAULT_DATA_TABLE_LABELS,\n miniCalendar: DEFAULT_MINI_CALENDAR_LABELS,\n calendarHeatmap: DEFAULT_CALENDAR_HEATMAP_LABELS,\n datePicker: DEFAULT_DATE_PICKER_LABELS,\n monthPicker: DEFAULT_MONTH_PICKER_LABELS,\n popover: DEFAULT_POPOVER_LABELS,\n combobox: DEFAULT_COMBOBOX_LABELS,\n multiSelect: DEFAULT_MULTI_SELECT_LABELS,\n calculator: DEFAULT_CALCULATOR_LABELS,\n currency: DEFAULT_CURRENCY_LABELS,\n chipInput: DEFAULT_CHIP_INPUT_LABELS,\n passwordReveal: DEFAULT_PASSWORD_REVEAL_LABELS,\n tabs: DEFAULT_TABS_LABELS,\n appShell: DEFAULT_APP_SHELL_LABELS,\n pageContents: DEFAULT_PAGE_CONTENTS_LABELS,\n topBar: DEFAULT_TOP_BAR_LABELS,\n pickerSheet: DEFAULT_PICKER_SHEET_LABELS,\n swipeableRow: DEFAULT_SWIPEABLE_ROW_LABELS,\n file: DEFAULT_FILE_LABELS,\n wizard: DEFAULT_WIZARD_LABELS,\n tour: DEFAULT_TOUR_LABELS,\n tourCatalogue: DEFAULT_TOUR_CATALOGUE_LABELS,\n tourGuide: DEFAULT_TOUR_GUIDE_LABELS,\n commandPalette: DEFAULT_COMMAND_PALETTE_LABELS,\n globalSearch: DEFAULT_GLOBAL_SEARCH_LABELS,\n seriesChart: DEFAULT_SERIES_CHART_LABELS,\n pieChart: DEFAULT_PIE_CHART_LABELS,\n treemap: DEFAULT_TREEMAP_LABELS,\n sparkline: DEFAULT_SPARKLINE_LABELS,\n statTile: DEFAULT_STAT_TILE_LABELS,\n signaturePad: DEFAULT_SIGNATURE_PAD_LABELS,\n passwordStrength: DEFAULT_PASSWORD_STRENGTH_LABELS,\n dangerConfirm: DEFAULT_DANGER_CONFIRM_LABELS,\n swatchPicker: DEFAULT_SWATCH_PICKER_LABELS,\n iconPicker: DEFAULT_ICON_PICKER_LABELS,\n dialogFrame: DEFAULT_DIALOG_FRAME_LABELS,\n filePicker: DEFAULT_FILE_PICKER_LABELS,\n camera: DEFAULT_CAMERA_LABELS,\n measuredGrid: DEFAULT_MEASURED_GRID_LABELS,\n feedbackAttachment: DEFAULT_FEEDBACK_ATTACHMENT_LABELS,\n feedbackDialog: DEFAULT_FEEDBACK_DIALOG_LABELS,\n feedbackThread: DEFAULT_FEEDBACK_THREAD_LABELS,\n feedbackComposer: DEFAULT_FEEDBACK_COMPOSER_LABELS,\n feedbackStatus: DEFAULT_FEEDBACK_STATUS_LABELS,\n feedbackCategory: DEFAULT_FEEDBACK_CATEGORY_LABELS,\n feedbackToast: DEFAULT_FEEDBACK_TOAST_LABELS,\n feedbackMenu: DEFAULT_FEEDBACK_MENU_LABELS,\n feedbackPublic: DEFAULT_FEEDBACK_PUBLIC_LABELS,\n feedbackNotificationTypes: DEFAULT_FEEDBACK_NOTIFICATION_TYPES_LABELS,\n feedbackContext: DEFAULT_FEEDBACK_CONTEXT_LABELS,\n feedbackPage: DEFAULT_FEEDBACK_PAGE_LABELS,\n feedbackDetail: DEFAULT_FEEDBACK_DETAIL_LABELS,\n feedbackVote: DEFAULT_FEEDBACK_VOTE_LABELS,\n feedbackComments: DEFAULT_FEEDBACK_COMMENTS_LABELS,\n feedbackReplies: DEFAULT_FEEDBACK_REPLIES_LABELS,\n accountSettings: DEFAULT_ACCOUNT_SETTINGS_LABELS,\n confirmDialog: DEFAULT_CONFIRM_DIALOG_LABELS,\n floatingPanel: DEFAULT_FLOATING_PANEL_LABELS,\n copyButton: DEFAULT_COPY_BUTTON_LABELS,\n bulkActionBar: DEFAULT_BULK_ACTION_BAR_LABELS,\n list: DEFAULT_LIST_LABELS,\n breadcrumbs: DEFAULT_BREADCRUMBS_LABELS,\n toast: DEFAULT_TOAST_LABELS,\n form: DEFAULT_FORM_ACTIONS_LABELS,\n descriptionList: DEFAULT_DESCRIPTION_LIST_LABELS,\n lineItems: DEFAULT_LINE_ITEMS_LABELS,\n progressBar: DEFAULT_PROGRESS_BAR_LABELS,\n signedAmount: DEFAULT_SIGNED_AMOUNT_LABELS,\n errorBoundary: DEFAULT_ERROR_BOUNDARY_LABELS,\n authedImage: DEFAULT_AUTHED_IMAGE_LABELS,\n imageGrid: DEFAULT_IMAGE_GRID_LABELS,\n lightbox: DEFAULT_LIGHTBOX_LABELS,\n writeLock: DEFAULT_WRITE_LOCK_LABELS,\n accountState: DEFAULT_ACCOUNT_STATE_LABELS,\n shareCard: DEFAULT_SHARE_CARD_LABELS,\n reauthDialog: DEFAULT_REAUTH_DIALOG_LABELS,\n serverWake: DEFAULT_SERVER_WAKE_LABELS,\n translationReview: DEFAULT_TRANSLATION_REVIEW_LABELS,\n legal: DEFAULT_LEGAL_LABELS,\n signIn: DEFAULT_SIGN_IN_LABELS,\n register: DEFAULT_REGISTER_LABELS,\n completeName: DEFAULT_COMPLETE_NAME_LABELS,\n forgotPassword: DEFAULT_FORGOT_PASSWORD_LABELS,\n resetPassword: DEFAULT_RESET_PASSWORD_LABELS,\n verifyEmail: DEFAULT_VERIFY_EMAIL_LABELS,\n notFound: DEFAULT_NOT_FOUND_LABELS,\n acceptInvitation: DEFAULT_ACCEPT_INVITATION_LABELS,\n companySwitcher: DEFAULT_COMPANY_SWITCHER_LABELS,\n emailChange: DEFAULT_EMAIL_CHANGE_LABELS,\n sessions: DEFAULT_SESSIONS_LABELS,\n deleteAccount: DEFAULT_DELETE_ACCOUNT_LABELS,\n dataExport: DEFAULT_DATA_EXPORT_LABELS,\n userRoster: DEFAULT_USER_ROSTER_LABELS,\n roleSelect: DEFAULT_ROLE_SELECT_LABELS,\n reviewerScope: DEFAULT_REVIEWER_SCOPE_LABELS,\n adminAction: DEFAULT_ADMIN_ACTION_LABELS,\n adminActionLog: DEFAULT_ADMIN_ACTION_LOG_LABELS,\n transferOwnership: DEFAULT_TRANSFER_OWNERSHIP_LABELS,\n invitations: DEFAULT_INVITATIONS_LABELS,\n settings: DEFAULT_SETTINGS_LABELS,\n landing: DEFAULT_LANDING_LABELS,\n demo: DEFAULT_DEMO_LABELS,\n billing: DEFAULT_BILLING_LABELS,\n planChange: DEFAULT_PLAN_CHANGE_LABELS,\n appearance: DEFAULT_APPEARANCE_LABELS,\n deviceReset: DEFAULT_DEVICE_RESET_LABELS,\n rowActions: DEFAULT_ROW_ACTIONS_LABELS,\n appShellMore: DEFAULT_APP_SHELL_MORE_LABELS,\n characterCount: DEFAULT_CHARACTER_COUNT_LABELS,\n countrySelect: DEFAULT_COUNTRY_SELECT_LABELS,\n inlineEdit: DEFAULT_INLINE_EDIT_LABELS,\n ibanInput: DEFAULT_IBAN_INPUT_LABELS,\n phoneInput: DEFAULT_PHONE_INPUT_LABELS,\n columnMapper: DEFAULT_COLUMN_MAPPER_LABELS,\n notifications: DEFAULT_NOTIFICATIONS_LABELS,\n adminArea: DEFAULT_ADMIN_AREA_LABELS,\n topBarParts: DEFAULT_TOP_BAR_PARTS_LABELS,\n mailTestCard: DEFAULT_MAIL_TEST_CARD_LABELS,\n signOutPending: DEFAULT_SIGN_OUT_PENDING_DIALOG_LABELS,\n pwaUpdate: DEFAULT_PWA_UPDATE_PROMPT_LABELS,\n sharedComputer: DEFAULT_SHARED_COMPUTER_LABELS,\n heldChanges: DEFAULT_HELD_CHANGES_BANNER_LABELS,\n fieldSuggestion: DEFAULT_FIELD_SUGGESTION_LABELS,\n consentAgain: DEFAULT_CONSENT_AGAIN_LABELS,\n releaseNotes: DEFAULT_RELEASE_NOTES_LABELS,\n};\n"],"mappings":"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","names":[]}
@@ -553,6 +553,18 @@ function germanLabels(numberLocale) {
553
553
  removed: (name) => `\u201E${name}\u201C entfernt`,
554
554
  cleared: "Alle Dateien entfernt"
555
555
  },
556
+ // keksdose's de-CH invoices.take_photo, camera_starting, camera_shutter and
557
+ // shots_captured; kastlan's handover.takePhoto ("Kamera") and wizard addPhoto.
558
+ camera: {
559
+ takePhoto: "Foto aufnehmen",
560
+ choosePhoto: "Foto hinzuf\xFCgen",
561
+ title: "Kamera",
562
+ hint: "Motiv ausrichten und ausl\xF6sen.",
563
+ starting: "Kamera wird gestartet\u2026",
564
+ shutter: "Foto aufnehmen",
565
+ taken: (count) => count === 1 ? "1 Foto aufgenommen." : `${n(count)} Fotos aufgenommen.`,
566
+ done: (count) => count === 1 ? "1 Foto \xFCbernehmen" : `${n(count)} Fotos \xFCbernehmen`
567
+ },
556
568
  wizard: {
557
569
  done: "Fertig",
558
570
  cancel: "Abbrechen",
@@ -699,7 +711,9 @@ function germanLabels(numberLocale) {
699
711
  zoomHint: "Zum Zoomen ziehen: Eine ann\xE4hernd quadratische Auswahl zoomt beide Achsen, eine lange, schmale nur ihre eigene. Doppelklick setzt zur\xFCck.",
700
712
  empty: "Keine Daten",
701
713
  legend: "Datenreihen",
702
- points: "Diagrammwerte"
714
+ points: "Diagrammwerte",
715
+ // Kurvenschmiede's de-CH `common.chart_name` (0.55), as every catalogue takes its own.
716
+ nameFromAxes: (ordinates, abscissa) => abscissa ? `${ordinates} \xFCber ${abscissa}` : ordinates
703
717
  },
704
718
  pieChart: {
705
719
  slices: "Diagrammsegmente",
@@ -1619,7 +1633,8 @@ Die vollst\xE4ndige Postanschrift wird betroffenen Personen und Aufsichtsbeh\xF6
1619
1633
  accessName: "Name:",
1620
1634
  // "Unternehmen", as `companySwitcher`.
1621
1635
  accessCompany: "Unternehmen:",
1622
- accessUse: "Wof\xFCr Sie die App nutzen m\xF6chten:"
1636
+ accessUse: "Wof\xFCr Sie die App nutzen m\xF6chten:",
1637
+ siteNavLabel: "Weitere Seiten"
1623
1638
  },
1624
1639
  demo: {
1625
1640
  starting: "Demo wird gestartet\u2026",
@@ -1678,6 +1693,18 @@ Die vollst\xE4ndige Postanschrift wird betroffenen Personen und Aufsichtsbeh\xF6
1678
1693
  // Not "Kostenlos", the price of the Free plan: free by the operator's grant.
1679
1694
  comped: "Kostenlos gew\xE4hrt"
1680
1695
  },
1696
+ // 0.55 (§7, Marcel 2026-11-04): the standing line. keksdose's reviewed de-CH
1697
+ // (`billing.trial_until`, …); `ended` is the first sentence of `planEnded`, and
1698
+ // "Die Zahlung ist fehlgeschlagen" as `paymentFailedAskBuyer`.
1699
+ standing: {
1700
+ ended: "Ihr Tarif ist abgelaufen.",
1701
+ pastDue: "Die Zahlung ist fehlgeschlagen \u2013 wir versuchen es erneut. Ihr Tarif bleibt in der Zwischenzeit aktiv.",
1702
+ trialUntil: (date) => `Testphase bis ${date}`,
1703
+ freeUntil: (date) => `Kostenlos bis ${date}`,
1704
+ free: "Kostenlos, ohne Enddatum",
1705
+ endsOn: (date) => `Endet am ${date}`,
1706
+ renewsOn: (date) => `Verl\xE4ngert sich am ${date}`
1707
+ },
1681
1708
  trialEnding: (days) => `Ihre Testphase endet ${inDays(days)}. Danach k\xF6nnen Sie weiterhin alles ansehen, f\xFCr \xC4nderungen brauchen Sie aber einen Tarif.`,
1682
1709
  grantEnding: (days) => `Ihr kostenloser Zugang endet ${inDays(days)}. Danach k\xF6nnen Sie weiterhin alles ansehen, f\xFCr \xC4nderungen brauchen Sie aber einen Tarif.`,
1683
1710
  paymentFailed: "Ihre letzte Zahlung ist nicht durchgegangen. Aktualisieren Sie Ihre Zahlungsmethode, um Ihren Tarif zu behalten.",
@@ -1889,7 +1916,9 @@ Die vollst\xE4ndige Postanschrift wird betroffenen Personen und Aufsichtsbeh\xF6
1889
1916
  waitingShort: (count) => `${n(count)} ausstehend`,
1890
1917
  refusedShort: "Nicht synchronisiert",
1891
1918
  offlineUnsaved: "Offline \u2013 \xC4nderungen k\xF6nnen erst nach erneuter Verbindung gespeichert werden",
1892
- saving: "Wird gespeichert\u2026"
1919
+ saving: "Wird gespeichert\u2026",
1920
+ waitingForTab: "Wartet, bis ein anderer Tab mit dem Synchronisieren fertig ist",
1921
+ waitingForTabShort: "Wartet auf Tab"
1893
1922
  },
1894
1923
  dev: {
1895
1924
  menu: "Dev-Werkzeuge",
@@ -1919,6 +1948,49 @@ Die vollst\xE4ndige Postanschrift wird betroffenen Personen und Aufsichtsbeh\xF6
1919
1948
  sharedComputer: {
1920
1949
  label: "Dies ist ein gemeinsam genutzter Computer",
1921
1950
  hint: "Auf diesem Ger\xE4t bleibt keine Kopie Ihrer Daten. Seiten \xF6ffnen sich dann nur mit einer Verbindung."
1951
+ },
1952
+ // 0.55 — docs/top-bar-harmonization.md §2.6.1: keksdose's reviewed words (sync.held_*,
1953
+ // sync.discard_held_*, sync.switch_back_held) without its budgets.
1954
+ heldChanges: {
1955
+ message: (count) => count === 1 ? `${n(count)} \xC4nderung kann von hier aus nicht gesendet werden. Sie bleibt auf diesem Ger\xE4t, bis sie gesendet werden kann oder bis Sie sie verwerfen.` : `${n(count)} \xC4nderungen k\xF6nnen von hier aus nicht gesendet werden. Sie bleiben auf diesem Ger\xE4t, bis sie gesendet werden k\xF6nnen oder bis Sie sie verwerfen.`,
1956
+ switchBack: "Zur\xFCckwechseln",
1957
+ discard: "Verwerfen\u2026",
1958
+ confirmTitle: (count) => count === 1 ? `${n(count)} \xC4nderung verwerfen, die von hier aus nicht gesendet werden kann?` : `${n(count)} \xC4nderungen verwerfen, die von hier aus nicht gesendet werden k\xF6nnen?`,
1959
+ confirmBody: (count) => count === 1 ? "Sie l\xE4sst sich nicht wiederherstellen. Dieses Ger\xE4t synchronisiert anschlie\xDFend mit dem Stand des Servers." : "Sie lassen sich nicht wiederherstellen. Dieses Ger\xE4t synchronisiert anschlie\xDFend mit dem Stand des Servers.",
1960
+ confirmAction: "Verwerfen",
1961
+ failed: "Das hat nicht geklappt. Bitte erneut versuchen."
1962
+ },
1963
+ // 0.55 (keksdose dev #638): the "suggested from" caption under a field — the kit's
1964
+ // default when the app names no source, and the button that takes the value back out.
1965
+ fieldSuggestion: {
1966
+ suggested: "Vorgeschlagen",
1967
+ clear: "Entfernen",
1968
+ clearName: (field) => field ? `Vorschlag f\xFCr \u201E${field}\u201C entfernen` : "Vorschlag entfernen"
1969
+ },
1970
+ // 0.55: keksdose's reviewed words (price_pool.reconsent.*) without its price pool.
1971
+ consentAgain: {
1972
+ agree: "Zustimmen",
1973
+ notNow: "Nicht jetzt",
1974
+ changesToggle: "\xC4nderungen ansehen",
1975
+ wordingToggle: "Ganzen Wortlaut zeigen, bisher und neu",
1976
+ beforeHeading: "Bisher",
1977
+ nowHeading: "Neu",
1978
+ removed: "Entfernt:",
1979
+ added: "Hinzugef\xFCgt:"
1980
+ },
1981
+ // 0.55: keksdose's reviewed headings (changelog.section_*) where it had one.
1982
+ releaseNotes: {
1983
+ version: (version) => `v${version}`,
1984
+ sections: {
1985
+ breaking: "Inkompatible \xC4nderungen",
1986
+ added: "Neu",
1987
+ changed: "Ge\xE4ndert",
1988
+ fixed: "Behoben",
1989
+ deprecated: "Veraltet",
1990
+ removed: "Entfernt",
1991
+ security: "Sicherheit",
1992
+ reverted: "Zur\xFCckgenommen"
1993
+ }
1922
1994
  }
1923
1995
  };
1924
1996
  }