@eifi1/ui-kit 0.54.0 → 0.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (847) hide show
  1. package/README.md +90 -76
  2. package/dist/admin/plan-change.js +2 -2
  3. package/dist/admin/plan-change.js.map +1 -1
  4. package/dist/admin/user-roster.d.ts +6 -0
  5. package/dist/admin/user-roster.js +4 -0
  6. package/dist/admin/user-roster.js.map +1 -1
  7. package/dist/billing/billing-labels.d.ts +26 -0
  8. package/dist/billing/billing-labels.js +9 -0
  9. package/dist/billing/billing-labels.js.map +1 -1
  10. package/dist/billing/subscription-standing.d.ts +61 -0
  11. package/dist/billing/subscription-standing.js +51 -0
  12. package/dist/billing/subscription-standing.js.map +1 -0
  13. package/dist/billing/usage-meter.d.ts +52 -0
  14. package/dist/billing/usage-meter.js +52 -0
  15. package/dist/billing/usage-meter.js.map +1 -0
  16. package/dist/chart.d.ts +1 -0
  17. package/dist/chart.js +4 -0
  18. package/dist/chart.js.map +1 -1
  19. package/dist/components/alert-banner.js +2 -3
  20. package/dist/components/alert-banner.js.map +1 -1
  21. package/dist/components/amount-input.js +3 -15
  22. package/dist/components/amount-input.js.map +1 -1
  23. package/dist/components/autocomplete.js +2 -2
  24. package/dist/components/autocomplete.js.map +1 -1
  25. package/dist/components/bulk-action-bar.js +2 -1
  26. package/dist/components/bulk-action-bar.js.map +1 -1
  27. package/dist/components/button.d.ts +35 -1
  28. package/dist/components/button.js +5 -9
  29. package/dist/components/button.js.map +1 -1
  30. package/dist/components/calendar-heatmap.js +2 -2
  31. package/dist/components/calendar-heatmap.js.map +1 -1
  32. package/dist/components/camera-button.d.ts +89 -0
  33. package/dist/components/camera-button.js +122 -0
  34. package/dist/components/camera-button.js.map +1 -0
  35. package/dist/components/camera-capture.d.ts +66 -0
  36. package/dist/components/camera-capture.js +190 -0
  37. package/dist/components/camera-capture.js.map +1 -0
  38. package/dist/components/camera-labels.d.ts +20 -0
  39. package/dist/components/camera-labels.js +15 -0
  40. package/dist/components/camera-labels.js.map +1 -0
  41. package/dist/components/chart-edge.d.ts +9 -0
  42. package/dist/components/chart-edge.js +14 -3
  43. package/dist/components/chart-edge.js.map +1 -1
  44. package/dist/components/chart-zoom-core.js +34 -29
  45. package/dist/components/chart-zoom-core.js.map +1 -1
  46. package/dist/components/checkbox-group.js +1 -1
  47. package/dist/components/checkbox-group.js.map +1 -1
  48. package/dist/components/combobox-core.js +3 -2
  49. package/dist/components/combobox-core.js.map +1 -1
  50. package/dist/components/combobox.js +2 -2
  51. package/dist/components/combobox.js.map +1 -1
  52. package/dist/components/consent-again-notice-labels.d.ts +25 -0
  53. package/dist/components/consent-again-notice-labels.js +15 -0
  54. package/dist/components/consent-again-notice-labels.js.map +1 -0
  55. package/dist/components/consent-again-notice.d.ts +85 -0
  56. package/dist/components/consent-again-notice.js +94 -0
  57. package/dist/components/consent-again-notice.js.map +1 -0
  58. package/dist/components/country-select.js +2 -7
  59. package/dist/components/country-select.js.map +1 -1
  60. package/dist/components/currency-select.js +2 -2
  61. package/dist/components/currency-select.js.map +1 -1
  62. package/dist/components/danger-confirm.js +2 -2
  63. package/dist/components/danger-confirm.js.map +1 -1
  64. package/dist/components/data-table-column-settings.js +2 -2
  65. package/dist/components/data-table-column-settings.js.map +1 -1
  66. package/dist/components/data-table-fit.js.map +1 -1
  67. package/dist/components/data-table-virtual.js +13 -3
  68. package/dist/components/data-table-virtual.js.map +1 -1
  69. package/dist/components/date-field.js +2 -2
  70. package/dist/components/date-field.js.map +1 -1
  71. package/dist/components/date-picker.js +2 -2
  72. package/dist/components/date-picker.js.map +1 -1
  73. package/dist/components/date-range-picker.js +2 -6
  74. package/dist/components/date-range-picker.js.map +1 -1
  75. package/dist/components/dialog-frame.d.ts +3 -1
  76. package/dist/components/dialog-frame.js.map +1 -1
  77. package/dist/components/dropdown.js +7 -3
  78. package/dist/components/dropdown.js.map +1 -1
  79. package/dist/components/entity-combobox.js +2 -2
  80. package/dist/components/entity-combobox.js.map +1 -1
  81. package/dist/components/field-parts.d.ts +108 -6
  82. package/dist/components/field-parts.js +59 -6
  83. package/dist/components/field-parts.js.map +1 -1
  84. package/dist/components/field-suggestion-labels.d.ts +2 -0
  85. package/dist/components/field-suggestion-labels.js +10 -0
  86. package/dist/components/field-suggestion-labels.js.map +1 -0
  87. package/dist/components/field.js +1 -1
  88. package/dist/components/field.js.map +1 -1
  89. package/dist/components/file-button.d.ts +1 -1
  90. package/dist/components/file-button.js.map +1 -1
  91. package/dist/components/floating-panel.d.ts +7 -6
  92. package/dist/components/floating-panel.js +3 -17
  93. package/dist/components/floating-panel.js.map +1 -1
  94. package/dist/components/form-actions.d.ts +3 -2
  95. package/dist/components/form-actions.js.map +1 -1
  96. package/dist/components/hover-menu.js +3 -2
  97. package/dist/components/hover-menu.js.map +1 -1
  98. package/dist/components/icon-button.d.ts +23 -5
  99. package/dist/components/icon-button.js +6 -8
  100. package/dist/components/icon-button.js.map +1 -1
  101. package/dist/components/inline-confirm.js +2 -1
  102. package/dist/components/inline-confirm.js.map +1 -1
  103. package/dist/components/inline-entity-combobox.js +2 -2
  104. package/dist/components/inline-entity-combobox.js.map +1 -1
  105. package/dist/components/input.js +2 -2
  106. package/dist/components/input.js.map +1 -1
  107. package/dist/components/jump-calendar.js +3 -3
  108. package/dist/components/jump-calendar.js.map +1 -1
  109. package/dist/components/legal.d.ts +13 -1
  110. package/dist/components/legal.js +12 -0
  111. package/dist/components/legal.js.map +1 -1
  112. package/dist/components/legended-series-chart.d.ts +80 -0
  113. package/dist/components/legended-series-chart.js +70 -0
  114. package/dist/components/legended-series-chart.js.map +1 -0
  115. package/dist/components/lightbox.js +2 -1
  116. package/dist/components/lightbox.js.map +1 -1
  117. package/dist/components/mini-calendar.js +13 -5
  118. package/dist/components/mini-calendar.js.map +1 -1
  119. package/dist/components/modal.d.ts +23 -2
  120. package/dist/components/modal.js +24 -6
  121. package/dist/components/modal.js.map +1 -1
  122. package/dist/components/month-picker.d.ts +1 -1
  123. package/dist/components/month-picker.js +6 -6
  124. package/dist/components/month-picker.js.map +1 -1
  125. package/dist/components/multi-entity-combobox.js +2 -2
  126. package/dist/components/multi-entity-combobox.js.map +1 -1
  127. package/dist/components/multi-select.js +2 -6
  128. package/dist/components/multi-select.js.map +1 -1
  129. package/dist/components/number-input.js +2 -2
  130. package/dist/components/number-input.js.map +1 -1
  131. package/dist/components/page-header-layout.d.ts +18 -0
  132. package/dist/components/page-header-layout.js +23 -0
  133. package/dist/components/page-header-layout.js.map +1 -0
  134. package/dist/components/page-header-skeleton.d.ts +41 -0
  135. package/dist/components/page-header-skeleton.js +52 -0
  136. package/dist/components/page-header-skeleton.js.map +1 -0
  137. package/dist/components/page-header.js +4 -17
  138. package/dist/components/page-header.js.map +1 -1
  139. package/dist/components/popover.js +7 -2
  140. package/dist/components/popover.js.map +1 -1
  141. package/dist/components/release-notes-labels.d.ts +16 -0
  142. package/dist/components/release-notes-labels.js +18 -0
  143. package/dist/components/release-notes-labels.js.map +1 -0
  144. package/dist/components/release-notes.d.ts +65 -0
  145. package/dist/components/release-notes.js +65 -0
  146. package/dist/components/release-notes.js.map +1 -0
  147. package/dist/components/select.js +2 -2
  148. package/dist/components/select.js.map +1 -1
  149. package/dist/components/series-chart-labels.d.ts +9 -0
  150. package/dist/components/series-chart-labels.js +3 -1
  151. package/dist/components/series-chart-labels.js.map +1 -1
  152. package/dist/components/series-chart.d.ts +5 -0
  153. package/dist/components/series-chart.js +89 -36
  154. package/dist/components/series-chart.js.map +1 -1
  155. package/dist/components/toggle-group.js +3 -2
  156. package/dist/components/toggle-group.js.map +1 -1
  157. package/dist/components/treemap-layout.js.map +1 -1
  158. package/dist/components/treemap.d.ts +17 -15
  159. package/dist/components/treemap.js +167 -85
  160. package/dist/components/treemap.js.map +1 -1
  161. package/dist/eslint/index.js +1 -1
  162. package/dist/eslint/role-utilities.d.ts +2 -2
  163. package/dist/eslint/role-utilities.js.map +1 -1
  164. package/dist/feedback/feedback-inbox-page.d.ts +260 -0
  165. package/dist/feedback/feedback-inbox-page.js +207 -0
  166. package/dist/feedback/feedback-inbox-page.js.map +1 -0
  167. package/dist/feedback/feedback-vocabulary.js +2 -2
  168. package/dist/feedback/feedback-vocabulary.js.map +1 -1
  169. package/dist/feedback.d.ts +1 -0
  170. package/dist/feedback.js +6 -0
  171. package/dist/feedback.js.map +1 -1
  172. package/dist/hooks/use-debounce.d.ts +32 -5
  173. package/dist/hooks/use-debounce.js +6 -5
  174. package/dist/hooks/use-debounce.js.map +1 -1
  175. package/dist/hooks/use-file-picker.d.ts +3 -1
  176. package/dist/hooks/use-file-picker.js.map +1 -1
  177. package/dist/hooks/use-focus-trap.d.ts +19 -3
  178. package/dist/hooks/use-focus-trap.js +15 -5
  179. package/dist/hooks/use-focus-trap.js.map +1 -1
  180. package/dist/hooks/use-has-camera.d.ts +36 -0
  181. package/dist/hooks/use-has-camera.js +53 -0
  182. package/dist/hooks/use-has-camera.js.map +1 -0
  183. package/dist/hooks/use-hotkey.js +1 -10
  184. package/dist/hooks/use-hotkey.js.map +1 -1
  185. package/dist/hooks/use-overlay-history.d.ts +6 -1
  186. package/dist/hooks/use-overlay-history.js +10 -2
  187. package/dist/hooks/use-overlay-history.js.map +1 -1
  188. package/dist/i18n/defaults.js +11 -1
  189. package/dist/i18n/defaults.js.map +1 -1
  190. package/dist/i18n/german.js +75 -3
  191. package/dist/i18n/german.js.map +1 -1
  192. package/dist/i18n/kit-labels.d.ts +20 -0
  193. package/dist/i18n/kit-labels.js.map +1 -1
  194. package/dist/i18n/locales/en.js +92 -4
  195. package/dist/i18n/locales/en.js.map +3 -3
  196. package/dist/i18n/locales/es.js +71 -3
  197. package/dist/i18n/locales/es.js.map +1 -1
  198. package/dist/i18n/locales/fr.js +72 -2
  199. package/dist/i18n/locales/fr.js.map +1 -1
  200. package/dist/i18n/locales/hu.js +74 -3
  201. package/dist/i18n/locales/hu.js.map +1 -1
  202. package/dist/i18n/locales/it.js +74 -3
  203. package/dist/i18n/locales/it.js.map +1 -1
  204. package/dist/i18n/locales/zh.js +71 -3
  205. package/dist/i18n/locales/zh.js.map +1 -1
  206. package/dist/i18n/review.js +22 -1
  207. package/dist/i18n/review.js.map +1 -1
  208. package/dist/index.d.ts +24 -5
  209. package/dist/index.js +35 -1
  210. package/dist/index.js.map +1 -1
  211. package/dist/landing/landing-labels.d.ts +8 -0
  212. package/dist/landing/landing-labels.js +2 -1
  213. package/dist/landing/landing-labels.js.map +1 -1
  214. package/dist/lib/changelog.d.ts +130 -0
  215. package/dist/lib/changelog.js +137 -0
  216. package/dist/lib/changelog.js.map +1 -0
  217. package/dist/lib/clipboard-minus.js +2 -2
  218. package/dist/lib/clipboard-minus.js.map +1 -1
  219. package/dist/lib/dates.d.ts +29 -3
  220. package/dist/lib/dates.js +41 -12
  221. package/dist/lib/dates.js.map +1 -1
  222. package/dist/lib/editable-content.d.ts +33 -0
  223. package/dist/lib/editable-content.js +15 -0
  224. package/dist/lib/editable-content.js.map +1 -0
  225. package/dist/lib/focus-left.d.ts +47 -1
  226. package/dist/lib/focus-left.js +11 -2
  227. package/dist/lib/focus-left.js.map +1 -1
  228. package/dist/lib/server-wake.d.ts +49 -9
  229. package/dist/lib/server-wake.js +25 -14
  230. package/dist/lib/server-wake.js.map +1 -1
  231. package/dist/lib/session-refresh.d.ts +53 -0
  232. package/dist/lib/session-refresh.js +27 -1
  233. package/dist/lib/session-refresh.js.map +1 -1
  234. package/dist/rhf/fields.js +3 -3
  235. package/dist/rhf/fields.js.map +1 -1
  236. package/dist/shell/app-shell.d.ts +25 -1
  237. package/dist/shell/app-shell.js +3 -1
  238. package/dist/shell/app-shell.js.map +1 -1
  239. package/dist/shell/dev-menu.d.ts +3 -0
  240. package/dist/shell/dev-menu.js +4 -2
  241. package/dist/shell/dev-menu.js.map +1 -1
  242. package/dist/shell/held-changes-banner-labels.d.ts +23 -0
  243. package/dist/shell/held-changes-banner-labels.js +14 -0
  244. package/dist/shell/held-changes-banner-labels.js.map +1 -0
  245. package/dist/shell/held-changes-banner.d.ts +75 -0
  246. package/dist/shell/held-changes-banner.js +106 -0
  247. package/dist/shell/held-changes-banner.js.map +1 -0
  248. package/dist/shell/sync-status-indicator.d.ts +27 -12
  249. package/dist/shell/sync-status-indicator.js +13 -4
  250. package/dist/shell/sync-status-indicator.js.map +1 -1
  251. package/dist/shell/top-bar-parts-labels.d.ts +5 -0
  252. package/dist/shell/top-bar-parts-labels.js +3 -1
  253. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  254. package/dist/shell.d.ts +2 -0
  255. package/dist/shell.js +3 -0
  256. package/dist/shell.js.map +1 -1
  257. package/dist/sync/engine.d.ts +11 -2
  258. package/dist/sync/engine.js +13 -5
  259. package/dist/sync/engine.js.map +1 -1
  260. package/dist/sync/hooks.d.ts +3 -2
  261. package/dist/sync/hooks.js +4 -2
  262. package/dist/sync/hooks.js.map +1 -1
  263. package/dist/testing/css-variables.generated.d.ts +2 -2
  264. package/dist/testing/css-variables.generated.js +1 -1
  265. package/dist/testing/css-variables.generated.js.map +1 -1
  266. package/dist/theme/chart-palette.d.ts +18 -0
  267. package/dist/theme/chart-palette.js +17 -1
  268. package/dist/theme/chart-palette.js.map +1 -1
  269. package/dist/theme/contrast-tokens.d.ts +3 -3
  270. package/dist/theme/contrast-tokens.js.map +1 -1
  271. package/dist/theme/contrast.d.ts +4 -4
  272. package/dist/theme/contrast.js.map +1 -1
  273. package/dist/tour/tour-overlay.js +2 -1
  274. package/dist/tour/tour-overlay.js.map +1 -1
  275. package/package.json +5 -9
  276. package/tokens.css +19 -54
  277. package/src/account/account-parts.ts +0 -47
  278. package/src/account/account-settings-labels.ts +0 -240
  279. package/src/account/account-settings.tsx +0 -698
  280. package/src/account/data-export-setting-labels.ts +0 -20
  281. package/src/account/data-export-setting.tsx +0 -200
  282. package/src/account/delete-account-setting-labels.ts +0 -33
  283. package/src/account/delete-account-setting.tsx +0 -342
  284. package/src/account/email-change-setting-labels.ts +0 -31
  285. package/src/account/email-change-setting.tsx +0 -443
  286. package/src/account/passkeys-setting.tsx +0 -445
  287. package/src/account/sessions-setting-labels.ts +0 -24
  288. package/src/account/sessions-setting.tsx +0 -283
  289. package/src/admin/admin-action-confirm-labels.ts +0 -19
  290. package/src/admin/admin-action-confirm.tsx +0 -509
  291. package/src/admin/admin-action-log-labels.ts +0 -83
  292. package/src/admin/admin-action-log.tsx +0 -464
  293. package/src/admin/admin-area-labels.ts +0 -114
  294. package/src/admin/admin-forbidden.tsx +0 -75
  295. package/src/admin/admin-overview.tsx +0 -258
  296. package/src/admin/admin-parts.ts +0 -68
  297. package/src/admin/admin-sections.tsx +0 -208
  298. package/src/admin/admin-tool-links.tsx +0 -90
  299. package/src/admin/invitations-panel-labels.ts +0 -31
  300. package/src/admin/invitations-panel.tsx +0 -516
  301. package/src/admin/mail-test-card-labels.ts +0 -19
  302. package/src/admin/mail-test-card.tsx +0 -189
  303. package/src/admin/plan-change-labels.ts +0 -5
  304. package/src/admin/plan-change.tsx +0 -474
  305. package/src/admin/reviewer-scope-editor-labels.ts +0 -16
  306. package/src/admin/reviewer-scope-editor.tsx +0 -224
  307. package/src/admin/role-select-labels.ts +0 -16
  308. package/src/admin/role-select.tsx +0 -282
  309. package/src/admin/transfer-ownership-dialog-labels.ts +0 -20
  310. package/src/admin/transfer-ownership-dialog.tsx +0 -162
  311. package/src/admin/user-roster-labels.ts +0 -17
  312. package/src/admin/user-roster.tsx +0 -559
  313. package/src/auth/accept-invitation-labels.ts +0 -21
  314. package/src/auth/accept-invitation.tsx +0 -210
  315. package/src/auth/auth-errors-labels.ts +0 -23
  316. package/src/auth/auth-errors.ts +0 -439
  317. package/src/auth/complete-name-dialog-labels.ts +0 -16
  318. package/src/auth/complete-name-dialog.tsx +0 -253
  319. package/src/auth/email-tag.ts +0 -75
  320. package/src/auth/forgot-password-form-labels.ts +0 -20
  321. package/src/auth/forgot-password-form.tsx +0 -221
  322. package/src/auth/form-rules.ts +0 -40
  323. package/src/auth/new-password-fields.tsx +0 -85
  324. package/src/auth/not-found-page-labels.ts +0 -12
  325. package/src/auth/not-found-page.tsx +0 -95
  326. package/src/auth/register-form-labels.ts +0 -31
  327. package/src/auth/register-form.tsx +0 -456
  328. package/src/auth/reset-password-form-labels.ts +0 -27
  329. package/src/auth/reset-password-form.tsx +0 -341
  330. package/src/auth/sign-in-form-labels.ts +0 -44
  331. package/src/auth/sign-in-form.tsx +0 -858
  332. package/src/auth/status-parts.tsx +0 -132
  333. package/src/auth/verify-email-labels.ts +0 -26
  334. package/src/auth/verify-email.tsx +0 -445
  335. package/src/billing/billing-banner.tsx +0 -258
  336. package/src/billing/billing-labels.ts +0 -381
  337. package/src/billing/billing-lock.ts +0 -108
  338. package/src/billing/billing-overview.ts +0 -157
  339. package/src/billing/billing-standing.ts +0 -80
  340. package/src/billing/cancel-request.ts +0 -97
  341. package/src/billing/cancel-subscription.tsx +0 -98
  342. package/src/billing/checkout-processing.ts +0 -394
  343. package/src/billing/checkout-return.ts +0 -90
  344. package/src/billing/pay-page.ts +0 -330
  345. package/src/billing/plan-card.tsx +0 -562
  346. package/src/billing/plan-change-labels.ts +0 -66
  347. package/src/billing/plan-limit-notice.tsx +0 -148
  348. package/src/billing/plan-limit-toast.tsx +0 -90
  349. package/src/billing/plan-limit.ts +0 -52
  350. package/src/billing/plan-price.ts +0 -98
  351. package/src/billing/plan-switch.tsx +0 -216
  352. package/src/billing/provider-page.ts +0 -84
  353. package/src/billing/subscription-actions.tsx +0 -247
  354. package/src/billing/subscription-status-chip.tsx +0 -95
  355. package/src/chart.ts +0 -103
  356. package/src/components/account-chips-labels.ts +0 -16
  357. package/src/components/account-chips.tsx +0 -474
  358. package/src/components/alert-banner.tsx +0 -670
  359. package/src/components/amount-input.tsx +0 -816
  360. package/src/components/appearance-labels.ts +0 -63
  361. package/src/components/authed-image-labels.ts +0 -11
  362. package/src/components/authed-image.tsx +0 -209
  363. package/src/components/autocomplete.tsx +0 -645
  364. package/src/components/breadcrumbs-labels.ts +0 -10
  365. package/src/components/breadcrumbs.tsx +0 -205
  366. package/src/components/bulk-action-bar-labels.ts +0 -11
  367. package/src/components/bulk-action-bar.tsx +0 -443
  368. package/src/components/button-group.tsx +0 -223
  369. package/src/components/button-look.ts +0 -256
  370. package/src/components/button.tsx +0 -339
  371. package/src/components/calculator.tsx +0 -341
  372. package/src/components/calendar-heatmap-labels.ts +0 -15
  373. package/src/components/calendar-heatmap.tsx +0 -600
  374. package/src/components/card.tsx +0 -377
  375. package/src/components/chart-edge.ts +0 -106
  376. package/src/components/chart-figure.tsx +0 -35
  377. package/src/components/chart-height.ts +0 -30
  378. package/src/components/chart-zoom-core.tsx +0 -627
  379. package/src/components/chart-zoom.tsx +0 -22
  380. package/src/components/chart.tsx +0 -554
  381. package/src/components/checkbox-group.tsx +0 -247
  382. package/src/components/checkbox.tsx +0 -346
  383. package/src/components/chip-input.tsx +0 -370
  384. package/src/components/chip-labels.ts +0 -13
  385. package/src/components/chip.tsx +0 -843
  386. package/src/components/choice-card.tsx +0 -544
  387. package/src/components/column-mapper-labels.ts +0 -38
  388. package/src/components/column-mapper.tsx +0 -655
  389. package/src/components/combobox-core.tsx +0 -1321
  390. package/src/components/combobox-suggestions.tsx +0 -131
  391. package/src/components/combobox.tsx +0 -716
  392. package/src/components/confirm-context.ts +0 -7
  393. package/src/components/confirm-dialog-labels.ts +0 -13
  394. package/src/components/confirm-dialog.tsx +0 -341
  395. package/src/components/copy-button-labels.ts +0 -13
  396. package/src/components/copy-button.tsx +0 -192
  397. package/src/components/country-select-labels.ts +0 -11
  398. package/src/components/country-select.tsx +0 -539
  399. package/src/components/currency-option-list.tsx +0 -188
  400. package/src/components/currency-select.tsx +0 -343
  401. package/src/components/danger-confirm-labels.ts +0 -20
  402. package/src/components/danger-confirm.tsx +0 -987
  403. package/src/components/data-table-cells.tsx +0 -118
  404. package/src/components/data-table-column-settings.tsx +0 -198
  405. package/src/components/data-table-filter-popover.tsx +0 -289
  406. package/src/components/data-table-filters.ts +0 -315
  407. package/src/components/data-table-fit.ts +0 -301
  408. package/src/components/data-table-groups.tsx +0 -288
  409. package/src/components/data-table-head.tsx +0 -280
  410. package/src/components/data-table-labels.ts +0 -198
  411. package/src/components/data-table-leading-row.tsx +0 -58
  412. package/src/components/data-table-mobile.tsx +0 -1117
  413. package/src/components/data-table-pagination.tsx +0 -202
  414. package/src/components/data-table-resize.ts +0 -188
  415. package/src/components/data-table-row-actions.tsx +0 -302
  416. package/src/components/data-table-row.tsx +0 -496
  417. package/src/components/data-table-selection.ts +0 -71
  418. package/src/components/data-table-shared.tsx +0 -287
  419. package/src/components/data-table-sort.ts +0 -163
  420. package/src/components/data-table-virtual.ts +0 -576
  421. package/src/components/data-table.tsx +0 -2598
  422. package/src/components/date-field.tsx +0 -684
  423. package/src/components/date-format-setting.tsx +0 -64
  424. package/src/components/date-picker.tsx +0 -404
  425. package/src/components/date-range-picker.tsx +0 -518
  426. package/src/components/description-list-labels.ts +0 -9
  427. package/src/components/description-list.tsx +0 -386
  428. package/src/components/dialog-frame-labels.ts +0 -7
  429. package/src/components/dialog-frame.tsx +0 -284
  430. package/src/components/disclosure.tsx +0 -476
  431. package/src/components/dropdown.tsx +0 -461
  432. package/src/components/empty-state.tsx +0 -136
  433. package/src/components/entity-combobox.tsx +0 -422
  434. package/src/components/error-boundary-labels.ts +0 -20
  435. package/src/components/error-boundary.tsx +0 -675
  436. package/src/components/facing-pair.ts +0 -93
  437. package/src/components/field-base-labels.ts +0 -20
  438. package/src/components/field-base.tsx +0 -656
  439. package/src/components/field-parts.tsx +0 -825
  440. package/src/components/field-strip.tsx +0 -129
  441. package/src/components/field.tsx +0 -206
  442. package/src/components/file-button.tsx +0 -295
  443. package/src/components/file-dropzone.tsx +0 -559
  444. package/src/components/floating-panel-labels.ts +0 -10
  445. package/src/components/floating-panel.tsx +0 -828
  446. package/src/components/focus-ring.ts +0 -16
  447. package/src/components/form-actions-labels.ts +0 -11
  448. package/src/components/form-actions.tsx +0 -578
  449. package/src/components/full-bleed-dialog.tsx +0 -294
  450. package/src/components/grouped-picker.tsx +0 -184
  451. package/src/components/help-popover.tsx +0 -117
  452. package/src/components/hover-menu.tsx +0 -343
  453. package/src/components/iban-input-labels.ts +0 -14
  454. package/src/components/iban-input.tsx +0 -236
  455. package/src/components/icon-button.tsx +0 -959
  456. package/src/components/icon-picker-labels.ts +0 -13
  457. package/src/components/icon-picker.tsx +0 -232
  458. package/src/components/image-grid-labels.ts +0 -11
  459. package/src/components/image-grid.tsx +0 -202
  460. package/src/components/inline-confirm.tsx +0 -116
  461. package/src/components/inline-edit-field-labels.ts +0 -11
  462. package/src/components/inline-edit-field.tsx +0 -552
  463. package/src/components/inline-entity-combobox.tsx +0 -849
  464. package/src/components/input.tsx +0 -394
  465. package/src/components/jump-calendar.tsx +0 -265
  466. package/src/components/language-select.tsx +0 -93
  467. package/src/components/legal-labels.ts +0 -105
  468. package/src/components/legal-page.tsx +0 -711
  469. package/src/components/legal.tsx +0 -668
  470. package/src/components/lightbox-labels.ts +0 -18
  471. package/src/components/lightbox.tsx +0 -399
  472. package/src/components/line-items-labels.ts +0 -14
  473. package/src/components/line-items.tsx +0 -602
  474. package/src/components/list-labels.ts +0 -12
  475. package/src/components/list.tsx +0 -870
  476. package/src/components/loading-state.tsx +0 -78
  477. package/src/components/measured-grid-labels.ts +0 -25
  478. package/src/components/measured-grid.tsx +0 -837
  479. package/src/components/menu-item.tsx +0 -241
  480. package/src/components/mini-calendar-labels.ts +0 -17
  481. package/src/components/mini-calendar.tsx +0 -792
  482. package/src/components/modal.tsx +0 -534
  483. package/src/components/money-draft.ts +0 -83
  484. package/src/components/money-field.tsx +0 -76
  485. package/src/components/month-grid.tsx +0 -229
  486. package/src/components/month-picker-labels.ts +0 -22
  487. package/src/components/month-picker.tsx +0 -1087
  488. package/src/components/multi-entity-combobox.tsx +0 -369
  489. package/src/components/multi-select.tsx +0 -376
  490. package/src/components/nav-pills.tsx +0 -198
  491. package/src/components/number-field.tsx +0 -327
  492. package/src/components/number-input.tsx +0 -559
  493. package/src/components/numeric-field.ts +0 -169
  494. package/src/components/numpad-sheet.tsx +0 -285
  495. package/src/components/one-time-code-input.tsx +0 -270
  496. package/src/components/page-contents-labels.ts +0 -9
  497. package/src/components/page-contents.tsx +0 -282
  498. package/src/components/page-header-context.ts +0 -8
  499. package/src/components/page-header.tsx +0 -298
  500. package/src/components/password-strength-labels.ts +0 -22
  501. package/src/components/password-strength.tsx +0 -241
  502. package/src/components/phone-input-labels.ts +0 -10
  503. package/src/components/phone-input.tsx +0 -282
  504. package/src/components/picker-sheet.tsx +0 -330
  505. package/src/components/pie-chart-labels.ts +0 -40
  506. package/src/components/pie-chart.tsx +0 -480
  507. package/src/components/popover-labels.ts +0 -14
  508. package/src/components/popover.tsx +0 -268
  509. package/src/components/progress-bar-labels.ts +0 -10
  510. package/src/components/progress-bar.tsx +0 -479
  511. package/src/components/qr-code.tsx +0 -76
  512. package/src/components/reauth-dialog-labels.ts +0 -13
  513. package/src/components/reauth-dialog.tsx +0 -265
  514. package/src/components/row-actions-labels.ts +0 -12
  515. package/src/components/row-actions.tsx +0 -795
  516. package/src/components/scroll-area.tsx +0 -123
  517. package/src/components/search-field.tsx +0 -192
  518. package/src/components/select.tsx +0 -294
  519. package/src/components/separator.tsx +0 -33
  520. package/src/components/series-chart-axes.ts +0 -342
  521. package/src/components/series-chart-budget.ts +0 -150
  522. package/src/components/series-chart-labels.ts +0 -33
  523. package/src/components/series-chart-thin.ts +0 -180
  524. package/src/components/series-chart-ticks.ts +0 -194
  525. package/src/components/series-chart.tsx +0 -1906
  526. package/src/components/server-wake-labels.ts +0 -11
  527. package/src/components/server-wake.tsx +0 -129
  528. package/src/components/settings-fields.tsx +0 -237
  529. package/src/components/share-card-labels.ts +0 -30
  530. package/src/components/share-card.tsx +0 -675
  531. package/src/components/signature-pad-labels.ts +0 -24
  532. package/src/components/signature-pad.tsx +0 -747
  533. package/src/components/signed-amount-labels.ts +0 -10
  534. package/src/components/signed-amount.tsx +0 -336
  535. package/src/components/skeleton.tsx +0 -80
  536. package/src/components/slider.tsx +0 -338
  537. package/src/components/sparkline-labels.ts +0 -14
  538. package/src/components/sparkline.tsx +0 -322
  539. package/src/components/spinner.tsx +0 -81
  540. package/src/components/stat-tile-labels.ts +0 -15
  541. package/src/components/stat-tile.tsx +0 -754
  542. package/src/components/status-dot.tsx +0 -170
  543. package/src/components/swatch-picker-labels.ts +0 -10
  544. package/src/components/swatch-picker.tsx +0 -283
  545. package/src/components/swipeable-row.tsx +0 -386
  546. package/src/components/switch.tsx +0 -273
  547. package/src/components/table-skeleton.tsx +0 -136
  548. package/src/components/table.tsx +0 -647
  549. package/src/components/tabs-labels.ts +0 -13
  550. package/src/components/tabs.tsx +0 -693
  551. package/src/components/text-link.tsx +0 -359
  552. package/src/components/text.tsx +0 -150
  553. package/src/components/textarea.tsx +0 -330
  554. package/src/components/tile-radio.tsx +0 -332
  555. package/src/components/time-input.tsx +0 -121
  556. package/src/components/toast-labels.ts +0 -12
  557. package/src/components/toast.tsx +0 -519
  558. package/src/components/toggle-group.tsx +0 -752
  559. package/src/components/toggle-legend.tsx +0 -394
  560. package/src/components/tooltip.tsx +0 -1149
  561. package/src/components/translation-review-editor.tsx +0 -290
  562. package/src/components/translation-review-labels.ts +0 -181
  563. package/src/components/translation-review-parts.tsx +0 -272
  564. package/src/components/translation-review.tsx +0 -1240
  565. package/src/components/tree-view.tsx +0 -589
  566. package/src/components/treemap-labels.ts +0 -47
  567. package/src/components/treemap-layout.ts +0 -210
  568. package/src/components/treemap.tsx +0 -1184
  569. package/src/components/trigger-aria.ts +0 -44
  570. package/src/components/use-anchor-dir.ts +0 -20
  571. package/src/components/use-mobile-reveal.ts +0 -62
  572. package/src/components/use-table-state.ts +0 -753
  573. package/src/components/user-avatar.tsx +0 -116
  574. package/src/components/wizard-stepper.tsx +0 -42
  575. package/src/components/write-lock-labels.ts +0 -10
  576. package/src/components/write-lock.tsx +0 -253
  577. package/src/currencies.ts +0 -90
  578. package/src/data-table.ts +0 -42
  579. package/src/demo/demo-banner.tsx +0 -153
  580. package/src/demo/demo-countdown.ts +0 -136
  581. package/src/demo/demo-ended.tsx +0 -90
  582. package/src/demo/demo-labels.ts +0 -78
  583. package/src/demo/demo-session.ts +0 -32
  584. package/src/demo/demo-start.tsx +0 -156
  585. package/src/eslint/index.ts +0 -161
  586. package/src/eslint/role-utilities.generated.ts +0 -146
  587. package/src/eslint/role-utilities.ts +0 -233
  588. package/src/feedback/feedback-attachment-download.tsx +0 -77
  589. package/src/feedback/feedback-attachment-labels.ts +0 -37
  590. package/src/feedback/feedback-attachment.tsx +0 -1239
  591. package/src/feedback/feedback-capture.ts +0 -287
  592. package/src/feedback/feedback-comment-thread.tsx +0 -353
  593. package/src/feedback/feedback-context-labels.ts +0 -11
  594. package/src/feedback/feedback-context.tsx +0 -245
  595. package/src/feedback/feedback-crash.ts +0 -547
  596. package/src/feedback/feedback-diagnostics.tsx +0 -41
  597. package/src/feedback/feedback-dialog-labels.ts +0 -29
  598. package/src/feedback/feedback-dialog.tsx +0 -452
  599. package/src/feedback/feedback-entry-file.tsx +0 -150
  600. package/src/feedback/feedback-inbox.tsx +0 -552
  601. package/src/feedback/feedback-labels.ts +0 -144
  602. package/src/feedback/feedback-menu-labels.ts +0 -12
  603. package/src/feedback/feedback-menu.tsx +0 -177
  604. package/src/feedback/feedback-mutation.ts +0 -20
  605. package/src/feedback/feedback-page-link.ts +0 -90
  606. package/src/feedback/feedback-public-labels.ts +0 -81
  607. package/src/feedback/feedback-public-list.tsx +0 -524
  608. package/src/feedback/feedback-public-switch.tsx +0 -102
  609. package/src/feedback/feedback-public-types.ts +0 -101
  610. package/src/feedback/feedback-record.ts +0 -428
  611. package/src/feedback/feedback-replies-context.ts +0 -9
  612. package/src/feedback/feedback-replies.tsx +0 -343
  613. package/src/feedback/feedback-rework-entry-chip.tsx +0 -18
  614. package/src/feedback/feedback-row-detail-labels.ts +0 -31
  615. package/src/feedback/feedback-row-detail.tsx +0 -871
  616. package/src/feedback/feedback-status-undo.ts +0 -109
  617. package/src/feedback/feedback-submit-dialog.tsx +0 -131
  618. package/src/feedback/feedback-submit.tsx +0 -270
  619. package/src/feedback/feedback-swipe.tsx +0 -192
  620. package/src/feedback/feedback-table-labels.ts +0 -27
  621. package/src/feedback/feedback-table.tsx +0 -912
  622. package/src/feedback/feedback-thread-labels.ts +0 -22
  623. package/src/feedback/feedback-thread-parts-labels.ts +0 -41
  624. package/src/feedback/feedback-thread.tsx +0 -905
  625. package/src/feedback/feedback-vocabulary.ts +0 -263
  626. package/src/feedback/feedback-vote-button.tsx +0 -124
  627. package/src/feedback.ts +0 -116
  628. package/src/hooks/use-anchored-panel.ts +0 -396
  629. package/src/hooks/use-anchored-rect.ts +0 -77
  630. package/src/hooks/use-announce.ts +0 -85
  631. package/src/hooks/use-authed-src.ts +0 -167
  632. package/src/hooks/use-body-scroll-lock.ts +0 -119
  633. package/src/hooks/use-breakpoint.ts +0 -133
  634. package/src/hooks/use-close-transition.ts +0 -107
  635. package/src/hooks/use-copy-to-clipboard.ts +0 -122
  636. package/src/hooks/use-debounce.ts +0 -114
  637. package/src/hooks/use-dismiss.ts +0 -371
  638. package/src/hooks/use-document-title.ts +0 -33
  639. package/src/hooks/use-file-drop.ts +0 -121
  640. package/src/hooks/use-file-picker-labels.ts +0 -28
  641. package/src/hooks/use-file-picker.tsx +0 -359
  642. package/src/hooks/use-focus-trap.ts +0 -199
  643. package/src/hooks/use-hotkey.ts +0 -212
  644. package/src/hooks/use-large-text.ts +0 -41
  645. package/src/hooks/use-long-press.ts +0 -140
  646. package/src/hooks/use-media-query.ts +0 -39
  647. package/src/hooks/use-mounted.ts +0 -39
  648. package/src/hooks/use-noindex.ts +0 -37
  649. package/src/hooks/use-overlay-history.ts +0 -714
  650. package/src/hooks/use-row-swipe.ts +0 -207
  651. package/src/hooks/use-search-param-state.ts +0 -434
  652. package/src/hooks/use-windowed-rows.ts +0 -225
  653. package/src/i18n/defaults.ts +0 -267
  654. package/src/i18n/german.ts +0 -2059
  655. package/src/i18n/kit-labels.tsx +0 -1003
  656. package/src/i18n/languages.ts +0 -349
  657. package/src/i18n/locales/de-CH.ts +0 -24
  658. package/src/i18n/locales/en.ts +0 -267
  659. package/src/i18n/locales/es.ts +0 -1999
  660. package/src/i18n/locales/fr.ts +0 -2037
  661. package/src/i18n/locales/hu.ts +0 -2004
  662. package/src/i18n/locales/it.ts +0 -2014
  663. package/src/i18n/locales/zh.ts +0 -1912
  664. package/src/i18n/plurals.ts +0 -86
  665. package/src/i18n/review.ts +0 -475
  666. package/src/i18n/shared-labels.ts +0 -138
  667. package/src/i18n/swiss.ts +0 -29
  668. package/src/index.ts +0 -1191
  669. package/src/landing/access.ts +0 -93
  670. package/src/landing/landing-actions.tsx +0 -97
  671. package/src/landing/landing-labels.ts +0 -59
  672. package/src/landing/landing-sections.tsx +0 -341
  673. package/src/landing/page-seo.ts +0 -261
  674. package/src/landing/public-header.tsx +0 -121
  675. package/src/landing/public-page.tsx +0 -106
  676. package/src/landing/routing.tsx +0 -225
  677. package/src/lib/broadcast.ts +0 -52
  678. package/src/lib/calc.ts +0 -323
  679. package/src/lib/chip-edge-snap.ts +0 -212
  680. package/src/lib/clipboard-minus.ts +0 -107
  681. package/src/lib/clipping.ts +0 -34
  682. package/src/lib/cn.ts +0 -28
  683. package/src/lib/column-mapping.ts +0 -234
  684. package/src/lib/countries.ts +0 -91
  685. package/src/lib/data-attributes.ts +0 -14
  686. package/src/lib/date-format.ts +0 -227
  687. package/src/lib/dates.ts +0 -288
  688. package/src/lib/day-format.ts +0 -96
  689. package/src/lib/decimal-marks.ts +0 -108
  690. package/src/lib/describe-failure.ts +0 -18
  691. package/src/lib/device-settings.ts +0 -147
  692. package/src/lib/direction.ts +0 -74
  693. package/src/lib/document-navigation.ts +0 -17
  694. package/src/lib/document-title.ts +0 -41
  695. package/src/lib/download.ts +0 -172
  696. package/src/lib/float-clearance.ts +0 -70
  697. package/src/lib/floating-stack.ts +0 -70
  698. package/src/lib/focus-left.ts +0 -156
  699. package/src/lib/format.ts +0 -585
  700. package/src/lib/http-status.ts +0 -38
  701. package/src/lib/iban.ts +0 -251
  702. package/src/lib/ime.ts +0 -24
  703. package/src/lib/intl-cache.ts +0 -27
  704. package/src/lib/iso-day.ts +0 -13
  705. package/src/lib/lazy-with-fallback.ts +0 -82
  706. package/src/lib/logger.ts +0 -69
  707. package/src/lib/minus.ts +0 -50
  708. package/src/lib/path-pattern.ts +0 -55
  709. package/src/lib/person-name.ts +0 -155
  710. package/src/lib/phone.ts +0 -208
  711. package/src/lib/plain-text.ts +0 -22
  712. package/src/lib/presence.ts +0 -18
  713. package/src/lib/qr-encode.ts +0 -444
  714. package/src/lib/quiet-focus.ts +0 -32
  715. package/src/lib/reduced-motion.ts +0 -22
  716. package/src/lib/refs.ts +0 -22
  717. package/src/lib/round.ts +0 -43
  718. package/src/lib/safe-storage.ts +0 -119
  719. package/src/lib/server-wake.ts +0 -315
  720. package/src/lib/session-refresh.ts +0 -472
  721. package/src/lib/share-format.ts +0 -18
  722. package/src/lib/status-tone.ts +0 -43
  723. package/src/lib/strip-fade.ts +0 -287
  724. package/src/lib/table-text.ts +0 -554
  725. package/src/lib/text-case.ts +0 -19
  726. package/src/lib/text-match.ts +0 -169
  727. package/src/lib/thenable.ts +0 -19
  728. package/src/lib/translation-review.ts +0 -769
  729. package/src/notifications/device-zone-report.ts +0 -67
  730. package/src/notifications/feedback-notification-types-labels.ts +0 -33
  731. package/src/notifications/feedback-notification-types.ts +0 -71
  732. package/src/notifications/notification-bell.tsx +0 -119
  733. package/src/notifications/notification-inbox.tsx +0 -309
  734. package/src/notifications/notification-parts.tsx +0 -81
  735. package/src/notifications/notification-types-setting.tsx +0 -406
  736. package/src/notifications/notification-types.ts +0 -89
  737. package/src/notifications/notifications-labels.ts +0 -287
  738. package/src/notifications/push-device-setting.tsx +0 -230
  739. package/src/notifications/push-devices-setting.tsx +0 -374
  740. package/src/notifications/push-worker.ts +0 -168
  741. package/src/notifications/quiet-hours-setting.tsx +0 -238
  742. package/src/notifications/unsubscribe-panel.tsx +0 -200
  743. package/src/notifications/use-push-device.ts +0 -448
  744. package/src/offline/local-first.ts +0 -100
  745. package/src/offline/pwa-update-prompt-labels.ts +0 -9
  746. package/src/offline/pwa-update-prompt.tsx +0 -78
  747. package/src/offline/query-persistence.ts +0 -391
  748. package/src/offline/service-worker-updates.ts +0 -81
  749. package/src/offline/shared-computer-labels.ts +0 -8
  750. package/src/offline/shared-computer.tsx +0 -87
  751. package/src/offline/sign-out-pending-dialog-labels.ts +0 -21
  752. package/src/offline/sign-out-pending-dialog.tsx +0 -135
  753. package/src/offline.ts +0 -37
  754. package/src/push-worker.ts +0 -25
  755. package/src/rhf/fields.tsx +0 -2187
  756. package/src/rhf/form-core.tsx +0 -324
  757. package/src/rhf/form.tsx +0 -12
  758. package/src/rhf/line-items.tsx +0 -135
  759. package/src/rhf/use-rhf-wizard-step.ts +0 -104
  760. package/src/rhf.ts +0 -21
  761. package/src/search/command-palette-labels.ts +0 -16
  762. package/src/search/command-palette.tsx +0 -624
  763. package/src/search/global-search-labels.ts +0 -13
  764. package/src/search/global-search.tsx +0 -660
  765. package/src/search/search-index.ts +0 -283
  766. package/src/search/use-command-key.ts +0 -23
  767. package/src/search.ts +0 -14
  768. package/src/settings/device-reset-setting-labels.ts +0 -20
  769. package/src/settings/device-reset-setting.tsx +0 -116
  770. package/src/settings/settings-card-classes.ts +0 -11
  771. package/src/settings/settings-catalogue.ts +0 -150
  772. package/src/settings/settings-context.ts +0 -33
  773. package/src/settings/settings-heading.tsx +0 -67
  774. package/src/settings/settings-labels.ts +0 -87
  775. package/src/settings/settings-layout.tsx +0 -471
  776. package/src/settings/settings-section.tsx +0 -108
  777. package/src/settings/use-account-appearance.ts +0 -148
  778. package/src/settings/use-account-language.ts +0 -146
  779. package/src/settings/use-settings-focus.ts +0 -128
  780. package/src/settings/use-settings-route.ts +0 -258
  781. package/src/shell/account-menu-language.tsx +0 -130
  782. package/src/shell/account-menu-text-size.tsx +0 -80
  783. package/src/shell/admin-menu.tsx +0 -183
  784. package/src/shell/app-shell-labels.ts +0 -11
  785. package/src/shell/app-shell.tsx +0 -1560
  786. package/src/shell/auth-layout.tsx +0 -186
  787. package/src/shell/company-switcher-labels.ts +0 -13
  788. package/src/shell/company-switcher.tsx +0 -136
  789. package/src/shell/dev-menu.tsx +0 -257
  790. package/src/shell/fill-height.tsx +0 -45
  791. package/src/shell/language-code.ts +0 -5
  792. package/src/shell/option-switcher-menu.tsx +0 -84
  793. package/src/shell/sync-status-indicator.tsx +0 -303
  794. package/src/shell/top-bar-actions.tsx +0 -87
  795. package/src/shell/top-bar-brand.tsx +0 -78
  796. package/src/shell/top-bar-parts-labels.ts +0 -148
  797. package/src/shell/top-bar.tsx +0 -40
  798. package/src/shell/topbar-action-menu.tsx +0 -567
  799. package/src/shell/topbar-controls.tsx +0 -269
  800. package/src/shell/tour-menu.tsx +0 -187
  801. package/src/shell.ts +0 -108
  802. package/src/sync/db.ts +0 -129
  803. package/src/sync/engine.ts +0 -1011
  804. package/src/sync/hooks.ts +0 -98
  805. package/src/sync/testing.ts +0 -73
  806. package/src/sync/wire.ts +0 -61
  807. package/src/sync.ts +0 -37
  808. package/src/table-text.ts +0 -8
  809. package/src/testing/css-variables.generated.ts +0 -112
  810. package/src/testing/css-variables.ts +0 -189
  811. package/src/testing/index.ts +0 -29
  812. package/src/testing/react.ts +0 -58
  813. package/src/testing/tour.ts +0 -41
  814. package/src/testing/viewport.ts +0 -357
  815. package/src/theme/chart-palette.ts +0 -232
  816. package/src/theme/color.ts +0 -272
  817. package/src/theme/contrast-tokens.ts +0 -268
  818. package/src/theme/contrast.ts +0 -250
  819. package/src/theme/palette-derive.ts +0 -825
  820. package/src/theme/palette-presets.ts +0 -544
  821. package/src/theme/palette-store.ts +0 -108
  822. package/src/theme/text-size.ts +0 -289
  823. package/src/theme/theme-store.ts +0 -157
  824. package/src/tour/tour-catalogue-labels.ts +0 -75
  825. package/src/tour/tour-catalogue.tsx +0 -335
  826. package/src/tour/tour-dock.ts +0 -134
  827. package/src/tour/tour-engine.ts +0 -37
  828. package/src/tour/tour-gates.ts +0 -218
  829. package/src/tour/tour-guide-button.tsx +0 -64
  830. package/src/tour/tour-guide-labels.ts +0 -15
  831. package/src/tour/tour-info.ts +0 -144
  832. package/src/tour/tour-labels.ts +0 -23
  833. package/src/tour/tour-overlay.tsx +0 -1170
  834. package/src/tour/tour.tsx +0 -750
  835. package/src/tour/use-tour-progress.ts +0 -671
  836. package/src/tour/use-tour-url-sync.ts +0 -266
  837. package/src/tour.ts +0 -21
  838. package/src/vite-env.d.ts +0 -23
  839. package/src/wizard/stepper-nav.tsx +0 -360
  840. package/src/wizard/types.ts +0 -275
  841. package/src/wizard/use-wizard.ts +0 -560
  842. package/src/wizard/validation.ts +0 -39
  843. package/src/wizard/wizard-context.tsx +0 -74
  844. package/src/wizard/wizard-labels.ts +0 -29
  845. package/src/wizard/wizard-step.tsx +0 -76
  846. package/src/wizard/wizard-summary.tsx +0 -84
  847. package/src/wizard.ts +0 -15
