@eifi1/ui-kit 0.34.0 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (446) hide show
  1. package/README.md +115 -41
  2. package/dist/admin/role-select.d.ts +3 -2
  3. package/dist/admin/role-select.js +2 -0
  4. package/dist/admin/role-select.js.map +1 -1
  5. package/dist/billing/billing-banner.d.ts +5 -2
  6. package/dist/billing/billing-banner.js.map +1 -1
  7. package/dist/billing/plan-limit-notice.d.ts +5 -2
  8. package/dist/billing/plan-limit-notice.js.map +1 -1
  9. package/dist/chart.js.map +1 -1
  10. package/dist/components/amount-input.d.ts +2 -5
  11. package/dist/components/amount-input.js +2 -2
  12. package/dist/components/amount-input.js.map +1 -1
  13. package/dist/components/autocomplete.d.ts +2 -2
  14. package/dist/components/autocomplete.js +2 -1
  15. package/dist/components/autocomplete.js.map +1 -1
  16. package/dist/components/button-look.d.ts +1 -1
  17. package/dist/components/button-look.js +9 -4
  18. package/dist/components/button-look.js.map +1 -1
  19. package/dist/components/calculator.d.ts +1 -4
  20. package/dist/components/calculator.js +1 -3
  21. package/dist/components/calculator.js.map +1 -1
  22. package/dist/components/chart-zoom.d.ts +0 -37
  23. package/dist/components/chart-zoom.js +1 -28
  24. package/dist/components/chart-zoom.js.map +1 -1
  25. package/dist/components/checkbox-group.d.ts +5 -2
  26. package/dist/components/checkbox-group.js +15 -4
  27. package/dist/components/checkbox-group.js.map +1 -1
  28. package/dist/components/chip-input.d.ts +0 -4
  29. package/dist/components/chip-input.js +1 -5
  30. package/dist/components/chip-input.js.map +1 -1
  31. package/dist/components/column-mapper.d.ts +5 -3
  32. package/dist/components/column-mapper.js +2 -0
  33. package/dist/components/column-mapper.js.map +1 -1
  34. package/dist/components/combobox.d.ts +3 -3
  35. package/dist/components/combobox.js +2 -1
  36. package/dist/components/combobox.js.map +1 -1
  37. package/dist/components/copy-button.d.ts +5 -1
  38. package/dist/components/copy-button.js.map +1 -1
  39. package/dist/components/country-select.d.ts +3 -3
  40. package/dist/components/country-select.js +3 -0
  41. package/dist/components/country-select.js.map +1 -1
  42. package/dist/components/currency-option-list.d.ts +3 -8
  43. package/dist/components/currency-option-list.js +1 -29
  44. package/dist/components/currency-option-list.js.map +1 -1
  45. package/dist/components/currency-select.d.ts +3 -2
  46. package/dist/components/currency-select.js +10 -1
  47. package/dist/components/currency-select.js.map +1 -1
  48. package/dist/components/danger-confirm.d.ts +3 -3
  49. package/dist/components/danger-confirm.js.map +1 -1
  50. package/dist/components/data-table-filter-popover.d.ts +1 -1
  51. package/dist/components/data-table-filter-popover.js +1 -1
  52. package/dist/components/data-table-filter-popover.js.map +1 -1
  53. package/dist/components/data-table-labels.d.ts +1 -42
  54. package/dist/components/data-table-labels.js +2 -31
  55. package/dist/components/data-table-labels.js.map +1 -1
  56. package/dist/components/data-table-shared.d.ts +17 -1
  57. package/dist/components/data-table-shared.js +22 -0
  58. package/dist/components/data-table-shared.js.map +1 -1
  59. package/dist/components/data-table.d.ts +12 -2
  60. package/dist/components/data-table.js +18 -14
  61. package/dist/components/data-table.js.map +1 -1
  62. package/dist/components/date-field.d.ts +2 -1
  63. package/dist/components/date-field.js.map +1 -1
  64. package/dist/components/date-picker.js +3 -0
  65. package/dist/components/date-picker.js.map +1 -1
  66. package/dist/components/date-range-picker.js +3 -0
  67. package/dist/components/date-range-picker.js.map +1 -1
  68. package/dist/components/dialog-frame.d.ts +3 -1
  69. package/dist/components/dialog-frame.js.map +1 -1
  70. package/dist/components/dropdown.d.ts +18 -15
  71. package/dist/components/dropdown.js +11 -3
  72. package/dist/components/dropdown.js.map +1 -1
  73. package/dist/components/entity-combobox.d.ts +3 -3
  74. package/dist/components/entity-combobox.js +2 -1
  75. package/dist/components/entity-combobox.js.map +1 -1
  76. package/dist/components/field-base.d.ts +0 -5
  77. package/dist/components/field-base.js +0 -5
  78. package/dist/components/field-base.js.map +1 -1
  79. package/dist/components/field-parts.d.ts +69 -22
  80. package/dist/components/field-parts.js +33 -19
  81. package/dist/components/field-parts.js.map +1 -1
  82. package/dist/components/field-strip.d.ts +9 -23
  83. package/dist/components/field-strip.js +26 -23
  84. package/dist/components/field-strip.js.map +1 -1
  85. package/dist/components/field-sync.d.ts +0 -4
  86. package/dist/components/field-sync.js +0 -4
  87. package/dist/components/field-sync.js.map +1 -1
  88. package/dist/components/field.d.ts +7 -6
  89. package/dist/components/field.js +24 -15
  90. package/dist/components/field.js.map +1 -1
  91. package/dist/components/full-bleed-dialog.js +2 -2
  92. package/dist/components/full-bleed-dialog.js.map +1 -1
  93. package/dist/components/help-popover.d.ts +9 -7
  94. package/dist/components/help-popover.js.map +1 -1
  95. package/dist/components/hover-menu.d.ts +6 -13
  96. package/dist/components/hover-menu.js +3 -3
  97. package/dist/components/hover-menu.js.map +1 -1
  98. package/dist/components/icon-picker.d.ts +3 -2
  99. package/dist/components/icon-picker.js +3 -0
  100. package/dist/components/icon-picker.js.map +1 -1
  101. package/dist/components/inline-entity-combobox.d.ts +3 -3
  102. package/dist/components/inline-entity-combobox.js +2 -1
  103. package/dist/components/inline-entity-combobox.js.map +1 -1
  104. package/dist/components/input.d.ts +2 -2
  105. package/dist/components/input.js +2 -1
  106. package/dist/components/input.js.map +1 -1
  107. package/dist/components/modal.d.ts +9 -1
  108. package/dist/components/modal.js +7 -4
  109. package/dist/components/modal.js.map +1 -1
  110. package/dist/components/month-picker.d.ts +2 -1
  111. package/dist/components/month-picker.js +8 -1
  112. package/dist/components/month-picker.js.map +1 -1
  113. package/dist/components/multi-entity-combobox.d.ts +2 -2
  114. package/dist/components/multi-entity-combobox.js +2 -1
  115. package/dist/components/multi-entity-combobox.js.map +1 -1
  116. package/dist/components/multi-select.d.ts +7 -18
  117. package/dist/components/multi-select.js +8 -10
  118. package/dist/components/multi-select.js.map +1 -1
  119. package/dist/components/number-input.d.ts +2 -5
  120. package/dist/components/number-input.js +2 -4
  121. package/dist/components/number-input.js.map +1 -1
  122. package/dist/components/numeric-field.d.ts +5 -2
  123. package/dist/components/numeric-field.js +4 -1
  124. package/dist/components/numeric-field.js.map +1 -1
  125. package/dist/components/one-time-code-input.d.ts +2 -1
  126. package/dist/components/one-time-code-input.js +2 -1
  127. package/dist/components/one-time-code-input.js.map +1 -1
  128. package/dist/components/phone-input.d.ts +1 -1
  129. package/dist/components/phone-input.js +4 -0
  130. package/dist/components/phone-input.js.map +1 -1
  131. package/dist/components/popover.js +3 -3
  132. package/dist/components/popover.js.map +1 -1
  133. package/dist/components/select.d.ts +4 -3
  134. package/dist/components/select.js +2 -1
  135. package/dist/components/select.js.map +1 -1
  136. package/dist/components/series-chart.js.map +1 -1
  137. package/dist/components/server-wake.d.ts +0 -6
  138. package/dist/components/server-wake.js.map +1 -1
  139. package/dist/components/settings-fields.d.ts +4 -2
  140. package/dist/components/settings-fields.js.map +1 -1
  141. package/dist/components/slider.d.ts +3 -2
  142. package/dist/components/slider.js +7 -1
  143. package/dist/components/slider.js.map +1 -1
  144. package/dist/components/stat-tile.d.ts +8 -2
  145. package/dist/components/stat-tile.js +2 -11
  146. package/dist/components/stat-tile.js.map +1 -1
  147. package/dist/components/swatch-picker.d.ts +3 -2
  148. package/dist/components/swatch-picker.js +3 -0
  149. package/dist/components/swatch-picker.js.map +1 -1
  150. package/dist/components/swipeable-row.d.ts +2 -17
  151. package/dist/components/swipeable-row.js +11 -16
  152. package/dist/components/swipeable-row.js.map +1 -1
  153. package/dist/components/text-link.js +3 -1
  154. package/dist/components/text-link.js.map +1 -1
  155. package/dist/components/textarea.d.ts +2 -1
  156. package/dist/components/textarea.js +9 -3
  157. package/dist/components/textarea.js.map +1 -1
  158. package/dist/components/toggle-group.d.ts +2 -2
  159. package/dist/components/toggle-group.js +7 -3
  160. package/dist/components/toggle-group.js.map +1 -1
  161. package/dist/components/tooltip.d.ts +9 -1
  162. package/dist/components/tooltip.js +20 -5
  163. package/dist/components/tooltip.js.map +1 -1
  164. package/dist/components/translation-review.d.ts +10 -2
  165. package/dist/components/translation-review.js +11 -3
  166. package/dist/components/translation-review.js.map +1 -1
  167. package/dist/components/use-table-state.d.ts +31 -3
  168. package/dist/components/use-table-state.js +53 -8
  169. package/dist/components/use-table-state.js.map +1 -1
  170. package/dist/components/user-avatar.d.ts +2 -2
  171. package/dist/components/user-avatar.js.map +1 -1
  172. package/dist/components/wizard-stepper.d.ts +1 -4
  173. package/dist/components/wizard-stepper.js +2 -3
  174. package/dist/components/wizard-stepper.js.map +1 -1
  175. package/dist/currencies.d.ts +23 -0
  176. package/dist/currencies.js +38 -0
  177. package/dist/currencies.js.map +1 -0
  178. package/dist/demo/demo-banner.d.ts +7 -2
  179. package/dist/demo/demo-banner.js.map +1 -1
  180. package/dist/eslint/index.d.ts +83 -0
  181. package/dist/eslint/index.js +69 -0
  182. package/dist/eslint/index.js.map +1 -0
  183. package/dist/eslint/role-utilities.d.ts +48 -0
  184. package/dist/eslint/role-utilities.generated.d.ts +2 -0
  185. package/dist/eslint/role-utilities.generated.js +143 -0
  186. package/dist/eslint/role-utilities.generated.js.map +1 -0
  187. package/dist/eslint/role-utilities.js +43 -0
  188. package/dist/eslint/role-utilities.js.map +1 -0
  189. package/dist/feedback/feedback-menu.d.ts +2 -2
  190. package/dist/feedback/feedback-menu.js.map +1 -1
  191. package/dist/feedback/feedback-thread.d.ts +3 -8
  192. package/dist/feedback/feedback-thread.js +0 -2
  193. package/dist/feedback/feedback-thread.js.map +1 -1
  194. package/dist/hooks/use-dismiss.d.ts +16 -3
  195. package/dist/hooks/use-dismiss.js +14 -2
  196. package/dist/hooks/use-dismiss.js.map +1 -1
  197. package/dist/i18n/defaults.js +5 -1
  198. package/dist/i18n/defaults.js.map +1 -1
  199. package/dist/i18n/german.js +97 -1
  200. package/dist/i18n/german.js.map +1 -1
  201. package/dist/i18n/kit-labels.d.ts +29 -4
  202. package/dist/i18n/kit-labels.js +21 -1
  203. package/dist/i18n/kit-labels.js.map +1 -1
  204. package/dist/i18n/locales/en.js +104 -3
  205. package/dist/i18n/locales/en.js.map +3 -3
  206. package/dist/i18n/locales/es.js +95 -1
  207. package/dist/i18n/locales/es.js.map +1 -1
  208. package/dist/i18n/locales/fr.js +99 -3
  209. package/dist/i18n/locales/fr.js.map +1 -1
  210. package/dist/i18n/locales/hu.js +95 -1
  211. package/dist/i18n/locales/hu.js.map +1 -1
  212. package/dist/i18n/locales/it.js +99 -3
  213. package/dist/i18n/locales/it.js.map +1 -1
  214. package/dist/i18n/locales/zh.js +95 -1
  215. package/dist/i18n/locales/zh.js.map +1 -1
  216. package/dist/i18n/review.js +13 -0
  217. package/dist/i18n/review.js.map +1 -1
  218. package/dist/i18n/shared-labels.js +3 -1
  219. package/dist/i18n/shared-labels.js.map +1 -1
  220. package/dist/index.d.ts +23 -1
  221. package/dist/index.js +40 -2
  222. package/dist/index.js.map +1 -1
  223. package/dist/lib/device-settings.d.ts +72 -0
  224. package/dist/lib/device-settings.js +64 -0
  225. package/dist/lib/device-settings.js.map +1 -0
  226. package/dist/lib/plain-text.d.ts +11 -0
  227. package/dist/lib/plain-text.js +16 -0
  228. package/dist/lib/plain-text.js.map +1 -0
  229. package/dist/lib/refs.d.ts +13 -0
  230. package/dist/lib/refs.js +15 -0
  231. package/dist/lib/refs.js.map +1 -0
  232. package/dist/lib/safe-storage.d.ts +6 -0
  233. package/dist/lib/safe-storage.js +11 -0
  234. package/dist/lib/safe-storage.js.map +1 -1
  235. package/dist/notifications/notification-parts.d.ts +39 -0
  236. package/dist/notifications/notification-parts.js +47 -0
  237. package/dist/notifications/notification-parts.js.map +1 -0
  238. package/dist/notifications/notification-types-setting.d.ts +62 -0
  239. package/dist/notifications/notification-types-setting.js +192 -0
  240. package/dist/notifications/notification-types-setting.js.map +1 -0
  241. package/dist/notifications/notification-types.d.ts +75 -0
  242. package/dist/notifications/notification-types.js +2 -0
  243. package/dist/notifications/notification-types.js.map +1 -0
  244. package/dist/notifications/notifications-labels.d.ts +131 -0
  245. package/dist/notifications/notifications-labels.js +83 -0
  246. package/dist/notifications/notifications-labels.js.map +1 -0
  247. package/dist/notifications/push-device-setting.d.ts +37 -0
  248. package/dist/notifications/push-device-setting.js +164 -0
  249. package/dist/notifications/push-device-setting.js.map +1 -0
  250. package/dist/notifications/push-devices-setting.d.ts +44 -0
  251. package/dist/notifications/push-devices-setting.js +203 -0
  252. package/dist/notifications/push-devices-setting.js.map +1 -0
  253. package/dist/notifications/quiet-hours-setting.d.ts +47 -0
  254. package/dist/notifications/quiet-hours-setting.js +131 -0
  255. package/dist/notifications/quiet-hours-setting.js.map +1 -0
  256. package/dist/notifications/time-zone-select.d.ts +50 -0
  257. package/dist/notifications/time-zone-select.js +76 -0
  258. package/dist/notifications/time-zone-select.js.map +1 -0
  259. package/dist/notifications/unsubscribe-panel.d.ts +53 -0
  260. package/dist/notifications/unsubscribe-panel.js +139 -0
  261. package/dist/notifications/unsubscribe-panel.js.map +1 -0
  262. package/dist/notifications/use-push-device.d.ts +122 -0
  263. package/dist/notifications/use-push-device.js +230 -0
  264. package/dist/notifications/use-push-device.js.map +1 -0
  265. package/dist/rhf/fields.d.ts +36 -29
  266. package/dist/rhf/fields.js +51 -22
  267. package/dist/rhf/fields.js.map +1 -1
  268. package/dist/rhf/form-core.d.ts +5 -4
  269. package/dist/rhf/form-core.js.map +1 -1
  270. package/dist/rhf/form.d.ts +7 -36
  271. package/dist/rhf/form.js +1 -16
  272. package/dist/rhf/form.js.map +1 -1
  273. package/dist/rhf/line-items.d.ts +1 -1
  274. package/dist/rhf/line-items.js.map +1 -1
  275. package/dist/rhf/use-rhf-wizard-step.js.map +1 -1
  276. package/dist/rhf.js.map +1 -1
  277. package/dist/settings/device-reset-setting-labels.d.ts +3 -0
  278. package/dist/settings/device-reset-setting-labels.js +15 -0
  279. package/dist/settings/device-reset-setting-labels.js.map +1 -0
  280. package/dist/settings/device-reset-setting.d.ts +58 -0
  281. package/dist/settings/device-reset-setting.js +51 -0
  282. package/dist/settings/device-reset-setting.js.map +1 -0
  283. package/dist/shell/app-shell.js +5 -0
  284. package/dist/shell/app-shell.js.map +1 -1
  285. package/dist/shell/option-switcher-menu.d.ts +5 -17
  286. package/dist/shell/option-switcher-menu.js +1 -3
  287. package/dist/shell/option-switcher-menu.js.map +1 -1
  288. package/dist/shell/role-switcher.d.ts +1 -4
  289. package/dist/shell/role-switcher.js +2 -3
  290. package/dist/shell/role-switcher.js.map +1 -1
  291. package/dist/shell/topbar-action-menu.d.ts +7 -19
  292. package/dist/shell/topbar-action-menu.js +1 -3
  293. package/dist/shell/topbar-action-menu.js.map +1 -1
  294. package/dist/shell/topbar-controls.d.ts +3 -12
  295. package/dist/shell/topbar-controls.js +6 -9
  296. package/dist/shell/topbar-controls.js.map +1 -1
  297. package/dist/testing/index.d.ts +1 -1
  298. package/dist/testing/index.js +2 -0
  299. package/dist/testing/index.js.map +1 -1
  300. package/dist/testing/viewport.d.ts +25 -2
  301. package/dist/testing/viewport.js +61 -10
  302. package/dist/testing/viewport.js.map +1 -1
  303. package/dist/theme/contrast-tokens.d.ts +42 -4
  304. package/dist/theme/contrast-tokens.js +56 -9
  305. package/dist/theme/contrast-tokens.js.map +1 -1
  306. package/dist/theme/contrast.d.ts +4 -2
  307. package/dist/theme/contrast.js +13 -0
  308. package/dist/theme/contrast.js.map +1 -1
  309. package/dist/theme/palette-derive.d.ts +15 -1
  310. package/dist/theme/palette-derive.js +37 -8
  311. package/dist/theme/palette-derive.js.map +1 -1
  312. package/dist/theme/palette-presets.d.ts +2 -8
  313. package/dist/theme/palette-presets.js +5 -284
  314. package/dist/theme/palette-presets.js.map +1 -1
  315. package/dist/theme/palette-store.js +6 -0
  316. package/dist/theme/palette-store.js.map +1 -1
  317. package/dist/theme/text-size.js +6 -0
  318. package/dist/theme/text-size.js.map +1 -1
  319. package/dist/theme/theme-store.js +6 -0
  320. package/dist/theme/theme-store.js.map +1 -1
  321. package/dist/wizard/types.d.ts +0 -5
  322. package/dist/wizard/types.js +1 -5
  323. package/dist/wizard/types.js.map +1 -1
  324. package/package.json +9 -1
  325. package/src/admin/role-select.tsx +4 -1
  326. package/src/billing/billing-banner.tsx +5 -2
  327. package/src/billing/plan-limit-notice.tsx +5 -2
  328. package/src/chart.ts +5 -3
  329. package/src/components/amount-input.tsx +4 -7
  330. package/src/components/autocomplete.tsx +5 -2
  331. package/src/components/button-look.ts +15 -5
  332. package/src/components/calculator.tsx +2 -7
  333. package/src/components/chart-zoom.tsx +4 -47
  334. package/src/components/checkbox-group.tsx +22 -4
  335. package/src/components/chip-input.tsx +0 -7
  336. package/src/components/column-mapper.tsx +6 -2
  337. package/src/components/combobox.tsx +6 -3
  338. package/src/components/copy-button.tsx +5 -1
  339. package/src/components/country-select.tsx +6 -1
  340. package/src/components/currency-option-list.tsx +8 -42
  341. package/src/components/currency-select.tsx +12 -3
  342. package/src/components/danger-confirm.tsx +3 -3
  343. package/src/components/data-table-filter-popover.tsx +2 -1
  344. package/src/components/data-table-labels.ts +2 -84
  345. package/src/components/data-table-shared.tsx +55 -2
  346. package/src/components/data-table.tsx +29 -17
  347. package/src/components/date-field.tsx +2 -2
  348. package/src/components/date-picker.tsx +3 -0
  349. package/src/components/date-range-picker.tsx +3 -0
  350. package/src/components/dialog-frame.tsx +3 -1
  351. package/src/components/dropdown.tsx +42 -18
  352. package/src/components/entity-combobox.tsx +6 -3
  353. package/src/components/field-base.tsx +0 -11
  354. package/src/components/field-parts.tsx +112 -38
  355. package/src/components/field-strip.tsx +12 -27
  356. package/src/components/field-sync.tsx +0 -7
  357. package/src/components/field.tsx +32 -19
  358. package/src/components/full-bleed-dialog.tsx +4 -3
  359. package/src/components/help-popover.tsx +9 -7
  360. package/src/components/hover-menu.tsx +12 -16
  361. package/src/components/icon-picker.tsx +8 -3
  362. package/src/components/inline-entity-combobox.tsx +6 -3
  363. package/src/components/input.tsx +4 -2
  364. package/src/components/modal.tsx +20 -4
  365. package/src/components/month-picker.tsx +10 -3
  366. package/src/components/multi-entity-combobox.tsx +5 -2
  367. package/src/components/multi-select.tsx +19 -31
  368. package/src/components/number-input.tsx +5 -10
  369. package/src/components/numeric-field.ts +10 -2
  370. package/src/components/one-time-code-input.tsx +5 -3
  371. package/src/components/phone-input.tsx +4 -0
  372. package/src/components/popover.tsx +8 -4
  373. package/src/components/select.tsx +6 -3
  374. package/src/components/series-chart.tsx +1 -1
  375. package/src/components/server-wake.tsx +0 -6
  376. package/src/components/settings-fields.tsx +4 -2
  377. package/src/components/slider.tsx +10 -3
  378. package/src/components/stat-tile.tsx +11 -20
  379. package/src/components/swatch-picker.tsx +9 -4
  380. package/src/components/swipeable-row.tsx +15 -37
  381. package/src/components/text-link.tsx +3 -1
  382. package/src/components/textarea.tsx +11 -4
  383. package/src/components/toggle-group.tsx +21 -5
  384. package/src/components/tooltip.tsx +37 -6
  385. package/src/components/translation-review.tsx +25 -7
  386. package/src/components/use-table-state.ts +91 -10
  387. package/src/components/user-avatar.tsx +2 -2
  388. package/src/components/wizard-stepper.tsx +2 -6
  389. package/src/currencies.ts +70 -0
  390. package/src/demo/demo-banner.tsx +7 -2
  391. package/src/eslint/index.ts +161 -0
  392. package/src/eslint/role-utilities.generated.ts +146 -0
  393. package/src/eslint/role-utilities.ts +99 -0
  394. package/src/feedback/feedback-menu.tsx +2 -2
  395. package/src/feedback/feedback-thread.tsx +3 -8
  396. package/src/hooks/use-dismiss.ts +39 -4
  397. package/src/i18n/defaults.ts +4 -0
  398. package/src/i18n/german.ts +113 -0
  399. package/src/i18n/kit-labels.tsx +66 -6
  400. package/src/i18n/locales/en.ts +6 -0
  401. package/src/i18n/locales/es.ts +106 -0
  402. package/src/i18n/locales/fr.ts +109 -2
  403. package/src/i18n/locales/hu.ts +104 -0
  404. package/src/i18n/locales/it.ts +108 -2
  405. package/src/i18n/locales/zh.ts +96 -0
  406. package/src/i18n/review.ts +13 -0
  407. package/src/i18n/shared-labels.ts +2 -0
  408. package/src/index.ts +53 -1
  409. package/src/lib/device-settings.ts +146 -0
  410. package/src/lib/plain-text.ts +22 -0
  411. package/src/lib/refs.ts +22 -0
  412. package/src/lib/safe-storage.ts +16 -0
  413. package/src/notifications/notification-parts.tsx +83 -0
  414. package/src/notifications/notification-types-setting.tsx +309 -0
  415. package/src/notifications/notification-types.ts +80 -0
  416. package/src/notifications/notifications-labels.ts +238 -0
  417. package/src/notifications/push-device-setting.tsx +224 -0
  418. package/src/notifications/push-devices-setting.tsx +306 -0
  419. package/src/notifications/quiet-hours-setting.tsx +185 -0
  420. package/src/notifications/time-zone-select.tsx +126 -0
  421. package/src/notifications/unsubscribe-panel.tsx +203 -0
  422. package/src/notifications/use-push-device.ts +392 -0
  423. package/src/rhf/fields.tsx +87 -39
  424. package/src/rhf/form-core.tsx +5 -4
  425. package/src/rhf/form.tsx +7 -43
  426. package/src/rhf/line-items.tsx +1 -1
  427. package/src/rhf/use-rhf-wizard-step.ts +4 -4
  428. package/src/rhf.ts +3 -2
  429. package/src/settings/device-reset-setting-labels.ts +20 -0
  430. package/src/settings/device-reset-setting.tsx +119 -0
  431. package/src/shell/app-shell.tsx +8 -0
  432. package/src/shell/option-switcher-menu.tsx +5 -22
  433. package/src/shell/role-switcher.tsx +2 -6
  434. package/src/shell/topbar-action-menu.tsx +7 -24
  435. package/src/shell/topbar-controls.tsx +6 -18
  436. package/src/testing/index.ts +3 -1
  437. package/src/testing/viewport.ts +125 -19
  438. package/src/theme/contrast-tokens.ts +106 -12
  439. package/src/theme/contrast.ts +30 -4
  440. package/src/theme/palette-derive.ts +68 -7
  441. package/src/theme/palette-presets.ts +16 -299
  442. package/src/theme/palette-store.ts +12 -0
  443. package/src/theme/text-size.ts +8 -0
  444. package/src/theme/theme-store.ts +10 -0
  445. package/src/wizard/types.ts +0 -8
  446. package/tokens.css +38 -4
