react-native-terra-ui 0.7.2 → 0.8.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 (252) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +1 -1
  3. package/lib/module/components/avatar/Avatar.js +20 -20
  4. package/lib/module/components/avatar/Avatar.js.map +1 -1
  5. package/lib/module/components/button/Button.js +11 -11
  6. package/lib/module/components/button/Button.js.map +1 -1
  7. package/lib/module/components/chip/Chip.js +32 -32
  8. package/lib/module/components/chip/Chip.js.map +1 -1
  9. package/lib/module/components/empty-state/EmptyState.js +3 -3
  10. package/lib/module/components/empty-state/EmptyState.js.map +1 -1
  11. package/lib/module/components/header/variants/LargeTitleHeader/index.js +30 -32
  12. package/lib/module/components/header/variants/LargeTitleHeader/index.js.map +1 -1
  13. package/lib/module/components/header/variants/TitleHeader/index.js +26 -18
  14. package/lib/module/components/header/variants/TitleHeader/index.js.map +1 -1
  15. package/lib/module/components/icon/Icon.js +3 -3
  16. package/lib/module/components/page-indicator/hooks/use-page-indicator-colors.js +2 -2
  17. package/lib/module/components/screen/Screen.js +63 -34
  18. package/lib/module/components/screen/Screen.js.map +1 -1
  19. package/lib/module/components/screen/ScreenContext.js +28 -9
  20. package/lib/module/components/screen/ScreenContext.js.map +1 -1
  21. package/lib/module/components/screen/ScreenFlatList.js +4 -162
  22. package/lib/module/components/screen/ScreenFlatList.js.map +1 -1
  23. package/lib/module/components/screen/ScreenList.js +81 -97
  24. package/lib/module/components/screen/ScreenList.js.map +1 -1
  25. package/lib/module/components/screen/ScreenScrollView.js +64 -115
  26. package/lib/module/components/screen/ScreenScrollView.js.map +1 -1
  27. package/lib/module/components/screen/hooks/use-screen-ref.js +18 -0
  28. package/lib/module/components/screen/hooks/use-screen-ref.js.map +1 -0
  29. package/lib/module/components/screen/hooks/use-screen-scroll-handler.js +19 -0
  30. package/lib/module/components/screen/hooks/use-screen-scroll-handler.js.map +1 -0
  31. package/lib/module/components/screen/index.js.map +1 -1
  32. package/lib/module/components/screen/parts/ScreenFrame.js +47 -0
  33. package/lib/module/components/screen/parts/ScreenFrame.js.map +1 -0
  34. package/lib/module/components/screen/parts/ScreenHeaderAppearance.js +43 -0
  35. package/lib/module/components/screen/parts/ScreenHeaderAppearance.js.map +1 -0
  36. package/lib/module/components/screen/parts/ScreenPlaceholder.js +11 -13
  37. package/lib/module/components/screen/parts/ScreenPlaceholder.js.map +1 -1
  38. package/lib/module/components/screen/parts/ScreenSafeArea.android.js +27 -0
  39. package/lib/module/components/screen/parts/ScreenSafeArea.android.js.map +1 -0
  40. package/lib/module/components/screen/parts/ScreenSafeArea.js +26 -0
  41. package/lib/module/components/screen/parts/ScreenSafeArea.js.map +1 -0
  42. package/lib/module/components/screen/utils.js +18 -9
  43. package/lib/module/components/screen/utils.js.map +1 -1
  44. package/lib/module/components/spinner/Spinner.js +2 -2
  45. package/lib/module/components/text/Text.js +1 -1
  46. package/lib/module/components/toast/Toast.js +13 -13
  47. package/lib/module/components/toast/Toast.js.map +1 -1
  48. package/lib/module/components/toolbar/Toolbar.js +2 -2
  49. package/lib/module/context/ThemeProvider.js +22 -39
  50. package/lib/module/context/ThemeProvider.js.map +1 -1
  51. package/lib/module/context/index.js +1 -1
  52. package/lib/module/context/index.js.map +1 -1
  53. package/lib/module/theme/breakpoints.js +1 -1
  54. package/lib/module/theme/define-config.js +21 -0
  55. package/lib/module/theme/define-config.js.map +1 -0
  56. package/lib/module/theme/diagnostics.js +13 -0
  57. package/lib/module/theme/diagnostics.js.map +1 -0
  58. package/lib/module/theme/errors.js +15 -0
  59. package/lib/module/theme/errors.js.map +1 -0
  60. package/lib/module/theme/index.js +7 -1
  61. package/lib/module/theme/index.js.map +1 -1
  62. package/lib/module/theme/legacy-tokens.js +119 -0
  63. package/lib/module/theme/legacy-tokens.js.map +1 -0
  64. package/lib/module/theme/registry.js +122 -130
  65. package/lib/module/theme/registry.js.map +1 -1
  66. package/lib/module/theme/resolve-config.js +346 -0
  67. package/lib/module/theme/resolve-config.js.map +1 -0
  68. package/lib/module/theme/runtime.js +57 -12
  69. package/lib/module/theme/runtime.js.map +1 -1
  70. package/lib/module/theme/screen-margin.js +6 -14
  71. package/lib/module/theme/screen-margin.js.map +1 -1
  72. package/lib/module/theme/screen-padding.js +17 -0
  73. package/lib/module/theme/screen-padding.js.map +1 -0
  74. package/lib/module/theme/selection-store.js +75 -0
  75. package/lib/module/theme/selection-store.js.map +1 -0
  76. package/lib/module/theme/theme.js +81 -36
  77. package/lib/module/theme/theme.js.map +1 -1
  78. package/lib/module/theme/tokens/canonical-color-keys.js +102 -0
  79. package/lib/module/theme/tokens/canonical-color-keys.js.map +1 -0
  80. package/lib/module/theme/tokens/dark.js +72 -88
  81. package/lib/module/theme/tokens/dark.js.map +1 -1
  82. package/lib/module/theme/tokens/light.js +69 -83
  83. package/lib/module/theme/tokens/light.js.map +1 -1
  84. package/lib/module/theme/tokens/primitives.js +14 -14
  85. package/lib/module/theme/tokens/primitives.js.map +1 -1
  86. package/lib/module/theme/tokens/validate.js +238 -0
  87. package/lib/module/theme/tokens/validate.js.map +1 -0
  88. package/lib/module/theme/unistyles-adapter.js +77 -0
  89. package/lib/module/theme/unistyles-adapter.js.map +1 -0
  90. package/lib/module/utils/accent-generator.js +476 -0
  91. package/lib/module/utils/accent-generator.js.map +1 -0
  92. package/lib/module/utils/accent-utils.js +52 -35
  93. package/lib/module/utils/accent-utils.js.map +1 -1
  94. package/lib/module/utils/color-utils.js +224 -7
  95. package/lib/module/utils/color-utils.js.map +1 -1
  96. package/lib/module/utils/deep-merge.js +1 -1
  97. package/lib/module/utils/deep-merge.js.map +1 -1
  98. package/lib/module/utils/resolve-theme-color.js +2 -2
  99. package/lib/typescript/src/components/chip/types.d.ts +1 -1
  100. package/lib/typescript/src/components/empty-state/EmptyState.d.ts +1 -1
  101. package/lib/typescript/src/components/empty-state/EmptyState.d.ts.map +1 -1
  102. package/lib/typescript/src/components/header/variants/LargeTitleHeader/index.d.ts +6 -5
  103. package/lib/typescript/src/components/header/variants/LargeTitleHeader/index.d.ts.map +1 -1
  104. package/lib/typescript/src/components/header/variants/TitleHeader/index.d.ts +11 -5
  105. package/lib/typescript/src/components/header/variants/TitleHeader/index.d.ts.map +1 -1
  106. package/lib/typescript/src/components/icon/Icon.d.ts +2 -2
  107. package/lib/typescript/src/components/screen/Screen.d.ts +45 -16
  108. package/lib/typescript/src/components/screen/Screen.d.ts.map +1 -1
  109. package/lib/typescript/src/components/screen/ScreenContext.d.ts +42 -26
  110. package/lib/typescript/src/components/screen/ScreenContext.d.ts.map +1 -1
  111. package/lib/typescript/src/components/screen/ScreenFlatList.d.ts +5 -46
  112. package/lib/typescript/src/components/screen/ScreenFlatList.d.ts.map +1 -1
  113. package/lib/typescript/src/components/screen/ScreenList.d.ts +62 -50
  114. package/lib/typescript/src/components/screen/ScreenList.d.ts.map +1 -1
  115. package/lib/typescript/src/components/screen/ScreenScrollView.d.ts +18 -58
  116. package/lib/typescript/src/components/screen/ScreenScrollView.d.ts.map +1 -1
  117. package/lib/typescript/src/components/screen/hooks/use-screen-ref.d.ts +5 -0
  118. package/lib/typescript/src/components/screen/hooks/use-screen-ref.d.ts.map +1 -0
  119. package/lib/typescript/src/components/screen/hooks/use-screen-scroll-handler.d.ts +53 -0
  120. package/lib/typescript/src/components/screen/hooks/use-screen-scroll-handler.d.ts.map +1 -0
  121. package/lib/typescript/src/components/screen/index.d.ts +2 -2
  122. package/lib/typescript/src/components/screen/index.d.ts.map +1 -1
  123. package/lib/typescript/src/components/screen/parts/ScreenFrame.d.ts +6 -0
  124. package/lib/typescript/src/components/screen/parts/ScreenFrame.d.ts.map +1 -0
  125. package/lib/typescript/src/components/screen/parts/ScreenHeaderAppearance.d.ts +21 -0
  126. package/lib/typescript/src/components/screen/parts/ScreenHeaderAppearance.d.ts.map +1 -0
  127. package/lib/typescript/src/components/screen/parts/ScreenPlaceholder.d.ts +6 -8
  128. package/lib/typescript/src/components/screen/parts/ScreenPlaceholder.d.ts.map +1 -1
  129. package/lib/typescript/src/components/screen/parts/ScreenSafeArea.android.d.ts +7 -0
  130. package/lib/typescript/src/components/screen/parts/ScreenSafeArea.android.d.ts.map +1 -0
  131. package/lib/typescript/src/components/screen/parts/ScreenSafeArea.d.ts +6 -0
  132. package/lib/typescript/src/components/screen/parts/ScreenSafeArea.d.ts.map +1 -0
  133. package/lib/typescript/src/components/screen/types.d.ts +27 -32
  134. package/lib/typescript/src/components/screen/types.d.ts.map +1 -1
  135. package/lib/typescript/src/components/screen/utils.d.ts +9 -8
  136. package/lib/typescript/src/components/screen/utils.d.ts.map +1 -1
  137. package/lib/typescript/src/components/text/Text.d.ts +1 -1
  138. package/lib/typescript/src/components/text/Text.d.ts.map +1 -1
  139. package/lib/typescript/src/components/toolbar/Toolbar.d.ts +2 -2
  140. package/lib/typescript/src/context/ThemeProvider.d.ts +29 -12
  141. package/lib/typescript/src/context/ThemeProvider.d.ts.map +1 -1
  142. package/lib/typescript/src/context/index.d.ts +1 -1
  143. package/lib/typescript/src/context/index.d.ts.map +1 -1
  144. package/lib/typescript/src/theme/breakpoints.d.ts +1 -1
  145. package/lib/typescript/src/theme/define-config.d.ts +23 -0
  146. package/lib/typescript/src/theme/define-config.d.ts.map +1 -0
  147. package/lib/typescript/src/theme/diagnostics.d.ts +4 -0
  148. package/lib/typescript/src/theme/diagnostics.d.ts.map +1 -0
  149. package/lib/typescript/src/theme/errors.d.ts +10 -0
  150. package/lib/typescript/src/theme/errors.d.ts.map +1 -0
  151. package/lib/typescript/src/theme/index.d.ts +10 -2
  152. package/lib/typescript/src/theme/index.d.ts.map +1 -1
  153. package/lib/typescript/src/theme/legacy-tokens.d.ts +187 -0
  154. package/lib/typescript/src/theme/legacy-tokens.d.ts.map +1 -0
  155. package/lib/typescript/src/theme/registry.d.ts +12 -17
  156. package/lib/typescript/src/theme/registry.d.ts.map +1 -1
  157. package/lib/typescript/src/theme/resolve-config.d.ts +99 -0
  158. package/lib/typescript/src/theme/resolve-config.d.ts.map +1 -0
  159. package/lib/typescript/src/theme/runtime.d.ts +25 -4
  160. package/lib/typescript/src/theme/runtime.d.ts.map +1 -1
  161. package/lib/typescript/src/theme/screen-margin.d.ts +6 -14
  162. package/lib/typescript/src/theme/screen-margin.d.ts.map +1 -1
  163. package/lib/typescript/src/theme/screen-padding.d.ts +15 -0
  164. package/lib/typescript/src/theme/screen-padding.d.ts.map +1 -0
  165. package/lib/typescript/src/theme/selection-store.d.ts +41 -0
  166. package/lib/typescript/src/theme/selection-store.d.ts.map +1 -0
  167. package/lib/typescript/src/theme/theme.d.ts +54 -1
  168. package/lib/typescript/src/theme/theme.d.ts.map +1 -1
  169. package/lib/typescript/src/theme/tokens/canonical-color-keys.d.ts +95 -0
  170. package/lib/typescript/src/theme/tokens/canonical-color-keys.d.ts.map +1 -0
  171. package/lib/typescript/src/theme/tokens/dark.d.ts +56 -63
  172. package/lib/typescript/src/theme/tokens/dark.d.ts.map +1 -1
  173. package/lib/typescript/src/theme/tokens/light.d.ts +56 -71
  174. package/lib/typescript/src/theme/tokens/light.d.ts.map +1 -1
  175. package/lib/typescript/src/theme/tokens/primitives.d.ts +11 -10
  176. package/lib/typescript/src/theme/tokens/primitives.d.ts.map +1 -1
  177. package/lib/typescript/src/theme/tokens/validate.d.ts +34 -0
  178. package/lib/typescript/src/theme/tokens/validate.d.ts.map +1 -0
  179. package/lib/typescript/src/theme/types.d.ts +166 -86
  180. package/lib/typescript/src/theme/types.d.ts.map +1 -1
  181. package/lib/typescript/src/theme/unistyles-adapter.d.ts +33 -0
  182. package/lib/typescript/src/theme/unistyles-adapter.d.ts.map +1 -0
  183. package/lib/typescript/src/utils/accent-generator.d.ts +103 -0
  184. package/lib/typescript/src/utils/accent-generator.d.ts.map +1 -0
  185. package/lib/typescript/src/utils/accent-utils.d.ts +15 -2
  186. package/lib/typescript/src/utils/accent-utils.d.ts.map +1 -1
  187. package/lib/typescript/src/utils/color-utils.d.ts +59 -2
  188. package/lib/typescript/src/utils/color-utils.d.ts.map +1 -1
  189. package/lib/typescript/src/utils/deep-merge.d.ts +1 -0
  190. package/lib/typescript/src/utils/deep-merge.d.ts.map +1 -1
  191. package/lib/typescript/src/utils/resolve-theme-color.d.ts +2 -2
  192. package/package.json +1 -1
  193. package/src/components/avatar/Avatar.tsx +20 -20
  194. package/src/components/button/Button.tsx +11 -11
  195. package/src/components/chip/Chip.tsx +32 -32
  196. package/src/components/chip/types.ts +1 -1
  197. package/src/components/empty-state/EmptyState.tsx +4 -4
  198. package/src/components/header/variants/LargeTitleHeader/index.tsx +31 -30
  199. package/src/components/header/variants/TitleHeader/index.tsx +33 -22
  200. package/src/components/icon/Icon.tsx +4 -4
  201. package/src/components/page-indicator/hooks/use-page-indicator-colors.ts +2 -2
  202. package/src/components/screen/Screen.tsx +89 -43
  203. package/src/components/screen/ScreenContext.tsx +48 -28
  204. package/src/components/screen/ScreenFlatList.tsx +5 -191
  205. package/src/components/screen/ScreenList.tsx +197 -175
  206. package/src/components/screen/ScreenScrollView.tsx +92 -167
  207. package/src/components/screen/hooks/use-screen-ref.ts +24 -0
  208. package/src/components/screen/hooks/use-screen-scroll-handler.ts +31 -0
  209. package/src/components/screen/index.ts +8 -2
  210. package/src/components/screen/parts/ScreenFrame.tsx +49 -0
  211. package/src/components/screen/parts/ScreenHeaderAppearance.tsx +52 -0
  212. package/src/components/screen/parts/ScreenPlaceholder.tsx +16 -16
  213. package/src/components/screen/parts/ScreenSafeArea.android.tsx +22 -0
  214. package/src/components/screen/parts/ScreenSafeArea.tsx +20 -0
  215. package/src/components/screen/types.ts +29 -32
  216. package/src/components/screen/utils.ts +24 -11
  217. package/src/components/spinner/Spinner.tsx +2 -2
  218. package/src/components/text/Text.tsx +2 -2
  219. package/src/components/toast/Toast.tsx +13 -13
  220. package/src/components/toolbar/Toolbar.tsx +4 -4
  221. package/src/context/ThemeProvider.tsx +47 -51
  222. package/src/context/index.ts +1 -1
  223. package/src/theme/breakpoints.ts +1 -1
  224. package/src/theme/define-config.ts +27 -0
  225. package/src/theme/diagnostics.ts +11 -0
  226. package/src/theme/errors.ts +14 -0
  227. package/src/theme/index.ts +40 -1
  228. package/src/theme/legacy-tokens.ts +227 -0
  229. package/src/theme/registry.ts +119 -137
  230. package/src/theme/resolve-config.ts +406 -0
  231. package/src/theme/runtime.ts +52 -14
  232. package/src/theme/screen-margin.ts +6 -25
  233. package/src/theme/screen-padding.ts +26 -0
  234. package/src/theme/selection-store.ts +76 -0
  235. package/src/theme/theme.ts +104 -39
  236. package/src/theme/tokens/canonical-color-keys.ts +107 -0
  237. package/src/theme/tokens/dark.ts +91 -98
  238. package/src/theme/tokens/light.ts +88 -93
  239. package/src/theme/tokens/primitives.ts +14 -14
  240. package/src/theme/tokens/validate.ts +271 -0
  241. package/src/theme/types.ts +184 -95
  242. package/src/theme/unistyles-adapter.ts +75 -0
  243. package/src/utils/accent-generator.ts +530 -0
  244. package/src/utils/accent-utils.ts +66 -39
  245. package/src/utils/color-utils.ts +225 -8
  246. package/src/utils/deep-merge.ts +1 -1
  247. package/src/utils/resolve-theme-color.ts +2 -2
  248. package/lib/module/components/screen/parts/BottomSafeArea.js +0 -62
  249. package/lib/module/components/screen/parts/BottomSafeArea.js.map +0 -1
  250. package/lib/typescript/src/components/screen/parts/BottomSafeArea.d.ts +0 -30
  251. package/lib/typescript/src/components/screen/parts/BottomSafeArea.d.ts.map +0 -1
  252. package/src/components/screen/parts/BottomSafeArea.tsx +0 -59
