{"id":36994006,"url":"https://github.com/phpcolor/phpcolor","last_synced_at":"2026-04-12T03:09:45.659Z","repository":{"id":228062378,"uuid":"773083560","full_name":"phpcolor/phpcolor","owner":"phpcolor","description":"PHP Color Manipulation Library","archived":false,"fork":false,"pushed_at":"2024-05-11T20:15:38.000Z","size":30,"stargazers_count":9,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-11-10T14:30:06.774Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://phpcolor.dev","language":"PHP","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/phpcolor.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-03-16T17:44:20.000Z","updated_at":"2025-06-24T14:41:04.000Z","dependencies_parsed_at":"2024-03-31T01:23:15.550Z","dependency_job_id":"0f9b4da4-54c6-4b62-a1b1-273a0f651667","html_url":"https://github.com/phpcolor/phpcolor","commit_stats":null,"previous_names":["phpcolor/phpcolor"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/phpcolor/phpcolor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phpcolor%2Fphpcolor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phpcolor%2Fphpcolor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phpcolor%2Fphpcolor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phpcolor%2Fphpcolor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/phpcolor","download_url":"https://codeload.github.com/phpcolor/phpcolor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/phpcolor%2Fphpcolor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28405302,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-13T21:51:37.118Z","status":"ssl_error","status_checked_at":"2026-01-13T21:45:14.585Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2026-01-13T23:46:13.201Z","updated_at":"2026-04-12T03:09:45.651Z","avatar_url":"https://github.com/phpcolor.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"colors.svg\" alt=\"Colors\" width=\"90%\"\u003e\n\u003ch1\u003e\u003cimg src=\"https://phpcolor.dev/phpcolor.svg\" alt=\"PHPColor logo\" height=\"50\"\u003e\u003c/h1\u003e\n\nA PHP library for color: 15 color spaces, perceptual mixing, WCAG contrast,\u003cbr\u003e\npalette generation, CSS Level 4/5 support, and vision simulation.\n\n\u0026nbsp; ![PHP Version](https://img.shields.io/badge/PHP-8.3+-fbe8cb?labelColor=bf3636\u0026color=fbe8cb)\n\u0026nbsp; ![CI](https://img.shields.io/github/actions/workflow/status/phpcolor/phpcolor/CI.yaml?branch=main\u0026label=Tests\u0026labelColor=f59e0b\u0026color=fef3c7)\n\u0026nbsp; ![Coverage](https://img.shields.io/badge/PHPUnit-100%25-4fc08d?labelColor=10b981\u0026color=d1fae5)\n\u0026nbsp; ![PHPStan](https://img.shields.io/badge/PHPStan-lvl%2010-31c2f2?labelColor=06b6d4\u0026color=cffafe)\n\u0026nbsp; ![Release](https://img.shields.io/github/v/release/phpcolor/phpcolor?label=Stable\u0026labelColor=3b82f6\u0026color=dbeafe)\n\u0026nbsp; ![License](https://img.shields.io/github/license/phpcolor/phpcolor?label=License\u0026labelColor=6f49c5\u0026color=ede9fe)\n\n\u003cimg src=\"colors.svg\" alt=\"Colors\" width=\"90%\"\u003e\n\u003c/div\u003e\n\n## Color Library\n\n* **Modern CSS Support**: Full `CSS Color 4/5` parsing, including `oklch()`, `color-mix()`, and relative color syntax.\n* **Perceptual Accuracy**: Uses **Oklab** for mixing and gradients to ensure uniform brightness and hue stability.\n* **15 Color Spaces**: Direct conversion between `sRGB`, P3, Lab, XYZ, and more via optimized matrices.\n* **Immutable API**: Chainable value objects for colors, palettes, and gradients.\n* **Accessibility First**: `WCAG 2.1`/APCA contrast ratios, contrast solver, and 7-profile vision simulation.\n* **Developer Friendly**: PHP 8.3+, zero dependencies, typed enums, and PHPStan level 10.\n\n## Installation\n\n```bash\ncomposer require phpcolor/phpcolor\n```\n\n```php\nuse PhpColor\\Color\\Color;\n\n$color = Color::parse('oklch(65% 0.15 210)');\n$lighter = $color-\u003elighten(0.1)-\u003eto('display-p3');\n\necho $lighter-\u003etoCss(); // color(display-p3 0.45 0.72 0.88)\n```\n\n## Create\n\nThe `Color` class is the main entry point. It accepts strings anywhere a\n`ColorInterface` is expected, and provides named constructors for every\nsupported\ncolor space.\n\n### From CSS strings\n\nAny valid CSS color string is accepted, including modern Level 4/5 syntax.\n\n```php\nuse PhpColor\\Color\\Color;\n\n$color = Color::parse('#3b82f6');\n$color = Color::parse('hsl(217 91% 60%)');\n$color = Color::parse('oklch(0.65 0.18 264)');\n$color = Color::parse('color(display-p3 0.23 0.51 0.96)');\n$color = Color::parse('rebeccapurple');\n```\n\n`Color::tryFrom()` returns `null` on invalid input instead of throwing.\n\n### From channel values\n\n```php\n$color = Color::rgb(0.23, 0.51, 0.96);\n$color = Color::rgb(0.23, 0.51, 0.96, 0.8); // with alpha\n$color = Color::oklab(0.62, -0.05, -0.15);\n$color = Color::oklch(0.65, 0.18, 264);\n$color = Color::hex('#3b82f6');\n\n// Named shortcuts\n$black = Color::black();\n$white = Color::white();\n$red   = Color::red();\n```\n\n-\u003e [Parsing docs](docs/getting-started/parsing.md)\n\n\n## Convert\n\nEvery color object converts to any supported color space. Conversions are exact\nand round-trip safely. The result is always a new typed object that can be\nfurther manipulated or [formatted](#format).\n\n```php\n// Typed conversions\n$oklab = $color-\u003etoOklab();\n$oklch = $color-\u003etoOklch();\n$srgb  = $color-\u003etoSrgb();\n$p3    = $color-\u003etoDisplayP3();\n$lab   = $color-\u003etoLab();\n$xyz   = $color-\u003etoXyz();\n\n// Generic conversion by name\n$color-\u003eto('oklch');\n$color-\u003eto('display-p3');\n$color-\u003eto('rec2020');\n```\n\n-\u003e [Color spaces docs](docs/core-concepts/color-spaces.md)\n\n## Format\n\nFormatting produces a string or structured value from any color object.\nThe output space defaults to the color's current space, but can be overridden.\n\n```php\n// CSS string (default: native space)\n$color-\u003etoCss();                // 'oklch(0.65 0.18 264)'\n$color-\u003etoCss('hsl');           // 'hsl(217 91% 60%)'\n$color-\u003etoCss('srgb');          // 'rgb(59 130 246)'\n$color-\u003etoCss('color');         // 'color(srgb 0.231 0.510 0.965)'\n\n// Hex\n$color-\u003etoHex();                // '#3b82f6'\n$color-\u003etoHex(withAlpha: true); // '#3b82f6cc'\n\n// String cast (same as toCss())\n(string) $color;\n$color-\u003etoString();\n\n// Raw channel values\n$color-\u003egetChannels();          // ['r' =\u003e 0.23, 'g' =\u003e 0.51, 'b' =\u003e 0.96]\n```\n\n## Inspect\n\nColor objects expose read methods for common attributes regardless of the\nunderlying space. All values are normalized to a consistent scale.\n\n### Lightness and luminance\n\n```php\n$color-\u003eisLight();       // perceived brightness\n$color-\u003eisDark();\n$color-\u003egetLuminance();  // relative luminance 0-1, per WCAG\n```\n\n### Hue, saturation, opacity\n\n```php\n$color-\u003egetSaturation(); // 0-1\n$color-\u003egetHue();        // 0-360 degrees\n$color-\u003egetOpacity();    // 0-1\n$color-\u003eisOpaque();\n$color-\u003eisTransparent();\n$color-\u003eequals($other);  // perceptual equality check\n```\n\n### Temperature\n\n```php\n$color-\u003etemperature();   // estimated value in Kelvin\n$color-\u003eisHot();\n$color-\u003eisCold();\n```\n\n-\u003e [Hue docs](docs/reference/hue.md) · [Chroma docs](docs/reference/chroma.md) · [Temperature docs](docs/reference/temperature.md)\n\n## Manipulate\n\nAll manipulation methods return a new instance. Colors are immutable and chain\nfreely across color spaces.\n\n### Lightness\n\n```php\n$lighter = $color-\u003elighten(0.15);\n$darker  = $color-\u003edarken(0.15);\n$grey    = $color-\u003egrayscale();\n$inv     = $color-\u003einvert();\n```\n\n### Saturation and hue\n\n```php\n$vivid   = $color-\u003esaturate(0.1);\n$muted   = $color-\u003edesaturate(0.2);\n$shifted = $color-\u003erotateHue(30);\n```\n\n### Temperature\n\n```php\n$warmer = $color-\u003ewarm(0.1);\n$cooler = $color-\u003ecool(0.1);\n```\n\n### Transparency\n\n```php\n$semiOpaque = $color-\u003ewithAlpha(0.5);\n```\n\n### Blend\n\nBlends this color against a backdrop using standard CSS compositing modes.\n\n```php\n$blended = $color-\u003eblend('#000000', 'multiply');\n$blended = $color-\u003eblend($other, 'screen');\n// Also: normal, overlay, darken, lighten\n```\n\nFor perceptual two-color interpolation, see [Mix](#mix).\n\n### Channel control\n\nDirect channel access is useful when you need to set an exact value in a\nspecific color space rather than applying a relative shift.\n\n```php\n$adjusted = $color-\u003etoOklch()-\u003ewithChannel('l', 0.75);\n$adjusted = $color-\u003etoOklch()-\u003ewithChannels(['l' =\u003e 0.75, 'c' =\u003e 0.12]);\n\n// Chain across spaces\n$result = $color-\u003etoOklch()-\u003ewithChannel('h', 120)-\u003eto('display-p3')-\u003etoCss();\n```\n\n-\u003e [Hue docs](docs/reference/hue.md) · [Chroma docs](docs/reference/chroma.md)\n\n## Mix\n\nMixing blends two colors at a given ratio. Oklab is the default interpolation\nspace, which produces perceptually uniform results without the hue shift and\nbrightness dip of sRGB mixing.\n\n```php\n// 50/50 blend in Oklab (default)\n$mixed = Color::mix(Color::red(), Color::blue(), 0.5);\n\n// Control the interpolation space\n$mixed = Color::mix('#ff0000', '#0000ff', 0.3, 'oklch');\n$mixed = Color::mix($a, $b, 0.5, 'srgb');\n\n// Tint (toward white) and shade (toward black) on a single color\n$tinted = $color-\u003etint(0.3);  // 30% white\n$shaded = $color-\u003eshade(0.3); // 30% black\n```\n\nFor multi-step interpolation across a full range, see [Palettes](#palettes).\n\n-\u003e [Mixing docs](docs/guides/mixing.md)\n\n## Harmonies\n\nThese methods generate sets of colors that are harmonically balanced in hue,\nbased on color theory intervals. They operate on any color object and return\narrays in the same color space. For detecting or fixing harmony across an\nexisting palette, see [Palettes](#palettes).\n\n```php\n// Two colors 30 degrees away on either side\n[$left, $right] = $color-\u003eanalogous();\n$set = $color-\u003eanalogous(count: 4);\n\n// Direct opposite on the hue wheel\n$opposite = $color-\u003ecomplementary();\n\n// Two colors flanking the complement\n[$a, $b] = $color-\u003esplitComplementary();\n\n// Three colors evenly spaced (120 degrees apart)\n[$a, $b, $c] = $color-\u003etriadic();\n\n// Four colors (90 degrees apart)\n[$a, $b, $c, $d] = $color-\u003etetradic();\n```\n\n-\u003e [Harmony docs](docs/guides/harmony.md)\n\n## Palettes\n\nA palette is an ordered or named collection of colors. It supports generation,\nbatch transformation, lookup, and CSS export.\n\n### Generate\n\n```php\nuse PhpColor\\Color\\Palette\\ColorPalette;\n\n// From a base color\n$tints  = ColorPalette::tints(Color::parse('#3b82f6'), steps: 9);\n$shades = ColorPalette::shades(Color::parse('#3b82f6'), steps: 9);\n$scale  = ColorPalette::lightnessScale(Color::parse('#3b82f6'), steps: 11);\n$ramp   = ColorPalette::interpolate(Color::red(), Color::blue(), steps: 7);\n\n// From existing colors\n$palette = ColorPalette::fromHex(['#ff0000', '#00ff00', '#0000ff']);\n$palette = ColorPalette::parse(['red', 'oklch(0.6 0.2 264)', '#3b82f6']);\n```\n\n### Transform\n\nAll transformation methods return a new palette. They mirror the single-color\n[Manipulate](#manipulate) API.\n\n```php\n$darkened  = $scale-\u003edarken(0.1);\n$shifted   = $scale-\u003erotateHue(30)-\u003edesaturate(0.05);\n$p3palette = $scale-\u003eto('display-p3');\n\n// Filter and map (map callable must return a ColorInterface)\n$light    = $scale-\u003efilter(fn($c) =\u003e $c-\u003etoOklch()-\u003el \u003e 0.5);\n$inverted = $scale-\u003emap(fn($c) =\u003e $c-\u003erotateHue(180));\n\n// Structural: merge(), slice(), reverse(), count()\n```\n\n### Lookup\n\n```php\n$closest = $scale-\u003eclosest(Color::parse('#4f46e5')); // by Oklab distance\n$mid     = $scale-\u003eat(0.5);                          // interpolated position\n```\n\n### Export\n\nNamed palettes produce CSS custom properties directly, useful for design token\npipelines.\n\n```php\n$ui = ColorPalette::named([\n    'primary'   =\u003e Color::parse('#3b82f6'),\n    'secondary' =\u003e Color::parse('#8b5cf6'),\n    'neutral'   =\u003e Color::parse('#6b7280'),\n]);\n\necho $ui-\u003etoCssVariables('color');\n// --color-primary: #3b82f6;\n// --color-secondary: #8b5cf6;\n// --color-neutral: #6b7280;\n\n// Array export\n$hexArray = $scale-\u003etoHex();\n$cssArray = $scale-\u003etoCss('oklch');\n```\n\n-\u003e [Palette docs](docs/guides/palette.md)\n\n## Gradients\n\nThe gradient builder uses a fluent API modeled on CSS gradient syntax. Oklab\ninterpolation is the default, avoiding the hue shift and brightness loss of sRGB\ngradients. For two-color blending, see [Mix](#mix).\n\n```php\nuse PhpColor\\Color\\Gradient\\GradientBuilder;\n\n// Linear gradient\n$gradient = GradientBuilder::linear(90)\n    -\u003efrom('#ff0000')\n    -\u003evia('#a855f7')\n    -\u003eto('#3b82f6')\n    -\u003ein('oklch')\n    -\u003ebuild();\n\n$gradient-\u003etoCss(); // 'linear-gradient(90deg, ...)'\n\n// Radial gradient with shape and position\nGradientBuilder::radial()\n    -\u003ecircle()\n    -\u003eat('center')\n    -\u003efrom('white')\n    -\u003eto('black')\n    -\u003ebuild();\n\n// Conic gradient with explicit stop positions (0.0-1.0)\nGradientBuilder::conic(0)\n    -\u003estop('red', 0.0)\n    -\u003estop('yellow', 0.33)\n    -\u003estop('blue', 0.66)\n    -\u003ebuild();\n```\n\n-\u003e [Gradient docs](docs/guides/gradient.md)\n\n## Accessibility\n\n### WCAG contrast\n\n`ColorContrast` calculates contrast ratios per WCAG 2.x. The `WcagLevel` enum\nprevents invalid inputs and replaces the old string-based API.\n\n```php\nuse PhpColor\\Color\\Contrast\\ColorContrast;\nuse PhpColor\\Color\\Contrast\\WcagLevel;\n\n$ratio = ColorContrast::calculate(Color::black(), Color::white()); // 21.0\n\nColorContrast::meetsFor($text, $background, WcagLevel::AA);\nColorContrast::meetsFor($text, $background, WcagLevel::AAA, largeText: true);\n\nColorContrast::requiredRatio(WcagLevel::AA);  // 4.5 normal, 3.0 large text\nColorContrast::requiredRatio(WcagLevel::AAA); // 7.0 normal, 4.5 large text\n```\n\n### APCA\n\nAPCA (Accessible Perceptual Contrast Algorithm) is a newer model that accounts\nfor font weight and size. It returns a signed lightness contrast value rather\nthan a simple ratio.\n\n```php\nuse PhpColor\\Color\\Contrast\\ApcaContrast;\n\n$lc = ApcaContrast::lc($text, $background);\n```\n\n### Solving contrast\n\n`ContrastSolver` helps fix colors that fail a requirement, rather than just\nchecking them. See also [Vision simulation](#vision) for accessibility testing\nacross color vision profiles.\n\n```php\nuse PhpColor\\Color\\Contrast\\ContrastSolver;\n\n// Adjust lightness until the color passes the target ratio\n$fixed = ContrastSolver::adjustLightnessToContrast($text, $background, 4.5);\n\n// Pick the most accessible option from a set of candidates\n$best = ContrastSolver::bestOn($background, [$white, $black, $brand]);\n\n// Find the minimum opacity at which a color passes on a given background\n$alpha = ContrastSolver::requiredAlpha($text, $background, 4.5);\n```\n\n-\u003e [Contrast docs](docs/reference/contrast.md)\n\n## Distance\n\nColor distance measures how different two colors appear to a human observer.\nPHPColor uses CIEDE2000 by default, the most perceptually accurate formula\navailable. `Color::deltaE()` is a convenient shorthand.\n\n```php\n// Via the Color facade\n$delta = Color::deltaE($a, $b);\n$dist  = Color::distance($a, $b, 'CMC');\n\n// Direct, with explicit algorithm choice\nuse PhpColor\\Color\\Distance\\ColorDistance;\n\n$delta = ColorDistance::deltaE($a, $b);                 // CIEDE2000\n$dist  = ColorDistance::calculate($a, $b, 'DeltaE94');\n$dist  = ColorDistance::calculate($a, $b, 'CMC');\n```\n\nDistance is used internally by `ColorPalette::closest()` and by\n`ColorVisionSimulator::areDistinguishable()`. See [Vision](#vision).\n\n-\u003e [Distance docs](docs/reference/distance.md)\n\n## Vision\n\n`ColorVisionSimulator` applies transformation matrices that approximate how\ncolors appear under a given vision deficiency profile. Useful for testing\nwhether a UI or palette works for colorblind users.\n\n```php\nuse PhpColor\\Color\\Vision\\ColorVisionSimulator;\nuse PhpColor\\Color\\Vision\\VisionProfile;\n\n$simulator = ColorVisionSimulator::create(VisionProfile::Deuteranomaly);\n\n// Simulate how a single color looks\n$simulated = $simulator-\u003esimulate($color);\n\n// Check if two colors remain distinguishable under this profile\n$ok = $simulator-\u003eareDistinguishable($colorA, $colorB); // threshold: 0.06\n\n// Simulate an entire set of colors at once\n$simulated = $simulator-\u003esimulateAll($palette-\u003eall());\n```\n\nSupported profiles: `Protanopia`, `Deuteranopia`, `Tritanopia`, `Protanomaly`,\n`Deuteranomaly` (most common, affecting ~5% of males), `Tritanomaly`,\n`Monochromacy`.\n\n-\u003e [Vision docs](docs/reference/vision.md)\n\n## CSS\n\nPHPColor parses and resolves the full CSS Color Level 4/5 expression layer.\nThese features are useful for design token pipelines, server-side theme\nprocessing, and any context where colors are expressed as CSS values rather\nthan raw channels.\n\n### color-mix()\n\nResolves a `color-mix()` expression to a concrete color, using the interpolation\nspace declared in the function.\n\n```php\nuse PhpColor\\Color\\Css\\CssColor;\nuse PhpColor\\Color\\Css\\CssContext;\n\n$expr     = CssColor::parse('color-mix(in oklab, #ff0000 30%, #0000ff)');\n$resolved = $expr-\u003eresolve(new CssContext());\n```\n\n### light-dark()\n\nProduces a theme-aware color that resolves differently depending on the\ncontext's\ncolor scheme flag.\n\n```php\n$adaptive = CssColor::lightDark(\n    Color::parse('#1a1a1a'), // light theme value\n    Color::parse('#f5f5f5'), // dark theme value\n);\n\n$resolved = $adaptive-\u003eresolve(new CssContext(scheme: 'dark'));\n```\n\n### Custom properties\n\nWraps a color with a CSS custom property reference and an optional fallback.\n\n```php\n$withVar = CssColor::var('--brand-color', Color::parse('#3b82f6'));\n```\n\n### Relative color syntax\n\nAllows deriving a new color from an existing one using CSS channel expressions,\nfollowing the CSS Color 5 relative color syntax.\n\n```php\n$relative = CssColor::relative('oklch', $origin, ['l' =\u003e 'calc(l + 0.1)'], null);\n```\n\n-\u003e [CSS colors docs](docs/reference/css-colors.md) · [Relative colors docs](docs/guides/relative-colors.md)\n\n## Color Spaces\n\n| Space       | Class             | Description                              |\n|-------------|-------------------|------------------------------------------|\n| sRGB        | `SrgbColor`       | Standard RGB (0-1 channels)              |\n| Oklab       | `OklabColor`      | Perceptually uniform, ideal for mixing   |\n| Oklch       | `OklchColor`      | Cylindrical Oklab, intuitive hue control |\n| Lab         | `LabColor`        | CIELAB (D50 illuminant)                  |\n| LCH         | `LchColor`        | Cylindrical Lab                          |\n| HWB         | `HwbColor`        | Hue, Whiteness, Blackness (CSS Color 4)  |\n| CMYK        | `CmykColor`       | Subtractive (print)                      |\n| Display P3  | `DisplayP3Color`  | Wide-gamut (Apple displays)              |\n| Adobe RGB   | `A98RgbColor`     | Adobe RGB 1998                           |\n| ProPhoto    | `ProPhotoColor`   | Wide-gamut professional photography      |\n| Rec. 2020   | `Rec2020Color`    | HDR and broadcast                        |\n| CIE XYZ     | `XyzColor`        | Device-independent reference space       |\n| Linear sRGB | `LinearSrgbColor` | sRGB without gamma encoding              |\n\n-\u003e [Color spaces docs](docs/core-concepts/color-spaces.md)\n\n## Contributing\n\nContributions are welcome. Please open an issue before submitting a pull request\nfor significant changes.\n\n```bash\ngit clone https://github.com/phpcolor/phpcolor.git\ncd phpcolor\ncomposer install\n\ncomposer test  # PHPUnit\ncomposer sa    # PHPStan static analysis\ncomposer cs    # PHP-CS-Fixer\n```\n\n## License\n\n[PHPColor](https://phpcolor.dev) is released under the [MIT license](LICENSE).\n\n\u003cimg src=\"colors.svg\" alt=\"Colors\" /\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphpcolor%2Fphpcolor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphpcolor%2Fphpcolor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphpcolor%2Fphpcolor/lists"}