@eifi1/ui-kit 0.33.1 → 0.35.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 (1559) hide show
  1. package/README.md +512 -306
  2. package/dist/account/account-parts.d.ts +6 -8
  3. package/dist/account/account-parts.js +1 -2
  4. package/dist/account/account-parts.js.map +1 -1
  5. package/dist/{components → account}/account-settings-labels.d.ts +16 -10
  6. package/dist/{components → account}/account-settings-labels.js +3 -1
  7. package/dist/account/account-settings-labels.js.map +1 -0
  8. package/dist/{components → account}/account-settings.d.ts +53 -23
  9. package/dist/{components → account}/account-settings.js +97 -26
  10. package/dist/account/account-settings.js.map +1 -0
  11. package/dist/account/data-export-setting-labels.d.ts +2 -0
  12. package/dist/account/data-export-setting-labels.js +15 -0
  13. package/dist/account/data-export-setting-labels.js.map +1 -0
  14. package/dist/account/data-export-setting.d.ts +9 -11
  15. package/dist/account/data-export-setting.js +11 -27
  16. package/dist/account/data-export-setting.js.map +1 -1
  17. package/dist/account/delete-account-setting-labels.d.ts +2 -0
  18. package/dist/account/delete-account-setting-labels.js +23 -0
  19. package/dist/account/delete-account-setting-labels.js.map +1 -0
  20. package/dist/account/delete-account-setting.d.ts +132 -101
  21. package/dist/account/delete-account-setting.js +7 -23
  22. package/dist/account/delete-account-setting.js.map +1 -1
  23. package/dist/account/email-change-setting-labels.d.ts +2 -0
  24. package/dist/account/email-change-setting-labels.js +28 -0
  25. package/dist/account/email-change-setting-labels.js.map +1 -0
  26. package/dist/account/email-change-setting.d.ts +10 -12
  27. package/dist/account/email-change-setting.js +11 -30
  28. package/dist/account/email-change-setting.js.map +1 -1
  29. package/dist/{components → account}/passkeys-setting.d.ts +9 -12
  30. package/dist/{components → account}/passkeys-setting.js +10 -7
  31. package/dist/account/passkeys-setting.js.map +1 -0
  32. package/dist/account/sessions-setting-labels.d.ts +2 -0
  33. package/dist/account/sessions-setting-labels.js +22 -0
  34. package/dist/account/sessions-setting-labels.js.map +1 -0
  35. package/dist/account/sessions-setting.d.ts +12 -14
  36. package/dist/account/sessions-setting.js +8 -23
  37. package/dist/account/sessions-setting.js.map +1 -1
  38. package/dist/admin/admin-action-confirm-labels.d.ts +2 -0
  39. package/dist/admin/admin-action-confirm-labels.js +16 -0
  40. package/dist/admin/admin-action-confirm-labels.js.map +1 -0
  41. package/dist/admin/admin-action-confirm.d.ts +156 -101
  42. package/dist/admin/admin-action-confirm.js +17 -22
  43. package/dist/admin/admin-action-confirm.js.map +1 -1
  44. package/dist/admin/admin-action-log-labels.d.ts +2 -0
  45. package/dist/admin/admin-action-log-labels.js +73 -0
  46. package/dist/admin/admin-action-log-labels.js.map +1 -0
  47. package/dist/admin/admin-action-log.d.ts +98 -22
  48. package/dist/admin/admin-action-log.js +48 -45
  49. package/dist/admin/admin-action-log.js.map +1 -1
  50. package/dist/admin/admin-parts.d.ts +7 -14
  51. package/dist/admin/admin-parts.js +0 -4
  52. package/dist/admin/admin-parts.js.map +1 -1
  53. package/dist/admin/invitations-panel-labels.d.ts +2 -0
  54. package/dist/admin/invitations-panel-labels.js +29 -0
  55. package/dist/admin/invitations-panel-labels.js.map +1 -0
  56. package/dist/admin/invitations-panel.d.ts +167 -101
  57. package/dist/admin/invitations-panel.js +12 -31
  58. package/dist/admin/invitations-panel.js.map +1 -1
  59. package/dist/admin/plan-change-labels.d.ts +2 -0
  60. package/dist/admin/plan-change-labels.js +22 -0
  61. package/dist/admin/plan-change-labels.js.map +1 -0
  62. package/dist/admin/plan-change.d.ts +244 -101
  63. package/dist/admin/plan-change.js +16 -24
  64. package/dist/admin/plan-change.js.map +1 -1
  65. package/dist/admin/reviewer-scope-editor-labels.d.ts +2 -0
  66. package/dist/admin/reviewer-scope-editor-labels.js +14 -0
  67. package/dist/admin/reviewer-scope-editor-labels.js.map +1 -0
  68. package/dist/admin/reviewer-scope-editor.d.ts +95 -101
  69. package/dist/admin/reviewer-scope-editor.js +5 -13
  70. package/dist/admin/reviewer-scope-editor.js.map +1 -1
  71. package/dist/admin/role-select-labels.d.ts +2 -0
  72. package/dist/admin/role-select-labels.js +15 -0
  73. package/dist/admin/role-select-labels.js.map +1 -0
  74. package/dist/admin/role-select.d.ts +136 -101
  75. package/dist/admin/role-select.js +7 -18
  76. package/dist/admin/role-select.js.map +1 -1
  77. package/dist/admin/transfer-ownership-dialog-labels.d.ts +2 -0
  78. package/dist/admin/transfer-ownership-dialog-labels.js +18 -0
  79. package/dist/admin/transfer-ownership-dialog-labels.js.map +1 -0
  80. package/dist/admin/transfer-ownership-dialog.d.ts +81 -101
  81. package/dist/admin/transfer-ownership-dialog.js +3 -15
  82. package/dist/admin/transfer-ownership-dialog.js.map +1 -1
  83. package/dist/admin/user-roster-labels.d.ts +2 -0
  84. package/dist/admin/user-roster-labels.js +16 -0
  85. package/dist/admin/user-roster-labels.js.map +1 -0
  86. package/dist/admin/user-roster.d.ts +225 -101
  87. package/dist/admin/user-roster.js +4 -14
  88. package/dist/admin/user-roster.js.map +1 -1
  89. package/dist/auth/accept-invitation-labels.d.ts +2 -0
  90. package/dist/auth/accept-invitation-labels.js +20 -0
  91. package/dist/auth/accept-invitation-labels.js.map +1 -0
  92. package/dist/auth/accept-invitation.d.ts +11 -13
  93. package/dist/auth/accept-invitation.js +3 -16
  94. package/dist/auth/accept-invitation.js.map +1 -1
  95. package/dist/auth/auth-errors.d.ts +34 -23
  96. package/dist/auth/auth-errors.js +8 -4
  97. package/dist/auth/auth-errors.js.map +1 -1
  98. package/dist/auth/complete-name-dialog-labels.d.ts +2 -0
  99. package/dist/auth/complete-name-dialog-labels.js +14 -0
  100. package/dist/auth/complete-name-dialog-labels.js.map +1 -0
  101. package/dist/auth/complete-name-dialog.d.ts +9 -11
  102. package/dist/auth/complete-name-dialog.js +4 -11
  103. package/dist/auth/complete-name-dialog.js.map +1 -1
  104. package/dist/auth/email-tag.d.ts +2 -4
  105. package/dist/auth/forgot-password-form-labels.d.ts +3 -0
  106. package/dist/auth/forgot-password-form-labels.js +17 -0
  107. package/dist/auth/forgot-password-form-labels.js.map +1 -0
  108. package/dist/auth/forgot-password-form.d.ts +9 -12
  109. package/dist/auth/forgot-password-form.js +6 -15
  110. package/dist/auth/forgot-password-form.js.map +1 -1
  111. package/dist/auth/form-rules.d.ts +5 -7
  112. package/dist/auth/new-password-fields.d.ts +4 -8
  113. package/dist/auth/new-password-fields.js +1 -1
  114. package/dist/auth/new-password-fields.js.map +1 -1
  115. package/dist/auth/not-found-page-labels.d.ts +2 -0
  116. package/dist/auth/not-found-page-labels.js +11 -0
  117. package/dist/auth/not-found-page-labels.js.map +1 -0
  118. package/dist/auth/not-found-page.d.ts +9 -11
  119. package/dist/auth/not-found-page.js +5 -10
  120. package/dist/auth/not-found-page.js.map +1 -1
  121. package/dist/auth/register-form-labels.d.ts +3 -0
  122. package/dist/auth/register-form-labels.js +28 -0
  123. package/dist/auth/register-form-labels.js.map +1 -0
  124. package/dist/auth/register-form.d.ts +174 -101
  125. package/dist/auth/register-form.js +11 -31
  126. package/dist/auth/register-form.js.map +1 -1
  127. package/dist/auth/reset-password-form-labels.d.ts +3 -0
  128. package/dist/auth/reset-password-form-labels.js +24 -0
  129. package/dist/auth/reset-password-form-labels.js.map +1 -0
  130. package/dist/auth/reset-password-form.d.ts +12 -15
  131. package/dist/auth/reset-password-form.js +6 -22
  132. package/dist/auth/reset-password-form.js.map +1 -1
  133. package/dist/auth/sign-in-form-labels.d.ts +3 -0
  134. package/dist/auth/sign-in-form-labels.js +42 -0
  135. package/dist/auth/sign-in-form-labels.js.map +1 -0
  136. package/dist/auth/sign-in-form.d.ts +15 -19
  137. package/dist/auth/sign-in-form.js +12 -46
  138. package/dist/auth/sign-in-form.js.map +1 -1
  139. package/dist/auth/status-parts.d.ts +13 -17
  140. package/dist/auth/status-parts.js +3 -3
  141. package/dist/auth/status-parts.js.map +1 -1
  142. package/dist/auth/verify-email-labels.d.ts +2 -0
  143. package/dist/auth/verify-email-labels.js +25 -0
  144. package/dist/auth/verify-email-labels.js.map +1 -0
  145. package/dist/auth/verify-email.d.ts +15 -17
  146. package/dist/auth/verify-email.js +4 -21
  147. package/dist/auth/verify-email.js.map +1 -1
  148. package/dist/billing/billing-banner.d.ts +12 -110
  149. package/dist/billing/billing-banner.js +2 -1
  150. package/dist/billing/billing-banner.js.map +1 -1
  151. package/dist/billing/billing-labels.d.ts +168 -101
  152. package/dist/billing/billing-labels.js.map +1 -1
  153. package/dist/billing/billing-lock.d.ts +10 -110
  154. package/dist/billing/billing-overview.d.ts +7 -109
  155. package/dist/billing/billing-standing.d.ts +6 -108
  156. package/dist/billing/checkout-processing.d.ts +8 -111
  157. package/dist/billing/checkout-processing.js +2 -9
  158. package/dist/billing/checkout-processing.js.map +1 -1
  159. package/dist/billing/checkout-return.d.ts +5 -7
  160. package/dist/billing/pay-page.d.ts +15 -117
  161. package/dist/billing/plan-card.d.ts +14 -115
  162. package/dist/billing/plan-card.js +15 -13
  163. package/dist/billing/plan-card.js.map +1 -1
  164. package/dist/billing/plan-limit-notice.d.ts +12 -110
  165. package/dist/billing/plan-limit-notice.js +1 -1
  166. package/dist/billing/plan-limit-notice.js.map +1 -1
  167. package/dist/billing/plan-limit-toast.d.ts +6 -107
  168. package/dist/billing/plan-limit.d.ts +2 -4
  169. package/dist/billing/plan-price.d.ts +10 -12
  170. package/dist/billing/subscription-actions.d.ts +6 -109
  171. package/dist/billing/subscription-actions.js +2 -2
  172. package/dist/billing/subscription-actions.js.map +1 -1
  173. package/dist/billing/subscription-status-chip.d.ts +7 -108
  174. package/dist/chart.d.ts +12 -113
  175. package/dist/chart.js +4 -0
  176. package/dist/chart.js.map +1 -1
  177. package/dist/components/account-chips-labels.d.ts +10 -0
  178. package/dist/components/account-chips-labels.js +15 -0
  179. package/dist/components/account-chips-labels.js.map +1 -0
  180. package/dist/components/account-chips.d.ts +22 -44
  181. package/dist/components/account-chips.js +9 -14
  182. package/dist/components/account-chips.js.map +1 -1
  183. package/dist/components/alert-banner.d.ts +15 -11
  184. package/dist/components/alert-banner.js +28 -18
  185. package/dist/components/alert-banner.js.map +1 -1
  186. package/dist/components/amount-input.d.ts +64 -111
  187. package/dist/components/amount-input.js +259 -283
  188. package/dist/components/amount-input.js.map +1 -1
  189. package/dist/components/appearance-labels.d.ts +6 -10
  190. package/dist/components/appearance-labels.js.map +1 -1
  191. package/dist/components/authed-image-labels.d.ts +2 -0
  192. package/dist/components/authed-image-labels.js +10 -0
  193. package/dist/components/authed-image-labels.js.map +1 -0
  194. package/dist/components/authed-image.d.ts +11 -13
  195. package/dist/components/authed-image.js +2 -6
  196. package/dist/components/authed-image.js.map +1 -1
  197. package/dist/components/autocomplete.d.ts +13 -11
  198. package/dist/components/autocomplete.js +33 -28
  199. package/dist/components/autocomplete.js.map +1 -1
  200. package/dist/components/breadcrumbs-labels.d.ts +2 -0
  201. package/dist/components/breadcrumbs-labels.js +9 -0
  202. package/dist/components/breadcrumbs-labels.js.map +1 -0
  203. package/dist/components/breadcrumbs.d.ts +10 -12
  204. package/dist/components/breadcrumbs.js +7 -10
  205. package/dist/components/breadcrumbs.js.map +1 -1
  206. package/dist/components/bulk-action-bar-labels.d.ts +2 -0
  207. package/dist/components/bulk-action-bar-labels.js +10 -0
  208. package/dist/components/bulk-action-bar-labels.js.map +1 -0
  209. package/dist/components/bulk-action-bar.d.ts +10 -12
  210. package/dist/components/bulk-action-bar.js +9 -12
  211. package/dist/components/bulk-action-bar.js.map +1 -1
  212. package/dist/components/button-group.d.ts +7 -110
  213. package/dist/components/button-group.js +5 -5
  214. package/dist/components/button-group.js.map +1 -1
  215. package/dist/components/button-look.d.ts +88 -0
  216. package/dist/components/button-look.js +91 -0
  217. package/dist/components/button-look.js.map +1 -0
  218. package/dist/components/button.d.ts +153 -0
  219. package/dist/components/button.js +165 -0
  220. package/dist/components/button.js.map +1 -0
  221. package/dist/components/calculator.d.ts +6 -108
  222. package/dist/components/calculator.js +8 -7
  223. package/dist/components/calculator.js.map +1 -1
  224. package/dist/components/calendar-heatmap-labels.d.ts +3 -0
  225. package/dist/components/calendar-heatmap-labels.js +12 -0
  226. package/dist/components/calendar-heatmap-labels.js.map +1 -0
  227. package/dist/components/calendar-heatmap.d.ts +13 -16
  228. package/dist/components/calendar-heatmap.js +7 -13
  229. package/dist/components/calendar-heatmap.js.map +1 -1
  230. package/dist/components/card.d.ts +145 -0
  231. package/dist/components/card.js +186 -0
  232. package/dist/components/card.js.map +1 -0
  233. package/dist/components/chart-height.d.ts +4 -7
  234. package/dist/components/chart-zoom-core.d.ts +202 -0
  235. package/dist/components/chart-zoom-core.js +334 -0
  236. package/dist/components/chart-zoom-core.js.map +1 -0
  237. package/dist/components/chart-zoom.d.ts +2 -205
  238. package/dist/components/chart-zoom.js +2 -330
  239. package/dist/components/chart-zoom.js.map +1 -1
  240. package/dist/components/chart.d.ts +11 -15
  241. package/dist/components/chart.js +11 -11
  242. package/dist/components/chart.js.map +1 -1
  243. package/dist/components/checkbox-group.d.ts +6 -10
  244. package/dist/components/checkbox-group.js +10 -9
  245. package/dist/components/checkbox-group.js.map +1 -1
  246. package/dist/components/checkbox.d.ts +8 -12
  247. package/dist/components/checkbox.js +20 -18
  248. package/dist/components/checkbox.js.map +1 -1
  249. package/dist/components/chip-input.d.ts +69 -0
  250. package/dist/components/chip-input.js +220 -0
  251. package/dist/components/chip-input.js.map +1 -0
  252. package/dist/components/chip-labels.d.ts +2 -0
  253. package/dist/components/chip-labels.js +12 -0
  254. package/dist/components/chip-labels.js.map +1 -0
  255. package/dist/components/chip.d.ts +18 -93
  256. package/dist/components/chip.js +74 -426
  257. package/dist/components/chip.js.map +1 -1
  258. package/dist/components/choice-card.d.ts +21 -18
  259. package/dist/components/choice-card.js +45 -45
  260. package/dist/components/choice-card.js.map +1 -1
  261. package/dist/components/column-mapper-labels.d.ts +5 -0
  262. package/dist/components/column-mapper-labels.js +34 -0
  263. package/dist/components/column-mapper-labels.js.map +1 -0
  264. package/dist/components/column-mapper.d.ts +15 -17
  265. package/dist/components/column-mapper.js +11 -37
  266. package/dist/components/column-mapper.js.map +1 -1
  267. package/dist/components/combobox-core.d.ts +79 -40
  268. package/dist/components/combobox-core.js +187 -121
  269. package/dist/components/combobox-core.js.map +1 -1
  270. package/dist/components/combobox-suggestions.d.ts +76 -0
  271. package/dist/components/combobox-suggestions.js +56 -0
  272. package/dist/components/combobox-suggestions.js.map +1 -0
  273. package/dist/components/combobox.d.ts +15 -160
  274. package/dist/components/combobox.js +40 -507
  275. package/dist/components/combobox.js.map +1 -1
  276. package/dist/components/confirm-dialog-labels.d.ts +7 -0
  277. package/dist/components/confirm-dialog-labels.js +10 -0
  278. package/dist/components/confirm-dialog-labels.js.map +1 -0
  279. package/dist/components/confirm-dialog.d.ts +165 -101
  280. package/dist/components/confirm-dialog.js +2 -6
  281. package/dist/components/confirm-dialog.js.map +1 -1
  282. package/dist/components/copy-button-labels.d.ts +2 -0
  283. package/dist/components/copy-button-labels.js +12 -0
  284. package/dist/components/copy-button-labels.js.map +1 -0
  285. package/dist/components/copy-button.d.ts +74 -101
  286. package/dist/components/copy-button.js +4 -9
  287. package/dist/components/copy-button.js.map +1 -1
  288. package/dist/components/country-select-labels.d.ts +2 -0
  289. package/dist/components/country-select-labels.js +10 -0
  290. package/dist/components/country-select-labels.js.map +1 -0
  291. package/dist/components/country-select.d.ts +18 -15
  292. package/dist/components/country-select.js +49 -64
  293. package/dist/components/country-select.js.map +1 -1
  294. package/dist/components/currency-option-list.d.ts +58 -0
  295. package/dist/components/currency-option-list.js +107 -0
  296. package/dist/components/currency-option-list.js.map +1 -0
  297. package/dist/components/currency-select.d.ts +10 -30
  298. package/dist/components/currency-select.js +50 -133
  299. package/dist/components/currency-select.js.map +1 -1
  300. package/dist/components/danger-confirm-labels.d.ts +14 -0
  301. package/dist/components/danger-confirm-labels.js +17 -0
  302. package/dist/components/danger-confirm-labels.js.map +1 -0
  303. package/dist/components/danger-confirm.d.ts +448 -101
  304. package/dist/components/danger-confirm.js +40 -46
  305. package/dist/components/danger-confirm.js.map +1 -1
  306. package/dist/components/data-table-cells.d.ts +9 -24
  307. package/dist/components/data-table-cells.js +1 -1
  308. package/dist/components/data-table-cells.js.map +1 -1
  309. package/dist/components/data-table-column-settings.d.ts +16 -0
  310. package/dist/components/data-table-column-settings.js +119 -0
  311. package/dist/components/data-table-column-settings.js.map +1 -0
  312. package/dist/components/data-table-filter-popover.d.ts +5 -19
  313. package/dist/components/data-table-filter-popover.js +40 -23
  314. package/dist/components/data-table-filter-popover.js.map +1 -1
  315. package/dist/components/data-table-filters.d.ts +93 -15
  316. package/dist/components/data-table-filters.js +22 -7
  317. package/dist/components/data-table-filters.js.map +1 -1
  318. package/dist/components/data-table-head.d.ts +36 -0
  319. package/dist/components/data-table-head.js +190 -0
  320. package/dist/components/data-table-head.js.map +1 -0
  321. package/dist/components/data-table-labels.d.ts +83 -15
  322. package/dist/components/data-table-labels.js +4 -29
  323. package/dist/components/data-table-labels.js.map +1 -1
  324. package/dist/components/data-table-mobile.d.ts +106 -0
  325. package/dist/components/data-table-mobile.js +412 -0
  326. package/dist/components/data-table-mobile.js.map +1 -0
  327. package/dist/components/data-table-pagination.d.ts +6 -21
  328. package/dist/components/data-table-pagination.js +7 -7
  329. package/dist/components/data-table-pagination.js.map +1 -1
  330. package/dist/components/data-table-resize.d.ts +37 -0
  331. package/dist/components/data-table-resize.js +103 -0
  332. package/dist/components/data-table-resize.js.map +1 -0
  333. package/dist/components/data-table-row-actions.d.ts +24 -0
  334. package/dist/components/data-table-row-actions.js +95 -0
  335. package/dist/components/data-table-row-actions.js.map +1 -0
  336. package/dist/components/data-table-selection.d.ts +21 -0
  337. package/dist/components/data-table-selection.js +30 -0
  338. package/dist/components/data-table-selection.js.map +1 -0
  339. package/dist/components/data-table-shared.d.ts +93 -0
  340. package/dist/components/data-table-shared.js +99 -0
  341. package/dist/components/data-table-shared.js.map +1 -0
  342. package/dist/components/data-table-sort.d.ts +8 -10
  343. package/dist/components/data-table.d.ts +613 -15
  344. package/dist/components/data-table.js +150 -939
  345. package/dist/components/data-table.js.map +1 -1
  346. package/dist/components/date-field.d.ts +203 -0
  347. package/dist/components/date-field.js +270 -0
  348. package/dist/components/date-field.js.map +1 -0
  349. package/dist/components/date-picker.d.ts +6 -261
  350. package/dist/components/date-picker.js +24 -760
  351. package/dist/components/date-picker.js.map +1 -1
  352. package/dist/components/date-range-picker.d.ts +125 -0
  353. package/dist/components/date-range-picker.js +261 -0
  354. package/dist/components/date-range-picker.js.map +1 -0
  355. package/dist/components/description-list-labels.d.ts +2 -0
  356. package/dist/components/description-list-labels.js +8 -0
  357. package/dist/components/description-list-labels.js.map +1 -0
  358. package/dist/components/description-list.d.ts +13 -15
  359. package/dist/components/description-list.js +17 -11
  360. package/dist/components/description-list.js.map +1 -1
  361. package/dist/components/dialog-frame-labels.d.ts +2 -0
  362. package/dist/components/dialog-frame-labels.js +6 -0
  363. package/dist/components/dialog-frame-labels.js.map +1 -0
  364. package/dist/components/dialog-frame.d.ts +10 -12
  365. package/dist/components/dialog-frame.js +6 -6
  366. package/dist/components/dialog-frame.js.map +1 -1
  367. package/dist/components/disclosure.d.ts +6 -10
  368. package/dist/components/disclosure.js +11 -11
  369. package/dist/components/disclosure.js.map +1 -1
  370. package/dist/components/dropdown.d.ts +61 -30
  371. package/dist/components/dropdown.js +61 -30
  372. package/dist/components/dropdown.js.map +1 -1
  373. package/dist/components/empty-state.d.ts +64 -0
  374. package/dist/components/empty-state.js +70 -0
  375. package/dist/components/empty-state.js.map +1 -0
  376. package/dist/components/entity-combobox.d.ts +11 -12
  377. package/dist/components/entity-combobox.js +14 -13
  378. package/dist/components/entity-combobox.js.map +1 -1
  379. package/dist/components/error-boundary-labels.d.ts +2 -0
  380. package/dist/components/error-boundary-labels.js +19 -0
  381. package/dist/components/error-boundary-labels.js.map +1 -0
  382. package/dist/components/error-boundary.d.ts +17 -17
  383. package/dist/components/error-boundary.js +5 -17
  384. package/dist/components/error-boundary.js.map +1 -1
  385. package/dist/components/facing-pair.d.ts +7 -116
  386. package/dist/components/facing-pair.js +1 -1
  387. package/dist/components/facing-pair.js.map +1 -1
  388. package/dist/components/field-base.d.ts +255 -0
  389. package/dist/components/field-base.js +223 -0
  390. package/dist/components/field-base.js.map +1 -0
  391. package/dist/components/field-parts.d.ts +180 -87
  392. package/dist/components/field-parts.js +52 -33
  393. package/dist/components/field-parts.js.map +1 -1
  394. package/dist/components/field-strip.d.ts +12 -36
  395. package/dist/components/field-strip.js +24 -22
  396. package/dist/components/field-strip.js.map +1 -1
  397. package/dist/components/field-sync-labels.d.ts +2 -0
  398. package/dist/components/field-sync-labels.js +12 -0
  399. package/dist/components/field-sync-labels.js.map +1 -0
  400. package/dist/components/field-sync.d.ts +16 -19
  401. package/dist/components/field-sync.js +4 -14
  402. package/dist/components/field-sync.js.map +1 -1
  403. package/dist/components/field.d.ts +45 -10
  404. package/dist/components/field.js +10 -8
  405. package/dist/components/field.js.map +1 -1
  406. package/dist/components/file-button.d.ts +85 -101
  407. package/dist/components/file-button.js +23 -169
  408. package/dist/components/file-button.js.map +1 -1
  409. package/dist/components/file-dropzone.d.ts +9 -110
  410. package/dist/components/file-dropzone.js +22 -22
  411. package/dist/components/file-dropzone.js.map +1 -1
  412. package/dist/components/floating-panel-labels.d.ts +2 -0
  413. package/dist/components/floating-panel-labels.js +9 -0
  414. package/dist/components/floating-panel-labels.js.map +1 -0
  415. package/dist/components/floating-panel.d.ts +17 -21
  416. package/dist/components/floating-panel.js +19 -18
  417. package/dist/components/floating-panel.js.map +1 -1
  418. package/dist/components/focus-ring.d.ts +9 -6
  419. package/dist/components/focus-ring.js +2 -2
  420. package/dist/components/focus-ring.js.map +1 -1
  421. package/dist/components/form-actions-labels.d.ts +2 -0
  422. package/dist/components/form-actions-labels.js +10 -0
  423. package/dist/components/form-actions-labels.js.map +1 -0
  424. package/dist/components/form-actions.d.ts +280 -101
  425. package/dist/components/form-actions.js +10 -20
  426. package/dist/components/form-actions.js.map +1 -1
  427. package/dist/components/full-bleed-dialog.d.ts +7 -8
  428. package/dist/components/full-bleed-dialog.js +14 -13
  429. package/dist/components/full-bleed-dialog.js.map +1 -1
  430. package/dist/components/grouped-picker.d.ts +21 -16
  431. package/dist/components/grouped-picker.js +76 -62
  432. package/dist/components/grouped-picker.js.map +1 -1
  433. package/dist/components/help-popover.d.ts +60 -0
  434. package/dist/components/help-popover.js +48 -0
  435. package/dist/components/help-popover.js.map +1 -0
  436. package/dist/components/hover-menu.d.ts +12 -18
  437. package/dist/components/hover-menu.js +19 -18
  438. package/dist/components/hover-menu.js.map +1 -1
  439. package/dist/components/iban-input-labels.d.ts +2 -0
  440. package/dist/components/iban-input-labels.js +13 -0
  441. package/dist/components/iban-input-labels.js.map +1 -0
  442. package/dist/components/iban-input.d.ts +73 -101
  443. package/dist/components/iban-input.js +22 -15
  444. package/dist/components/iban-input.js.map +1 -1
  445. package/dist/components/icon-button.d.ts +300 -0
  446. package/dist/components/icon-button.js +465 -0
  447. package/dist/components/icon-button.js.map +1 -0
  448. package/dist/components/icon-picker-labels.d.ts +2 -0
  449. package/dist/components/icon-picker-labels.js +12 -0
  450. package/dist/components/icon-picker-labels.js.map +1 -0
  451. package/dist/components/icon-picker.d.ts +13 -13
  452. package/dist/components/icon-picker.js +18 -17
  453. package/dist/components/icon-picker.js.map +1 -1
  454. package/dist/components/image-grid-labels.d.ts +2 -0
  455. package/dist/components/image-grid-labels.js +10 -0
  456. package/dist/components/image-grid-labels.js.map +1 -0
  457. package/dist/components/image-grid.d.ts +12 -14
  458. package/dist/components/image-grid.js +6 -10
  459. package/dist/components/image-grid.js.map +1 -1
  460. package/dist/components/inline-edit-field-labels.d.ts +2 -0
  461. package/dist/components/inline-edit-field-labels.js +10 -0
  462. package/dist/components/inline-edit-field-labels.js.map +1 -0
  463. package/dist/components/inline-edit-field.d.ts +11 -13
  464. package/dist/components/inline-edit-field.js +11 -13
  465. package/dist/components/inline-edit-field.js.map +1 -1
  466. package/dist/components/inline-entity-combobox.d.ts +155 -0
  467. package/dist/components/inline-entity-combobox.js +467 -0
  468. package/dist/components/inline-entity-combobox.js.map +1 -0
  469. package/dist/components/input.d.ts +98 -0
  470. package/dist/components/input.js +219 -0
  471. package/dist/components/input.js.map +1 -0
  472. package/dist/components/jump-calendar.d.ts +8 -0
  473. package/dist/components/jump-calendar.js +274 -0
  474. package/dist/components/jump-calendar.js.map +1 -0
  475. package/dist/components/language-select.d.ts +20 -111
  476. package/dist/components/language-select.js +12 -7
  477. package/dist/components/language-select.js.map +1 -1
  478. package/dist/components/legal-labels.d.ts +2 -0
  479. package/dist/components/legal-labels.js +100 -0
  480. package/dist/components/legal-labels.js.map +1 -0
  481. package/dist/components/legal-page.d.ts +17 -118
  482. package/dist/components/legal-page.js +2 -2
  483. package/dist/components/legal-page.js.map +1 -1
  484. package/dist/components/legal.d.ts +353 -101
  485. package/dist/components/legal.js +7 -101
  486. package/dist/components/legal.js.map +1 -1
  487. package/dist/components/lightbox-labels.d.ts +2 -0
  488. package/dist/components/lightbox-labels.js +17 -0
  489. package/dist/components/lightbox-labels.js.map +1 -0
  490. package/dist/components/lightbox.d.ts +12 -14
  491. package/dist/components/lightbox.js +9 -19
  492. package/dist/components/lightbox.js.map +1 -1
  493. package/dist/components/line-items-labels.d.ts +2 -0
  494. package/dist/components/line-items-labels.js +13 -0
  495. package/dist/components/line-items-labels.js.map +1 -0
  496. package/dist/components/line-items.d.ts +16 -18
  497. package/dist/components/line-items.js +18 -26
  498. package/dist/components/line-items.js.map +1 -1
  499. package/dist/components/list-labels.d.ts +2 -0
  500. package/dist/components/list-labels.js +9 -0
  501. package/dist/components/list-labels.js.map +1 -0
  502. package/dist/components/list.d.ts +32 -21
  503. package/dist/components/list.js +41 -25
  504. package/dist/components/list.js.map +1 -1
  505. package/dist/components/loading-state.d.ts +5 -9
  506. package/dist/components/loading-state.js +2 -2
  507. package/dist/components/loading-state.js.map +1 -1
  508. package/dist/components/measured-grid-labels.d.ts +4 -0
  509. package/dist/components/measured-grid-labels.js +21 -0
  510. package/dist/components/measured-grid-labels.js.map +1 -0
  511. package/dist/components/measured-grid.d.ts +13 -17
  512. package/dist/components/measured-grid.js +31 -50
  513. package/dist/components/measured-grid.js.map +1 -1
  514. package/dist/components/menu-item.d.ts +10 -10
  515. package/dist/components/menu-item.js +9 -9
  516. package/dist/components/menu-item.js.map +1 -1
  517. package/dist/components/mini-calendar-labels.d.ts +4 -0
  518. package/dist/components/mini-calendar-labels.js +14 -0
  519. package/dist/components/mini-calendar-labels.js.map +1 -0
  520. package/dist/components/mini-calendar.d.ts +10 -14
  521. package/dist/components/mini-calendar.js +22 -29
  522. package/dist/components/mini-calendar.js.map +1 -1
  523. package/dist/components/modal.d.ts +34 -18
  524. package/dist/components/modal.js +13 -13
  525. package/dist/components/modal.js.map +1 -1
  526. package/dist/components/money-draft.d.ts +34 -0
  527. package/dist/components/money-draft.js +39 -0
  528. package/dist/components/money-draft.js.map +1 -0
  529. package/dist/components/money-field.d.ts +13 -111
  530. package/dist/components/money-field.js +6 -22
  531. package/dist/components/money-field.js.map +1 -1
  532. package/dist/components/month-picker-labels.d.ts +5 -0
  533. package/dist/components/month-picker-labels.js +18 -0
  534. package/dist/components/month-picker-labels.js.map +1 -0
  535. package/dist/components/month-picker.d.ts +15 -13
  536. package/dist/components/month-picker.js +34 -32
  537. package/dist/components/month-picker.js.map +1 -1
  538. package/dist/components/multi-entity-combobox.d.ts +9 -11
  539. package/dist/components/multi-entity-combobox.js +14 -13
  540. package/dist/components/multi-entity-combobox.js.map +1 -1
  541. package/dist/components/multi-select.d.ts +74 -25
  542. package/dist/components/multi-select.js +166 -197
  543. package/dist/components/multi-select.js.map +1 -1
  544. package/dist/components/nav-pills.d.ts +9 -10
  545. package/dist/components/nav-pills.js +53 -42
  546. package/dist/components/nav-pills.js.map +1 -1
  547. package/dist/components/number-field.d.ts +6 -111
  548. package/dist/components/number-field.js +2 -3
  549. package/dist/components/number-field.js.map +1 -1
  550. package/dist/components/number-input.d.ts +28 -112
  551. package/dist/components/number-input.js +33 -67
  552. package/dist/components/number-input.js.map +1 -1
  553. package/dist/components/numeric-field.d.ts +85 -0
  554. package/dist/components/numeric-field.js +71 -0
  555. package/dist/components/numeric-field.js.map +1 -0
  556. package/dist/components/numpad-sheet.d.ts +5 -108
  557. package/dist/components/numpad-sheet.js +7 -7
  558. package/dist/components/numpad-sheet.js.map +1 -1
  559. package/dist/components/one-time-code-input.d.ts +6 -7
  560. package/dist/components/one-time-code-input.js +119 -124
  561. package/dist/components/one-time-code-input.js.map +1 -1
  562. package/dist/components/page-contents-labels.d.ts +2 -0
  563. package/dist/components/page-contents-labels.js +8 -0
  564. package/dist/components/page-contents-labels.js.map +1 -0
  565. package/dist/components/page-contents.d.ts +13 -15
  566. package/dist/components/page-contents.js +7 -9
  567. package/dist/components/page-contents.js.map +1 -1
  568. package/dist/components/page-header.d.ts +10 -10
  569. package/dist/components/page-header.js +3 -3
  570. package/dist/components/page-header.js.map +1 -1
  571. package/dist/components/password-strength-labels.d.ts +2 -0
  572. package/dist/components/password-strength-labels.js +21 -0
  573. package/dist/components/password-strength-labels.js.map +1 -0
  574. package/dist/components/password-strength.d.ts +15 -17
  575. package/dist/components/password-strength.js +7 -22
  576. package/dist/components/password-strength.js.map +1 -1
  577. package/dist/components/phone-input-labels.d.ts +2 -0
  578. package/dist/components/phone-input-labels.js +9 -0
  579. package/dist/components/phone-input-labels.js.map +1 -0
  580. package/dist/components/phone-input.d.ts +75 -101
  581. package/dist/components/phone-input.js +20 -23
  582. package/dist/components/phone-input.js.map +1 -1
  583. package/dist/components/picker-sheet.d.ts +20 -8
  584. package/dist/components/picker-sheet.js +22 -11
  585. package/dist/components/picker-sheet.js.map +1 -1
  586. package/dist/components/pie-chart-labels.d.ts +2 -4
  587. package/dist/components/pie-chart.d.ts +8 -11
  588. package/dist/components/pie-chart.js +5 -5
  589. package/dist/components/pie-chart.js.map +1 -1
  590. package/dist/components/popover-labels.d.ts +2 -0
  591. package/dist/components/popover-labels.js +11 -0
  592. package/dist/components/popover-labels.js.map +1 -0
  593. package/dist/components/popover.d.ts +13 -11
  594. package/dist/components/popover.js +15 -21
  595. package/dist/components/popover.js.map +1 -1
  596. package/dist/components/progress-bar-labels.d.ts +2 -0
  597. package/dist/components/progress-bar-labels.js +9 -0
  598. package/dist/components/progress-bar-labels.js.map +1 -0
  599. package/dist/components/progress-bar.d.ts +16 -15
  600. package/dist/components/progress-bar.js +22 -20
  601. package/dist/components/progress-bar.js.map +1 -1
  602. package/dist/components/qr-code.d.ts +4 -8
  603. package/dist/components/qr-code.js.map +1 -1
  604. package/dist/components/reauth-dialog-labels.d.ts +2 -0
  605. package/dist/components/reauth-dialog-labels.js +12 -0
  606. package/dist/components/reauth-dialog-labels.js.map +1 -0
  607. package/dist/components/reauth-dialog.d.ts +8 -10
  608. package/dist/components/reauth-dialog.js +3 -8
  609. package/dist/components/reauth-dialog.js.map +1 -1
  610. package/dist/components/row-actions-labels.d.ts +2 -0
  611. package/dist/components/row-actions-labels.js +9 -0
  612. package/dist/components/row-actions-labels.js.map +1 -0
  613. package/dist/components/row-actions.d.ts +224 -101
  614. package/dist/components/row-actions.js +4 -5
  615. package/dist/components/row-actions.js.map +1 -1
  616. package/dist/components/scroll-area.d.ts +6 -9
  617. package/dist/components/scroll-area.js +4 -10
  618. package/dist/components/scroll-area.js.map +1 -1
  619. package/dist/components/search-field.d.ts +12 -27
  620. package/dist/components/search-field.js +13 -16
  621. package/dist/components/search-field.js.map +1 -1
  622. package/dist/components/select.d.ts +69 -0
  623. package/dist/components/select.js +164 -0
  624. package/dist/components/select.js.map +1 -0
  625. package/dist/components/separator.d.ts +3 -7
  626. package/dist/components/separator.js.map +1 -1
  627. package/dist/components/series-chart-axes.d.ts +120 -0
  628. package/dist/components/series-chart-axes.js +164 -0
  629. package/dist/components/series-chart-axes.js.map +1 -0
  630. package/dist/components/series-chart-budget.d.ts +8 -9
  631. package/dist/components/series-chart-labels.d.ts +2 -4
  632. package/dist/components/series-chart-thin.d.ts +34 -0
  633. package/dist/components/series-chart-thin.js +103 -0
  634. package/dist/components/series-chart-thin.js.map +1 -0
  635. package/dist/components/series-chart-ticks.d.ts +9 -11
  636. package/dist/components/series-chart.d.ts +64 -214
  637. package/dist/components/series-chart.js +69 -160
  638. package/dist/components/series-chart.js.map +1 -1
  639. package/dist/components/server-wake-labels.d.ts +2 -0
  640. package/dist/components/server-wake-labels.js +9 -0
  641. package/dist/components/server-wake-labels.js.map +1 -0
  642. package/dist/components/server-wake.d.ts +29 -26
  643. package/dist/components/server-wake.js +15 -35
  644. package/dist/components/server-wake.js.map +1 -1
  645. package/dist/components/settings-fields.d.ts +50 -120
  646. package/dist/components/settings-fields.js +13 -3
  647. package/dist/components/settings-fields.js.map +1 -1
  648. package/dist/components/share-card-labels.d.ts +2 -0
  649. package/dist/components/share-card-labels.js +29 -0
  650. package/dist/components/share-card-labels.js.map +1 -0
  651. package/dist/components/share-card.d.ts +188 -101
  652. package/dist/components/share-card.js +16 -34
  653. package/dist/components/share-card.js.map +1 -1
  654. package/dist/components/sign-chip-labels.d.ts +2 -0
  655. package/dist/components/sign-chip-labels.js +11 -0
  656. package/dist/components/sign-chip-labels.js.map +1 -0
  657. package/dist/components/sign-chip.d.ts +7 -9
  658. package/dist/components/sign-chip.js +2 -7
  659. package/dist/components/sign-chip.js.map +1 -1
  660. package/dist/components/signature-pad-labels.d.ts +2 -0
  661. package/dist/components/signature-pad-labels.js +23 -0
  662. package/dist/components/signature-pad-labels.js.map +1 -0
  663. package/dist/components/signature-pad.d.ts +16 -15
  664. package/dist/components/signature-pad.js +22 -35
  665. package/dist/components/signature-pad.js.map +1 -1
  666. package/dist/components/signed-amount-labels.d.ts +2 -0
  667. package/dist/components/signed-amount-labels.js +9 -0
  668. package/dist/components/signed-amount-labels.js.map +1 -0
  669. package/dist/components/signed-amount.d.ts +19 -21
  670. package/dist/components/signed-amount.js +12 -15
  671. package/dist/components/signed-amount.js.map +1 -1
  672. package/dist/components/skeleton.d.ts +5 -9
  673. package/dist/components/skeleton.js +1 -1
  674. package/dist/components/skeleton.js.map +1 -1
  675. package/dist/components/slider.d.ts +16 -11
  676. package/dist/components/slider.js +23 -18
  677. package/dist/components/slider.js.map +1 -1
  678. package/dist/components/sparkline-labels.d.ts +2 -0
  679. package/dist/components/sparkline-labels.js +13 -0
  680. package/dist/components/sparkline-labels.js.map +1 -0
  681. package/dist/components/sparkline.d.ts +10 -12
  682. package/dist/components/sparkline.js +10 -17
  683. package/dist/components/sparkline.js.map +1 -1
  684. package/dist/components/spinner.d.ts +45 -0
  685. package/dist/components/spinner.js +39 -0
  686. package/dist/components/spinner.js.map +1 -0
  687. package/dist/components/stat-tile-labels.d.ts +2 -0
  688. package/dist/components/stat-tile-labels.js +14 -0
  689. package/dist/components/stat-tile-labels.js.map +1 -0
  690. package/dist/components/stat-tile.d.ts +21 -17
  691. package/dist/components/stat-tile.js +25 -32
  692. package/dist/components/stat-tile.js.map +1 -1
  693. package/dist/components/status-dot.d.ts +8 -20
  694. package/dist/components/status-dot.js +13 -12
  695. package/dist/components/status-dot.js.map +1 -1
  696. package/dist/components/swatch-picker-labels.d.ts +2 -0
  697. package/dist/components/swatch-picker-labels.js +9 -0
  698. package/dist/components/swatch-picker-labels.js.map +1 -0
  699. package/dist/components/swatch-picker.d.ts +14 -14
  700. package/dist/components/swatch-picker.js +14 -8
  701. package/dist/components/swatch-picker.js.map +1 -1
  702. package/dist/components/swipeable-row.d.ts +11 -39
  703. package/dist/components/swipeable-row.js +13 -18
  704. package/dist/components/swipeable-row.js.map +1 -1
  705. package/dist/components/switch.d.ts +10 -13
  706. package/dist/components/switch.js +13 -12
  707. package/dist/components/switch.js.map +1 -1
  708. package/dist/components/table.d.ts +28 -31
  709. package/dist/components/table.js +15 -15
  710. package/dist/components/table.js.map +1 -1
  711. package/dist/components/tabs.d.ts +182 -0
  712. package/dist/components/tabs.js +312 -0
  713. package/dist/components/tabs.js.map +1 -0
  714. package/dist/components/text-link.d.ts +17 -119
  715. package/dist/components/text-link.js +7 -7
  716. package/dist/components/text-link.js.map +1 -1
  717. package/dist/components/text.d.ts +14 -13
  718. package/dist/components/text.js +5 -5
  719. package/dist/components/text.js.map +1 -1
  720. package/dist/components/textarea.d.ts +20 -0
  721. package/dist/components/textarea.js +161 -0
  722. package/dist/components/textarea.js.map +1 -0
  723. package/dist/components/tile-radio.d.ts +6 -10
  724. package/dist/components/tile-radio.js +6 -6
  725. package/dist/components/tile-radio.js.map +1 -1
  726. package/dist/components/time-input.d.ts +5 -108
  727. package/dist/components/time-input.js +14 -5
  728. package/dist/components/time-input.js.map +1 -1
  729. package/dist/components/toast-labels.d.ts +2 -0
  730. package/dist/components/toast-labels.js +11 -0
  731. package/dist/components/toast-labels.js.map +1 -0
  732. package/dist/components/toast.d.ts +21 -23
  733. package/dist/components/toast.js +1 -6
  734. package/dist/components/toast.js.map +1 -1
  735. package/dist/components/toggle-group.d.ts +26 -26
  736. package/dist/components/toggle-group.js +43 -19
  737. package/dist/components/toggle-group.js.map +1 -1
  738. package/dist/components/toggle-legend.d.ts +18 -21
  739. package/dist/components/toggle-legend.js +3 -3
  740. package/dist/components/toggle-legend.js.map +1 -1
  741. package/dist/components/tooltip.d.ts +24 -15
  742. package/dist/components/tooltip.js +24 -14
  743. package/dist/components/tooltip.js.map +1 -1
  744. package/dist/components/translation-review-editor.d.ts +8 -10
  745. package/dist/components/translation-review-editor.js +6 -5
  746. package/dist/components/translation-review-editor.js.map +1 -1
  747. package/dist/components/translation-review-labels.d.ts +4 -7
  748. package/dist/components/translation-review-parts.d.ts +19 -28
  749. package/dist/components/translation-review-parts.js +4 -7
  750. package/dist/components/translation-review-parts.js.map +1 -1
  751. package/dist/components/translation-review.d.ts +35 -25
  752. package/dist/components/translation-review.js +24 -13
  753. package/dist/components/translation-review.js.map +1 -1
  754. package/dist/components/tree-view.d.ts +7 -11
  755. package/dist/components/tree-view.js +8 -8
  756. package/dist/components/tree-view.js.map +1 -1
  757. package/dist/components/treemap.d.ts +9 -13
  758. package/dist/components/trigger-aria.d.ts +2 -4
  759. package/dist/components/ui-labels.d.ts +5 -0
  760. package/dist/components/ui-labels.js +20 -0
  761. package/dist/components/ui-labels.js.map +1 -0
  762. package/dist/components/use-anchor-dir.d.ts +3 -6
  763. package/dist/components/use-mobile-reveal.d.ts +2 -6
  764. package/dist/components/use-table-state.d.ts +182 -15
  765. package/dist/components/use-table-state.js +53 -8
  766. package/dist/components/use-table-state.js.map +1 -1
  767. package/dist/components/user-avatar.d.ts +10 -23
  768. package/dist/components/user-avatar.js +1 -1
  769. package/dist/components/user-avatar.js.map +1 -1
  770. package/dist/components/wizard-stepper.d.ts +4 -7
  771. package/dist/components/wizard-stepper.js +3 -3
  772. package/dist/components/wizard-stepper.js.map +1 -1
  773. package/dist/components/write-lock-labels.d.ts +2 -0
  774. package/dist/components/write-lock-labels.js +8 -0
  775. package/dist/components/write-lock-labels.js.map +1 -0
  776. package/dist/components/write-lock.d.ts +16 -18
  777. package/dist/components/write-lock.js +4 -8
  778. package/dist/components/write-lock.js.map +1 -1
  779. package/dist/currencies.d.ts +23 -0
  780. package/dist/currencies.js +38 -0
  781. package/dist/currencies.js.map +1 -0
  782. package/dist/data-table.d.ts +10 -18
  783. package/dist/data-table.js.map +1 -1
  784. package/dist/demo/demo-banner.d.ts +15 -13
  785. package/dist/demo/demo-banner.js +5 -19
  786. package/dist/demo/demo-banner.js.map +1 -1
  787. package/dist/demo/demo-countdown.d.ts +7 -9
  788. package/dist/demo/demo-ended.d.ts +10 -13
  789. package/dist/demo/demo-ended.js +4 -4
  790. package/dist/demo/demo-ended.js.map +1 -1
  791. package/dist/demo/demo-labels.d.ts +4 -5
  792. package/dist/demo/demo-labels.js.map +1 -1
  793. package/dist/demo/demo-session.d.ts +3 -5
  794. package/dist/demo/demo-start.d.ts +8 -11
  795. package/dist/demo/demo-start.js +3 -2
  796. package/dist/demo/demo-start.js.map +1 -1
  797. package/dist/eslint/index.d.ts +83 -0
  798. package/dist/eslint/index.js +69 -0
  799. package/dist/eslint/index.js.map +1 -0
  800. package/dist/eslint/role-utilities.d.ts +48 -0
  801. package/dist/eslint/role-utilities.generated.d.ts +2 -0
  802. package/dist/eslint/role-utilities.generated.js +143 -0
  803. package/dist/eslint/role-utilities.generated.js.map +1 -0
  804. package/dist/eslint/role-utilities.js +43 -0
  805. package/dist/eslint/role-utilities.js.map +1 -0
  806. package/dist/feedback/feedback-attachment-labels.d.ts +16 -0
  807. package/dist/feedback/feedback-attachment-labels.js +17 -0
  808. package/dist/feedback/feedback-attachment-labels.js.map +1 -0
  809. package/dist/feedback/feedback-attachment.d.ts +312 -101
  810. package/dist/feedback/feedback-attachment.js +31 -42
  811. package/dist/feedback/feedback-attachment.js.map +1 -1
  812. package/dist/feedback/feedback-capture.d.ts +2 -4
  813. package/dist/feedback/feedback-context-labels.d.ts +2 -0
  814. package/dist/feedback/feedback-context-labels.js +9 -0
  815. package/dist/feedback/feedback-context-labels.js.map +1 -0
  816. package/dist/feedback/feedback-context.d.ts +110 -101
  817. package/dist/feedback/feedback-context.js +4 -7
  818. package/dist/feedback/feedback-context.js.map +1 -1
  819. package/dist/feedback/feedback-crash.d.ts +8 -110
  820. package/dist/feedback/feedback-dialog-labels.d.ts +12 -0
  821. package/dist/feedback/feedback-dialog-labels.js +17 -0
  822. package/dist/feedback/feedback-dialog-labels.js.map +1 -0
  823. package/dist/feedback/feedback-dialog.d.ts +186 -101
  824. package/dist/feedback/feedback-dialog.js +8 -18
  825. package/dist/feedback/feedback-dialog.js.map +1 -1
  826. package/dist/feedback/feedback-inbox.d.ts +236 -101
  827. package/dist/feedback/feedback-inbox.js +31 -141
  828. package/dist/feedback/feedback-inbox.js.map +1 -1
  829. package/dist/feedback/feedback-labels.d.ts +83 -101
  830. package/dist/feedback/feedback-labels.js.map +1 -1
  831. package/dist/feedback/feedback-menu-labels.d.ts +2 -0
  832. package/dist/feedback/feedback-menu-labels.js +10 -0
  833. package/dist/feedback/feedback-menu-labels.js.map +1 -0
  834. package/dist/feedback/feedback-menu.d.ts +83 -101
  835. package/dist/feedback/feedback-menu.js +3 -7
  836. package/dist/feedback/feedback-menu.js.map +1 -1
  837. package/dist/feedback/feedback-record.d.ts +239 -101
  838. package/dist/feedback/feedback-record.js +7 -2
  839. package/dist/feedback/feedback-record.js.map +1 -1
  840. package/dist/feedback/feedback-row-detail-labels.d.ts +2 -0
  841. package/dist/feedback/feedback-row-detail-labels.js +31 -0
  842. package/dist/feedback/feedback-row-detail-labels.js.map +1 -0
  843. package/dist/feedback/feedback-row-detail.d.ts +315 -101
  844. package/dist/feedback/feedback-row-detail.js +11 -37
  845. package/dist/feedback/feedback-row-detail.js.map +1 -1
  846. package/dist/feedback/feedback-status-undo.d.ts +66 -101
  847. package/dist/feedback/feedback-status-undo.js.map +1 -1
  848. package/dist/feedback/feedback-submit-dialog.d.ts +39 -0
  849. package/dist/feedback/feedback-submit-dialog.js +66 -0
  850. package/dist/feedback/feedback-submit-dialog.js.map +1 -0
  851. package/dist/feedback/feedback-submit.d.ts +13 -109
  852. package/dist/feedback/feedback-submit.js +19 -40
  853. package/dist/feedback/feedback-submit.js.map +1 -1
  854. package/dist/feedback/feedback-swipe.d.ts +9 -110
  855. package/dist/feedback/feedback-swipe.js +1 -1
  856. package/dist/feedback/feedback-swipe.js.map +1 -1
  857. package/dist/feedback/feedback-table-labels.d.ts +2 -0
  858. package/dist/feedback/feedback-table-labels.js +26 -0
  859. package/dist/feedback/feedback-table-labels.js.map +1 -0
  860. package/dist/feedback/feedback-table.d.ts +314 -101
  861. package/dist/feedback/feedback-table.js +11 -31
  862. package/dist/feedback/feedback-table.js.map +1 -1
  863. package/dist/feedback/feedback-thread-labels.d.ts +3 -0
  864. package/dist/feedback/feedback-thread-labels.js +21 -0
  865. package/dist/feedback/feedback-thread-labels.js.map +1 -0
  866. package/dist/feedback/feedback-thread.d.ts +373 -101
  867. package/dist/feedback/feedback-thread.js +26 -35
  868. package/dist/feedback/feedback-thread.js.map +1 -1
  869. package/dist/feedback/feedback-vocabulary.d.ts +98 -0
  870. package/dist/feedback/feedback-vocabulary.js +143 -0
  871. package/dist/feedback/feedback-vocabulary.js.map +1 -0
  872. package/dist/feedback.d.ts +15 -105
  873. package/dist/hooks/use-anchored-panel.d.ts +77 -15
  874. package/dist/hooks/use-anchored-panel.js +34 -1
  875. package/dist/hooks/use-anchored-panel.js.map +1 -1
  876. package/dist/hooks/use-anchored-rect.d.ts +15 -6
  877. package/dist/hooks/use-anchored-rect.js +2 -1
  878. package/dist/hooks/use-anchored-rect.js.map +1 -1
  879. package/dist/hooks/use-announce.d.ts +4 -6
  880. package/dist/hooks/use-authed-src.d.ts +5 -7
  881. package/dist/hooks/use-authed-src.js +3 -7
  882. package/dist/hooks/use-authed-src.js.map +1 -1
  883. package/dist/hooks/use-body-scroll-lock.d.ts +1 -3
  884. package/dist/hooks/use-breakpoint.d.ts +16 -17
  885. package/dist/hooks/use-breakpoint.js.map +1 -1
  886. package/dist/hooks/use-close-transition.d.ts +8 -8
  887. package/dist/hooks/use-close-transition.js +5 -4
  888. package/dist/hooks/use-close-transition.js.map +1 -1
  889. package/dist/hooks/use-copy-to-clipboard.d.ts +5 -7
  890. package/dist/hooks/use-debounce.d.ts +13 -6
  891. package/dist/hooks/use-debounce.js.map +1 -1
  892. package/dist/hooks/use-dismiss.d.ts +50 -11
  893. package/dist/hooks/use-dismiss.js +80 -9
  894. package/dist/hooks/use-dismiss.js.map +1 -1
  895. package/dist/hooks/use-file-drop.d.ts +8 -110
  896. package/dist/hooks/use-file-drop.js +1 -1
  897. package/dist/hooks/use-file-drop.js.map +1 -1
  898. package/dist/hooks/use-file-picker-labels.d.ts +2 -0
  899. package/dist/hooks/use-file-picker-labels.js +25 -0
  900. package/dist/hooks/use-file-picker-labels.js.map +1 -0
  901. package/dist/hooks/use-file-picker.d.ts +164 -0
  902. package/dist/hooks/use-file-picker.js +149 -0
  903. package/dist/hooks/use-file-picker.js.map +1 -0
  904. package/dist/hooks/use-focus-trap.d.ts +2 -4
  905. package/dist/hooks/use-focus-trap.js +2 -1
  906. package/dist/hooks/use-focus-trap.js.map +1 -1
  907. package/dist/hooks/use-hotkey.d.ts +7 -9
  908. package/dist/hooks/use-large-text.d.ts +3 -5
  909. package/dist/hooks/use-media-query.d.ts +1 -3
  910. package/dist/hooks/use-noindex.d.ts +1 -3
  911. package/dist/hooks/use-overlay-history.d.ts +1 -3
  912. package/dist/hooks/use-row-swipe.d.ts +5 -8
  913. package/dist/hooks/use-search-param-state.d.ts +10 -11
  914. package/dist/hooks/use-windowed-rows.d.ts +4 -7
  915. package/dist/i18n/defaults.d.ts +11 -105
  916. package/dist/i18n/defaults.js +82 -82
  917. package/dist/i18n/defaults.js.map +1 -1
  918. package/dist/i18n/german.d.ts +2 -105
  919. package/dist/i18n/german.js +52 -8
  920. package/dist/i18n/german.js.map +1 -1
  921. package/dist/i18n/kit-labels.d.ts +619 -101
  922. package/dist/i18n/kit-labels.js +22 -97
  923. package/dist/i18n/kit-labels.js.map +1 -1
  924. package/dist/i18n/languages.d.ts +197 -101
  925. package/dist/i18n/locales/de-CH.d.ts +3 -106
  926. package/dist/i18n/locales/en.d.ts +4 -105
  927. package/dist/i18n/locales/en.js +1834 -4
  928. package/dist/i18n/locales/en.js.map +7 -1
  929. package/dist/i18n/locales/es.d.ts +3 -106
  930. package/dist/i18n/locales/es.js +52 -8
  931. package/dist/i18n/locales/es.js.map +1 -1
  932. package/dist/i18n/locales/fr.d.ts +3 -106
  933. package/dist/i18n/locales/fr.js +56 -10
  934. package/dist/i18n/locales/fr.js.map +1 -1
  935. package/dist/i18n/locales/hu.d.ts +3 -106
  936. package/dist/i18n/locales/hu.js +52 -8
  937. package/dist/i18n/locales/hu.js.map +1 -1
  938. package/dist/i18n/locales/it.d.ts +3 -106
  939. package/dist/i18n/locales/it.js +56 -10
  940. package/dist/i18n/locales/it.js.map +1 -1
  941. package/dist/i18n/locales/zh.d.ts +3 -106
  942. package/dist/i18n/locales/zh.js +51 -8
  943. package/dist/i18n/locales/zh.js.map +1 -1
  944. package/dist/i18n/plurals.d.ts +3 -5
  945. package/dist/i18n/review.d.ts +5 -107
  946. package/dist/i18n/review.js +4 -0
  947. package/dist/i18n/review.js.map +1 -1
  948. package/dist/i18n/shared-labels.d.ts +17 -0
  949. package/dist/i18n/shared-labels.js +111 -0
  950. package/dist/i18n/shared-labels.js.map +1 -0
  951. package/dist/i18n/swiss.d.ts +1 -3
  952. package/dist/index.d.ts +330 -249
  953. package/dist/index.js +188 -215
  954. package/dist/index.js.map +1 -1
  955. package/dist/landing/access.d.ts +7 -9
  956. package/dist/landing/access.js.map +1 -1
  957. package/dist/landing/landing-actions.d.ts +9 -109
  958. package/dist/landing/landing-actions.js +1 -1
  959. package/dist/landing/landing-actions.js.map +1 -1
  960. package/dist/landing/landing-labels.d.ts +4 -5
  961. package/dist/landing/landing-labels.js.map +1 -1
  962. package/dist/landing/landing-sections.d.ts +21 -121
  963. package/dist/landing/landing-sections.js +15 -15
  964. package/dist/landing/landing-sections.js.map +1 -1
  965. package/dist/landing/page-seo.d.ts +7 -9
  966. package/dist/landing/public-header.d.ts +10 -111
  967. package/dist/landing/public-header.js +1 -1
  968. package/dist/landing/public-header.js.map +1 -1
  969. package/dist/landing/routing.d.ts +16 -120
  970. package/dist/landing/routing.js +2 -6
  971. package/dist/landing/routing.js.map +1 -1
  972. package/dist/lib/calc.d.ts +7 -9
  973. package/dist/lib/chip-edge-snap.d.ts +10 -0
  974. package/dist/lib/chip-edge-snap.js +131 -0
  975. package/dist/lib/chip-edge-snap.js.map +1 -0
  976. package/dist/lib/clipping.d.ts +2 -4
  977. package/dist/lib/cn.d.ts +2 -5
  978. package/dist/lib/cn.js +6 -1
  979. package/dist/lib/cn.js.map +1 -1
  980. package/dist/lib/column-mapping.d.ts +10 -13
  981. package/dist/lib/countries.d.ts +3 -5
  982. package/dist/lib/dates.d.ts +25 -25
  983. package/dist/lib/dates.js.map +1 -1
  984. package/dist/lib/decimal-marks.d.ts +8 -8
  985. package/dist/lib/decimal-marks.js +1 -1
  986. package/dist/lib/decimal-marks.js.map +1 -1
  987. package/dist/lib/direction.d.ts +4 -6
  988. package/dist/lib/document-navigation.d.ts +1 -3
  989. package/dist/lib/download.d.ts +67 -0
  990. package/dist/lib/download.js +89 -0
  991. package/dist/lib/download.js.map +1 -0
  992. package/dist/lib/floating-stack.d.ts +8 -6
  993. package/dist/lib/floating-stack.js.map +1 -1
  994. package/dist/lib/format.d.ts +24 -23
  995. package/dist/lib/format.js +3 -3
  996. package/dist/lib/format.js.map +1 -1
  997. package/dist/lib/iban.d.ts +9 -11
  998. package/dist/lib/ime.d.ts +17 -0
  999. package/dist/lib/ime.js +13 -0
  1000. package/dist/lib/ime.js.map +1 -0
  1001. package/dist/lib/isin.d.ts +3 -5
  1002. package/dist/lib/logger.d.ts +4 -6
  1003. package/dist/lib/person-name.d.ts +3 -5
  1004. package/dist/lib/phone.d.ts +9 -11
  1005. package/dist/lib/presence.d.ts +15 -0
  1006. package/dist/lib/presence.js +8 -0
  1007. package/dist/lib/presence.js.map +1 -0
  1008. package/dist/lib/qr-encode.d.ts +4 -6
  1009. package/dist/lib/reduced-motion.d.ts +18 -0
  1010. package/dist/lib/reduced-motion.js +9 -0
  1011. package/dist/lib/reduced-motion.js.map +1 -0
  1012. package/dist/lib/refs.d.ts +13 -0
  1013. package/dist/lib/refs.js +15 -0
  1014. package/dist/lib/refs.js.map +1 -0
  1015. package/dist/lib/round.d.ts +22 -0
  1016. package/dist/lib/round.js +15 -0
  1017. package/dist/lib/round.js.map +1 -0
  1018. package/dist/lib/safe-storage.d.ts +14 -4
  1019. package/dist/lib/safe-storage.js +24 -9
  1020. package/dist/lib/safe-storage.js.map +1 -1
  1021. package/dist/lib/server-wake.d.ts +13 -14
  1022. package/dist/lib/session-refresh.d.ts +200 -0
  1023. package/dist/lib/session-refresh.js +187 -0
  1024. package/dist/lib/session-refresh.js.map +1 -0
  1025. package/dist/lib/strip-fade.d.ts +10 -13
  1026. package/dist/lib/table-text.d.ts +14 -16
  1027. package/dist/lib/text-match.d.ts +41 -0
  1028. package/dist/lib/text-match.js +23 -0
  1029. package/dist/lib/text-match.js.map +1 -0
  1030. package/dist/lib/translation-review.d.ts +44 -45
  1031. package/dist/lib/translation-review.js +3 -2
  1032. package/dist/lib/translation-review.js.map +1 -1
  1033. package/dist/rhf/fields.d.ts +131 -197
  1034. package/dist/rhf/fields.js +46 -54
  1035. package/dist/rhf/fields.js.map +1 -1
  1036. package/dist/rhf/form-core.d.ts +154 -0
  1037. package/dist/rhf/form-core.js +143 -0
  1038. package/dist/rhf/form-core.js.map +1 -0
  1039. package/dist/rhf/form.d.ts +9 -175
  1040. package/dist/rhf/form.js +2 -139
  1041. package/dist/rhf/form.js.map +1 -1
  1042. package/dist/rhf/line-items.d.ts +40 -11
  1043. package/dist/rhf/line-items.js.map +1 -1
  1044. package/dist/rhf/use-rhf-wizard-step.d.ts +3 -6
  1045. package/dist/rhf/use-rhf-wizard-step.js.map +1 -1
  1046. package/dist/rhf.d.ts +4 -118
  1047. package/dist/rhf.js.map +1 -1
  1048. package/dist/search/command-palette-labels.d.ts +2 -0
  1049. package/dist/search/command-palette-labels.js +15 -0
  1050. package/dist/search/command-palette-labels.js.map +1 -0
  1051. package/dist/search/command-palette.d.ts +10 -13
  1052. package/dist/search/command-palette.js +25 -44
  1053. package/dist/search/command-palette.js.map +1 -1
  1054. package/dist/search/global-search-labels.d.ts +2 -0
  1055. package/dist/search/global-search-labels.js +12 -0
  1056. package/dist/search/global-search-labels.js.map +1 -0
  1057. package/dist/search/global-search.d.ts +17 -16
  1058. package/dist/search/global-search.js +12 -12
  1059. package/dist/search/global-search.js.map +1 -1
  1060. package/dist/search/search-index.d.ts +13 -14
  1061. package/dist/search/search-index.js +2 -1
  1062. package/dist/search/search-index.js.map +1 -1
  1063. package/dist/search/use-command-key.d.ts +9 -0
  1064. package/dist/search/use-command-key.js +18 -0
  1065. package/dist/search/use-command-key.js.map +1 -0
  1066. package/dist/search.d.ts +3 -4
  1067. package/dist/settings/settings-card-classes.d.ts +11 -0
  1068. package/dist/settings/settings-card-classes.js +8 -0
  1069. package/dist/settings/settings-card-classes.js.map +1 -0
  1070. package/dist/settings/settings-catalogue.d.ts +11 -14
  1071. package/dist/settings/settings-context.d.ts +4 -8
  1072. package/dist/settings/settings-heading.d.ts +8 -12
  1073. package/dist/settings/settings-heading.js +1 -1
  1074. package/dist/settings/settings-heading.js.map +1 -1
  1075. package/dist/settings/settings-labels.d.ts +6 -7
  1076. package/dist/settings/settings-labels.js.map +1 -1
  1077. package/dist/settings/settings-layout.d.ts +36 -13
  1078. package/dist/settings/settings-layout.js +25 -4
  1079. package/dist/settings/settings-layout.js.map +1 -1
  1080. package/dist/settings/settings-section.d.ts +4 -107
  1081. package/dist/settings/settings-section.js +2 -2
  1082. package/dist/settings/settings-section.js.map +1 -1
  1083. package/dist/settings/use-account-appearance.d.ts +11 -16
  1084. package/dist/settings/use-account-language.d.ts +8 -10
  1085. package/dist/settings/use-settings-focus.d.ts +3 -5
  1086. package/dist/settings/use-settings-focus.js +2 -4
  1087. package/dist/settings/use-settings-focus.js.map +1 -1
  1088. package/dist/settings/use-settings-route.d.ts +11 -16
  1089. package/dist/shell/app-shell-labels.d.ts +2 -0
  1090. package/dist/shell/app-shell-labels.js +9 -0
  1091. package/dist/shell/app-shell-labels.js.map +1 -0
  1092. package/dist/shell/app-shell.d.ts +216 -101
  1093. package/dist/shell/app-shell.js +51 -35
  1094. package/dist/shell/app-shell.js.map +1 -1
  1095. package/dist/shell/auth-layout.d.ts +6 -9
  1096. package/dist/shell/auth-layout.js +6 -6
  1097. package/dist/shell/auth-layout.js.map +1 -1
  1098. package/dist/shell/company-switcher-labels.d.ts +2 -0
  1099. package/dist/shell/company-switcher-labels.js +12 -0
  1100. package/dist/shell/company-switcher-labels.js.map +1 -0
  1101. package/dist/shell/company-switcher.d.ts +9 -11
  1102. package/dist/shell/company-switcher.js +3 -9
  1103. package/dist/shell/company-switcher.js.map +1 -1
  1104. package/dist/shell/option-switcher-menu.d.ts +7 -9
  1105. package/dist/shell/option-switcher-menu.js +4 -4
  1106. package/dist/shell/option-switcher-menu.js.map +1 -1
  1107. package/dist/shell/role-switcher.d.ts +3 -7
  1108. package/dist/shell/role-switcher.js +3 -3
  1109. package/dist/shell/role-switcher.js.map +1 -1
  1110. package/dist/shell/top-bar-brand.d.ts +4 -107
  1111. package/dist/shell/top-bar-brand.js +1 -1
  1112. package/dist/shell/top-bar-brand.js.map +1 -1
  1113. package/dist/shell/top-bar.d.ts +6 -9
  1114. package/dist/shell/top-bar.js +1 -1
  1115. package/dist/shell/top-bar.js.map +1 -1
  1116. package/dist/shell/topbar-action-menu.d.ts +18 -31
  1117. package/dist/shell/topbar-action-menu.js +10 -10
  1118. package/dist/shell/topbar-action-menu.js.map +1 -1
  1119. package/dist/shell/topbar-controls.d.ts +14 -21
  1120. package/dist/shell/topbar-controls.js +11 -11
  1121. package/dist/shell/topbar-controls.js.map +1 -1
  1122. package/dist/shell.d.ts +25 -116
  1123. package/dist/shell.js.map +1 -1
  1124. package/dist/table-text.d.ts +1 -1
  1125. package/dist/testing/css-variables.d.ts +4 -6
  1126. package/dist/testing/css-variables.generated.d.ts +2 -4
  1127. package/dist/testing/index.d.ts +2 -1
  1128. package/dist/testing/index.js +11 -1
  1129. package/dist/testing/index.js.map +1 -1
  1130. package/dist/testing/viewport.d.ts +116 -0
  1131. package/dist/testing/viewport.js +203 -0
  1132. package/dist/testing/viewport.js.map +1 -0
  1133. package/dist/theme/chart-palette.d.ts +7 -9
  1134. package/dist/theme/color.d.ts +14 -16
  1135. package/dist/theme/color.js +2 -1
  1136. package/dist/theme/color.js.map +1 -1
  1137. package/dist/theme/contrast-tokens.d.ts +13 -17
  1138. package/dist/theme/contrast.d.ts +22 -27
  1139. package/dist/theme/palette-derive.d.ts +16 -22
  1140. package/dist/theme/palette-derive.js +15 -7
  1141. package/dist/theme/palette-derive.js.map +1 -1
  1142. package/dist/theme/palette-presets.d.ts +18 -15
  1143. package/dist/theme/palette-presets.js +66 -345
  1144. package/dist/theme/palette-presets.js.map +1 -1
  1145. package/dist/theme/palette-store.d.ts +10 -13
  1146. package/dist/theme/text-size.d.ts +21 -26
  1147. package/dist/theme/theme-store.d.ts +9 -14
  1148. package/dist/tour/tour-labels.d.ts +2 -0
  1149. package/dist/tour/tour-labels.js +13 -0
  1150. package/dist/tour/tour-labels.js.map +1 -0
  1151. package/dist/tour/tour.d.ts +12 -14
  1152. package/dist/tour/tour.js +9 -20
  1153. package/dist/tour/tour.js.map +1 -1
  1154. package/dist/tour.d.ts +1 -2
  1155. package/dist/wizard/stepper-nav.d.ts +8 -108
  1156. package/dist/wizard/stepper-nav.js +15 -14
  1157. package/dist/wizard/stepper-nav.js.map +1 -1
  1158. package/dist/wizard/types.d.ts +13 -18
  1159. package/dist/wizard/types.js +2 -24
  1160. package/dist/wizard/types.js.map +1 -1
  1161. package/dist/wizard/use-wizard.d.ts +2 -6
  1162. package/dist/wizard/validation.d.ts +3 -7
  1163. package/dist/wizard/wizard-context.d.ts +7 -11
  1164. package/dist/wizard/wizard-labels.d.ts +4 -0
  1165. package/dist/wizard/wizard-labels.js +24 -0
  1166. package/dist/wizard/wizard-labels.js.map +1 -0
  1167. package/dist/wizard/wizard-step.d.ts +3 -7
  1168. package/dist/wizard/wizard-step.js +2 -2
  1169. package/dist/wizard/wizard-step.js.map +1 -1
  1170. package/dist/wizard/wizard-summary.d.ts +5 -8
  1171. package/dist/wizard/wizard-summary.js +6 -5
  1172. package/dist/wizard/wizard-summary.js.map +1 -1
  1173. package/dist/wizard.d.ts +7 -107
  1174. package/package.json +17 -6
  1175. package/src/account/account-parts.ts +3 -3
  1176. package/src/{components → account}/account-settings-labels.ts +11 -1
  1177. package/src/{components → account}/account-settings.tsx +145 -34
  1178. package/src/account/data-export-setting-labels.ts +20 -0
  1179. package/src/account/data-export-setting.tsx +19 -38
  1180. package/src/account/delete-account-setting-labels.ts +33 -0
  1181. package/src/account/delete-account-setting.tsx +13 -35
  1182. package/src/account/email-change-setting-labels.ts +32 -0
  1183. package/src/account/email-change-setting.tsx +17 -36
  1184. package/src/{components → account}/passkeys-setting.tsx +14 -9
  1185. package/src/account/sessions-setting-labels.ts +24 -0
  1186. package/src/account/sessions-setting.tsx +14 -28
  1187. package/src/admin/admin-action-confirm-labels.ts +19 -0
  1188. package/src/admin/admin-action-confirm.tsx +59 -38
  1189. package/src/admin/admin-action-log-labels.ts +74 -0
  1190. package/src/admin/admin-action-log.tsx +180 -54
  1191. package/src/admin/admin-parts.ts +0 -7
  1192. package/src/admin/invitations-panel-labels.ts +31 -0
  1193. package/src/admin/invitations-panel.tsx +16 -34
  1194. package/src/admin/plan-change-labels.ts +23 -0
  1195. package/src/admin/plan-change.tsx +58 -34
  1196. package/src/admin/reviewer-scope-editor-labels.ts +16 -0
  1197. package/src/admin/reviewer-scope-editor.tsx +9 -15
  1198. package/src/admin/role-select-labels.ts +16 -0
  1199. package/src/admin/role-select.tsx +13 -23
  1200. package/src/admin/transfer-ownership-dialog-labels.ts +20 -0
  1201. package/src/admin/transfer-ownership-dialog.tsx +7 -17
  1202. package/src/admin/user-roster-labels.ts +17 -0
  1203. package/src/admin/user-roster.tsx +9 -17
  1204. package/src/auth/accept-invitation-labels.ts +21 -0
  1205. package/src/auth/accept-invitation.tsx +9 -20
  1206. package/src/auth/auth-errors.ts +29 -13
  1207. package/src/auth/complete-name-dialog-labels.ts +16 -0
  1208. package/src/auth/complete-name-dialog.tsx +8 -13
  1209. package/src/auth/forgot-password-form-labels.ts +20 -0
  1210. package/src/auth/forgot-password-form.tsx +12 -20
  1211. package/src/auth/new-password-fields.tsx +1 -1
  1212. package/src/auth/not-found-page-labels.ts +12 -0
  1213. package/src/auth/not-found-page.tsx +11 -14
  1214. package/src/auth/register-form-labels.ts +31 -0
  1215. package/src/auth/register-form.tsx +18 -38
  1216. package/src/auth/reset-password-form-labels.ts +27 -0
  1217. package/src/auth/reset-password-form.tsx +12 -27
  1218. package/src/auth/sign-in-form-labels.ts +44 -0
  1219. package/src/auth/sign-in-form.tsx +18 -51
  1220. package/src/auth/status-parts.tsx +3 -3
  1221. package/src/auth/verify-email-labels.ts +26 -0
  1222. package/src/auth/verify-email.tsx +15 -30
  1223. package/src/billing/billing-banner.tsx +7 -3
  1224. package/src/billing/billing-labels.ts +1 -1
  1225. package/src/billing/checkout-processing.ts +2 -12
  1226. package/src/billing/plan-card.tsx +26 -27
  1227. package/src/billing/plan-limit-notice.tsx +6 -3
  1228. package/src/billing/subscription-actions.tsx +4 -4
  1229. package/src/chart.ts +9 -1
  1230. package/src/components/account-chips-labels.ts +16 -0
  1231. package/src/components/account-chips.tsx +13 -16
  1232. package/src/components/alert-banner.tsx +39 -19
  1233. package/src/components/amount-input.tsx +458 -406
  1234. package/src/components/appearance-labels.ts +2 -2
  1235. package/src/components/authed-image-labels.ts +11 -0
  1236. package/src/components/authed-image.tsx +6 -8
  1237. package/src/components/autocomplete.tsx +79 -78
  1238. package/src/components/breadcrumbs-labels.ts +10 -0
  1239. package/src/components/breadcrumbs.tsx +17 -14
  1240. package/src/components/bulk-action-bar-labels.ts +11 -0
  1241. package/src/components/bulk-action-bar.tsx +15 -16
  1242. package/src/components/button-group.tsx +7 -7
  1243. package/src/components/button-look.ts +230 -0
  1244. package/src/components/button.tsx +339 -0
  1245. package/src/components/calculator.tsx +14 -12
  1246. package/src/components/calendar-heatmap-labels.ts +15 -0
  1247. package/src/components/calendar-heatmap.tsx +13 -19
  1248. package/src/components/card.tsx +381 -0
  1249. package/src/components/chart-zoom-core.tsx +653 -0
  1250. package/src/components/chart-zoom.tsx +21 -648
  1251. package/src/components/chart.tsx +11 -11
  1252. package/src/components/checkbox-group.tsx +13 -10
  1253. package/src/components/checkbox.tsx +43 -42
  1254. package/src/components/chip-input.tsx +370 -0
  1255. package/src/components/chip-labels.ts +13 -0
  1256. package/src/components/chip.tsx +115 -711
  1257. package/src/components/choice-card.tsx +83 -85
  1258. package/src/components/column-mapper-labels.ts +45 -0
  1259. package/src/components/column-mapper.tsx +16 -51
  1260. package/src/components/combobox-core.tsx +346 -194
  1261. package/src/components/combobox-suggestions.tsx +129 -0
  1262. package/src/components/combobox.tsx +70 -896
  1263. package/src/components/confirm-dialog-labels.ts +13 -0
  1264. package/src/components/confirm-dialog.tsx +4 -8
  1265. package/src/components/copy-button-labels.ts +13 -0
  1266. package/src/components/copy-button.tsx +15 -13
  1267. package/src/components/country-select-labels.ts +11 -0
  1268. package/src/components/country-select.tsx +74 -89
  1269. package/src/components/currency-option-list.tsx +182 -0
  1270. package/src/components/currency-select.tsx +85 -196
  1271. package/src/components/danger-confirm-labels.ts +20 -0
  1272. package/src/components/danger-confirm.tsx +72 -80
  1273. package/src/components/data-table-cells.tsx +5 -5
  1274. package/src/components/data-table-column-settings.tsx +137 -0
  1275. package/src/components/data-table-filter-popover.tsx +51 -25
  1276. package/src/components/data-table-filters.ts +48 -11
  1277. package/src/components/data-table-head.tsx +258 -0
  1278. package/src/components/data-table-labels.ts +21 -71
  1279. package/src/components/data-table-mobile.tsx +594 -0
  1280. package/src/components/data-table-pagination.tsx +11 -10
  1281. package/src/components/data-table-resize.ts +187 -0
  1282. package/src/components/data-table-row-actions.tsx +152 -0
  1283. package/src/components/data-table-selection.ts +55 -0
  1284. package/src/components/data-table-shared.tsx +225 -0
  1285. package/src/components/data-table.tsx +205 -1315
  1286. package/src/components/date-field.tsx +627 -0
  1287. package/src/components/date-picker.tsx +58 -1446
  1288. package/src/components/date-range-picker.tsx +490 -0
  1289. package/src/components/description-list-labels.ts +9 -0
  1290. package/src/components/description-list.tsx +31 -15
  1291. package/src/components/dialog-frame-labels.ts +7 -0
  1292. package/src/components/dialog-frame.tsx +11 -7
  1293. package/src/components/disclosure.tsx +14 -14
  1294. package/src/components/dropdown.tsx +129 -43
  1295. package/src/components/empty-state.tsx +137 -0
  1296. package/src/components/entity-combobox.tsx +18 -13
  1297. package/src/components/error-boundary-labels.ts +20 -0
  1298. package/src/components/error-boundary.tsx +10 -20
  1299. package/src/components/facing-pair.ts +1 -1
  1300. package/src/components/field-base.tsx +604 -0
  1301. package/src/components/field-parts.tsx +192 -77
  1302. package/src/components/field-strip.tsx +12 -33
  1303. package/src/components/field-sync-labels.ts +13 -0
  1304. package/src/components/field-sync.tsx +8 -16
  1305. package/src/components/field.tsx +17 -15
  1306. package/src/components/file-button.tsx +64 -412
  1307. package/src/components/file-dropzone.tsx +36 -33
  1308. package/src/components/floating-panel-labels.ts +10 -0
  1309. package/src/components/floating-panel.tsx +32 -21
  1310. package/src/components/focus-ring.ts +9 -4
  1311. package/src/components/form-actions-labels.ts +11 -0
  1312. package/src/components/form-actions.tsx +17 -21
  1313. package/src/components/full-bleed-dialog.tsx +28 -25
  1314. package/src/components/grouped-picker.tsx +118 -96
  1315. package/src/components/help-popover.tsx +115 -0
  1316. package/src/components/hover-menu.tsx +45 -38
  1317. package/src/components/iban-input-labels.ts +15 -0
  1318. package/src/components/iban-input.tsx +25 -20
  1319. package/src/components/icon-button.tsx +945 -0
  1320. package/src/components/icon-picker-labels.ts +13 -0
  1321. package/src/components/icon-picker.tsx +27 -24
  1322. package/src/components/image-grid-labels.ts +11 -0
  1323. package/src/components/image-grid.tsx +13 -15
  1324. package/src/components/inline-edit-field-labels.ts +11 -0
  1325. package/src/components/inline-edit-field.tsx +20 -19
  1326. package/src/components/inline-entity-combobox.tsx +789 -0
  1327. package/src/components/input.tsx +380 -0
  1328. package/src/components/jump-calendar.tsx +385 -0
  1329. package/src/components/language-select.tsx +31 -16
  1330. package/src/components/legal-labels.ts +99 -0
  1331. package/src/components/legal-page.tsx +2 -2
  1332. package/src/components/legal.tsx +11 -101
  1333. package/src/components/lightbox-labels.ts +18 -0
  1334. package/src/components/lightbox.tsx +13 -21
  1335. package/src/components/line-items-labels.ts +14 -0
  1336. package/src/components/line-items.tsx +24 -31
  1337. package/src/components/list-labels.ts +10 -0
  1338. package/src/components/list.tsx +98 -75
  1339. package/src/components/loading-state.tsx +4 -4
  1340. package/src/components/measured-grid-labels.ts +25 -0
  1341. package/src/components/measured-grid.tsx +39 -62
  1342. package/src/components/menu-item.tsx +29 -26
  1343. package/src/components/mini-calendar-labels.ts +17 -0
  1344. package/src/components/mini-calendar.tsx +38 -45
  1345. package/src/components/modal.tsx +49 -20
  1346. package/src/components/money-draft.ts +72 -0
  1347. package/src/components/money-field.tsx +16 -30
  1348. package/src/components/month-picker-labels.ts +22 -0
  1349. package/src/components/month-picker.tsx +59 -45
  1350. package/src/components/multi-entity-combobox.tsx +17 -12
  1351. package/src/components/multi-select.tsx +300 -292
  1352. package/src/components/nav-pills.tsx +19 -8
  1353. package/src/components/number-field.tsx +7 -5
  1354. package/src/components/number-input.tsx +69 -99
  1355. package/src/components/numeric-field.ts +161 -0
  1356. package/src/components/numpad-sheet.tsx +16 -16
  1357. package/src/components/one-time-code-input.tsx +154 -169
  1358. package/src/components/page-contents-labels.ts +9 -0
  1359. package/src/components/page-contents.tsx +15 -15
  1360. package/src/components/page-header.tsx +9 -5
  1361. package/src/components/password-strength-labels.ts +23 -0
  1362. package/src/components/password-strength.tsx +13 -27
  1363. package/src/components/phone-input-labels.ts +10 -0
  1364. package/src/components/phone-input.tsx +42 -57
  1365. package/src/components/picker-sheet.tsx +47 -18
  1366. package/src/components/pie-chart.tsx +11 -9
  1367. package/src/components/popover-labels.ts +14 -0
  1368. package/src/components/popover.tsx +36 -37
  1369. package/src/components/progress-bar-labels.ts +10 -0
  1370. package/src/components/progress-bar.tsx +32 -23
  1371. package/src/components/qr-code.tsx +2 -2
  1372. package/src/components/reauth-dialog-labels.ts +13 -0
  1373. package/src/components/reauth-dialog.tsx +7 -10
  1374. package/src/components/row-actions-labels.ts +10 -0
  1375. package/src/components/row-actions.tsx +11 -10
  1376. package/src/components/scroll-area.tsx +4 -10
  1377. package/src/components/search-field.tsx +35 -49
  1378. package/src/components/select.tsx +302 -0
  1379. package/src/components/separator.tsx +2 -2
  1380. package/src/components/series-chart-axes.ts +329 -0
  1381. package/src/components/series-chart-thin.ts +180 -0
  1382. package/src/components/series-chart.tsx +125 -326
  1383. package/src/components/server-wake-labels.ts +11 -0
  1384. package/src/components/server-wake.tsx +39 -66
  1385. package/src/components/settings-fields.tsx +50 -19
  1386. package/src/components/share-card-labels.ts +30 -0
  1387. package/src/components/share-card.tsx +22 -37
  1388. package/src/components/sign-chip-labels.ts +12 -0
  1389. package/src/components/sign-chip.tsx +6 -9
  1390. package/src/components/signature-pad-labels.ts +24 -0
  1391. package/src/components/signature-pad.tsx +48 -57
  1392. package/src/components/signed-amount-labels.ts +10 -0
  1393. package/src/components/signed-amount.tsx +21 -22
  1394. package/src/components/skeleton.tsx +1 -1
  1395. package/src/components/slider.tsx +51 -39
  1396. package/src/components/sparkline-labels.ts +14 -0
  1397. package/src/components/sparkline.tsx +16 -21
  1398. package/src/components/spinner.tsx +81 -0
  1399. package/src/components/stat-tile-labels.ts +15 -0
  1400. package/src/components/stat-tile.tsx +39 -38
  1401. package/src/components/status-dot.tsx +17 -14
  1402. package/src/components/swatch-picker-labels.ts +10 -0
  1403. package/src/components/swatch-picker.tsx +23 -16
  1404. package/src/components/swipeable-row.tsx +17 -39
  1405. package/src/components/switch.tsx +33 -32
  1406. package/src/components/table.tsx +15 -15
  1407. package/src/components/tabs.tsx +660 -0
  1408. package/src/components/text-link.tsx +7 -7
  1409. package/src/components/text.tsx +10 -6
  1410. package/src/components/textarea.tsx +323 -0
  1411. package/src/components/tile-radio.tsx +6 -6
  1412. package/src/components/time-input.tsx +15 -7
  1413. package/src/components/toast-labels.ts +12 -0
  1414. package/src/components/toast.tsx +5 -8
  1415. package/src/components/toggle-group.tsx +105 -42
  1416. package/src/components/toggle-legend.tsx +6 -6
  1417. package/src/components/tooltip.tsx +47 -27
  1418. package/src/components/translation-review-editor.tsx +8 -7
  1419. package/src/components/translation-review-parts.tsx +9 -13
  1420. package/src/components/translation-review.tsx +50 -20
  1421. package/src/components/tree-view.tsx +14 -12
  1422. package/src/components/ui-labels.ts +22 -0
  1423. package/src/components/use-table-state.ts +91 -10
  1424. package/src/components/user-avatar.tsx +5 -5
  1425. package/src/components/wizard-stepper.tsx +7 -6
  1426. package/src/components/write-lock-labels.ts +9 -0
  1427. package/src/components/write-lock.tsx +10 -12
  1428. package/src/currencies.ts +70 -0
  1429. package/src/data-table.ts +4 -0
  1430. package/src/demo/demo-banner.tsx +16 -27
  1431. package/src/demo/demo-ended.tsx +8 -7
  1432. package/src/demo/demo-labels.ts +2 -2
  1433. package/src/demo/demo-start.tsx +7 -5
  1434. package/src/eslint/index.ts +161 -0
  1435. package/src/eslint/role-utilities.generated.ts +146 -0
  1436. package/src/eslint/role-utilities.ts +99 -0
  1437. package/src/feedback/feedback-attachment-labels.ts +36 -0
  1438. package/src/feedback/feedback-attachment.tsx +42 -66
  1439. package/src/feedback/feedback-context-labels.ts +10 -0
  1440. package/src/feedback/feedback-context.tsx +8 -9
  1441. package/src/feedback/feedback-dialog-labels.ts +28 -0
  1442. package/src/feedback/feedback-dialog.tsx +14 -44
  1443. package/src/feedback/feedback-inbox.tsx +49 -252
  1444. package/src/feedback/feedback-labels.ts +5 -5
  1445. package/src/feedback/feedback-menu-labels.ts +11 -0
  1446. package/src/feedback/feedback-menu.tsx +13 -11
  1447. package/src/feedback/feedback-record.ts +21 -7
  1448. package/src/feedback/feedback-row-detail-labels.ts +33 -0
  1449. package/src/feedback/feedback-row-detail.tsx +30 -43
  1450. package/src/feedback/feedback-status-undo.ts +3 -2
  1451. package/src/feedback/feedback-submit-dialog.tsx +109 -0
  1452. package/src/feedback/feedback-submit.tsx +45 -55
  1453. package/src/feedback/feedback-swipe.tsx +1 -1
  1454. package/src/feedback/feedback-table-labels.ts +27 -0
  1455. package/src/feedback/feedback-table.tsx +24 -40
  1456. package/src/feedback/feedback-thread-labels.ts +22 -0
  1457. package/src/feedback/feedback-thread.tsx +46 -50
  1458. package/src/feedback/feedback-vocabulary.ts +252 -0
  1459. package/src/hooks/use-anchored-panel.ts +102 -2
  1460. package/src/hooks/use-anchored-rect.ts +11 -9
  1461. package/src/hooks/use-authed-src.ts +13 -7
  1462. package/src/hooks/use-breakpoint.ts +5 -4
  1463. package/src/hooks/use-close-transition.ts +9 -10
  1464. package/src/hooks/use-debounce.ts +9 -0
  1465. package/src/hooks/use-dismiss.ts +210 -18
  1466. package/src/hooks/use-file-drop.ts +2 -2
  1467. package/src/hooks/use-file-picker-labels.ts +29 -0
  1468. package/src/hooks/use-file-picker.tsx +363 -0
  1469. package/src/hooks/use-focus-trap.ts +19 -6
  1470. package/src/i18n/defaults.ts +91 -82
  1471. package/src/i18n/german.ts +50 -6
  1472. package/src/i18n/kit-labels.tsx +85 -124
  1473. package/src/i18n/locales/en.ts +46 -0
  1474. package/src/i18n/locales/es.ts +50 -6
  1475. package/src/i18n/locales/fr.ts +55 -9
  1476. package/src/i18n/locales/hu.ts +50 -6
  1477. package/src/i18n/locales/it.ts +54 -8
  1478. package/src/i18n/locales/zh.ts +49 -6
  1479. package/src/i18n/review.ts +4 -0
  1480. package/src/i18n/shared-labels.ts +135 -0
  1481. package/src/index.ts +414 -404
  1482. package/src/landing/access.ts +2 -1
  1483. package/src/landing/landing-actions.tsx +6 -5
  1484. package/src/landing/landing-labels.ts +2 -2
  1485. package/src/landing/landing-sections.tsx +24 -23
  1486. package/src/landing/public-header.tsx +3 -2
  1487. package/src/landing/routing.tsx +2 -7
  1488. package/src/lib/chip-edge-snap.ts +212 -0
  1489. package/src/lib/cn.ts +13 -1
  1490. package/src/lib/dates.ts +4 -2
  1491. package/src/lib/decimal-marks.ts +4 -2
  1492. package/src/lib/download.ts +172 -0
  1493. package/src/lib/floating-stack.ts +5 -1
  1494. package/src/lib/format.ts +5 -3
  1495. package/src/lib/ime.ts +24 -0
  1496. package/src/lib/presence.ts +18 -0
  1497. package/src/lib/reduced-motion.ts +21 -0
  1498. package/src/lib/refs.ts +22 -0
  1499. package/src/lib/round.ts +38 -0
  1500. package/src/lib/safe-storage.ts +35 -11
  1501. package/src/lib/session-refresh.ts +473 -0
  1502. package/src/lib/text-match.ts +60 -0
  1503. package/src/lib/translation-review.ts +7 -6
  1504. package/src/rhf/fields.tsx +141 -189
  1505. package/src/rhf/form-core.tsx +328 -0
  1506. package/src/rhf/form.tsx +9 -320
  1507. package/src/rhf/line-items.tsx +2 -2
  1508. package/src/rhf/use-rhf-wizard-step.ts +4 -4
  1509. package/src/rhf.ts +4 -2
  1510. package/src/search/command-palette-labels.ts +16 -0
  1511. package/src/search/command-palette.tsx +37 -50
  1512. package/src/search/global-search-labels.ts +13 -0
  1513. package/src/search/global-search.tsx +50 -24
  1514. package/src/search/search-index.ts +5 -6
  1515. package/src/search/use-command-key.ts +22 -0
  1516. package/src/settings/settings-card-classes.ts +11 -0
  1517. package/src/settings/settings-heading.tsx +1 -1
  1518. package/src/settings/settings-labels.ts +2 -2
  1519. package/src/settings/settings-layout.tsx +65 -6
  1520. package/src/settings/settings-section.tsx +5 -5
  1521. package/src/settings/use-settings-focus.ts +2 -5
  1522. package/src/shell/app-shell-labels.ts +10 -0
  1523. package/src/shell/app-shell.tsx +79 -53
  1524. package/src/shell/auth-layout.tsx +11 -10
  1525. package/src/shell/company-switcher-labels.ts +13 -0
  1526. package/src/shell/company-switcher.tsx +7 -11
  1527. package/src/shell/option-switcher-menu.tsx +7 -5
  1528. package/src/shell/role-switcher.tsx +4 -4
  1529. package/src/shell/top-bar-brand.tsx +1 -1
  1530. package/src/shell/top-bar.tsx +6 -5
  1531. package/src/shell/topbar-action-menu.tsx +21 -19
  1532. package/src/shell/topbar-controls.tsx +15 -15
  1533. package/src/shell.ts +1 -1
  1534. package/src/testing/index.ts +13 -0
  1535. package/src/testing/viewport.ts +357 -0
  1536. package/src/theme/color.ts +7 -1
  1537. package/src/theme/palette-derive.ts +29 -7
  1538. package/src/theme/palette-presets.ts +82 -355
  1539. package/src/tour/tour-labels.ts +14 -0
  1540. package/src/tour/tour.tsx +13 -23
  1541. package/src/wizard/stepper-nav.tsx +19 -18
  1542. package/src/wizard/types.ts +3 -26
  1543. package/src/wizard/wizard-labels.ts +29 -0
  1544. package/src/wizard/wizard-step.tsx +2 -2
  1545. package/src/wizard/wizard-summary.tsx +8 -7
  1546. package/tokens.css +45 -14
  1547. package/dist/components/account-settings-labels.js.map +0 -1
  1548. package/dist/components/account-settings.js.map +0 -1
  1549. package/dist/components/choice-parts.d.ts +0 -24
  1550. package/dist/components/choice-parts.js +0 -18
  1551. package/dist/components/choice-parts.js.map +0 -1
  1552. package/dist/components/passkeys-setting.js.map +0 -1
  1553. package/dist/components/ui.d.ts +0 -101
  1554. package/dist/components/ui.js +0 -1955
  1555. package/dist/components/ui.js.map +0 -1
  1556. package/dist/data-table-labels-BJ5JE_X2.d.ts +0 -923
  1557. package/dist/delete-account-setting-DAgGBrbn.d.ts +0 -8167
  1558. package/src/components/choice-parts.ts +0 -33
  1559. package/src/components/ui.tsx +0 -4233
