@@ -25,8 +25,7 @@ | |||
"ext-pdo": "*", | |||
"ext-simplexml": "*", | |||
"ext-xmlreader": "*", | |||
"ext-zip": "*", | |||
"mexitek/phpcolors": "^1.0" | |||
"ext-zip": "*" | |||
}, | |||
"require-dev": { | |||
"bamarni/composer-bin-plugin": "^1.4" |
@@ -4,62 +4,8 @@ | |||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", | |||
"This file is @generated automatically" | |||
], | |||
"content-hash": "8f8b099365b3839a80b19e266c4ba5e4", | |||
"packages": [ | |||
{ | |||
"name": "mexitek/phpcolors", | |||
"version": "v1.0.4", | |||
"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" | |||
}, | |||
"type": "library", | |||
"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" | |||
}, | |||
"time": "2021-11-26T13:19:08+00:00" | |||
} | |||
], | |||
"content-hash": "8333c8a239fe5ccec285dfbccc17cca4", | |||
"packages": [], | |||
"packages-dev": [ | |||
{ | |||
"name": "bamarni/composer-bin-plugin", | |||
@@ -130,5 +76,5 @@ | |||
"platform-overrides": { | |||
"php": "7.4" | |||
}, | |||
"plugin-api-version": "2.2.0" | |||
"plugin-api-version": "2.3.0" | |||
} |
@@ -2,6 +2,11 @@ | |||
// autoload.php @generated by Composer | |||
if (PHP_VERSION_ID < 50600) { | |||
echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; | |||
exit(1); | |||
} | |||
require_once __DIR__ . '/composer/autoload_real.php'; | |||
return ComposerAutoloaderInit53792487c5a8370acc0b06b1a864ff4c::getLoader(); |
@@ -7,7 +7,6 @@ $baseDir = dirname(dirname($vendorDir)); | |||
return array( | |||
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', | |||
'Mexitek\\PHPColors\\Color' => $vendorDir . '/mexitek/phpcolors/src/Mexitek/PHPColors/Color.php', | |||
'OCP\\Accounts\\IAccount' => $baseDir . '/lib/public/Accounts/IAccount.php', | |||
'OCP\\Accounts\\IAccountManager' => $baseDir . '/lib/public/Accounts/IAccountManager.php', | |||
'OCP\\Accounts\\IAccountProperty' => $baseDir . '/lib/public/Accounts/IAccountProperty.php', |
@@ -22,8 +22,6 @@ class ComposerAutoloaderInit53792487c5a8370acc0b06b1a864ff4c | |||
return self::$loader; | |||
} | |||
require __DIR__ . '/platform_check.php'; | |||
spl_autoload_register(array('ComposerAutoloaderInit53792487c5a8370acc0b06b1a864ff4c', 'loadClassLoader'), true, true); | |||
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); | |||
spl_autoload_unregister(array('ComposerAutoloaderInit53792487c5a8370acc0b06b1a864ff4c', 'loadClassLoader')); |
@@ -36,7 +36,6 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c | |||
public static $classMap = array ( | |||
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', | |||
'Mexitek\\PHPColors\\Color' => __DIR__ . '/..' . '/mexitek/phpcolors/src/Mexitek/PHPColors/Color.php', | |||
'OCP\\Accounts\\IAccount' => __DIR__ . '/../../..' . '/lib/public/Accounts/IAccount.php', | |||
'OCP\\Accounts\\IAccountManager' => __DIR__ . '/../../..' . '/lib/public/Accounts/IAccountManager.php', | |||
'OCP\\Accounts\\IAccountProperty' => __DIR__ . '/../../..' . '/lib/public/Accounts/IAccountProperty.php', |
@@ -1,62 +1,5 @@ | |||
{ | |||
"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" | |||
} | |||
], | |||
"packages": [], | |||
"dev": false, | |||
"dev-package-names": [] | |||
} |
@@ -5,7 +5,7 @@ | |||
'type' => 'library', | |||
'install_path' => __DIR__ . '/../../../', | |||
'aliases' => array(), | |||
'reference' => '3e28052303a61b134b454fdc31e72d371c03b793', | |||
'reference' => '4f4f8cea83a31519e55b6305c6d9471896de42be', | |||
'name' => '__root__', | |||
'dev' => false, | |||
), | |||
@@ -16,16 +16,7 @@ | |||
'type' => 'library', | |||
'install_path' => __DIR__ . '/../../../', | |||
'aliases' => array(), | |||
'reference' => '3e28052303a61b134b454fdc31e72d371c03b793', | |||
'dev_requirement' => false, | |||
), | |||
'mexitek/phpcolors' => array( | |||
'pretty_version' => 'v1.0.4', | |||
'version' => '1.0.4.0', | |||
'type' => 'library', | |||
'install_path' => __DIR__ . '/../mexitek/phpcolors', | |||
'aliases' => array(), | |||
'reference' => '4043974240ca7dc3c2bec3c158588148b605b206', | |||
'reference' => '4f4f8cea83a31519e55b6305c6d9471896de42be', | |||
'dev_requirement' => false, | |||
), | |||
), |
@@ -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 [![Build Status](https://travis-ci.org/mexitek/phpColors.svg?branch=master)](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> |
@@ -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.'); | |||
} |