@eifi1/ui-kit 0.53.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 (902) hide show
  1. package/README.md +96 -82
  2. package/dist/account/delete-account-setting.d.ts +3 -2
  3. package/dist/account/delete-account-setting.js.map +1 -1
  4. package/dist/admin/plan-change.js +2 -2
  5. package/dist/admin/plan-change.js.map +1 -1
  6. package/dist/admin/user-roster.d.ts +6 -0
  7. package/dist/admin/user-roster.js +4 -0
  8. package/dist/admin/user-roster.js.map +1 -1
  9. package/dist/auth/auth-errors.d.ts +36 -0
  10. package/dist/auth/auth-errors.js +20 -0
  11. package/dist/auth/auth-errors.js.map +1 -1
  12. package/dist/billing/billing-labels.d.ts +26 -0
  13. package/dist/billing/billing-labels.js +9 -0
  14. package/dist/billing/billing-labels.js.map +1 -1
  15. package/dist/billing/subscription-standing.d.ts +61 -0
  16. package/dist/billing/subscription-standing.js +51 -0
  17. package/dist/billing/subscription-standing.js.map +1 -0
  18. package/dist/billing/usage-meter.d.ts +52 -0
  19. package/dist/billing/usage-meter.js +52 -0
  20. package/dist/billing/usage-meter.js.map +1 -0
  21. package/dist/chart.d.ts +1 -0
  22. package/dist/chart.js +4 -0
  23. package/dist/chart.js.map +1 -1
  24. package/dist/components/alert-banner.js +2 -3
  25. package/dist/components/alert-banner.js.map +1 -1
  26. package/dist/components/amount-input.d.ts +2 -1
  27. package/dist/components/amount-input.js +3 -15
  28. package/dist/components/amount-input.js.map +1 -1
  29. package/dist/components/autocomplete.js +2 -2
  30. package/dist/components/autocomplete.js.map +1 -1
  31. package/dist/components/bulk-action-bar.js +2 -1
  32. package/dist/components/bulk-action-bar.js.map +1 -1
  33. package/dist/components/button.d.ts +35 -1
  34. package/dist/components/button.js +5 -9
  35. package/dist/components/button.js.map +1 -1
  36. package/dist/components/calendar-heatmap.js +6 -4
  37. package/dist/components/calendar-heatmap.js.map +1 -1
  38. package/dist/components/camera-button.d.ts +89 -0
  39. package/dist/components/camera-button.js +122 -0
  40. package/dist/components/camera-button.js.map +1 -0
  41. package/dist/components/camera-capture.d.ts +66 -0
  42. package/dist/components/camera-capture.js +190 -0
  43. package/dist/components/camera-capture.js.map +1 -0
  44. package/dist/components/camera-labels.d.ts +20 -0
  45. package/dist/components/camera-labels.js +15 -0
  46. package/dist/components/camera-labels.js.map +1 -0
  47. package/dist/components/chart-edge.d.ts +9 -0
  48. package/dist/components/chart-edge.js +14 -3
  49. package/dist/components/chart-edge.js.map +1 -1
  50. package/dist/components/chart-zoom-core.js +34 -29
  51. package/dist/components/chart-zoom-core.js.map +1 -1
  52. package/dist/components/checkbox-group.js +1 -1
  53. package/dist/components/checkbox-group.js.map +1 -1
  54. package/dist/components/combobox-core.js +3 -2
  55. package/dist/components/combobox-core.js.map +1 -1
  56. package/dist/components/combobox.js +2 -2
  57. package/dist/components/combobox.js.map +1 -1
  58. package/dist/components/consent-again-notice-labels.d.ts +25 -0
  59. package/dist/components/consent-again-notice-labels.js +15 -0
  60. package/dist/components/consent-again-notice-labels.js.map +1 -0
  61. package/dist/components/consent-again-notice.d.ts +85 -0
  62. package/dist/components/consent-again-notice.js +94 -0
  63. package/dist/components/consent-again-notice.js.map +1 -0
  64. package/dist/components/country-select.js +2 -7
  65. package/dist/components/country-select.js.map +1 -1
  66. package/dist/components/currency-option-list.d.ts +2 -1
  67. package/dist/components/currency-option-list.js +10 -3
  68. package/dist/components/currency-option-list.js.map +1 -1
  69. package/dist/components/currency-select.d.ts +3 -1
  70. package/dist/components/currency-select.js +2 -2
  71. package/dist/components/currency-select.js.map +1 -1
  72. package/dist/components/danger-confirm.d.ts +22 -1
  73. package/dist/components/danger-confirm.js +52 -30
  74. package/dist/components/danger-confirm.js.map +1 -1
  75. package/dist/components/data-table-column-settings.js +2 -2
  76. package/dist/components/data-table-column-settings.js.map +1 -1
  77. package/dist/components/data-table-filter-popover.d.ts +2 -1
  78. package/dist/components/data-table-filter-popover.js +3 -2
  79. package/dist/components/data-table-filter-popover.js.map +1 -1
  80. package/dist/components/data-table-filters.d.ts +33 -3
  81. package/dist/components/data-table-filters.js +6 -4
  82. package/dist/components/data-table-filters.js.map +1 -1
  83. package/dist/components/data-table-fit.js.map +1 -1
  84. package/dist/components/data-table-virtual.js +13 -3
  85. package/dist/components/data-table-virtual.js.map +1 -1
  86. package/dist/components/date-field.js +2 -2
  87. package/dist/components/date-field.js.map +1 -1
  88. package/dist/components/date-picker.js +2 -2
  89. package/dist/components/date-picker.js.map +1 -1
  90. package/dist/components/date-range-picker.js +2 -6
  91. package/dist/components/date-range-picker.js.map +1 -1
  92. package/dist/components/dialog-frame.d.ts +5 -1
  93. package/dist/components/dialog-frame.js +6 -2
  94. package/dist/components/dialog-frame.js.map +1 -1
  95. package/dist/components/dropdown.js +7 -3
  96. package/dist/components/dropdown.js.map +1 -1
  97. package/dist/components/entity-combobox.js +2 -2
  98. package/dist/components/entity-combobox.js.map +1 -1
  99. package/dist/components/field-parts.d.ts +108 -6
  100. package/dist/components/field-parts.js +59 -6
  101. package/dist/components/field-parts.js.map +1 -1
  102. package/dist/components/field-suggestion-labels.d.ts +2 -0
  103. package/dist/components/field-suggestion-labels.js +10 -0
  104. package/dist/components/field-suggestion-labels.js.map +1 -0
  105. package/dist/components/field.js +1 -1
  106. package/dist/components/field.js.map +1 -1
  107. package/dist/components/file-button.d.ts +1 -1
  108. package/dist/components/file-button.js.map +1 -1
  109. package/dist/components/floating-panel.d.ts +7 -6
  110. package/dist/components/floating-panel.js +3 -17
  111. package/dist/components/floating-panel.js.map +1 -1
  112. package/dist/components/form-actions.d.ts +3 -2
  113. package/dist/components/form-actions.js.map +1 -1
  114. package/dist/components/hover-menu.js +3 -2
  115. package/dist/components/hover-menu.js.map +1 -1
  116. package/dist/components/icon-button.d.ts +23 -5
  117. package/dist/components/icon-button.js +6 -8
  118. package/dist/components/icon-button.js.map +1 -1
  119. package/dist/components/inline-confirm.js +2 -1
  120. package/dist/components/inline-confirm.js.map +1 -1
  121. package/dist/components/inline-entity-combobox.js +2 -2
  122. package/dist/components/inline-entity-combobox.js.map +1 -1
  123. package/dist/components/input.js +2 -2
  124. package/dist/components/input.js.map +1 -1
  125. package/dist/components/jump-calendar.js +3 -3
  126. package/dist/components/jump-calendar.js.map +1 -1
  127. package/dist/components/legal.d.ts +13 -1
  128. package/dist/components/legal.js +12 -0
  129. package/dist/components/legal.js.map +1 -1
  130. package/dist/components/legended-series-chart.d.ts +80 -0
  131. package/dist/components/legended-series-chart.js +70 -0
  132. package/dist/components/legended-series-chart.js.map +1 -0
  133. package/dist/components/lightbox.js +2 -1
  134. package/dist/components/lightbox.js.map +1 -1
  135. package/dist/components/mini-calendar.js +16 -7
  136. package/dist/components/mini-calendar.js.map +1 -1
  137. package/dist/components/modal.d.ts +48 -0
  138. package/dist/components/modal.js +26 -6
  139. package/dist/components/modal.js.map +1 -1
  140. package/dist/components/month-picker.d.ts +1 -1
  141. package/dist/components/month-picker.js +6 -6
  142. package/dist/components/month-picker.js.map +1 -1
  143. package/dist/components/multi-entity-combobox.js +2 -2
  144. package/dist/components/multi-entity-combobox.js.map +1 -1
  145. package/dist/components/multi-select.js +2 -6
  146. package/dist/components/multi-select.js.map +1 -1
  147. package/dist/components/number-input.js +2 -2
  148. package/dist/components/number-input.js.map +1 -1
  149. package/dist/components/page-header-layout.d.ts +18 -0
  150. package/dist/components/page-header-layout.js +23 -0
  151. package/dist/components/page-header-layout.js.map +1 -0
  152. package/dist/components/page-header-skeleton.d.ts +41 -0
  153. package/dist/components/page-header-skeleton.js +52 -0
  154. package/dist/components/page-header-skeleton.js.map +1 -0
  155. package/dist/components/page-header.js +4 -17
  156. package/dist/components/page-header.js.map +1 -1
  157. package/dist/components/popover.js +7 -2
  158. package/dist/components/popover.js.map +1 -1
  159. package/dist/components/release-notes-labels.d.ts +16 -0
  160. package/dist/components/release-notes-labels.js +18 -0
  161. package/dist/components/release-notes-labels.js.map +1 -0
  162. package/dist/components/release-notes.d.ts +65 -0
  163. package/dist/components/release-notes.js +65 -0
  164. package/dist/components/release-notes.js.map +1 -0
  165. package/dist/components/select.js +2 -2
  166. package/dist/components/select.js.map +1 -1
  167. package/dist/components/series-chart-labels.d.ts +9 -0
  168. package/dist/components/series-chart-labels.js +3 -1
  169. package/dist/components/series-chart-labels.js.map +1 -1
  170. package/dist/components/series-chart.d.ts +5 -0
  171. package/dist/components/series-chart.js +89 -36
  172. package/dist/components/series-chart.js.map +1 -1
  173. package/dist/components/stat-tile.d.ts +21 -2
  174. package/dist/components/stat-tile.js +4 -2
  175. package/dist/components/stat-tile.js.map +1 -1
  176. package/dist/components/toggle-group.js +3 -2
  177. package/dist/components/toggle-group.js.map +1 -1
  178. package/dist/components/treemap-layout.js.map +1 -1
  179. package/dist/components/treemap.d.ts +17 -15
  180. package/dist/components/treemap.js +167 -85
  181. package/dist/components/treemap.js.map +1 -1
  182. package/dist/currencies.d.ts +16 -2
  183. package/dist/currencies.js +2 -1
  184. package/dist/currencies.js.map +1 -1
  185. package/dist/eslint/index.js +1 -1
  186. package/dist/eslint/role-utilities.d.ts +2 -2
  187. package/dist/eslint/role-utilities.js.map +1 -1
  188. package/dist/feedback/feedback-context-labels.js +2 -1
  189. package/dist/feedback/feedback-context-labels.js.map +1 -1
  190. package/dist/feedback/feedback-context.d.ts +19 -3
  191. package/dist/feedback/feedback-context.js +12 -1
  192. package/dist/feedback/feedback-context.js.map +1 -1
  193. package/dist/feedback/feedback-diagnostics.d.ts +17 -0
  194. package/dist/feedback/feedback-diagnostics.js +27 -0
  195. package/dist/feedback/feedback-diagnostics.js.map +1 -0
  196. package/dist/feedback/feedback-dialog.d.ts +10 -0
  197. package/dist/feedback/feedback-dialog.js +6 -4
  198. package/dist/feedback/feedback-dialog.js.map +1 -1
  199. package/dist/feedback/feedback-inbox-page.d.ts +260 -0
  200. package/dist/feedback/feedback-inbox-page.js +207 -0
  201. package/dist/feedback/feedback-inbox-page.js.map +1 -0
  202. package/dist/feedback/feedback-record.d.ts +5 -0
  203. package/dist/feedback/feedback-record.js.map +1 -1
  204. package/dist/feedback/feedback-row-detail-labels.js +1 -0
  205. package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
  206. package/dist/feedback/feedback-row-detail.d.ts +3 -0
  207. package/dist/feedback/feedback-row-detail.js +3 -0
  208. package/dist/feedback/feedback-row-detail.js.map +1 -1
  209. package/dist/feedback/feedback-submit-dialog.d.ts +5 -1
  210. package/dist/feedback/feedback-submit-dialog.js +15 -3
  211. package/dist/feedback/feedback-submit-dialog.js.map +1 -1
  212. package/dist/feedback/feedback-submit.d.ts +30 -2
  213. package/dist/feedback/feedback-submit.js +5 -2
  214. package/dist/feedback/feedback-submit.js.map +1 -1
  215. package/dist/feedback/feedback-vocabulary.js +2 -2
  216. package/dist/feedback/feedback-vocabulary.js.map +1 -1
  217. package/dist/feedback.d.ts +1 -0
  218. package/dist/feedback.js +6 -0
  219. package/dist/feedback.js.map +1 -1
  220. package/dist/hooks/use-debounce.d.ts +32 -5
  221. package/dist/hooks/use-debounce.js +6 -5
  222. package/dist/hooks/use-debounce.js.map +1 -1
  223. package/dist/hooks/use-file-picker.d.ts +3 -1
  224. package/dist/hooks/use-file-picker.js.map +1 -1
  225. package/dist/hooks/use-focus-trap.d.ts +19 -3
  226. package/dist/hooks/use-focus-trap.js +15 -5
  227. package/dist/hooks/use-focus-trap.js.map +1 -1
  228. package/dist/hooks/use-has-camera.d.ts +36 -0
  229. package/dist/hooks/use-has-camera.js +53 -0
  230. package/dist/hooks/use-has-camera.js.map +1 -0
  231. package/dist/hooks/use-hotkey.js +2 -1
  232. package/dist/hooks/use-hotkey.js.map +1 -1
  233. package/dist/hooks/use-overlay-history.d.ts +6 -1
  234. package/dist/hooks/use-overlay-history.js +10 -2
  235. package/dist/hooks/use-overlay-history.js.map +1 -1
  236. package/dist/i18n/defaults.js +11 -1
  237. package/dist/i18n/defaults.js.map +1 -1
  238. package/dist/i18n/german.js +78 -4
  239. package/dist/i18n/german.js.map +1 -1
  240. package/dist/i18n/kit-labels.d.ts +20 -0
  241. package/dist/i18n/kit-labels.js.map +1 -1
  242. package/dist/i18n/locales/en.js +95 -5
  243. package/dist/i18n/locales/en.js.map +3 -3
  244. package/dist/i18n/locales/es.js +74 -4
  245. package/dist/i18n/locales/es.js.map +1 -1
  246. package/dist/i18n/locales/fr.js +75 -3
  247. package/dist/i18n/locales/fr.js.map +1 -1
  248. package/dist/i18n/locales/hu.js +77 -4
  249. package/dist/i18n/locales/hu.js.map +1 -1
  250. package/dist/i18n/locales/it.js +77 -4
  251. package/dist/i18n/locales/it.js.map +1 -1
  252. package/dist/i18n/locales/zh.js +74 -4
  253. package/dist/i18n/locales/zh.js.map +1 -1
  254. package/dist/i18n/review.js +22 -1
  255. package/dist/i18n/review.js.map +1 -1
  256. package/dist/index.d.ts +27 -8
  257. package/dist/index.js +41 -2
  258. package/dist/index.js.map +1 -1
  259. package/dist/landing/landing-labels.d.ts +8 -0
  260. package/dist/landing/landing-labels.js +2 -1
  261. package/dist/landing/landing-labels.js.map +1 -1
  262. package/dist/lib/changelog.d.ts +130 -0
  263. package/dist/lib/changelog.js +137 -0
  264. package/dist/lib/changelog.js.map +1 -0
  265. package/dist/lib/clipboard-minus.js +2 -2
  266. package/dist/lib/clipboard-minus.js.map +1 -1
  267. package/dist/lib/dates.d.ts +36 -4
  268. package/dist/lib/dates.js +49 -13
  269. package/dist/lib/dates.js.map +1 -1
  270. package/dist/lib/editable-content.d.ts +33 -0
  271. package/dist/lib/editable-content.js +15 -0
  272. package/dist/lib/editable-content.js.map +1 -0
  273. package/dist/lib/focus-left.d.ts +47 -1
  274. package/dist/lib/focus-left.js +11 -2
  275. package/dist/lib/focus-left.js.map +1 -1
  276. package/dist/lib/format.d.ts +37 -2
  277. package/dist/lib/format.js +25 -1
  278. package/dist/lib/format.js.map +1 -1
  279. package/dist/lib/intl-cache.d.ts +4 -2
  280. package/dist/lib/intl-cache.js.map +1 -1
  281. package/dist/lib/server-wake.d.ts +49 -9
  282. package/dist/lib/server-wake.js +25 -14
  283. package/dist/lib/server-wake.js.map +1 -1
  284. package/dist/lib/session-refresh.d.ts +53 -0
  285. package/dist/lib/session-refresh.js +27 -1
  286. package/dist/lib/session-refresh.js.map +1 -1
  287. package/dist/lib/translation-review.d.ts +26 -0
  288. package/dist/lib/translation-review.js +14 -0
  289. package/dist/lib/translation-review.js.map +1 -1
  290. package/dist/rhf/fields.js +3 -3
  291. package/dist/rhf/fields.js.map +1 -1
  292. package/dist/shell/app-shell.d.ts +25 -1
  293. package/dist/shell/app-shell.js +3 -1
  294. package/dist/shell/app-shell.js.map +1 -1
  295. package/dist/shell/dev-menu.d.ts +3 -0
  296. package/dist/shell/dev-menu.js +4 -2
  297. package/dist/shell/dev-menu.js.map +1 -1
  298. package/dist/shell/held-changes-banner-labels.d.ts +23 -0
  299. package/dist/shell/held-changes-banner-labels.js +14 -0
  300. package/dist/shell/held-changes-banner-labels.js.map +1 -0
  301. package/dist/shell/held-changes-banner.d.ts +75 -0
  302. package/dist/shell/held-changes-banner.js +106 -0
  303. package/dist/shell/held-changes-banner.js.map +1 -0
  304. package/dist/shell/sync-status-indicator.d.ts +27 -12
  305. package/dist/shell/sync-status-indicator.js +13 -4
  306. package/dist/shell/sync-status-indicator.js.map +1 -1
  307. package/dist/shell/top-bar-parts-labels.d.ts +5 -0
  308. package/dist/shell/top-bar-parts-labels.js +3 -1
  309. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  310. package/dist/shell.d.ts +2 -0
  311. package/dist/shell.js +3 -0
  312. package/dist/shell.js.map +1 -1
  313. package/dist/sync/engine.d.ts +11 -2
  314. package/dist/sync/engine.js +13 -5
  315. package/dist/sync/engine.js.map +1 -1
  316. package/dist/sync/hooks.d.ts +3 -2
  317. package/dist/sync/hooks.js +4 -2
  318. package/dist/sync/hooks.js.map +1 -1
  319. package/dist/testing/css-variables.generated.d.ts +2 -2
  320. package/dist/testing/css-variables.generated.js +1 -1
  321. package/dist/testing/css-variables.generated.js.map +1 -1
  322. package/dist/theme/chart-palette.d.ts +18 -0
  323. package/dist/theme/chart-palette.js +17 -1
  324. package/dist/theme/chart-palette.js.map +1 -1
  325. package/dist/theme/contrast-tokens.d.ts +3 -3
  326. package/dist/theme/contrast-tokens.js.map +1 -1
  327. package/dist/theme/contrast.d.ts +4 -4
  328. package/dist/theme/contrast.js.map +1 -1
  329. package/dist/tour/tour-overlay.js +2 -1
  330. package/dist/tour/tour-overlay.js.map +1 -1
  331. package/package.json +5 -9
  332. package/tokens.css +19 -54
  333. package/src/account/account-parts.ts +0 -47
  334. package/src/account/account-settings-labels.ts +0 -240
  335. package/src/account/account-settings.tsx +0 -698
  336. package/src/account/data-export-setting-labels.ts +0 -20
  337. package/src/account/data-export-setting.tsx +0 -200
  338. package/src/account/delete-account-setting-labels.ts +0 -33
  339. package/src/account/delete-account-setting.tsx +0 -341
  340. package/src/account/email-change-setting-labels.ts +0 -31
  341. package/src/account/email-change-setting.tsx +0 -443
  342. package/src/account/passkeys-setting.tsx +0 -445
  343. package/src/account/sessions-setting-labels.ts +0 -24
  344. package/src/account/sessions-setting.tsx +0 -283
  345. package/src/admin/admin-action-confirm-labels.ts +0 -19
  346. package/src/admin/admin-action-confirm.tsx +0 -509
  347. package/src/admin/admin-action-log-labels.ts +0 -83
  348. package/src/admin/admin-action-log.tsx +0 -464
  349. package/src/admin/admin-area-labels.ts +0 -114
  350. package/src/admin/admin-forbidden.tsx +0 -75
  351. package/src/admin/admin-overview.tsx +0 -258
  352. package/src/admin/admin-parts.ts +0 -68
  353. package/src/admin/admin-sections.tsx +0 -208
  354. package/src/admin/admin-tool-links.tsx +0 -90
  355. package/src/admin/invitations-panel-labels.ts +0 -31
  356. package/src/admin/invitations-panel.tsx +0 -516
  357. package/src/admin/mail-test-card-labels.ts +0 -19
  358. package/src/admin/mail-test-card.tsx +0 -189
  359. package/src/admin/plan-change-labels.ts +0 -5
  360. package/src/admin/plan-change.tsx +0 -474
  361. package/src/admin/reviewer-scope-editor-labels.ts +0 -16
  362. package/src/admin/reviewer-scope-editor.tsx +0 -224
  363. package/src/admin/role-select-labels.ts +0 -16
  364. package/src/admin/role-select.tsx +0 -282
  365. package/src/admin/transfer-ownership-dialog-labels.ts +0 -20
  366. package/src/admin/transfer-ownership-dialog.tsx +0 -162
  367. package/src/admin/user-roster-labels.ts +0 -17
  368. package/src/admin/user-roster.tsx +0 -559
  369. package/src/auth/accept-invitation-labels.ts +0 -21
  370. package/src/auth/accept-invitation.tsx +0 -210
  371. package/src/auth/auth-errors-labels.ts +0 -23
  372. package/src/auth/auth-errors.ts +0 -370
  373. package/src/auth/complete-name-dialog-labels.ts +0 -16
  374. package/src/auth/complete-name-dialog.tsx +0 -253
  375. package/src/auth/email-tag.ts +0 -75
  376. package/src/auth/forgot-password-form-labels.ts +0 -20
  377. package/src/auth/forgot-password-form.tsx +0 -221
  378. package/src/auth/form-rules.ts +0 -40
  379. package/src/auth/new-password-fields.tsx +0 -85
  380. package/src/auth/not-found-page-labels.ts +0 -12
  381. package/src/auth/not-found-page.tsx +0 -95
  382. package/src/auth/register-form-labels.ts +0 -31
  383. package/src/auth/register-form.tsx +0 -456
  384. package/src/auth/reset-password-form-labels.ts +0 -27
  385. package/src/auth/reset-password-form.tsx +0 -341
  386. package/src/auth/sign-in-form-labels.ts +0 -44
  387. package/src/auth/sign-in-form.tsx +0 -858
  388. package/src/auth/status-parts.tsx +0 -132
  389. package/src/auth/verify-email-labels.ts +0 -26
  390. package/src/auth/verify-email.tsx +0 -445
  391. package/src/billing/billing-banner.tsx +0 -258
  392. package/src/billing/billing-labels.ts +0 -381
  393. package/src/billing/billing-lock.ts +0 -108
  394. package/src/billing/billing-overview.ts +0 -157
  395. package/src/billing/billing-standing.ts +0 -80
  396. package/src/billing/cancel-request.ts +0 -97
  397. package/src/billing/cancel-subscription.tsx +0 -98
  398. package/src/billing/checkout-processing.ts +0 -394
  399. package/src/billing/checkout-return.ts +0 -90
  400. package/src/billing/pay-page.ts +0 -330
  401. package/src/billing/plan-card.tsx +0 -562
  402. package/src/billing/plan-change-labels.ts +0 -66
  403. package/src/billing/plan-limit-notice.tsx +0 -148
  404. package/src/billing/plan-limit-toast.tsx +0 -90
  405. package/src/billing/plan-limit.ts +0 -52
  406. package/src/billing/plan-price.ts +0 -98
  407. package/src/billing/plan-switch.tsx +0 -216
  408. package/src/billing/provider-page.ts +0 -84
  409. package/src/billing/subscription-actions.tsx +0 -247
  410. package/src/billing/subscription-status-chip.tsx +0 -95
  411. package/src/chart.ts +0 -103
  412. package/src/components/account-chips-labels.ts +0 -16
  413. package/src/components/account-chips.tsx +0 -474
  414. package/src/components/alert-banner.tsx +0 -670
  415. package/src/components/amount-input.tsx +0 -815
  416. package/src/components/appearance-labels.ts +0 -63
  417. package/src/components/authed-image-labels.ts +0 -11
  418. package/src/components/authed-image.tsx +0 -209
  419. package/src/components/autocomplete.tsx +0 -645
  420. package/src/components/breadcrumbs-labels.ts +0 -10
  421. package/src/components/breadcrumbs.tsx +0 -205
  422. package/src/components/bulk-action-bar-labels.ts +0 -11
  423. package/src/components/bulk-action-bar.tsx +0 -443
  424. package/src/components/button-group.tsx +0 -223
  425. package/src/components/button-look.ts +0 -256
  426. package/src/components/button.tsx +0 -339
  427. package/src/components/calculator.tsx +0 -341
  428. package/src/components/calendar-heatmap-labels.ts +0 -15
  429. package/src/components/calendar-heatmap.tsx +0 -594
  430. package/src/components/card.tsx +0 -377
  431. package/src/components/chart-edge.ts +0 -106
  432. package/src/components/chart-figure.tsx +0 -35
  433. package/src/components/chart-height.ts +0 -30
  434. package/src/components/chart-zoom-core.tsx +0 -627
  435. package/src/components/chart-zoom.tsx +0 -22
  436. package/src/components/chart.tsx +0 -554
  437. package/src/components/checkbox-group.tsx +0 -247
  438. package/src/components/checkbox.tsx +0 -346
  439. package/src/components/chip-input.tsx +0 -370
  440. package/src/components/chip-labels.ts +0 -13
  441. package/src/components/chip.tsx +0 -843
  442. package/src/components/choice-card.tsx +0 -544
  443. package/src/components/column-mapper-labels.ts +0 -38
  444. package/src/components/column-mapper.tsx +0 -655
  445. package/src/components/combobox-core.tsx +0 -1321
  446. package/src/components/combobox-suggestions.tsx +0 -131
  447. package/src/components/combobox.tsx +0 -716
  448. package/src/components/confirm-context.ts +0 -7
  449. package/src/components/confirm-dialog-labels.ts +0 -13
  450. package/src/components/confirm-dialog.tsx +0 -341
  451. package/src/components/copy-button-labels.ts +0 -13
  452. package/src/components/copy-button.tsx +0 -192
  453. package/src/components/country-select-labels.ts +0 -11
  454. package/src/components/country-select.tsx +0 -539
  455. package/src/components/currency-option-list.tsx +0 -180
  456. package/src/components/currency-select.tsx +0 -341
  457. package/src/components/danger-confirm-labels.ts +0 -20
  458. package/src/components/danger-confirm.tsx +0 -934
  459. package/src/components/data-table-cells.tsx +0 -118
  460. package/src/components/data-table-column-settings.tsx +0 -198
  461. package/src/components/data-table-filter-popover.tsx +0 -281
  462. package/src/components/data-table-filters.ts +0 -287
  463. package/src/components/data-table-fit.ts +0 -301
  464. package/src/components/data-table-groups.tsx +0 -288
  465. package/src/components/data-table-head.tsx +0 -280
  466. package/src/components/data-table-labels.ts +0 -198
  467. package/src/components/data-table-leading-row.tsx +0 -58
  468. package/src/components/data-table-mobile.tsx +0 -1117
  469. package/src/components/data-table-pagination.tsx +0 -202
  470. package/src/components/data-table-resize.ts +0 -188
  471. package/src/components/data-table-row-actions.tsx +0 -302
  472. package/src/components/data-table-row.tsx +0 -496
  473. package/src/components/data-table-selection.ts +0 -71
  474. package/src/components/data-table-shared.tsx +0 -287
  475. package/src/components/data-table-sort.ts +0 -163
  476. package/src/components/data-table-virtual.ts +0 -576
  477. package/src/components/data-table.tsx +0 -2598
  478. package/src/components/date-field.tsx +0 -684
  479. package/src/components/date-format-setting.tsx +0 -64
  480. package/src/components/date-picker.tsx +0 -404
  481. package/src/components/date-range-picker.tsx +0 -518
  482. package/src/components/description-list-labels.ts +0 -9
  483. package/src/components/description-list.tsx +0 -386
  484. package/src/components/dialog-frame-labels.ts +0 -7
  485. package/src/components/dialog-frame.tsx +0 -276
  486. package/src/components/disclosure.tsx +0 -476
  487. package/src/components/dropdown.tsx +0 -461
  488. package/src/components/empty-state.tsx +0 -136
  489. package/src/components/entity-combobox.tsx +0 -422
  490. package/src/components/error-boundary-labels.ts +0 -20
  491. package/src/components/error-boundary.tsx +0 -675
  492. package/src/components/facing-pair.ts +0 -93
  493. package/src/components/field-base-labels.ts +0 -20
  494. package/src/components/field-base.tsx +0 -656
  495. package/src/components/field-parts.tsx +0 -825
  496. package/src/components/field-strip.tsx +0 -129
  497. package/src/components/field.tsx +0 -206
  498. package/src/components/file-button.tsx +0 -295
  499. package/src/components/file-dropzone.tsx +0 -559
  500. package/src/components/floating-panel-labels.ts +0 -10
  501. package/src/components/floating-panel.tsx +0 -828
  502. package/src/components/focus-ring.ts +0 -16
  503. package/src/components/form-actions-labels.ts +0 -11
  504. package/src/components/form-actions.tsx +0 -578
  505. package/src/components/full-bleed-dialog.tsx +0 -294
  506. package/src/components/grouped-picker.tsx +0 -184
  507. package/src/components/help-popover.tsx +0 -117
  508. package/src/components/hover-menu.tsx +0 -343
  509. package/src/components/iban-input-labels.ts +0 -14
  510. package/src/components/iban-input.tsx +0 -236
  511. package/src/components/icon-button.tsx +0 -959
  512. package/src/components/icon-picker-labels.ts +0 -13
  513. package/src/components/icon-picker.tsx +0 -232
  514. package/src/components/image-grid-labels.ts +0 -11
  515. package/src/components/image-grid.tsx +0 -202
  516. package/src/components/inline-confirm.tsx +0 -116
  517. package/src/components/inline-edit-field-labels.ts +0 -11
  518. package/src/components/inline-edit-field.tsx +0 -552
  519. package/src/components/inline-entity-combobox.tsx +0 -849
  520. package/src/components/input.tsx +0 -394
  521. package/src/components/jump-calendar.tsx +0 -265
  522. package/src/components/language-select.tsx +0 -93
  523. package/src/components/legal-labels.ts +0 -105
  524. package/src/components/legal-page.tsx +0 -711
  525. package/src/components/legal.tsx +0 -668
  526. package/src/components/lightbox-labels.ts +0 -18
  527. package/src/components/lightbox.tsx +0 -399
  528. package/src/components/line-items-labels.ts +0 -14
  529. package/src/components/line-items.tsx +0 -602
  530. package/src/components/list-labels.ts +0 -12
  531. package/src/components/list.tsx +0 -870
  532. package/src/components/loading-state.tsx +0 -78
  533. package/src/components/measured-grid-labels.ts +0 -25
  534. package/src/components/measured-grid.tsx +0 -837
  535. package/src/components/menu-item.tsx +0 -241
  536. package/src/components/mini-calendar-labels.ts +0 -17
  537. package/src/components/mini-calendar.tsx +0 -789
  538. package/src/components/modal.tsx +0 -505
  539. package/src/components/money-draft.ts +0 -83
  540. package/src/components/money-field.tsx +0 -76
  541. package/src/components/month-grid.tsx +0 -229
  542. package/src/components/month-picker-labels.ts +0 -22
  543. package/src/components/month-picker.tsx +0 -1087
  544. package/src/components/multi-entity-combobox.tsx +0 -369
  545. package/src/components/multi-select.tsx +0 -376
  546. package/src/components/nav-pills.tsx +0 -198
  547. package/src/components/number-field.tsx +0 -327
  548. package/src/components/number-input.tsx +0 -558
  549. package/src/components/numeric-field.ts +0 -169
  550. package/src/components/numpad-sheet.tsx +0 -285
  551. package/src/components/one-time-code-input.tsx +0 -270
  552. package/src/components/page-contents-labels.ts +0 -9
  553. package/src/components/page-contents.tsx +0 -282
  554. package/src/components/page-header-context.ts +0 -8
  555. package/src/components/page-header.tsx +0 -298
  556. package/src/components/password-strength-labels.ts +0 -22
  557. package/src/components/password-strength.tsx +0 -241
  558. package/src/components/phone-input-labels.ts +0 -10
  559. package/src/components/phone-input.tsx +0 -282
  560. package/src/components/picker-sheet.tsx +0 -330
  561. package/src/components/pie-chart-labels.ts +0 -40
  562. package/src/components/pie-chart.tsx +0 -480
  563. package/src/components/popover-labels.ts +0 -14
  564. package/src/components/popover.tsx +0 -268
  565. package/src/components/progress-bar-labels.ts +0 -10
  566. package/src/components/progress-bar.tsx +0 -479
  567. package/src/components/qr-code.tsx +0 -76
  568. package/src/components/reauth-dialog-labels.ts +0 -13
  569. package/src/components/reauth-dialog.tsx +0 -265
  570. package/src/components/row-actions-labels.ts +0 -12
  571. package/src/components/row-actions.tsx +0 -795
  572. package/src/components/scroll-area.tsx +0 -123
  573. package/src/components/search-field.tsx +0 -192
  574. package/src/components/select.tsx +0 -294
  575. package/src/components/separator.tsx +0 -33
  576. package/src/components/series-chart-axes.ts +0 -342
  577. package/src/components/series-chart-budget.ts +0 -150
  578. package/src/components/series-chart-labels.ts +0 -33
  579. package/src/components/series-chart-thin.ts +0 -180
  580. package/src/components/series-chart-ticks.ts +0 -194
  581. package/src/components/series-chart.tsx +0 -1906
  582. package/src/components/server-wake-labels.ts +0 -11
  583. package/src/components/server-wake.tsx +0 -129
  584. package/src/components/settings-fields.tsx +0 -237
  585. package/src/components/share-card-labels.ts +0 -30
  586. package/src/components/share-card.tsx +0 -675
  587. package/src/components/signature-pad-labels.ts +0 -24
  588. package/src/components/signature-pad.tsx +0 -747
  589. package/src/components/signed-amount-labels.ts +0 -10
  590. package/src/components/signed-amount.tsx +0 -336
  591. package/src/components/skeleton.tsx +0 -80
  592. package/src/components/slider.tsx +0 -338
  593. package/src/components/sparkline-labels.ts +0 -14
  594. package/src/components/sparkline.tsx +0 -322
  595. package/src/components/spinner.tsx +0 -81
  596. package/src/components/stat-tile-labels.ts +0 -15
  597. package/src/components/stat-tile.tsx +0 -725
  598. package/src/components/status-dot.tsx +0 -170
  599. package/src/components/swatch-picker-labels.ts +0 -10
  600. package/src/components/swatch-picker.tsx +0 -283
  601. package/src/components/swipeable-row.tsx +0 -386
  602. package/src/components/switch.tsx +0 -273
  603. package/src/components/table-skeleton.tsx +0 -136
  604. package/src/components/table.tsx +0 -647
  605. package/src/components/tabs-labels.ts +0 -13
  606. package/src/components/tabs.tsx +0 -693
  607. package/src/components/text-link.tsx +0 -359
  608. package/src/components/text.tsx +0 -150
  609. package/src/components/textarea.tsx +0 -330
  610. package/src/components/tile-radio.tsx +0 -332
  611. package/src/components/time-input.tsx +0 -121
  612. package/src/components/toast-labels.ts +0 -12
  613. package/src/components/toast.tsx +0 -519
  614. package/src/components/toggle-group.tsx +0 -752
  615. package/src/components/toggle-legend.tsx +0 -394
  616. package/src/components/tooltip.tsx +0 -1149
  617. package/src/components/translation-review-editor.tsx +0 -290
  618. package/src/components/translation-review-labels.ts +0 -181
  619. package/src/components/translation-review-parts.tsx +0 -272
  620. package/src/components/translation-review.tsx +0 -1240
  621. package/src/components/tree-view.tsx +0 -589
  622. package/src/components/treemap-labels.ts +0 -47
  623. package/src/components/treemap-layout.ts +0 -210
  624. package/src/components/treemap.tsx +0 -1184
  625. package/src/components/trigger-aria.ts +0 -44
  626. package/src/components/use-anchor-dir.ts +0 -20
  627. package/src/components/use-mobile-reveal.ts +0 -62
  628. package/src/components/use-table-state.ts +0 -753
  629. package/src/components/user-avatar.tsx +0 -116
  630. package/src/components/wizard-stepper.tsx +0 -42
  631. package/src/components/write-lock-labels.ts +0 -10
  632. package/src/components/write-lock.tsx +0 -253
  633. package/src/currencies.ts +0 -70
  634. package/src/data-table.ts +0 -42
  635. package/src/demo/demo-banner.tsx +0 -153
  636. package/src/demo/demo-countdown.ts +0 -136
  637. package/src/demo/demo-ended.tsx +0 -90
  638. package/src/demo/demo-labels.ts +0 -78
  639. package/src/demo/demo-session.ts +0 -32
  640. package/src/demo/demo-start.tsx +0 -156
  641. package/src/eslint/index.ts +0 -161
  642. package/src/eslint/role-utilities.generated.ts +0 -146
  643. package/src/eslint/role-utilities.ts +0 -233
  644. package/src/feedback/feedback-attachment-download.tsx +0 -77
  645. package/src/feedback/feedback-attachment-labels.ts +0 -37
  646. package/src/feedback/feedback-attachment.tsx +0 -1239
  647. package/src/feedback/feedback-capture.ts +0 -287
  648. package/src/feedback/feedback-comment-thread.tsx +0 -353
  649. package/src/feedback/feedback-context-labels.ts +0 -10
  650. package/src/feedback/feedback-context.tsx +0 -213
  651. package/src/feedback/feedback-crash.ts +0 -547
  652. package/src/feedback/feedback-dialog-labels.ts +0 -29
  653. package/src/feedback/feedback-dialog.tsx +0 -440
  654. package/src/feedback/feedback-entry-file.tsx +0 -150
  655. package/src/feedback/feedback-inbox.tsx +0 -552
  656. package/src/feedback/feedback-labels.ts +0 -144
  657. package/src/feedback/feedback-menu-labels.ts +0 -12
  658. package/src/feedback/feedback-menu.tsx +0 -177
  659. package/src/feedback/feedback-mutation.ts +0 -20
  660. package/src/feedback/feedback-page-link.ts +0 -90
  661. package/src/feedback/feedback-public-labels.ts +0 -81
  662. package/src/feedback/feedback-public-list.tsx +0 -524
  663. package/src/feedback/feedback-public-switch.tsx +0 -102
  664. package/src/feedback/feedback-public-types.ts +0 -101
  665. package/src/feedback/feedback-record.ts +0 -423
  666. package/src/feedback/feedback-replies-context.ts +0 -9
  667. package/src/feedback/feedback-replies.tsx +0 -343
  668. package/src/feedback/feedback-rework-entry-chip.tsx +0 -18
  669. package/src/feedback/feedback-row-detail-labels.ts +0 -30
  670. package/src/feedback/feedback-row-detail.tsx +0 -858
  671. package/src/feedback/feedback-status-undo.ts +0 -109
  672. package/src/feedback/feedback-submit-dialog.tsx +0 -118
  673. package/src/feedback/feedback-submit.tsx +0 -237
  674. package/src/feedback/feedback-swipe.tsx +0 -192
  675. package/src/feedback/feedback-table-labels.ts +0 -27
  676. package/src/feedback/feedback-table.tsx +0 -912
  677. package/src/feedback/feedback-thread-labels.ts +0 -22
  678. package/src/feedback/feedback-thread-parts-labels.ts +0 -41
  679. package/src/feedback/feedback-thread.tsx +0 -905
  680. package/src/feedback/feedback-vocabulary.ts +0 -263
  681. package/src/feedback/feedback-vote-button.tsx +0 -124
  682. package/src/feedback.ts +0 -116
  683. package/src/hooks/use-anchored-panel.ts +0 -396
  684. package/src/hooks/use-anchored-rect.ts +0 -77
  685. package/src/hooks/use-announce.ts +0 -85
  686. package/src/hooks/use-authed-src.ts +0 -167
  687. package/src/hooks/use-body-scroll-lock.ts +0 -119
  688. package/src/hooks/use-breakpoint.ts +0 -133
  689. package/src/hooks/use-close-transition.ts +0 -107
  690. package/src/hooks/use-copy-to-clipboard.ts +0 -122
  691. package/src/hooks/use-debounce.ts +0 -114
  692. package/src/hooks/use-dismiss.ts +0 -371
  693. package/src/hooks/use-document-title.ts +0 -33
  694. package/src/hooks/use-file-drop.ts +0 -121
  695. package/src/hooks/use-file-picker-labels.ts +0 -28
  696. package/src/hooks/use-file-picker.tsx +0 -359
  697. package/src/hooks/use-focus-trap.ts +0 -199
  698. package/src/hooks/use-hotkey.ts +0 -189
  699. package/src/hooks/use-large-text.ts +0 -41
  700. package/src/hooks/use-long-press.ts +0 -140
  701. package/src/hooks/use-media-query.ts +0 -39
  702. package/src/hooks/use-mounted.ts +0 -39
  703. package/src/hooks/use-noindex.ts +0 -37
  704. package/src/hooks/use-overlay-history.ts +0 -714
  705. package/src/hooks/use-row-swipe.ts +0 -207
  706. package/src/hooks/use-search-param-state.ts +0 -434
  707. package/src/hooks/use-windowed-rows.ts +0 -225
  708. package/src/i18n/defaults.ts +0 -267
  709. package/src/i18n/german.ts +0 -2057
  710. package/src/i18n/kit-labels.tsx +0 -1003
  711. package/src/i18n/languages.ts +0 -349
  712. package/src/i18n/locales/de-CH.ts +0 -24
  713. package/src/i18n/locales/en.ts +0 -267
  714. package/src/i18n/locales/es.ts +0 -1997
  715. package/src/i18n/locales/fr.ts +0 -2035
  716. package/src/i18n/locales/hu.ts +0 -2002
  717. package/src/i18n/locales/it.ts +0 -2012
  718. package/src/i18n/locales/zh.ts +0 -1910
  719. package/src/i18n/plurals.ts +0 -86
  720. package/src/i18n/review.ts +0 -475
  721. package/src/i18n/shared-labels.ts +0 -138
  722. package/src/i18n/swiss.ts +0 -29
  723. package/src/index.ts +0 -1179
  724. package/src/landing/access.ts +0 -93
  725. package/src/landing/landing-actions.tsx +0 -97
  726. package/src/landing/landing-labels.ts +0 -59
  727. package/src/landing/landing-sections.tsx +0 -341
  728. package/src/landing/page-seo.ts +0 -261
  729. package/src/landing/public-header.tsx +0 -121
  730. package/src/landing/public-page.tsx +0 -106
  731. package/src/landing/routing.tsx +0 -225
  732. package/src/lib/broadcast.ts +0 -52
  733. package/src/lib/calc.ts +0 -323
  734. package/src/lib/chip-edge-snap.ts +0 -212
  735. package/src/lib/clipboard-minus.ts +0 -107
  736. package/src/lib/clipping.ts +0 -34
  737. package/src/lib/cn.ts +0 -28
  738. package/src/lib/column-mapping.ts +0 -234
  739. package/src/lib/countries.ts +0 -91
  740. package/src/lib/data-attributes.ts +0 -14
  741. package/src/lib/date-format.ts +0 -227
  742. package/src/lib/dates.ts +0 -266
  743. package/src/lib/day-format.ts +0 -96
  744. package/src/lib/decimal-marks.ts +0 -108
  745. package/src/lib/describe-failure.ts +0 -18
  746. package/src/lib/device-settings.ts +0 -147
  747. package/src/lib/direction.ts +0 -74
  748. package/src/lib/document-navigation.ts +0 -17
  749. package/src/lib/document-title.ts +0 -41
  750. package/src/lib/download.ts +0 -172
  751. package/src/lib/float-clearance.ts +0 -70
  752. package/src/lib/floating-stack.ts +0 -70
  753. package/src/lib/focus-left.ts +0 -156
  754. package/src/lib/format.ts +0 -522
  755. package/src/lib/http-status.ts +0 -38
  756. package/src/lib/iban.ts +0 -251
  757. package/src/lib/ime.ts +0 -24
  758. package/src/lib/intl-cache.ts +0 -25
  759. package/src/lib/iso-day.ts +0 -13
  760. package/src/lib/lazy-with-fallback.ts +0 -82
  761. package/src/lib/logger.ts +0 -69
  762. package/src/lib/minus.ts +0 -50
  763. package/src/lib/path-pattern.ts +0 -55
  764. package/src/lib/person-name.ts +0 -155
  765. package/src/lib/phone.ts +0 -208
  766. package/src/lib/plain-text.ts +0 -22
  767. package/src/lib/presence.ts +0 -18
  768. package/src/lib/qr-encode.ts +0 -444
  769. package/src/lib/quiet-focus.ts +0 -32
  770. package/src/lib/reduced-motion.ts +0 -22
  771. package/src/lib/refs.ts +0 -22
  772. package/src/lib/round.ts +0 -43
  773. package/src/lib/safe-storage.ts +0 -119
  774. package/src/lib/server-wake.ts +0 -315
  775. package/src/lib/session-refresh.ts +0 -472
  776. package/src/lib/share-format.ts +0 -18
  777. package/src/lib/status-tone.ts +0 -43
  778. package/src/lib/strip-fade.ts +0 -287
  779. package/src/lib/table-text.ts +0 -554
  780. package/src/lib/text-case.ts +0 -19
  781. package/src/lib/text-match.ts +0 -169
  782. package/src/lib/thenable.ts +0 -19
  783. package/src/lib/translation-review.ts +0 -717
  784. package/src/notifications/device-zone-report.ts +0 -67
  785. package/src/notifications/feedback-notification-types-labels.ts +0 -33
  786. package/src/notifications/feedback-notification-types.ts +0 -71
  787. package/src/notifications/notification-bell.tsx +0 -119
  788. package/src/notifications/notification-inbox.tsx +0 -309
  789. package/src/notifications/notification-parts.tsx +0 -81
  790. package/src/notifications/notification-types-setting.tsx +0 -406
  791. package/src/notifications/notification-types.ts +0 -89
  792. package/src/notifications/notifications-labels.ts +0 -287
  793. package/src/notifications/push-device-setting.tsx +0 -230
  794. package/src/notifications/push-devices-setting.tsx +0 -374
  795. package/src/notifications/push-worker.ts +0 -168
  796. package/src/notifications/quiet-hours-setting.tsx +0 -238
  797. package/src/notifications/unsubscribe-panel.tsx +0 -200
  798. package/src/notifications/use-push-device.ts +0 -448
  799. package/src/offline/local-first.ts +0 -100
  800. package/src/offline/pwa-update-prompt-labels.ts +0 -9
  801. package/src/offline/pwa-update-prompt.tsx +0 -78
  802. package/src/offline/query-persistence.ts +0 -391
  803. package/src/offline/service-worker-updates.ts +0 -81
  804. package/src/offline/shared-computer-labels.ts +0 -8
  805. package/src/offline/shared-computer.tsx +0 -87
  806. package/src/offline/sign-out-pending-dialog-labels.ts +0 -21
  807. package/src/offline/sign-out-pending-dialog.tsx +0 -135
  808. package/src/offline.ts +0 -37
  809. package/src/push-worker.ts +0 -25
  810. package/src/rhf/fields.tsx +0 -2187
  811. package/src/rhf/form-core.tsx +0 -324
  812. package/src/rhf/form.tsx +0 -12
  813. package/src/rhf/line-items.tsx +0 -135
  814. package/src/rhf/use-rhf-wizard-step.ts +0 -104
  815. package/src/rhf.ts +0 -21
  816. package/src/search/command-palette-labels.ts +0 -16
  817. package/src/search/command-palette.tsx +0 -624
  818. package/src/search/global-search-labels.ts +0 -13
  819. package/src/search/global-search.tsx +0 -660
  820. package/src/search/search-index.ts +0 -283
  821. package/src/search/use-command-key.ts +0 -23
  822. package/src/search.ts +0 -14
  823. package/src/settings/device-reset-setting-labels.ts +0 -20
  824. package/src/settings/device-reset-setting.tsx +0 -116
  825. package/src/settings/settings-card-classes.ts +0 -11
  826. package/src/settings/settings-catalogue.ts +0 -150
  827. package/src/settings/settings-context.ts +0 -33
  828. package/src/settings/settings-heading.tsx +0 -67
  829. package/src/settings/settings-labels.ts +0 -87
  830. package/src/settings/settings-layout.tsx +0 -471
  831. package/src/settings/settings-section.tsx +0 -108
  832. package/src/settings/use-account-appearance.ts +0 -148
  833. package/src/settings/use-account-language.ts +0 -146
  834. package/src/settings/use-settings-focus.ts +0 -128
  835. package/src/settings/use-settings-route.ts +0 -258
  836. package/src/shell/account-menu-language.tsx +0 -130
  837. package/src/shell/account-menu-text-size.tsx +0 -80
  838. package/src/shell/admin-menu.tsx +0 -183
  839. package/src/shell/app-shell-labels.ts +0 -11
  840. package/src/shell/app-shell.tsx +0 -1560
  841. package/src/shell/auth-layout.tsx +0 -186
  842. package/src/shell/company-switcher-labels.ts +0 -13
  843. package/src/shell/company-switcher.tsx +0 -136
  844. package/src/shell/dev-menu.tsx +0 -257
  845. package/src/shell/fill-height.tsx +0 -45
  846. package/src/shell/language-code.ts +0 -5
  847. package/src/shell/option-switcher-menu.tsx +0 -84
  848. package/src/shell/sync-status-indicator.tsx +0 -303
  849. package/src/shell/top-bar-actions.tsx +0 -87
  850. package/src/shell/top-bar-brand.tsx +0 -78
  851. package/src/shell/top-bar-parts-labels.ts +0 -148
  852. package/src/shell/top-bar.tsx +0 -40
  853. package/src/shell/topbar-action-menu.tsx +0 -567
  854. package/src/shell/topbar-controls.tsx +0 -269
  855. package/src/shell/tour-menu.tsx +0 -187
  856. package/src/shell.ts +0 -108
  857. package/src/sync/db.ts +0 -129
  858. package/src/sync/engine.ts +0 -1011
  859. package/src/sync/hooks.ts +0 -98
  860. package/src/sync/testing.ts +0 -73
  861. package/src/sync/wire.ts +0 -61
  862. package/src/sync.ts +0 -37
  863. package/src/table-text.ts +0 -8
  864. package/src/testing/css-variables.generated.ts +0 -112
  865. package/src/testing/css-variables.ts +0 -189
  866. package/src/testing/index.ts +0 -29
  867. package/src/testing/react.ts +0 -58
  868. package/src/testing/tour.ts +0 -41
  869. package/src/testing/viewport.ts +0 -357
  870. package/src/theme/chart-palette.ts +0 -232
  871. package/src/theme/color.ts +0 -272
  872. package/src/theme/contrast-tokens.ts +0 -268
  873. package/src/theme/contrast.ts +0 -250
  874. package/src/theme/palette-derive.ts +0 -825
  875. package/src/theme/palette-presets.ts +0 -544
  876. package/src/theme/palette-store.ts +0 -108
  877. package/src/theme/text-size.ts +0 -289
  878. package/src/theme/theme-store.ts +0 -157
  879. package/src/tour/tour-catalogue-labels.ts +0 -75
  880. package/src/tour/tour-catalogue.tsx +0 -335
  881. package/src/tour/tour-dock.ts +0 -134
  882. package/src/tour/tour-engine.ts +0 -37
  883. package/src/tour/tour-gates.ts +0 -218
  884. package/src/tour/tour-guide-button.tsx +0 -64
  885. package/src/tour/tour-guide-labels.ts +0 -15
  886. package/src/tour/tour-info.ts +0 -144
  887. package/src/tour/tour-labels.ts +0 -23
  888. package/src/tour/tour-overlay.tsx +0 -1170
  889. package/src/tour/tour.tsx +0 -750
  890. package/src/tour/use-tour-progress.ts +0 -671
  891. package/src/tour/use-tour-url-sync.ts +0 -266
  892. package/src/tour.ts +0 -21
  893. package/src/vite-env.d.ts +0 -23
  894. package/src/wizard/stepper-nav.tsx +0 -360
  895. package/src/wizard/types.ts +0 -275
  896. package/src/wizard/use-wizard.ts +0 -560
  897. package/src/wizard/validation.ts +0 -39
  898. package/src/wizard/wizard-context.tsx +0 -74
  899. package/src/wizard/wizard-labels.ts +0 -29
  900. package/src/wizard/wizard-step.tsx +0 -76
  901. package/src/wizard/wizard-summary.tsx +0 -84
  902. package/src/wizard.ts +0 -15