@@ -1,7 +1,4 @@
1
- import * as zustand_middleware from 'zustand/middleware';
2
- import * as zustand from 'zustand';
3
- import { PersistedAppearanceOptions } from './text-size.js';
4
-
1
+ import type { PersistedAppearanceOptions } from "./text-size.js";
5
2
  /**
6
3
  * "More contrast" (docs/text-size-harmonization.md §2.4, §5, §10.5, §10.6): a switch
7
4
  * beside the text size, on by choice or — on "System" — when the device asks for more
@@ -18,23 +15,23 @@ import { PersistedAppearanceOptions } from './text-size.js';
18
15
  */
19
16
  /** The stored choices (§10.6): server-kit's `CONTRAST_MODES`. "system" IS a stored value
20
17
  * — the PATCH rule refuses an explicit null, so null means only "never chosen". */
21
- declare const CONTRAST_MODES: readonly ["system", "standard", "more"];
22
- type ContrastMode = (typeof CONTRAST_MODES)[number];
18
+ export declare const CONTRAST_MODES: readonly ["system", "standard", "more"];
19
+ export type ContrastMode = (typeof CONTRAST_MODES)[number];
23
20
  /** What is in force on `<html data-contrast>`: a mode with "system" resolved. */
24
- type ContrastLevel = "standard" | "more";
25
- declare function isContrastMode(value: unknown): value is ContrastMode;
21
+ export type ContrastLevel = "standard" | "more";
22
+ export declare function isContrastMode(value: unknown): value is ContrastMode;
26
23
  /** The mode in force: **this device's own choice → the account's → "system"** (§2.6).
27
24
  * The one order the pre-paint call, the apply hook and `useAccountAppearance` share. */
