@bornova/colorpicker 1.0.0 → 1.1.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.
@@ -1,3 +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}();
1
+ /* @bornova/colorpicker v1.1.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."}};let t;function a(e){if("string"!=typeof e||!e.trim())return{r:0,g:0,b:0,a:1};const a=function(){if(!t&&"undefined"!=typeof document)try{const e=document.createElement("canvas");e.width=1,e.height=1,t=e.getContext("2d",{willReadFrequently:!0})}catch{}return t}();let l=e.trim();a&&(a.fillStyle="#000",a.fillStyle=e,l=a.fillStyle);const n=/^((rgba)|rgb)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i.exec(l);if(n)return{r:Math.min(255,Math.max(0,Number(n[3]))),g:Math.min(255,Math.max(0,Number(n[4]))),b:Math.min(255,Math.max(0,Number(n[5]))),a:""===n[6]?1:Math.min(1,Math.max(0,Number(Number(n[6]).toFixed(2))))};if(/^#?(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(l)){let e=l.replace("#","");return 3!==e.length&&4!==e.length||(e=e.split("").map(e=>e+e).join("")),{r:parseInt(e.slice(0,2),16),g:parseInt(e.slice(2,4),16),b:parseInt(e.slice(4,6),16),a:8===e.length?Number((parseInt(e.slice(6,8),16)/255).toFixed(2)):1}}if(a)try{a.clearRect(0,0,1,1),a.fillRect(0,0,1,1);const[e,t,l,n]=a.getImageData(0,0,1,1).data;return{r:e,g:t,b:l,a:Number((n/255).toFixed(2))}}catch{}return{r:0,g:0,b:0,a:1}}function l(e){return document.getElementById(e)}function n(e,t,a,l){"string"==typeof a?e.addEventListener(t,e=>{e.target instanceof Element&&e.target.matches(a)&&l.call(e.target,e)}):e.addEventListener(t,a)}function r(e,t=[]){"loading"!==document.readyState?e(...t):document.addEventListener("DOMContentLoaded",()=>{e(...t)})}const o={r:0,g:0,b:0,h:0,s:0,v:0,a:1};let c,i,s,u,d,p,f,h,m,b,g,y,v,w,k,x,L={};const C={};let E="",M={};const A=new Set,S=new WeakSet,$={ArrowUp:[0,-1],ArrowDown:[0,1],ArrowLeft:[-1,0],ArrowRight:[1,0]};function N(t){if(t&&"object"==typeof t){for(const a of Object.keys(t))switch(a){case"el":D(t.el),!1!==t.wrap&&(t.wrap||e.wrap)&&j(t.el);break;case"parent":{const a=t.parent instanceof HTMLElement?t.parent:"string"==typeof t.parent?document.querySelector(t.parent):null;a&&(a.appendChild(i),e.parent=t.parent,c=a===document.body?void 0:a);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);const a=i.classList.contains("clr-open"),l=i.classList.contains("clr-left"),n=i.classList.contains("clr-top");i.className=`clr-picker clr-${e.theme} clr-${e.themeMode}`,i.classList.toggle("clr-open",a),i.classList.toggle("clr-left",l),i.classList.toggle("clr-top",n),e.inline&&H();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":e.wrap=!!t.wrap,!("el"in t)&&t.wrap&&j(e.el);break;case"formatToggle":e.formatToggle=!!t.formatToggle,l("clr-format").style.display=e.formatToggle?"block":"none",e.formatToggle&&(e.format="auto");break;case"swatches":if(Array.isArray(t.swatches)){const a=l("clr-swatches");if(a.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)}),a.appendChild(e)}e.swatches=[...t.swatches]}break;case"swatchesOnly":e.swatchesOnly=!!t.swatchesOnly,i.setAttribute("data-minimal",e.swatchesOnly);break;case"alpha":e.alpha=!!t.alpha,i.setAttribute("data-alpha",e.alpha);break;case"inline":e.inline=!!t.inline,i.setAttribute("data-inline",e.inline);break;case"clearButton":e.clearButton=!!t.clearButton,f.style.display=e.clearButton?"block":"none";break;case"clearLabel":e.clearLabel=t.clearLabel,f.textContent=e.clearLabel;break;case"closeButton":e.closeButton=!!t.closeButton,e.closeButton?i.insertBefore(h,d):d.appendChild(h);break;case"closeLabel":e.closeLabel=t.closeLabel,h.textContent=e.closeLabel;break;case"a11y":{const a=t.a11y;let n=!1;if(a&&"object"==typeof a)for(const t of Object.keys(a))a[t]&&e.a11y[t]&&(e.a11y[t]=a[t],n=!0);if(n){const t=l("clr-open-label"),a=l("clr-swatch-label"),n=i.querySelector(".clr-format legend");t.textContent=e.a11y.open,a.textContent=e.a11y.swatch,n&&(n.textContent=e.a11y.format),h.setAttribute("aria-label",e.a11y.close),f.setAttribute("aria-label",e.a11y.clear),m.setAttribute("aria-label",e.a11y.hueSlider),g.setAttribute("aria-label",e.a11y.alphaSlider),p.setAttribute("aria-label",e.a11y.input),s.setAttribute("aria-label",e.a11y.instruction),G(o.s,o.v)}break}default:e[a]=t[a]}if(e.formatToggle&&(e.format="auto"),e.inline&&("inline"in t||"defaultColor"in t||"format"in t||"formatToggle"in t||"alpha"in t||"forceAlpha"in t)){const a=t.defaultColor||e.defaultColor;w=U(a),H(),P(a)}}}function T(e,t){"string"==typeof e&&t&&"object"==typeof t&&(C[e]=t)}function B(e){delete C[e],e===E&&O()}function O(){Object.keys(M).length>0&&(N(M),E="",M={})}function D(e){const t=e instanceof HTMLElement?[e]:e instanceof NodeList?[...e]:e;Array.isArray(t)?t.forEach(e=>{e instanceof HTMLElement&&!S.has(e)&&(S.add(e),n(e,"click",I),n(e,"input",W))}):"string"!=typeof t||A.has(t)||(A.add(t),n(document,"click",t,I),n(document,"input",t,W))}function I(t){if(!e.inline){if(v&&v!==t.target&&q(),function(t){E&&O();const a=["el","wrap","rtl","inline","defaultColor","a11y"];for(const l of Object.keys(C)){const n=C[l];if(t.matches(l)){E=l,M={};const t={...n};a.forEach(e=>delete t[e]);for(const a of Object.keys(t))M[a]=Array.isArray(e[a])?[...e[a]]:e[a],"formatToggle"!==a||"format"in t||(M.format=e.format);N(t);break}}}(t.target),v=t.target,k=v.value,w=U(k),i.classList.add("clr-open"),H(),P(k),x=p.value,e.focusInput||e.selectInput){p.focus({preventScroll:!0});let e=0,t=0;try{e=v.selectionStart,t=v.selectionEnd}catch{}p.setSelectionRange(e,t)}if(e.selectInput&&p.select(),e.swatchesOnly){const e=Z().shift();e&&e.focus()}v.dispatchEvent(new Event("open",{bubbles:!1}))}}function F(){const e=s.getBoundingClientRect();L={width:e.width||s.offsetWidth,height:e.height||s.offsetHeight,x:e.x+window.scrollX,y:e.y+window.scrollY}}function H(){if(i&&(v||e.inline)){if(!e.inline){const t=c,a=window.scrollX,l=window.scrollY,n=i.offsetWidth,r=i.offsetHeight,o={left:!1,top:!1},s=v.getBoundingClientRect();let u=a+s.x,d=l+s.y+s.height+e.margin;if(t){const c=window.getComputedStyle(t),i=parseFloat(c.marginTop),p=parseFloat(c.borderTopWidth),f=parseFloat(c.borderLeftWidth),h=t.getBoundingClientRect();h.x+=f+a,h.y+=p+l,u-=h.x,d-=h.y,u+n>t.clientWidth&&(u+=s.width-n,o.left=!0),d+r>t.clientHeight-i&&r+e.margin<=s.top-(h.y-l)&&(d-=s.height+r+2*e.margin,o.top=!0),u+=t.scrollLeft,d+=t.scrollTop}else u-a+n>document.documentElement.clientWidth&&(u+=s.width-n,o.left=!0),d+r-l>document.documentElement.clientHeight&&r+e.margin<=s.top&&(d=l+s.y-r-e.margin,o.top=!0);i.classList.toggle("clr-left",o.left),i.classList.toggle("clr-top",o.top),i.style.left=`${u}px`,i.style.top=`${d}px`}F()}}function j(e){(e instanceof HTMLElement?[e]:Array.isArray(e)||e instanceof NodeList?[...e]:"string"==typeof e?[...document.querySelectorAll(e)]:[]).forEach(R)}function R(t){const a=t?.parentNode;if(a&&a.classList&&!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 W(e){const t=e.target.parentNode;t&&t.classList&&t.classList.contains("clr-field")&&(t.style.color=e.target.value)}function q(t){if(v&&!e.inline){const a=v;if(t)v=void 0,k!==a.value&&(a.value=k,a.dispatchEvent(new Event("input",{bubbles:!0})));else{const e=p.value;e!==x&&(""!==e&&P(e),X(""===e?"":p.value))}v=void 0,setTimeout(()=>{k!==a.value&&a.dispatchEvent(new Event("change",{bubbles:!0}))}),i.classList.remove("clr-open"),O(),a.dispatchEvent(new Event("close",{bubbles:!1})),e.focusInput&&a.focus({preventScroll:!0})}}function P(e){const t=a(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,i=0;return r&&(i=r/n,c=n===t?(a-l)/r:n===a?2+(l-t)/r:4+(t-a)/r),c=Math.round(60*c),{h:(c+360)%360,s:Math.round(100*i),v:Math.round(100*o),a:e.a}}(t);G(l.s,l.v),J(t,l),m.value=l.h,i.style.color=`hsl(${l.h}, 100%, 50%)`,b.style.left=l.h/360*100+"%",u.style.left=L.width*l.s/100+"px",u.style.top=L.height-L.height*l.v/100+"px",g.value=100*l.a,y.style.left=100*l.a+"%"}function U(e){const t=e.trim().slice(0,3).toLowerCase();return"rgb"===t||"hsl"===t?t:"hex"}function X(t){t=t??p.value,x=p.value,v&&(v.value=t,v.dispatchEvent(new Event("input",{bubbles:!0}))),e.onChange&&e.onChange.call(window,t,v),document.dispatchEvent(new CustomEvent("colorpicker:pick",{detail:{color:t,currentEl:v}}))}function Y(e,t){const a={h:Number(m.value),s:e/L.width*100,v:100-t/L.height*100,a:g.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,i=[l,r,o,o,r,l][c],s=[r,l,l,r,o,o][c],u=[o,o,r,l,l,r][c];return{r:Math.round(255*i),g:Math.round(255*s),b:Math.round(255*u),a:e.a}}(a);G(a.s,a.v),J(l,a),X()}function G(t,a){u.setAttribute("aria-label",e.a11y.marker.replace("{s}",Number(t.toFixed(1))).replace("{v}",Number(a.toFixed(1))))}function K(e){z(e.pageX-L.x,e.pageY-L.y),e.preventDefault(),e.stopPropagation()}function z(e,t){e=Math.max(0,Math.min(e,L.width)),t=Math.max(0,Math.min(t,L.height)),u.style.left=`${e}px`,u.style.top=`${t}px`,Y(e,t),u.focus({preventScroll:!0})}function J(t={},a={}){let l=e.format;Object.assign(o,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=Math.round(255*t.a).toString(16).padStart(2,"0")),"#"+a+l+n+r}(o),r=n.substring(0,7);switch(u.style.color=r,y.parentNode.style.color=r,y.style.color=n,d.style.color=n,"mixed"===l?l=1===o.a?"hex":"rgb":"auto"===l&&(l=w),l){case"hex":p.value=n;break;case"rgb":p.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})`}(o);break;case"hsl":p.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}}(o),!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;const s=i.querySelector(`.clr-format [value="${l}"]`);s&&(s.checked=!0)}function Q(){const e=Number(m.value),t=parseFloat(u.style.left),a=parseFloat(u.style.top);i.style.color=`hsl(${e}, 100%, 50%)`,b.style.left=e/360*100+"%",Y(t,a)}function V(){const e=g.value/100;y.style.left=100*e+"%",J({a:e}),X()}function Z(){return[...i.querySelectorAll("input, button, [tabindex]")].filter(e=>!!e.offsetWidth&&("radio"!==e.type||e.checked))}function _(e){r(()=>{e&&("string"==typeof e?D(e):N(e))})}return _.set=(...e)=>r(N,e),_.wrap=(...e)=>r(j,e),_.close=(...e)=>r(q,e),_.setInstance=(...e)=>r(T,e),_.removeInstance=(...e)=>r(B,e),_.updatePosition=(...e)=>r(H,e),_.ready=r,r(function(){c=void 0,i=document.createElement("div"),i.setAttribute("id","clr-picker"),i.setAttribute("role","dialog"),i.className="clr-picker",i.innerHTML='\n <input id="clr-color-value" name="clr-color-value" class="clr-color" type="text" value="" spellcheck="false">\n <div id="clr-color-area" class="clr-gradient" role="application">\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">\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">\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></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 </fieldset>\n </div>\n <div id="clr-swatches" class="clr-swatches"></div>\n <button type="button" id="clr-clear" class="clr-clear"></button>\n <div id="clr-color-preview" class="clr-preview">\n <button type="button" id="clr-close" class="clr-close"></button>\n </div>\n <span id="clr-open-label" hidden></span>\n <span id="clr-swatch-label" hidden></span>\n ',document.body.appendChild(i),s=l("clr-color-area"),u=l("clr-color-marker"),f=l("clr-clear"),h=l("clr-close"),d=l("clr-color-preview"),p=l("clr-color-value"),m=l("clr-hue-slider"),b=l("clr-hue-marker"),g=l("clr-alpha-slider"),y=l("clr-alpha-marker"),p.setAttribute("aria-label",e.a11y.input),s.setAttribute("aria-label",e.a11y.instruction),m.setAttribute("aria-label",e.a11y.hueSlider),g.setAttribute("aria-label",e.a11y.alphaSlider),f.setAttribute("aria-label",e.a11y.clear),f.textContent=e.clearLabel,h.setAttribute("aria-label",e.a11y.close),h.textContent=e.closeLabel,i.querySelector(".clr-format legend").textContent=e.a11y.format,l("clr-open-label").textContent=e.a11y.open,l("clr-swatch-label").textContent=e.a11y.swatch,D(e.el),j(e.el),n(i,"pointerdown",e=>{e.stopPropagation()}),n(s,"pointerdown",()=>{F(),n(document,"pointermove",K)}),n(s,"contextmenu",e=>{e.preventDefault()}),n(p,"change",()=>{const t=p.value;(v||e.inline)&&(""!==t&&P(t),X(""===t?"":p.value))}),n(f,"click",()=>{X(""),q()}),n(h,"click",()=>{X(),q()}),n(l("clr-format"),"click",".clr-format input",e=>{w=e.target.value,J(),X()}),n(i,"click",".clr-swatches button",t=>{P(t.target.textContent),X(),e.swatchesOnly&&q()}),n(document,"pointerup",()=>{document.removeEventListener("pointermove",K)}),n(document,"pointerdown",()=>{q()}),n(document,"keydown",e=>{const t=e.key,a=e.target,l=e.shiftKey;if("Escape"!==t)if("Enter"!==t||"BUTTON"===a.tagName){if("Tab"===t&&a instanceof Element&&a.matches(".clr-picker *")){const t=Z();if(t.length>1){const n=t[0],r=t[t.length-1];l&&a===n?(r.focus(),e.preventDefault()):l||a!==r||(n.focus(),e.preventDefault())}else 1===t.length&&e.preventDefault()}}else v&&(e.preventDefault(),q());else v&&q(!0)}),n(document,"click",".clr-field button",e=>{O(),e.target.nextElementSibling?.dispatchEvent(new Event("click",{bubbles:!0}))}),n(u,"keydown",e=>{e.key in $&&(!function(e,t){z(parseFloat(u.style.left)+e,parseFloat(u.style.top)+t)}(...$[e.key]),e.preventDefault())}),n(s,"click",K),n(m,"input",Q),n(g,"input",V)}),_}();
3
3
  //# sourceMappingURL=colorpicker.min.js.map
@@ -1 +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":";wCAqEO,MAAMA,EAAW,CACtBC,GAAI,qBACJC,OAAQ,OACRC,MAAO,UACPC,UAAW,QACXC,KAAK,EACLC,MAAM,EACNC,OAAQ,EACRC,OAAQ,MACRC,cAAc,EACdC,SAAU,GACVC,cAAc,EACdC,OAAO,EACPC,YAAY,EACZC,YAAY,EACZC,aAAa,EACbC,QAAQ,EACRC,aAAc,UACdC,aAAa,EACbC,WAAY,QACZC,aAAa,EACbC,WAAY,QACZC,SAAU,OACVC,KAAM,CACJC,KAAM,oBACNC,MAAO,qBACPC,MAAO,2BACPC,OAAQ,oCACRC,UAAW,aACXC,YAAa,iBACbC,MAAO,oBACPtB,OAAQ,eACRuB,OAAQ,eACRC,YAAa,2FC5EXC,EAAMC,SAASC,cAAc,UAAUC,WAAW,MCrBjD,SAASC,EAAMC,GACpB,OAAOJ,SAASK,eAAeD,EACjC,CAUO,SAASE,EAAYC,EAASC,EAAMC,EAAUC,GAC3B,iBAAbD,EACTF,EAAQI,iBAAiBH,EAAOI,IAC1BA,EAAMC,OAAOC,QAAQL,IACvBC,EAAGK,KAAKH,EAAMC,OAAQD,KAI1BL,EAAQI,iBAAiBH,EAAMC,EAEnC,CAQO,SAASO,EAASN,EAAIO,EAAO,IACN,YAAxBjB,SAASkB,WACXR,KAAMO,GAENjB,SAASW,iBAAiB,mBAAoB,KAC5CD,KAAMO,IAGZ,CCrCA,MAAME,EAAe,CAAEC,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGC,EAAG,GAC9D,IAAIC,EACFC,EACAC,EACAC,EACAC,EACAC,EACAhD,EACAE,EACAQ,EACAuC,EACAtC,EACAuC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAgB,CAAA,EAGlB,MAAMC,EAAY,CAAA,EAClB,IAAIC,EAAoB,GACpBC,EAAkB,CAAA,EAClBC,GAAc,EAElB,MAAMC,EAAmB,CACvBC,QAAS,CAAC,MACVC,UAAW,CAAC,EAAG,GACfC,UAAW,EAAC,EAAI,GAChBC,WAAY,CAAC,EAAG,IAQX,SAASC,EAAUC,GACxB,GAAuB,iBAAZA,EAIX,IAAK,MAAMC,KAAOC,OAAOC,KAAKH,GAC5B,OAAQC,GACN,IAAK,KACHG,EAAWJ,EAAQnF,KAEE,IAAjBmF,EAAQ9E,MACVmF,EAAWL,EAAQnF,IAGrB,MACF,IAAK,SACH4D,EAAYuB,EAAQlF,kBAAkBwF,YAAcN,EAAQlF,OAASgC,SAASyD,cAAcP,EAAQlF,QAEhG2D,IACFA,EAAU+B,YAAY9B,GACtB9D,EAASE,OAASkF,EAAQlF,OAGtB2D,IAAc3B,SAAS2D,OACzBhC,OAAYiC,IAIhB,MACF,IAAK,YACH9F,EAASI,UAAYgF,EAAQhF,UAGL,SAAtBgF,EAAQhF,WACR2F,OAAOC,YACPD,OAAOC,WAAW,gCAAgChD,UAElDhD,EAASI,UAAY,QAGzB,IAAK,QACCgF,EAAQjF,QACVH,EAASG,MAAQiF,EAAQjF,OAI3B2D,EAAOmC,UAAY,kBAAkBjG,EAASG,aAAaH,EAASI,YAGhEJ,EAASgB,QACXkF,IAGF,MACF,IAAK,MACHlG,EAASK,MAAQ+E,EAAQ/E,IAEzB,IAAK,MAAM8F,KAASjE,SAASkE,uBAAuB,aAClDD,EAAME,UAAUC,OAAO,UAAWtG,EAASK,KAG7C,MACF,IAAK,SAAU,CACb,MAAME,EAASgG,OAAOnB,EAAQ7E,QAE9BP,EAASO,OAAUiG,MAAMjG,GAAmBP,EAASO,OAAlBA,EAEnC,KACF,CACA,IAAK,OACC6E,EAAQnF,IAAMmF,EAAQ9E,MACxBmF,EAAWL,EAAQnF,IAGrB,MACF,IAAK,eACHD,EAASS,eAAiB2E,EAAQ3E,aAElC4B,EAAM,cAAcoE,MAAMC,QAAU1G,EAASS,aAAe,QAAU,OAElET,EAASS,eACXT,EAASQ,OAAS,QAGpB,MACF,IAAK,WACH,GAAImG,MAAMC,QAAQxB,EAAQ1E,UAAW,CACnC,MAAMmG,EAAoBxE,EAAM,gBAIhC,GAFAwE,EAAkBC,YAAc,GAE5B1B,EAAQ1E,SAASqG,OAAQ,CAC3B,MAAMrG,EAAWwB,SAASC,cAAc,OAExCiD,EAAQ1E,SAASsG,QAAQ,CAACjF,EAAQkF,KAChC,MAAMC,EAAShF,SAASC,cAAc,UAEtC+E,EAAOC,aAAa,OAAQ,UAC5BD,EAAOC,aAAa,KAAM,cAAcF,KACxCC,EAAOC,aAAa,kBAAmB,+BAA+BF,KACtEC,EAAOT,MAAMW,MAAQrF,EACrBmF,EAAOJ,YAAc/E,EACrBrB,EAASkF,YAAYsB,KAGvBL,EAAkBjB,YAAYlF,EAChC,CAEAV,EAASU,SAAW,IAAI0E,EAAQ1E,SAClC,CAEA,MACF,IAAK,eACHV,EAASW,eAAiByE,EAAQzE,aAClCmD,EAAOqD,aAAa,eAAgBnH,EAASW,cAC7C,MACF,IAAK,QACHX,EAASY,QAAUwE,EAAQxE,MAC3BkD,EAAOqD,aAAa,aAAcnH,EAASY,OAC3C,MACF,IAAK,SAIH,GAHAZ,EAASgB,SAAWoE,EAAQpE,OAC5B8C,EAAOqD,aAAa,cAAenH,EAASgB,QAExChB,EAASgB,OAAQ,CACnB,MAAMC,EAAemE,EAAQnE,cAAgBjB,EAASiB,aAEtDqD,EAAgB+C,EAAsBpG,GACtCiF,IACAoB,EAAgBrG,EAClB,CACA,MACF,IAAK,cAAe,CAEiB,iBAAxBmE,EAAQlE,aAA4BkE,EAAQlE,YAAYqG,QACjEvH,EAASmB,WAAaiE,EAAQlE,YAAYqG,MAC1CrG,EAAYsG,UAAYxH,EAASmB,YAGnC,MAAMsG,EAAsC,iBAAxBrC,EAAQlE,YAA2BkE,EAAQlE,YAAYuG,KAAOrC,EAAQlE,YAC1FlB,EAASkB,cAAgBuG,EACzBvG,EAAYuF,MAAMC,QAAU1G,EAASkB,YAAc,QAAU,OAC7D,KACF,CACA,IAAK,aACHlB,EAASmB,WAAaiE,EAAQjE,WAC9BD,EAAYsG,UAAYxH,EAASmB,WACjC,MACF,IAAK,cACHnB,EAASoB,cAAgBgE,EAAQhE,YAE7BpB,EAASoB,YACX0C,EAAO4D,aAAatG,EAAa6C,GAEjCA,EAAa2B,YAAYxE,GAG3B,MACF,IAAK,aACHpB,EAASqB,WAAa+D,EAAQ/D,WAC9BD,EAAYoG,UAAYxH,EAASqB,WACjC,MACF,IAAK,OAAQ,CACX,MAAMsG,EAASvC,EAAQ7D,KACvB,IAAIqG,GAAS,EAEb,GAAsB,iBAAXD,EACT,IAAK,MAAMJ,KAASjC,OAAOC,KAAKoC,GAC1BA,EAAOJ,IAAUvH,EAASuB,KAAKgG,KACjCvH,EAASuB,KAAKgG,GAASI,EAAOJ,GAC9BK,GAAS,GAKf,GAAIA,EAAQ,CACV,MAAMC,EAAYxF,EAAM,kBAClByF,EAAczF,EAAM,oBAE1BwF,EAAUL,UAAYxH,EAASuB,KAAKC,KACpCsG,EAAYN,UAAYxH,EAASuB,KAAKQ,OAEtCX,EAAY+F,aAAa,aAAcnH,EAASuB,KAAKE,OACrDP,EAAYiG,aAAa,aAAcnH,EAASuB,KAAKG,OACrDE,EAAUuF,aAAa,aAAcnH,EAASuB,KAAKK,WACnDC,EAAYsF,aAAa,aAAcnH,EAASuB,KAAKM,aACrDqC,EAAWiD,aAAa,aAAcnH,EAASuB,KAAKO,OACpDiC,EAAUoD,aAAa,aAAcnH,EAASuB,KAAKS,YACrD,CACA,KACF,CACA,QACEhC,EAASqF,GAAOD,EAAQC,GAGhC,CAQO,SAAS0C,EAAmBpF,EAAUyC,GACnB,iBAAbzC,GAA4C,iBAAZyC,IACzCV,EAAU/B,GAAYyC,EACtBP,GAAc,EAElB,CAOO,SAASmD,EAAsBrF,UAC7B+B,EAAU/B,GAEqB,IAAlC2C,OAAOC,KAAKb,GAAWqC,SACzBlC,GAAc,EAEVlC,IAAagC,GACfsD,IAGN,CAwCA,SAASA,IACH3C,OAAOC,KAAKX,GAAiBmC,OAAS,IACxC5B,EAAUP,GACVD,EAAoB,GACpBC,EAAkB,CAAA,EAEtB,CAOO,SAASY,EAAW7C,GACzB,MAAMuF,EAASvF,aAAoB+C,YAAc,CAAC/C,GAAYA,EAE1DgE,MAAMC,QAAQsB,GAChBA,EAAOlB,QAASb,IACd3D,EAAY2D,EAAO,QAASgC,GAC5B3F,EAAY2D,EAAO,QAASiC,MAG9B5F,EAAYN,SAAU,QAASgG,EAAQC,GACvC3F,EAAYN,SAAU,QAASgG,EAAQE,GAE3C,CAOA,SAASD,EAAWrF,GAEd9C,EAASgB,UAnEf,SAA+BqH,GAC7B,GAAIxD,EAAa,CAEf,MAAMyD,EAAqB,CAAC,KAAM,OAAQ,MAAO,SAAU,eAAgB,QAE3E,IAAK,MAAM3F,KAAY2C,OAAOC,KAAKb,GAAY,CAC7C,MAAMU,EAAUV,EAAU/B,GAG1B,GAAI0F,EAAQrF,QAAQL,GAAW,CAC7BgC,EAAoBhC,EACpBiC,EAAkB,CAAA,EAGlB0D,EAAmBtB,QAASuB,UAAkBnD,EAAQmD,IAGtD,IAAK,MAAMA,KAAUjD,OAAOC,KAAKH,GAC/BR,EAAgB2D,GAAU5B,MAAMC,QAAQ5G,EAASuI,IAAW,IAAIvI,EAASuI,IAAWvI,EAASuI,GAI/FpD,EAAUC,GACV,KACF,CACF,CACF,CACF,CA6CEoD,CAAsB1F,EAAMC,QAE5BsB,EAAYvB,EAAMC,OAClBwB,EAAWF,EAAUoE,MACrBnE,EAAgB+C,EAAsB9C,GACtCT,EAAOuC,UAAUqC,IAAI,YAErBxC,IACAoB,EAAgB/C,IAEZvE,EAASc,YAAcd,EAASe,eAClCmD,EAAWyE,MAAM,CAAEC,eAAe,IAClC1E,EAAW2E,kBAAkBxE,EAAUyE,eAAgBzE,EAAU0E,eAG/D/I,EAASe,aACXmD,EAAW8E,UAITxE,GAAexE,EAASW,eAC1BsI,IAAuBC,QAAQP,QAIjCtE,EAAU8E,cAAc,IAAIC,MAAM,OAAQ,CAAEC,SAAS,KACvD,CAMO,SAASnD,IACd,MAAMhG,EAAS2D,EACTyF,EAAUvD,OAAOuD,QACjBC,EAAczF,EAAO0F,YACrBC,EAAe3F,EAAO4F,aACtBC,EAAa,CAAEC,MAAM,EAAOC,KAAK,GACvC,IAAIC,EAAaC,EAAiBC,EAC9BC,EAAS,CAAEC,EAAG,EAAGC,EAAG,GAWxB,GATIjK,IACF4J,EAAc/D,OAAOqE,iBAAiBlK,GACtC6J,EAAkBM,WAAWP,EAAYQ,WACzCN,EAAkBK,WAAWP,EAAYS,gBAEzCN,EAAS/J,EAAOsK,wBAChBP,EAAOE,GAAKH,EAAkBV,IAG3BtJ,EAASgB,OAAQ,CACpB,MAAMyJ,EAASpG,EAAUmG,wBACzB,IAAIZ,EAAOa,EAAOP,EACdL,EAAMP,EAAUmB,EAAON,EAAIM,EAAOC,OAAS1K,EAASO,OAIpDL,GACF0J,GAAQK,EAAOC,EACfL,GAAOI,EAAOE,EAEVP,EAAOL,EAAcrJ,EAAOyK,cAC9Bf,GAAQa,EAAOG,MAAQrB,EACvBI,EAAWC,MAAO,GAGhBC,EAAMJ,EAAevJ,EAAO2K,aAAed,GACzCN,EAAezJ,EAASO,QAAUkK,EAAOZ,KAAOI,EAAOE,EAAIb,KAC7DO,GAAOY,EAAOC,OAASjB,EAAiC,EAAlBzJ,EAASO,OAC/CoJ,EAAWE,KAAM,GAIrBA,GAAO3J,EAAO4K,YAIVlB,EAAOL,EAAcrH,SAAS6I,gBAAgBJ,cAChDf,GAAQa,EAAOG,MAAQrB,EACvBI,EAAWC,MAAO,GAGhBC,EAAMJ,EAAeH,EAAUpH,SAAS6I,gBAAgBF,cACtDpB,EAAezJ,EAASO,QAAUkK,EAAOZ,MAC3CA,EAAMP,EAAUmB,EAAON,EAAIV,EAAezJ,EAASO,OACnDoJ,EAAWE,KAAM,IAKvB/F,EAAOuC,UAAUC,OAAO,WAAYqD,EAAWC,MAC/C9F,EAAOuC,UAAUC,OAAO,UAAWqD,EAAWE,KAC9C/F,EAAO2C,MAAMmD,KAAO,GAAGA,MACvB9F,EAAO2C,MAAMoD,IAAM,GAAGA,MACtBI,EAAOC,GAAKpG,EAAOkH,WACnBf,EAAOE,GAAKrG,EAAOmH,SACrB,CAEAxG,EAAgB,CACdmG,MAAO7G,EAAUyF,YACjBkB,OAAQ3G,EAAU2F,aAClBQ,EAAGnG,EAAUiH,WAAaf,EAAOC,EACjCC,EAAGpG,EAAUkH,UAAYhB,EAAOE,EAEpC,CAOO,SAAS1E,EAAW9C,IAEvBA,aAAoB+C,YAChB,CAAC/C,GACDgE,MAAMC,QAAQjE,GACZA,EACA,IAAIT,SAASgJ,iBAAiBvI,KAE/BqE,QAAQmE,EACjB,CAOA,SAASA,EAAehF,GACtB,MAAMiF,EAAajF,EAAMiF,WAEzB,IAAKA,EAAW/E,UAAUgF,SAAS,aAAc,CAC/C,MAAMC,EAAUpJ,SAASC,cAAc,OACvC,IAAIoJ,EAAU,aAEVvL,EAASK,KAAO8F,EAAME,UAAUgF,SAAS,cAC3CE,GAAW,YAGbD,EAAQ9D,UAAY,mEACpB4D,EAAW1D,aAAa4D,EAASnF,GACjCmF,EAAQrF,UAAYsF,EACpBD,EAAQ7E,MAAMW,MAAQjB,EAAMsC,MAC5B6C,EAAQ1F,YAAYO,EACtB,CACF,CAOA,SAASiC,EAAmBtF,GAC1B,MAAM5C,EAAS4C,EAAMC,OAAOqI,WAGxBlL,EAAOmG,UAAUgF,SAAS,eAC5BnL,EAAOuG,MAAMW,MAAQtE,EAAMC,OAAO0F,MAEtC,CAOO,SAAS+C,EAAYC,GAC1B,GAAIpH,IAAcrE,EAASgB,OAAQ,CACjC,MAAM0K,EAASrH,EAGXoH,IAEFpH,OAAYyB,EAERvB,IAAamH,EAAOjD,QACtBiD,EAAOjD,MAAQlE,EAGfmH,EAAOvC,cAAc,IAAIC,MAAM,QAAS,CAAEC,SAAS,OAKvDsC,WAAW,KAELpH,IAAamH,EAAOjD,OACtBiD,EAAOvC,cAAc,IAAIC,MAAM,SAAU,CAAEC,SAAS,OAKxDvF,EAAOuC,UAAUuF,OAAO,YAGpB/G,GACFoD,IAIFyD,EAAOvC,cAAc,IAAIC,MAAM,QAAS,CAAEC,SAAS,KAE/CrJ,EAASc,YACX4K,EAAO/C,MAAM,CAAEC,eAAe,IAIhCvE,OAAYyB,CACd,CACF,CAOA,SAASwB,EAAgBuE,GACvB,MAAMC,EFzbD,SAAmBD,GAExB,IAAIE,EAAOD,EA8BX,OA3BA7J,EAAI+J,UAAY,OAGhB/J,EAAI+J,UAAYH,EAChBE,EARc,wEAQAE,KAAKhK,EAAI+J,WAEnBD,EACFD,EAAO,CACLxI,EAAGiD,OAAOwF,EAAM,IAChBxI,EAAGgD,OAAOwF,EAAM,IAChBvI,EAAG+C,OAAOwF,EAAM,IAChBnI,EAAG2C,OAAOwF,EAAM,MAGlBA,EAAQ9J,EAAI+J,UACTE,QAAQ,IAAK,IACbH,MAAM,SACNI,IAAK1I,GAAM2I,SAAS3I,EAAG,KAE1BqI,EAAO,CACLxI,EAAGyI,EAAM,GACTxI,EAAGwI,EAAM,GACTvI,EAAGuI,EAAM,GACTnI,EAAG,IAIAkI,CACT,CEwZeO,CAAUR,GACjBS,EFheD,SAAoBR,GACzB,MAAMS,EAAMT,EAAKxI,EAAI,IACfkJ,EAAQV,EAAKvI,EAAI,IACjBkJ,EAAOX,EAAKtI,EAAI,IAChBkJ,EAAOC,KAAKC,IAAIL,EAAKC,EAAOC,GAE5BI,EAASH,EADFC,KAAKG,IAAIP,EAAKC,EAAOC,GAE5BhE,EAAQiE,EACd,IAAIK,EAAM,EACNC,EAAa,EAgBjB,OAdIH,IACFG,EAAaH,EAASH,EAGpBK,EADEL,IAASH,GACJC,EAAQC,GAAQI,EACdH,IAASF,EACZ,GAAKC,EAAOF,GAAOM,EAEnB,GAAKN,EAAMC,GAASK,GAI9BE,EAAMJ,KAAKM,MAAY,GAANF,GAEV,CACLtJ,EAAGsJ,EAAM,EAAIA,EAAM,IAAMA,EACzBrJ,EAAGiJ,KAAKO,MAAmB,IAAbF,GACdrJ,EAAGgJ,KAAKO,MAAc,IAARzE,GACd7E,EAAGkI,EAAKlI,EAEZ,CEiceuJ,CAAWrB,GAExBsB,EAAsBd,EAAK5I,EAAG4I,EAAK3I,GACnC0J,EAAYvB,EAAMQ,GAGlB1K,EAAU6G,MAAQ6D,EAAK7I,EACvBK,EAAO2C,MAAMW,MAAQ,OAAOkF,EAAK7I,gBACjCU,EAAUsC,MAAMmD,KAAW0C,EAAK7I,EAAI,IAAO,IAApB,IAEvBO,EAAYyC,MAAMmD,KAAWnF,EAAcmG,MAAQ0B,EAAK5I,EAAK,IAApC,KACzBM,EAAYyC,MAAMoD,IAASpF,EAAciG,OAAUjG,EAAciG,OAAS4B,EAAK3I,EAAK,IAA5D,KAExB9B,EAAY4G,MAAiB,IAAT6D,EAAK1I,EACzBQ,EAAYqC,MAAMmD,KAAmB,IAAT0C,EAAK1I,EAAR,GAC3B,CAOA,SAASyD,EAAsBwE,GAC7B,MAAMyB,EAAMzB,EAAI0B,MAAM,EAAG,GAAGC,cAE5B,MAAe,QAARF,GAAyB,QAARA,EAAgBA,EAAM,KAChD,CAOA,SAASG,EAAUrG,GACjBA,EAAQA,GAASlD,EAAWuE,MAExBpE,IACFA,EAAUoE,MAAQrB,EAClB/C,EAAU8E,cAAc,IAAIC,MAAM,QAAS,CAAEC,SAAS,MAGpDrJ,EAASsB,UACXtB,EAASsB,SAAS2B,KAAK8C,OAAQqB,EAAO/C,GAGxCnC,SAASiH,cAAc,IAAIuE,YAAY,mBAAoB,CAAEC,OAAQ,CAAEvG,QAAO/C,eAChF,CAQA,SAASuJ,EAAmB1D,EAAGC,GAC7B,MAAMmC,EAAO,CACX7I,EAAG8C,OAAO3E,EAAU6G,OACpB/E,EAAIwG,EAAIzF,EAAcmG,MAAS,IAC/BjH,EAAG,IAAOwG,EAAI1F,EAAciG,OAAU,IACtC9G,EAAG/B,EAAY4G,MAAQ,KAEnBqD,EFhlBD,SAAoBQ,GACzB,MAAMU,EAAaV,EAAK5I,EAAI,IACtB+E,EAAQ6D,EAAK3I,EAAI,IACvB,IAAIkJ,EAASG,EAAavE,EACtBoF,EAAUvB,EAAK7I,EAAI,GACnByG,EAAI2C,GAAU,EAAIF,KAAKmB,IAAKD,EAAU,EAAK,IAC3CE,EAAItF,EAAQoE,EAEhBA,GAAUkB,EACV7D,GAAK6D,EAEL,MAAMC,EAAQrB,KAAKM,MAAMY,GAAW,EAC9BtB,EAAM,CAACM,EAAQ3C,EAAG6D,EAAGA,EAAG7D,EAAG2C,GAAQmB,GACnCxB,EAAQ,CAACtC,EAAG2C,EAAQA,EAAQ3C,EAAG6D,EAAGA,GAAGC,GACrCvB,EAAO,CAACsB,EAAGA,EAAG7D,EAAG2C,EAAQA,EAAQ3C,GAAG8D,GAE1C,MAAO,CACL1K,EAAGqJ,KAAKO,MAAY,IAANX,GACdhJ,EAAGoJ,KAAKO,MAAc,IAARV,GACdhJ,EAAGmJ,KAAKO,MAAa,IAAPT,GACd7I,EAAG0I,EAAK1I,EAEZ,CE0jBeqK,CAAW3B,GAExBc,EAAsBd,EAAK5I,EAAG4I,EAAK3I,GACnC0J,EAAYvB,EAAMQ,GAClBmB,GACF,CAQA,SAASL,EAAsBJ,EAAYvE,GACzCzE,EAAYmD,aACV,aACAnH,EAASuB,KAAKI,OAAOuK,QAAQ,MAAO3F,OAAOyG,EAAWkB,QAAQ,KAAKhC,QAAQ,MAAO3F,OAAOkC,EAAMyF,QAAQ,KAE3G,CAOA,SAASC,EAAWrL,GAClB,MAAMsL,EAAQtL,EAAMuL,iBAAiB,GACrC,IAAInE,GAAKkE,GAAOE,OAASxL,EAAMwL,OAAS7J,EAAcyF,EAClDC,GAAKiE,GAAOG,OAASzL,EAAMyL,OAAS9J,EAAc0F,EAElDtG,IACFsG,GAAKtG,EAAUiH,WAGjB0D,EAAkBtE,EAAGC,GAGrBrH,EAAM2L,iBACN3L,EAAM4L,iBACR,CAqBA,SAASF,EAAkBtE,EAAGC,GAE5BD,EAAIyC,KAAKC,IAAI,EAAGD,KAAKG,IAAI5C,EAAGzF,EAAcmG,QAC1CT,EAAIwC,KAAKC,IAAI,EAAGD,KAAKG,IAAI3C,EAAG1F,EAAciG,SAG1C1G,EAAYyC,MAAMmD,KAAO,GAAGM,MAC5BlG,EAAYyC,MAAMoD,IAAM,GAAGM,MAG3ByD,EAAmB1D,EAAGC,GAGtBnG,EAAY2E,OACd,CAQA,SAAS0E,EAAYvB,EAAO,GAAIQ,EAAO,CAAA,GACrC,IAAI9L,EAASR,EAASQ,OAEtB8E,OAAOqJ,OAAOtL,EAAcyI,EAAMQ,GAElC,MAAMsC,EFtiBD,SAAmB9C,GACxB,MAAM+C,EAAI/C,EAAKxI,EAAEwL,SAAS,IAAIC,SAAS,EAAG,KACpCC,EAAIlD,EAAKvI,EAAEuL,SAAS,IAAIC,SAAS,EAAG,KACpCE,EAAInD,EAAKtI,EAAEsL,SAAS,IAAIC,SAAS,EAAG,KAC1C,IAAIG,EAAI,GAMR,OAJIlP,EAASY,QAAUkL,EAAKlI,EAAI,GAAK5D,EAASa,cAC5CqO,GAAe,IAATpD,EAAKlI,EAAW,GAAGkL,SAAS,IAAIC,SAAS,EAAG,MAG7C,IAAMF,EAAIG,EAAIC,EAAIC,CAC3B,CE2hBcC,CAAU9L,GAChB+L,EAAYR,EAAIS,UAAU,EAAG,GAqBnC,OAnBArL,EAAYyC,MAAMW,MAAQgI,EAC1BhL,EAAYgH,WAAW3E,MAAMW,MAAQgI,EACrChL,EAAYqC,MAAMW,MAAQwH,EAC1B3K,EAAawC,MAAMW,MAAQwH,EAG3B7K,EAAU0C,MAAMC,QAAU,OAC1B3C,EAAU2F,aACV3F,EAAU0C,MAAMC,QAAU,GAC1BtC,EAAYkL,mBAAmB7I,MAAMC,QAAU,OAC/CtC,EAAYkL,mBAAmB5F,aAC/BtF,EAAYkL,mBAAmB7I,MAAMC,QAAU,GAEhC,UAAXlG,EACFA,EAA4B,IAAnB6C,EAAaO,EAAU,MAAQ,MACpB,SAAXpD,IACTA,EAAS8D,GAGH9D,GACN,IAAK,MACH0D,EAAWuE,MAAQmG,EACnB,MACF,IAAK,MACH1K,EAAWuE,MF/iBV,SAAmBqD,GACxB,OAAQ9L,EAASY,OAAqB,IAAXkL,EAAKlI,IAAY5D,EAASa,WACjD,OAAOiL,EAAKxI,MAAMwI,EAAKvI,MAAMuI,EAAKtI,KAClC,QAAQsI,EAAKxI,MAAMwI,EAAKvI,MAAMuI,EAAKtI,MAAMsI,EAAKlI,IACpD,CE2iByB2L,CAAUlM,GAC7B,MACF,IAAK,MACHa,EAAWuE,OFviBS+G,EAjInB,SAAoBlD,GACzB,MAAM7D,EAAQ6D,EAAK3I,EAAI,IACjB8L,EAAYhH,GAAS,EAAI6D,EAAK5I,EAAI,IAAM,GAC9C,IAAIsJ,EAMJ,OAJIyC,EAAY,GAAKA,EAAY,IAC/BzC,EAAaL,KAAKO,OAAQzE,EAAQgH,GAAa9C,KAAKG,IAAI2C,EAAW,EAAIA,GAAc,MAGhF,CACLhM,EAAG6I,EAAK7I,EACRC,EAAGsJ,GAAc,EACjB0C,EAAG/C,KAAKO,MAAkB,IAAZuC,GACd7L,EAAG0I,EAAK1I,EAEZ,CEypBmC+L,CAAWtM,IFtiBpCrD,EAASY,OAAqB,IAAX4O,EAAK5L,IAAY5D,EAASa,WACjD,OAAO2O,EAAK/L,MAAM+L,EAAK9L,OAAO8L,EAAKE,MACnC,QAAQF,EAAK/L,MAAM+L,EAAK9L,OAAO8L,EAAKE,OAAOF,EAAK5L,MAH/C,IAAmB4L,EE4iBxBtN,SAASyD,cAAc,uBAAuBnF,OAAYoP,SAAU,CACtE,CAMA,SAASC,IACP,MAAM9C,EAAMxG,OAAO3E,EAAU6G,OACvByB,EAAIG,WAAWrG,EAAYyC,MAAMmD,MACjCO,EAAIE,WAAWrG,EAAYyC,MAAMoD,KAEvC/F,EAAO2C,MAAMW,MAAQ,OAAO2F,gBAC5B5I,EAAUsC,MAAMmD,KAAWmD,EAAM,IAAO,IAAjB,IAEvBa,EAAmB1D,EAAGC,EACxB,CAMA,SAAS2F,IACP,MAAMlP,EAAQiB,EAAY4G,MAAQ,IAElCrE,EAAYqC,MAAMmD,KAAkB,IAARhJ,EAAH,IACzByM,EAAY,CAAEzJ,EAAGhD,IACjB6M,GACF,CAMA,SAASxE,IACP,MAAO,IAAInF,EAAOoH,iBAAiB,kBAAkB6E,OAAQC,KAAWA,EAAKxG,YAC/E,CC7vBA,SAASyG,EAAY7K,GACnBlC,EAAS,KACHkC,IACqB,iBAAZA,EACTI,EAAWJ,GAEXD,EAAUC,KAIlB,QAGA6K,EAAYC,IAAM,IAAI/M,IAASD,EAASiC,EAAWhC,GAGnD8M,EAAY3P,KAAO,IAAI6C,IAASD,EAASuC,EAAYtC,GAGrD8M,EAAYxO,MAAQ,IAAI0B,IAASD,EAASsI,EAAarI,GAGvD8M,EAAYE,YAAc,IAAIhN,IAASD,EAAS6E,EAAoB5E,GAGpE8M,EAAYG,eAAiB,IAAIjN,IAASD,EAAS8E,EAAuB7E,GAG1E8M,EAAYI,eAAiB,IAAIlN,IAASD,EAASgD,EAAsB/C,GAGzE8M,EAAYK,MAAQpN,EAEpBA,EDkuBO,WAELW,OAAYiC,EACZhC,EAAS5B,SAASC,cAAc,OAChC2B,EAAOqD,aAAa,KAAM,cAC1BrD,EAAOmC,UAAY,aACnBnC,EAAO0D,UAAY,kIAC0GxH,EAASuB,KAAKO,6FAC1D9B,EAASuB,KAAKS,6OAIYhC,EAASuB,KAAKK,+MAIV5B,EAASuB,KAAKM,kMAM7G7B,EAASuB,KAAKf,4hBAWyCR,EAASuB,KAAKG,UAAU1B,EAASmB,uJAE/BnB,EAASuB,KAAKE,UAAUzB,EAASqB,yEAErErB,EAASuB,KAAKC,uDACZxB,EAASuB,KAAKQ,oBAIrDG,SAAS2D,KAAKD,YAAY9B,GAG1BC,EAAY1B,EAAM,kBAClB2B,EAAc3B,EAAM,oBACpBnB,EAAcmB,EAAM,aACpBjB,EAAciB,EAAM,aACpB4B,EAAe5B,EAAM,qBACrB6B,EAAa7B,EAAM,mBACnBT,EAAYS,EAAM,kBAClB8B,EAAY9B,EAAM,kBAClBR,EAAcQ,EAAM,oBACpB+B,EAAc/B,EAAM,oBAGpBmD,EAAWxF,EAASC,IACpBwF,EAAWzF,EAASC,IAEpBuC,EAAYsB,EAAQ,YAAchB,IAChCgB,EAAOuC,UAAUuF,OAAO,oBACxB9I,EAAM4L,oBAGRlM,EAAYuB,EAAW,YAAa,KAClCvB,EAAYN,SAAU,YAAaiM,KAGrC3L,EAAYuB,EAAW,cAAgBjB,IACrCA,EAAM2L,mBAGRjM,EAAYuB,EAAW,aAAc,KACnC7B,SAASW,iBAAiB,YAAasL,EAAY,CAAEoC,SAAS,MAGhE/N,EAAYwB,EAAa,YAAa,KACpCxB,EAAYN,SAAU,YAAaiM,KAGrC3L,EAAYwB,EAAa,aAAc,KACrC9B,SAASW,iBAAiB,YAAasL,EAAY,CAAEoC,SAAS,MAGhE/N,EAAY0B,EAAY,SAAU,KAChC,MAAMuE,EAAQvE,EAAWuE,MAEzB,GAAIpE,GAAarE,EAASgB,OAAQ,CAEhCyM,EADwB,KAAVhF,EAAeA,EAAQnB,EAAgBmB,GAEvD,IAGFjG,EAAYtB,EAAa,QAAS,KAChCuM,EAAU,IACVjC,MAGFhJ,EAAYpB,EAAa,QAAS,KAChCqM,IACAjC,MAGFhJ,EAAYH,EAAM,cAAe,QAAS,oBAAsBS,IAC9DwB,EAAgBxB,EAAMC,OAAO0F,MAC7B4E,IACAI,MAGFjL,EAAYsB,EAAQ,QAAS,uBAAyBhB,IACpDwE,EAAgBxE,EAAMC,OAAO+D,aAC7B2G,IAEIzN,EAASW,cACX6K,MAIJhJ,EAAYN,SAAU,UAAW,KAC/BA,SAASsO,oBAAoB,YAAarC,KAG5C3L,EAAYN,SAAU,WAAY,KAChCA,SAASsO,oBAAoB,YAAarC,KAG5C3L,EAAYN,SAAU,YAAa,KACjCsC,GAAc,EACdV,EAAOuC,UAAUuF,OAAO,oBACxBJ,MAGFhJ,EAAYN,SAAU,UAAYY,IAChC,MAAMuC,EAAMvC,EAAMuC,IACZtC,EAASD,EAAMC,OACf0N,EAAW3N,EAAM2N,SAGvB,GAAY,WAARpL,EAKG,GAAY,UAARA,GAAsC,WAAnBtC,EAAO2N,SAWrC,GAlBgB,CAAC,MAAO,UAAW,YAAa,YAAa,cAY1CC,SAAStL,KAC1Bb,GAAc,EACdV,EAAOuC,UAAUqC,IAAI,qBAIX,QAARrD,GAAiBtC,EAAOC,QAAQ,iBAAkB,CACpD,MAAM4N,EAAa3H,IACb4H,EAAiBD,EAAW1H,QAC5B4H,EAAgBF,EAAWG,MAE7BN,GAAY1N,IAAW8N,GACzBC,EAAcnI,QACd7F,EAAM2L,kBACIgC,GAAY1N,IAAW+N,IACjCD,EAAelI,QACf7F,EAAM2L,iBAEV,OAtBEjD,SALAA,GAAY,KA8BhBhJ,EAAYN,SAAU,QAAS,oBAAsBY,IAE/C+B,GACFoD,IAIFnF,EAAMC,OAAOuM,mBAAmBnG,cAAc,IAAIC,MAAM,QAAS,CAAEC,SAAS,OAG9E7G,EAAYwB,EAAa,UAAYlB,IAC/BA,EAAMuC,OAAOP,KA1SrB,SAA6BkM,EAASC,GAIpCzC,EAHUnE,WAAWrG,EAAYyC,MAAMmD,MAAQoH,EACrC3G,WAAWrG,EAAYyC,MAAMoD,KAAOoH,EAGhD,CAsSMC,IAAuBpM,EAAiBhC,EAAMuC,MAC9CvC,EAAM2L,oBAIVjM,EAAYuB,EAAW,QAASoK,GAChC3L,EAAYZ,EAAW,QAASiO,GAChCrN,EAAYX,EAAa,QAASiO,EACpC"}
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":["/**\n * @typedef {Object} A11yLabels\n * @property {string} open\n * @property {string} close\n * @property {string} clear\n * @property {string} marker\n * @property {string} hueSlider\n * @property {string} alphaSlider\n * @property {string} input\n * @property {string} format\n * @property {string} swatch\n * @property {string} instruction\n */\n\n/**\n * @typedef {Object} ColorPickerOptions\n * @property {string|HTMLElement|HTMLElement[]|NodeList} [el]\n * @property {string|HTMLElement} [parent]\n * @property {string} [theme]\n * @property {'light'|'dark'|'auto'} [themeMode]\n * @property {boolean} [rtl]\n * @property {boolean} [wrap]\n * @property {number} [margin]\n * @property {'hex'|'rgb'|'hsl'|'auto'|'mixed'} [format]\n * @property {boolean} [formatToggle]\n * @property {string[]} [swatches]\n * @property {boolean} [swatchesOnly]\n * @property {boolean} [alpha]\n * @property {boolean} [forceAlpha]\n * @property {boolean} [focusInput]\n * @property {boolean} [selectInput]\n * @property {boolean} [inline]\n * @property {string} [defaultColor]\n * @property {boolean} [clearButton]\n * @property {string} [clearLabel]\n * @property {boolean} [closeButton]\n * @property {string} [closeLabel]\n * @property {(color: string, input?: HTMLElement) => void} [onChange]\n * @property {Partial<A11yLabels>} [a11y]\n */\n\n/**\n * @typedef {Object} Settings\n * @property {string} el\n * @property {string|HTMLElement} parent\n * @property {string} theme\n * @property {string} themeMode\n * @property {boolean} rtl\n * @property {boolean} wrap\n * @property {number} margin\n * @property {string} format\n * @property {boolean} formatToggle\n * @property {string[]} swatches\n * @property {boolean} swatchesOnly\n * @property {boolean} alpha\n * @property {boolean} forceAlpha\n * @property {boolean} focusInput\n * @property {boolean} selectInput\n * @property {boolean} inline\n * @property {string} defaultColor\n * @property {boolean} clearButton\n * @property {string} clearLabel\n * @property {boolean} closeButton\n * @property {string} closeLabel\n * @property {(color: string, input?: HTMLElement) => void} onChange\n * @property {A11yLabels} a11y\n */\n\n/** @type {Settings} */\nexport const settings = {\n el: '[data-colorpicker]',\n parent: 'body',\n theme: 'default',\n themeMode: 'light',\n rtl: false,\n wrap: true,\n margin: 2,\n format: 'hex',\n formatToggle: false,\n swatches: [],\n swatchesOnly: false,\n alpha: true,\n forceAlpha: false,\n focusInput: true,\n selectInput: false,\n inline: false,\n defaultColor: '#000000',\n clearButton: false,\n clearLabel: 'Clear',\n closeButton: false,\n closeLabel: 'Close',\n onChange: () => undefined,\n a11y: {\n open: 'Open color picker',\n close: 'Close color picker',\n clear: 'Clear the selected color',\n marker: 'Saturation: {s}. Brightness: {v}.',\n hueSlider: 'Hue slider',\n alphaSlider: 'Opacity slider',\n input: 'Color value field',\n format: 'Color format',\n swatch: 'Color swatch',\n instruction: 'Saturation and brightness selector. Use up, down, left and right arrow keys to select.'\n }\n}\n","import { settings } from './settings.js'\n\n/**\n * @typedef {Object} RGBA\n * @property {number} r - Red channel (0–255)\n * @property {number} g - Green channel (0–255)\n * @property {number} b - Blue channel (0–255)\n * @property {number} a - Alpha channel (0–1)\n */\n\n/**\n * @typedef {Object} HSVA\n * @property {number} h - Hue (0–360)\n * @property {number} s - Saturation (0–100)\n * @property {number} v - Value/brightness (0–100)\n * @property {number} a - Alpha channel (0–1)\n */\n\n/**\n * @typedef {Object} HSLA\n * @property {number} h - Hue (0–360)\n * @property {number} s - Saturation (0–100)\n * @property {number} l - Lightness (0–100)\n * @property {number} a - Alpha channel (0–1)\n */\n\nlet ctx\nfunction getCtx() {\n if (!ctx && typeof document !== 'undefined') {\n try {\n const canvas = document.createElement('canvas')\n canvas.width = 1\n canvas.height = 1\n ctx = canvas.getContext('2d', { willReadFrequently: true })\n } catch {\n // Canvas is not supported or allowed\n }\n }\n\n return ctx\n}\n\n/**\n * Converts HSVA color values to RGBA.\n * @param {HSVA} hsva\n * @returns {RGBA}\n */\nexport function HSVAtoRGBA(hsva) {\n const saturation = hsva.s / 100\n const value = hsva.v / 100\n let chroma = saturation * value\n let hueBy60 = hsva.h / 60\n let x = chroma * (1 - Math.abs((hueBy60 % 2) - 1))\n let m = value - chroma\n\n chroma += m\n x += m\n\n const index = Math.floor(hueBy60) % 6\n const red = [chroma, x, m, m, x, chroma][index]\n const green = [x, chroma, chroma, x, m, m][index]\n const blue = [m, m, x, chroma, chroma, x][index]\n\n return {\n r: Math.round(red * 255),\n g: Math.round(green * 255),\n b: Math.round(blue * 255),\n a: hsva.a\n }\n}\n\n/**\n * Converts HSVA color values to HSLA.\n * @param {HSVA} hsva\n * @returns {HSLA}\n */\nexport function HSVAtoHSLA(hsva) {\n const value = hsva.v / 100\n const lightness = value * (1 - hsva.s / 100 / 2)\n let saturation\n\n if (lightness > 0 && lightness < 1) {\n saturation = Math.round(((value - lightness) / Math.min(lightness, 1 - lightness)) * 100)\n }\n\n return {\n h: hsva.h,\n s: saturation || 0,\n l: Math.round(lightness * 100),\n a: hsva.a\n }\n}\n\n/**\n * Converts RGBA color values to HSVA.\n * @param {RGBA} rgba\n * @returns {HSVA}\n */\nexport function RGBAtoHSVA(rgba) {\n const red = rgba.r / 255\n const green = rgba.g / 255\n const blue = rgba.b / 255\n const xmax = Math.max(red, green, blue)\n const xmin = Math.min(red, green, blue)\n const chroma = xmax - xmin\n const value = xmax\n let hue = 0\n let saturation = 0\n\n if (chroma) {\n saturation = chroma / xmax\n\n if (xmax === red) {\n hue = (green - blue) / chroma\n } else if (xmax === green) {\n hue = 2 + (blue - red) / chroma\n } else {\n hue = 4 + (red - green) / chroma\n }\n }\n\n hue = Math.round(hue * 60)\n\n return {\n h: (hue + 360) % 360,\n s: Math.round(saturation * 100),\n v: Math.round(value * 100),\n a: rgba.a\n }\n}\n\n/**\n * Parses any valid CSS color string and returns its RGBA components.\n * @param {string} str - Any valid CSS color string.\n * @returns {RGBA}\n */\nexport function strToRGBA(str) {\n if (typeof str !== 'string' || !str.trim()) {\n return { r: 0, g: 0, b: 0, a: 1 }\n }\n\n const regex = /^((rgba)|rgb)[\\D]+([\\d.]+)[\\D]+([\\d.]+)[\\D]+([\\d.]+)[\\D]*?([\\d.]+|$)/i\n const canvasCtx = getCtx()\n let normalized = str.trim()\n\n if (canvasCtx) {\n // Default to black for invalid color strings, then let canvas normalize the string\n canvasCtx.fillStyle = '#000'\n canvasCtx.fillStyle = str\n normalized = canvasCtx.fillStyle\n }\n\n const match = regex.exec(normalized)\n\n if (match) {\n return {\n r: Math.min(255, Math.max(0, Number(match[3]))),\n g: Math.min(255, Math.max(0, Number(match[4]))),\n b: Math.min(255, Math.max(0, Number(match[5]))),\n a: match[6] === '' ? 1 : Math.min(1, Math.max(0, Number(Number(match[6]).toFixed(2))))\n }\n }\n\n if (/^#?(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i.test(normalized)) {\n let hex = normalized.replace('#', '')\n\n if (hex.length === 3 || hex.length === 4) {\n hex = hex\n .split('')\n .map((c) => c + c)\n .join('')\n }\n\n return {\n r: parseInt(hex.slice(0, 2), 16),\n g: parseInt(hex.slice(2, 4), 16),\n b: parseInt(hex.slice(4, 6), 16),\n a: hex.length === 8 ? Number((parseInt(hex.slice(6, 8), 16) / 255).toFixed(2)) : 1\n }\n }\n\n if (canvasCtx) {\n try {\n canvasCtx.clearRect(0, 0, 1, 1)\n canvasCtx.fillRect(0, 0, 1, 1)\n const [r, g, b, a] = canvasCtx.getImageData(0, 0, 1, 1).data\n return { r, g, b, a: Number((a / 255).toFixed(2)) }\n } catch {\n // Fallback to black\n }\n }\n\n return { r: 0, g: 0, b: 0, a: 1 }\n}\n\n/**\n * Converts RGBA color values to a CSS hex color string.\n * @param {RGBA} rgba\n * @returns {string} Hex color string (e.g. `#rrggbb` or `#rrggbbaa`).\n */\nexport function RGBAToHex(rgba) {\n const R = rgba.r.toString(16).padStart(2, '0')\n const G = rgba.g.toString(16).padStart(2, '0')\n const B = rgba.b.toString(16).padStart(2, '0')\n let A = ''\n\n if (settings.alpha && (rgba.a < 1 || settings.forceAlpha)) {\n A = Math.round(rgba.a * 255)\n .toString(16)\n .padStart(2, '0')\n }\n\n return '#' + R + G + B + A\n}\n\n/**\n * Converts RGBA color values to a CSS `rgb()` or `rgba()` string.\n * @param {RGBA} rgba\n * @returns {string}\n */\nexport function RGBAToStr(rgba) {\n return !settings.alpha || (rgba.a === 1 && !settings.forceAlpha)\n ? `rgb(${rgba.r}, ${rgba.g}, ${rgba.b})`\n : `rgba(${rgba.r}, ${rgba.g}, ${rgba.b}, ${rgba.a})`\n}\n\n/**\n * Converts HSLA color values to a CSS `hsl()` or `hsla()` string.\n * @param {HSLA} hsla\n * @returns {string}\n */\nexport function HSLAToStr(hsla) {\n return !settings.alpha || (hsla.a === 1 && !settings.forceAlpha)\n ? `hsl(${hsla.h}, ${hsla.s}%, ${hsla.l}%)`\n : `hsla(${hsla.h}, ${hsla.s}%, ${hsla.l}%, ${hsla.a})`\n}\n","/**\n * Returns the element with the given ID.\n * @param {string} id\n * @returns {HTMLElement | null}\n */\nexport function getEl(id) {\n return document.getElementById(id)\n}\n\n/**\n * Attaches an event listener to an element, with optional CSS selector delegation.\n * @param {EventTarget} context - The element to attach the listener to.\n * @param {string} type - The event type.\n * @param {string | EventListener} selector - A CSS selector for event delegation, or a direct event handler.\n * @param {EventListener} [fn] - Event handler (required when `selector` is a string).\n * @returns {void}\n */\nexport function addListener(context, type, selector, fn) {\n if (typeof selector === 'string') {\n context.addEventListener(type, (event) => {\n if (event.target instanceof Element && event.target.matches(selector)) {\n fn.call(event.target, event)\n }\n })\n } else {\n context.addEventListener(type, selector)\n }\n}\n\n/**\n * Calls `fn` immediately if the DOM is ready, otherwise defers until `DOMContentLoaded`.\n * @param {Function} fn - The function to call.\n * @param {any[]} [args] - Arguments to pass to `fn`.\n * @returns {void}\n */\nexport function DOMReady(fn, args = []) {\n if (document.readyState !== 'loading') {\n fn(...args)\n } else {\n document.addEventListener('DOMContentLoaded', () => {\n fn(...args)\n })\n }\n}\n","/** @import { ColorPickerOptions, Settings } from './settings.js' */\n/** @import { RGBA, HSVA } from './colors.js' */\nimport { settings } from './settings.js'\nimport { HSVAtoRGBA, HSVAtoHSLA, RGBAtoHSVA, strToRGBA, RGBAToHex, RGBAToStr, HSLAToStr } from './colors.js'\nimport { getEl, addListener } from './dom.js'\n\nconst currentColor = { r: 0, g: 0, b: 0, h: 0, s: 0, v: 0, a: 1 }\nlet container,\n picker,\n colorArea,\n colorMarker,\n colorPreview,\n colorValue,\n clearButton,\n closeButton,\n hueSlider,\n hueMarker,\n alphaSlider,\n alphaMarker,\n currentEl,\n currentFormat,\n oldColor,\n initialFormatColor,\n colorAreaDims = {}\n\n// Virtual instances cache\nconst instances = {}\nlet currentInstanceId = ''\nlet defaultInstance = {}\n\n// Bound targets cache to prevent duplicate event listeners\nconst boundSelectors = new Set()\nconst boundElements = new WeakSet()\n\nconst MARKER_MOVEMENTS = {\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0]\n}\n\n/**\n * Applies configuration options to the color picker.\n * @param {ColorPickerOptions} options\n * @returns {void}\n */\nexport function configure(options) {\n if (!options || typeof options !== 'object') {\n return\n }\n\n for (const key of Object.keys(options)) {\n switch (key) {\n case 'el':\n bindFields(options.el)\n\n if (options.wrap !== false && (options.wrap || settings.wrap)) {\n wrapFields(options.el)\n }\n\n break\n case 'parent': {\n const newContainer =\n options.parent instanceof HTMLElement\n ? options.parent\n : typeof options.parent === 'string'\n ? document.querySelector(options.parent)\n : null\n\n if (newContainer) {\n newContainer.appendChild(picker)\n settings.parent = options.parent\n\n // document.body is special\n container = newContainer === document.body ? undefined : newContainer\n }\n\n break\n }\n case 'themeMode':\n settings.themeMode = options.themeMode\n\n if (\n options.themeMode === 'auto' &&\n window.matchMedia &&\n window.matchMedia('(prefers-color-scheme: dark)').matches\n ) {\n settings.themeMode = 'dark'\n }\n // falls through\n case 'theme': {\n if (options.theme) {\n settings.theme = options.theme\n }\n\n const isOpen = picker.classList.contains('clr-open')\n const isLeft = picker.classList.contains('clr-left')\n const isTop = picker.classList.contains('clr-top')\n\n // Set the theme and color scheme while preserving runtime state classes\n picker.className = `clr-picker clr-${settings.theme} clr-${settings.themeMode}`\n picker.classList.toggle('clr-open', isOpen)\n picker.classList.toggle('clr-left', isLeft)\n picker.classList.toggle('clr-top', isTop)\n\n // Update the color picker's position if inline mode is in use\n if (settings.inline) {\n updatePickerPosition()\n }\n\n break\n }\n case 'rtl':\n settings.rtl = !!options.rtl\n\n for (const field of document.getElementsByClassName('clr-field')) {\n field.classList.toggle('clr-rtl', settings.rtl)\n }\n\n break\n case 'margin': {\n const margin = Number(options.margin)\n\n settings.margin = !isNaN(margin) ? margin : settings.margin\n\n break\n }\n case 'wrap':\n settings.wrap = !!options.wrap\n\n if (!('el' in options) && options.wrap) {\n wrapFields(settings.el)\n }\n\n break\n case 'formatToggle':\n settings.formatToggle = !!options.formatToggle\n\n getEl('clr-format').style.display = settings.formatToggle ? 'block' : 'none'\n\n if (settings.formatToggle) {\n settings.format = 'auto'\n }\n\n break\n case 'swatches':\n if (Array.isArray(options.swatches)) {\n const swatchesContainer = getEl('clr-swatches')\n\n swatchesContainer.textContent = ''\n\n if (options.swatches.length) {\n const swatches = document.createElement('div')\n\n options.swatches.forEach((swatch, i) => {\n const button = document.createElement('button')\n\n button.setAttribute('type', 'button')\n button.setAttribute('id', `clr-swatch-${i}`)\n button.setAttribute('aria-labelledby', `clr-swatch-label clr-swatch-${i}`)\n button.style.color = swatch\n button.textContent = swatch\n swatches.appendChild(button)\n })\n\n swatchesContainer.appendChild(swatches)\n }\n\n settings.swatches = [...options.swatches]\n }\n\n break\n case 'swatchesOnly':\n settings.swatchesOnly = !!options.swatchesOnly\n picker.setAttribute('data-minimal', settings.swatchesOnly)\n break\n case 'alpha':\n settings.alpha = !!options.alpha\n picker.setAttribute('data-alpha', settings.alpha)\n break\n case 'inline':\n settings.inline = !!options.inline\n picker.setAttribute('data-inline', settings.inline)\n break\n case 'clearButton':\n settings.clearButton = !!options.clearButton\n clearButton.style.display = settings.clearButton ? 'block' : 'none'\n break\n case 'clearLabel':\n settings.clearLabel = options.clearLabel\n clearButton.textContent = settings.clearLabel\n break\n case 'closeButton':\n settings.closeButton = !!options.closeButton\n\n if (settings.closeButton) {\n picker.insertBefore(closeButton, colorPreview)\n } else {\n colorPreview.appendChild(closeButton)\n }\n\n break\n case 'closeLabel':\n settings.closeLabel = options.closeLabel\n closeButton.textContent = settings.closeLabel\n break\n case 'a11y': {\n const labels = options.a11y\n let update = false\n\n if (labels && typeof labels === 'object') {\n for (const label of Object.keys(labels)) {\n if (labels[label] && settings.a11y[label]) {\n settings.a11y[label] = labels[label]\n update = true\n }\n }\n }\n\n if (update) {\n const openLabel = getEl('clr-open-label')\n const swatchLabel = getEl('clr-swatch-label')\n const formatLegend = picker.querySelector('.clr-format legend')\n\n openLabel.textContent = settings.a11y.open\n swatchLabel.textContent = settings.a11y.swatch\n if (formatLegend) {\n formatLegend.textContent = settings.a11y.format\n }\n\n closeButton.setAttribute('aria-label', settings.a11y.close)\n clearButton.setAttribute('aria-label', settings.a11y.clear)\n hueSlider.setAttribute('aria-label', settings.a11y.hueSlider)\n alphaSlider.setAttribute('aria-label', settings.a11y.alphaSlider)\n colorValue.setAttribute('aria-label', settings.a11y.input)\n colorArea.setAttribute('aria-label', settings.a11y.instruction)\n updateMarkerA11yLabel(currentColor.s, currentColor.v)\n }\n break\n }\n default:\n settings[key] = options[key]\n }\n }\n\n if (settings.formatToggle) {\n settings.format = 'auto'\n }\n\n if (\n settings.inline &&\n ('inline' in options ||\n 'defaultColor' in options ||\n 'format' in options ||\n 'formatToggle' in options ||\n 'alpha' in options ||\n 'forceAlpha' in options)\n ) {\n const defaultColor = options.defaultColor || settings.defaultColor\n\n currentFormat = getColorFormatFromStr(defaultColor)\n updatePickerPosition()\n setColorFromStr(defaultColor)\n }\n}\n\n/**\n * Registers a virtual instance that applies custom options to fields matching a CSS selector.\n * @param {string} selector - CSS selector identifying the target field(s).\n * @param {ColorPickerOptions} options - Options to apply when the picker opens for a matching field.\n * @returns {void}\n */\nexport function setVirtualInstance(selector, options) {\n if (typeof selector === 'string' && options && typeof options === 'object') {\n instances[selector] = options\n }\n}\n\n/**\n * Removes a previously registered virtual instance.\n * @param {string} selector - The CSS selector of the instance to remove.\n * @returns {void}\n */\nexport function removeVirtualInstance(selector) {\n delete instances[selector]\n\n if (selector === currentInstanceId) {\n resetVirtualInstance()\n }\n}\n\n/**\n * Applies the virtual instance options for the given element, if a matching instance exists.\n * @param {HTMLElement} element\n * @returns {void}\n */\nfunction attachVirtualInstance(element) {\n if (currentInstanceId) {\n resetVirtualInstance()\n }\n\n // These options can only be set globally, not per instance\n const unsupportedOptions = ['el', 'wrap', 'rtl', 'inline', 'defaultColor', 'a11y']\n\n for (const selector of Object.keys(instances)) {\n const options = instances[selector]\n\n // If the element matches an instance's CSS selector\n if (element.matches(selector)) {\n currentInstanceId = selector\n defaultInstance = {}\n\n // Clone the options object to avoid mutating the user's config\n const clonedOptions = { ...options }\n\n // Delete unsupported options\n unsupportedOptions.forEach((option) => delete clonedOptions[option])\n\n // Back up the default options so we can restore them later\n for (const option of Object.keys(clonedOptions)) {\n defaultInstance[option] = Array.isArray(settings[option]) ? [...settings[option]] : settings[option]\n if (option === 'formatToggle' && !('format' in clonedOptions)) {\n defaultInstance.format = settings.format\n }\n }\n\n // Set the instance's options\n configure(clonedOptions)\n break\n }\n }\n}\n\n/**\n * Restores the default settings after a virtual instance was applied.\n * @returns {void}\n */\nfunction resetVirtualInstance() {\n if (Object.keys(defaultInstance).length > 0) {\n configure(defaultInstance)\n currentInstanceId = ''\n defaultInstance = {}\n }\n}\n\n/**\n * Binds the color picker to one or more input fields.\n * @param {string | HTMLElement | HTMLElement[] | NodeList} selector - A CSS selector string, a single element, or a list of elements.\n * @returns {void}\n */\nexport function bindFields(selector) {\n const fields = selector instanceof HTMLElement ? [selector] : selector instanceof NodeList ? [...selector] : selector\n\n if (Array.isArray(fields)) {\n fields.forEach((field) => {\n if (field instanceof HTMLElement && !boundElements.has(field)) {\n boundElements.add(field)\n addListener(field, 'click', openPicker)\n addListener(field, 'input', updateColorPreview)\n }\n })\n } else if (typeof fields === 'string' && !boundSelectors.has(fields)) {\n boundSelectors.add(fields)\n addListener(document, 'click', fields, openPicker)\n addListener(document, 'input', fields, updateColorPreview)\n }\n}\n\n/**\n * Opens the color picker for the field that triggered the event.\n * @param {Event} event\n * @returns {void}\n */\nfunction openPicker(event) {\n // Skip if inline mode is in use\n if (settings.inline) {\n return\n }\n\n // Close any previously open field before opening a new one\n if (currentEl && currentEl !== event.target) {\n closePicker()\n }\n\n // Apply any per-instance options first\n attachVirtualInstance(event.target)\n\n currentEl = event.target\n oldColor = currentEl.value\n currentFormat = getColorFormatFromStr(oldColor)\n picker.classList.add('clr-open')\n\n updatePickerPosition()\n setColorFromStr(oldColor)\n initialFormatColor = colorValue.value\n\n if (settings.focusInput || settings.selectInput) {\n colorValue.focus({ preventScroll: true })\n let selectionStart = 0\n let selectionEnd = 0\n try {\n selectionStart = currentEl.selectionStart\n selectionEnd = currentEl.selectionEnd\n } catch {\n // Input type (like \"color\") does not support selection\n }\n colorValue.setSelectionRange(selectionStart, selectionEnd)\n }\n\n if (settings.selectInput) {\n colorValue.select()\n }\n\n // Focus the first element when using swatchesOnly\n if (settings.swatchesOnly) {\n const firstFocusable = getFocusableElements().shift()\n if (firstFocusable) {\n firstFocusable.focus()\n }\n }\n\n // Trigger an \"open\" event\n currentEl.dispatchEvent(new Event('open', { bubbles: false }))\n}\n\n/**\n * Updates the cached dimensions and document offset of the saturation/brightness color area.\n * @returns {void}\n */\nfunction updateColorAreaDims() {\n const rect = colorArea.getBoundingClientRect()\n\n colorAreaDims = {\n width: rect.width || colorArea.offsetWidth,\n height: rect.height || colorArea.offsetHeight,\n x: rect.x + window.scrollX,\n y: rect.y + window.scrollY\n }\n}\n\n/**\n * Recalculates and applies the picker's position relative to the active input field.\n * @returns {void}\n */\nexport function updatePickerPosition() {\n if (!picker || (!currentEl && !settings.inline)) {\n return\n }\n\n if (!settings.inline) {\n const parent = container\n const scrollX = window.scrollX\n const scrollY = window.scrollY\n const pickerWidth = picker.offsetWidth\n const pickerHeight = picker.offsetHeight\n const reposition = { left: false, top: false }\n const coords = currentEl.getBoundingClientRect()\n let left = scrollX + coords.x\n let top = scrollY + coords.y + coords.height + settings.margin\n\n // If the color picker is inside a custom container\n // set the position relative to it\n if (parent) {\n const parentStyle = window.getComputedStyle(parent)\n const parentMarginTop = parseFloat(parentStyle.marginTop)\n const parentBorderTop = parseFloat(parentStyle.borderTopWidth)\n const parentBorderLeft = parseFloat(parentStyle.borderLeftWidth)\n const offset = parent.getBoundingClientRect()\n\n offset.x += parentBorderLeft + scrollX\n offset.y += parentBorderTop + scrollY\n\n left -= offset.x\n top -= offset.y\n\n if (left + pickerWidth > parent.clientWidth) {\n left += coords.width - pickerWidth\n reposition.left = true\n }\n\n if (top + pickerHeight > parent.clientHeight - parentMarginTop) {\n if (pickerHeight + settings.margin <= coords.top - (offset.y - scrollY)) {\n top -= coords.height + pickerHeight + settings.margin * 2\n reposition.top = true\n }\n }\n\n left += parent.scrollLeft\n top += parent.scrollTop\n\n // Otherwise set the position relative to the whole document\n } else {\n if (left - scrollX + pickerWidth > document.documentElement.clientWidth) {\n left += coords.width - pickerWidth\n reposition.left = true\n }\n\n if (top + pickerHeight - scrollY > document.documentElement.clientHeight) {\n if (pickerHeight + settings.margin <= coords.top) {\n top = scrollY + coords.y - pickerHeight - settings.margin\n reposition.top = true\n }\n }\n }\n\n picker.classList.toggle('clr-left', reposition.left)\n picker.classList.toggle('clr-top', reposition.top)\n picker.style.left = `${left}px`\n picker.style.top = `${top}px`\n }\n\n updateColorAreaDims()\n}\n\n/**\n * Wraps one or more color input fields in a `.clr-field` container with a preview button.\n * @param {string | HTMLElement | HTMLElement[] | NodeList} selector - A CSS selector string, a single element, or a list of elements.\n * @returns {void}\n */\nexport function wrapFields(selector) {\n const fields =\n selector instanceof HTMLElement\n ? [selector]\n : Array.isArray(selector) || selector instanceof NodeList\n ? [...selector]\n : typeof selector === 'string'\n ? [...document.querySelectorAll(selector)]\n : []\n\n fields.forEach(wrapColorField)\n}\n\n/**\n * Wraps a single color input field in a `.clr-field` container.\n * @param {HTMLInputElement} field\n * @returns {void}\n */\nfunction wrapColorField(field) {\n const parentNode = field?.parentNode\n\n if (parentNode && parentNode.classList && !parentNode.classList.contains('clr-field')) {\n const wrapper = document.createElement('div')\n let classes = 'clr-field'\n\n if (settings.rtl || field.classList.contains('clr-rtl')) {\n classes += ' clr-rtl'\n }\n\n wrapper.innerHTML = '<button type=\"button\" aria-labelledby=\"clr-open-label\"></button>'\n parentNode.insertBefore(wrapper, field)\n wrapper.className = classes\n wrapper.style.color = field.value\n wrapper.appendChild(field)\n }\n}\n\n/**\n * Updates the color preview swatch on the wrapping `.clr-field` element.\n * @param {Event} event\n * @returns {void}\n */\nfunction updateColorPreview(event) {\n const parent = event.target.parentNode\n\n // Only update the preview if the field has been previously wrapped\n if (parent && parent.classList && parent.classList.contains('clr-field')) {\n parent.style.color = event.target.value\n }\n}\n\n/**\n * Closes the color picker, optionally reverting the color to its pre-open value.\n * @param {boolean} [revert] - If `true`, restores the field value to what it was when the picker opened.\n * @returns {void}\n */\nexport function closePicker(revert) {\n if (currentEl && !settings.inline) {\n const prevEl = currentEl\n\n // Revert the color to the original value if needed\n if (revert) {\n // This will prevent the \"change\" event on the colorValue input to execute its handler\n currentEl = undefined\n\n if (oldColor !== prevEl.value) {\n prevEl.value = oldColor\n\n // Trigger an \"input\" event to force update the thumbnail next to the input field\n prevEl.dispatchEvent(new Event('input', { bubbles: true }))\n }\n } else {\n const value = colorValue.value\n if (value !== initialFormatColor) {\n if (value !== '') {\n setColorFromStr(value)\n }\n pickColor(value === '' ? '' : colorValue.value)\n }\n }\n\n // Mark the picker as closed before moving focus so blurring colorValue doesn't re-trigger change\n currentEl = undefined\n\n // Trigger a \"change\" event if needed\n setTimeout(() => {\n // Add this to the end of the event loop\n if (oldColor !== prevEl.value) {\n prevEl.dispatchEvent(new Event('change', { bubbles: true }))\n }\n })\n\n // Hide the picker dialog\n picker.classList.remove('clr-open')\n\n // Reset any previously set per-instance options\n resetVirtualInstance()\n\n // Trigger a \"close\" event\n prevEl.dispatchEvent(new Event('close', { bubbles: false }))\n\n if (settings.focusInput) {\n prevEl.focus({ preventScroll: true })\n }\n }\n}\n\n/**\n * Parses a color string and updates all picker UI elements to reflect it.\n * @param {string} str - Any valid CSS color string.\n * @returns {void}\n */\nfunction setColorFromStr(str) {\n const rgba = strToRGBA(str)\n const hsva = RGBAtoHSVA(rgba)\n\n updateMarkerA11yLabel(hsva.s, hsva.v)\n updateColor(rgba, hsva)\n\n // Update the UI\n hueSlider.value = hsva.h\n picker.style.color = `hsl(${hsva.h}, 100%, 50%)`\n hueMarker.style.left = `${(hsva.h / 360) * 100}%`\n\n colorMarker.style.left = `${(colorAreaDims.width * hsva.s) / 100}px`\n colorMarker.style.top = `${colorAreaDims.height - (colorAreaDims.height * hsva.v) / 100}px`\n\n alphaSlider.value = hsva.a * 100\n alphaMarker.style.left = `${hsva.a * 100}%`\n}\n\n/**\n * Infers the color format (`'hex'`, `'rgb'`, or `'hsl'`) from a color string.\n * @param {string} str\n * @returns {'hex' | 'rgb' | 'hsl'}\n */\nfunction getColorFormatFromStr(str) {\n const fmt = str.trim().slice(0, 3).toLowerCase()\n\n return fmt === 'rgb' || fmt === 'hsl' ? fmt : 'hex'\n}\n\n/**\n * Commits the current color to the linked input field and fires change events.\n * @param {string} [color] - The color string to commit. Defaults to the current value of the color input.\n * @returns {void}\n */\nfunction pickColor(color) {\n color = color ?? colorValue.value\n initialFormatColor = colorValue.value\n\n if (currentEl) {\n currentEl.value = color\n currentEl.dispatchEvent(new Event('input', { bubbles: true }))\n }\n\n if (settings.onChange) {\n settings.onChange.call(window, color, currentEl)\n }\n\n document.dispatchEvent(new CustomEvent('colorpicker:pick', { detail: { color, currentEl } }))\n}\n\n/**\n * Derives the color at a given position in the color area and updates the picker state.\n * @param {number} x - Horizontal position in pixels relative to the color area.\n * @param {number} y - Vertical position in pixels relative to the color area.\n * @returns {void}\n */\nfunction setColorAtPosition(x, y) {\n const hsva = {\n h: Number(hueSlider.value),\n s: (x / colorAreaDims.width) * 100,\n v: 100 - (y / colorAreaDims.height) * 100,\n a: alphaSlider.value / 100\n }\n const rgba = HSVAtoRGBA(hsva)\n\n updateMarkerA11yLabel(hsva.s, hsva.v)\n updateColor(rgba, hsva)\n pickColor()\n}\n\n/**\n * Updates the color marker's `aria-label` with the current saturation and brightness values.\n * @param {number} saturation - Saturation value (0–100).\n * @param {number} value - Brightness value (0–100).\n * @returns {void}\n */\nfunction updateMarkerA11yLabel(saturation, value) {\n colorMarker.setAttribute(\n 'aria-label',\n settings.a11y.marker.replace('{s}', Number(saturation.toFixed(1))).replace('{v}', Number(value.toFixed(1)))\n )\n}\n\n/**\n * Moves the color marker to the pointer position within the color area.\n * @param {PointerEvent | MouseEvent} event\n * @returns {void}\n */\nfunction moveMarker(event) {\n setMarkerPosition(event.pageX - colorAreaDims.x, event.pageY - colorAreaDims.y)\n\n // Prevent scrolling while dragging the marker\n event.preventDefault()\n event.stopPropagation()\n}\n\n/**\n * Moves the color marker by a pixel offset (used for keyboard navigation).\n * @param {number} offsetX\n * @param {number} offsetY\n * @returns {void}\n */\nfunction moveMarkerOnKeydown(offsetX, offsetY) {\n const x = parseFloat(colorMarker.style.left) + offsetX\n const y = parseFloat(colorMarker.style.top) + offsetY\n\n setMarkerPosition(x, y)\n}\n\n/**\n * Positions the color marker at the given coordinates, clamped to the color area bounds.\n * @param {number} x\n * @param {number} y\n * @returns {void}\n */\nfunction setMarkerPosition(x, y) {\n // Make sure the marker doesn't go out of bounds\n x = Math.max(0, Math.min(x, colorAreaDims.width))\n y = Math.max(0, Math.min(y, colorAreaDims.height))\n\n // Set the position\n colorMarker.style.left = `${x}px`\n colorMarker.style.top = `${y}px`\n\n // Update the color\n setColorAtPosition(x, y)\n\n // Make sure the marker is focused\n colorMarker.focus({ preventScroll: true })\n}\n\n/**\n * Merges new RGBA/HSVA values into the current color state and refreshes all UI elements.\n * @param {Partial<RGBA>} [rgba]\n * @param {Partial<HSVA>} [hsva]\n * @returns {void}\n */\nfunction updateColor(rgba = {}, hsva = {}) {\n let format = settings.format\n\n Object.assign(currentColor, rgba, hsva)\n\n const hex = RGBAToHex(currentColor)\n const opaqueHex = hex.substring(0, 7)\n\n colorMarker.style.color = opaqueHex\n alphaMarker.parentNode.style.color = opaqueHex\n alphaMarker.style.color = hex\n colorPreview.style.color = hex\n\n if (format === 'mixed') {\n format = currentColor.a === 1 ? 'hex' : 'rgb'\n } else if (format === 'auto') {\n format = currentFormat\n }\n\n switch (format) {\n case 'hex':\n colorValue.value = hex\n break\n case 'rgb':\n colorValue.value = RGBAToStr(currentColor)\n break\n case 'hsl':\n colorValue.value = HSLAToStr(HSVAtoHSLA(currentColor))\n break\n }\n\n // Select the current format in the format switcher\n const formatRadio = picker.querySelector(`.clr-format [value=\"${format}\"]`)\n if (formatRadio) {\n formatRadio.checked = true\n }\n}\n\n/**\n * Handles hue slider input and updates the color accordingly.\n * @returns {void}\n */\nfunction setHue() {\n const hue = Number(hueSlider.value)\n const x = parseFloat(colorMarker.style.left)\n const y = parseFloat(colorMarker.style.top)\n\n picker.style.color = `hsl(${hue}, 100%, 50%)`\n hueMarker.style.left = `${(hue / 360) * 100}%`\n\n setColorAtPosition(x, y)\n}\n\n/**\n * Handles alpha slider input and updates the color accordingly.\n * @returns {void}\n */\nfunction setAlpha() {\n const alpha = alphaSlider.value / 100\n\n alphaMarker.style.left = `${alpha * 100}%`\n updateColor({ a: alpha })\n pickColor()\n}\n\n/**\n * Returns all visible (non-zero-width) focusable elements inside the picker.\n * @returns {HTMLElement[]}\n */\nfunction getFocusableElements() {\n return [...picker.querySelectorAll('input, button, [tabindex]')].filter(\n (node) => !!node.offsetWidth && (node.type !== 'radio' || node.checked)\n )\n}\n\n/**\n * Creates the picker DOM, appends it to the document, and binds all event listeners.\n * @returns {void}\n */\nexport function init() {\n // Render the UI\n container = undefined\n picker = document.createElement('div')\n picker.setAttribute('id', 'clr-picker')\n picker.setAttribute('role', 'dialog')\n picker.className = 'clr-picker'\n picker.innerHTML = `\n <input id=\"clr-color-value\" name=\"clr-color-value\" class=\"clr-color\" type=\"text\" value=\"\" spellcheck=\"false\">\n <div id=\"clr-color-area\" class=\"clr-gradient\" role=\"application\">\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\">\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\">\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></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 </fieldset>\n </div>\n <div id=\"clr-swatches\" class=\"clr-swatches\"></div>\n <button type=\"button\" id=\"clr-clear\" class=\"clr-clear\"></button>\n <div id=\"clr-color-preview\" class=\"clr-preview\">\n <button type=\"button\" id=\"clr-close\" class=\"clr-close\"></button>\n </div>\n <span id=\"clr-open-label\" hidden></span>\n <span id=\"clr-swatch-label\" hidden></span>\n `\n\n // Append the color picker to the DOM\n document.body.appendChild(picker)\n\n // Reference the UI elements\n colorArea = getEl('clr-color-area')\n colorMarker = getEl('clr-color-marker')\n clearButton = getEl('clr-clear')\n closeButton = getEl('clr-close')\n colorPreview = getEl('clr-color-preview')\n colorValue = getEl('clr-color-value')\n hueSlider = getEl('clr-hue-slider')\n hueMarker = getEl('clr-hue-marker')\n alphaSlider = getEl('clr-alpha-slider')\n alphaMarker = getEl('clr-alpha-marker')\n\n // Populate initial labels and ARIA attributes safely\n colorValue.setAttribute('aria-label', settings.a11y.input)\n colorArea.setAttribute('aria-label', settings.a11y.instruction)\n hueSlider.setAttribute('aria-label', settings.a11y.hueSlider)\n alphaSlider.setAttribute('aria-label', settings.a11y.alphaSlider)\n clearButton.setAttribute('aria-label', settings.a11y.clear)\n clearButton.textContent = settings.clearLabel\n closeButton.setAttribute('aria-label', settings.a11y.close)\n closeButton.textContent = settings.closeLabel\n picker.querySelector('.clr-format legend').textContent = settings.a11y.format\n getEl('clr-open-label').textContent = settings.a11y.open\n getEl('clr-swatch-label').textContent = settings.a11y.swatch\n\n // Bind the picker to the default selector\n bindFields(settings.el)\n wrapFields(settings.el)\n\n addListener(picker, 'pointerdown', (event) => {\n event.stopPropagation()\n })\n\n addListener(colorArea, 'pointerdown', () => {\n updateColorAreaDims()\n addListener(document, 'pointermove', moveMarker)\n })\n\n addListener(colorArea, 'contextmenu', (event) => {\n event.preventDefault()\n })\n\n addListener(colorValue, 'change', () => {\n const value = colorValue.value\n\n if (currentEl || settings.inline) {\n if (value !== '') {\n setColorFromStr(value)\n }\n pickColor(value === '' ? '' : colorValue.value)\n }\n })\n\n addListener(clearButton, 'click', () => {\n pickColor('')\n closePicker()\n })\n\n addListener(closeButton, 'click', () => {\n pickColor()\n closePicker()\n })\n\n addListener(getEl('clr-format'), 'click', '.clr-format input', (event) => {\n currentFormat = event.target.value\n updateColor()\n pickColor()\n })\n\n addListener(picker, 'click', '.clr-swatches button', (event) => {\n setColorFromStr(event.target.textContent)\n pickColor()\n\n if (settings.swatchesOnly) {\n closePicker()\n }\n })\n\n addListener(document, 'pointerup', () => {\n document.removeEventListener('pointermove', moveMarker)\n })\n\n addListener(document, 'pointerdown', () => {\n closePicker()\n })\n\n addListener(document, 'keydown', (event) => {\n const key = event.key\n const target = event.target\n const shiftKey = event.shiftKey\n\n if (key === 'Escape') {\n if (currentEl) {\n closePicker(true)\n }\n return\n\n // Close the color picker and keep the selected color on press on Enter\n } else if (key === 'Enter' && target.tagName !== 'BUTTON') {\n if (currentEl) {\n event.preventDefault()\n closePicker()\n }\n return\n }\n\n // Trap the focus within the color picker while it's open\n if (key === 'Tab' && target instanceof Element && target.matches('.clr-picker *')) {\n const focusables = getFocusableElements()\n\n if (focusables.length > 1) {\n const firstFocusable = focusables[0]\n const lastFocusable = focusables[focusables.length - 1]\n\n if (shiftKey && target === firstFocusable) {\n lastFocusable.focus()\n event.preventDefault()\n } else if (!shiftKey && target === lastFocusable) {\n firstFocusable.focus()\n event.preventDefault()\n }\n } else if (focusables.length === 1) {\n event.preventDefault()\n }\n }\n })\n\n addListener(document, 'click', '.clr-field button', (event) => {\n // Reset any previously set per-instance options\n resetVirtualInstance()\n\n // Open the color picker\n event.target.nextElementSibling?.dispatchEvent(new Event('click', { bubbles: true }))\n })\n\n addListener(colorMarker, 'keydown', (event) => {\n if (event.key in MARKER_MOVEMENTS) {\n moveMarkerOnKeydown(...MARKER_MOVEMENTS[event.key])\n event.preventDefault()\n }\n })\n\n addListener(colorArea, 'click', moveMarker)\n addListener(hueSlider, 'input', setHue)\n addListener(alphaSlider, 'input', setAlpha)\n}\n","/** @import { ColorPickerOptions } from './settings.js' */\nimport {\n configure,\n wrapFields,\n closePicker,\n setVirtualInstance,\n removeVirtualInstance,\n updatePickerPosition,\n bindFields,\n init\n} from './picker.js'\nimport { DOMReady } from './dom.js'\n\n/**\n * Initializes the color picker, binding it to matching fields or applying global options.\n * @param {string | ColorPickerOptions} [options] - A CSS selector string to bind matching fields, or an options object.\n * @returns {void}\n */\nfunction ColorPicker(options) {\n DOMReady(() => {\n if (options) {\n if (typeof options === 'string') {\n bindFields(options)\n } else {\n configure(options)\n }\n }\n })\n}\n\n/** @type {(options: ColorPickerOptions) => void} */\nColorPicker.set = (...args) => DOMReady(configure, args)\n\n/** @type {(selector: string | HTMLElement | HTMLElement[] | NodeList) => void} */\nColorPicker.wrap = (...args) => DOMReady(wrapFields, args)\n\n/** @type {(revert?: boolean) => void} */\nColorPicker.close = (...args) => DOMReady(closePicker, args)\n\n/** @type {(selector: string, options: ColorPickerOptions) => void} */\nColorPicker.setInstance = (...args) => DOMReady(setVirtualInstance, args)\n\n/** @type {(selector: string) => void} */\nColorPicker.removeInstance = (...args) => DOMReady(removeVirtualInstance, args)\n\n/** @type {() => void} */\nColorPicker.updatePosition = (...args) => DOMReady(updatePickerPosition, args)\n\n/** @type {(fn: Function, args?: any[]) => void} */\nColorPicker.ready = DOMReady\n\nDOMReady(init)\n\nexport default ColorPicker\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","strToRGBA","str","trim","r","g","b","a","canvasCtx","document","canvas","createElement","width","height","getContext","willReadFrequently","getCtx","normalized","fillStyle","match","exec","Math","min","max","Number","toFixed","test","hex","replace","length","split","map","c","join","parseInt","slice","clearRect","fillRect","getImageData","data","getEl","id","getElementById","addListener","context","type","selector","fn","addEventListener","event","target","Element","matches","call","DOMReady","args","readyState","currentColor","h","s","v","container","picker","colorArea","colorMarker","colorPreview","colorValue","hueMarker","alphaMarker","currentEl","currentFormat","oldColor","initialFormatColor","colorAreaDims","instances","currentInstanceId","defaultInstance","boundSelectors","Set","boundElements","WeakSet","MARKER_MOVEMENTS","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","configure","options","key","Object","keys","bindFields","wrapFields","newContainer","HTMLElement","querySelector","appendChild","body","undefined","window","matchMedia","isOpen","classList","contains","isLeft","isTop","className","toggle","updatePickerPosition","field","getElementsByClassName","isNaN","style","display","Array","isArray","swatchesContainer","textContent","forEach","i","button","setAttribute","color","insertBefore","labels","update","label","openLabel","swatchLabel","formatLegend","updateMarkerA11yLabel","getColorFormatFromStr","setColorFromStr","setVirtualInstance","removeVirtualInstance","resetVirtualInstance","fields","NodeList","has","add","openPicker","updateColorPreview","closePicker","element","unsupportedOptions","clonedOptions","option","attachVirtualInstance","value","focus","preventScroll","selectionStart","selectionEnd","setSelectionRange","select","firstFocusable","getFocusableElements","shift","dispatchEvent","Event","bubbles","updateColorAreaDims","rect","getBoundingClientRect","offsetWidth","offsetHeight","x","scrollX","y","scrollY","pickerWidth","pickerHeight","reposition","left","top","coords","parentStyle","getComputedStyle","parentMarginTop","parseFloat","marginTop","parentBorderTop","borderTopWidth","parentBorderLeft","borderLeftWidth","offset","clientWidth","clientHeight","scrollLeft","scrollTop","documentElement","querySelectorAll","wrapColorField","parentNode","wrapper","classes","innerHTML","revert","prevEl","pickColor","setTimeout","remove","rgba","hsva","red","green","blue","xmax","chroma","hue","saturation","round","RGBAtoHSVA","updateColor","fmt","toLowerCase","CustomEvent","detail","setColorAtPosition","hueBy60","abs","m","index","floor","HSVAtoRGBA","moveMarker","setMarkerPosition","pageX","pageY","preventDefault","stopPropagation","assign","R","toString","padStart","G","B","A","RGBAToHex","opaqueHex","substring","RGBAToStr","hsla","lightness","l","HSVAtoHSLA","formatRadio","checked","setHue","setAlpha","filter","node","ColorPicker","set","setInstance","removeInstance","updatePosition","ready","removeEventListener","shiftKey","tagName","focusables","lastFocusable","nextElementSibling","offsetX","offsetY","moveMarkerOnKeydown"],"mappings":"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"}