@@ -0,0 +1,476 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Pure, deterministic accent generation from a single seed color.
5
+ *
6
+ * Consumed by the resolver (`theme/resolve-config.ts`) for startup, runtime
7
+ * accent changes and `createTerraThemes`, and by the `normalizeAccent`
8
+ * compatibility wrapper. Must not import the registry, provider, Unistyles,
9
+ * or renderers — only `#theme/types` and the colour maths in `./color-utils`.
10
+ *
11
+ * ## Algorithm
12
+ *
13
+ * Every role is derived in OKLCH (Björn Ottosson's OKLab, in-house
14
+ * implementation in `./color-utils`): the seed's hue is kept for every role,
15
+ * chroma is capped per role and reduced further by sRGB gamut mapping, and
16
+ * perceptual lightness is *solved* per role against the scheme's actual
17
+ * ordinary surfaces so that WCAG 2.x targets are met (4.5:1 for text and
18
+ * solid/soft labels, 3:1 for the accent border). Contrast is evaluated with
19
+ * sRGB alpha compositing over each of the four surfaces and, for solid
20
+ * controls, additionally with the pressed opacity applied to the whole control.
21
+ *
22
+ * - `accent.solid.bg` keeps the seed exactly when black or white text reads on
23
+ * it at both opacities; otherwise the fill is moved the smallest lightness
24
+ * distance (ties prefer darker in light, lighter in dark) until a readable
25
+ * label exists — so the fill MAY differ from the seed. Pin `accent.solid.bg`
26
+ * through overrides for an exact fill.
27
+ * - `accent.solid.fg` is a tinted near-black or near-white (pure black/white
28
+ * when the tint would not reach 4.5:1) picked by contrast, not brightness.
29
+ * - Hover/pressed fills darken in light and lighten in dark (mirroring the
30
+ * built-in tokens); the direction flips only where following the scheme
31
+ * would break the label contrast or leave the lightness range.
32
+ * - `accent.soft.bg` is a light tint in light / dark tint in dark, placed
33
+ * relative to the surfaces; `accent.soft.fg` is solved on all three soft
34
+ * states. `accent.text` (and `text.link`, the existing shorthand) is solved
35
+ * on every surface; `accent.border` is solved to 3:1 on every surface.
36
+ * - Disabled fills are desaturated and low-contrast-but-visible, in the
37
+ * spirit of the default `slate.200`/`slate.700`-like tokens.
38
+ *
39
+ * Unsatisfiable pairs (e.g. one very light and one very dark surface) are
40
+ * reported as `unsatisfied` diagnostics with the best deterministic colour
41
+ * kept; unparseable surfaces are excluded from solving and reported as
42
+ * `unsupported`. Nothing ever falls back to white silently.
43
+ *
44
+ */
45
+
46
+ import { compositedContrast, oklchToRgb, parseColor, rgbToHex, rgbToOklch } from "./color-utils.js";
47
+
48
+ /** Every canonical role a seed generates. `text.link` is kept for the existing shorthand behaviour. */
49
+
50
+ export const GENERATED_ACCENT_ROLES = ["accent.text", "accent.border", "accent.solid.bg", "accent.solid.bg.hover", "accent.solid.bg.pressed", "accent.solid.bg.disabled", "accent.solid.fg", "accent.soft.bg", "accent.soft.bg.hover", "accent.soft.bg.pressed", "accent.soft.bg.disabled", "accent.soft.fg", "text.link"];
51
+ /** The four ordinary surfaces every accent pair is evaluated over, in a fixed order. */
52
+ export const ACCENT_SURFACE_ROLES = ["surface.canvas", "surface.default", "surface.raised", "surface.sunken"];
53
+
54
+ /**
55
+ * The resolved scheme context a generator needs: the scheme's actual ordinary
56
+ * surfaces (after defaults, shared and scheme patches) and the opacity that
57
+ * components apply to a whole pressed control.
58
+ */
59
+
60
+ /**
61
+ * `unsatisfied` — the pair was evaluated and fell below `required`.
62
+ * `unsupported` — a colour could not be evaluated (non-sRGB/opaque format);
63
+ * `ratio` is `null` and no accessibility claim is made.
64
+ */
65
+
66
+ /** Whether `value` is an opaque six-digit sRGB hex seed (`#rrggbb`, case-insensitive). */
67
+ export function isSupportedAccentSeed(value) {
68
+ return typeof value === "string" && /^#[0-9a-f]{6}$/i.test(value.trim());
69
+ }
70
+
71
+ // ─── Targets and tuning ───────────────────────────────────────────────────────
72
+
73
+ /** WCAG 2.x minimum for normal text and solid/soft labels. */
74
+ export const ACCENT_TEXT_CONTRAST = 4.5;
75
+ /** WCAG 2.x minimum for a meaningful accent boundary on an ordinary surface. */
76
+ export const ACCENT_BORDER_CONTRAST = 3;
77
+
78
+ /** Lightness resolution of the per-role solver (OKLCH L units). */
79
+ const L_STEP = 0.005;
80
+ const TUNING = {
81
+ light: {
82
+ dir: -1,
83
+ solidStep: 0.06,
84
+ softBase: {
85
+ offset: 0.01,
86
+ min: 0.86,
87
+ max: 0.965
88
+ },
89
+ softStep: -0.04,
90
+ softChroma: 0.08,
91
+ solidDisabled: {
92
+ l: 0.93,
93
+ c: 0.02
94
+ },
95
+ softDisabled: {
96
+ l: 0.97,
97
+ c: 0.01
98
+ },
99
+ darkLabelL: 0.15,
100
+ lightLabelL: 0.985,
101
+ fallbackSurface: {
102
+ r: 255,
103
+ g: 255,
104
+ b: 255
105
+ }
106
+ },
107
+ dark: {
108
+ dir: 1,
109
+ solidStep: 0.06,
110
+ softBase: {
111
+ offset: 0.03,
112
+ min: 0.24,
113
+ max: 0.5
114
+ },
115
+ softStep: 0.06,
116
+ softChroma: 0.06,
117
+ solidDisabled: {
118
+ l: 0.4,
119
+ c: 0.04
120
+ },
121
+ softDisabled: {
122
+ l: 0.22,
123
+ c: 0.01
124
+ },
125
+ darkLabelL: 0.15,
126
+ lightLabelL: 0.985,
127
+ fallbackSurface: {
128
+ r: 0,
129
+ g: 0,
130
+ b: 0
131
+ }
132
+ }
133
+ };
134
+ const LABEL_CHROMA = 0.03;
135
+
136
+ // ─── Internal helpers ─────────────────────────────────────────────────────────
137
+
138
+ const opaque = rgb => ({
139
+ ...rgb,
140
+ a: 1
141
+ });
142
+
143
+ /** OKLCH → sRGB rounded to the 0-255 grid, so scores match the emitted hex exactly. */
144
+ const toRgb = color => {
145
+ const rgb = oklchToRgb(color);
146
+ return {
147
+ r: Math.round(rgb.r),
148
+ g: Math.round(rgb.g),
149
+ b: Math.round(rgb.b)
150
+ };
151
+ };
152
+
153
+ /** A pressed opacity outside (0, 1] is not a usable multiplier; evaluate at 1 instead. */
154
+ function normalizeOpacity(value) {
155
+ return Number.isFinite(value) && value > 0 && value <= 1 ? value : 1;
156
+ }
157
+
158
+ /** Parses a surface as an opaque sRGB colour; translucent or unparseable surfaces are not evaluable. */
159
+ function parseSurface(value) {
160
+ const parsed = parseColor(value);
161
+ return parsed && parsed.a >= 1 ? parsed : null;
162
+ }
163
+ const clamp01 = n => Math.max(0, Math.min(1, n));
164
+
165
+ /** Rounds to the solver grid so equal inputs always visit identical candidates. */
166
+ const snap = l => Math.round(l / L_STEP) * L_STEP;
167
+
168
+ /**
169
+ * Yields candidate lightness values starting at `start`: only in `dir` when
170
+ * `both` is false, otherwise alternating outward with `dir` visited first at
171
+ * each distance. Stops once every remaining candidate is outside [0, 1].
172
+ */
173
+ function* lightnessCandidates(start, dir, both) {
174
+ const origin = clamp01(snap(start));
175
+ yield origin;
176
+ for (let k = 1; k <= Math.ceil(1 / L_STEP); k += 1) {
177
+ const forward = origin + dir * k * L_STEP;
178
+ const backward = origin - dir * k * L_STEP;
179
+ const forwardOk = forward >= -1e-9 && forward <= 1 + 1e-9;
180
+ const backwardOk = both && backward >= -1e-9 && backward <= 1 + 1e-9;
181
+ if (!forwardOk && !backwardOk) return;
182
+ if (forwardOk) yield clamp01(forward);
183
+ if (backwardOk) yield clamp01(backward);
184
+ }
185
+ }
186
+ /**
187
+ * Finds the first candidate colour (hue/chroma fixed, lightness varied) whose
188
+ * `score` — min(ratio / required) over every pair it must satisfy — reaches 1.
189
+ * When nothing reaches 1, returns the best-scoring candidate (deterministic).
190
+ */
191
+ function solveLightness(base, start, dir, both, score) {
192
+ let best = null;
193
+ let bestScore = Number.NEGATIVE_INFINITY;
194
+ for (const l of lightnessCandidates(start, dir, both)) {
195
+ const rgb = toRgb({
196
+ l,
197
+ c: base.c,
198
+ h: base.h
199
+ });
200
+ const s = score(rgb);
201
+ if (s >= 1) return {
202
+ l,
203
+ rgb,
204
+ satisfied: true
205
+ };
206
+ if (s > bestScore) {
207
+ bestScore = s;
208
+ best = {
209
+ l,
210
+ rgb,
211
+ satisfied: false
212
+ };
213
+ }
214
+ }
215
+ return best ?? {
216
+ l: clamp01(start),
217
+ rgb: toRgb({
218
+ l: clamp01(start),
219
+ c: base.c,
220
+ h: base.h
221
+ }),
222
+ satisfied: false
223
+ };
224
+ }
225
+ const min = values => values.reduce((acc, v) => Math.min(acc, v), Number.POSITIVE_INFINITY);
226
+
227
+ /** min over surfaces of contrast(fg on bg over surface) at each opacity, normalised by `required`. */
228
+ function pairScore(fg, bgs, surfaces, opacities, required) {
229
+ const ratios = [];
230
+ for (const bg of bgs) {
231
+ for (const surface of surfaces) {
232
+ for (const opacity of opacities) ratios.push(compositedContrast(fg, bg, surface, opacity) / required);
233
+ }
234
+ }
235
+ return min(ratios);
236
+ }
237
+
238
+ /** Contrast of a standalone colour (text/border) against each surface, normalised by `required`. */
239
+ function surfaceScore(color, surfaces, required) {
240
+ return min(surfaces.map(surface => compositedContrast(opaque(color), opaque(surface), surface, 1) / required));
241
+ }
242
+
243
+ // ─── Generation ───────────────────────────────────────────────────────────────
244
+
245
+ /**
246
+ * Generates every {@link GeneratedAccentRole} for `seed` in the given scheme
247
+ * context. Pure and deterministic: same inputs → same output. Callers must
248
+ * validate the seed with {@link isSupportedAccentSeed} first.
249
+ */
250
+ export function generateAccentColors(seed, context) {
251
+ if (!isSupportedAccentSeed(seed)) {
252
+ throw new Error(`generateAccentColors: unsupported seed ${JSON.stringify(seed)}; expected an opaque #rrggbb sRGB hex.`);
253
+ }
254
+ const seedHex = seed.trim().toLowerCase();
255
+ const seedRgb = parseColor(seedHex);
256
+ const seedLch = rgbToOklch(seedRgb);
257
+ const tuning = TUNING[context.scheme];
258
+ const {
259
+ dir
260
+ } = tuning;
261
+ const pressedOpacity = normalizeOpacity(context.pressedOpacity);
262
+ const opacities = pressedOpacity < 1 ? [1, pressedOpacity] : [1];
263
+ const evaluable = ACCENT_SURFACE_ROLES.map(role => parseSurface(context.surfaces[role])).filter(surface => surface !== null);
264
+ const surfaces = evaluable.length > 0 ? evaluable : [tuning.fallbackSurface];
265
+ const surfaceLs = surfaces.map(surface => rgbToOklch(surface).l);
266
+ const hue = {
267
+ c: seedLch.c,
268
+ h: seedLch.h
269
+ };
270
+ const black = {
271
+ r: 0,
272
+ g: 0,
273
+ b: 0,
274
+ a: 1
275
+ };
276
+ const white = {
277
+ r: 255,
278
+ g: 255,
279
+ b: 255,
280
+ a: 1
281
+ };
282
+
283
+ // ── Solid fill: keep the seed when black or white reads on it at every opacity.
284
+ const fillScore = (fill, fg) => pairScore(fg, [opaque(fill)], surfaces, opacities, ACCENT_TEXT_CONTRAST);
285
+ const readable = fill => fillScore(fill, black) >= 1 || fillScore(fill, white) >= 1;
286
+ let fillRgb = seedRgb;
287
+ let fillL = seedLch.l;
288
+ if (!readable(seedRgb)) {
289
+ const solved = solveLightness(hue, seedLch.l, dir, true, rgb => Math.max(fillScore(rgb, black), fillScore(rgb, white)));
290
+ fillRgb = solved.rgb;
291
+ fillL = solved.l;
292
+ }
293
+ const fillHex = fillRgb === seedRgb ? seedHex : rgbToHex(fillRgb);
294
+
295
+ // Label polarity by contrast, never by perceived brightness.
296
+ const polarity = fillScore(fillRgb, black) >= fillScore(fillRgb, white) ? "dark" : "light";
297
+ const pureLabel = polarity === "dark" ? black : white;
298
+
299
+ // ── Solid states: follow the scheme, flip when that would break the label or leave [0, 1].
300
+ const statesFor = direction => [1, 2].map(k => toRgb({
301
+ l: clamp01(fillL + direction * k * tuning.solidStep),
302
+ c: hue.c,
303
+ h: hue.h
304
+ }));
305
+ const statesFit = direction => {
306
+ const far = fillL + direction * 2 * tuning.solidStep;
307
+ return far >= 0.06 && far <= 0.94;
308
+ };
309
+ const statesReadable = states => pairScore(pureLabel, states.map(opaque), surfaces, opacities, ACCENT_TEXT_CONTRAST) >= 1;
310
+ const statesOk = direction => statesFit(direction) && statesReadable(statesFor(direction));
311
+ const flipped = -dir;
312
+ let stateDir = dir;
313
+ if (!statesOk(dir)) {
314
+ // Prefer a direction that keeps the label readable; otherwise at least stay in range.
315
+ if (statesOk(flipped) || !statesFit(dir) && statesFit(flipped)) stateDir = flipped;
316
+ }
317
+ const [hoverRgb, pressedRgb] = statesFor(stateDir);
318
+ const solidBgs = [fillRgb, hoverRgb, pressedRgb].map(opaque);
319
+
320
+ // ── Solid label: tinted near-black/near-white when it still reads everywhere, else pure.
321
+ const tinted = opaque(toRgb({
322
+ l: polarity === "dark" ? tuning.darkLabelL : tuning.lightLabelL,
323
+ c: Math.min(seedLch.c, LABEL_CHROMA),
324
+ h: seedLch.h
325
+ }));
326
+ const solidFg = pairScore(tinted, solidBgs, surfaces, opacities, ACCENT_TEXT_CONTRAST) >= 1 ? tinted : pureLabel;
327
+
328
+ // ── Standalone text and border against every surface.
329
+ const text = solveLightness(hue, seedLch.l, dir, false, rgb => surfaceScore(rgb, surfaces, ACCENT_TEXT_CONTRAST));
330
+ const border = solveLightness(hue, seedLch.l, dir, false, rgb => surfaceScore(rgb, surfaces, ACCENT_BORDER_CONTRAST));
331
+
332
+ // ── Soft tint relative to the surfaces, with its own solved foreground.
333
+ const softAnchor = dir === -1 ? min(surfaceLs) : Math.max(...surfaceLs);
334
+ const softL = Math.max(tuning.softBase.min, Math.min(tuning.softBase.max, softAnchor + tuning.softBase.offset));
335
+ const softChroma = Math.min(seedLch.c, tuning.softChroma);
336
+ const softBgs = [0, 1, 2].map(k => toRgb({
337
+ l: clamp01(softL + k * tuning.softStep),
338
+ c: softChroma,
339
+ h: seedLch.h
340
+ }));
341
+ const softFg = solveLightness(hue, text.l, dir, false, rgb => pairScore(opaque(rgb), softBgs.map(opaque), surfaces, [1], ACCENT_TEXT_CONTRAST));
342
+
343
+ // ── Disabled: desaturated, low-contrast-but-visible.
344
+ const solidDisabled = toRgb({
345
+ l: tuning.solidDisabled.l,
346
+ c: Math.min(seedLch.c, tuning.solidDisabled.c),
347
+ h: seedLch.h
348
+ });
349
+ const softDisabled = toRgb({
350
+ l: tuning.softDisabled.l,
351
+ c: Math.min(seedLch.c, tuning.softDisabled.c),
352
+ h: seedLch.h
353
+ });
354
+ const textHex = rgbToHex(text.rgb);
355
+ const colors = {
356
+ "accent.text": textHex,
357
+ "accent.border": rgbToHex(border.rgb),
358
+ "accent.solid.bg": fillHex,
359
+ "accent.solid.bg.hover": rgbToHex(hoverRgb),
360
+ "accent.solid.bg.pressed": rgbToHex(pressedRgb),
361
+ "accent.solid.bg.disabled": rgbToHex(solidDisabled),
362
+ "accent.solid.fg": rgbToHex(solidFg),
363
+ "accent.soft.bg": rgbToHex(softBgs[0]),
364
+ "accent.soft.bg.hover": rgbToHex(softBgs[1]),
365
+ "accent.soft.bg.pressed": rgbToHex(softBgs[2]),
366
+ "accent.soft.bg.disabled": rgbToHex(softDisabled),
367
+ "accent.soft.fg": rgbToHex(softFg.rgb),
368
+ "text.link": textHex
369
+ };
370
+ return {
371
+ colors,
372
+ diagnostics: checkAccentContrast(colors, context)
373
+ };
374
+ }
375
+
376
+ // ─── Diagnostics ──────────────────────────────────────────────────────────────
377
+
378
+ function contrastPairs(pressedOpacity) {
379
+ const pairs = [];
380
+ const opacities = pressedOpacity < 1 ? [1, pressedOpacity] : [1];
381
+ for (const background of ["accent.solid.bg", "accent.solid.bg.hover", "accent.solid.bg.pressed"]) {
382
+ for (const opacity of opacities) {
383
+ pairs.push({
384
+ role: "accent.solid.fg",
385
+ background,
386
+ opacity,
387
+ required: ACCENT_TEXT_CONTRAST
388
+ });
389
+ }
390
+ }
391
+ for (const background of ["accent.soft.bg", "accent.soft.bg.hover", "accent.soft.bg.pressed"]) {
392
+ pairs.push({
393
+ role: "accent.soft.fg",
394
+ background,
395
+ opacity: 1,
396
+ required: ACCENT_TEXT_CONTRAST
397
+ });
398
+ }
399
+ pairs.push({
400
+ role: "accent.text",
401
+ background: "surface",
402
+ opacity: 1,
403
+ required: ACCENT_TEXT_CONTRAST
404
+ });
405
+ pairs.push({
406
+ role: "text.link",
407
+ background: "surface",
408
+ opacity: 1,
409
+ required: ACCENT_TEXT_CONTRAST
410
+ });
411
+ pairs.push({
412
+ role: "accent.border",
413
+ background: "surface",
414
+ opacity: 1,
415
+ required: ACCENT_BORDER_CONTRAST
416
+ });
417
+ return pairs;
418
+ }
419
+ const show = value => typeof value === "string" ? JSON.stringify(value) : String(value);
420
+
421
+ /**
422
+ * Evaluates the final accent roles (after explicit overrides) against their
423
+ * intended backgrounds in the supported domain and returns the failing or
424
+ * unevaluable pairs. Never repairs a colour.
425
+ */
426
+ export function checkAccentContrast(colors, context) {
427
+ const diagnostics = [];
428
+ const pairs = contrastPairs(normalizeOpacity(context.pressedOpacity));
429
+ const values = colors;
430
+ for (const surfaceRole of ACCENT_SURFACE_ROLES) {
431
+ const surfaceValue = context.surfaces[surfaceRole];
432
+ const surface = parseSurface(surfaceValue);
433
+ for (const pair of pairs) {
434
+ const backgroundRole = pair.background === "surface" ? surfaceRole : pair.background;
435
+ const where = `${pair.role} on ${backgroundRole} over ${surfaceRole} at opacity ${pair.opacity}`;
436
+ const fgValue = values[pair.role];
437
+ const fg = parseColor(fgValue);
438
+ const bgValue = pair.background === "surface" ? surfaceValue : values[pair.background];
439
+ const bg = pair.background === "surface" ? surface ? opaque(surface) : null : parseColor(bgValue);
440
+ const unsupported = [];
441
+ if (!surface) unsupported.push(`${surfaceRole} ${show(surfaceValue)} is not an opaque sRGB colour`);
442
+ if (!fg) unsupported.push(`${pair.role} ${show(fgValue)} is not an sRGB colour`);
443
+ if (!bg && pair.background !== "surface") {
444
+ unsupported.push(`${pair.background} ${show(bgValue)} is not an sRGB colour`);
445
+ }
446
+ if (!surface || !fg || !bg) {
447
+ diagnostics.push({
448
+ kind: "unsupported",
449
+ role: pair.role,
450
+ background: backgroundRole,
451
+ surface: surfaceRole,
452
+ opacity: pair.opacity,
453
+ ratio: null,
454
+ required: pair.required,
455
+ message: `${where} cannot be evaluated: ${unsupported.join("; ")}.`
456
+ });
457
+ continue;
458
+ }
459
+ const ratio = compositedContrast(fg, bg, surface, pair.opacity);
460
+ if (ratio < pair.required) {
461
+ diagnostics.push({
462
+ kind: "unsatisfied",
463
+ role: pair.role,
464
+ background: backgroundRole,
465
+ surface: surfaceRole,
466
+ opacity: pair.opacity,
467
+ ratio,
468
+ required: pair.required,
469
+ message: `${where} is ${ratio.toFixed(2)}:1, below the ${pair.required}:1 target.`
470
+ });
471
+ }
472
+ }
473
+ }
474
+ return diagnostics;
475
+ }
476
+ //# sourceMappingURL=accent-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["compositedContrast","oklchToRgb","parseColor","rgbToHex","rgbToOklch","GENERATED_ACCENT_ROLES","ACCENT_SURFACE_ROLES","isSupportedAccentSeed","value","test","trim","ACCENT_TEXT_CONTRAST","ACCENT_BORDER_CONTRAST","L_STEP","TUNING","light","dir","solidStep","softBase","offset","min","max","softStep","softChroma","solidDisabled","l","c","softDisabled","darkLabelL","lightLabelL","fallbackSurface","r","g","b","dark","LABEL_CHROMA","opaque","rgb","a","toRgb","color","Math","round","normalizeOpacity","Number","isFinite","parseSurface","parsed","clamp01","n","snap","lightnessCandidates","start","both","origin","k","ceil","forward","backward","forwardOk","backwardOk","solveLightness","base","score","best","bestScore","NEGATIVE_INFINITY","h","s","satisfied","values","reduce","acc","v","POSITIVE_INFINITY","pairScore","fg","bgs","surfaces","opacities","required","ratios","bg","surface","opacity","push","surfaceScore","map","generateAccentColors","seed","context","Error","JSON","stringify","seedHex","toLowerCase","seedRgb","seedLch","tuning","scheme","pressedOpacity","evaluable","role","filter","length","surfaceLs","hue","black","white","fillScore","fill","readable","fillRgb","fillL","solved","fillHex","polarity","pureLabel","statesFor","direction","statesFit","far","statesReadable","states","statesOk","flipped","stateDir","hoverRgb","pressedRgb","solidBgs","tinted","solidFg","text","border","softAnchor","softL","softBgs","softFg","textHex","colors","diagnostics","checkAccentContrast","contrastPairs","pairs","background","show","String","surfaceRole","surfaceValue","pair","backgroundRole","where","fgValue","bgValue","unsupported","kind","ratio","message","join","toFixed"],"sourceRoot":"../../../src","sources":["utils/accent-generator.ts"],"mappings":"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","ignoreList":[]}
@@ -1,52 +1,69 @@
1
1
  "use strict";
