Fix mexitek/phpcolors
Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>pull/32145/head
parent
8bcba22d77
commit
1f92440b79
@ -1,62 +1,5 @@
|
|||||||
{
|
{
|
||||||
"packages": [
|
"packages": [],
|
||||||
{
|
|
||||||
"name": "mexitek/phpcolors",
|
|
||||||
"version": "v1.0.4",
|
|
||||||
"version_normalized": "1.0.4.0",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/mexitek/phpColors.git",
|
|
||||||
"reference": "4043974240ca7dc3c2bec3c158588148b605b206"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/mexitek/phpColors/zipball/4043974240ca7dc3c2bec3c158588148b605b206",
|
|
||||||
"reference": "4043974240ca7dc3c2bec3c158588148b605b206",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": "^7.2|^8.0"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"nette/tester": "^2.3",
|
|
||||||
"squizlabs/php_codesniffer": "^3.5"
|
|
||||||
},
|
|
||||||
"time": "2021-11-26T13:19:08+00:00",
|
|
||||||
"type": "library",
|
|
||||||
"installation-source": "dist",
|
|
||||||
"autoload": {
|
|
||||||
"classmap": [
|
|
||||||
"src"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Arlo Carreon",
|
|
||||||
"homepage": "http://arlocarreon.com",
|
|
||||||
"role": "creator"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "A series of methods that let you manipulate colors. Just incase you ever need different shades of one color on the fly.",
|
|
||||||
"homepage": "http://mexitek.github.com/phpColors/",
|
|
||||||
"keywords": [
|
|
||||||
"color",
|
|
||||||
"css",
|
|
||||||
"design",
|
|
||||||
"frontend",
|
|
||||||
"ui"
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"issues": "https://github.com/mexitek/phpColors/issues",
|
|
||||||
"source": "https://github.com/mexitek/phpColors"
|
|
||||||
},
|
|
||||||
"install-path": "../mexitek/phpcolors"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"dev": false,
|
"dev": false,
|
||||||
"dev-package-names": []
|
"dev-package-names": []
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,26 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
// platform_check.php @generated by Composer
|
|
||||||
|
|
||||||
$issues = array();
|
|
||||||
|
|
||||||
if (!(PHP_VERSION_ID >= 70200)) {
|
|
||||||
$issues[] = 'Your Composer dependencies require a PHP version ">= 7.2.0". You are running ' . PHP_VERSION . '.';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($issues) {
|
|
||||||
if (!headers_sent()) {
|
|
||||||
header('HTTP/1.1 500 Internal Server Error');
|
|
||||||
}
|
|
||||||
if (!ini_get('display_errors')) {
|
|
||||||
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
|
|
||||||
fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
|
|
||||||
} elseif (!headers_sent()) {
|
|
||||||
echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
trigger_error(
|
|
||||||
'Composer detected issues in your platform: ' . implode(' ', $issues),
|
|
||||||
E_USER_ERROR
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
# EditorConfig is awesome: http://EditorConfig.org
|
|
||||||
|
|
||||||
# top-most EditorConfig file
|
|
||||||
root = true
|
|
||||||
|
|
||||||
# Unix-style newlines with a newline ending every file
|
|
||||||
[*]
|
|
||||||
charset = utf-8
|
|
||||||
end_of_line = lf
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 4
|
|
||||||
insert_final_newline = true
|
|
||||||
trim_trailing_whitespace = true
|
|
||||||
|
|
||||||
# .travis.yml
|
|
||||||
[.travis.yml]
|
|
||||||
indent_size = 2
|
|
||||||
@ -1,5 +0,0 @@
|
|||||||
*.bak
|
|
||||||
*.*.bak
|
|
||||||
vendor/*
|
|
||||||
composer.lock
|
|
||||||
.idea
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="PHPColors"
|
|
||||||
xsi:noNamespaceSchemaLocation="https://raw.githubusercontent.com/squizlabs/PHP_CodeSniffer/master/phpcs.xsd">
|
|
||||||
<description>The coding standard for PHPColors.</description>
|
|
||||||
|
|
||||||
<file>./src</file>
|
|
||||||
<file>./tests</file>
|
|
||||||
|
|
||||||
<rule ref="PSR12"/>
|
|
||||||
</ruleset>
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
language: php
|
|
||||||
php:
|
|
||||||
- 7.2
|
|
||||||
- 7.3
|
|
||||||
- 7.4
|
|
||||||
- 8.0
|
|
||||||
before_script:
|
|
||||||
- composer install --no-interaction --dev --prefer-source
|
|
||||||
script:
|
|
||||||
- vendor/bin/phpcs --extensions=php,phpt --warning-severity=0
|
|
||||||
- vendor/bin/tester tests -s -p php
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2020 Arlo Carreon, http://arlocarreon.com
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
@ -1,173 +0,0 @@
|
|||||||
# PHPColors [](https://travis-ci.org/mexitek/phpColors)
|
|
||||||
|
|
||||||
> A series of methods that let you manipulate colors. Just incase you ever need different shades of one color on the fly.
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
PHPColors requires PHP version 7.2.0 or greater.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
### Composer
|
|
||||||
|
|
||||||
Simply add `mexitek/phpcolors` to `composer.json` using `dev-master`.
|
|
||||||
|
|
||||||
```
|
|
||||||
composer require mexitek/phpcolors:dev-master
|
|
||||||
```
|
|
||||||
|
|
||||||
## How it works
|
|
||||||
Instantiate an object of the color class with a hex color string `$foo = new Color("336699")`. That's it! Now, call the methods you need for different color variants.
|
|
||||||
|
|
||||||
## Available Methods
|
|
||||||
- <strong>darken( [$amount] )</strong> : Allows you to obtain a darker shade of your color. Optionally you can decide to darken using a desired percentage.
|
|
||||||
- <strong>lighten( [$amount] )</strong> : Allows you to obtain a lighter shade of your color. Optionally you can decide to lighten using a desired percentage.
|
|
||||||
- <strong>mix($hex, [$amount] )</strong> : Allows you to mix another color to your color. Optionally you can decide to set the percent of second color or original color amount is ranged -100...0...100.
|
|
||||||
- <strong>isLight( [$hex] )</strong> : Determins whether your color (or the provide param) is considered a "light" color. Returns `TRUE` if color is light.
|
|
||||||
- <strong>isDark( [$hex] )</strong> : Determins whether your color (or the provide param) is considered a "dark" color. Returns `TRUE` if color is dark.
|
|
||||||
- <strong>makeGradient( [$amount] )</strong> : Returns an array with 2 indices `light` and `dark`, the initial color will either be selected for `light` or `dark` depending on its brightness, then the other color will be generated. The optional param allows for a static lighten or darkened amount.
|
|
||||||
- <strong>complementary()</strong> : Returns the color "opposite" or complementary to your color.
|
|
||||||
- <strong>getHex()</strong> : Returns the original hex color.
|
|
||||||
- <strong>getHsl()</strong> : Returns HSL array for your color.
|
|
||||||
- <strong>getRgb()</strong> : Returns RGB array for your color.
|
|
||||||
|
|
||||||
> Auto lightens/darkens by 10% for sexily-subtle gradients
|
|
||||||
|
|
||||||
```php
|
|
||||||
/**
|
|
||||||
* Using The Class
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Mexitek\PHPColors\Color;
|
|
||||||
|
|
||||||
// Initialize my color
|
|
||||||
$myBlue = new Color("#336699");
|
|
||||||
|
|
||||||
echo $myBlue->darken();
|
|
||||||
// 1a334d
|
|
||||||
|
|
||||||
echo $myBlue->lighten();
|
|
||||||
// 8cb3d9
|
|
||||||
|
|
||||||
echo $myBlue->isLight();
|
|
||||||
// false
|
|
||||||
|
|
||||||
echo $myBlue->isDark();
|
|
||||||
// true
|
|
||||||
|
|
||||||
echo $myBlue->complementary();
|
|
||||||
// 996633
|
|
||||||
|
|
||||||
echo $myBlue->getHex();
|
|
||||||
// 336699
|
|
||||||
|
|
||||||
print_r( $myBlue->getHsl() );
|
|
||||||
// array( "H"=> 210, "S"=> 0.5, "L"=>0.4 );
|
|
||||||
|
|
||||||
print_r( $myBlue->getRgb() );
|
|
||||||
// array( "R"=> 51, "G"=> 102, "B"=>153 );
|
|
||||||
|
|
||||||
print_r($myBlue->makeGradient());
|
|
||||||
// array( "light"=>"8cb3d9" ,"dark"=>"336699" )
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Static Methods
|
|
||||||
- <strong>hslToHex( $hsl )</strong> : Convert a HSL array to a HEX string.
|
|
||||||
- <strong>hexToHsl( $hex )</strong> : Convert a HEX string into an HSL array.
|
|
||||||
- <strong>hexToRgb( $hex )</strong> : Convert a HEX string into an RGB array.
|
|
||||||
- <strong>rgbToHex( $rgb )</strong> : Convert an RGB array into a HEX string.
|
|
||||||
|
|
||||||
```php
|
|
||||||
/**
|
|
||||||
* On The Fly Custom Calculations
|
|
||||||
*/
|
|
||||||
|
|
||||||
use Mexitek\PHPColors\Color;
|
|
||||||
|
|
||||||
// Convert my HEX
|
|
||||||
$myBlue = Color::hexToHsl("#336699");
|
|
||||||
|
|
||||||
// Get crazy with the HUE
|
|
||||||
$myBlue["H"] = 295;
|
|
||||||
|
|
||||||
// Gimme my new color!!
|
|
||||||
echo Color::hslToHex($myBlue);
|
|
||||||
// 913399
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
## CSS Helpers
|
|
||||||
- <strong>getCssGradient( [$amount] [, $vintageBrowsers] )</strong> : Generates the CSS3 gradients for safari, chrome, opera, firefox and IE10. Optional percentage amount for lighter/darker shade. Optional boolean for older gradient CSS support.
|
|
||||||
|
|
||||||
> Would like to add support to custom gradient stops
|
|
||||||
|
|
||||||
```php
|
|
||||||
|
|
||||||
use Mexitek\PHPColors\Color;
|
|
||||||
|
|
||||||
// Initialize my color
|
|
||||||
$myBlue = new Color("#336699");
|
|
||||||
|
|
||||||
// Get CSS
|
|
||||||
echo $myBlue->getCssGradient();
|
|
||||||
/* - Actual output doesn't have comments and is single line
|
|
||||||
|
|
||||||
// fallback background
|
|
||||||
background: #336699;
|
|
||||||
|
|
||||||
// IE Browsers
|
|
||||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#8cb3d9', endColorstr='#336699');
|
|
||||||
|
|
||||||
// Safari 5.1+, Mobile Safari, Chrome 10+
|
|
||||||
background-image: -webkit-linear-gradient(top, #8cb3d9, #336699);
|
|
||||||
|
|
||||||
// Standards
|
|
||||||
background-image: linear-gradient(to bottom, #8cb3d9, #336699);
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
However, if you want to support the ancient browsers (which has negligible market share and almost died out), you can set the second parameter to `TRUE`. This will output:
|
|
||||||
|
|
||||||
```php
|
|
||||||
|
|
||||||
use Mexitek\PHPColors\Color;
|
|
||||||
$myBlue = new Color("#336699");
|
|
||||||
|
|
||||||
// Get CSS
|
|
||||||
echo $myBlue->getCssGradient(10, TRUE);
|
|
||||||
/* - Actual output doesn't have comments and is single line
|
|
||||||
|
|
||||||
background: #336699; // fallback background
|
|
||||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#8cb3d9', endColorstr='#336699'); // IE Browsers
|
|
||||||
background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#8cb3d9), to(#336699)); // Safari 4+, Chrome 1-9
|
|
||||||
background-image: -webkit-linear-gradient(top, #8cb3d9, #336699); // Safari 5.1+, Mobile Safari, Chrome 10+
|
|
||||||
background-image: -moz-linear-gradient(top, #8cb3d9, #336699); // Firefox 3.6+
|
|
||||||
background-image: -o-linear-gradient(top, #8cb3d9, #336699); // Opera 11.10+
|
|
||||||
background-image: linear-gradient(to bottom, #8cb3d9, #336699); // Standards
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
## Github Contributors
|
|
||||||
- mexitek
|
|
||||||
- danielpataki
|
|
||||||
- alexmglover
|
|
||||||
- intuxicated
|
|
||||||
- pborreli
|
|
||||||
- curtisgibby
|
|
||||||
- matthewpatterson
|
|
||||||
- there4
|
|
||||||
- alex-humphreys
|
|
||||||
- zaher
|
|
||||||
- primozcigler
|
|
||||||
- thedavidmeister
|
|
||||||
- tylercd100
|
|
||||||
- Braunson
|
|
||||||
|
|
||||||
# License
|
|
||||||
See LICENSE file or [arlo.mit-license.org](http://arlo.mit-license.org)
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "mexitek/phpcolors",
|
|
||||||
"description": "A series of methods that let you manipulate colors. Just incase you ever need different shades of one color on the fly.",
|
|
||||||
"type": "library",
|
|
||||||
"keywords": [
|
|
||||||
"color",
|
|
||||||
"ui",
|
|
||||||
"css",
|
|
||||||
"frontend",
|
|
||||||
"design"
|
|
||||||
],
|
|
||||||
"homepage": "http://mexitek.github.com/phpColors/",
|
|
||||||
"license": "MIT",
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Arlo Carreon",
|
|
||||||
"homepage": "http://arlocarreon.com",
|
|
||||||
"role": "creator"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"issues": "https://github.com/mexitek/phpColors/issues",
|
|
||||||
"source": "https://github.com/mexitek/phpColors"
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": "^7.2|^8.0"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"nette/tester": "^2.3",
|
|
||||||
"squizlabs/php_codesniffer": "^3.5"
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"classmap": [
|
|
||||||
"src"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,94 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<title>phpColors Demo</title>
|
|
||||||
<?php
|
|
||||||
|
|
||||||
require_once __DIR__ . '/../src/Mexitek/PHPColors/Color.php';
|
|
||||||
|
|
||||||
use Mexitek\PHPColors\Color;
|
|
||||||
|
|
||||||
// Use different colors to test
|
|
||||||
$myBlue = new Color("#336699");
|
|
||||||
$myBlack = new Color("#333");
|
|
||||||
$myPurple = new Color("#913399");
|
|
||||||
$myVintage = new Color("#bada55");
|
|
||||||
|
|
||||||
// ************** No Need to Change Below **********************
|
|
||||||
?>
|
|
||||||
<style>
|
|
||||||
.block {
|
|
||||||
height: 100px;
|
|
||||||
width: 200px;
|
|
||||||
font-size: 20px;
|
|
||||||
text-align: center;
|
|
||||||
padding-top: 100px;
|
|
||||||
display: block;
|
|
||||||
margin: 0;
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wide-block {
|
|
||||||
width: 360px;
|
|
||||||
padding-top: 70px;
|
|
||||||
padding-left: 20px;
|
|
||||||
padding-right: 20px;
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.clear {
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
|
|
||||||
.testDiv {
|
|
||||||
<?= $myBlue->getCssGradient()?>
|
|
||||||
color: <?=($myBlue->isDark() ? "#EEE":"#333")?>;
|
|
||||||
}
|
|
||||||
|
|
||||||
.testDiv.plain {
|
|
||||||
background: #<?= $myBlue->getHex()?>;
|
|
||||||
color: <?=($myBlue->isDark() ? "#EEE":"#333")?>;
|
|
||||||
}
|
|
||||||
|
|
||||||
.testDiv2 {
|
|
||||||
<?= $myBlack->getCssGradient()?>
|
|
||||||
color: <?=($myBlack->isDark() ? "#EEE":"#333")?>;
|
|
||||||
}
|
|
||||||
|
|
||||||
.testDiv2.plain {
|
|
||||||
background: #<?= $myBlack->getHex();?>;
|
|
||||||
color: <?=($myBlack->isDark() ? "#EEE":"#333")?>;
|
|
||||||
}
|
|
||||||
|
|
||||||
.testDiv3 {
|
|
||||||
<?= $myPurple->getCssGradient()?>
|
|
||||||
color: <?=($myPurple->isDark() ? "#EEE":"#333")?>;
|
|
||||||
}
|
|
||||||
|
|
||||||
.testDiv3.plain {
|
|
||||||
background: #<?= $myPurple->getHex()?>;
|
|
||||||
color: <?=($myPurple->isDark() ? "#EEE":"#333")?>;
|
|
||||||
}
|
|
||||||
|
|
||||||
.testDiv4 {
|
|
||||||
<?= $myVintage->getCssGradient(30, true)?>
|
|
||||||
color: <?=($myVintage->isDark() ? "#EEE":"#333")?>;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="clear"></div>
|
|
||||||
<div class="block testDiv">phpColor Gradient #<?= $myBlue->getHex() ?></div>
|
|
||||||
<div class="block testDiv plain">Plain #<?= $myBlue->getHex() ?></div>
|
|
||||||
<div class="clear"></div>
|
|
||||||
<div class="block testDiv2">phpColor Gradient #<?= $myBlack->getHex() ?></div>
|
|
||||||
<div class="block testDiv2 plain">Plain #<?= $myBlack->getHex() ?></div>
|
|
||||||
<div class="clear"></div>
|
|
||||||
<div class="block testDiv3">phpColor Gradient #<?= $myPurple->getHex() ?></div>
|
|
||||||
<div class="block testDiv3 plain">Plain #<?= $myPurple->getHex() ?></div>
|
|
||||||
<div class="clear"></div>
|
|
||||||
<div class="block wide-block testDiv4">
|
|
||||||
phpColor Gradient with vintage browsers support #<?= $myVintage->getHex() ?>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 27 KiB |
@ -1,801 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Author: Arlo Carreon <http://arlocarreon.com>
|
|
||||||
* Info: http://mexitek.github.io/phpColors/
|
|
||||||
* License: http://arlo.mit-license.org/
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Mexitek\PHPColors;
|
|
||||||
|
|
||||||
use Exception;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A color utility that helps manipulate HEX colors
|
|
||||||
*/
|
|
||||||
class Color
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $_hex;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
private $_hsl;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
private $_rgb;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Auto darkens/lightens by 10% for sexily-subtle gradients.
|
|
||||||
* Set this to FALSE to adjust automatic shade to be between given color
|
|
||||||
* and black (for darken) or white (for lighten)
|
|
||||||
*/
|
|
||||||
public const DEFAULT_ADJUST = 10;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Instantiates the class with a HEX value
|
|
||||||
* @param string $hex
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function __construct(string $hex)
|
|
||||||
{
|
|
||||||
$color = self::sanitizeHex($hex);
|
|
||||||
$this->_hex = $color;
|
|
||||||
$this->_hsl = self::hexToHsl($color);
|
|
||||||
$this->_rgb = self::hexToRgb($color);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given a HEX string returns a HSL array equivalent.
|
|
||||||
* @param string $color
|
|
||||||
* @return array HSL associative array
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public static function hexToHsl(string $color): array
|
|
||||||
{
|
|
||||||
// Sanity check
|
|
||||||
$color = self::sanitizeHex($color);
|
|
||||||
|
|
||||||
// Convert HEX to DEC
|
|
||||||
$R = hexdec($color[0] . $color[1]);
|
|
||||||
$G = hexdec($color[2] . $color[3]);
|
|
||||||
$B = hexdec($color[4] . $color[5]);
|
|
||||||
|
|
||||||
$HSL = array();
|
|
||||||
|
|
||||||
$var_R = ($R / 255);
|
|
||||||
$var_G = ($G / 255);
|
|
||||||
$var_B = ($B / 255);
|
|
||||||
|
|
||||||
$var_Min = min($var_R, $var_G, $var_B);
|
|
||||||
$var_Max = max($var_R, $var_G, $var_B);
|
|
||||||
$del_Max = $var_Max - $var_Min;
|
|
||||||
|
|
||||||
$L = ($var_Max + $var_Min) / 2;
|
|
||||||
|
|
||||||
if ($del_Max == 0) {
|
|
||||||
$H = 0;
|
|
||||||
$S = 0;
|
|
||||||
} else {
|
|
||||||
if ($L < 0.5) {
|
|
||||||
$S = $del_Max / ($var_Max + $var_Min);
|
|
||||||
} else {
|
|
||||||
$S = $del_Max / (2 - $var_Max - $var_Min);
|
|
||||||
}
|
|
||||||
|
|
||||||
$del_R = ((($var_Max - $var_R) / 6) + ($del_Max / 2)) / $del_Max;
|
|
||||||
$del_G = ((($var_Max - $var_G) / 6) + ($del_Max / 2)) / $del_Max;
|
|
||||||
$del_B = ((($var_Max - $var_B) / 6) + ($del_Max / 2)) / $del_Max;
|
|
||||||
|
|
||||||
if ($var_R == $var_Max) {
|
|
||||||
$H = $del_B - $del_G;
|
|
||||||
} elseif ($var_G == $var_Max) {
|
|
||||||
$H = (1 / 3) + $del_R - $del_B;
|
|
||||||
} elseif ($var_B == $var_Max) {
|
|
||||||
$H = (2 / 3) + $del_G - $del_R;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($H < 0) {
|
|
||||||
$H++;
|
|
||||||
}
|
|
||||||
if ($H > 1) {
|
|
||||||
$H--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$HSL['H'] = ($H * 360);
|
|
||||||
$HSL['S'] = $S;
|
|
||||||
$HSL['L'] = $L;
|
|
||||||
|
|
||||||
return $HSL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given a HSL associative array returns the equivalent HEX string
|
|
||||||
* @param array $hsl
|
|
||||||
* @return string HEX string
|
|
||||||
* @throws Exception "Bad HSL Array"
|
|
||||||
*/
|
|
||||||
public static function hslToHex(array $hsl = array()): string
|
|
||||||
{
|
|
||||||
// Make sure it's HSL
|
|
||||||
if (empty($hsl) || !isset($hsl["H"], $hsl["S"], $hsl["L"])) {
|
|
||||||
throw new Exception("Param was not an HSL array");
|
|
||||||
}
|
|
||||||
|
|
||||||
list($H, $S, $L) = array($hsl['H'] / 360, $hsl['S'], $hsl['L']);
|
|
||||||
|
|
||||||
if ($S == 0) {
|
|
||||||
$r = $L * 255;
|
|
||||||
$g = $L * 255;
|
|
||||||
$b = $L * 255;
|
|
||||||
} else {
|
|
||||||
if ($L < 0.5) {
|
|
||||||
$var_2 = $L * (1 + $S);
|
|
||||||
} else {
|
|
||||||
$var_2 = ($L + $S) - ($S * $L);
|
|
||||||
}
|
|
||||||
|
|
||||||
$var_1 = 2 * $L - $var_2;
|
|
||||||
|
|
||||||
$r = 255 * self::hueToRgb($var_1, $var_2, $H + (1 / 3));
|
|
||||||
$g = 255 * self::hueToRgb($var_1, $var_2, $H);
|
|
||||||
$b = 255 * self::hueToRgb($var_1, $var_2, $H - (1 / 3));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Convert to hex
|
|
||||||
$r = dechex(round($r));
|
|
||||||
$g = dechex(round($g));
|
|
||||||
$b = dechex(round($b));
|
|
||||||
|
|
||||||
// Make sure we get 2 digits for decimals
|
|
||||||
$r = (strlen("" . $r) === 1) ? "0" . $r : $r;
|
|
||||||
$g = (strlen("" . $g) === 1) ? "0" . $g : $g;
|
|
||||||
$b = (strlen("" . $b) === 1) ? "0" . $b : $b;
|
|
||||||
|
|
||||||
return $r . $g . $b;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given a HEX string returns a RGB array equivalent.
|
|
||||||
* @param string $color
|
|
||||||
* @return array RGB associative array
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public static function hexToRgb(string $color): array
|
|
||||||
{
|
|
||||||
// Sanity check
|
|
||||||
$color = self::sanitizeHex($color);
|
|
||||||
|
|
||||||
// Convert HEX to DEC
|
|
||||||
$R = hexdec($color[0] . $color[1]);
|
|
||||||
$G = hexdec($color[2] . $color[3]);
|
|
||||||
$B = hexdec($color[4] . $color[5]);
|
|
||||||
|
|
||||||
$RGB['R'] = $R;
|
|
||||||
$RGB['G'] = $G;
|
|
||||||
$RGB['B'] = $B;
|
|
||||||
|
|
||||||
return $RGB;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given an RGB associative array returns the equivalent HEX string
|
|
||||||
* @param array $rgb
|
|
||||||
* @return string Hex string
|
|
||||||
* @throws Exception "Bad RGB Array"
|
|
||||||
*/
|
|
||||||
public static function rgbToHex(array $rgb = array()): string
|
|
||||||
{
|
|
||||||
// Make sure it's RGB
|
|
||||||
if (empty($rgb) || !isset($rgb["R"], $rgb["G"], $rgb["B"])) {
|
|
||||||
throw new Exception("Param was not an RGB array");
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://github.com/mexitek/phpColors/issues/25#issuecomment-88354815
|
|
||||||
// Convert RGB to HEX
|
|
||||||
$hex[0] = str_pad(dechex((int)$rgb['R']), 2, '0', STR_PAD_LEFT);
|
|
||||||
$hex[1] = str_pad(dechex((int)$rgb['G']), 2, '0', STR_PAD_LEFT);
|
|
||||||
$hex[2] = str_pad(dechex((int)$rgb['B']), 2, '0', STR_PAD_LEFT);
|
|
||||||
|
|
||||||
// Make sure that 2 digits are allocated to each color.
|
|
||||||
$hex[0] = (strlen($hex[0]) === 1) ? '0' . $hex[0] : $hex[0];
|
|
||||||
$hex[1] = (strlen($hex[1]) === 1) ? '0' . $hex[1] : $hex[1];
|
|
||||||
$hex[2] = (strlen($hex[2]) === 1) ? '0' . $hex[2] : $hex[2];
|
|
||||||
|
|
||||||
return implode('', $hex);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given an RGB associative array, returns CSS string output.
|
|
||||||
* @param array $rgb
|
|
||||||
* @return string rgb(r,g,b) string
|
|
||||||
* @throws Exception "Bad RGB Array"
|
|
||||||
*/
|
|
||||||
public static function rgbToString(array $rgb = array()): string
|
|
||||||
{
|
|
||||||
// Make sure it's RGB
|
|
||||||
if (empty($rgb) || !isset($rgb["R"], $rgb["G"], $rgb["B"])) {
|
|
||||||
throw new Exception("Param was not an RGB array");
|
|
||||||
}
|
|
||||||
|
|
||||||
return 'rgb(' .
|
|
||||||
$rgb['R'] . ', ' .
|
|
||||||
$rgb['G'] . ', ' .
|
|
||||||
$rgb['B'] . ')';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given a standard color name, return hex code
|
|
||||||
*
|
|
||||||
* @param string $color_name
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public static function nameToHex(string $color_name): string
|
|
||||||
{
|
|
||||||
$colors = array(
|
|
||||||
'aliceblue' => 'F0F8FF',
|
|
||||||
'antiquewhite' => 'FAEBD7',
|
|
||||||
'aqua' => '00FFFF',
|
|
||||||
'aquamarine' => '7FFFD4',
|
|
||||||
'azure' => 'F0FFFF',
|
|
||||||
'beige' => 'F5F5DC',
|
|
||||||
'bisque' => 'FFE4C4',
|
|
||||||
'black' => '000000',
|
|
||||||
'blanchedalmond' => 'FFEBCD',
|
|
||||||
'blue' => '0000FF',
|
|
||||||
'blueviolet' => '8A2BE2',
|
|
||||||
'brown' => 'A52A2A',
|
|
||||||
'burlywood' => 'DEB887',
|
|
||||||
'cadetblue' => '5F9EA0',
|
|
||||||
'chartreuse' => '7FFF00',
|
|
||||||
'chocolate' => 'D2691E',
|
|
||||||
'coral' => 'FF7F50',
|
|
||||||
'cornflowerblue' => '6495ED',
|
|
||||||
'cornsilk' => 'FFF8DC',
|
|
||||||
'crimson' => 'DC143C',
|
|
||||||
'cyan' => '00FFFF',
|
|
||||||
'darkblue' => '00008B',
|
|
||||||
'darkcyan' => '008B8B',
|
|
||||||
'darkgoldenrod' => 'B8860B',
|
|
||||||
'darkgray' => 'A9A9A9',
|
|
||||||
'darkgreen' => '006400',
|
|
||||||
'darkgrey' => 'A9A9A9',
|
|
||||||
'darkkhaki' => 'BDB76B',
|
|
||||||
'darkmagenta' => '8B008B',
|
|
||||||
'darkolivegreen' => '556B2F',
|
|
||||||
'darkorange' => 'FF8C00',
|
|
||||||
'darkorchid' => '9932CC',
|
|
||||||
'darkred' => '8B0000',
|
|
||||||
'darksalmon' => 'E9967A',
|
|
||||||
'darkseagreen' => '8FBC8F',
|
|
||||||
'darkslateblue' => '483D8B',
|
|
||||||
'darkslategray' => '2F4F4F',
|
|
||||||
'darkslategrey' => '2F4F4F',
|
|
||||||
'darkturquoise' => '00CED1',
|
|
||||||
'darkviolet' => '9400D3',
|
|
||||||
'deeppink' => 'FF1493',
|
|
||||||
'deepskyblue' => '00BFFF',
|
|
||||||
'dimgray' => '696969',
|
|
||||||
'dimgrey' => '696969',
|
|
||||||
'dodgerblue' => '1E90FF',
|
|
||||||
'firebrick' => 'B22222',
|
|
||||||
'floralwhite' => 'FFFAF0',
|
|
||||||
'forestgreen' => '228B22',
|
|
||||||
'fuchsia' => 'FF00FF',
|
|
||||||
'gainsboro' => 'DCDCDC',
|
|
||||||
'ghostwhite' => 'F8F8FF',
|
|
||||||
'gold' => 'FFD700',
|
|
||||||
'goldenrod' => 'DAA520',
|
|
||||||
'gray' => '808080',
|
|
||||||
'green' => '008000',
|
|
||||||
'greenyellow' => 'ADFF2F',
|
|
||||||
'grey' => '808080',
|
|
||||||
'honeydew' => 'F0FFF0',
|
|
||||||
'hotpink' => 'FF69B4',
|
|
||||||
'indianred' => 'CD5C5C',
|
|
||||||
'indigo' => '4B0082',
|
|
||||||
'ivory' => 'FFFFF0',
|
|
||||||
'khaki' => 'F0E68C',
|
|
||||||
'lavender' => 'E6E6FA',
|
|
||||||
'lavenderblush' => 'FFF0F5',
|
|
||||||
'lawngreen' => '7CFC00',
|
|
||||||
'lemonchiffon' => 'FFFACD',
|
|
||||||
'lightblue' => 'ADD8E6',
|
|
||||||
'lightcoral' => 'F08080',
|
|
||||||
'lightcyan' => 'E0FFFF',
|
|
||||||
'lightgoldenrodyellow' => 'FAFAD2',
|
|
||||||
'lightgray' => 'D3D3D3',
|
|
||||||
'lightgreen' => '90EE90',
|
|
||||||
'lightgrey' => 'D3D3D3',
|
|
||||||
'lightpink' => 'FFB6C1',
|
|
||||||
'lightsalmon' => 'FFA07A',
|
|
||||||
'lightseagreen' => '20B2AA',
|
|
||||||
'lightskyblue' => '87CEFA',
|
|
||||||
'lightslategray' => '778899',
|
|
||||||
'lightslategrey' => '778899',
|
|
||||||
'lightsteelblue' => 'B0C4DE',
|
|
||||||
'lightyellow' => 'FFFFE0',
|
|
||||||
'lime' => '00FF00',
|
|
||||||
'limegreen' => '32CD32',
|
|
||||||
'linen' => 'FAF0E6',
|
|
||||||
'magenta' => 'FF00FF',
|
|
||||||
'maroon' => '800000',
|
|
||||||
'mediumaquamarine' => '66CDAA',
|
|
||||||
'mediumblue' => '0000CD',
|
|
||||||
'mediumorchid' => 'BA55D3',
|
|
||||||
'mediumpurple' => '9370D0',
|
|
||||||
'mediumseagreen' => '3CB371',
|
|
||||||
'mediumslateblue' => '7B68EE',
|
|
||||||
'mediumspringgreen' => '00FA9A',
|
|
||||||
'mediumturquoise' => '48D1CC',
|
|
||||||
'mediumvioletred' => 'C71585',
|
|
||||||
'midnightblue' => '191970',
|
|
||||||
'mintcream' => 'F5FFFA',
|
|
||||||
'mistyrose' => 'FFE4E1',
|
|
||||||
'moccasin' => 'FFE4B5',
|
|
||||||
'navajowhite' => 'FFDEAD',
|
|
||||||
'navy' => '000080',
|
|
||||||
'oldlace' => 'FDF5E6',
|
|
||||||
'olive' => '808000',
|
|
||||||
'olivedrab' => '6B8E23',
|
|
||||||
'orange' => 'FFA500',
|
|
||||||
'orangered' => 'FF4500',
|
|
||||||
'orchid' => 'DA70D6',
|
|
||||||
'palegoldenrod' => 'EEE8AA',
|
|
||||||
'palegreen' => '98FB98',
|
|
||||||
'paleturquoise' => 'AFEEEE',
|
|
||||||
'palevioletred' => 'DB7093',
|
|
||||||
'papayawhip' => 'FFEFD5',
|
|
||||||
'peachpuff' => 'FFDAB9',
|
|
||||||
'peru' => 'CD853F',
|
|
||||||
'pink' => 'FFC0CB',
|
|
||||||
'plum' => 'DDA0DD',
|
|
||||||
'powderblue' => 'B0E0E6',
|
|
||||||
'purple' => '800080',
|
|
||||||
'red' => 'FF0000',
|
|
||||||
'rosybrown' => 'BC8F8F',
|
|
||||||
'royalblue' => '4169E1',
|
|
||||||
'saddlebrown' => '8B4513',
|
|
||||||
'salmon' => 'FA8072',
|
|
||||||
'sandybrown' => 'F4A460',
|
|
||||||
'seagreen' => '2E8B57',
|
|
||||||
'seashell' => 'FFF5EE',
|
|
||||||
'sienna' => 'A0522D',
|
|
||||||
'silver' => 'C0C0C0',
|
|
||||||
'skyblue' => '87CEEB',
|
|
||||||
'slateblue' => '6A5ACD',
|
|
||||||
'slategray' => '708090',
|
|
||||||
'slategrey' => '708090',
|
|
||||||
'snow' => 'FFFAFA',
|
|
||||||
'springgreen' => '00FF7F',
|
|
||||||
'steelblue' => '4682B4',
|
|
||||||
'tan' => 'D2B48C',
|
|
||||||
'teal' => '008080',
|
|
||||||
'thistle' => 'D8BFD8',
|
|
||||||
'tomato' => 'FF6347',
|
|
||||||
'turquoise' => '40E0D0',
|
|
||||||
'violet' => 'EE82EE',
|
|
||||||
'wheat' => 'F5DEB3',
|
|
||||||
'white' => 'FFFFFF',
|
|
||||||
'whitesmoke' => 'F5F5F5',
|
|
||||||
'yellow' => 'FFFF00',
|
|
||||||
'yellowgreen' => '9ACD32'
|
|
||||||
);
|
|
||||||
|
|
||||||
$color_name = strtolower($color_name);
|
|
||||||
if (isset($colors[$color_name])) {
|
|
||||||
return '#' . $colors[$color_name];
|
|
||||||
}
|
|
||||||
|
|
||||||
return $color_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given a HEX value, returns a darker color. If no desired amount provided, then the color halfway between
|
|
||||||
* given HEX and black will be returned.
|
|
||||||
* @param int $amount
|
|
||||||
* @return string Darker HEX value
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function darken(int $amount = self::DEFAULT_ADJUST): string
|
|
||||||
{
|
|
||||||
// Darken
|
|
||||||
$darkerHSL = $this->darkenHsl($this->_hsl, $amount);
|
|
||||||
// Return as HEX
|
|
||||||
return self::hslToHex($darkerHSL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given a HEX value, returns a lighter color. If no desired amount provided, then the color halfway between
|
|
||||||
* given HEX and white will be returned.
|
|
||||||
* @param int $amount
|
|
||||||
* @return string Lighter HEX value
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function lighten(int $amount = self::DEFAULT_ADJUST): string
|
|
||||||
{
|
|
||||||
// Lighten
|
|
||||||
$lighterHSL = $this->lightenHsl($this->_hsl, $amount);
|
|
||||||
// Return as HEX
|
|
||||||
return self::hslToHex($lighterHSL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given a HEX value, returns a mixed color. If no desired amount provided, then the color mixed by this ratio
|
|
||||||
* @param string $hex2 Secondary HEX value to mix with
|
|
||||||
* @param int $amount = -100..0..+100
|
|
||||||
* @return string mixed HEX value
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function mix(string $hex2, int $amount = 0): string
|
|
||||||
{
|
|
||||||
$rgb2 = self::hexToRgb($hex2);
|
|
||||||
$mixed = $this->mixRgb($this->_rgb, $rgb2, $amount);
|
|
||||||
// Return as HEX
|
|
||||||
return self::rgbToHex($mixed);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates an array with two shades that can be used to make a gradient
|
|
||||||
* @param int $amount Optional percentage amount you want your contrast color
|
|
||||||
* @return array An array with a 'light' and 'dark' index
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function makeGradient(int $amount = self::DEFAULT_ADJUST): array
|
|
||||||
{
|
|
||||||
// Decide which color needs to be made
|
|
||||||
if ($this->isLight()) {
|
|
||||||
$lightColor = $this->_hex;
|
|
||||||
$darkColor = $this->darken($amount);
|
|
||||||
} else {
|
|
||||||
$lightColor = $this->lighten($amount);
|
|
||||||
$darkColor = $this->_hex;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return our gradient array
|
|
||||||
return array("light" => $lightColor, "dark" => $darkColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether or not given color is considered "light"
|
|
||||||
* @param string|bool $color
|
|
||||||
* @param int $lighterThan
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
public function isLight($color = false, int $lighterThan = 130): bool
|
|
||||||
{
|
|
||||||
// Get our color
|
|
||||||
$color = ($color) ? $color : $this->_hex;
|
|
||||||
|
|
||||||
// Calculate straight from rbg
|
|
||||||
$r = hexdec($color[0] . $color[1]);
|
|
||||||
$g = hexdec($color[2] . $color[3]);
|
|
||||||
$b = hexdec($color[4] . $color[5]);
|
|
||||||
|
|
||||||
return (($r * 299 + $g * 587 + $b * 114) / 1000 > $lighterThan);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether or not a given color is considered "dark"
|
|
||||||
* @param string|bool $color
|
|
||||||
* @param int $darkerThan
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
public function isDark($color = false, int $darkerThan = 130): bool
|
|
||||||
{
|
|
||||||
// Get our color
|
|
||||||
$color = ($color) ? $color : $this->_hex;
|
|
||||||
|
|
||||||
// Calculate straight from rbg
|
|
||||||
$r = hexdec($color[0] . $color[1]);
|
|
||||||
$g = hexdec($color[2] . $color[3]);
|
|
||||||
$b = hexdec($color[4] . $color[5]);
|
|
||||||
|
|
||||||
return (($r * 299 + $g * 587 + $b * 114) / 1000 <= $darkerThan);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the complimentary color
|
|
||||||
* @return string Complementary hex color
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function complementary(): string
|
|
||||||
{
|
|
||||||
// Get our HSL
|
|
||||||
$hsl = $this->_hsl;
|
|
||||||
|
|
||||||
// Adjust Hue 180 degrees
|
|
||||||
$hsl['H'] += ($hsl['H'] > 180) ? -180 : 180;
|
|
||||||
|
|
||||||
// Return the new value in HEX
|
|
||||||
return self::hslToHex($hsl);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the HSL array of your color
|
|
||||||
*/
|
|
||||||
public function getHsl(): array
|
|
||||||
{
|
|
||||||
return $this->_hsl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns your original color
|
|
||||||
*/
|
|
||||||
public function getHex(): string
|
|
||||||
{
|
|
||||||
return $this->_hex;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the RGB array of your color
|
|
||||||
*/
|
|
||||||
public function getRgb(): array
|
|
||||||
{
|
|
||||||
return $this->_rgb;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the cross browser CSS3 gradient
|
|
||||||
* @param int $amount Optional: percentage amount to light/darken the gradient
|
|
||||||
* @param boolean $vintageBrowsers Optional: include vendor prefixes for browsers that almost died out already
|
|
||||||
* @param string $prefix Optional: prefix for every lines
|
|
||||||
* @param string $suffix Optional: suffix for every lines
|
|
||||||
* @return string CSS3 gradient for chrome, safari, firefox, opera and IE10
|
|
||||||
* @throws Exception
|
|
||||||
* @link http://caniuse.com/css-gradients Resource for the browser support
|
|
||||||
*/
|
|
||||||
public function getCssGradient($amount = self::DEFAULT_ADJUST, $vintageBrowsers = false, $suffix = "", $prefix = ""): string
|
|
||||||
{
|
|
||||||
// Get the recommended gradient
|
|
||||||
$g = $this->makeGradient($amount);
|
|
||||||
|
|
||||||
$css = "";
|
|
||||||
/* fallback/image non-cover color */
|
|
||||||
$css .= "{$prefix}background-color: #" . $this->_hex . ";{$suffix}";
|
|
||||||
|
|
||||||
/* IE Browsers */
|
|
||||||
$css .= "{$prefix}filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#" . $g['light'] . "', endColorstr='#" . $g['dark'] . "');{$suffix}";
|
|
||||||
|
|
||||||
/* Safari 4+, Chrome 1-9 */
|
|
||||||
if ($vintageBrowsers) {
|
|
||||||
$css .= "{$prefix}background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#" . $g['light'] . "), to(#" . $g['dark'] . "));{$suffix}";
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Safari 5.1+, Mobile Safari, Chrome 10+ */
|
|
||||||
$css .= "{$prefix}background-image: -webkit-linear-gradient(top, #" . $g['light'] . ", #" . $g['dark'] . ");{$suffix}";
|
|
||||||
|
|
||||||
if ($vintageBrowsers) {
|
|
||||||
/* Firefox 3.6+ */
|
|
||||||
$css .= "{$prefix}background-image: -moz-linear-gradient(top, #" . $g['light'] . ", #" . $g['dark'] . ");{$suffix}";
|
|
||||||
|
|
||||||
/* Opera 11.10+ */
|
|
||||||
$css .= "{$prefix}background-image: -o-linear-gradient(top, #" . $g['light'] . ", #" . $g['dark'] . ");{$suffix}";
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Unprefixed version (standards): FF 16+, IE10+, Chrome 26+, Safari 7+, Opera 12.1+ */
|
|
||||||
$css .= "{$prefix}background-image: linear-gradient(to bottom, #" . $g['light'] . ", #" . $g['dark'] . ");{$suffix}";
|
|
||||||
|
|
||||||
// Return our CSS
|
|
||||||
return $css;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Darkens a given HSL array
|
|
||||||
* @param array $hsl
|
|
||||||
* @param int $amount
|
|
||||||
* @return array $hsl
|
|
||||||
*/
|
|
||||||
private function darkenHsl(array $hsl, int $amount = self::DEFAULT_ADJUST): array
|
|
||||||
{
|
|
||||||
// Check if we were provided a number
|
|
||||||
if ($amount) {
|
|
||||||
$hsl['L'] = ($hsl['L'] * 100) - $amount;
|
|
||||||
$hsl['L'] = ($hsl['L'] < 0) ? 0 : $hsl['L'] / 100;
|
|
||||||
} else {
|
|
||||||
// We need to find out how much to darken
|
|
||||||
$hsl['L'] /= 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $hsl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Lightens a given HSL array
|
|
||||||
* @param array $hsl
|
|
||||||
* @param int $amount
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
private function lightenHsl(array $hsl, int $amount = self::DEFAULT_ADJUST): array
|
|
||||||
{
|
|
||||||
// Check if we were provided a number
|
|
||||||
if ($amount) {
|
|
||||||
$hsl['L'] = ($hsl['L'] * 100) + $amount;
|
|
||||||
$hsl['L'] = ($hsl['L'] > 100) ? 1 : $hsl['L'] / 100;
|
|
||||||
} else {
|
|
||||||
// We need to find out how much to lighten
|
|
||||||
$hsl['L'] += (1 - $hsl['L']) / 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $hsl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Mix two RGB colors and return the resulting RGB color
|
|
||||||
* ported from http://phpxref.pagelines.com/nav.html?includes/class.colors.php.source.html
|
|
||||||
* @param array $rgb1
|
|
||||||
* @param array $rgb2
|
|
||||||
* @param int $amount ranged -100..0..+100
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
private function mixRgb(array $rgb1, array $rgb2, int $amount = 0): array
|
|
||||||
{
|
|
||||||
$r1 = ($amount + 100) / 100;
|
|
||||||
$r2 = 2 - $r1;
|
|
||||||
|
|
||||||
$rmix = (($rgb1['R'] * $r1) + ($rgb2['R'] * $r2)) / 2;
|
|
||||||
$gmix = (($rgb1['G'] * $r1) + ($rgb2['G'] * $r2)) / 2;
|
|
||||||
$bmix = (($rgb1['B'] * $r1) + ($rgb2['B'] * $r2)) / 2;
|
|
||||||
|
|
||||||
return array('R' => $rmix, 'G' => $gmix, 'B' => $bmix);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Given a Hue, returns corresponding RGB value
|
|
||||||
* @param float $v1
|
|
||||||
* @param float $v2
|
|
||||||
* @param float $vH
|
|
||||||
* @return float
|
|
||||||
*/
|
|
||||||
private static function hueToRgb(float $v1, float $v2, float $vH): float
|
|
||||||
{
|
|
||||||
if ($vH < 0) {
|
|
||||||
++$vH;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($vH > 1) {
|
|
||||||
--$vH;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((6 * $vH) < 1) {
|
|
||||||
return ($v1 + ($v2 - $v1) * 6 * $vH);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((2 * $vH) < 1) {
|
|
||||||
return $v2;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((3 * $vH) < 2) {
|
|
||||||
return ($v1 + ($v2 - $v1) * ((2 / 3) - $vH) * 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $v1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Checks the HEX string for correct formatting and converts short format to long
|
|
||||||
* @param string $hex
|
|
||||||
* @return string
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
private static function sanitizeHex(string $hex): string
|
|
||||||
{
|
|
||||||
// Strip # sign if it is present
|
|
||||||
$color = str_replace("#", "", $hex);
|
|
||||||
|
|
||||||
// Validate hex string
|
|
||||||
if (!preg_match('/^[a-fA-F0-9]+$/', $color)) {
|
|
||||||
throw new Exception("HEX color does not match format");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make sure it's 6 digits
|
|
||||||
if (strlen($color) === 3) {
|
|
||||||
$color = $color[0] . $color[0] . $color[1] . $color[1] . $color[2] . $color[2];
|
|
||||||
} elseif (strlen($color) !== 6) {
|
|
||||||
throw new Exception("HEX color needs to be 6 or 3 digits long");
|
|
||||||
}
|
|
||||||
|
|
||||||
return $color;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts object into its string representation
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
return "#" . $this->getHex();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $name
|
|
||||||
* @return mixed|null
|
|
||||||
*/
|
|
||||||
public function __get(string $name)
|
|
||||||
{
|
|
||||||
switch (strtolower($name)) {
|
|
||||||
case 'red':
|
|
||||||
case 'r':
|
|
||||||
return $this->_rgb["R"];
|
|
||||||
case 'green':
|
|
||||||
case 'g':
|
|
||||||
return $this->_rgb["G"];
|
|
||||||
case 'blue':
|
|
||||||
case 'b':
|
|
||||||
return $this->_rgb["B"];
|
|
||||||
case 'hue':
|
|
||||||
case 'h':
|
|
||||||
return $this->_hsl["H"];
|
|
||||||
case 'saturation':
|
|
||||||
case 's':
|
|
||||||
return $this->_hsl["S"];
|
|
||||||
case 'lightness':
|
|
||||||
case 'l':
|
|
||||||
return $this->_hsl["L"];
|
|
||||||
}
|
|
||||||
|
|
||||||
$trace = debug_backtrace();
|
|
||||||
trigger_error(
|
|
||||||
'Undefined property via __get(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'],
|
|
||||||
E_USER_NOTICE
|
|
||||||
);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $name
|
|
||||||
* @param mixed $value
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function __set(string $name, $value)
|
|
||||||
{
|
|
||||||
switch (strtolower($name)) {
|
|
||||||
case 'red':
|
|
||||||
case 'r':
|
|
||||||
$this->_rgb["R"] = $value;
|
|
||||||
$this->_hex = self::rgbToHex($this->_rgb);
|
|
||||||
$this->_hsl = self::hexToHsl($this->_hex);
|
|
||||||
break;
|
|
||||||
case 'green':
|
|
||||||
case 'g':
|
|
||||||
$this->_rgb["G"] = $value;
|
|
||||||
$this->_hex = self::rgbToHex($this->_rgb);
|
|
||||||
$this->_hsl = self::hexToHsl($this->_hex);
|
|
||||||
break;
|
|
||||||
case 'blue':
|
|
||||||
case 'b':
|
|
||||||
$this->_rgb["B"] = $value;
|
|
||||||
$this->_hex = self::rgbToHex($this->_rgb);
|
|
||||||
$this->_hsl = self::hexToHsl($this->_hex);
|
|
||||||
break;
|
|
||||||
case 'hue':
|
|
||||||
case 'h':
|
|
||||||
$this->_hsl["H"] = $value;
|
|
||||||
$this->_hex = self::hslToHex($this->_hsl);
|
|
||||||
$this->_rgb = self::hexToRgb($this->_hex);
|
|
||||||
break;
|
|
||||||
case 'saturation':
|
|
||||||
case 's':
|
|
||||||
$this->_hsl["S"] = $value;
|
|
||||||
$this->_hex = self::hslToHex($this->_hsl);
|
|
||||||
$this->_rgb = self::hexToRgb($this->_hex);
|
|
||||||
break;
|
|
||||||
case 'lightness':
|
|
||||||
case 'light':
|
|
||||||
case 'l':
|
|
||||||
$this->_hsl["L"] = $value;
|
|
||||||
$this->_hex = self::hslToHex($this->_hsl);
|
|
||||||
$this->_rgb = self::hexToRgb($this->_hex);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
require __DIR__ . '/../vendor/autoload.php';
|
|
||||||
require __DIR__ . '/../src/Mexitek/PHPColors/Color.php';
|
|
||||||
|
|
||||||
if (!class_exists('Tester\Assert')) {
|
|
||||||
echo "Install Nette Tester using `composer update --dev`\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
Tester\Environment::setup();
|
|
||||||
@ -1,35 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
use Mexitek\PHPColors\Color;
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
|
|
||||||
$isDark = array(
|
|
||||||
"000000" => true,
|
|
||||||
"336699" => true,
|
|
||||||
"913399" => true,
|
|
||||||
"E5C3E8" => false,
|
|
||||||
"D7E8DD" => false,
|
|
||||||
"218A47" => true,
|
|
||||||
"3D41CA" => true,
|
|
||||||
"E5CCDD" => false,
|
|
||||||
"FFFFFF" => false,
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ($isDark as $colorHex => $state) {
|
|
||||||
$color = new Color($colorHex);
|
|
||||||
Assert::same($state, $color->isDark(), 'Incorrect dark color analyzed (#' . $colorHex . ').');
|
|
||||||
}
|
|
||||||
|
|
||||||
$isLight = array(
|
|
||||||
"FFFFFF" => true,
|
|
||||||
"A3FFE5" => true,
|
|
||||||
"000000" => false,
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ($isLight as $colorHex => $state) {
|
|
||||||
$color = new Color($colorHex);
|
|
||||||
Assert::same($state, $color->isLight(), 'Incorrect light color analyzed (#' . $colorHex . ').');
|
|
||||||
}
|
|
||||||
@ -1,28 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
use Mexitek\PHPColors\Color;
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
|
|
||||||
$expected = array(
|
|
||||||
"336699" => "264d73",
|
|
||||||
"913399" => "6d2673"
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ($expected as $original => $darker) {
|
|
||||||
$color = new Color($original);
|
|
||||||
Assert::same($darker, $color->darken(), 'Incorrect darker color returned.');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$expected = array(
|
|
||||||
"336699" => "4080bf",
|
|
||||||
"913399" => "b540bf"
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ($expected as $original => $lighter) {
|
|
||||||
$color = new Color($original);
|
|
||||||
Assert::same($lighter, $color->lighten(), "Incorrect lighter color returned.");
|
|
||||||
}
|
|
||||||
@ -1,28 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
use Mexitek\PHPColors\Color;
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
|
|
||||||
$expected = array(
|
|
||||||
"ff0000" => "00ffff",
|
|
||||||
"0000ff" => "ffff00",
|
|
||||||
"00ff00" => "ff00ff",
|
|
||||||
"ffff00" => "0000ff",
|
|
||||||
"00ffff" => "ff0000",
|
|
||||||
"49cbaf" => "cb4965",
|
|
||||||
"003eb2" => "b27400",
|
|
||||||
"b27400" => "003eb2",
|
|
||||||
"ffff99" => "9999ff",
|
|
||||||
"ccff00" => "3300ff",
|
|
||||||
"3300ff" => "ccff00",
|
|
||||||
"fb4a2c" => "2cddfb",
|
|
||||||
"9cebff" => "ffb09c",
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ($expected as $original => $complementary) {
|
|
||||||
$color = new Color($original);
|
|
||||||
Assert::same($complementary, $color->complementary(), 'Incorrect complementary color returned.');
|
|
||||||
}
|
|
||||||
@ -1,72 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
use Mexitek\PHPColors\Color;
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
// Colors in HSL, for testing.
|
|
||||||
$blue = [
|
|
||||||
'H' => 194,
|
|
||||||
'S' => 1.0,
|
|
||||||
'L' => 0.4,
|
|
||||||
];
|
|
||||||
$yellow = [
|
|
||||||
'H' => 57,
|
|
||||||
'S' => 0.91,
|
|
||||||
'L' => 0.51,
|
|
||||||
];
|
|
||||||
$black = [
|
|
||||||
'H' => 0,
|
|
||||||
'S' => 0.0,
|
|
||||||
'L' => 0.0,
|
|
||||||
];
|
|
||||||
$grey = [
|
|
||||||
'H' => 0,
|
|
||||||
'S' => 0.0,
|
|
||||||
'L' => 0.65,
|
|
||||||
];
|
|
||||||
$white = [
|
|
||||||
'H' => 0,
|
|
||||||
'S' => 0.0,
|
|
||||||
'L' => 1.0,
|
|
||||||
];
|
|
||||||
|
|
||||||
// Test cases.
|
|
||||||
$colorsToConvert = array(
|
|
||||||
'blue' => [ // hsl(194, 100%, 40%)
|
|
||||||
'hex' => '009ccc',
|
|
||||||
'hsl' => $blue,
|
|
||||||
],
|
|
||||||
'yellow' => [ // hsl(57, 91%, 51%)
|
|
||||||
'hex' => 'f4e810',
|
|
||||||
'hsl' => $yellow,
|
|
||||||
],
|
|
||||||
'black' => [
|
|
||||||
'hex' => '000000',
|
|
||||||
'hsl' => $black,
|
|
||||||
],
|
|
||||||
'grey' => [
|
|
||||||
'hex' => 'a6a6a6',
|
|
||||||
'hsl' => $grey,
|
|
||||||
],
|
|
||||||
'white' => [
|
|
||||||
'hex' => 'ffffff',
|
|
||||||
'hsl' => $white,
|
|
||||||
],
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
foreach ($colorsToConvert as $color) {
|
|
||||||
$hsl = $color['hsl'];
|
|
||||||
$hex = $color['hex'];
|
|
||||||
|
|
||||||
$answer = Color::hslToHex($hsl);
|
|
||||||
Assert::same(
|
|
||||||
$hex,
|
|
||||||
$answer,
|
|
||||||
'Incorrect hex result: "' . json_encode($hsl) .
|
|
||||||
'" should convert to "' . $hex .
|
|
||||||
'", but output was: "' . $answer . '".'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,170 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
use Mexitek\PHPColors\Color;
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
// Test cases.
|
|
||||||
$colorsToConvert = array(
|
|
||||||
'aliceblue' => 'F0F8FF',
|
|
||||||
'antiquewhite' => 'FAEBD7',
|
|
||||||
'aqua' => '00FFFF',
|
|
||||||
'aquamarine' => '7FFFD4',
|
|
||||||
'azure' => 'F0FFFF',
|
|
||||||
'beige' => 'F5F5DC',
|
|
||||||
'bisque' => 'FFE4C4',
|
|
||||||
'black' => '000000',
|
|
||||||
'blanchedalmond' => 'FFEBCD',
|
|
||||||
'blue' => '0000FF',
|
|
||||||
'blueviolet' => '8A2BE2',
|
|
||||||
'brown' => 'A52A2A',
|
|
||||||
'burlywood' => 'DEB887',
|
|
||||||
'cadetblue' => '5F9EA0',
|
|
||||||
'chartreuse' => '7FFF00',
|
|
||||||
'chocolate' => 'D2691E',
|
|
||||||
'coral' => 'FF7F50',
|
|
||||||
'cornflowerblue' => '6495ED',
|
|
||||||
'cornsilk' => 'FFF8DC',
|
|
||||||
'crimson' => 'DC143C',
|
|
||||||
'cyan' => '00FFFF',
|
|
||||||
'darkblue' => '00008B',
|
|
||||||
'darkcyan' => '008B8B',
|
|
||||||
'darkgoldenrod' => 'B8860B',
|
|
||||||
'darkgray' => 'A9A9A9',
|
|
||||||
'darkgreen' => '006400',
|
|
||||||
'darkgrey' => 'A9A9A9',
|
|
||||||
'darkkhaki' => 'BDB76B',
|
|
||||||
'darkmagenta' => '8B008B',
|
|
||||||
'darkolivegreen' => '556B2F',
|
|
||||||
'darkorange' => 'FF8C00',
|
|
||||||
'darkorchid' => '9932CC',
|
|
||||||
'darkred' => '8B0000',
|
|
||||||
'darksalmon' => 'E9967A',
|
|
||||||
'darkseagreen' => '8FBC8F',
|
|
||||||
'darkslateblue' => '483D8B',
|
|
||||||
'darkslategray' => '2F4F4F',
|
|
||||||
'darkslategrey' => '2F4F4F',
|
|
||||||
'darkturquoise' => '00CED1',
|
|
||||||
'darkviolet' => '9400D3',
|
|
||||||
'deeppink' => 'FF1493',
|
|
||||||
'deepskyblue' => '00BFFF',
|
|
||||||
'dimgray' => '696969',
|
|
||||||
'dimgrey' => '696969',
|
|
||||||
'dodgerblue' => '1E90FF',
|
|
||||||
'firebrick' => 'B22222',
|
|
||||||
'floralwhite' => 'FFFAF0',
|
|
||||||
'forestgreen' => '228B22',
|
|
||||||
'fuchsia' => 'FF00FF',
|
|
||||||
'gainsboro' => 'DCDCDC',
|
|
||||||
'ghostwhite' => 'F8F8FF',
|
|
||||||
'gold' => 'FFD700',
|
|
||||||
'goldenrod' => 'DAA520',
|
|
||||||
'gray' => '808080',
|
|
||||||
'green' => '008000',
|
|
||||||
'greenyellow' => 'ADFF2F',
|
|
||||||
'grey' => '808080',
|
|
||||||
'honeydew' => 'F0FFF0',
|
|
||||||
'hotpink' => 'FF69B4',
|
|
||||||
'indianred' => 'CD5C5C',
|
|
||||||
'indigo' => '4B0082',
|
|
||||||
'ivory' => 'FFFFF0',
|
|
||||||
'khaki' => 'F0E68C',
|
|
||||||
'lavender' => 'E6E6FA',
|
|
||||||
'lavenderblush' => 'FFF0F5',
|
|
||||||
'lawngreen' => '7CFC00',
|
|
||||||
'lemonchiffon' => 'FFFACD',
|
|
||||||
'lightblue' => 'ADD8E6',
|
|
||||||
'lightcoral' => 'F08080',
|
|
||||||
'lightcyan' => 'E0FFFF',
|
|
||||||
'lightgoldenrodyellow' => 'FAFAD2',
|
|
||||||
'lightgray' => 'D3D3D3',
|
|
||||||
'lightgreen' => '90EE90',
|
|
||||||
'lightgrey' => 'D3D3D3',
|
|
||||||
'lightpink' => 'FFB6C1',
|
|
||||||
'lightsalmon' => 'FFA07A',
|
|
||||||
'lightseagreen' => '20B2AA',
|
|
||||||
'lightskyblue' => '87CEFA',
|
|
||||||
'lightslategray' => '778899',
|
|
||||||
'lightslategrey' => '778899',
|
|
||||||
'lightsteelblue' => 'B0C4DE',
|
|
||||||
'lightyellow' => 'FFFFE0',
|
|
||||||
'lime' => '00FF00',
|
|
||||||
'limegreen' => '32CD32',
|
|
||||||
'linen' => 'FAF0E6',
|
|
||||||
'magenta' => 'FF00FF',
|
|
||||||
'maroon' => '800000',
|
|
||||||
'mediumaquamarine' => '66CDAA',
|
|
||||||
'mediumblue' => '0000CD',
|
|
||||||
'mediumorchid' => 'BA55D3',
|
|
||||||
'mediumpurple' => '9370D0',
|
|
||||||
'mediumseagreen' => '3CB371',
|
|
||||||
'mediumslateblue' => '7B68EE',
|
|
||||||
'mediumspringgreen' => '00FA9A',
|
|
||||||
'mediumturquoise' => '48D1CC',
|
|
||||||
'mediumvioletred' => 'C71585',
|
|
||||||
'midnightblue' => '191970',
|
|
||||||
'mintcream' => 'F5FFFA',
|
|
||||||
'mistyrose' => 'FFE4E1',
|
|
||||||
'moccasin' => 'FFE4B5',
|
|
||||||
'navajowhite' => 'FFDEAD',
|
|
||||||
'navy' => '000080',
|
|
||||||
'oldlace' => 'FDF5E6',
|
|
||||||
'olive' => '808000',
|
|
||||||
'olivedrab' => '6B8E23',
|
|
||||||
'orange' => 'FFA500',
|
|
||||||
'orangered' => 'FF4500',
|
|
||||||
'orchid' => 'DA70D6',
|
|
||||||
'palegoldenrod' => 'EEE8AA',
|
|
||||||
'palegreen' => '98FB98',
|
|
||||||
'paleturquoise' => 'AFEEEE',
|
|
||||||
'palevioletred' => 'DB7093',
|
|
||||||
'papayawhip' => 'FFEFD5',
|
|
||||||
'peachpuff' => 'FFDAB9',
|
|
||||||
'peru' => 'CD853F',
|
|
||||||
'pink' => 'FFC0CB',
|
|
||||||
'plum' => 'DDA0DD',
|
|
||||||
'powderblue' => 'B0E0E6',
|
|
||||||
'purple' => '800080',
|
|
||||||
'red' => 'FF0000',
|
|
||||||
'rosybrown' => 'BC8F8F',
|
|
||||||
'royalblue' => '4169E1',
|
|
||||||
'saddlebrown' => '8B4513',
|
|
||||||
'salmon' => 'FA8072',
|
|
||||||
'sandybrown' => 'F4A460',
|
|
||||||
'seagreen' => '2E8B57',
|
|
||||||
'seashell' => 'FFF5EE',
|
|
||||||
'sienna' => 'A0522D',
|
|
||||||
'silver' => 'C0C0C0',
|
|
||||||
'skyblue' => '87CEEB',
|
|
||||||
'slateblue' => '6A5ACD',
|
|
||||||
'slategray' => '708090',
|
|
||||||
'slategrey' => '708090',
|
|
||||||
'snow' => 'FFFAFA',
|
|
||||||
'springgreen' => '00FF7F',
|
|
||||||
'steelblue' => '4682B4',
|
|
||||||
'tan' => 'D2B48C',
|
|
||||||
'teal' => '008080',
|
|
||||||
'thistle' => 'D8BFD8',
|
|
||||||
'tomato' => 'FF6347',
|
|
||||||
'turquoise' => '40E0D0',
|
|
||||||
'violet' => 'EE82EE',
|
|
||||||
'wheat' => 'F5DEB3',
|
|
||||||
'white' => 'FFFFFF',
|
|
||||||
'whitesmoke' => 'F5F5F5',
|
|
||||||
'yellow' => 'FFFF00',
|
|
||||||
'yellowgreen' => '9ACD32'
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ($colorsToConvert as $name => $hex) {
|
|
||||||
$hex = '#' . $hex;
|
|
||||||
|
|
||||||
$answer = Color::nameToHex($name);
|
|
||||||
Assert::same(
|
|
||||||
$hex,
|
|
||||||
$answer,
|
|
||||||
'Incorrect hex result: "' . Color::nameToHex($name) .
|
|
||||||
'" should convert to "' . $hex .
|
|
||||||
'", but output was: "' . $answer . '".'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,72 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
use Mexitek\PHPColors\Color;
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
// Colors in RGB, for testing.
|
|
||||||
$blue = [
|
|
||||||
'R' => 0,
|
|
||||||
'G' => 158,
|
|
||||||
'B' => 204,
|
|
||||||
];
|
|
||||||
$yellow = [
|
|
||||||
'R' => 244,
|
|
||||||
'G' => 231,
|
|
||||||
'B' => 15,
|
|
||||||
];
|
|
||||||
$black = [
|
|
||||||
'R' => 0,
|
|
||||||
'G' => 0,
|
|
||||||
'B' => 0,
|
|
||||||
];
|
|
||||||
$white = [
|
|
||||||
'R' => 255,
|
|
||||||
'G' => 255,
|
|
||||||
'B' => 255,
|
|
||||||
];
|
|
||||||
|
|
||||||
// Test cases.
|
|
||||||
$colorsToConvert = array(
|
|
||||||
'blue' => [ // rgb(0, 158, 204)
|
|
||||||
'hex' => '009ecc',
|
|
||||||
'rgb' => $blue,
|
|
||||||
],
|
|
||||||
'yellow' => [ // rgb(244, 231, 15)
|
|
||||||
'hex' => 'f4e70f',
|
|
||||||
'rgb' => $yellow,
|
|
||||||
],
|
|
||||||
'black' => [
|
|
||||||
'hex' => '000000',
|
|
||||||
'rgb' => $black,
|
|
||||||
],
|
|
||||||
'white' => [
|
|
||||||
'hex' => 'ffffff',
|
|
||||||
'rgb' => $white,
|
|
||||||
],
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
foreach ($colorsToConvert as $color) {
|
|
||||||
$rgb = $color['rgb'];
|
|
||||||
$hex = $color['hex'];
|
|
||||||
|
|
||||||
$answer = Color::rgbToHex($rgb);
|
|
||||||
Assert::same(
|
|
||||||
$hex,
|
|
||||||
$answer,
|
|
||||||
'Incorrect hex result: "' . Color::rgbToString($rgb) .
|
|
||||||
'" should convert to "' . $hex .
|
|
||||||
'", but output was: "' . $answer . '".'
|
|
||||||
);
|
|
||||||
|
|
||||||
$revertAnswer = Color::hexToRgb($hex);
|
|
||||||
Assert::same(
|
|
||||||
$rgb,
|
|
||||||
$revertAnswer,
|
|
||||||
'Incorrect rgb result: "' . $hex .
|
|
||||||
'" should convert to "' . Color::rgbToString($rgb) .
|
|
||||||
'", but output was: "' . Color::rgbToString($revertAnswer) . '".'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
use Mexitek\PHPColors\Color;
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
// Test that a hex starting with '#' is supported as input
|
|
||||||
$expected = array(
|
|
||||||
"#ffffff",
|
|
||||||
"#00ff00",
|
|
||||||
"#000000",
|
|
||||||
"#ff9a00",
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ($expected as $input) {
|
|
||||||
$color = new Color($input);
|
|
||||||
Assert::same((string) $color, $input, 'Incorrect color returned.');
|
|
||||||
}
|
|
||||||
@ -1,24 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
require __DIR__ . '/bootstrap.php';
|
|
||||||
|
|
||||||
use Mexitek\PHPColors\Color;
|
|
||||||
use Tester\Assert;
|
|
||||||
|
|
||||||
|
|
||||||
$expected = array(
|
|
||||||
"ffffff" => array("ff0000", "ff7f7f"), // ffffff + ff0000 = ff7f7f
|
|
||||||
"00ff00" => array("ff0000", "7f7f00"),
|
|
||||||
"000000" => array("ff0000", "7f0000"),
|
|
||||||
"002fff" => array("000000", "00177f"),
|
|
||||||
"00ffed" => array("000000", "007f76"),
|
|
||||||
"ff9a00" => array("000000", "7f4d00"),
|
|
||||||
"ff9a00" => array("ffffff", "ffcc7f"),
|
|
||||||
"00ff2d" => array("ffffff", "7fff96"),
|
|
||||||
"8D43B4" => array("35CF64", "61898c"),
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ($expected as $original => $complementary) {
|
|
||||||
$color = new Color($original);
|
|
||||||
Assert::same($complementary[1], $color->mix($complementary[0]), 'Incorrect mix color returned.');
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue