@eifi1/ui-kit 0.32.2 → 0.33.1

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 (400) hide show
  1. package/README.md +17 -9
  2. package/dist/account/delete-account-setting.d.ts +11 -10
  3. package/dist/account/delete-account-setting.js +2 -1
  4. package/dist/account/delete-account-setting.js.map +1 -1
  5. package/dist/account/email-change-setting.d.ts +5 -0
  6. package/dist/account/email-change-setting.js +4 -3
  7. package/dist/account/email-change-setting.js.map +1 -1
  8. package/dist/account/sessions-setting.d.ts +4 -0
  9. package/dist/account/sessions-setting.js +3 -2
  10. package/dist/account/sessions-setting.js.map +1 -1
  11. package/dist/admin/admin-action-confirm.d.ts +11 -10
  12. package/dist/admin/admin-action-confirm.js.map +1 -1
  13. package/dist/admin/invitations-panel.d.ts +11 -10
  14. package/dist/admin/invitations-panel.js +4 -3
  15. package/dist/admin/invitations-panel.js.map +1 -1
  16. package/dist/admin/plan-change.d.ts +101 -0
  17. package/dist/admin/plan-change.js +210 -0
  18. package/dist/admin/plan-change.js.map +1 -0
  19. package/dist/admin/reviewer-scope-editor.d.ts +11 -10
  20. package/dist/admin/reviewer-scope-editor.js.map +1 -1
  21. package/dist/admin/role-select.d.ts +8 -7
  22. package/dist/admin/role-select.js.map +1 -1
  23. package/dist/admin/transfer-ownership-dialog.d.ts +11 -10
  24. package/dist/admin/user-roster.d.ts +8 -7
  25. package/dist/admin/user-roster.js +2 -2
  26. package/dist/admin/user-roster.js.map +1 -1
  27. package/dist/auth/auth-errors.d.ts +13 -2
  28. package/dist/auth/auth-errors.js +5 -1
  29. package/dist/auth/auth-errors.js.map +1 -1
  30. package/dist/auth/complete-name-dialog.d.ts +4 -1
  31. package/dist/auth/complete-name-dialog.js +2 -1
  32. package/dist/auth/complete-name-dialog.js.map +1 -1
  33. package/dist/auth/register-form.d.ts +11 -10
  34. package/dist/billing/billing-banner.d.ts +14 -11
  35. package/dist/billing/billing-banner.js.map +1 -1
  36. package/dist/billing/billing-labels.d.ts +11 -10
  37. package/dist/billing/billing-labels.js +10 -1
  38. package/dist/billing/billing-labels.js.map +1 -1
  39. package/dist/billing/billing-lock.d.ts +40 -12
  40. package/dist/billing/billing-lock.js +9 -3
  41. package/dist/billing/billing-lock.js.map +1 -1
  42. package/dist/billing/billing-overview.d.ts +155 -0
  43. package/dist/billing/billing-overview.js +2 -0
  44. package/dist/billing/billing-overview.js.map +1 -0
  45. package/dist/billing/billing-standing.d.ts +11 -10
  46. package/dist/billing/checkout-processing.d.ts +218 -0
  47. package/dist/billing/checkout-processing.js +198 -0
  48. package/dist/billing/checkout-processing.js.map +1 -0
  49. package/dist/billing/checkout-return.d.ts +51 -0
  50. package/dist/billing/checkout-return.js +43 -0
  51. package/dist/billing/checkout-return.js.map +1 -0
  52. package/dist/billing/pay-page.d.ts +215 -0
  53. package/dist/billing/pay-page.js +113 -0
  54. package/dist/billing/pay-page.js.map +1 -0
  55. package/dist/billing/plan-card.d.ts +11 -10
  56. package/dist/billing/plan-limit-notice.d.ts +11 -10
  57. package/dist/billing/plan-limit-toast.d.ts +144 -0
  58. package/dist/billing/plan-limit-toast.js +40 -0
  59. package/dist/billing/plan-limit-toast.js.map +1 -0
  60. package/dist/billing/subscription-actions.d.ts +39 -15
  61. package/dist/billing/subscription-actions.js +9 -2
  62. package/dist/billing/subscription-actions.js.map +1 -1
  63. package/dist/billing/subscription-status-chip.d.ts +10 -9
  64. package/dist/bin/eifi1-pay-page.mjs +166 -0
  65. package/dist/chart.d.ts +11 -10
  66. package/dist/components/account-chips.d.ts +6 -1
  67. package/dist/components/account-settings.d.ts +4 -1
  68. package/dist/components/account-settings.js +2 -1
  69. package/dist/components/account-settings.js.map +1 -1
  70. package/dist/components/amount-input.d.ts +11 -10
  71. package/dist/components/autocomplete.d.ts +2 -1
  72. package/dist/components/autocomplete.js +5 -3
  73. package/dist/components/autocomplete.js.map +1 -1
  74. package/dist/components/button-group.d.ts +11 -10
  75. package/dist/components/button-group.js +1 -1
  76. package/dist/components/button-group.js.map +1 -1
  77. package/dist/components/calculator.d.ts +11 -10
  78. package/dist/components/calculator.js +3 -3
  79. package/dist/components/calculator.js.map +1 -1
  80. package/dist/components/checkbox-group.d.ts +2 -1
  81. package/dist/components/checkbox-group.js.map +1 -1
  82. package/dist/components/checkbox.d.ts +2 -1
  83. package/dist/components/checkbox.js.map +1 -1
  84. package/dist/components/chip.d.ts +2 -1
  85. package/dist/components/chip.js +19 -17
  86. package/dist/components/chip.js.map +1 -1
  87. package/dist/components/choice-card.d.ts +3 -1
  88. package/dist/components/choice-card.js +1 -1
  89. package/dist/components/choice-card.js.map +1 -1
  90. package/dist/components/combobox-core.js +2 -1
  91. package/dist/components/combobox-core.js.map +1 -1
  92. package/dist/components/combobox.d.ts +4 -3
  93. package/dist/components/combobox.js +2 -2
  94. package/dist/components/combobox.js.map +1 -1
  95. package/dist/components/confirm-dialog.d.ts +11 -10
  96. package/dist/components/confirm-dialog.js +6 -3
  97. package/dist/components/confirm-dialog.js.map +1 -1
  98. package/dist/components/copy-button.d.ts +12 -11
  99. package/dist/components/country-select.d.ts +2 -1
  100. package/dist/components/country-select.js.map +1 -1
  101. package/dist/components/danger-confirm.d.ts +11 -10
  102. package/dist/components/danger-confirm.js.map +1 -1
  103. package/dist/components/data-table-cells.d.ts +12 -1
  104. package/dist/components/data-table-filter-popover.d.ts +12 -1
  105. package/dist/components/data-table-filters.d.ts +12 -1
  106. package/dist/components/data-table-labels.d.ts +12 -1
  107. package/dist/components/data-table-pagination.d.ts +12 -1
  108. package/dist/components/data-table.d.ts +12 -1
  109. package/dist/components/data-table.js +3 -3
  110. package/dist/components/data-table.js.map +1 -1
  111. package/dist/components/date-picker.js +6 -4
  112. package/dist/components/date-picker.js.map +1 -1
  113. package/dist/components/dropdown.js +9 -1
  114. package/dist/components/dropdown.js.map +1 -1
  115. package/dist/components/entity-combobox.d.ts +3 -2
  116. package/dist/components/entity-combobox.js.map +1 -1
  117. package/dist/components/facing-pair.d.ts +11 -10
  118. package/dist/components/field-parts.d.ts +32 -4
  119. package/dist/components/field-parts.js +54 -19
  120. package/dist/components/field-parts.js.map +1 -1
  121. package/dist/components/file-button.d.ts +11 -10
  122. package/dist/components/file-button.js +3 -2
  123. package/dist/components/file-button.js.map +1 -1
  124. package/dist/components/file-dropzone.d.ts +12 -11
  125. package/dist/components/file-dropzone.js.map +1 -1
  126. package/dist/components/floating-panel.js +5 -5
  127. package/dist/components/floating-panel.js.map +1 -1
  128. package/dist/components/form-actions.d.ts +10 -9
  129. package/dist/components/form-actions.js +3 -3
  130. package/dist/components/form-actions.js.map +1 -1
  131. package/dist/components/full-bleed-dialog.js.map +1 -1
  132. package/dist/components/iban-input.d.ts +11 -10
  133. package/dist/components/inline-edit-field.d.ts +2 -1
  134. package/dist/components/inline-edit-field.js +6 -6
  135. package/dist/components/inline-edit-field.js.map +1 -1
  136. package/dist/components/language-select.d.ts +11 -10
  137. package/dist/components/legal-page.d.ts +11 -10
  138. package/dist/components/legal.d.ts +11 -10
  139. package/dist/components/list.d.ts +2 -1
  140. package/dist/components/list.js +4 -5
  141. package/dist/components/list.js.map +1 -1
  142. package/dist/components/modal.js.map +1 -1
  143. package/dist/components/money-field.d.ts +11 -10
  144. package/dist/components/month-picker.js +54 -44
  145. package/dist/components/month-picker.js.map +1 -1
  146. package/dist/components/multi-entity-combobox.d.ts +3 -2
  147. package/dist/components/multi-entity-combobox.js.map +1 -1
  148. package/dist/components/number-field.d.ts +18 -10
  149. package/dist/components/number-field.js.map +1 -1
  150. package/dist/components/number-input.d.ts +37 -10
  151. package/dist/components/number-input.js +27 -12
  152. package/dist/components/number-input.js.map +1 -1
  153. package/dist/components/numpad-sheet.d.ts +11 -10
  154. package/dist/components/numpad-sheet.js +2 -2
  155. package/dist/components/numpad-sheet.js.map +1 -1
  156. package/dist/components/phone-input.d.ts +11 -10
  157. package/dist/components/popover.js +6 -2
  158. package/dist/components/popover.js.map +1 -1
  159. package/dist/components/row-actions.d.ts +6 -5
  160. package/dist/components/row-actions.js +130 -32
  161. package/dist/components/row-actions.js.map +1 -1
  162. package/dist/components/series-chart.d.ts +11 -10
  163. package/dist/components/settings-fields.d.ts +11 -10
  164. package/dist/components/share-card.d.ts +8 -7
  165. package/dist/components/share-card.js +26 -10
  166. package/dist/components/share-card.js.map +1 -1
  167. package/dist/components/skeleton.d.ts +10 -2
  168. package/dist/components/skeleton.js.map +1 -1
  169. package/dist/components/status-dot.d.ts +1 -0
  170. package/dist/components/status-dot.js +2 -2
  171. package/dist/components/status-dot.js.map +1 -1
  172. package/dist/components/swatch-picker.d.ts +2 -1
  173. package/dist/components/swatch-picker.js.map +1 -1
  174. package/dist/components/swipeable-row.d.ts +88 -17
  175. package/dist/components/swipeable-row.js +46 -9
  176. package/dist/components/swipeable-row.js.map +1 -1
  177. package/dist/components/switch.d.ts +2 -1
  178. package/dist/components/switch.js.map +1 -1
  179. package/dist/components/table.d.ts +2 -1
  180. package/dist/components/table.js +6 -0
  181. package/dist/components/table.js.map +1 -1
  182. package/dist/components/text-link.d.ts +10 -9
  183. package/dist/components/time-input.d.ts +11 -10
  184. package/dist/components/toggle-group.d.ts +2 -1
  185. package/dist/components/toggle-group.js +1 -1
  186. package/dist/components/toggle-group.js.map +1 -1
  187. package/dist/components/translation-review-editor.d.ts +4 -0
  188. package/dist/components/translation-review-editor.js +4 -3
  189. package/dist/components/translation-review-editor.js.map +1 -1
  190. package/dist/components/translation-review-parts.d.ts +1 -0
  191. package/dist/components/translation-review.d.ts +1 -0
  192. package/dist/components/translation-review.js +15 -18
  193. package/dist/components/translation-review.js.map +1 -1
  194. package/dist/components/ui.d.ts +10 -9
  195. package/dist/components/ui.js +47 -27
  196. package/dist/components/ui.js.map +1 -1
  197. package/dist/components/use-table-state.d.ts +12 -1
  198. package/dist/components/user-avatar.d.ts +1 -0
  199. package/dist/components/write-lock.d.ts +101 -13
  200. package/dist/components/write-lock.js +37 -13
  201. package/dist/components/write-lock.js.map +1 -1
  202. package/dist/{data-table-labels-kpAAVi6g.d.ts → data-table-labels-BJ5JE_X2.d.ts} +17 -0
  203. package/dist/data-table.d.ts +12 -1
  204. package/dist/{delete-account-setting-Dy4kJgUm.d.ts → delete-account-setting-DAgGBrbn.d.ts} +393 -42
  205. package/dist/feedback/feedback-attachment.d.ts +11 -10
  206. package/dist/feedback/feedback-attachment.js +7 -7
  207. package/dist/feedback/feedback-attachment.js.map +1 -1
  208. package/dist/feedback/feedback-context.d.ts +11 -10
  209. package/dist/feedback/feedback-crash.d.ts +11 -10
  210. package/dist/feedback/feedback-dialog.d.ts +11 -10
  211. package/dist/feedback/feedback-inbox.d.ts +10 -9
  212. package/dist/feedback/feedback-inbox.js +7 -3
  213. package/dist/feedback/feedback-inbox.js.map +1 -1
  214. package/dist/feedback/feedback-labels.d.ts +11 -10
  215. package/dist/feedback/feedback-menu.d.ts +4 -3
  216. package/dist/feedback/feedback-record.d.ts +11 -10
  217. package/dist/feedback/feedback-row-detail.d.ts +11 -10
  218. package/dist/feedback/feedback-row-detail.js.map +1 -1
  219. package/dist/feedback/feedback-status-undo.d.ts +11 -10
  220. package/dist/feedback/feedback-submit.d.ts +11 -10
  221. package/dist/feedback/feedback-swipe.d.ts +11 -10
  222. package/dist/feedback/feedback-swipe.js +3 -6
  223. package/dist/feedback/feedback-swipe.js.map +1 -1
  224. package/dist/feedback/feedback-table.d.ts +11 -10
  225. package/dist/feedback/feedback-table.js.map +1 -1
  226. package/dist/feedback/feedback-thread.d.ts +11 -10
  227. package/dist/feedback/feedback-thread.js +5 -1
  228. package/dist/feedback/feedback-thread.js.map +1 -1
  229. package/dist/feedback.d.ts +11 -10
  230. package/dist/hooks/use-anchored-panel.d.ts +37 -7
  231. package/dist/hooks/use-anchored-panel.js +6 -7
  232. package/dist/hooks/use-anchored-panel.js.map +1 -1
  233. package/dist/hooks/use-file-drop.d.ts +11 -10
  234. package/dist/hooks/use-focus-trap.d.ts +8 -0
  235. package/dist/hooks/use-focus-trap.js +17 -11
  236. package/dist/hooks/use-focus-trap.js.map +1 -1
  237. package/dist/i18n/defaults.d.ts +11 -10
  238. package/dist/i18n/defaults.js +2 -0
  239. package/dist/i18n/defaults.js.map +1 -1
  240. package/dist/i18n/german.d.ts +11 -10
  241. package/dist/i18n/german.js +37 -1
  242. package/dist/i18n/german.js.map +1 -1
  243. package/dist/i18n/kit-labels.d.ts +5 -4
  244. package/dist/i18n/kit-labels.js.map +1 -1
  245. package/dist/i18n/languages.d.ts +11 -10
  246. package/dist/i18n/locales/de-CH.d.ts +11 -10
  247. package/dist/i18n/locales/en.d.ts +11 -10
  248. package/dist/i18n/locales/es.d.ts +11 -10
  249. package/dist/i18n/locales/es.js +35 -1
  250. package/dist/i18n/locales/es.js.map +1 -1
  251. package/dist/i18n/locales/fr.d.ts +11 -10
  252. package/dist/i18n/locales/fr.js +37 -1
  253. package/dist/i18n/locales/fr.js.map +1 -1
  254. package/dist/i18n/locales/hu.d.ts +11 -10
  255. package/dist/i18n/locales/hu.js +38 -1
  256. package/dist/i18n/locales/hu.js.map +1 -1
  257. package/dist/i18n/locales/it.d.ts +11 -10
  258. package/dist/i18n/locales/it.js +35 -1
  259. package/dist/i18n/locales/it.js.map +1 -1
  260. package/dist/i18n/locales/zh.d.ts +11 -10
  261. package/dist/i18n/locales/zh.js +35 -1
  262. package/dist/i18n/locales/zh.js.map +1 -1
  263. package/dist/i18n/plurals.d.ts +20 -1
  264. package/dist/i18n/plurals.js +11 -0
  265. package/dist/i18n/plurals.js.map +1 -1
  266. package/dist/i18n/review.d.ts +11 -10
  267. package/dist/i18n/review.js +8 -1
  268. package/dist/i18n/review.js.map +1 -1
  269. package/dist/index.d.ts +11 -6
  270. package/dist/index.js +40 -2
  271. package/dist/index.js.map +1 -1
  272. package/dist/landing/landing-actions.d.ts +11 -10
  273. package/dist/landing/landing-sections.d.ts +11 -10
  274. package/dist/landing/public-header.d.ts +11 -10
  275. package/dist/landing/routing.d.ts +11 -10
  276. package/dist/pay/.well-known/apple-developer-merchantid-domain-association +1 -0
  277. package/dist/pay/index.html +30 -0
  278. package/dist/pay/pay.css +126 -0
  279. package/dist/pay/pay.js +198 -0
  280. package/dist/rhf/fields.d.ts +11 -10
  281. package/dist/rhf/form.d.ts +11 -10
  282. package/dist/rhf.d.ts +11 -10
  283. package/dist/settings/settings-section.d.ts +11 -10
  284. package/dist/shell/app-shell.d.ts +10 -9
  285. package/dist/shell/top-bar-brand.d.ts +11 -10
  286. package/dist/shell/topbar-action-menu.d.ts +1 -0
  287. package/dist/shell.d.ts +11 -10
  288. package/dist/testing/css-variables.d.ts +74 -0
  289. package/dist/testing/css-variables.generated.d.ts +7 -0
  290. package/dist/testing/css-variables.generated.js +8 -0
  291. package/dist/testing/css-variables.generated.js.map +1 -0
  292. package/dist/testing/css-variables.js +93 -0
  293. package/dist/testing/css-variables.js.map +1 -0
  294. package/dist/testing/index.d.ts +1 -0
  295. package/dist/testing/index.js +12 -0
  296. package/dist/testing/index.js.map +1 -0
  297. package/dist/theme/contrast-tokens.d.ts +44 -1
  298. package/dist/theme/contrast-tokens.js +21 -0
  299. package/dist/theme/contrast-tokens.js.map +1 -1
  300. package/dist/theme/contrast.d.ts +2 -2
  301. package/dist/theme/palette-derive.js +60 -11
  302. package/dist/theme/palette-derive.js.map +1 -1
  303. package/dist/theme/palette-presets.js +45 -43
  304. package/dist/theme/palette-presets.js.map +1 -1
  305. package/dist/wizard/stepper-nav.d.ts +12 -11
  306. package/dist/wizard/stepper-nav.js.map +1 -1
  307. package/dist/wizard.d.ts +11 -10
  308. package/package.json +10 -2
  309. package/src/account/delete-account-setting.tsx +6 -1
  310. package/src/account/email-change-setting.tsx +9 -3
  311. package/src/account/sessions-setting.tsx +7 -2
  312. package/src/admin/admin-action-confirm.tsx +2 -1
  313. package/src/admin/invitations-panel.tsx +9 -3
  314. package/src/admin/plan-change.tsx +487 -0
  315. package/src/admin/reviewer-scope-editor.tsx +2 -1
  316. package/src/admin/role-select.tsx +2 -1
  317. package/src/admin/user-roster.tsx +5 -3
  318. package/src/auth/auth-errors.ts +25 -2
  319. package/src/auth/complete-name-dialog.tsx +6 -2
  320. package/src/billing/billing-banner.tsx +3 -1
  321. package/src/billing/billing-labels.ts +45 -0
  322. package/src/billing/billing-lock.ts +36 -3
  323. package/src/billing/billing-overview.ts +58 -0
  324. package/src/billing/checkout-processing.ts +391 -0
  325. package/src/billing/checkout-return.ts +90 -0
  326. package/src/billing/pay-page.ts +246 -0
  327. package/src/billing/plan-limit-toast.tsx +91 -0
  328. package/src/billing/subscription-actions.tsx +41 -8
  329. package/src/components/account-settings.tsx +6 -2
  330. package/src/components/autocomplete.tsx +10 -4
  331. package/src/components/button-group.tsx +4 -1
  332. package/src/components/calculator.tsx +10 -6
  333. package/src/components/checkbox-group.tsx +2 -2
  334. package/src/components/checkbox.tsx +2 -1
  335. package/src/components/chip.tsx +37 -32
  336. package/src/components/choice-card.tsx +4 -2
  337. package/src/components/combobox-core.tsx +5 -2
  338. package/src/components/combobox.tsx +8 -6
  339. package/src/components/confirm-dialog.tsx +13 -6
  340. package/src/components/country-select.tsx +2 -2
  341. package/src/components/danger-confirm.tsx +2 -2
  342. package/src/components/data-table.tsx +20 -9
  343. package/src/components/date-picker.tsx +10 -7
  344. package/src/components/dropdown.tsx +12 -2
  345. package/src/components/entity-combobox.tsx +3 -3
  346. package/src/components/field-parts.tsx +61 -14
  347. package/src/components/file-button.tsx +5 -4
  348. package/src/components/file-dropzone.tsx +2 -2
  349. package/src/components/floating-panel.tsx +7 -5
  350. package/src/components/form-actions.tsx +12 -5
  351. package/src/components/full-bleed-dialog.tsx +6 -0
  352. package/src/components/inline-edit-field.tsx +13 -13
  353. package/src/components/list.tsx +10 -9
  354. package/src/components/modal.tsx +5 -0
  355. package/src/components/month-picker.tsx +8 -2
  356. package/src/components/multi-entity-combobox.tsx +3 -3
  357. package/src/components/number-field.tsx +7 -0
  358. package/src/components/number-input.tsx +71 -11
  359. package/src/components/numpad-sheet.tsx +8 -4
  360. package/src/components/popover.tsx +6 -2
  361. package/src/components/row-actions.tsx +208 -58
  362. package/src/components/share-card.tsx +67 -13
  363. package/src/components/skeleton.tsx +10 -2
  364. package/src/components/status-dot.tsx +7 -7
  365. package/src/components/swatch-picker.tsx +2 -2
  366. package/src/components/swipeable-row.tsx +138 -27
  367. package/src/components/switch.tsx +2 -1
  368. package/src/components/table.tsx +8 -1
  369. package/src/components/toggle-group.tsx +5 -3
  370. package/src/components/translation-review-editor.tsx +8 -3
  371. package/src/components/translation-review.tsx +18 -22
  372. package/src/components/ui.tsx +92 -43
  373. package/src/components/write-lock.tsx +150 -24
  374. package/src/feedback/feedback-attachment.tsx +13 -9
  375. package/src/feedback/feedback-inbox.tsx +10 -6
  376. package/src/feedback/feedback-row-detail.tsx +3 -2
  377. package/src/feedback/feedback-swipe.tsx +6 -11
  378. package/src/feedback/feedback-table.tsx +2 -1
  379. package/src/feedback/feedback-thread.tsx +20 -1
  380. package/src/hooks/use-anchored-panel.ts +60 -14
  381. package/src/hooks/use-focus-trap.ts +55 -12
  382. package/src/i18n/defaults.ts +2 -0
  383. package/src/i18n/german.ts +41 -0
  384. package/src/i18n/kit-labels.tsx +4 -0
  385. package/src/i18n/locales/es.ts +35 -0
  386. package/src/i18n/locales/fr.ts +41 -0
  387. package/src/i18n/locales/hu.ts +39 -0
  388. package/src/i18n/locales/it.ts +36 -0
  389. package/src/i18n/locales/zh.ts +34 -0
  390. package/src/i18n/plurals.ts +29 -0
  391. package/src/i18n/review.ts +7 -0
  392. package/src/index.ts +51 -5
  393. package/src/testing/css-variables.generated.ts +112 -0
  394. package/src/testing/css-variables.ts +191 -0
  395. package/src/testing/index.ts +13 -0
  396. package/src/theme/contrast-tokens.ts +53 -2
  397. package/src/theme/palette-derive.ts +87 -10
  398. package/src/theme/palette-presets.ts +45 -43
  399. package/src/wizard/stepper-nav.tsx +2 -1
  400. package/tokens.css +324 -46
