@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,716 +0,0 @@
1
- import { useId, useMemo, useRef, useState } from "react";
2
- import type { ComponentPropsWithoutRef, KeyboardEvent, ReactNode, Ref } from "react";
3
- import { ChevronDown } from "lucide-react";
4
- import { FIELD_BASE, FIELD_FLOATING_PAD, FIELD_INVALID } from "./field-base";
5
- import { cn } from "../lib/cn";
6
- import { useDropdown } from "./dropdown";
7
- import { takeEscape, useDismissLayer } from "../hooks/use-dismiss";
8
- import { isImeEnter } from "../lib/ime";
9
- import { isQuietFocus } from "../lib/quiet-focus";
10
- import { usePhoneLayout } from "../hooks/use-breakpoint";
11
- import { PickerSheet, SHEET_ROW_CLASS } from "./picker-sheet";
12
- import {
13
- anchoredHeadingClass,
14
- ComboboxFieldLabel,
15
- endHintRowProps,
16
- GroupedOptions,
17
- groupRuns,
18
- SHEET_HEADING_CLASS,
19
- useTypedListStatus,
20
- type GroupRun,
21
- } from "./combobox-core";
22
- import { DEFAULT_COMBOBOX_LABELS, useKitLabels, useKitLocale } from "../i18n/kit-labels";
23
- import { sameName, searchRanked } from "../lib/text-match";
24
- import {
25
- EndHintRow,
26
- FieldCaption,
27
- LABEL_IN_ROW,
28
- LockedReason,
29
- mergeDescribedBy,
30
- StaticLabelRow,
31
- useFieldError,
32
- useFieldHint,
33
- useLockReason,
34
- type DisabledReasonDisplay,
35
- type FieldHelpProps,
36
- } from "./field-parts";
37
- import type { CommitScope } from "./write-lock";
38
- import { lockedKeyDown, rowClass, SuggestionList, usePrimaryPressOnly } from "./combobox-suggestions";
39
- // The id-keyed sibling lives in inline-entity-combobox.tsx (MOD-9), the list both share
40
- // in combobox-suggestions.tsx; its public names are still this module's.
41
- export { InlineEntityCombobox } from "./inline-entity-combobox";
42
- export type { InlineEntityComboboxProps } from "./inline-entity-combobox";
43
-
44
- /**
45
- * Four of the div's own attributes are omitted because this component already owns
46
- * the name, with a different meaning: `id` is the INPUT's (a caller labels or
47
- * automates the field, not the box around it), and `onChange`/`onBlur`/`onSubmit`
48
- * are the field's — a value, a departure, and "I mean what I typed" — rather than
49
- * the DOM events of the wrapper. Everything else a wrapper needs reaches the root.
50
- */
51
- export interface ComboboxProps
52
- extends Omit<ComponentPropsWithoutRef<"div">, "id" | "onChange" | "onBlur" | "onSubmit">, FieldHelpProps {
53
- value: string;
54
- onChange: (v: string) => void;
55
- /** Suggestion pool (e.g. existing payee names). */
56
- options: readonly string[];
57
- /** The visible label, a `<label for>` above the field: a ReactNode, as on every kit
58
- * field (a string until 0.34, refactor audit 2026-10, API-9). Without one, name the
59
- * field with `aria-label`. */
60
- label?: ReactNode;
61
- id?: string;
62
- placeholder?: string;
63
- className?: string;
64
- /** Required and unanswered — see {@link Input}'s `invalid`. Set on the `<input>`
65
- * itself rather than on the wrapper, which is what let Keksdose's account picker
66
- * delete the `[&_input]:…` copy of {@link FIELD_INVALID} it had been carrying
67
- * because this component had no `invalid` of its own. */
68
- invalid?: boolean;
69
- /** What is wrong with the value, as {@link Input}'s `error`: rendered under the
70
- * field, on the `<input>`'s `aria-describedby`, and implies `invalid` (lenkbank's
71
- * scope fields, which moved here off `<Input list>` + `<datalist>`). */
72
- error?: ReactNode;
73
- /**
74
- * Standing advice for the field — {@link Input}'s `hint`, so the combobox family
75
- * reads like every other field (keksdose K4: the family had `error` and no `hint`, so
76
- * the app's pickers carried their captions outside the component, attached to
77
- * nothing). Plain TEXT is a caption under the field on the input's
78
- * `aria-describedby`, before any error; a {@link FieldHint} "?" rides the label line,
79
- * or with no label sits at the field's end edge, outside the box.
80
- */
81
- hint?: ReactNode;
82
- /** As `<input disabled>`: no focus, no list, the field's settled look. The chevron
83
- * stops toggling with it — it is a mouse target the input's own `disabled` does
84
- * not reach. */
85
- disabled?: boolean;
86
- /**
87
- * Why the value cannot be changed — {@link Button}'s `disabledReason`, for a field
88
- * that SAVES itself (an inline editor whose blur writes). The input stays focusable
89
- * and `aria-disabled`, is `readOnly`, opens no list and calls neither `onChange` nor
90
- * `onSubmit`; the reason is in the kit {@link Tooltip} and on its `aria-describedby`.
91
- * Wins over `disabled`. The family's lock (keksdose G2) — see {@link InlineEntityCombobox}.
92
- */
93
- disabledReason?: ReactNode;
94
- /** This field COMMITS. Under a locked {@link WriteLockProvider} it is locked the
95
- * `disabledReason` way with the lock's reason; inside a form with its own Save, leave
96
- * it off and put `commit` on the Save. No provider, or an unlocked one: no effect. */
97
- commit?: CommitScope;
98
- /** Where the reason shows — {@link Button}'s `disabledReasonDisplay`: a line under the
99
- * field at Large and on a touch screen by default, the tooltip otherwise (DUP-3). */
100
- disabledReasonDisplay?: DisabledReasonDisplay;
101
- /** Heading an option belongs under. Supplying it makes this list read exactly
102
- * like {@link InlineEntityCombobox}'s — one heading per group with its rows
103
- * indented beneath — instead of a flat list (feedback #136 rework: the payee
104
- * field sat next to the newly-grouped category field and no longer matched).
105
- * Omit for a plain list. */
106
- groupBy?: (option: string) => string;
107
- /**
108
- * Something to show at the far end of an option's row — a badge saying what the
109
- * option IS, as distinct from what it is called.
110
- *
111
- * Keksdose's category-name field is the case: its proposals carry per-locale
112
- * names, so picking one stores a category that follows the UI language, and
113
- * picking a look-alike custom name does not. That difference is invisible in the
114
- * label and decides what the row DOES, so the row has to show it. Returning
115
- * `null` for an option renders nothing and costs no layout.
116
- *
117
- * Not rendered in the create row, which by definition names nothing in the pool.
118
- */
119
- optionAdornment?: (option: string) => ReactNode;
120
- /** Focus on mount, the way `<input autoFocus>` does — and, through `onFocus`, open
121
- * the list with it. A click-the-value inline editor needs it: the cell the user
122
- * clicked names the field the caret should land in. {@link InlineEntityCombobox}
123
- * has had it since live #218. */
124
- autoFocus?: boolean;
125
- /** Focus genuinely LEFT the field. Not fired by picking a row — the rows suppress
126
- * `mousedown`, so the input never blurs — which is what makes it usable as a
127
- * "close the inline editor" signal. */
128
- onBlur?: () => void;
129
- /** Enter pressed with no row highlighted, i.e. "I mean what I typed". The list
130
- * closes either way; this is for a caller whose Enter also submits a row editor. */
131
- onSubmit?: () => void;
132
- /** Rows to offer when the field is empty. 8 on a dropdown, where that is all
133
- * that fits; the phone sheet asks for more because it has a screen. */
134
- maxSuggestions?: number;
135
- searchPlaceholder?: string;
136
- closeLabel?: string;
137
- /**
138
- * The phone sheet's heading — and, as a string, the dialog's accessible name — for a
139
- * field whose label is drawn by someone else: a bound field's label above it,
140
- * which `RhfTextCombobox` hands over here (0.24). Default: `label`. Without either, the
141
- * full-screen sheet opened untitled and unnamed, the one screen on a phone that has to
142
- * say what it is asking for (live #200).
143
- */
144
- sheetTitle?: ReactNode;
145
- /**
146
- * Label for the row that COMMITS a value the list does not contain — e.g.
147
- * `(v) => \`Add "${v}" as payee\``. Supplying it turns the free text into
148
- * something you confirm rather than something you leave behind.
149
- *
150
- * Keksdose live #212: *"For the payee input have an apply button, when input is
151
- * placed like 'add xxx as payee' to confirm. Now it can be put in and closed with
152
- * the right top X, which seems not intuitive."* On the phone sheet the search box
153
- * IS the value, so typing a brand-new name and dismissing the sheet did commit it —
154
- * but the only control on offer was the close X, which reads as "discard". A named
155
- * affordance says what the typing did.
156
- *
157
- * Omit and the row is not rendered, which is the right default for a list whose
158
- * values are all supposed to already exist.
159
- */
160
- createLabel?: (value: string) => string;
161
- /**
162
- * The `<input>` — the control a reader types in and the one focus belongs on — as a
163
- * React 19 ref prop, the way {@link CountrySelect} takes its trigger's (0.24, kastlan:
164
- * react-hook-form's focus-on-error calls `focus()` on whatever `field.ref` is handed,
165
- * and a combobox with no ref inside a hand-wired `RhfField` gave it nothing, so a
166
- * failed submit could not take the user to it). Not the wrapper: a ref is for focus,
167
- * measurement and selection, and all three are the input's. `RhfTextCombobox` passes it.
168
- */
169
- ref?: Ref<HTMLInputElement>;
170
- }
171
-
172
- /**
173
- * Free-text combobox that looks like the shared {@link Select} (same FIELD_BASE
174
- * styling, chevron and static floating label) but lets the user type a value
175
- * that isn't in the list — e.g. naming a brand-new payee. Picking from the
176
- * filtered suggestion list fills the value; typing keeps whatever was entered.
177
- *
178
- * Use this instead of an `<Input list="…">` + `<datalist>` so the control is
179
- * visually and behaviourally consistent with the other dropdowns (feedback
180
- * #230 — the payee field looked/behaved differently from every other select).
181
- */
182
- export function Combobox(props: ComboboxProps) {
183
- const {
184
- value,
185
- onChange,
186
- options,
187
- label,
188
- id,
189
- placeholder,
190
- className,
191
- groupBy,
192
- maxSuggestions,
193
- searchPlaceholder,
194
- closeLabel,
195
- sheetTitle,
196
- createLabel,
197
- invalid,
198
- error,
199
- hint,
200
- help,
201
- disabled,
202
- disabledReason,
203
- disabledReasonDisplay,
204
- commit,
205
- optionAdornment,
206
- autoFocus,
207
- onBlur,
208
- onSubmit,
209
- ref,
210
- "aria-label": ariaLabel,
211
- // Off `rest` and onto the <input>, which is the combobox a reader meets: `Field`'s
212
- // render-prop spreads `{ id, aria-describedby, aria-invalid, aria-required }`, and
213
- // on the wrapper div the hint and required state described nothing.
214
- "aria-describedby": ariaDescribedBy,
215
- "aria-invalid": ariaInvalid,
216
- "aria-required": ariaRequired,
217
- ...rest
218
- } = props;
219
- const hintParts = useFieldHint(hint, ariaDescribedBy, { help, name: label ?? ariaLabel });
220
- const field = useFieldError(error, invalid, hintParts.describedBy, ariaInvalid);
221
- const generated = useId();
222
- const fieldId = id ?? generated;
223
- // Derived from the GENERATED id, never from `id`: a caller's id is theirs to
224
- // collide with, and `aria-controls` has to resolve.
225
- const listboxId = `${generated}-listbox`;
226
- const optionId = (index: number) => `${generated}-option-${index}`;
227
- // `backCloses` is the desktop half of live #309: the phone's list IS a
228
- // {@link PickerSheet}, which registers its own history entry, so registering a
229
- // second one here would cost two Back presses to dismiss one sheet. Its Escape
230
- // layer is this field's own, below — the list can be open with nothing to show.
231
- const isPhone = usePhoneLayout();
232
- const { open, setOpen, wrapperRef, panelRef } = useDropdown({ backCloses: !isPhone, escapeLayer: false });
233
- const primaryOnly = usePrimaryPressOnly();
234
- const [active, setActive] = useState(-1);
235
- // A closed list has no row the keyboard is on, however it closed — the sheet's X,
236
- // Escape or Back, a press outside — adjusted while rendering. The arrows' row outlived
237
- // it: the list reopens on the whole pool, so the row the arrows had put on "Migros"
238
- // showed "Aldi" highlighted, and Enter took it over the typed value (0.52 code review,
239
- // combobox.tsx). An ArrowDown that opens the list sets both at once, and keeps its row.
240
- if (!open && active !== -1) setActive(-1);
241
- // The lock (see `lockedKeyDown`): a lock arriving while the list is up closes it,
242
- // adjusted while rendering so no frame offers a row that can no longer be taken.
243
- const lock = useLockReason(commit, disabledReason);
244
- const locked = lock.locked;
245
- const inert = locked || Boolean(disabled);
246
- if (locked && open) setOpen(false);
247
- // A phone opens the list as a full-screen sheet with its own input, the way a
248
- // native <select> does — live #200: "Paid as full screen dialog with input.
249
- // Similar to the account select that already appears as full screen." The
250
- // anchored list stays for pointer devices, where it is the better shape.
251
- const sheetInputRef = useRef<HTMLInputElement | null>(null);
252
- // The box the portalled list hangs off — the inner wrapper, which hugs the input,
253
- // not the outer one (a grid item that can be taller than the field).
254
- const fieldRef = useRef<HTMLDivElement>(null);
255
-
256
- /**
257
- * Is the text in the field a QUERY, or just what was picked last time?
258
- *
259
- * Keksdose dev#549, filed against the category-name field: *"Currently it acts kind
260
- * of a filter and clicking again does not open anything since the previous text is
261
- * still there likely filtering all other options out."* A combobox whose filter is
262
- * its own value can only ever re-offer the answer it already has — after picking
263
- * "REWE" the list reopens holding one row, the one you are looking at, and changing
264
- * your mind means clearing the field by hand first.
265
- *
266
- * So the text filters only while it is being TYPED; opening the list, by focus or
267
- * by clicking the field again, puts the whole pool back. {@link InlineEntityCombobox}
268
- * below has had this since it was written (see its `typedQuery`) and the app's
269
- * category-name field grew its own copy to get it — this one, the payee field, was
270
- * the one left with the bug.
271
- *
272
- * Not derived from "does the text exactly match an option": a custom value that
273
- * happens to collide with one would then behave differently from every other, and
274
- * what is being tracked is what the user just did, which is not a property of the
275
- * string.
276
- */
277
- const [typing, setTyping] = useState(false);
278
-
279
- const query = typing ? value.trim() : "";
280
- // Folded as every kit list folds (DUP-5): "zurich" finds Zürich, by the locale's case.
281
- const locale = useKitLocale();
282
- // The live status's words (INP-6): the result count and "No results", as the panel
283
- // pickers say them.
284
- const labels = useKitLabels("combobox", DEFAULT_COMBOBOX_LABELS);
285
- const matches = useMemo(() => {
286
- const seen = new Set<string>();
287
- const uniq = options.filter((o) => o && !seen.has(o) && seen.add(o));
288
- let ranked: string[];
289
- const cap = maxSuggestions ?? (isPhone ? 50 : 8);
290
- if (!query) {
291
- ranked = uniq.slice(0, cap);
292
- } else {
293
- // Every word of the query somewhere in the name (0.51.4's rule, which this list
294
- // was said to have and did not: refactor audit 2026-10-30, DUP-4), ranked by the
295
- // WHOLE query — the whole name, then prefix matches, then substring matches, then
296
- // the names that hold the words apart (`searchRanked`, each name folded once). A
297
- // stable sort keeps the pool's order within a rank.
298
- ranked = searchRanked(uniq, query, (o) => [o], { locale })
299
- .sort((a, b) => a.rank - b.rank)
300
- .map((x) => x.row)
301
- .slice(0, cap);
302
- }
303
- if (!groupBy) return ranked;
304
- // Keep each group contiguous so a heading appears once instead of every time
305
- // the ranking interleaves two groups — while preserving "best match first":
306
- // a Map keeps insertion order, so groups come out ordered by their best-ranked
307
- // member and members keep their rank order inside the group.
308
- const byGroup = new Map<string, string[]>();
309
- for (const o of ranked) {
310
- const key = groupBy(o);
311
- if (!byGroup.has(key)) byGroup.set(key, []);
312
- byGroup.get(key)!.push(o);
313
- }
314
- return [...byGroup.values()].flat();
315
- }, [options, query, groupBy, maxSuggestions, isPhone, locale]);
316
-
317
- /**
318
- * The rows cut into their groups — computed once for both lists, each run a
319
- * `role="group"` its heading names (INP-8). Without `groupBy`, one bare run.
320
- *
321
- * The desktop list had the boundaries as `matches[i - 1]`, which is free; the sheet had
322
- * them as `matches[matches.indexOf(o) - 1]`, which is a scan of the list per row and
323
- * another per heading test. That is quadratic in the sheet's own cap of 50, on the
324
- * branch that runs on the slowest hardware we ship to — and it answers the wrong
325
- * question besides: `indexOf` finds the FIRST row with that string, so a duplicated
326
- * option would have compared against a neighbour it is not next to. (`matches`
327
- * de-duplicates today; that is a property of the memo above, not of the row being
328
- * rendered.)
329
- */
330
- const runs = useMemo<GroupRun<string>[]>(
331
- () => (groupBy ? groupRuns(matches, groupBy) : [{ group: null, start: 0, rows: matches }]),
332
- [matches, groupBy],
333
- );
334
-
335
- const take = (v: string) => {
336
- if (locked) return;
337
- onChange(v);
338
- setOpen(false);
339
- setActive(-1);
340
- // What is in the field is now an ANSWER, not a query — so reopening offers the
341
- // whole pool again rather than a one-row filter of the value just chosen.
342
- setTyping(false);
343
- };
344
-
345
- // While locked the field sits in the reason's Tooltip — in a fragment with a hidden
346
- // copy of the reason, Button's anatomy; `block` so a full-width field stays full width.
347
- const withLock = (box: ReactNode) =>
348
- locked ? (
349
- <LockedReason lock={lock} display={disabledReasonDisplay} className="block">
350
- {box}
351
- </LockedReason>
352
- ) : (
353
- box
354
- );
355
-
356
- // Offered only when the typed text is genuinely NOT in the pool: an exact match —
357
- // folded as the list matches, so "cafe" is Café ({@link sameName}, DUP-5 in the
358
- // 2026-10-30 refactor audit) — is an existing entry the list is already showing, and a
359
- // second way to pick it would be noise. Compared against `options`, not `matches` —
360
- // `matches` is capped, so a pool of 300 payees would otherwise offer to "add" one
361
- // that exists but fell off the end of the list.
362
- const typed = value.trim();
363
- const createRow =
364
- createLabel && typed.length > 0 && !options.some((o) => sameName(o, typed, locale)) ? createLabel(typed) : null;
365
-
366
- // Whether a list shows, the row the keyboard is on — named by the field, or on a phone
367
- // by the sheet's own search box, which takes the same keys (INP-6, 0.34's BUG-5 for
368
- // this field) — and the live status: the family's one rule for a typed list.
369
- const { showing, expanded, activeOption, statusRegion } = useTypedListStatus({
370
- isPhone,
371
- open,
372
- inert,
373
- rowCount: matches.length,
374
- extraRow: Boolean(createRow),
375
- query,
376
- active: active < matches.length ? active : -1,
377
- optionId,
378
- labels,
379
- });
380
- // The list is a layer on the Escape stack while it SHOWS (Wave 2, DUP-1): an Escape
381
- // over an empty "open" list is the dialog's, as it always was. On a phone the sheet
382
- // is the layer.
383
- useDismissLayer(showing, () => {
384
- setOpen(false);
385
- setActive(-1);
386
- });
387
-
388
- /** The list's keys — in the field and, on a phone, in the sheet's search box. Enter
389
- * with no row highlighted is "I mean what I typed" in both. */
390
- const listKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {
391
- if (e.key === "ArrowDown") {
392
- e.preventDefault();
393
- setOpen(true);
394
- setActive((i) => Math.min(i + 1, matches.length - 1));
395
- } else if (e.key === "ArrowUp") {
396
- e.preventDefault();
397
- setActive((i) => Math.max(i - 1, 0));
398
- } else if (e.key === "Enter") {
399
- // The Enter that confirms an IME composition is the IME's: it picks no row and
400
- // submits nothing (BUG-9).
401
- if (isImeEnter(e)) return;
402
- if (open && active >= 0 && active < matches.length) {
403
- e.preventDefault();
404
- take(matches[active]);
405
- } else {
406
- // No row highlighted: the typed text is the answer. `preventDefault` only when a
407
- // caller is taking Enter, so a plain form submit is otherwise left alone.
408
- if (onSubmit) e.preventDefault();
409
- setOpen(false);
410
- onSubmit?.();
411
- }
412
- }
413
- };
414
-
415
- /** The rows in their runs — each group a `role="group"` its heading names (INP-8) —
416
- * for the sheet or the anchored list; `row` draws one option, `grouped` when it
417
- * stands under a heading. `matches` is group-contiguous, so the boundaries are a
418
- * property of the list rather than of the branch drawing it (see `runs`). */
419
- const groupedRows = (sheet: boolean, row: (o: string, i: number, grouped: boolean) => ReactNode) => (
420
- <GroupedOptions
421
- runs={runs}
422
- listboxId={listboxId}
423
- rowKey={(o) => o}
424
- row={row}
425
- // The list's first item sits closer to its top edge; the create row comes first
426
- // when there is one.
427
- headingClassName={(run) => (sheet ? SHEET_HEADING_CLASS : anchoredHeadingClass(run, !createRow))}
428
- />
429
- );
430
-
431
- return (
432
- // `rest` dresses the outer box — a `data-tour` anchor, a test id. Not the NAME,
433
- // description, invalid or required state: those belong on the <input> below,
434
- // which is the combobox a reader meets. Spread FIRST, so the field's ARIA and the
435
- // handlers carrying live #309 and dev#549 cannot be replaced from outside.
436
- <div {...rest} ref={wrapperRef} className={cn("relative", className)}>
437
- {/* A real <label for> since lenkbank's tests met a field `getByLabelText` could
438
- not find: it used to be a <span>, with the text copied onto `aria-label`. The
439
- name a reader hears is the same words either way. With a "?" it moves into a
440
- row after the field, below. */}
441
- {label !== undefined && hintParts.labelHint === undefined && (
442
- <ComboboxFieldLabel htmlFor={fieldId} className={inert ? "opacity-50" : undefined}>
443
- {label}
444
- </ComboboxFieldLabel>
445
- )}
446
- <EndHintRow {...endHintRowProps("hint" in props, label !== undefined, hintParts.labelHint)}>
447
- {withLock(
448
- /* The chevron centers against this inner wrapper, which hugs the input.
449
- The outer div can be taller than the input (as a grid item it
450
- stretches to the row height, e.g. next to the editor's category cell
451
- with its split button), which used to drag a top-1/2 chevron down to
452
- the input's bottom edge (feedback #248).
453
- Dimmed as a whole when disabled (or locked), the way EntityCombobox dims its
454
- trigger. FIELD_BASE's grey alone left a disabled picker looking like a
455
- filled-in one beside the pickers that do dim (the label is not the input's
456
- `peer`, so it is dimmed by hand above). */
457
- <div ref={fieldRef} className={cn("relative", inert && "cursor-not-allowed opacity-50")}>
458
- <input
459
- ref={ref}
460
- id={fieldId}
461
- value={value}
462
- placeholder={placeholder}
463
- // The caller's name, over the <label for> above — which is what names the
464
- // field otherwise (dev#477: a field with neither announces only its text).
465
- aria-label={ariaLabel}
466
- role="combobox"
467
- aria-expanded={expanded}
468
- // The list this field is the mouth of. Required by the role, and the half
469
- // that was missing: the field said it was expanded and never said what it
470
- // had expanded, so a reader had no way from the box to the options
471
- // (ESLint's `role-has-required-aria-props`, the audit's §a11y).
472
- aria-controls={listboxId}
473
- // Only on a pointer device: on a phone the sheet's own search box holds
474
- // focus and names the row, and the field behind it says nothing.
475
- aria-activedescendant={isPhone ? undefined : activeOption}
476
- aria-autocomplete="list"
477
- aria-invalid={field.isInvalid || undefined}
478
- aria-describedby={mergeDescribedBy(field.describedBy, locked && lock.reasonId)}
479
- aria-required={ariaRequired}
480
- autoComplete="off"
481
- // Locked: focusable, `readOnly`, `aria-disabled` — see `lockedKeyDown`.
482
- disabled={locked ? undefined : disabled}
483
- readOnly={locked || undefined}
484
- aria-disabled={locked || undefined}
485
- // eslint-disable-next-line jsx-a11y/no-autofocus -- a documented prop the caller opts into (off by default); the field never takes focus on its own.
486
- autoFocus={autoFocus}
487
- onBlur={onBlur}
488
- onMouseDown={primaryOnly.onMouseDown}
489
- onFocus={(e) => {
490
- // A back/forward mouse button focuses this field on its way to
491
- // navigating; it is not a request to open anything (live #309 rework).
492
- // A locked field takes focus to say why, and opens nothing.
493
- if (primaryOnly.fromAuxButton() || locked) return;
494
- // The tour's focus on arrival (§11.8) opens nothing: the list would cover
495
- // its card (0.50.1). The click handler below still opens on a click.
496
- if (isQuietFocus(e.currentTarget)) return;
497
- setOpen(true);
498
- setTyping(false);
499
- setActive(-1);
500
- // The sheet carries its own input, so the field behind it must not also
501
- // pull up the keyboard and scroll the page under the dialog.
502
- if (isPhone) sheetInputRef.current?.focus();
503
- }}
504
- // A CLICK as well as focus — the other half of dev#549. Picking a suggestion
505
- // closes the list without moving focus (the rows suppress `mousedown` on
506
- // purpose, so the input never blurred), which means clicking the field again
507
- // fires no `focus` event at all and the list stayed shut. "Does not open
508
- // anything" was literally true.
509
- onClick={() => {
510
- if (locked) return;
511
- setOpen(true);
512
- // The whole pool again, so no row of the typed list is the keyboard's
513
- // (0.52 code review, combobox.tsx — see `active`).
514
- setTyping(false);
515
- setActive(-1);
516
- }}
517
- // `inputMode="none"` rather than readOnly: the field must not look
518
- // uneditable (FIELD_BASE greys a read-only field since dev#468) and must
519
- // still take focus — it just has no keyboard of its own, the same trick
520
- // the amount field uses for the numpad.
521
- inputMode={isPhone ? "none" : undefined}
522
- onChange={(e) => {
523
- if (locked) return;
524
- onChange(e.target.value);
525
- setOpen(true);
526
- setActive(-1);
527
- setTyping(true);
528
- }}
529
- onKeyDown={(e) => {
530
- if (locked) return lockedKeyDown(e);
531
- listKeyDown(e);
532
- if (e.key === "Escape") {
533
- // A list that is SHOWING is the top of the Escape stack, and the key
534
- // closes it and stops here: a Modal or FullBleedDialog around the field
535
- // otherwise closed with it, form and all (round 0.34 BUG-1). With no
536
- // list on screen the key goes on to whoever wants it.
537
- if (showing && takeEscape(e)) return;
538
- setOpen(false);
539
- setActive(-1);
540
- } else if (e.key === "Tab") {
541
- // Closes, and lets the browser take the Tab: focus is in THIS input,
542
- // which is staying, so there is nothing to catch — unlike the pickers
543
- // whose focus sits inside a portalled panel.
544
- setOpen(false);
545
- setActive(-1);
546
- }
547
- // Home/End are deliberately absent. The APG gives them to the list only
548
- // where the combobox is not editable; here the text IS the value, a
549
- // payee name is long enough to want the caret moved to its start, and
550
- // the desktop list is capped at 8 rows — so jumping it would be worth
551
- // almost nothing and would cost the one gesture that field is used with.
552
- }}
553
- className={cn(
554
- FIELD_BASE,
555
- label !== undefined && FIELD_FLOATING_PAD,
556
- "pe-9",
557
- field.isInvalid && FIELD_INVALID,
558
- )}
559
- />
560
- <ChevronDown
561
- aria-hidden
562
- onMouseDown={(e) => {
563
- // Toggle on the chevron without stealing focus from the input.
564
- e.preventDefault();
565
- if (!inert) setOpen((o) => !o);
566
- }}
567
- className={cn(
568
- "absolute end-2.5 top-1/2 size-4 -translate-y-1/2 text-placeholder",
569
- // The box above does the dimming; dimming here too would halve it again.
570
- !inert && "cursor-pointer",
571
- )}
572
- />
573
- </div>,
574
- )}
575
- </EndHintRow>
576
- {/* The label and its "?" share the top strip — after the field in the DOM, so the
577
- "?" follows the control in the tab order, as it does on Input and Select. */}
578
- {label !== undefined && hintParts.labelHint !== undefined && (
579
- <StaticLabelRow hint={hintParts.labelHint}>
580
- <ComboboxFieldLabel htmlFor={fieldId} className={cn(LABEL_IN_ROW, inert && "opacity-50")}>
581
- {label}
582
- </ComboboxFieldLabel>
583
- </StaticLabelRow>
584
- )}
585
- <FieldCaption parts={hintParts} />
586
- {field.errorEl}
587
- {/* The live status — see `useTypedListStatus` for where it goes and why. */}
588
- {!isPhone && statusRegion}
589
- {isPhone && (
590
- <PickerSheet
591
- open={open && !inert}
592
- onClose={() => setOpen(false)}
593
- title={sheetTitle ?? label}
594
- // The sheet's input IS the field: this is a free-text control, so what is
595
- // typed here is the value (a brand-new payee is just a name nothing
596
- // matches), and the list below narrows as it changes.
597
- query={value}
598
- onQueryChange={(v) => {
599
- onChange(v);
600
- setActive(-1);
601
- setTyping(true);
602
- }}
603
- searchPlaceholder={searchPlaceholder ?? placeholder}
604
- inputRef={sheetInputRef}
605
- closeLabel={closeLabel}
606
- // The field's own keys, in the box focus is in while the sheet is up: arrows
607
- // and Enter there did nothing (INP-6, as BUG-5 gave the panel pickers).
608
- onSearchKeyDown={listKeyDown}
609
- listboxId={listboxId}
610
- activeId={activeOption}
611
- >
612
- <ul id={listboxId} role="listbox">
613
- {createRow && (
614
- // `role="option"` rides the BUTTON, not the <li> around it: an option
615
- // may not contain a separately focusable control, and the button is
616
- // what a pointer presses. Same shape `CommandPalette` has always had.
617
- <li role="presentation">
618
- <button
619
- type="button"
620
- role="option"
621
- aria-selected={false}
622
- onClick={() => take(typed)}
623
- className={cn(SHEET_ROW_CLASS, "font-medium text-brand")}
624
- >
625
- {createRow}
626
- </button>
627
- </li>
628
- )}
629
- {groupedRows(true, (o, i) => (
630
- <li role="presentation">
631
- <button
632
- type="button"
633
- id={optionId(i)}
634
- role="option"
635
- aria-selected={o === value}
636
- onClick={() => take(o)}
637
- className={cn(
638
- SHEET_ROW_CLASS,
639
- // The row the sheet's arrows are on.
640
- i === active && "bg-active",
641
- optionAdornment && "flex items-center justify-between gap-2",
642
- )}
643
- >
644
- {optionAdornment ? <span className="truncate-until-large">{o}</span> : o}
645
- {optionAdornment?.(o)}
646
- </button>
647
- </li>
648
- ))}
649
- </ul>
650
- {statusRegion}
651
- </PickerSheet>
652
- )}
653
- {showing && (
654
- <SuggestionList id={listboxId} anchorRef={fieldRef} panelRef={panelRef}>
655
- {createRow && (
656
- <li role="presentation">
657
- <button
658
- type="button"
659
- role="option"
660
- aria-selected={false}
661
- tabIndex={-1}
662
- onMouseDown={(e) => {
663
- // mousedown, like the rows below: the input's blur would otherwise
664
- // close the list before the click landed.
665
- e.preventDefault();
666
- take(typed);
667
- }}
668
- className={cn(rowClass(false), "font-medium text-brand")}
669
- >
670
- {createRow}
671
- </button>
672
- </li>
673
- )}
674
- {groupedRows(false, (o, i, grouped) => (
675
- <li role="presentation">
676
- <button
677
- type="button"
678
- id={optionId(i)}
679
- role="option"
680
- // CHOSEN, not highlighted. The row the arrows are on is named by the
681
- // field's `aria-activedescendant`; saying "selected" for it would tell a
682
- // reader that the row they are passing over is already the answer.
683
- aria-selected={o === value}
684
- // Focus stays in the field — that is what `aria-activedescendant` is
685
- // for — so the rows are not tab stops.
686
- tabIndex={-1}
687
- onMouseDown={(e) => {
688
- // mousedown (not click) so the blur from the input firing first
689
- // doesn't close the list before the selection registers.
690
- e.preventDefault();
691
- take(o);
692
- }}
693
- onMouseEnter={() => setActive(i)}
694
- className={cn(
695
- rowClass(i === active),
696
- // Every row of a group indented under its heading — it was the first
697
- // row of each group only.
698
- grouped && "ps-6",
699
- // A row with a badge is a flex row so the label truncates and the
700
- // badge keeps its width; without one it stays the plain block the
701
- // other lists render, so nothing shifts for callers that pass none.
702
- // From Large up the label wraps instead (`truncate-until-large`,
703
- // text size §10.17, round 0.34 T1), as the badge-less row does.
704
- optionAdornment && "flex items-center justify-between gap-2",
705
- )}
706
- >
707
- {optionAdornment ? <span className="truncate-until-large">{o}</span> : o}
708
- {optionAdornment?.(o)}
709
- </button>
710
- </li>
711
- ))}
712
- </SuggestionList>
713
- )}
714
- </div>
715
- );
716
- }