@bornova/colorpicker 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +276 -0
- package/dist/browser/colorpicker.js +836 -0
- package/dist/browser/colorpicker.min.js +3 -0
- package/dist/browser/colorpicker.min.js.map +1 -0
- package/dist/colorpicker.css +598 -0
- package/dist/esm/colorpicker.js +886 -0
- package/dist/types/colors.d.ts +96 -0
- package/dist/types/dom.d.ts +22 -0
- package/dist/types/index.d.ts +18 -0
- package/dist/types/picker.d.ts +48 -0
- package/dist/types/settings.d.ts +132 -0
- package/package.json +51 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/* @bornova/colorpicker v1.0.0 */
|
|
2
|
+
var ColorPicker=function(){"use strict";const e={el:"[data-colorpicker]",parent:"body",theme:"default",themeMode:"light",rtl:!1,wrap:!0,margin:2,format:"hex",formatToggle:!1,swatches:[],swatchesOnly:!1,alpha:!0,forceAlpha:!1,focusInput:!0,selectInput:!1,inline:!1,defaultColor:"#000000",clearButton:!1,clearLabel:"Clear",closeButton:!1,closeLabel:"Close",onChange:()=>{},a11y:{open:"Open color picker",close:"Close color picker",clear:"Clear the selected color",marker:"Saturation: {s}. Brightness: {v}.",hueSlider:"Hue slider",alphaSlider:"Opacity slider",input:"Color value field",format:"Color format",swatch:"Color swatch",instruction:"Saturation and brightness selector. Use up, down, left and right arrow keys to select."}},t=document.createElement("canvas").getContext("2d");function a(e){return document.getElementById(e)}function l(e,t,a,l){"string"==typeof a?e.addEventListener(t,e=>{e.target.matches(a)&&l.call(e.target,e)}):e.addEventListener(t,a)}function n(e,t=[]){"loading"!==document.readyState?e(...t):document.addEventListener("DOMContentLoaded",()=>{e(...t)})}const r={r:0,g:0,b:0,h:0,s:0,v:0,a:1};let o,c,s,i,u,d,p,h,f,m,b,y,g,v,w,k,L={};const E={};let x="",M={},$=!1;const A={ArrowUp:[0,-1],ArrowDown:[0,1],ArrowLeft:[-1,0],ArrowRight:[1,0]};function S(t){if("object"==typeof t)for(const l of Object.keys(t))switch(l){case"el":N(t.el),!1!==t.wrap&&j(t.el);break;case"parent":o=t.parent instanceof HTMLElement?t.parent:document.querySelector(t.parent),o&&(o.appendChild(c),e.parent=t.parent,o===document.body&&(o=void 0));break;case"themeMode":e.themeMode=t.themeMode,"auto"===t.themeMode&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches&&(e.themeMode="dark");case"theme":t.theme&&(e.theme=t.theme),c.className=`clr-picker clr-${e.theme} clr-${e.themeMode}`,e.inline&&O();break;case"rtl":e.rtl=!!t.rtl;for(const t of document.getElementsByClassName("clr-field"))t.classList.toggle("clr-rtl",e.rtl);break;case"margin":{const a=Number(t.margin);e.margin=isNaN(a)?e.margin:a;break}case"wrap":t.el&&t.wrap&&j(t.el);break;case"formatToggle":e.formatToggle=!!t.formatToggle,a("clr-format").style.display=e.formatToggle?"block":"none",e.formatToggle&&(e.format="auto");break;case"swatches":if(Array.isArray(t.swatches)){const l=a("clr-swatches");if(l.textContent="",t.swatches.length){const e=document.createElement("div");t.swatches.forEach((t,a)=>{const l=document.createElement("button");l.setAttribute("type","button"),l.setAttribute("id",`clr-swatch-${a}`),l.setAttribute("aria-labelledby",`clr-swatch-label clr-swatch-${a}`),l.style.color=t,l.textContent=t,e.appendChild(l)}),l.appendChild(e)}e.swatches=[...t.swatches]}break;case"swatchesOnly":e.swatchesOnly=!!t.swatchesOnly,c.setAttribute("data-minimal",e.swatchesOnly);break;case"alpha":e.alpha=!!t.alpha,c.setAttribute("data-alpha",e.alpha);break;case"inline":if(e.inline=!!t.inline,c.setAttribute("data-inline",e.inline),e.inline){const a=t.defaultColor||e.defaultColor;v=W(a),O(),R(a)}break;case"clearButton":{"object"==typeof t.clearButton&&t.clearButton.label&&(e.clearLabel=t.clearButton.label,p.innerHTML=e.clearLabel);const a="object"==typeof t.clearButton?t.clearButton.show:t.clearButton;e.clearButton=!!a,p.style.display=e.clearButton?"block":"none";break}case"clearLabel":e.clearLabel=t.clearLabel,p.innerHTML=e.clearLabel;break;case"closeButton":e.closeButton=!!t.closeButton,e.closeButton?c.insertBefore(h,u):u.appendChild(h);break;case"closeLabel":e.closeLabel=t.closeLabel,h.innerHTML=e.closeLabel;break;case"a11y":{const l=t.a11y;let n=!1;if("object"==typeof l)for(const t of Object.keys(l))l[t]&&e.a11y[t]&&(e.a11y[t]=l[t],n=!0);if(n){const t=a("clr-open-label"),l=a("clr-swatch-label");t.innerHTML=e.a11y.open,l.innerHTML=e.a11y.swatch,h.setAttribute("aria-label",e.a11y.close),p.setAttribute("aria-label",e.a11y.clear),f.setAttribute("aria-label",e.a11y.hueSlider),b.setAttribute("aria-label",e.a11y.alphaSlider),d.setAttribute("aria-label",e.a11y.input),s.setAttribute("aria-label",e.a11y.instruction)}break}default:e[l]=t[l]}}function C(e,t){"string"==typeof e&&"object"==typeof t&&(E[e]=t,$=!0)}function T(e){delete E[e],0===Object.keys(E).length&&($=!1,e===x&&B())}function B(){Object.keys(M).length>0&&(S(M),x="",M={})}function N(e){const t=e instanceof HTMLElement?[e]:e;Array.isArray(t)?t.forEach(e=>{l(e,"click",H),l(e,"input",I)}):(l(document,"click",t,H),l(document,"input",t,I))}function H(t){e.inline||(!function(t){if($){const a=["el","wrap","rtl","inline","defaultColor","a11y"];for(const l of Object.keys(E)){const n=E[l];if(t.matches(l)){x=l,M={},a.forEach(e=>delete n[e]);for(const t of Object.keys(n))M[t]=Array.isArray(e[t])?[...e[t]]:e[t];S(n);break}}}}(t.target),g=t.target,w=g.value,v=W(w),c.classList.add("clr-open"),O(),R(w),(e.focusInput||e.selectInput)&&(d.focus({preventScroll:!0}),d.setSelectionRange(g.selectionStart,g.selectionEnd)),e.selectInput&&d.select(),(k||e.swatchesOnly)&&J().shift().focus(),g.dispatchEvent(new Event("open",{bubbles:!1})))}function O(){const t=o,a=window.scrollY,l=c.offsetWidth,n=c.offsetHeight,r={left:!1,top:!1};let i,u,d,p={x:0,y:0};if(t&&(i=window.getComputedStyle(t),u=parseFloat(i.marginTop),d=parseFloat(i.borderTopWidth),p=t.getBoundingClientRect(),p.y+=d+a),!e.inline){const o=g.getBoundingClientRect();let s=o.x,i=a+o.y+o.height+e.margin;t?(s-=p.x,i-=p.y,s+l>t.clientWidth&&(s+=o.width-l,r.left=!0),i+n>t.clientHeight-u&&n+e.margin<=o.top-(p.y-a)&&(i-=o.height+n+2*e.margin,r.top=!0),i+=t.scrollTop):(s+l>document.documentElement.clientWidth&&(s+=o.width-l,r.left=!0),i+n-a>document.documentElement.clientHeight&&n+e.margin<=o.top&&(i=a+o.y-n-e.margin,r.top=!0)),c.classList.toggle("clr-left",r.left),c.classList.toggle("clr-top",r.top),c.style.left=`${s}px`,c.style.top=`${i}px`,p.x+=c.offsetLeft,p.y+=c.offsetTop}L={width:s.offsetWidth,height:s.offsetHeight,x:s.offsetLeft+p.x,y:s.offsetTop+p.y}}function j(e){(e instanceof HTMLElement?[e]:Array.isArray(e)?e:[...document.querySelectorAll(e)]).forEach(D)}function D(t){const a=t.parentNode;if(!a.classList.contains("clr-field")){const l=document.createElement("div");let n="clr-field";(e.rtl||t.classList.contains("clr-rtl"))&&(n+=" clr-rtl"),l.innerHTML='<button type="button" aria-labelledby="clr-open-label"></button>',a.insertBefore(l,t),l.className=n,l.style.color=t.value,l.appendChild(t)}}function I(e){const t=e.target.parentNode;t.classList.contains("clr-field")&&(t.style.color=e.target.value)}function F(t){if(g&&!e.inline){const a=g;t&&(g=void 0,w!==a.value&&(a.value=w,a.dispatchEvent(new Event("input",{bubbles:!0})))),setTimeout(()=>{w!==a.value&&a.dispatchEvent(new Event("change",{bubbles:!0}))}),c.classList.remove("clr-open"),$&&B(),a.dispatchEvent(new Event("close",{bubbles:!1})),e.focusInput&&a.focus({preventScroll:!0}),g=void 0}}function R(e){const a=function(e){let a,l;return t.fillStyle="#000",t.fillStyle=e,a=/^((rgba)|rgb)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i.exec(t.fillStyle),a?l={r:Number(a[3]),g:Number(a[4]),b:Number(a[5]),a:Number(a[6])}:(a=t.fillStyle.replace("#","").match(/.{2}/g).map(e=>parseInt(e,16)),l={r:a[0],g:a[1],b:a[2],a:1}),l}(e),l=function(e){const t=e.r/255,a=e.g/255,l=e.b/255,n=Math.max(t,a,l),r=n-Math.min(t,a,l),o=n;let c=0,s=0;return r&&(s=r/n,c=n===t?(a-l)/r:n===a?2+(l-t)/r:4+(t-a)/r),c=Math.floor(60*c),{h:c<0?c+360:c,s:Math.round(100*s),v:Math.round(100*o),a:e.a}}(a);U(l.s,l.v),G(a,l),f.value=l.h,c.style.color=`hsl(${l.h}, 100%, 50%)`,m.style.left=l.h/360*100+"%",i.style.left=L.width*l.s/100+"px",i.style.top=L.height-L.height*l.v/100+"px",b.value=100*l.a,y.style.left=100*l.a+"%"}function W(e){const t=e.slice(0,3).toLowerCase();return"rgb"===t||"hsl"===t?t:"hex"}function q(t){t=t??d.value,g&&(g.value=t,g.dispatchEvent(new Event("input",{bubbles:!0}))),e.onChange&&e.onChange.call(window,t,g),document.dispatchEvent(new CustomEvent("colorpicker:pick",{detail:{color:t,currentEl:g}}))}function P(e,t){const a={h:Number(f.value),s:e/L.width*100,v:100-t/L.height*100,a:b.value/100},l=function(e){const t=e.s/100,a=e.v/100;let l=t*a,n=e.h/60,r=l*(1-Math.abs(n%2-1)),o=a-l;l+=o,r+=o;const c=Math.floor(n)%6,s=[l,r,o,o,r,l][c],i=[r,l,l,r,o,o][c],u=[o,o,r,l,l,r][c];return{r:Math.round(255*s),g:Math.round(255*i),b:Math.round(255*u),a:e.a}}(a);U(a.s,a.v),G(l,a),q()}function U(t,a){i.setAttribute("aria-label",e.a11y.marker.replace("{s}",Number(t.toFixed(1))).replace("{v}",Number(a.toFixed(1))))}function Y(e){const t=e.changedTouches?.[0];let a=(t?.pageX??e.pageX)-L.x,l=(t?.pageY??e.pageY)-L.y;o&&(l+=o.scrollTop),X(a,l),e.preventDefault(),e.stopPropagation()}function X(e,t){e=Math.max(0,Math.min(e,L.width)),t=Math.max(0,Math.min(t,L.height)),i.style.left=`${e}px`,i.style.top=`${t}px`,P(e,t),i.focus()}function G(t={},a={}){let l=e.format;Object.assign(r,t,a);const n=function(t){const a=t.r.toString(16).padStart(2,"0"),l=t.g.toString(16).padStart(2,"0"),n=t.b.toString(16).padStart(2,"0");let r="";return e.alpha&&(t.a<1||e.forceAlpha)&&(r=(255*t.a|0).toString(16).padStart(2,"0")),"#"+a+l+n+r}(r),o=n.substring(0,7);switch(i.style.color=o,y.parentNode.style.color=o,y.style.color=n,u.style.color=n,s.style.display="none",s.offsetHeight,s.style.display="",y.nextElementSibling.style.display="none",y.nextElementSibling.offsetHeight,y.nextElementSibling.style.display="","mixed"===l?l=1===r.a?"hex":"rgb":"auto"===l&&(l=v),l){case"hex":d.value=n;break;case"rgb":d.value=function(t){return!e.alpha||1===t.a&&!e.forceAlpha?`rgb(${t.r}, ${t.g}, ${t.b})`:`rgba(${t.r}, ${t.g}, ${t.b}, ${t.a})`}(r);break;case"hsl":d.value=(c=function(e){const t=e.v/100,a=t*(1-e.s/100/2);let l;return a>0&&a<1&&(l=Math.round((t-a)/Math.min(a,1-a)*100)),{h:e.h,s:l||0,l:Math.round(100*a),a:e.a}}(r),!e.alpha||1===c.a&&!e.forceAlpha?`hsl(${c.h}, ${c.s}%, ${c.l}%)`:`hsla(${c.h}, ${c.s}%, ${c.l}%, ${c.a})`)}var c;document.querySelector(`.clr-format [value="${l}"]`).checked=!0}function K(){const e=Number(f.value),t=parseFloat(i.style.left),a=parseFloat(i.style.top);c.style.color=`hsl(${e}, 100%, 50%)`,m.style.left=e/360*100+"%",P(t,a)}function z(){const e=b.value/100;y.style.left=100*e+"%",G({a:e}),q()}function J(){return[...c.querySelectorAll("input, button")].filter(e=>!!e.offsetWidth)}function Q(e){n(()=>{e&&("string"==typeof e?N(e):S(e))})}return Q.set=(...e)=>n(S,e),Q.wrap=(...e)=>n(j,e),Q.close=(...e)=>n(F,e),Q.setInstance=(...e)=>n(C,e),Q.removeInstance=(...e)=>n(T,e),Q.updatePosition=(...e)=>n(O,e),Q.ready=n,n(function(){o=void 0,c=document.createElement("div"),c.setAttribute("id","clr-picker"),c.className="clr-picker",c.innerHTML=`\n <input id="clr-color-value" name="clr-color-value" class="clr-color" type="text" value="" spellcheck="false" aria-label="${e.a11y.input}">\n <div id="clr-color-area" class="clr-gradient" role="application" aria-label="${e.a11y.instruction}">\n <div id="clr-color-marker" class="clr-marker" tabindex="0"></div>\n </div>\n <div class="clr-hue">\n <input id="clr-hue-slider" name="clr-hue-slider" type="range" min="0" max="360" step="1" aria-label="${e.a11y.hueSlider}">\n <div id="clr-hue-marker"></div>\n </div>\n <div class="clr-alpha">\n <input id="clr-alpha-slider" name="clr-alpha-slider" type="range" min="0" max="100" step="1" aria-label="${e.a11y.alphaSlider}">\n <div id="clr-alpha-marker"></div>\n <span></span>\n </div>\n <div id="clr-format" class="clr-format">\n <fieldset class="clr-segmented">\n <legend>${e.a11y.format}</legend>\n <input id="clr-f1" type="radio" name="clr-format" value="hex">\n <label for="clr-f1">Hex</label>\n <input id="clr-f2" type="radio" name="clr-format" value="rgb">\n <label for="clr-f2">RGB</label>\n <input id="clr-f3" type="radio" name="clr-format" value="hsl">\n <label for="clr-f3">HSL</label>\n <span></span>\n </fieldset>\n </div>\n <div id="clr-swatches" class="clr-swatches"></div>\n <button type="button" id="clr-clear" class="clr-clear" aria-label="${e.a11y.clear}">${e.clearLabel}</button>\n <div id="clr-color-preview" class="clr-preview">\n <button type="button" id="clr-close" class="clr-close" aria-label="${e.a11y.close}">${e.closeLabel}</button>\n </div>\n <span id="clr-open-label" hidden>${e.a11y.open}</span>\n <span id="clr-swatch-label" hidden>${e.a11y.swatch}</span>\n `,document.body.appendChild(c),s=a("clr-color-area"),i=a("clr-color-marker"),p=a("clr-clear"),h=a("clr-close"),u=a("clr-color-preview"),d=a("clr-color-value"),f=a("clr-hue-slider"),m=a("clr-hue-marker"),b=a("clr-alpha-slider"),y=a("clr-alpha-marker"),N(e.el),j(e.el),l(c,"mousedown",e=>{c.classList.remove("clr-keyboard-nav"),e.stopPropagation()}),l(s,"mousedown",()=>{l(document,"mousemove",Y)}),l(s,"contextmenu",e=>{e.preventDefault()}),l(s,"touchstart",()=>{document.addEventListener("touchmove",Y,{passive:!1})}),l(i,"mousedown",()=>{l(document,"mousemove",Y)}),l(i,"touchstart",()=>{document.addEventListener("touchmove",Y,{passive:!1})}),l(d,"change",()=>{const t=d.value;if(g||e.inline){q(""===t?t:R(t))}}),l(p,"click",()=>{q(""),F()}),l(h,"click",()=>{q(),F()}),l(a("clr-format"),"click",".clr-format input",e=>{v=e.target.value,G(),q()}),l(c,"click",".clr-swatches button",t=>{R(t.target.textContent),q(),e.swatchesOnly&&F()}),l(document,"mouseup",()=>{document.removeEventListener("mousemove",Y)}),l(document,"touchend",()=>{document.removeEventListener("touchmove",Y)}),l(document,"mousedown",()=>{k=!1,c.classList.remove("clr-keyboard-nav"),F()}),l(document,"keydown",e=>{const t=e.key,a=e.target,l=e.shiftKey;if("Escape"!==t)if("Enter"!==t||"BUTTON"===a.tagName){if(["Tab","ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(t)&&(k=!0,c.classList.add("clr-keyboard-nav")),"Tab"===t&&a.matches(".clr-picker *")){const t=J(),n=t.shift(),r=t.pop();l&&a===n?(r.focus(),e.preventDefault()):l||a!==r||(n.focus(),e.preventDefault())}}else F();else F(!0)}),l(document,"click",".clr-field button",e=>{$&&B(),e.target.nextElementSibling.dispatchEvent(new Event("click",{bubbles:!0}))}),l(i,"keydown",e=>{e.key in A&&(!function(e,t){X(parseFloat(i.style.left)+e,parseFloat(i.style.top)+t)}(...A[e.key]),e.preventDefault())}),l(s,"click",Y),l(f,"input",K),l(b,"input",z)}),Q}();
|
|
3
|
+
//# sourceMappingURL=colorpicker.min.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colorpicker.min.js","sources":["../../src/js/settings.js","../../src/js/colors.js","../../src/js/dom.js","../../src/js/picker.js","../../src/js/index.js"],"sourcesContent":["/**\r\n * @typedef {Object} A11yLabels\r\n * @property {string} open\r\n * @property {string} close\r\n * @property {string} clear\r\n * @property {string} marker\r\n * @property {string} hueSlider\r\n * @property {string} alphaSlider\r\n * @property {string} input\r\n * @property {string} format\r\n * @property {string} swatch\r\n * @property {string} instruction\r\n */\r\n\r\n/**\r\n * @typedef {Object} ColorPickerOptions\r\n * @property {string|HTMLElement|HTMLElement[]} [el]\r\n * @property {string|HTMLElement} [parent]\r\n * @property {string} [theme]\r\n * @property {'light'|'dark'|'auto'} [themeMode]\r\n * @property {boolean} [rtl]\r\n * @property {boolean} [wrap]\r\n * @property {number} [margin]\r\n * @property {'hex'|'rgb'|'hsl'|'auto'|'mixed'} [format]\r\n * @property {boolean} [formatToggle]\r\n * @property {string[]} [swatches]\r\n * @property {boolean} [swatchesOnly]\r\n * @property {boolean} [alpha]\r\n * @property {boolean} [forceAlpha]\r\n * @property {boolean} [focusInput]\r\n * @property {boolean} [selectInput]\r\n * @property {boolean} [inline]\r\n * @property {string} [defaultColor]\r\n * @property {boolean|{show: boolean, label: string}} [clearButton]\r\n * @property {string} [clearLabel]\r\n * @property {boolean} [closeButton]\r\n * @property {string} [closeLabel]\r\n * @property {function(string, HTMLElement=): void} [onChange]\r\n * @property {Partial<A11yLabels>} [a11y]\r\n */\r\n\r\n/**\r\n * @typedef {Object} Settings\r\n * @property {string} el\r\n * @property {string} parent\r\n * @property {string} theme\r\n * @property {string} themeMode\r\n * @property {boolean} rtl\r\n * @property {boolean} wrap\r\n * @property {number} margin\r\n * @property {string} format\r\n * @property {boolean} formatToggle\r\n * @property {string[]} swatches\r\n * @property {boolean} swatchesOnly\r\n * @property {boolean} alpha\r\n * @property {boolean} forceAlpha\r\n * @property {boolean} focusInput\r\n * @property {boolean} selectInput\r\n * @property {boolean} inline\r\n * @property {string} defaultColor\r\n * @property {boolean} clearButton\r\n * @property {string} clearLabel\r\n * @property {boolean} closeButton\r\n * @property {string} closeLabel\r\n * @property {function(string, HTMLElement=): void} onChange\r\n * @property {A11yLabels} a11y\r\n */\r\n\r\n/** @type {Settings} */\r\nexport const settings = {\r\n el: '[data-colorpicker]',\r\n parent: 'body',\r\n theme: 'default',\r\n themeMode: 'light',\r\n rtl: false,\r\n wrap: true,\r\n margin: 2,\r\n format: 'hex',\r\n formatToggle: false,\r\n swatches: [],\r\n swatchesOnly: false,\r\n alpha: true,\r\n forceAlpha: false,\r\n focusInput: true,\r\n selectInput: false,\r\n inline: false,\r\n defaultColor: '#000000',\r\n clearButton: false,\r\n clearLabel: 'Clear',\r\n closeButton: false,\r\n closeLabel: 'Close',\r\n onChange: () => undefined,\r\n a11y: {\r\n open: 'Open color picker',\r\n close: 'Close color picker',\r\n clear: 'Clear the selected color',\r\n marker: 'Saturation: {s}. Brightness: {v}.',\r\n hueSlider: 'Hue slider',\r\n alphaSlider: 'Opacity slider',\r\n input: 'Color value field',\r\n format: 'Color format',\r\n swatch: 'Color swatch',\r\n instruction: 'Saturation and brightness selector. Use up, down, left and right arrow keys to select.'\r\n }\r\n}\r\n","import { settings } from './settings.js'\r\n\r\n/**\r\n * @typedef {Object} RGBA\r\n * @property {number} r - Red channel (0–255)\r\n * @property {number} g - Green channel (0–255)\r\n * @property {number} b - Blue channel (0–255)\r\n * @property {number} a - Alpha channel (0–1)\r\n */\r\n\r\n/**\r\n * @typedef {Object} HSVA\r\n * @property {number} h - Hue (0–360)\r\n * @property {number} s - Saturation (0–100)\r\n * @property {number} v - Value/brightness (0–100)\r\n * @property {number} a - Alpha channel (0–1)\r\n */\r\n\r\n/**\r\n * @typedef {Object} HSLA\r\n * @property {number} h - Hue (0–360)\r\n * @property {number} s - Saturation (0–100)\r\n * @property {number} l - Lightness (0–100)\r\n * @property {number} a - Alpha channel (0–1)\r\n */\r\n\r\nconst ctx = document.createElement('canvas').getContext('2d')\r\n\r\n/**\r\n * Converts HSVA color values to RGBA.\r\n * @param {HSVA} hsva\r\n * @returns {RGBA}\r\n */\r\nexport function HSVAtoRGBA(hsva) {\r\n const saturation = hsva.s / 100\r\n const value = hsva.v / 100\r\n let chroma = saturation * value\r\n let hueBy60 = hsva.h / 60\r\n let x = chroma * (1 - Math.abs((hueBy60 % 2) - 1))\r\n let m = value - chroma\r\n\r\n chroma += m\r\n x += m\r\n\r\n const index = Math.floor(hueBy60) % 6\r\n const red = [chroma, x, m, m, x, chroma][index]\r\n const green = [x, chroma, chroma, x, m, m][index]\r\n const blue = [m, m, x, chroma, chroma, x][index]\r\n\r\n return {\r\n r: Math.round(red * 255),\r\n g: Math.round(green * 255),\r\n b: Math.round(blue * 255),\r\n a: hsva.a\r\n }\r\n}\r\n\r\n/**\r\n * Converts HSVA color values to HSLA.\r\n * @param {HSVA} hsva\r\n * @returns {HSLA}\r\n */\r\nexport function HSVAtoHSLA(hsva) {\r\n const value = hsva.v / 100\r\n const lightness = value * (1 - hsva.s / 100 / 2)\r\n let saturation\r\n\r\n if (lightness > 0 && lightness < 1) {\r\n saturation = Math.round(((value - lightness) / Math.min(lightness, 1 - lightness)) * 100)\r\n }\r\n\r\n return {\r\n h: hsva.h,\r\n s: saturation || 0,\r\n l: Math.round(lightness * 100),\r\n a: hsva.a\r\n }\r\n}\r\n\r\n/**\r\n * Converts RGBA color values to HSVA.\r\n * @param {RGBA} rgba\r\n * @returns {HSVA}\r\n */\r\nexport function RGBAtoHSVA(rgba) {\r\n const red = rgba.r / 255\r\n const green = rgba.g / 255\r\n const blue = rgba.b / 255\r\n const xmax = Math.max(red, green, blue)\r\n const xmin = Math.min(red, green, blue)\r\n const chroma = xmax - xmin\r\n const value = xmax\r\n let hue = 0\r\n let saturation = 0\r\n\r\n if (chroma) {\r\n saturation = chroma / xmax\r\n\r\n if (xmax === red) {\r\n hue = (green - blue) / chroma\r\n } else if (xmax === green) {\r\n hue = 2 + (blue - red) / chroma\r\n } else {\r\n hue = 4 + (red - green) / chroma\r\n }\r\n }\r\n\r\n hue = Math.floor(hue * 60)\r\n\r\n return {\r\n h: hue < 0 ? hue + 360 : hue,\r\n s: Math.round(saturation * 100),\r\n v: Math.round(value * 100),\r\n a: rgba.a\r\n }\r\n}\r\n\r\n/**\r\n * Parses any valid CSS color string and returns its RGBA components.\r\n * @param {string} str - Any valid CSS color string.\r\n * @returns {RGBA}\r\n */\r\nexport function strToRGBA(str) {\r\n const regex = /^((rgba)|rgb)[\\D]+([\\d.]+)[\\D]+([\\d.]+)[\\D]+([\\d.]+)[\\D]*?([\\d.]+|$)/i\r\n let match, rgba\r\n\r\n // Default to black for invalid color strings\r\n ctx.fillStyle = '#000'\r\n\r\n // Use canvas to convert the string to a valid color string\r\n ctx.fillStyle = str\r\n match = regex.exec(ctx.fillStyle)\r\n\r\n if (match) {\r\n rgba = {\r\n r: Number(match[3]),\r\n g: Number(match[4]),\r\n b: Number(match[5]),\r\n a: Number(match[6])\r\n }\r\n } else {\r\n match = ctx.fillStyle\r\n .replace('#', '')\r\n .match(/.{2}/g)\r\n .map((h) => parseInt(h, 16))\r\n\r\n rgba = {\r\n r: match[0],\r\n g: match[1],\r\n b: match[2],\r\n a: 1\r\n }\r\n }\r\n\r\n return rgba\r\n}\r\n\r\n/**\r\n * Converts RGBA color values to a CSS hex color string.\r\n * @param {RGBA} rgba\r\n * @returns {string} Hex color string (e.g. `#rrggbb` or `#rrggbbaa`).\r\n */\r\nexport function RGBAToHex(rgba) {\r\n const R = rgba.r.toString(16).padStart(2, '0')\r\n const G = rgba.g.toString(16).padStart(2, '0')\r\n const B = rgba.b.toString(16).padStart(2, '0')\r\n let A = ''\r\n\r\n if (settings.alpha && (rgba.a < 1 || settings.forceAlpha)) {\r\n A = ((rgba.a * 255) | 0).toString(16).padStart(2, '0')\r\n }\r\n\r\n return '#' + R + G + B + A\r\n}\r\n\r\n/**\r\n * Converts RGBA color values to a CSS `rgb()` or `rgba()` string.\r\n * @param {RGBA} rgba\r\n * @returns {string}\r\n */\r\nexport function RGBAToStr(rgba) {\r\n return !settings.alpha || (rgba.a === 1 && !settings.forceAlpha)\r\n ? `rgb(${rgba.r}, ${rgba.g}, ${rgba.b})`\r\n : `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`\r\n}\r\n\r\n/**\r\n * Converts HSLA color values to a CSS `hsl()` or `hsla()` string.\r\n * @param {HSLA} hsla\r\n * @returns {string}\r\n */\r\nexport function HSLAToStr(hsla) {\r\n return !settings.alpha || (hsla.a === 1 && !settings.forceAlpha)\r\n ? `hsl(${hsla.h}, ${hsla.s}%, ${hsla.l}%)`\r\n : `hsla(${hsla.h}, ${hsla.s}%, ${hsla.l}%, ${hsla.a})`\r\n}\r\n","/**\r\n * Returns the element with the given ID.\r\n * @param {string} id\r\n * @returns {HTMLElement | null}\r\n */\r\nexport function getEl(id) {\r\n return document.getElementById(id)\r\n}\r\n\r\n/**\r\n * Attaches an event listener to an element, with optional CSS selector delegation.\r\n * @param {EventTarget} context - The element to attach the listener to.\r\n * @param {string} type - The event type.\r\n * @param {string | EventListener} selector - A CSS selector for event delegation, or a direct event handler.\r\n * @param {EventListener} [fn] - Event handler (required when `selector` is a string).\r\n * @returns {void}\r\n */\r\nexport function addListener(context, type, selector, fn) {\r\n if (typeof selector === 'string') {\r\n context.addEventListener(type, (event) => {\r\n if (event.target.matches(selector)) {\r\n fn.call(event.target, event)\r\n }\r\n })\r\n } else {\r\n context.addEventListener(type, selector)\r\n }\r\n}\r\n\r\n/**\r\n * Calls `fn` immediately if the DOM is ready, otherwise defers until `DOMContentLoaded`.\r\n * @param {Function} fn - The function to call.\r\n * @param {any[]} [args] - Arguments to pass to `fn`.\r\n * @returns {void}\r\n */\r\nexport function DOMReady(fn, args = []) {\r\n if (document.readyState !== 'loading') {\r\n fn(...args)\r\n } else {\r\n document.addEventListener('DOMContentLoaded', () => {\r\n fn(...args)\r\n })\r\n }\r\n}\r\n","/** @import { ColorPickerOptions, Settings } from './settings.js' */\r\n/** @import { RGBA, HSVA } from './colors.js' */\r\nimport { settings } from './settings.js'\r\nimport { HSVAtoRGBA, HSVAtoHSLA, RGBAtoHSVA, strToRGBA, RGBAToHex, RGBAToStr, HSLAToStr } from './colors.js'\r\nimport { getEl, addListener } from './dom.js'\r\n\r\nconst currentColor = { r: 0, g: 0, b: 0, h: 0, s: 0, v: 0, a: 1 }\r\nlet container,\r\n picker,\r\n colorArea,\r\n colorMarker,\r\n colorPreview,\r\n colorValue,\r\n clearButton,\r\n closeButton,\r\n hueSlider,\r\n hueMarker,\r\n alphaSlider,\r\n alphaMarker,\r\n currentEl,\r\n currentFormat,\r\n oldColor,\r\n keyboardNav,\r\n colorAreaDims = {}\r\n\r\n// Virtual instances cache\r\nconst instances = {}\r\nlet currentInstanceId = ''\r\nlet defaultInstance = {}\r\nlet hasInstance = false\r\n\r\nconst MARKER_MOVEMENTS = {\r\n ArrowUp: [0, -1],\r\n ArrowDown: [0, 1],\r\n ArrowLeft: [-1, 0],\r\n ArrowRight: [1, 0]\r\n}\r\n\r\n/**\r\n * Applies configuration options to the color picker.\r\n * @param {ColorPickerOptions} options\r\n * @returns {void}\r\n */\r\nexport function configure(options) {\r\n if (typeof options !== 'object') {\r\n return\r\n }\r\n\r\n for (const key of Object.keys(options)) {\r\n switch (key) {\r\n case 'el':\r\n bindFields(options.el)\r\n\r\n if (options.wrap !== false) {\r\n wrapFields(options.el)\r\n }\r\n\r\n break\r\n case 'parent':\r\n container = options.parent instanceof HTMLElement ? options.parent : document.querySelector(options.parent)\r\n\r\n if (container) {\r\n container.appendChild(picker)\r\n settings.parent = options.parent\r\n\r\n // document.body is special\r\n if (container === document.body) {\r\n container = undefined\r\n }\r\n }\r\n\r\n break\r\n case 'themeMode':\r\n settings.themeMode = options.themeMode\r\n\r\n if (\r\n options.themeMode === 'auto' &&\r\n window.matchMedia &&\r\n window.matchMedia('(prefers-color-scheme: dark)').matches\r\n ) {\r\n settings.themeMode = 'dark'\r\n }\r\n // falls through\r\n case 'theme':\r\n if (options.theme) {\r\n settings.theme = options.theme\r\n }\r\n\r\n // Set the theme and color scheme\r\n picker.className = `clr-picker clr-${settings.theme} clr-${settings.themeMode}`\r\n\r\n // Update the color picker's position if inline mode is in use\r\n if (settings.inline) {\r\n updatePickerPosition()\r\n }\r\n\r\n break\r\n case 'rtl':\r\n settings.rtl = !!options.rtl\r\n\r\n for (const field of document.getElementsByClassName('clr-field')) {\r\n field.classList.toggle('clr-rtl', settings.rtl)\r\n }\r\n\r\n break\r\n case 'margin': {\r\n const margin = Number(options.margin)\r\n\r\n settings.margin = !isNaN(margin) ? margin : settings.margin\r\n\r\n break\r\n }\r\n case 'wrap':\r\n if (options.el && options.wrap) {\r\n wrapFields(options.el)\r\n }\r\n\r\n break\r\n case 'formatToggle':\r\n settings.formatToggle = !!options.formatToggle\r\n\r\n getEl('clr-format').style.display = settings.formatToggle ? 'block' : 'none'\r\n\r\n if (settings.formatToggle) {\r\n settings.format = 'auto'\r\n }\r\n\r\n break\r\n case 'swatches':\r\n if (Array.isArray(options.swatches)) {\r\n const swatchesContainer = getEl('clr-swatches')\r\n\r\n swatchesContainer.textContent = ''\r\n\r\n if (options.swatches.length) {\r\n const swatches = document.createElement('div')\r\n\r\n options.swatches.forEach((swatch, i) => {\r\n const button = document.createElement('button')\r\n\r\n button.setAttribute('type', 'button')\r\n button.setAttribute('id', `clr-swatch-${i}`)\r\n button.setAttribute('aria-labelledby', `clr-swatch-label clr-swatch-${i}`)\r\n button.style.color = swatch\r\n button.textContent = swatch\r\n swatches.appendChild(button)\r\n })\r\n\r\n swatchesContainer.appendChild(swatches)\r\n }\r\n\r\n settings.swatches = [...options.swatches]\r\n }\r\n\r\n break\r\n case 'swatchesOnly':\r\n settings.swatchesOnly = !!options.swatchesOnly\r\n picker.setAttribute('data-minimal', settings.swatchesOnly)\r\n break\r\n case 'alpha':\r\n settings.alpha = !!options.alpha\r\n picker.setAttribute('data-alpha', settings.alpha)\r\n break\r\n case 'inline':\r\n settings.inline = !!options.inline\r\n picker.setAttribute('data-inline', settings.inline)\r\n\r\n if (settings.inline) {\r\n const defaultColor = options.defaultColor || settings.defaultColor\r\n\r\n currentFormat = getColorFormatFromStr(defaultColor)\r\n updatePickerPosition()\r\n setColorFromStr(defaultColor)\r\n }\r\n break\r\n case 'clearButton': {\r\n // Backward compatibility\r\n if (typeof options.clearButton === 'object' && options.clearButton.label) {\r\n settings.clearLabel = options.clearButton.label\r\n clearButton.innerHTML = settings.clearLabel\r\n }\r\n\r\n const show = typeof options.clearButton === 'object' ? options.clearButton.show : options.clearButton\r\n settings.clearButton = !!show\r\n clearButton.style.display = settings.clearButton ? 'block' : 'none'\r\n break\r\n }\r\n case 'clearLabel':\r\n settings.clearLabel = options.clearLabel\r\n clearButton.innerHTML = settings.clearLabel\r\n break\r\n case 'closeButton':\r\n settings.closeButton = !!options.closeButton\r\n\r\n if (settings.closeButton) {\r\n picker.insertBefore(closeButton, colorPreview)\r\n } else {\r\n colorPreview.appendChild(closeButton)\r\n }\r\n\r\n break\r\n case 'closeLabel':\r\n settings.closeLabel = options.closeLabel\r\n closeButton.innerHTML = settings.closeLabel\r\n break\r\n case 'a11y': {\r\n const labels = options.a11y\r\n let update = false\r\n\r\n if (typeof labels === 'object') {\r\n for (const label of Object.keys(labels)) {\r\n if (labels[label] && settings.a11y[label]) {\r\n settings.a11y[label] = labels[label]\r\n update = true\r\n }\r\n }\r\n }\r\n\r\n if (update) {\r\n const openLabel = getEl('clr-open-label')\r\n const swatchLabel = getEl('clr-swatch-label')\r\n\r\n openLabel.innerHTML = settings.a11y.open\r\n swatchLabel.innerHTML = settings.a11y.swatch\r\n\r\n closeButton.setAttribute('aria-label', settings.a11y.close)\r\n clearButton.setAttribute('aria-label', settings.a11y.clear)\r\n hueSlider.setAttribute('aria-label', settings.a11y.hueSlider)\r\n alphaSlider.setAttribute('aria-label', settings.a11y.alphaSlider)\r\n colorValue.setAttribute('aria-label', settings.a11y.input)\r\n colorArea.setAttribute('aria-label', settings.a11y.instruction)\r\n }\r\n break\r\n }\r\n default:\r\n settings[key] = options[key]\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Registers a virtual instance that applies custom options to fields matching a CSS selector.\r\n * @param {string} selector - CSS selector identifying the target field(s).\r\n * @param {ColorPickerOptions} options - Options to apply when the picker opens for a matching field.\r\n * @returns {void}\r\n */\r\nexport function setVirtualInstance(selector, options) {\r\n if (typeof selector === 'string' && typeof options === 'object') {\r\n instances[selector] = options\r\n hasInstance = true\r\n }\r\n}\r\n\r\n/**\r\n * Removes a previously registered virtual instance.\r\n * @param {string} selector - The CSS selector of the instance to remove.\r\n * @returns {void}\r\n */\r\nexport function removeVirtualInstance(selector) {\r\n delete instances[selector]\r\n\r\n if (Object.keys(instances).length === 0) {\r\n hasInstance = false\r\n\r\n if (selector === currentInstanceId) {\r\n resetVirtualInstance()\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Applies the virtual instance options for the given element, if a matching instance exists.\r\n * @param {HTMLElement} element\r\n * @returns {void}\r\n */\r\nfunction attachVirtualInstance(element) {\r\n if (hasInstance) {\r\n // These options can only be set globally, not per instance\r\n const unsupportedOptions = ['el', 'wrap', 'rtl', 'inline', 'defaultColor', 'a11y']\r\n\r\n for (const selector of Object.keys(instances)) {\r\n const options = instances[selector]\r\n\r\n // If the element matches an instance's CSS selector\r\n if (element.matches(selector)) {\r\n currentInstanceId = selector\r\n defaultInstance = {}\r\n\r\n // Delete unsupported options\r\n unsupportedOptions.forEach((option) => delete options[option])\r\n\r\n // Back up the default options so we can restore them later\r\n for (const option of Object.keys(options)) {\r\n defaultInstance[option] = Array.isArray(settings[option]) ? [...settings[option]] : settings[option]\r\n }\r\n\r\n // Set the instance's options\r\n configure(options)\r\n break\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Restores the default settings after a virtual instance was applied.\r\n * @returns {void}\r\n */\r\nfunction resetVirtualInstance() {\r\n if (Object.keys(defaultInstance).length > 0) {\r\n configure(defaultInstance)\r\n currentInstanceId = ''\r\n defaultInstance = {}\r\n }\r\n}\r\n\r\n/**\r\n * Binds the color picker to one or more input fields.\r\n * @param {string | HTMLElement | HTMLElement[]} selector - A CSS selector string, a single element, or an array of elements.\r\n * @returns {void}\r\n */\r\nexport function bindFields(selector) {\r\n const fields = selector instanceof HTMLElement ? [selector] : selector\r\n\r\n if (Array.isArray(fields)) {\r\n fields.forEach((field) => {\r\n addListener(field, 'click', openPicker)\r\n addListener(field, 'input', updateColorPreview)\r\n })\r\n } else {\r\n addListener(document, 'click', fields, openPicker)\r\n addListener(document, 'input', fields, updateColorPreview)\r\n }\r\n}\r\n\r\n/**\r\n * Opens the color picker for the field that triggered the event.\r\n * @param {Event} event\r\n * @returns {void}\r\n */\r\nfunction openPicker(event) {\r\n // Skip if inline mode is in use\r\n if (settings.inline) {\r\n return\r\n }\r\n\r\n // Apply any per-instance options first\r\n attachVirtualInstance(event.target)\r\n\r\n currentEl = event.target\r\n oldColor = currentEl.value\r\n currentFormat = getColorFormatFromStr(oldColor)\r\n picker.classList.add('clr-open')\r\n\r\n updatePickerPosition()\r\n setColorFromStr(oldColor)\r\n\r\n if (settings.focusInput || settings.selectInput) {\r\n colorValue.focus({ preventScroll: true })\r\n colorValue.setSelectionRange(currentEl.selectionStart, currentEl.selectionEnd)\r\n }\r\n\r\n if (settings.selectInput) {\r\n colorValue.select()\r\n }\r\n\r\n // Always focus the first element when using keyboard navigation\r\n if (keyboardNav || settings.swatchesOnly) {\r\n getFocusableElements().shift().focus()\r\n }\r\n\r\n // Trigger an \"open\" event\r\n currentEl.dispatchEvent(new Event('open', { bubbles: false }))\r\n}\r\n\r\n/**\r\n * Recalculates and applies the picker's position relative to the active input field.\r\n * @returns {void}\r\n */\r\nexport function updatePickerPosition() {\r\n const parent = container\r\n const scrollY = window.scrollY\r\n const pickerWidth = picker.offsetWidth\r\n const pickerHeight = picker.offsetHeight\r\n const reposition = { left: false, top: false }\r\n let parentStyle, parentMarginTop, parentBorderTop\r\n let offset = { x: 0, y: 0 }\r\n\r\n if (parent) {\r\n parentStyle = window.getComputedStyle(parent)\r\n parentMarginTop = parseFloat(parentStyle.marginTop)\r\n parentBorderTop = parseFloat(parentStyle.borderTopWidth)\r\n\r\n offset = parent.getBoundingClientRect()\r\n offset.y += parentBorderTop + scrollY\r\n }\r\n\r\n if (!settings.inline) {\r\n const coords = currentEl.getBoundingClientRect()\r\n let left = coords.x\r\n let top = scrollY + coords.y + coords.height + settings.margin\r\n\r\n // If the color picker is inside a custom container\r\n // set the position relative to it\r\n if (parent) {\r\n left -= offset.x\r\n top -= offset.y\r\n\r\n if (left + pickerWidth > parent.clientWidth) {\r\n left += coords.width - pickerWidth\r\n reposition.left = true\r\n }\r\n\r\n if (top + pickerHeight > parent.clientHeight - parentMarginTop) {\r\n if (pickerHeight + settings.margin <= coords.top - (offset.y - scrollY)) {\r\n top -= coords.height + pickerHeight + settings.margin * 2\r\n reposition.top = true\r\n }\r\n }\r\n\r\n top += parent.scrollTop\r\n\r\n // Otherwise set the position relative to the whole document\r\n } else {\r\n if (left + pickerWidth > document.documentElement.clientWidth) {\r\n left += coords.width - pickerWidth\r\n reposition.left = true\r\n }\r\n\r\n if (top + pickerHeight - scrollY > document.documentElement.clientHeight) {\r\n if (pickerHeight + settings.margin <= coords.top) {\r\n top = scrollY + coords.y - pickerHeight - settings.margin\r\n reposition.top = true\r\n }\r\n }\r\n }\r\n\r\n picker.classList.toggle('clr-left', reposition.left)\r\n picker.classList.toggle('clr-top', reposition.top)\r\n picker.style.left = `${left}px`\r\n picker.style.top = `${top}px`\r\n offset.x += picker.offsetLeft\r\n offset.y += picker.offsetTop\r\n }\r\n\r\n colorAreaDims = {\r\n width: colorArea.offsetWidth,\r\n height: colorArea.offsetHeight,\r\n x: colorArea.offsetLeft + offset.x,\r\n y: colorArea.offsetTop + offset.y\r\n }\r\n}\r\n\r\n/**\r\n * Wraps one or more color input fields in a `.clr-field` container with a preview button.\r\n * @param {string | HTMLElement | HTMLElement[]} selector - A CSS selector string, a single element, or an array of elements.\r\n * @returns {void}\r\n */\r\nexport function wrapFields(selector) {\r\n const fields =\r\n selector instanceof HTMLElement\r\n ? [selector]\r\n : Array.isArray(selector)\r\n ? selector\r\n : [...document.querySelectorAll(selector)]\r\n\r\n fields.forEach(wrapColorField)\r\n}\r\n\r\n/**\r\n * Wraps a single color input field in a `.clr-field` container.\r\n * @param {HTMLInputElement} field\r\n * @returns {void}\r\n */\r\nfunction wrapColorField(field) {\r\n const parentNode = field.parentNode\r\n\r\n if (!parentNode.classList.contains('clr-field')) {\r\n const wrapper = document.createElement('div')\r\n let classes = 'clr-field'\r\n\r\n if (settings.rtl || field.classList.contains('clr-rtl')) {\r\n classes += ' clr-rtl'\r\n }\r\n\r\n wrapper.innerHTML = '<button type=\"button\" aria-labelledby=\"clr-open-label\"></button>'\r\n parentNode.insertBefore(wrapper, field)\r\n wrapper.className = classes\r\n wrapper.style.color = field.value\r\n wrapper.appendChild(field)\r\n }\r\n}\r\n\r\n/**\r\n * Updates the color preview swatch on the wrapping `.clr-field` element.\r\n * @param {Event} event\r\n * @returns {void}\r\n */\r\nfunction updateColorPreview(event) {\r\n const parent = event.target.parentNode\r\n\r\n // Only update the preview if the field has been previously wrapped\r\n if (parent.classList.contains('clr-field')) {\r\n parent.style.color = event.target.value\r\n }\r\n}\r\n\r\n/**\r\n * Closes the color picker, optionally reverting the color to its pre-open value.\r\n * @param {boolean} [revert] - If `true`, restores the field value to what it was when the picker opened.\r\n * @returns {void}\r\n */\r\nexport function closePicker(revert) {\r\n if (currentEl && !settings.inline) {\r\n const prevEl = currentEl\r\n\r\n // Revert the color to the original value if needed\r\n if (revert) {\r\n // This will prevent the \"change\" event on the colorValue input to execute its handler\r\n currentEl = undefined\r\n\r\n if (oldColor !== prevEl.value) {\r\n prevEl.value = oldColor\r\n\r\n // Trigger an \"input\" event to force update the thumbnail next to the input field\r\n prevEl.dispatchEvent(new Event('input', { bubbles: true }))\r\n }\r\n }\r\n\r\n // Trigger a \"change\" event if needed\r\n setTimeout(() => {\r\n // Add this to the end of the event loop\r\n if (oldColor !== prevEl.value) {\r\n prevEl.dispatchEvent(new Event('change', { bubbles: true }))\r\n }\r\n })\r\n\r\n // Hide the picker dialog\r\n picker.classList.remove('clr-open')\r\n\r\n // Reset any previously set per-instance options\r\n if (hasInstance) {\r\n resetVirtualInstance()\r\n }\r\n\r\n // Trigger a \"close\" event\r\n prevEl.dispatchEvent(new Event('close', { bubbles: false }))\r\n\r\n if (settings.focusInput) {\r\n prevEl.focus({ preventScroll: true })\r\n }\r\n\r\n // This essentially marks the picker as closed\r\n currentEl = undefined\r\n }\r\n}\r\n\r\n/**\r\n * Parses a color string and updates all picker UI elements to reflect it.\r\n * @param {string} str - Any valid CSS color string.\r\n * @returns {void}\r\n */\r\nfunction setColorFromStr(str) {\r\n const rgba = strToRGBA(str)\r\n const hsva = RGBAtoHSVA(rgba)\r\n\r\n updateMarkerA11yLabel(hsva.s, hsva.v)\r\n updateColor(rgba, hsva)\r\n\r\n // Update the UI\r\n hueSlider.value = hsva.h\r\n picker.style.color = `hsl(${hsva.h}, 100%, 50%)`\r\n hueMarker.style.left = `${(hsva.h / 360) * 100}%`\r\n\r\n colorMarker.style.left = `${(colorAreaDims.width * hsva.s) / 100}px`\r\n colorMarker.style.top = `${colorAreaDims.height - (colorAreaDims.height * hsva.v) / 100}px`\r\n\r\n alphaSlider.value = hsva.a * 100\r\n alphaMarker.style.left = `${hsva.a * 100}%`\r\n}\r\n\r\n/**\r\n * Infers the color format (`'hex'`, `'rgb'`, or `'hsl'`) from a color string.\r\n * @param {string} str\r\n * @returns {'hex' | 'rgb' | 'hsl'}\r\n */\r\nfunction getColorFormatFromStr(str) {\r\n const fmt = str.slice(0, 3).toLowerCase()\r\n\r\n return fmt === 'rgb' || fmt === 'hsl' ? fmt : 'hex'\r\n}\r\n\r\n/**\r\n * Commits the current color to the linked input field and fires change events.\r\n * @param {string} [color] - The color string to commit. Defaults to the current value of the color input.\r\n * @returns {void}\r\n */\r\nfunction pickColor(color) {\r\n color = color ?? colorValue.value\r\n\r\n if (currentEl) {\r\n currentEl.value = color\r\n currentEl.dispatchEvent(new Event('input', { bubbles: true }))\r\n }\r\n\r\n if (settings.onChange) {\r\n settings.onChange.call(window, color, currentEl)\r\n }\r\n\r\n document.dispatchEvent(new CustomEvent('colorpicker:pick', { detail: { color, currentEl } }))\r\n}\r\n\r\n/**\r\n * Derives the color at a given position in the color area and updates the picker state.\r\n * @param {number} x - Horizontal position in pixels relative to the color area.\r\n * @param {number} y - Vertical position in pixels relative to the color area.\r\n * @returns {void}\r\n */\r\nfunction setColorAtPosition(x, y) {\r\n const hsva = {\r\n h: Number(hueSlider.value),\r\n s: (x / colorAreaDims.width) * 100,\r\n v: 100 - (y / colorAreaDims.height) * 100,\r\n a: alphaSlider.value / 100\r\n }\r\n const rgba = HSVAtoRGBA(hsva)\r\n\r\n updateMarkerA11yLabel(hsva.s, hsva.v)\r\n updateColor(rgba, hsva)\r\n pickColor()\r\n}\r\n\r\n/**\r\n * Updates the color marker's `aria-label` with the current saturation and brightness values.\r\n * @param {number} saturation - Saturation value (0–100).\r\n * @param {number} value - Brightness value (0–100).\r\n * @returns {void}\r\n */\r\nfunction updateMarkerA11yLabel(saturation, value) {\r\n colorMarker.setAttribute(\r\n 'aria-label',\r\n settings.a11y.marker.replace('{s}', Number(saturation.toFixed(1))).replace('{v}', Number(value.toFixed(1)))\r\n )\r\n}\r\n\r\n/**\r\n * Moves the color marker to the pointer position within the color area.\r\n * @param {MouseEvent | TouchEvent} event\r\n * @returns {void}\r\n */\r\nfunction moveMarker(event) {\r\n const touch = event.changedTouches?.[0]\r\n let x = (touch?.pageX ?? event.pageX) - colorAreaDims.x\r\n let y = (touch?.pageY ?? event.pageY) - colorAreaDims.y\r\n\r\n if (container) {\r\n y += container.scrollTop\r\n }\r\n\r\n setMarkerPosition(x, y)\r\n\r\n // Prevent scrolling while dragging the marker\r\n event.preventDefault()\r\n event.stopPropagation()\r\n}\r\n\r\n/**\r\n * Moves the color marker by a pixel offset (used for keyboard navigation).\r\n * @param {number} offsetX\r\n * @param {number} offsetY\r\n * @returns {void}\r\n */\r\nfunction moveMarkerOnKeydown(offsetX, offsetY) {\r\n const x = parseFloat(colorMarker.style.left) + offsetX\r\n const y = parseFloat(colorMarker.style.top) + offsetY\r\n\r\n setMarkerPosition(x, y)\r\n}\r\n\r\n/**\r\n * Positions the color marker at the given coordinates, clamped to the color area bounds.\r\n * @param {number} x\r\n * @param {number} y\r\n * @returns {void}\r\n */\r\nfunction setMarkerPosition(x, y) {\r\n // Make sure the marker doesn't go out of bounds\r\n x = Math.max(0, Math.min(x, colorAreaDims.width))\r\n y = Math.max(0, Math.min(y, colorAreaDims.height))\r\n\r\n // Set the position\r\n colorMarker.style.left = `${x}px`\r\n colorMarker.style.top = `${y}px`\r\n\r\n // Update the color\r\n setColorAtPosition(x, y)\r\n\r\n // Make sure the marker is focused\r\n colorMarker.focus()\r\n}\r\n\r\n/**\r\n * Merges new RGBA/HSVA values into the current color state and refreshes all UI elements.\r\n * @param {Partial<RGBA>} [rgba]\r\n * @param {Partial<HSVA>} [hsva]\r\n * @returns {void}\r\n */\r\nfunction updateColor(rgba = {}, hsva = {}) {\r\n let format = settings.format\r\n\r\n Object.assign(currentColor, rgba, hsva)\r\n\r\n const hex = RGBAToHex(currentColor)\r\n const opaqueHex = hex.substring(0, 7)\r\n\r\n colorMarker.style.color = opaqueHex\r\n alphaMarker.parentNode.style.color = opaqueHex\r\n alphaMarker.style.color = hex\r\n colorPreview.style.color = hex\r\n\r\n // Force repaint the color and alpha gradients as a workaround for a Google Chrome bug\r\n colorArea.style.display = 'none'\r\n colorArea.offsetHeight\r\n colorArea.style.display = ''\r\n alphaMarker.nextElementSibling.style.display = 'none'\r\n alphaMarker.nextElementSibling.offsetHeight\r\n alphaMarker.nextElementSibling.style.display = ''\r\n\r\n if (format === 'mixed') {\r\n format = currentColor.a === 1 ? 'hex' : 'rgb'\r\n } else if (format === 'auto') {\r\n format = currentFormat\r\n }\r\n\r\n switch (format) {\r\n case 'hex':\r\n colorValue.value = hex\r\n break\r\n case 'rgb':\r\n colorValue.value = RGBAToStr(currentColor)\r\n break\r\n case 'hsl':\r\n colorValue.value = HSLAToStr(HSVAtoHSLA(currentColor))\r\n break\r\n }\r\n\r\n // Select the current format in the format switcher\r\n document.querySelector(`.clr-format [value=\"${format}\"]`).checked = true\r\n}\r\n\r\n/**\r\n * Handles hue slider input and updates the color accordingly.\r\n * @returns {void}\r\n */\r\nfunction setHue() {\r\n const hue = Number(hueSlider.value)\r\n const x = parseFloat(colorMarker.style.left)\r\n const y = parseFloat(colorMarker.style.top)\r\n\r\n picker.style.color = `hsl(${hue}, 100%, 50%)`\r\n hueMarker.style.left = `${(hue / 360) * 100}%`\r\n\r\n setColorAtPosition(x, y)\r\n}\r\n\r\n/**\r\n * Handles alpha slider input and updates the color accordingly.\r\n * @returns {void}\r\n */\r\nfunction setAlpha() {\r\n const alpha = alphaSlider.value / 100\r\n\r\n alphaMarker.style.left = `${alpha * 100}%`\r\n updateColor({ a: alpha })\r\n pickColor()\r\n}\r\n\r\n/**\r\n * Returns all visible (non-zero-width) focusable elements inside the picker.\r\n * @returns {HTMLElement[]}\r\n */\r\nfunction getFocusableElements() {\r\n return [...picker.querySelectorAll('input, button')].filter((node) => !!node.offsetWidth)\r\n}\r\n\r\n/**\r\n * Creates the picker DOM, appends it to the document, and binds all event listeners.\r\n * @returns {void}\r\n */\r\nexport function init() {\r\n // Render the UI\r\n container = undefined\r\n picker = document.createElement('div')\r\n picker.setAttribute('id', 'clr-picker')\r\n picker.className = 'clr-picker'\r\n picker.innerHTML = `\r\n <input id=\"clr-color-value\" name=\"clr-color-value\" class=\"clr-color\" type=\"text\" value=\"\" spellcheck=\"false\" aria-label=\"${settings.a11y.input}\">\r\n <div id=\"clr-color-area\" class=\"clr-gradient\" role=\"application\" aria-label=\"${settings.a11y.instruction}\">\r\n <div id=\"clr-color-marker\" class=\"clr-marker\" tabindex=\"0\"></div>\r\n </div>\r\n <div class=\"clr-hue\">\r\n <input id=\"clr-hue-slider\" name=\"clr-hue-slider\" type=\"range\" min=\"0\" max=\"360\" step=\"1\" aria-label=\"${settings.a11y.hueSlider}\">\r\n <div id=\"clr-hue-marker\"></div>\r\n </div>\r\n <div class=\"clr-alpha\">\r\n <input id=\"clr-alpha-slider\" name=\"clr-alpha-slider\" type=\"range\" min=\"0\" max=\"100\" step=\"1\" aria-label=\"${settings.a11y.alphaSlider}\">\r\n <div id=\"clr-alpha-marker\"></div>\r\n <span></span>\r\n </div>\r\n <div id=\"clr-format\" class=\"clr-format\">\r\n <fieldset class=\"clr-segmented\">\r\n <legend>${settings.a11y.format}</legend>\r\n <input id=\"clr-f1\" type=\"radio\" name=\"clr-format\" value=\"hex\">\r\n <label for=\"clr-f1\">Hex</label>\r\n <input id=\"clr-f2\" type=\"radio\" name=\"clr-format\" value=\"rgb\">\r\n <label for=\"clr-f2\">RGB</label>\r\n <input id=\"clr-f3\" type=\"radio\" name=\"clr-format\" value=\"hsl\">\r\n <label for=\"clr-f3\">HSL</label>\r\n <span></span>\r\n </fieldset>\r\n </div>\r\n <div id=\"clr-swatches\" class=\"clr-swatches\"></div>\r\n <button type=\"button\" id=\"clr-clear\" class=\"clr-clear\" aria-label=\"${settings.a11y.clear}\">${settings.clearLabel}</button>\r\n <div id=\"clr-color-preview\" class=\"clr-preview\">\r\n <button type=\"button\" id=\"clr-close\" class=\"clr-close\" aria-label=\"${settings.a11y.close}\">${settings.closeLabel}</button>\r\n </div>\r\n <span id=\"clr-open-label\" hidden>${settings.a11y.open}</span>\r\n <span id=\"clr-swatch-label\" hidden>${settings.a11y.swatch}</span>\r\n `\r\n\r\n // Append the color picker to the DOM\r\n document.body.appendChild(picker)\r\n\r\n // Reference the UI elements\r\n colorArea = getEl('clr-color-area')\r\n colorMarker = getEl('clr-color-marker')\r\n clearButton = getEl('clr-clear')\r\n closeButton = getEl('clr-close')\r\n colorPreview = getEl('clr-color-preview')\r\n colorValue = getEl('clr-color-value')\r\n hueSlider = getEl('clr-hue-slider')\r\n hueMarker = getEl('clr-hue-marker')\r\n alphaSlider = getEl('clr-alpha-slider')\r\n alphaMarker = getEl('clr-alpha-marker')\r\n\r\n // Bind the picker to the default selector\r\n bindFields(settings.el)\r\n wrapFields(settings.el)\r\n\r\n addListener(picker, 'mousedown', (event) => {\r\n picker.classList.remove('clr-keyboard-nav')\r\n event.stopPropagation()\r\n })\r\n\r\n addListener(colorArea, 'mousedown', () => {\r\n addListener(document, 'mousemove', moveMarker)\r\n })\r\n\r\n addListener(colorArea, 'contextmenu', (event) => {\r\n event.preventDefault()\r\n })\r\n\r\n addListener(colorArea, 'touchstart', () => {\r\n document.addEventListener('touchmove', moveMarker, { passive: false })\r\n })\r\n\r\n addListener(colorMarker, 'mousedown', () => {\r\n addListener(document, 'mousemove', moveMarker)\r\n })\r\n\r\n addListener(colorMarker, 'touchstart', () => {\r\n document.addEventListener('touchmove', moveMarker, { passive: false })\r\n })\r\n\r\n addListener(colorValue, 'change', () => {\r\n const value = colorValue.value\r\n\r\n if (currentEl || settings.inline) {\r\n const color = value === '' ? value : setColorFromStr(value)\r\n pickColor(color)\r\n }\r\n })\r\n\r\n addListener(clearButton, 'click', () => {\r\n pickColor('')\r\n closePicker()\r\n })\r\n\r\n addListener(closeButton, 'click', () => {\r\n pickColor()\r\n closePicker()\r\n })\r\n\r\n addListener(getEl('clr-format'), 'click', '.clr-format input', (event) => {\r\n currentFormat = event.target.value\r\n updateColor()\r\n pickColor()\r\n })\r\n\r\n addListener(picker, 'click', '.clr-swatches button', (event) => {\r\n setColorFromStr(event.target.textContent)\r\n pickColor()\r\n\r\n if (settings.swatchesOnly) {\r\n closePicker()\r\n }\r\n })\r\n\r\n addListener(document, 'mouseup', () => {\r\n document.removeEventListener('mousemove', moveMarker)\r\n })\r\n\r\n addListener(document, 'touchend', () => {\r\n document.removeEventListener('touchmove', moveMarker)\r\n })\r\n\r\n addListener(document, 'mousedown', () => {\r\n keyboardNav = false\r\n picker.classList.remove('clr-keyboard-nav')\r\n closePicker()\r\n })\r\n\r\n addListener(document, 'keydown', (event) => {\r\n const key = event.key\r\n const target = event.target\r\n const shiftKey = event.shiftKey\r\n const navKeys = ['Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight']\r\n\r\n if (key === 'Escape') {\r\n closePicker(true)\r\n return\r\n\r\n // Close the color picker and keep the selected color on press on Enter\r\n } else if (key === 'Enter' && target.tagName !== 'BUTTON') {\r\n closePicker()\r\n return\r\n\r\n // Display focus rings when using the keyboard\r\n } else if (navKeys.includes(key)) {\r\n keyboardNav = true\r\n picker.classList.add('clr-keyboard-nav')\r\n }\r\n\r\n // Trap the focus within the color picker while it's open\r\n if (key === 'Tab' && target.matches('.clr-picker *')) {\r\n const focusables = getFocusableElements()\r\n const firstFocusable = focusables.shift()\r\n const lastFocusable = focusables.pop()\r\n\r\n if (shiftKey && target === firstFocusable) {\r\n lastFocusable.focus()\r\n event.preventDefault()\r\n } else if (!shiftKey && target === lastFocusable) {\r\n firstFocusable.focus()\r\n event.preventDefault()\r\n }\r\n }\r\n })\r\n\r\n addListener(document, 'click', '.clr-field button', (event) => {\r\n // Reset any previously set per-instance options\r\n if (hasInstance) {\r\n resetVirtualInstance()\r\n }\r\n\r\n // Open the color picker\r\n event.target.nextElementSibling.dispatchEvent(new Event('click', { bubbles: true }))\r\n })\r\n\r\n addListener(colorMarker, 'keydown', (event) => {\r\n if (event.key in MARKER_MOVEMENTS) {\r\n moveMarkerOnKeydown(...MARKER_MOVEMENTS[event.key])\r\n event.preventDefault()\r\n }\r\n })\r\n\r\n addListener(colorArea, 'click', moveMarker)\r\n addListener(hueSlider, 'input', setHue)\r\n addListener(alphaSlider, 'input', setAlpha)\r\n}\r\n","/** @import { ColorPickerOptions } from './settings.js' */\r\nimport {\r\n configure,\r\n wrapFields,\r\n closePicker,\r\n setVirtualInstance,\r\n removeVirtualInstance,\r\n updatePickerPosition,\r\n bindFields,\r\n init\r\n} from './picker.js'\r\nimport { DOMReady } from './dom.js'\r\n\r\n/**\r\n * Initializes the color picker, binding it to matching fields or applying global options.\r\n * @param {string | ColorPickerOptions} [options] - A CSS selector string to bind matching fields, or an options object.\r\n * @returns {void}\r\n */\r\nfunction ColorPicker(options) {\r\n DOMReady(() => {\r\n if (options) {\r\n if (typeof options === 'string') {\r\n bindFields(options)\r\n } else {\r\n configure(options)\r\n }\r\n }\r\n })\r\n}\r\n\r\n/** @type {function(ColorPickerOptions): void} */\r\nColorPicker.set = (...args) => DOMReady(configure, args)\r\n\r\n/** @type {function(string | HTMLElement | HTMLElement[]): void} */\r\nColorPicker.wrap = (...args) => DOMReady(wrapFields, args)\r\n\r\n/** @type {function(boolean=): void} */\r\nColorPicker.close = (...args) => DOMReady(closePicker, args)\r\n\r\n/** @type {function(string, ColorPickerOptions): void} */\r\nColorPicker.setInstance = (...args) => DOMReady(setVirtualInstance, args)\r\n\r\n/** @type {function(string): void} */\r\nColorPicker.removeInstance = (...args) => DOMReady(removeVirtualInstance, args)\r\n\r\n/** @type {function(): void} */\r\nColorPicker.updatePosition = (...args) => DOMReady(updatePickerPosition, args)\r\n\r\n/** @type {function(Function, any[]=): void} */\r\nColorPicker.ready = DOMReady\r\n\r\nDOMReady(init)\r\n\r\nexport default ColorPicker\r\n"],"names":["settings","el","parent","theme","themeMode","rtl","wrap","margin","format","formatToggle","swatches","swatchesOnly","alpha","forceAlpha","focusInput","selectInput","inline","defaultColor","clearButton","clearLabel","closeButton","closeLabel","onChange","a11y","open","close","clear","marker","hueSlider","alphaSlider","input","swatch","instruction","ctx","document","createElement","getContext","getEl","id","getElementById","addListener","context","type","selector","fn","addEventListener","event","target","matches","call","DOMReady","args","readyState","currentColor","r","g","b","h","s","v","a","container","picker","colorArea","colorMarker","colorPreview","colorValue","hueMarker","alphaMarker","currentEl","currentFormat","oldColor","keyboardNav","colorAreaDims","instances","currentInstanceId","defaultInstance","hasInstance","MARKER_MOVEMENTS","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","configure","options","key","Object","keys","bindFields","wrapFields","HTMLElement","querySelector","appendChild","body","undefined","window","matchMedia","className","updatePickerPosition","field","getElementsByClassName","classList","toggle","Number","isNaN","style","display","Array","isArray","swatchesContainer","textContent","length","forEach","i","button","setAttribute","color","getColorFormatFromStr","setColorFromStr","label","innerHTML","show","insertBefore","labels","update","openLabel","swatchLabel","setVirtualInstance","removeVirtualInstance","resetVirtualInstance","fields","openPicker","updateColorPreview","element","unsupportedOptions","option","attachVirtualInstance","value","add","focus","preventScroll","setSelectionRange","selectionStart","selectionEnd","select","getFocusableElements","shift","dispatchEvent","Event","bubbles","scrollY","pickerWidth","offsetWidth","pickerHeight","offsetHeight","reposition","left","top","parentStyle","parentMarginTop","parentBorderTop","offset","x","y","getComputedStyle","parseFloat","marginTop","borderTopWidth","getBoundingClientRect","coords","height","clientWidth","width","clientHeight","scrollTop","documentElement","offsetLeft","offsetTop","querySelectorAll","wrapColorField","parentNode","contains","wrapper","classes","closePicker","revert","prevEl","setTimeout","remove","str","rgba","match","fillStyle","exec","replace","map","parseInt","strToRGBA","hsva","red","green","blue","xmax","Math","max","chroma","min","hue","saturation","floor","round","RGBAtoHSVA","updateMarkerA11yLabel","updateColor","fmt","slice","toLowerCase","pickColor","CustomEvent","detail","setColorAtPosition","hueBy60","abs","m","index","HSVAtoRGBA","toFixed","moveMarker","touch","changedTouches","pageX","pageY","setMarkerPosition","preventDefault","stopPropagation","assign","hex","R","toString","padStart","G","B","A","RGBAToHex","opaqueHex","substring","nextElementSibling","RGBAToStr","hsla","lightness","l","HSVAtoHSLA","checked","setHue","setAlpha","filter","node","ColorPicker","set","setInstance","removeInstance","updatePosition","ready","passive","removeEventListener","shiftKey","tagName","includes","focusables","firstFocusable","lastFocusable","pop","offsetX","offsetY","moveMarkerOnKeydown"],"mappings":"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"}
|