@@ -1,32 +1,134 @@
1
1
  import { useEffect, useRef, useState } from "react";
2
- import type { ReactNode } from "react";
2
+ import type { CSSProperties, ReactNode } from "react";
3
3
  import { cn } from "../lib/cn";
4
4
  import { FOCUS_RING } from "./focus-ring";
5
+ import type { StatusDotTone } from "./status-dot";
5
6
  import { useRowSwipe, type SwipeStage } from "../hooks/use-row-swipe";
6
7
  import { DEFAULT_SWIPEABLE_ROW_LABELS, useKitLabels } from "../i18n/kit-labels";
7
8
 
8
9
  /**
9
- * One armed swipe action: what it does, and how the reveal panel presents it.
10
- *
11
- * The two background classes are the idle and armed states. Before the first
12
- * threshold is crossed the panel previews the nearest action in its IDLE colour, so
13
- * the user can see what a little more drag will do; crossing the threshold flips it to
14
- * `armedClassName`. Passing the same value for both simply removes that feedback.
10
+ * What a swipe action's panel means — the vocabulary Chip, ProgressBar and StatusDot
11
+ * already share, so a curtain can be "the colour of the status it produces" by name:
12
+ * brand, neutral, success, warning, danger, info, income, expense, and the categorical
13
+ * hues blue, indigo, purple, teal and orange.
14
+ */
15
+ export type SwipeTone = StatusDotTone;
16
+
17
+ /**
18
+ * An app's own fill for a documented exception (0.33, docs/colour-roles-harmonization.md
19
+ * §12.6) — a curtain that must be exactly its status pill's palette fill, or two
20
+ * strengths of one tone. CSS colours or `var()`s, the same in both themes unless the app
21
+ * passes a variable it declares per theme in its own stylesheet. The kit cannot measure
22
+ * these, so the app's tests pin the pair.
15
23
  */
