{"version":3,"file":"js/alwan.min.js","mappings":"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","sources":["webpack://Alwan/webpack/universalModuleDefinition","webpack://Alwan/webpack/bootstrap","webpack://Alwan/webpack/runtime/define property getters","webpack://Alwan/webpack/runtime/hasOwnProperty shorthand","webpack://Alwan/./src/js/constants.js","webpack://Alwan/./src/js/utils/object.js","webpack://Alwan/./src/js/utils/util.js","webpack://Alwan/./src/js/utils/dom.js","webpack://Alwan/./src/js/defaults.js","webpack://Alwan/./src/js/core/events/EventBinder.js","webpack://Alwan/./src/js/lib/popper.js","webpack://Alwan/./src/js/components/App.js","webpack://Alwan/./src/js/lib/svg.js","webpack://Alwan/./src/js/components/Palette.js","webpack://Alwan/./src/js/components/Marker.js","webpack://Alwan/./src/js/lib/colors.js","webpack://Alwan/./src/js/lib/parser.js","webpack://Alwan/./src/js/core/index.js","webpack://Alwan/./src/js/components/Reference.js","webpack://Alwan/./src/js/components/Preview.js","webpack://Alwan/./src/js/components/Sliders.js","webpack://Alwan/./src/js/components/Inputs.js","webpack://Alwan/./src/js/components/Swatches.js","webpack://Alwan/./src/js/core/colorState.js","webpack://Alwan/./src/js/index.js","webpack://Alwan/./src/js/core/events/EventListener.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Alwan\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Alwan\"] = factory();\n\telse\n\t\troot[\"Alwan\"] = factory();\n})(self, function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","export const ROOT = document;\nexport const HTML = ROOT.documentElement;\n\nexport const BUTTON = 'button';\nexport const SVG = 'svg';\n\nexport const OPEN = 'open';\nexport const CLOSE = 'close';\nexport const COLOR = 'color';\nexport const CLICK = 'click';\nexport const MOUSE_DOWN = 'mousedown';\nexport const MOUSE_MOVE = 'mousemove';\nexport const MOUSE_UP = 'mouseup';\nexport const TOUCH_START = 'touchstart';\nexport const TOUCH_MOVE = 'touchmove';\nexport const TOUCH_END = 'touchend';\nexport const TOUCH_CANCEL = 'touchcancel';\nexport const SCROLL = 'scroll';\nexport const RESIZE = 'resize';\nexport const KEY_DOWN = 'keydown';\nexport const INPUT = 'input';\nexport const CHANGE = 'change';\nexport const MOUSE_LEAVE = 'mouseleave';\nexport const FOCUS_IN = 'focusin';\nexport const FOCUS_OUT = 'focusout';\n\nexport const HEX_FORMAT = 'hex';\nexport const RGB_FORMAT = 'rgb';\nexport const HSL_FORMAT = 'hsl';\nexport const HSV_FORMAT = 'hsv';\n\nexport const TAB = 'Tab';\nexport const ARROW_RIGHT = 'ArrowRight';\nexport const ARROW_LEFT = 'ArrowLeft';\nexport const ARROW_UP = 'ArrowUp';\nexport const ARROW_DOWN = 'ArrowDown';\nexport const ENTER = 'Enter';\nexport const ESCAPE = 'Escape';\n\nexport const FOCUS_CLASSNAME = 'lw-focus';\nexport const BUTTON_CLASSNAME = 'lw-btn';\n\nexport const COLOR_PROPERTY = 'lw-' + COLOR;\n\nexport const REMOVE_METHOD = 'remove';\nexport const ADD_METHOD = 'add';\n\n// Picker supported color formats.\nexport const COLOR_FORMATS = [HEX_FORMAT, RGB_FORMAT, HSL_FORMAT];\n\n\nexport const { max, min, round, abs } = Math;\nexport const float = parseFloat;\nexport const int = parseInt;","/**\n * Iterate in an object, stop and return false if callback function returns true.\n *\n * @param {Object} object - Any object.\n * @param {CallableFunction} fn - Any Callback function.\n * @returns {Boolean}\n */\nexport const objectIterator = (object, fn) => {\n\n for (const key in object) {\n if (Object.hasOwnProperty.call(object, key)) {\n if (fn(object[key], key, object)) {\n return false;\n }\n }\n }\n\n return true;\n}\n\n\n/**\n * Merges two or more objects together into the target object.\n *\n * @param {Object} target - Object that will receive the new properties.\n * @param {...Object} sources - Objects containing additional properties to merge in.\n * @returns {Object}\n */\nexport const merge = (target, ...sources) => Object.assign(target, ...sources);\n\n/**\n * Checks if two object are equals.\n *\n * @param {Object} object1 - Any object.\n * @param {Object} object2 - Any object.\n * @returns {Boolean}\n */\nexport const isEqual = (object1, object2) => objectIterator(object1, (value, key) => !object2 || object2[key] !== value);\n","import { CHANGE, COLOR, max, min, round } from \"../constants\";\n\n/**\n * Checks if a value is a string.\n *\n * @param {Any} value - Value.\n * @returns {Boolean}\n */\nexport const isString = value => typeof value === 'string';\n\n/**\n * Checks if a value is not undefined or null.\n *\n * @param {Any} value - Value.\n * @returns {Boolean}\n */\nexport const isset = value => value != null;\n\n\n/**\n * Bounds a number between a lower bound and an upper bound.\n *\n * @param {number} number - Any number.\n * @param {number} upperBound - Max.\n * @param {number} lowerBound - Min.\n * @returns {number}\n */\nexport const boundNumber = (number, upperBound, lowerBound) => min(max(number, lowerBound || 0), upperBound || 100);\n\n\n/**\n * Sets color, if color state changes then trigger color and change events.\n *\n * @param {Object} alwan - Instance.\n * @param {String} color - Color.\n * @param {Element|Object} source - Event source.\n */\nexport const setColorAndTriggerEvents = (alwan, color, source) => {\n if (alwan._s._updateFromString(color, true)) {\n let emit = alwan._e._emit;\n emit(COLOR, source);\n emit(CHANGE, source);\n }\n}\n\n/**\n * Hue value is an angle in degrees, it must be between 0 and 360.\n *\n * @param {Number} hue - Color hue.\n * @returns {Number}\n */\nexport const normalizeHue = hue => (round(hue) % 360 + 360) % 360;","import { ADD_METHOD, REMOVE_METHOD, ROOT, SCROLL, SVG } from \"../constants\";\nimport { objectIterator } from \"./object\";\nimport { isString } from \"./util\";\n\n/**\n * Gets a DOM element.\n *\n * @param {String|Element} ref - CSS selector or DOM element.\n * @param {Element} context - Element to search from.\n * @param {Boolean} all - Get all elements.\n * @returns {Element|null}\n */\nexport const getElement = (ref, context, all) =>\n isString(ref) ? ref && (context || ROOT)['querySelector' + (all ? 'All' : '')](ref)\n : ref instanceof Element ? ref\n : null;\n\n/**\n * Creates a new HTML Element.\n *\n * @param {String} tagName - HTML Element's Tag name.\n * @param {String} className - HTML Element's class name.\n * @param {Element} parent - Append the new created element to this element.\n * @param {Object} data - New element data its attributes, content html or inner text.\n * @param {CallableFunction} callback - Callback.\n * @returns {Element}\n */\nexport const createElement = (tagName, className, parent, data, callback) => {\n\n data = data || {}\n const ns = `http://www.w3.org/${tagName === SVG ? '2000/svg' : '1999/xhtml'}`;\n const element = document.createElementNS(ns, tagName || 'div');\n\n if (className) {\n element.className = className;\n }\n\n objectIterator(data, (value, key) => {\n if (key === 'html') {\n setElementsHTML(element, value);\n } else if (key === 'text') {\n element.innerText = value;\n } else {\n value && element.setAttributeNS('', key, value);\n }\n });\n\n if (parent) {\n parent.appendChild(element);\n }\n\n callback && callback(element);\n\n return element;\n}\n\n\n/**\n * Gets element bounds.\n *\n * @param {HTMLElement} el Element.\n * @returns {Object}\n */\nexport const getBounds = (el) => el && el.getBoundingClientRect();\n\n\n/**\n * Gets an element's parent.\n *\n * @param {Element} el - Any html element.\n * @returns {Element}\n */\nexport const getParent = el => el.parentElement;\n\n\n/**\n * Replace a child node with another node.\n *\n * @param {Node} newChild - Any html node.\n * @param {Node} oldChild - Any html node.\n * @returns {Node}\n */\nexport const replaceElement = (newChild, oldChild) => getParent(oldChild).replaceChild(newChild, oldChild) && newChild;\n\n/**\n * Removes an element from the DOM.\n *\n * @param {HTMLElement} element - Any html node.\n * @param {Boolean} destroy - Remove Reference. \n * @returns {Element|null}\n */\nexport const removeElement = (element, destroy) => element && getParent(element).removeChild(element) && (destroy ? null : element);\n\n\n/**\n * Gets any scrollable ancestor of an element.\n * Document is always included.\n *\n * @param {HTMLElement} el - Subject element.\n * @returns {Array}\n */\nexport const getScrollableAncestors = el => {\n el = getParent(el);\n \n let scrollableElements = [ROOT];\n \n while (el !== ROOT.body) {\n let overflow = getComputedStyle(el).overflow;\n if (overflow === 'auto' || overflow === SCROLL) {\n scrollableElements.push(el);\n }\n el = getParent(el);\n }\n \n return scrollableElements;\n}\n\n\n/**\n * Check if an element is visible in the viewport of all scrollable elements.\n *\n * @param {HTMLElement} el - Any html element.\n * @param {Array} scrollableElements - scrollable elements.\n * @returns {boolean}\n */\nexport const isInViewport = (el, scrollableElements) =>\n scrollableElements.every(scrollable => {\n let isVisible = true;\n\n if (scrollable !== ROOT) {\n let {top: elTop, bottom: elBottom} = getBounds(el);\n let {top: scrollableTop, bottom: scrollableBottom} = getBounds(scrollable);\n\n isVisible = elTop >= scrollableTop && scrollableBottom >= elBottom;\n }\n\n return isVisible;\n });\n\n\n/**\n * Sets a CSS custom property.\n *\n * @param {HTMLElement} el - Element to set its custom property.\n * @param {string} property - Property name.\n * @param {string} value - Property value.\n */\nexport const setCustomProperty = (el, property, value) => {\n el && el.style.setProperty('--' + property, value);\n}\n\n\n/**\n * Hides/Shows element.\n * Truthy value or non empty array shows the element,\n * else hides it.\n * \n * @param {Element} el - Element to show/hide.\n * @param {Array|Boolean} cond - Condition.\n */\nexport const setVisibility = (el, cond) => {\n\n let length = cond && cond.length;\n\n if (length != null) {\n cond = length;\n }\n\n el.style.display = cond ? '' : 'none';\n}\n\n/**\n * Adds/Remove class based on a condition.\n *\n * @param {Element} el - Any Element.\n * @param {String} classname - CSS Class Selector.\n * @param {Boolean} cond - Condition.\n */\nexport const updateClass = (el, classname, cond) => {\n classname && el.classList[cond ? ADD_METHOD : REMOVE_METHOD](classname);\n}\n\n/**\n * Sets element's inner html.\n *\n * @param {Element} el - Any Element.\n * @param {String} html - HTML string.\n */\nexport const setElementsHTML = (el, html) => {\n el.innerHTML = html || '';\n}","/**\n * SC Picker default options.\n */\n export const defaults = {\n // Set the container's (widget) id.\n id: '',\n\n // One or many classes separated by a white space,\n // to add it to the preset button.\n classname: '',\n\n // Choose a theme, 'dark' or 'light'.\n theme: 'light',\n\n // Toggle picker's visibility (Show/Hide),\n // Setting this to false keeps the picker visible.\n toggle: true,\n\n // Display the picker container as a pop-up (a box that floats on top of the page content),\n // if it's false, picker container will be displayed as a block (embeded in the page's content).\n popover: true,\n\n // Set the position of the popper (if popover is set to true) relative to the reference element,\n // the position has two values seperated by a dash (-),\n // the first value is the direction (top, bottom, right, left),\n // the second value is the alignment (start, center, end), omitting this value will default to center.\n // e.g. 'bottom-start': 'bottom' places the picker below the reference element,\n // and 'start' aligns the left side of the container with the left side of the reference element.\n // Note: \n // If the picker container has no space to be placed, it will auto-position itself.\n // based on the available space.\n position: 'bottom-start',\n\n // Set the gap (in pixels) between the picker container and the reference element.\n margin: 8,\n\n // Replace the reference element with a pre-styled button.\n preset: true,\n\n // Initial color.\n color: '#000',\n\n // Default color.\n default: '#000',\n\n // Target can be a selector or an HTML element,\n // If the option popover is true, the picker container will be positionned retalive to this element,\n // instead of the reference element.\n // else if popover option is false, the picker container will be appended as a child into this element.\n target: '',\n\n // Disable the picker, users won't be able to pick colors.\n disabled: false,\n\n // Initial color format.\n format: 'rgb',\n\n // For the formats 'hsl' and 'rgb', choose a single input to display the color string,\n // or if false, display an input for each color channel.\n singleInput: false,\n\n // Choose color formats for the picker input, 'hsl', 'rgb' or 'hex',\n // No input will be displayed if the array is empty.\n inputs: {\n rgb: true,\n hex: true,\n hsl: true,\n },\n\n // Support alpha channel and display opacity slider.\n opacity: true,\n\n // Preview the color.\n preview: true,\n\n // Add/Remove a copy button.\n copy: true,\n\n // Array of color strings, invalid color strings will default to rgb(0,0,0).\n swatches: [],\n}","import { ADD_METHOD, REMOVE_METHOD } from \"../../constants\";\nimport { isString } from \"../../utils/util\";\n\n/**\n * Adds/Removes one or more event listeners to/from an element.\n *\n * @param {targetElement} targetElement - Event target element.\n * @param {Array} eventData - Event data (type, handler, options).\n * @param {String} method - Add or Remove event listener method.\n */\nexport const binder = (eventData, unbind) => {\n\n let method = (unbind ? REMOVE_METHOD: ADD_METHOD) + 'EventListener';\n let [targetElement, events, handler, options] = eventData;\n\n // If its a single event then put it inside an array.\n if (isString(events)) {\n events = [events];\n }\n\n events.forEach(event => {\n targetElement[method](event, handler, options);\n });\n}\n\n/**\n * Binds events to an element and stores listener in an array.\n *\n * @param {Array} listeners - Event Listeners.\n * @param {targetElement} targetElement - Event Target.\n * @param {String|Array} events - Event type.\n * @param {CallableFunction} handler - Event handler.\n * @param {Object|Boolean} options - Event options.\n * @returns {Array}\n */\nexport const bindEvent = (listeners, targetElement, events, handler, options) => {\n\n if (targetElement) {\n options = options || false;\n let eventData = [targetElement, events, handler, options];\n binder(eventData);\n listeners.push(eventData);\n }\n\n return listeners;\n}\n\n/**\n * Unbinds all listeners attach to an element and removes them from listeners array.\n *\n * @param {Array} listeners - Event listeners.\n * @param {targetElement} targetElement - Event Target.\n * @returns {Array}\n */\nexport const unbindEvent = (listeners, targetElement) =>\n // Filter out listeners attached to this TargetElement.\n listeners.filter(eventData => \n targetElement === eventData[0] ? \n binder(eventData, true)\n : true\n );","import { abs, float, HTML } from \"../constants\";\nimport { getBounds } from \"../utils/dom\";\n\n/**\n * Constants\n */\nconst TOP = 'top';\nconst RIGHT = 'right';\nconst BOTTOM = 'bottom';\nconst LEFT = 'left';\nconst START = 'start';\nconst CENTER = 'center';\nconst END = 'end';\nconst WIDTH = 'width';\nconst HEIGHT = 'height';\n\n/**\n * Display an element as a popover.\n *\n * @param {Element} ref - Popper reference element.\n * @param {Element} pop - Popper element.\n * @param {Object} options - Options.\n * @returns {Object}\n */\nexport const Popper = (ref, pop, options) => {\n\n options = options || {};\n\n /**\n * Popper options.\n */\n let { margin, position } = options;\n\n /**\n * Position is devided into, side and alignment.\n */\n let [side, alignment] = position ? position.split('-') : [];\n\n /**\n * Sides to fallback to.\n */\n let sides = {\n [TOP]: [TOP, BOTTOM, RIGHT, LEFT],\n [BOTTOM]: [BOTTOM, TOP, RIGHT, LEFT],\n [RIGHT]: [RIGHT, LEFT, TOP, BOTTOM],\n [LEFT]: [LEFT, RIGHT, TOP, BOTTOM],\n }\n\n /**\n * Alignments to fallback to.\n */\n let alignments = {\n [START]: [START, CENTER, END],\n [CENTER]: [CENTER, START, END],\n [END]: [END, CENTER, START],\n };\n\n /**\n * Document bounds.\n *\n * @type {object}\n */\n let domBounds;\n\n /**\n * Reference element bounds.\n *\n * @type {object}\n */\n let refBoundingRect;\n\n /**\n * Pop element bounds.\n *\n * @type {object}\n */\n let popBoundingRect;\n\n // Normalize options values.\n margin = margin == null ? 6 : float(margin);\n side = sides[side] ? side : BOTTOM;\n alignment = alignment ? alignments[alignment] ? alignment : START : CENTER;\n\n\n /**\n * Sets popper's position.\n *\n * @param {Boolean} isVertical - Indicate whether the popper is displayed on the Y axes.\n * @param {Number} value - Value of the top or left css property.\n */\n const setPosition = (isVertical, value) => {\n if (value !== false) {\n pop.style[isVertical ? TOP : LEFT] = value + 'px';\n }\n }\n\n /**\n * Positions the popper in the screen center vertically or horizontally.\n *\n * @param {Boolean} isVertical - Indicate whether the popper is displayed on the Y axes.\n */\n const centerPopElement = (isVertical) => {\n let dimension = WIDTH;\n let maxBoundary = RIGHT;\n \n if (isVertical) {\n dimension = HEIGHT;\n maxBoundary = BOTTOM;\n }\n\n setPosition(isVertical, (domBounds[maxBoundary] - popBoundingRect[dimension]) / 2);\n }\n\n /**\n * Updates popper's position.\n */\n const _update = () => {\n domBounds = {\n top: 0,\n left: 0,\n right: HTML.clientWidth,\n bottom: HTML.clientHeight\n }\n\n refBoundingRect = getBounds(ref);\n popBoundingRect = getBounds(pop);\n\n let isPopPlaced = sides[side].some(side => {\n\n let isVertical = side === TOP || side === BOTTOM;\n let domBoundary = domBounds[side];\n let refBound = refBoundingRect[side];\n // Space taken by the pop element.\n let space = margin + popBoundingRect[isVertical ? HEIGHT : WIDTH];\n let hasSpace = space <= abs(domBoundary - refBound);\n\n if (hasSpace) {\n setPosition(isVertical, refBound + (domBoundary ? margin : -space));\n\n // The pop element is positioned in the one of the 4 sides,\n // Now its alignment.\n let isPopAligned = alignments[alignment].some(alignment => {\n\n let dimension = HEIGHT;\n let lowerBound = TOP;\n let upperBound = BOTTOM;\n\n if (isVertical) {\n dimension = WIDTH;\n lowerBound = LEFT;\n upperBound = RIGHT;\n }\n // Reference lower bound top or left.\n let refLowerBound = refBoundingRect[lowerBound];\n // Reference upper bound bottom or right.\n let refUpperBound = refBoundingRect[upperBound];\n\n // Space between the document lower bound (top or left) and,\n // the reference upper bound (bottom or right).\n let lowerSpace = abs(domBounds[lowerBound] - refUpperBound);\n // Space between the document upper bound (bottom or right) and,\n // the reference lower bound (top or left).\n let upperSpace = abs(domBounds[upperBound] - refLowerBound);\n\n // Dimension could be height or width.\n let refDimension = refBoundingRect[dimension];\n let popDimension = popBoundingRect[dimension];\n\n // Center align pop element with the reference,\n // this is the distance between (lower/upper) bound of the reference,\n // and the (lower/upper) bound of the pop element.\n let offset = (popDimension + refDimension) / 2;\n\n // Check the space and get the position value in pixels.\n let placement = {\n [START]: popDimension <= upperSpace && refLowerBound,\n [CENTER]: offset <= lowerSpace && offset <= upperSpace && refUpperBound - offset,\n [END]: popDimension <= lowerSpace && refUpperBound - popDimension,\n }\n\n placement = placement[alignment];\n setPosition(! isVertical, placement);\n return placement !== false;\n });\n\n if (! isPopAligned) {\n centerPopElement(! isVertical);\n }\n }\n\n return hasSpace;\n });\n\n if (! isPopPlaced) {\n centerPopElement(true);\n centerPopElement();\n }\n }\n\n _update();\n\n return {\n _update\n }\n}","import { BUTTON, CLOSE, ESCAPE, INPUT, KEY_DOWN, MOUSE_DOWN, OPEN, RESIZE, ROOT, SCROLL, TAB } from \"../constants\";\nimport { bindEvent, unbindEvent } from \"../core/events/EventBinder\";\nimport { Popper } from \"../lib/popper\";\nimport { createElement, getElement, getScrollableAncestors, isInViewport, setVisibility, updateClass } from \"../utils/dom\";\nimport { merge, objectIterator } from \"../utils/object\";\nimport { setColorAndTriggerEvents } from \"../utils/util\";\n/**\n * App component constants.\n */\nconst ALWAN_CLASSNAME = 'alwan';\nconst POPPER_CLASSNAME = 'lw-popper';\nconst DISABLED_CLASSNAME = 'lw-disabled';\n\n\n/**\n * App component.\n *\n * @param {Object} alwan - Alwan Instance.\n * @returns {Object}\n */\nexport const App = (alwan) => {\n\n let { config, _e: { _emit }, _s: colorState } = alwan;\n\n /**\n * Top container.\n *\n * @type {HTMLElement}\n */\n let root = createElement('', ALWAN_CLASSNAME, ROOT.body);\n\n /**\n * Picker Reference.\n *\n * @type {Element}\n */\n let reference;\n\n /**\n * App API.\n */\n let self = {\n e: []\n }\n\n /**\n * Picker visibility state.\n */\n let isOpen = false;\n\n /**\n * Reference element scrollable ancestors.\n *\n * @type {Array}\n */\n let scrollableAncestors = [];\n\n /**\n * Popper object.\n *\n * @type {Object}\n */\n let popper;\n\n /**\n * Last focusable element in picker.\n * \n * @type {Element}\n */\n let lastFocusableElement;\n\n /**\n * Initialize app.\n *\n * @param {Object} options - Alwan options.\n */\n const _setup = (options) => {\n options = options || {};\n\n let config = merge(alwan.config, options);\n let { theme, popover, target, position, margin, disabled, id, toggle } = config;\n let targetElement = getElement(target);\n let color = options.color;\n let targetReference;\n\n if (id) {\n root.id = id;\n }\n\n /**\n * Initialize components.\n */\n objectIterator(alwan._c, component => {\n let init = component._init;\n if (init) {\n init(config);\n }\n });\n\n /**\n * Initialize color.\n */\n if (color) {\n setColorAndTriggerEvents(alwan, color);\n }\n\n reference = alwan._c.ref.$;\n targetReference = targetElement || reference;\n\n // Remove all popper events.\n popperEvents(unbindEvent);\n\n /**\n * Set disable.\n */\n _setDisable(disabled);\n\n /**\n * Set Theme.\n */\n root.dataset.theme = theme;\n\n // Toggle option is false, picker is always open.\n if (! toggle) {\n _open(true);\n }\n\n // Hide reference if both popover and toggle are false.\n setVisibility(reference, popover || toggle);\n\n /**\n * Set Popper.\n */\n if (popover) {\n popper = Popper(targetReference, root, {\n position,\n margin\n });\n // If reference element inside a nested scrollable elements,\n // get all those scrollable elements in an array.\n scrollableAncestors = getScrollableAncestors(reference);\n\n // Attach scroll event to all scrollable ancestors of the reference element,\n // in order to update the popper's position.\n // On window resize reposition the popper.\n popperEvents(bindEvent);\n } else {\n targetReference.insertAdjacentElement( (targetElement ? 'before' : 'after') + 'end', root);\n }\n // If it's popover then the method will be 'add', if it's not,\n // then the method will be 'remove'.\n updateClass(root, POPPER_CLASSNAME, popover);\n\n lastFocusableElement = getElement(BUTTON + ',' + INPUT, root, true);\n lastFocusableElement = lastFocusableElement[lastFocusableElement.length - 1];\n }\n\n\n /**\n * Update popper's position.\n *\n * @param {Event} e - Scroll or Resize event.\n */\n const updatePopper = e => {\n if (isOpen) {\n _reposition();\n\n // Close picker if the reference element is not visible in the viewport,\n // of nested scrollable elements.\n if (! isInViewport(reference, scrollableAncestors)) {\n _close(true);\n }\n }\n }\n\n /**\n * Binds/Unbinds events for updating the popper's position.\n *\n * @param {Function} eventBinder - Bind/Unbind events.\n */\n const popperEvents = (eventBinder) => {\n let listeners = self.e;\n\n scrollableAncestors.forEach(scrollable => {\n listeners = eventBinder(listeners, scrollable, SCROLL, updatePopper);\n });\n\n // On window resize reposition the popper.\n listeners = eventBinder(listeners, window, RESIZE, updatePopper);\n listeners = eventBinder(listeners, ROOT, [MOUSE_DOWN, KEY_DOWN], handlesAccessibility);\n\n self.e = listeners;\n }\n\n /**\n * Hanldes accessibility.\n * \n * If picker is displayed as a popover,\n * send focus from reference element to the picker and vice versa,\n * close picker on Escape key press or click away from the picker or the reference element.\n *\n * @param {Event}\n */\n const handlesAccessibility = e => {\n\n if (isOpen) {\n let { target, type, key, shiftKey } = e;\n let palette = alwan._c.palette.$;\n let elementToFocus;\n // Clicking outside the picker or pressing Escape key, results in,\n // closing the picker.\n if (key === ESCAPE || (type === MOUSE_DOWN && reference !== target && ! root.contains(target))) {\n _close();\n } else if (key === TAB) {\n // Pressing Tab on reference element sends focus to the picker palette.\n if (target === reference && !shiftKey) {\n elementToFocus = palette;\n // If picker is displayed as a popover,\n // Pressing Tab + shift on the palette,\n // or pressing Tab on the last focusable element in the picker,\n // sends the focus back to the reference element.\n } else if ((! shiftKey && target === lastFocusableElement) || (target === palette && shiftKey)) {\n elementToFocus = reference;\n }\n\n if (elementToFocus) {\n e.preventDefault();\n elementToFocus.focus();\n }\n }\n }\n }\n\n\n /**\n * Repositions the popper.\n */\n const _reposition = () => {\n popper && popper._update();\n }\n\n\n /**\n * Opens the color picker.\n *\n * @param {Boolean} silent - Whether to trigger the open event or not.\n */\n const _open = (silent) => {\n if (! isOpen && ! config.disabled) {\n // Update inputs.\n colorState._update({}, true);\n _reposition();\n // Add open class.\n updateClass(root, OPEN, true);\n isOpen = true;\n ! silent && _emit(OPEN);\n }\n }\n\n /**\n * Closes the color picker.\n *\n * @param {Boolean} silent - Whether to trigger the close event or not.\n */\n const _close = (silent) => {\n if (isOpen && config.toggle) {\n // Remove open class.\n updateClass(root, OPEN, false);\n isOpen = false;\n ! silent && _emit(CLOSE);\n }\n }\n\n /**\n * Toggles (opens/closes) the color picker.\n */\n const _toggle = () => {\n isOpen ? _close() : _open();\n }\n\n /**\n * Gets the state of the picker, opened or closed.\n *\n * @returns {Boolean}\n */\n const _isOpen = () => isOpen;\n\n /**\n * Disable/Enable Picker.\n *\n * @param {Boolean} state - Picker state disabled (true) or enabled (false).\n */\n const _setDisable = state => {\n config.disabled = state;\n state && _close(true);\n // Add/Remove disable class.\n updateClass(reference, DISABLED_CLASSNAME, state);\n }\n\n return merge(self, {\n $: root,\n _setup,\n _isOpen,\n _open,\n _close,\n _toggle,\n _setDisable,\n _reposition,\n });\n}\n","import { merge } from \"../utils/object\";\n\n/**\n * SVG attributes that are static for all SVGs.\n */\nconst staticAttrs = {\n 'aria-role': 'none',\n focusable: 'false'\n}\n\nconst clipboardSVG = '';\nconst checkSVG = '';\nconst switchSVG = '';\n\n/**\n * Gets SVG attributes object.\n *\n * @param {String} width - SVG Width.\n * @param {String} height - SVG Height.\n * @param {String} viewBox - SVG ViewBox.\n * @param {String} html - SVG Content.\n * @returns {Object}\n */\nconst svgAttrs = (width, height, viewBox, html) => ({ width, height, viewBox, html });\n\n\nexport const clipboardSVGAttrs = merge(svgAttrs('18', '18', '0 0 24 24', clipboardSVG), staticAttrs);\nexport const checkSVGAttrs = merge(svgAttrs('18', '18', '0 0 24 24', checkSVG), staticAttrs);\nexport const switchSVGAttrs = merge(svgAttrs('15', '15', '0 0 20 20', switchSVG), staticAttrs);\n","import { ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT, ARROW_UP, COLOR, FOCUS_CLASSNAME, FOCUS_IN, FOCUS_OUT, KEY_DOWN, MOUSE_DOWN, MOUSE_MOVE, MOUSE_UP, ROOT, TOUCH_CANCEL, TOUCH_END, TOUCH_MOVE, TOUCH_START } from \"../constants\";\nimport { bindEvent } from \"../core/events/EventBinder\";\nimport { createElement, getBounds, setVisibility, updateClass } from \"../utils/dom\"\nimport { Marker } from \"./Marker\";\n\n/**\n * Palette component constants.\n */\nconst PALETTE_CLASSNAME = 'alwan__palette';\nconst OVERLAY_CLASSNAME = 'lw-overlay';\n\n/**\n * Picker palette.\n *\n * @param {Element} parent - Element to append the palette element to.\n * @param {Object} alwan - Alwan instance.\n * @returns {Object}\n */\nexport const Palette = (parent, alwan) => {\n\n const { _s: colorState, _e: { _emit }} = alwan;\n\n /**\n * Palette element.\n */\n const el = createElement('', PALETTE_CLASSNAME, parent, { tabindex: '0' });\n\n /**\n * Overlay element, used to set focus only on palette,\n * if marker is moving.\n */\n const overlay = createElement('', OVERLAY_CLASSNAME, parent);\n setVisibility(overlay, false);\n\n /**\n * Move marker one step horizontally using the keyboard.\n */\n const moveX = {\n [ARROW_RIGHT]: 1,\n [ARROW_LEFT]: -1\n }\n\n /**\n * Move marker one step vertically using the keyboard.\n */\n const moveY = {\n [ARROW_UP]: -1,\n [ARROW_DOWN]: 1\n }\n\n /**\n * Marker component.\n */\n const marker = Marker(el);\n\n /**\n * Marker Method.\n */\n let { _moveTo } = marker;\n\n /**\n * Palette dimensions\n */\n let WIDTH, HEIGHT;\n\n /**\n * Palette event listeners.\n */\n let listeners = [];\n\n /**\n * Palette bounds.\n */\n let bounds;\n\n /**\n * State of the marker.\n */\n let isDragging = false;\n\n /**\n * Marker start moving.\n *\n * @param {Event} e - Mousedown or Touchstart events.\n * @returns {void}\n */\n const dragStart = e => {\n if (e.touches && e.touches.length > 1) {\n return;\n }\n // Save color state.\n colorState._colorStart();\n // Cache palette's bounds.\n bounds = getBounds(el);\n updateDimensions(bounds);\n moveAndUpdateColor(e);\n isDragging = true;\n // Display overlay.\n setVisibility(overlay, isDragging);\n el.focus();\n }\n\n /**\n * Moves the marker.\n *\n * @param {Event} e - Mousemove or Touchmove event.\n * @returns {void}\n */\n const dragMove = e => {\n if (!isDragging || (e.touches && e.touches.length > 1)) {\n return;\n }\n moveAndUpdateColor(e);\n }\n\n\n /**\n * Marker stop moving.\n *\n * @param {Event} e - Mouseup or Touchend or touchcancel events.\n */\n const dragEnd = e => {\n if (isDragging) {\n // Trigger change event if color changes.\n colorState._triggerChange(el);\n isDragging = false;\n // Hide overlay.\n setVisibility(overlay, isDragging);\n }\n }\n\n\n /**\n * Updates color and moves marker.\n *\n * @param {Number} x - X coordinate.\n * @param {Number} y - Y coordinate.\n */\n const updateColor = (x, y) => {\n _moveTo(x, y);\n colorState._update({ s: x / WIDTH, v: 1 - y / HEIGHT });\n _emit(COLOR, el);\n }\n\n\n /**\n * Moves Marker and Updates color.\n *\n * @param {Event} e - Drag start or drag move events.\n */\n const moveAndUpdateColor = e => {\n let { top, left } = bounds;\n let x, y;\n let touches = e.touches;\n\n e.preventDefault();\n\n if (touches) {\n e = touches[0];\n }\n\n // Calculate the local coordinates,\n // local to the palette.\n x = e.clientX - left;\n y = e.clientY - top;\n\n // Make sure x and y don't go out of bounds.\n x = x < 0 ? 0 : x > WIDTH ? WIDTH : x;\n y = y < 0 ? 0 : y > HEIGHT ? HEIGHT : y;\n\n updateColor(x, y);\n }\n\n /**\n * Updates palette.\n *\n * @param {Object} hsv - HSV color object.\n */\n const _setMarkerPosition = hsv => {\n updateDimensions();\n _moveTo(hsv.s * WIDTH, (1 - hsv.v) * HEIGHT);\n }\n\n /**\n * Handles palette's focus.\n *\n * @param {Event} e - Focusout or Focusin.\n */\n const handleFocus = e => {\n // Update class condition removes class if its false,\n // add class if true.\n let cond = false;\n // If palette lose focus, remove the focus class,\n // and remove browser keyboard focus.\n if (e.type === FOCUS_OUT) {\n el.blur();\n } else {\n cond = ! isDragging;\n }\n\n updateClass(el, FOCUS_CLASSNAME, cond);\n }\n\n /**\n * Handles picking color using keyboard.\n *\n * @param {Event} e - Keydown.\n */\n const handleKeyboard = e => {\n\n // Add focus class.\n updateClass(el, FOCUS_CLASSNAME, true);\n\n let key = e.key;\n\n if (moveX[key] || moveY[key]) {\n e.preventDefault();\n\n updateDimensions();\n\n let {x, y} = marker._getPosition();\n let markerX = x, markerY = y;\n // Amount of pixel to move marker horizontally using keyboard.\n let stepX = WIDTH / 100;\n // Amount of pixel to move marker vertically using keyboard.\n let stepY = HEIGHT / 100;\n\n x += (moveX[key] || 0) * stepX;\n y += (moveY[key] || 0) * stepY;\n\n // Make sure x and y don't go out of bounds.\n x = x > WIDTH ? WIDTH : x < 0 ? 0 : x;\n y = y > HEIGHT ? HEIGHT : y < 0 ? 0 : y;\n\n // If the marker changes its position then calculate and set the color.\n if (x !== markerX || y !== markerY) {\n updateColor(x, y);\n }\n }\n }\n\n\n /**\n * Updates palette's width and height values.\n *\n * @param {Object} bounds - Palette's Bounding rect.\n */\n const updateDimensions = bounds => {\n ({ width: WIDTH, height: HEIGHT } = bounds || getBounds(el));\n }\n\n /**\n * Bind events.\n */\n bindEvent(listeners, el, [MOUSE_DOWN, TOUCH_START], dragStart);\n bindEvent(listeners, ROOT, [MOUSE_MOVE, TOUCH_MOVE], dragMove, { passive: false });\n bindEvent(listeners, ROOT, [MOUSE_UP, TOUCH_END, TOUCH_CANCEL], dragEnd);\n bindEvent(listeners, el, [FOCUS_OUT, FOCUS_IN], handleFocus);\n bindEvent(listeners, el, KEY_DOWN, handleKeyboard);\n\n return {\n $: el,\n marker,\n _setMarkerPosition,\n e: listeners\n }\n}","import { createElement, getBounds } from \"../utils/dom\";\n\n\nconst MARKER_CLASSNAME = 'alwan__marker';\n\n/**\n * Palette's marker.\n *\n * @param {HTMLElement} parent - Element to append to.\n * @returns {Object}\n */\nexport const Marker = parent => {\n\n /**\n * Marker.\n */\n const el = createElement('', MARKER_CLASSNAME, parent);\n\n /**\n * Marker dimensions.\n */\n const { width, height } = getBounds(el);\n\n /**\n * Cache center X coordinate.\n */\n let centerX = width / 2;\n\n /**\n * Cache center Y coordinate.\n */\n let centerY = height / 2;\n\n /**\n * Marker X coordinate.\n */\n let markerX = 0;\n\n /**\n * Marker Y coordinate.\n */\n let markerY = 0;\n\n /**\n * Moves marker to the x, y coordinates.\n *\n * @param {Number} x - X coordinate.\n * @param {Number} y - Y coordinate.\n */\n const _moveTo = (x, y) => {\n markerX = x;\n markerY = y;\n el.style.transform = `translate(${x - centerX}px, ${y - centerY}px)`;\n }\n\n /**\n * Gets marker coordinates.\n *\n * @returns {Object}\n */\n const _getPosition = () => ({ x: markerX, y: markerY });\n\n\n return {\n $: el,\n _moveTo,\n _getPosition\n }\n}","import { HSL_FORMAT, int, max, min, round } from \"../constants\";\nimport { isString } from \"../utils/util\";\n\n/**\n * Convert HSV to RGB.\n *\n * @param {Object} hsv - HSV color object.\n * @returns {Object}\n */\nexport const HSVToRGB = hsv => {\n\n let H = hsv.h / 60,\n S = hsv.s,\n V = hsv.v;\n\n /**\n * Helper function used for converting HSV to RGB.\n *\n * @param {Number} k - Positive Coefficient.\n * @param {Number} s - hSV Saturation.\n * @param {Number} v - HSV Value.\n * @returns {Number}\n */\n let fn = (k, s, v) => (v - v * s * max(0, min(k, 4 - k, 1))) * 255;\n\n return {\n r: round(fn((5 + H) % 6, S, V)),\n g: round(fn((3 + H) % 6, S, V)),\n b: round(fn((1 + H) % 6, S, V)),\n a: hsv.a\n }\n}\n\n\n/**\n * Convert RGB or HSL color objects to string.\n *\n * @param {Object} color - Color Object.\n * @param {string} format - Color format.\n * @returns {string}\n */\nexport const toString = (color, format) => {\n\n let colorString = color;\n\n if (! isString(color)) {\n\n let a = '',\n opacity = '',\n comma = ', ';\n \n if (color.a < 1) {\n a = 'a';\n opacity = comma + color.a;\n }\n\n let percent = format === HSL_FORMAT ? '%' : '';\n colorString = format + a + '(' + color[format[0]] + comma + color[format[1]] + percent + comma + color[format[2]] + percent + opacity + ')';\n }\n\n return colorString;\n}\n\n/**\n * Converts hex color string to RGB color object.\n *\n * @param {string} hexColor - Hexadecimal color string.\n * @returns {Object}\n */\nexport const HEXToRGB = hexColor => ({\n r: int(hexColor.slice(1, 3), 16),\n g: int(hexColor.slice(3, 5), 16),\n b: int(hexColor.slice(5, 7), 16),\n a: 1\n});\n\n\n/**\n * Converts a decimal number to hexadecimal number.\n * The result must be two digits.\n *\n * @param {Number} number Decimal number.\n * @returns {string}\n */\nconst toHex = number => {\n let hexNumber = number.toString(16);\n return hexNumber.length < 2 ? '0' + hexNumber : hexNumber;\n}\n\n\n/**\n * Converts RGB color object to Hex string color.\n *\n * @param {Object} rgb - RGB color object.\n * @returns {String}\n */\nexport const RGBToHEX = ({ r, g, b, a }) => '#' + toHex(r) + toHex(g) + toHex(b) + (a < 1 ? toHex(round(a * 255)) : '');\n\n\n/**\n * Converts HSV to HSL.\n *\n * @param {Object} hsv - HSV color object.\n * @returns {Object}\n */\nexport const HSVToHSL = (hsv, percentage) => {\n\n percentage = percentage ? '%' : 0;\n\n let v = hsv.v;\n let l = v * (1 - hsv.s / 2);\n let s = ! l || l === 1 ? 0 : (v - l) / min(l, 1 - l);\n\n return {\n h: hsv.h,\n s: round(s * 100) + percentage,\n l: round(l * 100) + percentage,\n a: round(hsv.a * 100) / 100\n }\n}\n\n/**\n * Converts HSL to HSV.\n *\n * @param {Object} hsl - HSL color object.\n * @returns {Object}\n */\nexport const HSLToHSV = (hsl) => {\n let s = hsl.s / 100,\n l = hsl.l / 100,\n v = l + s * min(l, 1 - l);\n\n return {\n h: hsl.h,\n s: v ? 2 * (1 - l / v) : 0,\n v,\n a: hsl.a\n }\n}\n\n\n/**\n * Converts RGB to HSV.\n *\n * @param {Object} rgb - RGB color object.\n * @returns {Object}\n */\nexport const RGBToHSV = rgb => {\n let R = rgb.r / 255,\n G = rgb.g / 255,\n B = rgb.b / 255,\n Cmax = max(R, G, B),\n Cmin = min(R, G, B),\n range = Cmax - Cmin,\n saturation = Cmax === 0 ? 0 : range / Cmax,\n hue = range === 0 ? 0\n : Cmax === R ? ((G - B) / range) % 6\n : Cmax === G ? ((B - R) / range) + 2\n : Cmax === B ? ((R - G) / range) + 4\n : 0;\n\n return {\n h: round( ( 360 + hue * 60 ) % 360 ),\n s: saturation,\n v: Cmax,\n a: round( rgb.a * 100 ) / 100\n }\n}","import { float, HSL_FORMAT, RGB_FORMAT, round } from \"../constants\";\nimport { createElement } from \"../utils/dom\";\nimport { boundNumber, normalizeHue } from \"../utils/util\";\nimport { HEXToRGB, toString } from \"./colors\";\n\nconst ctx = createElement('canvas').getContext('2d');\nconst HSL_REGEX = /^hsla?\\(\\s*([+-]?\\d*\\.?\\d+)(\\w*)?(?:(?:\\s+([+-]?\\d*\\.?\\d+)%\\s*([+-]?\\d*\\.?\\d+)%(?:\\s*\\/\\s*([+-]?\\d*\\.?\\d+%?))?)|(?:\\s*,\\s*([+-]?\\d*\\.?\\d+)%\\s*,\\s*([+-]?\\d*\\.?\\d+)%(?:\\s*,\\s*([+-]?\\d*\\.?\\d+%?))?))\\s*\\)?$/i;\nconst HEX_REGEX = /^#[0-9a-f]{6}$/i;\n\n\n/**\n * Parses a color string.\n *\n * @param {String} colorString - Color string.\n * @param {Boolean} asString - Return color as a string or object.\n * @returns {Object}\n */\nexport const parseColor = (colorString, asString) => {\n\n let _color;\n let _format;\n\n colorString = colorString.trim();\n /**\n * Parse hsl.\n * No need to parse it if it's shorter than the minimum hsl string length,\n * the minimum is 10 characters, e.g. hsl(0 0%0%.\n */\n if (colorString.length >= 10) {\n\n const channels = colorString.match(HSL_REGEX);\n\n if (channels) {\n let h = float(channels[1]),\n angle = channels[2],\n s = boundNumber(channels[3] || channels[6]),\n l = boundNumber(channels[4] || channels[7]),\n a = channels[5] || channels[8];\n\n /**\n * The hue value is so often given in degrees, it can be given as a number, however\n * it might has a unit 'turn', 'rad' (radians) or 'grad' (gradians),\n * If the hue has a unit other than deg, then convert it to degrees.\n */\n h *= angle === 'turn' ? 360\n : angle === 'rad' ? 180 / PI\n : angle === 'grad' ? 0.9\n : 1;\n\n // Make sure hue is between 0 and 360.\n h = normalizeHue(h);\n\n // Alpha value must be between 0 and 1.\n a = a ? boundNumber(a.slice(-1) === '%' ? float(a) / 100 : a, 1) : 1;\n\n _color = { h, s, l, a };\n _format = HSL_FORMAT;\n }\n }\n\n // colorString is not an HSL string.\n if (! _color) {\n\n ctx.fillStyle = '#000';\n ctx.fillStyle = colorString;\n colorString = ctx.fillStyle;\n // ColorString is either hex or rgb string,\n // if it's hex convert it to rgb object,\n // if it's rgb then parse it to object.\n if (HEX_REGEX.test(colorString)) {\n _color = HEXToRGB(colorString);\n } else {\n // Parse RGB string.\n let [r, g, b, a] = colorString.match(/\\((.+)\\)/)[1]\n .split(',')\n .map(value => float(value));\n\n _color = {\n r,\n g,\n b,\n a: a ? round(a * 100) / 100 : 1,\n }\n }\n\n _format = RGB_FORMAT;\n }\n\n return asString ? toString(_color, _format) : { _color, _format };\n}","import { App } from \"../components/App\";\nimport { Inputs } from \"../components/Inputs\";\nimport { Palette } from \"../components/Palette\";\nimport { Preview } from \"../components/Preview\";\nimport { Reference } from \"../components/Reference\";\nimport { Sliders } from \"../components/Sliders\";\nimport { Swatches } from \"../components/Swatches\";\nimport { createElement } from \"../utils/dom\";\n\n\nconst CONTAINER_CLASSNAME = 'alwan__container';\n\n/**\n * Create and initialize components.\n *\n * @param {Element} reference - Picker Reference element.\n * @param {Object} alwan - Alwan Instance.\n * @returns {Object}\n */\nexport const createComponents = (reference, alwan) => {\n\n /**\n * Creates a container element.\n *\n * @param {HTMLElement} parent - Element to append the created container to.\n * @returns {HTMLElement}\n */\n const createContainer = (parent) => createElement('', CONTAINER_CLASSNAME, parent);\n\n\n let ref = Reference(reference, alwan);\n let app = App(alwan);\n\n let root = app.$;\n\n let palette = Palette(root, alwan);\n\n let container = createContainer(root);\n \n let preview = Preview(container, alwan);\n let sliders = Sliders(container, alwan);\n let inputs = Inputs(createContainer(root), alwan);\n let swatches = Swatches(root, alwan);\n\n return {\n ref,\n app,\n palette,\n preview,\n sliders,\n inputs,\n swatches\n }\n}","import { BUTTON, CLICK } from \"../constants\";\nimport { bindEvent, unbindEvent } from \"../core/events/EventBinder\";\nimport { createElement, replaceElement, setVisibility, updateClass } from \"../utils/dom\";\n\n\nconst PRESET_BUTTON_CLASSNAME = 'lw-ref';\n\n/**\n * Creates a Reference component.\n *\n * @param {Element} originalRef - User Reference Element.\n * @returns {Object}\n */\nexport const Reference = (originalRef, alwan) => {\n\n /**\n * Reference API.\n */\n const self = {\n $: originalRef,\n /**\n * Reference Events.\n */\n e: [],\n /**\n * Sets/Unsets the pre-styled button.\n *\n * @param {Object} options - Picker options.\n */\n _init(options) {\n let { preset, classname } = options;\n let { $: ref, e: events } = self;\n\n events = unbindEvent(events, ref);\n \n if (preset !== (ref !== originalRef)) {\n ref = preset ?\n // Replace the user provided reference element with a preset button.\n replaceElement( createElement(BUTTON, PRESET_BUTTON_CLASSNAME, null, { type: BUTTON, id: originalRef.id }), originalRef)\n // Set back user reference element.\n : replaceElement(originalRef, ref);\n }\n\n // Add classes in the reference element.\n if (classname) {\n classname.split(/\\s+/).map(cls => { updateClass(ref, cls, true) });\n }\n\n // Add click event to reference.\n bindEvent(events, ref, CLICK, togglePicker);\n self.$ = ref;\n self.e = events;\n }\n }\n\n /**\n * Toggle picker.\n *\n * @param {Event} e - Click.\n */\n const togglePicker = e => {\n alwan.toggle();\n }\n\n return self;\n}","import { BUTTON, BUTTON_CLASSNAME, CLICK, FOCUS_CLASSNAME, FOCUS_IN, FOCUS_OUT, MOUSE_LEAVE, SVG } from \"../constants\";\nimport { bindEvent } from \"../core/events/EventBinder\";\nimport { checkSVGAttrs, clipboardSVGAttrs } from \"../lib/svg\";\nimport { createElement, removeElement, setElementsHTML, setVisibility, updateClass } from \"../utils/dom\";\n\nconst PREVIEW_CLASSNAME = 'alwan__preview';\nconst MARGIN_CLASSNAME = 'lw-mr';\n\n/**\n * Preview component.\n *\n * @param {Element} parent - Element to append preview are to.\n * @param {Object} alwan - Instance.\n * @returns {Object}\n */\nexport const Preview = (parent, alwan) => {\n\n /**\n * Copy state.\n */\n let isCopied = false;\n\n /**\n * Preview area wrapper element.\n */\n const container = createElement('', MARGIN_CLASSNAME, parent);\n\n /**\n * Preview API.\n */\n const self = {\n /**\n * Preview events.\n */\n e: [],\n\n /**\n * Init. Preview, copy button.\n *\n * @param {Object} options - Picker options.\n */\n _init(options) {\n let { preview, copy } = options;\n let previewArea = self.$;\n let copyButton = self.cp;\n\n // Either preview option is true and previewArea doen't exist,\n // or preview option is false and previewArea does exist.\n if (preview !== !!previewArea) {\n\n previewArea = preview ? createElement('', PREVIEW_CLASSNAME, container) : removeElement(previewArea, true);\n \n if (copy && copyButton) {\n (previewArea || container).appendChild(copyButton);\n }\n }\n\n if (! copy) {\n copyButton = removeElement(copyButton, true);\n } else if (! copyButton) {\n copyButton = createElement(BUTTON, BUTTON_CLASSNAME, previewArea || container, { type: BUTTON }, thisButton => {\n updateSVG(thisButton);\n });\n }\n\n // Hide container if both copyButton and previewArea don't exist,\n setVisibility(container, copyButton || previewArea);\n\n self.$ = previewArea;\n self.cp = copyButton;\n }\n }\n\n\n /**\n * Sets a SVG icon for the copy button.\n *\n * @param {HTMLElement} button - Button.\n */\n const updateSVG = (button) => {\n button = button || self.cp;\n // Remove button content.\n setElementsHTML(button);\n createElement(SVG, '', button, isCopied ? checkSVGAttrs : clipboardSVGAttrs);\n }\n\n /**\n * Copies selected color to the clipboard then updates copy,\n * button's Icon and styles.\n *\n * @param {Event} e - Click or Focusin or Focusout or Mouseleave.\n */\n const copyColorAndUpdateView = e => {\n if (self.cp && ! alwan.config.disabled) {\n let type = e.type;\n let isFocusIn = type === FOCUS_IN;\n\n // On click copy color and update svg to display a Check icon.\n if (! isCopied && type === CLICK) {\n alwan._s._copyColor();\n isCopied = true;\n updateSVG();\n }else {\n // On focus add a focus class.\n if (! isFocusIn) {\n // If the copy button lose focus or mouse leaves it,\n // then reset the svg to a Clipboard icon.\n if (isCopied) {\n isCopied = false;\n updateSVG();\n }\n }\n\n updateClass(self.cp, FOCUS_CLASSNAME, isFocusIn);\n }\n }\n }\n\n /**\n * Events binding.\n */\n bindEvent(self.e, container, [CLICK, MOUSE_LEAVE, FOCUS_IN, FOCUS_OUT], copyColorAndUpdateView);\n\n return self;\n}","import { CHANGE, COLOR, INPUT } from \"../constants\";\nimport { bindEvent } from \"../core/events/EventBinder\";\nimport { createElement, removeElement } from \"../utils/dom\";\n\n/**\n * Sliders component constants.\n */\nconst SLIDER_CLASSNAME = 'alwan__slider';\nconst HUE_SLIDER_CLASSNAME = SLIDER_CLASSNAME + ' ' + SLIDER_CLASSNAME + '--hue';\nconst ALPHA_SLIDER_CLASSNAME = SLIDER_CLASSNAME + ' ' + SLIDER_CLASSNAME + '--alpha'; \nconst WIDTH_CLASSNAME = 'lw-w100';\n\n/**\n * Picker sliders.\n *\n * @param {Element} parent - Element to append sliders to.\n * @param {Object} alwan - Alwan instance.\n * @returns {Object}\n */\nexport const Sliders = (parent, alwan) => {\n\n /**\n * Sliders wrapper element.\n */\n const container = createElement('', WIDTH_CLASSNAME, parent);\n\n /**\n * Color state updater.\n */\n const updateColor = alwan._s._update;\n\n /**\n * Builds a slider.\n *\n * @param {String} className - Slider classname.\n * @param {Number} max - Slider max value.\n * @param {Number} step - Slider step.\n * @returns {HTMLElement}\n */\n const build = (className, max, step) => \n createElement(INPUT, className, container, { type: 'range', max, step });\n \n /**\n * Component API.\n */\n const self = {\n /**\n * Sliders events.\n */\n e: [],\n\n hue: build(HUE_SLIDER_CLASSNAME, 360),\n alpha: null,\n\n /**\n * Init. Sliders.\n *\n * @param {Object} options - New options.\n */\n _init({ opacity }) {\n\n let alpha = self.alpha;\n\n if (opacity !== !!alpha) {\n self.alpha = opacity ? build(ALPHA_SLIDER_CLASSNAME, 1, 0.01)\n : removeElement(alpha, true) || updateColor({ a: 1 });\n }\n },\n\n /**\n * Sets sliders values.\n *\n * @param {Object} hsv - HSV color object.\n */\n _setValue(hsv) {\n let { alpha, hue } = self;\n hue.value = 360 - hsv.h;\n alpha && (alpha.value = hsv.a);\n }\n }\n\n /**\n * Handles changes in a slider value.\n *\n * @param {Event} e - Input or Change event.\n */\n const handleChange = e => {\n let slider = e.target;\n let value = slider.valueAsNumber;\n let hsv = {};\n\n if (slider === self.hue) {\n hsv.h = 360 - value;\n } else {\n hsv.a = value;\n }\n\n updateColor(hsv);\n // Either fire change or color event.\n alwan._e._emit(e.type === CHANGE ? CHANGE : COLOR, slider);\n }\n\n /**\n * Events binding.\n */\n bindEvent(self.e, container, [INPUT, CHANGE], handleChange);\n\n return self;\n}","import { BUTTON, BUTTON_CLASSNAME, CHANGE, CLICK, COLOR, COLOR_FORMATS, ENTER, FOCUS_IN, HEX_FORMAT, INPUT, KEY_DOWN, max, SVG } from \"../constants\";\nimport { bindEvent } from \"../core/events/EventBinder\";\nimport { switchSVGAttrs } from \"../lib/svg\";\nimport { createElement, removeElement, setElementsHTML, setVisibility } from \"../utils/dom\";\nimport { objectIterator } from \"../utils/object\";\n\n/**\n * Inputs constants.\n */\nconst INPUTS_CLASSNAME = 'alwan__inputs';\nconst INPUT_CLASSNAME = 'alwan__input';\nconst LABEL_CLASSNAME = 'lw-label';\n\n/**\n * Inputs component.\n *\n * @param {Element} parent - Element to append the inputs container element to.\n * @param {Object} alwan - Alwan instance.\n * @returns {Object}\n */\nexport const Inputs = (parent, alwan) => {\n\n /**\n * Inputs wrapper element.\n */\n let container;\n\n /**\n * Switch button.\n * @type {Element}\n */\n let switchButton;\n\n /**\n * Picker formats.\n */\n let formats = [];\n\n /**\n * Index of the current format.\n */\n let formatIndex;\n\n /**\n * Array of inputs.\n */\n let inputList;\n\n /**\n * Event listeners.\n */\n let listeners = [];\n\n const { config, _s: colorState, _e: { _emit } } = alwan;\n\n /**\n * Component API.\n */\n const self = {\n /**\n * Init. Inputs.\n *\n * @param {Object} options - Options.\n */\n _init(options) {\n let { inputs, format } = options;\n let length;\n\n // Get only valid formats.\n formats = COLOR_FORMATS.filter(format => inputs[format]);\n length = formats.length;\n\n if (! length) {\n // No input, remove inputs.\n container = removeElement(container, true);\n switchButton = removeElement(switchButton, true);\n // Normalize format value.\n format = COLOR_FORMATS.includes(format) ? format : COLOR_FORMATS[0];\n } else {\n\n if (! container) {\n container = createElement('', INPUTS_CLASSNAME, parent);\n }\n\n if (length === 1) {\n switchButton = removeElement(switchButton, true);\n } else if (!switchButton) {\n // For more than one input format, add a switch button.\n switchButton = createElement(BUTTON, BUTTON_CLASSNAME, parent, { type: BUTTON }, (thisButton) => {\n createElement(SVG, '', thisButton, switchSVGAttrs);\n });\n }\n\n formatIndex = max(formats.indexOf(format), 0);\n format = formats[formatIndex];\n }\n config.format = format;\n build(format);\n // Show/Hide parent container.\n setVisibility(parent, length);\n },\n\n /**\n * Updates Input(s) value(s).\n *\n * @param {Object} color - Color object.\n */\n _setValue(color) {\n objectIterator(self.$, (input, key) => {\n input.value = color[key];\n });\n }\n }\n\n /**\n * Build Inputs.\n */\n const build = (format) => {\n\n self.$ = {};\n inputList = [];\n\n if (container) {\n let { singleInput, opacity } = config;\n // Each letter in the format variable represent a color channel,\n // For multiple inputs, each color channel has an input field.\n // e.g. for 'rgb' format fields array is [r, g, b] or [r, g, b, a] if opacity is true.\n let fields = singleInput || format == HEX_FORMAT ? [format]\n : (format + (opacity ? 'a' : '')).split('');\n\n // Empty the container from any inputs.\n setElementsHTML(container);\n\n fields.forEach((field, index) => {\n /**\n * Create Input.\n * \n * \n */\n createElement('label', LABEL_CLASSNAME, container, false, (label => {\n self.$[field] = inputList[index] = createElement(INPUT, INPUT_CLASSNAME, label, { type: 'text' });\n createElement('span', '', label, { text: field });\n }));\n });\n\n colorState._update({});\n }\n }\n\n /**\n * Handles changes in inputs.\n *\n * @param {Event} e - Input event.\n */\n const handleChange = e => {\n let value = e.target.value;\n\n if (value.trim()) {\n let colorString = '';\n let format = formats[formatIndex];\n \n if (config.singleInput || format === HEX_FORMAT) {\n colorString = value;\n } else {\n // InputList has 3 or 4 inputs, Input for each color channel in the hsl and rgb,\n // format, the reduce method adds comma between each input value.\n // [30, 20, 10, 0.5] => '30,20,10,0.5'\n colorString = format + '(' + inputList.reduce((string, currentInput) => (string && string + ',') + currentInput.value, '') + ')';\n }\n\n if (colorState._updateFromString(colorString, self)) {\n _emit(COLOR, self.$);\n }\n }\n }\n\n /**\n * Changes color format.\n *\n * @param {Event} e - Click event.\n */\n const changeFormat = e => {\n if (e.target === switchButton) {\n // Increment input format index, reset it if it reaches the end.\n // this index will point to the next format.\n formatIndex = (formatIndex + 1) % formats.length;\n config.format = formats[formatIndex];\n build(formats[formatIndex]);\n }\n }\n\n /**\n * Triggers change event when the color changes.\n *\n * @param {Event} e - Focusin or Change.\n */\n const triggerChangeEvent = e => {\n if (e.type === FOCUS_IN) {\n // Save color state, when inputs receive focus.\n colorState._colorStart();\n } else {\n // Trigger change event if color state is changed.\n colorState._triggerChange(self.$);\n }\n }\n\n /**\n * Closes picker.\n *\n * @param {Event} e - Keydown.\n */\n const closePicker = e => {\n if (e.key === ENTER) {\n alwan.close();\n }\n }\n\n /**\n * Bind events.\n */\n bindEvent(listeners, parent, CLICK, changeFormat);\n bindEvent(listeners, parent, INPUT, handleChange);\n bindEvent(listeners, parent, [FOCUS_IN, CHANGE], triggerChangeEvent);\n bindEvent(listeners, parent, KEY_DOWN, closePicker);\n\n self.e = listeners;\n\n return self;\n}","import { BUTTON, CLICK, COLOR_PROPERTY, int } from \"../constants\";\nimport { bindEvent } from \"../core/events/EventBinder\";\nimport { parseColor } from \"../lib/parser\";\nimport { createElement, getParent, removeElement, setCustomProperty, setElementsHTML, setVisibility } from \"../utils/dom\";\nimport { setColorAndTriggerEvents } from \"../utils/util\";\n\n/**\n * Swatches constants.\n */\nconst SWATCHES_CLASSNAME = 'alwan__swatches';\nconst SWATCHE_CLASSNAME = 'alwan__swatch';\n\n/**\n * Swatches component.\n *\n * @param {Element} parent - Element to append the palette element to.\n * @param {Object} alwan - Picker Instance.\n * @returns {Object}\n */\nexport const Swatches = (parent, alwan) => {\n\n /**\n * Buttons wrapper element.\n */\n let container = createElement('', SWATCHES_CLASSNAME, parent);\n\n /**\n * Swatches array.\n */\n let swatches;\n\n /**\n * Creates a swatch button.\n *\n * @param {String} color - Swatch Color.\n * @returns {Element}\n */\n const createSwatchButton = color => createElement(BUTTON, SWATCHE_CLASSNAME, container, {\n type: BUTTON,\n }, button => { setCustomProperty(button, COLOR_PROPERTY, parseColor(color, true)) });\n\n /**\n * Swatches API.\n */\n const self = {\n /**\n * Swatches events.\n */\n e: [],\n\n /**\n * Initialize swatches.\n *\n * @param {Object} options - Alwan options.\n */\n _init(options) {\n let buttons = [];\n swatches = options.swatches;\n \n setVisibility(container, swatches);\n // Empty the container from all swatch buttons.\n setElementsHTML(container);\n \n swatches.forEach((color, index) => {\n buttons[index] = createSwatchButton(color);\n });\n\n self.$ = buttons;\n },\n /**\n * Adds a swatch button.\n *\n * @param {String} color - Color.\n */\n _add(color) {\n let index = swatches.push(color) - 1;\n self.$[index] = createSwatchButton(color);\n \n // If swatches array is empty, hide container.\n setVisibility(container, swatches);\n },\n /**\n * Removes a swatch button.\n *\n * @param {String|Number} swatch - Color or Swatch Index.\n */\n _remove(swatch) {\n let index = swatches.findIndex((color, index) => swatch === color || int(swatch) === index);\n let swatchButtons = self.$;\n\n if (index > -1) {\n // Remove color from swatches array.\n swatches.splice(index, 1);\n // Remove swatch button.\n removeElement(swatchButtons[index]);\n swatchButtons.splice(index, 1);\n\n // If swatches array is empty then hide the container.\n setVisibility(container, swatches);\n }\n }\n };\n\n /**\n * Sets color from a swatch button.\n *\n * @param {Event} e - Click.\n */\n const setColorFromSwatch = e => {\n let target = e.target;\n\n if (getParent(target) === container) {\n setColorAndTriggerEvents(alwan, target.style.getPropertyValue('--' + COLOR_PROPERTY), target);\n }\n }\n\n /**\n * Bind events.\n */\n bindEvent(self.e, parent, CLICK, setColorFromSwatch);\n\n return self;\n}","import { CHANGE, COLOR_PROPERTY, HEX_FORMAT, HSL_FORMAT, HSV_FORMAT, HTML, INPUT, RGB_FORMAT, ROOT } from \"../constants\";\nimport { HSLToHSV, HSVToHSL, HSVToRGB, RGBToHEX, RGBToHSV, toString } from \"../lib/colors\";\nimport { parseColor } from \"../lib/parser\";\nimport { createElement, removeElement, setCustomProperty } from \"../utils/dom\";\nimport { isEqual, merge, objectIterator } from \"../utils/object\";\nimport { isset, isString } from \"../utils/util\";\n\n/**\n * Color state.\n *\n * @param {Object} alwan - Alwan instance.\n * @returns {Object}\n */\nexport const ColorState = (alwan) => {\n\n /**\n * HSV color object.\n */\n let HSV = {\n h: 0,\n s: 0,\n v: 0,\n a: 1\n }\n\n /**\n * RGB color object.\n */\n let RGB = HSVToRGB(HSV);\n\n /**\n * RGB string.\n */\n let rgbString = '';\n\n /**\n * Color object used for detecting a color change.\n */\n let colorStart;\n\n \n let { config, _e: event } = alwan;\n\n /**\n * Gets color object.\n *\n * @param {String} format - Color format.\n * @param {Boolean} asString - Get color as a string.\n * @returns {Object}\n */\n const getColorByFormat = (format, asString) => {\n format = format || config.format;\n\n let isHex = format === HEX_FORMAT;\n let color = isHex ? RGBToHEX(RGB)\n : format === HSL_FORMAT ? HSVToHSL(HSV, !asString)\n : RGB;\n\n return asString || isHex ? { [format]: toString(color, format) } : color;\n }\n\n /**\n * Outputs a color object.\n *\n * @param {Object} colorObject - RGB, HSL or HSV color object.\n * @param {String} colorString - Color string.\n * @param {String} format - Color format.\n * @param {Boolean} asArray - Output color values in an array.\n * @returns {Ojbect|Array}\n */\n const output = (colorObject, colorString, format, asArray) => {\n if (config.opacity) {\n format += 'a';\n }\n\n let output = asArray ? [] : {};\n\n if (format !== HSV_FORMAT) {\n output.toString = () => colorString || toString(colorObject, format);\n }\n\n /**\n * This puts colorObject values in an object or an array.\n *\n * @param {Object|Array} color - The output color.\n * @param {String} channel - Color channel.\n * @param {index} index - Array index.\n */\n return format.split('').reduce((color, channel, index) => {\n\n color[asArray ? index : channel] = colorObject[channel];\n\n return color;\n\n }, output);\n }\n\n return {\n /**\n * Updates color and UI.\n *\n * @param {Object} newHSV - HSV color object.\n * @param {Object|Boolean} updater - Exclude some components from updating.\n * @param {Object} rgb - RGB color object.\n */\n _update(newHSV, updater, rgb) {\n if (! config.disabled) {\n merge(HSV, newHSV);\n RGB = rgb || HSVToRGB(HSV);\n rgbString = toString(RGB, RGB_FORMAT);\n \n let components = alwan._c;\n let { palette, sliders, inputs } = components;\n \n // Preview color.\n setCustomProperty(components.preview.$, COLOR_PROPERTY, rgbString);\n setCustomProperty(components.ref.$, COLOR_PROPERTY, rgbString);\n // Change the gradient color stop of the alpha slider.\n (updater || ! isset(newHSV.a)) && setCustomProperty(sliders.alpha, RGB_FORMAT, RGB.r + ',' + RGB.g + ',' + RGB.b);\n // Set palette's hue.\n isset(newHSV.h) && setCustomProperty(palette.$, 'hue', HSV.h);\n \n if (updater !== inputs) {\n inputs._setValue( getColorByFormat('', config.singleInput) );\n }\n \n if (updater) {\n sliders._setValue(HSV);\n palette._setMarkerPosition(HSV);\n }\n }\n },\n\n /**\n * Updates color by a string instead of HSV object.\n *\n * @param {String} colorString - Color string.\n * @param {Boolean|Object} updater - Exclude some components from updating.\n */\n _updateFromString(colorString, updater) {\n if (isString(colorString)) {\n let { _color: parsedColor, _format: format } = parseColor(colorString);\n let currentColor = getColorByFormat(format);\n let isChanged = ! isEqual(parsedColor, currentColor);\n let rgb, hsv;\n \n if (isChanged) {\n \n if (format === HSL_FORMAT) {\n hsv = HSLToHSV(parsedColor);\n } else {\n rgb = parsedColor;\n hsv = RGBToHSV(parsedColor);\n }\n \n this._update(hsv, updater, rgb);\n }\n \n return isChanged;\n }\n },\n\n /**\n * Copies color to the clipboard.\n *\n * @returns {Boolean}\n */\n _copyColor() {\n objectIterator(getColorByFormat('', true), color => {\n let clipboard = navigator.clipboard;\n \n if (clipboard) {\n clipboard.writeText(color);\n } else {\n // Incase browser doesn't support navigator.clipboard,\n // Create a new input element and append it to the body,\n // set its value as the color.\n createElement(INPUT, '', HTML, null, input => {\n \n input.value = color;\n input.select();\n ROOT.execCommand('copy');\n \n // Color text is copied so remove the input.\n removeElement(input);\n });\n }\n });\n },\n\n /**\n * Picker value.\n */\n _colorOutput: {\n [HSV_FORMAT]: () => output(HSV, '', HSV_FORMAT, false),\n [RGB_FORMAT]: asArray => output(RGB, rgbString, RGB_FORMAT, asArray),\n [HSL_FORMAT]: asArray => output(HSVToHSL(HSV), '', HSL_FORMAT, asArray),\n [HEX_FORMAT]: () => RGBToHEX(RGB)\n },\n \n /**\n * Set color start.\n */\n _colorStart() {\n colorStart = getColorByFormat();\n },\n\n /**\n * Triggers change event if colorStart doesn't equal to the current color.\n *\n * @param {Element} source - Element that changed color state.\n */\n _triggerChange(source) {\n if (! isEqual(colorStart, getColorByFormat())) {\n event._emit(CHANGE, source);\n }\n }\n }\n}","\nimport { getElement, removeElement } from \"./utils/dom\";\nimport { merge, objectIterator } from \"./utils/object\";\nimport { defaults } from \"./defaults\";\nimport { createComponents } from \"./core\";\nimport { ColorState } from \"./core/colorState\";\nimport { boundNumber, isString, normalizeHue, setColorAndTriggerEvents } from \"./utils/util\";\nimport { HEX_FORMAT, HSL_FORMAT, HSV_FORMAT, RGB_FORMAT } from \"./constants\";\nimport { HSVToHSL, HSVToRGB, RGBToHEX, toString } from \"./lib/colors\";\nimport { EventListener } from \"./core/events/EventListener\";\nimport { binder } from \"./core/events/EventBinder\";\nimport '../sass/alwan.scss';\n\n\nexport default class Alwan {\n\n static version = VERSION;\n\n /**\n * Alwan defaults.\n */\n static defaults = defaults;\n\n /**\n * Alwan instance constructor.\n *\n * @param {String|Element} reference - The reference element.\n * @param {Object} options - Options.\n */\n constructor(reference, options) {\n\n const alwan = this;\n\n reference = getElement(reference);\n\n /**\n * Settings.\n */\n alwan.config = merge({}, Alwan.defaults, options);\n\n /**\n * Event Listeners.\n */\n alwan._e = EventListener(alwan);\n\n /**\n * Color state.\n */\n alwan._s = ColorState(alwan);\n\n /**\n * Components.\n */\n alwan._c = createComponents(reference, alwan);\n\n /**\n * Initialize components.\n */\n alwan._c.app._setup(alwan.config);\n }\n\n /**\n * Sets new options.\n *\n * @param {Object} options - Alwan options.\n */\n setOptions(options) {\n this._c.app._setup(options);\n }\n\n /**\n * Gets the state of the picker whether it's opened or closed.\n *\n * @returns {Boolean}\n */\n isOpen() {\n return this._c.app._isOpen();\n }\n\n /**\n * Opens the picker.\n */\n open() {\n this._c.app._open();\n }\n\n /**\n * Closes the picker.\n */\n close() {\n this._c.app._close();\n }\n\n /**\n * Toggles (opens/closes) the picker.\n */\n toggle() {\n this._c.app._toggle();\n }\n\n /**\n * Attaches an event handler function for an event.\n *\n * @param {String} type - Event type.\n * @param {CallableFunction} handler - Event handler.\n */\n on(type, handler) {\n this._e._on(type, handler);\n }\n\n /**\n * Detaches one or more event handlers.\n *\n * Note:\n * omitting handler, remove all handlers from the event,\n * omitting both event type and handler, remove all handlers that are,\n * attached to all events.\n *\n * @param {String} type - Event type.\n * @param {CallableFunction} handler - Event handler.\n */\n off(type, handler) {\n this._e._off(type, handler);\n }\n\n /**\n * Sets a color.\n *\n * @param {String|Object} color - Color.\n */\n setColor(color) {\n\n let alwan = this;\n let format;\n\n if (! isString(color)) {\n // Get color format from color object.\n format = [RGB_FORMAT, HSL_FORMAT, HSV_FORMAT].find(format => format.split('')\n .every(channel => ! isNaN(color[channel]) && color[channel] !== ''));\n if (format) {\n if (color.a == null) {\n color.a = 1;\n }\n\n if (format === HSV_FORMAT) {\n alwan._s._update({\n h: normalizeHue(color.h),\n s: boundNumber(color.s) / 100,\n v: boundNumber(color.v) / 100,\n a: color.a\n }, true);\n } else {\n color = toString(color, format);\n }\n }\n }\n\n alwan._s._updateFromString(color, true);\n\n return alwan;\n }\n\n /**\n * Gets color.\n *\n * @returns {Object}\n */\n getColor() {\n return this._s._colorOutput;\n }\n\n /**\n * Adds a swatch.\n *\n * @param {String} color - Color.\n */\n addSwatch(color) {\n this._c.swatches._add(color);\n }\n\n /**\n * Removes a swatch.\n *\n * @param {String|Number} swatch - Can a color string or it's index in the swatches array.\n */\n removeSwatch(swatch) {\n this._c.swatches._remove(swatch);\n }\n\n /**\n * Enables picker.\n */\n enable() {\n this._c.app._setDisable(false);\n }\n\n /**\n * Disables picker.\n */\n disable() {\n this._c.app._setDisable(true);\n }\n\n /**\n * Resets to default color.\n */\n reset() {\n setColorAndTriggerEvents(this, this.config.default);\n }\n\n /**\n * Repositions picker if it's displayed as a popover.\n */\n reposition() {\n this._c.app._reposition();\n }\n\n /**\n * Executes all handlers attached to the specified event.\n *\n * @param {String} type - Event type.\n */\n trigger(type) {\n this._e._emit(type);\n }\n\n /**\n * Destroy picker and free up memory.\n */\n destroy() {\n\n let alwan = this;\n let components = alwan._c;\n\n // Initialize the reference element back.\n components.ref._init({ preset: false });\n\n // Remove root element from the dom.\n removeElement(components.app.$);\n\n // Remove all events.\n objectIterator(components, components => {\n components.e.forEach(listener => {\n binder(listener, true);\n });\n });\n\n // Remove all properties of this instance.\n objectIterator(alwan, (value, key) => {\n delete alwan[key];\n });\n\n // Empty instance prototype.\n Object.setPrototypeOf(alwan, Object.prototype);\n }\n}","import { CHANGE, CLOSE, COLOR, OPEN } from \"../../constants\";\nimport { objectIterator } from \"../../utils/object\";\n\n/**\n * Picker Events.\n *\n * @returns {Object}\n */\nexport const EventListener = (alwan) => {\n\n /**\n * Picker event listeners.\n */\n const listeners = {\n [OPEN]: [],\n [CLOSE]: [],\n [CHANGE]: [],\n [COLOR]: []\n }\n\n return {\n /**\n * Emits an event.\n *\n * @param {String} type - Event type.\n * @param {Element|Object} source - Event Source.\n */\n _emit: (type, source) => {\n if (! alwan.config.disabled && listeners[type]) {\n listeners[type].forEach(handler => {\n if (type === COLOR || type === CHANGE) {\n handler(alwan._s._colorOutput, source || alwan);\n } else {\n handler();\n }\n });\n }\n },\n\n /**\n * Adds an event listener.\n *\n * @param {String} type - Event type.\n * @param {CallableFunction} handler - Event handler.\n */\n _on: (type, handler) => {\n listeners[type] && listeners[type].push(handler);\n },\n\n /**\n * Remove event listener(s).\n *\n * @param {String} type - Event type.\n * @param {CallableFunction} handler - Event handler.\n */\n _off: (type, handler) => {\n let handlersArray = listeners[type];\n\n if (handlersArray) {\n // Remove the handler if it's specified,\n // Remove all handlers of this event if handler is omitted.\n listeners[type] = handler ? handlersArray.filter(attachedHandler => attachedHandler !== handler) : [];\n } else if (type == null) {\n objectIterator(listeners, (handlers, type) => {\n listeners[type] = [];\n });\n }\n }\n }\n}"],"names":["root","factory","exports","module","define","amd","self","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","ROOT","document","HTML","documentElement","BUTTON","SVG","OPEN","CLOSE","COLOR","CLICK","MOUSE_DOWN","SCROLL","KEY_DOWN","INPUT","CHANGE","FOCUS_IN","FOCUS_OUT","HEX_FORMAT","RGB_FORMAT","HSL_FORMAT","HSV_FORMAT","FOCUS_CLASSNAME","BUTTON_CLASSNAME","COLOR_PROPERTY","REMOVE_METHOD","COLOR_FORMATS","max","min","round","abs","Math","float","parseFloat","int","parseInt","objectIterator","object","fn","merge","target","sources","assign","isEqual","object1","object2","value","isString","isset","boundNumber","number","upperBound","lowerBound","setColorAndTriggerEvents","alwan","color","source","_s","_updateFromString","emit","_e","_emit","normalizeHue","hue","getElement","ref","context","all","Element","createElement","tagName","className","parent","data","callback","ns","element","createElementNS","setElementsHTML","innerText","setAttributeNS","appendChild","getBounds","el","getBoundingClientRect","getParent","parentElement","replaceElement","newChild","oldChild","replaceChild","removeElement","destroy","removeChild","setCustomProperty","property","style","setProperty","setVisibility","cond","length","display","updateClass","classname","classList","html","innerHTML","defaults","id","theme","toggle","popover","position","margin","preset","default","disabled","format","singleInput","inputs","rgb","hex","hsl","opacity","preview","copy","swatches","binder","eventData","unbind","method","targetElement","events","handler","options","forEach","event","bindEvent","listeners","push","unbindEvent","filter","TOP","RIGHT","BOTTOM","LEFT","START","CENTER","END","WIDTH","HEIGHT","App","reference","popper","lastFocusableElement","config","colorState","body","e","isOpen","scrollableAncestors","updatePopper","_reposition","every","scrollable","isVisible","top","elTop","bottom","elBottom","scrollableTop","scrollableBottom","_close","popperEvents","eventBinder","window","handlesAccessibility","elementToFocus","type","shiftKey","palette","_c","$","contains","preventDefault","focus","_update","_open","silent","_setDisable","state","_setup","targetReference","component","init","_init","dataset","pop","domBounds","refBoundingRect","popBoundingRect","side","alignment","split","sides","alignments","setPosition","isVertical","centerPopElement","dimension","maxBoundary","left","right","clientWidth","clientHeight","some","domBoundary","refBound","space","hasSpace","refLowerBound","refUpperBound","lowerSpace","upperSpace","refDimension","popDimension","offset","placement","Popper","scrollableElements","overflow","getComputedStyle","getScrollableAncestors","insertAdjacentElement","_isOpen","_toggle","staticAttrs","focusable","svgAttrs","width","height","viewBox","clipboardSVGAttrs","checkSVGAttrs","switchSVGAttrs","Palette","tabindex","overlay","moveX","moveY","marker","centerX","centerY","markerX","markerY","_moveTo","x","y","transform","_getPosition","Marker","bounds","isDragging","updateColor","s","v","moveAndUpdateColor","touches","clientX","clientY","updateDimensions","_colorStart","passive","_triggerChange","blur","_setMarkerPosition","hsv","HSVToRGB","H","h","S","V","k","r","g","b","a","toString","colorString","comma","percent","toHex","hexNumber","RGBToHEX","HSVToHSL","percentage","l","ctx","getContext","HSL_REGEX","HEX_REGEX","parseColor","asString","_color","_format","trim","channels","match","angle","PI","slice","fillStyle","test","hexColor","map","createComponents","createContainer","originalRef","cls","togglePicker","Reference","app","container","isCopied","previewArea","copyButton","cp","thisButton","updateSVG","button","isFocusIn","_copyColor","Preview","sliders","build","step","SLIDER_CLASSNAME","alpha","_setValue","slider","valueAsNumber","Sliders","switchButton","formatIndex","inputList","formats","indexOf","includes","input","fields","field","index","label","text","reduce","string","currentInput","close","Inputs","createSwatchButton","buttons","_add","_remove","swatch","findIndex","swatchButtons","splice","getPropertyValue","Swatches","ColorState","colorStart","HSV","RGB","rgbString","getColorByFormat","isHex","output","colorObject","asArray","channel","newHSV","updater","components","parsedColor","currentColor","isChanged","HSLToHSV","R","G","B","Cmax","range","saturation","RGBToHSV","this","clipboard","navigator","writeText","select","execCommand","_colorOutput","Alwan","VERSION","constructor","_on","_off","handlersArray","attachedHandler","handlers","EventListener","setOptions","open","on","off","setColor","find","isNaN","getColor","addSwatch","removeSwatch","enable","disable","reset","reposition","trigger","listener","setPrototypeOf"],"sourceRoot":""}