@@ -1,849 +0,0 @@
1
- // The id-keyed sibling of Combobox. Moved out of combobox.tsx as it was (MOD-9,
2
- // refactor audit 2026-10); combobox still exports `InlineEntityCombobox` and its props.
3
- import { useId, useMemo, useRef, useState } from "react";
4
- import type { ComponentPropsWithoutRef, KeyboardEvent, ReactNode, Ref } from "react";
5
- import { ChevronDown, Plus, X } from "lucide-react";
6
- import { FIELD_BASE, FIELD_FLOATING_PAD, FIELD_INVALID } from "./field-base";
7
- import { cn } from "../lib/cn";
8
- import { useDropdown } from "./dropdown";
9
- import { claimEscape, takeEscape, useDismissLayer } from "../hooks/use-dismiss";
10
- import { isImeEnter } from "../lib/ime";
11
- import { isQuietFocus } from "../lib/quiet-focus";
12
- import { usePhoneLayout } from "../hooks/use-breakpoint";
13
- import { PickerSheet, SHEET_ROW_CLASS } from "./picker-sheet";
14
- import {
15
- anchoredHeadingClass,
16
- ComboboxFieldLabel,
17
- DISABLED_ROW_CLASS,
18
- endHintRowProps,
19
- GroupedOptions,
20
- groupRuns,
21
- isOptionEnabled,
22
- offersCreate,
23
- SHEET_HEADING_CLASS,
24
- stepEnabled,
25
- useTypedListStatus,
26
- type ComboClearValue,
27
- type ComboOption,
28
- } from "./combobox-core";
29
- import { DEFAULT_COMBOBOX_LABELS, useKitLabels, useKitLocale } from "../i18n/kit-labels";
30
- import { sameName, searchRanked } from "../lib/text-match";
31
- import {
32
- EndHintRow,
33
- FieldCaption,
34
- LABEL_IN_ROW,
35
- LockedReason,
36
- mergeDescribedBy,
37
- StaticLabelRow,
38
- useFieldError,
39
- useFieldHint,
40
- useLockReason,
41
- type DisabledReasonDisplay,
42
- type FieldHelpProps,
43
- } from "./field-parts";
44
- import { hasContent } from "../lib/presence";
45
- import { useCommitReason, type CommitScope } from "./write-lock";
46
- import { lockedKeyDown, rowClass, SuggestionList, usePrimaryPressOnly } from "./combobox-suggestions";
47
-
48
- /** {@link InlineEntityCombobox}'s create row over the shared row look: in the brand
49
- * colour {@link Combobox}'s own create row wears, with a leading "+" as the panel
50
- * pickers' has — an action at the foot of the list, not one more record. */
51
- const CREATE_ROW_CLASS = "flex items-center gap-2 font-medium text-brand";
52
-
53
- /** `id` is the INPUT's and `onChange` is the field's — see {@link ComboboxProps}
54
- * for why the div's spellings of them are omitted. */
55
- export interface InlineEntityComboboxProps<V extends string | number, C extends ComboClearValue = null>
56
- extends Omit<ComponentPropsWithoutRef<"div">, "id" | "onChange">, FieldHelpProps {
57
- /** Selected option id; `null` or `clearValue` when nothing is selected. */
58
- value: V | C | null;
59
- /** Required and unanswered — see {@link Combobox}'s `invalid`. */
60
- invalid?: boolean;
61
- /** What is wrong with the value — see {@link Combobox}'s `error`. */
62
- error?: ReactNode;
63
- /** Standing advice — see {@link Combobox}'s `hint` (keksdose K4). */
64
- hint?: ReactNode;
65
- /** A picked/typed option emits its id; emptying the field, or the "×", emits
66
- * `clearValue`. */
67
- onChange: (v: V | C) => void;
68
- /** What a clear emits — `null` by default, `""` for a schema that wants an empty
69
- * string. See {@link EntityCombobox}'s `clearValue`. */
70
- clearValue?: C;
71
- options: readonly ComboOption<V>[];
72
- /** The visible label — see {@link Combobox}'s `label` (a ReactNode since 0.34, API-9). */
73
- label?: ReactNode;
74
- id?: string;
75
- placeholder?: string;
76
- className?: string;
77
- disabled?: boolean;
78
- /** Focus on mount, the way `<input autoFocus>` does — and, through `onFocus`
79
- * below, open the list with it. A click-the-value editor needs it: the cell
80
- * the user clicked names the field the editor should land the caret in, and
81
- * without a passthrough this component's fixed prop list puts the `<input>`
82
- * out of a caller's reach entirely (Keksdose feedback live #218). */
83
- autoFocus?: boolean;
84
- /** Phone sheet only — the anchored list has the field itself to type in. Falls
85
- * back to `placeholder`, then to `combobox.search` from the {@link UiKitProvider}. */
86
- searchPlaceholder?: string;
87
- /** What a query that finds nothing says: on the phone sheet, where a full screen
88
- * showing nothing has to say why, and in the field's live status (0.52) — the anchored
89
- * list itself simply does not open. Default: `combobox.noResults` from the provider. */
90
- emptyLabel?: string;
91
- closeLabel?: string;
92
- /** The phone sheet's heading (and, as a string, its accessible name) for a field
93
- * whose label is drawn by someone else — a bound field's label;
94
- * `RhfInlineEntityCombobox` hands its label over here (0.24). Default: `label`.
95
- * See {@link Combobox}'s `sheetTitle`. */
96
- sheetTitle?: ReactNode;
97
- /** Offer a clear "×" in place of the chevron whenever something is selected.
98
- *
99
- * Emptying the text already clears (see {@link reconcile}), and on a desktop that
100
- * is the fast way. It is not a way at all on a PHONE: touching the field opens the
101
- * full-screen sheet, which covers the very input the text would have been deleted
102
- * from — so a field that had been answered could not be UNanswered by any gesture
103
- * the screen offered (Keksdose live #236, filed from a phone). The "×" is the one
104
- * affordance both shells share, and it clears without opening anything. */
105
- clearable?: boolean;
106
- clearLabel?: string;
107
- /**
108
- * Why the choice cannot be changed — {@link Button}'s `disabledReason`, for a picker
109
- * that SAVES on change. keksdose G2: the statement review's account picker IS the
110
- * write (picking re-runs the duplicate check on the server), and on the read-only demo
111
- * the app wrapped it in a hand-made Tooltip over a native `disabled` — out of the tab
112
- * order, so the reason never reached a keyboard.
113
- *
114
- * With a reason the input stays focusable and `aria-disabled`, is `readOnly` (the
115
- * settled grey), opens no list or sheet, offers no clear "×", and no pick, typed
116
- * label or clear reaches `onChange`; the reason is in the kit {@link Tooltip} and on
117
- * the input's `aria-describedby`. Wins over `disabled`. Use it CONTROLLED, as the
118
- * component always is: the shown label is `value`'s.
119
- */
120
- disabledReason?: ReactNode;
121
- /**
122
- * This picker COMMITS — choosing saves. Under a locked {@link WriteLockProvider} it is
123
- * locked the `disabledReason` way with the lock's reason (which wins over its own).
124
- * A picker inside a form with its own Save stays editable under the lock — leave this
125
- * off there and put `commit` on the Save. No provider, or an unlocked one: no effect.
126
- */
127
- commit?: CommitScope;
128
- /** Where the reason shows — {@link Button}'s `disabledReasonDisplay`: a line under the
129
- * field at Large and on a touch screen by default, the tooltip otherwise (DUP-3). */
130
- disabledReasonDisplay?: DisabledReasonDisplay;
131
- /**
132
- * A last row that makes a new record from what was typed — keksdose G9, whose "Create
133
- * cash account" had to become a separate button because this picker had no such row.
134
- *
135
- * Shown while the typed query is non-empty and names no option exactly
136
- * (case-insensitive — an exact hit is a record the list already shows), worded
137
- * `createLabel(query)`, default `combobox.create`: "Create “{query}”". The arrow keys
138
- * reach it like an option; Enter or a click calls `onCreate(query)` and closes the
139
- * list. Making the record, and then passing its id as `value`, is the caller's: the
140
- * field shows the old selection until it does.
141
- *
142
- * The same rule as {@link EntityCombobox}'s `onCreate`, so the family agrees. It is a
143
- * row of the LIST, not an option: it is never `aria-selected`, never matched by a
144
- * typed label on blur, and never sorted among the records the way a sentinel option
145
- * would be (the reason keksdose gave for the separate button).
146
- */
147
- onCreate?: (query: string) => void;
148
- /** The create row's words for a query. Default: `combobox.create` from the
149
- * {@link UiKitProvider}, else English `Create “{query}”`. */
150
- createLabel?: (query: string) => string;
151
- /**
152
- * Offer the create row with NOTHING typed too, worded as this — keksdose's "Create cash
153
- * account", which mints an account under a default name and so needs no query.
154
- * `onCreate` then receives `""`, and the caller supplies the name. Left out, the row
155
- * needs a query.
156
- *
157
- * One string rather than a switch: a row with no query has nothing to quote, so the
158
- * kit cannot word it — "Create “”" says nothing — and naming it is what turns it on.
159
- * With both, one handler serves both rows:
160
- *
161
- * ```tsx
162
- * onCreate={(name) => createCash(name || t("cash_account_default_name"))}
163
- * createEmptyLabel={t("create_cash_account")}
164
- * ```
165
- */
166
- createEmptyLabel?: string;
167
- /**
168
- * The create row WRITES while picking does not — keksdose dev#496: on the read-only
169
- * demo choosing the cash account is draft state and stays live, minting one is a
170
- * write. Under a locked {@link WriteLockProvider} the row stays in the list, dimmed and
171
- * passed over by the arrows, with the lock's reason as its second line (a hover is the
172
- * one explanation a phone cannot show), and `onCreate` is not called. Not needed with
173
- * `commit`: a locked field opens no list at all.
174
- */
175
- createCommit?: CommitScope;
176
- /**
177
- * The `<input>` — the focusable control, the one a reader types in — as a React 19
178
- * ref prop (0.24, kastlan). Its account picker is this component inside an
179
- * `RhfField` render, and react-hook-form's focus-on-error calls `focus()` on whatever
180
- * `field.ref` is handed: with no ref there was nothing to hand it, so a line-item form
181
- * whose account was missing failed its submit and left the caret where it was. Pass
182
- * `field.ref` here, or use `RhfInlineEntityCombobox`, which does. The wrapper is not
183
- * reachable this way — focus and selection are the input's. See {@link Combobox}'s `ref`.
184
- */
185
- ref?: Ref<HTMLInputElement>;
186
- }
187
-
188
- /**
189
- * The id-keyed sibling of {@link Combobox}: identical anatomy (a real text input
190
- * with the shared field styling, chevron and inline as-you-type filtering) but
191
- * the value is an option id, not free text. Built so an entity picker can sit
192
- * next to a free-text combobox without any visible difference — a button-trigger
193
- * panel picker ({@link EntityCombobox}) never matches an input field exactly.
194
- *
195
- * Text-vs-value reconciliation: the input's text is transient. Picking a row or
196
- * typing an exact (unique) label commits that option; emptying the text commits
197
- * a clear; anything else reverts to the selected option's label on blur/Escape.
198
- *
199
- * **On a phone the list opens as a full-screen sheet**, exactly like {@link Combobox}
200
- * beside it (Keksdose live #200, extended by dev#477 — the account picker moved onto
201
- * this component and must not lose its sheet). The sheet carries its OWN query state
202
- * rather than reusing `text`: `text` is what {@link reconcile} judges on blur, so a
203
- * sheet that emptied it to show the full list would read as "the user cleared the
204
- * field" the moment it closed.
205
- */
206
- export function InlineEntityCombobox<V extends string | number, C extends ComboClearValue = null>(
207
- props: InlineEntityComboboxProps<V, C>,
208
- ) {
209
- const {
210
- value: rawValue,
211
- onChange,
212
- clearValue = null as C,
213
- options,
214
- label,
215
- id,
216
- placeholder,
217
- className,
218
- disabled,
219
- autoFocus,
220
- searchPlaceholder,
221
- emptyLabel,
222
- closeLabel,
223
- sheetTitle,
224
- clearable,
225
- clearLabel,
226
- disabledReason,
227
- disabledReasonDisplay,
228
- commit,
229
- onCreate,
230
- createLabel,
231
- createEmptyLabel,
232
- createCommit,
233
- invalid,
234
- error,
235
- hint,
236
- help,
237
- ref,
238
- "aria-label": ariaLabel,
239
- // Off `rest` and onto the <input>, which is the combobox a reader meets: `Field`'s
240
- // render-prop spreads `{ id, aria-describedby, aria-invalid, aria-required }`, and
241
- // on the wrapper div the hint and required state described nothing.
242
- "aria-describedby": ariaDescribedBy,
243
- "aria-invalid": ariaInvalid,
244
- "aria-required": ariaRequired,
245
- ...rest
246
- } = props;
247
- // The clear value reads as "nothing selected", whichever one the caller picked —
248
- // so from here down `value` is the id or `null`, as it always was.
249
- const value: V | null = rawValue == null || rawValue === clearValue ? null : (rawValue as V);
250
- const hintParts = useFieldHint(hint, ariaDescribedBy, { help, name: label ?? ariaLabel });
251
- const field = useFieldError(error, invalid, hintParts.describedBy, ariaInvalid);
252
- const generated = useId();
253
- const fieldId = id ?? generated;
254
- // See the twin above on why these hang off the generated id.
255
- const listboxId = `${generated}-listbox`;
256
- const optionId = (index: number) => `${generated}-option-${index}`;
257
- const isPhone = usePhoneLayout();
258
- // See the twin above: the phone sheet owns its own Back entry (live #309), and the
259
- // Escape layer is this field's own.
260
- const { open, setOpen, wrapperRef, panelRef } = useDropdown({ backCloses: !isPhone, escapeLayer: false });
261
- const primaryOnly = usePrimaryPressOnly();
262
- // The field took the tour's quiet focus (§11.8) and has not opened since.
263
- const quietRef = useRef(false);
264
- const [active, setActive] = useState(-1);
265
- // null = not editing → the input shows the selected option's label.
266
- const [text, setText] = useState<string | null>(null);
267
- const sheetInputRef = useRef<HTMLInputElement | null>(null);
268
- // The box the portalled list hangs off — see {@link SuggestionList}.
269
- const fieldRef = useRef<HTMLDivElement>(null);
270
- // The sheet's search box. Starts empty on every open, so a field that already
271
- // holds a value still offers the whole list — the shape a native <select> has
272
- // on a phone, and what the anchored panel gets from `query` below.
273
- const [sheetQuery, setSheetQuery] = useState("");
274
- // Props first, provider second — see `EntityCombobox`. `emptyLabel` used to render
275
- // nothing when omitted, which left a phone user staring at a blank full-screen
276
- // sheet; now an omitted one says "No results" in the provider's language.
277
- const labels = useKitLabels("combobox", DEFAULT_COMBOBOX_LABELS, {
278
- search: searchPlaceholder,
279
- noResults: emptyLabel,
280
- clear: clearLabel,
281
- create: createLabel,
282
- });
283
- // The lock (see `lockedKeyDown` above). A lock arriving mid-edit closes the list and
284
- // drops the loose text, adjusted while rendering: nothing typed before it may be
285
- // judged by `reconcile` after it.
286
- const lock = useLockReason(commit, disabledReason);
287
- const locked = lock.locked;
288
- const inert = locked || Boolean(disabled);
289
- if (locked && (open || text !== null)) {
290
- setOpen(false);
291
- setText(null);
292
- }
293
- // The create row's own lock (`createCommit`): the list stays live, the row does not.
294
- const createReason = useCommitReason(createCommit, undefined);
295
- const createLocked = hasContent(createReason);
296
-
297
- const selected = useMemo(
298
- () => (value == null ? null : (options.find((o) => o.value === value) ?? null)),
299
- [options, value],
300
- );
301
- const shown = text ?? selected?.label ?? "";
302
- // Nothing selected has nothing to clear, and the chevron comes back — the field
303
- // keeps exactly one trailing control, so the "×" never crowds the value it sits on.
304
- const showClear = Boolean(clearable && value != null && !inert);
305
-
306
- // Focusing select-alls the current label; filtering only kicks in once the
307
- // text actually differs from it, so an already-filled field still opens on
308
- // the FULL list instead of a single-row "filter" of its own value.
309
- const typedQuery = text !== null && text !== (selected?.label ?? "") ? text.trim() : "";
310
- const query = isPhone ? sheetQuery.trim() : typedQuery;
311
- // Folded as every kit list folds (DUP-5): accents off and the locale's case, so
312
- // "zurich" finds Zürich and, in Turkish, "ı" finds "IRMAK".
313
- const locale = useKitLocale();
314
- const matches = useMemo(() => {
315
- let ranked = options;
316
- if (query) {
317
- // Every word of the query, in the label or the sublabel (0.51.4). The label's whole
318
- // name or its start first (rank 0 and 1), then a match anywhere in the label or the
319
- // sublabel; a stable sort keeps the options' order within each. Not the group
320
- // (0.40, kk run 79): with first-letter groups one typed letter matched its whole
321
- // group. Each option folded once (`searchRanked`).
322
- ranked = searchRanked(options, query, (o) => [o.label, o.sublabel], { locale })
323
- .sort((a, b) => Number(a.rank > 1) - Number(b.rank > 1))
324
- .map((x) => x.row);
325
- }
326
- if (!ranked.some((o) => o.group)) return ranked;
327
- // Keep each group contiguous so the headings below appear once instead of
328
- // re-appearing every time the ranking interleaves two groups — while preserving
329
- // "best match first": a Map keeps insertion order, so groups come out ordered by
330
- // their best-ranked member and members keep their rank order inside the group.
331
- const blocks = new Map<string, ComboOption<V>[]>();
332
- for (const o of ranked) {
333
- const key = o.group ?? "";
334
- if (!blocks.has(key)) blocks.set(key, []);
335
- blocks.get(key)!.push(o);
336
- }
337
- return [...blocks.values()].flat();
338
- }, [options, query, locale]);
339
-
340
- // The create row (`onCreate`), on the query as typed — not lowercased: it becomes a
341
- // name. Compared against EVERY option, not `matches`: an exact hit anywhere is a
342
- // record that exists, disabled or not. Restated from `text` rather than derived from
343
- // `typedQuery`: this value is handed to the caller's `onCreate`, and the React
344
- // Compiler cannot then keep `matches` memoised on anything it was derived from.
345
- const createQuery = isPhone
346
- ? sheetQuery.trim()
347
- : text !== null && text !== (selected?.label ?? "")
348
- ? text.trim()
349
- : "";
350
- const showCreate = offersCreate(
351
- onCreate,
352
- createQuery,
353
- options.map((o) => o.label),
354
- createEmptyLabel,
355
- locale,
356
- );
357
- const createText = createQuery ? labels.create(createQuery) : createEmptyLabel;
358
- // Every row the keyboard can land on: the options, then the create row — passed over
359
- // like a disabled option while a write lock holds it.
360
- const rows: readonly { disabled?: boolean }[] = showCreate ? [...matches, { disabled: createLocked }] : matches;
361
- const createIndex = matches.length;
362
-
363
- const close = () => {
364
- setOpen(false);
365
- setActive(-1);
366
- setSheetQuery("");
367
- };
368
- // Whether a list shows, the row the keyboard is on — in the anchored list or the phone
369
- // sheet, whose search box takes the same keys (INP-6) — and the live status, as
370
- // Combobox has them. A disabled row is never the keyboard's, even if the list changed
371
- // under it.
372
- const { showing, expanded, activeOption, statusRegion } = useTypedListStatus({
373
- isPhone,
374
- open,
375
- inert,
376
- rowCount: matches.length,
377
- extraRow: showCreate,
378
- query,
379
- active: isOptionEnabled(rows[active]) ? active : -1,
380
- optionId,
381
- labels,
382
- });
383
- // A layer while the list SHOWS, and Escape puts the label back.
384
- useDismissLayer(showing, () => {
385
- setText(null);
386
- close();
387
- });
388
- const take = (o: ComboOption<V>) => {
389
- // A `disabled` option is listed, never taken — by any path; nor is anything while
390
- // the field is locked.
391
- if (o.disabled || locked) return;
392
- if (o.value !== value) onChange(o.value);
393
- setText(null);
394
- close();
395
- };
396
- /** Turn loose text into a decision: empty clears, an exact label match that names
397
- * ONE entity commits, anything else reverts to the selected label.
398
- *
399
- * Unique by VALUE, not by row. An option may deliberately appear twice — Keksdose
400
- * repeats recently-used categories in a "Recent" group at the top (live #203) — and
401
- * counting rows made every such option uncommittable: two hits, so nothing fired and
402
- * the field reverted to whatever was selected before. Typing a category you had just
403
- * used, then tabbing away, silently discarded it, and the more categories you used
404
- * the more of them stopped working. Two rows naming the same id are not an ambiguity;
405
- * two ids sharing a label are. */
406
- const create = () => {
407
- if (!onCreate || locked || createLocked) return;
408
- onCreate(createQuery);
409
- setText(null);
410
- close();
411
- };
412
- // The ONE option a name typed out in full names, else null. A disabled option's label
413
- // is not a hit — typing it is not a way round `disabled` — and a label is typed out in
414
- // full as the list matches it, so "cafe" names Café (DUP-5).
415
- const exactHit = (q: string): ComboOption<V> | null => {
416
- const hits = options.filter((o) => !o.disabled && sameName(o.label, q, locale));
417
- return new Set(hits.map((h) => h.value)).size === 1 ? hits[0] : null;
418
- };
419
- const reconcile = () => {
420
- // Locked, loose text is dropped rather than judged: nothing reaches `onChange`.
421
- if (text !== null && !locked) {
422
- const q = text.trim();
423
- if (!q) {
424
- if (value != null) onChange(clearValue);
425
- } else {
426
- // Anything but a hit reverts, like any other non-answer.
427
- const hit = exactHit(q);
428
- if (hit && hit.value !== value) onChange(hit.value);
429
- }
430
- }
431
- setText(null);
432
- close();
433
- };
434
- // The phone sheet's way out — the X, Escape, Back — keeps the value and judges nothing.
435
- // Not `reconcile`: on a phone `text` is never typed in (the sheet's own box is), so it
436
- // only holds what the field showed at focus, and that is "" for a value whose option
437
- // has not loaded yet — judged, it read as "the user emptied the field" and the X
438
- // cleared the answer (0.52 code review, inline-entity-combobox.tsx).
439
- const dismissSheet = () => {
440
- setText(null);
441
- close();
442
- };
443
-
444
- /** The list's keys — in the field and, on a phone, in the sheet's search box (INP-6).
445
- * Disabled rows are passed over; Up from "nothing highlighted" lands on the first
446
- * takeable row, as it always landed on row 0. The create row is the last row the
447
- * arrows reach. */
448
- const listKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {
449
- if (e.key === "ArrowDown") {
450
- e.preventDefault();
451
- setOpen(true);
452
- setActive((i) => stepEnabled(rows, i, 1));
453
- } else if (e.key === "ArrowUp") {
454
- e.preventDefault();
455
- setActive((i) => (i < 0 ? stepEnabled(rows, -1, 1) : stepEnabled(rows, i, -1)));
456
- } else if (e.key === "Enter") {
457
- // An IME's Enter takes nothing, and judges no loose text (BUG-9).
458
- if (isImeEnter(e)) return;
459
- if (open && isOptionEnabled(rows[active])) {
460
- e.preventDefault();
461
- if (active === createIndex && showCreate) create();
462
- else take(matches[active]);
463
- } else if (isPhone) {
464
- // The sheet's search box: its QUERY is what was typed, and a name typed out in
465
- // full is taken, as the desktop field takes it. Anything else leaves the sheet
466
- // and its search as they are — the panel pickers' sheet does the same. This was
467
- // `reconcile`, which judged the field's text from before the sheet opened and
468
- // closed: the search was thrown away and "Groceries" typed out was not taken
469
- // (0.52 code review, inline-entity-combobox.tsx).
470
- const hit = exactHit(sheetQuery.trim());
471
- if (hit) {
472
- e.preventDefault();
473
- take(hit);
474
- }
475
- } else {
476
- reconcile();
477
- }
478
- }
479
- };
480
-
481
- // The create row's inside, one for both shells: a "+" (it is an action, not a record),
482
- // the words, and — while a write lock holds it — the lock's reason as a second line.
483
- // Both lines wrap from Large up (text size §10.17, round 0.34 T1): the words hold what
484
- // the reader typed, which an ellipsis would cut.
485
- const createRowContent = (
486
- <>
487
- <Plus aria-hidden className="size-4 shrink-0" />
488
- <span className="min-w-0 flex-1">
489
- <span className="block truncate-until-large">{createText}</span>
490
- {createLocked && (
491
- <span className="block truncate-until-large text-xs font-normal text-placeholder">{createReason}</span>
492
- )}
493
- </span>
494
- </>
495
- );
496
- // While locked the field sits in the reason's Tooltip — see Combobox.
497
- const withLock = (box: ReactNode) =>
498
- locked ? (
499
- <LockedReason lock={lock} display={disabledReasonDisplay} className="block">
500
- {box}
501
- </LockedReason>
502
- ) : (
503
- box
504
- );
505
-
506
- /** The rows in their runs, each group a `role="group"` its heading names (INP-8), for
507
- * the sheet or the anchored list — a group heading at each boundary rather than the
508
- * group on every row (feedback #136). `matches` is group-contiguous, so comparing with
509
- * the row above is enough. An option may deliberately appear in two groups (see
510
- * `reconcile`): a value is a row's key within its group. */
511
- const groupedRows = (sheet: boolean, row: (o: ComboOption<V>, i: number) => ReactNode) => (
512
- <GroupedOptions
513
- runs={groupRuns(matches, (o) => o.group)}
514
- listboxId={listboxId}
515
- rowKey={(o) => String(o.value)}
516
- row={row}
517
- headingClassName={(run) => (sheet ? SHEET_HEADING_CLASS : anchoredHeadingClass(run))}
518
- />
519
- );
520
-
521
- return (
522
- // `rest` dresses the outer box — a `data-tour` anchor, a test id. Not the NAME,
523
- // description, invalid or required state: those belong on the <input> below,
524
- // which is the combobox a reader meets. Spread FIRST, so the field's ARIA and the
525
- // handlers carrying live #309 and dev#549 cannot be replaced from outside.
526
- <div {...rest} ref={wrapperRef} className={cn("relative", className)}>
527
- {/* A real <label for> — see {@link Combobox}; with a "?", in a row after the field. */}
528
- {label !== undefined && hintParts.labelHint === undefined && (
529
- <ComboboxFieldLabel htmlFor={fieldId} className={inert ? "opacity-50" : undefined}>
530
- {label}
531
- </ComboboxFieldLabel>
532
- )}
533
- <EndHintRow {...endHintRowProps("hint" in props, label !== undefined, hintParts.labelHint)}>
534
- {withLock(
535
- /* Inner wrapper for chevron centering — same reasoning as Combobox above.
536
- It is also what the portalled list anchors to.
537
- Dimmed as a whole when disabled (or locked), the way EntityCombobox dims its
538
- trigger. FIELD_BASE's grey alone left a disabled picker looking like a
539
- filled-in one beside the pickers that do dim (the label is not the input's
540
- `peer`, so it is dimmed by hand above). */
541
- <div ref={fieldRef} className={cn("relative", inert && "cursor-not-allowed opacity-50")}>
542
- <input
543
- ref={ref}
544
- id={fieldId}
545
- value={shown}
546
- placeholder={placeholder}
547
- // The caller's name, over the <label for> above. Just the label, never
548
- // "label: value" the way a trigger button has to compose it: an input
549
- // already exposes its value separately.
550
- aria-label={ariaLabel}
551
- role="combobox"
552
- aria-expanded={expanded}
553
- // Required by the role, and the half that was missing: the field said it
554
- // was expanded and never said what it had expanded (ESLint's
555
- // `role-has-required-aria-props`, the audit's §a11y).
556
- aria-controls={listboxId}
557
- // Pointer-device only: on a phone the sheet's own search box holds focus
558
- // and names the row; the field behind it must not claim one.
559
- aria-activedescendant={isPhone ? undefined : activeOption}
560
- aria-autocomplete="list"
561
- aria-invalid={field.isInvalid || undefined}
562
- aria-describedby={mergeDescribedBy(field.describedBy, locked && lock.reasonId)}
563
- aria-required={ariaRequired}
564
- autoComplete="off"
565
- // Locked: focusable, `readOnly`, `aria-disabled` — see `lockedKeyDown`.
566
- disabled={locked ? undefined : disabled}
567
- readOnly={locked || undefined}
568
- aria-disabled={locked || undefined}
569
- // 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.
570
- autoFocus={autoFocus}
571
- // `inputMode="none"` rather than readOnly, for the same reason Combobox
572
- // above gives: the sheet carries the keyboard, and a readOnly field would
573
- // take FIELD_BASE's settled look on a field that is perfectly editable.
574
- inputMode={isPhone ? "none" : undefined}
575
- onMouseDown={primaryOnly.onMouseDown}
576
- onFocus={(e) => {
577
- // See {@link usePrimaryPressOnly}: a back/forward button lands here on
578
- // its way to navigating, and neither the list nor the select-all is
579
- // anything it asked for (live #309 rework). A locked field takes focus to
580
- // say why, and opens nothing.
581
- if (primaryOnly.fromAuxButton() || locked) return;
582
- setText(shown);
583
- // The tour's focus on arrival (§11.8) opens nothing: the list would cover
584
- // its card (0.50.1). A click, ArrowDown or typing opens it.
585
- if (isQuietFocus(e.currentTarget)) {
586
- quietRef.current = true;
587
- return;
588
- }
589
- e.currentTarget.select();
590
- setOpen(true);
591
- // The sheet has its own input; the field behind it must not also pull up
592
- // the keyboard and scroll the page under the dialog.
593
- if (isPhone) sheetInputRef.current?.focus();
594
- }}
595
- // After a quiet focus, the person's click on the already-focused field
596
- // fires no `focus`: the click is their "open" instead.
597
- onClick={() => {
598
- if (!quietRef.current || locked) return;
599
- quietRef.current = false;
600
- setOpen(true);
601
- }}
602
- onBlur={() => {
603
- quietRef.current = false;
604
- // On a phone the blur is the SHEET taking focus, not the user leaving the
605
- // field — reconciling there would close the sheet the instant it opened.
606
- if (!isPhone) reconcile();
607
- }}
608
- onChange={(e) => {
609
- if (locked) return;
610
- setText(e.target.value);
611
- setOpen(true);
612
- setActive(-1);
613
- }}
614
- onKeyDown={(e) => {
615
- if (locked) return lockedKeyDown(e);
616
- listKeyDown(e);
617
- if (e.key === "Escape") {
618
- // A showing list takes the key and stops it — see the twin in
619
- // {@link Combobox} (round 0.34 BUG-1).
620
- if (showing && takeEscape(e)) return;
621
- // With no list, putting loose text back is this field's own undo step,
622
- // and the step is all the key does: claimed, so the dialog around the
623
- // field stays — it closed with the form in it (refactor audit
624
- // 2026-10-30, INP-5; ChipInput's draft is the rule). With nothing to
625
- // undo the key goes on, as before.
626
- if (text !== null && text !== (selected?.label ?? "")) claimEscape(e);
627
- setText(null);
628
- close();
629
- } else if (e.key === "Tab") {
630
- // Focus is in THIS input and stays there, so the browser's own Tab is
631
- // left alone; all that is needed is that the list stop covering what
632
- // the user is tabbing to. `reconcile` rather than `close`, because
633
- // leaving the field is exactly when loose text has to be judged.
634
- reconcile();
635
- }
636
- // Home/End stay with the caret — see the note in {@link Combobox}: this
637
- // field is editable, and its text is what `reconcile` judges.
638
- }}
639
- className={cn(
640
- FIELD_BASE,
641
- label !== undefined && FIELD_FLOATING_PAD,
642
- "pe-9",
643
- field.isInvalid && FIELD_INVALID,
644
- )}
645
- />
646
- {showClear ? (
647
- <button
648
- type="button"
649
- // Out of the tab order, like the clear on `EntityCombobox`: the keyboard
650
- // already clears this field by selecting its text and deleting, and a
651
- // second stop between every picker and the next field is a worse trade
652
- // than the one gesture it saves.
653
- tabIndex={-1}
654
- aria-label={labels.clear}
655
- // preventDefault, exactly as the chevron does: without it the press
656
- // focuses the input, which on a phone opens the sheet over the field the
657
- // press was clearing.
658
- onMouseDown={(e) => e.preventDefault()}
659
- onClick={() => {
660
- setText(null);
661
- close();
662
- if (!locked) onChange(clearValue);
663
- }}
664
- className={cn(
665
- "absolute end-2 top-1/2 -translate-y-1/2 rounded p-0.5 text-placeholder",
666
- "hover:text-secondary",
667
- )}
668
- >
669
- <X aria-hidden className="size-4" />
670
- </button>
671
- ) : (
672
- <ChevronDown
673
- aria-hidden
674
- onMouseDown={(e) => {
675
- // Toggle on the chevron without stealing focus from the input — and
676
- // not at all on a disabled or locked field, which the input's own
677
- // `disabled`/`readOnly` does not stop from here.
678
- e.preventDefault();
679
- if (!inert) setOpen((o) => !o);
680
- }}
681
- className={cn(
682
- "absolute end-2.5 top-1/2 size-4 -translate-y-1/2 text-placeholder",
683
- // The box above does the dimming; dimming here too would halve it again.
684
- !inert && "cursor-pointer",
685
- )}
686
- />
687
- )}
688
- </div>,
689
- )}
690
- </EndHintRow>
691
- {label !== undefined && hintParts.labelHint !== undefined && (
692
- <StaticLabelRow hint={hintParts.labelHint}>
693
- <ComboboxFieldLabel htmlFor={fieldId} className={cn(LABEL_IN_ROW, inert && "opacity-50")}>
694
- {label}
695
- </ComboboxFieldLabel>
696
- </StaticLabelRow>
697
- )}
698
- <FieldCaption parts={hintParts} />
699
- {field.errorEl}
700
- {/* The live status — see `useTypedListStatus` for where it goes and why. */}
701
- {!isPhone && statusRegion}
702
- {isPhone && (
703
- <PickerSheet
704
- open={open && !inert}
705
- // Closing without choosing keeps the value — see `dismissSheet`.
706
- onClose={dismissSheet}
707
- title={sheetTitle ?? label}
708
- query={sheetQuery}
709
- onQueryChange={(v) => {
710
- setSheetQuery(v);
711
- setActive(-1);
712
- }}
713
- searchPlaceholder={searchPlaceholder ?? placeholder ?? labels.search}
714
- inputRef={sheetInputRef}
715
- closeLabel={closeLabel}
716
- // The field's own keys, in the box focus is in while the sheet is up: arrows
717
- // and Enter there did nothing (INP-6, as BUG-5 gave the panel pickers).
718
- onSearchKeyDown={listKeyDown}
719
- listboxId={listboxId}
720
- activeId={activeOption}
721
- >
722
- <ul id={listboxId} role="listbox">
723
- {groupedRows(true, (o, i) => (
724
- <li role="presentation">
725
- <button
726
- type="button"
727
- id={optionId(i)}
728
- role="option"
729
- aria-selected={o.value === value}
730
- aria-disabled={o.disabled || undefined}
731
- onClick={() => take(o)}
732
- className={cn(
733
- SHEET_ROW_CLASS,
734
- // The row the sheet's arrows are on.
735
- i === active && !o.disabled && "bg-active",
736
- o.value === value && "font-medium",
737
- o.disabled && DISABLED_ROW_CLASS,
738
- )}
739
- >
740
- {o.label}
741
- </button>
742
- </li>
743
- ))}
744
- {showCreate && (
745
- <li role="presentation">
746
- <button
747
- type="button"
748
- id={optionId(createIndex)}
749
- role="option"
750
- // An action, never chosen — see `onCreate`.
751
- aria-selected={false}
752
- aria-disabled={createLocked || undefined}
753
- onClick={create}
754
- className={cn(
755
- SHEET_ROW_CLASS,
756
- CREATE_ROW_CLASS,
757
- active === createIndex && !createLocked && "bg-active",
758
- createLocked && DISABLED_ROW_CLASS,
759
- )}
760
- >
761
- {createRowContent}
762
- </button>
763
- </li>
764
- )}
765
- {/* "Nothing matched" only when there is nothing to do either: with a create
766
- row the list is not empty, it is offering to fill itself. A picture: the
767
- status below says it to a reader. */}
768
- {matches.length === 0 && !showCreate && (
769
- <li aria-hidden className="px-4 py-3 text-sm text-muted">
770
- {labels.noResults}
771
- </li>
772
- )}
773
- </ul>
774
- {statusRegion}
775
- </PickerSheet>
776
- )}
777
- {showing && (
778
- <SuggestionList id={listboxId} anchorRef={fieldRef} panelRef={panelRef}>
779
- {groupedRows(false, (o, i) => (
780
- <li role="presentation">
781
- <button
782
- type="button"
783
- id={optionId(i)}
784
- // See {@link Combobox}: the role rides the button, `aria-selected` is the
785
- // CHOSEN row, and the keyboard's row is the field's
786
- // `aria-activedescendant`.
787
- role="option"
788
- aria-selected={o.value === value}
789
- aria-disabled={o.disabled || undefined}
790
- tabIndex={-1}
791
- onMouseDown={(e) => {
792
- // mousedown (not click) so the input's blur can't close the list
793
- // before the selection registers. Prevented on a disabled row too, so
794
- // pressing one leaves the field focused and open.
795
- e.preventDefault();
796
- take(o);
797
- }}
798
- onMouseEnter={() => {
799
- if (!o.disabled) setActive(i);
800
- }}
801
- className={cn(
802
- rowClass(i === active && !o.disabled),
803
- o.disabled && DISABLED_ROW_CLASS,
804
- // Indented under its heading, so the hierarchy is readable at a glance
805
- // instead of inferred from grey trailing text.
806
- o.group && "ps-6",
807
- o.value === value && "font-medium",
808
- )}
809
- >
810
- {o.label}
811
- {o.sublabel && <span className="ms-2 text-xs text-placeholder">{o.sublabel}</span>}
812
- </button>
813
- </li>
814
- ))}
815
- {showCreate && (
816
- <li role="presentation">
817
- <button
818
- type="button"
819
- id={optionId(createIndex)}
820
- role="option"
821
- // An action, never chosen; whether the keyboard is ON it is the field's
822
- // `aria-activedescendant`'s to say.
823
- aria-selected={false}
824
- aria-disabled={createLocked || undefined}
825
- tabIndex={-1}
826
- onMouseDown={(e) => {
827
- // mousedown, like the rows above: the input's blur would otherwise
828
- // reconcile and close the list before the click landed.
829
- e.preventDefault();
830
- create();
831
- }}
832
- onMouseEnter={() => {
833
- if (!createLocked) setActive(createIndex);
834
- }}
835
- className={cn(
836
- rowClass(active === createIndex && !createLocked),
837
- CREATE_ROW_CLASS,
838
- createLocked && DISABLED_ROW_CLASS,
839
- )}
840
- >
841
- {createRowContent}
842
- </button>
843
- </li>
844
- )}
845
- </SuggestionList>
846
- )}
847
- </div>
848
- );
849
- }