@zumer/snapdom 1.7.1 → 1.9.3
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 +153 -33
- package/dist/snapdom.js +1061 -587
- package/dist/snapdom.min.js +13 -13
- package/dist/snapdom.min.mjs +13 -13
- package/dist/snapdom.mjs +531 -160
- package/package.json +3 -2
- package/types/snapdom.d.ts +6 -2
package/dist/snapdom.min.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
(()=>{var R=new Map,
|
|
2
|
-
`;return o}function J(e){let n=new Set(e.values()),o=new Map,r=1;for(let t of n)o.set(t,`c${r++}`);return o}function L(e,{fast:n=!1}={}){if(n)return e();"requestIdleCallback"in window?requestIdleCallback(e,{timeout:50}):setTimeout(e,1)}function U(e,n=null){if(!(e instanceof Element))return window.getComputedStyle(e,n);let o=N.get(e);if(o||(o=new Map,N.set(e,o)),!o.has(n)){let r=window.getComputedStyle(e,n);o.set(n,r)}return o.get(n)}function X(e){let n=e.replace(/^['"]|['"]$/g,"");if(n.startsWith("\\"))try{return String.fromCharCode(parseInt(n.replace("\\",""),16))}catch{return n}return n}function $(e){let n=e.indexOf("url(");if(n===-1)return null;let o=e.slice(n+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 P(e){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].some(o=>o.test(e))}function S(e,n=3e3,o="anonymous"){return R.has(e)?Promise.resolve(R.get(e)):new Promise((r,t)=>{let a=setTimeout(()=>{t(new Error("Image load timed out"))},n),s=new Image;s.crossOrigin=o,s.onload=async()=>{clearTimeout(a);try{await s.decode();let i=document.createElement("canvas");i.width=s.width,i.height=s.height,i.getContext("2d").drawImage(s,0,0,i.width,i.height);try{let l=i.toDataURL("image/png");R.set(e,l),r(l)}catch{t(new Error("CORS restrictions prevented image capture"))}}catch(i){t(i)}},s.onerror=i=>{clearTimeout(a),t(new Error("Failed to load image: "+(i.message||"Unknown error")))},s.src=e})}function O(e){let n={};for(let o of e)n[o]=e.getPropertyValue(o);return n}function B(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function _(e,n,o,r,t){if(e.tagName==="STYLE")return;r.has(e)||r.set(e,U(e));let a=r.get(e),s=O(a),i=e.tagName?.toLowerCase()||"div",c=M(s,i,t);o.set(n,c)}function D(e,n,o,r,t){if(e.nodeType===Node.ELEMENT_NODE&&e.getAttribute("data-capture")==="exclude"){let i=document.createElement("div"),c=e.getBoundingClientRect();return i.style.cssText=`display: inline-block; width: ${c.width}px; height: ${c.height}px; visibility: hidden;`,i}if(e.tagName==="IFRAME"){let i=document.createElement("div");return i.textContent="",i.style.cssText=`width: ${e.offsetWidth}px; height: ${e.offsetHeight}px; background: 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(e.nodeType===Node.ELEMENT_NODE&&e.getAttribute("data-capture")==="placeholder"){let i=e.cloneNode(!1);r.set(i,e),_(e,i,n,o,t);let c=document.createElement("div");return c.textContent=e.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(e.tagName==="CANVAS"){let i=e.toDataURL(),c=document.createElement("img");return c.src=i,c.width=e.width,c.height=e.height,c.style.display="inline-block",c.style.width=`${e.width}px`,c.style.height=`${e.height}px`,c}if(e.nodeType===Node.TEXT_NODE){if(e.parentElement?.shadowRoot){let i=e.parentElement.tagName.toLowerCase();if(customElements.get(i))return null}return e.cloneNode(!0)}if(e.nodeType!==Node.ELEMENT_NODE)return e.cloneNode(!0);let a=e.cloneNode(!1);r.set(a,e),e instanceof HTMLInputElement?(a.value=e.value,a.setAttribute("value",e.value),e.checked!==void 0&&(a.checked=e.checked,e.checked&&a.setAttribute("checked",""))):e instanceof HTMLTextAreaElement?(a.value=e.value,a.textContent=e.value):e instanceof HTMLSelectElement&&(a.value=e.value,Array.from(a.options).forEach(i=>{i.value===e.value?i.setAttribute("selected",""):i.removeAttribute("selected")})),_(e,a,n,o,t);let s=document.createDocumentFragment();if(e.childNodes.forEach(i=>{let c=D(i,n,o,r,t);c&&s.appendChild(c)}),a.appendChild(s),e.shadowRoot){let i=Array.from(e.shadowRoot.children).filter(l=>l.tagName!=="STYLE").map(l=>D(l,n,o,r)).filter(Boolean),c=document.createDocumentFragment();i.forEach(l=>c.appendChild(l)),a.appendChild(c)}return a}async function G(e,n,o,r=32,t="#000"){n=n.replace(/^['"]+|['"]+$/g,"");let a=window.devicePixelRatio||1,i=document.createElement("canvas").getContext("2d");i.font=o?`${o} ${r}px "${n}"`:`${r}px "${n}"`;let c=i.measureText(e),l=c.actualBoundingBoxAscent||r*.8,d=c.actualBoundingBoxDescent||r*.2,h=l+d,f=c.width,p=document.createElement("canvas");p.width=Math.ceil(f*a),p.height=Math.ceil(h*a);let m=p.getContext("2d");return m.scale(a,a),m.font=i.font,m.textAlign="left",m.textBaseline="alphabetic",m.fillStyle=t,m.fillText(e,0,l),p.toDataURL()}async function W({ignoreIconFonts:e=!0,preCached:n=!1}={}){let o=Array.from(document.querySelectorAll('link[rel="stylesheet"]')).filter(t=>t.href),r="";for(let t of o)try{let s=await(await fetch(t.href)).text();if(e&&(P(t.href)||P(s)))continue;let i=/url\(([^)]+)\)/g,c=await Promise.all(Array.from(s.matchAll(i)).map(async d=>{let h=$(d[0]);if(!h)return null;let f=h;f.startsWith("http")||(f=new URL(f,t.href).href);try{f=encodeURI(f)}catch{console.warn("[snapdom] Failed to encode font URL:",f)}if(e&&P(f))return null;if(x.has(f))return{original:d[0],inlined:`url(${x.get(f)})`};try{let m=await(await fetch(f)).blob(),g=await new Promise(y=>{let C=new FileReader;C.onload=()=>y(C.result),C.readAsDataURL(m)});return x.set(f,g),{original:d[0],inlined:`url(${g})`}}catch{return console.warn("[snapdom] Failed to fetch font:",f),null}})),l=s;for(let d of c)d&&(l=l.replace(d.original,d.inlined));r+=l+`
|
|
3
|
-
`}catch{console.warn("[snapdom] Failed to fetch CSS:",
|
|
4
|
-
font-family: ${a
|
|
5
|
-
src: ${
|
|
6
|
-
font-style: ${
|
|
7
|
-
font-weight: ${
|
|
1
|
+
(()=>{var Fe=Object.defineProperty;var Y=Object.getOwnPropertySymbols;var le=Object.prototype.hasOwnProperty,fe=Object.prototype.propertyIsEnumerable;var ce=(e,t,o)=>t in e?Fe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,D=(e,t)=>{for(var o in t||(t={}))le.call(t,o)&&ce(e,o,t[o]);if(Y)for(var o of Y(t))fe.call(t,o)&&ce(e,o,t[o]);return e};var de=(e,t)=>{var o={};for(var i in e)le.call(e,i)&&t.indexOf(i)<0&&(o[i]=e[i]);if(e!=null&&Y)for(var i of Y(e))t.indexOf(i)<0&&fe.call(e,i)&&(o[i]=e[i]);return o};var p=(e,t,o)=>new Promise((i,s)=>{var n=a=>{try{c(o.next(a))}catch(d){s(d)}},f=a=>{try{c(o.throw(a))}catch(d){s(d)}},c=a=>a.done?i(a.value):Promise.resolve(a.value).then(n,f);c((o=o.apply(e,t)).next())});var R=new Map,M=new Map,v=new Map,W=new Map,j=new Map,Z=new WeakMap,A=new Set;var Be=["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 he(){for(let e of Be)ue(e)}function ue(e){if(W.has(e))return W.get(e);if(new Set(["script","style","meta","link","noscript","template"]).has(e)){let f={};return W.set(e,f),f}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 i=document.createElement(e);i.style.all="initial",o.appendChild(i);let s=getComputedStyle(i),n={};for(let f of s)n[f]=s.getPropertyValue(f);return o.removeChild(i),W.set(e,n),n}function z(e,t,o=!1){let i=[],s=ue(t);for(let[n,f]of Object.entries(e))if(!o)f&&i.push(`${n}:${f}`);else{let c=s[n];f&&f!==c&&i.push(`${n}:${f}`)}return i.sort().join(";")}function me(e){let t=new Set;return e.nodeType!==Node.ELEMENT_NODE&&e.nodeType!==Node.DOCUMENT_FRAGMENT_NODE?[]:(e.tagName&&t.add(e.tagName.toLowerCase()),typeof e.querySelectorAll=="function"&&e.querySelectorAll("*").forEach(o=>t.add(o.tagName.toLowerCase())),Array.from(t))}function pe(e){let t=new Map;for(let i of e){let s=W.get(i);if(!s)continue;let n=Object.entries(s).map(([f,c])=>`${f}:${c};`).sort().join("");t.has(n)||t.set(n,[]),t.get(n).push(i)}let o="";for(let[i,s]of t.entries())o+=`${s.join(",")} { ${i} }
|
|
2
|
+
`;return o}function ge(e){let t=new Set(e.values()),o=new Map,i=1;for(let s of t)o.set(s,`c${i++}`);return o}function O(o){return p(this,arguments,function*(e,t={}){let i=e.startsWith("url("),s=/^((repeating-)?(linear|radial|conic)-gradient)\(/i.test(e);if(i){let n=H(e);if(!n)return e;let f=K(n);if(M.has(f))return t.skipInline?void 0:`url(${M.get(f)})`;{let c=yield F(f,{useProxy:t.useProxy});return M.set(f,c),t.skipInline?void 0:`url("${c}")`}}return e})}function V(e,{fast:t=!1}={}){if(t)return e();"requestIdleCallback"in window?requestIdleCallback(e,{timeout:50}):setTimeout(e,1)}function N(e,t=null){if(!(e instanceof Element))return window.getComputedStyle(e,t);let o=Z.get(e);if(o||(o=new Map,Z.set(e,o)),!o.has(t)){let i=window.getComputedStyle(e,t);o.set(t,i)}return o.get(t)}function ye(e){let t=e.replace(/^['"]|['"]$/g,"");if(t.startsWith("\\"))try{return String.fromCharCode(parseInt(t.replace("\\",""),16))}catch(o){return t}return t}function H(e){let t=e.indexOf("url(");if(t===-1)return null;let o=e.slice(t+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 F(e,{timeout:t=3e3,useProxy:o=""}={}){function i(a){try{return new URL(a,window.location.href).origin===window.location.origin?"use-credentials":"anonymous"}catch(d){return"anonymous"}}function s(a){return p(this,null,function*(){let d=h=>fetch(h,{mode:"cors",credentials:i(h)==="use-credentials"?"include":"omit"}).then(r=>r.blob()).then(r=>new Promise((l,u)=>{let m=new FileReader;m.onloadend=()=>{let w=m.result;if(typeof w!="string"||!w.startsWith("data:image/")){u(new Error("Invalid image data URL"));return}l(w)},m.onerror=()=>u(new Error("FileReader error")),m.readAsDataURL(r)}));try{return yield d(a)}catch(h){if(o&&typeof o=="string"){let r=o.replace(/\/$/,"")+K(a);try{return yield d(r)}catch(l){throw console.error(`[SnapDOM - fetchImage] Proxy fallback failed for: ${a}`),new Error("CORS restrictions prevented image capture (even via proxy)")}}else throw console.error(`[SnapDOM - fetchImage] No valid proxy URL provided for fallback: ${a}`),new Error("Fetch fallback failed and no proxy provided")}})}let n=i(e);return console.log(`[SnapDOM - fetchImage] Start loading image: ${e} with crossOrigin=${n}`),R.has(e)?(console.log(`[SnapDOM - fetchImage] Cache hit for: ${e}`),Promise.resolve(R.get(e))):e.startsWith("data:image/")?(R.set(e,e),Promise.resolve(e)):/\.svg(\?.*)?$/i.test(e)?p(null,null,function*(){try{let d=yield(yield fetch(e,{mode:"cors",credentials:n==="use-credentials"?"include":"omit"})).text(),h=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(d)}`;return R.set(e,h),h}catch(a){return s(e)}}):new Promise((a,d)=>{let h=setTimeout(()=>{console.log(`[SnapDOM - fetchImage] Timeout after ${t}ms for image: ${e}`),d(new Error("Image load timed out"))},t),r=new Image;r.crossOrigin=n,r.onload=()=>p(null,null,function*(){clearTimeout(h);try{yield r.decode();let l=document.createElement("canvas");l.width=r.width,l.height=r.height,l.getContext("2d").drawImage(r,0,0,l.width,l.height);let m=l.toDataURL("image/png");R.set(e,m),a(m)}catch(l){try{let u=yield s(e);R.set(e,u),a(u)}catch(u){d(u)}}}),r.onerror=()=>p(null,null,function*(){clearTimeout(h),console.error(`[SnapDOM - fetchImage] Image failed to load: ${e}`);try{let l=yield s(e);R.set(e,l),a(l)}catch(l){d(l)}}),r.src=e})}function ee(e){let t={};for(let o of e)t[o]=e.getPropertyValue(o);return t}function X(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function we(e){if(!e||e==="none")return"";let t=e.replace(/translate[XY]?\([^)]*\)/g,"");return t=t.replace(/matrix\(([^)]+)\)/g,(o,i)=>{let s=i.split(",").map(n=>n.trim());return s.length!==6?`matrix(${i})`:(s[4]="0",s[5]="0",`matrix(${s.join(", ")})`)}),t=t.replace(/matrix3d\(([^)]+)\)/g,(o,i)=>{let s=i.split(",").map(n=>n.trim());return s.length!==16?`matrix3d(${i})`:(s[12]="0",s[13]="0",`matrix3d(${s.join(", ")})`)}),t.trim().replace(/\s{2,}/g," ")}function K(e){if(/%[0-9A-Fa-f]{2}/.test(e))return e;try{return encodeURI(e)}catch(t){return e}}function _(e){let t=[],o=0,i=0;for(let s=0;s<e.length;s++){let n=e[s];n==="("&&o++,n===")"&&o--,n===","&&o===0&&(t.push(e.slice(i,s).trim()),i=s+1)}return t.push(e.slice(i).trim()),t}var te=new WeakMap,ne=new Map;function De(e){let t={};for(let o=0;o<e.length;o++){let i=e[o],s=e.getPropertyValue(i);(i==="background-image"||i==="content")&&s.includes("url(")&&!s.includes("data:")&&(s="none"),t[i]=s}return t}function oe(e,t,o,i,s){var h;if(e.tagName==="STYLE")return;i.has(e)||i.set(e,N(e));let n=i.get(e);if(!te.has(e)){let r=De(n);te.set(e,r)}let f=te.get(e),c=Object.entries(f).sort(([r],[l])=>r.localeCompare(l)).map(([r,l])=>`${r}:${l}`).join(";");if(ne.has(c)){o.set(t,ne.get(c));return}let a=((h=e.tagName)==null?void 0:h.toLowerCase())||"div",d=z(f,a,s);ne.set(c,d),o.set(t,d)}function G(e,t,o,i,s,n={},f){var h;if(e.nodeType===Node.TEXT_NODE){if((h=e.parentElement)!=null&&h.shadowRoot){let r=e.parentElement.tagName.toLowerCase();if(customElements.get(r))return null}return e.cloneNode(!0)}if(e.nodeType!==Node.ELEMENT_NODE)return e.cloneNode(!0);if(e.getAttribute("data-capture")==="exclude"){let r=document.createElement("div"),l=e.getBoundingClientRect();return r.style.cssText=`display: inline-block; width: ${l.width}px; height: ${l.height}px; visibility: hidden;`,r}if(n.exclude&&Array.isArray(n.exclude)&&n.exclude.length>0)for(let r of n.exclude)try{if(e.matches&&e.matches(r)){let l=document.createElement("div"),u=e.getBoundingClientRect();return l.style.cssText=`display: inline-block; width: ${u.width}px; height: ${u.height}px; visibility: hidden;`,l}}catch(l){console.warn(`Invalid selector in exclude option: ${r}`,l)}if(typeof n.filter=="function")try{if(!n.filter(e,f||e)){let r=document.createElement("div"),l=e.getBoundingClientRect();return r.style.cssText=`display: inline-block; width: ${l.width}px; height: ${l.height}px; visibility: hidden;`,r}}catch(r){console.warn("Error in filter function:",r)}if(e.tagName==="IFRAME"){let r=document.createElement("div");return r.textContent="",r.style.cssText=`width: ${e.offsetWidth}px; height: ${e.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;`,r}if(e.getAttribute("data-capture")==="placeholder"){let r=e.cloneNode(!1);i.set(r,e),oe(e,r,t,o,s);let l=document.createElement("div");return l.textContent=e.getAttribute("data-placeholder-text")||"",l.style.cssText="color: #666;font-size: 12px;text-align: center;line-height: 1.4;padding: 0.5em;box-sizing: border-box;",r.appendChild(l),r}if(e.tagName==="CANVAS"){let r=e.toDataURL(),l=document.createElement("img");return l.src=r,l.width=e.width,l.height=e.height,l.style.display="inline-block",l.style.width=e.style.width||`${e.width}px`,l.style.height=e.style.height||`${e.height}px`,l}let c=e.cloneNode(!1);i.set(c,e),e instanceof HTMLInputElement?(c.value=e.value,c.setAttribute("value",e.value),e.checked!==void 0&&(c.checked=e.checked,e.checked&&c.setAttribute("checked",""))):e instanceof HTMLTextAreaElement?(c.value=e.value,c.textContent=e.value):e instanceof HTMLSelectElement&&(c.value=e.value,Array.from(c.options).forEach(r=>{r.value===e.value?r.setAttribute("selected",""):r.removeAttribute("selected")})),oe(e,c,t,o,s);let a=document.createDocumentFragment(),d=f||e;if(e.childNodes.forEach(r=>{let l=G(r,t,o,i,s,n,d);l&&a.appendChild(l)}),c.appendChild(a),e.shadowRoot){let r=Array.from(e.shadowRoot.children).filter(u=>u.tagName!=="STYLE").map(u=>G(u,t,o,i,s,n,d)).filter(Boolean),l=document.createDocumentFragment();r.forEach(u=>l.appendChild(u)),c.appendChild(l)}return c}var Me=[/font\s*awesome/i,/material\s*icons/i,/ionicons/i,/glyphicons/i,/feather/i,/bootstrap\s*icons/i,/remix\s*icons/i,/heroicons/i,/layui/i,/lucide/i],ae=[];function xe(e){let t=Array.isArray(e)?e:[e];for(let o of t)o instanceof RegExp?ae.push(o):typeof o=="string"?ae.push(new RegExp(o,"i")):console.warn("[snapdom] Ignored invalid iconFont value:",o)}function T(e){let t=typeof e=="string"?e:"",o=[...Me,...ae];for(let i of o)if(i instanceof RegExp&&i.test(t))return!0;return!!(/icon/i.test(t)||/glyph/i.test(t)||/symbols/i.test(t)||/feather/i.test(t)||/fontawesome/i.test(t))}function be(e,t,o,i=32,s="#000"){return p(this,null,function*(){t=t.replace(/^['"]+|['"]+$/g,"");let n=window.devicePixelRatio||1,c=document.createElement("canvas").getContext("2d");c.font=o?`${o} ${i}px "${t}"`:`${i}px "${t}"`;let a=c.measureText(e),d=a.actualBoundingBoxAscent||i*.8,h=a.actualBoundingBoxDescent||i*.2,r=d+h,l=a.width,u=document.createElement("canvas");u.width=Math.ceil(l*n),u.height=Math.ceil(r*n);let m=u.getContext("2d");return m.scale(n,n),m.font=c.font,m.textAlign="left",m.textBaseline="alphabetic",m.fillStyle=s,m.fillText(e,0,d),u.toDataURL()})}function Ce(e){return Array.from(document.styleSheets).some(t=>t.href===e)}function We(e){return new Promise(t=>{if(Ce(e))return t(null);let o=document.createElement("link");o.rel="stylesheet",o.href=e,o.setAttribute("data-snapdom","injected-import"),o.onload=()=>t(o),o.onerror=()=>t(null),document.head.appendChild(o)})}function J(){return p(this,arguments,function*({preCached:e=!1}={}){if(v.has("fonts-embed-css")){if(e){let n=document.createElement("style");n.setAttribute("data-snapdom","embedFonts"),n.textContent=v.get("fonts-embed-css"),document.head.appendChild(n)}return v.get("fonts-embed-css")}let t=/@import\s+url\(["']?([^"')]+)["']?\)/g,o=[];for(let n of document.querySelectorAll("style")){let f=n.textContent||"",c=Array.from(f.matchAll(t));for(let a of c){let d=a[1];T(d)||Ce(d)||o.push(d)}}yield Promise.all(o.map(We));let i=Array.from(document.querySelectorAll('link[rel="stylesheet"]')).filter(n=>n.href),s="";for(let n of i)try{let c=yield(yield fetch(n.href)).text();if(T(n.href)||T(c))continue;let a=/url\((["']?)([^"')]+)\1\)/g,d=yield Promise.all(Array.from(c.matchAll(a)).map(r=>p(null,null,function*(){let l=H(r[0]);if(!l)return null;let u=l;if(!u.startsWith("http")&&!u.startsWith("data:")&&(u=new URL(u,n.href).href),T(u))return null;if(v.has(u))return A.add(u),{original:r[0],inlined:`url(${v.get(u)})`};if(A.has(u))return null;try{let w=yield(yield fetch(u)).blob(),y=yield new Promise(g=>{let x=new FileReader;x.onload=()=>g(x.result),x.readAsDataURL(w)});return v.set(u,y),A.add(u),{original:r[0],inlined:`url(${y})`}}catch(m){return console.warn("[snapdom] Failed to fetch font resource:",u),null}}))),h=c;for(let r of d)r&&(h=h.replace(r.original,r.inlined));s+=h+`
|
|
3
|
+
`}catch(f){console.warn("[snapdom] Failed to fetch CSS:",n.href)}for(let n of document.styleSheets)try{if(!n.href||i.every(f=>f.href!==n.href)){for(let f of n.cssRules)if(f.type===CSSRule.FONT_FACE_RULE){let c=f.style.getPropertyValue("src"),a=f.style.getPropertyValue("font-family");if(!c||T(a))continue;let d=/url\((["']?)([^"')]+)\1\)/g,h=c,r=Array.from(c.matchAll(d));for(let l of r){let u=l[2].trim();if(!u)continue;let m=u;if(!m.startsWith("http")&&!m.startsWith("data:")&&(m=new URL(m,n.href||location.href).href),!T(m)){if(v.has(m)){A.add(m),h=h.replace(l[0],`url(${v.get(m)})`);continue}if(!A.has(m))try{let y=yield(yield fetch(m)).blob(),g=yield new Promise(x=>{let b=new FileReader;b.onload=()=>x(b.result),b.readAsDataURL(y)});v.set(m,g),A.add(m),h=h.replace(l[0],`url(${g})`)}catch(w){console.warn("[snapdom] Failed to fetch font URL:",m)}}}s+=`@font-face {
|
|
4
|
+
font-family: ${a};
|
|
5
|
+
src: ${h};
|
|
6
|
+
font-style: ${f.style.getPropertyValue("font-style")||"normal"};
|
|
7
|
+
font-weight: ${f.style.getPropertyValue("font-weight")||"normal"};
|
|
8
8
|
}
|
|
9
|
-
`}}}catch(
|
|
10
|
-
font-family: '${
|
|
11
|
-
src: url(${
|
|
12
|
-
font-style: ${
|
|
13
|
-
font-weight: ${
|
|
9
|
+
`}}}catch(f){console.warn("[snapdom] Cannot access stylesheet",n.href,f)}for(let n of document.fonts)if(n.family&&n.status==="loaded"&&n._snapdomSrc){if(T(n.family))continue;let f=n._snapdomSrc;if(!f.startsWith("data:")){if(v.has(n._snapdomSrc))f=v.get(n._snapdomSrc),A.add(n._snapdomSrc);else if(!A.has(n._snapdomSrc))try{let a=yield(yield fetch(n._snapdomSrc)).blob();f=yield new Promise(d=>{let h=new FileReader;h.onload=()=>d(h.result),h.readAsDataURL(a)}),v.set(n._snapdomSrc,f),A.add(n._snapdomSrc)}catch(c){console.warn("[snapdom] Failed to fetch dynamic font src:",n._snapdomSrc);continue}}s+=`@font-face {
|
|
10
|
+
font-family: '${n.family}';
|
|
11
|
+
src: url(${f});
|
|
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"),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(s&&(v.set("fonts-embed-css",s),e)){let n=document.createElement("style");n.setAttribute("data-snapdom","embedFonts"),n.textContent=s,document.head.appendChild(n)}return s})}function re(e,t,o,i,s,n=!1,f){return p(this,null,function*(){if(!(e instanceof Element)||!(t instanceof Element))return;for(let d of["::before","::after","::first-letter"])try{let h=N(e,d);if(!h||typeof h[Symbol.iterator]!="function")continue;if(d==="::first-letter"){let g=getComputedStyle(e);if(!(h.color!==g.color||h.fontSize!==g.fontSize||h.fontWeight!==g.fontWeight))continue;let b=Array.from(t.childNodes).find(E=>E.nodeType===Node.TEXT_NODE&&E.textContent&&E.textContent.trim().length>0);if(!b)continue;let P=b.textContent,C=P.match(/^([^\p{L}\p{N}\s]*[\p{L}\p{N}](?:['’])?)/u),I=C==null?void 0:C[0],B=P.slice((I==null?void 0:I.length)||0);if(!I||/[\uD800-\uDFFF]/.test(I))continue;let $=document.createElement("span");$.textContent=I,$.dataset.snapdomPseudo="::first-letter";let k=ee(h),Q=z(k,"span",s);o.set($,Q);let q=document.createTextNode(B);t.replaceChild(q,b),t.insertBefore($,q);continue}let r=h.getPropertyValue("content"),l=h.getPropertyValue("background-image"),u=h.getPropertyValue("background-color"),m=r!=="none",w=l&&l!=="none",y=u&&u!=="transparent"&&u!=="rgba(0, 0, 0, 0)";if(m||w||y){let g=h.getPropertyValue("font-family"),x=parseInt(h.getPropertyValue("font-size"))||32,b=parseInt(h.getPropertyValue("font-weight"))||!1,P=h.getPropertyValue("color")||"#000",C=document.createElement("span");C.dataset.snapdomPseudo=d;let I=ee(h),B=z(I,"span",s);o.set(C,B);let $=T(g),k=ye(r);if($&&k.length===1){let E=document.createElement("img");E.src=yield be(k,g,b,x,P),E.style=`width:${x}px;height:auto;object-fit:contain;`,C.appendChild(E)}else if(k.startsWith("url(")){let E=H(k);if(E&&E.trim()!=="")try{let L=document.createElement("img"),U=yield F(K(E,{useProxy:f}));L.src=U,L.style=`width:${x}px;height:auto;object-fit:contain;`,C.appendChild(L)}catch(L){console.error(`[snapdom] Error in pseudo ${d} for`,e,L)}}else!$&&k&&k!=="none"&&(C.textContent=k);if(w)try{let E=_(l),L=yield Promise.all(E.map(U=>O(U)));C.style.backgroundImage=L.join(", ")}catch(E){console.warn(`[snapdom] Failed to inline background-image for ${d}`,E)}if(y&&(C.style.backgroundColor=u),!(C.childNodes.length>0||C.textContent&&C.textContent.trim()!==""||w||y))continue;d==="::before"?t.insertBefore(C,t.firstChild):t.appendChild(C)}}catch(h){console.warn(`[snapdom] Failed to capture ${d} for`,e,h)}let c=Array.from(e.children),a=Array.from(t.children).filter(d=>!d.dataset.snapdomPseudo);for(let d=0;d<Math.min(c.length,a.length);d++)yield re(c[d],a[d],o,i,s,n,f)})}function Se(e){if(!e)return;let t=document.querySelectorAll("svg > defs");t.length&&e.querySelectorAll("svg").forEach(o=>{let i=o.querySelectorAll("use");if(!i.length)return;let s=new Set;if(i.forEach(f=>{let c=f.getAttribute("xlink:href")||f.getAttribute("href");c&&c.startsWith("#")&&s.add(c.slice(1))}),!s.size)return;let n=document.createElementNS("http://www.w3.org/2000/svg","defs");for(let f of s)for(let c of t){let a=c.querySelector(`#${CSS.escape(f)}`);if(a){n.appendChild(a.cloneNode(!0));break}}n.childNodes.length&&o.insertBefore(n,o.firstChild)})}function Ee(s){return p(this,arguments,function*(e,t=!1,o=!1,i={}){var h;let n=new Map,f=new WeakMap,c=new Map,a;try{a=G(e,n,f,c,t,i,e)}catch(r){throw console.warn("deepClone failed:",r),r}try{yield re(e,a,n,f,t,o,i.useProxy)}catch(r){console.warn("inlinePseudoElements failed:",r)}try{Se(a)}catch(r){console.warn("inlineExternalDef failed:",r)}let d="";if(t){let r=ge(n);d=Array.from(r.entries()).map(([l,u])=>`.${u}{${l}}`).join("");for(let[l,u]of n.entries()){if(l.tagName==="STYLE")continue;let m=r.get(u);m&&l.classList.add(m);let w=(h=l.style)==null?void 0:h.backgroundImage;l.removeAttribute("style"),w&&w!=="none"&&(l.style.backgroundImage=w)}}else for(let[r,l]of n.entries())r.tagName!=="STYLE"&&r.setAttribute("style",l.replace(/;/g,"; "));for(let[r,l]of c.entries()){let u=l.scrollLeft,m=l.scrollTop;if((u||m)&&r instanceof HTMLElement){r.style.overflow="hidden",r.style.scrollbarWidth="none",r.style.msOverflowStyle="none";let y=document.createElement("div");for(y.style.transform=`translate(${-u}px, ${-m}px)`,y.style.willChange="transform",y.style.display="inline-block",y.style.width="100%";r.firstChild;)y.appendChild(r.firstChild);r.appendChild(y)}}if(e===c.get(a)){let r=f.get(e)||window.getComputedStyle(e);f.set(e,r);let l=we(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=l||""}for(let[r,l]of c.entries())l.tagName==="PRE"&&(r.style.marginTop="0",r.style.marginBlockStart="0");return{clone:a,classCSS:d,styleCache:f}})}function ve(o){return p(this,arguments,function*(e,t={}){let i=Array.from(e.querySelectorAll("img")),s=n=>p(null,null,function*(){let f=n.src;try{let c=yield F(f,{useProxy:t.useProxy});n.src=c,n.width||(n.width=n.naturalWidth||100),n.height||(n.height=n.naturalHeight||100)}catch(c){let a=document.createElement("div");a.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;`,a.innerText="img",n.replaceWith(a)}});for(let n=0;n<i.length;n+=4){let f=i.slice(n,n+4).map(s);yield Promise.allSettled(f)}})}function $e(s,n,f){return p(this,arguments,function*(e,t,o,i={}){let c=[[e,t]];for(;c.length;){let[a,d]=c.shift(),h=o.get(a)||N(a);o.has(a)||o.set(a,h);let r=h.getPropertyValue("background-image"),l=h.getPropertyValue("background-color");if(!r||r==="none"){let g=Array.from(a.children),x=Array.from(d.children);for(let b=0;b<Math.min(g.length,x.length);b++)c.push([g[b],x[b]]);continue}let u=_(r),m=yield Promise.all(u.map(g=>O(g,i)));m.some(g=>g&&g!=="none"&&!/^url\(undefined\)/.test(g))&&(d.style.backgroundImage=m.join(", ")),l&&l!=="transparent"&&l!=="rgba(0, 0, 0, 0)"&&(d.style.backgroundColor=l);let w=Array.from(a.children),y=Array.from(d.children);for(let g=0;g<Math.min(w.length,y.length);g++)c.push([w[g],y[g]])}})}function Ie(o){return p(this,arguments,function*(e,t={}){if(!e)throw new Error("Element cannot be null or undefined");let{compress:i=!0,embedFonts:s=!1,fast:n=!0,scale:f=1,useProxy:c=""}=t,a,d,h,r="",l="",u,m;if({clone:a,classCSS:d,styleCache:h}=yield Ee(e,i,s,t),yield new Promise(y=>{V(()=>p(null,null,function*(){yield ve(a,t),y()}),{fast:n})}),yield new Promise(y=>{V(()=>p(null,null,function*(){yield $e(e,a,h,t),y()}),{fast:n})}),s&&(yield new Promise(y=>{V(()=>p(null,null,function*(){r=yield J(),y()}),{fast:n})})),i){let y=me(a).sort(),g=y.join(",");j.has(g)?l=j.get(g):yield new Promise(x=>{V(()=>{l=pe(y),j.set(g,l),x()},{fast:n})})}yield new Promise(y=>{V(()=>{let g=e.getBoundingClientRect(),x=g.width,b=g.height,P=Number.isFinite(t.width),C=Number.isFinite(t.height),I=typeof f=="number"&&f!==1;if(!I){let U=g.width/g.height;P&&C?(x=t.width,b=t.height):P?(x=t.width,b=x/U):C&&(b=t.height,x=b*U)}if(x=Math.ceil(x),b=Math.ceil(b),a.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),a.style.transformOrigin="top left",!I&&(P||C)){let U=g.width,Te=g.height,Pe=x/U,Le=b/Te,Ue=a.style.transform||"",Ne=`scale(${Pe}, ${Le})`;a.style.transform=`${Ne} ${Ue}`.trim()}else I&&X()&&(a.style.scale=`${f}`);let B="http://www.w3.org/2000/svg",$=document.createElementNS(B,"foreignObject");$.setAttribute("width","100%"),$.setAttribute("height","100%");let k=document.createElement("style");k.textContent=l+r+"svg{overflow:visible;}"+d,$.appendChild(k),$.appendChild(a);let q=new XMLSerializer().serializeToString($);m=`<svg xmlns="${B}" width="${x}" height="${b}" viewBox="0 0 ${x} ${b}">`+q+"</svg>",u=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(m)}`,y()},{fast:n})});let w=document.getElementById("snapdom-sandbox");return w&&w.style.position==="absolute"&&w.remove(),u})}function je(i,s){return p(this,arguments,function*(e,{dpr:t=1,scale:o=1}){let n=new Image;return n.src=e,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 ke(i){return p(this,arguments,function*(e,{dpr:t=1,scale:o=1}={}){let s=new Image;s.src=e,yield s.decode();let n=document.createElement("canvas"),f=s.width*o,c=s.height*o;n.width=Math.ceil(f*t),n.height=Math.ceil(c*t);let a=n.getContext("2d");return a.scale(t,t),a.drawImage(s,0,0,f,c),n.style.width=`${f}px`,n.style.height=`${c}px`,n})}function Re(n){return p(this,arguments,function*(e,{type:t="svg",scale:o=1,backgroundColor:i="#fff",quality:s}={}){let f={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[t]||"image/png";if(t==="svg"){let a=decodeURIComponent(e.split(",")[1]);return new Blob([a],{type:"image/svg+xml"})}let c=yield ie(e,{dpr:1,scale:o},i);return new Promise(a=>{c.toBlob(d=>a(d),`${f}`,s)})})}function ie(s,n,f){return p(this,arguments,function*(e,{dpr:t=1,scale:o=1},i){let c=yield ke(e,{dpr:t,scale:o});if(!i)return c;let a=document.createElement("canvas");a.width=c.width,a.height=c.height;let d=a.getContext("2d");return d.fillStyle=i,d.fillRect(0,0,a.width,a.height),d.drawImage(c,0,0),a})}function se(f,c){return p(this,arguments,function*(e,{dpr:t=1,scale:o=1,backgroundColor:i="#fff",quality:s},n="png"){let a=yield ie(e,{dpr:t,scale:o},i),d=new Image;return d.src=a.toDataURL(`image/${n}`,s),yield d.decode(),d.style.width=`${a.width/t}px`,d.style.height=`${a.height/t}px`,d})}function Oe(f){return p(this,arguments,function*(e,{dpr:t=1,scale:o=1,backgroundColor:i="#fff",format:s="png",filename:n="capture"}={}){if(s==="svg"){let u=yield Re(e),m=URL.createObjectURL(u),w=document.createElement("a");w.href=m,w.download=`${n}.svg`,w.click(),URL.revokeObjectURL(m);return}let c=["jpg","jpeg","webp"].includes(s)?"#fff":void 0,a=i!=null?i:c,d=yield ie(e,{dpr:t,scale:o},a),h={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[s]||"image/png",r=d.toDataURL(h),l=document.createElement("a");l.href=r,l.download=`${n}.${s}`,l.click()})}function S(o){return p(this,arguments,function*(e,t={}){if(t=D({scale:1},t),!e)throw new Error("Element cannot be null or undefined");return t.iconFonts&&xe(t.iconFonts),yield S.capture(e,t)})}S.capture=(o,...i)=>p(null,[o,...i],function*(e,t={}){let s=yield Ie(e,t),n=window.devicePixelRatio||1,f=t.scale||1;return{url:s,options:t,toRaw:()=>s,toImg:()=>je(s,{dpr:n,scale:f}),toCanvas:()=>ke(s,{dpr:n,scale:f}),toBlob:c=>Re(s,D({dpr:n,scale:f},c)),toPng:c=>se(s,D({dpr:n,scale:f},c),"png"),toJpg:c=>se(s,D({dpr:n,scale:f},c),"jpeg"),toWebp:c=>se(s,D({dpr:n,scale:f},c),"webp"),download:({format:c="png",filename:a="capture",backgroundColor:d}={})=>Oe(s,{dpr:n,scale:f,backgroundColor:d,format:c,filename:a})}});S.toRaw=(e,t)=>p(null,null,function*(){return(yield S.capture(e,t)).toRaw()});S.toImg=(e,t)=>p(null,null,function*(){return(yield S.capture(e,t)).toImg()});S.toCanvas=(e,t)=>p(null,null,function*(){return(yield S.capture(e,t)).toCanvas()});S.toBlob=(e,t)=>p(null,null,function*(){return(yield S.capture(e,t)).toBlob(t)});S.toPng=(e,t)=>p(null,null,function*(){return(yield S.capture(e,t)).toPng(t)});S.toJpg=(e,t)=>p(null,null,function*(){return(yield S.capture(e,t)).toJpg(t)});S.toWebp=(e,t)=>p(null,null,function*(){return(yield S.capture(e,t)).toWebp(t)});S.download=(o,...i)=>p(null,[o,...i],function*(e,t={}){let d=t,{format:s="png",filename:n="capture",backgroundColor:f}=d,c=de(d,["format","filename","backgroundColor"]);return yield(yield S.capture(e,c)).download({format:s,filename:n,backgroundColor:f})});function Ae(){return p(this,arguments,function*(e=document,t={}){let{embedFonts:o=!0,reset:i=!1}=t;if(i){R.clear(),M.clear(),v.clear(),j.clear();return}yield document.fonts.ready,he();let s=[],n=[];e!=null&&e.querySelectorAll&&(s=Array.from(e.querySelectorAll("img[src]")),n=Array.from(e.querySelectorAll("*")));let f=[];for(let c of s){let a=c.src;R.has(a)||f.push(F(a,{useProxy:t.useProxy}).then(d=>R.set(a,d)).catch(()=>{}))}for(let c of n){let a=N(c).backgroundImage;if(a&&a!=="none"){let d=_(a);for(let h of d)h.startsWith("url(")&&f.push(O(h,t).catch(()=>{}))}}o&&(yield J({preCached:!0})),yield Promise.all(f)})}window.snapdom=S;window.preCache=Ae;})();
|
package/dist/snapdom.min.mjs
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
var
|
|
2
|
-
`;return o}function J(e){let n=new Set(e.values()),o=new Map,r=1;for(let t of n)o.set(t,`c${r++}`);return o}function L(e,{fast:n=!1}={}){if(n)return e();"requestIdleCallback"in window?requestIdleCallback(e,{timeout:50}):setTimeout(e,1)}function U(e,n=null){if(!(e instanceof Element))return window.getComputedStyle(e,n);let o=N.get(e);if(o||(o=new Map,N.set(e,o)),!o.has(n)){let r=window.getComputedStyle(e,n);o.set(n,r)}return o.get(n)}function X(e){let n=e.replace(/^['"]|['"]$/g,"");if(n.startsWith("\\"))try{return String.fromCharCode(parseInt(n.replace("\\",""),16))}catch{return n}return n}function $(e){let n=e.indexOf("url(");if(n===-1)return null;let o=e.slice(n+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 P(e){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].some(o=>o.test(e))}function S(e,n=3e3,o="anonymous"){return R.has(e)?Promise.resolve(R.get(e)):new Promise((r,t)=>{let a=setTimeout(()=>{t(new Error("Image load timed out"))},n),s=new Image;s.crossOrigin=o,s.onload=async()=>{clearTimeout(a);try{await s.decode();let i=document.createElement("canvas");i.width=s.width,i.height=s.height,i.getContext("2d").drawImage(s,0,0,i.width,i.height);try{let l=i.toDataURL("image/png");R.set(e,l),r(l)}catch{t(new Error("CORS restrictions prevented image capture"))}}catch(i){t(i)}},s.onerror=i=>{clearTimeout(a),t(new Error("Failed to load image: "+(i.message||"Unknown error")))},s.src=e})}function O(e){let n={};for(let o of e)n[o]=e.getPropertyValue(o);return n}function B(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function _(e,n,o,r,t){if(e.tagName==="STYLE")return;r.has(e)||r.set(e,U(e));let a=r.get(e),s=O(a),i=e.tagName?.toLowerCase()||"div",c=M(s,i,t);o.set(n,c)}function D(e,n,o,r,t){if(e.nodeType===Node.ELEMENT_NODE&&e.getAttribute("data-capture")==="exclude"){let i=document.createElement("div"),c=e.getBoundingClientRect();return i.style.cssText=`display: inline-block; width: ${c.width}px; height: ${c.height}px; visibility: hidden;`,i}if(e.tagName==="IFRAME"){let i=document.createElement("div");return i.textContent="",i.style.cssText=`width: ${e.offsetWidth}px; height: ${e.offsetHeight}px; background: 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(e.nodeType===Node.ELEMENT_NODE&&e.getAttribute("data-capture")==="placeholder"){let i=e.cloneNode(!1);r.set(i,e),_(e,i,n,o,t);let c=document.createElement("div");return c.textContent=e.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(e.tagName==="CANVAS"){let i=e.toDataURL(),c=document.createElement("img");return c.src=i,c.width=e.width,c.height=e.height,c.style.display="inline-block",c.style.width=`${e.width}px`,c.style.height=`${e.height}px`,c}if(e.nodeType===Node.TEXT_NODE){if(e.parentElement?.shadowRoot){let i=e.parentElement.tagName.toLowerCase();if(customElements.get(i))return null}return e.cloneNode(!0)}if(e.nodeType!==Node.ELEMENT_NODE)return e.cloneNode(!0);let a=e.cloneNode(!1);r.set(a,e),e instanceof HTMLInputElement?(a.value=e.value,a.setAttribute("value",e.value),e.checked!==void 0&&(a.checked=e.checked,e.checked&&a.setAttribute("checked",""))):e instanceof HTMLTextAreaElement?(a.value=e.value,a.textContent=e.value):e instanceof HTMLSelectElement&&(a.value=e.value,Array.from(a.options).forEach(i=>{i.value===e.value?i.setAttribute("selected",""):i.removeAttribute("selected")})),_(e,a,n,o,t);let s=document.createDocumentFragment();if(e.childNodes.forEach(i=>{let c=D(i,n,o,r,t);c&&s.appendChild(c)}),a.appendChild(s),e.shadowRoot){let i=Array.from(e.shadowRoot.children).filter(l=>l.tagName!=="STYLE").map(l=>D(l,n,o,r)).filter(Boolean),c=document.createDocumentFragment();i.forEach(l=>c.appendChild(l)),a.appendChild(c)}return a}async function G(e,n,o,r=32,t="#000"){n=n.replace(/^['"]+|['"]+$/g,"");let a=window.devicePixelRatio||1,i=document.createElement("canvas").getContext("2d");i.font=o?`${o} ${r}px "${n}"`:`${r}px "${n}"`;let c=i.measureText(e),l=c.actualBoundingBoxAscent||r*.8,d=c.actualBoundingBoxDescent||r*.2,h=l+d,f=c.width,p=document.createElement("canvas");p.width=Math.ceil(f*a),p.height=Math.ceil(h*a);let m=p.getContext("2d");return m.scale(a,a),m.font=i.font,m.textAlign="left",m.textBaseline="alphabetic",m.fillStyle=t,m.fillText(e,0,l),p.toDataURL()}async function W({ignoreIconFonts:e=!0,preCached:n=!1}={}){let o=Array.from(document.querySelectorAll('link[rel="stylesheet"]')).filter(t=>t.href),r="";for(let t of o)try{let s=await(await fetch(t.href)).text();if(e&&(P(t.href)||P(s)))continue;let i=/url\(([^)]+)\)/g,c=await Promise.all(Array.from(s.matchAll(i)).map(async d=>{let h=$(d[0]);if(!h)return null;let f=h;f.startsWith("http")||(f=new URL(f,t.href).href);try{f=encodeURI(f)}catch{console.warn("[snapdom] Failed to encode font URL:",f)}if(e&&P(f))return null;if(C.has(f))return{original:d[0],inlined:`url(${C.get(f)})`};try{let m=await(await fetch(f)).blob(),u=await new Promise(y=>{let x=new FileReader;x.onload=()=>y(x.result),x.readAsDataURL(m)});return C.set(f,u),{original:d[0],inlined:`url(${u})`}}catch{return console.warn("[snapdom] Failed to fetch font:",f),null}})),l=s;for(let d of c)d&&(l=l.replace(d.original,d.inlined));r+=l+`
|
|
3
|
-
`}catch{console.warn("[snapdom] Failed to fetch CSS:",
|
|
4
|
-
font-family: ${
|
|
5
|
-
src: ${
|
|
6
|
-
font-style: ${
|
|
7
|
-
font-weight: ${
|
|
1
|
+
var $=new Map,F=new Map,S=new Map,B=new Map,D=new Map,G=new WeakMap,R=new Set;var It=["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 rt(){for(let t of It)st(t)}function st(t){if(B.has(t))return B.get(t);if(new Set(["script","style","meta","link","noscript","template"]).has(t)){let c={};return B.set(t,c),c}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 r=document.createElement(t);r.style.all="initial",o.appendChild(r);let a=getComputedStyle(r),n={};for(let c of a)n[c]=a.getPropertyValue(c);return o.removeChild(r),B.set(t,n),n}function V(t,e,o=!1){let r=[],a=st(e);for(let[n,c]of Object.entries(t))if(!o)c&&r.push(`${n}:${c}`);else{let i=a[n];c&&c!==i&&r.push(`${n}:${c}`)}return r.sort().join(";")}function it(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 ct(t){let e=new Map;for(let r of t){let a=B.get(r);if(!a)continue;let n=Object.entries(a).map(([c,i])=>`${c}:${i};`).sort().join("");e.has(n)||e.set(n,[]),e.get(n).push(r)}let o="";for(let[r,a]of e.entries())o+=`${a.join(",")} { ${r} }
|
|
2
|
+
`;return o}function lt(t){let e=new Set(t.values()),o=new Map,r=1;for(let a of e)o.set(a,`c${r++}`);return o}async function M(t,e={}){let o=t.startsWith("url("),r=/^((repeating-)?(linear|radial|conic)-gradient)\(/i.test(t);if(o){let a=_(t);if(!a)return t;let n=Y(a);if(F.has(n))return e.skipInline?void 0:`url(${F.get(n)})`;{let c=await N(n,{useProxy:e.useProxy});return F.set(n,c),e.skipInline?void 0:`url("${c}")`}}return t}function W(t,{fast:e=!1}={}){if(e)return t();"requestIdleCallback"in window?requestIdleCallback(t,{timeout:50}):setTimeout(t,1)}function U(t,e=null){if(!(t instanceof Element))return window.getComputedStyle(t,e);let o=G.get(t);if(o||(o=new Map,G.set(t,o)),!o.has(e)){let r=window.getComputedStyle(t,e);o.set(e,r)}return o.get(e)}function ft(t){let e=t.replace(/^['"]|['"]$/g,"");if(e.startsWith("\\"))try{return String.fromCharCode(parseInt(e.replace("\\",""),16))}catch{return e}return e}function _(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 N(t,{timeout:e=3e3,useProxy:o=""}={}){function r(h){try{return new URL(h,window.location.href).origin===window.location.origin?"use-credentials":"anonymous"}catch{return"anonymous"}}async function a(h){let l=s=>fetch(s,{mode:"cors",credentials:r(s)==="use-credentials"?"include":"omit"}).then(f=>f.blob()).then(f=>new Promise((u,m)=>{let d=new FileReader;d.onloadend=()=>{let g=d.result;if(typeof g!="string"||!g.startsWith("data:image/")){m(new Error("Invalid image data URL"));return}u(g)},d.onerror=()=>m(new Error("FileReader error")),d.readAsDataURL(f)}));try{return await l(h)}catch{if(o&&typeof o=="string"){let f=o.replace(/\/$/,"")+Y(h);try{return await l(f)}catch{throw console.error(`[SnapDOM - fetchImage] Proxy fallback failed for: ${h}`),new Error("CORS restrictions prevented image capture (even via proxy)")}}else throw console.error(`[SnapDOM - fetchImage] No valid proxy URL provided for fallback: ${h}`),new Error("Fetch fallback failed and no proxy provided")}}let n=r(t);return console.log(`[SnapDOM - fetchImage] Start loading image: ${t} with crossOrigin=${n}`),$.has(t)?(console.log(`[SnapDOM - fetchImage] Cache hit for: ${t}`),Promise.resolve($.get(t))):t.startsWith("data:image/")?($.set(t,t),Promise.resolve(t)):/\.svg(\?.*)?$/i.test(t)?(async()=>{try{let l=await(await fetch(t,{mode:"cors",credentials:n==="use-credentials"?"include":"omit"})).text(),s=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(l)}`;return $.set(t,s),s}catch{return a(t)}})():new Promise((h,l)=>{let s=setTimeout(()=>{console.log(`[SnapDOM - fetchImage] Timeout after ${e}ms for image: ${t}`),l(new Error("Image load timed out"))},e),f=new Image;f.crossOrigin=n,f.onload=async()=>{clearTimeout(s);try{await f.decode();let u=document.createElement("canvas");u.width=f.width,u.height=f.height,u.getContext("2d").drawImage(f,0,0,u.width,u.height);let d=u.toDataURL("image/png");$.set(t,d),h(d)}catch{try{let u=await a(t);$.set(t,u),h(u)}catch(u){l(u)}}},f.onerror=async()=>{clearTimeout(s),console.error(`[SnapDOM - fetchImage] Image failed to load: ${t}`);try{let u=await a(t);$.set(t,u),h(u)}catch(u){l(u)}},f.src=t})}function J(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 dt(t){if(!t||t==="none")return"";let e=t.replace(/translate[XY]?\([^)]*\)/g,"");return e=e.replace(/matrix\(([^)]+)\)/g,(o,r)=>{let a=r.split(",").map(n=>n.trim());return a.length!==6?`matrix(${r})`:(a[4]="0",a[5]="0",`matrix(${a.join(", ")})`)}),e=e.replace(/matrix3d\(([^)]+)\)/g,(o,r)=>{let a=r.split(",").map(n=>n.trim());return a.length!==16?`matrix3d(${r})`:(a[12]="0",a[13]="0",`matrix3d(${a.join(", ")})`)}),e.trim().replace(/\s{2,}/g," ")}function Y(t){if(/%[0-9A-Fa-f]{2}/.test(t))return t;try{return encodeURI(t)}catch{return t}}function j(t){let e=[],o=0,r=0;for(let a=0;a<t.length;a++){let n=t[a];n==="("&&o++,n===")"&&o--,n===","&&o===0&&(e.push(t.slice(r,a).trim()),r=a+1)}return e.push(t.slice(r).trim()),e}var Q=new WeakMap,Z=new Map;function kt(t){let e={};for(let o=0;o<t.length;o++){let r=t[o],a=t.getPropertyValue(r);(r==="background-image"||r==="content")&&a.includes("url(")&&!a.includes("data:")&&(a="none"),e[r]=a}return e}function tt(t,e,o,r,a){if(t.tagName==="STYLE")return;r.has(t)||r.set(t,U(t));let n=r.get(t);if(!Q.has(t)){let s=kt(n);Q.set(t,s)}let c=Q.get(t),i=Object.entries(c).sort(([s],[f])=>s.localeCompare(f)).map(([s,f])=>`${s}:${f}`).join(";");if(Z.has(i)){o.set(e,Z.get(i));return}let h=t.tagName?.toLowerCase()||"div",l=V(c,h,a);Z.set(i,l),o.set(e,l)}function X(t,e,o,r,a,n={},c){if(t.nodeType===Node.TEXT_NODE){if(t.parentElement?.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);if(t.getAttribute("data-capture")==="exclude"){let s=document.createElement("div"),f=t.getBoundingClientRect();return s.style.cssText=`display: inline-block; width: ${f.width}px; height: ${f.height}px; visibility: hidden;`,s}if(n.exclude&&Array.isArray(n.exclude)&&n.exclude.length>0)for(let s of n.exclude)try{if(t.matches&&t.matches(s)){let f=document.createElement("div"),u=t.getBoundingClientRect();return f.style.cssText=`display: inline-block; width: ${u.width}px; height: ${u.height}px; visibility: hidden;`,f}}catch(f){console.warn(`Invalid selector in exclude option: ${s}`,f)}if(typeof n.filter=="function")try{if(!n.filter(t,c||t)){let s=document.createElement("div"),f=t.getBoundingClientRect();return s.style.cssText=`display: inline-block; width: ${f.width}px; height: ${f.height}px; visibility: hidden;`,s}}catch(s){console.warn("Error in filter function:",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.getAttribute("data-capture")==="placeholder"){let s=t.cloneNode(!1);r.set(s,t),tt(t,s,e,o,a);let f=document.createElement("div");return f.textContent=t.getAttribute("data-placeholder-text")||"",f.style.cssText="color: #666;font-size: 12px;text-align: center;line-height: 1.4;padding: 0.5em;box-sizing: border-box;",s.appendChild(f),s}if(t.tagName==="CANVAS"){let s=t.toDataURL(),f=document.createElement("img");return f.src=s,f.width=t.width,f.height=t.height,f.style.display="inline-block",f.style.width=t.style.width||`${t.width}px`,f.style.height=t.style.height||`${t.height}px`,f}let i=t.cloneNode(!1);r.set(i,t),t instanceof HTMLInputElement?(i.value=t.value,i.setAttribute("value",t.value),t.checked!==void 0&&(i.checked=t.checked,t.checked&&i.setAttribute("checked",""))):t instanceof HTMLTextAreaElement?(i.value=t.value,i.textContent=t.value):t instanceof HTMLSelectElement&&(i.value=t.value,Array.from(i.options).forEach(s=>{s.value===t.value?s.setAttribute("selected",""):s.removeAttribute("selected")})),tt(t,i,e,o,a);let h=document.createDocumentFragment(),l=c||t;if(t.childNodes.forEach(s=>{let f=X(s,e,o,r,a,n,l);f&&h.appendChild(f)}),i.appendChild(h),t.shadowRoot){let s=Array.from(t.shadowRoot.children).filter(u=>u.tagName!=="STYLE").map(u=>X(u,e,o,r,a,n,l)).filter(Boolean),f=document.createDocumentFragment();s.forEach(u=>f.appendChild(u)),i.appendChild(f)}return i}var Rt=[/font\s*awesome/i,/material\s*icons/i,/ionicons/i,/glyphicons/i,/feather/i,/bootstrap\s*icons/i,/remix\s*icons/i,/heroicons/i,/layui/i,/lucide/i],et=[];function ht(t){let e=Array.isArray(t)?t:[t];for(let o of e)o instanceof RegExp?et.push(o):typeof o=="string"?et.push(new RegExp(o,"i")):console.warn("[snapdom] Ignored invalid iconFont value:",o)}function A(t){let e=typeof t=="string"?t:"",o=[...Rt,...et];for(let r of o)if(r instanceof RegExp&&r.test(e))return!0;return!!(/icon/i.test(e)||/glyph/i.test(e)||/symbols/i.test(e)||/feather/i.test(e)||/fontawesome/i.test(e))}async function ut(t,e,o,r=32,a="#000"){e=e.replace(/^['"]+|['"]+$/g,"");let n=window.devicePixelRatio||1,i=document.createElement("canvas").getContext("2d");i.font=o?`${o} ${r}px "${e}"`:`${r}px "${e}"`;let h=i.measureText(t),l=h.actualBoundingBoxAscent||r*.8,s=h.actualBoundingBoxDescent||r*.2,f=l+s,u=h.width,m=document.createElement("canvas");m.width=Math.ceil(u*n),m.height=Math.ceil(f*n);let d=m.getContext("2d");return d.scale(n,n),d.font=i.font,d.textAlign="left",d.textBaseline="alphabetic",d.fillStyle=a,d.fillText(t,0,l),m.toDataURL()}function mt(t){return Array.from(document.styleSheets).some(e=>e.href===t)}function At(t){return new Promise(e=>{if(mt(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 K({preCached:t=!1}={}){if(S.has("fonts-embed-css")){if(t){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 e=/@import\s+url\(["']?([^"')]+)["']?\)/g,o=[];for(let n of document.querySelectorAll("style")){let c=n.textContent||"",i=Array.from(c.matchAll(e));for(let h of i){let l=h[1];A(l)||mt(l)||o.push(l)}}await Promise.all(o.map(At));let r=Array.from(document.querySelectorAll('link[rel="stylesheet"]')).filter(n=>n.href),a="";for(let n of r)try{let i=await(await fetch(n.href)).text();if(A(n.href)||A(i))continue;let h=/url\((["']?)([^"')]+)\1\)/g,l=await Promise.all(Array.from(i.matchAll(h)).map(async f=>{let u=_(f[0]);if(!u)return null;let m=u;if(!m.startsWith("http")&&!m.startsWith("data:")&&(m=new URL(m,n.href).href),A(m))return null;if(S.has(m))return R.add(m),{original:f[0],inlined:`url(${S.get(m)})`};if(R.has(m))return null;try{let g=await(await fetch(m)).blob(),p=await new Promise(y=>{let w=new FileReader;w.onload=()=>y(w.result),w.readAsDataURL(g)});return S.set(m,p),R.add(m),{original:f[0],inlined:`url(${p})`}}catch{return console.warn("[snapdom] Failed to fetch font resource:",m),null}})),s=i;for(let f of l)f&&(s=s.replace(f.original,f.inlined));a+=s+`
|
|
3
|
+
`}catch{console.warn("[snapdom] Failed to fetch CSS:",n.href)}for(let n of document.styleSheets)try{if(!n.href||r.every(c=>c.href!==n.href)){for(let c of n.cssRules)if(c.type===CSSRule.FONT_FACE_RULE){let i=c.style.getPropertyValue("src"),h=c.style.getPropertyValue("font-family");if(!i||A(h))continue;let l=/url\((["']?)([^"')]+)\1\)/g,s=i,f=Array.from(i.matchAll(l));for(let u of f){let m=u[2].trim();if(!m)continue;let d=m;if(!d.startsWith("http")&&!d.startsWith("data:")&&(d=new URL(d,n.href||location.href).href),!A(d)){if(S.has(d)){R.add(d),s=s.replace(u[0],`url(${S.get(d)})`);continue}if(!R.has(d))try{let p=await(await fetch(d)).blob(),y=await new Promise(w=>{let E=new FileReader;E.onload=()=>w(E.result),E.readAsDataURL(p)});S.set(d,y),R.add(d),s=s.replace(u[0],`url(${y})`)}catch{console.warn("[snapdom] Failed to fetch font URL:",d)}}}a+=`@font-face {
|
|
4
|
+
font-family: ${h};
|
|
5
|
+
src: ${s};
|
|
6
|
+
font-style: ${c.style.getPropertyValue("font-style")||"normal"};
|
|
7
|
+
font-weight: ${c.style.getPropertyValue("font-weight")||"normal"};
|
|
8
8
|
}
|
|
9
|
-
`}}}catch(
|
|
10
|
-
font-family: '${
|
|
11
|
-
src: url(${
|
|
12
|
-
font-style: ${
|
|
13
|
-
font-weight: ${
|
|
9
|
+
`}}}catch(c){console.warn("[snapdom] Cannot access stylesheet",n.href,c)}for(let n of document.fonts)if(n.family&&n.status==="loaded"&&n._snapdomSrc){if(A(n.family))continue;let c=n._snapdomSrc;if(!c.startsWith("data:")){if(S.has(n._snapdomSrc))c=S.get(n._snapdomSrc),R.add(n._snapdomSrc);else if(!R.has(n._snapdomSrc))try{let h=await(await fetch(n._snapdomSrc)).blob();c=await new Promise(l=>{let s=new FileReader;s.onload=()=>l(s.result),s.readAsDataURL(h)}),S.set(n._snapdomSrc,c),R.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(${c});
|
|
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),t)){let n=document.createElement("style");n.setAttribute("data-snapdom","embedFonts"),n.textContent=a,document.head.appendChild(n)}return a}async function nt(t,e,o,r,a,n=!1,c){if(!(t instanceof Element)||!(e instanceof Element))return;for(let l of["::before","::after","::first-letter"])try{let s=U(t,l);if(!s||typeof s[Symbol.iterator]!="function")continue;if(l==="::first-letter"){let y=getComputedStyle(t);if(!(s.color!==y.color||s.fontSize!==y.fontSize||s.fontWeight!==y.fontWeight))continue;let E=Array.from(e.childNodes).find(C=>C.nodeType===Node.TEXT_NODE&&C.textContent&&C.textContent.trim().length>0);if(!E)continue;let L=E.textContent,T=L.match(/^([^\p{L}\p{N}\s]*[\p{L}\p{N}](?:['’])?)/u)?.[0],P=L.slice(T?.length||0);if(!T||/[\uD800-\uDFFF]/.test(T))continue;let I=document.createElement("span");I.textContent=T,I.dataset.snapdomPseudo="::first-letter";let k=J(s),q=V(k,"span",a);o.set(I,q);let z=document.createTextNode(P);e.replaceChild(z,E),e.insertBefore(I,z);continue}let f=s.getPropertyValue("content"),u=s.getPropertyValue("background-image"),m=s.getPropertyValue("background-color"),d=f!=="none",g=u&&u!=="none",p=m&&m!=="transparent"&&m!=="rgba(0, 0, 0, 0)";if(d||g||p){let y=s.getPropertyValue("font-family"),w=parseInt(s.getPropertyValue("font-size"))||32,E=parseInt(s.getPropertyValue("font-weight"))||!1,L=s.getPropertyValue("color")||"#000",b=document.createElement("span");b.dataset.snapdomPseudo=l;let T=J(s),P=V(T,"span",a);o.set(b,P);let I=A(y),k=ft(f);if(I&&k.length===1){let C=document.createElement("img");C.src=await ut(k,y,E,w,L),C.style=`width:${w}px;height:auto;object-fit:contain;`,b.appendChild(C)}else if(k.startsWith("url(")){let C=_(k);if(C&&C.trim()!=="")try{let v=document.createElement("img"),O=await N(Y(C,{useProxy:c}));v.src=O,v.style=`width:${w}px;height:auto;object-fit:contain;`,b.appendChild(v)}catch(v){console.error(`[snapdom] Error in pseudo ${l} for`,t,v)}}else!I&&k&&k!=="none"&&(b.textContent=k);if(g)try{let C=j(u),v=await Promise.all(C.map(O=>M(O)));b.style.backgroundImage=v.join(", ")}catch(C){console.warn(`[snapdom] Failed to inline background-image for ${l}`,C)}if(p&&(b.style.backgroundColor=m),!(b.childNodes.length>0||b.textContent&&b.textContent.trim()!==""||g||p))continue;l==="::before"?e.insertBefore(b,e.firstChild):e.appendChild(b)}}catch(s){console.warn(`[snapdom] Failed to capture ${l} for`,t,s)}let i=Array.from(t.children),h=Array.from(e.children).filter(l=>!l.dataset.snapdomPseudo);for(let l=0;l<Math.min(i.length,h.length);l++)await nt(i[l],h[l],o,r,a,n,c)}function gt(t){if(!t)return;let e=document.querySelectorAll("svg > defs");e.length&&t.querySelectorAll("svg").forEach(o=>{let r=o.querySelectorAll("use");if(!r.length)return;let a=new Set;if(r.forEach(c=>{let i=c.getAttribute("xlink:href")||c.getAttribute("href");i&&i.startsWith("#")&&a.add(i.slice(1))}),!a.size)return;let n=document.createElementNS("http://www.w3.org/2000/svg","defs");for(let c of a)for(let i of e){let h=i.querySelector(`#${CSS.escape(c)}`);if(h){n.appendChild(h.cloneNode(!0));break}}n.childNodes.length&&o.insertBefore(n,o.firstChild)})}async function pt(t,e=!1,o=!1,r={}){let a=new Map,n=new WeakMap,c=new Map,i;try{i=X(t,a,n,c,e,r,t)}catch(l){throw console.warn("deepClone failed:",l),l}try{await nt(t,i,a,n,e,o,r.useProxy)}catch(l){console.warn("inlinePseudoElements failed:",l)}try{gt(i)}catch(l){console.warn("inlineExternalDef failed:",l)}let h="";if(e){let l=lt(a);h=Array.from(l.entries()).map(([s,f])=>`.${f}{${s}}`).join("");for(let[s,f]of a.entries()){if(s.tagName==="STYLE")continue;let u=l.get(f);u&&s.classList.add(u);let m=s.style?.backgroundImage;s.removeAttribute("style"),m&&m!=="none"&&(s.style.backgroundImage=m)}}else for(let[l,s]of a.entries())l.tagName!=="STYLE"&&l.setAttribute("style",s.replace(/;/g,"; "));for(let[l,s]of c.entries()){let f=s.scrollLeft,u=s.scrollTop;if((f||u)&&l instanceof HTMLElement){l.style.overflow="hidden",l.style.scrollbarWidth="none",l.style.msOverflowStyle="none";let d=document.createElement("div");for(d.style.transform=`translate(${-f}px, ${-u}px)`,d.style.willChange="transform",d.style.display="inline-block",d.style.width="100%";l.firstChild;)d.appendChild(l.firstChild);l.appendChild(d)}}if(t===c.get(i)){let l=n.get(t)||window.getComputedStyle(t);n.set(t,l);let s=dt(l.transform);i.style.margin="0",i.style.position="static",i.style.top="auto",i.style.left="auto",i.style.right="auto",i.style.bottom="auto",i.style.zIndex="auto",i.style.float="none",i.style.clear="none",i.style.transform=s||""}for(let[l,s]of c.entries())s.tagName==="PRE"&&(l.style.marginTop="0",l.style.marginBlockStart="0");return{clone:i,classCSS:h,styleCache:n}}async function yt(t,e={}){let o=Array.from(t.querySelectorAll("img")),r=async a=>{let n=a.src;try{let c=await N(n,{useProxy:e.useProxy});a.src=c,a.width||(a.width=a.naturalWidth||100),a.height||(a.height=a.naturalHeight||100)}catch{let c=document.createElement("div");c.style=`width: ${a.width||100}px; height: ${a.height||100}px; background: #ccc; display: inline-block; text-align: center; line-height: ${a.height||100}px; color: #666; font-size: 12px;`,c.innerText="img",a.replaceWith(c)}};for(let a=0;a<o.length;a+=4){let n=o.slice(a,a+4).map(r);await Promise.allSettled(n)}}async function wt(t,e,o,r={}){let a=[[t,e]];for(;a.length;){let[n,c]=a.shift(),i=o.get(n)||U(n);o.has(n)||o.set(n,i);let h=i.getPropertyValue("background-image"),l=i.getPropertyValue("background-color");if(!h||h==="none"){let d=Array.from(n.children),g=Array.from(c.children);for(let p=0;p<Math.min(d.length,g.length);p++)a.push([d[p],g[p]]);continue}let s=j(h),f=await Promise.all(s.map(d=>M(d,r)));f.some(d=>d&&d!=="none"&&!/^url\(undefined\)/.test(d))&&(c.style.backgroundImage=f.join(", ")),l&&l!=="transparent"&&l!=="rgba(0, 0, 0, 0)"&&(c.style.backgroundColor=l);let u=Array.from(n.children),m=Array.from(c.children);for(let d=0;d<Math.min(u.length,m.length);d++)a.push([u[d],m[d]])}}async function xt(t,e={}){if(!t)throw new Error("Element cannot be null or undefined");let{compress:o=!0,embedFonts:r=!1,fast:a=!0,scale:n=1,useProxy:c=""}=e,i,h,l,s="",f="",u,m;if({clone:i,classCSS:h,styleCache:l}=await pt(t,o,r,e),await new Promise(g=>{W(async()=>{await yt(i,e),g()},{fast:a})}),await new Promise(g=>{W(async()=>{await wt(t,i,l,e),g()},{fast:a})}),r&&await new Promise(g=>{W(async()=>{s=await K(),g()},{fast:a})}),o){let g=it(i).sort(),p=g.join(",");D.has(p)?f=D.get(p):await new Promise(y=>{W(()=>{f=ct(g),D.set(p,f),y()},{fast:a})})}await new Promise(g=>{W(()=>{let p=t.getBoundingClientRect(),y=p.width,w=p.height,E=Number.isFinite(e.width),L=Number.isFinite(e.height),b=typeof n=="number"&&n!==1;if(!b){let v=p.width/p.height;E&&L?(y=e.width,w=e.height):E?(y=e.width,w=y/v):L&&(w=e.height,y=w*v)}if(y=Math.ceil(y),w=Math.ceil(w),i.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),i.style.transformOrigin="top left",!b&&(E||L)){let v=p.width,O=p.height,St=y/v,Et=w/O,vt=i.style.transform||"",$t=`scale(${St}, ${Et})`;i.style.transform=`${$t} ${vt}`.trim()}else b&&H()&&(i.style.scale=`${n}`);let T="http://www.w3.org/2000/svg",P=document.createElementNS(T,"foreignObject");P.setAttribute("width","100%"),P.setAttribute("height","100%");let I=document.createElement("style");I.textContent=f+s+"svg{overflow:visible;}"+h,P.appendChild(I),P.appendChild(i);let q=new XMLSerializer().serializeToString(P);m=`<svg xmlns="${T}" width="${y}" height="${w}" viewBox="0 0 ${y} ${w}">`+q+"</svg>",u=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(m)}`,g()},{fast:a})});let d=document.getElementById("snapdom-sandbox");return d&&d.style.position==="absolute"&&d.remove(),u}async function Tt(t,{dpr:e=1,scale:o=1}){let r=new Image;return r.src=t,await r.decode(),H?(r.width=r.width*o,r.height=r.height*o):(r.width=r.width/o,r.height=r.height/o),r}async function bt(t,{dpr:e=1,scale:o=1}={}){let r=new Image;r.src=t,await r.decode();let a=document.createElement("canvas"),n=r.width*o,c=r.height*o;a.width=Math.ceil(n*e),a.height=Math.ceil(c*e);let i=a.getContext("2d");return i.scale(e,e),i.drawImage(r,0,0,n,c),a.style.width=`${n}px`,a.style.height=`${c}px`,a}async function Ct(t,{type:e="svg",scale:o=1,backgroundColor:r="#fff",quality:a}={}){let n={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[e]||"image/png";if(e==="svg"){let i=decodeURIComponent(t.split(",")[1]);return new Blob([i],{type:"image/svg+xml"})}let c=await at(t,{dpr:1,scale:o},r);return new Promise(i=>{c.toBlob(h=>i(h),`${n}`,a)})}async function at(t,{dpr:e=1,scale:o=1},r){let a=await bt(t,{dpr:e,scale:o});if(!r)return a;let n=document.createElement("canvas");n.width=a.width,n.height=a.height;let c=n.getContext("2d");return c.fillStyle=r,c.fillRect(0,0,n.width,n.height),c.drawImage(a,0,0),n}async function ot(t,{dpr:e=1,scale:o=1,backgroundColor:r="#fff",quality:a},n="png"){let c=await at(t,{dpr:e,scale:o},r),i=new Image;return i.src=c.toDataURL(`image/${n}`,a),await i.decode(),i.style.width=`${c.width/e}px`,i.style.height=`${c.height/e}px`,i}async function Pt(t,{dpr:e=1,scale:o=1,backgroundColor:r="#fff",format:a="png",filename:n="capture"}={}){if(a==="svg"){let u=await Ct(t),m=URL.createObjectURL(u),d=document.createElement("a");d.href=m,d.download=`${n}.svg`,d.click(),URL.revokeObjectURL(m);return}let c=["jpg","jpeg","webp"].includes(a)?"#fff":void 0,h=await at(t,{dpr:e,scale:o},r??c),l={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[a]||"image/png",s=h.toDataURL(l),f=document.createElement("a");f.href=s,f.download=`${n}.${a}`,f.click()}async function x(t,e={}){if(e={scale:1,...e},!t)throw new Error("Element cannot be null or undefined");return e.iconFonts&&ht(e.iconFonts),await x.capture(t,e)}x.capture=async(t,e={})=>{let o=await xt(t,e),r=window.devicePixelRatio||1,a=e.scale||1;return{url:o,options:e,toRaw:()=>o,toImg:()=>Tt(o,{dpr:r,scale:a}),toCanvas:()=>bt(o,{dpr:r,scale:a}),toBlob:n=>Ct(o,{dpr:r,scale:a,...n}),toPng:n=>ot(o,{dpr:r,scale:a,...n},"png"),toJpg:n=>ot(o,{dpr:r,scale:a,...n},"jpeg"),toWebp:n=>ot(o,{dpr:r,scale:a,...n},"webp"),download:({format:n="png",filename:c="capture",backgroundColor:i}={})=>Pt(o,{dpr:r,scale:a,backgroundColor:i,format:n,filename:c})}};x.toRaw=async(t,e)=>(await x.capture(t,e)).toRaw();x.toImg=async(t,e)=>(await x.capture(t,e)).toImg();x.toCanvas=async(t,e)=>(await x.capture(t,e)).toCanvas();x.toBlob=async(t,e)=>(await x.capture(t,e)).toBlob(e);x.toPng=async(t,e)=>(await x.capture(t,e)).toPng(e);x.toJpg=async(t,e)=>(await x.capture(t,e)).toJpg(e);x.toWebp=async(t,e)=>(await x.capture(t,e)).toWebp(e);x.download=async(t,e={})=>{let{format:o="png",filename:r="capture",backgroundColor:a,...n}=e;return await(await x.capture(t,n)).download({format:o,filename:r,backgroundColor:a})};async function Lt(t=document,e={}){let{embedFonts:o=!0,reset:r=!1}=e;if(r){$.clear(),F.clear(),S.clear(),D.clear();return}await document.fonts.ready,rt();let a=[],n=[];t?.querySelectorAll&&(a=Array.from(t.querySelectorAll("img[src]")),n=Array.from(t.querySelectorAll("*")));let c=[];for(let i of a){let h=i.src;$.has(h)||c.push(N(h,{useProxy:e.useProxy}).then(l=>$.set(h,l)).catch(()=>{}))}for(let i of n){let h=U(i).backgroundImage;if(h&&h!=="none"){let l=j(h);for(let s of l)s.startsWith("url(")&&c.push(M(s,e).catch(()=>{}))}}o&&await K({preCached:!0}),await Promise.all(c)}export{Lt as preCache,x as snapdom};
|