{"id":22769743,"url":"https://github.com/bfontaine/pheasant.js","last_synced_at":"2026-05-18T03:02:52.252Z","repository":{"id":7293875,"uuid":"8609684","full_name":"bfontaine/Pheasant.js","owner":"bfontaine","description":"Easy colors manipulations.","archived":false,"fork":false,"pushed_at":"2015-01-05T12:32:53.000Z","size":451,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-04-06T19:41:58.580Z","etag":null,"topics":["colors","js","library"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bfontaine.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2013-03-06T18:03:56.000Z","updated_at":"2015-01-05T12:32:53.000Z","dependencies_parsed_at":"2022-09-26T17:11:14.005Z","dependency_job_id":null,"html_url":"https://github.com/bfontaine/Pheasant.js","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/bfontaine/Pheasant.js","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bfontaine%2FPheasant.js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bfontaine%2FPheasant.js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bfontaine%2FPheasant.js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bfontaine%2FPheasant.js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bfontaine","download_url":"https://codeload.github.com/bfontaine/Pheasant.js/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bfontaine%2FPheasant.js/sbom","scorecard":{"id":235895,"data":{"date":"2025-08-11","repo":{"name":"github.com/bfontaine/Pheasant.js","commit":"c294e0e2eb3659aa12de242fef91de5e84badb7a"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.8,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":9,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/bfontaine/.github/SECURITY.md:1","Info: Found linked content: github.com/bfontaine/.github/SECURITY.md:1","Warn: One or no descriptive hints of disclosure, vulnerability, and/or timelines in security policy","Info: Found text in security policy: github.com/bfontaine/.github/SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}}]},"last_synced_at":"2025-08-17T05:45:05.288Z","repository_id":7293875,"created_at":"2025-08-17T05:45:05.289Z","updated_at":"2025-08-17T05:45:05.289Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33163413,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T22:39:12.733Z","status":"online","status_checked_at":"2026-05-18T02:00:06.436Z","response_time":71,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["colors","js","library"],"created_at":"2024-12-11T15:14:57.981Z","updated_at":"2026-05-18T03:02:52.229Z","avatar_url":"https://github.com/bfontaine.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Pheasant.js\n\n[![Build Status](https://travis-ci.org/bfontaine/Pheasant.js.png)](https://travis-ci.org/bfontaine/Pheasant.js)\n\n**Pheasant.js** makes colors manipulations easy.\n\n## Install\n\n### Server-side (Node)\n\n```sh\nnpm install pheasant\n```\n\nThen use:\n\n```js\nvar Pheasant = require( 'pheasant' );\n```\n\n### Client-side\n\nInclude the `build/pheasant.min.js` file in your page. There’s no dependency,\nonly 15ko of pure JavaScript (4.5ko gzip’d). Pheasant can also be used as an AMD\nmodule.\n\n\n## Usage\n\nPheasant exposes one object, `Pheasant`. It has the following methods:\n\n### .parse\n\nThis function returns a `Pheasant.Color` object of the parsed string, or null if it\ncan’t be parsed (see the support table below for the supported formats).\n\n```js\nPheasant.parse( 'red' ); // red\nPheasant.parse( '#0F0' ); // green\nPheasant.parse( '#0000FF' ); // blue\nPheasant.parse( 'rgb(128, 128, 128)' ); // gray\nPheasant.parse( 'rgb(10%, 10%, 10%, 0.3)' ); // transparent gray\nPheasant.parse( 'rgba(255, 192, 203, 0.5)' ); // transparent pink\nPheasant.parse( 'hsl(240, 100%, 50%)' ); // blue\nPheasant.parse( 'hsla(120, 100%, 25%, 1)' ); // green\n```\n\n### .convert\n\nThis function takes two arguments, the first is the string to parse and the second\nis the identifier of the format to convert to.\n\n```js\nPheasant.parse( 'pink' ).toString( 'rgba' ); // 'rgba(255,192,203,1)'\nPheasant.convert( 'pink', 'rgba' ); // 'rgba(255,192,203,1)'\n```\n\n### .guessFormat\n\nThis function takes one argument, a string, and return the first identifier\nof its format, if it’s a supported one. It returns `null` if it can’t guess\nthe format.\n\n```js\nPheasant.guessFormat( '#ccc' ); // 'hex3'\nPheasant.guessFormat( '#cccbbb' ); // 'hex6'\nPheasant.guessFormat( '#cccb' ); // null\n```\n\n### .range\n\nThis function takes an object as its argument, and return a range of colors. The\nobject must have the following properties:\n\n- `from`: The color to start the range with. It can be a valid color string, or a\n  `Pheasant.Color` object.\n- `to`: The color to end the range with. As `from`, it can be a valid color\n  string, or a `Pheasant.Color` object.\n\nAdditionally, the object can have the following optional properties:\n\n- `length`: the length of the range (default to 100).\n- `type`: the type of the range values. It must be one of the following:\n    - `'string'` (default): Each value is a string describing the color. If you\n      provide a `format` attribute, it’ll be used. If it’s not provided and if the\n      two colors (`from` and `to`) both are strings of the same format, this is\n      the one which will be used. If none of theses conditions are met, the\n      default format will be used.\n    - `'object'`: Each value is a `Pheasant.Color` object.\n    - `'rgb'`: Each value is an array of three numbers, the red, green and blue\n      channels.\n    - `'rgba'`: Same as `'rgb'`, but with the alpha channel.\n- `format`: this attribute is used only if the `type` is not provided or is set\n  to `'string'`. It defines the format used for the colors strings.\n\nThis function returns an empty array if `from` and/or `to` are missing, and/or if the\nlength is lesser or equal to zero, and/or if the `type` attribute is not valid, and/or\nthe `format` attribute is not valid, and/or `from` (or `to`) is a string which\ncannot be parsed. Some values in the range may be null if you choose the\n`colorName` format, since some values don’t have a name (e.g. `rgba(1, 1, 1)`).\n\n```js\n// [ '#fff', '#fff', '#fff' ]\nPheasant.range({ from: '#fff', to: '#fff', length: 3 });\n\n// [\"#abc\", \"#89a\", \"#568\", \"#345\", \"#123\"]\nPheasant.range({ from: '#ABC', to: '#123', length: 5 });\n\n// [\"#40bf40\", \"#3ca13c\", \"#378337\", \"#336633\", \"#2e482e\", \"#2a2a2a\"]\nPheasant.range({\n    from: 'hsl(120, 50%, 50%)',\n    to: 'rgb(42, 42, 42)',\n    length: 6,\n    format: 'hex6'\n});\n```\n\n\n## Color objects\n\nYou can create a `Color` object using the following constructor:\n\n```js\nvar color = new Pheasant.Color( red, green, blue, alpha );\n```\n`alpha` is optional (default to 1), and `red`, `green` and `blue` should be\nintegers between 0 and 255.\n\n`Color` objects has four attributes, `.red`, `.green`, `.blue` and `.alpha`.\nThey also have two convenient methods: `.getRGB()` and `.getRGBA()`, which\nreturn an array of `.red`, `.green` and `.blue` properties, plus the `.alpha`\none for `.getRGBA()`.\n\n```js\nPheasant.parse( 'navy' ).blue; // 128\n```\n\n### .toString\n\nYou can use the `.toString()` method to convert colors to the format you want.\nWithout argument, it convert the color to the default format (`#ABCDEF`). You\ncan specify the format you want as a string. See the format identifiers below.\n\n```js\nPheasant.parse( 'red' ).toString(); // '#f00'\nPheasant.parse( '#00F' ).toString( 'colorName' ); // 'blue'\nvar c = Pheasant.parse( 'rgb(245, 245, 220)' );\nc.toString( 'colorName' ); // 'beige'\nc.toString( 'hsl' ); // 'hsl(60,56%,91%)'\n```\n\nSince it may be painful to write `Pheasant.parse( 'foo' ).toString( 'bar' )` for\na one-time conversion, Pheasant has a method for that: `.convert`.\n\n### .getRGB\n\nThis method returns an array of red, green and blue values.\n\n```js\nPheasant.parse( 'red' ).getRGB(); // [ 255, 0, 0 ]\n```\n\n### .getRGBA\n\nThis method returns an array of red, green, blue, and opacity values.\n\n```js\nPheasant.parse( 'red' ).getRGBA();                  // [ 255,   0,   0, 1   ]\nPheasant.parse( 'hsla(42,12%,99%,0.5)' ).getRGBA(); // [ 253, 253, 252, 0.5 ]\n```\n\n### .getHSL\n\nThis method returns the equivalent HSL values of the color (hue, saturation,\nlightness).\n\n```js\nPheasant.parse( 'red' ).getHSL();  // [  0, 100, 50 ]\nPheasant.parse( '#ffe' ).getHSL(); // [ 60, 100, 97 ]\n```\n\n### .getHSV\n\nThis method returns the equivalent HSV values of the color (hue, saturation,\nvalue). HSV is also called HSB (“value” being replaced by “brightness”), so\nan alias method called `.getHSB` is also available (this is exactly the same).\n\n```js\nPheasant.parse( 'green' ).getHSV(); // [ 120, 100, 50 ]\n```\n\n### .negative\n\nThis method returns a new object representing the negative of the current color.\nIt preserves the alpha channel.\n\n```\nvar c1 = new Pheasant.color( 42, 42, 42 ),\n    c2 = c1.negative();\n\nc2.getRGB(); // [ 213, 213, 213 ]\n\nPheasant.parse( 'white' ).negative().toString( 'colorName' ); // 'black'\n```\n\n### .brightness\n\nThis method returns the [brightness index][brightness] of the color. This is an\ninteger between 0 (dark) and 255 (white). It can be used to mesure the contrast\nbetween two colors.\n\n[brightness]: http://www.had2know.com/technology/color-contrast-calculator-web-design.html\n\n```js\nPheasant.parse( '#fff' ).brightness(); // 255\nPheasant.parse( 'rgb(42, 10, 134)' ).brightness(); // 34\n```\n\n### .isDarkerThan\n\nThis method tests if the color is darker than another color. You can pass it a\n`Color` object or a string.\n\n```js\nPheasant.parse( '#fff' ).isDarkerThan( '#eee' ); // false\nPheasant.parse( 'red' ).isDarkerThan( '#FAFAFA' ); // true\n```\n\n### .isLighterThan\n\nThis method tests if the color is lighter than another color. You can pass it a\n`Color` object or a string.\n\n```js\nPheasant.parse( '#fff' ).isLighterThan( '#eee' ); // true\nPheasant.parse( 'red' ).isLighterThan( '#FAFAFA' ); // false\n```\n\n### .eq\n\nThis method tests the equality between this color and another. You can pass it a\n`Color` object or a string.\n\n```js\nPheasant.parse( '#000' ).eq( 'rgba( 0, 0, 0)' ); // true\n```\n\n### .brightnessContrast\n\nThis method returns the brightness contrast between the current color and\nanother. It’s an integer between 0 and 255.\n\n```js\nPheasant.parse( 'blue' ).brightnessContrast( 'yellow' ) // true\nPheasant.parse( 'blue' ).brightnessContrast( 'darkblue' ); // false\n```\n\n### .hueContrast\n\nThis method returns the hue contrast between the current color and another. It’s\nan integer between 0 and 765. For the best readability, the brightness contrast\nbetween the text color and the background color should be higher than 125, and\nthe hue contrast higher than 500.\n\n## Color Formats\n\n### Built-in Support\n\nAll standard CSS/SVG colors formats are supported.\n\n| Format      | Parsing | Stringifying | Identifiers               |\n|-------------|:-------:|:------------:|---------------------------|\n| #ABC        | ✔       | ✔            | `hex3`, `hexa3`           |\n| #ABCDEF     | ✔       | ✔            | `hex6`, `hexa4`           |\n| color names | ✔       | ✔            | `colorName`, `colourName` |\n| hsl()       | ✔       | ✔            | `hsl`                     |\n| hsla()      | ✔       | ✔            | `hsla`                    |\n| rgb()\\*     | ✔       | ✔            | `rgb`                     |\n| rgba()\\*    | ✔       | ✔            | `rgba`                    |\n\nFormat identifiers are case-insensitive.\n\n(\\*): The `rgb()` and `rgba()` formats also support percentages values, like\n`rgb(20%, 10%, 45%)` and `rgba(35%, 0%, 100%, 0.2)`. If you want to force\npercentages in the output, append `%` to each identifier: `rgb%` and `rgba%`.\n\n### Setting the default output format\n\nThe default ouput format (for `toString`) is `hex6`. You can change it with\n`Pheasant.setDefaultStringFormat()`:\n\n```js\nPheasant.parse( 'lightgreen' ).toString(); // '#90ee90'\nPheasant.setDefaultStringFormat( 'rgb' );\nPheasant.parse( 'lightgreen' ).toString(); // 'rgb(144,238,144)'\n```\n\n### Adding a format\n\nYou can add a new format with `Pheasant.addFormat()`. This method takes one\nargument, an object with the following properties:\n\n- `name`: the identifier(s) of the format. Must be a string (one identifier) or\n  an array of strings (multiple identifiers).\n- `parse`: a function which convert a string in your format to a color\n  object. It must return an object with the following, optional, properties:\n  - `red`: the red channel (integer between 0 and 255)\n  - `blue`: the blue channel (integer between 0 and 255)\n  - `green`: the green channel (integer between 0 and 255)\n  - `alpha`: the alpha channel (float between 0 and 1)\n  If it can’t parse the string, it must return `null`. If the returned value is\n  not null, it’ll be wrapped in a `Pheasant.Color` object.\n- `stringify`: a function wich convert a `Pheasant.Color` object to a string of\n  your format. It must return null if it can’t stringify the color (e.g.:\n  there’s `NaN` values in it).\n- `normalize`: Optional. If set to `false`, the parsed string won’t be\n  normalized before being passed to your `.parse` function (the normalizing\n  process force the string to lowercase and remove trailing spaces).\n- `test`: Optional. If it’s a function, it’ll be used to test whether a string\n  is valid in this format or not. If it’s a regex, its `.test` method will be\n  used. This attribute is used by the `.guessFormat` function.\n\nThe object must provide the `parse` and/or `stringify` attributes, and must\nprovide the `name` attribute.\n\nWhen a string is passed to `Pheasant.parse`, it tries to parse it with every\navailable format. If no format can parse it (i.e. they all return `null`), it\nreturns `null`.\n\nThe `Pheasant.addFormat()` method return either:\n- `null` if your format has only one name and it’s already taken\n- the name of your format if it’s available\n- an array of strings if your format has multiple names. Only the available\n  names are returned\n\nThis means that if you try to register a new format with the identifier `hex3`\n(already taken), it won’t be registered and the call will return `null`. If you\ntry with `HEX3`, that’s the same since format identifiers are case-insensitive.\nIf your format has two names, `hex3` and `hex_3`, it will only be bound to\n`hex_3`, since `hex3` is not available.\n\nIf you want to clear all the available formats, use the `Pheasant.formats`\nobject:\n\n```js\nPheasant.formats = {};\n```\n\n### Example\n\nSay you want to add a custom color format, which represent colors like that:\n`custom:\u003cblue\u003e/\u003cred\u003e/\u003cgreen\u003e`. It doesn’t support the alpha channel, and\nblue/red/green values are integer between 0 and 255. Here is how you can add\nthis format:\n\n```js\nPheasant.addFormat((function() {\n\n    // this regex match your format\n    var custom_re = /custom:(\\d{1,3})\\/(\\d{1,3})\\/(\\d{1,3})/;\n\n    return {\n\n        name: 'custom', // the name\n        test: custom_re, // this is used to test if a string is valid in your format\n        parse: function( s ) {\n            // parse the string\n\n            custom_re.lastIndex = 0;\n\n            var brg = custom_re.exec( s );\n\n            return { blue: +brg[1], red: +brg[2], green: +brg[3] };\n\n        },\n\n        stringify: function( c ) {\n            // stringify a Color object\n\n            return 'custom:' + c.blue + '/' + c.red + '/' + c.green;\n\n        }\n\n    };\n\n})());\n```\n\nYou can now try your format:\n\n```js\nPheasant.guessFormat( 'custom:42/18/255' ); // 'custom'\nPheasant.parse( 'custom:1/2/3' ).getRGB(); // [ 2, 3, 1 ]\nPheasant.convert( '#ABC', 'custom' ); // \"custom:204/170/187\"\n```\n\n## Tests\n\nClone this repo, and then run `make test-all`:\n\n```sh\ngit clone https://github.com/bfontaine/Pheasant.js.git\ncd Pheasant\nmake test-all\n```\n\nYou have to install the dependencies if they’re not already installed:\n\n```sh\nnpm -g install mocha chai uglify-js mocha-phantomjs\n# install Node-JSCoverage\ngit clone https://github.com/visionmedia/node-jscoverage.git\ncd node-jscoverage\n./configure \u0026\u0026 make \u0026\u0026 make install\n```\n\nYou also need [PhantomJS][phantomjs].\n\n[phantomjs]: http://phantomjs.org/download.html\n\n## License\n\nSee the LICENSE file (MIT).\n\n## Changelog\n\nDate format is DD/MM/YYYY.\n\n### v0.2.2 (08/10/2013)\n\n- `Color#brightness`, `Color#brightnessContrast`, `Color#hueContrast`\n- `Color#isLighterThan` \u0026 `Color#isDarkerThan` fixed\n- `Color#getHSL`, `Color#getHSV`, `Color#getHSB`\n\n### v0.2.1 (10/09/2013)\n\n- AMD support (#6)\n- On Node, `Pheasant` is now returned as the module itself (i.e.\n  `require('pheasant')`, not `require('pheasant').Pheasant`), but the old method\n  is still supported for backward compatibility.\n\n### v0.2.0 (12/03/2013)\n\n- `Pheasant#range`\n- `Color#isLighterThan`, `Color#isDarkerThan`, `Color#eq`\n- Minified version added\n- Better doc\n\n### v0.1.1 (10/03/2013)\n\n- `Color#negative` (#3)\n- `test` optional attribute support added on `.addFormat` argument\n- `Pheasant.guessFormat` added\n\n### v0.1.0 (09/03/2013)\n\nFirst version.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbfontaine%2Fpheasant.js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbfontaine%2Fpheasant.js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbfontaine%2Fpheasant.js/lists"}