@eifi1/ui-kit 0.51.3 → 0.51.5

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 (780) hide show
  1. package/README.md +6 -6
  2. package/dist/account/account-settings-labels.js.map +1 -1
  3. package/dist/account/account-settings.js +11 -9
  4. package/dist/account/account-settings.js.map +1 -1
  5. package/dist/account/delete-account-setting.js +56 -65
  6. package/dist/account/delete-account-setting.js.map +1 -1
  7. package/dist/account/email-change-setting-labels.js.map +1 -1
  8. package/dist/account/email-change-setting.js.map +1 -1
  9. package/dist/account/passkeys-setting.js.map +1 -1
  10. package/dist/account/sessions-setting.js.map +1 -1
  11. package/dist/admin/admin-action-confirm.js +1 -3
  12. package/dist/admin/admin-action-confirm.js.map +1 -1
  13. package/dist/admin/admin-action-log.js.map +1 -1
  14. package/dist/admin/admin-area-labels.js +4 -1
  15. package/dist/admin/admin-area-labels.js.map +1 -1
  16. package/dist/admin/admin-overview.js +19 -11
  17. package/dist/admin/admin-overview.js.map +1 -1
  18. package/dist/admin/admin-sections.js.map +1 -1
  19. package/dist/admin/admin-tool-links.d.ts +1 -1
  20. package/dist/admin/admin-tool-links.js +7 -1
  21. package/dist/admin/admin-tool-links.js.map +1 -1
  22. package/dist/admin/invitations-panel.js +2 -13
  23. package/dist/admin/invitations-panel.js.map +1 -1
  24. package/dist/admin/mail-test-card.js.map +1 -1
  25. package/dist/admin/reviewer-scope-editor.js +4 -11
  26. package/dist/admin/reviewer-scope-editor.js.map +1 -1
  27. package/dist/admin/role-select.js.map +1 -1
  28. package/dist/admin/user-roster.js +1 -9
  29. package/dist/admin/user-roster.js.map +1 -1
  30. package/dist/auth/accept-invitation.js.map +1 -1
  31. package/dist/auth/auth-errors.js.map +1 -1
  32. package/dist/auth/forgot-password-form.js +23 -31
  33. package/dist/auth/forgot-password-form.js.map +1 -1
  34. package/dist/auth/register-form.js.map +1 -1
  35. package/dist/auth/reset-password-form.js.map +1 -1
  36. package/dist/auth/sign-in-form.js +13 -5
  37. package/dist/auth/sign-in-form.js.map +1 -1
  38. package/dist/auth/verify-email.js +1 -8
  39. package/dist/auth/verify-email.js.map +1 -1
  40. package/dist/billing/billing-banner.js.map +1 -1
  41. package/dist/billing/billing-labels.js.map +1 -1
  42. package/dist/billing/checkout-processing.js.map +1 -1
  43. package/dist/billing/plan-card.js +91 -85
  44. package/dist/billing/plan-card.js.map +1 -1
  45. package/dist/billing/plan-limit-toast.js.map +1 -1
  46. package/dist/billing/plan-limit.js.map +1 -1
  47. package/dist/billing/plan-price.js.map +1 -1
  48. package/dist/billing/plan-switch.js.map +1 -1
  49. package/dist/billing/subscription-actions.js.map +1 -1
  50. package/dist/bin/eifi1-pay-page.mjs +6 -1
  51. package/dist/components/account-chips.js.map +1 -1
  52. package/dist/components/alert-banner.js +1 -5
  53. package/dist/components/alert-banner.js.map +1 -1
  54. package/dist/components/amount-input.js +29 -12
  55. package/dist/components/amount-input.js.map +1 -1
  56. package/dist/components/authed-image.js.map +1 -1
  57. package/dist/components/autocomplete.js.map +1 -1
  58. package/dist/components/bulk-action-bar.js +1 -4
  59. package/dist/components/bulk-action-bar.js.map +1 -1
  60. package/dist/components/button-group.js.map +1 -1
  61. package/dist/components/button-look.js.map +1 -1
  62. package/dist/components/button.js +1 -7
  63. package/dist/components/button.js.map +1 -1
  64. package/dist/components/calculator.js +5 -5
  65. package/dist/components/calculator.js.map +1 -1
  66. package/dist/components/calendar-heatmap.js +4 -10
  67. package/dist/components/calendar-heatmap.js.map +1 -1
  68. package/dist/components/card.js +1 -8
  69. package/dist/components/card.js.map +1 -1
  70. package/dist/components/chart-zoom-core.js +3 -17
  71. package/dist/components/chart-zoom-core.js.map +1 -1
  72. package/dist/components/chart.d.ts +1 -1
  73. package/dist/components/chart.js +4 -22
  74. package/dist/components/chart.js.map +1 -1
  75. package/dist/components/checkbox-group.js +1 -4
  76. package/dist/components/checkbox-group.js.map +1 -1
  77. package/dist/components/chip-input.js +4 -1
  78. package/dist/components/chip-input.js.map +1 -1
  79. package/dist/components/chip.js +10 -5
  80. package/dist/components/chip.js.map +1 -1
  81. package/dist/components/choice-card.js +58 -74
  82. package/dist/components/choice-card.js.map +1 -1
  83. package/dist/components/column-mapper-labels.js.map +1 -1
  84. package/dist/components/column-mapper.js +167 -227
  85. package/dist/components/column-mapper.js.map +1 -1
  86. package/dist/components/combobox-core.js +5 -9
  87. package/dist/components/combobox-core.js.map +1 -1
  88. package/dist/components/combobox.js +1 -4
  89. package/dist/components/combobox.js.map +1 -1
  90. package/dist/components/confirm-dialog.js.map +1 -1
  91. package/dist/components/copy-button.js.map +1 -1
  92. package/dist/components/country-select.d.ts +5 -4
  93. package/dist/components/country-select.js +3 -19
  94. package/dist/components/country-select.js.map +1 -1
  95. package/dist/components/currency-option-list.js +13 -11
  96. package/dist/components/currency-option-list.js.map +1 -1
  97. package/dist/components/currency-select.js +1 -6
  98. package/dist/components/currency-select.js.map +1 -1
  99. package/dist/components/danger-confirm.js.map +1 -1
  100. package/dist/components/data-table-cells.js.map +1 -1
  101. package/dist/components/data-table-column-settings.js.map +1 -1
  102. package/dist/components/data-table-filter-popover.js +2 -18
  103. package/dist/components/data-table-filter-popover.js.map +1 -1
  104. package/dist/components/data-table-filters.js.map +1 -1
  105. package/dist/components/data-table-fit.js +7 -5
  106. package/dist/components/data-table-fit.js.map +1 -1
  107. package/dist/components/data-table-groups.js +3 -1
  108. package/dist/components/data-table-groups.js.map +1 -1
  109. package/dist/components/data-table-head.js +49 -57
  110. package/dist/components/data-table-head.js.map +1 -1
  111. package/dist/components/data-table-mobile.js +31 -44
  112. package/dist/components/data-table-mobile.js.map +1 -1
  113. package/dist/components/data-table-pagination.js.map +1 -1
  114. package/dist/components/data-table-row-actions.js +19 -16
  115. package/dist/components/data-table-row-actions.js.map +1 -1
  116. package/dist/components/data-table-row.js.map +1 -1
  117. package/dist/components/data-table-shared.js.map +1 -1
  118. package/dist/components/data-table-sort.js.map +1 -1
  119. package/dist/components/data-table-virtual.js +4 -1
  120. package/dist/components/data-table-virtual.js.map +1 -1
  121. package/dist/components/data-table.d.ts +8 -0
  122. package/dist/components/data-table.js +30 -39
  123. package/dist/components/data-table.js.map +1 -1
  124. package/dist/components/date-picker.js +1 -6
  125. package/dist/components/date-picker.js.map +1 -1
  126. package/dist/components/date-range-picker.js.map +1 -1
  127. package/dist/components/description-list.js +10 -10
  128. package/dist/components/description-list.js.map +1 -1
  129. package/dist/components/dialog-frame.js +9 -2
  130. package/dist/components/dialog-frame.js.map +1 -1
  131. package/dist/components/disclosure.js +17 -27
  132. package/dist/components/disclosure.js.map +1 -1
  133. package/dist/components/dropdown.js +25 -35
  134. package/dist/components/dropdown.js.map +1 -1
  135. package/dist/components/empty-state.js.map +1 -1
  136. package/dist/components/entity-combobox.js.map +1 -1
  137. package/dist/components/error-boundary.js.map +1 -1
  138. package/dist/components/field-base.js +5 -5
  139. package/dist/components/field-base.js.map +1 -1
  140. package/dist/components/field-parts.d.ts +1 -1
  141. package/dist/components/field-parts.js +10 -14
  142. package/dist/components/field-parts.js.map +1 -1
  143. package/dist/components/field-sync.js +8 -10
  144. package/dist/components/field-sync.js.map +1 -1
  145. package/dist/components/file-button.js.map +1 -1
  146. package/dist/components/file-dropzone.js.map +1 -1
  147. package/dist/components/floating-panel.js +4 -1
  148. package/dist/components/floating-panel.js.map +1 -1
  149. package/dist/components/focus-ring.js.map +1 -1
  150. package/dist/components/form-actions.js.map +1 -1
  151. package/dist/components/grouped-picker.js +11 -12
  152. package/dist/components/grouped-picker.js.map +1 -1
  153. package/dist/components/hover-menu.js +1 -4
  154. package/dist/components/hover-menu.js.map +1 -1
  155. package/dist/components/iban-input-labels.js.map +1 -1
  156. package/dist/components/icon-button.js +4 -1
  157. package/dist/components/icon-button.js.map +1 -1
  158. package/dist/components/icon-picker.js +6 -10
  159. package/dist/components/icon-picker.js.map +1 -1
  160. package/dist/components/image-grid.js +41 -50
  161. package/dist/components/image-grid.js.map +1 -1
  162. package/dist/components/inline-edit-field.js.map +1 -1
  163. package/dist/components/inline-entity-combobox.js +6 -12
  164. package/dist/components/inline-entity-combobox.js.map +1 -1
  165. package/dist/components/input.js +14 -2
  166. package/dist/components/input.js.map +1 -1
  167. package/dist/components/jump-calendar.js +1 -7
  168. package/dist/components/jump-calendar.js.map +1 -1
  169. package/dist/components/legal-labels.js +8 -2
  170. package/dist/components/legal-labels.js.map +1 -1
  171. package/dist/components/legal-page.d.ts +18 -1
  172. package/dist/components/legal-page.js +27 -2
  173. package/dist/components/legal-page.js.map +1 -1
  174. package/dist/components/legal.d.ts +40 -5
  175. package/dist/components/legal.js +41 -5
  176. package/dist/components/legal.js.map +1 -1
  177. package/dist/components/lightbox.js.map +1 -1
  178. package/dist/components/line-items.js +26 -36
  179. package/dist/components/line-items.js.map +1 -1
  180. package/dist/components/list-labels.js +3 -1
  181. package/dist/components/list-labels.js.map +1 -1
  182. package/dist/components/list.d.ts +18 -1
  183. package/dist/components/list.js +54 -13
  184. package/dist/components/list.js.map +1 -1
  185. package/dist/components/measured-grid.js +29 -53
  186. package/dist/components/measured-grid.js.map +1 -1
  187. package/dist/components/menu-item.js.map +1 -1
  188. package/dist/components/mini-calendar.js +13 -31
  189. package/dist/components/mini-calendar.js.map +1 -1
  190. package/dist/components/money-field.js.map +1 -1
  191. package/dist/components/month-picker.js +10 -21
  192. package/dist/components/month-picker.js.map +1 -1
  193. package/dist/components/multi-entity-combobox.js +3 -16
  194. package/dist/components/multi-entity-combobox.js.map +1 -1
  195. package/dist/components/multi-select.js.map +1 -1
  196. package/dist/components/nav-pills.js +10 -1
  197. package/dist/components/nav-pills.js.map +1 -1
  198. package/dist/components/number-field.js.map +1 -1
  199. package/dist/components/number-input.js +1 -7
  200. package/dist/components/number-input.js.map +1 -1
  201. package/dist/components/numpad-sheet.js +1 -4
  202. package/dist/components/numpad-sheet.js.map +1 -1
  203. package/dist/components/one-time-code-input.js +1 -7
  204. package/dist/components/one-time-code-input.js.map +1 -1
  205. package/dist/components/page-contents.js +13 -22
  206. package/dist/components/page-contents.js.map +1 -1
  207. package/dist/components/page-header.js +1 -11
  208. package/dist/components/page-header.js.map +1 -1
  209. package/dist/components/password-strength-labels.js.map +1 -1
  210. package/dist/components/password-strength.js +2 -8
  211. package/dist/components/password-strength.js.map +1 -1
  212. package/dist/components/phone-input.js +42 -57
  213. package/dist/components/phone-input.js.map +1 -1
  214. package/dist/components/picker-sheet.js.map +1 -1
  215. package/dist/components/pie-chart.js +1 -8
  216. package/dist/components/pie-chart.js.map +1 -1
  217. package/dist/components/popover.js.map +1 -1
  218. package/dist/components/progress-bar.js +16 -9
  219. package/dist/components/progress-bar.js.map +1 -1
  220. package/dist/components/qr-code.js +1 -8
  221. package/dist/components/qr-code.js.map +1 -1
  222. package/dist/components/row-actions.js +5 -1
  223. package/dist/components/row-actions.js.map +1 -1
  224. package/dist/components/search-field.js.map +1 -1
  225. package/dist/components/select.js +28 -38
  226. package/dist/components/select.js.map +1 -1
  227. package/dist/components/separator.js +1 -5
  228. package/dist/components/separator.js.map +1 -1
  229. package/dist/components/series-chart-axes.js +4 -1
  230. package/dist/components/series-chart-axes.js.map +1 -1
  231. package/dist/components/series-chart-budget.js.map +1 -1
  232. package/dist/components/series-chart-ticks.js.map +1 -1
  233. package/dist/components/series-chart.js +29 -45
  234. package/dist/components/series-chart.js.map +1 -1
  235. package/dist/components/settings-fields.js +21 -17
  236. package/dist/components/settings-fields.js.map +1 -1
  237. package/dist/components/share-card.js +4 -9
  238. package/dist/components/share-card.js.map +1 -1
  239. package/dist/components/sign-chip.js.map +1 -1
  240. package/dist/components/signature-pad.js +4 -13
  241. package/dist/components/signature-pad.js.map +1 -1
  242. package/dist/components/signed-amount.js +12 -5
  243. package/dist/components/signed-amount.js.map +1 -1
  244. package/dist/components/skeleton.js +2 -17
  245. package/dist/components/skeleton.js.map +1 -1
  246. package/dist/components/slider.js +13 -36
  247. package/dist/components/slider.js.map +1 -1
  248. package/dist/components/sparkline.js.map +1 -1
  249. package/dist/components/stat-tile.js +14 -10
  250. package/dist/components/stat-tile.js.map +1 -1
  251. package/dist/components/swatch-picker.js +14 -4
  252. package/dist/components/swatch-picker.js.map +1 -1
  253. package/dist/components/swipeable-row.d.ts +1 -1
  254. package/dist/components/swipeable-row.js +1 -8
  255. package/dist/components/swipeable-row.js.map +1 -1
  256. package/dist/components/table-skeleton.js +4 -1
  257. package/dist/components/table-skeleton.js.map +1 -1
  258. package/dist/components/table.js +12 -9
  259. package/dist/components/table.js.map +1 -1
  260. package/dist/components/tabs.js +5 -24
  261. package/dist/components/tabs.js.map +1 -1
  262. package/dist/components/text-link.js.map +1 -1
  263. package/dist/components/text.js.map +1 -1
  264. package/dist/components/tile-radio.js +1 -7
  265. package/dist/components/tile-radio.js.map +1 -1
  266. package/dist/components/time-input.js.map +1 -1
  267. package/dist/components/toast.js.map +1 -1
  268. package/dist/components/toggle-group.js +6 -1
  269. package/dist/components/toggle-group.js.map +1 -1
  270. package/dist/components/toggle-legend.js +2 -11
  271. package/dist/components/toggle-legend.js.map +1 -1
  272. package/dist/components/tooltip.js +2 -22
  273. package/dist/components/tooltip.js.map +1 -1
  274. package/dist/components/translation-review-editor.js +1 -4
  275. package/dist/components/translation-review-editor.js.map +1 -1
  276. package/dist/components/translation-review-parts.d.ts +1 -1
  277. package/dist/components/translation-review-parts.js +7 -1
  278. package/dist/components/translation-review-parts.js.map +1 -1
  279. package/dist/components/translation-review.js +18 -7
  280. package/dist/components/translation-review.js.map +1 -1
  281. package/dist/components/tree-view.js +14 -10
  282. package/dist/components/tree-view.js.map +1 -1
  283. package/dist/components/treemap.js +1 -13
  284. package/dist/components/treemap.js.map +1 -1
  285. package/dist/components/trigger-aria.js.map +1 -1
  286. package/dist/components/use-table-state.js +14 -11
  287. package/dist/components/use-table-state.js.map +1 -1
  288. package/dist/components/user-avatar.js +3 -26
  289. package/dist/components/user-avatar.js.map +1 -1
  290. package/dist/demo/demo-start.js +8 -4
  291. package/dist/demo/demo-start.js.map +1 -1
  292. package/dist/eslint/index.js +1 -1
  293. package/dist/feedback/feedback-attachment-labels.js.map +1 -1
  294. package/dist/feedback/feedback-attachment.js +1 -8
  295. package/dist/feedback/feedback-attachment.js.map +1 -1
  296. package/dist/feedback/feedback-capture.d.ts +1 -1
  297. package/dist/feedback/feedback-capture.js +3 -1
  298. package/dist/feedback/feedback-capture.js.map +1 -1
  299. package/dist/feedback/feedback-comment-thread.js +27 -13
  300. package/dist/feedback/feedback-comment-thread.js.map +1 -1
  301. package/dist/feedback/feedback-context.js +1 -4
  302. package/dist/feedback/feedback-context.js.map +1 -1
  303. package/dist/feedback/feedback-dialog.js.map +1 -1
  304. package/dist/feedback/feedback-inbox.js.map +1 -1
  305. package/dist/feedback/feedback-public-list.js +7 -1
  306. package/dist/feedback/feedback-public-list.js.map +1 -1
  307. package/dist/feedback/feedback-record.js +1 -5
  308. package/dist/feedback/feedback-record.js.map +1 -1
  309. package/dist/feedback/feedback-replies.js +25 -10
  310. package/dist/feedback/feedback-replies.js.map +1 -1
  311. package/dist/feedback/feedback-row-detail.js.map +1 -1
  312. package/dist/feedback/feedback-status-undo.js.map +1 -1
  313. package/dist/feedback/feedback-submit-dialog.js.map +1 -1
  314. package/dist/feedback/feedback-table.d.ts +3 -1
  315. package/dist/feedback/feedback-table.js +22 -5
  316. package/dist/feedback/feedback-table.js.map +1 -1
  317. package/dist/feedback/feedback-thread.js +2 -13
  318. package/dist/feedback/feedback-thread.js.map +1 -1
  319. package/dist/feedback/feedback-vocabulary.js.map +1 -1
  320. package/dist/feedback/feedback-vote-button.js.map +1 -1
  321. package/dist/hooks/use-anchored-rect.js.map +1 -1
  322. package/dist/hooks/use-document-title.js.map +1 -1
  323. package/dist/hooks/use-file-drop.js.map +1 -1
  324. package/dist/hooks/use-file-picker-labels.js.map +1 -1
  325. package/dist/hooks/use-file-picker.js.map +1 -1
  326. package/dist/hooks/use-focus-trap.js.map +1 -1
  327. package/dist/hooks/use-overlay-history.js +10 -5
  328. package/dist/hooks/use-overlay-history.js.map +1 -1
  329. package/dist/hooks/use-row-swipe.d.ts +1 -1
  330. package/dist/hooks/use-row-swipe.js +1 -6
  331. package/dist/hooks/use-row-swipe.js.map +1 -1
  332. package/dist/i18n/defaults.js +1 -4
  333. package/dist/i18n/defaults.js.map +1 -1
  334. package/dist/i18n/german.js +15 -4
  335. package/dist/i18n/german.js.map +1 -1
  336. package/dist/i18n/kit-labels.js +2 -8
  337. package/dist/i18n/kit-labels.js.map +1 -1
  338. package/dist/i18n/languages.js.map +1 -1
  339. package/dist/i18n/locales/en.js +19 -4
  340. package/dist/i18n/locales/en.js.map +2 -2
  341. package/dist/i18n/locales/es.js +15 -4
  342. package/dist/i18n/locales/es.js.map +1 -1
  343. package/dist/i18n/locales/fr.js +15 -4
  344. package/dist/i18n/locales/fr.js.map +1 -1
  345. package/dist/i18n/locales/hu.js +15 -4
  346. package/dist/i18n/locales/hu.js.map +1 -1
  347. package/dist/i18n/locales/it.js +15 -4
  348. package/dist/i18n/locales/it.js.map +1 -1
  349. package/dist/i18n/locales/zh.js +11 -3
  350. package/dist/i18n/locales/zh.js.map +1 -1
  351. package/dist/i18n/plurals.js.map +1 -1
  352. package/dist/i18n/review.js +15 -7
  353. package/dist/i18n/review.js.map +1 -1
  354. package/dist/i18n/shared-labels.js.map +1 -1
  355. package/dist/index.d.ts +17 -17
  356. package/dist/index.js +40 -23
  357. package/dist/index.js.map +1 -1
  358. package/dist/landing/access.js +1 -4
  359. package/dist/landing/access.js.map +1 -1
  360. package/dist/landing/landing-sections.js +35 -38
  361. package/dist/landing/landing-sections.js.map +1 -1
  362. package/dist/landing/page-seo.js.map +1 -1
  363. package/dist/lib/calc.js.map +1 -1
  364. package/dist/lib/clipboard-minus.js.map +1 -1
  365. package/dist/lib/dates.js.map +1 -1
  366. package/dist/lib/decimal-marks.js.map +1 -1
  367. package/dist/lib/device-settings.js +2 -1
  368. package/dist/lib/device-settings.js.map +1 -1
  369. package/dist/lib/direction.js.map +1 -1
  370. package/dist/lib/iban.js.map +1 -1
  371. package/dist/lib/logger.js +1 -5
  372. package/dist/lib/logger.js.map +1 -1
  373. package/dist/lib/person-name.js.map +1 -1
  374. package/dist/lib/phone.js.map +1 -1
  375. package/dist/lib/qr-encode.js +344 -8
  376. package/dist/lib/qr-encode.js.map +1 -1
  377. package/dist/lib/session-refresh.js.map +1 -1
  378. package/dist/lib/table-text.js +15 -3
  379. package/dist/lib/table-text.js.map +1 -1
  380. package/dist/lib/text-match.d.ts +20 -0
  381. package/dist/lib/text-match.js +11 -1
  382. package/dist/lib/text-match.js.map +1 -1
  383. package/dist/lib/translation-review.js.map +1 -1
  384. package/dist/notifications/notification-inbox.js +63 -44
  385. package/dist/notifications/notification-inbox.js.map +1 -1
  386. package/dist/notifications/notification-parts.js.map +1 -1
  387. package/dist/notifications/notification-types-setting.js.map +1 -1
  388. package/dist/notifications/notifications-labels.js.map +1 -1
  389. package/dist/notifications/push-device-setting.js +6 -1
  390. package/dist/notifications/push-device-setting.js.map +1 -1
  391. package/dist/notifications/push-devices-setting.js.map +1 -1
  392. package/dist/notifications/push-worker.js.map +1 -1
  393. package/dist/notifications/quiet-hours-setting.js.map +1 -1
  394. package/dist/notifications/use-push-device.js +4 -1
  395. package/dist/notifications/use-push-device.js.map +1 -1
  396. package/dist/offline/pwa-update-prompt.d.ts +1 -1
  397. package/dist/offline/pwa-update-prompt.js +7 -1
  398. package/dist/offline/pwa-update-prompt.js.map +1 -1
  399. package/dist/offline/query-persistence.js.map +1 -1
  400. package/dist/offline.d.ts +1 -1
  401. package/dist/offline.js +6 -1
  402. package/dist/offline.js.map +1 -1
  403. package/dist/pay/pay.css +8 -1
  404. package/dist/rhf/fields.d.ts +1 -2
  405. package/dist/rhf/fields.js +1 -10
  406. package/dist/rhf/fields.js.map +1 -1
  407. package/dist/rhf/form-core.js +1 -4
  408. package/dist/rhf/form-core.js.map +1 -1
  409. package/dist/rhf/line-items.js.map +1 -1
  410. package/dist/rhf/use-rhf-wizard-step.js.map +1 -1
  411. package/dist/search/command-palette.js +71 -62
  412. package/dist/search/command-palette.js.map +1 -1
  413. package/dist/search/global-search.js +34 -5
  414. package/dist/search/global-search.js.map +1 -1
  415. package/dist/search/search-index.js.map +1 -1
  416. package/dist/settings/device-reset-setting.js +1 -6
  417. package/dist/settings/device-reset-setting.js.map +1 -1
  418. package/dist/settings/settings-heading.js.map +1 -1
  419. package/dist/settings/settings-layout.js +9 -20
  420. package/dist/settings/settings-layout.js.map +1 -1
  421. package/dist/settings/use-settings-focus.d.ts +7 -0
  422. package/dist/settings/use-settings-focus.js +2 -0
  423. package/dist/settings/use-settings-focus.js.map +1 -1
  424. package/dist/settings/use-settings-route.js.map +1 -1
  425. package/dist/shell/app-shell.js +62 -31
  426. package/dist/shell/app-shell.js.map +1 -1
  427. package/dist/shell/auth-layout.js +1 -10
  428. package/dist/shell/auth-layout.js.map +1 -1
  429. package/dist/shell/dev-menu.d.ts +5 -0
  430. package/dist/shell/dev-menu.js +14 -7
  431. package/dist/shell/dev-menu.js.map +1 -1
  432. package/dist/shell/option-switcher-menu.js.map +1 -1
  433. package/dist/shell/sync-status-indicator.js +7 -6
  434. package/dist/shell/sync-status-indicator.js.map +1 -1
  435. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  436. package/dist/shell/topbar-action-menu.d.ts +14 -1
  437. package/dist/shell/topbar-action-menu.js +85 -34
  438. package/dist/shell/topbar-action-menu.js.map +1 -1
  439. package/dist/shell/topbar-controls.js +1 -10
  440. package/dist/shell/topbar-controls.js.map +1 -1
  441. package/dist/shell/tour-menu.js +9 -1
  442. package/dist/shell/tour-menu.js.map +1 -1
  443. package/dist/shell.d.ts +1 -1
  444. package/dist/shell.js +2 -1
  445. package/dist/shell.js.map +1 -1
  446. package/dist/sync/db.js.map +1 -1
  447. package/dist/sync/engine.js +24 -6
  448. package/dist/sync/engine.js.map +1 -1
  449. package/dist/sync.d.ts +2 -2
  450. package/dist/sync.js +7 -1
  451. package/dist/sync.js.map +1 -1
  452. package/dist/testing/css-variables.js.map +1 -1
  453. package/dist/testing/index.d.ts +1 -1
  454. package/dist/testing/index.js +1 -3
  455. package/dist/testing/index.js.map +1 -1
  456. package/dist/testing/react.js.map +1 -1
  457. package/dist/testing/viewport.js +7 -4
  458. package/dist/testing/viewport.js.map +1 -1
  459. package/dist/theme/contrast-tokens.js +13 -2
  460. package/dist/theme/contrast-tokens.js.map +1 -1
  461. package/dist/theme/palette-derive.d.ts +1 -1
  462. package/dist/theme/palette-derive.js +18 -29
  463. package/dist/theme/palette-derive.js.map +1 -1
  464. package/dist/theme/palette-presets.js.map +1 -1
  465. package/dist/theme/palette-store.js.map +1 -1
  466. package/dist/theme/text-size.js.map +1 -1
  467. package/dist/theme/theme-store.js +1 -3
  468. package/dist/theme/theme-store.js.map +1 -1
  469. package/dist/tour/tour-catalogue.js.map +1 -1
  470. package/dist/tour/tour-dock.js +5 -1
  471. package/dist/tour/tour-dock.js.map +1 -1
  472. package/dist/tour/tour-engine.js +1 -4
  473. package/dist/tour/tour-engine.js.map +1 -1
  474. package/dist/tour/tour.js +21 -12
  475. package/dist/tour/tour.js.map +1 -1
  476. package/dist/tour/use-tour-progress.js.map +1 -1
  477. package/dist/tour/use-tour-url-sync.js.map +1 -1
  478. package/dist/wizard/stepper-nav.js +3 -24
  479. package/dist/wizard/stepper-nav.js.map +1 -1
  480. package/dist/wizard/types.js.map +1 -1
  481. package/dist/wizard/use-wizard.js +24 -28
  482. package/dist/wizard/use-wizard.js.map +1 -1
  483. package/dist/wizard/validation.js.map +1 -1
  484. package/dist/wizard/wizard-context.js.map +1 -1
  485. package/dist/wizard/wizard-step.d.ts +1 -1
  486. package/dist/wizard/wizard-step.js +1 -8
  487. package/dist/wizard/wizard-step.js.map +1 -1
  488. package/dist/wizard/wizard-summary.js.map +1 -1
  489. package/package.json +5 -2
  490. package/src/account/account-settings-labels.ts +1 -2
  491. package/src/account/account-settings.tsx +11 -17
  492. package/src/account/delete-account-setting.tsx +1 -6
  493. package/src/account/email-change-setting-labels.ts +1 -2
  494. package/src/account/email-change-setting.tsx +3 -1
  495. package/src/account/passkeys-setting.tsx +1 -3
  496. package/src/account/sessions-setting.tsx +4 -2
  497. package/src/admin/admin-action-confirm.tsx +4 -7
  498. package/src/admin/admin-action-log.tsx +29 -29
  499. package/src/admin/admin-area-labels.ts +4 -1
  500. package/src/admin/admin-overview.tsx +8 -2
  501. package/src/admin/admin-sections.tsx +3 -1
  502. package/src/admin/admin-tool-links.tsx +7 -1
  503. package/src/admin/invitations-panel.tsx +5 -11
  504. package/src/admin/mail-test-card.tsx +1 -2
  505. package/src/admin/reviewer-scope-editor.tsx +4 -9
  506. package/src/admin/role-select.tsx +4 -2
  507. package/src/admin/user-roster.tsx +2 -11
  508. package/src/auth/accept-invitation.tsx +1 -7
  509. package/src/auth/auth-errors.ts +1 -6
  510. package/src/auth/forgot-password-form.tsx +2 -7
  511. package/src/auth/register-form.tsx +7 -8
  512. package/src/auth/reset-password-form.tsx +2 -5
  513. package/src/auth/sign-in-form.tsx +15 -14
  514. package/src/auth/verify-email.tsx +2 -7
  515. package/src/billing/billing-banner.tsx +3 -7
  516. package/src/billing/billing-labels.ts +6 -4
  517. package/src/billing/checkout-processing.ts +0 -1
  518. package/src/billing/plan-card.tsx +9 -8
  519. package/src/billing/plan-limit-toast.tsx +1 -2
  520. package/src/billing/plan-limit.ts +1 -2
  521. package/src/billing/plan-price.ts +1 -4
  522. package/src/billing/plan-switch.tsx +1 -2
  523. package/src/billing/subscription-actions.tsx +5 -2
  524. package/src/components/account-chips.tsx +1 -7
  525. package/src/components/alert-banner.tsx +2 -8
  526. package/src/components/amount-input.tsx +206 -178
  527. package/src/components/authed-image.tsx +7 -4
  528. package/src/components/autocomplete.tsx +7 -9
  529. package/src/components/bulk-action-bar.tsx +2 -7
  530. package/src/components/button-group.tsx +1 -2
  531. package/src/components/button-look.ts +6 -17
  532. package/src/components/button.tsx +1 -4
  533. package/src/components/calculator.tsx +6 -9
  534. package/src/components/calendar-heatmap.tsx +5 -10
  535. package/src/components/card.tsx +9 -13
  536. package/src/components/chart-zoom-core.tsx +6 -33
  537. package/src/components/chart.tsx +8 -31
  538. package/src/components/checkbox-group.tsx +1 -4
  539. package/src/components/chip-input.tsx +6 -6
  540. package/src/components/chip.tsx +14 -26
  541. package/src/components/choice-card.tsx +4 -18
  542. package/src/components/column-mapper-labels.ts +3 -10
  543. package/src/components/column-mapper.tsx +33 -122
  544. package/src/components/combobox-core.tsx +17 -47
  545. package/src/components/combobox.tsx +2 -6
  546. package/src/components/confirm-dialog.tsx +1 -3
  547. package/src/components/copy-button.tsx +2 -4
  548. package/src/components/country-select.tsx +9 -21
  549. package/src/components/currency-option-list.tsx +16 -18
  550. package/src/components/currency-select.tsx +2 -7
  551. package/src/components/danger-confirm.tsx +8 -9
  552. package/src/components/data-table-cells.tsx +1 -2
  553. package/src/components/data-table-column-settings.tsx +1 -3
  554. package/src/components/data-table-filter-popover.tsx +5 -19
  555. package/src/components/data-table-filters.ts +1 -6
  556. package/src/components/data-table-fit.ts +7 -7
  557. package/src/components/data-table-groups.tsx +3 -1
  558. package/src/components/data-table-head.tsx +32 -46
  559. package/src/components/data-table-mobile.tsx +99 -108
  560. package/src/components/data-table-pagination.tsx +2 -6
  561. package/src/components/data-table-row-actions.tsx +25 -24
  562. package/src/components/data-table-row.tsx +16 -17
  563. package/src/components/data-table-shared.tsx +10 -16
  564. package/src/components/data-table-sort.ts +1 -2
  565. package/src/components/data-table-virtual.ts +9 -4
  566. package/src/components/data-table.tsx +497 -501
  567. package/src/components/date-picker.tsx +1 -7
  568. package/src/components/date-range-picker.tsx +3 -13
  569. package/src/components/description-list.tsx +7 -13
  570. package/src/components/dialog-frame.tsx +12 -3
  571. package/src/components/disclosure.tsx +8 -12
  572. package/src/components/dropdown.tsx +3 -11
  573. package/src/components/empty-state.tsx +1 -3
  574. package/src/components/entity-combobox.tsx +2 -6
  575. package/src/components/error-boundary.tsx +7 -7
  576. package/src/components/field-base.tsx +8 -14
  577. package/src/components/field-parts.tsx +12 -23
  578. package/src/components/field-sync.tsx +7 -11
  579. package/src/components/file-button.tsx +7 -3
  580. package/src/components/file-dropzone.tsx +7 -12
  581. package/src/components/floating-panel.tsx +44 -51
  582. package/src/components/focus-ring.ts +1 -2
  583. package/src/components/form-actions.tsx +1 -4
  584. package/src/components/grouped-picker.tsx +21 -16
  585. package/src/components/hover-menu.tsx +1 -4
  586. package/src/components/iban-input-labels.ts +1 -2
  587. package/src/components/icon-button.tsx +46 -48
  588. package/src/components/icon-picker.tsx +9 -20
  589. package/src/components/image-grid.tsx +1 -6
  590. package/src/components/inline-edit-field.tsx +1 -5
  591. package/src/components/inline-entity-combobox.tsx +11 -25
  592. package/src/components/input.tsx +14 -2
  593. package/src/components/jump-calendar.tsx +2 -6
  594. package/src/components/legal-labels.ts +8 -3
  595. package/src/components/legal-page.tsx +56 -6
  596. package/src/components/legal.tsx +83 -10
  597. package/src/components/lightbox.tsx +1 -3
  598. package/src/components/line-items.tsx +7 -15
  599. package/src/components/list-labels.ts +2 -0
  600. package/src/components/list.tsx +81 -27
  601. package/src/components/measured-grid.tsx +8 -30
  602. package/src/components/menu-item.tsx +1 -3
  603. package/src/components/mini-calendar.tsx +129 -159
  604. package/src/components/money-field.tsx +4 -2
  605. package/src/components/month-picker.tsx +14 -21
  606. package/src/components/multi-entity-combobox.tsx +6 -26
  607. package/src/components/multi-select.tsx +5 -9
  608. package/src/components/nav-pills.tsx +10 -2
  609. package/src/components/number-field.tsx +18 -15
  610. package/src/components/number-input.tsx +3 -19
  611. package/src/components/numpad-sheet.tsx +9 -13
  612. package/src/components/one-time-code-input.tsx +6 -11
  613. package/src/components/page-contents.tsx +2 -9
  614. package/src/components/page-header.tsx +5 -10
  615. package/src/components/password-strength-labels.ts +1 -2
  616. package/src/components/password-strength.tsx +6 -9
  617. package/src/components/phone-input.tsx +2 -13
  618. package/src/components/picker-sheet.tsx +2 -5
  619. package/src/components/pie-chart.tsx +6 -12
  620. package/src/components/popover.tsx +2 -1
  621. package/src/components/progress-bar.tsx +16 -25
  622. package/src/components/qr-code.tsx +2 -9
  623. package/src/components/row-actions.tsx +9 -1
  624. package/src/components/search-field.tsx +4 -5
  625. package/src/components/select.tsx +2 -10
  626. package/src/components/separator.tsx +1 -5
  627. package/src/components/series-chart-axes.ts +5 -5
  628. package/src/components/series-chart-budget.ts +1 -4
  629. package/src/components/series-chart-ticks.ts +1 -4
  630. package/src/components/series-chart.tsx +43 -83
  631. package/src/components/settings-fields.tsx +20 -15
  632. package/src/components/share-card.tsx +6 -14
  633. package/src/components/sign-chip.tsx +16 -16
  634. package/src/components/signature-pad.tsx +21 -13
  635. package/src/components/signed-amount.tsx +6 -14
  636. package/src/components/skeleton.tsx +2 -13
  637. package/src/components/slider.tsx +9 -20
  638. package/src/components/sparkline.tsx +2 -13
  639. package/src/components/stat-tile.tsx +13 -24
  640. package/src/components/swatch-picker.tsx +8 -3
  641. package/src/components/swipeable-row.tsx +2 -11
  642. package/src/components/table-skeleton.tsx +4 -1
  643. package/src/components/table.tsx +12 -8
  644. package/src/components/tabs.tsx +24 -39
  645. package/src/components/text-link.tsx +6 -6
  646. package/src/components/text.tsx +1 -2
  647. package/src/components/tile-radio.tsx +6 -19
  648. package/src/components/time-input.tsx +4 -5
  649. package/src/components/toast.tsx +3 -12
  650. package/src/components/toggle-group.tsx +9 -9
  651. package/src/components/toggle-legend.tsx +4 -16
  652. package/src/components/tooltip.tsx +9 -48
  653. package/src/components/translation-review-editor.tsx +4 -4
  654. package/src/components/translation-review-parts.tsx +7 -1
  655. package/src/components/translation-review.tsx +15 -16
  656. package/src/components/tree-view.tsx +17 -20
  657. package/src/components/treemap.tsx +3 -15
  658. package/src/components/trigger-aria.ts +1 -4
  659. package/src/components/use-table-state.ts +16 -17
  660. package/src/components/user-avatar.tsx +4 -21
  661. package/src/demo/demo-start.tsx +8 -4
  662. package/src/feedback/feedback-attachment-labels.ts +2 -1
  663. package/src/feedback/feedback-attachment.tsx +16 -29
  664. package/src/feedback/feedback-capture.ts +3 -1
  665. package/src/feedback/feedback-comment-thread.tsx +9 -6
  666. package/src/feedback/feedback-context.tsx +1 -4
  667. package/src/feedback/feedback-dialog.tsx +3 -4
  668. package/src/feedback/feedback-inbox.tsx +3 -9
  669. package/src/feedback/feedback-public-list.tsx +7 -1
  670. package/src/feedback/feedback-record.ts +6 -14
  671. package/src/feedback/feedback-replies.tsx +10 -5
  672. package/src/feedback/feedback-row-detail.tsx +2 -5
  673. package/src/feedback/feedback-status-undo.ts +1 -4
  674. package/src/feedback/feedback-submit-dialog.tsx +4 -4
  675. package/src/feedback/feedback-table.tsx +29 -9
  676. package/src/feedback/feedback-thread.tsx +4 -16
  677. package/src/feedback/feedback-vocabulary.ts +72 -82
  678. package/src/feedback/feedback-vote-button.tsx +9 -8
  679. package/src/hooks/use-anchored-rect.ts +1 -4
  680. package/src/hooks/use-document-title.ts +3 -1
  681. package/src/hooks/use-file-drop.ts +1 -3
  682. package/src/hooks/use-file-picker-labels.ts +1 -2
  683. package/src/hooks/use-file-picker.tsx +1 -5
  684. package/src/hooks/use-focus-trap.ts +1 -2
  685. package/src/hooks/use-overlay-history.ts +10 -5
  686. package/src/hooks/use-row-swipe.ts +1 -6
  687. package/src/i18n/defaults.ts +1 -4
  688. package/src/i18n/german.ts +42 -50
  689. package/src/i18n/kit-labels.tsx +5 -20
  690. package/src/i18n/languages.ts +2 -8
  691. package/src/i18n/locales/en.ts +15 -31
  692. package/src/i18n/locales/es.ts +44 -50
  693. package/src/i18n/locales/fr.ts +43 -52
  694. package/src/i18n/locales/hu.ts +35 -38
  695. package/src/i18n/locales/it.ts +44 -53
  696. package/src/i18n/locales/zh.ts +23 -33
  697. package/src/i18n/plurals.ts +4 -1
  698. package/src/i18n/review.ts +20 -7
  699. package/src/i18n/shared-labels.ts +1 -2
  700. package/src/index.ts +107 -32
  701. package/src/landing/access.ts +2 -7
  702. package/src/landing/landing-sections.tsx +14 -15
  703. package/src/landing/page-seo.ts +1 -3
  704. package/src/lib/calc.ts +4 -1
  705. package/src/lib/clipboard-minus.ts +4 -1
  706. package/src/lib/dates.ts +2 -10
  707. package/src/lib/decimal-marks.ts +1 -3
  708. package/src/lib/device-settings.ts +2 -1
  709. package/src/lib/direction.ts +1 -3
  710. package/src/lib/iban.ts +89 -9
  711. package/src/lib/logger.ts +1 -5
  712. package/src/lib/person-name.ts +1 -3
  713. package/src/lib/phone.ts +5 -8
  714. package/src/lib/qr-encode.ts +32 -8
  715. package/src/lib/session-refresh.ts +5 -6
  716. package/src/lib/table-text.ts +24 -6
  717. package/src/lib/text-match.ts +43 -1
  718. package/src/lib/translation-review.ts +1 -3
  719. package/src/notifications/notification-inbox.tsx +17 -4
  720. package/src/notifications/notification-parts.tsx +1 -2
  721. package/src/notifications/notification-types-setting.tsx +19 -18
  722. package/src/notifications/notifications-labels.ts +1 -2
  723. package/src/notifications/push-device-setting.tsx +7 -1
  724. package/src/notifications/push-devices-setting.tsx +7 -3
  725. package/src/notifications/push-worker.ts +10 -2
  726. package/src/notifications/quiet-hours-setting.tsx +4 -1
  727. package/src/notifications/use-push-device.ts +4 -1
  728. package/src/offline/pwa-update-prompt.tsx +7 -1
  729. package/src/offline/query-persistence.ts +9 -6
  730. package/src/offline.ts +6 -1
  731. package/src/rhf/fields.tsx +50 -19
  732. package/src/rhf/form-core.tsx +2 -6
  733. package/src/rhf/line-items.tsx +5 -7
  734. package/src/rhf/use-rhf-wizard-step.ts +3 -12
  735. package/src/search/command-palette.tsx +15 -23
  736. package/src/search/global-search.tsx +38 -8
  737. package/src/search/search-index.ts +5 -1
  738. package/src/settings/device-reset-setting.tsx +5 -8
  739. package/src/settings/settings-heading.tsx +3 -1
  740. package/src/settings/settings-layout.tsx +6 -13
  741. package/src/settings/use-settings-focus.ts +8 -0
  742. package/src/settings/use-settings-route.ts +4 -3
  743. package/src/shell/app-shell.tsx +48 -24
  744. package/src/shell/auth-layout.tsx +1 -6
  745. package/src/shell/dev-menu.tsx +18 -6
  746. package/src/shell/option-switcher-menu.tsx +1 -3
  747. package/src/shell/sync-status-indicator.tsx +14 -12
  748. package/src/shell/top-bar-parts-labels.ts +1 -3
  749. package/src/shell/topbar-action-menu.tsx +130 -45
  750. package/src/shell/topbar-controls.tsx +5 -19
  751. package/src/shell/tour-menu.tsx +9 -1
  752. package/src/shell.ts +1 -1
  753. package/src/sync/db.ts +5 -1
  754. package/src/sync/engine.ts +44 -12
  755. package/src/sync.ts +16 -2
  756. package/src/testing/css-variables.ts +1 -2
  757. package/src/testing/index.ts +1 -6
  758. package/src/testing/react.ts +1 -2
  759. package/src/testing/viewport.ts +9 -9
  760. package/src/theme/contrast-tokens.ts +13 -2
  761. package/src/theme/palette-derive.ts +24 -50
  762. package/src/theme/palette-presets.ts +0 -1
  763. package/src/theme/palette-store.ts +1 -4
  764. package/src/theme/text-size.ts +1 -1
  765. package/src/theme/theme-store.ts +2 -6
  766. package/src/tour/tour-catalogue.tsx +4 -2
  767. package/src/tour/tour-dock.ts +5 -1
  768. package/src/tour/tour-engine.ts +2 -6
  769. package/src/tour/tour.tsx +28 -12
  770. package/src/tour/use-tour-progress.ts +8 -2
  771. package/src/tour/use-tour-url-sync.ts +3 -1
  772. package/src/vite-env.d.ts +1 -4
  773. package/src/wizard/stepper-nav.tsx +10 -35
  774. package/src/wizard/types.ts +1 -4
  775. package/src/wizard/use-wizard.ts +28 -43
  776. package/src/wizard/validation.ts +1 -5
  777. package/src/wizard/wizard-context.tsx +2 -6
  778. package/src/wizard/wizard-step.tsx +1 -8
  779. package/src/wizard/wizard-summary.tsx +2 -6
  780. package/tokens.css +393 -152
