@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,693 +0,0 @@
1
- import { useLayoutEffect, useMemo, useRef } from "react";
2
- import { ChevronLeft, ChevronRight, Plus, X } from "lucide-react";
3
- import type { ComponentPropsWithoutRef, KeyboardEvent, ReactNode, Ref } from "react";
4
- import { cn } from "../lib/cn";
5
- import { FOCUS_RING } from "./focus-ring";
6
- import { scrollIntoStrip, useStripFade } from "../lib/strip-fade";
7
- import { horizontalStep } from "../lib/direction";
8
- import { usePhoneLayout } from "../hooks/use-breakpoint";
9
- import { prefersReducedMotion } from "../lib/reduced-motion";
10
- import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
11
- import { mergeRefs } from "./field-parts";
12
- import { DEFAULT_TABS_LABELS } from "./tabs-labels";
13
- import { IconButton } from "./icon-button";
14
- import { HIT_AREA_LARGE } from "./button-look";
15
-
16
- /** One tab of a {@link Tabs} strip. */
17
- export interface TabItem<T extends string> {
18
- id: T;
19
- /** A ReactNode so a tab can pair an icon with text. */
20
- label: ReactNode;
21
- /** Optional trailing node (e.g. a count pill). */
22
- badge?: ReactNode;
23
- /** Marks a tab that IS a route — see {@link TabsProps}. */
24
- href?: string;
25
- /** Leading decoration: an icon, or the colour swatches of the lines this tab
26
- * draws in a chart above the strip. Hidden from assistive tech — it repeats
27
- * what the label says, or it says something the label must say instead. */
28
- icon?: ReactNode;
29
- /** A second, smaller line under the label — the one fact that tells two tabs
30
- * with similar labels apart ("80 km/h", "Level 3"). Part of the tab's name. */
31
- detail?: ReactNode;
32
- /** A tab that exists as a slot with nothing in it yet, drawn with a dashed
33
- * outline so a gap in a sequence looks like a gap. Visual only: say "empty" in
34
- * the label or `detail` if a screen reader needs to know. */
35
- empty?: boolean;
36
- /** `false` keeps this one tab when the strip has `onRemove` — the one sheet a
37
- * workbook cannot be without. Default: removable. */
38
- removable?: boolean;
39
- /** Plain-text name for the labels the strip composes about this tab ("Remove
40
- * …"), for when `label` is not a string. Default: `label` if it is a string,
41
- * else the id. */
42
- name?: string;
43
- }
44
-
45
- /** The strings the strip renders on its own behalf — only when it can add or
46
- * remove tabs. */
47
- export interface TabsLabels {
48
- /** The "add" button's visible text when the caller gives no `addLabel`. */
49
- add: string;
50
- /** Accessible name of a tab's × — "Remove <tab>". */
51
- remove: (tab: string) => string;
52
- /** The `overflowCue` › after the strip's end, while tabs lie past it: "More tabs". */
53
- more: string;
54
- /** The `overflowCue` ‹ before the strip's start, while tabs lie before it: "Previous tabs". */
55
- previous: string;
56
- }
57
-
58
- // Defined in ./tabs-labels, which holds no component code (0.34, KS U8).
59
- export { DEFAULT_TABS_LABELS };
60
-
61
- /**
62
- * The strip's own props sit on a `<div>`: the tablist IS the root element, so anything
63
- * a caller hangs on it — a `data-tour` anchor for the kit's guided tour, a test id, an
64
- * `aria-describedby` — lands there. `onChange` is omitted from the div's props because
65
- * this component's `onChange` hands over the chosen TAB ID, not a DOM event, and
66
- * `children` because the strip renders `tabs` — a caller who wants a PANEL wires it up
67
- * through `panelId`, which is the whole point of that prop.
68
- */
69
- export interface TabsProps<T extends string> extends Omit<ComponentPropsWithoutRef<"div">, "onChange" | "children"> {
70
- /** `label` is a ReactNode so tabs can pair an icon with text; `badge` is an
71
- * optional trailing node (e.g. a count pill). `href` marks a tab that IS a route:
72
- * it renders as an anchor so it can be middle-/⌘-clicked into a new tab (Keksdose
73
- * feedback #451), while a plain click still goes through `onChange` and stays
74
- * client-side. Tabs that only flip local state leave it unset — a link to a URL
75
- * that does not select the tab would be worse than no link. */
76
- tabs: TabItem<T>[];
77
- active: T;
78
- onChange: (id: T) => void;
79
- className?: string;
80
- /**
81
- * Carets at the ends of a SCROLLING strip (0.40, kk run 79 gap 1; 0.47, keksdose
82
- * live #410 round 4): a › after the strip's end while tabs lie past it, and a ‹ before
83
- * its start while tabs lie before it — each there only while something is hidden
84
- * past ITS edge (1 px slack, so a few cut-off pixels count), each a step of three
85
- * quarters of the strip's width toward its own side. Neither ever changes direction:
86
- * until 0.46 one caret turned round into "back to the first" at the end, and read as
87
- * an arrow pointing the wrong way. Start and end follow the reading direction.
88
- *
89
- * The edge fade alone could read as the end of the row: the last visible tab can
90
- * finish exactly where the fade begins, so nothing looks cut off (keksdose live #410).
91
- * Since 0.48 (live #410 rounds 5–6) the carets are bare glyphs BESIDE the strip — the ‹
92
- * before it, the › after it — centred on the labels, muted and primary on hover, with
93
- * no frame, fill or shadow; until 0.47 they were framed buttons laid over the strip's
94
- * last visible tabs. While the strip overflows at all it keeps a 24px gutter at both
95
- * ends, and each caret sits in its own, so scrolling never changes the strip's width
96
- * or moves its labels; a strip that fits has no gutters. Out of the tab order —
97
- * the keyboard walks the strip with the arrow keys, which bring the focused tab into
98
- * view. At every width. Ignored on a vertical strip (a side nav is a column, not a
99
- * row). Names: `tabs.more` / `tabs.previous`. keksdose's `scroll-edge-cues.tsx` is
100
- * the reference this replaces.
101
- */
102
- overflowCue?: boolean;
103
- /**
104
- * `id` of the element the caller renders the open tab's content into — the missing
105
- * half of `role="tab"`. A tab that controls nothing is a tab in name only: a screen
106
- * reader announces "tab, 2 of 5" and then has no way to take the user to what it
107
- * opened, and no way back.
108
- *
109
- * **This component does not render the panel, on purpose.** `Tabs` is the STRIP; the
110
- * content lives wherever the caller put it — three Keksdose pages render it in a
111
- * sibling `<Card>`, one renders it through a router outlet, and a tab can BE a route
112
- * (`href`), in which case the panel is a whole page this component never sees.
113
- * Wrapping `children` here would mean either moving that content into the strip's
114
- * subtree — a layout change on every page that uses tabs — or shipping a wrapper
115
- * that only some callers could use. So the two halves are joined by an id instead.
116
- *
117
- * Wire the other end yourself:
118
- *
119
- * ```tsx
120
- * <Tabs tabs={tabs} active={active} onChange={setActive} panelId="report-panel" />
121
- * <div id="report-panel" role="tabpanel" aria-labelledby="report-panel-tab" tabIndex={-1}>
122
- * ```
123
- *
124
- * `aria-controls` goes on the OPEN tab only, and `${panelId}-tab` is its id — the
125
- * closed tabs' panels are not in the document, and a dangling `aria-controls`
126
- * describes a tab as opening something that is not there.
127
- */
128
- panelId?: string;
129
- /**
130
- * Makes the tabs removable: an × on the OPEN tab, and Delete on a focused tab
131
- * (only on the open one with `removeOn="active"`).
132
- *
133
- * The × is on the open tab only — a row of tabs each carrying one is a row of
134
- * things to hit by accident, and the tab you can remove should be the one you
135
- * are looking at — but its room is reserved on every removable tab, so opening a
136
- * tab never widens it and never pushes the rest of the strip along (lenkbank
137
- * feedback #72). It is not a tab stop of its own: the strip stays one stop, and the
138
- * keyboard path is Delete (announced through `aria-keyshortcuts`), which removes
139
- * whichever tab has focus (see `removeOn`).
140
- *
141
- * Assistive tech meets the remove as a "Remove <tab>" button right AFTER the strip,
142
- * not as the × (0.34): a tablist may own tabs only, so the drawn × is the pointer's
143
- * and `aria-hidden`, and the named button beside the tablist is visually hidden.
144
- *
145
- * The strip only ASKS: it calls this, and the tab goes when the caller drops it
146
- * from `tabs` — after a confirmation, a request, whatever it needs. When it does,
147
- * focus that was on the removed tab (or its ×) moves to the open tab if the
148
- * removed one was open, else to its neighbour, instead of falling to the page.
149
- */
150
- onRemove?: (id: T) => void;
151
- /**
152
- * Which tabs the Delete key removes.
153
- *
154
- * - `"every"` (default): any focused removable tab — the ARIA pattern's reading.
155
- * - `"active"`: only the OPEN tab, the same one that wears the ×. For a strip whose
156
- * remove is immediate and unconfirmed (lenkbank's sheet tabs delete a measurement
157
- * sheet at once), so arrowing across the strip and pressing Delete cannot take
158
- * out a sheet the user is not looking at. Delete on a closed tab does nothing,
159
- * and only the open tab announces the shortcut (`aria-keyshortcuts`).
160
- *
161
- * Either way the × is drawn on the open tab only and its room stays reserved on
162
- * every removable tab, so the strip never relayouts when the selection moves.
163
- */
164
- removeOn?: "every" | "active";
165
- /** Renders an "add" button after the last tab, outside the tablist — it is an
166
- * action, not a tab, and a tablist may own only tabs. */
167
- onAdd?: () => void;
168
- /** The add button's text. Say what is added — "Add loop", "Add report" says
169
- * more than "Add". Default: `tabs.add` from the {@link UiKitProvider}. */
170
- addLabel?: string;
171
- /** Overrides for this strip's strings. See {@link TabsLabels}. */
172
- labels?: LabelOverride<TabsLabels>;
173
- /** An add or a remove is in flight: the × and the add button are disabled and
174
- * Delete is ignored, so a double click cannot remove two tabs. Nothing moves. */
175
- busy?: boolean;
176
- /**
177
- * `"vertical"`: the same strip as a SIDE NAV — one item per row, the open one
178
- * filled, ↑/↓ walking it (Home/End as before) and `aria-orientation="vertical"` on
179
- * the tablist. For keksdose's admin page and settings page, which each hand-built
180
- * the identical sidebar with none of this strip's keyboard, roving tab stop or
181
- * routed-`href` handling. Everything else — `href` tabs, `badge`, `panelId`,
182
- * `onRemove`, `onAdd` — means exactly what it means on the horizontal strip; the
183
- * badge moves to the row's end.
184
- *
185
- * **On a phone (`usePhoneLayout()`) it becomes the horizontal strip**, rather than
186
- * staying a column. A side nav only works beside its content; on
187
- * a phone it has to go ABOVE it, and eight full-width rows there push the panel
188
- * the user picked below the fold on every visit — the two keksdose pages both
189
- * collapsed theirs into a scrolling row by hand for exactly that reason. The
190
- * orientation is switched in JavaScript, not with `md:` classes, so the
191
- * `aria-orientation` a screen reader hears and the arrow keys that work always
192
- * match the layout on screen. The caller's own two-column layout has to stack at
193
- * the same breakpoint (`md:grid-cols-[14rem_1fr]`).
194
- */
195
- orientation?: "horizontal" | "vertical";
196
- /** The `role="tablist"` strip, where the rest of the props go (0.34, API-2, refactor
197
- * audit 2026-10). Merged with the strip's own ref, which scrolls the open tab into
198
- * view and measures the fade, so neither loses the element. */
199
- ref?: Ref<HTMLDivElement>;
200
- }
201
-
202
- const TABLIST_CLASSES = "flex gap-1 overflow-x-auto overflow-y-hidden border-b border-subtle";
203
- // The side nav. A column of full-width rows with the open one FILLED rather than
204
- // underlined: an underline under one row of a list reads as a separator, not as a
205
- // selection. `--bg-active` is the kit's own selected-row fill (the sidebar's), so the
206
- // admin page's nav and the app's own sidebar mark "you are here" the same way.
207
- const TABLIST_VERTICAL_CLASSES = "flex flex-col gap-0.5";
208
- const TAB_VERTICAL_CLASSES = `flex w-full items-center rounded-md px-3 py-2 text-start text-sm font-medium transition-colors focus:outline-none ${FOCUS_RING}`;
209
- const TAB_VERTICAL_ACTIVE_CLASSES = "bg-active text-primary";
210
- const TAB_VERTICAL_INACTIVE_CLASSES = "text-muted hover:bg-hover hover:text-primary";
211
-
212
- // `max-w-full`: no tab outgrows its strip. A sheet's `detail` line ("Spurstangenkraft
213
- // links · … · 31 Punkte") made one tab 448px wide in a 390px strip, and a tab wider
214
- // than the strip cannot be scrolled into view — its end was simply off screen
215
- // (lenkbank L3). The label and detail truncate inside it instead; see `inner`.
216
- //
217
- // Keyboard focus on a tab, a side-nav row and the add button is the kit's one focus frame
218
- // (text-size §5), in brand. Until 0.51.7 it rang in `ring-strong`: 2.54:1 on the light
219
- // page and 2.76:1 on a card, under WCAG 1.4.11's 3:1 (refactor audit 2026-10-30, DSP-8;
220
- // NavPills made the same move in 0.34, DOC-7). INSET on a tab: the strip scrolls
221
- // (`overflow-x-auto overflow-y-hidden`), so a ring outside the tab is cut off along its
222
- // top and bottom, and at a cut end.
223
- const TAB_CLASSES = `max-w-full whitespace-nowrap px-3 py-2 text-sm font-medium transition-colors border-b-2 -mb-px focus:outline-none ${FOCUS_RING} focus-visible:ring-inset`;
224
- const TAB_ACTIVE_CLASSES = "border-[var(--text-primary)] text-primary";
225
- const TAB_INACTIVE_CLASSES = "border-transparent text-muted hover:text-secondary hover:border-strong";
226
-
227
- // The add/remove chrome. The × reserves its gutter on every removable tab (see
228
- // `onRemove`).
229
- const TAB_REMOVABLE_CLASSES = "pe-8";
230
- const TAB_EMPTY_CLASSES = "-mx-1.5 rounded border border-dashed border-strong px-1.5";
231
- const TAB_ADD_CLASSES = `inline-flex items-center gap-1 whitespace-nowrap rounded-md px-3 py-2 text-sm font-medium text-muted transition-colors hover:text-primary focus:outline-none ${FOCUS_RING} disabled:cursor-not-allowed disabled:opacity-50 [&_svg]:size-4`;
232
- // `relative`: the phone's visually hidden label needs a positioned ancestor (see the
233
- // sr-only rule in CONTRIBUTING); `max-md:px-2` squares the lone "+".
234
- const TAB_ADD_PHONE_CLASSES = "relative max-md:px-2";
235
-
236
- export function Tabs<T extends string>({
237
- tabs,
238
- active,
239
- onChange,
240
- className,
241
- overflowCue = false,
242
- panelId,
243
- onRemove,
244
- removeOn = "every",
245
- onAdd,
246
- addLabel,
247
- labels,
248
- busy = false,
249
- orientation = "horizontal",
250
- "aria-label": ariaLabel,
251
- ref,
252
- ...rest
253
- }: TabsProps<T>) {
254
- const text = useKitLabels("tabs", DEFAULT_TABS_LABELS, labels);
255
- // See `orientation`: a vertical strip is the horizontal one on a phone.
256
- const phone = usePhoneLayout();
257
- const vertical = orientation === "vertical" && !phone;
258
- const stripRef = useRef<HTMLDivElement>(null);
259
- const setStrip = useMemo(() => mergeRefs(stripRef, ref), [ref]);
260
- const fade = useStripFade(stripRef);
261
- // See `overflowCue`: a ‹ before the strip while tabs lie before it, a › after it
262
- // while tabs lie past it — `fade.overflow` names the cut ends in reading-direction terms.
263
- const cue = overflowCue && !vertical;
264
- const cueStart = cue && (fade.overflow === "start" || fade.overflow === "both");
265
- const cueEnd = cue && (fade.overflow === "end" || fade.overflow === "both");
266
- // The cue gutters (see `stripBox`): there only while the strip overflows at all.
267
- const gutters = cue && fade.overflow !== undefined;
268
- // Three quarters of the visible width toward `side`; an RTL strip runs leftward.
269
- const onCue = (side: "start" | "end") => {
270
- const strip = stripRef.current;
271
- if (!strip) return;
272
- const behavior: ScrollBehavior = prefersReducedMotion() ? "auto" : "smooth";
273
- const rtl = getComputedStyle(strip).direction === "rtl";
274
- const toward = (side === "end" ? 1 : -1) * (rtl ? -1 : 1);
275
- strip.scrollBy({ left: toward * Math.round(strip.clientWidth * 0.75), behavior });
276
- };
277
- // In a GUTTER of its own at the strip's end (0.48, keksdose live #410 rounds 5–6): a
278
- // bare glyph — no frame, fill or shadow — muted until the pointer comes. Round 5 put
279
- // each cue in the flow beside the strip, so it took 24px the moment it appeared and the
280
- // labels jumped sideways at every edge the scroll crossed ("It has problems with moving
281
- // to left and right especially when moving the scroll bar"). Now the strip box keeps a
282
- // 24px gutter at BOTH ends for as long as the strip overflows at all (`px-[24px]`, see
283
- // `stripBox`), and each gutter is absolute in that padding, so a cue coming or going
284
- // never moves the strip, its labels or the scroll position under the thumb. A strip
285
- // that fits has no gutters: its width changes only when it starts or stops overflowing.
286
- // The gutter carries the strip's 1px rule on beneath the glyph, and lifts the glyph
287
- // onto the LABELS' centre rather than the box's: a tab's 2px underline (`border-b-2`)
288
- // sits on the rule (`-mb-px`), so the labels are centred 2px above the box's bottom —
289
- // the gutter's 1px rule (`border-b`) plus 1px more (`pb-px`).
290
- // 24px wide at every text size (KS N3): at Large `sm`'s 48px minimum made each cue
291
- // 48px, and at 360px the two left a two-tab strip 100px. 24 PIXELS, not `w-6`: the rem
292
- // grows with the text size (24 / 30 / 36px), and at Extra large on a 360px phone the two
293
- // gutters took 72px of a 226px strip and a sheet tab wrapped to seven lines (0.48 build
294
- // review 2, KS N1). The 48px touch target is an
295
- // invisible hit area round the glyph instead (`HIT_AREA_LARGE`, as `2xs`), over the
296
- // strip's faded edge, not room taken from the row. The wrapper inside the gutter is
297
- // ours because IconButton puts its tooltip's span around the button.
298
- const gutterAt = (side: "start" | "end", shown: boolean) => (
299
- <div
300
- data-tabs-cue-gutter={side}
301
- className={cn(
302
- "absolute inset-y-0 flex w-[24px] items-center justify-center border-b border-subtle pb-px",
303
- side === "start" ? "start-0" : "end-0",
304
- )}
305
- >
306
- {shown && (
307
- <div data-tabs-overflow-cue={side} className="flex">
308
- <IconButton
309
- size="sm"
310
- variant="ghost"
311
- className={cn(
312
- "w-[24px] large:min-w-0 bg-transparent text-muted hover:bg-transparent hover:text-primary",
313
- // Over the strip's faded edge, for ‹ too.
314
- HIT_AREA_LARGE,
315
- "large:after:z-[1]",
316
- )}
317
- tabIndex={-1}
318
- type="button"
319
- label={side === "start" ? text.previous : text.more}
320
- labelVisible={false}
321
- onClick={() => onCue(side)}
322
- >
323
- {side === "start" ? (
324
- <ChevronLeft className="rtl:-scale-x-100" />
325
- ) : (
326
- <ChevronRight className="rtl:-scale-x-100" />
327
- )}
328
- </IconButton>
329
- </div>
330
- )}
331
- </div>
332
- );
333
- // The OPEN tab is scrolled into the strip whenever it changes — on mount too, for a
334
- // deep link to the seventh report. A selection behind the cut edge was the worst
335
- // case of the overflow above: the one tab the panel below belongs to, sliced to
336
- // "80 km," under the add button. Only the strip scrolls (`scrollBy` on it, not
337
- // `scrollIntoView`, which would scroll the page as well), and only as far as needed
338
- // to clear the fade.
339
- //
340
- // And again when the cue gutters appear (refactor audit 2026-10-30, DSP-16). They come a
341
- // render after the strip is first measured as overflowing — on mount, or with the very
342
- // tab that tipped it over — and take 24px off each end, so a tab scrolled clear before
343
- // them ended 24px past the visible end, under the fade and the ›.
344
- useLayoutEffect(() => {
345
- const strip = stripRef.current;
346
- const tab = strip?.querySelector<HTMLElement>('[role="tab"][aria-selected="true"]');
347
- if (strip && tab) scrollIntoStrip(strip, tab);
348
- }, [active, gutters]);
349
- const isRemovable = (tab: TabItem<T>) => onRemove !== undefined && tab.removable !== false;
350
- // Whether Delete reaches this tab: every removable tab, or only the open one.
351
- const deletesOnKey = (tab: TabItem<T>) => isRemovable(tab) && (removeOn === "every" || tab.id === active);
352
- const nameOf = (tab: TabItem<T>) => tab.name ?? (typeof tab.label === "string" ? tab.label : tab.id);
353
- // The strip's one tab stop (see `tabIndex` below): the open tab, or the first while
354
- // `active` names none. "No sheet open" is a real state — KS's sheet strips pass `""` —
355
- // and with the stop on the selection alone every tab was -1, so the keyboard could not
356
- // reach the one control that opens a sheet (refactor audit 2026-10-30, DSP-1).
357
- const stop = tabs.some((t) => t.id === active) ? active : tabs[0]?.id;
358
-
359
- // Where focus goes once a removal the strip asked for has happened. The caller
360
- // owns `tabs` and may take its time (a confirmation, a request), so this waits
361
- // for the id to actually leave the list rather than guessing at the moment.
362
- const pendingFocus = useRef<{ removed: T; wasActive: boolean; neighbour?: T } | null>(null);
363
- const removeRef = useRef<HTMLButtonElement>(null);
364
- const requestRemove = (id: T) => {
365
- const index = tabs.findIndex((t) => t.id === id);
366
- pendingFocus.current = {
367
- removed: id,
368
- wasActive: id === active,
369
- neighbour: (tabs[index + 1] ?? tabs[index - 1])?.id,
370
- };
371
- onRemove?.(id);
372
- };
373
- useLayoutEffect(() => {
374
- const pending = pendingFocus.current;
375
- if (!pending || tabs.some((t) => t.id === pending.removed)) return;
376
- pendingFocus.current = null;
377
- const strip = stripRef.current;
378
- if (!strip) return;
379
- // Only focus that fell out of the strip with the removed tab is ours to place —
380
- // or that sits on the remove button after it, which a pick removed through.
381
- // If the user has moved on — into the panel, into a dialog — leave it there.
382
- const focused = document.activeElement;
383
- if (focused && focused !== document.body && !strip.contains(focused) && focused !== removeRef.current) return;
384
- // The removed tab was open: focus follows the caller's new selection, which is
385
- // also the strip's tab stop. It was not: its neighbour, as the ARIA pattern has it.
386
- // The caller opened nothing in its place (KS drops the sheet and the selection in one
387
- // render): the neighbour too, else the stop — not an index of -1 and the page (DSP-1).
388
- const present = (id: T | undefined) => tabs.some((t) => t.id === id);
389
- const target =
390
- pending.wasActive && present(active) ? active : present(pending.neighbour) ? pending.neighbour : stop;
391
- const index = tabs.findIndex((t) => t.id === target);
392
- strip.querySelectorAll<HTMLElement>('[role="tab"]')[index]?.focus();
393
- }, [tabs, active, stop]);
394
-
395
- // Arrow keys walk the strip in DOM order (ARIA tabs pattern). Home/End jump
396
- // to the ends. Focus only — activation stays on click/Enter/Space, because a tab
397
- // here can be a real route and moving focus must not navigate.
398
- //
399
- // On the TABS, not on the tablist. The container carried it, which left a `<div>`
400
- // wearing an interactive role and a key handler while being unfocusable —
401
- // `jsx-a11y/interactive-supports-focus`, and the only instance of it left in `src/`.
402
- // The fix that rule wants is `tabIndex` on the div; the fix the pattern wants is
403
- // the handler on the elements that are natively focusable and actually receive the
404
- // keystroke. Those are the tabs, so the warning goes away by being right rather
405
- // than by being satisfied.
406
- const onTabKeyDown = (e: KeyboardEvent<HTMLElement>, tab: TabItem<T>) => {
407
- // Delete removes the FOCUSED tab (the ARIA pattern's optional key for deletable
408
- // tabs) — the keyboard's way to the × that is not a tab stop. `busy` swallows it
409
- // rather than letting it fall through to the page. With `removeOn="active"` only
410
- // the open tab answers; a closed one lets the key pass untouched.
411
- if (e.key === "Delete" && deletesOnKey(tab)) {
412
- e.preventDefault();
413
- if (!busy) requestRemove(tab.id);
414
- return;
415
- }
416
- // Along the reading direction: the strip is a flex row, so in RTL the NEXT tab sits
417
- // to the left, and ArrowLeft has to reach it. A vertical strip answers ↑/↓ instead
418
- // — and ONLY those, as the pattern has it: ←/→ are left to the page, where a side
419
- // nav's neighbour (the panel) may well want them.
420
- const step: 1 | -1 | 0 = vertical
421
- ? e.key === "ArrowDown"
422
- ? 1
423
- : e.key === "ArrowUp"
424
- ? -1
425
- : 0
426
- : horizontalStep(e.key, e.currentTarget);
427
- if (step === 0 && e.key !== "Home" && e.key !== "End") return;
428
- const strip = e.currentTarget.closest('[role="tablist"]');
429
- if (!strip) return;
430
- const items = Array.from(strip.querySelectorAll<HTMLElement>('[role="tab"]'));
431
- const from = items.indexOf(e.currentTarget);
432
- if (from === -1) return;
433
- e.preventDefault();
434
- const to = e.key === "Home" ? 0 : e.key === "End" ? items.length - 1 : (from + step + items.length) % items.length;
435
- items[to]?.focus();
436
- };
437
- const tablist = (
438
- <div
439
- // Before the role and the name: a caller's arbitrary attribute is welcome on the
440
- // strip, but a `role` or an `aria-label` arriving through a spread props object
441
- // must not be able to unmake the tablist the tabs below are registered against.
442
- {...rest}
443
- ref={setStrip}
444
- role="tablist"
445
- // Names the GROUP — every tab carries its own text — so a strip under a visible
446
- // heading that already says it can leave it unset.
447
- aria-label={ariaLabel}
448
- // Only when vertical: `horizontal` is the tablist's implicit value, and the
449
- // attribute on every existing strip would be noise in every snapshot of them.
450
- aria-orientation={vertical ? "vertical" : undefined}
451
- // Merged over a caller's own style rather than replacing it; see useStripFade.
452
- // `data-overflow` names the cut ends in reading-direction terms, for a caller's
453
- // own affordance (a scroll button) and for tests, which cannot read the mask.
454
- style={fade.mask ? { ...rest.style, maskImage: fade.mask, WebkitMaskImage: fade.mask } : rest.style}
455
- data-overflow={fade.overflow}
456
- // With an add button the strip gains an outer box, and `className` goes there
457
- // — it is the box a caller's margin or width is meant for.
458
- className={cn(
459
- vertical ? TABLIST_VERTICAL_CLASSES : TABLIST_CLASSES,
460
- cue ? "min-w-0 flex-1" : onAdd ? "min-w-0" : className,
461
- )}
462
- >
463
- {tabs.map((tab) => {
464
- const isActive = tab.id === active;
465
- const removable = isRemovable(tab);
466
- // Written once and worn by either tag below, so a routed tab and a
467
- // state-only tab stay indistinguishable to the eye and to a screen reader.
468
- const shared = {
469
- role: "tab" as const,
470
- "aria-selected": isActive,
471
- // Roving tabindex: the whole strip is ONE stop in the page's tab order, and
472
- // it is the open tab. Ten report tabs otherwise cost ten Tab presses to step
473
- // over on the way to the table below them (live #262's strip is the extreme
474
- // case, but every strip in the app paid it).
475
- //
476
- // The stop follows the SELECTION, not the focus. Arrowing is a look around —
477
- // activation here is manual, because a tab can be a real route — so re-
478
- // pointing the stop at a report the user only arrowed past would hand the
479
- // strip back on the next visit in a state they never chose. The cost is that
480
- // Tab out and back returns to the open tab rather than to the last one
481
- // looked at; the ARIA pattern allows either, and this one needs no second
482
- // piece of state shadowing `active`. With nothing open, the first tab (`stop`).
483
- tabIndex: tab.id === stop ? 0 : -1,
484
- // Only the open tab: see `panelId`.
485
- "aria-controls": isActive ? panelId : undefined,
486
- id: isActive && panelId ? `${panelId}-tab` : undefined,
487
- "aria-keyshortcuts": deletesOnKey(tab) ? "Delete" : undefined,
488
- onKeyDown: (e: KeyboardEvent<HTMLElement>) => onTabKeyDown(e, tab),
489
- className: vertical
490
- ? cn(
491
- TAB_VERTICAL_CLASSES,
492
- isActive ? TAB_VERTICAL_ACTIVE_CLASSES : TAB_VERTICAL_INACTIVE_CLASSES,
493
- removable && "pe-8",
494
- )
495
- : cn(TAB_CLASSES, isActive ? TAB_ACTIVE_CLASSES : TAB_INACTIVE_CLASSES, removable && TAB_REMOVABLE_CLASSES),
496
- };
497
- const inner = (
498
- <span
499
- className={cn(
500
- // In a side nav the row is the full width, so the label takes it and a
501
- // badge lands at the row's end, where a column of counts lines up.
502
- vertical
503
- ? "flex min-w-0 flex-1 items-center gap-1.5"
504
- : "inline-flex max-w-full min-w-0 items-center gap-1.5",
505
- tab.empty && TAB_EMPTY_CLASSES,
506
- )}
507
- >
508
- {tab.icon != null && (
509
- <span aria-hidden className="inline-flex shrink-0 items-center gap-0.5">
510
- {tab.icon}
511
- </span>
512
- )}
513
- {tab.detail != null ? (
514
- // `min-w-0` + `truncate-until-large` on each line: capped by the tab's
515
- // `max-w-full`, a long detail ends in an ellipsis at Normal and wraps from
516
- // Large up (text size §10.17; round 0.34 T1), where the tab grows a line
517
- // rather than cut the words. The whole text stays the tab's name.
518
- <span className="flex min-w-0 flex-col items-start text-start">
519
- <span className="max-w-full truncate-until-large">{tab.label}</span>
520
- {/* A separator for the NAME only — whitespace between flex items is
521
- not drawn, and without it the two lines ran together into one
522
- word for a screen reader ("80 km/hloop 2"). */}{" "}
523
- <span className="max-w-full truncate-until-large text-caption font-normal leading-tight text-muted">
524
- {tab.detail}
525
- </span>
526
- </span>
527
- ) : (
528
- tab.label
529
- )}
530
- {tab.badge != null ? (
531
- vertical ? (
532
- <span className="ms-auto flex shrink-0 items-center">{tab.badge}</span>
533
- ) : (
534
- tab.badge
535
- )
536
- ) : null}
537
- </span>
538
- );
539
- const element = tab.href ? (
540
- <a
541
- key={tab.id}
542
- {...shared}
543
- href={tab.href}
544
- draggable={false}
545
- onClick={(e) => {
546
- // Middle-, ⌘/Ctrl-, Shift- and Alt-click belong to the browser
547
- // (feedback #451); only the plain left click is ours to cancel and
548
- // route through `onChange`, which keeps the switch client-side.
549
- if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
550
- e.preventDefault();
551
- onChange(tab.id);
552
- }}
553
- // A <button> tab activated on Space; an anchor does not, so becoming a
554
- // link (feedback #451) would have quietly cost keyboard users the tab
555
- // strip. Enter is deliberately untouched — it is the anchor's own
556
- // default and already arrives at `onChange` through the click handler
557
- // above, so handling it here too would switch tabs twice. Same three
558
- // lines the mobile row card carries, for the same reason; the rejected
559
- // alternative — keeping a button and faking the middle click with
560
- // window.open — is what the whole item is moving away from.
561
- //
562
- // Composed with the strip's arrow-key walk rather than replacing it: this
563
- // prop overrides the one in `shared`, and an anchor tab that lost the
564
- // arrows would be a strip that is navigable only where it is not a link.
565
- onKeyDown={(e) => {
566
- onTabKeyDown(e, tab);
567
- if (e.defaultPrevented || e.key !== " ") return;
568
- e.preventDefault();
569
- onChange(tab.id);
570
- }}
571
- >
572
- {inner}
573
- </a>
574
- ) : (
575
- <button key={tab.id} {...shared} onClick={() => onChange(tab.id)}>
576
- {inner}
577
- </button>
578
- );
579
- if (!removable) return element;
580
- return (
581
- // The × cannot go INSIDE the tab: a button in a button is invalid HTML, and
582
- // a tab's children are presentational, so a reader would flatten it into the
583
- // tab's name. It sits beside the tab, over the gutter the tab reserves.
584
- <div key={tab.id} className={cn("relative flex max-w-full", !vertical && "shrink-0")}>
585
- {element}
586
- {isActive && (
587
- <IconButton
588
- size="2xs"
589
- tone="danger"
590
- // The POINTER's ×, hidden from assistive tech (round 0.34, the showcase's
591
- // axe check): a tablist may own tabs only, and this button sat in it. The
592
- // named "Remove <tab>" a screen reader's cursor and a touch reader's swipe
593
- // reach is `removeButton`, after the strip. Not a tab stop either way:
594
- // the strip is one, and Delete is the keyboard's path.
595
- aria-hidden
596
- data-tab-remove=""
597
- tabIndex={-1}
598
- type="button"
599
- disabled={busy}
600
- onClick={() => requestRemove(tab.id)}
601
- className="absolute inset-y-0 end-1 my-auto"
602
- >
603
- <X />
604
- </IconButton>
605
- )}
606
- </div>
607
- );
608
- })}
609
- </div>
610
- );
611
- // The open tab's remove action as assistive tech meets it: right after the strip,
612
- // OUTSIDE the tablist, which may own tabs only (round 0.34, the showcase's axe check).
613
- // Visually hidden, since the × drawn on the tab is the pointer's, and not a tab stop,
614
- // since Delete is the keyboard's. `sr-only-fixed`: it sits wherever the caller put the
615
- // strip, with no positioned box of the kit's around it.
616
- const activeTab = tabs.find((tab) => tab.id === active);
617
- const removeButton =
618
- activeTab && isRemovable(activeTab) ? (
619
- <button
620
- ref={removeRef}
621
- type="button"
622
- tabIndex={-1}
623
- disabled={busy}
624
- onClick={() => requestRemove(activeTab.id)}
625
- className="sr-only-fixed"
626
- >
627
- {text.remove(nameOf(activeTab))}
628
- </button>
629
- ) : null;
630
- // The box the cues sit in, ‹ in the gutter before the strip and › in the one after it
631
- // (see `gutterAt`). There whether or not the strip overflows right now, so a resize
632
- // never re-parents it; the gutters only while it overflows at all (`gutters`).
633
- const stripBox = cue ? (
634
- <div className={cn("relative flex min-w-0", !onAdd && "flex-1", gutters && "px-[24px]")}>
635
- {tablist}
636
- {gutters && gutterAt("start", cueStart)}
637
- {gutters && gutterAt("end", cueEnd)}
638
- </div>
639
- ) : (
640
- tablist
641
- );
642
- if (!onAdd && cue) {
643
- // `className` goes on the row around the strip — it is the box a caller's margin or
644
- // width is meant for, as with an add button — and stays there at every scroll position.
645
- return (
646
- <div className={cn("flex items-end", className)}>
647
- {stripBox}
648
- {removeButton}
649
- </div>
650
- );
651
- }
652
- if (!onAdd) {
653
- // No outer box: the strip stays the root, as callers' `className` and tests expect.
654
- return removeButton ? (
655
- <>
656
- {tablist}
657
- {removeButton}
658
- </>
659
- ) : (
660
- tablist
661
- );
662
- }
663
- if (vertical) {
664
- // Under the column, not beside it, and with no rule to carry on: a side nav has none.
665
- return (
666
- <div className={cn("flex flex-col gap-0.5", className)}>
667
- {tablist}
668
- {removeButton}
669
- <button type="button" onClick={onAdd} disabled={busy} className={TAB_ADD_CLASSES}>
670
- <Plus aria-hidden />
671
- {addLabel ?? text.add}
672
- </button>
673
- </div>
674
- );
675
- }
676
- return (
677
- <div className={cn("flex items-end", className)}>
678
- {stripBox}
679
- {removeButton}
680
- {/* Outside the tablist: an action, not a tab — and a tablist may own only
681
- tabs. The rule under the strip carries on beneath it. */}
682
- <div className="flex flex-1 items-center self-stretch border-b border-subtle">
683
- <button type="button" onClick={onAdd} disabled={busy} className={cn(TAB_ADD_CLASSES, TAB_ADD_PHONE_CLASSES)}>
684
- <Plus aria-hidden />
685
- {/* Below md a scrolling strip keeps the room for tabs: the label is visually
686
- hidden and the "+" carries it as its name. Beside "+ Add loop" a 390px strip
687
- showed the open tab and a sliver of the next (showcase audit). */}
688
- <span className="max-md:sr-only">{addLabel ?? text.add}</span>
689
- </button>
690
- </div>
691
- </div>
692
- );
693
- }