@bornova/colorpicker 1.0.1 → 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.1 */
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 l(e){const l=/^((rgba)|rgb)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,a=function(){if(!t&&"undefined"!=typeof document)try{t=document.createElement("canvas").getContext("2d")}catch{}return t}();let n,r;if(a)a.fillStyle="#000",a.fillStyle=e,n=l.exec(a.fillStyle),n?r={r:Number(n[3]),g:Number(n[4]),b:Number(n[5]),a:""===n[6]?1:Number(n[6])}:(n=a.fillStyle.replace("#","").match(/.{2}/g).map(e=>parseInt(e,16)),r={r:n[0],g:n[1],b:n[2],a:void 0!==n[3]?Number((n[3]/255).toFixed(2)):1});else if(n=l.exec(e),n)r={r:Number(n[3]),g:Number(n[4]),b:Number(n[5]),a:""===n[6]?1:Number(n[6])};else{const t=e.replace("#","");if(3===t.length||4===t.length){r={r:parseInt(t[0]+t[0],16),g:parseInt(t[1]+t[1],16),b:parseInt(t[2]+t[2],16),a:4===t.length?Number((parseInt(t[3]+t[3],16)/255).toFixed(2)):1}}else if(6===t.length||8===t.length){r={r:parseInt(t.slice(0,2),16),g:parseInt(t.slice(2,4),16),b:parseInt(t.slice(4,6),16),a:8===t.length?Number((parseInt(t.slice(6,8),16)/255).toFixed(2)):1}}else r={r:0,g:0,b:0,a:1}}return r}function a(e){return document.getElementById(e)}function n(e,t,l,a){"string"==typeof l?e.addEventListener(t,e=>{e.target.matches(l)&&a.call(e.target,e)}):e.addEventListener(t,l)}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,s,i,u,d,p,h,f,b,m,y,g,v,w,k,L,E={};const x={};let M="",$={},A=!1;const S={ArrowUp:[0,-1],ArrowDown:[0,1],ArrowLeft:[-1,0],ArrowRight:[1,0]};function C(t){if("object"==typeof t)for(const l of Object.keys(t))switch(l){case"el":H(t.el),!1!==t.wrap&&D(t.el);break;case"parent":c=t.parent instanceof HTMLElement?t.parent:document.querySelector(t.parent),c&&(c.appendChild(s),e.parent=t.parent,c===document.body&&(c=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),s.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 l=Number(t.margin);e.margin=isNaN(l)?e.margin:l;break}case"wrap":t.el&&t.wrap&&D(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,l)=>{const a=document.createElement("button");a.setAttribute("type","button"),a.setAttribute("id",`clr-swatch-${l}`),a.setAttribute("aria-labelledby",`clr-swatch-label clr-swatch-${l}`),a.style.color=t,a.textContent=t,e.appendChild(a)}),l.appendChild(e)}e.swatches=[...t.swatches]}break;case"swatchesOnly":e.swatchesOnly=!!t.swatchesOnly,s.setAttribute("data-minimal",e.swatchesOnly);break;case"alpha":e.alpha=!!t.alpha,s.setAttribute("data-alpha",e.alpha);break;case"inline":if(e.inline=!!t.inline,s.setAttribute("data-inline",e.inline),e.inline){const l=t.defaultColor||e.defaultColor;w=q(l),O(),W(l)}break;case"clearButton":{"object"==typeof t.clearButton&&t.clearButton.label&&(e.clearLabel=t.clearButton.label,h.innerHTML=e.clearLabel);const l="object"==typeof t.clearButton?t.clearButton.show:t.clearButton;e.clearButton=!!l,h.style.display=e.clearButton?"block":"none";break}case"clearLabel":e.clearLabel=t.clearLabel,h.innerHTML=e.clearLabel;break;case"closeButton":e.closeButton=!!t.closeButton,e.closeButton?s.insertBefore(f,d):d.appendChild(f);break;case"closeLabel":e.closeLabel=t.closeLabel,f.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,f.setAttribute("aria-label",e.a11y.close),h.setAttribute("aria-label",e.a11y.clear),b.setAttribute("aria-label",e.a11y.hueSlider),y.setAttribute("aria-label",e.a11y.alphaSlider),p.setAttribute("aria-label",e.a11y.input),i.setAttribute("aria-label",e.a11y.instruction)}break}default:e[l]=t[l]}}function T(e,t){"string"==typeof e&&"object"==typeof t&&(x[e]=t,A=!0)}function N(e){delete x[e],0===Object.keys(x).length&&(A=!1,e===M&&B())}function B(){Object.keys($).length>0&&(C($),M="",$={})}function H(e){const t=e instanceof HTMLElement?[e]:e;Array.isArray(t)?t.forEach(e=>{n(e,"click",I),n(e,"input",F)}):(n(document,"click",t,I),n(document,"input",t,F))}function I(t){if(!e.inline){if(function(t){if(A){const l=["el","wrap","rtl","inline","defaultColor","a11y"];for(const a of Object.keys(x)){const n=x[a];if(t.matches(a)){M=a,$={};const t={...n};l.forEach(e=>delete t[e]);for(const l of Object.keys(t))$[l]=Array.isArray(e[l])?[...e[l]]:e[l],"clearButton"===l&&($.clearLabel=e.clearLabel);C(t);break}}}}(t.target),v=t.target,k=v.value,w=q(k),s.classList.add("clr-open"),O(),W(k),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(),L||e.swatchesOnly){const e=Q().shift();e&&e.focus()}v.dispatchEvent(new Event("open",{bubbles:!1}))}}function O(){const t=c,l=window.scrollY,a=s.offsetWidth,n=s.offsetHeight,r={left:!1,top:!1};let o,u,d,p={x:0,y:0};if(t&&(o=window.getComputedStyle(t),u=parseFloat(o.marginTop),d=parseFloat(o.borderTopWidth),p=t.getBoundingClientRect(),p.y+=d+l),!e.inline){const o=v.getBoundingClientRect();let c=o.x,i=l+o.y+o.height+e.margin;t?(c-=p.x,i-=p.y,c+a>t.clientWidth&&(c+=o.width-a,r.left=!0),i+n>t.clientHeight-u&&n+e.margin<=o.top-(p.y-l)&&(i-=o.height+n+2*e.margin,r.top=!0),i+=t.scrollTop):(c+a>document.documentElement.clientWidth&&(c+=o.width-a,r.left=!0),i+n-l>document.documentElement.clientHeight&&n+e.margin<=o.top&&(i=l+o.y-n-e.margin,r.top=!0)),s.classList.toggle("clr-left",r.left),s.classList.toggle("clr-top",r.top),s.style.left=`${c}px`,s.style.top=`${i}px`,p.x+=s.offsetLeft,p.y+=s.offsetTop}E={width:i.offsetWidth,height:i.offsetHeight,x:i.offsetLeft+p.x,y:i.offsetTop+p.y}}function D(e){(e instanceof HTMLElement?[e]:Array.isArray(e)?e:[...document.querySelectorAll(e)]).forEach(j)}function j(t){const l=t.parentNode;if(!l.classList.contains("clr-field")){const a=document.createElement("div");let n="clr-field";(e.rtl||t.classList.contains("clr-rtl"))&&(n+=" clr-rtl"),a.innerHTML='<button type="button" aria-labelledby="clr-open-label"></button>',l.insertBefore(a,t),a.className=n,a.style.color=t.value,a.appendChild(t)}}function F(e){const t=e.target.parentNode;t.classList.contains("clr-field")&&(t.style.color=e.target.value)}function R(t){if(v&&!e.inline){const l=v;if(t)v=void 0,k!==l.value&&(l.value=k,l.dispatchEvent(new Event("input",{bubbles:!0})));else{const e=p.value;""===e?P(""):(W(e),P(p.value))}setTimeout(()=>{k!==l.value&&l.dispatchEvent(new Event("change",{bubbles:!0}))}),s.classList.remove("clr-open"),A&&B(),l.dispatchEvent(new Event("close",{bubbles:!1})),e.focusInput&&l.focus({preventScroll:!0}),v=void 0}}function W(e){const t=l(e),a=function(e){const t=e.r/255,l=e.g/255,a=e.b/255,n=Math.max(t,l,a),r=n-Math.min(t,l,a),o=n;let c=0,s=0;return r&&(s=r/n,c=n===t?(l-a)/r:n===l?2+(a-t)/r:4+(t-l)/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}}(t);Y(a.s,a.v),K(t,a),b.value=a.h,s.style.color=`hsl(${a.h}, 100%, 50%)`,m.style.left=a.h/360*100+"%",u.style.left=E.width*a.s/100+"px",u.style.top=E.height-E.height*a.v/100+"px",y.value=100*a.a,g.style.left=100*a.a+"%"}function q(e){const t=e.slice(0,3).toLowerCase();return"rgb"===t||"hsl"===t?t:"hex"}function P(t){t=t??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 U(e,t){const l={h:Number(b.value),s:e/E.width*100,v:100-t/E.height*100,a:y.value/100},a=function(e){const t=e.s/100,l=e.v/100;let a=t*l,n=e.h/60,r=a*(1-Math.abs(n%2-1)),o=l-a;a+=o,r+=o;const c=Math.floor(n)%6,s=[a,r,o,o,r,a][c],i=[r,a,a,r,o,o][c],u=[o,o,r,a,a,r][c];return{r:Math.round(255*s),g:Math.round(255*i),b:Math.round(255*u),a:e.a}}(l);Y(l.s,l.v),K(a,l),P()}function Y(t,l){u.setAttribute("aria-label",e.a11y.marker.replace("{s}",Number(t.toFixed(1))).replace("{v}",Number(l.toFixed(1))))}function X(e){const t=e.changedTouches?.[0];let l=(t?.pageX??e.pageX)-E.x,a=(t?.pageY??e.pageY)-E.y;c&&(a+=c.scrollTop),G(l,a),e.preventDefault(),e.stopPropagation()}function G(e,t){e=Math.max(0,Math.min(e,E.width)),t=Math.max(0,Math.min(t,E.height)),u.style.left=`${e}px`,u.style.top=`${t}px`,U(e,t),u.focus()}function K(t={},l={}){let a=e.format;Object.assign(o,t,l);const n=function(t){const l=t.r.toString(16).padStart(2,"0"),a=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")),"#"+l+a+n+r}(o),r=n.substring(0,7);switch(u.style.color=r,g.parentNode.style.color=r,g.style.color=n,d.style.color=n,i.style.display="none",i.offsetHeight,i.style.display="",g.nextElementSibling.style.display="none",g.nextElementSibling.offsetHeight,g.nextElementSibling.style.display="","mixed"===a?a=1===o.a?"hex":"rgb":"auto"===a&&(a=w),a){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,l=t*(1-e.s/100/2);let a;return l>0&&l<1&&(a=Math.round((t-l)/Math.min(l,1-l)*100)),{h:e.h,s:a||0,l:Math.round(100*l),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;document.querySelector(`.clr-format [value="${a}"]`).checked=!0}function z(){const e=Number(b.value),t=parseFloat(u.style.left),l=parseFloat(u.style.top);s.style.color=`hsl(${e}, 100%, 50%)`,m.style.left=e/360*100+"%",U(t,l)}function J(){const e=y.value/100;g.style.left=100*e+"%",K({a:e}),P()}function Q(){return[...s.querySelectorAll("input, button")].filter(e=>!!e.offsetWidth)}function V(e){r(()=>{e&&("string"==typeof e?H(e):C(e))})}return V.set=(...e)=>r(C,e),V.wrap=(...e)=>r(D,e),V.close=(...e)=>r(R,e),V.setInstance=(...e)=>r(T,e),V.removeInstance=(...e)=>r(N,e),V.updatePosition=(...e)=>r(O,e),V.ready=r,r(function(){c=void 0,s=document.createElement("div"),s.setAttribute("id","clr-picker"),s.className="clr-picker",s.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(s),i=a("clr-color-area"),u=a("clr-color-marker"),h=a("clr-clear"),f=a("clr-close"),d=a("clr-color-preview"),p=a("clr-color-value"),b=a("clr-hue-slider"),m=a("clr-hue-marker"),y=a("clr-alpha-slider"),g=a("clr-alpha-marker"),H(e.el),D(e.el),n(s,"mousedown",e=>{s.classList.remove("clr-keyboard-nav"),e.stopPropagation()}),n(i,"mousedown",()=>{n(document,"mousemove",X)}),n(i,"contextmenu",e=>{e.preventDefault()}),n(i,"touchstart",()=>{document.addEventListener("touchmove",X,{passive:!1})}),n(u,"mousedown",()=>{n(document,"mousemove",X)}),n(u,"touchstart",()=>{document.addEventListener("touchmove",X,{passive:!1})}),n(p,"change",()=>{const t=p.value;if(v||e.inline){P(""===t?t:W(t))}}),n(h,"click",()=>{P(""),R()}),n(f,"click",()=>{P(),R()}),n(a("clr-format"),"click",".clr-format input",e=>{w=e.target.value,K(),P()}),n(s,"click",".clr-swatches button",t=>{W(t.target.textContent),P(),e.swatchesOnly&&R()}),n(document,"mouseup",()=>{document.removeEventListener("mousemove",X)}),n(document,"touchend",()=>{document.removeEventListener("touchmove",X)}),n(document,"mousedown",()=>{L=!1,s.classList.remove("clr-keyboard-nav"),R()}),n(document,"keydown",e=>{const t=e.key,l=e.target,a=e.shiftKey;if("Escape"!==t)if("Enter"!==t||"BUTTON"===l.tagName){if(["Tab","ArrowUp","ArrowDown","ArrowLeft","ArrowRight"].includes(t)&&(L=!0,s.classList.add("clr-keyboard-nav")),"Tab"===t&&l.matches(".clr-picker *")){const t=Q();if(t.length>1){const n=t[0],r=t[t.length-1];a&&l===n?(r.focus(),e.preventDefault()):a||l!==r||(n.focus(),e.preventDefault())}else 1===t.length&&e.preventDefault()}}else R();else R(!0)}),n(document,"click",".clr-field button",e=>{A&&B(),e.target.nextElementSibling.dispatchEvent(new Event("click",{bubbles:!0}))}),n(u,"keydown",e=>{e.key in S&&(!function(e,t){G(parseFloat(u.style.left)+e,parseFloat(u.style.top)+t)}(...S[e.key]),e.preventDefault())}),n(i,"click",X),n(b,"input",z),n(y,"input",J)}),V}();
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":["/**\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[]} [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|{show: boolean, label: string}} [clearButton]\n * @property {string} [clearLabel]\n * @property {boolean} [closeButton]\n * @property {string} [closeLabel]\n * @property {function(string, HTMLElement=): void} [onChange]\n * @property {Partial<A11yLabels>} [a11y]\n */\n\n/**\n * @typedef {Object} Settings\n * @property {string} el\n * @property {string} 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 {function(string, 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 ctx = document.createElement('canvas').getContext('2d')\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.floor(hue * 60)\n\n return {\n h: hue < 0 ? hue + 360 : hue,\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 const regex = /^((rgba)|rgb)[\\D]+([\\d.]+)[\\D]+([\\d.]+)[\\D]+([\\d.]+)[\\D]*?([\\d.]+|$)/i\n const canvasCtx = getCtx()\n let match, rgba\n\n if (canvasCtx) {\n // Default to black for invalid color strings\n canvasCtx.fillStyle = '#000'\n // Use canvas to convert the string to a valid color string\n canvasCtx.fillStyle = str\n\n match = regex.exec(canvasCtx.fillStyle)\n\n if (match) {\n rgba = {\n r: Number(match[3]),\n g: Number(match[4]),\n b: Number(match[5]),\n a: match[6] === '' ? 1 : Number(match[6])\n }\n } else {\n match = canvasCtx.fillStyle\n .replace('#', '')\n .match(/.{2}/g)\n .map((h) => parseInt(h, 16))\n\n rgba = {\n r: match[0],\n g: match[1],\n b: match[2],\n a: match[3] !== undefined ? Number((match[3] / 255).toFixed(2)) : 1\n }\n }\n } else {\n // SSR or Canvas-blocked fallback: Parse the input string directly\n match = regex.exec(str)\n if (match) {\n rgba = {\n r: Number(match[3]),\n g: Number(match[4]),\n b: Number(match[5]),\n a: match[6] === '' ? 1 : Number(match[6])\n }\n } else {\n const hex = str.replace('#', '')\n\n if (hex.length === 3 || hex.length === 4) {\n const r = parseInt(hex[0] + hex[0], 16)\n const g = parseInt(hex[1] + hex[1], 16)\n const b = parseInt(hex[2] + hex[2], 16)\n const a = hex.length === 4 ? Number((parseInt(hex[3] + hex[3], 16) / 255).toFixed(2)) : 1\n\n rgba = { r, g, b, a }\n } else if (hex.length === 6 || hex.length === 8) {\n const r = parseInt(hex.slice(0, 2), 16)\n const g = parseInt(hex.slice(2, 4), 16)\n const b = parseInt(hex.slice(4, 6), 16)\n const a = hex.length === 8 ? Number((parseInt(hex.slice(6, 8), 16) / 255).toFixed(2)) : 1\n\n rgba = { r, g, b, a }\n } else {\n // Fallback to black for invalid inputs\n rgba = { r: 0, g: 0, b: 0, a: 1 }\n }\n }\n }\n\n return rgba\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.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 keyboardNav,\n colorAreaDims = {}\n\n// Virtual instances cache\nconst instances = {}\nlet currentInstanceId = ''\nlet defaultInstance = {}\nlet hasInstance = false\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 (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) {\n wrapFields(options.el)\n }\n\n break\n case 'parent':\n container = options.parent instanceof HTMLElement ? options.parent : document.querySelector(options.parent)\n\n if (container) {\n container.appendChild(picker)\n settings.parent = options.parent\n\n // document.body is special\n if (container === document.body) {\n container = undefined\n }\n }\n\n break\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 // Set the theme and color scheme\n picker.className = `clr-picker clr-${settings.theme} clr-${settings.themeMode}`\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 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 if (options.el && options.wrap) {\n wrapFields(options.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\n if (settings.inline) {\n const defaultColor = options.defaultColor || settings.defaultColor\n\n currentFormat = getColorFormatFromStr(defaultColor)\n updatePickerPosition()\n setColorFromStr(defaultColor)\n }\n break\n case 'clearButton': {\n // Backward compatibility\n if (typeof options.clearButton === 'object' && options.clearButton.label) {\n settings.clearLabel = options.clearButton.label\n clearButton.innerHTML = settings.clearLabel\n }\n\n const show = typeof options.clearButton === 'object' ? options.clearButton.show : options.clearButton\n settings.clearButton = !!show\n clearButton.style.display = settings.clearButton ? 'block' : 'none'\n break\n }\n case 'clearLabel':\n settings.clearLabel = options.clearLabel\n clearButton.innerHTML = 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.innerHTML = settings.closeLabel\n break\n case 'a11y': {\n const labels = options.a11y\n let update = false\n\n if (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\n openLabel.innerHTML = settings.a11y.open\n swatchLabel.innerHTML = settings.a11y.swatch\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 }\n break\n }\n default:\n settings[key] = options[key]\n }\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' && typeof options === 'object') {\n instances[selector] = options\n hasInstance = true\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 (Object.keys(instances).length === 0) {\n hasInstance = false\n\n if (selector === currentInstanceId) {\n resetVirtualInstance()\n }\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 (hasInstance) {\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 === 'clearButton') {\n defaultInstance['clearLabel'] = settings.clearLabel\n }\n }\n\n // Set the instance's options\n configure(clonedOptions)\n break\n }\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[]} selector - A CSS selector string, a single element, or an array of elements.\n * @returns {void}\n */\nexport function bindFields(selector) {\n const fields = selector instanceof HTMLElement ? [selector] : selector\n\n if (Array.isArray(fields)) {\n fields.forEach((field) => {\n addListener(field, 'click', openPicker)\n addListener(field, 'input', updateColorPreview)\n })\n } else {\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 // 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\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 // Always focus the first element when using keyboard navigation\n if (keyboardNav || 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 * Recalculates and applies the picker's position relative to the active input field.\n * @returns {void}\n */\nexport function updatePickerPosition() {\n const parent = container\n const scrollY = window.scrollY\n const pickerWidth = picker.offsetWidth\n const pickerHeight = picker.offsetHeight\n const reposition = { left: false, top: false }\n let parentStyle, parentMarginTop, parentBorderTop\n let offset = { x: 0, y: 0 }\n\n if (parent) {\n parentStyle = window.getComputedStyle(parent)\n parentMarginTop = parseFloat(parentStyle.marginTop)\n parentBorderTop = parseFloat(parentStyle.borderTopWidth)\n\n offset = parent.getBoundingClientRect()\n offset.y += parentBorderTop + scrollY\n }\n\n if (!settings.inline) {\n const coords = currentEl.getBoundingClientRect()\n let left = 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 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 top += parent.scrollTop\n\n // Otherwise set the position relative to the whole document\n } else {\n if (left + 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 offset.x += picker.offsetLeft\n offset.y += picker.offsetTop\n }\n\n colorAreaDims = {\n width: colorArea.offsetWidth,\n height: colorArea.offsetHeight,\n x: colorArea.offsetLeft + offset.x,\n y: colorArea.offsetTop + offset.y\n }\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[]} selector - A CSS selector string, a single element, or an array of elements.\n * @returns {void}\n */\nexport function wrapFields(selector) {\n const fields =\n selector instanceof HTMLElement\n ? [selector]\n : Array.isArray(selector)\n ? selector\n : [...document.querySelectorAll(selector)]\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.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.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 === '') {\n pickColor('')\n } else {\n setColorFromStr(value)\n pickColor(colorValue.value)\n }\n }\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 if (hasInstance) {\n resetVirtualInstance()\n }\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 // This essentially marks the picker as closed\n currentEl = undefined\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.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\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 {MouseEvent | TouchEvent} event\n * @returns {void}\n */\nfunction moveMarker(event) {\n const touch = event.changedTouches?.[0]\n let x = (touch?.pageX ?? event.pageX) - colorAreaDims.x\n let y = (touch?.pageY ?? event.pageY) - colorAreaDims.y\n\n if (container) {\n y += container.scrollTop\n }\n\n setMarkerPosition(x, 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()\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 // Force repaint the color and alpha gradients as a workaround for a Google Chrome bug\n colorArea.style.display = 'none'\n colorArea.offsetHeight\n colorArea.style.display = ''\n alphaMarker.nextElementSibling.style.display = 'none'\n alphaMarker.nextElementSibling.offsetHeight\n alphaMarker.nextElementSibling.style.display = ''\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 document.querySelector(`.clr-format [value=\"${format}\"]`).checked = true\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')].filter((node) => !!node.offsetWidth)\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.className = 'clr-picker'\n picker.innerHTML = `\n <input id=\"clr-color-value\" name=\"clr-color-value\" class=\"clr-color\" type=\"text\" value=\"\" spellcheck=\"false\" aria-label=\"${settings.a11y.input}\">\n <div id=\"clr-color-area\" class=\"clr-gradient\" role=\"application\" aria-label=\"${settings.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=\"${settings.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=\"${settings.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>${settings.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=\"${settings.a11y.clear}\">${settings.clearLabel}</button>\n <div id=\"clr-color-preview\" class=\"clr-preview\">\n <button type=\"button\" id=\"clr-close\" class=\"clr-close\" aria-label=\"${settings.a11y.close}\">${settings.closeLabel}</button>\n </div>\n <span id=\"clr-open-label\" hidden>${settings.a11y.open}</span>\n <span id=\"clr-swatch-label\" hidden>${settings.a11y.swatch}</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 // Bind the picker to the default selector\n bindFields(settings.el)\n wrapFields(settings.el)\n\n addListener(picker, 'mousedown', (event) => {\n picker.classList.remove('clr-keyboard-nav')\n event.stopPropagation()\n })\n\n addListener(colorArea, 'mousedown', () => {\n addListener(document, 'mousemove', moveMarker)\n })\n\n addListener(colorArea, 'contextmenu', (event) => {\n event.preventDefault()\n })\n\n addListener(colorArea, 'touchstart', () => {\n document.addEventListener('touchmove', moveMarker, { passive: false })\n })\n\n addListener(colorMarker, 'mousedown', () => {\n addListener(document, 'mousemove', moveMarker)\n })\n\n addListener(colorMarker, 'touchstart', () => {\n document.addEventListener('touchmove', moveMarker, { passive: false })\n })\n\n addListener(colorValue, 'change', () => {\n const value = colorValue.value\n\n if (currentEl || settings.inline) {\n const color = value === '' ? value : setColorFromStr(value)\n pickColor(color)\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, 'mouseup', () => {\n document.removeEventListener('mousemove', moveMarker)\n })\n\n addListener(document, 'touchend', () => {\n document.removeEventListener('touchmove', moveMarker)\n })\n\n addListener(document, 'mousedown', () => {\n keyboardNav = false\n picker.classList.remove('clr-keyboard-nav')\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 const navKeys = ['Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight']\n\n if (key === 'Escape') {\n closePicker(true)\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 closePicker()\n return\n\n // Display focus rings when using the keyboard\n } else if (navKeys.includes(key)) {\n keyboardNav = true\n picker.classList.add('clr-keyboard-nav')\n }\n\n // Trap the focus within the color picker while it's open\n if (key === 'Tab' && 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 if (hasInstance) {\n resetVirtualInstance()\n }\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 {function(ColorPickerOptions): void} */\nColorPicker.set = (...args) => DOMReady(configure, args)\n\n/** @type {function(string | HTMLElement | HTMLElement[]): void} */\nColorPicker.wrap = (...args) => DOMReady(wrapFields, args)\n\n/** @type {function(boolean=): void} */\nColorPicker.close = (...args) => DOMReady(closePicker, args)\n\n/** @type {function(string, ColorPickerOptions): void} */\nColorPicker.setInstance = (...args) => DOMReady(setVirtualInstance, args)\n\n/** @type {function(string): void} */\nColorPicker.removeInstance = (...args) => DOMReady(removeVirtualInstance, args)\n\n/** @type {function(): void} */\nColorPicker.updatePosition = (...args) => DOMReady(updatePickerPosition, args)\n\n/** @type {function(Function, 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","regex","canvasCtx","document","createElement","getContext","getCtx","match","rgba","fillStyle","exec","r","Number","g","b","a","replace","map","h","parseInt","undefined","toFixed","hex","length","slice","getEl","id","getElementById","addListener","context","type","selector","fn","addEventListener","event","target","matches","call","DOMReady","args","readyState","currentColor","s","v","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","window","matchMedia","className","updatePickerPosition","field","getElementsByClassName","classList","toggle","isNaN","style","display","Array","isArray","swatchesContainer","textContent","forEach","i","button","setAttribute","color","getColorFormatFromStr","setColorFromStr","label","innerHTML","show","insertBefore","labels","update","openLabel","swatchLabel","setVirtualInstance","removeVirtualInstance","resetVirtualInstance","fields","openPicker","updateColorPreview","element","unsupportedOptions","clonedOptions","option","attachVirtualInstance","value","add","focus","preventScroll","selectionStart","selectionEnd","setSelectionRange","select","firstFocusable","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","pickColor","setTimeout","remove","hsva","red","green","blue","xmax","Math","max","chroma","min","hue","saturation","floor","round","RGBAtoHSVA","updateMarkerA11yLabel","updateColor","fmt","toLowerCase","CustomEvent","detail","setColorAtPosition","hueBy60","abs","m","index","HSVAtoRGBA","moveMarker","touch","changedTouches","pageX","pageY","setMarkerPosition","preventDefault","stopPropagation","assign","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","lastFocusable","offsetX","offsetY","moveMarkerOnKeydown"],"mappings":"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"}
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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"}
@@ -11,7 +11,6 @@
11
11
  background-color: #fff;
12
12
  width: 200px;
13
13
  direction: ltr;
14
- -moz-user-select: none;
15
14
  -webkit-user-select: none;
16
15
  user-select: none;
17
16
  }
@@ -33,6 +32,7 @@
33
32
  background-image: linear-gradient(rgba(0, 0, 0, 0), #000), linear-gradient(90deg, #fff, currentColor);
34
33
  width: 100%;
35
34
  height: 100px;
35
+ touch-action: none;
36
36
  }
37
37
 
38
38
  .clr-marker {
@@ -111,7 +111,6 @@
111
111
  background-color: transparent;
112
112
  width: calc(100% + 32px);
113
113
  height: 16px;
114
- -webkit-appearance: none;
115
114
  }
116
115
 
117
116
  .clr-hue div,
@@ -130,7 +129,7 @@
130
129
  pointer-events: none;
131
130
  }
132
131
 
133
- .clr-alpha div:before {
132
+ .clr-alpha div::before {
134
133
  position: absolute;
135
134
  top: 0;
136
135
  left: 0;
@@ -227,7 +226,7 @@
227
226
  white-space: nowrap;
228
227
  }
229
228
 
230
- .clr-swatches button:after {
229
+ .clr-swatches button::after {
231
230
  display: block;
232
231
  position: absolute;
233
232
  top: 0;
@@ -292,8 +291,8 @@ input.clr-color:focus {
292
291
  overflow: hidden;
293
292
  }
294
293
 
295
- .clr-preview:before,
296
- .clr-preview:after {
294
+ .clr-preview::before,
295
+ .clr-preview::after {
297
296
  position: absolute;
298
297
  top: 0;
299
298
  left: 0;
@@ -304,7 +303,7 @@ input.clr-color:focus {
304
303
  content: '';
305
304
  }
306
305
 
307
- .clr-preview:after {
306
+ .clr-preview::after {
308
307
  box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.1);
309
308
  border: 0;
310
309
  background-color: currentColor;
@@ -370,7 +369,7 @@ input.clr-color:focus {
370
369
  left: 0;
371
370
  }
372
371
 
373
- .clr-field button:after {
372
+ .clr-field button::after {
374
373
  display: block;
375
374
  position: absolute;
376
375
  top: 0;
@@ -386,7 +385,7 @@ input.clr-color:focus {
386
385
  .clr-alpha,
387
386
  .clr-alpha div,
388
387
  .clr-swatches button,
389
- .clr-preview:before,
388
+ .clr-preview::before,
390
389
  .clr-field button {
391
390
  background-image:
392
391
  repeating-linear-gradient(45deg, #aaa 25%, transparent 25%, transparent 75%, #aaa 75%, #aaa),
@@ -401,16 +400,26 @@ input.clr-color:focus {
401
400
  outline: none;
402
401
  }
403
402
 
404
- .clr-keyboard-nav .clr-marker:focus,
405
- .clr-keyboard-nav .clr-hue input:focus + div,
406
- .clr-keyboard-nav .clr-alpha input:focus + div,
407
- .clr-keyboard-nav .clr-segmented input:focus + label {
403
+ .clr-marker:focus-visible,
404
+ .clr-hue input:focus-visible + div,
405
+ .clr-alpha input:focus-visible + div,
406
+ .clr-segmented input:focus-visible + label {
408
407
  outline: none;
409
408
  box-shadow:
410
409
  0 0 0 2px #1e90ff,
411
410
  0 0 2px 2px #fff;
412
411
  }
413
412
 
413
+ @media (forced-colors: active) {
414
+ .clr-marker:focus-visible,
415
+ .clr-hue input:focus-visible + div,
416
+ .clr-alpha input:focus-visible + div,
417
+ .clr-segmented input:focus-visible + label {
418
+ outline: 2px solid CanvasText;
419
+ outline-offset: 2px;
420
+ }
421
+ }
422
+
414
423
  .clr-picker[data-alpha='false'] .clr-alpha {
415
424
  display: none;
416
425
  }
@@ -437,7 +446,7 @@ input.clr-color:focus {
437
446
  border-color: #777;
438
447
  }
439
448
 
440
- .clr-dark .clr-swatches button:after {
449
+ .clr-dark .clr-swatches button::after {
441
450
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3);
442
451
  }
443
452
 
@@ -451,16 +460,16 @@ input.clr-color:focus {
451
460
  border-color: #1e90ff;
452
461
  }
453
462
 
454
- .clr-dark .clr-preview:after {
463
+ .clr-dark .clr-preview::after {
455
464
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.5);
456
465
  }
457
466
 
458
467
  .clr-dark .clr-alpha,
459
468
  .clr-dark .clr-alpha div,
460
469
  .clr-dark .clr-swatches button,
461
- .clr-dark .clr-preview:before {
470
+ .clr-dark .clr-preview::before {
462
471
  background-image:
463
- repeating-linear-gradient(45deg, #666 25%, transparent 25%, transparent 75%, #888 75%, #888),
472
+ repeating-linear-gradient(45deg, #888 25%, transparent 25%, transparent 75%, #888 75%, #888),
464
473
  repeating-linear-gradient(45deg, #888 25%, #444 25%, #444 75%, #888 75%, #888);
465
474
  }
466
475
 
@@ -473,7 +482,7 @@ input.clr-color:focus {
473
482
  border-radius: 6px;
474
483
  }
475
484
 
476
- .clr-picker.clr-polaroid:before {
485
+ .clr-picker.clr-polaroid::before {
477
486
  display: block;
478
487
  position: absolute;
479
488
  top: -10px;
@@ -490,16 +499,16 @@ input.clr-color:focus {
490
499
  color: #fff;
491
500
  }
492
501
 
493
- .clr-picker.clr-polaroid.clr-dark:before {
502
+ .clr-picker.clr-polaroid.clr-dark::before {
494
503
  color: #444;
495
504
  }
496
505
 
497
- .clr-picker.clr-polaroid.clr-left:before {
506
+ .clr-picker.clr-polaroid.clr-left::before {
498
507
  right: 20px;
499
508
  left: auto;
500
509
  }
501
510
 
502
- .clr-picker.clr-polaroid.clr-top:before {
511
+ .clr-picker.clr-polaroid.clr-top::before {
503
512
  top: auto;
504
513
  bottom: -10px;
505
514
  transform: rotateZ(180deg);
@@ -583,6 +592,11 @@ input.clr-color:focus {
583
592
  width: 380px;
584
593
  }
585
594
 
595
+ .clr-picker.clr-pill[data-minimal='true'] {
596
+ padding-left: 0;
597
+ width: 200px;
598
+ }
599
+
586
600
  .clr-pill .clr-gradient {
587
601
  position: absolute;
588
602
  top: 0;