@zumer/snapdom 1.8.0 → 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 +63 -30
- package/dist/snapdom.js +294 -85
- package/dist/snapdom.min.js +13 -13
- package/dist/snapdom.min.mjs +10 -10
- package/dist/snapdom.mjs +289 -82
- package/package.json +1 -1
- package/types/snapdom.d.ts +6 -2
package/dist/snapdom.min.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
(()=>{var
|
|
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(
|
|
4
|
-
font-family: ${
|
|
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(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;})();
|
|
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 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(
|
|
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(
|
|
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
10
|
font-family: '${n.family}';
|
|
11
|
-
src: url(${
|
|
11
|
+
src: url(${c});
|
|
12
12
|
font-style: ${n.style||"normal"};
|
|
13
13
|
font-weight: ${n.weight||"normal"};
|
|
14
14
|
}
|
|
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};
|
|
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};
|