@@ -8,11 +8,11 @@
8
8
  // concrete hex in JS, so they read the same values from here via the hooks in
9
9
  // palette-store.
10
10
  //
11
- // The alternative presets below were designed + accessibility-vetted as a set
12
- // (each is CVD-safe across protan/deutan/tritan, money is never red/green, and
13
- // text/background contrast clears WCAG AA on both themes). To promote one to the
14
- // app-wide default, copy its values into the :root/.dark blocks in tokens.css
15
- // (the default preset here mirrors those exactly).
11
+ // The default preset here mirrors the :root/.dark blocks in tokens.css exactly. The
12
+ // five hand-picked alternatives of #307 (`ALTERNATIVE_PRESETS`, a reference bank that
13
+ // `presetById` never resolved) were removed in 0.35 (refactor audit 2026-10, API-6c;
14
+ // deprecated in 0.34): `PALETTES` is what an app offers, and `derivePalette` makes a
15
+ // palette of its own.
16
16
 
17
17
  import type { HeatStops } from "./chart-palette";
18
18
  import { contrastStep, rememberTokenSet } from "./contrast-tokens";
@@ -127,292 +127,6 @@ export const DEFAULT_PRESET: PalettePreset = {
127
127
  },
128
128
  };
129
129
 
130
- // Vetted alternatives to preview (CVD-safe, WCAG-AA on both themes).
131
- /**
132
- * @deprecated 0.34 — `PALETTES`, the presets `presetById` and the palette store know, or
133
- * `derivePalette` for a palette of the app's own; removed in 0.35 (refactor audit 2026-10,
134
- * API-6c). A reference bank only: `presetById` resolves none of these ids, and no app
135
- * imports it (deferred since the 2026-09-22 audit).
136
- */
137
- export const ALTERNATIVE_PRESETS: PalettePreset[] = [
138
- {
139
- id: "warm-paper",
140
- name: "Warm Paper",
141
- blurb: "Cream paper · warm charcoal",
142
- light: {
143
- bgPage: "#ece5d6",
144
- bgSurface: "#f5efe3",
145
- bgSurface2: "#ece5d6",
146
- border: "#e2dcce",
147
- textPrimary: "#2b2622",
148
- textSecondary: "#4f4a44",
149
- textMuted: "#68625b",
150
- brand: "#9a5b34",
151
- brandHover: "#824827",
152
- brandContrast: "#fdf8f2",
153
- moneyIncome: "#0e7490",
154
- moneyExpense: "#8f3f0a",
155
- moneyNet: "#7c4dab",
156
- moneyNeutral: "#6b6258",
157
- chart: ["#332288", "#88ccee", "#44aa99", "#117733", "#999933", "#ddcc77", "#cc6677", "#882255", "#aa4499"],
158
- heat: {
159
- neutral: "#efe9dc",
160
- under: "#0e7490",
161
- over: "#b45309",
162
- seqLow: "#fbeed2",
163
- seqHigh: "#b45309",
164
- empty: "rgba(148,163,184,0.14)",
165
- },
166
- },
167
- dark: {
168
- bgPage: "#211e1a",
169
- bgSurface: "#2a2622",
170
- bgSurface2: "#322d27",
171
- border: "#3d372f",
172
- textPrimary: "#e8e2d6",
173
- textSecondary: "#bfb9af",
174
- textMuted: "#9e998f",
175
- brand: "#e0986a",
176
- brandHover: "#ecae85",
177
- brandContrast: "#2a1c10",
178
- moneyIncome: "#4dd4c4",
179
- moneyExpense: "#fbbf3a",
180
- moneyNet: "#bfa0e0",
181
- moneyNeutral: "#a39a8c",
182
- chart: ["#7e72d6", "#9fd8f2", "#5fc4b0", "#3fa45f", "#bfbf5e", "#e8dda0", "#e08c9a", "#cf6488", "#cc78be"],
183
- heat: {
184
- neutral: "#3a352e",
185
- under: "#4dd4c4",
186
- over: "#fbbf3a",
187
- seqLow: "#2c2014",
188
- seqHigh: "#fbbf3a",
189
- empty: "rgba(148,163,184,0.10)",
190
- },
191
- },
192
- },
193
- {
194
- id: "nord-frost",
195
- name: "Nord Frost",
196
- blurb: "Cool snow · polar night",
197
- light: {
198
- bgPage: "#e2e7ef",
199
- bgSurface: "#f0f3f8",
200
- bgSurface2: "#e2e7ef",
201
- border: "#d3dae6",
202
- textPrimary: "#2e3440",
203
- textSecondary: "#454b56",
204
- textMuted: "#5e636e",
205
- brand: "#3b6ea5",
206
- brandHover: "#305a86",
207
- brandContrast: "#ffffff",
208
- moneyIncome: "#0f8060",
209
- moneyExpense: "#b8431a",
210
- moneyNet: "#6b4fa0",
211
- moneyNeutral: "#5b6577",
212
- chart: ["#3a6ea5", "#56b6c2", "#2f7d4f", "#cdb52f", "#d05f7a", "#9a3f93", "#4d4bbf", "#dd6a2c", "#7a8aa8"],
213
- heat: {
214
- neutral: "#e1e6ee",
215
- under: "#0f8060",
216
- over: "#b8431a",
217
- seqLow: "#f0f3f7",
218
- seqHigh: "#a14708",
219
- empty: "rgba(148,163,184,0.14)",
220
- },
221
- },
222
- dark: {
223
- bgPage: "#242933",
224
- bgSurface: "#2e3440",
225
- bgSurface2: "#3b4252",
226
- border: "#434c5e",
227
- textPrimary: "#eceff4",
228
- textSecondary: "#d4d7de",
229
- textMuted: "#afb3bc",
230
- brand: "#88c0d0",
231
- brandHover: "#a3d4e0",
232
- brandContrast: "#1c2027",
233
- moneyIncome: "#4ecf9c",
234
- moneyExpense: "#e8a24f",
235
- moneyNet: "#caa0e0",
236
- moneyNeutral: "#9aa5b8",
237
- chart: ["#7fb4e6", "#5ec9d6", "#5cc483", "#dccb6b", "#e87e96", "#bd6fce", "#9389f2", "#ef8f4a", "#8693ad"],
238
- heat: {
239
- neutral: "#3b4252",
240
- under: "#4ecf9c",
241
- over: "#e8a24f",
242
- seqLow: "#33373f",
243
- seqHigh: "#e8a24f",
244
- empty: "rgba(148,163,184,0.10)",
245
- },
246
- },
247
- },
248
- {
249
- id: "indigo-noir",
250
- name: "Indigo Noir",
251
- blurb: "Crisp light · deep indigo",
252
- light: {
253
- bgPage: "#e8eaf2",
254
- bgSurface: "#f6f7fb",
255
- bgSurface2: "#e8eaf2",
256
- border: "#dadfeb",
257
- textPrimary: "#1b1f2e",
258
- textSecondary: "#494d5a",
259
- textMuted: "#626572",
260
- brand: "#4338ca",
261
- brandHover: "#3730a3",
262
- brandContrast: "#ffffff",
263
- moneyIncome: "#0c6478",
264
- moneyExpense: "#b45309",
265
- moneyNet: "#7c3aed",
266
- moneyNeutral: "#5b6478",
267
- chart: ["#332288", "#88ccee", "#44aa99", "#117733", "#999933", "#ddcc77", "#cc6677", "#882255", "#aa4499"],
268
- heat: {
269
- neutral: "#eef1f7",
270
- under: "#0c6478",
271
- over: "#b45309",
272
- seqLow: "#fdeed4",
273
- seqHigh: "#b45309",
274
- empty: "rgba(148,163,184,0.14)",
275
- },
276
- },
277
- dark: {
278
- bgPage: "#0e0f1c",
279
- bgSurface: "#181a2c",
280
- bgSurface2: "#21243a",
281
- border: "#2e3252",
282
- textPrimary: "#e6e8f4",
283
- textSecondary: "#adafbe",
284
- textMuted: "#8d90a0",
285
- brand: "#8b93f8",
286
- brandHover: "#aab1fb",
287
- brandContrast: "#16182b",
288
- moneyIncome: "#22c3b6",
289
- // Kept byte-identical to DEFAULT_PRESET.dark, which IS this preset (dev#434).
290
- moneyExpense: "#e4b035",
291
- moneyNet: "#b39aef",
292
- moneyNeutral: "#9aa1bd",
293
- chart: ["#7e72d6", "#9fd8f2", "#5fc4b0", "#3fa45f", "#bfbf5e", "#e8dda0", "#e08c9a", "#c25a78", "#cc78be"],
294
- heat: {
295
- neutral: "#363a5a",
296
- under: "#22c3b6",
297
- over: "#fbbf24",
298
- seqLow: "#3a2c14",
299
- seqHigh: "#fbbf24",
300
- empty: "rgba(148,163,184,0.10)",
301
- },
302
- },
303
- },
304
- {
305
- id: "solar-dusk",
306
- name: "Solar Dusk",
307
- blurb: "Solarized warmth, easy on the eyes",
308
- light: {
309
- bgPage: "#ede3cf",
310
- bgSurface: "#f6ecd9",
311
- bgSurface2: "#ede3cf",
312
- border: "#e2d6bd",
313
- textPrimary: "#463f33",
314
- textSecondary: "#50493c",
315
- textMuted: "#696153",
316
- brand: "#2c6979",
317
- brandHover: "#1f515f",
318
- brandContrast: "#ffffff",
319
- moneyIncome: "#0b6650",
320
- moneyExpense: "#905902",
321
- moneyNet: "#7a4fa3",
322
- moneyNeutral: "#6b6453",
323
- chart: ["#332288", "#88ccee", "#44aa99", "#117733", "#999933", "#ddcc77", "#cc6677", "#882255", "#aa4499"],
324
- heat: {
325
- neutral: "#f1e7d2",
326
- under: "#0b6650",
327
- over: "#9c6418",
328
- seqLow: "#f6ecd0",
329
- seqHigh: "#9c6418",
330
- empty: "rgba(148,163,184,0.14)",
331
- },
332
- },
333
- dark: {
334
- bgPage: "#0e1a1f",
335
- bgSurface: "#15272e",
336
- bgSurface2: "#1d333c",
337
- border: "#2a4750",
338
- textPrimary: "#d6cdb8",
339
- textSecondary: "#c2bdab",
340
- textMuted: "#9c9d91",
341
- brand: "#5fb8cc",
342
- brandHover: "#82cfe0",
343
- brandContrast: "#0a161a",
344
- moneyIncome: "#22b884",
345
- moneyExpense: "#f0b94e",
346
- moneyNet: "#bfa0e0",
347
- moneyNeutral: "#9aa3a0",
348
- chart: ["#7e72d6", "#9fd8f2", "#5fc4b0", "#3fa45f", "#bfbf5e", "#e8dda0", "#e08c9a", "#c25a78", "#c873c0"],
349
- heat: {
350
- neutral: "#26424b",
351
- under: "#22b884",
352
- over: "#f0b94e",
353
- seqLow: "#1f3138",
354
- seqHigh: "#f0b94e",
355
- empty: "rgba(148,163,184,0.10)",
356
- },
357
- },
358
- },
359
- {
360
- id: "zinc-mono",
361
- name: "Zinc Mono",
362
- blurb: "True-neutral chrome · data pops",
363
- light: {
364
- bgPage: "#ececec",
365
- bgSurface: "#f7f7f7",
366
- bgSurface2: "#ececec",
367
- border: "#e4e4e7",
368
- textPrimary: "#18181b",
369
- textSecondary: "#4e4e50",
370
- textMuted: "#676769",
371
- brand: "#1d4ed8",
372
- brandHover: "#1e40af",
373
- brandContrast: "#ffffff",
374
- moneyIncome: "#0e7490",
375
- moneyExpense: "#cf4310",
376
- moneyNet: "#7c3aed",
377
- moneyNeutral: "#52525b",
378
- chart: ["#332288", "#88ccee", "#44aa99", "#117733", "#999933", "#ddcc77", "#cc6677", "#882255", "#aa4499"],
379
- heat: {
380
- neutral: "#f4f4f5",
381
- under: "#0e7490",
382
- over: "#cf4310",
383
- seqLow: "#fdeede",
384
- seqHigh: "#cf4310",
385
- empty: "rgba(148,163,184,0.14)",
386
- },
387
- },
388
- dark: {
389
- bgPage: "#09090b",
390
- bgSurface: "#18181b",
391
- bgSurface2: "#27272a",
392
- border: "#3f3f46",
393
- textPrimary: "#f4f4f5",
394
- textSecondary: "#b2b2b3",
395
- textMuted: "#929294",
396
- brand: "#60a5fa",
397
- brandHover: "#93c5fd",
398
- brandContrast: "#0b1220",
399
- moneyIncome: "#22d3ee",
400
- moneyExpense: "#f97316",
401
- moneyNet: "#c4b5fd",
402
- moneyNeutral: "#a1a1aa",
403
- chart: ["#7e72d6", "#9fd8f2", "#5fc4b0", "#3fa45f", "#bfbf5e", "#e8dda0", "#e08c9a", "#c25a78", "#cc78be"],
404
- heat: {
405
- neutral: "#3f3f46",
406
- under: "#22d3ee",
407
- over: "#f97316",
408
- seqLow: "#3a2410",
409
- seqHigh: "#f97316",
410
- empty: "rgba(148,163,184,0.10)",
411
- },
412
- },
413
- },
414
- ];
415
-
416
130
  // ── "Imprint" chart hues (feedback #119) ──────────────────────────────────────