@@ -1,207 +0,0 @@
1
- import { useCallback, useEffect, useRef, useState } from "react";
2
- import type { PointerEvent } from "react";
3
-
4
- // ---------- Mobile swipe gesture ----------
5
- //
6
- // Multi-stage half-swipe affordance (feedback #103, extended #9): drag a row
7
- // horizontally to commit an action; how FAR you drag picks which action, so a
8
- // single gesture can walk a chain of increasingly involved outcomes (e.g. on a
9
- // cleared row, a short left-swipe un-clears it, further un-accepts it, further
10
- // still deletes it). We track via Pointer Events, lock the gesture to the X axis
11
- // only after the user has moved more horizontally than vertically, and clamp the
12
- // drag to `maxDrag` so the row can't be pulled across the whole viewport.
13
- //
14
- // Each side is an ordered list of stages sorted by ascending `threshold` (px of
15
- // drag magnitude). On release the LAST stage whose threshold the drag passed is
16
- // committed; while dragging, `armedRightIndex`/`armedLeftIndex` report which
17
- // stage is currently armed so the reveal panel can preview its label/colour.
18
-
19
- export interface SwipeStage {
20
- /** Drag magnitude (px) at which this stage arms. Stages must be sorted ascending. */
21
- threshold: number;
22
- onCommit: () => void;
23
- }
24
-
25
- /** Below this much horizontal travel a gesture is treated as a clumsy click, not
26
- * a swipe: the row still follows the pointer, but the click that follows is NOT
27
- * swallowed. Without it, `swallowClick` was set the instant the axis lock
28
- * resolved to "x" — 8px — so a slightly-draggy click on a control INSIDE a
29
- * swipeable row silently did nothing, which is a poor trade on rows whose
30
- * content is itself interactive (Keksdose feedback #144: budget rows edit their
31
- * assigned amount and their name by clicking them). */
32
- const CLICK_SWALLOW_PX = 24;
33
-
34
- /** How far a drag may travel toward a side that has no actions. Zero — the old
35
- * behaviour — makes the row completely inert in that direction, which reads as
36
- * "this row is not swipeable at all" rather than "there is nothing on this
37
- * side"; that is exactly the report behind Keksdose feedback #144 ("tried, but
38
- * there is nothing swipeable"). A short, resisted travel that snaps back is the
39
- * conventional answer and the one that answers the question the drag asked. */
40
- const EMPTY_SIDE_RUBBER_PX = 28;
41
-
42
- /** Resistance applied past a bound: the row keeps moving, at a fraction of the
43
- * pointer, so the gesture feels answered without ever looking committed. */
44
- function rubberBand(overshoot: number, limit: number): number {
45
- const eased = limit * (1 - Math.exp(-Math.abs(overshoot) / limit));
46
- return Math.sign(overshoot) * eased;
47
- }
48
-
49
- export interface RowSwipeOptions {
50
- enabled: boolean;
51
- // Ordered stages per direction (ascending threshold). A longer drag commits a
52
- // later — usually more involved — stage. An empty/undefined side means that
53
- // direction rubber-bands a little and snaps back, committing nothing.
54
- leftStages?: SwipeStage[];
55
- rightStages?: SwipeStage[];
56
- maxDrag?: number;
57
- }
58
-
59
- export interface RowSwipeReturn {
60
- dx: number;
61
- dragging: boolean;
62
- /** Highest armed stage index for the current drag (-1 when none armed). */
63
- armedRightIndex: number;
64
- armedLeftIndex: number;
65
- handlers: {
66
- onPointerDown: (e: PointerEvent) => void;
67
- onPointerMove: (e: PointerEvent) => void;
68
- onPointerUp: (e: PointerEvent) => void;
69
- onPointerCancel: (e: PointerEvent) => void;
70
- };
71
- consumeClick: () => boolean;
72
- }
73
-
74
- /** The highest index whose threshold the magnitude has reached (-1 if none).
75
- * Stages are ascending, so we can stop at the first one not yet reached. */
76
- function lastArmed(stages: SwipeStage[] | undefined, magnitude: number): number {
77
- if (!stages) return -1;
78
- let idx = -1;
79
- for (let i = 0; i < stages.length; i++) {
80
- if (magnitude >= stages[i].threshold) idx = i;
81
- else break;
82
- }
83
- return idx;
84
- }
85
-
86
- export function useRowSwipe({ enabled, leftStages, rightStages, maxDrag = 252 }: RowSwipeOptions): RowSwipeReturn {
87
- const [dx, setDx] = useState(0);
88
- const [dragging, setDragging] = useState(false);
89
- const startX = useRef(0);
90
- const startY = useRef(0);
91
- const axis = useRef<"none" | "x" | "y">("none");
92
- const pointerId = useRef<number | null>(null);
93
- const dxRef = useRef(0);
94
- // True after the user has dragged horizontally far enough that the following
95
- // synthetic click should be swallowed (so a swipe doesn't also expand the row).
96
- const swallowClick = useRef(false);
97
-
98
- // Keep the latest stage arrays in refs so the memoised pointer handlers always
99
- // commit against the current plan rather than a stale closure — the arrays and
100
- // their onCommit closures are rebuilt on every render. Written in an effect (not
101
- // during render) so it satisfies react-hooks/refs; pointer events fire after the
102
- // commit, so the refs are always current by the time a gesture reads them.
103
- const leftRef = useRef(leftStages);
104
- const rightRef = useRef(rightStages);
105
- useEffect(() => {
106
- leftRef.current = leftStages;
107
- rightRef.current = rightStages;
108
- });
109
-
110
- const reset = useCallback(() => {
111
- setDx(0);
112
- dxRef.current = 0;
113
- setDragging(false);
114
- startX.current = 0;
115
- startY.current = 0;
116
- axis.current = "none";
117
- pointerId.current = null;
118
- }, []);
119
-
120
- const onPointerDown = useCallback(
121
- (e: PointerEvent) => {
122
- if (!enabled) return;
123
- if (e.pointerType === "mouse" && e.button !== 0) return;
124
- pointerId.current = e.pointerId;
125
- startX.current = e.clientX;
126
- startY.current = e.clientY;
127
- axis.current = "none";
128
- swallowClick.current = false;
129
- setDragging(true);
130
- },
131
- [enabled],
132
- );
133
-
134
- const onPointerMove = useCallback(
135
- (e: PointerEvent) => {
136
- if (pointerId.current !== e.pointerId) return;
137
- const rawDx = e.clientX - startX.current;
138
- const rawDy = e.clientY - startY.current;
139
- if (axis.current === "none") {
140
- if (Math.abs(rawDx) < 8 && Math.abs(rawDy) < 8) return;
141
- axis.current = Math.abs(rawDx) > Math.abs(rawDy) ? "x" : "y";
142
- if (axis.current === "x") {
143
- (e.currentTarget as Element).setPointerCapture?.(e.pointerId);
144
- } else {
145
- // Vertical scroll wins — bail out of the gesture entirely.
146
- reset();
147
- return;
148
- }
149
- }
150
- if (axis.current !== "x") return;
151
- if (Math.abs(rawDx) >= CLICK_SWALLOW_PX) swallowClick.current = true;
152
- // Toward a side that HAS actions the row tracks the pointer up to maxDrag.
153
- // Toward an empty one it rubber-bands a little and snaps back on release —
154
- // inert would be indistinguishable from "not swipeable".
155
- const hasLeft = (leftRef.current?.length ?? 0) > 0;
156
- const hasRight = (rightRef.current?.length ?? 0) > 0;
157
- let next: number;
158
- if (rawDx > 0) {
159
- next = hasRight ? Math.min(maxDrag, rawDx) : rubberBand(rawDx, EMPTY_SIDE_RUBBER_PX);
160
- } else if (rawDx < 0) {
161
- next = hasLeft ? Math.max(-maxDrag, rawDx) : rubberBand(rawDx, EMPTY_SIDE_RUBBER_PX);
162
- } else {
163
- next = 0;
164
- }
165
- dxRef.current = next;
166
- setDx(next);
167
- },
168
- [maxDrag, reset],
169
- );
170
-
171
- const onPointerUp = useCallback(
172
- (e: PointerEvent) => {
173
- if (pointerId.current !== e.pointerId) return;
174
- const finalDx = dxRef.current;
175
- const wasDragX = axis.current === "x";
176
- reset();
177
- if (!wasDragX) return;
178
- if (finalDx > 0) {
179
- const i = lastArmed(rightRef.current, finalDx);
180
- if (i >= 0) rightRef.current![i].onCommit();
181
- } else if (finalDx < 0) {
182
- const i = lastArmed(leftRef.current, -finalDx);
183
- if (i >= 0) leftRef.current![i].onCommit();
184
- }
185
- },
186
- [reset],
187
- );
188
-
189
- const onPointerCancel = useCallback(() => reset(), [reset]);
190
-
191
- const consumeClick = useCallback(() => {
192
- if (swallowClick.current) {
193
- swallowClick.current = false;
194
- return true;
195
- }
196
- return false;
197
- }, []);
198
-
199
- return {
200
- dx,
201
- dragging,
202
- armedRightIndex: lastArmed(rightStages, dx > 0 ? dx : 0),
203
- armedLeftIndex: lastArmed(leftStages, dx < 0 ? -dx : 0),
204
- handlers: { onPointerDown, onPointerMove, onPointerUp, onPointerCancel },
205
- consumeClick,
206
- };
207
- }
@@ -1,434 +0,0 @@
1
- import { createContext, useContext, useMemo, type Context } from "react";
2
- import * as ReactRouter from "react-router";
3
- import { useLocation, useNavigate, useSearchParams, type Location, type NavigateFunction } from "react-router";
4
-
5
- type Updater<T> = T | ((prev: T) => T);
6
-
7
- export interface SearchParamStateOptions<T> {
8
- /**
9
- * The value of a param that IS present. Return `undefined` (or throw) for a value
10
- * that does not parse — a hand-edited or stale link — and the default is used.
11
- * Default: the raw string.
12
- */
13
- parse?: (raw: string) => T | undefined;
14
- /**
15
- * The param for a value, or `null` to remove it. Default: `String(value)`, and
16
- * `null` for `null` / `undefined`. A value that serialises the same as the default
17
- * removes the param too, so the default is always the clean URL.
18
- */
19
- serialize?: (value: T) => string | null;
20
- /** Shorthand for `history: "replace"`. */
21
- replace?: boolean;
22
- /**
23
- * What a change does to the browser history:
24
- * - `"push"` (default): a new entry, so Back undoes the change.
25
- * - `"replace"`: the current entry is rewritten — a tab, a sort, a view toggle,
26
- * which are not steps anyone wants Back to walk through.
27
- * - `"replace-on-clear"`: push when a value is set, replace when it is cleared (the
28
- * "open a form, close it" pattern).
29
- *
30
- * Several writes in one tick (one handler) add at most ONE entry — see
31
- * {@link useSearchParamState}.
32
- */
33
- history?: "push" | "replace" | "replace-on-clear";
34
- }
35
-
36
- const defaultSerialize = (value: unknown): string | null =>
37
- value === null || value === undefined ? null : String(value);
38
-
39
- /** The route state of the current entry, carried over a `replace` so a query rewrite
40
- * does not drop what a navigation put there (a dialog's opener mark, below). */
41
- function carriedState(state: unknown): Record<string, unknown> | undefined {
42
- return state && typeof state === "object" ? (state as Record<string, unknown>) : undefined;
43
- }
44
-
45
- /* ── One param: read and write ───────────────────────────────────────────── */
46
-
47
- /** One param's rules — the single hook's arguments, or one field of the multi-key hook. */
48
- interface ParamRule<T> {
49
- key: string;
50
- defaultValue: T;
51
- parse?: (raw: string) => T | undefined;
52
- serialize: (value: T) => string | null;
53
- history: "push" | "replace" | "replace-on-clear";
54
- }
55
-
56
- function paramRule<T>(key: string, defaultValue: T, options: SearchParamStateOptions<T>): ParamRule<T> {
57
- return {
58
- key,
59
- defaultValue,
60
- parse: options.parse,
61
- serialize: options.serialize ?? (defaultSerialize as (value: T) => string | null),
62
- history: options.history ?? (options.replace ? "replace" : "push"),
63
- };
64
- }
65
-
66
- /** An absent or unparseable param reads as the default. */
67
- function readParam<T>(params: URLSearchParams, rule: ParamRule<T>): T {
68
- const raw = params.get(rule.key);
69
- if (raw === null) return rule.defaultValue;
70
- if (!rule.parse) return raw as unknown as T;
71
- try {
72
- const parsed = rule.parse(raw);
73
- return parsed === undefined ? rule.defaultValue : parsed;
74
- } catch {
75
- return rule.defaultValue;
76
- }
77
- }
78
-
79
- /**
80
- * Writes `value` into `params` — the default removes the param. Returns `null` when
81
- * the param already says that (a write that changes nothing has no say in the history),
82
- * otherwise whether this change asks for an entry of its own.
83
- */
84
- function putParam<T>(params: URLSearchParams, rule: ParamRule<T>, value: T): boolean | null {
85
- const serialized = rule.serialize(value);
86
- const next = serialized === rule.serialize(rule.defaultValue) ? null : serialized;
87
- const current = params.getAll(rule.key);
88
- if (next === null ? current.length === 0 : current.length === 1 && current[0] === next) return null;
89
- if (next === null) params.delete(rule.key);
90
- else params.set(rule.key, next);
91
- return rule.history === "push" || (rule.history === "replace-on-clear" && next !== null);
92
- }
93
-
94
- /* ── Writes that compose ─────────────────────────────────────────────────── */
95
-
96
- /**
97
- * The query as the writes made against ONE rendered location leave it — shared by every
98
- * hook on that router, so a write builds on the one before it instead of on the render.
99
- *
100
- * Why this exists (keksdose live #378): react-router's `setSearchParams(updater)` hands
101
- * its updater `new URLSearchParams(searchParams)` — the params of the RENDER the setter
102
- * came from, in react-router 7 and 8 alike — not the previous call's result. keksdose
103
- * wired TranslationReviewPanel's `onFilterChange` to four of these setters (status,
104
- * source, ns, q); each started from the rendered URL, so the last wrote the old values
105
- * of the other three back and no filter select had any effect.
106
- *
107
- * Keyed by react-router's location object, which is one object per committed location
108
- * per router: every hook under a router reads the same one, a second router (another
109
- * test) has its own, and when react-router renders the next location this record is
110
- * unreachable — nothing queued outlives the navigation it belongs to. Until then a
111
- * later write builds on it even a tick on (a transition or a data router's loaders still
112
- * pending), which is what keeps two quick clicks from clobbering each other either. The
113
- * one cost: a navigation a data router's blocker stops leaves its writes here, and the
114
- * page's next write carries them again — the blocker asks again.
115
- */
116
- interface QueuedQuery {
117
- /** The query with every write against this location so far. */
118
- params: URLSearchParams;
119
- /** The route state of the entry those writes now sit on, carried over a replace. */
120
- state: unknown;
121
- /** A write in the current tick pushed; the tick's later writes rewrite that entry. */
122
- pushedThisTick: boolean;
123
- /** The last navigation sent was a push. */
124
- lastPushed: boolean;
125
- }
126
-
127
- const queuedByLocation = new WeakMap<Location, QueuedQuery>();
128
-
129
- /**
130
- * The data router's own state, read for ONE question: is a navigation still loading?
131
- * A data router whose loaders run commits a navigation only when they finish, and a
132
- * second `navigate` before then cancels the first — so a push followed by a replace
133
- * in the same tick would land as a replace alone. `UNSAFE_DataRouterContext` is in
134
- * react-router 6.4 through 8; read off the namespace with a stand-in, a release
135
- * without it costs only that refinement, not the import.
136
- */
137
- type DataRouterProbe = { router?: { state?: { navigation?: { state?: string } } } } | null;
138
- const NO_DATA_ROUTER = createContext<DataRouterProbe>(null);
139
- const DataRouterContext: Context<DataRouterProbe> = readDataRouterContext();
140
-
141
- /**
142
- * A static member read (so a bundler still tree-shakes the namespace), inside a `try`:
143
- * a test's `vi.mock("react-router", () => ({ … }))` without the original module throws
144
- * on ANY export it does not define, and it threw here at import (keksdose, 0.25.0) —
145
- * the hook then runs without the refinement, as on a router without the context.
146
- */
147
- function readDataRouterContext(): Context<DataRouterProbe> {
148
- try {
149
- return (
150
- (ReactRouter as unknown as { UNSAFE_DataRouterContext?: Context<DataRouterProbe> }).UNSAFE_DataRouterContext ??
151
- NO_DATA_ROUTER
152
- );
153
- } catch {
154
- return NO_DATA_ROUTER;
155
- }
156
- }
157
-
158
- /**
159
- * One write: `change` edits the queued query in place and says whether a param it
160
- * changed asks for its own entry. The navigation goes out at once — a lone write
161
- * behaves exactly as before, and a test can assert right after `act` — carrying the
162
- * whole queued query, so it includes every write before it.
163
- *
164
- * History, per tick (the writes one handler makes before a microtask runs):
165
- * - the FIRST write that asks to push pushes; every later write in the tick REPLACES
166
- * that entry, so a handler that sets four params adds one entry, and Back undoes
167
- * all four at once — they were one change;
168
- * - a write that asks to replace, before any push, rewrites the entry it found;
169
- * - so mixed modes combine as "push if any write asked to push", which keeps both
170
- * promises: a push-mode param's change is undone by Back, and a replace-mode param
171
- * never adds an entry of its own (it rides on the one the push made). A replace
172
- * write ahead of a push stays on the entry it rewrote, as it would one tick apart.
173
- * - a write that changes nothing has no say, and sends nothing.
174
- */
175
- function writeQuery(
176
- location: Location,
177
- navigate: NavigateFunction,
178
- dataRouter: DataRouterProbe,
179
- change: (params: URLSearchParams) => boolean,
180
- ): void {
181
- let queued = queuedByLocation.get(location);
182
- if (!queued) {
183
- queued = {
184
- params: new URLSearchParams(location.search),
185
- state: location.state,
186
- pushedThisTick: false,
187
- lastPushed: false,
188
- };
189
- queuedByLocation.set(location, queued);
190
- }
191
- const before = queued.params.toString();
192
- const wantsPush = change(queued.params);
193
- const search = queued.params.toString();
194
- if (search === before) return;
195
-
196
- // A data router still loading our push has not written it to the history yet: a
197
- // replace now would cancel it. Push again — the new navigation takes its place.
198
- const loading = (dataRouter?.router?.state?.navigation?.state ?? "idle") !== "idle";
199
- const push = (queued.lastPushed && loading) || (wantsPush && !queued.pushedThisTick);
200
- if (push) {
201
- queued.state = null;
202
- if (!queued.pushedThisTick) {
203
- queued.pushedThisTick = true;
204
- const record = queued;
205
- queueMicrotask(() => {
206
- record.pushedThisTick = false;
207
- });
208
- }
209
- }
210
- queued.lastPushed = push;
211
- // The hash is spelled out: `navigate("?…")` drops it (keksdose dev#495; build review
212
- // 0.43, keksdose N2 — the tours page's filters).
213
- void navigate(
214
- { search: `?${search}`, hash: location.hash },
215
- push ? undefined : { replace: true, state: carriedState(queued.state) },
216
- );
217
- }
218
-
219
- /** The rendered query, and a write that composes with every other one on the router. */
220
- function useQueryWriter(): [URLSearchParams, (change: (params: URLSearchParams) => boolean) => void] {
221
- const location = useLocation();
222
- const navigate = useNavigate();
223
- const dataRouter = useContext(DataRouterContext);
224
- const params = useMemo(() => new URLSearchParams(location.search), [location.search]);
225
- return [params, (change) => writeQuery(location, navigate, dataRouter, change)];
226
- }
227
-
228
- /* ── The hooks ───────────────────────────────────────────────────────────── */
229
-
230
- /**
231
- * One URL search param as React state: `const [view, setView] = useSearchParamState("view", "list")`.
232
- *
233
- * Replaces the hand-rolled `setParams((prev) => { const p = new URLSearchParams(prev);
234
- * …set/delete…; return p })` blocks that keksdose had in a dozen pages and kastlan ported
235
- * as its own copy of this hook (shared/hooks/use-search-param-state.ts, both apps). The
236
- * kit's version takes the DEFAULT as an argument rather than inside `parse`, so the
237
- * two rules that follow from it cannot be forgotten at a call site:
238
- *
239
- * * an absent or unparseable param reads as the default, and
240
- * * setting the default removes the param — the default view is the clean URL.
241
- *
242
- * Every other param in the query string is left as it is.
243
- *
244
- * **Setters compose** (0.25, keksdose live #378): setters called in a row — of one hook,
245
- * or of several hooks under the same router — each build on the write before them, so
246
- * `setStatus("open"); setNs("legal")` in one handler leaves both in the URL. react-
247
- * router's own `setSearchParams(updater)` does not: it hands every updater the params of
248
- * the render, so the last call used to write the others' old values back. The tick's
249
- * writes add at most one history entry; see `history`. When the params belong
250
- * together, {@link useSearchParamsState} writes them with one setter. A functional
251
- * update receives the value as the writes before it left it.
252
- *
253
- * Requires a react-router Router.
254
- */
255
- export function useSearchParamState<T = string>(
256
- key: string,
257
- defaultValue: T,
258
- options: SearchParamStateOptions<T> = {},
259
- ): [T, (next: Updater<T>) => void] {
260
- const [params, write] = useQueryWriter();
261
- const rule = paramRule(key, defaultValue, options);
262
- const value = readParam(params, rule);
263
-
264
- const setValue = (next: Updater<T>) =>
265
- write((query) => {
266
- // Resolved against the queued query, not the render: a second update in the same
267
- // handler sees the first one's result, as React's own functional updates do.
268
- const resolved = typeof next === "function" ? (next as (prev: T) => T)(readParam(query, rule)) : next;
269
- return putParam(query, rule, resolved) === true;
270
- });
271
-
272
- return [value, setValue];
273
- }
274
-
275
- /** One field of {@link useSearchParamsState}: its default, and the single hook's options. */
276
- export interface SearchParamField<T> extends SearchParamStateOptions<T> {
277
- /** The value when the param is absent or does not parse; writing it removes the param. */
278
- default: T;
279
- /** The param's name in the URL. Default: the field's name (`namespace: { param: "ns" }`). */
280
- param?: string;
281
- }
282
-
283
- /** The fields of {@link useSearchParamsState}, one per key of the value object. */
284
- export type SearchParamFields<V> = { [K in keyof V]: SearchParamField<V[K]> };
285
-
286
- /** A partial value (fields left out — or `undefined` — stay as they are), or a function
287
- * of the current value returning one. */
288
- export type SearchParamsUpdate<V> = Partial<V> | ((prev: V) => Partial<V>);
289
-
290
- /**
291
- * Several URL search params as ONE state object, with one setter that writes them in
292
- * one navigation:
293
- *
294
- * const [filter, setFilter] = useSearchParamsState({
295
- * status: { default: "all" as ReviewStatus | "all", parse: toStatus },
296
- * namespace: { param: "ns", default: "all" },
297
- * query: { param: "q", default: "", history: "replace" },
298
- * });
299
- * <TranslationReviewPanel filter={filter} onFilterChange={setFilter} />
300
- *
301
- * keksdose live #378: a filter bar reports all its filters on every change, and four
302
- * single-param setters in a row clobbered each other (see {@link useSearchParamState},
303
- * whose setters now compose too). This is the shape that never could: one setter, one
304
- * write, every field's rules in one place.
305
- *
306
- * Each field takes what the single hook takes — `parse`, `serialize`, `history` /
307
- * `replace` — and its `default` (the clean URL, as there) and optional `param` name.
308
- * The setter takes a partial object or a function of the current one; fields it leaves
309
- * out, or sets to `undefined`, stay as they are, and keys that are not fields are
310
- * ignored, so a component's whole filter object can be handed over as it is. Its
311
- * history is the single hook's rule over the fields that change: one entry, pushed if
312
- * any of them asks to push, else the current entry rewritten. Setting what the URL
313
- * already says navigates nowhere.
314
- *
315
- * The value object keeps its identity while its params do not change, so it can sit in
316
- * a dependency array. Requires a react-router Router.
317
- */
318
- export function useSearchParamsState<V extends object>(
319
- fields: SearchParamFields<V>,
320
- ): [V, (next: SearchParamsUpdate<V>) => void] {
321
- const [params, write] = useQueryWriter();
322
- const rules = (Object.keys(fields) as Array<keyof V & string>).map((name) => {
323
- const field = fields[name];
324
- return [name, paramRule(field.param ?? name, field.default, field)] as const;
325
- });
326
- const readAll = (query: URLSearchParams): V =>
327
- Object.fromEntries(rules.map(([name, rule]) => [name, readParam(query, rule)])) as V;
328
-
329
- // The fields' own params, not the whole query: another param changing (a tab, a
330
- // dialog) leaves this object as it was. `fields` is a fresh literal every render;
331
- // what it reads is the same while the params and the field names are.
332
- const ownParams = JSON.stringify(rules.map(([name, rule]) => [name, params.getAll(rule.key)]));
333
- // eslint-disable-next-line react-hooks/exhaustive-deps -- keyed on what the value is read from; see above
334
- const values = useMemo(() => readAll(params), [ownParams]);
335
-
336
- const setValues = (next: SearchParamsUpdate<V>) =>
337
- write((query) => {
338
- const patch = typeof next === "function" ? next(readAll(query)) : next;
339
- let push = false;
340
- for (const [name, rule] of rules) {
341
- const value = patch[name];
342
- if (value === undefined) continue;
343
- if (putParam(query, rule as ParamRule<unknown>, value) === true) push = true;
344
- }
345
- return push;
346
- });
347
-
348
- return [values, setValues];
349
- }
350
-
351
- /**
352
- * The active tab in `?tab=` (or `key`), with the default tab as the clean URL, for the
353
- * kit's `Tabs`:
354
- *
355
- * const [tab, setTab] = useTabParam("overview", { tabs: ["overview", "history"] });
356
- * <Tabs tabs={…} active={tab} onChange={setTab} />
357
- *
358
- * Switching tabs REPLACES the history entry — a tab is a view of this page, not a
359
- * place Back should step through. `tabs`, when given, turns a param naming no tab (a
360
- * renamed tab, an old link) into the default rather than into a blank panel.
361
- * kastlan's use-tab-param.ts, with the validation it did not have.
362
- */
363
- export function useTabParam<T extends string>(
364
- defaultTab: T,
365
- options: { key?: string; tabs?: readonly T[] } = {},
366
- ): [T, (tab: T) => void] {
367
- const { key = "tab", tabs } = options;
368
- return useSearchParamState<T>(key, defaultTab, {
369
- parse: (raw) => (!tabs || (tabs as readonly string[]).includes(raw) ? (raw as T) : undefined),
370
- history: "replace",
371
- });
372
- }
373
-
374
- /** Where a dialog's open state lives: a param's presence (`"edit"` → `?edit=1`), or one
375
- * value of a shared param (`{ key: "dialog", value: "create-lease" }`). */
376
- export type DialogParam = string | { key: string; value: string };
377
-
378
- /** The route-state mark an opener leaves on the entry it pushes, so the close knows it
379
- * may go BACK over it rather than add a second entry. */
380
- const OPENED_BY_KIT = "__uiKitDialogParam";
381
-
382
- /**
383
- * A dialog's open state in the URL, for `Modal`'s `urlParam` and anything else that
384
- * opens one: `const [open, setOpen] = useDialogParam({ key: "dialog", value: "create" })`.
385
- *
386
- * * **Opening pushes** an entry, so the platform Back gesture closes the dialog — by
387
- * leaving the entry — and Forward opens it again, like any other step.
388
- * * **Closing goes back** over that entry when this hook pushed it, so a closed dialog
389
- * leaves no dead entry behind. A dialog that arrived OPEN (a deep link, a reload, a
390
- * plain `<Link>` to it) has nothing of ours to go back over, and its close removes the
391
- * param in place instead — Back from there leaves the page, as it should.
392
- *
393
- * That is why it is not `useSearchParamState`: going back is the only close that
394
- * leaves the history as it was before the dialog, and only the opener knows whether it
395
- * may.
396
- */
397
- export function useDialogParam(param: DialogParam): [boolean, (open: boolean) => void] {
398
- const { key, value } = typeof param === "string" ? { key: param, value: "1" } : param;
399
- const [params, setParams] = useSearchParams();
400
- const location = useLocation();
401
- const navigate = useNavigate();
402
- const open = typeof param === "string" ? params.has(key) : params.get(key) === value;
403
- const mark = `${key}=${value}`;
404
-
405
- const setOpen = (next: boolean) => {
406
- if (next === open) return;
407
- const state = carriedState(location.state);
408
- if (next) {
409
- setParams(
410
- (prev) => {
411
- const p = new URLSearchParams(prev);
412
- p.set(key, value);
413
- return p;
414
- },
415
- { state: { ...state, [OPENED_BY_KIT]: mark } },
416
- );
417
- return;
418
- }
419
- if (state?.[OPENED_BY_KIT] === mark) {
420
- void navigate(-1);
421
- return;
422
- }
423
- setParams(
424
- (prev) => {
425
- const p = new URLSearchParams(prev);
426
- p.delete(key);
427
- return p;
428
- },
429
- { replace: true, state },
430
- );
431
- };
432
-
433
- return [open, setOpen];
434
- }