@@ -128,10 +128,7 @@ type Entry = { at: number; order: number; message: FeedbackThreadMessage };
128
128
 
129
129
  /** The admin's Hide / Unhide as a promise — a sync throw or a `void` return included —
130
130
  * so the click can catch it as Delete's does. */
131
- const hideComment = async (
132
- onHide: NonNullable<FeedbackCommentThreadProps["onHide"]>,
133
- comment: FeedbackComment,
134
- ) => {
131
+ const hideComment = async (onHide: NonNullable<FeedbackCommentThreadProps["onHide"]>, comment: FeedbackComment) => {
135
132
  await onHide(comment, !comment.hidden);
136
133
  };
137
134
 
@@ -186,7 +183,10 @@ export function FeedbackCommentThread({
186
183
  ? [{ name: attachmentName(reply.attachment_url), url: reply.attachment_url }]
187
184
  : undefined,
188
185
  badge: (
189
- <span className="inline-flex min-w-0 max-w-full flex-wrap items-center gap-1" data-feedback-entry-kind="rework">
186
+ <span
187
+ className="inline-flex min-w-0 max-w-full flex-wrap items-center gap-1"
188
+ data-feedback-entry-kind="rework"
189
+ >
190
190
  <FeedbackReworkEntryChip />
191
191
  {reply.status_to && (
192
192
  <span className="inline-flex items-center gap-1" data-feedback-reply-status={reply.status_to}>
@@ -215,7 +215,10 @@ export function FeedbackCommentThread({
215
215
  : undefined,
216
216
  staff: true,
217
217
  badge: reply.status_to ? (
218
- <span className="inline-flex min-w-0 max-w-full flex-wrap items-center gap-1" data-feedback-reply-status={reply.status_to}>
218
+ <span
219
+ className="inline-flex min-w-0 max-w-full flex-wrap items-center gap-1"
220
+ data-feedback-reply-status={reply.status_to}
221
+ >
219
222
  <span className="sr-only">{replyLabels.statusChanged}</span>
220
223
  <span aria-hidden>→</span>
221
224
  <FeedbackStatusBadge status={reply.status_to} />
@@ -179,10 +179,7 @@ export function FeedbackContextBox({
179
179
  const lead = line.endsWith(submitter) ? line.slice(0, line.length - submitter.length) : null;
180
180
  return (
181
181
  <div
182
- className={cn(
183
- "space-y-1 rounded-md border border-subtle bg-surface-2 px-3 py-2 text-xs text-muted",
184
- className,
185
- )}
182
+ className={cn("space-y-1 rounded-md border border-subtle bg-surface-2 px-3 py-2 text-xs text-muted", className)}
186
183
  >
187
184
  <div className="[overflow-wrap:anywhere]">
188
185
  {lead === null ? (
@@ -251,16 +251,15 @@ export function FeedbackDialog(props: FeedbackDialogProps) {
251
251
  const [files, setFiles] = useState<File[]>([]);
252
252
  const isMobile = usePhoneLayout();
253
253
  const noticeId = useId();
254
- const hasNotice = publicNotice !== undefined && publicNotice !== null && publicNotice !== false && publicNotice !== "";
254
+ const hasNotice =
255
+ publicNotice !== undefined && publicNotice !== null && publicNotice !== false && publicNotice !== "";
255
256
  const labels = useKitLabels("feedbackDialog", DEFAULT_FEEDBACK_DIALOG_LABELS, labelsProp);
256
257
  const attachmentText = useKitLabels("feedbackAttachment", DEFAULT_FEEDBACK_ATTACHMENT_LABELS, labelsProp);
257
258
  // Under `multiple` the heading is `attachmentList` — a screenshot AND photos — which
258
259
  // also names the chip list beneath it: one string, so the two cannot disagree. Its old
259
260
  // second name, `feedbackDialog.attachments`, went in 0.34.
260
261
  const listHeading =
261
- labelsProp?.attachmentList ??
262
- attachmentText.attachmentList ??
263
- DEFAULT_FEEDBACK_ATTACHMENT_LABELS.attachmentList!;
262
+ labelsProp?.attachmentList ?? attachmentText.attachmentList ?? DEFAULT_FEEDBACK_ATTACHMENT_LABELS.attachmentList!;
264
263
  // The attachment field resolves its own keys from `feedbackAttachment`; it gets the
265
264
  // prop's (so a caller's `attachmentAdd` still wins) plus the resolved heading.
266
265
  const attachmentLabels =
@@ -239,9 +239,7 @@ export function FeedbackStatusTransitions({
239
239
  variant === "icon"
240
240
  ? cn(
241
241
  "flex size-7 items-center justify-center rounded",
242
- active
243
- ? cn(meta.activeBg, meta.activeText)
244
- : "text-placeholder hover:text-secondary",
242
+ active ? cn(meta.activeBg, meta.activeText) : "text-placeholder hover:text-secondary",
245
243
  )
246
244
  : cn(
247
245
  "inline-flex items-center gap-1.5 rounded-md border px-2 py-1 text-xs font-medium",
@@ -529,9 +527,7 @@ export function FeedbackDetailSection({
529
527
  return (
530
528
  <div>
531
529
  <div className="mb-1 flex items-center justify-between gap-2">
532
- <div className="text-xs font-medium uppercase tracking-wide text-muted">
533
- {title}
534
- </div>
530
+ <div className="text-xs font-medium uppercase tracking-wide text-muted">{title}</div>
535
531
  {action}
536
532
  </div>
537
533
  {children}
@@ -552,7 +548,5 @@ export function FeedbackDetail({ children, className }: { children: ReactNode; c
552
548
  * carry the entire "this arrived after the answer" reading. */
553
549
  export function FeedbackProse({ children, empty }: { children?: string; empty?: ReactNode }) {
554
550
  if (!children) return <p className="text-placeholder">{empty ?? "—"}</p>;
555
- return (
556
- <p className="whitespace-pre-wrap text-secondary">{children}</p>
557
- );
551
+ return <p className="whitespace-pre-wrap text-secondary">{children}</p>;
558
552
  }
@@ -12,7 +12,13 @@ import { useKitLabels, type LabelOverride } from "../i18n/kit-labels";
12
12
  import { cn } from "../lib/cn";
13
13
  import { FILL_HEIGHT_CLASS } from "../shell/fill-height";
14
14
  import { EMPTY_FORMATTED_VALUE } from "../lib/format";
15
- import { FeedbackCategoryBadge, FeedbackDetail, FeedbackDetailSection, FeedbackProse, FeedbackStatusBadge } from "./feedback-inbox";
15
+ import {
16
+ FeedbackCategoryBadge,
17
+ FeedbackDetail,
18
+ FeedbackDetailSection,
19
+ FeedbackProse,
20
+ FeedbackStatusBadge,
21
+ } from "./feedback-inbox";
16
22
  import { useFeedbackCategoryLabels } from "./feedback-labels";
17
23
  import { FeedbackCommentThread, type FeedbackCommentsLabels } from "./feedback-comment-thread";
18
24
  import type { FeedbackEntryUploadOptions } from "./feedback-entry-file";
@@ -161,11 +161,7 @@ export const DEFAULT_MAX_ATTACHMENTS = 5;
161
161
  * A plain array (not frozen) because `accept` takes `string[]`, as
162
162
  * `DEFAULT_ATTACHMENT_ACCEPT` does — copy it before changing it.
163
163
  */
164
- export const FEEDBACK_ATTACHMENT_ACCEPT: string[] = [
165
- ...DEFAULT_ATTACHMENT_ACCEPT,
166
- "application/pdf",
167
- "text/plain",
168
- ];
164
+ export const FEEDBACK_ATTACHMENT_ACCEPT: string[] = [...DEFAULT_ATTACHMENT_ACCEPT, "application/pdf", "text/plain"];
169
165
 
170
166
  /**
171
167
  * The categories a person can pick — every one but `CRASH`, in triage order (Bug, Idea,
@@ -305,12 +301,7 @@ export function feedbackAttachmentLine(url: string): string {
305
301
  * something foreign — and written anyway it would sit in the body as prose that no
306
302
  * reader recognises as a file.
307
303
  */
308
- export function appendRework(
309
- body: string,
310
- note: string,
311
- url?: string | null,
312
- now: Date = new Date(),
313
- ): string | null {
304
+ export function appendRework(body: string, note: string, url?: string | null, now: Date = new Date()): string | null {
314
305
  const text = note.trim();
315
306
  if (!text) return null;
316
307
  if (url && !ATTACHMENT_URL.test(url)) {
@@ -339,9 +330,10 @@ export function reworkCount(body: string): number {
339
330
  * before server-kit 0.13, whose reworks are still `--- REWORK … ---` blocks). What the
340
331
  * Rework chip counts.
341
332
  */
342
- export function feedbackReworkCount(
343
- row: { body?: string | null; replies?: readonly Pick<FeedbackReply, "kind">[] | null },
344
- ): number {
333
+ export function feedbackReworkCount(row: {
334
+ body?: string | null;
335
+ replies?: readonly Pick<FeedbackReply, "kind">[] | null;
336
+ }): number {
345
337
  if (row.replies) {
346
338
  const entries = row.replies.filter((reply) => reply.kind === "rework").length;
347
339
  // A row migrated by an app that answers `replies` but not yet `kind` keeps its body's
@@ -102,7 +102,10 @@ export interface FeedbackReplyTimelineProps {
102
102
  function EntryStatus({ reply, statusChanged }: { reply: FeedbackReply; statusChanged: string }) {
103
103
  if (!reply.status_to) return null;
104
104
  return (
105
- <span className="inline-flex min-w-0 max-w-full flex-wrap items-center gap-1" data-feedback-reply-status={reply.status_to}>
105
+ <span
106
+ className="inline-flex min-w-0 max-w-full flex-wrap items-center gap-1"
107
+ data-feedback-reply-status={reply.status_to}
108
+ >
106
109
  <span className="sr-only">{statusChanged}</span>
107
110
  {reply.status_from && reply.status_from !== reply.status_to && (
108
111
  <>
@@ -167,7 +170,11 @@ export function FeedbackReplyTimeline({
167
170
  </time>
168
171
  <EntryStatus reply={reply} statusChanged={labels.statusChanged} />
169
172
  </div>
170
- <p data-private={priv} dir="auto" className="mt-0.5 whitespace-pre-wrap break-words text-start text-primary">
173
+ <p
174
+ data-private={priv}
175
+ dir="auto"
176
+ className="mt-0.5 whitespace-pre-wrap break-words text-start text-primary"
177
+ >
171
178
  {reply.body}
172
179
  </p>
173
180
  {reply.attachment_url && (
@@ -312,9 +319,7 @@ export function FeedbackReplyComposer({
312
319
  aria-label={labels.status}
313
320
  value={picked}
314
321
  disabled={pending || uploading}
315
- onChange={(event) =>
316
- setPick({ under: suggestedStatus, value: event.target.value as FeedbackStatus | "" })
317
- }
322
+ onChange={(event) => setPick({ under: suggestedStatus, value: event.target.value as FeedbackStatus | "" })}
318
323
  data-feedback-reply-status-pick=""
319
324
  >
320
325
  <option value="">{labels.noChange}</option>
@@ -234,8 +234,7 @@ export function feedbackPageUrl(context: FeedbackContext | null | undefined): st
234
234
  * keyed by URL, a React key clash keksdose had).
235
235
  */
236
236
  export function feedbackAttachmentUrls(
237
- row: Pick<FeedbackRecord, "screenshot_url" | "attachment_urls" | "body"> &
238
- Partial<Pick<FeedbackRecord, "replies">>,
237
+ row: Pick<FeedbackRecord, "screenshot_url" | "attachment_urls" | "body"> & Partial<Pick<FeedbackRecord, "replies">>,
239
238
  ): string[] {
240
239
  const urls = [
241
240
  ...(row.screenshot_url ? [row.screenshot_url] : []),
@@ -695,9 +694,7 @@ export function FeedbackRowDetail({
695
694
  <FeedbackDetailSection title={labels.subject}>
696
695
  <p className="flex flex-wrap items-center gap-x-2 gap-y-1 text-sm" data-feedback-subject="">
697
696
  <FeedbackCategoryBadge category={row.category} />
698
- <span className="min-w-0 font-medium text-primary [overflow-wrap:anywhere]">
699
- {row.title}
700
- </span>
697
+ <span className="min-w-0 font-medium text-primary [overflow-wrap:anywhere]">{row.title}</span>
701
698
  </p>
702
699
  </FeedbackDetailSection>
703
700
  )}
@@ -37,10 +37,7 @@ export interface FeedbackStatusPatch {
37
37
  * Failure is the mutation's own business: its `onError` toasts the server's `detail`,
38
38
  * else `feedbackToast.updateFailed` (§4.4) — this hook adds no second error toast.
39
39
  */
40
- export type FeedbackStatusMutate = (
41
- patch: FeedbackStatusPatch,
42
- callbacks: { onSuccess: () => void },
43
- ) => void;
40
+ export type FeedbackStatusMutate = (patch: FeedbackStatusPatch, callbacks: { onSuccess: () => void }) => void;
44
41
 
45
42
  /** What the change needs to know about the row: which one, what it is called in the
46
43
  * toast, and where it stood (the status Undo goes back to). */
@@ -107,12 +107,12 @@ export function FeedbackSubmitDialog({
107
107
  )
108
108
  }
109
109
  onCaptureScreenshot={onCaptureScreenshot}
110
- publicNotice={
111
- publicNotice ? (dialogText.publicNotice ?? DEFAULT_FEEDBACK_DIALOG_LABELS.publicNotice) : undefined
112
- }
110
+ publicNotice={publicNotice ? (dialogText.publicNotice ?? DEFAULT_FEEDBACK_DIALOG_LABELS.publicNotice) : undefined}
113
111
  // The context is read off the very values the box below shows (§3.2).
114
112
  onSubmit={(data) => onSubmit(data, feedbackContext({ user, attachUrl, url, environment, version }))}
115
- contextSlot={<FeedbackContextBox user={user} url={url} attachUrl={attachUrl} onAttachUrlChange={onAttachUrlChange} />}
113
+ contextSlot={
114
+ <FeedbackContextBox user={user} url={url} attachUrl={attachUrl} onAttachUrlChange={onAttachUrlChange} />
115
+ }
116
116
  />
117
117
  );
118
118
  }
@@ -29,7 +29,12 @@ import {
29
29
  type FeedbackCategoryLabels,
30
30
  type FeedbackStatusLabels,
31
31
  } from "./feedback-labels";
32
- import { FEEDBACK_AWAITING_STATUSES, feedbackReworkCount, type FeedbackContext, type FeedbackRecord } from "./feedback-record";
32
+ import {
33
+ FEEDBACK_AWAITING_STATUSES,
34
+ feedbackReworkCount,
35
+ type FeedbackContext,
36
+ type FeedbackRecord,
37
+ } from "./feedback-record";
33
38
  import type { FeedbackStatusChange } from "./feedback-status-undo";
34
39
  import { feedbackPageHref, feedbackPagePath } from "./feedback-row-detail";
35
40
  import type { CommitScope } from "../components/write-lock";
@@ -356,8 +361,7 @@ function FeedbackPageLinkCell({ context, openPage }: { context: FeedbackContext
356
361
  <>
357
362
  {/* The space outside the hidden span: a flex container drops it from the layout,
358
363
  and the accessible name keeps it ("Open page /accounts"). */}
359
- <span className="sr-only">{openPage}</span>{" "}
360
- <code className="min-w-0 truncate text-xs">{path}</code>
364
+ <span className="sr-only">{openPage}</span> <code className="min-w-0 truncate text-xs">{path}</code>
361
365
  <ExternalLink className="size-3 shrink-0" aria-hidden />
362
366
  </>
363
367
  );
@@ -453,7 +457,9 @@ function statusRank(status: FeedbackStatus): number {
453
457
  * - Fitted to the table's width (0.48, keksdose live #451): Subject `grow`s and
454
458
  * ellipsises, and a narrow table leaves out URL, then Email, then Resolved
455
459
  * (`fitPriority` 1–3) — the open report repeats all three — then Votes and Category
456
- * (4, 5) before Subject would drop below 10rem. Drop the two keys with
460
+ * (4, 5), then User, Date and # (6–8, 0.51.4) before Subject would drop below 8rem
461
+ * (`growMin`, 0.51.4; the table's default floor is 10).
462
+ * Drop the two keys with
457
463
  * `{ ...col, grow: undefined, fitPriority: undefined }` for the 0.47 layout.
458
464
  * - `/my-feedback` shows the same nine: the Email cell's context fallback exists for it
459
465
  * (the admin list's join is absent there, §3.1), and its phone card drops the submitter
@@ -499,6 +505,9 @@ export function feedbackColumns<T extends FeedbackTableRow>({
499
505
  sortBy: (row) => row.id,
500
506
  filter: { type: "number", getValue: (row) => row.id },
501
507
  mobileHidden: true,
508
+ // The very last to go (0.51.4, Kurvenschmiede): replies and the feedback loop name a
509
+ // report by its number, so it stays while anything else can give way.
510
+ fitPriority: 8,
502
511
  },
503
512
  {
504
513
  key: "date",
@@ -506,6 +515,8 @@ export function feedbackColumns<T extends FeedbackTableRow>({
506
515
  cell: (row) => <FeedbackDate value={row.created_at} renderDate={renderDate} />,
507
516
  sortBy: (row) => instant(row.created_at),
508
517
  filter: { type: "date", getValue: (row) => row.created_at },
518
+ // Seventh to go (0.51.4): the open report shows it.
519
+ fitPriority: 7,
509
520
  },
510
521
  {
511
522
  key: "category",
@@ -536,6 +547,11 @@ export function feedbackColumns<T extends FeedbackTableRow>({
536
547
  // The rest of the row, one line and an ellipsis (0.48, keksdose live #451: one long
537
548
  // crash title pushed Status and the row actions off the edge).
538
549
  grow: true,
550
+ // 8rem, not the table's 10 (0.51.4, Kurvenschmiede): at 768px beside a sidebar only
551
+ // Subject, Status (a fixed 13.5rem) and the row actions are left, and they were up
552
+ // to 20px too wide (Hungarian). A subject's first words carry it; the open report
553
+ // has the rest.
554
+ growMin: 8,
539
555
  },
540
556
  {
541
557
  key: "user",
@@ -556,9 +572,11 @@ export function feedbackColumns<T extends FeedbackTableRow>({
556
572
  // Name AND email, so either finds the person; the erased ones by the placeholder
557
573
  // (their context holds no name any more).
558
574
  filterBy: (row) =>
559
- row.user_id == null
560
- ? labels.deletedUser
561
- : `${feedbackSubmitter(row, labels)} ${feedbackSubmitterEmail(row)}`,
575
+ row.user_id == null ? labels.deletedUser : `${feedbackSubmitter(row, labels)} ${feedbackSubmitterEmail(row)}`,
576
+ // Sixth to go (0.51.4, Kurvenschmiede): with only 1–5, Subject reached its floor while
577
+ // #, Date and User were still drawn, and the inbox scrolled sideways from 768 to
578
+ // ~1115px beside an open sidebar. The open report names the submitter.
579
+ fitPriority: 6,
562
580
  },
563
581
  {
564
582
  key: "email",
@@ -638,8 +656,10 @@ export function feedbackColumns<T extends FeedbackTableRow>({
638
656
 
639
657
  /** What {@link useFeedbackColumns} takes: {@link FeedbackColumnsOptions} with the words
640
658
  * read from the provider, and `renderDate` optional. */
641
- export interface UseFeedbackColumnsOptions
642
- extends Omit<FeedbackColumnsOptions, "renderDate" | "labels" | "statusLabels" | "categoryLabels" | "votesHeader"> {
659
+ export interface UseFeedbackColumnsOptions extends Omit<
660
+ FeedbackColumnsOptions,
661
+ "renderDate" | "labels" | "statusLabels" | "categoryLabels" | "votesHeader"
662
+ > {
643
663
  /** Default: the kit's date with the weekday ({@link useFeedbackRenderDate}). */
644
664
  renderDate?: FeedbackRenderDate;
645
665
  /** Over the `feedbackPage` namespace. Keep it stable (module scope or memoised): it is
@@ -18,10 +18,7 @@ import { FeedbackAttachmentField } from "./feedback-attachment";
18
18
  import type { FeedbackAttachmentFieldSingleProps } from "./feedback-attachment";
19
19
  import type { FeedbackNoteAttachment } from "./feedback-inbox";
20
20
  import type { FeedbackAttachmentLabels } from "./feedback-dialog";
21
- import {
22
- DEFAULT_FEEDBACK_COMPOSER_LABELS,
23
- DEFAULT_FEEDBACK_THREAD_LABELS,
24
- } from "./feedback-thread-labels";
21
+ import { DEFAULT_FEEDBACK_COMPOSER_LABELS, DEFAULT_FEEDBACK_THREAD_LABELS } from "./feedback-thread-labels";
25
22
 
26
23
  /**
27
24
  * The conversation under a report: who said what, when, with what attached — and the
@@ -217,12 +214,7 @@ export function FeedbackThread({
217
214
  }
218
215
  if (messages.length === 0) {
219
216
  return (
220
- <EmptyState
221
- variant="inline"
222
- size="sm"
223
- title={empty ?? labels.empty}
224
- className={cn("justify-start", className)}
225
- />
217
+ <EmptyState variant="inline" size="sm" title={empty ?? labels.empty} className={cn("justify-start", className)} />
226
218
  );
227
219
  }
228
220
 
@@ -288,9 +280,7 @@ export function FeedbackThread({
288
280
  <article
289
281
  className={cn(
290
282
  "max-w-[85%] min-w-0 rounded-lg px-3 py-2 text-sm",
291
- message.own
292
- ? "rounded-ee-sm bg-brand-soft"
293
- : "rounded-es-sm bg-surface-2",
283
+ message.own ? "rounded-ee-sm bg-brand-soft" : "rounded-es-sm bg-surface-2",
294
284
  )}
295
285
  >
296
286
  <header className="mb-0.5 flex flex-wrap items-center gap-x-2 gap-y-0.5 text-caption text-muted">
@@ -361,9 +351,7 @@ function DefaultAttachment({
361
351
  {/* A file name wraps from Large up, as the attachments of the composer do (text
362
352
  size §10.17; round 0.34 T1: the sweep read "export-20…"). */}
363
353
  <span className="min-w-0 truncate-until-large">{name}</span>
364
- {attachment.size !== undefined && (
365
- <span className="shrink-0 text-muted">{size(attachment.size)}</span>
366
- )}
354
+ {attachment.size !== undefined && <span className="shrink-0 text-muted">{size(attachment.size)}</span>}
367
355
  </>
368
356
  );
369
357
  const chip =
@@ -37,15 +37,7 @@ import type { LucideIcon } from "lucide-react";
37
37
  * implementation", and nobody works an OPEN row. `REWORK` joined in 0.40 (§10.2
38
38
  * decisions 2, 4): "sent back, released for work again" — a READY that came back. */
39
39
  export type FeedbackStatus =
40
- | "OPEN"
41
- | "READY"
42
- | "REWORK"
43
- | "IN_PROGRESS"
44
- | "IN_EVALUATION"
45
- | "NEEDS_LIVE_TEST"
46
- | "POSTPONED"
47
- | "DONE"
48
- | "WONT_DO";
40
+ "OPEN" | "READY" | "REWORK" | "IN_PROGRESS" | "IN_EVALUATION" | "NEEDS_LIVE_TEST" | "POSTPONED" | "DONE" | "WONT_DO";
49
41
 
50
42
  /** What a report is about. `CRASH` is filed by an error boundary and never
51
43
  * chosen, which is exactly why it is loud below and absent from every picker. */
@@ -61,79 +53,77 @@ export type FeedbackCategory = "CRASH" | "BUG" | "IDEA" | "QUESTION" | "OTHER";
61
53
  * a restated list cannot be checked for exhaustiveness: an eighth status would
62
54
  * break the build here and leave a literal eight long (as READY did in 0.31).
63
55
  */
64
- export const FEEDBACK_STATUS_META: Record<
65
- FeedbackStatus,
66
- { icon: LucideIcon; activeBg: string; activeText: string }
67
- > = {
68
- OPEN: {
69
- icon: Inbox,
70
- activeBg: "bg-active",
71
- activeText: "text-primary",
72
- },
73
- // Triaged and released for implementation (feedback contract §8.2, keksdose live
74
- // #396): OPEN is "filed, nobody has looked yet", READY is "go". The brand tint at full
75
- // strength, so it reads as the go-ahead beside OPEN's neutral fill and
76
- // NEEDS_LIVE_TEST's muted brand.
77
- READY: {
78
- icon: ClipboardCheck,
79
- activeBg: "bg-brand-soft",
80
- activeText: "text-brand",
81
- },
82
- // Sent back by its author or an admin and released for work again (0.40, feedback
83
- // contract §10.2 decision 4): the Rework button's `RotateCcw`, in the danger tint so the
84
- // queue shows reworks apart from new reports. Not IN_PROGRESS's warning tint — that is
85
- // where a REWORK row moves next — and WONT_DO, the only other red, sits at the far end
86
- // with `Ban`.
87
- REWORK: {
88
- icon: RotateCcw,
89
- activeBg: "bg-danger-soft",
90
- activeText: "text-danger",
91
- },
92
- IN_PROGRESS: {
93
- icon: Wrench,
94
- activeBg: "bg-warning-soft",
95
- activeText: "text-warning",
96
- },
97
- // Where solved work is parked, waiting on the person who reported it. Its own
98
- // colour, because "somebody has to check this" is a state you want to find by
99
- // scanning rather than by reading.
100
- IN_EVALUATION: {
101
- icon: Eye,
102
- activeBg: "bg-info-soft",
103
- activeText: "text-info",
104
- },
105
- // Resolved but only checkable on a deployed build — the SOFT brand tint, so it
106
- // reads as "waiting on something" rather than as a done or a refusal, and it
107
- // follows whatever the consumer's brand is instead of pinning an indigo island
108
- // beside it.
109
- NEEDS_LIVE_TEST: {
110
- icon: CloudUpload,
111
- activeBg: "bg-brand-soft",
112
- activeText: "text-brand-muted",
113
- },
114
- // Parked on purpose. Muted, not `--danger`: it is not a refusal.
115
- POSTPONED: {
116
- icon: PauseCircle,
117
- activeBg: "bg-active",
118
- activeText: "text-secondary",
119
- },
120
- // The one status with nowhere to move to: the vocabulary has a brand, an info, a
121
- // warning and a danger, and nothing that means "succeeded". Deliberately NOT
122
- // borrowed from a family that means something else — `--status-synced` is a
123
- // FIELD's trip to the database rather than an outcome, and tokens.css says so in
124
- // as many words. Green beside WONT_DO's red is the classic CVD-unsafe pair, which
125
- // is why both carry a glyph and neither leans on colour alone.
126
- DONE: {
127
- icon: CheckCircle2,
128
- activeBg: "bg-success-soft",
129
- activeText: "text-success",
130
- },
131
- WONT_DO: {
132
- icon: Ban,
133
- activeBg: "bg-danger-soft",
134
- activeText: "text-danger",
135
- },
136
- };
56
+ export const FEEDBACK_STATUS_META: Record<FeedbackStatus, { icon: LucideIcon; activeBg: string; activeText: string }> =
57
+ {
58
+ OPEN: {
59
+ icon: Inbox,
60
+ activeBg: "bg-active",
61
+ activeText: "text-primary",
62
+ },
63
+ // Triaged and released for implementation (feedback contract §8.2, keksdose live
64
+ // #396): OPEN is "filed, nobody has looked yet", READY is "go". The brand tint at full
65
+ // strength, so it reads as the go-ahead beside OPEN's neutral fill and
66
+ // NEEDS_LIVE_TEST's muted brand.
67
+ READY: {
68
+ icon: ClipboardCheck,
69
+ activeBg: "bg-brand-soft",
70
+ activeText: "text-brand",
71
+ },
72
+ // Sent back by its author or an admin and released for work again (0.40, feedback
73
+ // contract §10.2 decision 4): the Rework button's `RotateCcw`, in the danger tint so the
74
+ // queue shows reworks apart from new reports. Not IN_PROGRESS's warning tint — that is
75
+ // where a REWORK row moves next — and WONT_DO, the only other red, sits at the far end
76
+ // with `Ban`.
77
+ REWORK: {
78
+ icon: RotateCcw,
79
+ activeBg: "bg-danger-soft",
80
+ activeText: "text-danger",
81
+ },
82
+ IN_PROGRESS: {
83
+ icon: Wrench,
84
+ activeBg: "bg-warning-soft",
85
+ activeText: "text-warning",
86
+ },
87
+ // Where solved work is parked, waiting on the person who reported it. Its own
88
+ // colour, because "somebody has to check this" is a state you want to find by
89
+ // scanning rather than by reading.
90
+ IN_EVALUATION: {
91
+ icon: Eye,
92
+ activeBg: "bg-info-soft",
93
+ activeText: "text-info",
94
+ },
95
+ // Resolved but only checkable on a deployed build — the SOFT brand tint, so it
96
+ // reads as "waiting on something" rather than as a done or a refusal, and it
97
+ // follows whatever the consumer's brand is instead of pinning an indigo island
98
+ // beside it.
99
+ NEEDS_LIVE_TEST: {
100
+ icon: CloudUpload,
101
+ activeBg: "bg-brand-soft",
102
+ activeText: "text-brand-muted",
103
+ },
104
+ // Parked on purpose. Muted, not `--danger`: it is not a refusal.
105
+ POSTPONED: {
106
+ icon: PauseCircle,
107
+ activeBg: "bg-active",
108
+ activeText: "text-secondary",
109
+ },
110
+ // The one status with nowhere to move to: the vocabulary has a brand, an info, a
111
+ // warning and a danger, and nothing that means "succeeded". Deliberately NOT
112
+ // borrowed from a family that means something else — `--status-synced` is a
113
+ // FIELD's trip to the database rather than an outcome, and tokens.css says so in
114
+ // as many words. Green beside WONT_DO's red is the classic CVD-unsafe pair, which
115
+ // is why both carry a glyph and neither leans on colour alone.
116
+ DONE: {
117
+ icon: CheckCircle2,
118
+ activeBg: "bg-success-soft",
119
+ activeText: "text-success",
120
+ },
121
+ WONT_DO: {
122
+ icon: Ban,
123
+ activeBg: "bg-danger-soft",
124
+ activeText: "text-danger",
125
+ },
126
+ };
137
127
 
138
128
  /** Chain order, then the three off it. The order a picker offers, and the rank a
139
129
  * status column sorts by — so a list sorted by status reads as a queue rather
@@ -74,8 +74,7 @@ export function FeedbackVoteButton({
74
74
  // pressed against: a refetch that brings new numbers is the truth.
75
75
  const [shown, setShown] = useState<{ base: FeedbackVoteState; state: FeedbackVoteState } | null>(null);
76
76
  const busy = useRef(false);
77
- const current =
78
- shown && shown.base.votes === votes && shown.base.voted === voted ? shown.state : { votes, voted };
77
+ const current = shown && shown.base.votes === votes && shown.base.voted === voted ? shown.state : { votes, voted };
79
78
  const pressed = own || current.voted;
80
79
 
81
80
  const press = () => {
@@ -85,12 +84,14 @@ export function FeedbackVoteButton({
85
84
  const next = !before.voted;
86
85
  busy.current = true;
87
86
  setShown({ base, state: { votes: Math.max(0, before.votes + (next ? 1 : -1)), voted: next } });
88
- onVote(next).then(
89
- (answer) => setShown({ base, state: { votes: answer.votes, voted: answer.voted } }),
90
- () => setShown({ base, state: before }),
91
- ).finally(() => {
92
- busy.current = false;
93
- });
87
+ onVote(next)
88
+ .then(
89
+ (answer) => setShown({ base, state: { votes: answer.votes, voted: answer.voted } }),
90
+ () => setShown({ base, state: before }),
91
+ )
92
+ .finally(() => {
93
+ busy.current = false;
94
+ });
94
95
  };
95
96
 
96
97
  const count = formatNumber(current.votes, { locale });
@@ -36,10 +36,7 @@ export function sameRect<R extends { top: number; left: number; width: number; h
36
36
  * Measured in a layout effect so the position is ready before paint (no flicker
37
37
  * on open).
38
38
  */
39
- export function useAnchoredRect<T extends HTMLElement>(
40
- ref: RefObject<T | null>,
41
- open: boolean,
42
- ): AnchorRect | null {
39
+ export function useAnchoredRect<T extends HTMLElement>(ref: RefObject<T | null>, open: boolean): AnchorRect | null {
43
40
  const [rect, setRect] = useState<AnchorRect | null>(null);
44
41
 
45
42
  useLayoutEffect(() => {
@@ -19,7 +19,9 @@ export function useDocumentTitle(parts: ReadonlyArray<string | null | undefined
19
19
  const { format, appName } = useKitDocumentTitle();
20
20
  const [page, section, app] = parts.map((p) => (typeof p === "string" && p.trim() !== "" ? p : undefined));
21
21
  const any = parts.some((p) => typeof p === "string" && p.trim() !== "");
22
- const title = any ? formatDocumentTitle(format ?? DEFAULT_DOCUMENT_TITLE_FORMAT, { page, section, app: app ?? appName }) : null;
22
+ const title = any
23
+ ? formatDocumentTitle(format ?? DEFAULT_DOCUMENT_TITLE_FORMAT, { page, section, app: app ?? appName })
24
+ : null;
23
25
  useEffect(() => {
24
26
  if (title === null || title === "") return;
25
27
  const before = document.title;
@@ -111,9 +111,7 @@ export function useDragTarget<E extends Element = Element>({
111
111
  return { dropProps, isOver: over && !disabled };
112
112
  }
113
113
 
114
- export function useFileDrop<E extends Element = Element>(
115
- options: UseFileDropOptions,
116
- ): UseFileDropReturn<E> {
114
+ export function useFileDrop<E extends Element = Element>(options: UseFileDropOptions): UseFileDropReturn<E> {
117
115
  const picker = useFilePicker(options);
118
116
  const { dropProps, isOver } = useDragTarget<E>({
119
117
  disabled: options.disabled,