28
- declare function resolveContrastMode(device: unknown, account?: unknown): ContrastMode;
25
+ export declare function resolveContrastMode(device: unknown, account?: unknown): ContrastMode;
29
26
  /** Whether the device asks for more contrast now. False without `matchMedia`. */
30
- declare function prefersMoreContrast(): boolean;
27
+ export declare function prefersMoreContrast(): boolean;
31
28
  /** A mode to the level it puts on `<html>`; "system" asks the device (or takes
32
29
  * `prefersMore`, when the caller already knows). */
33
- declare function contrastLevel(mode: ContrastMode, prefersMore?: boolean): ContrastLevel;
30
+ export declare function contrastLevel(mode: ContrastMode, prefersMore?: boolean): ContrastLevel;
34
31
  /** The level `<html>` carries now; "standard" without one. */
35
- declare function readContrastLevel(): ContrastLevel;
32
+ export declare function readContrastLevel(): ContrastLevel;
36
33
  /** Put `level` on `<html>` and re-write the colour tokens for it. */
37
- declare function applyContrast(level: ContrastLevel): void;
34
+ export declare function applyContrast(level: ContrastLevel): void;
38
35
  /**
39
36
  * What a contrast store persists under its key — FROZEN, like the text size's:
40
37
  *
@@ -43,14 +40,14 @@ declare function applyContrast(level: ContrastLevel): void;
43
40
  * `contrast` is one of {@link CONTRAST_MODES}, or `null` / absent when this device never
44
41
  * chose.
45
42
  */