2
2
 
3
- import { readableOn, shade, withAlpha } from "./color-utils.js";
4
- const isShorthand = accent => typeof accent.light === "string" || typeof accent.dark === "string";
3
+ import { normalizeTokenOverride } from "../theme/legacy-tokens.js";
4
+ import { normalizeAccentScheme } from "../theme/resolve-config.js";
5
+ import { defaultDarkTheme, defaultLightTheme } from "../theme/theme.js";
6
+ import { ACCENT_SURFACE_ROLES, generateAccentColors } from "./accent-generator.js";
7
+ /**
8
+ * The generation context of a built-in default theme: its four ordinary
9
+ * surfaces and pressed opacity. Used by the {@link normalizeAccent}
10
+ * compatibility wrapper, which has no access to shared/scheme patches.
11
+ */
12
+ export function defaultAccentContext(scheme) {
13
+ const theme = scheme === "light" ? defaultLightTheme : defaultDarkTheme;
14
+ const surfaces = {};
15
+ for (const role of ACCENT_SURFACE_ROLES) surfaces[role] = theme.color[role];
16
+ return {
17
+ scheme,
18
+ surfaces,
19
+ pressedOpacity: theme.opacity.pressed
20
+ };
21
+ }
5
22
 
6
23
  /**
7
- * Expands a single hue into a fuller per-scheme patch so primary AND subtle
8
- * actions (plus accent text) all recolor consistently:
9
- * - primary: solid hue with derived hover/active and a legible foreground,
10
- * - subtle: soft translucent tint of the hue with the hue as foreground,
11
- * - text.accent / text.link / text.on-accent.
12
- *
13
- * On `light` the hover/active darken; on `dark` they lighten.
24
+ * Generated accent colours for `seed` with `overrides` applied last. Within
25
+ * the override patch canonical names beat their legacy aliases, while an
26
+ * alias-only key still beats the generated canonical value.
14
27
  */
