xref: /plugin/combo/ComboStrap/ColorSystem.php (revision 46021406a45186deda55326760c58f274bb3715b)
104fd306cSNickeau<?php
204fd306cSNickeau
304fd306cSNickeaunamespace ComboStrap;
404fd306cSNickeau
504fd306cSNickeau/**
604fd306cSNickeau * Static method of color calculation
704fd306cSNickeau */
804fd306cSNickeauclass ColorSystem
904fd306cSNickeau{
1004fd306cSNickeau
1104fd306cSNickeau    const CANONICAL = "color-system";
1204fd306cSNickeau
1304fd306cSNickeau    /**
1404fd306cSNickeau     * Return a color suitable for reading (that has a good ratio)
1504fd306cSNickeau     * @param ColorRgb $colorRgb
1604fd306cSNickeau     * @return ColorRgb
1704fd306cSNickeau     */
1804fd306cSNickeau    public static function toTextColor(ColorRgb $colorRgb): ColorRgb
1904fd306cSNickeau    {
2004fd306cSNickeau        try {
2104fd306cSNickeau            return $colorRgb
2204fd306cSNickeau                ->toHsl()
2304fd306cSNickeau                ->setSaturation(30)
2404fd306cSNickeau                ->setLightness(40)
2504fd306cSNickeau                ->toRgb()
2604fd306cSNickeau                ->toMinimumContrastRatioAgainstWhite();
2704fd306cSNickeau        } catch (ExceptionCompile $e) {
2804fd306cSNickeau            LogUtility::error("Error while calculating the primary text color. {$e->getMessage()}", self::CANONICAL, $e);
2904fd306cSNickeau            return $colorRgb;
3004fd306cSNickeau        }
3104fd306cSNickeau
3204fd306cSNickeau    }
3304fd306cSNickeau
3404fd306cSNickeau    /**
3504fd306cSNickeau     * Calculate a color for a text hover that has:
3604fd306cSNickeau     * * more lightness than the text
3704fd306cSNickeau     * * and a good contrast ratio
3804fd306cSNickeau     *
3904fd306cSNickeau     * @param ColorRgb $colorRgb
4004fd306cSNickeau     * @return ColorRgb
41*46021406Sgerardnico     *
42*46021406Sgerardnico     * Default Link Color
43*46021406Sgerardnico     * Saturation and lightness comes from the
44*46021406Sgerardnico     * Note:
45*46021406Sgerardnico     *   * blue color of Bootstrap #0d6efd s: 98, l: 52
46*46021406Sgerardnico     *   * blue color of twitter #1d9bf0 s: 88, l: 53
47*46021406Sgerardnico     *   * reddit gray with s: 16, l : 31
48*46021406Sgerardnico     *   * the text is s: 11, l: 15
49*46021406Sgerardnico     * We choose the gray/tone rendering to be close to black
50*46021406Sgerardnico     * the color of the text
5104fd306cSNickeau     */
5204fd306cSNickeau    public static function toTextHoverColor(ColorRgb $colorRgb): ColorRgb
5304fd306cSNickeau    {
5404fd306cSNickeau        try {
5504fd306cSNickeau            return $colorRgb
5604fd306cSNickeau                ->toHsl()
5704fd306cSNickeau                ->setSaturation(88)
5804fd306cSNickeau                ->setLightness(53)
5904fd306cSNickeau                ->toRgb()
6004fd306cSNickeau                ->toMinimumContrastRatioAgainstWhite();
6104fd306cSNickeau        } catch (ExceptionCompile $e) {
6204fd306cSNickeau            LogUtility::error("Error while calculating the color text hover color. {$e->getMessage()}", self::CANONICAL, $e);
6304fd306cSNickeau            return $colorRgb;
6404fd306cSNickeau        }
6504fd306cSNickeau    }
6604fd306cSNickeau
6704fd306cSNickeau    /**
6804fd306cSNickeau     *
6904fd306cSNickeau     * @throws ExceptionCompile when the color could not be calculated
7004fd306cSNickeau     */
7104fd306cSNickeau    public static function toBackgroundColor(ColorRgb $primaryColor): ColorRgb
7204fd306cSNickeau    {
7304fd306cSNickeau        return $primaryColor
7404fd306cSNickeau            ->toHsl()
7504fd306cSNickeau            ->setLightness(98)
7604fd306cSNickeau            ->toRgb()
7704fd306cSNickeau            ->toMinimumContrastRatioAgainstWhite(1.1, 1);
7804fd306cSNickeau    }
7904fd306cSNickeau
8004fd306cSNickeau}
81