UNPKG

rampensau

Version:

Color ramp generator using curves within the HSL color model

2 lines (1 loc) 4.96 kB
var S=Object.defineProperty;var V=(e,t)=>{for(var n in t)S(e,n,{get:t[n],enumerable:!0})};var T={};V(T,{lerp:()=>A,makeCurveEasings:()=>w,pointOnCurve:()=>H,scaleSpreadArray:()=>G,shuffleArray:()=>C});function C(e,t=Math.random){let n=[...e],r=n.length,m;for(;r!=0;)m=Math.floor(t()*r),r--,[n[r],n[m]]=[n[m],n[r]];return n}var A=(e,t,n)=>t+e*(n-t),G=(e,t,n=0,r=A)=>{if(!e||e.length<2)throw new Error("valuesToFill array must have at least two values.");if(t<1&&n>0)throw new Error("Target size must be at least 1");if(t<e.length&&n===0)throw new Error("Target size must be greater than or equal to the valuesToFill array length.");if(n<=0){let i=t-e.length,c=e.map(p=>[p]);for(let p=0;p<i;p++){let o=p%(e.length-1);if(o>=0&&o<c.length){let s=c[o];s&&s.push(null)}}for(let p=0;p<c.length-1;p++){let o=c[p],s=c[p+1];if(!o||!s)continue;let h=o[0],f=s[0];if(!(h===void 0||f===void 0))for(let g=1;g<o.length;g++){let b=g/o.length;o[g]=r(b,h,f)}}return c.flat()}let m=[],u=n,l=1-n;for(let i=0;i<t;i++){let c=t===1?.5:i/(t-1),p=u+c*(l-u),o=0,s=e.map((d,M)=>M/(e.length-1));for(let d=1;d<s.length;d++){let M=s[d];if(M!==void 0&&p<=M){o=d-1;break}d===s.length-1&&(o=d-1)}o=Math.min(Math.max(0,o),e.length-2);let h=s[o]||0,f=s[o+1]||1,g=0;f>h&&(g=(p-h)/(f-h));let b=e[o],x=e[o+1];if(b===void 0||x===void 0)throw new Error(`Invalid segment values at index ${o}`);let y=r(g,b,x);m.push(y)}return m},H=(e,t)=>n=>{let r=Math.PI/2,m=r/1,u=n,l=0,i=0;if(e==="lam\xE9"){let c=u*r,p=2/(2+20*t),o=Math.cos(c),s=Math.sin(c);l=Math.sign(o)*Math.abs(o)**p,i=Math.sign(s)*Math.abs(s)**p}else if(e==="arc")i=Math.cos(-Math.PI/2+n*m+t),l=Math.sin(Math.PI/2+n*m-t);else if(e==="pow")l=Math.pow(1-u,1-t),i=Math.pow(u,1-t);else if(e==="powY")l=Math.pow(1-u,t),i=Math.pow(u,1-t);else if(e==="powX")l=Math.pow(u,t),i=Math.pow(u,1-t);else if(typeof e=="function"){let[c,p]=e(n,t);l=c,i=p}else throw new Error(`pointOnCurve() curveAccent parameter is expected to be "lam\xE9" | "arc" | "pow" | "powY" | "powX" or a function but \`${e}\` given.`);return{x:l,y:i}},w=(e,t)=>{let n=H(e,t);return{sEasing:r=>n(r).x,lEasing:r=>n(r).y}};var E={};V(E,{colorHarmonies:()=>P,colorToCSS:()=>_,harveyHue:()=>I,hsv2hsl:()=>k,normalizeHue:()=>a,uniqueRandomHues:()=>j});function a(e){return(e%360+360)%360}function I(e){if(e=a(e)/360,e===1||e===0)return e;e=1+e%1;let t=1/6,n=e%t/t*Math.PI/2,[r,m]=[t*Math.cos(n),t*Math.sin(n)],u=Math.floor(e*6);return[m,1/3-r,1/3+m,2/3-r,2/3+m,1-r][u%6]*360}var P={complementary:e=>[a(e),a(e+180)],splitComplementary:e=>[a(e),a(e+150),a(e-150)],triadic:e=>[a(e),a(e+120),a(e+240)],tetradic:e=>[a(e),a(e+90),a(e+180),a(e+270)],monochromatic:e=>[a(e),a(e)],doubleComplementary:e=>[a(e),a(e+180),a(e+30),a(e+210)],compound:e=>[a(e),a(e+180),a(e+60),a(e+240)],analogous:e=>[a(e),a(e+30),a(e+60),a(e+90),a(e+120),a(e+150)]};function j({startHue:e=0,total:t=9,minHueDiffAngle:n=60,rndFn:r=Math.random}={}){n=Math.min(n,360/t);let m=e||r()*360,u=Array.from({length:Math.round(360/n)},(i,c)=>(m+c*n)%360),l=C(u,r);return l.length>t&&(l=l.slice(0,t)),l}var k=([e,t,n])=>{let r=n-n*t/2,m=Math.min(r,1-r),u=m===0?0:(n-r)/m;return[e,u,r]},v={oklch:e=>[e[2]*100+"%",e[1]*100+"%",e[0]],lch:e=>[e[2]*100+"%",e[1]*100+"%",e[0]],hsl:e=>[e[0],e[1]*100+"%",e[2]*100+"%"],hsv:e=>{let[t,n,r]=k(e);return[t,n*100+"%",r*100+"%"]}},_=(e,t="oklch")=>`${t==="hsv"?"hsl":t}(${v[t](e).join(" ")})`;function R({total:e=9,hStart:t=Math.random()*360,hStartCenter:n=.5,hEasing:r=s=>s,hCycles:m=1,sRange:u=[.4,.35],sEasing:l=s=>Math.pow(s,2),lRange:i=[Math.random()*.1,.9],lEasing:c=s=>Math.pow(s,1.5),transformFn:p=([s,h,f])=>[s,h,f],hueList:o}={}){let s=i[1]-i[0],h=u[1]-u[0],f=o&&o.length>0?o.length:e;return Array.from({length:f},(g,b)=>{let x=b/(f-1),y=1/f,d=o?o[b]:a(t+(1-r(x,y)-n)*(360*m)),M=u[0]+h*l(x,y),F=i[0]+s*c(x,y);return p([d,M,F],b)})}var $=({total:e=9,hStart:t=Math.random()*360,hStartCenter:n=.5,hCycles:r=1,sRange:m=[.4,.35],lRange:u=[Math.random()*.1,.9],hueList:l,curveMethod:i="lam\xE9",curveAccent:c=.5,transformFn:p=([o,s,h])=>[o,s,h]}={})=>{let{sEasing:o,lEasing:s}=w(i,c);return R({total:e,hStart:t,hStartCenter:n,hCycles:r,sRange:m,lRange:u,sEasing:o,lEasing:s,transformFn:p,hueList:l})};var U={total:{default:5,props:{min:4,max:50,step:1}},hStart:{default:0,props:{min:0,max:360,step:.1}},hCycles:{default:1,props:{min:-2,max:2,step:.001}},hStartCenter:{default:.5,props:{min:0,max:1,step:.001}},minLight:{default:Math.random()*.2,props:{min:0,max:1,step:.001}},maxLight:{default:.89+Math.random()*.11,props:{min:0,max:1,step:.001}},minSaturation:{default:Math.random()<.5?.4:.8+Math.random()*.2,props:{min:0,max:1,step:.001}},maxSaturation:{default:Math.random()<.5?.35:.9+Math.random()*.1,props:{min:0,max:1,step:.001}},curveMethod:{default:"lam\xE9",props:{options:["lam\xE9","sine","power","linear"]}},curveAccent:{default:.5,props:{min:0,max:5,step:.01}}};export{E as colorUtils,R as generateColorRamp,U as generateColorRampParams,$ as generateColorRampWithCurve,T as utils};