@number10/jsx-core 5.0.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 (340) hide show
  1. package/LICENSE +667 -0
  2. package/README.md +38 -0
  3. package/dist/animation/animated-signal.cjs +19 -0
  4. package/dist/animation/animated-signal.cjs.map +1 -0
  5. package/dist/animation/animated-signal.d.ts +35 -0
  6. package/dist/animation/animated-signal.d.ts.map +1 -0
  7. package/dist/animation/animated-signal.js +19 -0
  8. package/dist/animation/animated-signal.js.map +1 -0
  9. package/dist/animation/create-spring.cjs +80 -0
  10. package/dist/animation/create-spring.cjs.map +1 -0
  11. package/dist/animation/create-spring.d.ts +56 -0
  12. package/dist/animation/create-spring.d.ts.map +1 -0
  13. package/dist/animation/create-spring.js +80 -0
  14. package/dist/animation/create-spring.js.map +1 -0
  15. package/dist/animation/easing.cjs +76 -0
  16. package/dist/animation/easing.cjs.map +1 -0
  17. package/dist/animation/easing.d.ts +45 -0
  18. package/dist/animation/easing.d.ts.map +1 -0
  19. package/dist/animation/easing.js +76 -0
  20. package/dist/animation/easing.js.map +1 -0
  21. package/dist/animation/effect-definitions.cjs +441 -0
  22. package/dist/animation/effect-definitions.cjs.map +1 -0
  23. package/dist/animation/effect-definitions.d.ts +60 -0
  24. package/dist/animation/effect-definitions.d.ts.map +1 -0
  25. package/dist/animation/effect-definitions.js +441 -0
  26. package/dist/animation/effect-definitions.js.map +1 -0
  27. package/dist/animation/effect-engine.cjs +189 -0
  28. package/dist/animation/effect-engine.cjs.map +1 -0
  29. package/dist/animation/effect-engine.d.ts +70 -0
  30. package/dist/animation/effect-engine.d.ts.map +1 -0
  31. package/dist/animation/effect-engine.js +189 -0
  32. package/dist/animation/effect-engine.js.map +1 -0
  33. package/dist/animation/index.d.ts +24 -0
  34. package/dist/animation/index.d.ts.map +1 -0
  35. package/dist/animation/spring-physics.cjs +94 -0
  36. package/dist/animation/spring-physics.cjs.map +1 -0
  37. package/dist/animation/spring-physics.d.ts +145 -0
  38. package/dist/animation/spring-physics.d.ts.map +1 -0
  39. package/dist/animation/spring-physics.js +94 -0
  40. package/dist/animation/spring-physics.js.map +1 -0
  41. package/dist/animation/tween.cjs +67 -0
  42. package/dist/animation/tween.cjs.map +1 -0
  43. package/dist/animation/tween.d.ts +60 -0
  44. package/dist/animation/tween.d.ts.map +1 -0
  45. package/dist/animation/tween.js +67 -0
  46. package/dist/animation/tween.js.map +1 -0
  47. package/dist/animation/types.d.ts +31 -0
  48. package/dist/animation/types.d.ts.map +1 -0
  49. package/dist/animation/useSpring.cjs +152 -0
  50. package/dist/animation/useSpring.cjs.map +1 -0
  51. package/dist/animation/useSpring.d.ts +55 -0
  52. package/dist/animation/useSpring.d.ts.map +1 -0
  53. package/dist/animation/useSpring.js +149 -0
  54. package/dist/animation/useSpring.js.map +1 -0
  55. package/dist/animation/useTween.cjs +208 -0
  56. package/dist/animation/useTween.cjs.map +1 -0
  57. package/dist/animation/useTween.d.ts +116 -0
  58. package/dist/animation/useTween.d.ts.map +1 -0
  59. package/dist/animation/useTween.js +208 -0
  60. package/dist/animation/useTween.js.map +1 -0
  61. package/dist/border-geometry.cjs +447 -0
  62. package/dist/border-geometry.cjs.map +1 -0
  63. package/dist/border-geometry.d.ts +114 -0
  64. package/dist/border-geometry.d.ts.map +1 -0
  65. package/dist/border-geometry.js +447 -0
  66. package/dist/border-geometry.js.map +1 -0
  67. package/dist/colors/color-presets.cjs +236 -0
  68. package/dist/colors/color-presets.cjs.map +1 -0
  69. package/dist/colors/color-presets.d.ts +89 -0
  70. package/dist/colors/color-presets.d.ts.map +1 -0
  71. package/dist/colors/color-presets.js +236 -0
  72. package/dist/colors/color-presets.js.map +1 -0
  73. package/dist/colors/color-theme-helpers.cjs +32 -0
  74. package/dist/colors/color-theme-helpers.cjs.map +1 -0
  75. package/dist/colors/color-theme-helpers.d.ts +65 -0
  76. package/dist/colors/color-theme-helpers.d.ts.map +1 -0
  77. package/dist/colors/color-theme-helpers.js +32 -0
  78. package/dist/colors/color-theme-helpers.js.map +1 -0
  79. package/dist/colors/color-types.cjs +38 -0
  80. package/dist/colors/color-types.cjs.map +1 -0
  81. package/dist/colors/color-types.d.ts +112 -0
  82. package/dist/colors/color-types.d.ts.map +1 -0
  83. package/dist/colors/color-types.js +38 -0
  84. package/dist/colors/color-types.js.map +1 -0
  85. package/dist/colors/color-utils.cjs +197 -0
  86. package/dist/colors/color-utils.cjs.map +1 -0
  87. package/dist/colors/color-utils.d.ts +216 -0
  88. package/dist/colors/color-utils.d.ts.map +1 -0
  89. package/dist/colors/color-utils.js +197 -0
  90. package/dist/colors/color-utils.js.map +1 -0
  91. package/dist/colors/contrast-contracts.cjs +265 -0
  92. package/dist/colors/contrast-contracts.cjs.map +1 -0
  93. package/dist/colors/contrast-contracts.d.ts +289 -0
  94. package/dist/colors/contrast-contracts.d.ts.map +1 -0
  95. package/dist/colors/contrast-contracts.js +265 -0
  96. package/dist/colors/contrast-contracts.js.map +1 -0
  97. package/dist/colors/index.cjs +55 -0
  98. package/dist/colors/index.cjs.map +1 -0
  99. package/dist/colors/index.d.ts +16 -0
  100. package/dist/colors/index.d.ts.map +1 -0
  101. package/dist/colors/index.js +55 -0
  102. package/dist/colors/index.js.map +1 -0
  103. package/dist/core-props.cjs +66 -0
  104. package/dist/core-props.cjs.map +1 -0
  105. package/dist/core-props.d.ts +395 -0
  106. package/dist/core-props.d.ts.map +1 -0
  107. package/dist/core-props.js +66 -0
  108. package/dist/core-props.js.map +1 -0
  109. package/dist/design-tokens/design-token-presets.cjs +91 -0
  110. package/dist/design-tokens/design-token-presets.cjs.map +1 -0
  111. package/dist/design-tokens/design-token-presets.d.ts +34 -0
  112. package/dist/design-tokens/design-token-presets.d.ts.map +1 -0
  113. package/dist/design-tokens/design-token-presets.js +91 -0
  114. package/dist/design-tokens/design-token-presets.js.map +1 -0
  115. package/dist/design-tokens/design-token-types.d.ts +97 -0
  116. package/dist/design-tokens/design-token-types.d.ts.map +1 -0
  117. package/dist/design-tokens/index.cjs +10 -0
  118. package/dist/design-tokens/index.cjs.map +1 -0
  119. package/dist/design-tokens/index.d.ts +9 -0
  120. package/dist/design-tokens/index.d.ts.map +1 -0
  121. package/dist/design-tokens/index.js +10 -0
  122. package/dist/design-tokens/index.js.map +1 -0
  123. package/dist/dev-config.cjs +296 -0
  124. package/dist/dev-config.cjs.map +1 -0
  125. package/dist/dev-config.d.ts +238 -0
  126. package/dist/dev-config.d.ts.map +1 -0
  127. package/dist/dev-config.js +296 -0
  128. package/dist/dev-config.js.map +1 -0
  129. package/dist/effects.cjs +69 -0
  130. package/dist/effects.cjs.map +1 -0
  131. package/dist/effects.d.ts +152 -0
  132. package/dist/effects.d.ts.map +1 -0
  133. package/dist/effects.js +69 -0
  134. package/dist/effects.js.map +1 -0
  135. package/dist/global-registry.cjs +25 -0
  136. package/dist/global-registry.cjs.map +1 -0
  137. package/dist/global-registry.d.ts +19 -0
  138. package/dist/global-registry.d.ts.map +1 -0
  139. package/dist/global-registry.js +25 -0
  140. package/dist/global-registry.js.map +1 -0
  141. package/dist/hooks.cjs +378 -0
  142. package/dist/hooks.cjs.map +1 -0
  143. package/dist/hooks.d.ts +322 -0
  144. package/dist/hooks.d.ts.map +1 -0
  145. package/dist/hooks.js +378 -0
  146. package/dist/hooks.js.map +1 -0
  147. package/dist/host-adapter.d.ts +414 -0
  148. package/dist/host-adapter.d.ts.map +1 -0
  149. package/dist/index.cjs +229 -0
  150. package/dist/index.cjs.map +1 -0
  151. package/dist/index.d.ts +32 -0
  152. package/dist/index.d.ts.map +1 -0
  153. package/dist/index.js +226 -0
  154. package/dist/index.js.map +1 -0
  155. package/dist/jsx-dev-runtime.cjs +10 -0
  156. package/dist/jsx-dev-runtime.cjs.map +1 -0
  157. package/dist/jsx-dev-runtime.d.ts +5 -0
  158. package/dist/jsx-dev-runtime.d.ts.map +1 -0
  159. package/dist/jsx-dev-runtime.js +11 -0
  160. package/dist/jsx-dev-runtime.js.map +1 -0
  161. package/dist/jsx-runtime.cjs +44 -0
  162. package/dist/jsx-runtime.cjs.map +1 -0
  163. package/dist/jsx-runtime.d.ts +24 -0
  164. package/dist/jsx-runtime.d.ts.map +1 -0
  165. package/dist/jsx-runtime.js +44 -0
  166. package/dist/jsx-runtime.js.map +1 -0
  167. package/dist/jsx-types.d.ts +25 -0
  168. package/dist/jsx-types.d.ts.map +1 -0
  169. package/dist/layout/appliers/container-applier.cjs +20 -0
  170. package/dist/layout/appliers/container-applier.cjs.map +1 -0
  171. package/dist/layout/appliers/container-applier.d.ts +9 -0
  172. package/dist/layout/appliers/container-applier.d.ts.map +1 -0
  173. package/dist/layout/appliers/container-applier.js +20 -0
  174. package/dist/layout/appliers/container-applier.js.map +1 -0
  175. package/dist/layout/appliers/position-applier.cjs +31 -0
  176. package/dist/layout/appliers/position-applier.cjs.map +1 -0
  177. package/dist/layout/appliers/position-applier.d.ts +8 -0
  178. package/dist/layout/appliers/position-applier.d.ts.map +1 -0
  179. package/dist/layout/appliers/position-applier.js +31 -0
  180. package/dist/layout/appliers/position-applier.js.map +1 -0
  181. package/dist/layout/layout-engine-test-utils.d.ts +26 -0
  182. package/dist/layout/layout-engine-test-utils.d.ts.map +1 -0
  183. package/dist/layout/layout-engine.cjs +628 -0
  184. package/dist/layout/layout-engine.cjs.map +1 -0
  185. package/dist/layout/layout-engine.d.ts +140 -0
  186. package/dist/layout/layout-engine.d.ts.map +1 -0
  187. package/dist/layout/layout-engine.js +628 -0
  188. package/dist/layout/layout-engine.js.map +1 -0
  189. package/dist/layout/strategies/base-strategy.cjs +31 -0
  190. package/dist/layout/strategies/base-strategy.cjs.map +1 -0
  191. package/dist/layout/strategies/base-strategy.d.ts +59 -0
  192. package/dist/layout/strategies/base-strategy.d.ts.map +1 -0
  193. package/dist/layout/strategies/base-strategy.js +31 -0
  194. package/dist/layout/strategies/base-strategy.js.map +1 -0
  195. package/dist/layout/strategies/column-layout.cjs +145 -0
  196. package/dist/layout/strategies/column-layout.cjs.map +1 -0
  197. package/dist/layout/strategies/column-layout.d.ts +38 -0
  198. package/dist/layout/strategies/column-layout.d.ts.map +1 -0
  199. package/dist/layout/strategies/column-layout.js +145 -0
  200. package/dist/layout/strategies/column-layout.js.map +1 -0
  201. package/dist/layout/strategies/row-layout.cjs +145 -0
  202. package/dist/layout/strategies/row-layout.cjs.map +1 -0
  203. package/dist/layout/strategies/row-layout.d.ts +38 -0
  204. package/dist/layout/strategies/row-layout.d.ts.map +1 -0
  205. package/dist/layout/strategies/row-layout.js +145 -0
  206. package/dist/layout/strategies/row-layout.js.map +1 -0
  207. package/dist/layout/strategies/stack-layout.cjs +94 -0
  208. package/dist/layout/strategies/stack-layout.cjs.map +1 -0
  209. package/dist/layout/strategies/stack-layout.d.ts +30 -0
  210. package/dist/layout/strategies/stack-layout.d.ts.map +1 -0
  211. package/dist/layout/strategies/stack-layout.js +94 -0
  212. package/dist/layout/strategies/stack-layout.js.map +1 -0
  213. package/dist/layout/types.d.ts +134 -0
  214. package/dist/layout/types.d.ts.map +1 -0
  215. package/dist/layout/utils/child-utils.cjs +129 -0
  216. package/dist/layout/utils/child-utils.cjs.map +1 -0
  217. package/dist/layout/utils/child-utils.d.ts +54 -0
  218. package/dist/layout/utils/child-utils.d.ts.map +1 -0
  219. package/dist/layout/utils/child-utils.js +129 -0
  220. package/dist/layout/utils/child-utils.js.map +1 -0
  221. package/dist/layout/utils/dimension-calculator.cjs +109 -0
  222. package/dist/layout/utils/dimension-calculator.cjs.map +1 -0
  223. package/dist/layout/utils/dimension-calculator.d.ts +59 -0
  224. package/dist/layout/utils/dimension-calculator.d.ts.map +1 -0
  225. package/dist/layout/utils/dimension-calculator.js +109 -0
  226. package/dist/layout/utils/dimension-calculator.js.map +1 -0
  227. package/dist/layout/utils/flex-distributor.cjs +173 -0
  228. package/dist/layout/utils/flex-distributor.cjs.map +1 -0
  229. package/dist/layout/utils/flex-distributor.d.ts +18 -0
  230. package/dist/layout/utils/flex-distributor.d.ts.map +1 -0
  231. package/dist/layout/utils/flex-distributor.js +173 -0
  232. package/dist/layout/utils/flex-distributor.js.map +1 -0
  233. package/dist/layout/utils/size-resolver.cjs +280 -0
  234. package/dist/layout/utils/size-resolver.cjs.map +1 -0
  235. package/dist/layout/utils/size-resolver.d.ts +84 -0
  236. package/dist/layout/utils/size-resolver.d.ts.map +1 -0
  237. package/dist/layout/utils/size-resolver.js +280 -0
  238. package/dist/layout/utils/size-resolver.js.map +1 -0
  239. package/dist/layout/utils/spacing-calculator.cjs +50 -0
  240. package/dist/layout/utils/spacing-calculator.cjs.map +1 -0
  241. package/dist/layout/utils/spacing-calculator.d.ts +27 -0
  242. package/dist/layout/utils/spacing-calculator.d.ts.map +1 -0
  243. package/dist/layout/utils/spacing-calculator.js +50 -0
  244. package/dist/layout/utils/spacing-calculator.js.map +1 -0
  245. package/dist/memo.cjs +18 -0
  246. package/dist/memo.cjs.map +1 -0
  247. package/dist/memo.d.ts +29 -0
  248. package/dist/memo.d.ts.map +1 -0
  249. package/dist/memo.js +18 -0
  250. package/dist/memo.js.map +1 -0
  251. package/dist/nineslice-contract.cjs +60 -0
  252. package/dist/nineslice-contract.cjs.map +1 -0
  253. package/dist/nineslice-contract.d.ts +107 -0
  254. package/dist/nineslice-contract.d.ts.map +1 -0
  255. package/dist/nineslice-contract.js +60 -0
  256. package/dist/nineslice-contract.js.map +1 -0
  257. package/dist/placeholder.cjs +12 -0
  258. package/dist/placeholder.cjs.map +1 -0
  259. package/dist/placeholder.d.ts +44 -0
  260. package/dist/placeholder.d.ts.map +1 -0
  261. package/dist/placeholder.js +12 -0
  262. package/dist/placeholder.js.map +1 -0
  263. package/dist/portal.cjs +89 -0
  264. package/dist/portal.cjs.map +1 -0
  265. package/dist/portal.d.ts +62 -0
  266. package/dist/portal.d.ts.map +1 -0
  267. package/dist/portal.js +89 -0
  268. package/dist/portal.js.map +1 -0
  269. package/dist/primitive-contracts.cjs +12 -0
  270. package/dist/primitive-contracts.cjs.map +1 -0
  271. package/dist/primitive-contracts.d.ts +186 -0
  272. package/dist/primitive-contracts.d.ts.map +1 -0
  273. package/dist/primitive-contracts.js +12 -0
  274. package/dist/primitive-contracts.js.map +1 -0
  275. package/dist/theme.cjs +332 -0
  276. package/dist/theme.cjs.map +1 -0
  277. package/dist/theme.d.ts +204 -0
  278. package/dist/theme.d.ts.map +1 -0
  279. package/dist/theme.js +332 -0
  280. package/dist/theme.js.map +1 -0
  281. package/dist/types.d.ts +86 -0
  282. package/dist/types.d.ts.map +1 -0
  283. package/dist/vdom/create-runtime.cjs +79 -0
  284. package/dist/vdom/create-runtime.cjs.map +1 -0
  285. package/dist/vdom/create-runtime.d.ts +7 -0
  286. package/dist/vdom/create-runtime.d.ts.map +1 -0
  287. package/dist/vdom/create-runtime.js +79 -0
  288. package/dist/vdom/create-runtime.js.map +1 -0
  289. package/dist/vdom/index.cjs +8 -0
  290. package/dist/vdom/index.cjs.map +1 -0
  291. package/dist/vdom/index.d.ts +4 -0
  292. package/dist/vdom/index.d.ts.map +1 -0
  293. package/dist/vdom/index.js +8 -0
  294. package/dist/vdom/index.js.map +1 -0
  295. package/dist/vdom/mount.cjs +161 -0
  296. package/dist/vdom/mount.cjs.map +1 -0
  297. package/dist/vdom/mount.d.ts +6 -0
  298. package/dist/vdom/mount.d.ts.map +1 -0
  299. package/dist/vdom/mount.js +161 -0
  300. package/dist/vdom/mount.js.map +1 -0
  301. package/dist/vdom/patch.cjs +163 -0
  302. package/dist/vdom/patch.cjs.map +1 -0
  303. package/dist/vdom/patch.d.ts +3 -0
  304. package/dist/vdom/patch.d.ts.map +1 -0
  305. package/dist/vdom/patch.js +163 -0
  306. package/dist/vdom/patch.js.map +1 -0
  307. package/dist/vdom/registry.cjs +85 -0
  308. package/dist/vdom/registry.cjs.map +1 -0
  309. package/dist/vdom/registry.d.ts +28 -0
  310. package/dist/vdom/registry.d.ts.map +1 -0
  311. package/dist/vdom/registry.js +85 -0
  312. package/dist/vdom/registry.js.map +1 -0
  313. package/dist/vdom/runtime-helpers.cjs +23 -0
  314. package/dist/vdom/runtime-helpers.cjs.map +1 -0
  315. package/dist/vdom/runtime-helpers.d.ts +8 -0
  316. package/dist/vdom/runtime-helpers.d.ts.map +1 -0
  317. package/dist/vdom/runtime-helpers.js +23 -0
  318. package/dist/vdom/runtime-helpers.js.map +1 -0
  319. package/dist/vdom/surface.cjs +107 -0
  320. package/dist/vdom/surface.cjs.map +1 -0
  321. package/dist/vdom/surface.d.ts +9 -0
  322. package/dist/vdom/surface.d.ts.map +1 -0
  323. package/dist/vdom/surface.js +107 -0
  324. package/dist/vdom/surface.js.map +1 -0
  325. package/dist/vdom/types.d.ts +104 -0
  326. package/dist/vdom/types.d.ts.map +1 -0
  327. package/dist/vdom/utils.cjs +146 -0
  328. package/dist/vdom/utils.cjs.map +1 -0
  329. package/dist/vdom/utils.d.ts +24 -0
  330. package/dist/vdom/utils.d.ts.map +1 -0
  331. package/dist/vdom/utils.js +146 -0
  332. package/dist/vdom/utils.js.map +1 -0
  333. package/dist/vdom.d.ts +4 -0
  334. package/dist/vdom.d.ts.map +1 -0
  335. package/dist/vector-draw-context.d.ts +63 -0
  336. package/dist/vector-draw-context.d.ts.map +1 -0
  337. package/package.json +161 -0
  338. package/vdom/index.cjs +1 -0
  339. package/vdom/index.d.ts +1 -0
  340. package/vdom/index.js +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color-utils.js","sources":["../../src/colors/color-utils.ts"],"sourcesContent":["/**\n * Color utility functions — renderer-neutral color math.\n * Provides conversion between formats and color manipulation.\n */\n\nimport type { TextStyleToken } from '../design-tokens/design-token-types'\nimport { HexColor, type RGBColor } from './color-types'\n\n/**\n * Convert hex string to Phaser number format\n * @param hex - Hex color string (e.g., '#ffffff' or 'ffffff')\n * @returns Phaser color number (e.g., 0xffffff)\n * @example\n * ```typescript\n * hexToNumber('#ff0000') // returns 0xff0000\n * hexToNumber('00ff00') // returns 0x00ff00\n * ```\n */\nexport function hexToNumber(hex: string): number {\n const cleaned = hex.replace('#', '')\n return parseInt(cleaned, 16)\n}\n\n/**\n * Convert Phaser number format to hex string\n * @param num - Phaser color number (e.g., 0xffffff)\n * @param withHash - Include '#' prefix (default: true)\n * @returns Hex color string (e.g., '#ffffff')\n * @example\n * ```typescript\n * numberToHex(0xff0000) // returns '#ff0000'\n * numberToHex(0x00ff00, false) // returns '00ff00'\n * ```\n */\nexport function numberToHex(num: number, withHash = true): string {\n const hex = normalizeColorNumber(num).toString(16).padStart(6, '0')\n return withHash ? `#${hex}` : hex\n}\n\n/**\n * Normalize a color number to Phaser's 0x000000-0xffffff RGB range.\n * @param color - Color number to normalize\n * @returns RGB color number in the 24-bit range\n */\nexport function normalizeColorNumber(color: number): number {\n if (!Number.isFinite(color)) return 0x000000\n return Math.max(0, Math.round(color)) & 0xffffff\n}\n\n/**\n * Normalize a text color value to a CSS-compatible hex string.\n *\n * Handles all common formats users might pass in JSX style.color:\n * - `0xff0000` (number) → `'#ff0000'`\n * - `'0xff0000'` (0x-prefixed string) → `'#ff0000'`\n * - `'0xf00'` (0x short string) → `'#ff0000'`\n * - `'#f00'` (short CSS hex) → `'#ff0000'`\n * - `'#ff0000'` (full CSS hex) → `'#ff0000'` (passthrough)\n * - `'red'`, `'yellow'` (CSS name) → passthrough unchanged\n * - `undefined` → `undefined`\n *\n * Both renderers (Phaser, Pixi) receive the same normalized value,\n * preventing inconsistent color rendering across renderers.\n *\n * @param color - Raw color value from style.color\n * @returns Normalized CSS hex string, CSS name, or undefined\n */\nexport function normalizeTextColor(color: string | number | undefined): string | undefined {\n if (color === undefined || color === null) return undefined\n\n // Number: convert to #rrggbb\n if (typeof color === 'number') {\n return numberToHex(normalizeColorNumber(color))\n }\n\n // String: detect and normalize 0x-prefixed hex strings\n const trimmed = color.trim()\n if (trimmed === '') return undefined\n\n // '0xf00' or '0xff0000' → parse as hex, convert to #rrggbb\n if (/^0x[0-9a-fA-F]+$/.test(trimmed)) {\n const num = parseInt(trimmed.slice(2), 16)\n if (Number.isNaN(num)) return undefined\n return numberToHex(normalizeColorNumber(num))\n }\n\n // '#f00' → '#ff0000' (expand short CSS hex)\n if (/^#[0-9a-fA-F]{3}$/.test(trimmed)) {\n const r = trimmed[1]\n const g = trimmed[2]\n const b = trimmed[3]\n return `#${r}${r}${g}${g}${b}${b}`\n }\n\n // Already clean '#ff0000' or CSS name like 'red' — passthrough\n return trimmed\n}\n\n/**\n * Convert RGB values to Phaser number format\n * @param r - Red component (0-255)\n * @param g - Green component (0-255)\n * @param b - Blue component (0-255)\n * @returns Phaser color number\n * @example\n * ```typescript\n * rgbToNumber(255, 0, 0) // returns 0xff0000 (red)\n * rgbToNumber(0, 255, 0) // returns 0x00ff00 (green)\n * rgbToNumber(255, 255, 255) // returns 0xffffff (white)\n * ```\n */\nexport function rgbToNumber(r: number, g: number, b: number): number {\n return ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff)\n}\n\n/**\n * Convert Phaser number to RGB components\n * @param num - Phaser color number\n * @returns RGB color object\n * @example\n * ```typescript\n * numberToRgb(0xff0000) // returns { r: 255, g: 0, b: 0 }\n * numberToRgb(0x00ff00) // returns { r: 0, g: 255, b: 0 }\n * ```\n */\nexport function numberToRgb(num: number): RGBColor {\n const normalized = normalizeColorNumber(num)\n\n return {\n r: (normalized >> 16) & 0xff,\n g: (normalized >> 8) & 0xff,\n b: normalized & 0xff,\n }\n}\n\n/**\n * HSL color representation\n */\nexport interface HSLColor {\n /** Hue in normalized range (0.0 to 1.0) */\n h: number\n /** Saturation in normalized range (0.0 to 1.0) */\n s: number\n /** Lightness in normalized range (0.0 to 1.0) */\n l: number\n}\n\n/**\n * Convert RGB values to HSL values (normalized 0.0 to 1.0)\n * @param r - Red component (0-255)\n * @param g - Green component (0-255)\n * @param b - Blue component (0-255)\n * @returns HSL color values with normalized components\n * @example\n * ```typescript\n * rgbToHsl(255, 0, 0) // returns { h: 0, s: 1, l: 0.5 }\n * rgbToHsl(0, 255, 0) // returns { h: 0.333..., s: 1, l: 0.5 }\n * ```\n */\nexport function rgbToHsl(r: number, g: number, b: number): HSLColor {\n const red = r / 255\n const green = g / 255\n const blue = b / 255\n const max = Math.max(red, green, blue)\n const min = Math.min(red, green, blue)\n const delta = max - min\n const light = (max + min) / 2\n\n if (delta === 0) {\n return { h: 0, s: 0, l: light }\n }\n\n const saturationValue = light > 0.5 ? delta / (2 - max - min) : delta / (max + min)\n let hueValue: number\n if (max === red) {\n hueValue = (green - blue) / delta + (green < blue ? 6 : 0)\n } else if (max === green) {\n hueValue = (blue - red) / delta + 2\n } else {\n hueValue = (red - green) / delta + 4\n }\n return { h: hueValue / 6, s: saturationValue, l: light }\n}\n\n/**\n * Convert normalized HSL values to RGB components.\n * @param h - Hue in normalized range (0.0 to 1.0)\n * @param s - Saturation in normalized range (0.0 to 1.0)\n * @param l - Lightness in normalized range (0.0 to 1.0)\n * @returns RGB color object\n */\nexport function hslToRgb(h: number, s: number, l: number): RGBColor {\n const hue = (((Number.isFinite(h) ? h : 0) % 1) + 1) % 1\n const saturation = Math.max(0, Math.min(1, Number.isFinite(s) ? s : 0))\n const lightness = Math.max(0, Math.min(1, Number.isFinite(l) ? l : 0))\n\n if (saturation === 0) {\n const value = Math.round(lightness * 255)\n return { r: value, g: value, b: value }\n }\n\n const hueToRgb = (p: number, q: number, t: number): number => {\n let next = t\n if (next < 0) next += 1\n if (next > 1) next -= 1\n if (next < 1 / 6) return p + (q - p) * 6 * next\n if (next < 1 / 2) return q\n if (next < 2 / 3) return p + (q - p) * (2 / 3 - next) * 6\n return p\n }\n\n const q =\n lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation\n const p = 2 * lightness - q\n\n return {\n r: Math.round(hueToRgb(p, q, hue + 1 / 3) * 255),\n g: Math.round(hueToRgb(p, q, hue) * 255),\n b: Math.round(hueToRgb(p, q, hue - 1 / 3) * 255),\n }\n}\n\n/**\n * Convert normalized HSL values to Phaser number format.\n * @param h - Hue in normalized range (0.0 to 1.0)\n * @param s - Saturation in normalized range (0.0 to 1.0)\n * @param l - Lightness in normalized range (0.0 to 1.0)\n * @returns Phaser color number\n */\nexport function hslToNumber(h: number, s: number, l: number): number {\n const rgb = hslToRgb(h, s, l)\n return rgbToNumber(rgb.r, rgb.g, rgb.b)\n}\n\n/**\n * Convert Phaser number format to normalized HSL values.\n * @param color - Phaser color number\n * @returns HSL color values with normalized components\n */\nexport function numberToHsl(color: number): HSLColor {\n const rgb = numberToRgb(color)\n return rgbToHsl(rgb.r, rgb.g, rgb.b)\n}\n\n/**\n * Lighten a color by a given amount\n * @param color - Phaser color number\n * @param amount - Amount to lighten (0.0 to 1.0, where 1.0 is white)\n * @returns Lightened color number\n * @example\n * ```typescript\n * lighten(0x0000ff, 0.3) // returns lighter blue\n * lighten(0xff0000, 0.5) // returns light red/pink\n * ```\n */\nexport function lighten(color: number, amount: number): number {\n const rgb = numberToRgb(color)\n const factor = Math.max(0, Math.min(1, amount))\n\n const r = Math.round(rgb.r + (255 - rgb.r) * factor)\n const g = Math.round(rgb.g + (255 - rgb.g) * factor)\n const b = Math.round(rgb.b + (255 - rgb.b) * factor)\n\n return rgbToNumber(r, g, b)\n}\n\n/**\n * Darken a color by a given amount\n * @param color - Phaser color number\n * @param amount - Amount to darken (0.0 to 1.0, where 1.0 is black)\n * @returns Darkened color number\n * @example\n * ```typescript\n * darken(0x0000ff, 0.3) // returns darker blue\n * darken(0xff0000, 0.5) // returns dark red\n * ```\n */\nexport function darken(color: number, amount: number): number {\n const rgb = numberToRgb(color)\n const factor = 1 - Math.max(0, Math.min(1, amount))\n\n const r = Math.round(rgb.r * factor)\n const g = Math.round(rgb.g * factor)\n const b = Math.round(rgb.b * factor)\n\n return rgbToNumber(r, g, b)\n}\n\n/**\n * Lighten a hex color by a given amount\n * @param hex - Hex color (e.g., '#ffffff' or 'ffffff')\n * @param amount - Amount to lighten (0.0 to 1.0, where 1.0 is white)\n * @returns Lightened hex color string with '#' prefix\n * @example\n * ```typescript\n * lightenHex('#0000ff', 0.3) // returns lighter blue\n * lightenHex('#ff0000', 0.5) // returns light red/pink\n * ```\n */\nexport function lightenHex(hex: string, amount: number): HexColor {\n const num = hexToNumber(hex)\n const lightened = lighten(num, amount)\n return HexColor.from(numberToHex(lightened))\n}\n\n/**\n * Darken a hex color by a given amount\n * @param hex - Hex color (e.g., '#ffffff' or 'ffffff')\n * @param amount - Amount to darken (0.0 to 1.0, where 1.0 is black)\n * @returns Darkened hex color string with '#' prefix\n * @example\n * ```typescript\n * darkenHex('#0000ff', 0.3) // returns darker blue\n * darkenHex('#ff0000', 0.5) // returns dark red\n * ```\n */\nexport function darkenHex(hex: string, amount: number): HexColor {\n const num = hexToNumber(hex)\n const darkened = darken(num, amount)\n return HexColor.from(numberToHex(darkened))\n}\n\n/**\n * Convert color to rgba string for Phaser Text style\n * @param color - Phaser color number\n * @param alphaValue - Alpha value (0.0 to 1.0, default: 1.0)\n * @returns RGBA string usable in Text style (e.g., 'rgba(255, 0, 0, 0.5)')\n * @example\n * ```typescript\n * alpha(0xff0000, 1.0) // returns 'rgba(255, 0, 0, 1)'\n * alpha(0x00ff00, 0.5) // returns 'rgba(0, 255, 0, 0.5)'\n * alpha(0x0000ff) // returns 'rgba(0, 0, 255, 1)'\n * ```\n */\nexport function alpha(color: number, alphaValue = 1.0): string {\n const rgb = numberToRgb(color)\n const a = Math.max(0, Math.min(1, alphaValue))\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${a})`\n}\n\n/**\n * Calculate relative luminance of a color (WCAG formula)\n * @param color - Phaser color number\n * @returns Relative luminance (0.0 to 1.0)\n */\nfunction getLuminance(color: number): number {\n const rgb = numberToRgb(color)\n\n // Convert to sRGB\n const rsRGB = rgb.r / 255\n const gsRGB = rgb.g / 255\n const bsRGB = rgb.b / 255\n\n // Apply gamma correction\n const r = rsRGB <= 0.03928 ? rsRGB / 12.92 : Math.pow((rsRGB + 0.055) / 1.055, 2.4)\n const g = gsRGB <= 0.03928 ? gsRGB / 12.92 : Math.pow((gsRGB + 0.055) / 1.055, 2.4)\n const b = bsRGB <= 0.03928 ? bsRGB / 12.92 : Math.pow((bsRGB + 0.055) / 1.055, 2.4)\n\n // Calculate luminance\n return 0.2126 * r + 0.7152 * g + 0.0722 * b\n}\n\n/**\n * Calculate contrast ratio between two colors (WCAG 2.0)\n * @param foreground - Foreground color (e.g., text)\n * @param background - Background color\n * @returns Contrast ratio (1 to 21)\n * @example\n * ```typescript\n * getContrastRatio(0x000000, 0xffffff) // returns 21 (black on white)\n * getContrastRatio(0xffffff, 0xffffff) // returns 1 (white on white)\n * ```\n */\nexport function getContrastRatio(foreground: number, background: number): number {\n const l1 = getLuminance(foreground)\n const l2 = getLuminance(background)\n\n const lighter = Math.max(l1, l2)\n const darker = Math.min(l1, l2)\n\n return (lighter + 0.05) / (darker + 0.05)\n}\n\n/**\n * Ensure minimum contrast ratio by adjusting foreground color\n * Uses binary search for efficiency (O(log n) vs O(n))\n * @param foreground - Foreground color to adjust\n * @param background - Background color (fixed)\n * @param minRatio - Minimum contrast ratio (default: 4.5 for WCAG AA)\n * @returns Adjusted foreground color meeting contrast requirements\n * @example\n * ```typescript\n * // Ensure text is readable on background\n * const textColor = ensureContrast(0x888888, 0xffffff, 4.5)\n * ```\n */\nexport function ensureContrast(foreground: number, background: number, minRatio = 4.5): number {\n // If contrast is already sufficient, return original\n if (getContrastRatio(foreground, background) >= minRatio) {\n return foreground\n }\n\n // Determine if we should lighten or darken\n const bgLuminance = getLuminance(background)\n const shouldLighten = bgLuminance < 0.5\n\n // Binary search for the minimal adjustment needed\n let low = 0\n let high = 1\n\n while (high - low > 0.01) {\n const mid = (low + high) / 2\n const adjusted = shouldLighten ? lighten(foreground, mid) : darken(foreground, mid)\n\n if (getContrastRatio(adjusted, background) >= minRatio) {\n high = mid\n } else {\n low = mid\n }\n }\n\n return shouldLighten ? lighten(foreground, high) : darken(foreground, high)\n}\n\n/**\n * Create a TextStyleToken by merging base style with overrides to ensure required properties are set\n * @param baseStyle\n * @param overrides\n * @returns\n */\nexport function createTextStyle(\n baseStyle: Partial<TextStyleToken> | undefined,\n overrides: Partial<TextStyleToken>\n): TextStyleToken {\n const base = baseStyle ?? {}\n return {\n fontSize: overrides.fontSize ?? base.fontSize ?? '14px',\n color: overrides.color ?? base.color ?? '#ffffff',\n ...(base.fontFamily && { fontFamily: base.fontFamily }),\n ...(base.align && { align: base.align }),\n ...overrides,\n }\n}\n"],"names":["p","q"],"mappings":"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"}
@@ -0,0 +1,265 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const colorUtils = require("./color-utils.cjs");
4
+ const contrastBackgroundRoles = {
5
+ "background/default": {
6
+ description: "Main application background.",
7
+ color: { group: "background", shade: "DEFAULT" }
8
+ },
9
+ "surface/default": {
10
+ description: "Default surface for panels, cards, and controls.",
11
+ color: { group: "surface", shade: "DEFAULT" }
12
+ },
13
+ "surface/elevated": {
14
+ description: "Elevated surface used for stronger separation.",
15
+ color: { group: "surface", shade: "light" }
16
+ },
17
+ "brand/primary": {
18
+ description: "Primary brand background.",
19
+ color: { group: "primary", shade: "dark" }
20
+ },
21
+ "feedback/success": {
22
+ description: "Success-state background.",
23
+ color: { group: "success", shade: "dark" }
24
+ },
25
+ "feedback/warning": {
26
+ description: "Warning-state background.",
27
+ color: { group: "warning", shade: "dark" }
28
+ },
29
+ "feedback/error": {
30
+ description: "Error-state background.",
31
+ color: { group: "error", shade: "dark" }
32
+ }
33
+ };
34
+ const contrastForegroundRoles = {
35
+ "text/default": {
36
+ description: "Default body text.",
37
+ kind: "text",
38
+ candidates: [
39
+ { group: "text", shade: "DEFAULT" },
40
+ { group: "text", shade: "dark" },
41
+ { group: "text", shade: "darkest" },
42
+ { group: "text", shade: "light" }
43
+ ]
44
+ },
45
+ "text/muted": {
46
+ description: "Secondary or supporting text.",
47
+ kind: "text",
48
+ candidates: [
49
+ { group: "text", shade: "light" },
50
+ { group: "text", shade: "medium" },
51
+ { group: "text", shade: "DEFAULT" }
52
+ ]
53
+ },
54
+ "text/strong": {
55
+ description: "Emphasized text on neutral surfaces.",
56
+ kind: "text",
57
+ candidates: [
58
+ { group: "text", shade: "darkest" },
59
+ { group: "text", shade: "dark" },
60
+ { group: "text", shade: "DEFAULT" }
61
+ ]
62
+ },
63
+ "text/on-brand": {
64
+ description: "Text intended for strong brand or colored backgrounds.",
65
+ kind: "text",
66
+ candidates: [
67
+ { group: "text", shade: "lightest" },
68
+ { group: "text", shade: "light" },
69
+ { group: "text", shade: "DEFAULT" }
70
+ ]
71
+ },
72
+ "text/on-danger": {
73
+ description: "Text intended for danger/error backgrounds.",
74
+ kind: "text",
75
+ candidates: [
76
+ { group: "text", shade: "lightest" },
77
+ { group: "text", shade: "light" },
78
+ { group: "text", shade: "DEFAULT" }
79
+ ]
80
+ },
81
+ "icon/on-brand": {
82
+ description: "Icon tint intended for strong brand or colored backgrounds.",
83
+ kind: "icon",
84
+ candidates: [
85
+ { group: "text", shade: "lightest" },
86
+ { group: "text", shade: "light" },
87
+ { group: "text", shade: "DEFAULT" }
88
+ ]
89
+ },
90
+ "icon/on-danger": {
91
+ description: "Icon tint intended for danger/error backgrounds.",
92
+ kind: "icon",
93
+ candidates: [
94
+ { group: "text", shade: "lightest" },
95
+ { group: "text", shade: "light" },
96
+ { group: "text", shade: "DEFAULT" }
97
+ ]
98
+ }
99
+ };
100
+ const defaultContrastContracts = [
101
+ {
102
+ id: "body-on-background",
103
+ description: "Default body text on the main application background.",
104
+ foregroundRole: "text/default",
105
+ backgroundRole: "background/default",
106
+ minRatio: 4.5
107
+ },
108
+ {
109
+ id: "body-on-surface",
110
+ description: "Default body text on standard surfaces and cards.",
111
+ foregroundRole: "text/default",
112
+ backgroundRole: "surface/default",
113
+ minRatio: 4.5
114
+ },
115
+ {
116
+ id: "muted-on-surface",
117
+ description: "Muted supporting text on standard surfaces.",
118
+ foregroundRole: "text/muted",
119
+ backgroundRole: "surface/default",
120
+ minRatio: 4.5
121
+ },
122
+ {
123
+ id: "strong-on-surface",
124
+ description: "Strong emphasized text on elevated surfaces.",
125
+ foregroundRole: "text/strong",
126
+ backgroundRole: "surface/elevated",
127
+ minRatio: 4.5
128
+ },
129
+ {
130
+ id: "text-on-primary",
131
+ description: "Readable text on the primary brand background.",
132
+ foregroundRole: "text/on-brand",
133
+ backgroundRole: "brand/primary",
134
+ minRatio: 4.5
135
+ },
136
+ {
137
+ id: "text-on-error",
138
+ description: "Readable text on the error background.",
139
+ foregroundRole: "text/on-danger",
140
+ backgroundRole: "feedback/error",
141
+ minRatio: 4.5
142
+ },
143
+ {
144
+ id: "icon-on-primary",
145
+ description: "Readable icon tint on the primary brand background.",
146
+ foregroundRole: "icon/on-brand",
147
+ backgroundRole: "brand/primary",
148
+ minRatio: 3
149
+ },
150
+ {
151
+ id: "icon-on-error",
152
+ description: "Readable icon tint on the error background.",
153
+ foregroundRole: "icon/on-danger",
154
+ backgroundRole: "feedback/error",
155
+ minRatio: 3
156
+ }
157
+ ];
158
+ function resolveContrastColorRef(colors, ref) {
159
+ return colors[ref.group][ref.shade].toNumber();
160
+ }
161
+ function resolveContrastBackgroundRole(colors, role) {
162
+ const definition = contrastBackgroundRoles[role];
163
+ const value = resolveContrastColorRef(colors, definition.color);
164
+ return {
165
+ role,
166
+ value,
167
+ hex: colorUtils.numberToHex(value)
168
+ };
169
+ }
170
+ function resolveContrastForegroundRole(colors, role, background, minRatio) {
171
+ const definition = contrastForegroundRoles[role];
172
+ const resolvedCandidates = definition.candidates.map((candidate) => ({
173
+ candidate,
174
+ value: resolveContrastColorRef(colors, candidate)
175
+ }));
176
+ const exactMatch = resolvedCandidates.find(
177
+ ({ value }) => colorUtils.getContrastRatio(value, background) >= minRatio
178
+ );
179
+ if (exactMatch) {
180
+ return {
181
+ role,
182
+ kind: definition.kind,
183
+ source: "token",
184
+ candidate: exactMatch.candidate,
185
+ value: exactMatch.value,
186
+ hex: colorUtils.numberToHex(exactMatch.value)
187
+ };
188
+ }
189
+ const preferred = resolvedCandidates[0];
190
+ if (!preferred) {
191
+ throw new Error(`Contrast foreground role "${role}" has no candidate colors.`);
192
+ }
193
+ const adjustedValue = colorUtils.ensureContrast(preferred.value, background, minRatio);
194
+ return {
195
+ role,
196
+ kind: definition.kind,
197
+ source: "adjusted",
198
+ candidate: preferred.candidate,
199
+ value: adjustedValue,
200
+ hex: colorUtils.numberToHex(adjustedValue)
201
+ };
202
+ }
203
+ function resolveContrastContract(colors, contract) {
204
+ const background = resolveContrastBackgroundRole(colors, contract.backgroundRole);
205
+ const foreground = resolveContrastForegroundRole(
206
+ colors,
207
+ contract.foregroundRole,
208
+ background.value,
209
+ contract.minRatio
210
+ );
211
+ const ratio = colorUtils.getContrastRatio(foreground.value, background.value);
212
+ return {
213
+ contract,
214
+ foreground,
215
+ background,
216
+ ratio,
217
+ passes: ratio >= contract.minRatio
218
+ };
219
+ }
220
+ function validateContrastContracts(colors, contracts = defaultContrastContracts) {
221
+ return contracts.map((contract) => resolveContrastContract(colors, contract));
222
+ }
223
+ function getFailingContrastContracts(colors, contracts = defaultContrastContracts) {
224
+ return validateContrastContracts(colors, contracts).filter((result) => !result.passes);
225
+ }
226
+ function getContrastContract(contractId) {
227
+ return defaultContrastContracts.find((contract) => contract.id === contractId);
228
+ }
229
+ function resolveContrastContractById(colors, contractId) {
230
+ const contract = getContrastContract(contractId);
231
+ if (!contract) throw new Error(`Contrast contract not found: ${contractId}`);
232
+ return resolveContrastContract(colors, contract);
233
+ }
234
+ function resolveContrastTextColor(colors, foregroundRole, background, minRatio = 4.5) {
235
+ return resolveContrastForegroundRole(colors, foregroundRole, background, minRatio).hex;
236
+ }
237
+ function resolveContrastTintColor(colors, foregroundRole, background, minRatio = 3) {
238
+ return resolveContrastForegroundRole(colors, foregroundRole, background, minRatio).value;
239
+ }
240
+ function formatResolvedContrastContract(resolved) {
241
+ const { contract, foreground, background, ratio } = resolved;
242
+ const status = resolved.passes ? "✓" : "✗";
243
+ return [
244
+ `${status} ${contract.id}`,
245
+ ` ${contract.description}`,
246
+ ` fg: ${foreground.hex} role=${foreground.role} kind=${foreground.kind} src=${foreground.source}`,
247
+ ` bg: ${background.hex} role=${background.role}`,
248
+ ` ratio: ${ratio.toFixed(2)}:1 (need ≥ ${contract.minRatio}:1)`
249
+ ].join("\n");
250
+ }
251
+ exports.contrastBackgroundRoles = contrastBackgroundRoles;
252
+ exports.contrastForegroundRoles = contrastForegroundRoles;
253
+ exports.defaultContrastContracts = defaultContrastContracts;
254
+ exports.formatResolvedContrastContract = formatResolvedContrastContract;
255
+ exports.getContrastContract = getContrastContract;
256
+ exports.getFailingContrastContracts = getFailingContrastContracts;
257
+ exports.resolveContrastBackgroundRole = resolveContrastBackgroundRole;
258
+ exports.resolveContrastColorRef = resolveContrastColorRef;
259
+ exports.resolveContrastContract = resolveContrastContract;
260
+ exports.resolveContrastContractById = resolveContrastContractById;
261
+ exports.resolveContrastForegroundRole = resolveContrastForegroundRole;
262
+ exports.resolveContrastTextColor = resolveContrastTextColor;
263
+ exports.resolveContrastTintColor = resolveContrastTintColor;
264
+ exports.validateContrastContracts = validateContrastContracts;
265
+ //# sourceMappingURL=contrast-contracts.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contrast-contracts.cjs","sources":["../../src/colors/contrast-contracts.ts"],"sourcesContent":["/**\n * Semantic contrast contracts for theme and preset authors.\n *\n * This file is intentionally a small first step:\n * - define a shared language for meaningful foreground/background pairings\n * - expose helpers that can resolve and validate those pairings\n * - keep room for a second step where component defaults and tests adopt them\n *\n * TODO(step-2): let theme-default builders consume these contracts directly.\n * TODO(step-2): move component-level contrast test heuristics onto this model.\n * TODO(step-3): add context-aware contracts for alpha/translucent surfaces.\n */\n\nimport type { ColorTokens, ShadeLevel } from './color-types'\nimport { ensureContrast, getContrastRatio, numberToHex } from './color-utils'\n\ntype TokenColorGroup =\n | 'background'\n | 'surface'\n | 'text'\n | 'border'\n | 'primary'\n | 'secondary'\n | 'accent'\n | 'success'\n | 'warning'\n | 'error'\n | 'info'\n\nexport interface ContrastColorRef {\n group: TokenColorGroup\n shade: ShadeLevel | 'DEFAULT'\n}\n\nexport interface ContrastBackgroundRoleDefinition {\n description: string\n color: ContrastColorRef\n}\n\nexport interface ContrastForegroundRoleDefinition {\n description: string\n kind: 'text' | 'icon'\n candidates: readonly ContrastColorRef[]\n}\n\nexport const contrastBackgroundRoles = {\n 'background/default': {\n description: 'Main application background.',\n color: { group: 'background', shade: 'DEFAULT' },\n },\n 'surface/default': {\n description: 'Default surface for panels, cards, and controls.',\n color: { group: 'surface', shade: 'DEFAULT' },\n },\n 'surface/elevated': {\n description: 'Elevated surface used for stronger separation.',\n color: { group: 'surface', shade: 'light' },\n },\n 'brand/primary': {\n description: 'Primary brand background.',\n color: { group: 'primary', shade: 'dark' },\n },\n 'feedback/success': {\n description: 'Success-state background.',\n color: { group: 'success', shade: 'dark' },\n },\n 'feedback/warning': {\n description: 'Warning-state background.',\n color: { group: 'warning', shade: 'dark' },\n },\n 'feedback/error': {\n description: 'Error-state background.',\n color: { group: 'error', shade: 'dark' },\n },\n} as const satisfies Record<string, ContrastBackgroundRoleDefinition>\n\nexport type ContrastBackgroundRole = keyof typeof contrastBackgroundRoles\n\nexport const contrastForegroundRoles = {\n 'text/default': {\n description: 'Default body text.',\n kind: 'text',\n candidates: [\n { group: 'text', shade: 'DEFAULT' },\n { group: 'text', shade: 'dark' },\n { group: 'text', shade: 'darkest' },\n { group: 'text', shade: 'light' },\n ],\n },\n 'text/muted': {\n description: 'Secondary or supporting text.',\n kind: 'text',\n candidates: [\n { group: 'text', shade: 'light' },\n { group: 'text', shade: 'medium' },\n { group: 'text', shade: 'DEFAULT' },\n ],\n },\n 'text/strong': {\n description: 'Emphasized text on neutral surfaces.',\n kind: 'text',\n candidates: [\n { group: 'text', shade: 'darkest' },\n { group: 'text', shade: 'dark' },\n { group: 'text', shade: 'DEFAULT' },\n ],\n },\n 'text/on-brand': {\n description: 'Text intended for strong brand or colored backgrounds.',\n kind: 'text',\n candidates: [\n { group: 'text', shade: 'lightest' },\n { group: 'text', shade: 'light' },\n { group: 'text', shade: 'DEFAULT' },\n ],\n },\n 'text/on-danger': {\n description: 'Text intended for danger/error backgrounds.',\n kind: 'text',\n candidates: [\n { group: 'text', shade: 'lightest' },\n { group: 'text', shade: 'light' },\n { group: 'text', shade: 'DEFAULT' },\n ],\n },\n 'icon/on-brand': {\n description: 'Icon tint intended for strong brand or colored backgrounds.',\n kind: 'icon',\n candidates: [\n { group: 'text', shade: 'lightest' },\n { group: 'text', shade: 'light' },\n { group: 'text', shade: 'DEFAULT' },\n ],\n },\n 'icon/on-danger': {\n description: 'Icon tint intended for danger/error backgrounds.',\n kind: 'icon',\n candidates: [\n { group: 'text', shade: 'lightest' },\n { group: 'text', shade: 'light' },\n { group: 'text', shade: 'DEFAULT' },\n ],\n },\n} as const satisfies Record<string, ContrastForegroundRoleDefinition>\n\nexport type ContrastForegroundRole = keyof typeof contrastForegroundRoles\n\nexport interface ContrastContract {\n id: string\n description: string\n foregroundRole: ContrastForegroundRole\n backgroundRole: ContrastBackgroundRole\n minRatio: number\n}\n\nexport const defaultContrastContracts = [\n {\n id: 'body-on-background',\n description: 'Default body text on the main application background.',\n foregroundRole: 'text/default',\n backgroundRole: 'background/default',\n minRatio: 4.5,\n },\n {\n id: 'body-on-surface',\n description: 'Default body text on standard surfaces and cards.',\n foregroundRole: 'text/default',\n backgroundRole: 'surface/default',\n minRatio: 4.5,\n },\n {\n id: 'muted-on-surface',\n description: 'Muted supporting text on standard surfaces.',\n foregroundRole: 'text/muted',\n backgroundRole: 'surface/default',\n minRatio: 4.5,\n },\n {\n id: 'strong-on-surface',\n description: 'Strong emphasized text on elevated surfaces.',\n foregroundRole: 'text/strong',\n backgroundRole: 'surface/elevated',\n minRatio: 4.5,\n },\n {\n id: 'text-on-primary',\n description: 'Readable text on the primary brand background.',\n foregroundRole: 'text/on-brand',\n backgroundRole: 'brand/primary',\n minRatio: 4.5,\n },\n {\n id: 'text-on-error',\n description: 'Readable text on the error background.',\n foregroundRole: 'text/on-danger',\n backgroundRole: 'feedback/error',\n minRatio: 4.5,\n },\n {\n id: 'icon-on-primary',\n description: 'Readable icon tint on the primary brand background.',\n foregroundRole: 'icon/on-brand',\n backgroundRole: 'brand/primary',\n minRatio: 3,\n },\n {\n id: 'icon-on-error',\n description: 'Readable icon tint on the error background.',\n foregroundRole: 'icon/on-danger',\n backgroundRole: 'feedback/error',\n minRatio: 3,\n },\n] as const satisfies readonly ContrastContract[]\n\nexport interface ResolvedContrastColor {\n role: ContrastForegroundRole | ContrastBackgroundRole\n value: number\n hex: string\n}\n\nexport interface ResolvedContrastForeground extends ResolvedContrastColor {\n kind: 'text' | 'icon'\n source: 'token' | 'adjusted'\n candidate: ContrastColorRef\n}\n\nexport interface ResolvedContrastContract {\n contract: ContrastContract\n foreground: ResolvedContrastForeground\n background: ResolvedContrastColor\n ratio: number\n passes: boolean\n}\n\nexport function resolveContrastColorRef(colors: ColorTokens, ref: ContrastColorRef): number {\n return colors[ref.group][ref.shade].toNumber()\n}\n\nexport function resolveContrastBackgroundRole(\n colors: ColorTokens,\n role: ContrastBackgroundRole\n): ResolvedContrastColor {\n const definition = contrastBackgroundRoles[role]\n const value = resolveContrastColorRef(colors, definition.color)\n\n return {\n role,\n value,\n hex: numberToHex(value),\n }\n}\n\nexport function resolveContrastForegroundRole(\n colors: ColorTokens,\n role: ContrastForegroundRole,\n background: number,\n minRatio: number\n): ResolvedContrastForeground {\n const definition = contrastForegroundRoles[role]\n const resolvedCandidates = definition.candidates.map((candidate) => ({\n candidate,\n value: resolveContrastColorRef(colors, candidate),\n }))\n\n const exactMatch = resolvedCandidates.find(\n ({ value }) => getContrastRatio(value, background) >= minRatio\n )\n\n if (exactMatch) {\n return {\n role,\n kind: definition.kind,\n source: 'token',\n candidate: exactMatch.candidate,\n value: exactMatch.value,\n hex: numberToHex(exactMatch.value),\n }\n }\n\n const preferred = resolvedCandidates[0]\n if (!preferred) {\n throw new Error(`Contrast foreground role \"${role}\" has no candidate colors.`)\n }\n\n const adjustedValue = ensureContrast(preferred.value, background, minRatio)\n\n return {\n role,\n kind: definition.kind,\n source: 'adjusted',\n candidate: preferred.candidate,\n value: adjustedValue,\n hex: numberToHex(adjustedValue),\n }\n}\n\nexport function resolveContrastContract(\n colors: ColorTokens,\n contract: ContrastContract\n): ResolvedContrastContract {\n const background = resolveContrastBackgroundRole(colors, contract.backgroundRole)\n const foreground = resolveContrastForegroundRole(\n colors,\n contract.foregroundRole,\n background.value,\n contract.minRatio\n )\n const ratio = getContrastRatio(foreground.value, background.value)\n\n return {\n contract,\n foreground,\n background,\n ratio,\n passes: ratio >= contract.minRatio,\n }\n}\n\nexport function validateContrastContracts(\n colors: ColorTokens,\n contracts: readonly ContrastContract[] = defaultContrastContracts\n): ResolvedContrastContract[] {\n return contracts.map((contract) => resolveContrastContract(colors, contract))\n}\n\nexport function getFailingContrastContracts(\n colors: ColorTokens,\n contracts: readonly ContrastContract[] = defaultContrastContracts\n): ResolvedContrastContract[] {\n return validateContrastContracts(colors, contracts).filter((result) => !result.passes)\n}\n\nexport function getContrastContract(contractId: string): ContrastContract | undefined {\n return defaultContrastContracts.find((contract) => contract.id === contractId)\n}\n\n/**\n * Resolve a contract by id, throwing if the contract is not found.\n * Convenience wrapper around getContrastContract + resolveContrastContract.\n * @param colors - The color token set\n * @param contractId - The contract identifier (e.g. 'text-on-primary')\n * @returns Resolved contract with foreground, background, ratio, and pass/fail\n * @throws If no contract with the given id exists\n */\nexport function resolveContrastContractById(\n colors: ColorTokens,\n contractId: string\n): ResolvedContrastContract {\n const contract = getContrastContract(contractId)\n if (!contract) throw new Error(`Contrast contract not found: ${contractId}`)\n return resolveContrastContract(colors, contract)\n}\n\n/**\n * Convenience: resolve a foreground role against a numeric background and\n * return the resulting hex color string (for Text style `.color`).\n * @param colors - The color token set\n * @param foregroundRole - Semantic foreground role (e.g. 'text/on-brand')\n * @param background - Numeric background color to check contrast against\n * @param minRatio - Minimum contrast ratio (defaults to WCAG AA 4.5:1)\n * @returns Hex color string suitable for Text style `.color`\n */\nexport function resolveContrastTextColor(\n colors: ColorTokens,\n foregroundRole: ContrastForegroundRole,\n background: number,\n minRatio = 4.5\n): string {\n return resolveContrastForegroundRole(colors, foregroundRole, background, minRatio).hex\n}\n\n/**\n * Convenience: resolve a foreground role against a numeric background and\n * return the resulting numeric color (for Icon `.tint` or similar).\n * @param colors - The color token set\n * @param foregroundRole - Semantic foreground role (e.g. 'icon/on-brand')\n * @param background - Numeric background color to check contrast against\n * @param minRatio - Minimum contrast ratio (defaults to 3:1 for icons/UI graphics)\n * @returns Numeric color value\n */\nexport function resolveContrastTintColor(\n colors: ColorTokens,\n foregroundRole: ContrastForegroundRole,\n background: number,\n minRatio = 3\n): number {\n return resolveContrastForegroundRole(colors, foregroundRole, background, minRatio).value\n}\n\n/**\n * Format a resolved contract as a human-readable multi-line string.\n * Useful for debugging, CLI output, and authoring tools.\n * @param resolved - A resolved contrast contract\n * @returns Formatted description string\n */\nexport function formatResolvedContrastContract(resolved: ResolvedContrastContract): string {\n const { contract, foreground, background, ratio } = resolved\n const status = resolved.passes ? '✓' : '✗'\n return [\n `${status} ${contract.id}`,\n ` ${contract.description}`,\n ` fg: ${foreground.hex} role=${foreground.role} kind=${foreground.kind} src=${foreground.source}`,\n ` bg: ${background.hex} role=${background.role}`,\n ` ratio: ${ratio.toFixed(2)}:1 (need ≥ ${contract.minRatio}:1)`,\n ].join('\\n')\n}\n"],"names":["numberToHex","getContrastRatio","ensureContrast"],"mappings":"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"}
@@ -0,0 +1,289 @@
1
+ import { ColorTokens, ShadeLevel } from './color-types';
2
+ type TokenColorGroup = 'background' | 'surface' | 'text' | 'border' | 'primary' | 'secondary' | 'accent' | 'success' | 'warning' | 'error' | 'info';
3
+ export interface ContrastColorRef {
4
+ group: TokenColorGroup;
5
+ shade: ShadeLevel | 'DEFAULT';
6
+ }
7
+ export interface ContrastBackgroundRoleDefinition {
8
+ description: string;
9
+ color: ContrastColorRef;
10
+ }
11
+ export interface ContrastForegroundRoleDefinition {
12
+ description: string;
13
+ kind: 'text' | 'icon';
14
+ candidates: readonly ContrastColorRef[];
15
+ }
16
+ export declare const contrastBackgroundRoles: {
17
+ readonly 'background/default': {
18
+ readonly description: "Main application background.";
19
+ readonly color: {
20
+ readonly group: "background";
21
+ readonly shade: "DEFAULT";
22
+ };
23
+ };
24
+ readonly 'surface/default': {
25
+ readonly description: "Default surface for panels, cards, and controls.";
26
+ readonly color: {
27
+ readonly group: "surface";
28
+ readonly shade: "DEFAULT";
29
+ };
30
+ };
31
+ readonly 'surface/elevated': {
32
+ readonly description: "Elevated surface used for stronger separation.";
33
+ readonly color: {
34
+ readonly group: "surface";
35
+ readonly shade: "light";
36
+ };
37
+ };
38
+ readonly 'brand/primary': {
39
+ readonly description: "Primary brand background.";
40
+ readonly color: {
41
+ readonly group: "primary";
42
+ readonly shade: "dark";
43
+ };
44
+ };
45
+ readonly 'feedback/success': {
46
+ readonly description: "Success-state background.";
47
+ readonly color: {
48
+ readonly group: "success";
49
+ readonly shade: "dark";
50
+ };
51
+ };
52
+ readonly 'feedback/warning': {
53
+ readonly description: "Warning-state background.";
54
+ readonly color: {
55
+ readonly group: "warning";
56
+ readonly shade: "dark";
57
+ };
58
+ };
59
+ readonly 'feedback/error': {
60
+ readonly description: "Error-state background.";
61
+ readonly color: {
62
+ readonly group: "error";
63
+ readonly shade: "dark";
64
+ };
65
+ };
66
+ };
67
+ export type ContrastBackgroundRole = keyof typeof contrastBackgroundRoles;
68
+ export declare const contrastForegroundRoles: {
69
+ readonly 'text/default': {
70
+ readonly description: "Default body text.";
71
+ readonly kind: "text";
72
+ readonly candidates: readonly [{
73
+ readonly group: "text";
74
+ readonly shade: "DEFAULT";
75
+ }, {
76
+ readonly group: "text";
77
+ readonly shade: "dark";
78
+ }, {
79
+ readonly group: "text";
80
+ readonly shade: "darkest";
81
+ }, {
82
+ readonly group: "text";
83
+ readonly shade: "light";
84
+ }];
85
+ };
86
+ readonly 'text/muted': {
87
+ readonly description: "Secondary or supporting text.";
88
+ readonly kind: "text";
89
+ readonly candidates: readonly [{
90
+ readonly group: "text";
91
+ readonly shade: "light";
92
+ }, {
93
+ readonly group: "text";
94
+ readonly shade: "medium";
95
+ }, {
96
+ readonly group: "text";
97
+ readonly shade: "DEFAULT";
98
+ }];
99
+ };
100
+ readonly 'text/strong': {
101
+ readonly description: "Emphasized text on neutral surfaces.";
102
+ readonly kind: "text";
103
+ readonly candidates: readonly [{
104
+ readonly group: "text";
105
+ readonly shade: "darkest";
106
+ }, {
107
+ readonly group: "text";
108
+ readonly shade: "dark";
109
+ }, {
110
+ readonly group: "text";
111
+ readonly shade: "DEFAULT";
112
+ }];
113
+ };
114
+ readonly 'text/on-brand': {
115
+ readonly description: "Text intended for strong brand or colored backgrounds.";
116
+ readonly kind: "text";
117
+ readonly candidates: readonly [{
118
+ readonly group: "text";
119
+ readonly shade: "lightest";
120
+ }, {
121
+ readonly group: "text";
122
+ readonly shade: "light";
123
+ }, {
124
+ readonly group: "text";
125
+ readonly shade: "DEFAULT";
126
+ }];
127
+ };
128
+ readonly 'text/on-danger': {
129
+ readonly description: "Text intended for danger/error backgrounds.";
130
+ readonly kind: "text";
131
+ readonly candidates: readonly [{
132
+ readonly group: "text";
133
+ readonly shade: "lightest";
134
+ }, {
135
+ readonly group: "text";
136
+ readonly shade: "light";
137
+ }, {
138
+ readonly group: "text";
139
+ readonly shade: "DEFAULT";
140
+ }];
141
+ };
142
+ readonly 'icon/on-brand': {
143
+ readonly description: "Icon tint intended for strong brand or colored backgrounds.";
144
+ readonly kind: "icon";
145
+ readonly candidates: readonly [{
146
+ readonly group: "text";
147
+ readonly shade: "lightest";
148
+ }, {
149
+ readonly group: "text";
150
+ readonly shade: "light";
151
+ }, {
152
+ readonly group: "text";
153
+ readonly shade: "DEFAULT";
154
+ }];
155
+ };
156
+ readonly 'icon/on-danger': {
157
+ readonly description: "Icon tint intended for danger/error backgrounds.";
158
+ readonly kind: "icon";
159
+ readonly candidates: readonly [{
160
+ readonly group: "text";
161
+ readonly shade: "lightest";
162
+ }, {
163
+ readonly group: "text";
164
+ readonly shade: "light";
165
+ }, {
166
+ readonly group: "text";
167
+ readonly shade: "DEFAULT";
168
+ }];
169
+ };
170
+ };
171
+ export type ContrastForegroundRole = keyof typeof contrastForegroundRoles;
172
+ export interface ContrastContract {
173
+ id: string;
174
+ description: string;
175
+ foregroundRole: ContrastForegroundRole;
176
+ backgroundRole: ContrastBackgroundRole;
177
+ minRatio: number;
178
+ }
179
+ export declare const defaultContrastContracts: readonly [{
180
+ readonly id: "body-on-background";
181
+ readonly description: "Default body text on the main application background.";
182
+ readonly foregroundRole: "text/default";
183
+ readonly backgroundRole: "background/default";
184
+ readonly minRatio: 4.5;
185
+ }, {
186
+ readonly id: "body-on-surface";
187
+ readonly description: "Default body text on standard surfaces and cards.";
188
+ readonly foregroundRole: "text/default";
189
+ readonly backgroundRole: "surface/default";
190
+ readonly minRatio: 4.5;
191
+ }, {
192
+ readonly id: "muted-on-surface";
193
+ readonly description: "Muted supporting text on standard surfaces.";
194
+ readonly foregroundRole: "text/muted";
195
+ readonly backgroundRole: "surface/default";
196
+ readonly minRatio: 4.5;
197
+ }, {
198
+ readonly id: "strong-on-surface";
199
+ readonly description: "Strong emphasized text on elevated surfaces.";
200
+ readonly foregroundRole: "text/strong";
201
+ readonly backgroundRole: "surface/elevated";
202
+ readonly minRatio: 4.5;
203
+ }, {
204
+ readonly id: "text-on-primary";
205
+ readonly description: "Readable text on the primary brand background.";
206
+ readonly foregroundRole: "text/on-brand";
207
+ readonly backgroundRole: "brand/primary";
208
+ readonly minRatio: 4.5;
209
+ }, {
210
+ readonly id: "text-on-error";
211
+ readonly description: "Readable text on the error background.";
212
+ readonly foregroundRole: "text/on-danger";
213
+ readonly backgroundRole: "feedback/error";
214
+ readonly minRatio: 4.5;
215
+ }, {
216
+ readonly id: "icon-on-primary";
217
+ readonly description: "Readable icon tint on the primary brand background.";
218
+ readonly foregroundRole: "icon/on-brand";
219
+ readonly backgroundRole: "brand/primary";
220
+ readonly minRatio: 3;
221
+ }, {
222
+ readonly id: "icon-on-error";
223
+ readonly description: "Readable icon tint on the error background.";
224
+ readonly foregroundRole: "icon/on-danger";
225
+ readonly backgroundRole: "feedback/error";
226
+ readonly minRatio: 3;
227
+ }];
228
+ export interface ResolvedContrastColor {
229
+ role: ContrastForegroundRole | ContrastBackgroundRole;
230
+ value: number;
231
+ hex: string;
232
+ }
233
+ export interface ResolvedContrastForeground extends ResolvedContrastColor {
234
+ kind: 'text' | 'icon';
235
+ source: 'token' | 'adjusted';
236
+ candidate: ContrastColorRef;
237
+ }
238
+ export interface ResolvedContrastContract {
239
+ contract: ContrastContract;
240
+ foreground: ResolvedContrastForeground;
241
+ background: ResolvedContrastColor;
242
+ ratio: number;
243
+ passes: boolean;
244
+ }
245
+ export declare function resolveContrastColorRef(colors: ColorTokens, ref: ContrastColorRef): number;
246
+ export declare function resolveContrastBackgroundRole(colors: ColorTokens, role: ContrastBackgroundRole): ResolvedContrastColor;
247
+ export declare function resolveContrastForegroundRole(colors: ColorTokens, role: ContrastForegroundRole, background: number, minRatio: number): ResolvedContrastForeground;
248
+ export declare function resolveContrastContract(colors: ColorTokens, contract: ContrastContract): ResolvedContrastContract;
249
+ export declare function validateContrastContracts(colors: ColorTokens, contracts?: readonly ContrastContract[]): ResolvedContrastContract[];
250
+ export declare function getFailingContrastContracts(colors: ColorTokens, contracts?: readonly ContrastContract[]): ResolvedContrastContract[];
251
+ export declare function getContrastContract(contractId: string): ContrastContract | undefined;
252
+ /**
253
+ * Resolve a contract by id, throwing if the contract is not found.
254
+ * Convenience wrapper around getContrastContract + resolveContrastContract.
255
+ * @param colors - The color token set
256
+ * @param contractId - The contract identifier (e.g. 'text-on-primary')
257
+ * @returns Resolved contract with foreground, background, ratio, and pass/fail
258
+ * @throws If no contract with the given id exists
259
+ */
260
+ export declare function resolveContrastContractById(colors: ColorTokens, contractId: string): ResolvedContrastContract;
261
+ /**
262
+ * Convenience: resolve a foreground role against a numeric background and
263
+ * return the resulting hex color string (for Text style `.color`).
264
+ * @param colors - The color token set
265
+ * @param foregroundRole - Semantic foreground role (e.g. 'text/on-brand')
266
+ * @param background - Numeric background color to check contrast against
267
+ * @param minRatio - Minimum contrast ratio (defaults to WCAG AA 4.5:1)
268
+ * @returns Hex color string suitable for Text style `.color`
269
+ */
270
+ export declare function resolveContrastTextColor(colors: ColorTokens, foregroundRole: ContrastForegroundRole, background: number, minRatio?: number): string;
271
+ /**
272
+ * Convenience: resolve a foreground role against a numeric background and
273
+ * return the resulting numeric color (for Icon `.tint` or similar).
274
+ * @param colors - The color token set
275
+ * @param foregroundRole - Semantic foreground role (e.g. 'icon/on-brand')
276
+ * @param background - Numeric background color to check contrast against
277
+ * @param minRatio - Minimum contrast ratio (defaults to 3:1 for icons/UI graphics)
278
+ * @returns Numeric color value
279
+ */
280
+ export declare function resolveContrastTintColor(colors: ColorTokens, foregroundRole: ContrastForegroundRole, background: number, minRatio?: number): number;
281
+ /**
282
+ * Format a resolved contract as a human-readable multi-line string.
283
+ * Useful for debugging, CLI output, and authoring tools.
284
+ * @param resolved - A resolved contrast contract
285
+ * @returns Formatted description string
286
+ */
287
+ export declare function formatResolvedContrastContract(resolved: ResolvedContrastContract): string;
288
+ export {};
289
+ //# sourceMappingURL=contrast-contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contrast-contracts.d.ts","sourceRoot":"","sources":["../../src/colors/contrast-contracts.ts"],"names":[],"mappings":"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"}