417
131
  // anyplot's categorical palette (https://anyplot.ai/palette), by a colleague of
418
132
  // Marcel's. 8 hues + an amber semantic anchor, derived from Wong 2011 by a
@@ -472,8 +186,8 @@ export const IMPRINT_PRESET: PalettePreset = {
472
186
  };
473
187
 
474
188
  // The full-theme switcher from #307 stayed retired (feedback #328) — the default
475
- // is still the single source of truth for surfaces, brand and money, and
476
- // ALTERNATIVE_PRESETS above remains a reference bank only. What IS selectable is
189
+ // is still the single source of truth for surfaces, brand and money (its five
190
+ // alternatives are gone, see the header). What IS selectable is
477
191
  // the categorical chart ramp (feedback #119), so these two presets are the live
478
192
  // set; presetById falls back to the default for any stale persisted id.
479
193
  /**
@@ -758,7 +472,8 @@ export function presetById(id: string): PalettePreset {
758
472
  * element, which is what that list was standing in for.
759
473
  *
760
474
  * **More contrast (0.32, docs/text-size-harmonization.md §5, §10.5).** With `contrast`
761
- * the text and border tokens are written one step stronger, and `--text-placeholder` —
475
+ * the text and border tokens are written one step stronger — in a light set the well and
476
+ * the four money colours too (0.36, docs/colour-roles-harmonization.md §13) — and `--text-placeholder` —
762
477
  * otherwise derived in tokens.css — is written inline too; without it that inline
763
478
  * placeholder is removed again, so the stylesheet's formula applies. The step is made
764
479
  * HERE because these tokens are inline: no `[data-contrast=more]` rule could beat them.
@@ -777,7 +492,9 @@ export function applyTokenSet(
777
492
  const step = contrast ? contrastStep(t) : null;
778
493
  el.style.setProperty("--bg-page", t.bgPage);
779
494
  el.style.setProperty("--bg-surface", t.bgSurface);
780
- el.style.setProperty("--bg-surface-2", t.bgSurface2);
495
+ // The light well and money step under More contrast (0.36, colour-roles §13); in dark
496
+ // and at Standard `well` is null and the set's own are written.
497
+ el.style.setProperty("--bg-surface-2", step?.well?.bgSurface2 ?? t.bgSurface2);
781
498
  el.style.setProperty("--border", step?.border ?? t.border);
782
499
  el.style.setProperty("--text-primary", t.textPrimary);
783
500
  el.style.setProperty("--text-secondary", step?.textSecondary ?? t.textSecondary);
@@ -787,9 +504,9 @@ export function applyTokenSet(
787
504
  el.style.setProperty("--brand", t.brand);
788
505
  el.style.setProperty("--brand-hover", t.brandHover);
789
506
  el.style.setProperty("--brand-contrast", t.brandContrast);
790
- el.style.setProperty("--money-income", t.moneyIncome);
791
- el.style.setProperty("--money-expense", t.moneyExpense);
792
- el.style.setProperty("--money-net", t.moneyNet);
793
- el.style.setProperty("--money-neutral", t.moneyNeutral);
507
+ el.style.setProperty("--money-income", step?.well?.moneyIncome ?? t.moneyIncome);
508
+ el.style.setProperty("--money-expense", step?.well?.moneyExpense ?? t.moneyExpense);
509
+ el.style.setProperty("--money-net", step?.well?.moneyNet ?? t.moneyNet);
510
+ el.style.setProperty("--money-neutral", step?.well?.moneyNeutral ?? t.moneyNeutral);
794
511
  t.chart.forEach((c, i) => el.style.setProperty(`--chart-${i + 1}`, c));
795
512
  }
@@ -3,6 +3,7 @@ import { create } from "zustand";
3
3
  import { persist } from "zustand/middleware";
4
4
  import type { StoreApi, UseBoundStore } from "zustand";
5
5
  import { logger } from "../lib/logger";
6
+ import { registerDeviceSetting } from "../lib/device-settings";
6
7
  import type { HeatStops } from "./chart-palette";
7
8
  import { applyTokenSet, DEFAULT_PRESET, presetById, type TokenSet } from "./palette-presets";
8
9
  import type { ThemeState, ThemeMode } from "./theme-store";
@@ -56,6 +57,17 @@ export function createPaletteStore(
56
57
  "palette",
57
58
  ),
58
59
  );
60
+ // Reset this device's settings (docs/settings-harmonization.md §11.4): the Default
61
+ // palette, STATE ONLY. `useApplyPalette`, where the app mounts it, re-applies through
62
+ // its effect. Never an imperative `applyTokenSet` here: it would remember a token set
63
+ // on <html>, and an app without a palette layer (Kurvenschmiede) would then take the
64
+ // contrast store's palette branch, where a theme switch no longer re-writes the stepped
65
+ // tokens (KS 3.3).
66
+ registerDeviceSetting({
67
+ key: storageKey,
68
+ kind: "appearance",
69
+ reset: () => usePalette.getState().setId(DEFAULT_PRESET.id),
70
+ });
59
71
 
60
72
  /** Apply the active preset's tokens to <html> as inline CSS custom properties,
61
73
  * re-applying when the preset or the light/dark theme changes. Tailwind v4
@@ -3,6 +3,7 @@ import { create } from "zustand";
3
3
  import { persist } from "zustand/middleware";
4
4
  import { logger } from "../lib/logger";
5
5
  import { readStored } from "../lib/safe-storage";
6
+ import { registerDeviceSetting } from "../lib/device-settings";
6
7
 
7
8
  /**
8
9
  * The text size (docs/text-size-harmonization.md §2.1, §3.1, §10.3, §10.6).
@@ -267,6 +268,13 @@ export function createTextSizeStore(storageKey: string) {
267
268
  "text-size",
268
269
  ),
269
270
  );
271
+ // Reset this device's settings (docs/settings-harmonization.md §11.4): no choice on
272
+ // this device, so `useApplyTextSize` re-resolves to the account's size, else Normal.
273
+ registerDeviceSetting({
274
+ key: storageKey,
275
+ kind: "appearance",
276
+ reset: () => useTextSizeStore.getState().setSize(null),
277
+ });
270
278
 
271
279
  function useApplyTextSize({ account }: ApplyTextSizeOptions = {}): TextSize {
272
280
  const device = useTextSizeStore((s) => s.size);
@@ -2,6 +2,7 @@ import { useEffect } from "react";
2
2
  import { create } from "zustand";
3
3
  import { persist } from "zustand/middleware";
4
4
  import { logger } from "../lib/logger";
5
+ import { registerDeviceSetting } from "../lib/device-settings";
5
6
 
6
7
  export type ThemeMode = "light" | "dark";
7
8
  /** What the user chose; "system" tracks the OS `prefers-color-scheme`. */