16
- export interface SwipeAction {
24
+ export interface SwipePaint {
25
+ /** The armed panel's fill; idle shows a 14 % wash of it on the card. */
26
+ fill: string;
27
+ /** The text and icon colour ON `fill`, armed. Idle text is the body ink. */
28
+ foreground: string;
29
+ }
30
+
31
+ interface SwipeActionBase {
17
32
  onCommit: () => void;
18
33
  label: string;
19
34
  /** Rendered inside the panel. Icons stay the consumer's choice — this package
20
35
  * ships no opinion about which icon set an app uses. */
21
36
  icon?: ReactNode;
22
- /** Background utility class while the action is previewed but not yet armed. The
23
- * panel's text is white unless this sets a text colour too — and a fill that turns
24
- * light in dark mode needs one: pass the fill's contrast token
25
- * (`bg-[var(--danger)] text-[var(--danger-contrast)]`; also `--brand-contrast`,
26
- * `--success-contrast`), as the kit's own swipes do since 0.26. */
27
- className: string;
28
- /** Background utility class once the drag has passed this action's threshold. */
29
- armedClassName: string;
37
+ }
38
+
39
+ /**
40
+ * One armed swipe action: what it does, and how the reveal panel presents it.
41
+ *
42
+ * The panel has two states. Before the first threshold is crossed it previews the
43
+ * nearest action IDLE, so the user can see what a little more drag will do; crossing
44
+ * the threshold ARMS it — "let go and this fires".
45
+ *
46
+ * **`tone`** (0.33) is how the kit paints it: idle, the tone's soft wash under the
47
+ * tone's own text colour (`bg-danger-soft text-danger`, Chip's soft look, ≥ 4.5:1);
48
+ * armed, the tone's solid fill under its `-contrast` foreground (≥ 5:1). The soft→solid
49
+ * step is the signal. It replaces a panel dimmed to 60 % at idle, whose label sat at
50
+ * 2.4–4.5:1 on the kit's own swipes, and a white label that was unreadable on every
51
+ * dark-mode pastel.
52
+ *
53
+ * **`paint`** follows the same rule for an app's documented exception (see
54
+ * {@link SwipePaint}). **`className` / `armedClassName`** is the old path, kept so
55
+ * existing call sites compile; there the label is white unless the classes set a
56
+ * colour, and the idle panel is still dimmed.
57
+ */
58
+ export type SwipeAction = SwipeActionBase &
59
+ (
60
+ | {
61
+ /** The kit paints the panel: the tone's wash idle, its fill and `-contrast` armed. */
62
+ tone: SwipeTone;
63
+ paint?: never;
64
+ className?: never;
65
+ armedClassName?: never;
66
+ }
67
+ | {
68
+ /** A documented app exception: idle a 14 % wash of `fill` under the body ink,
69
+ * armed `fill` under `foreground`. */
70
+ paint: SwipePaint;
71
+ tone?: never;
72
+ className?: never;
73
+ armedClassName?: never;
74
+ }
75
+ | {
76
+ tone?: never;
77
+ paint?: never;
78
+ /** @deprecated 0.33 — pass `tone`, or `paint` for an exception. Background
79
+ * utility class while the action is previewed but not yet armed; the panel is
80
+ * dimmed then, and its text is white unless this sets a text colour. */
81
+ className: string;
82
+ /** @deprecated 0.33 — pass `tone`, or `paint`. Background utility class once
83
+ * the drag has passed this action's threshold. */
84
+ armedClassName: string;
85
+ }
86
+ );
87
+
88
+ /**
89
+ * Each tone's panel, idle and armed. Literal class strings, because Tailwind finds a
90
+ * class by reading the source. Idle is Chip's soft recipe for the tone (the money pair
91
+ * takes Chip's soft money look, the well under the money colour; neutral the active
92
+ * fill under the secondary ink); armed is the plain fill, not `-hover`, under the
93
+ * fill's own foreground. Measured in every shipped preset by
94
+ * theme/__tests__/tokens-css-audit.test.ts.
95
+ */
96
+ export const SWIPE_TONE: Record<SwipeTone, { idle: string; armed: string }> = {
97
+ brand: { idle: "bg-brand-soft text-brand-muted", armed: "bg-brand text-brand-contrast" },
98
+ neutral: { idle: "bg-active text-secondary", armed: "bg-neutral text-neutral-contrast" },
99
+ success: { idle: "bg-success-soft text-success", armed: "bg-success text-success-contrast" },
100
+ warning: { idle: "bg-warning-soft text-warning", armed: "bg-warning text-warning-contrast" },
101
+ danger: { idle: "bg-danger-soft text-danger", armed: "bg-danger text-danger-contrast" },
102
+ info: { idle: "bg-info-soft text-info", armed: "bg-info text-info-contrast" },
103
+ income: { idle: "bg-surface-2 text-money-pos", armed: "bg-money-pos text-money-income-contrast" },
104
+ expense: { idle: "bg-surface-2 text-money-neg", armed: "bg-money-neg text-money-expense-contrast" },
105
+ blue: { idle: "bg-hue-blue-soft text-hue-blue", armed: "bg-hue-blue text-hue-blue-contrast" },
106
+ indigo: { idle: "bg-hue-indigo-soft text-hue-indigo", armed: "bg-hue-indigo text-hue-indigo-contrast" },
107
+ purple: { idle: "bg-hue-purple-soft text-hue-purple", armed: "bg-hue-purple text-hue-purple-contrast" },
108
+ teal: { idle: "bg-hue-teal-soft text-hue-teal", armed: "bg-hue-teal text-hue-teal-contrast" },
109
+ orange: { idle: "bg-hue-orange-soft text-hue-orange", armed: "bg-hue-orange text-hue-orange-contrast" },
110
+ };
111
+
112
+ /** `paint`'s two looks, from the two custom properties the panel carries inline. The
113
+ * idle wash is `--brand-bg`'s recipe (14 % of the fill into the card). */
114
+ const PAINT_IDLE = "bg-[color-mix(in_oklab,var(--swipe-paint-fill)_14%,var(--bg-surface))] text-primary";
115
+ const PAINT_ARMED = "bg-[var(--swipe-paint-fill)] text-[var(--swipe-paint-fg)]";
116
+
117
+ /** The panel's colour classes, inline style and dimming for one action and state. */
118
+ function panelLook(action: SwipeAction, armed: boolean): { className: string; style?: CSSProperties; dim: boolean } {
119
+ if (action.tone) return { className: SWIPE_TONE[action.tone][armed ? "armed" : "idle"], dim: false };
120
+ if (action.paint) {
121
+ return {
122
+ className: armed ? PAINT_ARMED : PAINT_IDLE,
123
+ style: {
124
+ "--swipe-paint-fill": action.paint.fill,
125
+ "--swipe-paint-fg": action.paint.foreground,
126
+ } as CSSProperties,
127
+ dim: false,
128
+ };
129
+ }
130
+ // The deprecated path, as it was: white text under the caller's fill, dimmed idle.
131
+ return { className: cn("text-white", armed ? action.armedClassName : action.className), dim: !armed };
30
132
  }
31
133
 
32
134
  /**
@@ -76,8 +178,9 @@ const PEEK_PX = 40;
76
178
  * action reachable and roughly doubles the room between them.
77
179
  *
78
180
  * **Whether the action will fire is stated three ways, not one** (feedback #174): the
79
- * panel goes from dimmed to solid, the icon grows and gains a filled disc, and the
80
- * label turns bold — plus the existing haptic tick per newly armed stage. A colour
181
+ * panel goes from the tone's soft wash to its solid fill, the icon grows and gains a
182
+ * filled disc, and the label turns bold — plus the existing haptic tick per newly armed
183
+ * stage. A colour
81
184
  * shift alone is easy to miss mid-gesture, and it is invisible to anyone who cannot
82
185
  * distinguish the two tones.
83
186
  *
@@ -180,33 +283,41 @@ export function SwipeableRow({
180
283
  ? leftActions[Math.max(0, swipe.armedLeftIndex)]
181
284
  : rightActions[Math.max(0, swipe.armedRightIndex)];
182
285
  const armed = draggingLeft ? swipe.armedLeftIndex >= 0 : swipe.armedRightIndex >= 0;
286
+ const look = shown ? panelLook(shown, armed) : null;
183
287
 
184
288
  return (
185
289
  <div ref={rowRef} className={cn("relative overflow-hidden", className)}>
186
- {active && shown && (
290
+ {/* The card under the panel. A dark theme's washes are translucent, and a tone's
291
+ idle pair is measured as that wash ON the card — so the card is there, whatever
292
+ the row happens to sit in. */}
293
+ {active && shown && <div aria-hidden className="pointer-events-none absolute inset-0 bg-surface" />}
294
+ {active && shown && look && (
187
295
  <div
188
296
  className={cn(
189
297
  "pointer-events-none absolute inset-0 flex items-center gap-2 px-4",
190
- "text-xs font-medium text-white transition-all",
191
- // Dimmed until the drag has actually passed a threshold: "nothing will
192
- // happen yet" has to look different from "let go and this fires", and on
193
- // a moving row a one-step colour change was too quiet to notice.
194
- armed ? "opacity-100" : "opacity-60",
195
- armed ? shown.armedClassName : shown.className,
298
+ "text-xs font-medium transition-all",
299
+ look.className,
300
+ // The old path only: dimmed until the drag has passed a threshold. A tone
301
+ // or a paint says it with the soft→solid step instead, which keeps its
302
+ // label readable at both ends.
303
+ look.dim && "opacity-60",
196
304
  // The panel is anchored to the edge the row is uncovering, so the label
197
305
  // sits where the eye already is rather than across the screen. That edge is
198
306
  // physical, while a flex row starts at the INLINE start — so in RTL the two
199
307
  // directions swap, or the label sat under the row on the covered side.
200
308
  draggingLeft ? "flex-row-reverse rtl:flex-row" : "rtl:flex-row-reverse",
201
309
  )}
310
+ style={look.style}
202
311
  >
203
312
  {shown.icon && (
204
313
  <span
205
314
  className={cn(
206
315
  "flex shrink-0 items-center justify-center rounded-full transition-all",
207
316
  // Armed, the icon gets a disc of its own and grows — a second,
208
- // non-colour signal, and the one that stays readable at a glance.
209
- armed ? "size-8 scale-110 bg-white/25" : "size-7 bg-white/10",
317
+ // non-colour signal, and the one that stays readable at a glance. In
318
+ // the label's own colour (0.33): a white disc vanished on a dark
319
+ // theme's pastel fill, and the label's colour works on every pair.
320
+ armed ? "size-8 scale-110 bg-current/20" : "size-7 bg-current/10",
210
321
  )}
211
322
  >
212
323
  {shown.icon}
@@ -10,6 +10,7 @@ import {
10
10
  type DisabledReasonDisplay,
11
11
  } from "./field-parts";
12
12
  import { FOCUS_RING } from "./focus-ring";
13
+ import type { CommitScope } from "./write-lock";
13
14
 
14
15
  /**
15
16
  * An on/off switch that is still `<input type="checkbox">`, with `role="switch"`.
@@ -117,7 +118,7 @@ export interface SwitchProps extends Omit<InputHTMLAttributes<HTMLInputElement>,
117
118
  * is locked the `disabledReason` way with the lock's reason (which wins over its
118
119
  * own). No provider, or an unlocked one: no effect. Button's `commit`, for K3.
119
120
  */
120
- commit?: boolean;
121
+ commit?: CommitScope;
121
122
  }
122
123
 
123
124
  /**
@@ -162,7 +162,8 @@ export interface TableProps extends ComponentPropsWithRef<"table"> {
162
162
  /** Tint every other body row. */
163
163
  zebra?: boolean;
164
164
  /** Tint the body row under the pointer. Off by default: a static table whose rows
165
- * light up promises a click that does nothing. */
165
+ * light up promises a click that does nothing. With `zebra`, a tinted row hovers to
166
+ * the card colour (0.33): the hover tint is too close to the well. */
166
167
  hover?: boolean;
167
168
  /** Classes for the overflow wrapper around the `<table>` (a max-height, a border). */
168
169
  wrapperClassName?: string;
@@ -518,6 +519,12 @@ export function TableRow({ valign, variant = "row", bordered, className, ref: re
518
519
  body && (bordered ?? rowDividers) && "border-b border-[var(--border)]",
519
520
  record && zebra && "even:bg-[var(--bg-surface-2)]",
520
521
  record && hover && "transition-colors hover:bg-[var(--bg-hover)]",
522
+ // A zebra row rests on the well, and `--bg-hover` sits only 1.00–1.02:1 from it
523
+ // (0.33: the light well is the page colour): it hovers to the card instead, the
524
+ // one fill that both steps 1.09–1.13:1 from the well and keeps every text role at
525
+ // 4.5:1 (docs/colour-roles-harmonization.md §12.2). `even:hover:` outranks the
526
+ // row's own `hover:`.
527
+ record && zebra && hover && "even:hover:bg-surface",
521
528
  ROW_VARIANT[variant],
522
529
  // On the row as well, for a raw `<td>` of the caller's, which inherits it.
523
530
  valign && VALIGN[valign],
@@ -4,7 +4,7 @@ import { cn } from "../lib/cn";
4
4
  import { horizontalStep } from "../lib/direction";
5
5
  import { FIELD_INVALID, FloatingField, Label } from "./ui";
6
6
  import { Tooltip } from "./tooltip";
7
- import { useCommitReason } from "./write-lock";
7
+ import { useCommitReason, type CommitScope } from "./write-lock";
8
8
  import {
9
9
  DISABLED_REASON_LINE_CLASS,
10
10
  FIELD_CAPTION_CLASS,
@@ -172,7 +172,7 @@ export interface ToggleGroupBaseProps<T extends string>
172
172
  * must render refused, never live-and-discarding. No provider, or an unlocked one:
173
173
  * no effect.
174
174
  */
175
- commit?: boolean;
175
+ commit?: CommitScope;
176
176
  }
177
177
 
178
178
  /**
@@ -200,7 +200,9 @@ export interface ToggleGroupBaseProps<T extends string>
200
200
  *
201
201
  * md: 1 + 20 + 18 + 2 + 1 = 42 sm: 1 + 20 + 16 + 4 + 1 = 42
202
202
  */
203
- const CHROME_PAD: Record<"sm" | "md", string> = { md: "pt-5 pb-0.5", sm: "pt-5 pb-1" };
203
+ // At Large the chrome's label stands above it (0.33, §10.17): no strip, the same moat top
204
+ // and bottom.
205
+ const CHROME_PAD: Record<"sm" | "md", string> = { md: "pt-5 pb-0.5 large:pt-0.5", sm: "pt-5 pb-1 large:pt-1" };
204
206
  const CHROME_SEGMENT: Record<"sm" | "md", string> = { md: "py-0 leading-[1.125rem]", sm: "py-0 leading-4" };
205
207
 
206
208
  /**
@@ -16,6 +16,7 @@ import { Caption, SectionLabel } from "./text";
16
16
  import { DEFAULT_TRANSLATION_REVIEW_LABELS } from "./translation-review-labels";
17
17
  import type { TranslationReviewLabels } from "./translation-review-labels";
18
18
  import { Button, Textarea } from "./ui";
19
+ import { COMMIT_EXCEPT_BILLING } from "./write-lock";
19
20
 
20
21
  /** A callback may return a promise: resolve and the editor closes, reject and it stays
21
22
  * open with the error. */
@@ -84,6 +85,10 @@ function Then({ label, text }: { label: string; text: string }) {
84
85
  * Every action waits for its callback: the buttons hold while the promise is out, a
85
86
  * resolution closes the editor through `onClose`, and a rejection keeps it open with what
86
87
  * was typed and the error under the buttons.
88
+ *
89
+ * Each verdict is a `commit` exempt from billing (`COMMIT_EXCEPT_BILLING`, 0.33): a review
90
+ * is an admin route, which a lapsed plan never locks (docs/billing-harmonization.md
91
+ * §12.13, §12.36); a demo's lock still holds it.
87
92
  */
88
93
  export function TranslationReviewEditor({
89
94
  row,
@@ -234,7 +239,7 @@ export function TranslationReviewEditor({
234
239
  {!missing && (
235
240
  <Button
236
241
  variant="primary"
237
- commit
242
+ commit={COMMIT_EXCEPT_BILLING}
238
243
  pending={busy === "approve"}
239
244
  disabled={busy !== null}
240
245
  onClick={() => save("APPROVED")}
@@ -244,7 +249,7 @@ export function TranslationReviewEditor({
244
249
  )}
245
250
  <Button
246
251
  variant={missing ? "primary" : "danger"}
247
- commit
252
+ commit={COMMIT_EXCEPT_BILLING}
248
253
  pending={busy === "flag"}
249
254
  disabled={busy !== null || !canFlag}
250
255
  onClick={() => save("NEEDS_CHANGE")}
@@ -254,7 +259,7 @@ export function TranslationReviewEditor({
254
259
  {review && onClear && (
255
260
  <Button
256
261
  variant="ghost"
257
- commit
262
+ commit={COMMIT_EXCEPT_BILLING}
258
263
  pending={busy === "clear"}
259
264
  disabled={busy !== null}
260
265
  onClick={() => void run("clear", () => onClear({ locale: row.locale, key: row.key }))}
@@ -44,7 +44,7 @@ import { DEFAULT_TRANSLATION_REVIEW_LABELS, reviewStatusLabel } from "./translat
44
44
  import type { TranslationReviewLabels } from "./translation-review-labels";
45
45
  import { ReviewStatusChip, TranslationProgress } from "./translation-review-parts";
46
46
  import { Button, IconButton, Select } from "./ui";
47
- import { useWriteLock } from "./write-lock";
47
+ import { COMMIT_EXCEPT_BILLING, useWriteLock } from "./write-lock";
48
48
 
49
49
  export {
50
50
  REVIEW_STATUS_TONES,
@@ -457,7 +457,10 @@ export function TranslationReviewPanel({
457
457
  }: TranslationReviewPanelProps) {
458
458
  const labels = useKitLabels("translationReview", DEFAULT_TRANSLATION_REVIEW_LABELS, labelsProp);
459
459
  const locale = useKitLocale();
460
- const lock = useWriteLock();
460
+ // A verdict is an admin route, which a lapsed plan never locks
461
+ // (docs/billing-harmonization.md §12.13, §12.36): the buttons take
462
+ // COMMIT_EXCEPT_BILLING, and the swipes read the lock as they see it.
463
+ const lock = useWriteLock(COMMIT_EXCEPT_BILLING);
461
464
  // The phone layout DataTable switches its layout on, so "a phone" means the same here
462
465
  // as in the table, at every text size: `usePhoneLayout()` itself (§10.4; 0.32.1,
463
466
  // keksdose's 0.32 report — `!useBreakpoint("md")` could disagree with it at 767.5 px).
@@ -742,7 +745,7 @@ export function TranslationReviewPanel({
742
745
  type="button"
743
746
  size="xs"
744
747
  tone="muted"
745
- commit
748
+ commit={COMMIT_EXCEPT_BILLING}
746
749
  label={labels.approve}
747
750
  // The icon alone at every text size (docs/text-size-harmonization.md §10.8):
748
751
  // the row's one action, in a hugging column of a dense table beside the
@@ -773,10 +776,9 @@ export function TranslationReviewPanel({
773
776
  label: labels.approve,
774
777
  icon: <Check className="size-4" aria-hidden />,
775
778
  onCommit: () => void approve(`row:${r.id}`, [r], "swipe", r.key),
776
- // Text on the fill in its own contrast colour: the fills are pastels in dark
777
- // mode, where SwipeableRow's default white text was unreadable (0.26).
778
- className: "bg-[var(--success)] text-[var(--success-contrast)]",
779
- armedClassName: "bg-[var(--success)] text-[var(--success-contrast)]",
779
+ // SwipeableRow paints the tone: its soft wash idle, its fill and that fill's
780
+ // foreground armed (0.33).
781
+ tone: "success",
780
782
  };
781
783
  case "edit":
782
784
  return {
@@ -789,23 +791,17 @@ export function TranslationReviewPanel({
789
791
  setOpenId(r.id);
790
792
  setFocusId(r.id);
791
793
  },
792
- className: missing
793
- ? "bg-[var(--brand)] text-[var(--brand-contrast)]"
794
- : "bg-[var(--danger)] text-[var(--danger-contrast)]",
795
- armedClassName: missing
796
- ? "bg-[var(--brand-hover)] text-[var(--brand-contrast)]"
797
- : "bg-[var(--danger-hover)] text-[var(--danger-contrast)]",
794
+ tone: missing ? "brand" : "danger",
798
795
  };
799
796
  case "clear":
800
797
  return {
801
798
  label: labels.reset,
802
799
  icon: <RotateCcw className="size-4" aria-hidden />,
803
800
  onCommit: () => void clearRow(r),
804
- // A step back, not a verdict: neither the approval's green nor the send-back's red.
805
- // The surface colour as text: white on the grey in light mode, the dark page on
806
- // the light grey in dark mode.
807
- className: "bg-[var(--text-muted)] text-[var(--bg-surface)]",
808
- armedClassName: "bg-[var(--text-secondary)] text-[var(--bg-surface)]",
801
+ // A step back, not a verdict: neither the approval's green nor the send-back's
802
+ // red. `neutral` is the pair this swipe improvised and 0.33 made a token: the
803
+ // muted ink as a fill under the surface colour.
804
+ tone: "neutral",
809
805
  };
810
806
  }
811
807
  };
@@ -943,7 +939,7 @@ export function TranslationReviewPanel({
943
939
  <Button
944
940
  variant="secondary"
945
941
  size="sm"
946
- commit
942
+ commit={COMMIT_EXCEPT_BILLING}
947
943
  // The visible words say what; the group's name, read after them, says where.
948
944
  aria-describedby={titleId}
949
945
  pending={isQueued(key) && confirming !== g.key}
@@ -974,7 +970,7 @@ export function TranslationReviewPanel({
974
970
  }}
975
971
  variant="primary"
976
972
  size="sm"
977
- commit
973
+ commit={COMMIT_EXCEPT_BILLING}
978
974
  aria-describedby={questionId}
979
975
  pending={isQueued(key)}
980
976
  disabled={busy}
@@ -1090,7 +1086,7 @@ export function TranslationReviewPanel({
1090
1086
  <Button
1091
1087
  variant="primary"
1092
1088
  size="sm"
1093
- commit
1089
+ commit={COMMIT_EXCEPT_BILLING}
1094
1090
  pending={isQueued("bulk-approve")}
1095
1091
  disabled={busy || toApprove.length === 0}
1096
1092
  onClick={() => void approveSelected()}
@@ -1102,7 +1098,7 @@ export function TranslationReviewPanel({
1102
1098
  <Button
1103
1099
  variant="ghost"
1104
1100
  size="sm"
1105
- commit
1101
+ commit={COMMIT_EXCEPT_BILLING}
1106
1102
  pending={isQueued("bulk-reset")}
1107
1103
  disabled={busy || toReset.length === 0}
1108
1104
  onClick={() => void resetSelected()}