react-colorful
Version:
🎨 A tiny (2,5 KB) color picker component for React and Preact apps. Fast, well-tested, dependency-free, mobile-friendly and accessible
3 lines (2 loc) • 13.2 kB
JavaScript
var e=require("react");function r(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=r(e);function o(){return(o=Object.assign||function(e){for(var r=1;r<arguments.length;r++){var t=arguments[r];for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e}).apply(this,arguments)}function n(e,r){if(null==e)return{};var t,o,n={},a=Object.keys(e);for(o=0;o<a.length;o++)r.indexOf(t=a[o])>=0||(n[t]=e[t]);return n}var a="undefined"!=typeof window?e.useLayoutEffect:e.useEffect;function l(r){var t=e.useRef(r);return e.useEffect(function(){t.current=r}),e.useCallback(function(e){return t.current&&t.current(e)},[])}var u,c=function(e,r,t){return void 0===r&&(r=0),void 0===t&&(t=1),e>t?t:e<r?r:e},s=function(e){return"touches"in e},f=function(e,r){var t=e.getBoundingClientRect(),o=s(r)?r.touches[0]:r;return{left:c((o.pageX-(t.left+window.pageXOffset))/t.width),top:c((o.pageY-(t.top+window.pageYOffset))/t.height)}},i=function(e){!s(e)&&e.preventDefault()},d=t.default.memo(function(r){var u=r.onMove,c=r.onKey,d=n(r,["onMove","onKey"]),v=e.useRef(null),h=e.useRef(!1),g=e.useState(!1),m=g[0],p=g[1],b=l(u),_=l(c),C=e.useCallback(function(e){i(e),(s(e)?e.touches.length>0:e.buttons>0)&&v.current?b(f(v.current,e)):p(!1)},[b]),x=e.useCallback(function(e){var r,t=e.nativeEvent,o=v.current;i(t),r=t,h.current&&!s(r)||(h.current||(h.current=s(r)),0)||!o||(o.focus(),b(f(o,t)),p(!0))},[b]),E=e.useCallback(function(e){var r=e.which||e.keyCode;r<37||r>40||(e.preventDefault(),_({left:39===r?.05:37===r?-.05:0,top:40===r?.05:38===r?-.05:0}))},[_]),H=e.useCallback(function(){return p(!1)},[]),k=e.useCallback(function(e){var r=e?window.addEventListener:window.removeEventListener;r(h.current?"touchmove":"mousemove",C),r(h.current?"touchend":"mouseup",H)},[C,H]);return a(function(){return k(m),function(){m&&k(!1)}},[m,k]),t.default.createElement("div",o({},d,{className:"react-colorful__interactive",ref:v,onTouchStart:x,onMouseDown:x,onKeyDown:E,tabIndex:0,role:"slider"}))}),v=function(e){return e.filter(Boolean).join(" ")},h=function(e){var r=e.color,o=e.left,n=e.top,a=void 0===n?.5:n,l=v(["react-colorful__pointer",e.className]);return t.default.createElement("div",{className:l,style:{top:100*a+"%",left:100*o+"%"}},t.default.createElement("div",{className:"react-colorful__pointer-fill",style:{backgroundColor:r}}))},g=function(e,r,t){return void 0===r&&(r=0),void 0===t&&(t=Math.pow(10,r)),Math.round(t*e)/t},m={grad:.9,turn:360,rad:360/(2*Math.PI)},p=function(e){return"#"===e[0]&&(e=e.substr(1)),e.length<6?{r:parseInt(e[0]+e[0],16),g:parseInt(e[1]+e[1],16),b:parseInt(e[2]+e[2],16),a:1}:{r:parseInt(e.substr(0,2),16),g:parseInt(e.substr(2,2),16),b:parseInt(e.substr(4,2),16),a:1}},b=function(e,r){return void 0===r&&(r="deg"),Number(e)*(m[r]||1)},_=function(e){var r=/hsla?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i.exec(e);return r?x({h:b(r[1],r[2]),s:Number(r[3]),l:Number(r[4]),a:void 0===r[5]?1:Number(r[5])/(r[6]?100:1)}):{h:0,s:0,v:0,a:1}},C=_,x=function(e){var r=e.s,t=e.l;return{h:e.h,s:(r*=(t<50?t:100-t)/100)>0?2*r/(t+r)*100:0,v:t+r,a:e.a}},E=function(e){var r=e.s,t=e.v,o=e.a,n=(200-r)*t/100;return{h:g(e.h),s:g(n>0&&n<200?r*t/100/(n<=100?n:200-n)*100:0),l:g(n/2),a:g(o,2)}},H=function(e){var r=E(e);return"hsl("+r.h+", "+r.s+"%, "+r.l+"%)"},k=function(e){var r=E(e);return"hsla("+r.h+", "+r.s+"%, "+r.l+"%, "+r.a+")"},N=function(e){var r=e.h,t=e.s,o=e.v,n=e.a;r=r/360*6,t/=100,o/=100;var a=Math.floor(r),l=o*(1-t),u=o*(1-(r-a)*t),c=o*(1-(1-r+a)*t),s=a%6;return{r:g(255*[o,u,l,l,c,o][s]),g:g(255*[c,o,o,u,l,l][s]),b:g(255*[l,l,c,o,o,u][s]),a:g(n,2)}},M=function(e){var r=/hsva?\(?\s*(-?\d*\.?\d+)(deg|rad|grad|turn)?[,\s]+(-?\d*\.?\d+)%?[,\s]+(-?\d*\.?\d+)%?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i.exec(e);return r?I({h:b(r[1],r[2]),s:Number(r[3]),v:Number(r[4]),a:void 0===r[5]?1:Number(r[5])/(r[6]?100:1)}):{h:0,s:0,v:0,a:1}},w=M,y=function(e){var r=/rgba?\(?\s*(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?[,\s]+(-?\d*\.?\d+)(%)?,?\s*[/\s]*(-?\d*\.?\d+)?(%)?\s*\)?/i.exec(e);return r?S({r:Number(r[1])/(r[2]?100/255:1),g:Number(r[3])/(r[4]?100/255:1),b:Number(r[5])/(r[6]?100/255:1),a:void 0===r[7]?1:Number(r[7])/(r[8]?100:1)}):{h:0,s:0,v:0,a:1}},q=y,P=function(e){var r=e.toString(16);return r.length<2?"0"+r:r},S=function(e){var r=e.r,t=e.g,o=e.b,n=e.a,a=Math.max(r,t,o),l=a-Math.min(r,t,o),u=l?a===r?(t-o)/l:a===t?2+(o-r)/l:4+(r-t)/l:0;return{h:g(60*(u<0?u+6:u)),s:g(a?l/a*100:0),v:g(a/255*100),a:n}},I=function(e){return{h:g(e.h),s:g(e.s),v:g(e.v),a:g(e.a,2)}},O=t.default.memo(function(e){var r=e.hue,o=e.onChange,n=v(["react-colorful__hue",e.className]);return t.default.createElement("div",{className:n},t.default.createElement(d,{onMove:function(e){o({h:360*e.left})},onKey:function(e){o({h:c(r+360*e.left,0,360)})},"aria-label":"Hue","aria-valuetext":g(r)},t.default.createElement(h,{className:"react-colorful__hue-pointer",left:r/360,color:H({h:r,s:100,v:100,a:1})})))}),R=t.default.memo(function(e){var r=e.hsva,o=e.onChange,n={backgroundColor:H({h:r.h,s:100,v:100,a:1})};return t.default.createElement("div",{className:"react-colorful__saturation",style:n},t.default.createElement(d,{onMove:function(e){o({s:100*e.left,v:100-100*e.top})},onKey:function(e){o({s:c(r.s+100*e.left,0,100),v:c(r.v-100*e.top,0,100)})},"aria-label":"Color","aria-valuetext":"Saturation "+g(r.s)+"%, Brightness "+g(r.v)+"%"},t.default.createElement(h,{className:"react-colorful__saturation-pointer",top:1-r.v/100,left:r.s/100,color:H(r)})))}),j=function(e,r){if(e===r)return!0;for(var t in e)if(e[t]!==r[t])return!1;return!0},z=function(e,r){return e.replace(/\s/g,"")===r.replace(/\s/g,"")};function B(r,t,o){var n=l(o),a=e.useState(function(){return r.toHsva(t)}),u=a[0],c=a[1],s=e.useRef({color:t,hsva:u});e.useEffect(function(){if(!r.equal(t,s.current.color)){var e=r.toHsva(t);s.current={hsva:e,color:t},c(e)}},[t,r]),e.useEffect(function(){var e;j(u,s.current.hsva)||r.equal(e=r.fromHsva(u),s.current.color)||(s.current={hsva:u,color:e},n(e))},[u,r,n]);var f=e.useCallback(function(e){c(function(r){return Object.assign({},r,e)})},[]);return[u,f]}var K,L=function(){return u||("undefined"!=typeof __webpack_nonce__?__webpack_nonce__:void 0)},A=function(){a(function(){if("undefined"!=typeof document&&!K){(K=document.createElement("style")).innerHTML='.react-colorful{position:relative;display:flex;flex-direction:column;width:200px;height:200px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.react-colorful__saturation{position:relative;flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(0deg,#000,transparent),linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.react-colorful__alpha-gradient,.react-colorful__pointer-fill{content:"";position:absolute;left:0;top:0;right:0;bottom:0;pointer-events:none;border-radius:inherit}.react-colorful__alpha-gradient,.react-colorful__saturation{box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}.react-colorful__alpha,.react-colorful__hue{position:relative;height:24px}.react-colorful__hue{background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.react-colorful__last-control{border-radius:0 0 8px 8px}.react-colorful__interactive{position:absolute;left:0;top:0;right:0;bottom:0;border-radius:inherit;outline:none;touch-action:none}.react-colorful__pointer{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}.react-colorful__interactive:focus .react-colorful__pointer{transform:translate(-50%,-50%) scale(1.1)}.react-colorful__alpha,.react-colorful__alpha-pointer{background-color:#fff;background-image:url(\'data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill-opacity=".05"><path d="M8 0h8v8H8zM0 8h8v8H0z"/></svg>\')}.react-colorful__saturation-pointer{z-index:3}.react-colorful__hue-pointer{z-index:2}';var e=L();e&&K.setAttribute("nonce",e),document.head.appendChild(K)}},[])},D=function(e){var r=e.className,a=e.colorModel,l=e.color,u=void 0===l?a.defaultColor:l,c=e.onChange,s=n(e,["className","colorModel","color","onChange"]);A();var f=B(a,u,c),i=f[0],d=f[1],h=v(["react-colorful",r]);return t.default.createElement("div",o({},s,{className:h}),t.default.createElement(R,{hsva:i,onChange:d}),t.default.createElement(O,{hue:i.h,onChange:d,className:"react-colorful__last-control"}))},F={defaultColor:"000",toHsva:function(e){return S(p(e))},fromHsva:function(e){return t=(r=N(e)).g,o=r.b,"#"+P(r.r)+P(t)+P(o);var r,t,o},equal:function(e,r){return e.toLowerCase()===r.toLowerCase()||j(p(e),p(r))}},T=function(e){var r=e.className,o=e.hsva,n=e.onChange,a={backgroundImage:"linear-gradient(90deg, "+k(Object.assign({},o,{a:0}))+", "+k(Object.assign({},o,{a:1}))+")"},l=v(["react-colorful__alpha",r]);return t.default.createElement("div",{className:l},t.default.createElement("div",{className:"react-colorful__alpha-gradient",style:a}),t.default.createElement(d,{onMove:function(e){n({a:e.left})},onKey:function(e){n({a:c(o.a+e.left)})},"aria-label":"Alpha","aria-valuetext":g(100*o.a)+"%"},t.default.createElement(h,{className:"react-colorful__alpha-pointer",left:o.a,color:k(o)})))},X=function(e){var r=e.className,a=e.colorModel,l=e.color,u=void 0===l?a.defaultColor:l,c=e.onChange,s=n(e,["className","colorModel","color","onChange"]);A();var f=B(a,u,c),i=f[0],d=f[1],h=v(["react-colorful",r]);return t.default.createElement("div",o({},s,{className:h}),t.default.createElement(R,{hsva:i,onChange:d}),t.default.createElement(O,{hue:i.h,onChange:d}),t.default.createElement(T,{hsva:i,onChange:d,className:"react-colorful__last-control"}))},Y={defaultColor:{h:0,s:0,l:0,a:1},toHsva:x,fromHsva:E,equal:j},$={defaultColor:"hsla(0, 0%, 0%, 1)",toHsva:_,fromHsva:k,equal:z},G={defaultColor:{h:0,s:0,l:0},toHsva:function(e){return x({h:e.h,s:e.s,l:e.l,a:1})},fromHsva:function(e){return{h:(r=E(e)).h,s:r.s,l:r.l};var r},equal:j},J={defaultColor:"hsl(0, 0%, 0%)",toHsva:C,fromHsva:H,equal:z},Q={defaultColor:{h:0,s:0,v:0,a:1},toHsva:function(e){return e},fromHsva:I,equal:j},U={defaultColor:"hsva(0, 0%, 0%, 1)",toHsva:M,fromHsva:function(e){var r=I(e);return"hsva("+r.h+", "+r.s+"%, "+r.v+"%, "+r.a+")"},equal:z},V={defaultColor:{h:0,s:0,v:0},toHsva:function(e){return{h:e.h,s:e.s,v:e.v,a:1}},fromHsva:function(e){var r=I(e);return{h:r.h,s:r.s,v:r.v}},equal:j},W={defaultColor:"hsv(0, 0%, 0%)",toHsva:w,fromHsva:function(e){var r=I(e);return"hsv("+r.h+", "+r.s+"%, "+r.v+"%)"},equal:z},Z={defaultColor:{r:0,g:0,b:0,a:1},toHsva:S,fromHsva:N,equal:j},ee={defaultColor:"rgba(0, 0, 0, 1)",toHsva:y,fromHsva:function(e){var r=N(e);return"rgba("+r.r+", "+r.g+", "+r.b+", "+r.a+")"},equal:z},re={defaultColor:{r:0,g:0,b:0},toHsva:function(e){return S({r:e.r,g:e.g,b:e.b,a:1})},fromHsva:function(e){return{r:(r=N(e)).r,g:r.g,b:r.b};var r},equal:j},te={defaultColor:"rgb(0, 0, 0)",toHsva:q,fromHsva:function(e){var r=N(e);return"rgb("+r.r+", "+r.g+", "+r.b+")"},equal:z},oe=/^#?[0-9A-F]{3}$/i,ne=/^#?[0-9A-F]{6}$/i,ae=function(e){return ne.test(e)||oe.test(e)},le=function(e){return e.replace(/([^0-9A-F]+)/gi,"").substr(0,6)};exports.HexColorInput=function(r){var a=r.color,u=void 0===a?"":a,c=r.onChange,s=r.onBlur,f=r.prefixed,i=n(r,["color","onChange","onBlur","prefixed"]),d=e.useState(function(){return le(u)}),v=d[0],h=d[1],g=l(c),m=l(s),p=e.useCallback(function(e){var r=le(e.target.value);h(r),ae(r)&&g("#"+r)},[g]),b=e.useCallback(function(e){ae(e.target.value)||h(le(u)),m(e)},[u,m]);return e.useEffect(function(){h(le(u))},[u]),t.default.createElement("input",o({},i,{value:(f?"#":"")+v,spellCheck:"false",onChange:p,onBlur:b}))},exports.HexColorPicker=function(e){return t.default.createElement(D,o({},e,{colorModel:F}))},exports.HslColorPicker=function(e){return t.default.createElement(D,o({},e,{colorModel:G}))},exports.HslStringColorPicker=function(e){return t.default.createElement(D,o({},e,{colorModel:J}))},exports.HslaColorPicker=function(e){return t.default.createElement(X,o({},e,{colorModel:Y}))},exports.HslaStringColorPicker=function(e){return t.default.createElement(X,o({},e,{colorModel:$}))},exports.HsvColorPicker=function(e){return t.default.createElement(D,o({},e,{colorModel:V}))},exports.HsvStringColorPicker=function(e){return t.default.createElement(D,o({},e,{colorModel:W}))},exports.HsvaColorPicker=function(e){return t.default.createElement(X,o({},e,{colorModel:Q}))},exports.HsvaStringColorPicker=function(e){return t.default.createElement(X,o({},e,{colorModel:U}))},exports.RgbColorPicker=function(e){return t.default.createElement(D,o({},e,{colorModel:re}))},exports.RgbStringColorPicker=function(e){return t.default.createElement(D,o({},e,{colorModel:te}))},exports.RgbaColorPicker=function(e){return t.default.createElement(X,o({},e,{colorModel:Z}))},exports.RgbaStringColorPicker=function(e){return t.default.createElement(X,o({},e,{colorModel:ee}))},exports.setNonce=function(e){u=e};
//# sourceMappingURL=index.js.map