46
- interface PersistedContrast {
43
+ export interface PersistedContrast {
47
44
  state?: {
48
45
  contrast?: ContrastMode | null;
49
46
  };
50
47
  version?: number;
51
48
  }
52
49
  /** This device's own choice under `storageKey`, or `null` when it never chose. */
53
- declare function readPersistedContrast(storageKey: string): ContrastMode | null;
50
+ export declare function readPersistedContrast(storageKey: string): ContrastMode | null;
54
51
  /**
55
52
  * Pre-paint (§10.3, §10.5): this device's choice under `storageKey` — else the account's
56
53
  * last known value, else "system" — resolved against `prefers-contrast` and applied
@@ -59,15 +56,15 @@ declare function readPersistedContrast(storageKey: string): ContrastMode | null;
59
56
  * palette's set when it is not; no app has to put one first (0.32.1, keksdose's 0.32
60
57
  * report asked which). Returns the level applied.
61
58
  */
62
- declare function applyPersistedContrast(storageKey: string, options?: PersistedAppearanceOptions): ContrastLevel;
63
- interface ContrastState {
59
+ export declare function applyPersistedContrast(storageKey: string, options?: PersistedAppearanceOptions): ContrastLevel;
60
+ export interface ContrastState {
64
61
  /** This device's own choice (persisted), or `null` when it never chose — then the
65
62
  * account's value applies, else "system". */
66
63
  contrast: ContrastMode | null;
67
64
  /** Store this device's choice; `null` forgets it. */
68
65
  setContrast: (contrast: ContrastMode | null) => void;
69
66
  }
70
- interface ApplyContrastOptions {
67
+ export interface ApplyContrastOptions {
71
68
  /** The account's value (`/auth/me`'s `contrast`): it applies while this device has no
72
69
  * choice of its own. */
73
70
  account?: string | null;
@@ -85,26 +82,24 @@ interface ApplyContrastOptions {
85
82
  *
86
83
  * The persisted format is {@link PersistedContrast}, and frozen.
87
84
  */
88
- declare function createContrastStore(storageKey: string): {
89
- useContrastStore: zustand.UseBoundStore<Omit<zustand.StoreApi<ContrastState>, "setState" | "persist"> & {
85
+ export declare function createContrastStore(storageKey: string): {
86
+ useContrastStore: import("zustand").UseBoundStore<Omit<import("zustand").StoreApi<ContrastState>, "setState" | "persist"> & {
90
87
  setState(partial: ContrastState | Partial<ContrastState> | ((state: ContrastState) => ContrastState | Partial<ContrastState>), replace?: false | undefined): unknown;
91
88
  setState(state: ContrastState | ((state: ContrastState) => ContrastState), replace: true): unknown;
92
89
  persist: {
93
- setOptions: (options: Partial<zustand_middleware.PersistOptions<ContrastState, {
94
- contrast: "standard" | "more" | "system" | null;
90
+ setOptions: (options: Partial<import("zustand/middleware").PersistOptions<ContrastState, {
91
+ contrast: "system" | "standard" | "more" | null;
95
92
  }, unknown>>) => void;
96
93
  clearStorage: () => void;
97
94
  rehydrate: () => Promise<void> | void;
98
95
  hasHydrated: () => boolean;
99
96
  onHydrate: (fn: (state: ContrastState) => void) => () => void;
100
97
  onFinishHydration: (fn: (state: ContrastState) => void) => () => void;
101
- getOptions: () => Partial<zustand_middleware.PersistOptions<ContrastState, {
102
- contrast: "standard" | "more" | "system" | null;
98
+ getOptions: () => Partial<import("zustand/middleware").PersistOptions<ContrastState, {
99
+ contrast: "system" | "standard" | "more" | null;
103
100
  }, unknown>>;
104
101
  };
105
102
  }>;
106
103
  useApplyContrast: ({ account }?: ApplyContrastOptions) => ContrastLevel;
107
104
  };
108
- type ContrastStore = ReturnType<typeof createContrastStore>;
109
-
110
- export { type ApplyContrastOptions, CONTRAST_MODES, type ContrastLevel, type ContrastMode, type ContrastState, type ContrastStore, type PersistedContrast, applyContrast, applyPersistedContrast, contrastLevel, createContrastStore, isContrastMode, prefersMoreContrast, readContrastLevel, readPersistedContrast, resolveContrastMode };
105
+ export type ContrastStore = ReturnType<typeof createContrastStore>;
@@ -1,10 +1,6 @@
1
- import { ThemeMode } from './theme-store.js';
2
- import { TokenSet } from './palette-presets.js';
3
- import { CvdType, Oklch } from './color.js';
4
- import 'zustand/middleware';
5
- import 'zustand';
6
- import './chart-palette.js';
7
-
1
+ import type { ThemeMode } from "./theme-store.js";
2
+ import type { TokenSet } from "./palette-presets.js";
3
+ import type { CvdType, Oklch } from "./color.js";
8
4
  /**
9
5
  * Build a whole palette from one brand colour, plus any number of colours pinned by
10
6
  * hand, with every contrast ratio SOLVED rather than chosen and then hoped for.
@@ -26,11 +22,11 @@ import './chart-palette.js';
26
22
  * leaves `chart` alone unless you explicitly ask for {@link deriveChartRamp}.
27
23
  */
28
24
  /** A role whose hue may be pinned by the caller instead of chosen by the deriver. */
29
- type AnchorRole = "brand" | "accent" | "danger" | "warning" | "success" | "info";
30
- type PaletteAnchors = {
25
+ export type AnchorRole = "brand" | "accent" | "danger" | "warning" | "success" | "info";
26
+ export type PaletteAnchors = {
31
27
  brand: string;
32
28
  } & Partial<Record<Exclude<AnchorRole, "brand">, string>>;
33
- interface DeriveOptions {
29
+ export interface DeriveOptions {
34
30
  anchors: PaletteAnchors;
35
31
  mode: ThemeMode;
36
32
  /**
@@ -48,7 +44,7 @@ interface DeriveOptions {
48
44
  };
49
45
  }
50
46
  /** The semantic layer, which lives in tokens.css rather than in `TokenSet`. */
51
- interface SemanticTokens {
47
+ export interface SemanticTokens {
52
48
  danger: string;
53
49
  dangerHover: string;
54
50
  dangerContrast: string;
@@ -71,7 +67,7 @@ interface SemanticTokens {
71
67
  accentContrast?: string;
72
68
  accentBg?: string;
73
69
  }
74
- interface ContrastCheck {
70
+ export interface ContrastCheck {
75
71
  /** e.g. "textMuted on bgPage". */
76
72
  pair: string;
77
73
  ratio: number;
@@ -81,19 +77,19 @@ interface ContrastCheck {
81
77
  rule: string;
82
78
  passes: boolean;
83
79
  }
84
- interface ContrastReport {
80
+ export interface ContrastReport {
85
81
  checks: ContrastCheck[];
86
82
  failures: ContrastCheck[];
87
83
  passes: boolean;
88
84
  }
89
- interface DerivedPalette {
85
+ export interface DerivedPalette {
90
86
  tokens: TokenSet;
91
87
  semantic: SemanticTokens;
92
88
  audit: ContrastReport;
93
89
  /** Compromises the deriver had to make, in plain words. Never silent. */
94
90
  warnings: string[];
95
91
  }
96
- declare function derivePalette({ anchors, mode, surfaceTint, textContrast, }: DeriveOptions): DerivedPalette;
92
+ export declare function derivePalette({ anchors, mode, surfaceTint, textContrast, }: DeriveOptions): DerivedPalette;
97
93
  /**
98
94
  * Measure every pair that has a requirement, and say which ones fail.
99
95
  *
@@ -101,8 +97,8 @@ declare function derivePalette({ anchors, mode, surfaceTint, textContrast, }: De
101
97
  * out, and the preset test runs it over everything the package ships, so a palette that
102
98
  * does not hold up cannot be merged with a comment claiming that it does.
103
99
  */
104
- declare function auditPalette(t: TokenSet, semantic?: SemanticTokens): ContrastReport;
105
- interface ChartRampReport {
100
+ export declare function auditPalette(t: TokenSet, semantic?: SemanticTokens): ContrastReport;
101
+ export interface ChartRampReport {
106
102
  colors: string[];
107
103
  /** Series pairs that are too close under normal vision or any simulated CVD. */
108
104
  collisions: Array<{
@@ -134,10 +130,8 @@ interface ChartRampReport {
134
130
  * wants their charts to follow their brand and is willing to read the report — not as
135
131
  * a silent upgrade to the default.
136
132
  */
137
- declare function deriveChartRamp(brandHex: string, mode: ThemeMode, surfaces: string[], count?: number): ChartRampReport;
133
+ export declare function deriveChartRamp(brandHex: string, mode: ThemeMode, surfaces: string[], count?: number): ChartRampReport;
138
134
  /** Audit a ramp somebody else chose — the shipped Paul Tol set, say. */
139
- declare function auditChartRamp(colors: string[], surfaces: string[]): ChartRampReport;
135
+ export declare function auditChartRamp(colors: string[], surfaces: string[]): ChartRampReport;
140
136
  /** Convenience: the OKLCH of a hex, for a caller inspecting an anchor. */
141
- declare function describe(hex: string): Oklch | null;
142
-
143
- export { type AnchorRole, type ChartRampReport, type ContrastCheck, type ContrastReport, type DeriveOptions, type DerivedPalette, type PaletteAnchors, type SemanticTokens, auditChartRamp, auditPalette, deriveChartRamp, derivePalette, describe };
137
+ export declare function describe(hex: string): Oklch | null;
@@ -49,8 +49,12 @@ const SURFACE_L = {
49
49
  };
50
50
  const BORDER_CONTRAST = 1.5;
51
51
  const MAX_SURFACE_CHROMA = 0.034;
52
- function surfaceSet(hue, mode, tint) {
53
- const c = MAX_SURFACE_CHROMA * Math.max(0, Math.min(1, tint));
52
+ const FULL_HUE_CHROMA = 0.06;
53
+ function hueWeight(brand) {
54
+ return Math.min(1, brand.c / FULL_HUE_CHROMA);
55
+ }
56
+ function surfaceSet(hue, mode, tint, weight) {
57
+ const c = MAX_SURFACE_CHROMA * Math.max(0, Math.min(1, tint)) * weight;
54
58
  const L = SURFACE_L[mode];
55
59
  const bgPage = oklchToHex({ l: L.page, c, h: hue });
56
60
  const bgSurface = oklchToHex({ l: L.surface, c, h: hue });
@@ -102,11 +106,12 @@ function derivePalette({
102
106
  );
103
107
  }
104
108
  const targets = { primary: 10, secondary: 7, muted: 4.6, ...textContrast };
105
- const surfaces = surfaceSet(brand.h, mode, surfaceTint);
109
+ const weight = hueWeight(brand);
110
+ const surfaces = surfaceSet(brand.h, mode, surfaceTint, weight);
106
111
  const worstSurface = [surfaces.bgPage, surfaces.bgSurface, surfaces.bgSurface2].reduce(
107
112
  (a, b) => contrast(a, mode === "light" ? "#000000" : "#ffffff") < contrast(b, mode === "light" ? "#000000" : "#ffffff") ? a : b
108
113
  );
109
- const textChroma = 0.014;
114
+ const textChroma = 0.014 * weight;
110
115
  const textPrimary = solveAgainst(brand.h, textChroma, targets.primary, worstSurface, mode);
111
116
  const textSecondary = solveAgainst(brand.h, textChroma, targets.secondary, worstSurface, mode);
112
117
  const textMuted = solveAgainst(brand.h, textChroma, targets.muted, worstSurface, mode);
@@ -256,10 +261,11 @@ function derivePalette({
256
261
  const moneyIncome = money(175, 4.5);
257
262
  const moneyExpense = money(70, 4.5);
258
263
  const moneyNet = money(300, 4.5);
259
- const neutralFloor = solveLightness(4.5, parseHex(worstText), brand.h, 0.012, mode === "light" ? "darker" : "lighter");
264
+ const neutralChroma = 0.012 * weight;
265
+ const neutralFloor = solveLightness(4.5, parseHex(worstText), brand.h, neutralChroma, mode === "light" ? "darker" : "lighter");
260
266
  const moneyNeutral = oklchToHex({
261
267
  l: mode === "light" ? Math.min(0.52, neutralFloor) : Math.max(0.72, neutralFloor),
262
- c: 0.012,
268
+ c: neutralChroma,
263
269
  h: brand.h
264
270
  });
265
271
  const tokens = {
@@ -308,9 +314,11 @@ function auditPalette(t, semantic) {
308
314
  const hover = hoverFill(t);
309
315
  const textGrounds = [...surfaces, ["bgHover", hover]];
310
316
  const { brandMuted, brandBg, brandBgHover } = brandSoft(t);
317
+ const MIXED = /\b(bgHover|brandMuted|brandBg|brandBgHover)\b/;
311
318
  const add = (pair, fg, bg, required, rule) => {
312
319
  const ratio = contrast(fg, bg);
313
- checks.push({ pair, ratio, required, rule, passes: ratio >= required - 0.05 });
320
+ const slack = MIXED.test(pair) ? 0.05 : 0;
321
+ checks.push({ pair, ratio, required, rule, passes: ratio >= required - slack });
314
322
  };
315
323
  for (const [name, bg] of surfaces) {
316
324
  add(`brand on ${name}`, t.brand, bg, 3, "WCAG 1.4.11 graphical object");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/theme/palette-derive.ts"],"sourcesContent":["import type { ThemeMode } from \"./theme-store\";\nimport type { TokenSet } from \"./palette-presets\";\nimport type { HeatStops } from \"./chart-palette\";\nimport {\n contrast,\n deltaE,\n toHex,\n hexToOklch,\n oklchToHex,\n parseHex,\n rgbToOklch,\n simulateCvd,\n solveLightness,\n} from \"./color\";\nimport type { CvdType, Oklch } from \"./color\";\nimport { brandSoft, hoverFill } from \"./contrast-tokens\";\n\n/**\n * Build a whole palette from one brand colour, plus any number of colours pinned by\n * hand, with every contrast ratio SOLVED rather than chosen and then hoped for.\n *\n * The presets this package shipped were assembled by eye and annotated with the ratios\n * they were believed to hold — `tokens.css` records \"7.0:1 and 4.8:1\", and\n * `palette-presets.ts` records \"2.67:1 … lifted they clear it at 3.30:1\". Nothing\n * computed any of them, and the audit found four of the nine default light chart hues\n * below the 3:1 that WCAG 1.4.11 requires of a graphical object. A comment is not a\n * test. Everything here is derived to a target and then measured, and\n * {@link auditPalette} returns the measurements so a caller can refuse a palette that\n * does not hold up.\n *\n * WHAT IS DERIVED AND WHAT IS NOT. The UI palette and the CATEGORICAL CHART RAMP solve\n * different problems and are deliberately kept apart. A UI colour needs contrast against\n * one known surface and carries a fixed meaning; a chart colour needs to stay separable\n * from eight unknown siblings, at roughly equal salience, with no implied order.\n * Optimising a set for one makes it worse at the other, which is why `deriveTokenSet`\n * leaves `chart` alone unless you explicitly ask for {@link deriveChartRamp}.\n */\n\n/* ── Inputs ───────────────────────────────────────────────────────────────── */\n\n/** A role whose hue may be pinned by the caller instead of chosen by the deriver. */\nexport type AnchorRole = \"brand\" | \"accent\" | \"danger\" | \"warning\" | \"success\" | \"info\";\n\nexport type PaletteAnchors = { brand: string } & Partial<Record<Exclude<AnchorRole, \"brand\">, string>>;\n\nexport interface DeriveOptions {\n anchors: PaletteAnchors;\n mode: ThemeMode;\n /**\n * How strongly the surfaces carry the brand's hue, 0–1 of the maximum useful tint.\n * 0 gives neutral greys; the shipped default is a visible warmth, because a page that\n * is very slightly the brand's hue reads as considered where a pure grey reads as\n * unstyled. Above ~0.5 the surfaces start competing with the content.\n */\n surfaceTint?: number;\n /** Contrast targets for the three text roles against the WORST surface. */\n textContrast?: { primary?: number; secondary?: number; muted?: number };\n}\n\n/* ── Outputs ──────────────────────────────────────────────────────────────── */\n\n/** The semantic layer, which lives in tokens.css rather than in `TokenSet`. */\nexport interface SemanticTokens {\n danger: string;\n dangerHover: string;\n dangerContrast: string;\n dangerBorder: string;\n /** The error line (invalid field, danger banner, destructive focus ring): as loud as\n * `dangerBorder` was before 0.15.5, so it keeps 3:1 against the surface. */\n dangerBorderStrong: string;\n dangerBg: string;\n warning: string;\n warningBorder: string;\n warningBg: string;\n info: string;\n infoBorder: string;\n infoBg: string;\n success: string;\n successBorder: string;\n successBg: string;\n /** Present only when a `accent` (secondary brand) anchor was supplied. */\n accent?: string;\n accentContrast?: string;\n accentBg?: string;\n}\n\nexport interface ContrastCheck {\n /** e.g. \"textMuted on bgPage\". */\n pair: string;\n ratio: number;\n /** What WCAG asks of this pair. */\n required: number;\n /** Which rule the requirement comes from, for a reader who wants to argue with it. */\n rule: string;\n passes: boolean;\n}\n\nexport interface ContrastReport {\n checks: ContrastCheck[];\n failures: ContrastCheck[];\n passes: boolean;\n}\n\nexport interface DerivedPalette {\n tokens: TokenSet;\n semantic: SemanticTokens;\n audit: ContrastReport;\n /** Compromises the deriver had to make, in plain words. Never silent. */\n warnings: string[];\n}\n\n/* ── The hue homes ────────────────────────────────────────────────────────── */\n\n/**\n * Where each semantic role wants to sit, and how far it may be pushed.\n *\n * A semantic colour is a convention before it is an aesthetic: danger is red because\n * every other interface the user has ever used made it red, and a \"danger\" button in\n * the brand's teal is a worse button however well it matches. So each role has a home\n * hue and a narrow licence to move — enough to get out of the brand's way when the\n * brand happens to live in the same neighbourhood, not enough to stop meaning what it\n * means. If it cannot get far enough, that is a warning, not a silent compromise.\n */\nconst HUE_HOME: Record<Exclude<AnchorRole, \"brand\" | \"accent\">, { hue: number; slack: number }> = {\n danger: { hue: 27, slack: 14 },\n warning: { hue: 75, slack: 16 },\n success: { hue: 150, slack: 20 },\n info: { hue: 240, slack: 22 },\n};\n\n/** Circular distance between two hue angles, 0–180. */\nfunction hueGap(a: number, b: number): number {\n const d = Math.abs(((a - b) % 360) + 360) % 360;\n return d > 180 ? 360 - d : d;\n}\n\n/**\n * Nudge `home` within `slack` to maximise the distance from every taken hue.\n *\n * Sampled rather than solved: the objective is a min-of-distances over a handful of\n * points on a short arc, which is piecewise-linear with kinks wherever the nearest\n * neighbour changes. Gradient methods stall on those kinks; 2° steps over a ±22° arc is\n * 23 evaluations of some trigonometry and cannot stall.\n */\nfunction placeHue(home: number, slack: number, taken: number[]): number {\n let best = home;\n let bestGap = Math.min(...taken.map((t) => hueGap(home, t)), 360);\n for (let d = -slack; d <= slack; d += 2) {\n const h = (home + d + 360) % 360;\n const gap = Math.min(...taken.map((t) => hueGap(h, t)), 360);\n // Ties go to the hue nearest home: a role should move only as far as it must.\n if (gap > bestGap + 1e-9) {\n best = h;\n bestGap = gap;\n }\n }\n return best;\n}\n\n/* ── Derivation ───────────────────────────────────────────────────────────── */\n\nconst SURFACE_L = {\n // Light: the PAGE is slightly darker than the cards on it, so a card reads as raised\n // without needing a shadow to say so. Matches the shipped presets' relationship.\n //\n // The light WELL is the page itself (0.33, docs/colour-roles-harmonization.md §5.3,\n // k26). Between the card and the page it sat 1.02–1.05:1 from the card it is inset\n // in, which is no well at all; at the page's lightness it stands out from the card\n // exactly as far as the card does from the page, and nothing re-solves, because the\n // page is already the surface every text role is solved against. Dark keeps its\n // well a step lighter than the card (1.11–1.13:1).\n light: { page: 0.912, surface: 0.945, surface2: 0.912 },\n dark: { page: 0.158, surface: 0.206, surface2: 0.249 },\n} as const;\n\n/**\n * What a hairline has to clear against the surface it divides.\n *\n * WCAG has nothing to say here — a decorative border is not a graphical object that\n * conveys information — so this is a house rule, and it is deliberately low. A border\n * that clears 3:1 is a RULE, not a hairline: it draws the eye to the box instead of to\n * what is in it. 1.5:1 is the point at which the edge is reliably findable without\n * becoming part of the composition.\n */\nconst BORDER_CONTRAST = 1.5;\n\n/** The most tint a surface can carry before it stops reading as a neutral ground. */\nconst MAX_SURFACE_CHROMA = 0.034;\n\nfunction surfaceSet(hue: number, mode: ThemeMode, tint: number) {\n const c = MAX_SURFACE_CHROMA * Math.max(0, Math.min(1, tint));\n const L = SURFACE_L[mode];\n const bgPage = oklchToHex({ l: L.page, c, h: hue });\n const bgSurface = oklchToHex({ l: L.surface, c, h: hue });\n const bgSurface2 = oklchToHex({ l: L.surface2, c, h: hue });\n // Solved, not guessed: a fixed lightness that looks right against a pale warm ground\n // disappears against a deep cold one, and both are reachable from the same `hue`\n // input. The border carries a little more chroma than the surfaces because at these\n // lightnesses a perfectly neutral hairline on a tinted ground reads as a wrong grey.\n const borderChroma = c * 1.6;\n // Solved against the surface the hairline is HARDEST to see on, not against one of\n // the three. Solving against `bgSurface` alone left it at 1.36:1 on `bgPage`, so the\n // target and the audit disagreed about the same border.\n const hardest = [bgPage, bgSurface, bgSurface2].reduce((a, b) =>\n contrast(a, mode === \"light\" ? \"#000000\" : \"#ffffff\") <\n contrast(b, mode === \"light\" ? \"#000000\" : \"#ffffff\")\n ? a\n : b,\n );\n const borderL = solveLightness(\n BORDER_CONTRAST,\n parseHex(hardest)!,\n hue,\n borderChroma,\n mode === \"light\" ? \"darker\" : \"lighter\",\n );\n return {\n bgPage,\n bgSurface,\n bgSurface2,\n border: oklchToHex({ l: borderL, c: borderChroma, h: hue }),\n };\n}\n\n/** Solve a colour at this hue that clears `target` against `against`, keeping chroma. */\nfunction solveAgainst(hue: number, chroma: number, target: number, against: string, mode: ThemeMode): string {\n const bg = parseHex(against)!;\n const l = solveLightness(target, bg, hue, chroma, mode === \"light\" ? \"darker\" : \"lighter\");\n return oklchToHex({ l, c: chroma, h: hue });\n}\n\n/** Whichever of near-white / near-black reads better ON `fill`. */\nfunction contrastOn(fill: string): string {\n const light = \"#ffffff\";\n const dark = \"#12100e\";\n return contrast(fill, light) >= contrast(fill, dark) ? light : dark;\n}\n\n/** A soft tint of `hue` sitting on the surface — a badge fill, not a button fill. */\nfunction tintOn(hue: number, chroma: number, surface: string, mode: ThemeMode): string {\n const s = hexToOklch(surface)!;\n // Toward the colour, but only far enough to be seen: these back TEXT of the same hue,\n // and a strong tint leaves the text nowhere to go.\n const l = mode === \"light\" ? s.l - 0.055 : s.l + 0.055;\n return oklchToHex({ l, c: Math.min(chroma * 0.45, 0.06), h: hue });\n}\n\nexport function derivePalette({\n anchors,\n mode,\n surfaceTint = 0.55,\n textContrast,\n}: DeriveOptions): DerivedPalette {\n const warnings: string[] = [];\n const brand = hexToOklch(anchors.brand);\n if (!brand) {\n throw new Error(\n `derivePalette: brand \"${anchors.brand}\" is not a #rgb or #rrggbb colour. ` +\n `Anchors must be hex — a named colour or an rgba() string cannot be converted.`,\n );\n }\n\n const targets = { primary: 10, secondary: 7, muted: 4.6, ...textContrast };\n\n // ── Surfaces, from the brand's hue.\n const surfaces = surfaceSet(brand.h, mode, surfaceTint);\n // Every text role is solved against the WORST of the three, so a token is legible\n // wherever it lands. Solving against `bgSurface` alone is the mistake that makes a\n // muted label fail on the page background it also sits on.\n const worstSurface = [surfaces.bgPage, surfaces.bgSurface, surfaces.bgSurface2].reduce((a, b) =>\n contrast(a, mode === \"light\" ? \"#000000\" : \"#ffffff\") <\n contrast(b, mode === \"light\" ? \"#000000\" : \"#ffffff\")\n ? a\n : b,\n );\n\n // ── Text. A trace of the brand hue keeps the greys from reading cold on a warm page.\n const textChroma = 0.014;\n const textPrimary = solveAgainst(brand.h, textChroma, targets.primary, worstSurface, mode);\n const textSecondary = solveAgainst(brand.h, textChroma, targets.secondary, worstSurface, mode);\n const textMuted = solveAgainst(brand.h, textChroma, targets.muted, worstSurface, mode);\n\n // The darkest fill text sits on (the lightest, in dark): the worst surface, or a\n // hovered row on the card (`--bg-hover`), which in light is a shade darker than the\n // page. The colours that are solved exactly to 4.5:1 — money, the semantic text — are\n // solved against this, so they hold on a hovered row too (0.33, §12.10). The text\n // roles above keep their margin (4.6:1 and up) and need no second solve.\n const hover = hoverFill({ textPrimary, bgSurface: surfaces.bgSurface });\n const worstText = [worstSurface, hover].reduce((a, b) =>\n contrast(a, mode === \"light\" ? \"#000000\" : \"#ffffff\") <\n contrast(b, mode === \"light\" ? \"#000000\" : \"#ffffff\")\n ? a\n : b,\n );\n\n // ── Brand. Keep the hue the caller asked for; move only the lightness, and only as\n // far as 3:1 against the worst surface — WCAG 1.4.11, since a brand-filled control is\n // a graphical object whose boundary has to be perceivable.\n const brandChroma = Math.max(brand.c, 0.06);\n const brandRatio = contrast(anchors.brand, worstSurface);\n // NORMALISED, never the caller's raw string. `parseHex` accepts \"4f46e5\" and \"#abc\",\n // and passing either through unchanged put a value in the TokenSet that is not a CSS\n // colour — it then fails silently at paint time, three layers from here.\n let brandHex =\n brandRatio >= 3\n ? toHex(parseHex(anchors.brand)!)\n : solveAgainst(brand.h, brandChroma, 3, worstSurface, mode);\n if (brandRatio < 3) {\n warnings.push(\n `brand ${anchors.brand} sits at ${brandRatio.toFixed(2)}:1 against the ${mode} surfaces, ` +\n `below the 3:1 WCAG 1.4.11 asks of a control boundary. Lightness was adjusted to ` +\n `${brandHex}; hue and chroma are unchanged.`,\n );\n }\n // `--brand-muted` is the brand AS TEXT — a soft brand chip's label, an outline chip, a\n // current link — and tokens.css derives it: 62 % brand into the ink. A brand solved\n // to 3:1 left it at 4.43–4.51:1 in three dark presets (0.33, §5.5), so it gets the\n // text floor here: the brand moves away from the surfaces, a step at a time, until its\n // muted form clears 4.5:1 on the worst fill and on its own soft chip, at rest\n // (`--brand-bg`) and hovered (`--brand-bg-hover`, the harder of the two: §12.11).\n const brandMutedWorst = (hex: string) => {\n const soft = brandSoft({ brand: hex, textPrimary, bgSurface: surfaces.bgSurface });\n return Math.min(\n contrast(soft.brandMuted, worstText),\n contrast(soft.brandMuted, soft.brandBg),\n contrast(soft.brandMuted, soft.brandBgHover),\n );\n };\n for (let i = 0; i < 40 && brandMutedWorst(brandHex) < 4.5; i++) {\n const lch = hexToOklch(brandHex)!;\n brandHex = oklchToHex({ ...lch, l: mode === \"light\" ? lch.l - 0.005 : lch.l + 0.005 });\n }\n if (brandMutedWorst(brandHex) < 4.5) {\n warnings.push(\n `the brand as text (--brand-muted) reaches only ${brandMutedWorst(brandHex).toFixed(2)}:1 ` +\n `against the ${mode} surfaces (needs 4.5:1).`,\n );\n }\n const brandLch = hexToOklch(brandHex)!;\n const brandContrast = contrastOn(brandHex);\n const brandHover = oklchToHex({\n ...brandLch,\n // Hover moves AWAY from the colour of the text on it (0.33, §5.5): darker under\n // white, lighter under a dark ink. It used to move away from the page, which in dark\n // lightened a fill that carries WHITE text, toward its own label: 4.07:1.\n l: brandContrast === \"#ffffff\" ? brandLch.l - 0.06 : brandLch.l + 0.06,\n });\n const onBrand = contrast(brandHex, brandContrast);\n if (onBrand < 4.5) {\n warnings.push(\n `text on the brand fill reaches only ${onBrand.toFixed(2)}:1 (needs 4.5:1). ` +\n `A mid-lightness, high-chroma brand cannot carry legible text at any ink; ` +\n `use it as an accent and keep primary buttons on a darker or lighter variant.`,\n );\n }\n\n // ── Semantic roles. Anchors are honoured exactly; the rest are placed away from the\n // brand and from each other, within each role's licence to move.\n const taken: number[] = [brandLch.h];\n const accentLch = anchors.accent ? hexToOklch(anchors.accent) : null;\n if (anchors.accent && !accentLch) {\n warnings.push(`accent \"${anchors.accent}\" is not a hex colour and was ignored.`);\n }\n if (accentLch) taken.push(accentLch.h);\n\n const semanticHue = {} as Record<Exclude<AnchorRole, \"brand\" | \"accent\">, number>;\n const semanticChroma = {} as Record<Exclude<AnchorRole, \"brand\" | \"accent\">, number>;\n for (const role of [\"danger\", \"warning\", \"success\", \"info\"] as const) {\n const pinned = anchors[role] ? hexToOklch(anchors[role]!) : null;\n if (anchors[role] && !pinned) {\n warnings.push(`${role} \"${anchors[role]}\" is not a hex colour and was ignored.`);\n }\n const home = HUE_HOME[role];\n const hue = pinned ? pinned.h : placeHue(home.hue, home.slack, taken);\n if (!pinned) {\n const gap = Math.min(...taken.map((t) => hueGap(hue, t)));\n if (gap < 20) {\n warnings.push(\n `${role} could only reach ${gap.toFixed(0)}° from the nearest pinned hue, which is ` +\n `too close to tell apart at a glance. Pin ${role} explicitly, or move the brand.`,\n );\n }\n }\n semanticHue[role] = hue;\n semanticChroma[role] = pinned ? Math.max(pinned.c, 0.08) : 0.13;\n taken.push(hue);\n }\n\n /**\n * A semantic colour has two jobs and therefore two backgrounds: plain text on the\n * page, and the label inside its own tinted badge. The badge is the harder of the\n * two — it is a step toward the colour — so solving only against the surface produced\n * a badge at 4.1:1 while the loose text passed, which is the failure mode that is\n * hardest to notice because nine tenths of the uses look fine.\n */\n const sem = (role: Exclude<AnchorRole, \"brand\" | \"accent\">) => {\n const hue = semanticHue[role];\n const chroma = semanticChroma[role];\n const bg = tintOn(hue, chroma, surfaces.bgSurface, mode);\n const onSurface = solveLightness(\n 4.5,\n parseHex(worstText)!,\n hue,\n chroma,\n mode === \"light\" ? \"darker\" : \"lighter\",\n );\n const onTint = solveLightness(\n 4.5,\n parseHex(bg)!,\n hue,\n chroma,\n mode === \"light\" ? \"darker\" : \"lighter\",\n );\n const l = mode === \"light\" ? Math.min(onSurface, onTint) : Math.max(onSurface, onTint);\n return oklchToHex({ l, c: chroma, h: hue });\n };\n\n const danger = sem(\"danger\");\n const dangerLch = hexToOklch(danger)!;\n const semantic: SemanticTokens = {\n danger,\n dangerHover: oklchToHex({\n ...dangerLch,\n l: mode === \"light\" ? dangerLch.l - 0.06 : dangerLch.l + 0.06,\n }),\n dangerContrast: contrastOn(danger),\n // The tone border follows its siblings' lightness in dark mode (warning 0.44, info\n // and success 0.45) — a soft frame; the strong line keeps the old, louder recipe.\n dangerBorder: oklchToHex({\n l: mode === \"light\" ? dangerLch.l + 0.22 : 0.45,\n c: semanticChroma.danger,\n h: semanticHue.danger,\n }),\n dangerBorderStrong: oklchToHex({\n l: mode === \"light\" ? dangerLch.l + 0.22 : dangerLch.l - 0.22,\n c: semanticChroma.danger,\n h: semanticHue.danger,\n }),\n dangerBg: tintOn(semanticHue.danger, semanticChroma.danger, surfaces.bgSurface, mode),\n warning: sem(\"warning\"),\n warningBorder: oklchToHex({\n l: mode === \"light\" ? 0.82 : 0.44,\n c: semanticChroma.warning,\n h: semanticHue.warning,\n }),\n warningBg: tintOn(semanticHue.warning, semanticChroma.warning, surfaces.bgSurface, mode),\n info: sem(\"info\"),\n infoBorder: oklchToHex({\n l: mode === \"light\" ? 0.8 : 0.45,\n c: semanticChroma.info,\n h: semanticHue.info,\n }),\n infoBg: tintOn(semanticHue.info, semanticChroma.info, surfaces.bgSurface, mode),\n success: sem(\"success\"),\n successBorder: oklchToHex({\n l: mode === \"light\" ? 0.81 : 0.45,\n c: semanticChroma.success,\n h: semanticHue.success,\n }),\n successBg: tintOn(semanticHue.success, semanticChroma.success, surfaces.bgSurface, mode),\n };\n\n if (accentLch) {\n const accent = solveAgainst(accentLch.h, Math.max(accentLch.c, 0.06), 3, worstSurface, mode);\n semantic.accent = accent;\n semantic.accentContrast = contrastOn(accent);\n semantic.accentBg = tintOn(accentLch.h, Math.max(accentLch.c, 0.06), surfaces.bgSurface, mode);\n }\n\n // ── Money. A THIRD system again: these are data colours with fixed meanings, and the\n // one rule that outranks everything is that income and expense must never be the\n // red/green pair — which is why the shipped presets use teal/amber/violet. Derived\n // here at fixed hues rather than from the brand, for the same reason `--danger` is:\n // a consumer who rebrands does not thereby change what \"money out\" looks like.\n const money = (hue: number, target: number) => solveAgainst(hue, 0.12, target, worstText, mode);\n const moneyIncome = money(175, 4.5);\n const moneyExpense = money(70, 4.5);\n const moneyNet = money(300, 4.5);\n // \"No money has moved\": a quiet grey at a fixed lightness, but printed as TEXT (the\n // numpad's sign, a future row's figure), so it gets the text floor too (0.33). The\n // fixed lightness left it at 4.24:1 on four light pages.\n const neutralFloor = solveLightness(4.5, parseHex(worstText)!, brand.h, 0.012, mode === \"light\" ? \"darker\" : \"lighter\");\n const moneyNeutral = oklchToHex({\n l: mode === \"light\" ? Math.min(0.52, neutralFloor) : Math.max(0.72, neutralFloor),\n c: 0.012,\n h: brand.h,\n });\n\n const tokens: TokenSet = {\n ...surfaces,\n textPrimary,\n textSecondary,\n textMuted,\n brand: brandHex,\n brandHover,\n brandContrast,\n moneyIncome,\n moneyExpense,\n moneyNet,\n moneyNeutral,\n // Left alone. See the note at the top of this file about why the categorical ramp is\n // not derived from the brand unless the caller asks.\n //\n // ⚠️ EMPTY, not absent: a caller who hands this straight to `applyTokenSet` keeps\n // whatever `--chart-1…9` were already on the element. That is deliberate — the ramp\n // is a separate decision and clearing it would leave charts unpainted — but it means\n // a derived palette applied over another preset is a MIX until you also supply a\n // ramp. `deriveChartRamp` is how you supply one.\n chart: [],\n heat: deriveHeat(moneyIncome, moneyExpense, surfaces, mode),\n };\n\n return { tokens, semantic, audit: auditPalette(tokens, semantic), warnings };\n}\n\n/**\n * Heatmap stops, reusing the money pair.\n *\n * `under` is the good direction and `over` the bad one, at the SAME hues as\n * `moneyIncome`/`moneyExpense` — so a heatmap cell and the figure printed beside it\n * agree about which way is which, rather than each inventing its own convention.\n */\nfunction deriveHeat(\n income: string,\n expense: string,\n surfaces: { bgSurface2: string },\n mode: ThemeMode,\n): HeatStops {\n const exp = hexToOklch(expense)!;\n return {\n neutral: surfaces.bgSurface2,\n under: income,\n over: expense,\n seqLow: oklchToHex({ l: mode === \"light\" ? 0.93 : 0.26, c: 0.05, h: exp.h }),\n seqHigh: expense,\n empty: mode === \"light\" ? \"rgba(120,110,95,0.14)\" : \"rgba(160,170,190,0.10)\",\n };\n}\n\n/* ── Audit ────────────────────────────────────────────────────────────────── */\n\n/**\n * Measure every pair that has a requirement, and say which ones fail.\n *\n * This is the part the shipped presets were missing. `derivePalette` runs it on the way\n * out, and the preset test runs it over everything the package ships, so a palette that\n * does not hold up cannot be merged with a comment claiming that it does.\n */\nexport function auditPalette(t: TokenSet, semantic?: SemanticTokens): ContrastReport {\n const checks: ContrastCheck[] = [];\n const surfaces: Array<[string, string]> = [\n [\"bgPage\", t.bgPage],\n [\"bgSurface\", t.bgSurface],\n [\"bgSurface2\", t.bgSurface2],\n ];\n // A hovered row on the card (`--bg-hover`) carries the same text as the card, and in\n // light it is the darkest fill that text sits on (0.33, §12.10). Text is measured on\n // it; the brand fill and the hairline, which are not text, are not.\n const hover = hoverFill(t);\n const textGrounds: Array<[string, string]> = [...surfaces, [\"bgHover\", hover]];\n // `--brand-muted`, `--brand-bg` and `--brand-bg-hover`, mixed as tokens.css mixes them.\n const { brandMuted, brandBg, brandBgHover } = brandSoft(t);\n\n const add = (pair: string, fg: string, bg: string, required: number, rule: string) => {\n const ratio = contrast(fg, bg);\n checks.push({ pair, ratio, required, rule, passes: ratio >= required - 0.05 });\n };\n\n for (const [name, bg] of surfaces) {\n add(`brand on ${name}`, t.brand, bg, 3, \"WCAG 1.4.11 graphical object\");\n add(`border on ${name}`, t.border, bg, 1.1, \"house rule: a hairline must be findable\");\n }\n for (const [name, bg] of textGrounds) {\n add(`textPrimary on ${name}`, t.textPrimary, bg, 7, \"WCAG 1.4.6 AAA body text\");\n add(`textSecondary on ${name}`, t.textSecondary, bg, 4.5, \"WCAG 1.4.3 AA body text\");\n add(`textMuted on ${name}`, t.textMuted, bg, 4.5, \"WCAG 1.4.3 AA body text\");\n add(`brandMuted on ${name}`, brandMuted, bg, 4.5, \"WCAG 1.4.3 — the brand as text\");\n for (const [key, hex] of [\n [\"moneyIncome\", t.moneyIncome],\n [\"moneyExpense\", t.moneyExpense],\n [\"moneyNet\", t.moneyNet],\n // Not a figure's colour but still printed as one (the numpad's sign, a future\n // row's amount) — measured since 0.33, when it was found at 4.24:1.\n [\"moneyNeutral\", t.moneyNeutral],\n ] as const) {\n add(`${key} on ${name}`, hex, bg, 4.5, \"WCAG 1.4.3 — these are rendered as TEXT\");\n }\n }\n\n add(\"brandContrast on brand\", t.brandContrast, t.brand, 4.5, \"WCAG 1.4.3 AA body text\");\n // A hovered brand button carries the same label (0.33): the derived dark presets\n // lightened the hover toward their white label and left it at 4.07:1.\n add(\"brandContrast on brandHover\", t.brandContrast, t.brandHover, 4.5, \"WCAG 1.4.3 AA body text\");\n add(\"brandMuted on brandBg\", brandMuted, brandBg, 4.5, \"WCAG 1.4.3 — a soft brand chip's label\");\n // The same label on the chip hovered (§12.11): a current link, a selected day. At 70 %\n // brand the muted text read 4.08–4.42:1 here (Default and Moss light; Ink, Moss, Plum\n // and Contrast dark).\n add(\"brandMuted on brandBgHover\", brandMuted, brandBgHover, 4.5, \"WCAG 1.4.3 — a hovered soft brand chip's label\");\n\n if (semantic) {\n for (const [name, fg] of [\n [\"danger\", semantic.danger],\n [\"warning\", semantic.warning],\n [\"info\", semantic.info],\n [\"success\", semantic.success],\n ] as const) {\n add(`${name} on bgSurface`, fg, t.bgSurface, 4.5, \"WCAG 1.4.3 — rendered as text\");\n add(`${name} on bgHover`, fg, hover, 4.5, \"WCAG 1.4.3 — rendered as text, on a hovered row\");\n }\n add(\"danger on dangerBg\", semantic.danger, semantic.dangerBg, 4.5, \"WCAG 1.4.3 — badge text\");\n add(\"warning on warningBg\", semantic.warning, semantic.warningBg, 4.5, \"WCAG 1.4.3 — badge text\");\n add(\"info on infoBg\", semantic.info, semantic.infoBg, 4.5, \"WCAG 1.4.3 — badge text\");\n add(\"success on successBg\", semantic.success, semantic.successBg, 4.5, \"WCAG 1.4.3 — badge text\");\n add(\n \"dangerContrast on danger\",\n semantic.dangerContrast,\n semantic.danger,\n 4.5,\n \"WCAG 1.4.3 AA body text\",\n );\n }\n\n const failures = checks.filter((c) => !c.passes);\n return { checks, failures, passes: failures.length === 0 };\n}\n\n/* ── Categorical chart ramp ───────────────────────────────────────────────── */\n\nexport interface ChartRampReport {\n colors: string[];\n /** Series pairs that are too close under normal vision or any simulated CVD. */\n collisions: Array<{ a: number; b: number; under: \"normal\" | CvdType; distance: number }>;\n /** Series that do not clear 3:1 against a surface they may be drawn on. */\n lowContrast: Array<{ index: number; surface: string; ratio: number }>;\n /** The worst pairwise separation, across normal vision and all three dichromacies. */\n minSeparation: number;\n /** The worst contrast any series reaches against any surface it was measured on. */\n minContrast: number;\n passes: boolean;\n}\n\n/**\n * The floor for pairwise separation in OKLab, across normal vision and each dichromacy.\n *\n * CALIBRATED, not chosen. Paul Tol's \"Muted\" set — which this package ships and which is\n * a well-regarded CVD-safe palette — bottoms out at 0.059 in its light variant and 0.032\n * in the lightened dark one. A threshold above 0.059 would fail a palette that is known\n * to work, which is worse than having no check at all: an audit that cries wolf gets\n * switched off. 0.05 sits just under the known-good case.\n */\nconst MIN_SEPARATION = 0.05;\n\n/**\n * **The categorical trade-off, measured.** At a SINGLE lightness, the most series that\n * can satisfy both the 3:1 fill contrast of WCAG 1.4.11 and {@link MIN_SEPARATION} under\n * dichromacy is FOUR. Searched exhaustively over starting hue and lightness:\n *\n * n=4 best separation 0.065 — both satisfiable\n * n=5 best separation 0.041 — not satisfiable\n * n=9 best separation 0.015 — not satisfiable\n *\n * The reason is structural: dichromacy collapses the red-green axis, so hue alone stops\n * distinguishing colours once you need more than a handful, and the remaining channel is\n * LIGHTNESS — the very thing a uniform-contrast ramp holds constant. Paul Tol's set\n * varies lightness deliberately and pays for it in contrast; that is not an oversight in\n * their palette, it is the only currency left.\n *\n * So above four series this deriver varies lightness too, and reports what it gave up\n * rather than pretending both constraints were met.\n *\n * NOTE ON WHAT THIS BOUND IS. It describes the PROBLEM, not a guarantee about\n * {@link deriveChartRamp}. That function fixes lightness and starts the hue wheel at the\n * brand's own hue rather than searching for the best start, so it reaches the bound only\n * where the brand happens to sit well: sweeping 72 brand hues against the default light\n * surfaces, 7 of 72 produced a passing 4-series ramp (12 of 72 on dark), and none passed\n * at 5 or 9. Read the report it returns; do not assume a pass.\n */\nconst SINGLE_LIGHTNESS_MAX_SERIES = 4;\n\n/**\n * A categorical ramp of `count` hues, evenly spaced and equal in perceived lightness,\n * then MEASURED for separability — including under each dichromacy.\n *\n * Offered but not used by default, and the distinction matters. Evenly spaced hues at\n * one lightness are a reasonable generic answer; Paul Tol's \"Muted\" set, which this\n * package ships, is a better specific one, because it was optimised against real\n * confusion lines rather than derived from a formula. So this exists for a consumer who\n * wants their charts to follow their brand and is willing to read the report — not as\n * a silent upgrade to the default.\n */\nexport function deriveChartRamp(\n brandHex: string,\n mode: ThemeMode,\n surfaces: string[],\n count = 9,\n): ChartRampReport {\n const brand = hexToOklch(brandHex) ?? { l: 0.6, c: 0.12, h: 264 };\n const base = mode === \"light\" ? 0.58 : 0.74;\n const c = Math.max(0.09, Math.min(brand.c, 0.15));\n // Up to four series, one lightness: a scale that varies lightness implies rank, and a\n // categorical one must not. Beyond four, lightness is the only channel left that\n // survives dichromacy — see SINGLE_LIGHTNESS_MAX_SERIES — so it alternates in a\n // three-step cycle, which keeps ADJACENT series (the ones a legend puts side by side)\n // at different lightnesses as well as different hues.\n const vary = count > SINGLE_LIGHTNESS_MAX_SERIES;\n const offsets = [0, mode === \"light\" ? -0.1 : 0.1, mode === \"light\" ? 0.08 : -0.08];\n const colors = Array.from({ length: count }, (_, i) =>\n oklchToHex({\n l: vary ? base + offsets[i % offsets.length] : base,\n c,\n h: (brand.h + (360 / count) * i) % 360,\n }),\n );\n\n return measureRamp(colors, surfaces);\n}\n\n/** Audit a ramp somebody else chose — the shipped Paul Tol set, say. */\nexport function auditChartRamp(colors: string[], surfaces: string[]): ChartRampReport {\n return measureRamp(colors, surfaces);\n}\n\nfunction measureRamp(colors: string[], surfaces: string[]): ChartRampReport {\n const collisions: ChartRampReport[\"collisions\"] = [];\n const rgbs = colors.map((hex) => parseHex(hex)).filter((v): v is NonNullable<typeof v> => !!v);\n let minSeparation = Infinity;\n for (let i = 0; i < rgbs.length; i++) {\n for (let j = i + 1; j < rgbs.length; j++) {\n const normal = deltaE(rgbs[i], rgbs[j]);\n minSeparation = Math.min(minSeparation, normal);\n if (normal < MIN_SEPARATION) {\n collisions.push({ a: i, b: j, under: \"normal\", distance: normal });\n }\n for (const type of [\"protanopia\", \"deuteranopia\", \"tritanopia\"] as const) {\n const d = deltaE(simulateCvd(rgbs[i], type), simulateCvd(rgbs[j], type));\n minSeparation = Math.min(minSeparation, d);\n if (d < MIN_SEPARATION) collisions.push({ a: i, b: j, under: type, distance: d });\n }\n }\n }\n\n const lowContrast: ChartRampReport[\"lowContrast\"] = [];\n let minContrast = Infinity;\n colors.forEach((hex, index) => {\n for (const surface of surfaces) {\n const ratio = contrast(hex, surface);\n minContrast = Math.min(minContrast, ratio);\n // WCAG 1.4.11: a graphical object carrying meaning needs 3:1 against what is\n // adjacent to it. A bar the same value as the card behind it has no boundary.\n if (ratio < 3) lowContrast.push({ index, surface, ratio });\n }\n });\n\n return {\n colors,\n collisions,\n lowContrast,\n minSeparation: Number.isFinite(minSeparation) ? minSeparation : 0,\n minContrast: Number.isFinite(minContrast) ? minContrast : 0,\n passes: collisions.length === 0 && lowContrast.length === 0,\n };\n}\n\n/** Convenience: the OKLCH of a hex, for a caller inspecting an anchor. */\nexport function describe(hex: string): Oklch | null {\n const rgb = parseHex(hex);\n return rgb ? rgbToOklch(rgb) : null;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/theme/palette-derive.ts"],"sourcesContent":["import type { ThemeMode } from \"./theme-store\";\nimport type { TokenSet } from \"./palette-presets\";\nimport type { HeatStops } from \"./chart-palette\";\nimport {\n contrast,\n deltaE,\n toHex,\n hexToOklch,\n oklchToHex,\n parseHex,\n rgbToOklch,\n simulateCvd,\n solveLightness,\n} from \"./color\";\nimport type { CvdType, Oklch } from \"./color\";\nimport { brandSoft, hoverFill } from \"./contrast-tokens\";\n\n/**\n * Build a whole palette from one brand colour, plus any number of colours pinned by\n * hand, with every contrast ratio SOLVED rather than chosen and then hoped for.\n *\n * The presets this package shipped were assembled by eye and annotated with the ratios\n * they were believed to hold — `tokens.css` records \"7.0:1 and 4.8:1\", and\n * `palette-presets.ts` records \"2.67:1 … lifted they clear it at 3.30:1\". Nothing\n * computed any of them, and the audit found four of the nine default light chart hues\n * below the 3:1 that WCAG 1.4.11 requires of a graphical object. A comment is not a\n * test. Everything here is derived to a target and then measured, and\n * {@link auditPalette} returns the measurements so a caller can refuse a palette that\n * does not hold up.\n *\n * WHAT IS DERIVED AND WHAT IS NOT. The UI palette and the CATEGORICAL CHART RAMP solve\n * different problems and are deliberately kept apart. A UI colour needs contrast against\n * one known surface and carries a fixed meaning; a chart colour needs to stay separable\n * from eight unknown siblings, at roughly equal salience, with no implied order.\n * Optimising a set for one makes it worse at the other, which is why `deriveTokenSet`\n * leaves `chart` alone unless you explicitly ask for {@link deriveChartRamp}.\n */\n\n/* ── Inputs ───────────────────────────────────────────────────────────────── */\n\n/** A role whose hue may be pinned by the caller instead of chosen by the deriver. */\nexport type AnchorRole = \"brand\" | \"accent\" | \"danger\" | \"warning\" | \"success\" | \"info\";\n\nexport type PaletteAnchors = { brand: string } & Partial<Record<Exclude<AnchorRole, \"brand\">, string>>;\n\nexport interface DeriveOptions {\n anchors: PaletteAnchors;\n mode: ThemeMode;\n /**\n * How strongly the surfaces carry the brand's hue, 0–1 of the maximum useful tint.\n * 0 gives neutral greys; the shipped default is a visible warmth, because a page that\n * is very slightly the brand's hue reads as considered where a pure grey reads as\n * unstyled. Above ~0.5 the surfaces start competing with the content.\n */\n surfaceTint?: number;\n /** Contrast targets for the three text roles against the WORST surface. */\n textContrast?: { primary?: number; secondary?: number; muted?: number };\n}\n\n/* ── Outputs ──────────────────────────────────────────────────────────────── */\n\n/** The semantic layer, which lives in tokens.css rather than in `TokenSet`. */\nexport interface SemanticTokens {\n danger: string;\n dangerHover: string;\n dangerContrast: string;\n dangerBorder: string;\n /** The error line (invalid field, danger banner, destructive focus ring): as loud as\n * `dangerBorder` was before 0.15.5, so it keeps 3:1 against the surface. */\n dangerBorderStrong: string;\n dangerBg: string;\n warning: string;\n warningBorder: string;\n warningBg: string;\n info: string;\n infoBorder: string;\n infoBg: string;\n success: string;\n successBorder: string;\n successBg: string;\n /** Present only when a `accent` (secondary brand) anchor was supplied. */\n accent?: string;\n accentContrast?: string;\n accentBg?: string;\n}\n\nexport interface ContrastCheck {\n /** e.g. \"textMuted on bgPage\". */\n pair: string;\n ratio: number;\n /** What WCAG asks of this pair. */\n required: number;\n /** Which rule the requirement comes from, for a reader who wants to argue with it. */\n rule: string;\n passes: boolean;\n}\n\nexport interface ContrastReport {\n checks: ContrastCheck[];\n failures: ContrastCheck[];\n passes: boolean;\n}\n\nexport interface DerivedPalette {\n tokens: TokenSet;\n semantic: SemanticTokens;\n audit: ContrastReport;\n /** Compromises the deriver had to make, in plain words. Never silent. */\n warnings: string[];\n}\n\n/* ── The hue homes ────────────────────────────────────────────────────────── */\n\n/**\n * Where each semantic role wants to sit, and how far it may be pushed.\n *\n * A semantic colour is a convention before it is an aesthetic: danger is red because\n * every other interface the user has ever used made it red, and a \"danger\" button in\n * the brand's teal is a worse button however well it matches. So each role has a home\n * hue and a narrow licence to move — enough to get out of the brand's way when the\n * brand happens to live in the same neighbourhood, not enough to stop meaning what it\n * means. If it cannot get far enough, that is a warning, not a silent compromise.\n */\nconst HUE_HOME: Record<Exclude<AnchorRole, \"brand\" | \"accent\">, { hue: number; slack: number }> = {\n danger: { hue: 27, slack: 14 },\n warning: { hue: 75, slack: 16 },\n success: { hue: 150, slack: 20 },\n info: { hue: 240, slack: 22 },\n};\n\n/** Circular distance between two hue angles, 0–180. */\nfunction hueGap(a: number, b: number): number {\n const d = Math.abs(((a - b) % 360) + 360) % 360;\n return d > 180 ? 360 - d : d;\n}\n\n/**\n * Nudge `home` within `slack` to maximise the distance from every taken hue.\n *\n * Sampled rather than solved: the objective is a min-of-distances over a handful of\n * points on a short arc, which is piecewise-linear with kinks wherever the nearest\n * neighbour changes. Gradient methods stall on those kinks; 2° steps over a ±22° arc is\n * 23 evaluations of some trigonometry and cannot stall.\n */\nfunction placeHue(home: number, slack: number, taken: number[]): number {\n let best = home;\n let bestGap = Math.min(...taken.map((t) => hueGap(home, t)), 360);\n for (let d = -slack; d <= slack; d += 2) {\n const h = (home + d + 360) % 360;\n const gap = Math.min(...taken.map((t) => hueGap(h, t)), 360);\n // Ties go to the hue nearest home: a role should move only as far as it must.\n if (gap > bestGap + 1e-9) {\n best = h;\n bestGap = gap;\n }\n }\n return best;\n}\n\n/* ── Derivation ───────────────────────────────────────────────────────────── */\n\nconst SURFACE_L = {\n // Light: the PAGE is slightly darker than the cards on it, so a card reads as raised\n // without needing a shadow to say so. Matches the shipped presets' relationship.\n //\n // The light WELL is the page itself (0.33, docs/colour-roles-harmonization.md §5.3,\n // k26). Between the card and the page it sat 1.02–1.05:1 from the card it is inset\n // in, which is no well at all; at the page's lightness it stands out from the card\n // exactly as far as the card does from the page, and nothing re-solves, because the\n // page is already the surface every text role is solved against. Dark keeps its\n // well a step lighter than the card (1.11–1.13:1).\n light: { page: 0.912, surface: 0.945, surface2: 0.912 },\n dark: { page: 0.158, surface: 0.206, surface2: 0.249 },\n} as const;\n\n/**\n * What a hairline has to clear against the surface it divides.\n *\n * WCAG has nothing to say here — a decorative border is not a graphical object that\n * conveys information — so this is a house rule, and it is deliberately low. A border\n * that clears 3:1 is a RULE, not a hairline: it draws the eye to the box instead of to\n * what is in it. 1.5:1 is the point at which the edge is reliably findable without\n * becoming part of the composition.\n */\nconst BORDER_CONTRAST = 1.5;\n\n/** The most tint a surface can carry before it stops reading as a neutral ground. */\nconst MAX_SURFACE_CHROMA = 0.034;\n\n/**\n * The brand chroma from which the surfaces and the greys carry the brand's hue in full;\n * below it they carry it in proportion, down to none for a grey (round 0.34 BUG-8). A\n * grey has no hue — OKLCH reports 0, which is pink — and at full tint #808080 painted\n * every surface #eddde1.\n */\nconst FULL_HUE_CHROMA = 0.06;\n\n/** How much of the brand's hue the neutrals may carry: 0 for a grey, 1 from {@link FULL_HUE_CHROMA}. */\nfunction hueWeight(brand: Oklch): number {\n return Math.min(1, brand.c / FULL_HUE_CHROMA);\n}\n\nfunction surfaceSet(hue: number, mode: ThemeMode, tint: number, weight: number) {\n const c = MAX_SURFACE_CHROMA * Math.max(0, Math.min(1, tint)) * weight;\n const L = SURFACE_L[mode];\n const bgPage = oklchToHex({ l: L.page, c, h: hue });\n const bgSurface = oklchToHex({ l: L.surface, c, h: hue });\n const bgSurface2 = oklchToHex({ l: L.surface2, c, h: hue });\n // Solved, not guessed: a fixed lightness that looks right against a pale warm ground\n // disappears against a deep cold one, and both are reachable from the same `hue`\n // input. The border carries a little more chroma than the surfaces because at these\n // lightnesses a perfectly neutral hairline on a tinted ground reads as a wrong grey.\n const borderChroma = c * 1.6;\n // Solved against the surface the hairline is HARDEST to see on, not against one of\n // the three. Solving against `bgSurface` alone left it at 1.36:1 on `bgPage`, so the\n // target and the audit disagreed about the same border.\n const hardest = [bgPage, bgSurface, bgSurface2].reduce((a, b) =>\n contrast(a, mode === \"light\" ? \"#000000\" : \"#ffffff\") <\n contrast(b, mode === \"light\" ? \"#000000\" : \"#ffffff\")\n ? a\n : b,\n );\n const borderL = solveLightness(\n BORDER_CONTRAST,\n parseHex(hardest)!,\n hue,\n borderChroma,\n mode === \"light\" ? \"darker\" : \"lighter\",\n );\n return {\n bgPage,\n bgSurface,\n bgSurface2,\n border: oklchToHex({ l: borderL, c: borderChroma, h: hue }),\n };\n}\n\n/** Solve a colour at this hue that clears `target` against `against`, keeping chroma. */\nfunction solveAgainst(hue: number, chroma: number, target: number, against: string, mode: ThemeMode): string {\n const bg = parseHex(against)!;\n const l = solveLightness(target, bg, hue, chroma, mode === \"light\" ? \"darker\" : \"lighter\");\n return oklchToHex({ l, c: chroma, h: hue });\n}\n\n/** Whichever of near-white / near-black reads better ON `fill`. */\nfunction contrastOn(fill: string): string {\n const light = \"#ffffff\";\n const dark = \"#12100e\";\n return contrast(fill, light) >= contrast(fill, dark) ? light : dark;\n}\n\n/** A soft tint of `hue` sitting on the surface — a badge fill, not a button fill. */\nfunction tintOn(hue: number, chroma: number, surface: string, mode: ThemeMode): string {\n const s = hexToOklch(surface)!;\n // Toward the colour, but only far enough to be seen: these back TEXT of the same hue,\n // and a strong tint leaves the text nowhere to go.\n const l = mode === \"light\" ? s.l - 0.055 : s.l + 0.055;\n return oklchToHex({ l, c: Math.min(chroma * 0.45, 0.06), h: hue });\n}\n\nexport function derivePalette({\n anchors,\n mode,\n surfaceTint = 0.55,\n textContrast,\n}: DeriveOptions): DerivedPalette {\n const warnings: string[] = [];\n const brand = hexToOklch(anchors.brand);\n if (!brand) {\n throw new Error(\n `derivePalette: brand \"${anchors.brand}\" is not a #rgb or #rrggbb colour. ` +\n `Anchors must be hex — a named colour or an rgba() string cannot be converted.`,\n );\n }\n\n const targets = { primary: 10, secondary: 7, muted: 4.6, ...textContrast };\n\n // ── Surfaces, from the brand's hue.\n const weight = hueWeight(brand);\n const surfaces = surfaceSet(brand.h, mode, surfaceTint, weight);\n // Every text role is solved against the WORST of the three, so a token is legible\n // wherever it lands. Solving against `bgSurface` alone is the mistake that makes a\n // muted label fail on the page background it also sits on.\n const worstSurface = [surfaces.bgPage, surfaces.bgSurface, surfaces.bgSurface2].reduce((a, b) =>\n contrast(a, mode === \"light\" ? \"#000000\" : \"#ffffff\") <\n contrast(b, mode === \"light\" ? \"#000000\" : \"#ffffff\")\n ? a\n : b,\n );\n\n // ── Text. A trace of the brand hue keeps the greys from reading cold on a warm page.\n const textChroma = 0.014 * weight;\n const textPrimary = solveAgainst(brand.h, textChroma, targets.primary, worstSurface, mode);\n const textSecondary = solveAgainst(brand.h, textChroma, targets.secondary, worstSurface, mode);\n const textMuted = solveAgainst(brand.h, textChroma, targets.muted, worstSurface, mode);\n\n // The darkest fill text sits on (the lightest, in dark): the worst surface, or a\n // hovered row on the card (`--bg-hover`), which in light is a shade darker than the\n // page. The colours that are solved exactly to 4.5:1 — money, the semantic text — are\n // solved against this, so they hold on a hovered row too (0.33, §12.10). The text\n // roles above keep their margin (4.6:1 and up) and need no second solve.\n const hover = hoverFill({ textPrimary, bgSurface: surfaces.bgSurface });\n const worstText = [worstSurface, hover].reduce((a, b) =>\n contrast(a, mode === \"light\" ? \"#000000\" : \"#ffffff\") <\n contrast(b, mode === \"light\" ? \"#000000\" : \"#ffffff\")\n ? a\n : b,\n );\n\n // ── Brand. Keep the hue the caller asked for; move only the lightness, and only as\n // far as 3:1 against the worst surface — WCAG 1.4.11, since a brand-filled control is\n // a graphical object whose boundary has to be perceivable.\n const brandChroma = Math.max(brand.c, 0.06);\n const brandRatio = contrast(anchors.brand, worstSurface);\n // NORMALISED, never the caller's raw string. `parseHex` accepts \"4f46e5\" and \"#abc\",\n // and passing either through unchanged put a value in the TokenSet that is not a CSS\n // colour — it then fails silently at paint time, three layers from here.\n let brandHex =\n brandRatio >= 3\n ? toHex(parseHex(anchors.brand)!)\n : solveAgainst(brand.h, brandChroma, 3, worstSurface, mode);\n if (brandRatio < 3) {\n warnings.push(\n `brand ${anchors.brand} sits at ${brandRatio.toFixed(2)}:1 against the ${mode} surfaces, ` +\n `below the 3:1 WCAG 1.4.11 asks of a control boundary. Lightness was adjusted to ` +\n `${brandHex}; hue and chroma are unchanged.`,\n );\n }\n // `--brand-muted` is the brand AS TEXT — a soft brand chip's label, an outline chip, a\n // current link — and tokens.css derives it: 62 % brand into the ink. A brand solved\n // to 3:1 left it at 4.43–4.51:1 in three dark presets (0.33, §5.5), so it gets the\n // text floor here: the brand moves away from the surfaces, a step at a time, until its\n // muted form clears 4.5:1 on the worst fill and on its own soft chip, at rest\n // (`--brand-bg`) and hovered (`--brand-bg-hover`, the harder of the two: §12.11).\n const brandMutedWorst = (hex: string) => {\n const soft = brandSoft({ brand: hex, textPrimary, bgSurface: surfaces.bgSurface });\n return Math.min(\n contrast(soft.brandMuted, worstText),\n contrast(soft.brandMuted, soft.brandBg),\n contrast(soft.brandMuted, soft.brandBgHover),\n );\n };\n for (let i = 0; i < 40 && brandMutedWorst(brandHex) < 4.5; i++) {\n const lch = hexToOklch(brandHex)!;\n brandHex = oklchToHex({ ...lch, l: mode === \"light\" ? lch.l - 0.005 : lch.l + 0.005 });\n }\n if (brandMutedWorst(brandHex) < 4.5) {\n warnings.push(\n `the brand as text (--brand-muted) reaches only ${brandMutedWorst(brandHex).toFixed(2)}:1 ` +\n `against the ${mode} surfaces (needs 4.5:1).`,\n );\n }\n const brandLch = hexToOklch(brandHex)!;\n const brandContrast = contrastOn(brandHex);\n const brandHover = oklchToHex({\n ...brandLch,\n // Hover moves AWAY from the colour of the text on it (0.33, §5.5): darker under\n // white, lighter under a dark ink. It used to move away from the page, which in dark\n // lightened a fill that carries WHITE text, toward its own label: 4.07:1.\n l: brandContrast === \"#ffffff\" ? brandLch.l - 0.06 : brandLch.l + 0.06,\n });\n const onBrand = contrast(brandHex, brandContrast);\n if (onBrand < 4.5) {\n warnings.push(\n `text on the brand fill reaches only ${onBrand.toFixed(2)}:1 (needs 4.5:1). ` +\n `A mid-lightness, high-chroma brand cannot carry legible text at any ink; ` +\n `use it as an accent and keep primary buttons on a darker or lighter variant.`,\n );\n }\n\n // ── Semantic roles. Anchors are honoured exactly; the rest are placed away from the\n // brand and from each other, within each role's licence to move.\n const taken: number[] = [brandLch.h];\n const accentLch = anchors.accent ? hexToOklch(anchors.accent) : null;\n if (anchors.accent && !accentLch) {\n warnings.push(`accent \"${anchors.accent}\" is not a hex colour and was ignored.`);\n }\n if (accentLch) taken.push(accentLch.h);\n\n const semanticHue = {} as Record<Exclude<AnchorRole, \"brand\" | \"accent\">, number>;\n const semanticChroma = {} as Record<Exclude<AnchorRole, \"brand\" | \"accent\">, number>;\n for (const role of [\"danger\", \"warning\", \"success\", \"info\"] as const) {\n const pinned = anchors[role] ? hexToOklch(anchors[role]!) : null;\n if (anchors[role] && !pinned) {\n warnings.push(`${role} \"${anchors[role]}\" is not a hex colour and was ignored.`);\n }\n const home = HUE_HOME[role];\n const hue = pinned ? pinned.h : placeHue(home.hue, home.slack, taken);\n if (!pinned) {\n const gap = Math.min(...taken.map((t) => hueGap(hue, t)));\n if (gap < 20) {\n warnings.push(\n `${role} could only reach ${gap.toFixed(0)}° from the nearest pinned hue, which is ` +\n `too close to tell apart at a glance. Pin ${role} explicitly, or move the brand.`,\n );\n }\n }\n semanticHue[role] = hue;\n semanticChroma[role] = pinned ? Math.max(pinned.c, 0.08) : 0.13;\n taken.push(hue);\n }\n\n /**\n * A semantic colour has two jobs and therefore two backgrounds: plain text on the\n * page, and the label inside its own tinted badge. The badge is the harder of the\n * two — it is a step toward the colour — so solving only against the surface produced\n * a badge at 4.1:1 while the loose text passed, which is the failure mode that is\n * hardest to notice because nine tenths of the uses look fine.\n */\n const sem = (role: Exclude<AnchorRole, \"brand\" | \"accent\">) => {\n const hue = semanticHue[role];\n const chroma = semanticChroma[role];\n const bg = tintOn(hue, chroma, surfaces.bgSurface, mode);\n const onSurface = solveLightness(\n 4.5,\n parseHex(worstText)!,\n hue,\n chroma,\n mode === \"light\" ? \"darker\" : \"lighter\",\n );\n const onTint = solveLightness(\n 4.5,\n parseHex(bg)!,\n hue,\n chroma,\n mode === \"light\" ? \"darker\" : \"lighter\",\n );\n const l = mode === \"light\" ? Math.min(onSurface, onTint) : Math.max(onSurface, onTint);\n return oklchToHex({ l, c: chroma, h: hue });\n };\n\n const danger = sem(\"danger\");\n const dangerLch = hexToOklch(danger)!;\n const semantic: SemanticTokens = {\n danger,\n dangerHover: oklchToHex({\n ...dangerLch,\n l: mode === \"light\" ? dangerLch.l - 0.06 : dangerLch.l + 0.06,\n }),\n dangerContrast: contrastOn(danger),\n // The tone border follows its siblings' lightness in dark mode (warning 0.44, info\n // and success 0.45) — a soft frame; the strong line keeps the old, louder recipe.\n dangerBorder: oklchToHex({\n l: mode === \"light\" ? dangerLch.l + 0.22 : 0.45,\n c: semanticChroma.danger,\n h: semanticHue.danger,\n }),\n dangerBorderStrong: oklchToHex({\n l: mode === \"light\" ? dangerLch.l + 0.22 : dangerLch.l - 0.22,\n c: semanticChroma.danger,\n h: semanticHue.danger,\n }),\n dangerBg: tintOn(semanticHue.danger, semanticChroma.danger, surfaces.bgSurface, mode),\n warning: sem(\"warning\"),\n warningBorder: oklchToHex({\n l: mode === \"light\" ? 0.82 : 0.44,\n c: semanticChroma.warning,\n h: semanticHue.warning,\n }),\n warningBg: tintOn(semanticHue.warning, semanticChroma.warning, surfaces.bgSurface, mode),\n info: sem(\"info\"),\n infoBorder: oklchToHex({\n l: mode === \"light\" ? 0.8 : 0.45,\n c: semanticChroma.info,\n h: semanticHue.info,\n }),\n infoBg: tintOn(semanticHue.info, semanticChroma.info, surfaces.bgSurface, mode),\n success: sem(\"success\"),\n successBorder: oklchToHex({\n l: mode === \"light\" ? 0.81 : 0.45,\n c: semanticChroma.success,\n h: semanticHue.success,\n }),\n successBg: tintOn(semanticHue.success, semanticChroma.success, surfaces.bgSurface, mode),\n };\n\n if (accentLch) {\n const accent = solveAgainst(accentLch.h, Math.max(accentLch.c, 0.06), 3, worstSurface, mode);\n semantic.accent = accent;\n semantic.accentContrast = contrastOn(accent);\n semantic.accentBg = tintOn(accentLch.h, Math.max(accentLch.c, 0.06), surfaces.bgSurface, mode);\n }\n\n // ── Money. A THIRD system again: these are data colours with fixed meanings, and the\n // one rule that outranks everything is that income and expense must never be the\n // red/green pair — which is why the shipped presets use teal/amber/violet. Derived\n // here at fixed hues rather than from the brand, for the same reason `--danger` is:\n // a consumer who rebrands does not thereby change what \"money out\" looks like.\n const money = (hue: number, target: number) => solveAgainst(hue, 0.12, target, worstText, mode);\n const moneyIncome = money(175, 4.5);\n const moneyExpense = money(70, 4.5);\n const moneyNet = money(300, 4.5);\n // \"No money has moved\": a quiet grey at a fixed lightness, but printed as TEXT (the\n // numpad's sign, a future row's figure), so it gets the text floor too (0.33). The\n // fixed lightness left it at 4.24:1 on four light pages.\n const neutralChroma = 0.012 * weight;\n const neutralFloor = solveLightness(4.5, parseHex(worstText)!, brand.h, neutralChroma, mode === \"light\" ? \"darker\" : \"lighter\");\n const moneyNeutral = oklchToHex({\n l: mode === \"light\" ? Math.min(0.52, neutralFloor) : Math.max(0.72, neutralFloor),\n c: neutralChroma,\n h: brand.h,\n });\n\n const tokens: TokenSet = {\n ...surfaces,\n textPrimary,\n textSecondary,\n textMuted,\n brand: brandHex,\n brandHover,\n brandContrast,\n moneyIncome,\n moneyExpense,\n moneyNet,\n moneyNeutral,\n // Left alone. See the note at the top of this file about why the categorical ramp is\n // not derived from the brand unless the caller asks.\n //\n // ⚠️ EMPTY, not absent: a caller who hands this straight to `applyTokenSet` keeps\n // whatever `--chart-1…9` were already on the element. That is deliberate — the ramp\n // is a separate decision and clearing it would leave charts unpainted — but it means\n // a derived palette applied over another preset is a MIX until you also supply a\n // ramp. `deriveChartRamp` is how you supply one.\n chart: [],\n heat: deriveHeat(moneyIncome, moneyExpense, surfaces, mode),\n };\n\n return { tokens, semantic, audit: auditPalette(tokens, semantic), warnings };\n}\n\n/**\n * Heatmap stops, reusing the money pair.\n *\n * `under` is the good direction and `over` the bad one, at the SAME hues as\n * `moneyIncome`/`moneyExpense` — so a heatmap cell and the figure printed beside it\n * agree about which way is which, rather than each inventing its own convention.\n */\nfunction deriveHeat(\n income: string,\n expense: string,\n surfaces: { bgSurface2: string },\n mode: ThemeMode,\n): HeatStops {\n const exp = hexToOklch(expense)!;\n return {\n neutral: surfaces.bgSurface2,\n under: income,\n over: expense,\n seqLow: oklchToHex({ l: mode === \"light\" ? 0.93 : 0.26, c: 0.05, h: exp.h }),\n seqHigh: expense,\n empty: mode === \"light\" ? \"rgba(120,110,95,0.14)\" : \"rgba(160,170,190,0.10)\",\n };\n}\n\n/* ── Audit ────────────────────────────────────────────────────────────────── */\n\n/**\n * Measure every pair that has a requirement, and say which ones fail.\n *\n * This is the part the shipped presets were missing. `derivePalette` runs it on the way\n * out, and the preset test runs it over everything the package ships, so a palette that\n * does not hold up cannot be merged with a comment claiming that it does.\n */\nexport function auditPalette(t: TokenSet, semantic?: SemanticTokens): ContrastReport {\n const checks: ContrastCheck[] = [];\n const surfaces: Array<[string, string]> = [\n [\"bgPage\", t.bgPage],\n [\"bgSurface\", t.bgSurface],\n [\"bgSurface2\", t.bgSurface2],\n ];\n // A hovered row on the card (`--bg-hover`) carries the same text as the card, and in\n // light it is the darkest fill that text sits on (0.33, §12.10). Text is measured on\n // it; the brand fill and the hairline, which are not text, are not.\n const hover = hoverFill(t);\n const textGrounds: Array<[string, string]> = [...surfaces, [\"bgHover\", hover]];\n // `--brand-muted`, `--brand-bg` and `--brand-bg-hover`, mixed as tokens.css mixes them.\n const { brandMuted, brandBg, brandBgHover } = brandSoft(t);\n\n // The 0.05 of slack is for a pair with a color-mix on one side, and only for that: the\n // browser mixes in float and paints the result, where this mixes and rounds to hex, so\n // the two can differ by a hair. Hex against hex is what the page paints, measured\n // exactly — the slack used to cover those too, and passed the Contrast preset's dark\n // brand fill at 2.998:1 (round 0.34 BUG-8).\n const MIXED = /\\b(bgHover|brandMuted|brandBg|brandBgHover)\\b/;\n const add = (pair: string, fg: string, bg: string, required: number, rule: string) => {\n const ratio = contrast(fg, bg);\n const slack = MIXED.test(pair) ? 0.05 : 0;\n checks.push({ pair, ratio, required, rule, passes: ratio >= required - slack });\n };\n\n for (const [name, bg] of surfaces) {\n add(`brand on ${name}`, t.brand, bg, 3, \"WCAG 1.4.11 graphical object\");\n add(`border on ${name}`, t.border, bg, 1.1, \"house rule: a hairline must be findable\");\n }\n for (const [name, bg] of textGrounds) {\n add(`textPrimary on ${name}`, t.textPrimary, bg, 7, \"WCAG 1.4.6 AAA body text\");\n add(`textSecondary on ${name}`, t.textSecondary, bg, 4.5, \"WCAG 1.4.3 AA body text\");\n add(`textMuted on ${name}`, t.textMuted, bg, 4.5, \"WCAG 1.4.3 AA body text\");\n add(`brandMuted on ${name}`, brandMuted, bg, 4.5, \"WCAG 1.4.3 — the brand as text\");\n for (const [key, hex] of [\n [\"moneyIncome\", t.moneyIncome],\n [\"moneyExpense\", t.moneyExpense],\n [\"moneyNet\", t.moneyNet],\n // Not a figure's colour but still printed as one (the numpad's sign, a future\n // row's amount) — measured since 0.33, when it was found at 4.24:1.\n [\"moneyNeutral\", t.moneyNeutral],\n ] as const) {\n add(`${key} on ${name}`, hex, bg, 4.5, \"WCAG 1.4.3 — these are rendered as TEXT\");\n }\n }\n\n add(\"brandContrast on brand\", t.brandContrast, t.brand, 4.5, \"WCAG 1.4.3 AA body text\");\n // A hovered brand button carries the same label (0.33): the derived dark presets\n // lightened the hover toward their white label and left it at 4.07:1.\n add(\"brandContrast on brandHover\", t.brandContrast, t.brandHover, 4.5, \"WCAG 1.4.3 AA body text\");\n add(\"brandMuted on brandBg\", brandMuted, brandBg, 4.5, \"WCAG 1.4.3 — a soft brand chip's label\");\n // The same label on the chip hovered (§12.11): a current link, a selected day. At 70 %\n // brand the muted text read 4.08–4.42:1 here (Default and Moss light; Ink, Moss, Plum\n // and Contrast dark).\n add(\"brandMuted on brandBgHover\", brandMuted, brandBgHover, 4.5, \"WCAG 1.4.3 — a hovered soft brand chip's label\");\n\n if (semantic) {\n for (const [name, fg] of [\n [\"danger\", semantic.danger],\n [\"warning\", semantic.warning],\n [\"info\", semantic.info],\n [\"success\", semantic.success],\n ] as const) {\n add(`${name} on bgSurface`, fg, t.bgSurface, 4.5, \"WCAG 1.4.3 — rendered as text\");\n add(`${name} on bgHover`, fg, hover, 4.5, \"WCAG 1.4.3 — rendered as text, on a hovered row\");\n }\n add(\"danger on dangerBg\", semantic.danger, semantic.dangerBg, 4.5, \"WCAG 1.4.3 — badge text\");\n add(\"warning on warningBg\", semantic.warning, semantic.warningBg, 4.5, \"WCAG 1.4.3 — badge text\");\n add(\"info on infoBg\", semantic.info, semantic.infoBg, 4.5, \"WCAG 1.4.3 — badge text\");\n add(\"success on successBg\", semantic.success, semantic.successBg, 4.5, \"WCAG 1.4.3 — badge text\");\n add(\n \"dangerContrast on danger\",\n semantic.dangerContrast,\n semantic.danger,\n 4.5,\n \"WCAG 1.4.3 AA body text\",\n );\n }\n\n const failures = checks.filter((c) => !c.passes);\n return { checks, failures, passes: failures.length === 0 };\n}\n\n/* ── Categorical chart ramp ───────────────────────────────────────────────── */\n\nexport interface ChartRampReport {\n colors: string[];\n /** Series pairs that are too close under normal vision or any simulated CVD. */\n collisions: Array<{ a: number; b: number; under: \"normal\" | CvdType; distance: number }>;\n /** Series that do not clear 3:1 against a surface they may be drawn on. */\n lowContrast: Array<{ index: number; surface: string; ratio: number }>;\n /** The worst pairwise separation, across normal vision and all three dichromacies. */\n minSeparation: number;\n /** The worst contrast any series reaches against any surface it was measured on. */\n minContrast: number;\n passes: boolean;\n}\n\n/**\n * The floor for pairwise separation in OKLab, across normal vision and each dichromacy.\n *\n * CALIBRATED, not chosen. Paul Tol's \"Muted\" set — which this package ships and which is\n * a well-regarded CVD-safe palette — bottoms out at 0.059 in its light variant and 0.032\n * in the lightened dark one. A threshold above 0.059 would fail a palette that is known\n * to work, which is worse than having no check at all: an audit that cries wolf gets\n * switched off. 0.05 sits just under the known-good case.\n */\nconst MIN_SEPARATION = 0.05;\n\n/**\n * **The categorical trade-off, measured.** At a SINGLE lightness, the most series that\n * can satisfy both the 3:1 fill contrast of WCAG 1.4.11 and {@link MIN_SEPARATION} under\n * dichromacy is FOUR. Searched exhaustively over starting hue and lightness:\n *\n * n=4 best separation 0.065 — both satisfiable\n * n=5 best separation 0.041 — not satisfiable\n * n=9 best separation 0.015 — not satisfiable\n *\n * The reason is structural: dichromacy collapses the red-green axis, so hue alone stops\n * distinguishing colours once you need more than a handful, and the remaining channel is\n * LIGHTNESS — the very thing a uniform-contrast ramp holds constant. Paul Tol's set\n * varies lightness deliberately and pays for it in contrast; that is not an oversight in\n * their palette, it is the only currency left.\n *\n * So above four series this deriver varies lightness too, and reports what it gave up\n * rather than pretending both constraints were met.\n *\n * NOTE ON WHAT THIS BOUND IS. It describes the PROBLEM, not a guarantee about\n * {@link deriveChartRamp}. That function fixes lightness and starts the hue wheel at the\n * brand's own hue rather than searching for the best start, so it reaches the bound only\n * where the brand happens to sit well: sweeping 72 brand hues against the default light\n * surfaces, 7 of 72 produced a passing 4-series ramp (12 of 72 on dark), and none passed\n * at 5 or 9. Read the report it returns; do not assume a pass.\n */\nconst SINGLE_LIGHTNESS_MAX_SERIES = 4;\n\n/**\n * A categorical ramp of `count` hues, evenly spaced and equal in perceived lightness,\n * then MEASURED for separability — including under each dichromacy.\n *\n * Offered but not used by default, and the distinction matters. Evenly spaced hues at\n * one lightness are a reasonable generic answer; Paul Tol's \"Muted\" set, which this\n * package ships, is a better specific one, because it was optimised against real\n * confusion lines rather than derived from a formula. So this exists for a consumer who\n * wants their charts to follow their brand and is willing to read the report — not as\n * a silent upgrade to the default.\n */\nexport function deriveChartRamp(\n brandHex: string,\n mode: ThemeMode,\n surfaces: string[],\n count = 9,\n): ChartRampReport {\n const brand = hexToOklch(brandHex) ?? { l: 0.6, c: 0.12, h: 264 };\n const base = mode === \"light\" ? 0.58 : 0.74;\n const c = Math.max(0.09, Math.min(brand.c, 0.15));\n // Up to four series, one lightness: a scale that varies lightness implies rank, and a\n // categorical one must not. Beyond four, lightness is the only channel left that\n // survives dichromacy — see SINGLE_LIGHTNESS_MAX_SERIES — so it alternates in a\n // three-step cycle, which keeps ADJACENT series (the ones a legend puts side by side)\n // at different lightnesses as well as different hues.\n const vary = count > SINGLE_LIGHTNESS_MAX_SERIES;\n const offsets = [0, mode === \"light\" ? -0.1 : 0.1, mode === \"light\" ? 0.08 : -0.08];\n const colors = Array.from({ length: count }, (_, i) =>\n oklchToHex({\n l: vary ? base + offsets[i % offsets.length] : base,\n c,\n h: (brand.h + (360 / count) * i) % 360,\n }),\n );\n\n return measureRamp(colors, surfaces);\n}\n\n/** Audit a ramp somebody else chose — the shipped Paul Tol set, say. */\nexport function auditChartRamp(colors: string[], surfaces: string[]): ChartRampReport {\n return measureRamp(colors, surfaces);\n}\n\nfunction measureRamp(colors: string[], surfaces: string[]): ChartRampReport {\n const collisions: ChartRampReport[\"collisions\"] = [];\n const rgbs = colors.map((hex) => parseHex(hex)).filter((v): v is NonNullable<typeof v> => !!v);\n let minSeparation = Infinity;\n for (let i = 0; i < rgbs.length; i++) {\n for (let j = i + 1; j < rgbs.length; j++) {\n const normal = deltaE(rgbs[i], rgbs[j]);\n minSeparation = Math.min(minSeparation, normal);\n if (normal < MIN_SEPARATION) {\n collisions.push({ a: i, b: j, under: \"normal\", distance: normal });\n }\n for (const type of [\"protanopia\", \"deuteranopia\", \"tritanopia\"] as const) {\n const d = deltaE(simulateCvd(rgbs[i], type), simulateCvd(rgbs[j], type));\n minSeparation = Math.min(minSeparation, d);\n if (d < MIN_SEPARATION) collisions.push({ a: i, b: j, under: type, distance: d });\n }\n }\n }\n\n const lowContrast: ChartRampReport[\"lowContrast\"] = [];\n let minContrast = Infinity;\n colors.forEach((hex, index) => {\n for (const surface of surfaces) {\n const ratio = contrast(hex, surface);\n minContrast = Math.min(minContrast, ratio);\n // WCAG 1.4.11: a graphical object carrying meaning needs 3:1 against what is\n // adjacent to it. A bar the same value as the card behind it has no boundary.\n if (ratio < 3) lowContrast.push({ index, surface, ratio });\n }\n });\n\n return {\n colors,\n collisions,\n lowContrast,\n minSeparation: Number.isFinite(minSeparation) ? minSeparation : 0,\n minContrast: Number.isFinite(minContrast) ? minContrast : 0,\n passes: collisions.length === 0 && lowContrast.length === 0,\n };\n}\n\n/** Convenience: the OKLCH of a hex, for a caller inspecting an anchor. */\nexport function describe(hex: string): Oklch | null {\n const rgb = parseHex(hex);\n return rgb ? rgbToOklch(rgb) : null;\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,5 @@
1
- import { HeatStops } from './chart-palette.js';
2
-
3
- interface TokenSet {
1
+ import type { HeatStops } from "./chart-palette.js";
2
+ export interface TokenSet {
4
3
  bgPage: string;
5
4
  bgSurface: string;
6
5
  bgSurface2: string;
@@ -18,31 +17,37 @@ interface TokenSet {
18
17
  chart: string[];
19
18
  heat: HeatStops;
20
19
  }
21
- interface PalettePreset {
20
+ export interface PalettePreset {
22
21
  id: string;
23
22
  name: string;
24
23
  blurb: string;
25
24
  light: TokenSet;
26
25
  dark: TokenSet;
27
26
  }
28
- declare const DEFAULT_PRESET: PalettePreset;
29
- declare const ALTERNATIVE_PRESETS: PalettePreset[];
30
- declare const IMPRINT_PRESET: PalettePreset;
27
+ export declare const DEFAULT_PRESET: PalettePreset;
28
+ export declare const IMPRINT_PRESET: PalettePreset;
31
29
  /**
32
30
  * Presets DERIVED rather than picked, by `derivePalette` from one brand colour each.
33
31
  *
34
32
  * Every text role here was solved to a contrast target against the worst of the three
35
33
  * surfaces it can land on, every semantic colour against both the page and its own badge
36
- * tint, and the whole set is re-checked by `derived-presets.test.ts` — which re-runs the
37
- * deriver and fails if these committed values drift from what it now produces.
34
+ * tint, and the whole set is re-checked by `__tests__/palette-audit.test.ts` ("derived
35
+ * presets") — which re-runs the deriver and fails if these committed values drift from
36
+ * what it now produces.
38
37
  *
39
38
  * They are committed rather than derived at import because deriving eight token sets
40
39
  * costs ~34ms, and charging every consumer that at startup for palettes most of them
41
40
  * will never select is the wrong trade. The test is what keeps the two in agreement.
41
+ *
42
+ * Regenerated in 0.34 (round 0.34 BUG-8): the solve now measures the hex it ships rather
43
+ * than the float before rounding, and the audit no longer lets a hex pair pass 0.05 under
44
+ * its threshold. 52 values moved one step (66 counting the heat stops that repeat them);
45
+ * Contrast's neutrals lost half their slate tint, its brand having half the chroma at
46
+ * which the neutrals carry a hue in full.
42
47
  */
43
- declare const DERIVED_PRESETS: PalettePreset[];
44
- declare const PALETTES: PalettePreset[];
45
- declare function presetById(id: string): PalettePreset;
48
+ export declare const DERIVED_PRESETS: PalettePreset[];
49
+ export declare const PALETTES: PalettePreset[];
50
+ export declare function presetById(id: string): PalettePreset;
46
51
  /**
47
52
  * Write a token set onto an element's inline style as CSS custom properties.
48
53
  *
@@ -67,6 +72,4 @@ declare function presetById(id: string): PalettePreset;
67
72
  * contrast cooperate without knowing each other: a palette change re-applies through
68
73
  * here and keeps the contrast, and a contrast change re-applies the set remembered here.
69
74
  */
70
- declare function applyTokenSet(el: HTMLElement, t: TokenSet, contrast?: boolean): void;
71
-
72
- export { ALTERNATIVE_PRESETS, DEFAULT_PRESET, DERIVED_PRESETS, IMPRINT_PRESET, PALETTES, type PalettePreset, type TokenSet, applyTokenSet, presetById };
75
+ export declare function applyTokenSet(el: HTMLElement, t: TokenSet, contrast?: boolean): void;