15
- function hueToPartial(hue, scheme) {
16
- if (!hue) return {};
17
- const dir = scheme === "light" ? -1 : 1;
18
- const isLight = scheme === "light";
19
- const fg = readableOn(hue);
20
- // Flat color keys to patch — deepMerge replaces string leaves directly.
28
+ function seedToColorPatch(seed, overrides, scheme) {
29
+ const generated = generateAccentColors(seed, defaultAccentContext(scheme)).colors;
21
30
  const color = {
22
- "action.bg.primary": hue,
23
- "action.fg.primary": fg,
24
- "action.bg.primary.hover": shade(hue, dir * 0.12),
25
- "action.bg.primary.active": shade(hue, dir * 0.24),
26
- "action.bg.primary.subtle": withAlpha(hue, isLight ? 0.12 : 0.2),
27
- "action.fg.primary.subtle": hue,
28
- "action.bg.primary.subtle.hover": withAlpha(hue, isLight ? 0.18 : 0.28),
29
- "action.bg.primary.subtle.active": withAlpha(hue, isLight ? 0.24 : 0.36),
30
- "text.accent": hue,
31
- "text.link": hue,
32
- "text.on-accent": fg
31
+ ...generated
33
32
  };
33
+ const normalized = normalizeTokenOverride({
34
+ color: overrides
35
+ })?.color;
36
+ if (normalized) {
37
+ for (const [key, value] of Object.entries(normalized)) {
38
+ if (value !== undefined) color[key] = value;
39
+ }
40
+ }
34
41
  return {
35
42
  color
36
43
  };
37
44
  }
45
+ function normalizeSchemeInput(input, scheme) {
46
+ const normalized = normalizeAccentScheme(input, `accents.<accent>.${scheme}`);
47
+ if (normalized.kind === "none") return {};
48
+ if (normalized.kind === "seed") {
49
+ return seedToColorPatch(normalized.seed, normalized.overrides, scheme);
50
+ }
51
+ // Preserve the compatibility helper's identity contract for full patches;
52
+ // the resolver itself uses the sanitized copy in `normalized.patch`.
53
+ return input;
54
+ }
38
55
 
39
- /** Normalizes any accent input into per-scheme partial-theme overrides. */
56
+ /**
57
+ * Compatibility wrapper: normalizes any accent input into per-scheme
58
+ * partial-theme overrides. Strings and `{ seed, overrides }` are generated
59
+ * against the DEFAULT themes' surfaces and pressed opacity (the resolver
60
+ * pipeline uses the actual resolved surfaces instead); full theme patches
61
+ * pass through unchanged. Pure and independent of the registry.
62
+ */
40
63
  export function normalizeAccent(accent) {
41
- if (isShorthand(accent)) {
42
- return {
43
- light: hueToPartial(accent.light, "light"),
44
- dark: hueToPartial(accent.dark, "dark")
45
- };
46
- }
47
64
  return {
48
- light: accent.light ?? {},
49
- dark: accent.dark ?? {}
65
+ light: normalizeSchemeInput(accent.light, "light"),
66
+ dark: normalizeSchemeInput(accent.dark, "dark")
50
67
  };
51
68
  }
52
69
  //# sourceMappingURL=accent-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["readableOn","shade","withAlpha","isShorthand","accent","light","dark","hueToPartial","hue","scheme","dir","isLight","fg","color","normalizeAccent"],"sourceRoot":"../../../src","sources":["utils/accent-utils.ts"],"mappings":";;AACA,SAASA,UAAU,EAAEC,KAAK,EAAEC,SAAS;AAGrC,MAAMC,WAAW,GAAIC,MAAc,IACjC,OAAQA,MAAM,CAAqBC,KAAK,KAAK,QAAQ,IACrD,OAAQD,MAAM,CAAqBE,IAAI,KAAK,QAAQ;;AAEtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,YAAYA,CAACC,GAAuB,EAAEC,MAAwB,EAA2B;EAChG,IAAI,CAACD,GAAG,EAAE,OAAO,CAAC,CAAC;EACnB,MAAME,GAAG,GAAGD,MAAM,KAAK,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC;EACvC,MAAME,OAAO,GAAGF,MAAM,KAAK,OAAO;EAClC,MAAMG,EAAE,GAAGZ,UAAU,CAACQ,GAAG,CAAC;EAC1B;EACA,MAAMK,KAAK,GAAG;IACZ,mBAAmB,EAAEL,GAAG;IACxB,mBAAmB,EAAEI,EAAE;IACvB,yBAAyB,EAAEX,KAAK,CAACO,GAAG,EAAEE,GAAG,GAAG,IAAI,CAAC;IACjD,0BAA0B,EAAET,KAAK,CAACO,GAAG,EAAEE,GAAG,GAAG,IAAI,CAAC;IAClD,0BAA0B,EAAER,SAAS,CAACM,GAAG,EAAEG,OAAO,GAAG,IAAI,GAAG,GAAG,CAAC;IAChE,0BAA0B,EAAEH,GAAG;IAC/B,gCAAgC,EAAEN,SAAS,CAACM,GAAG,EAAEG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;IACvE,iCAAiC,EAAET,SAAS,CAACM,GAAG,EAAEG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;IACxE,aAAa,EAAEH,GAAG;IAClB,WAAW,EAAEA,GAAG;IAChB,gBAAgB,EAAEI;EACpB,CAAC;EACD,OAAO;IAAEC;EAAM,CAAC;AAClB;;AAEA;AACA,OAAO,SAASC,eAAeA,CAACV,MAAc,EAAoB;EAChE,IAAID,WAAW,CAACC,MAAM,CAAC,EAAE;IACvB,OAAO;MACLC,KAAK,EAAEE,YAAY,CAACH,MAAM,CAACC,KAAK,EAAE,OAAO,CAAC;MAC1CC,IAAI,EAAEC,YAAY,CAACH,MAAM,CAACE,IAAI,EAAE,MAAM;IACxC,CAAC;EACH;EACA,OAAO;IAAED,KAAK,EAAED,MAAM,CAACC,KAAK,IAAI,CAAC,CAAC;IAAEC,IAAI,EAAEF,MAAM,CAACE,IAAI,IAAI,CAAC;EAAE,CAAC;AAC/D","ignoreList":[]}
1
+ {"version":3,"names":["normalizeTokenOverride","normalizeAccentScheme","defaultDarkTheme","defaultLightTheme","ACCENT_SURFACE_ROLES","generateAccentColors","defaultAccentContext","scheme","theme","surfaces","role","color","pressedOpacity","opacity","pressed","seedToColorPatch","seed","overrides","generated","colors","normalized","key","value","Object","entries","undefined","normalizeSchemeInput","input","kind","normalizeAccent","accent","light","dark"],"sourceRoot":"../../../src","sources":["utils/accent-utils.ts"],"mappings":";;AAAA,SAASA,sBAAsB;AAC/B,SAASC,qBAAqB;AAC9B,SAASC,gBAAgB,EAAEC,iBAAiB;AAS5C,SACEC,oBAAoB,EAGpBC,oBAAoB;AAItB;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,oBAAoBA,CAACC,MAAc,EAA2B;EAC5E,MAAMC,KAAK,GAAGD,MAAM,KAAK,OAAO,GAAGJ,iBAAiB,GAAGD,gBAAgB;EACvE,MAAMO,QAAQ,GAAG,CAAC,CAAsC;EACxD,KAAK,MAAMC,IAAI,IAAIN,oBAAoB,EAAEK,QAAQ,CAACC,IAAI,CAAC,GAAGF,KAAK,CAACG,KAAK,CAACD,IAAI,CAAC;EAC3E,OAAO;IAAEH,MAAM;IAAEE,QAAQ;IAAEG,cAAc,EAAEJ,KAAK,CAACK,OAAO,CAACC;EAAQ,CAAC;AACpE;;AAEA;AACA;AACA;AACA;AACA;AACA,SAASC,gBAAgBA,CACvBC,IAAY,EACZC,SAA0C,EAC1CV,MAAc,EACW;EACzB,MAAMW,SAAS,GAAGb,oBAAoB,CAACW,IAAI,EAAEV,oBAAoB,CAACC,MAAM,CAAC,CAAC,CAACY,MAAM;EACjF,MAAMR,KAA6B,GAAG;IAAE,GAAGO;EAAU,CAAC;EACtD,MAAME,UAAU,GAAGpB,sBAAsB,CAAC;IAAEW,KAAK,EAAEM;EAAU,CAAC,CAAC,EAAEN,KAAK;EACtE,IAAIS,UAAU,EAAE;IACd,KAAK,MAAM,CAACC,GAAG,EAAEC,KAAK,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACJ,UAAU,CAAC,EAAE;MACrD,IAAIE,KAAK,KAAKG,SAAS,EAAEd,KAAK,CAACU,GAAG,CAAC,GAAGC,KAAe;IACvD;EACF;EACA,OAAO;IAAEX;EAAM,CAAC;AAClB;AAEA,SAASe,oBAAoBA,CAACC,KAAoC,EAAEpB,MAAc,EAA2B;EAC3G,MAAMa,UAAU,GAAGnB,qBAAqB,CAAC0B,KAAK,EAAE,oBAAoBpB,MAAM,EAAE,CAAC;EAC7E,IAAIa,UAAU,CAACQ,IAAI,KAAK,MAAM,EAAE,OAAO,CAAC,CAAC;EACzC,IAAIR,UAAU,CAACQ,IAAI,KAAK,MAAM,EAAE;IAC9B,OAAOb,gBAAgB,CAACK,UAAU,CAACJ,IAAI,EAAEI,UAAU,CAACH,SAAS,EAAEV,MAAM,CAAC;EACxE;EACA;EACA;EACA,OAAOoB,KAAK;AACd;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,eAAeA,CAACC,MAAc,EAAoB;EAChE,OAAO;IACLC,KAAK,EAAEL,oBAAoB,CAACI,MAAM,CAACC,KAAK,EAAE,OAAO,CAAC;IAClDC,IAAI,EAAEN,oBAAoB,CAACI,MAAM,CAACE,IAAI,EAAE,MAAM;EAChD,CAAC;AACH","ignoreList":[]}