@@ -116,6 +117,15 @@ export function createThemeStore(storageKey: string) {
116
117
  "theme",
117
118
  ),
118
119
  );
120
+ // Reset this device's settings (docs/settings-harmonization.md §11.4): back to
121
+ // "System" through the setter, which re-resolves `mode`; `useApplyTheme` puts the
122
+ // class back and follows the OS again, and the persisted blob is what the pre-paint
123
+ // `applyPersistedTheme` reads next load.
124
+ registerDeviceSetting({
125
+ key: storageKey,
126
+ kind: "appearance",
127
+ reset: () => useTheme.getState().setPreference("system"),
128
+ });
119
129
 
120
130
  function useApplyTheme(): void {
121
131
  const mode = useTheme((s) => s.mode);
@@ -255,11 +255,3 @@ export interface WizardLabels {
255
255
 
256
256
  // The English words live in ./wizard-labels, a module of words (round 0.34).
257
257
  export { DEFAULT_WIZARD_LABELS };
258
-
259
- /** @deprecated 0.34 — `useKitLabels("wizard", DEFAULT_WIZARD_LABELS, labels)`, which the
260
- * provider reaches too, or StepperNav's and WizardSummary's own `labels`; removed in 0.35
261
- * (refactor audit 2026-10, API-6a). A merge from before the provider, which no kit
262
- * component calls. */
263
- export function resolveWizardLabels(labels?: Partial<WizardLabels>): WizardLabels {
264
- return labels ? { ...DEFAULT_WIZARD_LABELS, ...labels } : DEFAULT_WIZARD_LABELS;
265
- }
package/tokens.css CHANGED
@@ -19,7 +19,8 @@
19
19
  * - In an app WITH a palette layer (keksdose, kastlan), `applyTokenSet` writes the
20
20
  * active preset's values inline on <html>, and those beat these.
21
21
  * - In an app WITHOUT one (Kurvenschmiede), these are what paints, and More contrast
22
- * writes only its four stepped values over them (`reapplyContrastTokens`).
22
+ * writes only its stepped values over them (`reapplyContrastTokens`): four in dark,
23
+ * nine in light, where the well and the money step too.
23
24
  *
24
25
  * Because it was taken for inert, it drifted silently, and it did — twice. The surfaces
25
26
  * and text colour below still held the pre-#328 palette while DEFAULT_PRESET had moved
@@ -42,9 +43,13 @@
42
43
  * paint (`applyPersistedTextSize`, or the inline `TEXT_SIZE_INLINE_SCRIPT`).
43
44
  *
44
45
  * `data-contrast="more"` is "More contrast", from the setting or from
45
- * `prefers-contrast: more` on "System". The colour tokens are stepped in JS
46
- * (`applyTokenSet`), because they are written inline on <html> and no rule here could
47
- * beat them; what lives here is only what is NOT inline — the focus frame's width.
46
+ * `prefers-contrast: more` on "System". The inline colour tokens — the text roles, the
47
+ * border, and in light the well and the money — are stepped in JS (`applyTokenSet`,
48
+ * `contrastStep`), because they are written inline on <html> and no rule here could beat
49
+ * them. What lives here is only what is NOT inline: the focus frame's width below, and
50
+ * in light the status, hue and field-sync literals and `--bg-active`, which step to read
51
+ * on the darker well (0.36, the `:root[data-contrast="more"]:not(.dark)` block after the
52
+ * categorical hues; docs/colour-roles-harmonization.md §13).
48
53
  *
49
54
  * These names are frozen: apps read them, and so does an app's boot splash. */
50
55
 
@@ -635,6 +640,35 @@ html[data-text-size="xlarge"] {
635
640
  --hue-orange-bg: rgba(124, 45, 18, 0.25);
636
641
  }
637
642
 
643
+ /* ── More contrast in light: the literals on the darker well (0.36) ───────────────
644
+ docs/colour-roles-harmonization.md §13. Under More contrast a light set's well is 10 %
645
+ ink into the card (`WELL_INK_MORE`, stepped in JS with the money, since both are
646
+ inline). On it the light literals above fell to 4.07–4.28:1 as text and
647
+ `--status-edited` to 2.77:1 as a mark, so they step here, each at its light value's
648
+ OKLCH hue and chroma at the lightness that clears its ratio on the stepped well of every
649
+ shipped preset — as §5.5 solved them against the page. On the page and the card they
650
+ then read 5.08:1 and up. The ones not listed hold on the stepped well as they are
651
+ (blue 4.60, indigo 5.42, purple 4.79; synced 4.89, pending 4.60, error 4.44 and the
652
+ danger line 3.22, marks and lines needing 3); `--warning-border-strong` is
653
+ `var(--warning)` in light and follows.
654
+
655
+ `--bg-active` (a digit key's hover, Button primary's, keksdose's assistant bubbles on
656
+ the well) sat 1.04:1 from a 10 % well at 12 %; at 16 % it is 1.12–1.15:1 from it.
657
+
658
+ `(0,3,0)` outranks `:root` and `:root, .dark` whatever the order, and `.dark` on
659
+ <html> leaves it out: dark does not step (§13.3, decision 4).
660
+ tokens-css-audit.test.ts measures every pair here. */
661
+ :root[data-contrast="more"]:not(.dark) {
662
+ --danger: #ba0739; /* solved: 4.53:1 on the worst stepped well (was 4.31) */
663
+ --warning: #9a4300; /* solved: 4.53:1 (was 4.13) */
664
+ --success: #006a4d; /* solved: 4.54:1 (was 4.13) */
665
+ --info: #006197; /* solved: 4.56:1 (was 4.07) */
666
+ --hue-teal: #006862; /* solved: 4.56:1 (was 4.15) */
667
+ --hue-orange: #a93400; /* solved: 4.53:1 (was 4.11) */
668
+ --status-edited: #b66200; /* solved, a mark: 3.04:1 (was 2.77) */
669
+ --bg-active: color-mix(in oklab, var(--text-primary) 16%, var(--bg-surface));
670
+ }
671
+
638
672
  /* ── Role utilities (0.33, docs/colour-roles-harmonization.md §7, k25) ─────────────
639
673
  *
640
674
  * `text-muted`, `bg-surface-2`, `border-subtle`, `ring-brand`, `fill-surface` … instead of