@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,286 @@
1
+ // OKLab to OKHSV Conversion
2
+ // Reference: Björn Ottosson - "A perceptual color picker: OKHSL and OKHSV"
3
+ // URL: https://bottosson.github.io/posts/colorpicker/
4
+ // Reference: https://github.com/color-js/color.js/blob/main/src/spaces/okhsv.js
5
+ // Reference: https://bottosson.github.io/posts/oklab/ (original OKLab paper)
6
+ //
7
+ // OKHSV maps colors to a perceptually uniform HSV cylinder.
8
+ // The algorithm finds the exact gamut boundary using compute_max_saturation
9
+ // and positions colors relative to the cusp (maximum chroma point).
10
+ //
11
+ // Key difference from OKHSL:
12
+ // - V=1 means maximum brightness (white at S=0, cusp color at S=1)
13
+ // - More intuitive for picking saturated colors
14
+ //
15
+ // Input: Color.OKLab with l (0-1), a, b coordinates
16
+ // Output: Color.OKHSV with h (0-360), s (0-1), v (0-1)
17
+
18
+ variable lab_l: Number = input.l;
19
+ variable lab_a: Number = input.a;
20
+ variable lab_b: Number = input.b;
21
+
22
+ // Native constants
23
+ variable pi_val: Number = pi();
24
+
25
+ // Toe function constants (same as OKHSL)
26
+ variable toe_k1: Number = 0.206;
27
+ variable toe_k2: Number = 0.03;
28
+ variable toe_k3: Number = 1.17009708737864;
29
+
30
+ // ═══════════════════════════════════════════════════════════════════════════
31
+ // Step 1: Convert to polar coordinates (L, C, H)
32
+ // ═══════════════════════════════════════════════════════════════════════════
33
+ variable c: Number = sqrt(lab_a * lab_a + lab_b * lab_b);
34
+ variable h: Number = 0;
35
+
36
+ if (c > 0.00001) [
37
+ // Note: ColorJS uses atan2(-b, -a) and adds 0.5, we use atan2(b, a)
38
+ h = atan2(lab_b, lab_a) * 180 / pi_val;
39
+ if (h < 0) [
40
+ h = h + 360;
41
+ ];
42
+ ];
43
+
44
+ // ═══════════════════════════════════════════════════════════════════════════
45
+ // Step 2: Initialize defaults and apply toe function to L for V
46
+ // toe(x) = 0.5 * (k3*x - k1 + sqrt((k3*x - k1)^2 + 4*k2*k3*x))
47
+ // ═══════════════════════════════════════════════════════════════════════════
48
+ variable s: Number = 0;
49
+ variable v: Number = lab_l;
50
+
51
+ // Apply toe function to get initial V
52
+ if (lab_l > 0.0001 && lab_l < 0.9999) [
53
+ variable term: Number = toe_k3 * lab_l - toe_k1;
54
+ v = 0.5 * (term + sqrt(term * term + 4 * toe_k2 * toe_k3 * lab_l));
55
+ ];
56
+
57
+ // ═══════════════════════════════════════════════════════════════════════════
58
+ // Step 3: Compute normalized hue direction
59
+ // ═══════════════════════════════════════════════════════════════════════════
60
+ variable a_: Number = 0;
61
+ variable b_: Number = 0;
62
+ if (c > 0.00001) [
63
+ a_ = lab_a / c;
64
+ b_ = lab_b / c;
65
+ ];
66
+
67
+ // ═══════════════════════════════════════════════════════════════════════════
68
+ // Pre-compute LMS coefficients (used in multiple steps)
69
+ // ═══════════════════════════════════════════════════════════════════════════
70
+ variable kl: Number = 0.3963377774 * a_ + 0.2158037573 * b_;
71
+ variable km: Number = -0.1055613458 * a_ - 0.0638541728 * b_;
72
+ variable ks: Number = -0.0894841775 * a_ - 1.2914855480 * b_;
73
+
74
+ // ═══════════════════════════════════════════════════════════════════════════
75
+ // Step 4: Find maximum saturation and cusp
76
+ // Only process if we have chroma (non-achromatic) and L is valid
77
+ // ═══════════════════════════════════════════════════════════════════════════
78
+ variable s_max: Number = 0;
79
+ variable l_cusp: Number = 1;
80
+ variable c_cusp: Number = 0;
81
+
82
+ // Variables for LMS intermediate calculations
83
+ variable l_lms: Number = 0;
84
+ variable m_lms: Number = 0;
85
+ variable s_lms: Number = 0;
86
+
87
+ if (c > 0.00001 && lab_l > 0.00001 && lab_l < 0.99999) [
88
+ // Determine which RGB component clips first
89
+ variable k0: Number = 0;
90
+ variable k1_coef: Number = 0;
91
+ variable k2_coef: Number = 0;
92
+ variable k3_coef: Number = 0;
93
+ variable k4_coef: Number = 0;
94
+ variable wl: Number = 0;
95
+ variable wm: Number = 0;
96
+ variable ws: Number = 0;
97
+
98
+ variable test_r: Number = -1.88170328 * a_ - 0.80936493 * b_;
99
+ variable test_g: Number = 1.81444104 * a_ - 1.19445276 * b_;
100
+
101
+ if (test_r > 1) [
102
+ k0 = 1.19086277;
103
+ k1_coef = 1.76576728;
104
+ k2_coef = 0.59662641;
105
+ k3_coef = 0.75515197;
106
+ k4_coef = 0.56771245;
107
+ wl = 4.0767416621;
108
+ wm = -3.3077115913;
109
+ ws = 0.2309699292;
110
+ ] else [
111
+ if (test_g > 1) [
112
+ k0 = 0.73956515;
113
+ k1_coef = -0.45954404;
114
+ k2_coef = 0.08285427;
115
+ k3_coef = 0.12541073;
116
+ k4_coef = -0.14503204;
117
+ wl = -1.2684380046;
118
+ wm = 2.6097574011;
119
+ ws = -0.3413193965;
120
+ ] else [
121
+ k0 = 1.35733652;
122
+ k1_coef = -0.00915799;
123
+ k2_coef = -1.15130210;
124
+ k3_coef = -0.50559606;
125
+ k4_coef = 0.00692167;
126
+ wl = -0.0041960863;
127
+ wm = -0.7034186147;
128
+ ws = 1.7076147010;
129
+ ];
130
+ ];
131
+
132
+ // Polynomial approximation
133
+ s_max = k0 + k1_coef * a_ + k2_coef * b_ + k3_coef * a_ * a_ + k4_coef * a_ * b_;
134
+
135
+ // Halley's method refinement
136
+ variable l_temp: Number = 1 + s_max * kl;
137
+ variable m_temp: Number = 1 + s_max * km;
138
+ variable s_temp: Number = 1 + s_max * ks;
139
+
140
+ variable l_cubed: Number = l_temp * l_temp * l_temp;
141
+ variable m_cubed: Number = m_temp * m_temp * m_temp;
142
+ variable s_cubed: Number = s_temp * s_temp * s_temp;
143
+
144
+ variable l_ds: Number = 3 * kl * l_temp * l_temp;
145
+ variable m_ds: Number = 3 * km * m_temp * m_temp;
146
+ variable s_ds: Number = 3 * ks * s_temp * s_temp;
147
+
148
+ variable l_ds2: Number = 6 * kl * kl * l_temp;
149
+ variable m_ds2: Number = 6 * km * km * m_temp;
150
+ variable s_ds2: Number = 6 * ks * ks * s_temp;
151
+
152
+ variable f: Number = wl * l_cubed + wm * m_cubed + ws * s_cubed;
153
+ variable f1: Number = wl * l_ds + wm * m_ds + ws * s_ds;
154
+ variable f2: Number = wl * l_ds2 + wm * m_ds2 + ws * s_ds2;
155
+
156
+ variable denom: Number = f1 * f1 - 0.5 * f * f2;
157
+ if (abs(denom) > 0.000001) [
158
+ s_max = s_max - f * f1 / denom;
159
+ ];
160
+
161
+ // ═══════════════════════════════════════════════════════════════════════
162
+ // Find cusp (L_cusp, C_cusp)
163
+ // ═══════════════════════════════════════════════════════════════════════
164
+ if (s_max > 0) [
165
+ variable l_cusp_temp: Number = 1 + s_max * kl;
166
+ variable m_cusp_temp: Number = 1 + s_max * km;
167
+ variable s_cusp_temp: Number = 1 + s_max * ks;
168
+
169
+ l_lms = l_cusp_temp * l_cusp_temp * l_cusp_temp;
170
+ m_lms = m_cusp_temp * m_cusp_temp * m_cusp_temp;
171
+ s_lms = s_cusp_temp * s_cusp_temp * s_cusp_temp;
172
+
173
+ variable r_lin: Number = 4.0767416621 * l_lms - 3.3077115913 * m_lms + 0.2309699292 * s_lms;
174
+ variable g_lin: Number = -1.2684380046 * l_lms + 2.6097574011 * m_lms - 0.3413193965 * s_lms;
175
+ variable b_lin: Number = -0.0041960863 * l_lms - 0.7034186147 * m_lms + 1.7076147010 * s_lms;
176
+
177
+ variable max_rgb: Number = r_lin;
178
+ if (g_lin > max_rgb) [ max_rgb = g_lin; ];
179
+ if (b_lin > max_rgb) [ max_rgb = b_lin; ];
180
+
181
+ if (max_rgb > 0) [
182
+ l_cusp = pow(1 / max_rgb, 0.3333333333333333);
183
+ c_cusp = l_cusp * s_max;
184
+ ];
185
+ ];
186
+ ];
187
+
188
+ // ═══════════════════════════════════════════════════════════════════════════
189
+ // Step 5: Compute OKHSV S and V using ColorJS algorithm
190
+ //
191
+ // The algorithm uses the ST coordinate system where:
192
+ // - S_t = C/L (slope from origin)
193
+ // - T_t = C/(1-L) (slope from white)
194
+ //
195
+ // Key formulas from ColorJS:
196
+ // - t = tMax / (c + l * tMax)
197
+ // - lv = t * l, cv = t * c
198
+ // - Apply RGB scaling and toe compensation
199
+ // - v = l / lv, s = ((s0 + tMax) * cv) / (tMax * s0 + tMax * k * cv)
200
+ // ═══════════════════════════════════════════════════════════════════════════
201
+ if (c > 0.00001 && lab_l > 0.00001 && lab_l < 0.99999 && l_cusp > 0.0001 && c_cusp > 0.0001) [
202
+ // Compute ST values at cusp
203
+ variable s_t_cusp: Number = c_cusp / l_cusp;
204
+ variable t_t_cusp: Number = c_cusp / (1 - l_cusp + 0.0001);
205
+
206
+ // Fixed s0 parameter
207
+ variable s_0: Number = 0.5;
208
+ variable k_param: Number = 1 - s_0 / s_t_cusp;
209
+
210
+ // Compute t and derived values (following ColorJS exactly)
211
+ variable t: Number = t_t_cusp / (c + lab_l * t_t_cusp + 0.0001);
212
+ variable lv: Number = t * lab_l;
213
+ variable cv: Number = t * c;
214
+
215
+ // Apply inverse toe to lv for compensation
216
+ variable lvt: Number = lv;
217
+ if (lv > 0.0001 && lv < 0.9999) [
218
+ lvt = (lv * lv + toe_k1 * lv) / (toe_k3 * (lv + toe_k2));
219
+ ];
220
+
221
+ variable cvt: Number = cv;
222
+ if (lv > 0.0001) [
223
+ cvt = cv * lvt / lv;
224
+ ];
225
+
226
+ // RGB scale computation
227
+ variable scale_l_: Number = 1 + s_max * kl;
228
+ variable scale_m_: Number = 1 + s_max * km;
229
+ variable scale_s_: Number = 1 + s_max * ks;
230
+
231
+ variable lms_l: Number = lvt + a_ * cvt * kl;
232
+ variable lms_m: Number = lvt + a_ * cvt * km;
233
+ variable lms_s: Number = lvt + a_ * cvt * ks;
234
+
235
+ // Convert to linear RGB using LMS
236
+ variable lms_l_cubed: Number = lms_l * lms_l * lms_l;
237
+ variable lms_m_cubed: Number = lms_m * lms_m * lms_m;
238
+ variable lms_s_cubed: Number = lms_s * lms_s * lms_s;
239
+
240
+ variable rs: Number = 4.0767416621 * lms_l_cubed - 3.3077115913 * lms_m_cubed + 0.2309699292 * lms_s_cubed;
241
+ variable gs: Number = -1.2684380046 * lms_l_cubed + 2.6097574011 * lms_m_cubed - 0.3413193965 * lms_s_cubed;
242
+ variable bs: Number = -0.0041960863 * lms_l_cubed - 0.7034186147 * lms_m_cubed + 1.7076147010 * lms_s_cubed;
243
+
244
+ variable max_s: Number = rs;
245
+ if (gs > max_s) [ max_s = gs; ];
246
+ if (bs > max_s) [ max_s = bs; ];
247
+ if (max_s < 0.0001) [ max_s = 0.0001; ];
248
+
249
+ variable scale_l: Number = pow(1 / max_s, 0.3333333333333333);
250
+
251
+ // Scale L and C
252
+ variable l_scaled: Number = lab_l / scale_l;
253
+ variable c_scaled: Number = c / scale_l;
254
+
255
+ // Apply toe to scaled L for compensation
256
+ variable l_toed: Number = l_scaled;
257
+ if (l_scaled > 0.0001 && l_scaled < 0.9999) [
258
+ variable term2: Number = toe_k3 * l_scaled - toe_k1;
259
+ l_toed = 0.5 * (term2 + sqrt(term2 * term2 + 4 * toe_k2 * toe_k3 * l_scaled));
260
+ ];
261
+
262
+ c_scaled = c_scaled * l_toed / (l_scaled + 0.0001);
263
+
264
+ // Compute final v and s
265
+ if (lv > 0.0001) [
266
+ v = l_toed / lv;
267
+ if (v > 1) [ v = 1; ];
268
+ if (v < 0) [ v = 0; ];
269
+ ];
270
+
271
+ variable denom_s: Number = t_t_cusp * s_0 + t_t_cusp * k_param * cv;
272
+ if (abs(denom_s) > 0.0001) [
273
+ s = ((s_0 + t_t_cusp) * cv) / denom_s;
274
+ if (s > 1) [ s = 1; ];
275
+ if (s < 0) [ s = 0; ];
276
+ ];
277
+ ];
278
+
279
+ // ═══════════════════════════════════════════════════════════════════════════
280
+ // Output
281
+ // ═══════════════════════════════════════════════════════════════════════════
282
+ variable output: Color.OKHSV;
283
+ output.h = h;
284
+ output.s = s;
285
+ output.v = v;
286
+ output
@@ -0,0 +1,24 @@
1
+ // OKHSV Color Initializer
2
+ // Reference: Björn Ottosson - "A perceptual color picker: OKHSL and OKHSV"
3
+ // URL: https://bottosson.github.io/posts/colorpicker/
4
+ //
5
+ // Creates an OKHSV color from hue, saturation, and value.
6
+ // OKHSV is a perceptually uniform version of HSV built on OKLab.
7
+ //
8
+ // Parameters:
9
+ // - h: Hue angle (0-360 degrees), same as OKLCH hue
10
+ // - s: Saturation (0-1), ratio of chroma to maximum at this value
11
+ // - v: Value/brightness (0-1), with V=1 being brightest for that saturation
12
+ //
13
+ // Input: Object with h, s, v properties
14
+ // Output: Color.OKHSV
15
+
16
+ variable h: Number = input.h;
17
+ variable s: Number = input.s;
18
+ variable v: Number = input.v;
19
+
20
+ variable output: Color.OKHSV;
21
+ output.h = h;
22
+ output.s = s;
23
+ output.v = v;
24
+ output
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "OKHSV",
3
+ "type": "color",
4
+ "description": "OKHSV color space by Björn Ottosson - a perceptually uniform HSV based on OKLab. H is hue (0-360), S is saturation (0-1), V is value (0-1). Reference: https://bottosson.github.io/posts/colorpicker/",
5
+ "schema": {
6
+ "type": "object",
7
+ "properties": {
8
+ "h": {
9
+ "type": "number",
10
+ "description": "Hue angle (0-360 degrees), same as OKLCH hue"
11
+ },
12
+ "s": {
13
+ "type": "number",
14
+ "description": "Saturation (0-1), ratio of chroma to maximum at this value"
15
+ },
16
+ "v": {
17
+ "type": "number",
18
+ "description": "Value/brightness (0-1), with V=1 being the brightest for that saturation"
19
+ }
20
+ },
21
+ "required": ["h", "s", "v"],
22
+ "order": ["h", "s", "v"],
23
+ "additionalProperties": false
24
+ },
25
+ "initializers": [
26
+ {
27
+ "title": "OKHSV Color Initializer",
28
+ "keyword": "okhsv",
29
+ "description": "Creates an OKHSV color from H, S, V values",
30
+ "script": {
31
+ "type": "/api/v1/core/tokenscript/0/",
32
+ "script": "./initializer.tokenscript"
33
+ }
34
+ }
35
+ ],
36
+ "conversions": [
37
+ {
38
+ "source": "/api/v1/core/oklab-color/0/",
39
+ "target": "$self",
40
+ "description": "Converts OKLab to OKHSV using Ottosson's algorithm with Halley's method refinement for gamut boundary",
41
+ "lossless": true,
42
+ "script": {
43
+ "type": "/api/v1/core/tokenscript/0/",
44
+ "script": "./from-oklab.tokenscript"
45
+ }
46
+ }
47
+ ]
48
+ }