define(["require", "exports", "./consts", "./hsl2rgb"], function (require, exports, consts_1, hsl2rgb_1) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    /**
     * Converts a valid CSS color string to an RGB color.
     * Note that hex colors *must* be prefixed with # to be considered valid.
     * Alpha in returned color defaults to 100.
     * Four and eight digit hex values (with alpha) are supported if the current browser supports them.
     */
    function cssColor(color) {
        if (!color) {
            return undefined;
        }
        // Need to check the following valid color formats: RGB(A), HSL(A), hex, named color
        // First check for well formatted RGB(A), HSL(A), and hex formats at the start.
        // This is for perf (no creating an element) and catches the intentional "transparent" color
        //   case early on.
        var easyColor = _rgba(color) || _hex6(color) || _hex3(color) || _hsla(color);
        if (easyColor) {
            return easyColor;
        }
        // if the above fails, do the more expensive catch-all
        return _browserCompute(color);
    }
    exports.cssColor = cssColor;
    /**
     * Uses the browser's getComputedStyle() to determine what the passed-in color is.
     * This assumes _rgba, _hex6, _hex3, and _hsla have already been tried and all failed.
     * This works by attaching an element to the DOM, which may fail in server-side rendering
     *   or with headless browsers.
     */
    function _browserCompute(str) {
        if (typeof document === 'undefined') {
            // don't throw an error when used server-side
            return undefined;
        }
        var elem = document.createElement('div');
        elem.style.backgroundColor = str;
        // This element must be attached to the DOM for getComputedStyle() to have a value
        elem.style.position = 'absolute';
        elem.style.top = '-9999px';
        elem.style.left = '-9999px';
        elem.style.height = '1px';
        elem.style.width = '1px';
        document.body.appendChild(elem);
        var eComputedStyle = getComputedStyle(elem);
        var computedColor = eComputedStyle && eComputedStyle.backgroundColor;
        document.body.removeChild(elem);
        // computedColor is always an RGB(A) string, except for invalid colors in IE/Edge which return 'transparent'
        // browsers return one of these if the color string is invalid,
        // so need to differentiate between an actual error and intentionally passing in this color
        if (computedColor === 'rgba(0, 0, 0, 0)' || computedColor === 'transparent') {
            switch (str.trim()) {
                // RGB and HSL were already checked at the start of the function
                case 'transparent':
                case '#0000':
                case '#00000000':
                    return { r: 0, g: 0, b: 0, a: 0 };
            }
            return undefined;
        }
        return _rgba(computedColor);
    }
    /**
     * If `str` is in valid `rgb()` or `rgba()` format, returns an RGB color (alpha defaults to 100).
     * Otherwise returns undefined.
     */
    function _rgba(str) {
        if (!str) {
            return undefined;
        }
        var match = str.match(/^rgb(a?)\(([\d., ]+)\)$/);
        if (match) {
            var hasAlpha = !!match[1];
            var expectedPartCount = hasAlpha ? 4 : 3;
            var parts = match[2].split(/ *, */).map(Number);
            if (parts.length === expectedPartCount) {
                return {
                    r: parts[0],
                    g: parts[1],
                    b: parts[2],
                    a: hasAlpha ? parts[3] * 100 : consts_1.MAX_COLOR_ALPHA
                };
            }
        }
    }
    /**
     * If `str` is in `hsl()` or `hsla()` format, returns an RGB color (alpha defaults to 100).
     * Otherwise returns undefined.
     */
    function _hsla(str) {
        var match = str.match(/^hsl(a?)\(([\d., ]+)\)$/);
        if (match) {
            var hasAlpha = !!match[1];
            var expectedPartCount = hasAlpha ? 4 : 3;
            var parts = match[2].split(/ *, */).map(Number);
            if (parts.length === expectedPartCount) {
                var rgba = hsl2rgb_1.hsl2rgb(parts[0], parts[1], parts[2]);
                rgba.a = hasAlpha ? parts[3] * 100 : consts_1.MAX_COLOR_ALPHA;
                return rgba;
            }
        }
    }
    /**
     * If `str` is in valid 6-digit hex format *with* # prefix, returns an RGB color (with alpha 100).
     * Otherwise returns undefined.
     */
    function _hex6(str) {
        if ('#' === str[0] && 7 === str.length && /^#[\da-fA-F]{6}$/.test(str)) {
            return {
                r: parseInt(str.slice(1, 3), 16),
                g: parseInt(str.slice(3, 5), 16),
                b: parseInt(str.slice(5, 7), 16),
                a: consts_1.MAX_COLOR_ALPHA
            };
        }
    }
    /**
     * If `str` is in valid 3-digit hex format *with* # prefix, returns an RGB color (with alpha 100).
     * Otherwise returns undefined.
     */
    function _hex3(str) {
        if ('#' === str[0] && 4 === str.length && /^#[\da-fA-F]{3}$/.test(str)) {
            return {
                r: parseInt(str[1] + str[1], 16),
                g: parseInt(str[2] + str[2], 16),
                b: parseInt(str[3] + str[3], 16),
                a: consts_1.MAX_COLOR_ALPHA
            };
        }
    }
});
//# sourceMappingURL=cssColor.js.map