magic-canvas-yonava 1.0.6 → 1.0.7

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "magic-canvas-yonava",
3
- "version": "1.0.6",
3
+ "version": "1.0.7",
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/index.ts"],
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,9 +0,0 @@
1
- declare const __VLS_export: import("vue").DefineComponent<{
2
- canvasRef: (canvas: HTMLCanvasElement) => void;
3
- cleanup: (canvas: HTMLCanvasElement) => void;
4
- }, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{
5
- canvasRef: (canvas: HTMLCanvasElement) => void;
6
- cleanup: (canvas: HTMLCanvasElement) => void;
7
- }> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
8
- declare const _default: typeof __VLS_export;
9
- export default _default;
@@ -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,6 +0,0 @@
1
- import type { Camera } from './camera';
2
- import type { Coordinate, DrawFns } from './types';
3
- export type DrawPattern = (ctx: CanvasRenderingContext2D, at: Coordinate, alpha: string) => void;
4
- export declare const useBackgroundPattern: ({ panX, panY, zoom }: Camera["state"], drawPattern: DrawFns["backgroundPattern"]) => {
5
- draw: (ctx: CanvasRenderingContext2D) => void;
6
- };
@@ -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,15 +0,0 @@
1
- import type { Ref } from 'vue';
2
- export declare const useCamera: (canvas: Ref<HTMLCanvasElement | undefined>, storageKey: string) => {
3
- transformAndClear: (ctx: CanvasRenderingContext2D) => void;
4
- actions: {
5
- zoomIn: (increment?: number) => void;
6
- zoomOut: (decrement?: number) => void;
7
- };
8
- state: {
9
- panX: import("@vueuse/shared").RemovableRef<number>;
10
- panY: import("@vueuse/shared").RemovableRef<number>;
11
- zoom: import("@vueuse/shared").RemovableRef<number>;
12
- };
13
- cleanup: (ref: HTMLCanvasElement) => void;
14
- };
15
- export type Camera = ReturnType<typeof useCamera>;
@@ -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,23 +0,0 @@
1
- import { type Ref } from "vue";
2
- export declare const MIN_ZOOM = 0.2;
3
- export declare const MAX_ZOOM = 10;
4
- export declare const ZOOM_SENSITIVITY = 0.02;
5
- export declare const PAN_SENSITIVITY = 1;
6
- export declare const usePanAndZoom: (canvas: Ref<HTMLCanvasElement | undefined>, storageKey: string) => {
7
- actions: {
8
- zoomIn: (increment?: number) => void;
9
- zoomOut: (decrement?: number) => void;
10
- };
11
- state: {
12
- panX: import("@vueuse/shared").RemovableRef<number>;
13
- panY: import("@vueuse/shared").RemovableRef<number>;
14
- zoom: import("@vueuse/shared").RemovableRef<number>;
15
- };
16
- getTransform: () => {
17
- scaleX: number;
18
- scaleY: number;
19
- translateX: number;
20
- translateY: number;
21
- };
22
- cleanup: (ref: HTMLCanvasElement) => void;
23
- };
@@ -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,17 +0,0 @@
1
- export type TransformProps = {
2
- /** corresponds to `a` in {@link CanvasRenderingContext2D.setTransform} */
3
- scaleX: number;
4
- /** corresponds to `b` in {@link CanvasRenderingContext2D.setTransform} */
5
- skewY: number;
6
- /** corresponds to `c` in {@link CanvasRenderingContext2D.setTransform} */
7
- skewX: number;
8
- /** corresponds to `d` in {@link CanvasRenderingContext2D.setTransform} */
9
- scaleY: number;
10
- /** corresponds to `e` in {@link CanvasRenderingContext2D.setTransform} */
11
- translateX: number;
12
- /** corresponds to `f` in {@link CanvasRenderingContext2D.setTransform} */
13
- translateY: number;
14
- };
15
- export type TransformOptions = Partial<TransformProps>;
16
- export declare const getDevicePixelRatio: () => number;
17
- export declare const addTransform: (ctx: CanvasRenderingContext2D, t: TransformOptions) => void;
@@ -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,44 +0,0 @@
1
- import { type Ref } from "vue";
2
- import { Coordinate } from "../types";
3
- export declare const getCanvasTransform: (ctx: CanvasRenderingContext2D) => {
4
- panX: number;
5
- panY: number;
6
- zoom: number;
7
- };
8
- /**
9
- * the coordinates in the real world. aka the browser
10
- */
11
- export type ClientCoords = Pick<MouseEvent, "clientX" | "clientY">;
12
- /**
13
- * the coordinates in the magic canvas world
14
- */
15
- export type MagicCoords = Coordinate;
16
- export type WithZoom<T> = T & {
17
- /**
18
- * the scale factor of the canvas
19
- */
20
- zoom: number;
21
- };
22
- /**
23
- * magic coordinates are coordinates transformed by the pan and zoom of the camera.
24
- *
25
- * if the user has panned their camera 10px to the left, running this function with
26
- * `clientCoords` set to (0, 0) will return (-10, 0, 1)
27
- */
28
- export declare const getMagicCoordinates: (clientCoords: ClientCoords, ctx: CanvasRenderingContext2D) => WithZoom<MagicCoords>;
29
- /**
30
- * client coordinates are the raw coordinates corresponding to the clients physical screen.
31
- *
32
- * the top left corner is (0, 0) and bottom right corner is (window.innerWidth, window.innerHeight).
33
- */
34
- export declare const getClientCoordinates: (magicCoords: MagicCoords, ctx: CanvasRenderingContext2D) => WithZoom<ClientCoords>;
35
- export declare const useMagicCoordinates: (canvas: Ref<HTMLCanvasElement | undefined>) => {
36
- coordinates: Ref<{
37
- x: number;
38
- y: number;
39
- }, Coordinate | {
40
- x: number;
41
- y: number;
42
- }>;
43
- cleanup: (ref: HTMLCanvasElement) => void;
44
- };
@@ -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,35 +0,0 @@
1
- /**
2
- * a registry for all localStorage keys this application uses
3
- */
4
- export declare const localKeys: {
5
- /** camera `panX` state in magic canvas - {@link Camera.state} */
6
- readonly cameraPanX: (key: string) => `camera-pan-x-${string}`;
7
- /** camera `panY` state in magic canvas - {@link Camera.state} */
8
- readonly cameraPanY: (key: string) => `camera-pan-y-${string}`;
9
- /** camera `zoom` state in magic canvas - {@link Camera.state} */
10
- readonly cameraZoom: (key: string) => `camera-zoom-${string}`;
11
- };
12
- /**
13
- * all return values of localStorage are, by default, string.
14
- * this type allows string to be narrowed to types such as 'true' | 'false'
15
- */
16
- type TypeOverride = {};
17
- type LocalObj = typeof localKeys;
18
- /**
19
- * @example
20
- * type T = TypeOrReturnType<number> // number
21
- * type TFunc = TypeOrReturnType<() => number> // number
22
- */
23
- type TypeOrReturnType<T> = T extends (...args: any[]) => infer U ? U : T;
24
- type LocalKeys = TypeOrReturnType<LocalObj[keyof LocalObj]>;
25
- type LocalType<T extends LocalKeys> = T extends keyof TypeOverride ? TypeOverride[T] : string;
26
- /**
27
- * perform **type safe** localStorage actions
28
- */
29
- export declare const local: {
30
- get: <T extends LocalKeys>(key: T) => string | null;
31
- set: <T extends LocalKeys, K extends LocalType<T>>(key: T, value: K) => void;
32
- remove: <T extends LocalKeys>(key: T) => void;
33
- clear: () => void;
34
- };
35
- export {};