@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,843 +0,0 @@
1
- import { isValidElement, useCallback, useId } from "react";
2
- import type { KeyboardEvent, MouseEvent, ReactElement, ReactNode, Ref } from "react";
3
- import { Check, X } from "lucide-react";
4
- import type { LucideIcon } from "lucide-react";
5
- import { cn } from "../lib/cn";
6
- import { statusTone, type StatusKind } from "../lib/status-tone";
7
- import { TOUCH_TARGET_LARGE } from "./button-look";
8
- import { FOCUS_RING } from "./focus-ring";
9
- import { assignRef, LockedReason, type DisabledReasonDisplay } from "./field-parts";
10
- import { hasContent } from "../lib/presence";
11
- import { DEFAULT_COMMON_LABELS, useKitLabels, useKitLink } from "../i18n/kit-labels";
12
- import { pickLinkRenderer } from "./text-link";
13
- import { useCommitReason, type CommitScope } from "./write-lock";
14
- import { useSnapEdges } from "../lib/chip-edge-snap";
15
- // The edge-snap engine lives in lib/chip-edge-snap.ts and ChipInput in chip-input.tsx
16
- // (MOD-9). `refreshChipEdges` is still this module's; of ChipInput only the types are,
17
- // since a runtime re-export would make chip ⇄ chip-input a cycle — the barrel exports
18
- // chip-input itself.
19
- export { refreshChipEdges } from "../lib/chip-edge-snap";
20
- export type { ChipInputLabels, ChipInputProps } from "./chip-input";
21
-
22
- /**
23
- * A chip: a compact pill carrying one value.
24
- *
25
- * Three jobs, deliberately one component. A chip can be inert (a tag on a row), a link
26
- * (a jump to a section), or a toggle (a filter that is on or off) — and the difference is
27
- * which prop you pass, not which component you pick. Keeping them together is what stops
28
- * an app growing three near-identical pills that drift apart; it is the shape this kit
29
- * already uses for `Button`, which is a link when it is given an href.
30
- *
31
- * A chip is not a `Button`. It is smaller, it is rounded to a pill, and it reads as a
32
- * VALUE rather than as an action — which matters because a row of eight buttons says
33
- * "choose one of eight things to do" and a row of eight chips says "here are eight
34
- * things". Using `Button` for both is the mistake this exists to prevent.
35
- */
36
-
37
- export type ChipTone = "neutral" | "brand" | "danger" | "warning" | "success" | "info" | "income" | "expense" | ChipHue;
38
- /**
39
- * Categorical hues (0.10.0): colour that says "a different value" and nothing more —
40
- * kastlan's status-badge.tsx paints ~15 enums in 9 Tailwind hues by hand. Four of those
41
- * nine are semantic and already tones (green = `success`, yellow = `warning`, red =
42
- * `danger`, gray = `neutral`); these five are the rest, each a `--hue-*` token triple
43
- * in tokens.css with a light and a dark value. Use a semantic tone when the value HAS a
44
- * meaning (overdue is `danger`), a hue when it only needs telling apart (sent vs
45
- * accepted vs invoiced).
46
- */
47
- export type ChipHue = "blue" | "indigo" | "purple" | "teal" | "orange";
48
- /** `lg` is the 44px touch target (`min-h-11`) a phone surface wants; `md` is ~28px.
49
- * `xs` (0.10.0) is 11px type at `px-1.5` — keksdose's goal markers and budget-cell
50
- * badges, which sit inside a figure's line and must not make it taller. */
51
- export type ChipSize = "xs" | "sm" | "md" | "lg";
52
- /**
53
- * How much of the tone the chip wears.
54
- *
55
- * - `soft` (default): the tinted surface every chip has had.
56
- * - `outline`: the tone's border and text on NO surface — keksdose's DEV badge in the
57
- * account menu and kastlan's 27 shadcn `variant="outline"` badges, which sit on
58
- * coloured rows where a second tint would muddy the row.
59
- * - `solid`: the tone as a fill under contrasting text — the "count" pill (unread
60
- * messages, open tasks). It centres its content and sets figures tabular, so a
61
- * one-digit count is a round dot and "9" → "10" does not jiggle the row.
62
- * - `dot` (0.10.0): no pill at all — a dot in the tone's colour before plain text, for
63
- * a status in a dense list or a table column where eight tinted pills in a column
64
- * would outshout the figures beside them (kastlan's unit picker already draws its
65
- * UnitStatus this way, from a separate `dotColor` map).
66
- */
67
- export type ChipVariant = "soft" | "outline" | "solid" | "dot";
68
- /** `pill` (default) is fully rounded; `square` has the small radius of a field or a
69
- * button — for a chip that sits in a table cell or beside square controls. */
70
- export type ChipShape = "pill" | "square";
71
-
72
- const TONE: Record<ChipTone, { idle: string; selected: string }> = {
73
- neutral: {
74
- idle: "border-subtle bg-surface-2 text-secondary",
75
- selected: "border-strong bg-active text-primary",
76
- },
77
- brand: {
78
- idle: "border-subtle bg-brand-soft text-brand-muted",
79
- selected: "border-brand bg-brand text-brand-contrast",
80
- },
81
- danger: {
82
- idle: "border-danger bg-danger-soft text-danger",
83
- selected: "border-[var(--danger)] bg-danger text-danger-contrast",
84
- },
85
- warning: {
86
- idle: "border-warning bg-warning-soft text-warning",
87
- selected: "border-[var(--warning)] bg-warning-soft text-warning",
88
- },
89
- success: {
90
- idle: "border-success bg-success-soft text-success",
91
- selected: "border-[var(--success)] bg-success-soft text-success",
92
- },
93
- info: {
94
- idle: "border-info bg-info-soft text-info",
95
- selected: "border-[var(--info)] bg-info-soft text-info",
96
- },
97
- // The money pair (Keksdose's direction toggle). Only the TEXT and the BORDER carry
98
- // the tint, on the neutral chip's own surfaces: the money tokens are chosen for text
99
- // contrast, and a filled amber pill beside an amber figure reads as one smear.
100
- // `border-current` takes its hue from the text, so the two cannot drift apart.
101
- income: {
102
- idle: "border-current/40 bg-surface-2 text-money-income",
103
- selected: "border-current bg-active text-money-income",
104
- },
105
- expense: {
106
- idle: "border-current/40 bg-surface-2 text-money-expense",
107
- selected: "border-current bg-active text-money-expense",
108
- },
109
- // The categorical hues: the `info` recipe with its own token triple, so a hue chip
110
- // and a status chip in one row carry the same weight.
111
- blue: {
112
- idle: "border-hue-blue bg-hue-blue-soft text-hue-blue",
113
- selected: "border-[var(--hue-blue)] bg-hue-blue-soft text-hue-blue",
114
- },
115
- indigo: {
116
- idle: "border-hue-indigo bg-hue-indigo-soft text-hue-indigo",
117
- selected: "border-[var(--hue-indigo)] bg-hue-indigo-soft text-hue-indigo",
118
- },
119
- purple: {
120
- idle: "border-hue-purple bg-hue-purple-soft text-hue-purple",
121
- selected: "border-[var(--hue-purple)] bg-hue-purple-soft text-hue-purple",
122
- },
123
- teal: {
124
- idle: "border-hue-teal bg-hue-teal-soft text-hue-teal",
125
- selected: "border-[var(--hue-teal)] bg-hue-teal-soft text-hue-teal",
126
- },
127
- orange: {
128
- idle: "border-hue-orange bg-hue-orange-soft text-hue-orange",
129
- selected: "border-[var(--hue-orange)] bg-hue-orange-soft text-hue-orange",
130
- },
131
- };
132
-
133
- // `outline` idle looks: the tone's border and text, the surface left to whatever the
134
- // chip sits on. Selected still takes the tone's `selected` look (below), because an
135
- // outline toggle that stays an outline when on has no visible state.
136
- const OUTLINE: Record<ChipTone, string> = {
137
- neutral: "border-strong bg-transparent text-secondary",
138
- // The brand AS TEXT is `--brand-muted` (0.33): `--brand` itself is solved to 3:1, a
139
- // fill's boundary, and as text it fell to 3.0:1 in the derived dark presets.
140
- brand: "border-brand bg-transparent text-brand-muted",
141
- danger: "border-danger bg-transparent text-danger",
142
- warning: "border-warning bg-transparent text-warning",
143
- success: "border-success bg-transparent text-success",
144
- info: "border-info bg-transparent text-info",
145
- income: "border-current/60 bg-transparent text-money-income",
146
- expense: "border-current/60 bg-transparent text-money-expense",
147
- blue: "border-hue-blue bg-transparent text-hue-blue",
148
- indigo: "border-hue-indigo bg-transparent text-hue-indigo",
149
- purple: "border-hue-purple bg-transparent text-hue-purple",
150
- teal: "border-hue-teal bg-transparent text-hue-teal",
151
- orange: "border-hue-orange bg-transparent text-hue-orange",
152
- };
153
-
154
- // `solid`: the fill under its own foreground, `<fill>-contrast` (0.33, colour-roles
155
- // §5.1): white in light, the tone's 950 (the page, for money) on the dark theme's
156
- // pastels. Until 0.33 only brand and danger had one and the rest borrowed
157
- // `--text-inverse`, the surface colour — which left light warning at 4.24:1 and orange
158
- // at 4.38:1. Neutral keeps the inverse pair: a count pill, louder than the neutral
159
- // fill. The border goes transparent rather than away, so a solid chip is exactly as
160
- // tall as a soft one.
161
- const SOLID: Record<ChipTone, string> = {
162
- neutral: "border-transparent bg-inverse text-inverse",
163
- brand: "border-transparent bg-brand text-brand-contrast",
164
- danger: "border-transparent bg-danger text-danger-contrast",
165
- warning: "border-transparent bg-warning text-warning-contrast",
166
- success: "border-transparent bg-success text-success-contrast",
167
- info: "border-transparent bg-info text-info-contrast",
168
- income: "border-transparent bg-money-pos text-money-income-contrast",
169
- expense: "border-transparent bg-money-neg text-money-expense-contrast",
170
- blue: "border-transparent bg-hue-blue text-hue-blue-contrast",
171
- indigo: "border-transparent bg-hue-indigo text-hue-indigo-contrast",
172
- purple: "border-transparent bg-hue-purple text-hue-purple-contrast",
173
- teal: "border-transparent bg-hue-teal text-hue-teal-contrast",
174
- orange: "border-transparent bg-hue-orange text-hue-orange-contrast",
175
- };
176
-
177
- /** `dot`: the fill of the dot itself — the tone's strongest colour, which is the one
178
- * chosen to read on the page surface in both themes. Neutral takes the muted ink: a
179
- * grey dot is "no particular state", not a darker black. */
180
- const DOT: Record<ChipTone, string> = {
181
- neutral: "bg-[var(--text-muted)]",
182
- brand: "bg-brand",
183
- danger: "bg-danger",
184
- warning: "bg-warning",
185
- success: "bg-success",
186
- info: "bg-info",
187
- income: "bg-money-income",
188
- expense: "bg-money-expense",
189
- blue: "bg-hue-blue",
190
- indigo: "bg-hue-indigo",
191
- purple: "bg-hue-purple",
192
- teal: "bg-hue-teal",
193
- orange: "bg-hue-orange",
194
- };
195
-
196
- /** Per size: the dot's diameter. */
197
- const DOT_SIZE: Record<ChipSize, string> = { xs: "size-1.5", sm: "size-2", md: "size-2", lg: "size-2.5" };
198
-
199
- /** The status-badge type (`caps`): a size step down, heavier and tracked, because
200
- * capitals at body size shout and capitals untracked run together. Per size, so it
201
- * replaces the size's own `text-*` through tailwind-merge. */
202
- const CAPS: Record<ChipSize, string> = {
203
- xs: "text-micro font-semibold uppercase tracking-wider",
204
- sm: "text-micro font-semibold uppercase tracking-wider",
205
- md: "text-caption font-semibold uppercase tracking-wider",
206
- lg: "text-xs font-semibold uppercase tracking-wider",
207
- };
208
-
209
- function surfaceOf(tone: ChipTone, variant: ChipVariant, selected: boolean | undefined): string {
210
- const palette = TONE[tone];
211
- if (variant === "dot") {
212
- // No surface and no border colour: the dot carries the tone, the text stays ink.
213
- // The border goes transparent rather than away, so a dot chip lines up with a pill.
214
- return selected
215
- ? "border-transparent bg-transparent font-medium text-primary"
216
- : "border-transparent bg-transparent text-secondary";
217
- }
218
- if (variant === "solid") {
219
- // A solid chip is already the strongest look there is, so "on" is a ring round it.
220
- return cn(SOLID[tone], selected && "ring-2 ring-strong ring-offset-1 ring-offset-surface");
221
- }
222
- if (selected) return palette.selected;
223
- return variant === "outline" ? OUTLINE[tone] : palette.idle;
224
- }
225
-
226
- /** What {@link ChipProps.renderLink} is handed: everything the chip would have put on
227
- * its own `<a>`. Spread it onto your router's link, mapping `href` to what the link
228
- * calls it — `renderLink={({ href, ...p }) => <Link to={href} {...p} />}`. */
229
- export interface ChipLinkProps {
230
- href: string;
231
- /** The chip's whole look — keep it, or the pill is a bare link. */
232
- className: string;
233
- children: ReactNode;
234
- /** The chip's forwarded ref. React 19 passes it to a function component as a prop. */
235
- ref?: Ref<HTMLAnchorElement>;
236
- "aria-current"?: "true";
237
- /**
238
- * The chip's `onClick`, when it was given one — spread it onto the link with the
239
- * rest. Carried here so a caller need not close over it twice: keksdose's admin pill
240
- * in the account menu closes the menu on the way to /admin (account-menu.tsx), and
241
- * with `onClick` on the Chip its `renderLink` stays the one-liner
242
- * `({ href, ...p }) => <Link to={href} {...p} />`.
243
- */
244
- onClick?: (event: MouseEvent<HTMLAnchorElement>) => void;
245
- id?: string;
246
- title?: string;
247
- [key: `aria-${string}`]: string | boolean | number | undefined;
248
- [key: `data-${string}`]: unknown;
249
- }
250
-
251
- /**
252
- * `body` is the whole pill when the chip is ONE element. When a link or a button also has
253
- * a dismiss control, the pill is a wrapper holding two siblings (see the note on
254
- * {@link Chip}): `split` is then the interactive part's own padding — the full start
255
- * inset, a short end one before the ×; `tail` is the wrapper's end inset after the ×.
256
- */
257
- const SIZE: Record<ChipSize, { body: string; split: string; tail: string; icon: string; remove: string }> = {
258
- xs: {
259
- body: "gap-1 px-1.5 py-0 text-caption leading-4",
260
- split: "gap-1 ps-1.5 pe-0.5 py-0 text-caption leading-4",
261
- tail: "pe-1",
262
- icon: "size-3",
263
- remove: "size-2.5",
264
- },
265
- sm: {
266
- body: "gap-1 px-2 py-0.5 text-xs",
267
- split: "gap-1 ps-2 pe-1 py-0.5 text-xs",
268
- tail: "pe-1.5",
269
- icon: "size-3",
270
- remove: "size-3",
271
- },
272
- md: {
273
- body: "gap-1.5 px-2.5 py-1 text-sm",
274
- split: "gap-1.5 ps-2.5 pe-1.5 py-1 text-sm",
275
- tail: "pe-2",
276
- icon: "size-3.5",
277
- remove: "size-3.5",
278
- },
279
- lg: {
280
- body: "min-h-11 gap-2 px-4 py-2 text-sm",
281
- split: "min-h-11 gap-2 ps-4 pe-2 py-2 text-sm",
282
- tail: "min-h-11 pe-3.5",
283
- icon: "size-4",
284
- remove: "size-4",
285
- },
286
- };
287
-
288
- const CHIP_PILL = "inline-flex max-w-full items-center rounded-full border transition-colors";
289
-
290
- // `focus-visible`, not `focus`: a chip commonly receives focus programmatically (the
291
- // ChipInput moves focus onto one after a removal) and a ring that appears on a
292
- // pointer click reads as a stuck selection.
293
- const CHIP_RING = `${FOCUS_RING} focus-visible:ring-offset-1 focus-visible:ring-offset-surface`;
294
- const CHIP_BASE = `${CHIP_PILL} ${CHIP_RING}`;
295
-
296
- /**
297
- * A text chip's label at Large and Extra large (0.32.1, keksdose's 0.32 report;
298
- * docs/text-size-harmonization.md §4 "nothing truncates"): it wraps instead of ending in
299
- * "…". keksdose's "Zur Prüfung zurücklegen" read "Zur Prüfung zu…" on a phone at Extra
300
- * large, which is a different instruction. No size has a fixed height (padding and
301
- * `min-h-*` only), so the pill grows with its lines; the mark before the text stays
302
- * centred on them, as in a pill. A `large:` rule, so Normal keeps its one-line chip.
303
- *
304
- * 0.33 (§10.17): the kit's one `truncate-until-large` (tokens.css) in place of this
305
- * file's own `truncate` + `large:whitespace-normal large:break-words`, as StatusDot's
306
- * label took it. The utility breaks with `overflow-wrap: anywhere`, which lowers the
307
- * label's min-content width to one letter: a status chip in an auto-sized table column
308
- * wants the column given a width at Large, or it is squeezed to a letter per line
309
- * (StatusDot's label was, in the showcase's tone table at 360 px, Extra large).
310
- */
311
- const CHIP_LABEL_TRUNCATE = "truncate-until-large";
312
-
313
- /**
314
- * An interactive chip's touch target at Large and Extra large (docs/text-size-harmonization.md
315
- * §4: "touch targets at least 48 px … for buttons, inputs, chips"): a link or toggle chip
316
- * grows its pill to 48 px, as Button `sm` does, and centres what is in it once the
317
- * minimum width is what sizes it. An inert chip (a tag on a row) is no target and keeps
318
- * its size; a disabled one is no target either.
319
- */
320
- const CHIP_TOUCH_LARGE = `${TOUCH_TARGET_LARGE} large:justify-center`;
321
-
322
- /**
323
- * The ×'s 48 px hit area at Large (§4) — IconButton's `2xs` pattern: a box that cannot
324
- * grow without growing the chip around it keeps its size and gets an invisible
325
- * `::after`, 48 px square and centred on it, which takes the taps a finger lands round
326
- * the glyph. On an inert removable chip (ChipInput's values) the × is the only target.
327
- */
328
- const REMOVE_HIT_AREA_LARGE =
329
- "relative large:after:absolute large:after:inset-[calc((100%-48px)/2)] large:after:content-['']";
330
-
331
- interface ChipBaseProps {
332
- children: ReactNode;
333
- tone?: ChipTone;
334
- /**
335
- * What the value means as a status (0.49 KIT-8), instead of a `tone`: `good` (success),
336
- * `attention` (warning), `problem` (danger), `active` (info), `inactive` (neutral) —
337
- * {@link statusTone}. An explicit `tone` wins. Never `brand` for a status.
338
- */
339
- status?: StatusKind;
340
- size?: ChipSize;
341
- /** See {@link ChipVariant}. Default `soft`. */
342
- variant?: ChipVariant;
343
- /** See {@link ChipShape}. Default `pill`. */
344
- shape?: ChipShape;
345
- /**
346
- * The uppercase, tracked "status badge" type — keksdose's ~25 PAID / DRAFT /
347
- * OVERDUE / ADMIN badges, each spelling `uppercase tracking-wide text-[10px]` by
348
- * hand. A flag rather than a fourth `variant` because it is TYPE, not surface: a
349
- * status badge is soft, outlined or solid as the row needs, and a `variant="tag"`
350
- * would have had to pick one. Screen readers read the text as written, not as
351
- * drawn, so write it in normal case.
352
- */
353
- caps?: boolean;
354
- /**
355
- * The leading glyph: a lucide component (`icon={Check}`, drawn at the chip's size), or
356
- * — since 0.15.4 — a ready element (`icon={<Check className="text-success" />}`)
357
- * for a glyph whose colour or stroke carries a state; it is sized to the same box
358
- * (keksdose live #358 built that slot by hand inside `children`).
359
- */
360
- icon?: LucideIcon | ReactElement;
361
- /**
362
- * Marks the chip as the current one — `aria-current` on a link, `aria-pressed` on a
363
- * toggle.
364
- *
365
- * On an ON/OFF toggle, keep the LABEL the same in both states and let `selected`
366
- * carry the state. A label that flips with it ("Skip this month" / "Ask again this
367
- * month") is announced together with "pressed", and then says the opposite of what
368
- * it does.
369
- *
370
- * A control that switches between two NAMED states (outflow ⇄ inflow) is not a
371
- * toggle but an ACTION button: leave `selected` out, let the visible label and the
372
- * tone follow the state ("− Outflow" / "+ Inflow"), and name the action in
373
- * `aria-label` ("Direction: outflow — tap for inflow"). Without `selected` the chip
374
- * reports no pressed state at all. A fixed label there contradicts the figure beside
375
- * it — "+ Outflow" in green next to an inflow (keksdose #417).
376
- */
377
- selected?: boolean;
378
- /**
379
- * Checkbox mode (0.10.0), for a toggle chip (`onClick` + `selected`): a small box
380
- * at the start that shows a tick when `selected`, and the button reports
381
- * `role="checkbox"` + `aria-checked` instead of `aria-pressed`. For a set of
382
- * include/exclude choices where "on" must read as TICKED, not merely tinted —
383
- * keksdose's add-group-card (the "which categories come along" pills), which put a
384
- * real `<Checkbox>` inside a `<label>` pill by hand. The box is drawn in both
385
- * states so ticking one never shifts its label.
386
- */
387
- checkbox?: boolean;
388
- /** Renders a dismiss affordance. Works alongside `href`/`onClick` — see the note below. */
389
- onRemove?: () => void;
390
- /** Accessible name for the dismiss button. Default: `common.remove` from the
391
- * {@link UiKitProvider}, else "Remove". */
392
- removeLabel?: string;
393
- /** Disables the × ONLY — the chip itself stays a working link or toggle. For the
394
- * value that may not be removed right now (the last filter of a required set, a
395
- * tag the user may read but not edit) where `disabled` would also kill the chip's
396
- * own action. */
397
- removeDisabled?: boolean;
398
- disabled?: boolean;
399
- className?: string;
400
- /**
401
- * Roving focus, for a container that manages a row of chips (see {@link ChipInput}).
402
- * A chip with no `href`/`onClick` is inert and unfocusable by default; give it a
403
- * `tabIndex` and a `role` and it becomes the thing arrow keys move between.
404
- */
405
- tabIndex?: number;
406
- role?: string;
407
- onKeyDown?: (e: KeyboardEvent<HTMLElement>) => void;
408
- onFocus?: () => void;
409
- /** Accessible name, when the visible text is not the whole story. */
410
- "aria-label"?: string;
411
- /** Any other ARIA attribute — `aria-describedby`, `aria-expanded`, `aria-controls`,
412
- * `aria-haspopup` — reaches the chip's interactive element. */
413
- [key: `aria-${string}`]: string | boolean | number | undefined;
414
- /** A test id, a `data-tour` anchor, or any other data attribute. */
415
- [key: `data-${string}`]: unknown;
416
- id?: string;
417
- /** A native tooltip. For anything a user must read, prefer the kit's `Tooltip`. */
418
- title?: string;
419
- /**
420
- * Even hairlines on fractional-ratio displays (0.18.0). At a device-pixel ratio of
421
- * 1.25 — a 125 % Windows display, or 125 % zoom — Chrome draws a chip's two 1px
422
- * side borders on different sub-pixel phases, one crisp and one a half-strength
423
- * smear that reads as a thinner line (worst on the 60 %-alpha `danger` border).
424
- * `snapEdges` widens the chip by under 4px, from where it sits, so the two edges
425
- * rasterise as mirror images, and centres its content in the extra.
426
- *
427
- * Off by default: it reads the chip's position (batched for every snapped chip into
428
- * one pass a frame, through one shared observer), and the fix is only as fresh as the
429
- * last pass — it re-snaps on render, resize, zoom and ratio change, but not when
430
- * something else moves the chip; call {@link refreshChipEdges} then. At an integer
431
- * ratio, and at 1.5, it writes nothing. Turn it on for status chips that sit in a
432
- * column and are compared side by side; a chip with no visible border (`dot`) has
433
- * nothing to snap.
434
- */
435
- snapEdges?: boolean;
436
- /** The interactive element — the pill, or a split pill's body. A React 19 ref prop
437
- * since 0.34 (MOD-4, refactor audit 2026-10); it was `forwardRef`. */
438
- ref?: Ref<HTMLElement>;
439
- }
440
-
441
- /**
442
- * A chip is a link OR a button, never both — so the types say so. Before 0.7.0 both were
443
- * accepted and `onClick` was silently dropped whenever `href` was set. A LINK may still
444
- * run code on its way (close the menu it sits in): that is an `onClick` typed for the
445
- * anchor, on the link shape, and the pill stays a link — no `aria-pressed`, no button.
446
- * That shape wants a definite `href` string, so a bare `onClick` is always the
447
- * button's, with a button's event.
448
- */
449
- export type ChipProps = ChipBaseProps &
450
- (
451
- | {
452
- /** Renders the chip as a link. */
453
- href?: string;
454
- onClick?: never;
455
- /**
456
- * Renders the link for `href` — pass your router's `<Link>` here, since a
457
- * plain `<a>` reloads a single-page app (keksdose's account-menu admin pill).
458
- * Default: the `<UiKitProvider linkComponent>`, then `<a>`. Ignored without
459
- * `href`.
460
- *
461
- * A render function rather than an `as={Link}`, for three reasons. It is the
462
- * API `StatTile` already has (`renderLink`), so a consumer learns it once.
463
- * Router links do not take `href` — react-router's takes `to` — so an `as`
464
- * would either have to pass props through untyped or teach the kit about one
465
- * router; here the caller maps `href` onto its own link in one line, fully
466
- * typed. And it keeps `href` as THE link prop, which is what the `href` /
467
- * `onClick` exclusion below is typed on: the pill is a link because it has an
468
- * href, whichever element draws it.
469
- */
470
- renderLink?: (props: ChipLinkProps) => ReactElement;
471
- commit?: never;
472
- disabledReason?: never;
473
- disabledReasonDisplay?: never;
474
- }
475
- | {
476
- /** The link shape again, with an `onClick`. `href` is a required string here,
477
- * which is what lets TypeScript tell this shape from the button's: a bare
478
- * `onClick` can only be the button's, and keeps its button event. */
479
- href: string;
480
- /** Runs on the link's click, before the navigation — keksdose's admin pill
481
- * closes the account menu with it. Reaches a `renderLink` link as
482
- * {@link ChipLinkProps.onClick}. Not called on a disabled chip, which renders
483
- * no link. */
484
- onClick?: (event: MouseEvent<HTMLAnchorElement>) => void;
485
- /** See the link shape above. */
486
- renderLink?: (props: ChipLinkProps) => ReactElement;
487
- commit?: never;
488
- disabledReason?: never;
489
- disabledReasonDisplay?: never;
490
- }
491
- | {
492
- href?: never;
493
- renderLink?: never;
494
- /** Renders the chip as a toggle button. Mutually exclusive with `href`. Receives
495
- * the click, so a chip inside a clickable row can `stopPropagation()`. */
496
- onClick?: (event: MouseEvent<HTMLButtonElement>) => void;
497
- /**
498
- * Why the toggle cannot be pressed right now — {@link Button}'s
499
- * `disabledReason`, on the chip's button shape (keksdose K3: a filter or flag
500
- * chip that saves on press, under a read-only lock). The chip stays focusable
501
- * and `aria-disabled`, a press (and its `onRemove` ×) does nothing, and the
502
- * reason describes the chip — as a line under it at Large and on a touch
503
- * screen, in the kit {@link Tooltip} otherwise (see `disabledReasonDisplay`).
504
- * Wins over `disabled`. A link chip navigates rather than commits, so it takes
505
- * neither this nor `commit`; an inert chip has nothing to refuse.
506
- */
507
- disabledReason?: ReactNode;
508
- /**
509
- * Where `disabledReason` shows (0.32, docs/text-size-harmonization.md §4 "No fact
510
- * only in a tooltip") — {@link Button}'s `disabledReasonDisplay`: by default a line
511
- * under the chip at Large and Extra large and on a touch screen, where a bubble
512
- * cannot be hovered open, and the tooltip otherwise and inside
513
- * `CompactControls`. `"line"` / `"tooltip"` force one. See
514
- * {@link DisabledReasonDisplay}.
515
- */
516
- disabledReasonDisplay?: DisabledReasonDisplay;
517
- /** This chip COMMITS — pressing it saves. Under a locked
518
- * {@link WriteLockProvider} it takes the `disabledReason` path with the lock's
519
- * reason, as {@link Button}'s `commit` does. */
520
- commit?: CommitScope;
521
- }
522
- );
523
-
524
- /**
525
- * Note on `onRemove` with `href`/`onClick`: a button cannot be nested inside a button or
526
- * a link, so when both are present the chip renders a wrapper holding TWO siblings — the
527
- * interactive body and the dismiss control. The WRAPPER is the visual pill (border, tone,
528
- * `className`) and the two sit inside it, so the × reads as part of the chip; the body's
529
- * focus ring is drawn on the body alone, and `ref`, `id` and the ARIA props still reach
530
- * the body — the interactive element.
531
- */
532
- export function Chip({
533
- ref,
534
- children,
535
- tone: toneProp,
536
- status,
537
- size = "md",
538
- variant = "soft",
539
- shape = "pill",
540
- caps = false,
541
- icon: Icon,
542
- selected,
543
- checkbox = false,
544
- href,
545
- renderLink,
546
- onClick,
547
- onRemove,
548
- removeLabel,
549
- removeDisabled = false,
550
- disabled = false,
551
- className,
552
- tabIndex,
553
- role,
554
- onKeyDown,
555
- onFocus,
556
- snapEdges = false,
557
- disabledReason: ownDisabledReason,
558
- disabledReasonDisplay,
559
- commit,
560
- ...rest
561
- }: ChipProps) {
562
- const tone: ChipTone = toneProp ?? (status ? statusTone(status) : "neutral");
563
- const common = useKitLabels("common", DEFAULT_COMMON_LABELS, { remove: removeLabel });
564
- const reasonId = useId();
565
- const disabledReason = useCommitReason(commit, ownDisabledReason);
566
- // Only the BUTTON shape commits: a link navigates, an inert chip does nothing.
567
- const locked = Boolean(onClick) && !href && hasContent(disabledReason);
568
- const kitLink = useKitLink();
569
- const s = SIZE[size];
570
- const interactive = !!href || !!onClick;
571
- // One radius for every rounded piece — the pill, the body inside a split pill, the ×
572
- // — so a square chip has no round focus ring inside it.
573
- const radius = shape === "square" ? (size === "sm" || size === "xs" ? "rounded" : "rounded-md") : "rounded-full";
574
- const dot = variant === "dot";
575
- const type = cn(caps && CAPS[size], variant === "solid" && "justify-center tabular-nums");
576
- const surface = cn(
577
- surfaceOf(tone, variant, selected),
578
- // A reason wins over `disabled`: the focusable kind of disabled, with the cursor
579
- // that says "refused" rather than "nothing here".
580
- disabled && !locked && "cursor-default opacity-50",
581
- locked && "cursor-not-allowed opacity-50",
582
- );
583
- const snap = snapEdges && !dot;
584
- // A finger's target at Large (§4): what can be pressed, refused or not — see
585
- // CHIP_TOUCH_LARGE. A disabled link renders as the inert span below and is none.
586
- const target = interactive && (!disabled || locked);
587
- const snapRef = useSnapEdges(snap);
588
- // The visible pill carries the snap: the whole chip, or the wrapper of a split one
589
- // (whose body gets the forwarded ref instead).
590
- const ownRef = useCallback(
591
- (el: HTMLElement | null) => {
592
- snapRef(el);
593
- assignRef(ref, el);
594
- },
595
- [snapRef, ref],
596
- );
597
- const look = cn(
598
- CHIP_BASE,
599
- s.body,
600
- type,
601
- radius,
602
- surface,
603
- interactive && !disabled && !locked && "cursor-pointer hover:brightness-[0.97] dark:hover:brightness-110",
604
- // §4: a link or toggle is a 48 px target at Large — a locked one too, since it is
605
- // still focusable and still says why when pressed.
606
- target && CHIP_TOUCH_LARGE,
607
- // An inert dot chip is text in a column: no inset, so it aligns with the header.
608
- dot && !interactive && "px-0",
609
- // The under-4px a snap adds is split between the two sides, not stacked at the end.
610
- snap && "justify-center",
611
- className,
612
- );
613
-
614
- // The tone as data on the visible pill (0.34, refactor audit 2026-10, TST-9): a stable
615
- // hook for a test or a caller's selector, where the surface classes are the kit's to
616
- // change. On the pill wrapper of a split chip, else on the chip itself; before the
617
- // caller's props, so a `data-tone` of their own wins.
618
- const toneData = { "data-tone": onRemove ? undefined : tone } as Record<string, string | undefined>;
619
-
620
- // The checkbox box, only on the toggle shape it has meaning on.
621
- const isCheckbox = checkbox && !!onClick && !href;
622
- const body = (
623
- <>
624
- {isCheckbox && (
625
- <span
626
- aria-hidden
627
- data-chip-check=""
628
- className={cn(
629
- "flex shrink-0 items-center justify-center rounded-sm border",
630
- s.icon,
631
- selected ? "border-current bg-current/15" : "border-current/50",
632
- )}
633
- >
634
- {selected && <Check className="size-full" strokeWidth={3} />}
635
- </span>
636
- )}
637
- {dot && <span aria-hidden data-chip-dot="" className={cn("shrink-0 rounded-full", DOT_SIZE[size], DOT[tone])} />}
638
- {Icon &&
639
- (isValidElement(Icon) ? (
640
- <span aria-hidden className={cn(s.icon, "inline-flex shrink-0 [&>svg]:size-full")}>
641
- {Icon}
642
- </span>
643
- ) : (
644
- <Icon className={cn(s.icon, "shrink-0")} aria-hidden />
645
- ))}
646
- {/* Text truncates at Normal and wraps at Large (CHIP_LABEL_TRUNCATE). Mixed
647
- children (an icon and a word) sit in a row instead: as a plain span, the svg —
648
- a block under Tailwind's preflight — stacked above the text (keksdose live
649
- #358). */}
650
- <span
651
- className={cn(
652
- "min-w-0",
653
- typeof children === "string" || typeof children === "number"
654
- ? CHIP_LABEL_TRUNCATE
655
- : "inline-flex items-center gap-1 [&>svg]:size-[1em] [&>svg]:shrink-0",
656
- )}
657
- >
658
- {children}
659
- </span>
660
- </>
661
- );
662
-
663
- const remove = onRemove ? (
664
- <button
665
- type="button"
666
- // The name carries WHAT is being removed, not just "Remove" — a screen-reader user
667
- // tabbing a row of eight dismiss buttons otherwise hears the same word eight times
668
- // with no way to tell which one they are on.
669
- // Composed through `common.fieldValue` because the punctuation between the two
670
- // halves is the language's, not ours. A chip whose content is not plain text
671
- // has no value to name, and gets the bare verb rather than a dangling colon.
672
- aria-label={typeof children === "string" && children ? common.fieldValue(common.remove, children) : common.remove}
673
- onClick={(e) => {
674
- // The chip may itself be a link; removing it must not also follow it.
675
- e.preventDefault();
676
- e.stopPropagation();
677
- // Removing a value from a chip that commits is a commit too.
678
- if (locked) return;
679
- onRemove();
680
- }}
681
- disabled={(disabled && !locked) || removeDisabled}
682
- aria-disabled={locked || undefined}
683
- aria-describedby={locked ? reasonId : undefined}
684
- className={cn(
685
- // Logical margins: the × sits at the END of the pill, which is the left in RTL.
686
- "-me-0.5 ms-0.5 shrink-0 p-0.5 transition-colors",
687
- shape === "square" ? "rounded-sm" : "rounded-full",
688
- FOCUS_RING,
689
- // §4: the × is a 48 px target at Large without growing the chip around it.
690
- REMOVE_HIT_AREA_LARGE,
691
- !locked && "hover:bg-active",
692
- locked && "cursor-not-allowed",
693
- ((disabled && !locked) || removeDisabled) && "pointer-events-none",
694
- // A disabled chip is already dimmed as a whole; dimming the × again on top
695
- // would take it to a quarter. `removeDisabled` alone dims just the ×.
696
- removeDisabled && !disabled && "opacity-40",
697
- )}
698
- >
699
- <X className={s.remove} aria-hidden />
700
- </button>
701
- ) : null;
702
-
703
- // ── The combined shape: one pill, two interactive siblings inside it.
704
- const pill = (inner: ReactNode) => (
705
- <span
706
- ref={snap ? snapRef : undefined}
707
- data-tone={tone}
708
- // The pill is the target's box here (§4): the body inside stretches to its height.
709
- className={cn(
710
- CHIP_PILL,
711
- s.tail,
712
- radius,
713
- surface,
714
- target && CHIP_TOUCH_LARGE,
715
- snap && "justify-center",
716
- className,
717
- )}
718
- >
719
- {inner}
720
- {remove}
721
- </span>
722
- );
723
- // The body inside a pill: no border or surface of its own (the pill has them), a
724
- // hover wash in the text's own hue so it works on every tone.
725
- const inner = cn(
726
- "inline-flex min-w-0 items-center self-stretch transition-colors",
727
- radius,
728
- CHIP_RING,
729
- s.split,
730
- type,
731
- !disabled && !locked && "cursor-pointer hover:bg-current/10",
732
- disabled && !locked && "cursor-default",
733
- locked && "cursor-not-allowed",
734
- );
735
-
736
- // ── The three shapes.
737
- if (href && !disabled) {
738
- // On this shape `onClick` is the link shape's, typed for the anchor.
739
- const onLinkClick = onClick as ChipLinkProps["onClick"];
740
- const linkProps: ChipLinkProps = {
741
- ...toneData,
742
- ...rest,
743
- ref: (remove ? ref : ownRef) as Ref<HTMLAnchorElement>,
744
- href,
745
- onClick: onLinkClick,
746
- "aria-current": selected ? "true" : undefined,
747
- className: remove ? inner : look,
748
- children: body,
749
- };
750
- const render = pickLinkRenderer(renderLink, kitLink, href);
751
- const link = render ? (
752
- // Through a component rather than called here, so the forwarded ref arrives as
753
- // an ordinary prop of an element and is never handed to a function mid-render.
754
- <RenderedLink render={render} {...linkProps} />
755
- ) : (
756
- <a
757
- ref={(remove ? ref : ownRef) as React.Ref<HTMLAnchorElement>}
758
- {...toneData}
759
- href={href}
760
- aria-current={selected ? "true" : undefined}
761
- onClick={onLinkClick}
762
- className={remove ? inner : look}
763
- {...rest}
764
- >
765
- {body}
766
- </a>
767
- );
768
- return remove ? pill(link) : link;
769
- }
770
-
771
- // `!href`: a DISABLED link renders no link, and its link-shaped `onClick` must not
772
- // turn it into a button instead — it falls through to the inert span, as before.
773
- if (onClick && !href) {
774
- const onButtonClick = onClick as (event: MouseEvent<HTMLButtonElement>) => void;
775
- const ownDescribedBy = rest["aria-describedby"];
776
- const button = (
777
- <button
778
- ref={(remove ? ref : ownRef) as React.Ref<HTMLButtonElement>}
779
- {...toneData}
780
- type="button"
781
- onClick={(e) => {
782
- // Locked: the press is swallowed — the chip saves on press, and a lock that
783
- // let it through would toggle a state that is never stored.
784
- if (locked) {
785
- e.preventDefault();
786
- return;
787
- }
788
- onButtonClick(e);
789
- }}
790
- disabled={disabled && !locked}
791
- // Only when `selected` is PASSED: a chip with `onClick` and no `selected` is an
792
- // action button (it does something), not a toggle (it is on or off), and
793
- // announcing it "not pressed" would claim a state it does not have.
794
- // A checkbox chip says "checked", not "pressed" — the same state in the words
795
- // of the control it looks like.
796
- role={isCheckbox ? "checkbox" : undefined}
797
- aria-pressed={isCheckbox ? undefined : selected}
798
- aria-checked={isCheckbox ? !!selected : undefined}
799
- className={remove ? inner : look}
800
- {...rest}
801
- // After the spread, merged with it: the lock's state and reason are not the
802
- // caller's to drop by passing an `aria-describedby` of their own.
803
- aria-disabled={locked || (rest["aria-disabled"] as boolean | "true" | "false" | undefined)}
804
- aria-describedby={
805
- locked ? [ownDescribedBy, reasonId].filter(Boolean).join(" ") : (ownDescribedBy as string | undefined)
806
- }
807
- >
808
- {body}
809
- </button>
810
- );
811
- const shaped = remove ? pill(button) : button;
812
- if (!locked) return shaped;
813
- return (
814
- <LockedReason lock={{ reason: disabledReason, reasonId }} display={disabledReasonDisplay}>
815
- {shaped}
816
- </LockedReason>
817
- );
818
- }
819
-
820
- return (
821
- /* eslint-disable-next-line jsx-a11y/no-static-element-interactions -- the handlers are
822
- the roving-focus hooks, live only when the container passes `role` and `tabIndex`
823
- (ChipInput does); the role is a prop, so the rule cannot see it. */
824
- <span
825
- ref={ownRef as React.Ref<HTMLSpanElement>}
826
- {...toneData}
827
- className={look}
828
- tabIndex={tabIndex}
829
- role={role}
830
- onKeyDown={onKeyDown}
831
- onFocus={onFocus}
832
- {...rest}
833
- >
834
- {body}
835
- {remove}
836
- </span>
837
- );
838
- }
839
-
840
- /** Calls a chip's `renderLink` with the props it was given — see its call site. */
841
- function RenderedLink({ render, ...props }: ChipLinkProps & { render: (props: ChipLinkProps) => ReactElement }) {
842
- return render(props);
843
- }