@zumer/snapdom 1.7.1 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +92 -5
- package/dist/snapdom.js +814 -549
- package/dist/snapdom.min.js +13 -13
- package/dist/snapdom.min.mjs +13 -13
- package/dist/snapdom.mjs +261 -97
- package/package.json +3 -2
package/dist/snapdom.min.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
(()=>{var
|
|
2
|
-
`;return o}function
|
|
3
|
-
`}catch{console.warn("[snapdom] Failed to fetch CSS:",
|
|
4
|
-
font-family: ${
|
|
5
|
-
src: ${
|
|
6
|
-
font-style: ${
|
|
7
|
-
font-weight: ${
|
|
1
|
+
(()=>{var Rt=Object.defineProperty;var Y=Object.getOwnPropertySymbols;var at=Object.prototype.hasOwnProperty,rt=Object.prototype.propertyIsEnumerable;var ot=(t,e,o)=>e in t?Rt(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,_=(t,e)=>{for(var o in e||(e={}))at.call(e,o)&&ot(t,o,e[o]);if(Y)for(var o of Y(e))rt.call(e,o)&&ot(t,o,e[o]);return t};var st=(t,e)=>{var o={};for(var l in t)at.call(t,l)&&e.indexOf(l)<0&&(o[l]=t[l]);if(t!=null&&Y)for(var l of Y(t))e.indexOf(l)<0&&rt.call(t,l)&&(o[l]=t[l]);return o};var m=(t,e,o)=>new Promise((l,c)=>{var n=s=>{try{i(o.next(s))}catch(r){c(r)}},a=s=>{try{i(o.throw(s))}catch(r){c(r)}},i=s=>s.done?l(s.value):Promise.resolve(s.value).then(n,a);i((o=o.apply(t,e)).next())});var N=new Map,B=new Map,$=new Map,F=new Map,M=new Map,Q=new WeakMap,T=new Set;var At=["div","span","p","a","img","ul","li","button","input","select","textarea","label","section","article","header","footer","nav","main","aside","h1","h2","h3","h4","h5","h6","svg","path","circle","rect","line","g","table","thead","tbody","tr","td","th"];function it(){for(let t of At)ct(t)}function ct(t){if(F.has(t))return F.get(t);if(new Set(["script","style","meta","link","noscript","template"]).has(t)){let a={};return F.set(t,a),a}let o=document.getElementById("snapdom-sandbox");o||(o=document.createElement("div"),o.id="snapdom-sandbox",o.style.position="absolute",o.style.left="-9999px",o.style.top="-9999px",o.style.width="0",o.style.height="0",o.style.overflow="hidden",document.body.appendChild(o));let l=document.createElement(t);l.style.all="initial",o.appendChild(l);let c=getComputedStyle(l),n={};for(let a of c)n[a]=c.getPropertyValue(a);return o.removeChild(l),F.set(t,n),n}function V(t,e,o=!1){let l=[],c=ct(e);for(let[n,a]of Object.entries(t))if(!o)a&&l.push(`${n}:${a}`);else{let i=c[n];a&&a!==i&&l.push(`${n}:${a}`)}return l.sort().join(";")}function lt(t){let e=new Set;return t.nodeType!==Node.ELEMENT_NODE&&t.nodeType!==Node.DOCUMENT_FRAGMENT_NODE?[]:(t.tagName&&e.add(t.tagName.toLowerCase()),typeof t.querySelectorAll=="function"&&t.querySelectorAll("*").forEach(o=>e.add(o.tagName.toLowerCase())),Array.from(e))}function dt(t){let e=new Map;for(let l of t){let c=F.get(l);if(!c)continue;let n=Object.entries(c).map(([a,i])=>`${a}:${i};`).sort().join("");e.has(n)||e.set(n,[]),e.get(n).push(l)}let o="";for(let[l,c]of e.entries())o+=`${c.join(",")} { ${l} }
|
|
2
|
+
`;return o}function ft(t){let e=new Set(t.values()),o=new Map,l=1;for(let c of e)o.set(c,`c${l++}`);return o}function O(o){return m(this,arguments,function*(t,e={}){let l=t.startsWith("url("),c=/^((repeating-)?(linear|radial|conic)-gradient)\(/i.test(t);if(l){let n=q(t);if(!n)return t;let a=Z(n);if(B.has(a))return e.skipInline?void 0:`url(${B.get(a)})`;{let i=e.crossOrigin?e.crossOrigin(a):"anonymous",s=yield U(a,3e3,i);return B.set(a,s),e.skipInline?void 0:`url(${s})`}}return t})}function D(t,{fast:e=!1}={}){if(e)return t();"requestIdleCallback"in window?requestIdleCallback(t,{timeout:50}):setTimeout(t,1)}function L(t,e=null){if(!(t instanceof Element))return window.getComputedStyle(t,e);let o=Q.get(t);if(o||(o=new Map,Q.set(t,o)),!o.has(e)){let l=window.getComputedStyle(t,e);o.set(e,l)}return o.get(e)}function mt(t){let e=t.replace(/^['"]|['"]$/g,"");if(e.startsWith("\\"))try{return String.fromCharCode(parseInt(e.replace("\\",""),16))}catch(o){return e}return e}function q(t){let e=t.indexOf("url(");if(e===-1)return null;let o=t.slice(e+4).trim();return o.endsWith(")")&&(o=o.slice(0,-1).trim()),(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),o}function z(t){return[/font\s*awesome/i,/material\s*icons/i,/ionicons/i,/glyphicons/i,/feather/i,/bootstrap\s*icons/i,/remix\s*icons/i,/heroicons/i,/lucide/i].some(o=>o.test(t))}function U(t,e=3e3,o="anonymous"){return N.has(t)?Promise.resolve(N.get(t)):new Promise((l,c)=>{let n=setTimeout(()=>{c(new Error("Image load timed out"))},e),a=new Image;a.crossOrigin=o,a.onload=()=>m(null,null,function*(){clearTimeout(n);try{yield a.decode();let i=document.createElement("canvas");i.width=a.width,i.height=a.height,i.getContext("2d").drawImage(a,0,0,i.width,i.height);try{let r=i.toDataURL("image/png");N.set(t,r),l(r)}catch(r){c(new Error("CORS restrictions prevented image capture"))}}catch(i){c(i)}}),a.onerror=i=>{clearTimeout(n),c(new Error("Failed to load image: "+(i.message||"Unknown error")))},a.src=t})}function H(t){let e={};for(let o of t)e[o]=t.getPropertyValue(o);return e}function X(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function ht(t){if(!t||t==="none")return"";let e=t.replace(/translate[XY]?\([^)]*\)/g,"");return e=e.replace(/matrix\(([^)]+)\)/g,(o,l)=>{let c=l.split(",").map(n=>n.trim());return c.length!==6?`matrix(${l})`:(c[4]="0",c[5]="0",`matrix(${c.join(", ")})`)}),e=e.replace(/matrix3d\(([^)]+)\)/g,(o,l)=>{let c=l.split(",").map(n=>n.trim());return c.length!==16?`matrix3d(${l})`:(c[12]="0",c[13]="0",`matrix3d(${c.join(", ")})`)}),e.trim().replace(/\s{2,}/g," ")}function Z(t){try{let e=decodeURI(t);return encodeURI(e)}catch(e){return t}}function W(t){let e=[],o=0,l=0;for(let c=0;c<t.length;c++){let n=t[c];n==="("&&o++,n===")"&&o--,n===","&&o===0&&(e.push(t.slice(l,c).trim()),l=c+1)}return e.push(t.slice(l).trim()),e}function tt(t,e,o,l,c){var r;if(t.tagName==="STYLE")return;l.has(t)||l.set(t,L(t));let n=l.get(t),a=H(n),i=((r=t.tagName)==null?void 0:r.toLowerCase())||"div",s=V(a,i,c);o.set(e,s)}function K(t,e,o,l,c){var i;if(t.nodeType===Node.ELEMENT_NODE&&t.getAttribute("data-capture")==="exclude"){let s=document.createElement("div"),r=t.getBoundingClientRect();return s.style.cssText=`display: inline-block; width: ${r.width}px; height: ${r.height}px; visibility: hidden;`,s}if(t.tagName==="IFRAME"){let s=document.createElement("div");return s.textContent="",s.style.cssText=`width: ${t.offsetWidth}px; height: ${t.offsetHeight}px; background-image: repeating-linear-gradient(45deg, #ddd, #ddd 5px, #f9f9f9 5px, #f9f9f9 10px);display: flex;align-items: center;justify-content: center;font-size: 12px;color: #555; border: 1px solid #aaa;`,s}if(t.nodeType===Node.ELEMENT_NODE&&t.getAttribute("data-capture")==="placeholder"){let s=t.cloneNode(!1);l.set(s,t),tt(t,s,e,o,c);let r=document.createElement("div");return r.textContent=t.getAttribute("data-placeholder-text")||"",r.style.cssText="color: #666;font-size: 12px;text-align: center;line-height: 1.4;padding: 0.5em;box-sizing: border-box;",s.appendChild(r),s}if(t.tagName==="CANVAS"){let s=t.toDataURL(),r=document.createElement("img");return r.src=s,r.width=t.width,r.height=t.height,r.style.display="inline-block",r.style.width=t.style.width||`${t.width}px`,r.style.height=t.style.height||`${t.height}px`,r}if(t.nodeType===Node.TEXT_NODE){if((i=t.parentElement)!=null&&i.shadowRoot){let s=t.parentElement.tagName.toLowerCase();if(customElements.get(s))return null}return t.cloneNode(!0)}if(t.nodeType!==Node.ELEMENT_NODE)return t.cloneNode(!0);let n=t.cloneNode(!1);l.set(n,t),t instanceof HTMLInputElement?(n.value=t.value,n.setAttribute("value",t.value),t.checked!==void 0&&(n.checked=t.checked,t.checked&&n.setAttribute("checked",""))):t instanceof HTMLTextAreaElement?(n.value=t.value,n.textContent=t.value):t instanceof HTMLSelectElement&&(n.value=t.value,Array.from(n.options).forEach(s=>{s.value===t.value?s.setAttribute("selected",""):s.removeAttribute("selected")})),tt(t,n,e,o,c);let a=document.createDocumentFragment();if(t.childNodes.forEach(s=>{let r=K(s,e,o,l,c);r&&a.appendChild(r)}),n.appendChild(a),t.shadowRoot){let s=Array.from(t.shadowRoot.children).filter(f=>f.tagName!=="STYLE").map(f=>K(f,e,o,l)).filter(Boolean),r=document.createDocumentFragment();s.forEach(f=>r.appendChild(f)),n.appendChild(r)}return n}function ut(t,e,o,l=32,c="#000"){return m(this,null,function*(){e=e.replace(/^['"]+|['"]+$/g,"");let n=window.devicePixelRatio||1,i=document.createElement("canvas").getContext("2d");i.font=o?`${o} ${l}px "${e}"`:`${l}px "${e}"`;let s=i.measureText(t),r=s.actualBoundingBoxAscent||l*.8,f=s.actualBoundingBoxDescent||l*.2,h=r+f,u=s.width,w=document.createElement("canvas");w.width=Math.ceil(u*n),w.height=Math.ceil(h*n);let d=w.getContext("2d");return d.scale(n,n),d.font=i.font,d.textAlign="left",d.textBaseline="alphabetic",d.fillStyle=c,d.fillText(t,0,r),w.toDataURL()})}function pt(t){return Array.from(document.styleSheets).some(e=>e.href===t)}function Nt(t){return new Promise(e=>{if(pt(t))return e(null);let o=document.createElement("link");o.rel="stylesheet",o.href=t,o.setAttribute("data-snapdom","injected-import"),o.onload=()=>e(o),o.onerror=()=>e(null),document.head.appendChild(o)})}function J(){return m(this,arguments,function*({ignoreIconFonts:t=!0,preCached:e=!1}={}){if($.has("fonts-embed-css")){if(e){let a=document.createElement("style");a.setAttribute("data-snapdom","embedFonts"),a.textContent=$.get("fonts-embed-css"),document.head.appendChild(a)}return $.get("fonts-embed-css")}let o=/@import\s+url\(["']?([^"')]+)["']?\)/g,l=[];for(let a of document.querySelectorAll("style")){let i=a.textContent||"",s=Array.from(i.matchAll(o));for(let r of s){let f=r[1];pt(f)||l.push(f)}}yield Promise.all(l.map(Nt));let c=Array.from(document.querySelectorAll('link[rel="stylesheet"]')).filter(a=>a.href),n="";for(let a of c)try{let s=yield(yield fetch(a.href)).text();if(t&&(z(a.href)||z(s)))continue;let r=/url\((["']?)([^"')]+)\1\)/g,f=yield Promise.all(Array.from(s.matchAll(r)).map(u=>m(null,null,function*(){let w=q(u[0]);if(!w)return null;let d=w;if(!d.startsWith("http")&&!d.startsWith("data:")&&(d=new URL(d,a.href).href),t&&z(d))return null;if($.has(d))return T.add(d),{original:u[0],inlined:`url(${$.get(d)})`};if(T.has(d))return null;try{let g=yield(yield fetch(d)).blob(),C=yield new Promise(p=>{let S=new FileReader;S.onload=()=>p(S.result),S.readAsDataURL(g)});return $.set(d,C),T.add(d),{original:u[0],inlined:`url(${C})`}}catch(x){return console.warn("[snapdom] Failed to fetch font resource:",d),null}}))),h=s;for(let u of f)u&&(h=h.replace(u.original,u.inlined));n+=h+`
|
|
3
|
+
`}catch(i){console.warn("[snapdom] Failed to fetch CSS:",a.href)}for(let a of document.styleSheets)try{if(!a.href||c.every(i=>i.href!==a.href)){for(let i of a.cssRules)if(i.type===CSSRule.FONT_FACE_RULE){let s=i.style.getPropertyValue("src");if(!s)continue;let r=/url\((["']?)([^"')]+)\1\)/g,f=s,h=Array.from(s.matchAll(r));for(let u of h){let w=u[2].trim();if(!w)continue;let d=w;if(!d.startsWith("http")&&!d.startsWith("data:")&&(d=new URL(d,a.href||location.href).href),!(t&&z(d))){if($.has(d)){T.add(d),f=f.replace(u[0],`url(${$.get(d)})`);continue}if(!T.has(d))try{let g=yield(yield fetch(d)).blob(),C=yield new Promise(p=>{let S=new FileReader;S.onload=()=>p(S.result),S.readAsDataURL(g)});$.set(d,C),T.add(d),f=f.replace(u[0],`url(${C})`)}catch(x){console.warn("[snapdom] Failed to fetch font URL:",d)}}}n+=`@font-face {
|
|
4
|
+
font-family: ${i.style.getPropertyValue("font-family")};
|
|
5
|
+
src: ${f};
|
|
6
|
+
font-style: ${i.style.getPropertyValue("font-style")||"normal"};
|
|
7
|
+
font-weight: ${i.style.getPropertyValue("font-weight")||"normal"};
|
|
8
8
|
}
|
|
9
|
-
`}}}catch(
|
|
10
|
-
font-family: '${
|
|
11
|
-
src: url(${
|
|
12
|
-
font-style: ${
|
|
13
|
-
font-weight: ${
|
|
9
|
+
`}}}catch(i){console.warn("[snapdom] Cannot access stylesheet",a.href,i)}for(let a of document.fonts)if(a.family&&a.status==="loaded"&&a._snapdomSrc){let i=a._snapdomSrc;if(!i.startsWith("data:")){if($.has(a._snapdomSrc))i=$.get(a._snapdomSrc),T.add(a._snapdomSrc);else if(!T.has(a._snapdomSrc))try{let r=yield(yield fetch(a._snapdomSrc)).blob();i=yield new Promise(f=>{let h=new FileReader;h.onload=()=>f(h.result),h.readAsDataURL(r)}),$.set(a._snapdomSrc,i),T.add(a._snapdomSrc)}catch(s){console.warn("[snapdom] Failed to fetch dynamic font src:",a._snapdomSrc);continue}}n+=`@font-face {
|
|
10
|
+
font-family: '${a.family}';
|
|
11
|
+
src: url(${i});
|
|
12
|
+
font-style: ${a.style||"normal"};
|
|
13
|
+
font-weight: ${a.weight||"normal"};
|
|
14
14
|
}
|
|
15
|
-
`}if(r&&n){let t=document.createElement("style");t.setAttribute("data-snapdom","embedFonts"),t.textContent=r,document.head.appendChild(t)}return r}async function V(e,n,o,r,t,a=!1){if(!(e instanceof Element)||!(n instanceof Element))return;for(let c of["::before","::after"])try{let l=U(e,c);if(!l)continue;let d=l.getPropertyValue("content"),h=l.getPropertyValue("background-image"),f=d&&d!=="none"&&d!=='""'&&d!=="''",p=h&&h.startsWith("url(");if(f||p){let m=l.getPropertyValue("font-family"),g=parseInt(l.getPropertyValue("font-size"))||32,y=parseInt(l.getPropertyValue("font-weight"))||!1,C=l.getPropertyValue("color")||"#000",w=document.createElement("span");w.dataset.snapdomPseudo=c;let A=O(l),F=M(A,"span",t);o.set(w,F);let j=m&&/font.*awesome|material|bootstrap|glyphicons|ionicons|remixicon|simple-line-icons|octicons|feather|typicons|weathericons/i.test(m),E=X(d);if(!a&&j&&E.length===1){let b=document.createElement("img");b.src=await G(E,m,y,g,C),b.style="display:block;width:100%;height:100%;object-fit:contain;",w.appendChild(b)}else if(E.startsWith("url(")){let b=$(E);if(b)try{let v=document.createElement("img"),ie=await S(encodeURI(b));v.src=ie,v.style="display:block;width:100%;height:100%;object-fit:contain;",w.appendChild(v)}catch(v){console.error(`[snapdom] Error in pseudo ${c} for`,e,v)}}else!j&&E&&E!=="none"&&(w.textContent=E);if(p&&h){let b=$(h);if(b)try{let v=await S(encodeURI(b));w.style.backgroundImage=`url(${v})`}catch(v){console.warn(`[snapdom] Failed to inline background-image for ${c}`,v)}}if(!(w.childNodes.length>0||w.textContent&&w.textContent.trim()!=="")&&!p)continue;c==="::before"?n.insertBefore(w,n.firstChild):n.appendChild(w)}}catch(l){console.warn(`[snapdom] Failed to capture ${c} for`,e,l)}let s=Array.from(e.children),i=Array.from(n.children).filter(c=>!c.dataset.snapdomPseudo);for(let c=0;c<Math.min(s.length,i.length);c++)await V(s[c],i[c],o,r,t,a)}async function Q(e,n=!1,o=!1){let r=new Map,t=new WeakMap,a=new Map,s;try{s=D(e,r,t,a,n)}catch(c){throw console.warn("deepClone failed:",c),c}try{await V(e,s,r,t,n,o)}catch(c){console.warn("inlinePseudoElements failed:",c)}let i="";if(n){let c=J(r);i=Array.from(c.entries()).map(([l,d])=>`.${d}{${l}}`).join("");for(let[l,d]of r.entries()){if(l.tagName==="STYLE")continue;let h=c.get(d);h&&l.classList.add(h);let f=l.style?.backgroundImage;l.removeAttribute("style"),f&&f!=="none"&&(l.style.backgroundImage=f)}}else for(let[c,l]of r.entries())c.tagName!=="STYLE"&&c.setAttribute("style",l.replace(/;/g,"; "));for(let[c,l]of a.entries()){let d=l.scrollLeft,h=l.scrollTop;if((d||h)&&c instanceof HTMLElement){c.style.overflow="hidden",c.style.scrollbarWidth="none",c.style.msOverflowStyle="none";let p=document.createElement("div");for(p.style.transform=`translate(${-d}px, ${-h}px)`,p.style.willChange="transform",p.style.display="inline-block",p.style.width="100%";c.firstChild;)p.appendChild(c.firstChild);c.appendChild(p)}}return{clone:s,classCSS:i,styleCache:t}}async function Z(e,n={}){let o=Array.from(e.querySelectorAll("img")),r=async t=>{let a=t.src;try{let s=n.crossOrigin?n.crossOrigin(a):"anonymous",i=await S(a,3e3,s);t.src=i,t.width||(t.width=t.naturalWidth||100),t.height||(t.height=t.naturalHeight||100)}catch{let s=document.createElement("div");s.style=`width: ${t.width||100}px; height: ${t.height||100}px; background: #ccc; display: inline-block; text-align: center; line-height: ${t.height||100}px; color: #666; font-size: 12px;`,s.innerText="img",t.replaceWith(s)}};for(let t=0;t<o.length;t+=4){let a=o.slice(t,t+4).map(r);await Promise.allSettled(a)}}async function ee(e,n,o,r={}){let t=[[e,n]];for(;t.length;){let[a,s]=t.shift(),i=o.get(a)||U(a);o.has(a)||o.set(a,i);let l=i.getPropertyValue("background-image").split(",");for(let f=0;f<l.length;f++){let p=$(l[f]);if(p)try{let m=encodeURI(p),g;if(T.has(m))g=T.get(m);else{let y=r.crossOrigin?r.crossOrigin(m):"anonymous";g=await S(m,3e3,y),T.set(m,g)}l[f]=`url(${g})`}catch{l[f]="none"}}l.some(f=>f.includes("url("))&&(s.style.backgroundImage=l.join(","));let d=Array.from(a.children),h=Array.from(s.children);for(let f=0;f<Math.min(d.length,h.length);f++)t.push([d[f],h[f]])}}async function te(e,n={}){if(!e)throw new Error("Element cannot be null or undefined");let{compress:o=!0,embedFonts:r=!1,fast:t=!0,scale:a=1}=n,s,i,c,l="",d="",h,f;if({clone:s,classCSS:i,styleCache:c}=await Q(e,o,r),await new Promise(m=>{L(async()=>{await Z(s,n),m()},{fast:t})}),await new Promise(m=>{L(async()=>{await ee(e,s,c,n),m()},{fast:t})}),r&&await new Promise(m=>{L(async()=>{l=await W({ignoreIconFonts:!r}),m()},{fast:t})}),o){let m=Y(s).sort(),g=m.join(",");k.has(g)?d=k.get(g):await new Promise(y=>{L(()=>{d=K(m),k.set(g,d),y()},{fast:t})})}await new Promise(m=>{L(()=>{let g=e.getBoundingClientRect(),y=Math.ceil(g.width),C=Math.ceil(g.height);s.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),s.style.transformOrigin="top left",a!==1&&B()&&(s.style.scale=`${a}`);let w="http://www.w3.org/2000/svg",A=document.createElementNS(w,"foreignObject");A.setAttribute("width","100%"),A.setAttribute("height","100%");let F=document.createElement("style");F.textContent=d+l+"svg{overflow:visible;}"+i,A.appendChild(F),A.appendChild(s);let E=new XMLSerializer().serializeToString(A);f=`<svg xmlns="${w}" width="${y}" height="${C}" viewBox="0 0 ${y} ${C}">`+E+"</svg>",h=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(f)}`,m()},{fast:t})});let p=document.getElementById("snapdom-sandbox");return p&&p.style.position==="absolute"&&p.remove(),h}async function le(e,{dpr:n=1,scale:o=1}){let r=new Image;return r.src=e,await r.decode(),B?(r.width=r.width*o,r.height=r.height*o):(r.width=r.width/o,r.height=r.height/o),r}async function ne(e,{dpr:n=1,scale:o=1}={}){let r=new Image;r.src=e,await r.decode();let t=document.createElement("canvas"),a=r.width*o,s=r.height*o;t.width=Math.ceil(a*n),t.height=Math.ceil(s*n);let i=t.getContext("2d");return i.scale(n,n),i.drawImage(r,0,0,a,s),t.style.width=`${a}px`,t.style.height=`${s}px`,t}async function oe(e){let n=decodeURIComponent(e.split(",")[1]);return new Blob([n],{type:"image/svg+xml"})}async function ae(e,{dpr:n=1,scale:o=1},r){let t=await ne(e,{dpr:n,scale:o});if(!r)return t;let a=document.createElement("canvas");a.width=t.width,a.height=t.height;let s=a.getContext("2d");return s.fillStyle=r,s.fillRect(0,0,a.width,a.height),s.drawImage(t,0,0),a}async function q(e,{dpr:n=1,scale:o=1,backgroundColor:r="#fff",quality:t},a="png"){let s=await ae(e,{dpr:n,scale:o},r),i=new Image;return i.src=s.toDataURL(`image/${a}`,t),await i.decode(),i.style.width=`${s.width/n}px`,i.style.height=`${s.height/n}px`,i}async function fe(e,{dpr:n=1,scale:o=1,backgroundColor:r="#fff",format:t="png",filename:a="capture"}={}){if(t==="svg"){let f=await oe(e),p=URL.createObjectURL(f),m=document.createElement("a");m.href=p,m.download=`${a}.svg`,m.click(),URL.revokeObjectURL(p);return}let s=["jpg","jpeg","webp"].includes(t)?"#fff":void 0,c=await ae(e,{dpr:n,scale:o},r??s),l={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[t]||"image/png",d=c.toDataURL(l),h=document.createElement("a");h.href=d,h.download=`${a}.${t}`,h.click()}async function u(e,n={}){if(n={scale:1,...n},!e)throw new Error("Element cannot be null or undefined");return await u.capture(e,n)}u.capture=async(e,n={})=>{let o=await te(e,n),r=window.devicePixelRatio||1,t=n.scale||1;return{url:o,options:n,toRaw:()=>o,toImg:()=>le(o,{dpr:r,scale:t}),toCanvas:()=>ne(o,{dpr:r,scale:t}),toBlob:()=>oe(o),toPng:a=>q(o,{dpr:r,scale:t,...a},"png"),toJpg:a=>q(o,{dpr:r,scale:t,...a},"jpeg"),toWebp:a=>q(o,{dpr:r,scale:t,...a},"webp"),download:({format:a="png",filename:s="capture",backgroundColor:i}={})=>fe(o,{dpr:r,scale:t,backgroundColor:i,format:a,filename:s})}};u.toRaw=async(e,n)=>(await u.capture(e,n)).toRaw();u.toImg=async(e,n)=>(await u.capture(e,n)).toImg();u.toCanvas=async(e,n)=>(await u.capture(e,n)).toCanvas();u.toBlob=async(e,n)=>(await u.capture(e,n)).toBlob();u.toPng=async(e,n)=>(await u.capture(e,n)).toPng(n);u.toJpg=async(e,n)=>(await u.capture(e,n)).toJpg(n);u.toWebp=async(e,n)=>(await u.capture(e,n)).toWebp(n);u.download=async(e,n={})=>{let{format:o="png",filename:r="capture",backgroundColor:t,...a}=n;return await(await u.capture(e,a)).download({format:o,filename:r,backgroundColor:t})};async function re(e=document,n={}){let{embedFonts:o=!0,reset:r=!1,crossOrigin:t}=n;if(r){R.clear(),T.clear(),x.clear(),k.clear(),N.clear();return}await document.fonts.ready,H();let a=[],s=[];e?.querySelectorAll&&(a=Array.from(e.querySelectorAll("img[src]")),s=Array.from(e.querySelectorAll("*")));let i=[];for(let c of a){let l=c.src;if(!R.has(l)){let d=t?t(l):"anonymous";i.push(S(l,3e3,d).then(h=>R.set(l,h)).catch(()=>{}))}}for(let c of s){let l=getComputedStyle(c).backgroundImage,d=$(l);if(d&&!T.has(d)){let h=t?t(d):"anonymous";i.push(S(d,3e3,h).then(f=>T.set(d,f)).catch(()=>{}))}}o&&await W({ignoreIconFonts:!o,preCached:!0}),await Promise.all(i)}window.snapdom=u;window.preCache=re;})();
|
|
15
|
+
`}if(n&&($.set("fonts-embed-css",n),e)){let a=document.createElement("style");a.setAttribute("data-snapdom","embedFonts"),a.textContent=n,document.head.appendChild(a)}return n})}function et(t,e,o,l,c,n=!1){return m(this,null,function*(){if(!(t instanceof Element)||!(e instanceof Element))return;for(let s of["::before","::after","::first-letter"])try{let r=L(t,s);if(!r||typeof r[Symbol.iterator]!="function")continue;if(s==="::first-letter"){let g=getComputedStyle(t);if(!(r.color!==g.color||r.fontSize!==g.fontSize||r.fontWeight!==g.fontWeight))continue;let p=Array.from(e.childNodes).find(E=>E.nodeType===Node.TEXT_NODE&&E.textContent&&E.textContent.trim().length>0);if(!p)continue;let S=p.textContent,y=S.match(/^([^\p{L}\p{N}\s]*[\p{L}\p{N}](?:['’])?)/u),k=y==null?void 0:y[0],P=S.slice((k==null?void 0:k.length)||0);if(!k||/[\uD800-\uDFFF]/.test(k))continue;let v=document.createElement("span");v.textContent=k,v.dataset.snapdomPseudo="::first-letter";let I=H(r),G=V(I,"span",c);o.set(v,G);let j=document.createTextNode(P);e.replaceChild(j,p),e.insertBefore(v,j);continue}let f=r.getPropertyValue("content"),h=r.getPropertyValue("background-image"),u=r.getPropertyValue("background-color"),w=f!=="none",d=h&&h!=="none",x=u&&u!=="transparent"&&u!=="rgba(0, 0, 0, 0)";if(w||d||x){let g=r.getPropertyValue("font-family"),C=parseInt(r.getPropertyValue("font-size"))||32,p=parseInt(r.getPropertyValue("font-weight"))||!1,S=r.getPropertyValue("color")||"#000",y=document.createElement("span");y.dataset.snapdomPseudo=s;let k=H(r),P=V(k,"span",c);o.set(y,P);let v=g&&/font.*awesome|material|bootstrap|glyphicons|ionicons|remixicon|simple-line-icons|octicons|feather|typicons|weathericons|lucide/i.test(g),I=mt(f);if(!n&&v&&I.length===1){let E=document.createElement("img");E.src=yield ut(I,g,p,C,S),E.style="display:block;width:100%;height:100%;object-fit:contain;",y.appendChild(E)}else if(I.startsWith("url(")){let E=q(I);if(E&&E.trim()!=="")try{let R=document.createElement("img"),A=yield U(Z(E));R.src=A,R.style="display:block;width:100%;height:100%;object-fit:contain;",y.appendChild(R)}catch(R){console.error(`[snapdom] Error in pseudo ${s} for`,t,R)}}else!v&&I&&I!=="none"&&(y.textContent=I);if(d)try{let E=W(h),R=yield Promise.all(E.map(A=>O(A)));y.style.backgroundImage=R.join(", ")}catch(E){console.warn(`[snapdom] Failed to inline background-image for ${s}`,E)}if(x&&(y.style.backgroundColor=u),!(y.childNodes.length>0||y.textContent&&y.textContent.trim()!==""||d||x))continue;s==="::before"?e.insertBefore(y,e.firstChild):e.appendChild(y)}}catch(r){console.warn(`[snapdom] Failed to capture ${s} for`,t,r)}let a=Array.from(t.children),i=Array.from(e.children).filter(s=>!s.dataset.snapdomPseudo);for(let s=0;s<Math.min(a.length,i.length);s++)yield et(a[s],i[s],o,l,c,n)})}function gt(t,e=!1,o=!1){return m(this,null,function*(){var s;let l=new Map,c=new WeakMap,n=new Map,a;try{a=K(t,l,c,n,e)}catch(r){throw console.warn("deepClone failed:",r),r}try{yield et(t,a,l,c,e,o)}catch(r){console.warn("inlinePseudoElements failed:",r)}let i="";if(e){let r=ft(l);i=Array.from(r.entries()).map(([f,h])=>`.${h}{${f}}`).join("");for(let[f,h]of l.entries()){if(f.tagName==="STYLE")continue;let u=r.get(h);u&&f.classList.add(u);let w=(s=f.style)==null?void 0:s.backgroundImage;f.removeAttribute("style"),w&&w!=="none"&&(f.style.backgroundImage=w)}}else for(let[r,f]of l.entries())r.tagName!=="STYLE"&&r.setAttribute("style",f.replace(/;/g,"; "));for(let[r,f]of n.entries()){let h=f.scrollLeft,u=f.scrollTop;if((h||u)&&r instanceof HTMLElement){r.style.overflow="hidden",r.style.scrollbarWidth="none",r.style.msOverflowStyle="none";let d=document.createElement("div");for(d.style.transform=`translate(${-h}px, ${-u}px)`,d.style.willChange="transform",d.style.display="inline-block",d.style.width="100%";r.firstChild;)d.appendChild(r.firstChild);r.appendChild(d)}}if(t===n.get(a)){let r=c.get(t)||window.getComputedStyle(t);c.set(t,r);let f=ht(r.transform);a.style.margin="0",a.style.position="static",a.style.top="auto",a.style.left="auto",a.style.right="auto",a.style.bottom="auto",a.style.zIndex="auto",a.style.float="none",a.style.clear="none",a.style.transform=f||""}return{clone:a,classCSS:i,styleCache:c}})}function yt(o){return m(this,arguments,function*(t,e={}){let l=Array.from(t.querySelectorAll("img")),c=n=>m(null,null,function*(){let a=n.src;try{let i=e.crossOrigin?e.crossOrigin(a):"anonymous",s=yield U(a,3e3,i);n.src=s,n.width||(n.width=n.naturalWidth||100),n.height||(n.height=n.naturalHeight||100)}catch(i){let s=document.createElement("div");s.style=`width: ${n.width||100}px; height: ${n.height||100}px; background: #ccc; display: inline-block; text-align: center; line-height: ${n.height||100}px; color: #666; font-size: 12px;`,s.innerText="img",n.replaceWith(s)}});for(let n=0;n<l.length;n+=4){let a=l.slice(n,n+4).map(c);yield Promise.allSettled(a)}})}function wt(c,n,a){return m(this,arguments,function*(t,e,o,l={}){let i=[[t,e]];for(;i.length;){let[s,r]=i.shift(),f=o.get(s)||L(s);o.has(s)||o.set(s,f);let h=f.getPropertyValue("background-image"),u=f.getPropertyValue("background-color");if(!h||h==="none"){let p=Array.from(s.children),S=Array.from(r.children);for(let y=0;y<Math.min(p.length,S.length);y++)i.push([p[y],S[y]]);continue}let w=W(h),d=yield Promise.all(w.map(p=>O(p,l)));d.some(p=>p&&p!=="none"&&!/^url\(undefined\)/.test(p))&&(r.style.backgroundImage=d.join(", ")),u&&u!=="transparent"&&u!=="rgba(0, 0, 0, 0)"&&(r.style.backgroundColor=u);let g=Array.from(s.children),C=Array.from(r.children);for(let p=0;p<Math.min(g.length,C.length);p++)i.push([g[p],C[p]])}})}function xt(o){return m(this,arguments,function*(t,e={}){if(!t)throw new Error("Element cannot be null or undefined");if(!(t instanceof Element))throw new Error("captureDOM: Only Element nodes are supported");let{compress:l=!0,embedFonts:c=!1,fast:n=!0,scale:a=1}=e,i,s,r,f="",h="",u,w;if({clone:i,classCSS:s,styleCache:r}=yield gt(t,l,c),yield new Promise(x=>{D(()=>m(null,null,function*(){yield yt(i,e),x()}),{fast:n})}),yield new Promise(x=>{D(()=>m(null,null,function*(){yield wt(t,i,r,e),x()}),{fast:n})}),c&&(yield new Promise(x=>{D(()=>m(null,null,function*(){f=yield J({ignoreIconFonts:!c}),x()}),{fast:n})})),l){let x=lt(i).sort(),g=x.join(",");M.has(g)?h=M.get(g):yield new Promise(C=>{D(()=>{h=dt(x),M.set(g,h),C()},{fast:n})})}yield new Promise(x=>{D(()=>{let g=t.getBoundingClientRect(),C=g.width,p=g.height,S=Number.isFinite(e.width),y=Number.isFinite(e.height),k=typeof a=="number"&&a!==1;if(!k){let A=g.width/g.height;S&&y?(C=e.width,p=e.height):S?(C=e.width,p=C/A):y&&(p=e.height,C=p*A)}if(C=Math.ceil(C),p=Math.ceil(p),i.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),i.style.transformOrigin="top left",!k&&(S||y)){let A=g.width,$t=g.height,vt=C/A,kt=p/$t,It=i.style.transform||"",Tt=`scale(${vt}, ${kt})`;i.style.transform=`${Tt} ${It}`.trim()}else k&&X()&&(i.style.scale=`${a}`);let P="http://www.w3.org/2000/svg",v=document.createElementNS(P,"foreignObject");v.setAttribute("width","100%"),v.setAttribute("height","100%");let I=document.createElement("style");I.textContent=h+f+"svg{overflow:visible;}"+s,v.appendChild(I),v.appendChild(i);let j=new XMLSerializer().serializeToString(v);w=`<svg xmlns="${P}" width="${C}" height="${p}" viewBox="0 0 ${C} ${p}">`+j+"</svg>",u=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(w)}`,x()},{fast:n})});let d=document.getElementById("snapdom-sandbox");return d&&d.style.position==="absolute"&&d.remove(),u})}function Lt(l,c){return m(this,arguments,function*(t,{dpr:e=1,scale:o=1}){let n=new Image;return n.src=t,yield n.decode(),X?(n.width=n.width*o,n.height=n.height*o):(n.width=n.width/o,n.height=n.height/o),n})}function Ct(l){return m(this,arguments,function*(t,{dpr:e=1,scale:o=1}={}){let c=new Image;c.src=t,yield c.decode();let n=document.createElement("canvas"),a=c.width*o,i=c.height*o;n.width=Math.ceil(a*e),n.height=Math.ceil(i*e);let s=n.getContext("2d");return s.scale(e,e),s.drawImage(c,0,0,a,i),n.style.width=`${a}px`,n.style.height=`${i}px`,n})}function bt(t){return m(this,null,function*(){let e=decodeURIComponent(t.split(",")[1]);return new Blob([e],{type:"image/svg+xml"})})}function St(c,n,a){return m(this,arguments,function*(t,{dpr:e=1,scale:o=1},l){let i=yield Ct(t,{dpr:e,scale:o});if(!l)return i;let s=document.createElement("canvas");s.width=i.width,s.height=i.height;let r=s.getContext("2d");return r.fillStyle=l,r.fillRect(0,0,s.width,s.height),r.drawImage(i,0,0),s})}function nt(a,i){return m(this,arguments,function*(t,{dpr:e=1,scale:o=1,backgroundColor:l="#fff",quality:c},n="png"){let s=yield St(t,{dpr:e,scale:o},l),r=new Image;return r.src=s.toDataURL(`image/${n}`,c),yield r.decode(),r.style.width=`${s.width/e}px`,r.style.height=`${s.height/e}px`,r})}function Ut(a){return m(this,arguments,function*(t,{dpr:e=1,scale:o=1,backgroundColor:l="#fff",format:c="png",filename:n="capture"}={}){if(c==="svg"){let w=yield bt(t),d=URL.createObjectURL(w),x=document.createElement("a");x.href=d,x.download=`${n}.svg`,x.click(),URL.revokeObjectURL(d);return}let i=["jpg","jpeg","webp"].includes(c)?"#fff":void 0,s=l!=null?l:i,r=yield St(t,{dpr:e,scale:o},s),f={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[c]||"image/png",h=r.toDataURL(f),u=document.createElement("a");u.href=h,u.download=`${n}.${c}`,u.click()})}function b(o){return m(this,arguments,function*(t,e={}){if(e=_({scale:1},e),!t)throw new Error("Element cannot be null or undefined");return yield b.capture(t,e)})}b.capture=(o,...l)=>m(null,[o,...l],function*(t,e={}){let c=yield xt(t,e),n=window.devicePixelRatio||1,a=e.scale||1;return{url:c,options:e,toRaw:()=>c,toImg:()=>Lt(c,{dpr:n,scale:a}),toCanvas:()=>Ct(c,{dpr:n,scale:a}),toBlob:()=>bt(c),toPng:i=>nt(c,_({dpr:n,scale:a},i),"png"),toJpg:i=>nt(c,_({dpr:n,scale:a},i),"jpeg"),toWebp:i=>nt(c,_({dpr:n,scale:a},i),"webp"),download:({format:i="png",filename:s="capture",backgroundColor:r}={})=>Ut(c,{dpr:n,scale:a,backgroundColor:r,format:i,filename:s})}});b.toRaw=(t,e)=>m(null,null,function*(){return(yield b.capture(t,e)).toRaw()});b.toImg=(t,e)=>m(null,null,function*(){return(yield b.capture(t,e)).toImg()});b.toCanvas=(t,e)=>m(null,null,function*(){return(yield b.capture(t,e)).toCanvas()});b.toBlob=(t,e)=>m(null,null,function*(){return(yield b.capture(t,e)).toBlob()});b.toPng=(t,e)=>m(null,null,function*(){return(yield b.capture(t,e)).toPng(e)});b.toJpg=(t,e)=>m(null,null,function*(){return(yield b.capture(t,e)).toJpg(e)});b.toWebp=(t,e)=>m(null,null,function*(){return(yield b.capture(t,e)).toWebp(e)});b.download=(o,...l)=>m(null,[o,...l],function*(t,e={}){let r=e,{format:c="png",filename:n="capture",backgroundColor:a}=r,i=st(r,["format","filename","backgroundColor"]);return yield(yield b.capture(t,i)).download({format:c,filename:n,backgroundColor:a})});function Et(){return m(this,arguments,function*(t=document,e={}){let{embedFonts:o=!0,reset:l=!1,crossOrigin:c}=e;if(l){N.clear(),B.clear(),$.clear(),M.clear();return}yield document.fonts.ready,it();let n=[],a=[];t!=null&&t.querySelectorAll&&(n=Array.from(t.querySelectorAll("img[src]")),a=Array.from(t.querySelectorAll("*")));let i=[];for(let s of n){let r=s.src;if(!N.has(r)){let f=c?c(r):"anonymous";i.push(U(r,3e3,f).then(h=>N.set(r,h)).catch(()=>{}))}}for(let s of a){let r=L(s).backgroundImage;if(r&&r!=="none"){let f=W(r);for(let h of f)h.startsWith("url(")&&i.push(O(h,{crossOrigin:c,skipInline:!0}).catch(()=>{}))}}o&&(yield J({ignoreIconFonts:!o,preCached:!0})),yield Promise.all(i)})}window.snapdom=b;window.preCache=Et;})();
|
package/dist/snapdom.min.mjs
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
var
|
|
2
|
-
`;return o}function
|
|
3
|
-
`}catch{console.warn("[snapdom] Failed to fetch CSS:",
|
|
4
|
-
font-family: ${
|
|
5
|
-
src: ${
|
|
6
|
-
font-style: ${
|
|
7
|
-
font-weight: ${
|
|
1
|
+
var A=new Map,U=new Map,S=new Map,P=new Map,B=new Map,K=new WeakMap,I=new Set;var Ct=["div","span","p","a","img","ul","li","button","input","select","textarea","label","section","article","header","footer","nav","main","aside","h1","h2","h3","h4","h5","h6","svg","path","circle","rect","line","g","table","thead","tbody","tr","td","th"];function tt(){for(let t of Ct)et(t)}function et(t){if(P.has(t))return P.get(t);if(new Set(["script","style","meta","link","noscript","template"]).has(t)){let n={};return P.set(t,n),n}let o=document.getElementById("snapdom-sandbox");o||(o=document.createElement("div"),o.id="snapdom-sandbox",o.style.position="absolute",o.style.left="-9999px",o.style.top="-9999px",o.style.width="0",o.style.height="0",o.style.overflow="hidden",document.body.appendChild(o));let s=document.createElement(t);s.style.all="initial",o.appendChild(s);let r=getComputedStyle(s),a={};for(let n of r)a[n]=r.getPropertyValue(n);return o.removeChild(s),P.set(t,a),a}function W(t,e,o=!1){let s=[],r=et(e);for(let[a,n]of Object.entries(t))if(!o)n&&s.push(`${a}:${n}`);else{let i=r[a];n&&n!==i&&s.push(`${a}:${n}`)}return s.sort().join(";")}function nt(t){let e=new Set;return t.nodeType!==Node.ELEMENT_NODE&&t.nodeType!==Node.DOCUMENT_FRAGMENT_NODE?[]:(t.tagName&&e.add(t.tagName.toLowerCase()),typeof t.querySelectorAll=="function"&&t.querySelectorAll("*").forEach(o=>e.add(o.tagName.toLowerCase())),Array.from(e))}function ot(t){let e=new Map;for(let s of t){let r=P.get(s);if(!r)continue;let a=Object.entries(r).map(([n,i])=>`${n}:${i};`).sort().join("");e.has(a)||e.set(a,[]),e.get(a).push(s)}let o="";for(let[s,r]of e.entries())o+=`${r.join(",")} { ${s} }
|
|
2
|
+
`;return o}function rt(t){let e=new Set(t.values()),o=new Map,s=1;for(let r of e)o.set(r,`c${s++}`);return o}async function F(t,e={}){let o=t.startsWith("url("),s=/^((repeating-)?(linear|radial|conic)-gradient)\(/i.test(t);if(o){let r=j(t);if(!r)return t;let a=J(r);if(U.has(a))return e.skipInline?void 0:`url(${U.get(a)})`;{let n=e.crossOrigin?e.crossOrigin(a):"anonymous",i=await L(a,3e3,n);return U.set(a,i),e.skipInline?void 0:`url(${i})`}}return t}function M(t,{fast:e=!1}={}){if(e)return t();"requestIdleCallback"in window?requestIdleCallback(t,{timeout:50}):setTimeout(t,1)}function N(t,e=null){if(!(t instanceof Element))return window.getComputedStyle(t,e);let o=K.get(t);if(o||(o=new Map,K.set(t,o)),!o.has(e)){let s=window.getComputedStyle(t,e);o.set(e,s)}return o.get(e)}function at(t){let e=t.replace(/^['"]|['"]$/g,"");if(e.startsWith("\\"))try{return String.fromCharCode(parseInt(e.replace("\\",""),16))}catch{return e}return e}function j(t){let e=t.indexOf("url(");if(e===-1)return null;let o=t.slice(e+4).trim();return o.endsWith(")")&&(o=o.slice(0,-1).trim()),(o.startsWith('"')&&o.endsWith('"')||o.startsWith("'")&&o.endsWith("'"))&&(o=o.slice(1,-1)),o}function _(t){return[/font\s*awesome/i,/material\s*icons/i,/ionicons/i,/glyphicons/i,/feather/i,/bootstrap\s*icons/i,/remix\s*icons/i,/heroicons/i,/lucide/i].some(o=>o.test(t))}function L(t,e=3e3,o="anonymous"){return A.has(t)?Promise.resolve(A.get(t)):new Promise((s,r)=>{let a=setTimeout(()=>{r(new Error("Image load timed out"))},e),n=new Image;n.crossOrigin=o,n.onload=async()=>{clearTimeout(a);try{await n.decode();let i=document.createElement("canvas");i.width=n.width,i.height=n.height,i.getContext("2d").drawImage(n,0,0,i.width,i.height);try{let l=i.toDataURL("image/png");A.set(t,l),s(l)}catch{r(new Error("CORS restrictions prevented image capture"))}}catch(i){r(i)}},n.onerror=i=>{clearTimeout(a),r(new Error("Failed to load image: "+(i.message||"Unknown error")))},n.src=t})}function V(t){let e={};for(let o of t)e[o]=t.getPropertyValue(o);return e}function H(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function st(t){if(!t||t==="none")return"";let e=t.replace(/translate[XY]?\([^)]*\)/g,"");return e=e.replace(/matrix\(([^)]+)\)/g,(o,s)=>{let r=s.split(",").map(a=>a.trim());return r.length!==6?`matrix(${s})`:(r[4]="0",r[5]="0",`matrix(${r.join(", ")})`)}),e=e.replace(/matrix3d\(([^)]+)\)/g,(o,s)=>{let r=s.split(",").map(a=>a.trim());return r.length!==16?`matrix3d(${s})`:(r[12]="0",r[13]="0",`matrix3d(${r.join(", ")})`)}),e.trim().replace(/\s{2,}/g," ")}function J(t){try{let e=decodeURI(t);return encodeURI(e)}catch{return t}}function O(t){let e=[],o=0,s=0;for(let r=0;r<t.length;r++){let a=t[r];a==="("&&o++,a===")"&&o--,a===","&&o===0&&(e.push(t.slice(s,r).trim()),s=r+1)}return e.push(t.slice(s).trim()),e}function G(t,e,o,s,r){if(t.tagName==="STYLE")return;s.has(t)||s.set(t,N(t));let a=s.get(t),n=V(a),i=t.tagName?.toLowerCase()||"div",c=W(n,i,r);o.set(e,c)}function Y(t,e,o,s,r){if(t.nodeType===Node.ELEMENT_NODE&&t.getAttribute("data-capture")==="exclude"){let i=document.createElement("div"),c=t.getBoundingClientRect();return i.style.cssText=`display: inline-block; width: ${c.width}px; height: ${c.height}px; visibility: hidden;`,i}if(t.tagName==="IFRAME"){let i=document.createElement("div");return i.textContent="",i.style.cssText=`width: ${t.offsetWidth}px; height: ${t.offsetHeight}px; background-image: repeating-linear-gradient(45deg, #ddd, #ddd 5px, #f9f9f9 5px, #f9f9f9 10px);display: flex;align-items: center;justify-content: center;font-size: 12px;color: #555; border: 1px solid #aaa;`,i}if(t.nodeType===Node.ELEMENT_NODE&&t.getAttribute("data-capture")==="placeholder"){let i=t.cloneNode(!1);s.set(i,t),G(t,i,e,o,r);let c=document.createElement("div");return c.textContent=t.getAttribute("data-placeholder-text")||"",c.style.cssText="color: #666;font-size: 12px;text-align: center;line-height: 1.4;padding: 0.5em;box-sizing: border-box;",i.appendChild(c),i}if(t.tagName==="CANVAS"){let i=t.toDataURL(),c=document.createElement("img");return c.src=i,c.width=t.width,c.height=t.height,c.style.display="inline-block",c.style.width=t.style.width||`${t.width}px`,c.style.height=t.style.height||`${t.height}px`,c}if(t.nodeType===Node.TEXT_NODE){if(t.parentElement?.shadowRoot){let i=t.parentElement.tagName.toLowerCase();if(customElements.get(i))return null}return t.cloneNode(!0)}if(t.nodeType!==Node.ELEMENT_NODE)return t.cloneNode(!0);let a=t.cloneNode(!1);s.set(a,t),t instanceof HTMLInputElement?(a.value=t.value,a.setAttribute("value",t.value),t.checked!==void 0&&(a.checked=t.checked,t.checked&&a.setAttribute("checked",""))):t instanceof HTMLTextAreaElement?(a.value=t.value,a.textContent=t.value):t instanceof HTMLSelectElement&&(a.value=t.value,Array.from(a.options).forEach(i=>{i.value===t.value?i.setAttribute("selected",""):i.removeAttribute("selected")})),G(t,a,e,o,r);let n=document.createDocumentFragment();if(t.childNodes.forEach(i=>{let c=Y(i,e,o,s,r);c&&n.appendChild(c)}),a.appendChild(n),t.shadowRoot){let i=Array.from(t.shadowRoot.children).filter(l=>l.tagName!=="STYLE").map(l=>Y(l,e,o,s)).filter(Boolean),c=document.createDocumentFragment();i.forEach(l=>c.appendChild(l)),a.appendChild(c)}return a}async function it(t,e,o,s=32,r="#000"){e=e.replace(/^['"]+|['"]+$/g,"");let a=window.devicePixelRatio||1,i=document.createElement("canvas").getContext("2d");i.font=o?`${o} ${s}px "${e}"`:`${s}px "${e}"`;let c=i.measureText(t),l=c.actualBoundingBoxAscent||s*.8,f=c.actualBoundingBoxDescent||s*.2,m=l+f,h=c.width,p=document.createElement("canvas");p.width=Math.ceil(h*a),p.height=Math.ceil(m*a);let d=p.getContext("2d");return d.scale(a,a),d.font=i.font,d.textAlign="left",d.textBaseline="alphabetic",d.fillStyle=r,d.fillText(t,0,l),p.toDataURL()}function ct(t){return Array.from(document.styleSheets).some(e=>e.href===t)}function bt(t){return new Promise(e=>{if(ct(t))return e(null);let o=document.createElement("link");o.rel="stylesheet",o.href=t,o.setAttribute("data-snapdom","injected-import"),o.onload=()=>e(o),o.onerror=()=>e(null),document.head.appendChild(o)})}async function X({ignoreIconFonts:t=!0,preCached:e=!1}={}){if(S.has("fonts-embed-css")){if(e){let n=document.createElement("style");n.setAttribute("data-snapdom","embedFonts"),n.textContent=S.get("fonts-embed-css"),document.head.appendChild(n)}return S.get("fonts-embed-css")}let o=/@import\s+url\(["']?([^"')]+)["']?\)/g,s=[];for(let n of document.querySelectorAll("style")){let i=n.textContent||"",c=Array.from(i.matchAll(o));for(let l of c){let f=l[1];ct(f)||s.push(f)}}await Promise.all(s.map(bt));let r=Array.from(document.querySelectorAll('link[rel="stylesheet"]')).filter(n=>n.href),a="";for(let n of r)try{let c=await(await fetch(n.href)).text();if(t&&(_(n.href)||_(c)))continue;let l=/url\((["']?)([^"')]+)\1\)/g,f=await Promise.all(Array.from(c.matchAll(l)).map(async h=>{let p=j(h[0]);if(!p)return null;let d=p;if(!d.startsWith("http")&&!d.startsWith("data:")&&(d=new URL(d,n.href).href),t&&_(d))return null;if(S.has(d))return I.add(d),{original:h[0],inlined:`url(${S.get(d)})`};if(I.has(d))return null;try{let g=await(await fetch(d)).blob(),y=await new Promise(E=>{let C=new FileReader;C.onload=()=>E(C.result),C.readAsDataURL(g)});return S.set(d,y),I.add(d),{original:h[0],inlined:`url(${y})`}}catch{return console.warn("[snapdom] Failed to fetch font resource:",d),null}})),m=c;for(let h of f)h&&(m=m.replace(h.original,h.inlined));a+=m+`
|
|
3
|
+
`}catch{console.warn("[snapdom] Failed to fetch CSS:",n.href)}for(let n of document.styleSheets)try{if(!n.href||r.every(i=>i.href!==n.href)){for(let i of n.cssRules)if(i.type===CSSRule.FONT_FACE_RULE){let c=i.style.getPropertyValue("src");if(!c)continue;let l=/url\((["']?)([^"')]+)\1\)/g,f=c,m=Array.from(c.matchAll(l));for(let h of m){let p=h[2].trim();if(!p)continue;let d=p;if(!d.startsWith("http")&&!d.startsWith("data:")&&(d=new URL(d,n.href||location.href).href),!(t&&_(d))){if(S.has(d)){I.add(d),f=f.replace(h[0],`url(${S.get(d)})`);continue}if(!I.has(d))try{let g=await(await fetch(d)).blob(),y=await new Promise(E=>{let C=new FileReader;C.onload=()=>E(C.result),C.readAsDataURL(g)});S.set(d,y),I.add(d),f=f.replace(h[0],`url(${y})`)}catch{console.warn("[snapdom] Failed to fetch font URL:",d)}}}a+=`@font-face {
|
|
4
|
+
font-family: ${i.style.getPropertyValue("font-family")};
|
|
5
|
+
src: ${f};
|
|
6
|
+
font-style: ${i.style.getPropertyValue("font-style")||"normal"};
|
|
7
|
+
font-weight: ${i.style.getPropertyValue("font-weight")||"normal"};
|
|
8
8
|
}
|
|
9
|
-
`}}}catch(
|
|
10
|
-
font-family: '${
|
|
11
|
-
src: url(${
|
|
12
|
-
font-style: ${
|
|
13
|
-
font-weight: ${
|
|
9
|
+
`}}}catch(i){console.warn("[snapdom] Cannot access stylesheet",n.href,i)}for(let n of document.fonts)if(n.family&&n.status==="loaded"&&n._snapdomSrc){let i=n._snapdomSrc;if(!i.startsWith("data:")){if(S.has(n._snapdomSrc))i=S.get(n._snapdomSrc),I.add(n._snapdomSrc);else if(!I.has(n._snapdomSrc))try{let l=await(await fetch(n._snapdomSrc)).blob();i=await new Promise(f=>{let m=new FileReader;m.onload=()=>f(m.result),m.readAsDataURL(l)}),S.set(n._snapdomSrc,i),I.add(n._snapdomSrc)}catch{console.warn("[snapdom] Failed to fetch dynamic font src:",n._snapdomSrc);continue}}a+=`@font-face {
|
|
10
|
+
font-family: '${n.family}';
|
|
11
|
+
src: url(${i});
|
|
12
|
+
font-style: ${n.style||"normal"};
|
|
13
|
+
font-weight: ${n.weight||"normal"};
|
|
14
14
|
}
|
|
15
|
-
`}if(r&&n){let t=document.createElement("style");t.setAttribute("data-snapdom","embedFonts"),t.textContent=r,document.head.appendChild(t)}return r}async function V(e,n,o,r,t,a=!1){if(!(e instanceof Element)||!(n instanceof Element))return;for(let c of["::before","::after"])try{let l=U(e,c);if(!l)continue;let d=l.getPropertyValue("content"),h=l.getPropertyValue("background-image"),f=d&&d!=="none"&&d!=='""'&&d!=="''",p=h&&h.startsWith("url(");if(f||p){let m=l.getPropertyValue("font-family"),u=parseInt(l.getPropertyValue("font-size"))||32,y=parseInt(l.getPropertyValue("font-weight"))||!1,x=l.getPropertyValue("color")||"#000",w=document.createElement("span");w.dataset.snapdomPseudo=c;let A=O(l),F=M(A,"span",t);o.set(w,F);let j=m&&/font.*awesome|material|bootstrap|glyphicons|ionicons|remixicon|simple-line-icons|octicons|feather|typicons|weathericons/i.test(m),E=X(d);if(!a&&j&&E.length===1){let b=document.createElement("img");b.src=await G(E,m,y,u,x),b.style="display:block;width:100%;height:100%;object-fit:contain;",w.appendChild(b)}else if(E.startsWith("url(")){let b=$(E);if(b)try{let v=document.createElement("img"),se=await S(encodeURI(b));v.src=se,v.style="display:block;width:100%;height:100%;object-fit:contain;",w.appendChild(v)}catch(v){console.error(`[snapdom] Error in pseudo ${c} for`,e,v)}}else!j&&E&&E!=="none"&&(w.textContent=E);if(p&&h){let b=$(h);if(b)try{let v=await S(encodeURI(b));w.style.backgroundImage=`url(${v})`}catch(v){console.warn(`[snapdom] Failed to inline background-image for ${c}`,v)}}if(!(w.childNodes.length>0||w.textContent&&w.textContent.trim()!=="")&&!p)continue;c==="::before"?n.insertBefore(w,n.firstChild):n.appendChild(w)}}catch(l){console.warn(`[snapdom] Failed to capture ${c} for`,e,l)}let s=Array.from(e.children),i=Array.from(n.children).filter(c=>!c.dataset.snapdomPseudo);for(let c=0;c<Math.min(s.length,i.length);c++)await V(s[c],i[c],o,r,t,a)}async function Q(e,n=!1,o=!1){let r=new Map,t=new WeakMap,a=new Map,s;try{s=D(e,r,t,a,n)}catch(c){throw console.warn("deepClone failed:",c),c}try{await V(e,s,r,t,n,o)}catch(c){console.warn("inlinePseudoElements failed:",c)}let i="";if(n){let c=J(r);i=Array.from(c.entries()).map(([l,d])=>`.${d}{${l}}`).join("");for(let[l,d]of r.entries()){if(l.tagName==="STYLE")continue;let h=c.get(d);h&&l.classList.add(h);let f=l.style?.backgroundImage;l.removeAttribute("style"),f&&f!=="none"&&(l.style.backgroundImage=f)}}else for(let[c,l]of r.entries())c.tagName!=="STYLE"&&c.setAttribute("style",l.replace(/;/g,"; "));for(let[c,l]of a.entries()){let d=l.scrollLeft,h=l.scrollTop;if((d||h)&&c instanceof HTMLElement){c.style.overflow="hidden",c.style.scrollbarWidth="none",c.style.msOverflowStyle="none";let p=document.createElement("div");for(p.style.transform=`translate(${-d}px, ${-h}px)`,p.style.willChange="transform",p.style.display="inline-block",p.style.width="100%";c.firstChild;)p.appendChild(c.firstChild);c.appendChild(p)}}return{clone:s,classCSS:i,styleCache:t}}async function Z(e,n={}){let o=Array.from(e.querySelectorAll("img")),r=async t=>{let a=t.src;try{let s=n.crossOrigin?n.crossOrigin(a):"anonymous",i=await S(a,3e3,s);t.src=i,t.width||(t.width=t.naturalWidth||100),t.height||(t.height=t.naturalHeight||100)}catch{let s=document.createElement("div");s.style=`width: ${t.width||100}px; height: ${t.height||100}px; background: #ccc; display: inline-block; text-align: center; line-height: ${t.height||100}px; color: #666; font-size: 12px;`,s.innerText="img",t.replaceWith(s)}};for(let t=0;t<o.length;t+=4){let a=o.slice(t,t+4).map(r);await Promise.allSettled(a)}}async function ee(e,n,o,r={}){let t=[[e,n]];for(;t.length;){let[a,s]=t.shift(),i=o.get(a)||U(a);o.has(a)||o.set(a,i);let l=i.getPropertyValue("background-image").split(",");for(let f=0;f<l.length;f++){let p=$(l[f]);if(p)try{let m=encodeURI(p),u;if(T.has(m))u=T.get(m);else{let y=r.crossOrigin?r.crossOrigin(m):"anonymous";u=await S(m,3e3,y),T.set(m,u)}l[f]=`url(${u})`}catch{l[f]="none"}}l.some(f=>f.includes("url("))&&(s.style.backgroundImage=l.join(","));let d=Array.from(a.children),h=Array.from(s.children);for(let f=0;f<Math.min(d.length,h.length);f++)t.push([d[f],h[f]])}}async function te(e,n={}){if(!e)throw new Error("Element cannot be null or undefined");let{compress:o=!0,embedFonts:r=!1,fast:t=!0,scale:a=1}=n,s,i,c,l="",d="",h,f;if({clone:s,classCSS:i,styleCache:c}=await Q(e,o,r),await new Promise(m=>{L(async()=>{await Z(s,n),m()},{fast:t})}),await new Promise(m=>{L(async()=>{await ee(e,s,c,n),m()},{fast:t})}),r&&await new Promise(m=>{L(async()=>{l=await W({ignoreIconFonts:!r}),m()},{fast:t})}),o){let m=Y(s).sort(),u=m.join(",");k.has(u)?d=k.get(u):await new Promise(y=>{L(()=>{d=K(m),k.set(u,d),y()},{fast:t})})}await new Promise(m=>{L(()=>{let u=e.getBoundingClientRect(),y=Math.ceil(u.width),x=Math.ceil(u.height);s.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),s.style.transformOrigin="top left",a!==1&&B()&&(s.style.scale=`${a}`);let w="http://www.w3.org/2000/svg",A=document.createElementNS(w,"foreignObject");A.setAttribute("width","100%"),A.setAttribute("height","100%");let F=document.createElement("style");F.textContent=d+l+"svg{overflow:visible;}"+i,A.appendChild(F),A.appendChild(s);let E=new XMLSerializer().serializeToString(A);f=`<svg xmlns="${w}" width="${y}" height="${x}" viewBox="0 0 ${y} ${x}">`+E+"</svg>",h=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(f)}`,m()},{fast:t})});let p=document.getElementById("snapdom-sandbox");return p&&p.style.position==="absolute"&&p.remove(),h}async function ce(e,{dpr:n=1,scale:o=1}){let r=new Image;return r.src=e,await r.decode(),B?(r.width=r.width*o,r.height=r.height*o):(r.width=r.width/o,r.height=r.height/o),r}async function ne(e,{dpr:n=1,scale:o=1}={}){let r=new Image;r.src=e,await r.decode();let t=document.createElement("canvas"),a=r.width*o,s=r.height*o;t.width=Math.ceil(a*n),t.height=Math.ceil(s*n);let i=t.getContext("2d");return i.scale(n,n),i.drawImage(r,0,0,a,s),t.style.width=`${a}px`,t.style.height=`${s}px`,t}async function oe(e){let n=decodeURIComponent(e.split(",")[1]);return new Blob([n],{type:"image/svg+xml"})}async function ae(e,{dpr:n=1,scale:o=1},r){let t=await ne(e,{dpr:n,scale:o});if(!r)return t;let a=document.createElement("canvas");a.width=t.width,a.height=t.height;let s=a.getContext("2d");return s.fillStyle=r,s.fillRect(0,0,a.width,a.height),s.drawImage(t,0,0),a}async function q(e,{dpr:n=1,scale:o=1,backgroundColor:r="#fff",quality:t},a="png"){let s=await ae(e,{dpr:n,scale:o},r),i=new Image;return i.src=s.toDataURL(`image/${a}`,t),await i.decode(),i.style.width=`${s.width/n}px`,i.style.height=`${s.height/n}px`,i}async function le(e,{dpr:n=1,scale:o=1,backgroundColor:r="#fff",format:t="png",filename:a="capture"}={}){if(t==="svg"){let f=await oe(e),p=URL.createObjectURL(f),m=document.createElement("a");m.href=p,m.download=`${a}.svg`,m.click(),URL.revokeObjectURL(p);return}let s=["jpg","jpeg","webp"].includes(t)?"#fff":void 0,c=await ae(e,{dpr:n,scale:o},r??s),l={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[t]||"image/png",d=c.toDataURL(l),h=document.createElement("a");h.href=d,h.download=`${a}.${t}`,h.click()}async function g(e,n={}){if(n={scale:1,...n},!e)throw new Error("Element cannot be null or undefined");return await g.capture(e,n)}g.capture=async(e,n={})=>{let o=await te(e,n),r=window.devicePixelRatio||1,t=n.scale||1;return{url:o,options:n,toRaw:()=>o,toImg:()=>ce(o,{dpr:r,scale:t}),toCanvas:()=>ne(o,{dpr:r,scale:t}),toBlob:()=>oe(o),toPng:a=>q(o,{dpr:r,scale:t,...a},"png"),toJpg:a=>q(o,{dpr:r,scale:t,...a},"jpeg"),toWebp:a=>q(o,{dpr:r,scale:t,...a},"webp"),download:({format:a="png",filename:s="capture",backgroundColor:i}={})=>le(o,{dpr:r,scale:t,backgroundColor:i,format:a,filename:s})}};g.toRaw=async(e,n)=>(await g.capture(e,n)).toRaw();g.toImg=async(e,n)=>(await g.capture(e,n)).toImg();g.toCanvas=async(e,n)=>(await g.capture(e,n)).toCanvas();g.toBlob=async(e,n)=>(await g.capture(e,n)).toBlob();g.toPng=async(e,n)=>(await g.capture(e,n)).toPng(n);g.toJpg=async(e,n)=>(await g.capture(e,n)).toJpg(n);g.toWebp=async(e,n)=>(await g.capture(e,n)).toWebp(n);g.download=async(e,n={})=>{let{format:o="png",filename:r="capture",backgroundColor:t,...a}=n;return await(await g.capture(e,a)).download({format:o,filename:r,backgroundColor:t})};async function fe(e=document,n={}){let{embedFonts:o=!0,reset:r=!1,crossOrigin:t}=n;if(r){R.clear(),T.clear(),C.clear(),k.clear(),N.clear();return}await document.fonts.ready,H();let a=[],s=[];e?.querySelectorAll&&(a=Array.from(e.querySelectorAll("img[src]")),s=Array.from(e.querySelectorAll("*")));let i=[];for(let c of a){let l=c.src;if(!R.has(l)){let d=t?t(l):"anonymous";i.push(S(l,3e3,d).then(h=>R.set(l,h)).catch(()=>{}))}}for(let c of s){let l=getComputedStyle(c).backgroundImage,d=$(l);if(d&&!T.has(d)){let h=t?t(d):"anonymous";i.push(S(d,3e3,h).then(f=>T.set(d,f)).catch(()=>{}))}}o&&await W({ignoreIconFonts:!o,preCached:!0}),await Promise.all(i)}export{fe as preCache,g as snapdom};
|
|
15
|
+
`}if(a&&(S.set("fonts-embed-css",a),e)){let n=document.createElement("style");n.setAttribute("data-snapdom","embedFonts"),n.textContent=a,document.head.appendChild(n)}return a}async function Q(t,e,o,s,r,a=!1){if(!(t instanceof Element)||!(e instanceof Element))return;for(let c of["::before","::after","::first-letter"])try{let l=N(t,c);if(!l||typeof l[Symbol.iterator]!="function")continue;if(c==="::first-letter"){let g=getComputedStyle(t);if(!(l.color!==g.color||l.fontSize!==g.fontSize||l.fontWeight!==g.fontWeight))continue;let E=Array.from(e.childNodes).find(b=>b.nodeType===Node.TEXT_NODE&&b.textContent&&b.textContent.trim().length>0);if(!E)continue;let C=E.textContent,T=C.match(/^([^\p{L}\p{N}\s]*[\p{L}\p{N}](?:['’])?)/u)?.[0],R=C.slice(T?.length||0);if(!T||/[\uD800-\uDFFF]/.test(T))continue;let k=document.createElement("span");k.textContent=T,k.dataset.snapdomPseudo="::first-letter";let v=V(l),q=W(v,"span",r);o.set(k,q);let z=document.createTextNode(R);e.replaceChild(z,E),e.insertBefore(k,z);continue}let f=l.getPropertyValue("content"),m=l.getPropertyValue("background-image"),h=l.getPropertyValue("background-color"),p=f!=="none",d=m&&m!=="none",u=h&&h!=="transparent"&&h!=="rgba(0, 0, 0, 0)";if(p||d||u){let g=l.getPropertyValue("font-family"),y=parseInt(l.getPropertyValue("font-size"))||32,E=parseInt(l.getPropertyValue("font-weight"))||!1,C=l.getPropertyValue("color")||"#000",x=document.createElement("span");x.dataset.snapdomPseudo=c;let T=V(l),R=W(T,"span",r);o.set(x,R);let k=g&&/font.*awesome|material|bootstrap|glyphicons|ionicons|remixicon|simple-line-icons|octicons|feather|typicons|weathericons|lucide/i.test(g),v=at(f);if(!a&&k&&v.length===1){let b=document.createElement("img");b.src=await it(v,g,E,y,C),b.style="display:block;width:100%;height:100%;object-fit:contain;",x.appendChild(b)}else if(v.startsWith("url(")){let b=j(v);if(b&&b.trim()!=="")try{let $=document.createElement("img"),D=await L(J(b));$.src=D,$.style="display:block;width:100%;height:100%;object-fit:contain;",x.appendChild($)}catch($){console.error(`[snapdom] Error in pseudo ${c} for`,t,$)}}else!k&&v&&v!=="none"&&(x.textContent=v);if(d)try{let b=O(m),$=await Promise.all(b.map(D=>F(D)));x.style.backgroundImage=$.join(", ")}catch(b){console.warn(`[snapdom] Failed to inline background-image for ${c}`,b)}if(u&&(x.style.backgroundColor=h),!(x.childNodes.length>0||x.textContent&&x.textContent.trim()!==""||d||u))continue;c==="::before"?e.insertBefore(x,e.firstChild):e.appendChild(x)}}catch(l){console.warn(`[snapdom] Failed to capture ${c} for`,t,l)}let n=Array.from(t.children),i=Array.from(e.children).filter(c=>!c.dataset.snapdomPseudo);for(let c=0;c<Math.min(n.length,i.length);c++)await Q(n[c],i[c],o,s,r,a)}async function lt(t,e=!1,o=!1){let s=new Map,r=new WeakMap,a=new Map,n;try{n=Y(t,s,r,a,e)}catch(c){throw console.warn("deepClone failed:",c),c}try{await Q(t,n,s,r,e,o)}catch(c){console.warn("inlinePseudoElements failed:",c)}let i="";if(e){let c=rt(s);i=Array.from(c.entries()).map(([l,f])=>`.${f}{${l}}`).join("");for(let[l,f]of s.entries()){if(l.tagName==="STYLE")continue;let m=c.get(f);m&&l.classList.add(m);let h=l.style?.backgroundImage;l.removeAttribute("style"),h&&h!=="none"&&(l.style.backgroundImage=h)}}else for(let[c,l]of s.entries())c.tagName!=="STYLE"&&c.setAttribute("style",l.replace(/;/g,"; "));for(let[c,l]of a.entries()){let f=l.scrollLeft,m=l.scrollTop;if((f||m)&&c instanceof HTMLElement){c.style.overflow="hidden",c.style.scrollbarWidth="none",c.style.msOverflowStyle="none";let p=document.createElement("div");for(p.style.transform=`translate(${-f}px, ${-m}px)`,p.style.willChange="transform",p.style.display="inline-block",p.style.width="100%";c.firstChild;)p.appendChild(c.firstChild);c.appendChild(p)}}if(t===a.get(n)){let c=r.get(t)||window.getComputedStyle(t);r.set(t,c);let l=st(c.transform);n.style.margin="0",n.style.position="static",n.style.top="auto",n.style.left="auto",n.style.right="auto",n.style.bottom="auto",n.style.zIndex="auto",n.style.float="none",n.style.clear="none",n.style.transform=l||""}return{clone:n,classCSS:i,styleCache:r}}async function dt(t,e={}){let o=Array.from(t.querySelectorAll("img")),s=async r=>{let a=r.src;try{let n=e.crossOrigin?e.crossOrigin(a):"anonymous",i=await L(a,3e3,n);r.src=i,r.width||(r.width=r.naturalWidth||100),r.height||(r.height=r.naturalHeight||100)}catch{let n=document.createElement("div");n.style=`width: ${r.width||100}px; height: ${r.height||100}px; background: #ccc; display: inline-block; text-align: center; line-height: ${r.height||100}px; color: #666; font-size: 12px;`,n.innerText="img",r.replaceWith(n)}};for(let r=0;r<o.length;r+=4){let a=o.slice(r,r+4).map(s);await Promise.allSettled(a)}}async function ft(t,e,o,s={}){let r=[[t,e]];for(;r.length;){let[a,n]=r.shift(),i=o.get(a)||N(a);o.has(a)||o.set(a,i);let c=i.getPropertyValue("background-image"),l=i.getPropertyValue("background-color");if(!c||c==="none"){let u=Array.from(a.children),g=Array.from(n.children);for(let y=0;y<Math.min(u.length,g.length);y++)r.push([u[y],g[y]]);continue}let f=O(c),m=await Promise.all(f.map(u=>F(u,s)));m.some(u=>u&&u!=="none"&&!/^url\(undefined\)/.test(u))&&(n.style.backgroundImage=m.join(", ")),l&&l!=="transparent"&&l!=="rgba(0, 0, 0, 0)"&&(n.style.backgroundColor=l);let p=Array.from(a.children),d=Array.from(n.children);for(let u=0;u<Math.min(p.length,d.length);u++)r.push([p[u],d[u]])}}async function mt(t,e={}){if(!t)throw new Error("Element cannot be null or undefined");if(!(t instanceof Element))throw new Error("captureDOM: Only Element nodes are supported");let{compress:o=!0,embedFonts:s=!1,fast:r=!0,scale:a=1}=e,n,i,c,l="",f="",m,h;if({clone:n,classCSS:i,styleCache:c}=await lt(t,o,s),await new Promise(d=>{M(async()=>{await dt(n,e),d()},{fast:r})}),await new Promise(d=>{M(async()=>{await ft(t,n,c,e),d()},{fast:r})}),s&&await new Promise(d=>{M(async()=>{l=await X({ignoreIconFonts:!s}),d()},{fast:r})}),o){let d=nt(n).sort(),u=d.join(",");B.has(u)?f=B.get(u):await new Promise(g=>{M(()=>{f=ot(d),B.set(u,f),g()},{fast:r})})}await new Promise(d=>{M(()=>{let u=t.getBoundingClientRect(),g=u.width,y=u.height,E=Number.isFinite(e.width),C=Number.isFinite(e.height),x=typeof a=="number"&&a!==1;if(!x){let $=u.width/u.height;E&&C?(g=e.width,y=e.height):E?(g=e.width,y=g/$):C&&(y=e.height,g=y*$)}if(g=Math.ceil(g),y=Math.ceil(y),n.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),n.style.transformOrigin="top left",!x&&(E||C)){let $=u.width,D=u.height,gt=g/$,yt=y/D,wt=n.style.transform||"",xt=`scale(${gt}, ${yt})`;n.style.transform=`${xt} ${wt}`.trim()}else x&&H()&&(n.style.scale=`${a}`);let T="http://www.w3.org/2000/svg",R=document.createElementNS(T,"foreignObject");R.setAttribute("width","100%"),R.setAttribute("height","100%");let k=document.createElement("style");k.textContent=f+l+"svg{overflow:visible;}"+i,R.appendChild(k),R.appendChild(n);let q=new XMLSerializer().serializeToString(R);h=`<svg xmlns="${T}" width="${g}" height="${y}" viewBox="0 0 ${g} ${y}">`+q+"</svg>",m=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(h)}`,d()},{fast:r})});let p=document.getElementById("snapdom-sandbox");return p&&p.style.position==="absolute"&&p.remove(),m}async function St(t,{dpr:e=1,scale:o=1}){let s=new Image;return s.src=t,await s.decode(),H?(s.width=s.width*o,s.height=s.height*o):(s.width=s.width/o,s.height=s.height/o),s}async function ut(t,{dpr:e=1,scale:o=1}={}){let s=new Image;s.src=t,await s.decode();let r=document.createElement("canvas"),a=s.width*o,n=s.height*o;r.width=Math.ceil(a*e),r.height=Math.ceil(n*e);let i=r.getContext("2d");return i.scale(e,e),i.drawImage(s,0,0,a,n),r.style.width=`${a}px`,r.style.height=`${n}px`,r}async function ht(t){let e=decodeURIComponent(t.split(",")[1]);return new Blob([e],{type:"image/svg+xml"})}async function pt(t,{dpr:e=1,scale:o=1},s){let r=await ut(t,{dpr:e,scale:o});if(!s)return r;let a=document.createElement("canvas");a.width=r.width,a.height=r.height;let n=a.getContext("2d");return n.fillStyle=s,n.fillRect(0,0,a.width,a.height),n.drawImage(r,0,0),a}async function Z(t,{dpr:e=1,scale:o=1,backgroundColor:s="#fff",quality:r},a="png"){let n=await pt(t,{dpr:e,scale:o},s),i=new Image;return i.src=n.toDataURL(`image/${a}`,r),await i.decode(),i.style.width=`${n.width/e}px`,i.style.height=`${n.height/e}px`,i}async function Et(t,{dpr:e=1,scale:o=1,backgroundColor:s="#fff",format:r="png",filename:a="capture"}={}){if(r==="svg"){let h=await ht(t),p=URL.createObjectURL(h),d=document.createElement("a");d.href=p,d.download=`${a}.svg`,d.click(),URL.revokeObjectURL(p);return}let n=["jpg","jpeg","webp"].includes(r)?"#fff":void 0,c=await pt(t,{dpr:e,scale:o},s??n),l={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[r]||"image/png",f=c.toDataURL(l),m=document.createElement("a");m.href=f,m.download=`${a}.${r}`,m.click()}async function w(t,e={}){if(e={scale:1,...e},!t)throw new Error("Element cannot be null or undefined");return await w.capture(t,e)}w.capture=async(t,e={})=>{let o=await mt(t,e),s=window.devicePixelRatio||1,r=e.scale||1;return{url:o,options:e,toRaw:()=>o,toImg:()=>St(o,{dpr:s,scale:r}),toCanvas:()=>ut(o,{dpr:s,scale:r}),toBlob:()=>ht(o),toPng:a=>Z(o,{dpr:s,scale:r,...a},"png"),toJpg:a=>Z(o,{dpr:s,scale:r,...a},"jpeg"),toWebp:a=>Z(o,{dpr:s,scale:r,...a},"webp"),download:({format:a="png",filename:n="capture",backgroundColor:i}={})=>Et(o,{dpr:s,scale:r,backgroundColor:i,format:a,filename:n})}};w.toRaw=async(t,e)=>(await w.capture(t,e)).toRaw();w.toImg=async(t,e)=>(await w.capture(t,e)).toImg();w.toCanvas=async(t,e)=>(await w.capture(t,e)).toCanvas();w.toBlob=async(t,e)=>(await w.capture(t,e)).toBlob();w.toPng=async(t,e)=>(await w.capture(t,e)).toPng(e);w.toJpg=async(t,e)=>(await w.capture(t,e)).toJpg(e);w.toWebp=async(t,e)=>(await w.capture(t,e)).toWebp(e);w.download=async(t,e={})=>{let{format:o="png",filename:s="capture",backgroundColor:r,...a}=e;return await(await w.capture(t,a)).download({format:o,filename:s,backgroundColor:r})};async function $t(t=document,e={}){let{embedFonts:o=!0,reset:s=!1,crossOrigin:r}=e;if(s){A.clear(),U.clear(),S.clear(),B.clear();return}await document.fonts.ready,tt();let a=[],n=[];t?.querySelectorAll&&(a=Array.from(t.querySelectorAll("img[src]")),n=Array.from(t.querySelectorAll("*")));let i=[];for(let c of a){let l=c.src;if(!A.has(l)){let f=r?r(l):"anonymous";i.push(L(l,3e3,f).then(m=>A.set(l,m)).catch(()=>{}))}}for(let c of n){let l=N(c).backgroundImage;if(l&&l!=="none"){let f=O(l);for(let m of f)m.startsWith("url(")&&i.push(F(m,{crossOrigin:r,skipInline:!0}).catch(()=>{}))}}o&&await X({ignoreIconFonts:!o,preCached:!0}),await Promise.all(i)}export{$t as preCache,w as snapdom};
|