@tokens-studio/tokenscript-schemas 0.0.11 → 0.0.13

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 (307) hide show
  1. package/dist/cli/index.cjs +31 -8
  2. package/dist/cli/index.cjs.map +1 -1
  3. package/dist/cli/index.js +30 -8
  4. package/dist/cli/index.js.map +1 -1
  5. package/package.json +2 -1
  6. package/src/bundler/bundle-schema.ts +146 -0
  7. package/src/bundler/index.ts +151 -0
  8. package/src/bundler/schema-dependency-resolver.ts +299 -0
  9. package/src/bundler/selective-bundler.test.ts +94 -0
  10. package/src/bundler/selective-bundler.ts +159 -0
  11. package/src/bundler/types.ts +93 -0
  12. package/src/bundler/utils.ts +74 -0
  13. package/src/cli/commands/bundle.integration.test.ts +153 -0
  14. package/src/cli/commands/bundle.test.ts +57 -0
  15. package/src/cli/commands/bundle.ts +237 -0
  16. package/src/cli/commands/list.ts +109 -0
  17. package/src/cli/config-schema.ts +36 -0
  18. package/src/cli/index.ts +50 -0
  19. package/src/cli/output-generator.ts +63 -0
  20. package/src/downloader/index.ts +248 -0
  21. package/src/downloader/types.ts +48 -0
  22. package/src/index.ts +8 -0
  23. package/src/schemas/functions/adjust_chroma/adjust-chroma.tokenscript +27 -0
  24. package/src/schemas/functions/adjust_chroma/schema.json +48 -0
  25. package/src/schemas/functions/adjust_chroma/unit.test.ts +76 -0
  26. package/src/schemas/functions/adjust_hue/adjust-hue.tokenscript +32 -0
  27. package/src/schemas/functions/adjust_hue/schema.json +48 -0
  28. package/src/schemas/functions/adjust_hue/unit.test.ts +68 -0
  29. package/src/schemas/functions/adjust_lightness/adjust-lightness.tokenscript +31 -0
  30. package/src/schemas/functions/adjust_lightness/schema.json +48 -0
  31. package/src/schemas/functions/adjust_lightness/unit.test.ts +88 -0
  32. package/src/schemas/functions/adjust_to_contrast/adjust-to-contrast.tokenscript +131 -0
  33. package/src/schemas/functions/adjust_to_contrast/schema.json +56 -0
  34. package/src/schemas/functions/adjust_to_contrast/unit.test.ts +81 -0
  35. package/src/schemas/functions/alpha_blend/alpha-blend.tokenscript +46 -0
  36. package/src/schemas/functions/alpha_blend/schema.json +28 -0
  37. package/src/schemas/functions/alpha_blend/unit.test.ts +135 -0
  38. package/src/schemas/functions/alpha_scale/alpha-scale.tokenscript +38 -0
  39. package/src/schemas/functions/alpha_scale/schema.json +24 -0
  40. package/src/schemas/functions/alpha_scale/unit.test.ts +50 -0
  41. package/src/schemas/functions/analogous/analogous.tokenscript +47 -0
  42. package/src/schemas/functions/analogous/schema.json +28 -0
  43. package/src/schemas/functions/analogous/unit.test.ts +64 -0
  44. package/src/schemas/functions/apca_contrast/apca-contrast.tokenscript +129 -0
  45. package/src/schemas/functions/apca_contrast/schema.json +24 -0
  46. package/src/schemas/functions/apca_contrast/unit.test.ts +259 -0
  47. package/src/schemas/functions/are_similar/are-similar.tokenscript +24 -0
  48. package/src/schemas/functions/are_similar/schema.json +57 -0
  49. package/src/schemas/functions/are_similar/unit.test.ts +57 -0
  50. package/src/schemas/functions/auto_text_color/auto-text-color.tokenscript +41 -0
  51. package/src/schemas/functions/auto_text_color/schema.json +53 -0
  52. package/src/schemas/functions/auto_text_color/unit.test.ts +122 -0
  53. package/src/schemas/functions/best_contrast/best-contrast.tokenscript +66 -0
  54. package/src/schemas/functions/best_contrast/schema.json +24 -0
  55. package/src/schemas/functions/best_contrast/unit.test.ts +64 -0
  56. package/src/schemas/functions/chroma/chroma.tokenscript +12 -0
  57. package/src/schemas/functions/chroma/schema.json +44 -0
  58. package/src/schemas/functions/chroma/unit.test.ts +86 -0
  59. package/src/schemas/functions/clamp_chroma/clamp-chroma.tokenscript +21 -0
  60. package/src/schemas/functions/clamp_chroma/schema.json +52 -0
  61. package/src/schemas/functions/clamp_chroma/unit.test.ts +60 -0
  62. package/src/schemas/functions/clamp_lightness/clamp-lightness.tokenscript +21 -0
  63. package/src/schemas/functions/clamp_lightness/schema.json +52 -0
  64. package/src/schemas/functions/clamp_lightness/unit.test.ts +76 -0
  65. package/src/schemas/functions/clamp_to_gamut/clamp-to-gamut.tokenscript +41 -0
  66. package/src/schemas/functions/clamp_to_gamut/schema.json +20 -0
  67. package/src/schemas/functions/clamp_to_gamut/unit.test.ts +167 -0
  68. package/src/schemas/functions/complement/complement.tokenscript +21 -0
  69. package/src/schemas/functions/complement/schema.json +20 -0
  70. package/src/schemas/functions/complement/unit.test.ts +81 -0
  71. package/src/schemas/functions/contrast_ratio/contrast-ratio.tokenscript +36 -0
  72. package/src/schemas/functions/contrast_ratio/schema.json +24 -0
  73. package/src/schemas/functions/contrast_ratio/unit.test.ts +91 -0
  74. package/src/schemas/functions/cooler/cooler.tokenscript +45 -0
  75. package/src/schemas/functions/cooler/schema.json +43 -0
  76. package/src/schemas/functions/cooler/unit.test.ts +69 -0
  77. package/src/schemas/functions/darken/darken.tokenscript +37 -0
  78. package/src/schemas/functions/darken/schema.json +24 -0
  79. package/src/schemas/functions/darken/unit.test.ts +105 -0
  80. package/src/schemas/functions/delta_e_2000/delta-e-2000.tokenscript +184 -0
  81. package/src/schemas/functions/delta_e_2000/schema.json +36 -0
  82. package/src/schemas/functions/delta_e_2000/unit.test.ts +243 -0
  83. package/src/schemas/functions/delta_e_76/delta-e-76.tokenscript +45 -0
  84. package/src/schemas/functions/delta_e_76/schema.json +24 -0
  85. package/src/schemas/functions/delta_e_76/unit.test.ts +123 -0
  86. package/src/schemas/functions/delta_e_ok/delta-e-ok.tokenscript +43 -0
  87. package/src/schemas/functions/delta_e_ok/schema.json +24 -0
  88. package/src/schemas/functions/delta_e_ok/unit.test.ts +235 -0
  89. package/src/schemas/functions/desaturate/desaturate.tokenscript +32 -0
  90. package/src/schemas/functions/desaturate/schema.json +24 -0
  91. package/src/schemas/functions/desaturate/unit.test.ts +54 -0
  92. package/src/schemas/functions/distributed/distributed.tokenscript +54 -0
  93. package/src/schemas/functions/distributed/schema.json +32 -0
  94. package/src/schemas/functions/distributed/unit.test.ts +58 -0
  95. package/src/schemas/functions/diverging/diverging.tokenscript +58 -0
  96. package/src/schemas/functions/diverging/schema.json +32 -0
  97. package/src/schemas/functions/diverging/unit.test.ts +70 -0
  98. package/src/schemas/functions/grayscale/grayscale.tokenscript +17 -0
  99. package/src/schemas/functions/grayscale/schema.json +20 -0
  100. package/src/schemas/functions/grayscale/unit.test.ts +79 -0
  101. package/src/schemas/functions/harmonize/harmonize.tokenscript +61 -0
  102. package/src/schemas/functions/harmonize/schema.json +52 -0
  103. package/src/schemas/functions/harmonize/unit.test.ts +56 -0
  104. package/src/schemas/functions/hue/hue.tokenscript +12 -0
  105. package/src/schemas/functions/hue/schema.json +44 -0
  106. package/src/schemas/functions/hue/unit.test.ts +75 -0
  107. package/src/schemas/functions/hue_difference/hue-difference.tokenscript +42 -0
  108. package/src/schemas/functions/hue_difference/schema.json +24 -0
  109. package/src/schemas/functions/hue_difference/unit.test.ts +125 -0
  110. package/src/schemas/functions/in_gamut/in-gamut.tokenscript +51 -0
  111. package/src/schemas/functions/in_gamut/schema.json +24 -0
  112. package/src/schemas/functions/in_gamut/unit.test.ts +178 -0
  113. package/src/schemas/functions/interpolate/interpolate.tokenscript +61 -0
  114. package/src/schemas/functions/interpolate/schema.json +52 -0
  115. package/src/schemas/functions/interpolate/unit.test.ts +96 -0
  116. package/src/schemas/functions/invert/invert-initializer.tokenscript +29 -0
  117. package/src/schemas/functions/invert/schema.json +20 -0
  118. package/src/schemas/functions/invert/unit.test.ts +216 -0
  119. package/src/schemas/functions/is_cool/is-cool.tokenscript +41 -0
  120. package/src/schemas/functions/is_cool/schema.json +20 -0
  121. package/src/schemas/functions/is_cool/unit.test.ts +189 -0
  122. package/src/schemas/functions/is_dark/is-dark.tokenscript +16 -0
  123. package/src/schemas/functions/is_dark/schema.json +24 -0
  124. package/src/schemas/functions/is_dark/unit.test.ts +87 -0
  125. package/src/schemas/functions/is_light/is-light.tokenscript +16 -0
  126. package/src/schemas/functions/is_light/schema.json +24 -0
  127. package/src/schemas/functions/is_light/unit.test.ts +86 -0
  128. package/src/schemas/functions/is_neutral/is-neutral.tokenscript +16 -0
  129. package/src/schemas/functions/is_neutral/schema.json +53 -0
  130. package/src/schemas/functions/is_neutral/unit.test.ts +85 -0
  131. package/src/schemas/functions/is_warm/is-warm.tokenscript +62 -0
  132. package/src/schemas/functions/is_warm/schema.json +20 -0
  133. package/src/schemas/functions/is_warm/unit.test.ts +161 -0
  134. package/src/schemas/functions/lighten/lighten.tokenscript +37 -0
  135. package/src/schemas/functions/lighten/schema.json +24 -0
  136. package/src/schemas/functions/lighten/unit.test.ts +109 -0
  137. package/src/schemas/functions/lightness/lightness.tokenscript +12 -0
  138. package/src/schemas/functions/lightness/schema.json +49 -0
  139. package/src/schemas/functions/lightness/unit.test.ts +99 -0
  140. package/src/schemas/functions/luminance/luminance.tokenscript +16 -0
  141. package/src/schemas/functions/luminance/schema.json +20 -0
  142. package/src/schemas/functions/luminance/unit.test.ts +105 -0
  143. package/src/schemas/functions/meets_contrast/meets-contrast.tokenscript +49 -0
  144. package/src/schemas/functions/meets_contrast/schema.json +28 -0
  145. package/src/schemas/functions/meets_contrast/unit.test.ts +170 -0
  146. package/src/schemas/functions/mix/mix.tokenscript +47 -0
  147. package/src/schemas/functions/mix/schema.json +28 -0
  148. package/src/schemas/functions/mix/unit.test.ts +95 -0
  149. package/src/schemas/functions/monochromatic/monochromatic.tokenscript +72 -0
  150. package/src/schemas/functions/monochromatic/schema.json +24 -0
  151. package/src/schemas/functions/monochromatic/unit.test.ts +91 -0
  152. package/src/schemas/functions/muted/muted.tokenscript +25 -0
  153. package/src/schemas/functions/muted/schema.json +48 -0
  154. package/src/schemas/functions/muted/unit.test.ts +100 -0
  155. package/src/schemas/functions/neutral_variant/neutral-variant.tokenscript +23 -0
  156. package/src/schemas/functions/neutral_variant/schema.json +48 -0
  157. package/src/schemas/functions/neutral_variant/unit.test.ts +102 -0
  158. package/src/schemas/functions/relative_luminance/relative-luminance.tokenscript +15 -0
  159. package/src/schemas/functions/relative_luminance/schema.json +49 -0
  160. package/src/schemas/functions/relative_luminance/unit.test.ts +104 -0
  161. package/src/schemas/functions/rotate_hue/rotate-hue.tokenscript +20 -0
  162. package/src/schemas/functions/rotate_hue/schema.json +24 -0
  163. package/src/schemas/functions/rotate_hue/unit.test.ts +86 -0
  164. package/src/schemas/functions/saturate/saturate.tokenscript +33 -0
  165. package/src/schemas/functions/saturate/schema.json +24 -0
  166. package/src/schemas/functions/saturate/unit.test.ts +59 -0
  167. package/src/schemas/functions/scale_chroma/scale-chroma.tokenscript +22 -0
  168. package/src/schemas/functions/scale_chroma/schema.json +48 -0
  169. package/src/schemas/functions/scale_chroma/unit.test.ts +79 -0
  170. package/src/schemas/functions/scale_lightness/scale-lightness.tokenscript +23 -0
  171. package/src/schemas/functions/scale_lightness/schema.json +48 -0
  172. package/src/schemas/functions/scale_lightness/unit.test.ts +73 -0
  173. package/src/schemas/functions/sepia/schema.json +48 -0
  174. package/src/schemas/functions/sepia/sepia.tokenscript +54 -0
  175. package/src/schemas/functions/sepia/unit.test.ts +88 -0
  176. package/src/schemas/functions/set_chroma/schema.json +24 -0
  177. package/src/schemas/functions/set_chroma/set-chroma.tokenscript +18 -0
  178. package/src/schemas/functions/set_chroma/unit.test.ts +79 -0
  179. package/src/schemas/functions/set_hue/schema.json +24 -0
  180. package/src/schemas/functions/set_hue/set-hue.tokenscript +18 -0
  181. package/src/schemas/functions/set_hue/unit.test.ts +90 -0
  182. package/src/schemas/functions/set_lightness/schema.json +24 -0
  183. package/src/schemas/functions/set_lightness/set-lightness.tokenscript +18 -0
  184. package/src/schemas/functions/set_lightness/unit.test.ts +80 -0
  185. package/src/schemas/functions/shade_scale/schema.json +24 -0
  186. package/src/schemas/functions/shade_scale/shade-scale.tokenscript +61 -0
  187. package/src/schemas/functions/shade_scale/unit.test.ts +64 -0
  188. package/src/schemas/functions/split_complement/schema.json +24 -0
  189. package/src/schemas/functions/split_complement/split-complement.tokenscript +38 -0
  190. package/src/schemas/functions/split_complement/unit.test.ts +53 -0
  191. package/src/schemas/functions/steps/schema.json +28 -0
  192. package/src/schemas/functions/steps/steps.tokenscript +54 -0
  193. package/src/schemas/functions/steps/unit.test.ts +71 -0
  194. package/src/schemas/functions/tetradic/schema.json +20 -0
  195. package/src/schemas/functions/tetradic/tetradic.tokenscript +40 -0
  196. package/src/schemas/functions/tetradic/unit.test.ts +50 -0
  197. package/src/schemas/functions/tint_scale/schema.json +32 -0
  198. package/src/schemas/functions/tint_scale/tint-scale.tokenscript +71 -0
  199. package/src/schemas/functions/tint_scale/unit.test.ts +64 -0
  200. package/src/schemas/functions/to_gamut/schema.json +48 -0
  201. package/src/schemas/functions/to_gamut/to-gamut.tokenscript +96 -0
  202. package/src/schemas/functions/to_gamut/unit.test.ts +97 -0
  203. package/src/schemas/functions/triadic/schema.json +20 -0
  204. package/src/schemas/functions/triadic/triadic.tokenscript +33 -0
  205. package/src/schemas/functions/triadic/unit.test.ts +64 -0
  206. package/src/schemas/functions/vibrant/schema.json +48 -0
  207. package/src/schemas/functions/vibrant/unit.test.ts +55 -0
  208. package/src/schemas/functions/vibrant/vibrant.tokenscript +29 -0
  209. package/src/schemas/functions/warmer/schema.json +43 -0
  210. package/src/schemas/functions/warmer/unit.test.ts +69 -0
  211. package/src/schemas/functions/warmer/warmer.tokenscript +45 -0
  212. package/src/schemas/functions/wcag_level/schema.json +48 -0
  213. package/src/schemas/functions/wcag_level/unit.test.ts +75 -0
  214. package/src/schemas/functions/wcag_level/wcag-level.tokenscript +50 -0
  215. package/src/schemas/types/css-color/from-hsl-color.tokenscript +16 -0
  216. package/src/schemas/types/css-color/from-hwb-color.tokenscript +16 -0
  217. package/src/schemas/types/css-color/from-lab-color.tokenscript +16 -0
  218. package/src/schemas/types/css-color/from-lch-color.tokenscript +16 -0
  219. package/src/schemas/types/css-color/from-oklab-color.tokenscript +16 -0
  220. package/src/schemas/types/css-color/from-oklch-color.tokenscript +16 -0
  221. package/src/schemas/types/css-color/from-p3-color.tokenscript +16 -0
  222. package/src/schemas/types/css-color/from-rgb-color.tokenscript +15 -0
  223. package/src/schemas/types/css-color/from-srgb-color.tokenscript +16 -0
  224. package/src/schemas/types/css-color/from-srgb-linear-color.tokenscript +16 -0
  225. package/src/schemas/types/css-color/from-xyz-d50-color.tokenscript +16 -0
  226. package/src/schemas/types/css-color/from-xyz-d65-color.tokenscript +16 -0
  227. package/src/schemas/types/css-color/initializer.tokenscript +13 -0
  228. package/src/schemas/types/css-color/schema.json +148 -0
  229. package/src/schemas/types/css-color/unit.test.ts +402 -0
  230. package/src/schemas/types/hex-color/initializer.tokenscript +3 -0
  231. package/src/schemas/types/hex-color/schema.json +24 -0
  232. package/src/schemas/types/hex-color/unit.test.ts +123 -0
  233. package/src/schemas/types/hsl-color/from-srgb.tokenscript +87 -0
  234. package/src/schemas/types/hsl-color/initializer.tokenscript +16 -0
  235. package/src/schemas/types/hsl-color/schema.json +48 -0
  236. package/src/schemas/types/hsl-color/unit.test.ts +201 -0
  237. package/src/schemas/types/hsv-color/from-srgb.tokenscript +80 -0
  238. package/src/schemas/types/hsv-color/initializer.tokenscript +16 -0
  239. package/src/schemas/types/hsv-color/schema.json +48 -0
  240. package/src/schemas/types/hsv-color/unit.test.ts +162 -0
  241. package/src/schemas/types/hwb-color/from-hsv.tokenscript +31 -0
  242. package/src/schemas/types/hwb-color/initializer.tokenscript +16 -0
  243. package/src/schemas/types/hwb-color/schema.json +48 -0
  244. package/src/schemas/types/hwb-color/unit.test.ts +150 -0
  245. package/src/schemas/types/lab-color/from-xyz-d50.tokenscript +78 -0
  246. package/src/schemas/types/lab-color/initializer.tokenscript +16 -0
  247. package/src/schemas/types/lab-color/schema.json +48 -0
  248. package/src/schemas/types/lab-color/unit.test.ts +263 -0
  249. package/src/schemas/types/lch-color/from-lab.tokenscript +44 -0
  250. package/src/schemas/types/lch-color/initializer.tokenscript +16 -0
  251. package/src/schemas/types/lch-color/schema.json +48 -0
  252. package/src/schemas/types/lch-color/unit.test.ts +173 -0
  253. package/src/schemas/types/okhsl-color/from-oklab.tokenscript +410 -0
  254. package/src/schemas/types/okhsl-color/initializer.tokenscript +24 -0
  255. package/src/schemas/types/okhsl-color/schema.json +48 -0
  256. package/src/schemas/types/okhsl-color/unit.test.ts +514 -0
  257. package/src/schemas/types/okhsv-color/from-oklab.tokenscript +286 -0
  258. package/src/schemas/types/okhsv-color/initializer.tokenscript +24 -0
  259. package/src/schemas/types/okhsv-color/schema.json +48 -0
  260. package/src/schemas/types/okhsv-color/unit.test.ts +499 -0
  261. package/src/schemas/types/oklab-color/from-okhsl.tokenscript +195 -0
  262. package/src/schemas/types/oklab-color/from-okhsv.tokenscript +197 -0
  263. package/src/schemas/types/oklab-color/from-oklch.tokenscript +39 -0
  264. package/src/schemas/types/oklab-color/from-xyz-d65.tokenscript +43 -0
  265. package/src/schemas/types/oklab-color/initializer.tokenscript +16 -0
  266. package/src/schemas/types/oklab-color/schema.json +78 -0
  267. package/src/schemas/types/oklab-color/unit.test.ts +345 -0
  268. package/src/schemas/types/oklch-color/from-oklab.tokenscript +45 -0
  269. package/src/schemas/types/oklch-color/initializer.tokenscript +16 -0
  270. package/src/schemas/types/oklch-color/schema.json +48 -0
  271. package/src/schemas/types/oklch-color/unit.test.ts +267 -0
  272. package/src/schemas/types/p3-color/from-p3-linear.tokenscript +59 -0
  273. package/src/schemas/types/p3-color/initializer.tokenscript +16 -0
  274. package/src/schemas/types/p3-color/schema.json +48 -0
  275. package/src/schemas/types/p3-color/unit.test.ts +119 -0
  276. package/src/schemas/types/p3-linear-color/from-xyz-d65.tokenscript +47 -0
  277. package/src/schemas/types/p3-linear-color/initializer.tokenscript +16 -0
  278. package/src/schemas/types/p3-linear-color/schema.json +48 -0
  279. package/src/schemas/types/p3-linear-color/unit.test.ts +82 -0
  280. package/src/schemas/types/rgb-color/from-hex.tokenscript +43 -0
  281. package/src/schemas/types/rgb-color/initializer.tokenscript +16 -0
  282. package/src/schemas/types/rgb-color/schema.json +55 -0
  283. package/src/schemas/types/rgb-color/to-hex.tokenscript +42 -0
  284. package/src/schemas/types/rgb-color/unit.test.ts +302 -0
  285. package/src/schemas/types/srgb-color/from-hsl.tokenscript +106 -0
  286. package/src/schemas/types/srgb-color/from-linear.tokenscript +58 -0
  287. package/src/schemas/types/srgb-color/from-rgb.tokenscript +20 -0
  288. package/src/schemas/types/srgb-color/initializer.tokenscript +16 -0
  289. package/src/schemas/types/srgb-color/schema.json +68 -0
  290. package/src/schemas/types/srgb-color/unit.test.ts +303 -0
  291. package/src/schemas/types/srgb-linear-color/from-srgb.tokenscript +55 -0
  292. package/src/schemas/types/srgb-linear-color/from-xyz-d65.tokenscript +34 -0
  293. package/src/schemas/types/srgb-linear-color/initializer.tokenscript +13 -0
  294. package/src/schemas/types/srgb-linear-color/schema.json +58 -0
  295. package/src/schemas/types/srgb-linear-color/unit.test.ts +291 -0
  296. package/src/schemas/types/xyz-d50-color/from-xyz-d65.tokenscript +36 -0
  297. package/src/schemas/types/xyz-d50-color/initializer.tokenscript +16 -0
  298. package/src/schemas/types/xyz-d50-color/schema.json +48 -0
  299. package/src/schemas/types/xyz-d50-color/unit.test.ts +240 -0
  300. package/src/schemas/types/xyz-d65-color/from-linear-p3.tokenscript +47 -0
  301. package/src/schemas/types/xyz-d65-color/from-linear-srgb.tokenscript +38 -0
  302. package/src/schemas/types/xyz-d65-color/from-oklab.tokenscript +44 -0
  303. package/src/schemas/types/xyz-d65-color/initializer.tokenscript +16 -0
  304. package/src/schemas/types/xyz-d65-color/schema.json +68 -0
  305. package/src/schemas/types/xyz-d65-color/unit.test.ts +319 -0
  306. package/src/utils/schema-uri.ts +192 -0
  307. package/src/utils/type.ts +194 -0
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "Best Contrast",
3
+ "type": "function",
4
+ "description": "Selects the color with highest contrast against a background from a list of candidates. Uses WCAG 2.1 contrast ratio. Perfect for choosing readable text colors.",
5
+ "keyword": "best_contrast",
6
+ "input": {
7
+ "type": "object",
8
+ "properties": {
9
+ "background": {
10
+ "type": "color",
11
+ "description": "The background color to contrast against"
12
+ },
13
+ "candidates": {
14
+ "type": "list",
15
+ "description": "List of candidate colors to choose from. Default is [black, white]"
16
+ }
17
+ }
18
+ },
19
+ "script": {
20
+ "type": "/api/v1/core/tokenscript/0/",
21
+ "script": "./best-contrast.tokenscript"
22
+ },
23
+ "requirements": ["/api/v1/core/srgb-linear-color/0/", "/api/v1/core/srgb-color/0/"]
24
+ }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Unit tests for the Best Contrast function
3
+ * Selects the most contrasting color from candidates against a background
4
+ */
5
+
6
+ import { executeWithSchema, getBundledSchema } from "@tests/helpers/schema-test-utils";
7
+ import { describe, expect, it } from "vitest";
8
+ import type { FunctionSpecification } from "@/bundler/types";
9
+
10
+ describe("Best Contrast Function", () => {
11
+ describe("Schema Definition", () => {
12
+ it("should have correct schema structure", async () => {
13
+ const schema = (await getBundledSchema("best_contrast", "function")) as FunctionSpecification;
14
+
15
+ expect(schema.name).toBe("Best Contrast");
16
+ expect(schema.type).toBe("function");
17
+ expect(schema.keyword).toBe("best_contrast");
18
+ });
19
+ });
20
+
21
+ describe("Function Execution", () => {
22
+ it("should return white on dark background (default candidates)", async () => {
23
+ const result = await executeWithSchema(
24
+ "best_contrast",
25
+ "function",
26
+ `
27
+ variable dark: Color.SRGB;
28
+ dark.r = 0.1; dark.g = 0.1; dark.b = 0.2;
29
+ best_contrast(dark)
30
+ `,
31
+ );
32
+
33
+ expect(result?.constructor.name).toBe("ColorSymbol");
34
+ const r = (result as any).value.r.value;
35
+ const g = (result as any).value.g.value;
36
+ const b = (result as any).value.b.value;
37
+ // Should be white (high values)
38
+ expect(r).toBeGreaterThan(0.9);
39
+ expect(g).toBeGreaterThan(0.9);
40
+ expect(b).toBeGreaterThan(0.9);
41
+ });
42
+
43
+ it("should return black on light background (default candidates)", async () => {
44
+ const result = await executeWithSchema(
45
+ "best_contrast",
46
+ "function",
47
+ `
48
+ variable light: Color.SRGB;
49
+ light.r = 0.95; light.g = 0.95; light.b = 0.9;
50
+ best_contrast(light)
51
+ `,
52
+ );
53
+
54
+ expect(result?.constructor.name).toBe("ColorSymbol");
55
+ const r = (result as any).value.r.value;
56
+ const g = (result as any).value.g.value;
57
+ const b = (result as any).value.b.value;
58
+ // Should be black (low values)
59
+ expect(r).toBeLessThan(0.1);
60
+ expect(g).toBeLessThan(0.1);
61
+ expect(b).toBeLessThan(0.1);
62
+ });
63
+ });
64
+ });
@@ -0,0 +1,12 @@
1
+ // chroma: Extract chroma (colorfulness) from a color
2
+ // Reference: OKLCH Color Space (Björn Ottosson)
3
+ // Reference: https://bottosson.github.io/posts/oklab/
4
+ //
5
+ // Returns the C component from OKLCH, which represents
6
+ // colorfulness/saturation. Range: 0 (gray) to ~0.4 (most vivid).
7
+
8
+ variable input: List = {input};
9
+ variable color: Color.OKLCH = input.get(0).to.oklch();
10
+
11
+ return color.c;
12
+
@@ -0,0 +1,44 @@
1
+ {
2
+ "name": "chroma",
3
+ "type": "function",
4
+ "description": "Extracts the chroma (colorfulness/saturation) value from any color using OKLCH. Returns a value from 0 (gray) to approximately 0.4 (most saturated colors). Chroma in OKLCH represents the colorfulness independent of lightness - higher values mean more vivid colors. Essential for creating consistent color scales and checking color vibrancy.",
5
+ "keyword": "chroma",
6
+ "requirements": ["/api/v1/core/srgb-color/0/", "/api/v1/core/oklch-color/0/"],
7
+ "schema": {
8
+ "type": "object",
9
+ "properties": {
10
+ "input": {
11
+ "type": "array",
12
+ "items": [
13
+ {
14
+ "description": "Color to extract chroma from",
15
+ "type": "color"
16
+ }
17
+ ],
18
+ "minItems": 1,
19
+ "maxItems": 1
20
+ }
21
+ },
22
+ "required": ["input"]
23
+ },
24
+ "returns": {
25
+ "type": "number",
26
+ "description": "Chroma value (0 to ~0.4)"
27
+ },
28
+ "script": {
29
+ "type": "https://schema.tokenscript.dev.gcp.tokens.studio/api/v1/core/tokenscript/0/",
30
+ "script": "./chroma.tokenscript"
31
+ },
32
+ "examples": [
33
+ {
34
+ "description": "Gray has chroma 0",
35
+ "input": ["#808080"],
36
+ "output": 0
37
+ },
38
+ {
39
+ "description": "Saturated red has high chroma",
40
+ "input": ["#ff0000"],
41
+ "output": 0.26
42
+ }
43
+ ]
44
+ }
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Unit tests for the chroma function
3
+ * Extracts chroma (colorfulness) from a color
4
+ */
5
+
6
+ import { executeWithSchema, getBundledSchema } from "@tests/helpers/schema-test-utils";
7
+ import { describe, expect, it } from "vitest";
8
+ import type { FunctionSpecification } from "@/bundler/types";
9
+
10
+ describe("chroma function", () => {
11
+ describe("Schema Definition", () => {
12
+ it("should have correct schema structure", async () => {
13
+ const schema = (await getBundledSchema("chroma", "function")) as FunctionSpecification;
14
+
15
+ expect(schema.name).toBe("chroma");
16
+ expect(schema.type).toBe("function");
17
+ });
18
+ });
19
+
20
+ describe("Function Execution", () => {
21
+ it("should return 0 for gray", async () => {
22
+ const result = await executeWithSchema(
23
+ "chroma",
24
+ "function",
25
+ `
26
+ variable gray: Color.SRGB;
27
+ gray.r = 0.5; gray.g = 0.5; gray.b = 0.5;
28
+ chroma(gray)
29
+ `,
30
+ );
31
+
32
+ expect(result).toBeDefined();
33
+ const c = (result as any).value ?? result;
34
+ expect(c).toBeCloseTo(0, 2);
35
+ });
36
+
37
+ it("should return 0 for white", async () => {
38
+ const result = await executeWithSchema(
39
+ "chroma",
40
+ "function",
41
+ `
42
+ variable white: Color.SRGB;
43
+ white.r = 1; white.g = 1; white.b = 1;
44
+ chroma(white)
45
+ `,
46
+ );
47
+
48
+ expect(result).toBeDefined();
49
+ const c = (result as any).value ?? result;
50
+ expect(c).toBeCloseTo(0, 2);
51
+ });
52
+
53
+ it("should return 0 for black", async () => {
54
+ const result = await executeWithSchema(
55
+ "chroma",
56
+ "function",
57
+ `
58
+ variable black: Color.SRGB;
59
+ black.r = 0; black.g = 0; black.b = 0;
60
+ chroma(black)
61
+ `,
62
+ );
63
+
64
+ expect(result).toBeDefined();
65
+ const c = (result as any).value ?? result;
66
+ expect(c).toBeCloseTo(0, 2);
67
+ });
68
+
69
+ it("should return high chroma for saturated red", async () => {
70
+ const result = await executeWithSchema(
71
+ "chroma",
72
+ "function",
73
+ `
74
+ variable red: Color.SRGB;
75
+ red.r = 1; red.g = 0; red.b = 0;
76
+ chroma(red)
77
+ `,
78
+ );
79
+
80
+ expect(result).toBeDefined();
81
+ const c = (result as any).value ?? result;
82
+ // Red has high chroma in OKLCH
83
+ expect(c).toBeGreaterThan(0.2);
84
+ });
85
+ });
86
+ });
@@ -0,0 +1,21 @@
1
+ // clamp_chroma: Constrain chroma to a range
2
+ // Preserves hue and lightness
3
+
4
+ variable input: List = {input};
5
+ variable color: Color.OKLCH = input.get(0).to.oklch();
6
+ variable min_c: Number = input.get(1);
7
+ variable max_c: Number = input.get(2);
8
+
9
+ // Clamp chroma
10
+ variable new_c: Number = color.c;
11
+ if (new_c < min_c) [ new_c = min_c; ];
12
+ if (new_c > max_c) [ new_c = max_c; ];
13
+
14
+ // Create result
15
+ variable result: Color.OKLCH;
16
+ result.l = color.l;
17
+ result.c = new_c;
18
+ result.h = color.h;
19
+
20
+ return result;
21
+
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "clamp_chroma",
3
+ "type": "function",
4
+ "description": "Constrains a color's chroma (saturation) to a specified range while preserving hue and lightness. Useful for ensuring colors stay within brand guidelines or design constraints. Uses OKLCH for perceptually uniform clamping.",
5
+ "keyword": "clamp_chroma",
6
+ "requirements": ["/api/v1/core/srgb-color/0/", "/api/v1/core/oklch-color/0/"],
7
+ "schema": {
8
+ "type": "object",
9
+ "properties": {
10
+ "input": {
11
+ "type": "array",
12
+ "items": [
13
+ {
14
+ "description": "Color to clamp",
15
+ "type": "color"
16
+ },
17
+ {
18
+ "description": "Minimum chroma (0+)",
19
+ "type": "number"
20
+ },
21
+ {
22
+ "description": "Maximum chroma (typically 0-0.4)",
23
+ "type": "number"
24
+ }
25
+ ],
26
+ "minItems": 3,
27
+ "maxItems": 3
28
+ }
29
+ },
30
+ "required": ["input"]
31
+ },
32
+ "returns": {
33
+ "type": "color",
34
+ "description": "Color with clamped chroma"
35
+ },
36
+ "script": {
37
+ "type": "https://schema.tokenscript.dev.gcp.tokens.studio/api/v1/core/tokenscript/0/",
38
+ "script": "./clamp-chroma.tokenscript"
39
+ },
40
+ "examples": [
41
+ {
42
+ "description": "Limit maximum saturation",
43
+ "input": ["#ff0000", 0, 0.15],
44
+ "output": "Muted red with chroma 0.15"
45
+ },
46
+ {
47
+ "description": "Ensure minimum saturation",
48
+ "input": ["#808080", 0.05, 0.3],
49
+ "output": "Slightly colored gray"
50
+ }
51
+ ]
52
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Unit tests for the clamp_chroma function
3
+ * Constrains chroma to a range
4
+ */
5
+
6
+ import { executeWithSchema, getBundledSchema } from "@tests/helpers/schema-test-utils";
7
+ import { describe, expect, it } from "vitest";
8
+ import type { FunctionSpecification } from "@/bundler/types";
9
+
10
+ describe("clamp_chroma function", () => {
11
+ describe("Schema Definition", () => {
12
+ it("should have correct schema structure", async () => {
13
+ const schema = (await getBundledSchema("clamp_chroma", "function")) as FunctionSpecification;
14
+
15
+ expect(schema.name).toBe("clamp_chroma");
16
+ expect(schema.type).toBe("function");
17
+ });
18
+ });
19
+
20
+ describe("Function Execution", () => {
21
+ it("should clamp saturated color to maximum", async () => {
22
+ const result = await executeWithSchema(
23
+ "clamp_chroma",
24
+ "function",
25
+ `
26
+ variable red: Color.SRGB;
27
+ red.r = 1; red.g = 0; red.b = 0;
28
+ clamp_chroma(red, 0, 0.1).to.srgb()
29
+ `,
30
+ );
31
+
32
+ expect(result).toBeDefined();
33
+ // Result should be less saturated
34
+ const r = (result as any).value?.r?.value ?? (result as any).value?.r;
35
+ const g = (result as any).value?.g?.value ?? (result as any).value?.g;
36
+ // Less extreme difference between channels
37
+ expect(r - g).toBeLessThan(0.8);
38
+ });
39
+
40
+ it("should preserve already-low-chroma colors", async () => {
41
+ const result = await executeWithSchema(
42
+ "clamp_chroma",
43
+ "function",
44
+ `
45
+ variable gray: Color.SRGB;
46
+ gray.r = 0.5; gray.g = 0.5; gray.b = 0.5;
47
+ clamp_chroma(gray, 0, 0.3).to.srgb()
48
+ `,
49
+ );
50
+
51
+ expect(result).toBeDefined();
52
+ // Gray should remain gray
53
+ const r = (result as any).value?.r?.value ?? (result as any).value?.r;
54
+ const g = (result as any).value?.g?.value ?? (result as any).value?.g;
55
+ const b = (result as any).value?.b?.value ?? (result as any).value?.b;
56
+ expect(Math.abs(r - g)).toBeLessThan(0.1);
57
+ expect(Math.abs(g - b)).toBeLessThan(0.1);
58
+ });
59
+ });
60
+ });
@@ -0,0 +1,21 @@
1
+ // clamp_lightness: Constrain lightness to a range
2
+ // Preserves hue and chroma
3
+
4
+ variable input: List = {input};
5
+ variable color: Color.OKLCH = input.get(0).to.oklch();
6
+ variable min_l: Number = input.get(1);
7
+ variable max_l: Number = input.get(2);
8
+
9
+ // Clamp lightness
10
+ variable new_l: Number = color.l;
11
+ if (new_l < min_l) [ new_l = min_l; ];
12
+ if (new_l > max_l) [ new_l = max_l; ];
13
+
14
+ // Create result
15
+ variable result: Color.OKLCH;
16
+ result.l = new_l;
17
+ result.c = color.c;
18
+ result.h = color.h;
19
+
20
+ return result;
21
+
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "clamp_lightness",
3
+ "type": "function",
4
+ "description": "Constrains a color's lightness to a specified range while preserving hue and chroma. Useful for ensuring colors stay within readable/accessible bounds. Uses OKLCH for perceptually uniform clamping.",
5
+ "keyword": "clamp_lightness",
6
+ "requirements": ["/api/v1/core/srgb-color/0/", "/api/v1/core/oklch-color/0/"],
7
+ "schema": {
8
+ "type": "object",
9
+ "properties": {
10
+ "input": {
11
+ "type": "array",
12
+ "items": [
13
+ {
14
+ "description": "Color to clamp",
15
+ "type": "color"
16
+ },
17
+ {
18
+ "description": "Minimum lightness (0-1)",
19
+ "type": "number"
20
+ },
21
+ {
22
+ "description": "Maximum lightness (0-1)",
23
+ "type": "number"
24
+ }
25
+ ],
26
+ "minItems": 3,
27
+ "maxItems": 3
28
+ }
29
+ },
30
+ "required": ["input"]
31
+ },
32
+ "returns": {
33
+ "type": "color",
34
+ "description": "Color with clamped lightness"
35
+ },
36
+ "script": {
37
+ "type": "https://schema.tokenscript.dev.gcp.tokens.studio/api/v1/core/tokenscript/0/",
38
+ "script": "./clamp-lightness.tokenscript"
39
+ },
40
+ "examples": [
41
+ {
42
+ "description": "Clamp too-dark color to minimum",
43
+ "input": ["#111111", 0.3, 0.9],
44
+ "output": "Color with lightness 0.3"
45
+ },
46
+ {
47
+ "description": "Clamp too-light color to maximum",
48
+ "input": ["#ffffff", 0.2, 0.8],
49
+ "output": "Color with lightness 0.8"
50
+ }
51
+ ]
52
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Unit tests for the clamp_lightness function
3
+ * Constrains lightness to a range
4
+ */
5
+
6
+ import { executeWithSchema, getBundledSchema } from "@tests/helpers/schema-test-utils";
7
+ import { describe, expect, it } from "vitest";
8
+ import type { FunctionSpecification } from "@/bundler/types";
9
+
10
+ describe("clamp_lightness function", () => {
11
+ describe("Schema Definition", () => {
12
+ it("should have correct schema structure", async () => {
13
+ const schema = (await getBundledSchema(
14
+ "clamp_lightness",
15
+ "function",
16
+ )) as FunctionSpecification;
17
+
18
+ expect(schema.name).toBe("clamp_lightness");
19
+ expect(schema.type).toBe("function");
20
+ });
21
+ });
22
+
23
+ describe("Function Execution", () => {
24
+ it("should clamp dark color to minimum", async () => {
25
+ const result = await executeWithSchema(
26
+ "clamp_lightness",
27
+ "function",
28
+ `
29
+ variable dark: Color.SRGB;
30
+ dark.r = 0.1; dark.g = 0.1; dark.b = 0.1;
31
+ clamp_lightness(dark, 0.5, 0.9).to.srgb()
32
+ `,
33
+ );
34
+
35
+ expect(result).toBeDefined();
36
+ // Result should be brighter than input
37
+ const r = (result as any).value?.r?.value ?? (result as any).value?.r;
38
+ expect(r).toBeGreaterThan(0.3);
39
+ });
40
+
41
+ it("should clamp light color to maximum", async () => {
42
+ const result = await executeWithSchema(
43
+ "clamp_lightness",
44
+ "function",
45
+ `
46
+ variable light: Color.SRGB;
47
+ light.r = 1; light.g = 1; light.b = 1;
48
+ clamp_lightness(light, 0.1, 0.5).to.srgb()
49
+ `,
50
+ );
51
+
52
+ expect(result).toBeDefined();
53
+ // Result should be darker than input
54
+ const r = (result as any).value?.r?.value ?? (result as any).value?.r;
55
+ expect(r).toBeLessThan(0.8);
56
+ });
57
+
58
+ it("should not change color within range", async () => {
59
+ const result = await executeWithSchema(
60
+ "clamp_lightness",
61
+ "function",
62
+ `
63
+ variable mid: Color.SRGB;
64
+ mid.r = 0.5; mid.g = 0.5; mid.b = 0.5;
65
+ clamp_lightness(mid, 0.1, 0.9).to.srgb()
66
+ `,
67
+ );
68
+
69
+ expect(result).toBeDefined();
70
+ // Mid-gray should remain mid-gray
71
+ const r = (result as any).value?.r?.value ?? (result as any).value?.r;
72
+ expect(r).toBeGreaterThan(0.3);
73
+ expect(r).toBeLessThan(0.7);
74
+ });
75
+ });
76
+ });
@@ -0,0 +1,41 @@
1
+ // Clamp to Gamut (Simple Clipping)
2
+ // Clips out-of-gamut sRGB values to [0, 1] range
3
+ // Reference: Color.js toGamut with method="clip"
4
+ //
5
+ // This is the simplest gamut mapping approach:
6
+ // - Fast and deterministic
7
+ // - Preserves hue when only one channel clips
8
+ // - Can cause hue shifts when multiple channels clip
9
+ // - May lose saturation detail
10
+ //
11
+ // For perceptually better results, use toGamut() which
12
+ // reduces chroma in OKLCH before clipping.
13
+
14
+ variable input: List = {input};
15
+ variable color: Color.SRGB = input.get(0).to.srgb();
16
+
17
+ // Get RGB values
18
+ variable r: Number = color.r;
19
+ variable g: Number = color.g;
20
+ variable b: Number = color.b;
21
+
22
+ // Clamp R
23
+ if (r < 0) [ r = 0; ];
24
+ if (r > 1) [ r = 1; ];
25
+
26
+ // Clamp G
27
+ if (g < 0) [ g = 0; ];
28
+ if (g > 1) [ g = 1; ];
29
+
30
+ // Clamp B
31
+ if (b < 0) [ b = 0; ];
32
+ if (b > 1) [ b = 1; ];
33
+
34
+ // Create clamped result
35
+ variable result: Color.SRGB;
36
+ result.r = r;
37
+ result.g = g;
38
+ result.b = b;
39
+
40
+ return result;
41
+
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "Clamp to Gamut",
3
+ "type": "function",
4
+ "description": "Clips a color to the sRGB gamut by clamping each RGB channel to [0,1]. This is a simple but lossy approach - for perceptually better results, consider using gamut mapping algorithms that reduce chroma first.",
5
+ "keyword": "clamp_to_gamut",
6
+ "input": {
7
+ "type": "object",
8
+ "properties": {
9
+ "color": {
10
+ "type": "color",
11
+ "description": "Color to clamp"
12
+ }
13
+ }
14
+ },
15
+ "script": {
16
+ "type": "/api/v1/core/tokenscript/0/",
17
+ "script": "./clamp-to-gamut.tokenscript"
18
+ },
19
+ "requirements": ["/api/v1/core/srgb-color/0/"]
20
+ }