magic-canvas-yonava 1.0.6 → 1.0.8

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.
@@ -0,0 +1 @@
1
+ (function(E,m){typeof exports=="object"&&typeof module<"u"?m(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],m):(E=typeof globalThis<"u"?globalThis:E||self,m(E.MagicCanvas={},E.Vue))})(this,(function(E,m){"use strict";const Ke=(e,t)=>{const o=new Array(e.length+t.length);for(let n=0;n<e.length;n++)o[n]=e[n];for(let n=0;n<t.length;n++)o[e.length+n]=t[n];return o},Qe=(e,t)=>({classGroupId:e,validator:t}),ye=(e=new Map,t=null,o)=>({nextPart:e,validators:t,classGroupId:o}),ke=[],et="arbitrary..",tt=e=>{const t=nt(e),{conflictingClassGroups:o,conflictingClassGroupModifiers:n}=e;return{getClassGroupId:s=>{if(s.startsWith("[")&&s.endsWith("]"))return ot(s);const i=s.split("-"),l=i[0]===""&&i.length>1?1:0;return xe(i,l,t)},getConflictingClassGroupIds:(s,i)=>{if(i){const l=n[s],u=o[s];return l?u?Ke(u,l):l:u||ke}return o[s]||ke}}},xe=(e,t,o)=>{if(e.length-t===0)return o.classGroupId;const r=e[t],a=o.nextPart.get(r);if(a){const u=xe(e,t+1,a);if(u)return u}const s=o.validators;if(s===null)return;const i=t===0?e.join("-"):e.slice(t).join("-"),l=s.length;for(let u=0;u<l;u++){const b=s[u];if(b.validator(i))return b.classGroupId}},ot=e=>e.slice(1,-1).indexOf(":")===-1?void 0:(()=>{const t=e.slice(1,-1),o=t.indexOf(":"),n=t.slice(0,o);return n?et+n:void 0})(),nt=e=>{const{theme:t,classGroups:o}=e;return rt(o,t)},rt=(e,t)=>{const o=ye();for(const n in e){const r=e[n];me(r,o,n,t)}return o},me=(e,t,o,n)=>{const r=e.length;for(let a=0;a<r;a++){const s=e[a];st(s,t,o,n)}},st=(e,t,o,n)=>{if(typeof e=="string"){at(e,t,o);return}if(typeof e=="function"){it(e,t,o,n);return}lt(e,t,o,n)},at=(e,t,o)=>{const n=e===""?t:Ce(t,e);n.classGroupId=o},it=(e,t,o,n)=>{if(ct(e)){me(e(n),t,o,n);return}t.validators===null&&(t.validators=[]),t.validators.push(Qe(o,e))},lt=(e,t,o,n)=>{const r=Object.entries(e),a=r.length;for(let s=0;s<a;s++){const[i,l]=r[s];me(l,Ce(t,i),o,n)}},Ce=(e,t)=>{let o=e;const n=t.split("-"),r=n.length;for(let a=0;a<r;a++){const s=n[a];let i=o.nextPart.get(s);i||(i=ye(),o.nextPart.set(s,i)),o=i}return o},ct=e=>"isThemeGetter"in e&&e.isThemeGetter===!0,dt=e=>{if(e<1)return{get:()=>{},set:()=>{}};let t=0,o=Object.create(null),n=Object.create(null);const r=(a,s)=>{o[a]=s,t++,t>e&&(t=0,n=o,o=Object.create(null))};return{get(a){let s=o[a];if(s!==void 0)return s;if((s=n[a])!==void 0)return r(a,s),s},set(a,s){a in o?o[a]=s:r(a,s)}}},ut=[],Se=(e,t,o,n,r)=>({modifiers:e,hasImportantModifier:t,baseClassName:o,maybePostfixModifierPosition:n,isExternal:r}),mt=e=>{const{prefix:t,experimentalParseClassName:o}=e;let n=r=>{const a=[];let s=0,i=0,l=0,u;const b=r.length;for(let k=0;k<b;k++){const x=r[k];if(s===0&&i===0){if(x===":"){a.push(r.slice(l,k)),l=k+1;continue}if(x==="/"){u=k;continue}}x==="["?s++:x==="]"?s--:x==="("?i++:x===")"&&i--}const f=a.length===0?r:r.slice(l);let y=f,S=!1;f.endsWith("!")?(y=f.slice(0,-1),S=!0):f.startsWith("!")&&(y=f.slice(1),S=!0);const p=u&&u>l?u-l:void 0;return Se(a,S,y,p)};if(t){const r=t+":",a=n;n=s=>s.startsWith(r)?a(s.slice(r.length)):Se(ut,!1,s,void 0,!0)}if(o){const r=n;n=a=>o({className:a,parseClassName:r})}return n},ft=e=>{const t=new Map;return e.orderSensitiveModifiers.forEach((o,n)=>{t.set(o,1e6+n)}),o=>{const n=[];let r=[];for(let a=0;a<o.length;a++){const s=o[a],i=s[0]==="[",l=t.has(s);i||l?(r.length>0&&(r.sort(),n.push(...r),r=[]),n.push(s)):r.push(s)}return r.length>0&&(r.sort(),n.push(...r)),n}},pt=e=>({cache:dt(e.cacheSize),parseClassName:mt(e),sortModifiers:ft(e),...tt(e)}),gt=/\s+/,ht=(e,t)=>{const{parseClassName:o,getClassGroupId:n,getConflictingClassGroupIds:r,sortModifiers:a}=t,s=[],i=e.trim().split(gt);let l="";for(let u=i.length-1;u>=0;u-=1){const b=i[u],{isExternal:f,modifiers:y,hasImportantModifier:S,baseClassName:p,maybePostfixModifierPosition:k}=o(b);if(f){l=b+(l.length>0?" "+l:l);continue}let x=!!k,R=n(x?p.substring(0,k):p);if(!R){if(!x){l=b+(l.length>0?" "+l:l);continue}if(R=n(p),!R){l=b+(l.length>0?" "+l:l);continue}x=!1}const G=y.length===0?"":y.length===1?y[0]:a(y).join(":"),P=S?G+"!":G,L=P+R;if(s.indexOf(L)>-1)continue;s.push(L);const I=r(R,x);for(let N=0;N<I.length;++N){const j=I[N];s.push(P+j)}l=b+(l.length>0?" "+l:l)}return l},bt=(...e)=>{let t=0,o,n,r="";for(;t<e.length;)(o=e[t++])&&(n=Ae(o))&&(r&&(r+=" "),r+=n);return r},Ae=e=>{if(typeof e=="string")return e;let t,o="";for(let n=0;n<e.length;n++)e[n]&&(t=Ae(e[n]))&&(o&&(o+=" "),o+=t);return o},wt=(e,...t)=>{let o,n,r,a;const s=l=>{const u=t.reduce((b,f)=>f(b),e());return o=pt(u),n=o.cache.get,r=o.cache.set,a=i,i(l)},i=l=>{const u=n(l);if(u)return u;const b=ht(l,o);return r(l,b),b};return a=s,(...l)=>a(bt(...l))},vt=[],M=e=>{const t=o=>o[e]||vt;return t.isThemeGetter=!0,t},Me=/^\[(?:(\w[\w-]*):)?(.+)\]$/i,Re=/^\((?:(\w[\w-]*):)?(.+)\)$/i,yt=/^\d+\/\d+$/,kt=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,xt=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Ct=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,St=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,At=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,B=e=>yt.test(e),w=e=>!!e&&!Number.isNaN(Number(e)),X=e=>!!e&&Number.isInteger(Number(e)),fe=e=>e.endsWith("%")&&w(e.slice(0,-1)),F=e=>kt.test(e),Mt=()=>!0,Rt=e=>xt.test(e)&&!Ct.test(e),Te=()=>!1,Tt=e=>St.test(e),zt=e=>At.test(e),Et=e=>!c(e)&&!d(e),Pt=e=>$(e,Ie,Te),c=e=>Me.test(e),D=e=>$(e,_e,Rt),pe=e=>$(e,Nt,w),ze=e=>$(e,Pe,Te),Ot=e=>$(e,Oe,zt),q=e=>$(e,Le,Tt),d=e=>Re.test(e),J=e=>U(e,_e),It=e=>U(e,Yt),Ee=e=>U(e,Pe),_t=e=>U(e,Ie),Lt=e=>U(e,Oe),K=e=>U(e,Le,!0),$=(e,t,o)=>{const n=Me.exec(e);return n?n[1]?t(n[1]):o(n[2]):!1},U=(e,t,o=!1)=>{const n=Re.exec(e);return n?n[1]?t(n[1]):o:!1},Pe=e=>e==="position"||e==="percentage",Oe=e=>e==="image"||e==="url",Ie=e=>e==="length"||e==="size"||e==="bg-size",_e=e=>e==="length",Nt=e=>e==="number",Yt=e=>e==="family-name",Le=e=>e==="shadow",Ft=wt(()=>{const e=M("color"),t=M("font"),o=M("text"),n=M("font-weight"),r=M("tracking"),a=M("leading"),s=M("breakpoint"),i=M("container"),l=M("spacing"),u=M("radius"),b=M("shadow"),f=M("inset-shadow"),y=M("text-shadow"),S=M("drop-shadow"),p=M("blur"),k=M("perspective"),x=M("aspect"),R=M("ease"),G=M("animate"),P=()=>["auto","avoid","all","avoid-page","page","left","right","column"],L=()=>["center","top","bottom","left","right","top-left","left-top","top-right","right-top","bottom-right","right-bottom","bottom-left","left-bottom"],I=()=>[...L(),d,c],N=()=>["auto","hidden","clip","visible","scroll"],j=()=>["auto","contain","none"],h=()=>[d,c,l],_=()=>[B,"full","auto",...h()],se=()=>[X,"none","subgrid",d,c],ae=()=>["auto",{span:["full",X,d,c]},X,d,c],Y=()=>[X,"auto",d,c],ie=()=>["auto","min","max","fr",d,c],v=()=>["start","end","center","between","around","evenly","stretch","baseline","center-safe","end-safe"],C=()=>["start","end","center","stretch","center-safe","end-safe"],A=()=>["auto",...h()],W=()=>[B,"auto","full","dvw","dvh","lvw","lvh","svw","svh","min","max","fit",...h()],g=()=>[e,d,c],Ue=()=>[...L(),Ee,ze,{position:[d,c]}],Ze=()=>["no-repeat",{repeat:["","x","y","space","round"]}],He=()=>["auto","cover","contain",_t,Pt,{size:[d,c]}],we=()=>[fe,J,D],z=()=>["","none","full",u,d,c],O=()=>["",w,J,D],le=()=>["solid","dashed","dotted","double"],Je=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],T=()=>[w,fe,Ee,ze],qe=()=>["","none",p,d,c],ce=()=>["none",w,d,c],de=()=>["none",w,d,c],ve=()=>[w,d,c],ue=()=>[B,"full",...h()];return{cacheSize:500,theme:{animate:["spin","ping","pulse","bounce"],aspect:["video"],blur:[F],breakpoint:[F],color:[Mt],container:[F],"drop-shadow":[F],ease:["in","out","in-out"],font:[Et],"font-weight":["thin","extralight","light","normal","medium","semibold","bold","extrabold","black"],"inset-shadow":[F],leading:["none","tight","snug","normal","relaxed","loose"],perspective:["dramatic","near","normal","midrange","distant","none"],radius:[F],shadow:[F],spacing:["px",w],text:[F],"text-shadow":[F],tracking:["tighter","tight","normal","wide","wider","widest"]},classGroups:{aspect:[{aspect:["auto","square",B,c,d,x]}],container:["container"],columns:[{columns:[w,c,d,i]}],"break-after":[{"break-after":P()}],"break-before":[{"break-before":P()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],sr:["sr-only","not-sr-only"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:I()}],overflow:[{overflow:N()}],"overflow-x":[{"overflow-x":N()}],"overflow-y":[{"overflow-y":N()}],overscroll:[{overscroll:j()}],"overscroll-x":[{"overscroll-x":j()}],"overscroll-y":[{"overscroll-y":j()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:_()}],"inset-x":[{"inset-x":_()}],"inset-y":[{"inset-y":_()}],start:[{start:_()}],end:[{end:_()}],top:[{top:_()}],right:[{right:_()}],bottom:[{bottom:_()}],left:[{left:_()}],visibility:["visible","invisible","collapse"],z:[{z:[X,"auto",d,c]}],basis:[{basis:[B,"full","auto",i,...h()]}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["nowrap","wrap","wrap-reverse"]}],flex:[{flex:[w,B,"auto","initial","none",c]}],grow:[{grow:["",w,d,c]}],shrink:[{shrink:["",w,d,c]}],order:[{order:[X,"first","last","none",d,c]}],"grid-cols":[{"grid-cols":se()}],"col-start-end":[{col:ae()}],"col-start":[{"col-start":Y()}],"col-end":[{"col-end":Y()}],"grid-rows":[{"grid-rows":se()}],"row-start-end":[{row:ae()}],"row-start":[{"row-start":Y()}],"row-end":[{"row-end":Y()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":ie()}],"auto-rows":[{"auto-rows":ie()}],gap:[{gap:h()}],"gap-x":[{"gap-x":h()}],"gap-y":[{"gap-y":h()}],"justify-content":[{justify:[...v(),"normal"]}],"justify-items":[{"justify-items":[...C(),"normal"]}],"justify-self":[{"justify-self":["auto",...C()]}],"align-content":[{content:["normal",...v()]}],"align-items":[{items:[...C(),{baseline:["","last"]}]}],"align-self":[{self:["auto",...C(),{baseline:["","last"]}]}],"place-content":[{"place-content":v()}],"place-items":[{"place-items":[...C(),"baseline"]}],"place-self":[{"place-self":["auto",...C()]}],p:[{p:h()}],px:[{px:h()}],py:[{py:h()}],ps:[{ps:h()}],pe:[{pe:h()}],pt:[{pt:h()}],pr:[{pr:h()}],pb:[{pb:h()}],pl:[{pl:h()}],m:[{m:A()}],mx:[{mx:A()}],my:[{my:A()}],ms:[{ms:A()}],me:[{me:A()}],mt:[{mt:A()}],mr:[{mr:A()}],mb:[{mb:A()}],ml:[{ml:A()}],"space-x":[{"space-x":h()}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":h()}],"space-y-reverse":["space-y-reverse"],size:[{size:W()}],w:[{w:[i,"screen",...W()]}],"min-w":[{"min-w":[i,"screen","none",...W()]}],"max-w":[{"max-w":[i,"screen","none","prose",{screen:[s]},...W()]}],h:[{h:["screen","lh",...W()]}],"min-h":[{"min-h":["screen","lh","none",...W()]}],"max-h":[{"max-h":["screen","lh",...W()]}],"font-size":[{text:["base",o,J,D]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:[n,d,pe]}],"font-stretch":[{"font-stretch":["ultra-condensed","extra-condensed","condensed","semi-condensed","normal","semi-expanded","expanded","extra-expanded","ultra-expanded",fe,c]}],"font-family":[{font:[It,c,t]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:[r,d,c]}],"line-clamp":[{"line-clamp":[w,"none",d,pe]}],leading:[{leading:[a,...h()]}],"list-image":[{"list-image":["none",d,c]}],"list-style-position":[{list:["inside","outside"]}],"list-style-type":[{list:["disc","decimal","none",d,c]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"placeholder-color":[{placeholder:g()}],"text-color":[{text:g()}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...le(),"wavy"]}],"text-decoration-thickness":[{decoration:[w,"from-font","auto",d,D]}],"text-decoration-color":[{decoration:g()}],"underline-offset":[{"underline-offset":[w,"auto",d,c]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:h()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",d,c]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],wrap:[{wrap:["break-word","anywhere","normal"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",d,c]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:Ue()}],"bg-repeat":[{bg:Ze()}],"bg-size":[{bg:He()}],"bg-image":[{bg:["none",{linear:[{to:["t","tr","r","br","b","bl","l","tl"]},X,d,c],radial:["",d,c],conic:[X,d,c]},Lt,Ot]}],"bg-color":[{bg:g()}],"gradient-from-pos":[{from:we()}],"gradient-via-pos":[{via:we()}],"gradient-to-pos":[{to:we()}],"gradient-from":[{from:g()}],"gradient-via":[{via:g()}],"gradient-to":[{to:g()}],rounded:[{rounded:z()}],"rounded-s":[{"rounded-s":z()}],"rounded-e":[{"rounded-e":z()}],"rounded-t":[{"rounded-t":z()}],"rounded-r":[{"rounded-r":z()}],"rounded-b":[{"rounded-b":z()}],"rounded-l":[{"rounded-l":z()}],"rounded-ss":[{"rounded-ss":z()}],"rounded-se":[{"rounded-se":z()}],"rounded-ee":[{"rounded-ee":z()}],"rounded-es":[{"rounded-es":z()}],"rounded-tl":[{"rounded-tl":z()}],"rounded-tr":[{"rounded-tr":z()}],"rounded-br":[{"rounded-br":z()}],"rounded-bl":[{"rounded-bl":z()}],"border-w":[{border:O()}],"border-w-x":[{"border-x":O()}],"border-w-y":[{"border-y":O()}],"border-w-s":[{"border-s":O()}],"border-w-e":[{"border-e":O()}],"border-w-t":[{"border-t":O()}],"border-w-r":[{"border-r":O()}],"border-w-b":[{"border-b":O()}],"border-w-l":[{"border-l":O()}],"divide-x":[{"divide-x":O()}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":O()}],"divide-y-reverse":["divide-y-reverse"],"border-style":[{border:[...le(),"hidden","none"]}],"divide-style":[{divide:[...le(),"hidden","none"]}],"border-color":[{border:g()}],"border-color-x":[{"border-x":g()}],"border-color-y":[{"border-y":g()}],"border-color-s":[{"border-s":g()}],"border-color-e":[{"border-e":g()}],"border-color-t":[{"border-t":g()}],"border-color-r":[{"border-r":g()}],"border-color-b":[{"border-b":g()}],"border-color-l":[{"border-l":g()}],"divide-color":[{divide:g()}],"outline-style":[{outline:[...le(),"none","hidden"]}],"outline-offset":[{"outline-offset":[w,d,c]}],"outline-w":[{outline:["",w,J,D]}],"outline-color":[{outline:g()}],shadow:[{shadow:["","none",b,K,q]}],"shadow-color":[{shadow:g()}],"inset-shadow":[{"inset-shadow":["none",f,K,q]}],"inset-shadow-color":[{"inset-shadow":g()}],"ring-w":[{ring:O()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:g()}],"ring-offset-w":[{"ring-offset":[w,D]}],"ring-offset-color":[{"ring-offset":g()}],"inset-ring-w":[{"inset-ring":O()}],"inset-ring-color":[{"inset-ring":g()}],"text-shadow":[{"text-shadow":["none",y,K,q]}],"text-shadow-color":[{"text-shadow":g()}],opacity:[{opacity:[w,d,c]}],"mix-blend":[{"mix-blend":[...Je(),"plus-darker","plus-lighter"]}],"bg-blend":[{"bg-blend":Je()}],"mask-clip":[{"mask-clip":["border","padding","content","fill","stroke","view"]},"mask-no-clip"],"mask-composite":[{mask:["add","subtract","intersect","exclude"]}],"mask-image-linear-pos":[{"mask-linear":[w]}],"mask-image-linear-from-pos":[{"mask-linear-from":T()}],"mask-image-linear-to-pos":[{"mask-linear-to":T()}],"mask-image-linear-from-color":[{"mask-linear-from":g()}],"mask-image-linear-to-color":[{"mask-linear-to":g()}],"mask-image-t-from-pos":[{"mask-t-from":T()}],"mask-image-t-to-pos":[{"mask-t-to":T()}],"mask-image-t-from-color":[{"mask-t-from":g()}],"mask-image-t-to-color":[{"mask-t-to":g()}],"mask-image-r-from-pos":[{"mask-r-from":T()}],"mask-image-r-to-pos":[{"mask-r-to":T()}],"mask-image-r-from-color":[{"mask-r-from":g()}],"mask-image-r-to-color":[{"mask-r-to":g()}],"mask-image-b-from-pos":[{"mask-b-from":T()}],"mask-image-b-to-pos":[{"mask-b-to":T()}],"mask-image-b-from-color":[{"mask-b-from":g()}],"mask-image-b-to-color":[{"mask-b-to":g()}],"mask-image-l-from-pos":[{"mask-l-from":T()}],"mask-image-l-to-pos":[{"mask-l-to":T()}],"mask-image-l-from-color":[{"mask-l-from":g()}],"mask-image-l-to-color":[{"mask-l-to":g()}],"mask-image-x-from-pos":[{"mask-x-from":T()}],"mask-image-x-to-pos":[{"mask-x-to":T()}],"mask-image-x-from-color":[{"mask-x-from":g()}],"mask-image-x-to-color":[{"mask-x-to":g()}],"mask-image-y-from-pos":[{"mask-y-from":T()}],"mask-image-y-to-pos":[{"mask-y-to":T()}],"mask-image-y-from-color":[{"mask-y-from":g()}],"mask-image-y-to-color":[{"mask-y-to":g()}],"mask-image-radial":[{"mask-radial":[d,c]}],"mask-image-radial-from-pos":[{"mask-radial-from":T()}],"mask-image-radial-to-pos":[{"mask-radial-to":T()}],"mask-image-radial-from-color":[{"mask-radial-from":g()}],"mask-image-radial-to-color":[{"mask-radial-to":g()}],"mask-image-radial-shape":[{"mask-radial":["circle","ellipse"]}],"mask-image-radial-size":[{"mask-radial":[{closest:["side","corner"],farthest:["side","corner"]}]}],"mask-image-radial-pos":[{"mask-radial-at":L()}],"mask-image-conic-pos":[{"mask-conic":[w]}],"mask-image-conic-from-pos":[{"mask-conic-from":T()}],"mask-image-conic-to-pos":[{"mask-conic-to":T()}],"mask-image-conic-from-color":[{"mask-conic-from":g()}],"mask-image-conic-to-color":[{"mask-conic-to":g()}],"mask-mode":[{mask:["alpha","luminance","match"]}],"mask-origin":[{"mask-origin":["border","padding","content","fill","stroke","view"]}],"mask-position":[{mask:Ue()}],"mask-repeat":[{mask:Ze()}],"mask-size":[{mask:He()}],"mask-type":[{"mask-type":["alpha","luminance"]}],"mask-image":[{mask:["none",d,c]}],filter:[{filter:["","none",d,c]}],blur:[{blur:qe()}],brightness:[{brightness:[w,d,c]}],contrast:[{contrast:[w,d,c]}],"drop-shadow":[{"drop-shadow":["","none",S,K,q]}],"drop-shadow-color":[{"drop-shadow":g()}],grayscale:[{grayscale:["",w,d,c]}],"hue-rotate":[{"hue-rotate":[w,d,c]}],invert:[{invert:["",w,d,c]}],saturate:[{saturate:[w,d,c]}],sepia:[{sepia:["",w,d,c]}],"backdrop-filter":[{"backdrop-filter":["","none",d,c]}],"backdrop-blur":[{"backdrop-blur":qe()}],"backdrop-brightness":[{"backdrop-brightness":[w,d,c]}],"backdrop-contrast":[{"backdrop-contrast":[w,d,c]}],"backdrop-grayscale":[{"backdrop-grayscale":["",w,d,c]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[w,d,c]}],"backdrop-invert":[{"backdrop-invert":["",w,d,c]}],"backdrop-opacity":[{"backdrop-opacity":[w,d,c]}],"backdrop-saturate":[{"backdrop-saturate":[w,d,c]}],"backdrop-sepia":[{"backdrop-sepia":["",w,d,c]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":h()}],"border-spacing-x":[{"border-spacing-x":h()}],"border-spacing-y":[{"border-spacing-y":h()}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["","all","colors","opacity","shadow","transform","none",d,c]}],"transition-behavior":[{transition:["normal","discrete"]}],duration:[{duration:[w,"initial",d,c]}],ease:[{ease:["linear","initial",R,d,c]}],delay:[{delay:[w,d,c]}],animate:[{animate:["none",G,d,c]}],backface:[{backface:["hidden","visible"]}],perspective:[{perspective:[k,d,c]}],"perspective-origin":[{"perspective-origin":I()}],rotate:[{rotate:ce()}],"rotate-x":[{"rotate-x":ce()}],"rotate-y":[{"rotate-y":ce()}],"rotate-z":[{"rotate-z":ce()}],scale:[{scale:de()}],"scale-x":[{"scale-x":de()}],"scale-y":[{"scale-y":de()}],"scale-z":[{"scale-z":de()}],"scale-3d":["scale-3d"],skew:[{skew:ve()}],"skew-x":[{"skew-x":ve()}],"skew-y":[{"skew-y":ve()}],transform:[{transform:[d,c,"","none","gpu","cpu"]}],"transform-origin":[{origin:I()}],"transform-style":[{transform:["3d","flat"]}],translate:[{translate:ue()}],"translate-x":[{"translate-x":ue()}],"translate-y":[{"translate-y":ue()}],"translate-z":[{"translate-z":ue()}],"translate-none":["translate-none"],accent:[{accent:g()}],appearance:[{appearance:["none","auto"]}],"caret-color":[{caret:g()}],"color-scheme":[{scheme:["normal","dark","light","light-dark","only-dark","only-light"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",d,c]}],"field-sizing":[{"field-sizing":["fixed","content"]}],"pointer-events":[{"pointer-events":["auto","none"]}],resize:[{resize:["none","","y","x"]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":h()}],"scroll-mx":[{"scroll-mx":h()}],"scroll-my":[{"scroll-my":h()}],"scroll-ms":[{"scroll-ms":h()}],"scroll-me":[{"scroll-me":h()}],"scroll-mt":[{"scroll-mt":h()}],"scroll-mr":[{"scroll-mr":h()}],"scroll-mb":[{"scroll-mb":h()}],"scroll-ml":[{"scroll-ml":h()}],"scroll-p":[{"scroll-p":h()}],"scroll-px":[{"scroll-px":h()}],"scroll-py":[{"scroll-py":h()}],"scroll-ps":[{"scroll-ps":h()}],"scroll-pe":[{"scroll-pe":h()}],"scroll-pt":[{"scroll-pt":h()}],"scroll-pr":[{"scroll-pr":h()}],"scroll-pb":[{"scroll-pb":h()}],"scroll-pl":[{"scroll-pl":h()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",d,c]}],fill:[{fill:["none",...g()]}],"stroke-w":[{stroke:[w,J,D,pe]}],stroke:[{stroke:["none",...g()]}],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-x","border-w-y","border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-x","border-color-y","border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],translate:["translate-x","translate-y","translate-none"],"translate-none":["translate","translate-x","translate-y","translate-z"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]},orderSensitiveModifiers:["*","**","after","backdrop","before","details-content","file","first-letter","first-line","marker","placeholder","selection"]}}),Ne=m.defineComponent({__name:"MagicCanvas",props:{canvasRef:{type:Function},cleanup:{type:Function}},setup(e){const t=e,o=m.ref();return m.onMounted(()=>{if(!o.value)throw new Error("Canvas not found in DOM. Check ref link.");t.canvasRef(o.value)}),m.onBeforeUnmount(()=>{if(!o.value)throw new Error("Canvas not found in DOM. Check ref link.");t.cleanup(o.value)}),(n,r)=>(m.openBlock(),m.createElementBlock("canvas",m.mergeProps({...n.$attrs,class:m.unref(Ft)(n.$attrs.class,["w-full","h-full"])},{ref_key:"canvas",ref:o})," Sorry, your browser does not support canvas. ",16))}});function Ye(e){return m.getCurrentScope()?(m.onScopeDispose(e),!0):!1}const Gt=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Xt=Object.prototype.toString,Dt=e=>Xt.call(e)==="[object Object]",Vt=()=>{};function jt(...e){if(e.length!==1)return m.toRef(...e);const t=e[0];return typeof t=="function"?m.readonly(m.customRef(()=>({get:t,set:Vt}))):m.ref(t)}function Wt(e,t){function o(...n){return new Promise((r,a)=>{Promise.resolve(e(()=>t.apply(this,n),{fn:t,thisArg:this,args:n})).then(r).catch(a)})}return o}const Fe=e=>e();function Bt(e=Fe,t={}){const{initialState:o="active"}=t,n=jt(o==="active");function r(){n.value=!1}function a(){n.value=!0}const s=(...i)=>{n.value&&e(...i)};return{isActive:m.readonly(n),pause:r,resume:a,eventFilter:s}}function Q(e){return Array.isArray(e)?e:[e]}function $t(e){return m.getCurrentInstance()}function Ut(e,t,o={}){const{eventFilter:n=Fe,...r}=o;return m.watch(e,Wt(n,t),r)}function Zt(e,t,o={}){const{eventFilter:n,initialState:r="active",...a}=o,{eventFilter:s,pause:i,resume:l,isActive:u}=Bt(n,{initialState:r});return{stop:Ut(e,t,{...a,eventFilter:s}),pause:i,resume:l,isActive:u}}function Ge(e,t=!0,o){$t()?m.onMounted(e,o):t?e():m.nextTick(e)}function Ht(e,t,o){return m.watch(e,t,{...o,immediate:!0})}const Z=Gt?window:void 0;function V(e){var t;const o=m.toValue(e);return(t=o?.$el)!=null?t:o}function Xe(...e){const t=[],o=()=>{t.forEach(i=>i()),t.length=0},n=(i,l,u,b)=>(i.addEventListener(l,u,b),()=>i.removeEventListener(l,u,b)),r=m.computed(()=>{const i=Q(m.toValue(e[0])).filter(l=>l!=null);return i.every(l=>typeof l!="string")?i:void 0}),a=Ht(()=>{var i,l;return[(l=(i=r.value)==null?void 0:i.map(u=>V(u)))!=null?l:[Z].filter(u=>u!=null),Q(m.toValue(r.value?e[1]:e[0])),Q(m.unref(r.value?e[2]:e[1])),m.toValue(r.value?e[3]:e[2])]},([i,l,u,b])=>{if(o(),!i?.length||!l?.length||!u?.length)return;const f=Dt(b)?{...b}:b;t.push(...i.flatMap(y=>l.flatMap(S=>u.map(p=>n(y,S,p,f)))))},{flush:"post"}),s=()=>{a(),o()};return Ye(o),s}function Jt(){const e=m.shallowRef(!1),t=m.getCurrentInstance();return t&&m.onMounted(()=>{e.value=!0},t),e}function qt(e){const t=Jt();return m.computed(()=>(t.value,!!e()))}const ee=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},te="__vueuse_ssr_handlers__",Kt=Qt();function Qt(){return te in ee||(ee[te]=ee[te]||{}),ee[te]}function eo(e,t){return Kt[e]||t}function to(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const oo={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},De="vueuse-storage";function no(e,t,o,n={}){var r;const{flush:a="pre",deep:s=!0,listenToStorageChanges:i=!0,writeDefaults:l=!0,mergeDefaults:u=!1,shallow:b,window:f=Z,eventFilter:y,onError:S=v=>{console.error(v)},initOnMounted:p}=n,k=(b?m.shallowRef:m.ref)(typeof t=="function"?t():t),x=m.computed(()=>m.toValue(e));if(!o)try{o=eo("getDefaultStorage",()=>{var v;return(v=Z)==null?void 0:v.localStorage})()}catch(v){S(v)}if(!o)return k;const R=m.toValue(t),G=to(R),P=(r=n.serializer)!=null?r:oo[G],{pause:L,resume:I}=Zt(k,v=>se(v),{flush:a,deep:s,eventFilter:y});m.watch(x,()=>Y(),{flush:a});let N=!1;const j=v=>{p&&!N||Y(v)},h=v=>{p&&!N||ie(v)};f&&i&&(o instanceof Storage?Xe(f,"storage",j,{passive:!0}):Xe(f,De,h)),p?Ge(()=>{N=!0,Y()}):Y();function _(v,C){if(f){const A={key:x.value,oldValue:v,newValue:C,storageArea:o};f.dispatchEvent(o instanceof Storage?new StorageEvent("storage",A):new CustomEvent(De,{detail:A}))}}function se(v){try{const C=o.getItem(x.value);if(v==null)_(C,null),o.removeItem(x.value);else{const A=P.write(v);C!==A&&(o.setItem(x.value,A),_(C,A))}}catch(C){S(C)}}function ae(v){const C=v?v.newValue:o.getItem(x.value);if(C==null)return l&&R!=null&&o.setItem(x.value,P.write(R)),R;if(!v&&u){const A=P.read(C);return typeof u=="function"?u(A,R):G==="object"&&!Array.isArray(A)?{...R,...A}:A}else return typeof C!="string"?C:P.read(C)}function Y(v){if(!(v&&v.storageArea!==o)){if(v&&v.key==null){k.value=R;return}if(!(v&&v.key!==x.value)){L();try{const C=P.write(k.value);(v===void 0||v?.newValue!==C)&&(k.value=ae(v))}catch(C){S(C)}finally{v?m.nextTick(I):I()}}}}function ie(v){Y(v.detail)}return k}function ro(e,t,o={}){const{window:n=Z,...r}=o;let a;const s=qt(()=>n&&"ResizeObserver"in n),i=()=>{a&&(a.disconnect(),a=void 0)},l=m.computed(()=>{const f=m.toValue(e);return Array.isArray(f)?f.map(y=>V(y)):[V(f)]}),u=m.watch(l,f=>{if(i(),s.value&&n){a=new ResizeObserver(t);for(const y of f)y&&a.observe(y,r)}},{immediate:!0,flush:"post"}),b=()=>{i(),u()};return Ye(b),{isSupported:s,stop:b}}function so(e,t={width:0,height:0},o={}){const{window:n=Z,box:r="content-box"}=o,a=m.computed(()=>{var f,y;return(y=(f=V(e))==null?void 0:f.namespaceURI)==null?void 0:y.includes("svg")}),s=m.shallowRef(t.width),i=m.shallowRef(t.height),{stop:l}=ro(e,([f])=>{const y=r==="border-box"?f.borderBoxSize:r==="content-box"?f.contentBoxSize:f.devicePixelContentBoxSize;if(n&&a.value){const S=V(e);if(S){const p=S.getBoundingClientRect();s.value=p.width,i.value=p.height}}else if(y){const S=Q(y);s.value=S.reduce((p,{inlineSize:k})=>p+k,0),i.value=S.reduce((p,{blockSize:k})=>p+k,0)}else s.value=f.contentRect.width,i.value=f.contentRect.height},o);Ge(()=>{const f=V(e);f&&(s.value="offsetWidth"in f?f.offsetWidth:t.width,i.value="offsetHeight"in f?f.offsetHeight:t.height)});const u=m.watch(()=>V(e),f=>{s.value=f?t.width:0,i.value=f?t.height:0});function b(){l(),u()}return{width:s,height:i,stop:b}}function ge(e,t,o={}){const{window:n=Z}=o;return no(e,t,n?.localStorage,o)}const oe=()=>window.devicePixelRatio??1,ao=(e,t)=>{const o=t.translateX??0,n=t.translateY??0;(o!==0||n!==0)&&e.translate(o,n);const r=t.scaleX??1,a=t.scaleY??1;(r!==1||a!==1)&&e.scale(r,a);const s=t.skewX??0,i=t.skewY??0;(s!==0||i!==0)&&e.transform(1,i,s,1,0,0)},Ve=e=>{if(!e)throw new Error("canvas not found");const t="value"in e?e.value:e;if(!t)throw new Error("canvas not found");const o=t.getContext("2d");if(!o)throw new Error("2d context not found");return o},io={middle:1},he=e=>{const{a:t,e:o,f:n}=e.getTransform(),r=oe(),a=t/r,s=o/r,i=n/r;return{panX:s,panY:i,zoom:a}},ne=(e,t)=>{const o=t.canvas.getBoundingClientRect(),n=e.clientX-o.left,r=e.clientY-o.top,{panX:a,panY:s,zoom:i}=he(t),l=(n-a)/i,u=(r-s)/i;return{x:l,y:u,zoom:i}},lo=(e,t)=>{const{panX:o,panY:n,zoom:r}=he(t),{x:a,y:s}=e;return{clientX:a*r+o,clientY:s*r+n,zoom:r}},je=e=>{const t=m.ref({x:0,y:0}),o=n=>t.value=ne(n,Ve(e));return m.onMounted(()=>{if(!e.value)throw new Error("Canvas not found in DOM. Check ref link.");e.value.addEventListener("mousemove",o),e.value.addEventListener("wheel",o)}),{coordinates:t,cleanup:n=>{n.removeEventListener("mousemove",o),n.removeEventListener("wheel",o)}}},H=100,We=.6,re=.25,co=e=>{if(e<=re)return"00";if(e>=We)return"";const t=String(Math.floor((e-re)/(We-re)*100));return t.length===1?`0${t}`:t},uo=({panX:e,panY:t,zoom:o},n)=>({draw:a=>{if(o.value<=re)return;const s=ne({clientX:0,clientY:0},a),i=ne({clientX:window.innerWidth+H,clientY:window.innerHeight+H},a),l=e.value/o.value%H,u=t.value/o.value%H;for(let b=s.x+l;b<i.x;b+=H)for(let f=s.y+u;f<i.y;f+=H)n.value(a,{x:b,y:f},co(o.value))}}),be={cameraPanX:e=>`camera-pan-x-${e}`,cameraPanY:e=>`camera-pan-y-${e}`,cameraZoom:e=>`camera-zoom-${e}`},mo=.2,fo=10,po=.02,Be=1,go=(e,t)=>{const o=ge(be.cameraPanX(t),0),n=ge(be.cameraPanY(t),0),r=ge(be.cameraZoom(t),1),a=p=>{const k=e.value.getBoundingClientRect(),x=p.clientX-k.left,R=p.clientY-k.top,G=Math.max(-100,Math.min(100,p.deltaY)),P=Math.exp(-G*po),L=Math.min(fo,Math.max(mo,r.value*P)),I=L/r.value;o.value=x-(x-o.value)*I,n.value=R-(R-n.value)*I,r.value=L},s=p=>{o.value-=p.deltaX*Be,n.value-=p.deltaY*Be},i=p=>{p.preventDefault(),(!p.ctrlKey?s:a)(p)};let l=0,u=0,b=!1;const f=p=>{b=p.button===io.middle,b&&(l=p.clientX,u=p.clientY)},y=p=>{b&&(s({deltaX:l-p.clientX,deltaY:u-p.clientY}),l=p.clientX,u=p.clientY)},S=()=>{l=0,u=0,b=!1};return m.onMounted(()=>{if(!e.value)throw new Error("canvas not found in DOM");e.value.addEventListener("wheel",i,{passive:!1}),e.value.addEventListener("mousedown",f),e.value.addEventListener("mousemove",y),document.addEventListener("mouseup",S)}),{actions:{zoomIn:(p=12.5)=>a({deltaY:-p,clientX:window.innerWidth/2,clientY:window.innerHeight/2}),zoomOut:(p=12.5)=>a({deltaY:p,clientX:window.innerWidth/2,clientY:window.innerHeight/2})},state:{panX:o,panY:n,zoom:r},getTransform:()=>({scaleX:r.value,scaleY:r.value,translateX:o.value,translateY:n.value}),cleanup:p=>{p.removeEventListener("wheel",i),p.removeEventListener("mousedown",f),p.removeEventListener("mousemove",y),document.removeEventListener("mouseup",S)}}},ho=(e,t)=>{const{getTransform:o,...n}=go(e,t),r=oe(),a={scaleX:r,scaleY:r};return{...n,transformAndClear:s=>{s.resetTransform(),s.clearRect(0,0,s.canvas.width,s.canvas.height);const i=[a,o()];for(const l of i)ao(s,l)}}},bo=60,$e=e=>{if(!e)throw new Error("Canvas not found in DOM. Check ref link.");const t=oe(),o=e.getBoundingClientRect();e.width=o.width*t,e.height=o.height*t},wo=(e={})=>{const t=m.ref(),o=so(t),n=m.ref(()=>{}),r=m.ref(()=>{});let a;m.onMounted(()=>{$e(t.value),a=setInterval(f,1e3/bo)}),m.watch([o.width,o.height],()=>$e(t.value));const{cleanup:s,...i}=ho(t,e?.storageKey??"[default-storage-key]"),{coordinates:l,cleanup:u}=je(t),b=uo(i.state,r),f=()=>{const y=Ve(t);i.transformAndClear(y),b.draw(y),n.value(y)};return{canvas:t,camera:i,cursorCoordinates:l,ref:{canvasRef:y=>t.value=y,cleanup:y=>{u(y),s(y),clearInterval(a)}},draw:{content:n,backgroundPattern:r}}},vo={install(e){e.component("MagicCanvas",Ne)}};E.MagicCanvas=Ne,E.MagicCanvasPlugin=vo,E.getCanvasTransform=he,E.getClientCoordinates=lo,E.getDevicePixelRatio=oe,E.getMagicCoordinates=ne,E.useMagicCanvas=wo,E.useMagicCoordinates=je,Object.defineProperty(E,Symbol.toStringTag,{value:"Module"})}));
package/dist/types.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import type { Ref } from 'vue';
2
- import type { DrawPattern } from './backgroundPattern';
3
- import type { Camera } from './camera';
1
+ import { Ref } from 'vue';
2
+ import { DrawPattern } from './backgroundPattern';
3
+ import { Camera } from './camera';
4
4
  export type Coordinate = {
5
5
  x: number;
6
6
  y: number;
@@ -1,2 +1,2 @@
1
- import type { UseMagicCanvas } from "./types";
1
+ import { UseMagicCanvas } from './types';
2
2
  export declare const useMagicCanvas: UseMagicCanvas;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "magic-canvas-yonava",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -12,16 +12,19 @@
12
12
  }
13
13
  },
14
14
  "scripts": {
15
- "build:types": "vue-tsc -b .",
16
- "republish": "rm -rf dist && npm run build:types && npm publish"
15
+ "build": "vue-tsc -b . && vite build",
16
+ "republish": "rm -rf dist && npm run build && npm publish"
17
17
  },
18
18
  "peerDependencies": {
19
19
  "vue": "^3.5.18"
20
20
  },
21
21
  "dependencies": {
22
+ "@vitejs/plugin-vue": "^6.0.3",
22
23
  "@vueuse/core": "^13.6.0",
23
- "magic-utils-yonava": "^1.0.7",
24
- "tailwind-merge": "^3.3.1"
24
+ "magic-utils-yonava": "^1.0.11",
25
+ "tailwind-merge": "^3.3.1",
26
+ "vite": "^7.3.0",
27
+ "vite-plugin-dts": "^4.5.4"
25
28
  },
26
29
  "devDependencies": {
27
30
  "@types/node": "^24.8.1",
package/src/index.ts CHANGED
@@ -12,7 +12,7 @@ declare module "vue" {
12
12
  }
13
13
  }
14
14
 
15
- export default {
15
+ export const MagicCanvasPlugin = {
16
16
  install(app: App) {
17
17
  app.component("MagicCanvas", MagicCanvas);
18
18
  },
package/tsconfig.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "compilerOptions": {
3
3
  "outDir": "./dist",
4
- "rootDir": "./src",
4
+ "rootDir": "src",
5
5
 
6
6
  "target": "ES2022",
7
7
  "module": "ESNext",
package/vite.config.ts ADDED
@@ -0,0 +1,29 @@
1
+ import { defineConfig } from "vite";
2
+ import vue from "@vitejs/plugin-vue";
3
+ import path from "path";
4
+ import dts from "vite-plugin-dts";
5
+
6
+ export default defineConfig({
7
+ plugins: [
8
+ vue(),
9
+ dts({
10
+ insertTypesEntry: true,
11
+ include: ["src/**/*.ts", "src/**/*.vue"],
12
+ }),
13
+ ],
14
+ build: {
15
+ lib: {
16
+ entry: path.resolve(__dirname, "src/index.ts"),
17
+ name: "MagicCanvas",
18
+ fileName: (format) => `index.${format}.js`,
19
+ },
20
+ rollupOptions: {
21
+ external: ["vue"],
22
+ output: {
23
+ globals: {
24
+ vue: "Vue",
25
+ },
26
+ },
27
+ },
28
+ },
29
+ });
@@ -1,36 +0,0 @@
1
- import { twMerge } from "tailwind-merge";
2
- import { onBeforeUnmount, onMounted, ref } from "vue";
3
- const props = defineProps();
4
- const canvas = ref();
5
- onMounted(() => {
6
- if (!canvas.value)
7
- throw new Error("Canvas not found in DOM. Check ref link.");
8
- props.canvasRef(canvas.value);
9
- });
10
- onBeforeUnmount(() => {
11
- if (!canvas.value)
12
- throw new Error("Canvas not found in DOM. Check ref link.");
13
- props.cleanup(canvas.value);
14
- });
15
- const __VLS_ctx = {
16
- ...{},
17
- ...{},
18
- ...{},
19
- ...{},
20
- };
21
- let __VLS_components;
22
- let __VLS_intrinsics;
23
- let __VLS_directives;
24
- __VLS_asFunctionalElement1(__VLS_intrinsics.canvas, __VLS_intrinsics.canvas)({
25
- ...({
26
- ...__VLS_ctx.$attrs,
27
- class: __VLS_ctx.twMerge(__VLS_ctx.$attrs.class, ['w-full', 'h-full']),
28
- }),
29
- ref: "canvas",
30
- });
31
- // @ts-ignore
32
- [$attrs, $attrs, twMerge,];
33
- const __VLS_export = (await import('vue')).defineComponent({
34
- __typeProps: {},
35
- });
36
- export default {};
@@ -1,36 +0,0 @@
1
- import { getMagicCoordinates } from './coordinates';
2
- const STAGGER = 100;
3
- const START_PATTERN_FADE_OUT = 0.6;
4
- const PATTERN_FULLY_FADED_OUT = 0.25;
5
- const computeAlpha = (z) => {
6
- if (z <= PATTERN_FULLY_FADED_OUT)
7
- return '00';
8
- if (z >= START_PATTERN_FADE_OUT)
9
- return '';
10
- const strPercent = String(Math.floor(((z - PATTERN_FULLY_FADED_OUT) /
11
- (START_PATTERN_FADE_OUT - PATTERN_FULLY_FADED_OUT)) *
12
- 100));
13
- return strPercent.length === 1 ? `0${strPercent}` : strPercent;
14
- };
15
- export const useBackgroundPattern = ({ panX, panY, zoom }, drawPattern) => {
16
- const draw = (ctx) => {
17
- if (zoom.value <= PATTERN_FULLY_FADED_OUT)
18
- return;
19
- const startingCoords = getMagicCoordinates({
20
- clientX: 0,
21
- clientY: 0,
22
- }, ctx);
23
- const endingCoords = getMagicCoordinates({
24
- clientX: window.innerWidth + STAGGER,
25
- clientY: window.innerHeight + STAGGER,
26
- }, ctx);
27
- const offsetX = (panX.value / zoom.value) % STAGGER;
28
- const offsetY = (panY.value / zoom.value) % STAGGER;
29
- for (let x = startingCoords.x + offsetX; x < endingCoords.x; x += STAGGER) {
30
- for (let y = startingCoords.y + offsetY; y < endingCoords.y; y += STAGGER) {
31
- drawPattern.value(ctx, { x, y }, computeAlpha(zoom.value));
32
- }
33
- }
34
- };
35
- return { draw };
36
- };
@@ -1,20 +0,0 @@
1
- import { usePanAndZoom } from './panZoom';
2
- import { addTransform, getDevicePixelRatio, } from './utils';
3
- export const useCamera = (canvas, storageKey) => {
4
- const { getTransform: getPZTransform, ...rest } = usePanAndZoom(canvas, storageKey);
5
- const dpr = getDevicePixelRatio();
6
- const dprTransform = {
7
- scaleX: dpr,
8
- scaleY: dpr,
9
- };
10
- return {
11
- ...rest,
12
- transformAndClear: (ctx) => {
13
- ctx.resetTransform();
14
- ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
15
- const transforms = [dprTransform, getPZTransform()];
16
- for (const t of transforms)
17
- addTransform(ctx, t);
18
- },
19
- };
20
- };
@@ -1,100 +0,0 @@
1
- import { useLocalStorage } from "@vueuse/core";
2
- import { localKeys } from "../localStorage";
3
- import { onMounted } from "vue";
4
- import { MOUSE_BUTTONS } from "magic-utils-yonava";
5
- export const MIN_ZOOM = 0.2;
6
- export const MAX_ZOOM = 10;
7
- export const ZOOM_SENSITIVITY = 0.02;
8
- export const PAN_SENSITIVITY = 1;
9
- export const usePanAndZoom = (canvas, storageKey) => {
10
- const panX = useLocalStorage(localKeys.cameraPanX(storageKey), 0);
11
- const panY = useLocalStorage(localKeys.cameraPanY(storageKey), 0);
12
- const zoom = useLocalStorage(localKeys.cameraZoom(storageKey), 1);
13
- const setZoom = (ev) => {
14
- const rect = canvas.value.getBoundingClientRect();
15
- const cx = ev.clientX - rect.left;
16
- const cy = ev.clientY - rect.top;
17
- // clamp deltaY to a max range to prevent mice with large deltaY notches from feeling too sensitive
18
- const normalizedDelta = Math.max(-100, Math.min(100, ev.deltaY));
19
- const zoomFactor = Math.exp(-normalizedDelta * ZOOM_SENSITIVITY);
20
- const clampedZoom = Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, zoom.value * zoomFactor));
21
- const scale = clampedZoom / zoom.value;
22
- panX.value = cx - (cx - panX.value) * scale;
23
- panY.value = cy - (cy - panY.value) * scale;
24
- zoom.value = clampedZoom;
25
- };
26
- const setPan = (ev) => {
27
- panX.value -= ev.deltaX * PAN_SENSITIVITY;
28
- panY.value -= ev.deltaY * PAN_SENSITIVITY;
29
- };
30
- const onWheel = (ev) => {
31
- ev.preventDefault();
32
- const isPanning = !ev.ctrlKey;
33
- const maneuverCamera = isPanning ? setPan : setZoom;
34
- maneuverCamera(ev);
35
- };
36
- let lastX = 0;
37
- let lastY = 0;
38
- let middleMouseDown = false;
39
- const onMousedown = (ev) => {
40
- middleMouseDown = ev.button === MOUSE_BUTTONS.middle;
41
- if (!middleMouseDown)
42
- return;
43
- lastX = ev.clientX;
44
- lastY = ev.clientY;
45
- };
46
- const onMousemove = (ev) => {
47
- if (!middleMouseDown)
48
- return;
49
- setPan({
50
- deltaX: lastX - ev.clientX,
51
- deltaY: lastY - ev.clientY,
52
- });
53
- lastX = ev.clientX;
54
- lastY = ev.clientY;
55
- };
56
- const onMouseup = () => {
57
- lastX = 0;
58
- lastY = 0;
59
- middleMouseDown = false;
60
- };
61
- onMounted(() => {
62
- if (!canvas.value)
63
- throw new Error("canvas not found in DOM");
64
- canvas.value.addEventListener("wheel", onWheel, { passive: false });
65
- canvas.value.addEventListener("mousedown", onMousedown);
66
- canvas.value.addEventListener("mousemove", onMousemove);
67
- document.addEventListener("mouseup", onMouseup);
68
- });
69
- return {
70
- actions: {
71
- zoomIn: (increment = 12.5) => setZoom({
72
- deltaY: -increment,
73
- clientX: window.innerWidth / 2,
74
- clientY: window.innerHeight / 2,
75
- }),
76
- zoomOut: (decrement = 12.5) => setZoom({
77
- deltaY: decrement,
78
- clientX: window.innerWidth / 2,
79
- clientY: window.innerHeight / 2,
80
- }),
81
- },
82
- state: {
83
- panX,
84
- panY,
85
- zoom,
86
- },
87
- getTransform: () => ({
88
- scaleX: zoom.value,
89
- scaleY: zoom.value,
90
- translateX: panX.value,
91
- translateY: panY.value,
92
- }),
93
- cleanup: (ref) => {
94
- ref.removeEventListener("wheel", onWheel);
95
- ref.removeEventListener("mousedown", onMousedown);
96
- ref.removeEventListener("mousemove", onMousemove);
97
- document.removeEventListener("mouseup", onMouseup);
98
- },
99
- };
100
- };
@@ -1,18 +0,0 @@
1
- export const getDevicePixelRatio = () => window.devicePixelRatio ?? 1;
2
- export const addTransform = (ctx, t) => {
3
- const translateX = t.translateX ?? 0;
4
- const translateY = t.translateY ?? 0;
5
- if (translateX !== 0 || translateY !== 0) {
6
- ctx.translate(translateX, translateY);
7
- }
8
- const scaleX = t.scaleX ?? 1;
9
- const scaleY = t.scaleY ?? 1;
10
- if (scaleX !== 1 || scaleY !== 1) {
11
- ctx.scale(scaleX, scaleY);
12
- }
13
- const skewX = t.skewX ?? 0;
14
- const skewY = t.skewY ?? 0;
15
- if (skewX !== 0 || skewY !== 0) {
16
- ctx.transform(1, skewY, skewX, 1, 0, 0);
17
- }
18
- };
@@ -1,58 +0,0 @@
1
- import { getDevicePixelRatio } from "../camera/utils";
2
- import { onMounted, ref } from "vue";
3
- import { getCtx } from "magic-utils-yonava";
4
- export const getCanvasTransform = (ctx) => {
5
- const { a, e, f } = ctx.getTransform();
6
- // TODO investigate why dpr isn't already factored into ctx. Camera should add it with the PZ transform!
7
- const dpr = getDevicePixelRatio();
8
- const zoom = a / dpr;
9
- const panX = e / dpr;
10
- const panY = f / dpr;
11
- return { panX, panY, zoom };
12
- };
13
- /**
14
- * magic coordinates are coordinates transformed by the pan and zoom of the camera.
15
- *
16
- * if the user has panned their camera 10px to the left, running this function with
17
- * `clientCoords` set to (0, 0) will return (-10, 0, 1)
18
- */
19
- export const getMagicCoordinates = (clientCoords, ctx) => {
20
- const rect = ctx.canvas.getBoundingClientRect();
21
- const localX = clientCoords.clientX - rect.left;
22
- const localY = clientCoords.clientY - rect.top;
23
- const { panX, panY, zoom } = getCanvasTransform(ctx);
24
- const x = (localX - panX) / zoom;
25
- const y = (localY - panY) / zoom;
26
- return { x, y, zoom };
27
- };
28
- /**
29
- * client coordinates are the raw coordinates corresponding to the clients physical screen.
30
- *
31
- * the top left corner is (0, 0) and bottom right corner is (window.innerWidth, window.innerHeight).
32
- */
33
- export const getClientCoordinates = (magicCoords, ctx) => {
34
- const { panX, panY, zoom } = getCanvasTransform(ctx);
35
- const { x, y } = magicCoords;
36
- return {
37
- clientX: x * zoom + panX,
38
- clientY: y * zoom + panY,
39
- zoom,
40
- };
41
- };
42
- export const useMagicCoordinates = (canvas) => {
43
- const coordinates = ref({ x: 0, y: 0 });
44
- const captureCoords = (ev) => (coordinates.value = getMagicCoordinates(ev, getCtx(canvas)));
45
- onMounted(() => {
46
- if (!canvas.value)
47
- throw new Error("Canvas not found in DOM. Check ref link.");
48
- canvas.value.addEventListener("mousemove", captureCoords);
49
- canvas.value.addEventListener("wheel", captureCoords);
50
- });
51
- return {
52
- coordinates,
53
- cleanup: (ref) => {
54
- ref.removeEventListener("mousemove", captureCoords);
55
- ref.removeEventListener("wheel", captureCoords);
56
- },
57
- };
58
- };
package/dist/index.js DELETED
@@ -1,11 +0,0 @@
1
- import MagicCanvas from "./MagicCanvas.vue";
2
- export * from "./types.js";
3
- export * from "./useMagicCanvas.js";
4
- export * from "./coordinates/index.js";
5
- export { getDevicePixelRatio } from "./camera/utils.js";
6
- export { MagicCanvas };
7
- export default {
8
- install(app) {
9
- app.component("MagicCanvas", MagicCanvas);
10
- },
11
- };
@@ -1,20 +0,0 @@
1
- /**
2
- * a registry for all localStorage keys this application uses
3
- */
4
- export const localKeys = {
5
- /** camera `panX` state in magic canvas - {@link Camera.state} */
6
- cameraPanX: (key) => `camera-pan-x-${key}`,
7
- /** camera `panY` state in magic canvas - {@link Camera.state} */
8
- cameraPanY: (key) => `camera-pan-y-${key}`,
9
- /** camera `zoom` state in magic canvas - {@link Camera.state} */
10
- cameraZoom: (key) => `camera-zoom-${key}`,
11
- };
12
- /**
13
- * perform **type safe** localStorage actions
14
- */
15
- export const local = {
16
- get: (key) => localStorage.getItem(key),
17
- set: (key, value) => localStorage.setItem(key, value),
18
- remove: (key) => localStorage.removeItem(key),
19
- clear: localStorage.clear,
20
- };
package/dist/types.js DELETED
@@ -1 +0,0 @@
1
- export {};
@@ -1,54 +0,0 @@
1
- import { useElementSize } from "@vueuse/core";
2
- import { onMounted, ref, watch } from "vue";
3
- import { useBackgroundPattern } from "./backgroundPattern";
4
- import { useCamera } from "./camera";
5
- import { getDevicePixelRatio } from "./camera/utils";
6
- import { useMagicCoordinates } from "./coordinates";
7
- import { getCtx } from "magic-utils-yonava";
8
- const REPAINT_FPS = 60;
9
- const initCanvasWidthHeight = (canvas) => {
10
- if (!canvas)
11
- throw new Error("Canvas not found in DOM. Check ref link.");
12
- const dpr = getDevicePixelRatio();
13
- const rect = canvas.getBoundingClientRect();
14
- canvas.width = rect.width * dpr;
15
- canvas.height = rect.height * dpr;
16
- };
17
- export const useMagicCanvas = (options = {}) => {
18
- const canvas = ref();
19
- const canvasBoxSize = useElementSize(canvas);
20
- const drawContent = ref(() => { });
21
- const drawBackgroundPattern = ref(() => { });
22
- let repaintInterval;
23
- onMounted(() => {
24
- initCanvasWidthHeight(canvas.value);
25
- repaintInterval = setInterval(repaintCanvas, 1000 / REPAINT_FPS);
26
- });
27
- watch([canvasBoxSize.width, canvasBoxSize.height], () => initCanvasWidthHeight(canvas.value));
28
- const { cleanup: cleanupCamera, ...camera } = useCamera(canvas, options?.storageKey ?? "[default-storage-key]");
29
- const { coordinates: cursorCoordinates, cleanup: cleanupCoords } = useMagicCoordinates(canvas);
30
- const pattern = useBackgroundPattern(camera.state, drawBackgroundPattern);
31
- const repaintCanvas = () => {
32
- const ctx = getCtx(canvas);
33
- camera.transformAndClear(ctx);
34
- pattern.draw(ctx);
35
- drawContent.value(ctx);
36
- };
37
- return {
38
- canvas,
39
- camera,
40
- cursorCoordinates,
41
- ref: {
42
- canvasRef: (ref) => (canvas.value = ref),
43
- cleanup: (ref) => {
44
- cleanupCoords(ref);
45
- cleanupCamera(ref);
46
- clearInterval(repaintInterval);
47
- },
48
- },
49
- draw: {
50
- content: drawContent,
51
- backgroundPattern: drawBackgroundPattern,
52
- },
53
- };
54
- };