@zumer/snapdom 1.9.7 → 1.9.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -6
- package/dist/snapdom.js +185 -102
- package/dist/snapdom.min.js +3 -3
- package/dist/snapdom.min.mjs +3 -3
- package/dist/snapdom.mjs +175 -100
- package/package.json +1 -1
- package/types/snapdom.d.ts +1 -0
package/dist/snapdom.min.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
(()=>{var De=Object.defineProperty;var
|
|
2
|
-
`;return a}function Se(){let e=new Set(f.preStyleMap.values()),t=new Map,a=1;for(let c of e)t.set(c,`c${a++}`);return t}function B(a){return h(this,arguments,function*(e,t={}){let c=_(e),s=/^((repeating-)?(linear|radial|conic)-gradient)\(/i.test(e);if(c){let n=Y(c);if(f.background.has(n))return t.skipInline?void 0:`url(${f.background.get(n)})`;{let i=yield P(n,{useProxy:t.useProxy});return f.background.set(n,i),t.skipInline?void 0:`url("${i}")`}}return e})}function D(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 a=f.computedStyle.get(e);if(a||(a=new Map,f.computedStyle.set(e,a)),!a.has(t)){let c=window.getComputedStyle(e,t);a.set(t,c)}return a.get(t)}function be(e){let t=e.replace(/^['"]|['"]$/g,"");if(t.startsWith("\\"))try{return String.fromCharCode(parseInt(t.replace("\\",""),16))}catch(a){return t}return t}function _(e){let t=e.match(/url\((['"]?)(.*?)(\1)\)/);if(!t)return null;let a=t[2].trim();return a.startsWith("#")?null:a}function P(e,{timeout:t=3e3,useProxy:a=""}={}){function c(o){try{return new URL(o,window.location.href).origin===window.location.origin?"use-credentials":"anonymous"}catch(r){return"anonymous"}}function s(o){return h(this,null,function*(){let r=d=>fetch(d,{mode:"cors",credentials:c(d)==="use-credentials"?"include":"omit"}).then(p=>p.blob()).then(p=>new Promise((m,u)=>{let y=new FileReader;y.onloadend=()=>{let w=y.result;if(typeof w!="string"||!w.startsWith("data:image/")){u(new Error("Invalid image data URL"));return}m(w)},y.onerror=()=>u(new Error("FileReader error")),y.readAsDataURL(p)}));try{return yield r(o)}catch(d){if(a&&typeof a=="string"){let p=a.replace(/\/$/,"")+Y(o);try{return yield r(p)}catch(m){throw new Error("[SnapDOM - fetchImage] CORS restrictions prevented image capture (even via proxy)")}}else throw new Error("[SnapDOM - fetchImage] Fetch fallback failed and no proxy provided")}})}let n=c(e);return f.image.has(e)?Promise.resolve(f.image.get(e)):e.startsWith("data:image/")?(f.image.set(e,e),Promise.resolve(e)):/\.svg(\?.*)?$/i.test(e)?h(null,null,function*(){try{let r=yield(yield fetch(e,{mode:"cors",credentials:n==="use-credentials"?"include":"omit"})).text(),d=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(r)}`;return f.image.set(e,d),d}catch(o){return s(e)}}):new Promise((o,r)=>{let d=setTimeout(()=>{r(new Error("[SnapDOM - fetchImage] Image load timed out"))},t),p=new Image;p.crossOrigin=n,p.onload=()=>h(null,null,function*(){clearTimeout(d);try{yield p.decode();let m=document.createElement("canvas");m.width=p.width,m.height=p.height,m.getContext("2d").drawImage(p,0,0,m.width,m.height);let y=m.toDataURL("image/png");f.image.set(e,y),o(y)}catch(m){try{let u=yield s(e);f.image.set(e,u),o(u)}catch(u){r(u)}}}),p.onerror=()=>h(null,null,function*(){clearTimeout(d),console.error(`[SnapDOM - fetchImage] Image failed to load: ${e}`);try{let m=yield s(e);f.image.set(e,m),o(m)}catch(m){r(m)}}),p.src=e})}function oe(e){let t={};for(let a of e)t[a]=e.getPropertyValue(a);return t}function Ce(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function Ee(e){if(!e||e==="none")return"";let t=e.replace(/translate[XY]?\([^)]*\)/g,"");return t=t.replace(/matrix\(([^)]+)\)/g,(a,c)=>{let s=c.split(",").map(n=>n.trim());return s.length!==6?`matrix(${c})`:(s[4]="0",s[5]="0",`matrix(${s.join(", ")})`)}),t=t.replace(/matrix3d\(([^)]+)\)/g,(a,c)=>{let s=c.split(",").map(n=>n.trim());return s.length!==16?`matrix3d(${c})`:(s[12]="0",s[13]="0",`matrix3d(${s.join(", ")})`)}),t.trim().replace(/\s{2,}/g," ")}function Y(e){if(/%[0-9A-Fa-f]{2}/.test(e))return e;try{return encodeURI(e)}catch(t){return e}}function j(e){let t=[],a=0,c=0;for(let s=0;s<e.length;s++){let n=e[s];n==="("&&a++,n===")"&&a--,n===","&&a===0&&(t.push(e.slice(c,s).trim()),c=s+1)}return t.push(e.slice(c).trim()),t}function Ve(e){let t={};for(let a=0;a<e.length;a++){let c=e[a],s=e.getPropertyValue(c);(c==="background-image"||c==="content")&&s.includes("url(")&&!s.includes("data:")&&(s="none"),t[c]=s}return t}function X(e,t,a){var o;if(e.tagName==="STYLE")return;f.preStyle.has(e)||f.preStyle.set(e,N(e));let c=f.preStyle.get(e);if(!f.snapshot.has(e)){let r=Ve(c);f.snapshot.set(e,r)}let s=f.snapshot.get(e),n=Object.entries(s).sort(([r],[d])=>r.localeCompare(d)).map(([r,d])=>`${r}:${d}`).join(";");if(f.snapshotKey.has(n)){f.preStyleMap.set(t,f.snapshotKey.get(n));return}let i=((o=e.tagName)==null?void 0:o.toLowerCase())||"div",l=O(s,i,a);f.snapshotKey.set(n,l),f.preStyleMap.set(t,l)}function q(e,t,a={},c){var l,o;if(!e)throw new Error("Invalid node");let s=new Set,n=null;if(e.nodeType===Node.TEXT_NODE||e.nodeType!==Node.ELEMENT_NODE)return e.cloneNode(!0);if(e.getAttribute("data-capture")==="exclude"){let r=document.createElement("div"),d=e.getBoundingClientRect();return r.style.cssText=`display:inline-block;width:${d.width}px;height:${d.height}px;visibility:hidden;`,r}if(a.exclude&&Array.isArray(a.exclude))for(let r of a.exclude)try{if((l=e.matches)!=null&&l.call(e,r)){let d=document.createElement("div"),p=e.getBoundingClientRect();return d.style.cssText=`display:inline-block;width:${p.width}px;height:${p.height}px;visibility:hidden;`,d}}catch(d){console.warn(`Invalid selector in exclude option: ${r}`,d)}if(typeof a.filter=="function")try{if(!a.filter(e,c||e)){let r=document.createElement("div"),d=e.getBoundingClientRect();return r.style.cssText=`display:inline-block;width:${d.width}px;height:${d.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.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);f.preNodeMap.set(r,e),X(e,r,t);let d=document.createElement("div");return d.textContent=e.getAttribute("data-placeholder-text")||"",d.style.cssText="color:#666;font-size:12px;text-align:center;line-height:1.4;padding:0.5em;box-sizing:border-box;",r.appendChild(d),r}if(e.tagName==="CANVAS"){let r=e.toDataURL(),d=document.createElement("img");return d.src=r,d.width=e.width,d.height=e.height,f.preNodeMap.set(d,e),X(e,d,t),d}let i;try{i=e.cloneNode(!1),f.preNodeMap.set(i,e)}catch(r){throw console.error("[Snapdom] Failed to clone node:",e,r),r}if(e instanceof HTMLTextAreaElement){i.textContent=e.value,i.value=e.value;let r=e.getBoundingClientRect();return i.style.width=`${r.width}px`,i.style.height=`${r.height}px`,i}if(e instanceof HTMLInputElement&&(i.value=e.value,i.setAttribute("value",e.value),e.checked!==void 0&&(i.checked=e.checked,e.checked&&i.setAttribute("checked",""),e.indeterminate&&(i.indeterminate=e.indeterminate))),e instanceof HTMLSelectElement&&(n=e.value),X(e,i,t),e.shadowRoot)if(Array.from(e.shadowRoot.querySelectorAll("slot")).length>0){for(let d of e.shadowRoot.childNodes)if(d.nodeType===Node.ELEMENT_NODE&&d.tagName==="STYLE"){let p=d.textContent||"";p.trim()&&t&&(f.preStyle||(f.preStyle=new WeakMap),f.preStyle.set(d,p))}}else{let d=document.createDocumentFragment();for(let p of e.shadowRoot.childNodes){if(p.nodeType===Node.ELEMENT_NODE&&p.tagName==="STYLE"){let u=p.textContent||"";u.trim()&&t&&(f.preStyle||(f.preStyle=new WeakMap),f.preStyle.set(p,u));continue}let m=q(p,t,a,c||e);m&&d.appendChild(m)}i.appendChild(d)}if(e.tagName==="SLOT"){let r=((o=e.assignedNodes)==null?void 0:o.call(e,{flatten:!0}))||[],d=r.length>0?r:Array.from(e.childNodes),p=document.createDocumentFragment();for(let m of d){let u=q(m,t,a,c||e);u&&p.appendChild(u)}return p}for(let r of e.childNodes){if(s.has(r))continue;let d=q(r,t,a,c||e);d&&i.appendChild(d)}if(n!==null&&i instanceof HTMLSelectElement){i.value=n;for(let r of i.options)r.value===n?r.setAttribute("selected",""):r.removeAttribute("selected")}return i}var Oe=[/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 ve(e){let t=Array.isArray(e)?e:[e];for(let a of t)a instanceof RegExp?ae.push(a):typeof a=="string"?ae.push(new RegExp(a,"i")):console.warn("[snapdom] Ignored invalid iconFont value:",a)}function $(e){let t=typeof e=="string"?e:"",a=[...Oe,...ae];for(let c of a)if(c instanceof RegExp&&c.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 $e(e,t,a,c=32,s="#000"){return h(this,null,function*(){t=t.replace(/^['"]+|['"]+$/g,"");let n=window.devicePixelRatio||1,l=document.createElement("canvas").getContext("2d");l.font=a?`${a} ${c}px "${t}"`:`${c}px "${t}"`;let o=l.measureText(e),r=o.actualBoundingBoxAscent||c*.8,d=o.actualBoundingBoxDescent||c*.2,p=r+d,m=o.width,u=document.createElement("canvas");u.width=Math.ceil(m*n),u.height=Math.ceil(p*n);let y=u.getContext("2d");return y.scale(n,n),y.font=l.font,y.textAlign="left",y.textBaseline="alphabetic",y.fillStyle=s,y.fillText(e,0,r),u.toDataURL()})}function ke(e){return Array.from(document.styleSheets).some(t=>t.href===e)}function _e(e){return new Promise(t=>{if(ke(e))return t(null);let a=document.createElement("link");a.rel="stylesheet",a.href=e,a.setAttribute("data-snapdom","injected-import"),a.onload=()=>t(a),a.onerror=()=>t(null),document.head.appendChild(a)})}function G(){return h(this,arguments,function*({preCached:e=!1}={}){if(f.resource.has("fonts-embed-css")){if(e){let n=document.createElement("style");n.setAttribute("data-snapdom","embedFonts"),n.textContent=f.resource.get("fonts-embed-css"),document.head.appendChild(n)}return f.resource.get("fonts-embed-css")}let t=/@import\s+url\(["']?([^"')]+)["']?\)/g,a=[];for(let n of document.querySelectorAll("style")){let i=n.textContent||"",l=Array.from(i.matchAll(t));for(let o of l){let r=o[1];$(r)||ke(r)||a.push(r)}}yield Promise.all(a.map(_e));let c=Array.from(document.querySelectorAll('link[rel="stylesheet"]')).filter(n=>n.href),s="";for(let n of c)try{let l=yield(yield fetch(n.href)).text();if($(n.href)||$(l))continue;let o=/url\((["']?)([^"')]+)\1\)/g,r=yield Promise.all(Array.from(l.matchAll(o)).map(p=>h(null,null,function*(){let m=_(p[0]);if(!m)return null;let u=m;if(!u.startsWith("http")&&!u.startsWith("data:")&&(u=new URL(u,n.href).href),$(u))return null;if(f.resource.has(u))return f.font.add(u),{original:p[0],inlined:`url(${f.resource.get(u)})`};if(f.font.has(u))return null;try{let w=yield(yield fetch(u)).blob(),x=yield new Promise(g=>{let b=new FileReader;b.onload=()=>g(b.result),b.readAsDataURL(w)});return f.resource.set(u,x),f.font.add(u),{original:p[0],inlined:`url(${x})`}}catch(y){return console.warn("[snapdom] Failed to fetch font resource:",u),null}}))),d=l;for(let p of r)p&&(d=d.replace(p.original,p.inlined));s+=d+`
|
|
3
|
-
`}catch(i){console.warn("[snapdom] Failed to fetch CSS:",n.href)}for(let n of document.styleSheets)try{if(!n.href||c.every(i=>i.href!==n.href)){for(let i of n.cssRules)if(i.type===CSSRule.FONT_FACE_RULE){let l=i.style.getPropertyValue("src"),o=i.style.getPropertyValue("font-family");if(!l||$(o))continue;let r=/url\((["']?)([^"')]+)\1\)/g,d=/local\((["']?)[^)]+?\1\)/g,p=!!l.match(r),m=!!l.match(d);if(!p&&m){s+=`@font-face{font-family:${o};src:${l};font-style:${i.style.getPropertyValue("font-style")||"normal"};font-weight:${i.style.getPropertyValue("font-weight")||"normal"};}`;continue}let u=l,y=Array.from(l.matchAll(r));for(let w of y){let x=w[2].trim();if(!x)continue;let g=x;if(!g.startsWith("http")&&!g.startsWith("data:")&&(g=new URL(g,n.href||location.href).href),!$(g)){if(f.resource.has(g)){f.font.add(g),u=u.replace(w[0],`url(${f.resource.get(g)})`);continue}if(!f.font.has(g))try{let I=yield(yield fetch(g)).blob(),k=yield new Promise(T=>{let C=new FileReader;C.onload=()=>T(C.result),C.readAsDataURL(I)});f.resource.set(g,k),f.font.add(g),u=u.replace(w[0],`url(${k})`)}catch(b){console.warn("[snapdom] Failed to fetch font URL:",g)}}}s+=`@font-face{font-family:${o};src:${u};font-style:${i.style.getPropertyValue("font-style")||"normal"};font-weight:${i.style.getPropertyValue("font-weight")||"normal"};}`}}}catch(i){console.warn("[snapdom] Cannot access stylesheet",n.href,i)}for(let n of document.fonts)if(n.family&&n.status==="loaded"&&n._snapdomSrc){if($(n.family))continue;let i=n._snapdomSrc;if(!i.startsWith("data:")){if(f.resource.has(n._snapdomSrc))i=f.resource.get(n._snapdomSrc),f.font.add(n._snapdomSrc);else if(!f.font.has(n._snapdomSrc))try{let o=yield(yield fetch(n._snapdomSrc)).blob();i=yield new Promise(r=>{let d=new FileReader;d.onload=()=>r(d.result),d.readAsDataURL(o)}),f.resource.set(n._snapdomSrc,i),f.font.add(n._snapdomSrc)}catch(l){console.warn("[snapdom] Failed to fetch dynamic font src:",n._snapdomSrc);continue}}s+=`@font-face{font-family:'${n.family}';src:url(${i});font-style:${n.style||"normal"};font-weight:${n.weight||"normal"};}`}if(s&&(f.resource.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,a,c=!1,s){return h(this,null,function*(){if(!(e instanceof Element)||!(t instanceof Element))return;for(let l of["::before","::after","::first-letter"])try{let o=N(e,l);if(!o||typeof o[Symbol.iterator]!="function")continue;if(l==="::first-letter"){let E=getComputedStyle(e);if(!(o.color!==E.color||o.fontSize!==E.fontSize||o.fontWeight!==E.fontWeight))continue;let M=Array.from(t.childNodes).find(ne=>ne.nodeType===Node.TEXT_NODE&&ne.textContent&&ne.textContent.trim().length>0);if(!M)continue;let fe=M.textContent,te=fe.match(/^([^\p{L}\p{N}\s]*[\p{L}\p{N}](?:['’])?)/u),F=te==null?void 0:te[0],Fe=fe.slice((F==null?void 0:F.length)||0);if(!F||/[\uD800-\uDFFF]/.test(F))continue;let H=document.createElement("span");H.textContent=F,H.dataset.snapdomPseudo="::first-letter";let Ue=oe(o),Be=O(Ue,"span",a);f.preStyleMap.set(H,Be);let de=document.createTextNode(Fe);t.replaceChild(de,M),t.insertBefore(H,de);continue}let r=o.getPropertyValue("content"),d=o.getPropertyValue("background-image"),p=o.getPropertyValue("background-color"),m=o.getPropertyValue("font-family"),u=parseInt(o.getPropertyValue("font-size"))||32,y=parseInt(o.getPropertyValue("font-weight"))||!1,w=o.getPropertyValue("color")||"#000",x=o.getPropertyValue("display"),g=parseFloat(o.getPropertyValue("width")),b=parseFloat(o.getPropertyValue("height")),I=o.getPropertyValue("border-style"),k=o.getPropertyValue("transform"),T=$(m),C;/counter\s*\(|counters\s*\(/.test(r)?C="- ":C=be(r);let W=r!=="none"&&C!=="",z=d&&d!=="none",V=p&&p!=="transparent"&&p!=="rgba(0, 0, 0, 0)",J=x!=="inline"&&(g>0||b>0),Q=I&&I!=="none",A=k&&k!=="none";if(!(W||z||V||J||Q||A))continue;let v=document.createElement("span");v.dataset.snapdomPseudo=l;let Z=oe(o),ee=O(Z,"span",a);if(f.preStyleMap.set(v,ee),T&&C.length===1){let E=document.createElement("img");E.src=yield $e(C,m,y,u,w),E.style=`width:${u}px;height:auto;object-fit:contain;`,v.appendChild(E)}else if(C.startsWith("url(")){let E=_(C);if(E&&E.trim()!=="")try{let R=document.createElement("img"),M=yield P(Y(E,{useProxy:s}));R.src=M,R.style=`width:${u}px;height:auto;object-fit:contain;`,v.appendChild(R)}catch(R){console.error(`[snapdom] Error in pseudo ${l} for`,e,R)}}else!T&&W&&(v.textContent=C);if(z)try{let E=j(d),R=yield Promise.all(E.map(M=>B(M)));v.style.backgroundImage=R.join(", ")}catch(E){console.warn(`[snapdom] Failed to inline background-image for ${l}`,E)}if(V&&(v.style.backgroundColor=p),!(v.childNodes.length>0||v.textContent&&v.textContent.trim()!==""||z||V||J||Q||A))continue;l==="::before"?t.insertBefore(v,t.firstChild):t.appendChild(v)}catch(o){console.warn(`[snapdom] Failed to capture ${l} for`,e,o)}let n=Array.from(e.children),i=Array.from(t.children).filter(l=>!l.dataset.snapdomPseudo);for(let l=0;l<Math.min(n.length,i.length);l++)yield re(n[l],i[l],a,c,s)})}function Ie(e){if(!e)return;let t=document.querySelectorAll("svg > defs");t.length&&e.querySelectorAll("svg").forEach(a=>{let c=a.querySelectorAll("use");if(!c.length)return;let s=new Set;if(c.forEach(i=>{let l=i.getAttribute("xlink:href")||i.getAttribute("href");l&&l.startsWith("#")&&s.add(l.slice(1))}),!s.size)return;let n=document.createElementNS("http://www.w3.org/2000/svg","defs");for(let i of s)for(let l of t){let o=l.querySelector(`#${CSS.escape(i)}`);if(o){n.appendChild(o.cloneNode(!0));break}}n.childNodes.length&&a.insertBefore(n,a.firstChild)})}function Re(s){return h(this,arguments,function*(e,t=!1,a=!1,c={}){var l;let n,i="";try{n=q(e,t,c,e)}catch(o){throw console.warn("deepClone failed:",o),o}try{yield re(e,n,t,a,c.useProxy)}catch(o){console.warn("inlinePseudoElements failed:",o)}try{Ie(n)}catch(o){console.warn("inlineExternalDef failed:",o)}if(t){let o=Se();i=Array.from(o.entries()).map(([r,d])=>`.${d}{${r}}`).join("");for(let[r,d]of f.preStyleMap.entries()){if(r.tagName==="STYLE")continue;let p=o.get(d);p&&r.classList.add(p);let m=(l=r.style)==null?void 0:l.backgroundImage;r.removeAttribute("style"),m&&m!=="none"&&(r.style.backgroundImage=m)}}else for(let[o,r]of f.preStyleMap.entries())o.tagName!=="STYLE"&&o.setAttribute("style",r.replace(/;/g,"; "));for(let[o,r]of f.preNodeMap.entries()){let d=r.scrollLeft,p=r.scrollTop;if((d||p)&&o instanceof HTMLElement){o.style.overflow="hidden",o.style.scrollbarWidth="none",o.style.msOverflowStyle="none";let u=document.createElement("div");for(u.style.transform=`translate(${-d}px, ${-p}px)`,u.style.willChange="transform",u.style.display="inline-block",u.style.width="100%";o.firstChild;)u.appendChild(o.firstChild);o.appendChild(u)}}if(e===f.preNodeMap.get(n)){let o=f.preStyle.get(e)||window.getComputedStyle(e);f.preStyle.set(e,o);let r=Ee(o.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=r||""}for(let[o,r]of f.preNodeMap.entries())r.tagName==="PRE"&&(o.style.marginTop="0",o.style.marginBlockStart="0");return{clone:n,classCSS:i}})}function Ne(a){return h(this,arguments,function*(e,t={}){let c=Array.from(e.querySelectorAll("img")),s=n=>h(null,null,function*(){let i=n.src;try{let l=yield P(i,{useProxy:t.useProxy});n.src=l,n.width||(n.width=n.naturalWidth||100),n.height||(n.height=n.naturalHeight||100)}catch(l){let o=document.createElement("div");o.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;`,o.innerText="img",n.replaceWith(o)}});for(let n=0;n<c.length;n+=4){let i=c.slice(n,n+4).map(s);yield Promise.allSettled(i)}})}function Te(c,s){return h(this,arguments,function*(e,t,a={}){let n=[[e,t]],i=["background-image","mask","mask-image","-webkit-mask-image","mask-source","mask-box-image-source","mask-border-source","-webkit-mask-box-image-source"];for(;n.length;){let[l,o]=n.shift(),r=f.preStyle.get(l)||N(l);f.preStyle.has(l)||f.preStyle.set(l,r);for(let u of i){let y=r.getPropertyValue(u);if(!y||y==="none")continue;let w=j(y),x=yield Promise.all(w.map(g=>B(g,a)));x.some(g=>g&&g!=="none"&&!/^url\(undefined/.test(g))&&o.style.setProperty(u,x.join(", "))}let d=r.getPropertyValue("background-color");d&&d!=="transparent"&&d!=="rgba(0, 0, 0, 0)"&&(o.style.backgroundColor=d);let p=Array.from(l.children),m=Array.from(o.children);for(let u=0;u<Math.min(p.length,m.length);u++)n.push([p[u],m[u]])}})}function Ae(a){return h(this,arguments,function*(e,t={}){if(!e)throw new Error("Element cannot be null or undefined");f.reset();let{compress:c=!0,embedFonts:s=!1,fast:n=!0,scale:i=1,useProxy:l=""}=t,o,r,d="",p="",m,u;if({clone:o,classCSS:r}=yield Re(e,c,s,t),yield new Promise(w=>{D(()=>h(null,null,function*(){yield Ne(o,t),w()}),{fast:n})}),yield new Promise(w=>{D(()=>h(null,null,function*(){yield Te(e,o,t),w()}),{fast:n})}),s&&(yield new Promise(w=>{D(()=>h(null,null,function*(){d=yield G(),w()}),{fast:n})})),c){let w=we(o).sort(),x=w.join(",");f.baseStyle.has(x)?p=f.baseStyle.get(x):yield new Promise(g=>{D(()=>{p=xe(w),f.baseStyle.set(x,p),g()},{fast:n})})}yield new Promise(w=>{D(()=>{let x=e.getBoundingClientRect(),g=x.width,b=x.height,I=Number.isFinite(t.width),k=Number.isFinite(t.height),T=typeof i=="number"&&i!==1;if(!T){let A=x.width/x.height;I&&k?(g=t.width,b=t.height):I?(g=t.width,b=g/A):k&&(b=t.height,g=b*A)}if(g=Math.ceil(g),b=Math.ceil(b),o.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),o.style.transformOrigin="top left",!T&&(I||k)){let A=x.width,ce=x.height,v=g/A,Z=b/ce,ee=o.style.transform||"",le=`scale(${v}, ${Z})`;o.style.transform=`${le} ${ee}`.trim()}let C="http://www.w3.org/2000/svg",L=document.createElementNS(C,"foreignObject");L.setAttribute("width","100%"),L.setAttribute("height","100%");let W=document.createElement("style");W.textContent=p+d+"svg{overflow:visible;}"+r,L.appendChild(W),L.appendChild(o);let V=new XMLSerializer().serializeToString(L);u=`<svg xmlns="${C}" width="${g}" height="${b}" viewBox="0 0 ${g} ${b}">`+V+"</svg>",m=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(u)}`,w()},{fast:n})});let y=document.getElementById("snapdom-sandbox");return y&&y.style.position==="absolute"&&y.remove(),m})}function qe(c,s){return h(this,arguments,function*(e,{dpr:t=1,scale:a=1}){let n=new Image;return n.src=e,yield n.decode(),n.width=n.width*a,n.height=n.height*a,n})}function Me(c){return h(this,arguments,function*(e,{dpr:t=1,scale:a=1}={}){let s=new Image;s.src=e,s.crossOrigin="anonymous",s.loading="eager",s.decoding="sync";let n=Ce(),i=!1;if(n&&(document.body.appendChild(s),i=!0),yield s.decode(),n&&(yield new Promise(p=>setTimeout(p,100))),s.width===0||s.height===0)throw i&&s.remove(),new Error("Image failed to load or has no dimensions");let l=s.width*a,o=s.height*a,r=document.createElement("canvas");r.width=Math.ceil(l*t),r.height=Math.ceil(o*t),r.style.width=`${l}px`,r.style.height=`${o}px`;let d=r.getContext("2d");return d.scale(t,t),d.drawImage(s,0,0,l,o),i&&s.remove(),r})}function Pe(n){return h(this,arguments,function*(e,{type:t="svg",scale:a=1,backgroundColor:c="#fff",quality:s}={}){let i={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[t]||"image/png";if(t==="svg"){let o=decodeURIComponent(e.split(",")[1]);return new Blob([o],{type:"image/svg+xml"})}let l=yield ie(e,{dpr:1,scale:a},c);return new Promise(o=>{l.toBlob(r=>o(r),`${i}`,s)})})}function ie(s,n,i){return h(this,arguments,function*(e,{dpr:t=1,scale:a=1},c){let l=yield Me(e,{dpr:t,scale:a});if(!c)return l;let o=document.createElement("canvas");o.width=l.width,o.height=l.height;let r=o.getContext("2d");return r.fillStyle=c,r.fillRect(0,0,o.width,o.height),r.drawImage(l,0,0),o})}function se(i,l){return h(this,arguments,function*(e,{dpr:t=1,scale:a=1,backgroundColor:c,quality:s},n="png"){let o=["jpg","jpeg","webp"].includes(n)?"#fff":void 0,r=c!=null?c:o,d=yield ie(e,{dpr:t,scale:a},r),p=new Image;return p.src=d.toDataURL(`image/${n}`,s),yield p.decode(),p.style.width=`${d.width/t}px`,p.style.height=`${d.height/t}px`,p})}function ze(i){return h(this,arguments,function*(e,{dpr:t=1,scale:a=1,backgroundColor:c,format:s="png",filename:n="snapDOM"}={}){if(s==="svg"){let u=yield Pe(e),y=URL.createObjectURL(u),w=document.createElement("a");w.href=y,w.download=`${n}.svg`,w.click(),URL.revokeObjectURL(y);return}let l=["jpg","jpeg","webp"].includes(s)?"#fff":void 0,o=c!=null?c:l,r=yield ie(e,{dpr:t,scale:a},o),d={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[s]||"image/png",p=r.toDataURL(d),m=document.createElement("a");m.href=p,m.download=`${n}.${s}`,m.click()})}function S(a){return h(this,arguments,function*(e,t={}){if(t=U({scale:1},t),!e)throw new Error("Element cannot be null or undefined");return t.iconFonts&&ve(t.iconFonts),yield S.capture(e,t)})}S.capture=(a,...c)=>h(null,[a,...c],function*(e,t={}){let s=yield Ae(e,t),n=window.devicePixelRatio||1,i=t.scale||1;return{url:s,options:t,toRaw:()=>s,toImg:()=>qe(s,{dpr:n,scale:i}),toCanvas:()=>Me(s,{dpr:n,scale:i}),toBlob:l=>Pe(s,U({dpr:n,scale:i},l)),toPng:l=>se(s,U({dpr:n,scale:i},l),"png"),toJpg:l=>se(s,U({dpr:n,scale:i},l),"jpeg"),toWebp:l=>se(s,U({dpr:n,scale:i},l),"webp"),download:({format:l="png",filename:o="capture",backgroundColor:r}={})=>ze(s,{dpr:n,scale:i,backgroundColor:r,format:l,filename:o})}});S.toRaw=(e,t)=>h(null,null,function*(){return(yield S.capture(e,t)).toRaw()});S.toImg=(e,t)=>h(null,null,function*(){return(yield S.capture(e,t)).toImg()});S.toCanvas=(e,t)=>h(null,null,function*(){return(yield S.capture(e,t)).toCanvas()});S.toBlob=(e,t)=>h(null,null,function*(){return(yield S.capture(e,t)).toBlob(t)});S.toPng=(e,t)=>h(null,null,function*(){return(yield S.capture(e,t)).toPng(t)});S.toJpg=(e,t)=>h(null,null,function*(){return(yield S.capture(e,t)).toJpg(t)});S.toWebp=(e,t)=>h(null,null,function*(){return(yield S.capture(e,t)).toWebp(t)});S.download=(a,...c)=>h(null,[a,...c],function*(e,t={}){let r=t,{format:s="png",filename:n="capture",backgroundColor:i}=r,l=he(r,["format","filename","backgroundColor"]);return yield(yield S.capture(e,l)).download({format:s,filename:n,backgroundColor:i})});function Le(){return h(this,arguments,function*(e=document,t={}){let{embedFonts:a=!0,reset:c=!1}=t;if(c){f.reset();return}yield document.fonts.ready,ge();let s=[],n=[];e!=null&&e.querySelectorAll&&(s=Array.from(e.querySelectorAll("img[src]")),n=Array.from(e.querySelectorAll("*")));let i=[];for(let l of s){let o=l.src;f.image.has(o)||i.push(P(o,{useProxy:t.useProxy}).then(r=>f.image.set(o,r)).catch(()=>{}))}for(let l of n){let o=N(l).backgroundImage;if(o&&o!=="none"){let r=j(o);for(let d of r)d.startsWith("url(")&&i.push(B(d,t).catch(()=>{}))}}a&&(yield G({preCached:!0})),yield Promise.all(i)})}typeof window!="undefined"&&(window.snapdom=S,window.preCache=Le);})();
|
|
1
|
+
(()=>{var De=Object.defineProperty;var Y=Object.getOwnPropertySymbols;var he=Object.prototype.hasOwnProperty,ge=Object.prototype.propertyIsEnumerable;var ue=(e,t,r)=>t in e?De(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,R=(e,t)=>{for(var r in t||(t={}))he.call(t,r)&&ue(e,r,t[r]);if(Y)for(var r of Y(t))ge.call(t,r)&&ue(e,r,t[r]);return e};var oe=(e,t)=>{var r={};for(var l in e)he.call(e,l)&&t.indexOf(l)<0&&(r[l]=e[l]);if(e!=null&&Y)for(var l of Y(e))t.indexOf(l)<0&&ge.call(e,l)&&(r[l]=e[l]);return r};var g=(e,t,r)=>new Promise((l,d)=>{var n=c=>{try{s(r.next(c))}catch(o){d(o)}},a=c=>{try{s(r.throw(c))}catch(o){d(o)}},s=c=>c.done?l(c.value):Promise.resolve(c.value).then(n,a);s((r=r.apply(e,t)).next())});var f={image:new Map,background:new Map,resource:new Map,defaultStyle:new Map,baseStyle:new Map,computedStyle:new WeakMap,font:new Set,snapshot:new WeakMap,snapshotKey:new Map,preStyleMap:new Map,preStyle:new WeakMap,preNodeMap:new Map,reset:Oe};function Oe(){f.computedStyle=new WeakMap,f.snapshot=new WeakMap,f.snapshotKey.clear(),f.preStyleMap.clear(),f.preStyle=new WeakMap,f.preNodeMap.clear()}var je=["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 ye(){for(let e of je)we(e)}function we(e){if(f.defaultStyle.has(e))return f.defaultStyle.get(e);if(new Set(["script","style","meta","link","noscript","template","defs","symbol","title","metadata","desc"]).has(e)){let a={};return f.defaultStyle.set(e,a),a}let r=document.getElementById("snapdom-sandbox");r||(r=document.createElement("div"),r.id="snapdom-sandbox",r.style.position="absolute",r.style.left="-9999px",r.style.top="-9999px",r.style.width="0",r.style.height="0",r.style.overflow="hidden",document.body.appendChild(r));let l=document.createElement(e);l.style.all="initial",r.appendChild(l);let d=getComputedStyle(l),n={};for(let a of d)n[a]=d.getPropertyValue(a);return r.removeChild(l),f.defaultStyle.set(e,n),n}var Ve=new Set(["-webkit-locale"]);function _(e,t,r=!1){let l=[],d=we(t);for(let[n,a]of Object.entries(e))if(!Ve.has(n))if(!r)a&&l.push(`${n}:${a}`);else{let s=d[n];a&&a!==s&&l.push(`${n}:${a}`)}return l.sort().join(";")}function be(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(r=>t.add(r.tagName.toLowerCase())),Array.from(t))}function Se(e){let t=new Map;for(let l of e){let d=f.defaultStyle.get(l);if(!d)continue;let n=Object.entries(d).map(([a,s])=>`${a}:${s};`).sort().join("");t.has(n)||t.set(n,[]),t.get(n).push(l)}let r="";for(let[l,d]of t.entries())r+=`${d.join(",")} { ${l} }
|
|
2
|
+
`;return r}function xe(){let e=new Set(f.preStyleMap.values()),t=new Map,r=1;for(let l of e)l.trim()&&t.set(l,`c${r++}`);return t}function W(r){return g(this,arguments,function*(e,t={}){let l=q(e),d=/^((repeating-)?(linear|radial|conic)-gradient)\(/i.test(e);if(l){let n=G(l);if(f.background.has(n))return t.skipInline?void 0:`url(${f.background.get(n)})`;{let a=yield P(n,{useProxy:t.useProxy});return f.background.set(n,a),t.skipInline?void 0:`url("${a}")`}}return e})}function D(e,{fast:t=!1}={}){if(t)return e();"requestIdleCallback"in window?requestIdleCallback(e,{timeout:50}):setTimeout(e,1)}function A(e,t=null){if(!(e instanceof Element))return window.getComputedStyle(e,t);let r=f.computedStyle.get(e);if(r||(r=new Map,f.computedStyle.set(e,r)),!r.has(t)){let l=window.getComputedStyle(e,t);r.set(t,l)}return r.get(t)}function Ce(e){let t=e.replace(/^['"]|['"]$/g,"");if(t.startsWith("\\"))try{return String.fromCharCode(parseInt(t.replace("\\",""),16))}catch(r){return t}return t}function q(e){let t=e.match(/url\((['"]?)(.*?)(\1)\)/);if(!t)return null;let r=t[2].trim();return r.startsWith("#")?null:r}function P(e,{timeout:t=3e3,useProxy:r=""}={}){function l(c){try{return new URL(c,window.location.href).origin===window.location.origin?"use-credentials":"anonymous"}catch(o){return"anonymous"}}function d(c){return g(this,null,function*(){let o=i=>fetch(i,{mode:"cors",credentials:l(i)==="use-credentials"?"include":"omit"}).then(p=>p.blob()).then(p=>new Promise((u,m)=>{let h=new FileReader;h.onloadend=()=>{let y=h.result;if(typeof y!="string"||!y.startsWith("data:image/")){m(new Error("Invalid image data URL"));return}u(y)},h.onerror=()=>m(new Error("FileReader error")),h.readAsDataURL(p)}));try{return yield o(c)}catch(i){if(r&&typeof r=="string"){let p=r.replace(/\/$/,"")+G(c);try{return yield o(p)}catch(u){throw new Error("[SnapDOM - fetchImage] CORS restrictions prevented image capture (even via proxy)")}}else throw new Error("[SnapDOM - fetchImage] Fetch fallback failed and no proxy provided")}})}let n=l(e);return f.image.has(e)?Promise.resolve(f.image.get(e)):e.startsWith("data:image/")?(f.image.set(e,e),Promise.resolve(e)):/\.svg(\?.*)?$/i.test(e)?g(null,null,function*(){try{let o=yield(yield fetch(e,{mode:"cors",credentials:n==="use-credentials"?"include":"omit"})).text(),i=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(o)}`;return f.image.set(e,i),i}catch(c){return d(e)}}):new Promise((c,o)=>{let i=setTimeout(()=>{o(new Error("[SnapDOM - fetchImage] Image load timed out"))},t),p=new Image;p.crossOrigin=n,p.onload=()=>g(null,null,function*(){clearTimeout(i);try{yield p.decode();let u=document.createElement("canvas");u.width=p.width,u.height=p.height,u.getContext("2d").drawImage(p,0,0,u.width,u.height);let h=u.toDataURL("image/png");f.image.set(e,h),c(h)}catch(u){try{let m=yield d(e);f.image.set(e,m),c(m)}catch(m){o(m)}}}),p.onerror=()=>g(null,null,function*(){clearTimeout(i),console.error(`[SnapDOM - fetchImage] Image failed to load: ${e}`);try{let u=yield d(e);f.image.set(e,u),c(u)}catch(u){o(u)}}),p.src=e})}function ae(e){let t={};for(let r of e)t[r]=e.getPropertyValue(r);return t}function Ee(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function ve(e){if(!e||e==="none")return"";let t=e.replace(/translate[XY]?\([^)]*\)/g,"");return t=t.replace(/matrix\(([^)]+)\)/g,(r,l)=>{let d=l.split(",").map(n=>n.trim());return d.length!==6?`matrix(${l})`:(d[4]="0",d[5]="0",`matrix(${d.join(", ")})`)}),t=t.replace(/matrix3d\(([^)]+)\)/g,(r,l)=>{let d=l.split(",").map(n=>n.trim());return d.length!==16?`matrix3d(${l})`:(d[12]="0",d[13]="0",`matrix3d(${d.join(", ")})`)}),t.trim().replace(/\s{2,}/g," ")}function G(e){if(/%[0-9A-Fa-f]{2}/.test(e))return e;try{return encodeURI(e)}catch(t){return e}}function O(e){let t=[],r=0,l=0;for(let d=0;d<e.length;d++){let n=e[d];n==="("&&r++,n===")"&&r--,n===","&&r===0&&(t.push(e.slice(l,d).trim()),l=d+1)}return t.push(e.slice(l).trim()),t}function _e(e){let t={},r=e.getPropertyValue("visibility");for(let l=0;l<e.length;l++){let d=e[l],n=e.getPropertyValue(d);(d==="background-image"||d==="content")&&n.includes("url(")&&!n.includes("data:")&&(n="none"),t[d]=n}return r==="hidden"&&(t.opacity="0"),t}function X(e,t,r){var c;if(e.tagName==="STYLE")return;f.preStyle.has(e)||f.preStyle.set(e,A(e));let l=f.preStyle.get(e);if(!f.snapshot.has(e)){let o=_e(l);f.snapshot.set(e,o)}let d=f.snapshot.get(e),n=Object.entries(d).sort(([o],[i])=>o.localeCompare(i)).map(([o,i])=>`${o}:${i}`).join(";");if(f.snapshotKey.has(n)){f.preStyleMap.set(t,f.snapshotKey.get(n));return}let a=((c=e.tagName)==null?void 0:c.toLowerCase())||"div",s=_(d,a,r);f.snapshotKey.set(n,s),f.preStyleMap.set(t,s)}function H(e,t,r={},l){var s,c;if(!e)throw new Error("Invalid node");let d=new Set,n=null;if(e.nodeType===Node.TEXT_NODE||e.nodeType!==Node.ELEMENT_NODE)return e.cloneNode(!0);if(e.getAttribute("data-capture")==="exclude"){let o=document.createElement("div"),i=e.getBoundingClientRect();return o.style.cssText=`display:inline-block;width:${i.width}px;height:${i.height}px;visibility:hidden;`,o}if(r.exclude&&Array.isArray(r.exclude))for(let o of r.exclude)try{if((s=e.matches)!=null&&s.call(e,o)){let i=document.createElement("div"),p=e.getBoundingClientRect();return i.style.cssText=`display:inline-block;width:${p.width}px;height:${p.height}px;visibility:hidden;`,i}}catch(i){console.warn(`Invalid selector in exclude option: ${o}`,i)}if(typeof r.filter=="function")try{if(!r.filter(e,l||e)){let o=document.createElement("div"),i=e.getBoundingClientRect();return o.style.cssText=`display:inline-block;width:${i.width}px;height:${i.height}px;visibility:hidden;`,o}}catch(o){console.warn("Error in filter function:",o)}if(e.tagName==="IFRAME"){let o=document.createElement("div");return o.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;`,o}if(e.getAttribute("data-capture")==="placeholder"){let o=e.cloneNode(!1);f.preNodeMap.set(o,e),X(e,o,t);let i=document.createElement("div");return i.textContent=e.getAttribute("data-placeholder-text")||"",i.style.cssText="color:#666;font-size:12px;text-align:center;line-height:1.4;padding:0.5em;box-sizing:border-box;",o.appendChild(i),o}if(e.tagName==="CANVAS"){let o=e.toDataURL(),i=document.createElement("img");return i.src=o,i.width=e.width,i.height=e.height,f.preNodeMap.set(i,e),X(e,i,t),i}let a;try{a=e.cloneNode(!1),f.preNodeMap.set(a,e)}catch(o){throw console.error("[Snapdom] Failed to clone node:",e,o),o}if(e instanceof HTMLTextAreaElement){a.textContent=e.value,a.value=e.value;let o=e.getBoundingClientRect();return a.style.width=`${o.width}px`,a.style.height=`${o.height}px`,a}if(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.indeterminate&&(a.indeterminate=e.indeterminate))),e instanceof HTMLSelectElement&&(n=e.value),X(e,a,t),e.shadowRoot)if(Array.from(e.shadowRoot.querySelectorAll("slot")).length>0){for(let i of e.shadowRoot.childNodes)if(i.nodeType===Node.ELEMENT_NODE&&i.tagName==="STYLE"){let p=i.textContent||"";p.trim()&&t&&(f.preStyle||(f.preStyle=new WeakMap),f.preStyle.set(i,p))}}else{let i=document.createDocumentFragment();for(let p of e.shadowRoot.childNodes){if(p.nodeType===Node.ELEMENT_NODE&&p.tagName==="STYLE"){let m=p.textContent||"";m.trim()&&t&&(f.preStyle||(f.preStyle=new WeakMap),f.preStyle.set(p,m));continue}let u=H(p,t,r,l||e);u&&i.appendChild(u)}a.appendChild(i)}if(e.tagName==="SLOT"){let o=((c=e.assignedNodes)==null?void 0:c.call(e,{flatten:!0}))||[],i=o.length>0?o:Array.from(e.childNodes),p=document.createDocumentFragment();for(let u of i){let m=H(u,t,r,l||e);m&&p.appendChild(m)}return p}for(let o of e.childNodes){if(d.has(o))continue;let i=H(o,t,r,l||e);i&&a.appendChild(i)}if(n!==null&&a instanceof HTMLSelectElement){a.value=n;for(let o of a.options)o.value===n?o.setAttribute("selected",""):o.removeAttribute("selected")}return a}var qe=[/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],re=[];function $e(e){let t=Array.isArray(e)?e:[e];for(let r of t)r instanceof RegExp?re.push(r):typeof r=="string"?re.push(new RegExp(r,"i")):console.warn("[snapdom] Ignored invalid iconFont value:",r)}function $(e){let t=typeof e=="string"?e:"",r=[...qe,...re];for(let l of r)if(l instanceof RegExp&&l.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 ke(e,t,r,l=32,d="#000"){return g(this,null,function*(){t=t.replace(/^['"]+|['"]+$/g,"");let n=window.devicePixelRatio||1;yield document.fonts.ready;let a=document.createElement("span");a.textContent=e,a.style.position="absolute",a.style.visibility="hidden",a.style.fontFamily=`"${t}"`,a.style.fontWeight=r||"normal",a.style.fontSize=`${l}px`,a.style.lineHeight="1",a.style.whiteSpace="nowrap",a.style.padding="0",a.style.margin="0",document.body.appendChild(a);let s=a.getBoundingClientRect(),c=Math.ceil(s.width),o=Math.ceil(s.height);document.body.removeChild(a);let i=document.createElement("canvas");i.width=c*n,i.height=o*n;let p=i.getContext("2d");return p.scale(n,n),p.font=r?`${r} ${l}px "${t}"`:`${l}px "${t}"`,p.textAlign="left",p.textBaseline="top",p.fillStyle=d,p.fillText(e,0,0),{dataUrl:i.toDataURL(),width:c,height:o}})}function Ie(e){return Array.from(document.styleSheets).some(t=>t.href===e)}function He(e){return new Promise(t=>{if(Ie(e))return t(null);let r=document.createElement("link");r.rel="stylesheet",r.href=e,r.setAttribute("data-snapdom","injected-import"),r.onload=()=>t(r),r.onerror=()=>t(null),document.head.appendChild(r)})}function J(){return g(this,arguments,function*({preCached:e=!1}={}){if(f.resource.has("fonts-embed-css")){if(e){let n=document.createElement("style");n.setAttribute("data-snapdom","embedFonts"),n.textContent=f.resource.get("fonts-embed-css"),document.head.appendChild(n)}return f.resource.get("fonts-embed-css")}let t=/@import\s+url\(["']?([^"')]+)["']?\)/g,r=[];for(let n of document.querySelectorAll("style")){let a=n.textContent||"",s=Array.from(a.matchAll(t));for(let c of s){let o=c[1];$(o)||Ie(o)||r.push(o)}}yield Promise.all(r.map(He));let l=Array.from(document.querySelectorAll('link[rel="stylesheet"]')).filter(n=>n.href),d="";for(let n of l)try{let s=yield(yield fetch(n.href)).text();if($(n.href)||$(s))continue;let c=/url\((["']?)([^"')]+)\1\)/g,o=yield Promise.all(Array.from(s.matchAll(c)).map(p=>g(null,null,function*(){let u=q(p[0]);if(!u)return null;let m=u;if(!m.startsWith("http")&&!m.startsWith("data:")&&(m=new URL(m,n.href).href),$(m))return null;if(f.resource.has(m))return f.font.add(m),{original:p[0],inlined:`url(${f.resource.get(m)})`};if(f.font.has(m))return null;try{let y=yield(yield fetch(m)).blob(),S=yield new Promise(w=>{let b=new FileReader;b.onload=()=>w(b.result),b.readAsDataURL(y)});return f.resource.set(m,S),f.font.add(m),{original:p[0],inlined:`url(${S})`}}catch(h){return console.warn("[snapdom] Failed to fetch font resource:",m),null}}))),i=s;for(let p of o)p&&(i=i.replace(p.original,p.inlined));d+=i+`
|
|
3
|
+
`}catch(a){console.warn("[snapdom] Failed to fetch CSS:",n.href)}for(let n of document.styleSheets)try{if(!n.href||l.every(a=>a.href!==n.href)){for(let a of n.cssRules)if(a.type===CSSRule.FONT_FACE_RULE){let s=a.style.getPropertyValue("src"),c=a.style.getPropertyValue("font-family");if(!s||$(c))continue;let o=/url\((["']?)([^"')]+)\1\)/g,i=/local\((["']?)[^)]+?\1\)/g,p=!!s.match(o),u=!!s.match(i);if(!p&&u){d+=`@font-face{font-family:${c};src:${s};font-style:${a.style.getPropertyValue("font-style")||"normal"};font-weight:${a.style.getPropertyValue("font-weight")||"normal"};}`;continue}let m=s,h=Array.from(s.matchAll(o));for(let y of h){let S=y[2].trim();if(!S)continue;let w=S;if(!w.startsWith("http")&&!w.startsWith("data:")&&(w=new URL(w,n.href||location.href).href),!$(w)){if(f.resource.has(w)){f.font.add(w),m=m.replace(y[0],`url(${f.resource.get(w)})`);continue}if(!f.font.has(w))try{let T=yield(yield fetch(w)).blob(),k=yield new Promise(F=>{let I=new FileReader;I.onload=()=>F(I.result),I.readAsDataURL(T)});f.resource.set(w,k),f.font.add(w),m=m.replace(y[0],`url(${k})`)}catch(b){console.warn("[snapdom] Failed to fetch font URL:",w)}}}d+=`@font-face{font-family:${c};src:${m};font-style:${a.style.getPropertyValue("font-style")||"normal"};font-weight:${a.style.getPropertyValue("font-weight")||"normal"};}`}}}catch(a){console.warn("[snapdom] Cannot access stylesheet",n.href,a)}for(let n of document.fonts)if(n.family&&n.status==="loaded"&&n._snapdomSrc){if($(n.family))continue;let a=n._snapdomSrc;if(!a.startsWith("data:")){if(f.resource.has(n._snapdomSrc))a=f.resource.get(n._snapdomSrc),f.font.add(n._snapdomSrc);else if(!f.font.has(n._snapdomSrc))try{let c=yield(yield fetch(n._snapdomSrc)).blob();a=yield new Promise(o=>{let i=new FileReader;i.onload=()=>o(i.result),i.readAsDataURL(c)}),f.resource.set(n._snapdomSrc,a),f.font.add(n._snapdomSrc)}catch(s){console.warn("[snapdom] Failed to fetch dynamic font src:",n._snapdomSrc);continue}}d+=`@font-face{font-family:'${n.family}';src:url(${a});font-style:${n.style||"normal"};font-weight:${n.weight||"normal"};}`}if(d&&(f.resource.set("fonts-embed-css",d),e)){let n=document.createElement("style");n.setAttribute("data-snapdom","embedFonts"),n.textContent=d,document.head.appendChild(n)}return d})}function se(e,t,r){return g(this,null,function*(){var n;if(!(e instanceof Element)||!(t instanceof Element))return;for(let a of["::before","::after","::first-letter"])try{let s=A(e,a);if(!s||typeof s[Symbol.iterator]!="function"||s.content==="none"&&s.backgroundImage==="none"&&s.backgroundColor==="transparent"&&(s.borderStyle==="none"||parseFloat(s.borderWidth)===0)&&(!s.transform||s.transform==="none")&&s.display==="inline")continue;if(a==="::first-letter"){let E=getComputedStyle(e);if(!(s.color!==E.color||s.fontSize!==E.fontSize||s.fontWeight!==E.fontWeight))continue;let L=Array.from(t.childNodes).find(pe=>{var me;return pe.nodeType===Node.TEXT_NODE&&((me=pe.textContent)==null?void 0:me.trim().length)>0});if(!L)continue;let U=L.textContent,ne=U.match(/^([^\p{L}\p{N}\s]*[\p{L}\p{N}](?:['’])?)/u),B=ne==null?void 0:ne[0],Ue=U.slice((B==null?void 0:B.length)||0);if(!B||/[\uD800-\uDFFF]/.test(B))continue;let K=document.createElement("span");K.textContent=B,K.dataset.snapdomPseudo="::first-letter";let Be=ae(s),We=_(Be,"span",r);f.preStyleMap.set(K,We);let fe=document.createTextNode(Ue);t.replaceChild(fe,L),t.insertBefore(K,fe);continue}let o=s.content,i=/counter\s*\(|counters\s*\(/.test(o)?"- ":Ce(o),p=s.backgroundImage,u=s.backgroundColor,m=s.fontFamily,h=parseInt(s.fontSize)||32,y=parseInt(s.fontWeight)||!1,S=s.color||"#000",w=s.display,b=parseFloat(s.width),T=parseFloat(s.height),k=s.borderStyle,F=parseFloat(s.borderWidth),I=s.transform,N=$(m),j=o!=="none"&&i!=="",z=p&&p!=="none",V=u&&u!=="transparent"&&u!=="rgba(0, 0, 0, 0)",Q=w!=="inline"&&(b>0||T>0),Z=k&&k!=="none"&&F>0,M=I&&I!=="none";if(!(j||z||V||Q||Z||M))continue;let C=document.createElement("span");C.dataset.snapdomPseudo=a,C.style.verticalAlign="middle";let ee=ae(s),te=_(ee,"span",r);if(f.preStyleMap.set(C,te),N&&i.length===1){let{dataUrl:E,width:v,height:L}=yield ke(i,m,y,h,S),U=document.createElement("img");U.src=E,U.style=`height:${h}px;width:${v/L*h}px;object-fit:contain;`,C.appendChild(U),t.dataset.snapdomHasIcon="true"}else if(i.startsWith("url(")){let E=q(i);if(E!=null&&E.trim())try{let v=document.createElement("img"),L=yield P(G(E),r);v.src=L,v.style=`width:${h}px;height:auto;object-fit:contain;`,C.appendChild(v)}catch(v){console.error(`[snapdom] Error in pseudo ${a} for`,e,v)}}else!N&&j&&(C.textContent=i);if(z)try{let E=O(p),v=yield Promise.all(E.map(W));C.style.backgroundImage=v.join(", ")}catch(E){console.warn(`[snapdom] Failed to inline background-image for ${a}`,E)}if(V&&(C.style.backgroundColor=u),!(C.childNodes.length>0||((n=C.textContent)==null?void 0:n.trim())!==""||z||V||Q||Z||M))continue;a==="::before"?t.insertBefore(C,t.firstChild):t.appendChild(C)}catch(s){console.warn(`[snapdom] Failed to capture ${a} for`,e,s)}let l=Array.from(e.children),d=Array.from(t.children).filter(a=>!a.dataset.snapdomPseudo);for(let a=0;a<Math.min(l.length,d.length);a++)yield se(l[a],d[a],r)})}function Re(e){if(!e)return;let t=new Set;if(e.querySelectorAll("use").forEach(s=>{let c=s.getAttribute("xlink:href")||s.getAttribute("href");c&&c.startsWith("#")&&t.add(c.slice(1))}),!t.size)return;let r=Array.from(document.querySelectorAll("svg > symbol, svg > defs")),l=r.filter(s=>s.tagName.toLowerCase()==="symbol"),d=r.filter(s=>s.tagName.toLowerCase()==="defs"),n=e.querySelector("svg.inline-defs-container");n||(n=document.createElementNS("http://www.w3.org/2000/svg","svg"),n.setAttribute("aria-hidden","true"),n.setAttribute("style","position: absolute; width: 0; height: 0; overflow: hidden;"),n.classList.add("inline-defs-container"),e.insertBefore(n,e.firstChild));let a=new Set;e.querySelectorAll("symbol[id], defs > *[id]").forEach(s=>{a.add(s.id)}),t.forEach(s=>{if(a.has(s))return;let c=l.find(o=>o.id===s);if(c){n.appendChild(c.cloneNode(!0)),a.add(s);return}for(let o of d){let i=o.querySelector(`#${CSS.escape(s)}`);if(i){let p=n.querySelector("defs");p||(p=document.createElementNS("http://www.w3.org/2000/svg","defs"),n.appendChild(p)),p.appendChild(i.cloneNode(!0)),a.add(s);break}}})}function Ne(d){return g(this,arguments,function*(e,t=!1,r=!1,l={}){var s,c;let n,a="";ze(e);try{Re(e)}catch(o){console.warn("inlineExternal defs or symbol failed:",o)}try{n=H(e,t,l,e)}catch(o){throw console.warn("deepClone failed:",o),o}try{yield se(e,n,t,r,l.useProxy)}catch(o){console.warn("inlinePseudoElements failed:",o)}if(t){let o=xe();a=Array.from(o.entries()).map(([i,p])=>`.${p}{${i}}`).join("");for(let[i,p]of f.preStyleMap.entries()){if(i.tagName==="STYLE")continue;if(i.getRootNode&&i.getRootNode()instanceof ShadowRoot){i.setAttribute("style",p.replace(/;/g,"; "));continue}let u=o.get(p);u&&i.classList.add(u);let m=(s=i.style)==null?void 0:s.backgroundImage,h=(c=i.dataset)==null?void 0:c.snapdomHasIcon;m&&m!=="none"&&(i.style.backgroundImage=m),h&&(i.style.verticalAlign="middle",i.style.display="inline")}}else for(let[o,i]of f.preStyleMap.entries())o.tagName!=="STYLE"&&o.setAttribute("style",i.replace(/;/g,"; "));for(let[o,i]of f.preNodeMap.entries()){let p=i.scrollLeft,u=i.scrollTop;if((p||u)&&o instanceof HTMLElement){o.style.overflow="hidden",o.style.scrollbarWidth="none",o.style.msOverflowStyle="none";let h=document.createElement("div");for(h.style.transform=`translate(${-p}px, ${-u}px)`,h.style.willChange="transform",h.style.display="inline-block",h.style.width="100%";o.firstChild;)h.appendChild(o.firstChild);o.appendChild(h)}}if(e===f.preNodeMap.get(n)){let o=f.preStyle.get(e)||window.getComputedStyle(e);f.preStyle.set(e,o);let i=ve(o.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=i||""}for(let[o,i]of f.preNodeMap.entries())i.tagName==="PRE"&&(o.style.marginTop="0",o.style.marginBlockStart="0");return{clone:n,classCSS:a}})}function ze(e){let t=getComputedStyle(e),r=t.outlineStyle,l=t.outlineWidth,d=t.borderStyle,n=t.borderWidth,a=r!=="none"&&parseFloat(l)>0,s=d==="none"||parseFloat(n)===0;a&&s&&(e.style.border=`${l} solid transparent`)}function Ae(r){return g(this,arguments,function*(e,t={}){let l=Array.from(e.querySelectorAll("img")),d=n=>g(null,null,function*(){let a=n.src;try{let s=yield P(a,{useProxy:t.useProxy});n.src=s,n.width||(n.width=n.naturalWidth||100),n.height||(n.height=n.naturalHeight||100)}catch(s){let c=document.createElement("div");c.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;`,c.innerText="img",n.replaceWith(c)}});for(let n=0;n<l.length;n+=4){let a=l.slice(n,n+4).map(d);yield Promise.allSettled(a)}})}function Te(l,d){return g(this,arguments,function*(e,t,r={}){let n=[[e,t]],a=["background-image","mask","mask-image","-webkit-mask-image","mask-source","mask-box-image-source","mask-border-source","-webkit-mask-box-image-source","border-image","border-image-source","border-image-slice","border-image-width","border-image-outset","border-image-repeat"];for(;n.length;){let[s,c]=n.shift(),o=f.preStyle.get(s)||A(s);f.preStyle.has(s)||f.preStyle.set(s,o);let i=(()=>{let h=o.getPropertyValue("border-image"),y=o.getPropertyValue("border-image-source");return h&&h!=="none"||y&&y!=="none"})();for(let h of a){if(["border-image-slice","border-image-width","border-image-outset","border-image-repeat"].includes(h)&&!i)continue;let y=o.getPropertyValue(h);if(!y||y==="none")continue;let S=O(y),w=yield Promise.all(S.map(b=>W(b,r)));w.some(b=>b&&b!=="none"&&!/^url\(undefined/.test(b))&&c.style.setProperty(h,w.join(", "))}let p=o.getPropertyValue("background-color");p&&p!=="transparent"&&p!=="rgba(0, 0, 0, 0)"&&(c.style.backgroundColor=p);let u=Array.from(s.children),m=Array.from(c.children);for(let h=0;h<Math.min(u.length,m.length);h++)n.push([u[h],m[h]])}})}function Me(r){return g(this,arguments,function*(e,t={}){if(!e)throw new Error("Element cannot be null or undefined");f.reset();let{compress:l=!0,embedFonts:d=!1,fast:n=!0,scale:a=1,useProxy:s=""}=t,c,o,i="",p="",u,m;if({clone:c,classCSS:o}=yield Ne(e,l,d,t),yield new Promise(y=>{D(()=>g(null,null,function*(){yield Ae(c,t),y()}),{fast:n})}),yield new Promise(y=>{D(()=>g(null,null,function*(){yield Te(e,c,t),y()}),{fast:n})}),d&&(yield new Promise(y=>{D(()=>g(null,null,function*(){i=yield J(),y()}),{fast:n})})),l){let y=be(c).sort(),S=y.join(",");f.baseStyle.has(S)?p=f.baseStyle.get(S):yield new Promise(w=>{D(()=>{p=Se(y),f.baseStyle.set(S,p),w()},{fast:n})})}yield new Promise(y=>{D(()=>{let S=e.getBoundingClientRect(),w=S.width,b=S.height,T=Number.isFinite(t.width),k=Number.isFinite(t.height),F=typeof a=="number"&&a!==1;if(!F){let M=S.width/S.height;T&&k?(w=t.width,b=t.height):T?(w=t.width,b=w/M):k&&(b=t.height,w=b*M)}if(w=Math.ceil(w),b=Math.ceil(b),c.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),c.style.transformOrigin="top left",!F&&(T||k)){let M=S.width,le=S.height,C=w/M,ee=b/le,te=c.style.transform||"",de=`scale(${C}, ${ee})`;c.style.transform=`${de} ${te}`.trim()}let I="http://www.w3.org/2000/svg",N=document.createElementNS(I,"foreignObject");N.setAttribute("width","100%"),N.setAttribute("height","100%");let j=document.createElement("style");j.textContent=p+i+"svg{overflow:visible;}"+o,N.appendChild(j),N.appendChild(c);let V=new XMLSerializer().serializeToString(N);m=`<svg xmlns="${I}" width="${w}" height="${b}" viewBox="0 0 ${w} ${b}">`+V+"</svg>",u=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(m)}`,y()},{fast:n})});let h=document.getElementById("snapdom-sandbox");return h&&h.style.position==="absolute"&&h.remove(),u})}function Ke(r){return g(this,arguments,function*(e,{scale:t=1}={}){let l=new Image;return l.src=e,yield l.decode(),t!==1&&(l.style.width=`${l.naturalWidth*t}px`,l.style.height=`${l.naturalHeight*t}px`),l})}function Le(l){return g(this,arguments,function*(e,{dpr:t=1,scale:r=1}={}){let d=new Image;d.src=e,d.crossOrigin="anonymous",d.loading="eager",d.decoding="sync";let n=Ee(),a=!1;if(n&&(document.body.appendChild(d),a=!0),yield d.decode(),n&&(yield new Promise(p=>setTimeout(p,100))),d.width===0||d.height===0)throw a&&d.remove(),new Error("Image failed to load or has no dimensions");let s=d.naturalWidth*r,c=d.naturalHeight*r,o=document.createElement("canvas");o.width=Math.ceil(s*t),o.height=Math.ceil(c*t),o.style.width=`${s}px`,o.style.height=`${c}px`;let i=o.getContext("2d");return i.scale(t,t),i.drawImage(d,0,0,s,c),a&&d.remove(),o})}function Pe(n){return g(this,arguments,function*(e,{type:t="svg",scale:r=1,backgroundColor:l="#fff",quality:d}={}){let a={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[t]||"image/png";if(t==="svg"){let c=decodeURIComponent(e.split(",")[1]);return new Blob([c],{type:"image/svg+xml"})}let s=yield ce(e,{dpr:1,scale:r},l);return new Promise(c=>{s.toBlob(o=>c(o),`${a}`,d)})})}function ce(d,n,a){return g(this,arguments,function*(e,{dpr:t=1,scale:r=1},l){let s=yield Le(e,{dpr:t,scale:r});if(!l)return s;let c=document.createElement("canvas");c.width=s.width,c.height=s.height;let o=c.getContext("2d");return o.fillStyle=l,o.fillRect(0,0,c.width,c.height),o.drawImage(s,0,0),c})}function ie(a,s){return g(this,arguments,function*(e,{dpr:t=1,scale:r=1,backgroundColor:l,quality:d},n="png"){let c=["jpg","jpeg","webp"].includes(n)?"#fff":void 0,o=l!=null?l:c,i=yield ce(e,{dpr:t,scale:r},o),p=new Image;return p.src=i.toDataURL(`image/${n}`,d),yield p.decode(),p.style.width=`${i.width/t}px`,p.style.height=`${i.height/t}px`,p})}function Ye(a){return g(this,arguments,function*(e,{dpr:t=1,scale:r=1,backgroundColor:l,format:d="png",filename:n="snapDOM"}={}){if(d==="svg"){let m=yield Pe(e),h=URL.createObjectURL(m),y=document.createElement("a");y.href=h,y.download=`${n}.svg`,y.click(),URL.revokeObjectURL(h);return}let s=["jpg","jpeg","webp"].includes(d)?"#fff":void 0,c=l!=null?l:s,o=yield ce(e,{dpr:t,scale:r},c),i={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[d]||"image/png",p=o.toDataURL(i),u=document.createElement("a");u.href=p,u.download=`${n}.${d}`,u.click()})}function x(r){return g(this,arguments,function*(e,t={}){if(t=R({scale:1},t),!e)throw new Error("Element cannot be null or undefined");return t.iconFonts&&$e(t.iconFonts),yield x.capture(e,t)})}x.capture=(r,...l)=>g(null,[r,...l],function*(e,t={}){var s;let d=yield Me(e,t),n=(s=t.dpr)!=null?s:window.devicePixelRatio||1,a=t.scale||1;return{url:d,options:t,toRaw:()=>d,toImg:(c={})=>Ke(d,R({dpr:n,scale:a},c)),toCanvas:(c={})=>Le(d,R({dpr:n,scale:a},c)),toBlob:(c={})=>Pe(d,R({dpr:n,scale:a},c)),toPng:(c={})=>ie(d,R({dpr:n,scale:a},c),"png"),toJpg:(c={})=>ie(d,R({dpr:n,scale:a},c),"jpeg"),toWebp:(c={})=>ie(d,R({dpr:n,scale:a},c),"webp"),download:(u={})=>{var m=u,{format:c="png",filename:o="snapDOM",backgroundColor:i}=m,p=oe(m,["format","filename","backgroundColor"]);return Ye(d,R({dpr:n,scale:a,format:c,filename:o,backgroundColor:i},p))}}});x.toRaw=(e,t)=>g(null,null,function*(){return(yield x.capture(e,t)).toRaw()});x.toImg=(e,t)=>g(null,null,function*(){return(yield x.capture(e,t)).toImg()});x.toCanvas=(e,t)=>g(null,null,function*(){return(yield x.capture(e,t)).toCanvas()});x.toBlob=(e,t)=>g(null,null,function*(){return(yield x.capture(e,t)).toBlob(t)});x.toPng=(e,t)=>g(null,null,function*(){return(yield x.capture(e,t)).toPng(t)});x.toJpg=(e,t)=>g(null,null,function*(){return(yield x.capture(e,t)).toJpg(t)});x.toWebp=(e,t)=>g(null,null,function*(){return(yield x.capture(e,t)).toWebp(t)});x.download=(r,...l)=>g(null,[r,...l],function*(e,t={}){let o=t,{format:d="png",filename:n="capture",backgroundColor:a}=o,s=oe(o,["format","filename","backgroundColor"]);return yield(yield x.capture(e,s)).download({format:d,filename:n,backgroundColor:a})});function Fe(){return g(this,arguments,function*(e=document,t={}){let{embedFonts:r=!0,reset:l=!1}=t;if(l){f.reset();return}yield document.fonts.ready,ye();let d=[],n=[];e!=null&&e.querySelectorAll&&(d=Array.from(e.querySelectorAll("img[src]")),n=Array.from(e.querySelectorAll("*")));let a=[];for(let s of d){let c=s.src;f.image.has(c)||a.push(P(c,{useProxy:t.useProxy}).then(o=>f.image.set(c,o)).catch(()=>{}))}for(let s of n){let c=A(s).backgroundImage;if(c&&c!=="none"){let o=O(c);for(let i of o)i.startsWith("url(")&&a.push(W(i,t).catch(()=>{}))}}r&&(yield J({preCached:!0})),yield Promise.all(a)})}typeof window!="undefined"&&(window.snapdom=x,window.preCache=Fe);})();
|
package/dist/snapdom.min.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var l={image:new Map,background:new Map,resource:new Map,defaultStyle:new Map,baseStyle:new Map,computedStyle:new WeakMap,font:new Set,snapshot:new WeakMap,snapshotKey:new Map,preStyleMap:new Map,preStyle:new WeakMap,preNodeMap:new Map,reset:Re};function Re(){l.computedStyle=new WeakMap,l.snapshot=new WeakMap,l.snapshotKey.clear(),l.preStyleMap.clear(),l.preStyle=new WeakMap,l.preNodeMap.clear()}var Ne=["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 ie(){for(let e of Ne)ce(e)}function ce(e){if(l.defaultStyle.has(e))return l.defaultStyle.get(e);if(new Set(["script","style","meta","link","noscript","template"]).has(e)){let
|
|
2
|
-
`;return r}function de(){let e=new Set(l.preStyleMap.values()),t=new Map,r=1;for(let c of e)t.set(c,`c${r++}`);return t}async function P(e,t={}){let r=D(e),c=/^((repeating-)?(linear|radial|conic)-gradient)\(/i.test(e);if(r){let o=q(r);if(l.background.has(o))return t.skipInline?void 0:`url(${l.background.get(o)})`;{let n=await M(o,{useProxy:t.useProxy});return l.background.set(o,n),t.skipInline?void 0:`url("${n}")`}}return e}function L(e,{fast:t=!1}={}){if(t)return e();"requestIdleCallback"in window?requestIdleCallback(e,{timeout:50}):setTimeout(e,1)}function R(e,t=null){if(!(e instanceof Element))return window.getComputedStyle(e,t);let r=l.computedStyle.get(e);if(r||(r=new Map,l.computedStyle.set(e,r)),!r.has(t)){let c=window.getComputedStyle(e,t);r.set(t,c)}return r.get(t)}function ue(e){let t=e.replace(/^['"]|['"]$/g,"");if(t.startsWith("\\"))try{return String.fromCharCode(parseInt(t.replace("\\",""),16))}catch{return t}return t}function D(e){let t=e.match(/url\((['"]?)(.*?)(\1)\)/);if(!t)return null;let r=t[2].trim();return r.startsWith("#")?null:r}function M(e,{timeout:t=3e3,useProxy:r=""}={}){function c(s){try{return new URL(s,window.location.href).origin===window.location.origin?"use-credentials":"anonymous"}catch{return"anonymous"}}async function o(s){let f=u=>fetch(u,{mode:"cors",credentials:c(u)==="use-credentials"?"include":"omit"}).then(d=>d.blob()).then(d=>new Promise((h,p)=>{let m=new FileReader;m.onloadend=()=>{let g=m.result;if(typeof g!="string"||!g.startsWith("data:image/")){p(new Error("Invalid image data URL"));return}h(g)},m.onerror=()=>p(new Error("FileReader error")),m.readAsDataURL(d)}));try{return await f(s)}catch{if(r&&typeof r=="string"){let d=r.replace(/\/$/,"")+q(s);try{return await f(d)}catch{throw new Error("[SnapDOM - fetchImage] CORS restrictions prevented image capture (even via proxy)")}}else throw new Error("[SnapDOM - fetchImage] Fetch fallback failed and no proxy provided")}}let n=c(e);return l.image.has(e)?Promise.resolve(l.image.get(e)):e.startsWith("data:image/")?(l.image.set(e,e),Promise.resolve(e)):/\.svg(\?.*)?$/i.test(e)?(async()=>{try{let f=await(await fetch(e,{mode:"cors",credentials:n==="use-credentials"?"include":"omit"})).text(),u=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(f)}`;return l.image.set(e,u),u}catch{return o(e)}})():new Promise((s,f)=>{let u=setTimeout(()=>{f(new Error("[SnapDOM - fetchImage] Image load timed out"))},t),d=new Image;d.crossOrigin=n,d.onload=async()=>{clearTimeout(u);try{await d.decode();let h=document.createElement("canvas");h.width=d.width,h.height=d.height,h.getContext("2d").drawImage(d,0,0,h.width,h.height);let m=h.toDataURL("image/png");l.image.set(e,m),s(m)}catch{try{let h=await o(e);l.image.set(e,h),s(h)}catch(h){f(h)}}},d.onerror=async()=>{clearTimeout(u),console.error(`[SnapDOM - fetchImage] Image failed to load: ${e}`);try{let h=await o(e);l.image.set(e,h),s(h)}catch(h){f(h)}},d.src=e})}function Z(e){let t={};for(let r of e)t[r]=e.getPropertyValue(r);return t}function pe(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function me(e){if(!e||e==="none")return"";let t=e.replace(/translate[XY]?\([^)]*\)/g,"");return t=t.replace(/matrix\(([^)]+)\)/g,(r,c)=>{let o=c.split(",").map(n=>n.trim());return o.length!==6?`matrix(${c})`:(o[4]="0",o[5]="0",`matrix(${o.join(", ")})`)}),t=t.replace(/matrix3d\(([^)]+)\)/g,(r,c)=>{let o=c.split(",").map(n=>n.trim());return o.length!==16?`matrix3d(${c})`:(o[12]="0",o[13]="0",`matrix3d(${o.join(", ")})`)}),t.trim().replace(/\s{2,}/g," ")}function q(e){if(/%[0-9A-Fa-f]{2}/.test(e))return e;try{return encodeURI(e)}catch{return e}}function F(e){let t=[],r=0,c=0;for(let o=0;o<e.length;o++){let n=e[o];n==="("&&r++,n===")"&&r--,n===","&&r===0&&(t.push(e.slice(c,o).trim()),c=o+1)}return t.push(e.slice(c).trim()),t}function Te(e){let t={};for(let r=0;r<e.length;r++){let c=e[r],o=e.getPropertyValue(c);(c==="background-image"||c==="content")&&o.includes("url(")&&!o.includes("data:")&&(o="none"),t[c]=o}return t}function z(e,t,r){if(e.tagName==="STYLE")return;l.preStyle.has(e)||l.preStyle.set(e,R(e));let c=l.preStyle.get(e);if(!l.snapshot.has(e)){let s=Te(c);l.snapshot.set(e,s)}let o=l.snapshot.get(e),n=Object.entries(o).sort(([s],[f])=>s.localeCompare(f)).map(([s,f])=>`${s}:${f}`).join(";");if(l.snapshotKey.has(n)){l.preStyleMap.set(t,l.snapshotKey.get(n));return}let i=e.tagName?.toLowerCase()||"div",a=U(o,i,r);l.snapshotKey.set(n,a),l.preStyleMap.set(t,a)}function j(e,t,r={},c){if(!e)throw new Error("Invalid node");let o=new Set,n=null;if(e.nodeType===Node.TEXT_NODE||e.nodeType!==Node.ELEMENT_NODE)return e.cloneNode(!0);if(e.getAttribute("data-capture")==="exclude"){let a=document.createElement("div"),s=e.getBoundingClientRect();return a.style.cssText=`display:inline-block;width:${s.width}px;height:${s.height}px;visibility:hidden;`,a}if(r.exclude&&Array.isArray(r.exclude))for(let a of r.exclude)try{if(e.matches?.(a)){let s=document.createElement("div"),f=e.getBoundingClientRect();return s.style.cssText=`display:inline-block;width:${f.width}px;height:${f.height}px;visibility:hidden;`,s}}catch(s){console.warn(`Invalid selector in exclude option: ${a}`,s)}if(typeof r.filter=="function")try{if(!r.filter(e,c||e)){let a=document.createElement("div"),s=e.getBoundingClientRect();return a.style.cssText=`display:inline-block;width:${s.width}px;height:${s.height}px;visibility:hidden;`,a}}catch(a){console.warn("Error in filter function:",a)}if(e.tagName==="IFRAME"){let a=document.createElement("div");return a.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;`,a}if(e.getAttribute("data-capture")==="placeholder"){let a=e.cloneNode(!1);l.preNodeMap.set(a,e),z(e,a,t);let s=document.createElement("div");return s.textContent=e.getAttribute("data-placeholder-text")||"",s.style.cssText="color:#666;font-size:12px;text-align:center;line-height:1.4;padding:0.5em;box-sizing:border-box;",a.appendChild(s),a}if(e.tagName==="CANVAS"){let a=e.toDataURL(),s=document.createElement("img");return s.src=a,s.width=e.width,s.height=e.height,l.preNodeMap.set(s,e),z(e,s,t),s}let i;try{i=e.cloneNode(!1),l.preNodeMap.set(i,e)}catch(a){throw console.error("[Snapdom] Failed to clone node:",e,a),a}if(e instanceof HTMLTextAreaElement){i.textContent=e.value,i.value=e.value;let a=e.getBoundingClientRect();return i.style.width=`${a.width}px`,i.style.height=`${a.height}px`,i}if(e instanceof HTMLInputElement&&(i.value=e.value,i.setAttribute("value",e.value),e.checked!==void 0&&(i.checked=e.checked,e.checked&&i.setAttribute("checked",""),e.indeterminate&&(i.indeterminate=e.indeterminate))),e instanceof HTMLSelectElement&&(n=e.value),z(e,i,t),e.shadowRoot)if(Array.from(e.shadowRoot.querySelectorAll("slot")).length>0){for(let s of e.shadowRoot.childNodes)if(s.nodeType===Node.ELEMENT_NODE&&s.tagName==="STYLE"){let f=s.textContent||"";f.trim()&&t&&(l.preStyle||(l.preStyle=new WeakMap),l.preStyle.set(s,f))}}else{let s=document.createDocumentFragment();for(let f of e.shadowRoot.childNodes){if(f.nodeType===Node.ELEMENT_NODE&&f.tagName==="STYLE"){let d=f.textContent||"";d.trim()&&t&&(l.preStyle||(l.preStyle=new WeakMap),l.preStyle.set(f,d));continue}let u=j(f,t,r,c||e);u&&s.appendChild(u)}i.appendChild(s)}if(e.tagName==="SLOT"){let a=e.assignedNodes?.({flatten:!0})||[],s=a.length>0?a:Array.from(e.childNodes),f=document.createDocumentFragment();for(let u of s){let d=j(u,t,r,c||e);d&&f.appendChild(d)}return f}for(let a of e.childNodes){if(o.has(a))continue;let s=j(a,t,r,c||e);s&&i.appendChild(s)}if(n!==null&&i instanceof HTMLSelectElement){i.value=n;for(let a of i.options)a.value===n?a.setAttribute("selected",""):a.removeAttribute("selected")}return i}var Ae=[/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],ee=[];function he(e){let t=Array.isArray(e)?e:[e];for(let r of t)r instanceof RegExp?ee.push(r):typeof r=="string"?ee.push(new RegExp(r,"i")):console.warn("[snapdom] Ignored invalid iconFont value:",r)}function v(e){let t=typeof e=="string"?e:"",r=[...Ae,...ee];for(let c of r)if(c instanceof RegExp&&c.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))}async function ge(e,t,r,c=32,o="#000"){t=t.replace(/^['"]+|['"]+$/g,"");let n=window.devicePixelRatio||1,a=document.createElement("canvas").getContext("2d");a.font=r?`${r} ${c}px "${t}"`:`${c}px "${t}"`;let s=a.measureText(e),f=s.actualBoundingBoxAscent||c*.8,u=s.actualBoundingBoxDescent||c*.2,d=f+u,h=s.width,p=document.createElement("canvas");p.width=Math.ceil(h*n),p.height=Math.ceil(d*n);let m=p.getContext("2d");return m.scale(n,n),m.font=a.font,m.textAlign="left",m.textBaseline="alphabetic",m.fillStyle=o,m.fillText(e,0,f),p.toDataURL()}function ye(e){return Array.from(document.styleSheets).some(t=>t.href===e)}function Me(e){return new Promise(t=>{if(ye(e))return t(null);let r=document.createElement("link");r.rel="stylesheet",r.href=e,r.setAttribute("data-snapdom","injected-import"),r.onload=()=>t(r),r.onerror=()=>t(null),document.head.appendChild(r)})}async function H({preCached:e=!1}={}){if(l.resource.has("fonts-embed-css")){if(e){let n=document.createElement("style");n.setAttribute("data-snapdom","embedFonts"),n.textContent=l.resource.get("fonts-embed-css"),document.head.appendChild(n)}return l.resource.get("fonts-embed-css")}let t=/@import\s+url\(["']?([^"')]+)["']?\)/g,r=[];for(let n of document.querySelectorAll("style")){let i=n.textContent||"",a=Array.from(i.matchAll(t));for(let s of a){let f=s[1];v(f)||ye(f)||r.push(f)}}await Promise.all(r.map(Me));let c=Array.from(document.querySelectorAll('link[rel="stylesheet"]')).filter(n=>n.href),o="";for(let n of c)try{let a=await(await fetch(n.href)).text();if(v(n.href)||v(a))continue;let s=/url\((["']?)([^"')]+)\1\)/g,f=await Promise.all(Array.from(a.matchAll(s)).map(async d=>{let h=D(d[0]);if(!h)return null;let p=h;if(!p.startsWith("http")&&!p.startsWith("data:")&&(p=new URL(p,n.href).href),v(p))return null;if(l.resource.has(p))return l.font.add(p),{original:d[0],inlined:`url(${l.resource.get(p)})`};if(l.font.has(p))return null;try{let g=await(await fetch(p)).blob(),w=await new Promise(y=>{let E=new FileReader;E.onload=()=>y(E.result),E.readAsDataURL(g)});return l.resource.set(p,w),l.font.add(p),{original:d[0],inlined:`url(${w})`}}catch{return console.warn("[snapdom] Failed to fetch font resource:",p),null}})),u=a;for(let d of f)d&&(u=u.replace(d.original,d.inlined));o+=u+`
|
|
3
|
-
`}catch{console.warn("[snapdom] Failed to fetch CSS:",n.href)}for(let n of document.styleSheets)try{if(!n.href||c.every(i=>i.href!==n.href)){for(let i of n.cssRules)if(i.type===CSSRule.FONT_FACE_RULE){let a=i.style.getPropertyValue("src"),s=i.style.getPropertyValue("font-family");if(!a||v(s))continue;let f=/url\((["']?)([^"')]+)\1\)/g,u=/local\((["']?)[^)]+?\1\)/g,d=!!a.match(f),h=!!a.match(u);if(!d&&h){o+=`@font-face{font-family:${s};src:${a};font-style:${i.style.getPropertyValue("font-style")||"normal"};font-weight:${i.style.getPropertyValue("font-weight")||"normal"};}`;continue}let p=a,m=Array.from(a.matchAll(f));for(let g of m){let w=g[2].trim();if(!w)continue;let y=w;if(!y.startsWith("http")&&!y.startsWith("data:")&&(y=new URL(y,n.href||location.href).href),!v(y)){if(l.resource.has(y)){l.font.add(y),p=p.replace(g[0],`url(${l.resource.get(y)})`);continue}if(!l.font.has(y))try{let k=await(await fetch(y)).blob(),$=await new Promise(N=>{let S=new FileReader;S.onload=()=>N(S.result),S.readAsDataURL(k)});l.resource.set(y,$),l.font.add(y),p=p.replace(g[0],`url(${$})`)}catch{console.warn("[snapdom] Failed to fetch font URL:",y)}}}o+=`@font-face{font-family:${s};src:${p};font-style:${i.style.getPropertyValue("font-style")||"normal"};font-weight:${i.style.getPropertyValue("font-weight")||"normal"};}`}}}catch(i){console.warn("[snapdom] Cannot access stylesheet",n.href,i)}for(let n of document.fonts)if(n.family&&n.status==="loaded"&&n._snapdomSrc){if(v(n.family))continue;let i=n._snapdomSrc;if(!i.startsWith("data:")){if(l.resource.has(n._snapdomSrc))i=l.resource.get(n._snapdomSrc),l.font.add(n._snapdomSrc);else if(!l.font.has(n._snapdomSrc))try{let s=await(await fetch(n._snapdomSrc)).blob();i=await new Promise(f=>{let u=new FileReader;u.onload=()=>f(u.result),u.readAsDataURL(s)}),l.resource.set(n._snapdomSrc,i),l.font.add(n._snapdomSrc)}catch{console.warn("[snapdom] Failed to fetch dynamic font src:",n._snapdomSrc);continue}}o+=`@font-face{font-family:'${n.family}';src:url(${i});font-style:${n.style||"normal"};font-weight:${n.weight||"normal"};}`}if(o&&(l.resource.set("fonts-embed-css",o),e)){let n=document.createElement("style");n.setAttribute("data-snapdom","embedFonts"),n.textContent=o,document.head.appendChild(n)}return o}async function te(e,t,r,c=!1,o){if(!(e instanceof Element)||!(t instanceof Element))return;for(let a of["::before","::after","::first-letter"])try{let s=R(e,a);if(!s||typeof s[Symbol.iterator]!="function")continue;if(a==="::first-letter"){let b=getComputedStyle(e);if(!(s.color!==b.color||s.fontSize!==b.fontSize||s.fontWeight!==b.fontWeight))continue;let A=Array.from(t.childNodes).find(Q=>Q.nodeType===Node.TEXT_NODE&&Q.textContent&&Q.textContent.trim().length>0);if(!A)continue;let re=A.textContent,O=re.match(/^([^\p{L}\p{N}\s]*[\p{L}\p{N}](?:['’])?)/u)?.[0],ke=re.slice(O?.length||0);if(!O||/[\uD800-\uDFFF]/.test(O))continue;let _=document.createElement("span");_.textContent=O,_.dataset.snapdomPseudo="::first-letter";let $e=Z(s),Ie=U($e,"span",r);l.preStyleMap.set(_,Ie);let se=document.createTextNode(ke);t.replaceChild(se,A),t.insertBefore(_,se);continue}let f=s.getPropertyValue("content"),u=s.getPropertyValue("background-image"),d=s.getPropertyValue("background-color"),h=s.getPropertyValue("font-family"),p=parseInt(s.getPropertyValue("font-size"))||32,m=parseInt(s.getPropertyValue("font-weight"))||!1,g=s.getPropertyValue("color")||"#000",w=s.getPropertyValue("display"),y=parseFloat(s.getPropertyValue("width")),E=parseFloat(s.getPropertyValue("height")),k=s.getPropertyValue("border-style"),$=s.getPropertyValue("transform"),N=v(h),S;/counter\s*\(|counters\s*\(/.test(f)?S="- ":S=ue(f);let Y=f!=="none"&&S!=="",B=u&&u!=="none",W=d&&d!=="transparent"&&d!=="rgba(0, 0, 0, 0)",X=w!=="inline"&&(y>0||E>0),T=k&&k!=="none",V=$&&$!=="none";if(!(Y||B||W||X||T||V))continue;let C=document.createElement("span");C.dataset.snapdomPseudo=a;let G=Z(s),J=U(G,"span",r);if(l.preStyleMap.set(C,J),N&&S.length===1){let b=document.createElement("img");b.src=await ge(S,h,m,p,g),b.style=`width:${p}px;height:auto;object-fit:contain;`,C.appendChild(b)}else if(S.startsWith("url(")){let b=D(S);if(b&&b.trim()!=="")try{let I=document.createElement("img"),A=await M(q(b,{useProxy:o}));I.src=A,I.style=`width:${p}px;height:auto;object-fit:contain;`,C.appendChild(I)}catch(I){console.error(`[snapdom] Error in pseudo ${a} for`,e,I)}}else!N&&Y&&(C.textContent=S);if(B)try{let b=F(u),I=await Promise.all(b.map(A=>P(A)));C.style.backgroundImage=I.join(", ")}catch(b){console.warn(`[snapdom] Failed to inline background-image for ${a}`,b)}if(W&&(C.style.backgroundColor=d),!(C.childNodes.length>0||C.textContent&&C.textContent.trim()!==""||B||W||X||T||V))continue;a==="::before"?t.insertBefore(C,t.firstChild):t.appendChild(C)}catch(s){console.warn(`[snapdom] Failed to capture ${a} for`,e,s)}let n=Array.from(e.children),i=Array.from(t.children).filter(a=>!a.dataset.snapdomPseudo);for(let a=0;a<Math.min(n.length,i.length);a++)await te(n[a],i[a],r,c,o)}function we(e){if(!e)return;let t=document.querySelectorAll("svg > defs");t.length&&e.querySelectorAll("svg").forEach(r=>{let c=r.querySelectorAll("use");if(!c.length)return;let o=new Set;if(c.forEach(i=>{let a=i.getAttribute("xlink:href")||i.getAttribute("href");a&&a.startsWith("#")&&o.add(a.slice(1))}),!o.size)return;let n=document.createElementNS("http://www.w3.org/2000/svg","defs");for(let i of o)for(let a of t){let s=a.querySelector(`#${CSS.escape(i)}`);if(s){n.appendChild(s.cloneNode(!0));break}}n.childNodes.length&&r.insertBefore(n,r.firstChild)})}async function xe(e,t=!1,r=!1,c={}){let o,n="";try{o=j(e,t,c,e)}catch(i){throw console.warn("deepClone failed:",i),i}try{await te(e,o,t,r,c.useProxy)}catch(i){console.warn("inlinePseudoElements failed:",i)}try{we(o)}catch(i){console.warn("inlineExternalDef failed:",i)}if(t){let i=de();n=Array.from(i.entries()).map(([a,s])=>`.${s}{${a}}`).join("");for(let[a,s]of l.preStyleMap.entries()){if(a.tagName==="STYLE")continue;let f=i.get(s);f&&a.classList.add(f);let u=a.style?.backgroundImage;a.removeAttribute("style"),u&&u!=="none"&&(a.style.backgroundImage=u)}}else for(let[i,a]of l.preStyleMap.entries())i.tagName!=="STYLE"&&i.setAttribute("style",a.replace(/;/g,"; "));for(let[i,a]of l.preNodeMap.entries()){let s=a.scrollLeft,f=a.scrollTop;if((s||f)&&i instanceof HTMLElement){i.style.overflow="hidden",i.style.scrollbarWidth="none",i.style.msOverflowStyle="none";let d=document.createElement("div");for(d.style.transform=`translate(${-s}px, ${-f}px)`,d.style.willChange="transform",d.style.display="inline-block",d.style.width="100%";i.firstChild;)d.appendChild(i.firstChild);i.appendChild(d)}}if(e===l.preNodeMap.get(o)){let i=l.preStyle.get(e)||window.getComputedStyle(e);l.preStyle.set(e,i);let a=me(i.transform);o.style.margin="0",o.style.position="static",o.style.top="auto",o.style.left="auto",o.style.right="auto",o.style.bottom="auto",o.style.zIndex="auto",o.style.float="none",o.style.clear="none",o.style.transform=a||""}for(let[i,a]of l.preNodeMap.entries())a.tagName==="PRE"&&(i.style.marginTop="0",i.style.marginBlockStart="0");return{clone:o,classCSS:n}}async function Se(e,t={}){let r=Array.from(e.querySelectorAll("img")),c=async o=>{let n=o.src;try{let i=await M(n,{useProxy:t.useProxy});o.src=i,o.width||(o.width=o.naturalWidth||100),o.height||(o.height=o.naturalHeight||100)}catch{let i=document.createElement("div");i.style=`width: ${o.width||100}px; height: ${o.height||100}px; background: #ccc; display: inline-block; text-align: center; line-height: ${o.height||100}px; color: #666; font-size: 12px;`,i.innerText="img",o.replaceWith(i)}};for(let o=0;o<r.length;o+=4){let n=r.slice(o,o+4).map(c);await Promise.allSettled(n)}}async function be(e,t,r={}){let c=[[e,t]],o=["background-image","mask","mask-image","-webkit-mask-image","mask-source","mask-box-image-source","mask-border-source","-webkit-mask-box-image-source"];for(;c.length;){let[n,i]=c.shift(),a=l.preStyle.get(n)||R(n);l.preStyle.has(n)||l.preStyle.set(n,a);for(let d of o){let h=a.getPropertyValue(d);if(!h||h==="none")continue;let p=F(h),m=await Promise.all(p.map(g=>P(g,r)));m.some(g=>g&&g!=="none"&&!/^url\(undefined/.test(g))&&i.style.setProperty(d,m.join(", "))}let s=a.getPropertyValue("background-color");s&&s!=="transparent"&&s!=="rgba(0, 0, 0, 0)"&&(i.style.backgroundColor=s);let f=Array.from(n.children),u=Array.from(i.children);for(let d=0;d<Math.min(f.length,u.length);d++)c.push([f[d],u[d]])}}async function Ce(e,t={}){if(!e)throw new Error("Element cannot be null or undefined");l.reset();let{compress:r=!0,embedFonts:c=!1,fast:o=!0,scale:n=1,useProxy:i=""}=t,a,s,f="",u="",d,h;if({clone:a,classCSS:s}=await xe(e,r,c,t),await new Promise(m=>{L(async()=>{await Se(a,t),m()},{fast:o})}),await new Promise(m=>{L(async()=>{await be(e,a,t),m()},{fast:o})}),c&&await new Promise(m=>{L(async()=>{f=await H(),m()},{fast:o})}),r){let m=le(a).sort(),g=m.join(",");l.baseStyle.has(g)?u=l.baseStyle.get(g):await new Promise(w=>{L(()=>{u=fe(m),l.baseStyle.set(g,u),w()},{fast:o})})}await new Promise(m=>{L(()=>{let g=e.getBoundingClientRect(),w=g.width,y=g.height,E=Number.isFinite(t.width),k=Number.isFinite(t.height),$=typeof n=="number"&&n!==1;if(!$){let T=g.width/g.height;E&&k?(w=t.width,y=t.height):E?(w=t.width,y=w/T):k&&(y=t.height,w=y*T)}if(w=Math.ceil(w),y=Math.ceil(y),a.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),a.style.transformOrigin="top left",!$&&(E||k)){let T=g.width,V=g.height,ae=w/T,C=y/V,G=a.style.transform||"",J=`scale(${ae}, ${C})`;a.style.transform=`${J} ${G}`.trim()}let N="http://www.w3.org/2000/svg",S=document.createElementNS(N,"foreignObject");S.setAttribute("width","100%"),S.setAttribute("height","100%");let K=document.createElement("style");K.textContent=u+f+"svg{overflow:visible;}"+s,S.appendChild(K),S.appendChild(a);let B=new XMLSerializer().serializeToString(S);h=`<svg xmlns="${N}" width="${w}" height="${y}" viewBox="0 0 ${w} ${y}">`+B+"</svg>",d=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(h)}`,m()},{fast:o})});let p=document.getElementById("snapdom-sandbox");return p&&p.style.position==="absolute"&&p.remove(),d}async function Pe(e,{dpr:t=1,scale:r=1}){let c=new Image;return c.src=e,await c.decode(),c.width=c.width*r,c.height=c.height*r,c}async function Ee(e,{dpr:t=1,scale:r=1}={}){let c=new Image;c.src=e,c.crossOrigin="anonymous",c.loading="eager",c.decoding="sync";let o=pe(),n=!1;if(o&&(document.body.appendChild(c),n=!0),await c.decode(),o&&await new Promise(u=>setTimeout(u,100)),c.width===0||c.height===0)throw n&&c.remove(),new Error("Image failed to load or has no dimensions");let i=c.width*r,a=c.height*r,s=document.createElement("canvas");s.width=Math.ceil(i*t),s.height=Math.ceil(a*t),s.style.width=`${i}px`,s.style.height=`${a}px`;let f=s.getContext("2d");return f.scale(t,t),f.drawImage(c,0,0,i,a),n&&c.remove(),s}async function ve(e,{type:t="svg",scale:r=1,backgroundColor:c="#fff",quality:o}={}){let n={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 i=await oe(e,{dpr:1,scale:r},c);return new Promise(a=>{i.toBlob(s=>a(s),`${n}`,o)})}async function oe(e,{dpr:t=1,scale:r=1},c){let o=await Ee(e,{dpr:t,scale:r});if(!c)return o;let n=document.createElement("canvas");n.width=o.width,n.height=o.height;let i=n.getContext("2d");return i.fillStyle=c,i.fillRect(0,0,n.width,n.height),i.drawImage(o,0,0),n}async function ne(e,{dpr:t=1,scale:r=1,backgroundColor:c,quality:o},n="png"){let i=["jpg","jpeg","webp"].includes(n)?"#fff":void 0,s=await oe(e,{dpr:t,scale:r},c??i),f=new Image;return f.src=s.toDataURL(`image/${n}`,o),await f.decode(),f.style.width=`${s.width/t}px`,f.style.height=`${s.height/t}px`,f}async function Le(e,{dpr:t=1,scale:r=1,backgroundColor:c,format:o="png",filename:n="snapDOM"}={}){if(o==="svg"){let h=await ve(e),p=URL.createObjectURL(h),m=document.createElement("a");m.href=p,m.download=`${n}.svg`,m.click(),URL.revokeObjectURL(p);return}let i=["jpg","jpeg","webp"].includes(o)?"#fff":void 0,s=await oe(e,{dpr:t,scale:r},c??i),f={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[o]||"image/png",u=s.toDataURL(f),d=document.createElement("a");d.href=u,d.download=`${n}.${o}`,d.click()}async function x(e,t={}){if(t={scale:1,...t},!e)throw new Error("Element cannot be null or undefined");return t.iconFonts&&he(t.iconFonts),await x.capture(e,t)}x.capture=async(e,t={})=>{let r=await Ce(e,t),c=window.devicePixelRatio||1,o=t.scale||1;return{url:r,options:t,toRaw:()=>r,toImg:()=>Pe(r,{dpr:c,scale:o}),toCanvas:()=>Ee(r,{dpr:c,scale:o}),toBlob:n=>ve(r,{dpr:c,scale:o,...n}),toPng:n=>ne(r,{dpr:c,scale:o,...n},"png"),toJpg:n=>ne(r,{dpr:c,scale:o,...n},"jpeg"),toWebp:n=>ne(r,{dpr:c,scale:o,...n},"webp"),download:({format:n="png",filename:i="capture",backgroundColor:a}={})=>Le(r,{dpr:c,scale:o,backgroundColor:a,format:n,filename:i})}};x.toRaw=async(e,t)=>(await x.capture(e,t)).toRaw();x.toImg=async(e,t)=>(await x.capture(e,t)).toImg();x.toCanvas=async(e,t)=>(await x.capture(e,t)).toCanvas();x.toBlob=async(e,t)=>(await x.capture(e,t)).toBlob(t);x.toPng=async(e,t)=>(await x.capture(e,t)).toPng(t);x.toJpg=async(e,t)=>(await x.capture(e,t)).toJpg(t);x.toWebp=async(e,t)=>(await x.capture(e,t)).toWebp(t);x.download=async(e,t={})=>{let{format:r="png",filename:c="capture",backgroundColor:o,...n}=t;return await(await x.capture(e,n)).download({format:r,filename:c,backgroundColor:o})};async function Fe(e=document,t={}){let{embedFonts:r=!0,reset:c=!1}=t;if(c){l.reset();return}await document.fonts.ready,ie();let o=[],n=[];e?.querySelectorAll&&(o=Array.from(e.querySelectorAll("img[src]")),n=Array.from(e.querySelectorAll("*")));let i=[];for(let a of o){let s=a.src;l.image.has(s)||i.push(M(s,{useProxy:t.useProxy}).then(f=>l.image.set(s,f)).catch(()=>{}))}for(let a of n){let s=R(a).backgroundImage;if(s&&s!=="none"){let f=F(s);for(let u of f)u.startsWith("url(")&&i.push(P(u,t).catch(()=>{}))}}r&&await H({preCached:!0}),await Promise.all(i)}export{Fe as preCache,x as snapdom};
|
|
1
|
+
var l={image:new Map,background:new Map,resource:new Map,defaultStyle:new Map,baseStyle:new Map,computedStyle:new WeakMap,font:new Set,snapshot:new WeakMap,snapshotKey:new Map,preStyleMap:new Map,preStyle:new WeakMap,preNodeMap:new Map,reset:Re};function Re(){l.computedStyle=new WeakMap,l.snapshot=new WeakMap,l.snapshotKey.clear(),l.preStyleMap.clear(),l.preStyle=new WeakMap,l.preNodeMap.clear()}var Ne=["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 ie(){for(let e of Ne)ce(e)}function ce(e){if(l.defaultStyle.has(e))return l.defaultStyle.get(e);if(new Set(["script","style","meta","link","noscript","template","defs","symbol","title","metadata","desc"]).has(e)){let n={};return l.defaultStyle.set(e,n),n}let r=document.getElementById("snapdom-sandbox");r||(r=document.createElement("div"),r.id="snapdom-sandbox",r.style.position="absolute",r.style.left="-9999px",r.style.top="-9999px",r.style.width="0",r.style.height="0",r.style.overflow="hidden",document.body.appendChild(r));let c=document.createElement(e);c.style.all="initial",r.appendChild(c);let s=getComputedStyle(c),o={};for(let n of s)o[n]=s.getPropertyValue(n);return r.removeChild(c),l.defaultStyle.set(e,o),o}var Ae=new Set(["-webkit-locale"]);function D(e,t,r=!1){let c=[],s=ce(t);for(let[o,n]of Object.entries(e))if(!Ae.has(o))if(!r)n&&c.push(`${o}:${n}`);else{let a=s[o];n&&n!==a&&c.push(`${o}:${n}`)}return c.sort().join(";")}function le(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(r=>t.add(r.tagName.toLowerCase())),Array.from(t))}function de(e){let t=new Map;for(let c of e){let s=l.defaultStyle.get(c);if(!s)continue;let o=Object.entries(s).map(([n,a])=>`${n}:${a};`).sort().join("");t.has(o)||t.set(o,[]),t.get(o).push(c)}let r="";for(let[c,s]of t.entries())r+=`${s.join(",")} { ${c} }
|
|
2
|
+
`;return r}function fe(){let e=new Set(l.preStyleMap.values()),t=new Map,r=1;for(let c of e)c.trim()&&t.set(c,`c${r++}`);return t}async function P(e,t={}){let r=O(e),c=/^((repeating-)?(linear|radial|conic)-gradient)\(/i.test(e);if(r){let s=H(r);if(l.background.has(s))return t.skipInline?void 0:`url(${l.background.get(s)})`;{let o=await M(s,{useProxy:t.useProxy});return l.background.set(s,o),t.skipInline?void 0:`url("${o}")`}}return e}function F(e,{fast:t=!1}={}){if(t)return e();"requestIdleCallback"in window?requestIdleCallback(e,{timeout:50}):setTimeout(e,1)}function I(e,t=null){if(!(e instanceof Element))return window.getComputedStyle(e,t);let r=l.computedStyle.get(e);if(r||(r=new Map,l.computedStyle.set(e,r)),!r.has(t)){let c=window.getComputedStyle(e,t);r.set(t,c)}return r.get(t)}function ue(e){let t=e.replace(/^['"]|['"]$/g,"");if(t.startsWith("\\"))try{return String.fromCharCode(parseInt(t.replace("\\",""),16))}catch{return t}return t}function O(e){let t=e.match(/url\((['"]?)(.*?)(\1)\)/);if(!t)return null;let r=t[2].trim();return r.startsWith("#")?null:r}function M(e,{timeout:t=3e3,useProxy:r=""}={}){function c(i){try{return new URL(i,window.location.href).origin===window.location.origin?"use-credentials":"anonymous"}catch{return"anonymous"}}async function s(i){let d=u=>fetch(u,{mode:"cors",credentials:c(u)==="use-credentials"?"include":"omit"}).then(f=>f.blob()).then(f=>new Promise((m,p)=>{let h=new FileReader;h.onloadend=()=>{let y=h.result;if(typeof y!="string"||!y.startsWith("data:image/")){p(new Error("Invalid image data URL"));return}m(y)},h.onerror=()=>p(new Error("FileReader error")),h.readAsDataURL(f)}));try{return await d(i)}catch{if(r&&typeof r=="string"){let f=r.replace(/\/$/,"")+H(i);try{return await d(f)}catch{throw new Error("[SnapDOM - fetchImage] CORS restrictions prevented image capture (even via proxy)")}}else throw new Error("[SnapDOM - fetchImage] Fetch fallback failed and no proxy provided")}}let o=c(e);return l.image.has(e)?Promise.resolve(l.image.get(e)):e.startsWith("data:image/")?(l.image.set(e,e),Promise.resolve(e)):/\.svg(\?.*)?$/i.test(e)?(async()=>{try{let d=await(await fetch(e,{mode:"cors",credentials:o==="use-credentials"?"include":"omit"})).text(),u=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(d)}`;return l.image.set(e,u),u}catch{return s(e)}})():new Promise((i,d)=>{let u=setTimeout(()=>{d(new Error("[SnapDOM - fetchImage] Image load timed out"))},t),f=new Image;f.crossOrigin=o,f.onload=async()=>{clearTimeout(u);try{await f.decode();let m=document.createElement("canvas");m.width=f.width,m.height=f.height,m.getContext("2d").drawImage(f,0,0,m.width,m.height);let h=m.toDataURL("image/png");l.image.set(e,h),i(h)}catch{try{let m=await s(e);l.image.set(e,m),i(m)}catch(m){d(m)}}},f.onerror=async()=>{clearTimeout(u),console.error(`[SnapDOM - fetchImage] Image failed to load: ${e}`);try{let m=await s(e);l.image.set(e,m),i(m)}catch(m){d(m)}},f.src=e})}function Q(e){let t={};for(let r of e)t[r]=e.getPropertyValue(r);return t}function me(){return/^((?!chrome|android).)*safari/i.test(navigator.userAgent)}function pe(e){if(!e||e==="none")return"";let t=e.replace(/translate[XY]?\([^)]*\)/g,"");return t=t.replace(/matrix\(([^)]+)\)/g,(r,c)=>{let s=c.split(",").map(o=>o.trim());return s.length!==6?`matrix(${c})`:(s[4]="0",s[5]="0",`matrix(${s.join(", ")})`)}),t=t.replace(/matrix3d\(([^)]+)\)/g,(r,c)=>{let s=c.split(",").map(o=>o.trim());return s.length!==16?`matrix3d(${c})`:(s[12]="0",s[13]="0",`matrix3d(${s.join(", ")})`)}),t.trim().replace(/\s{2,}/g," ")}function H(e){if(/%[0-9A-Fa-f]{2}/.test(e))return e;try{return encodeURI(e)}catch{return e}}function U(e){let t=[],r=0,c=0;for(let s=0;s<e.length;s++){let o=e[s];o==="("&&r++,o===")"&&r--,o===","&&r===0&&(t.push(e.slice(c,s).trim()),c=s+1)}return t.push(e.slice(c).trim()),t}function Te(e){let t={},r=e.getPropertyValue("visibility");for(let c=0;c<e.length;c++){let s=e[c],o=e.getPropertyValue(s);(s==="background-image"||s==="content")&&o.includes("url(")&&!o.includes("data:")&&(o="none"),t[s]=o}return r==="hidden"&&(t.opacity="0"),t}function z(e,t,r){if(e.tagName==="STYLE")return;l.preStyle.has(e)||l.preStyle.set(e,I(e));let c=l.preStyle.get(e);if(!l.snapshot.has(e)){let i=Te(c);l.snapshot.set(e,i)}let s=l.snapshot.get(e),o=Object.entries(s).sort(([i],[d])=>i.localeCompare(d)).map(([i,d])=>`${i}:${d}`).join(";");if(l.snapshotKey.has(o)){l.preStyleMap.set(t,l.snapshotKey.get(o));return}let n=e.tagName?.toLowerCase()||"div",a=D(s,n,r);l.snapshotKey.set(o,a),l.preStyleMap.set(t,a)}function j(e,t,r={},c){if(!e)throw new Error("Invalid node");let s=new Set,o=null;if(e.nodeType===Node.TEXT_NODE||e.nodeType!==Node.ELEMENT_NODE)return e.cloneNode(!0);if(e.getAttribute("data-capture")==="exclude"){let a=document.createElement("div"),i=e.getBoundingClientRect();return a.style.cssText=`display:inline-block;width:${i.width}px;height:${i.height}px;visibility:hidden;`,a}if(r.exclude&&Array.isArray(r.exclude))for(let a of r.exclude)try{if(e.matches?.(a)){let i=document.createElement("div"),d=e.getBoundingClientRect();return i.style.cssText=`display:inline-block;width:${d.width}px;height:${d.height}px;visibility:hidden;`,i}}catch(i){console.warn(`Invalid selector in exclude option: ${a}`,i)}if(typeof r.filter=="function")try{if(!r.filter(e,c||e)){let a=document.createElement("div"),i=e.getBoundingClientRect();return a.style.cssText=`display:inline-block;width:${i.width}px;height:${i.height}px;visibility:hidden;`,a}}catch(a){console.warn("Error in filter function:",a)}if(e.tagName==="IFRAME"){let a=document.createElement("div");return a.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;`,a}if(e.getAttribute("data-capture")==="placeholder"){let a=e.cloneNode(!1);l.preNodeMap.set(a,e),z(e,a,t);let i=document.createElement("div");return i.textContent=e.getAttribute("data-placeholder-text")||"",i.style.cssText="color:#666;font-size:12px;text-align:center;line-height:1.4;padding:0.5em;box-sizing:border-box;",a.appendChild(i),a}if(e.tagName==="CANVAS"){let a=e.toDataURL(),i=document.createElement("img");return i.src=a,i.width=e.width,i.height=e.height,l.preNodeMap.set(i,e),z(e,i,t),i}let n;try{n=e.cloneNode(!1),l.preNodeMap.set(n,e)}catch(a){throw console.error("[Snapdom] Failed to clone node:",e,a),a}if(e instanceof HTMLTextAreaElement){n.textContent=e.value,n.value=e.value;let a=e.getBoundingClientRect();return n.style.width=`${a.width}px`,n.style.height=`${a.height}px`,n}if(e instanceof HTMLInputElement&&(n.value=e.value,n.setAttribute("value",e.value),e.checked!==void 0&&(n.checked=e.checked,e.checked&&n.setAttribute("checked",""),e.indeterminate&&(n.indeterminate=e.indeterminate))),e instanceof HTMLSelectElement&&(o=e.value),z(e,n,t),e.shadowRoot)if(Array.from(e.shadowRoot.querySelectorAll("slot")).length>0){for(let i of e.shadowRoot.childNodes)if(i.nodeType===Node.ELEMENT_NODE&&i.tagName==="STYLE"){let d=i.textContent||"";d.trim()&&t&&(l.preStyle||(l.preStyle=new WeakMap),l.preStyle.set(i,d))}}else{let i=document.createDocumentFragment();for(let d of e.shadowRoot.childNodes){if(d.nodeType===Node.ELEMENT_NODE&&d.tagName==="STYLE"){let f=d.textContent||"";f.trim()&&t&&(l.preStyle||(l.preStyle=new WeakMap),l.preStyle.set(d,f));continue}let u=j(d,t,r,c||e);u&&i.appendChild(u)}n.appendChild(i)}if(e.tagName==="SLOT"){let a=e.assignedNodes?.({flatten:!0})||[],i=a.length>0?a:Array.from(e.childNodes),d=document.createDocumentFragment();for(let u of i){let f=j(u,t,r,c||e);f&&d.appendChild(f)}return d}for(let a of e.childNodes){if(s.has(a))continue;let i=j(a,t,r,c||e);i&&n.appendChild(i)}if(o!==null&&n instanceof HTMLSelectElement){n.value=o;for(let a of n.options)a.value===o?a.setAttribute("selected",""):a.removeAttribute("selected")}return n}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],Z=[];function he(e){let t=Array.isArray(e)?e:[e];for(let r of t)r instanceof RegExp?Z.push(r):typeof r=="string"?Z.push(new RegExp(r,"i")):console.warn("[snapdom] Ignored invalid iconFont value:",r)}function k(e){let t=typeof e=="string"?e:"",r=[...Me,...Z];for(let c of r)if(c instanceof RegExp&&c.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))}async function ge(e,t,r,c=32,s="#000"){t=t.replace(/^['"]+|['"]+$/g,"");let o=window.devicePixelRatio||1;await document.fonts.ready;let n=document.createElement("span");n.textContent=e,n.style.position="absolute",n.style.visibility="hidden",n.style.fontFamily=`"${t}"`,n.style.fontWeight=r||"normal",n.style.fontSize=`${c}px`,n.style.lineHeight="1",n.style.whiteSpace="nowrap",n.style.padding="0",n.style.margin="0",document.body.appendChild(n);let a=n.getBoundingClientRect(),i=Math.ceil(a.width),d=Math.ceil(a.height);document.body.removeChild(n);let u=document.createElement("canvas");u.width=i*o,u.height=d*o;let f=u.getContext("2d");return f.scale(o,o),f.font=r?`${r} ${c}px "${t}"`:`${c}px "${t}"`,f.textAlign="left",f.textBaseline="top",f.fillStyle=s,f.fillText(e,0,0),{dataUrl:u.toDataURL(),width:i,height:d}}function ye(e){return Array.from(document.styleSheets).some(t=>t.href===e)}function Le(e){return new Promise(t=>{if(ye(e))return t(null);let r=document.createElement("link");r.rel="stylesheet",r.href=e,r.setAttribute("data-snapdom","injected-import"),r.onload=()=>t(r),r.onerror=()=>t(null),document.head.appendChild(r)})}async function K({preCached:e=!1}={}){if(l.resource.has("fonts-embed-css")){if(e){let o=document.createElement("style");o.setAttribute("data-snapdom","embedFonts"),o.textContent=l.resource.get("fonts-embed-css"),document.head.appendChild(o)}return l.resource.get("fonts-embed-css")}let t=/@import\s+url\(["']?([^"')]+)["']?\)/g,r=[];for(let o of document.querySelectorAll("style")){let n=o.textContent||"",a=Array.from(n.matchAll(t));for(let i of a){let d=i[1];k(d)||ye(d)||r.push(d)}}await Promise.all(r.map(Le));let c=Array.from(document.querySelectorAll('link[rel="stylesheet"]')).filter(o=>o.href),s="";for(let o of c)try{let a=await(await fetch(o.href)).text();if(k(o.href)||k(a))continue;let i=/url\((["']?)([^"')]+)\1\)/g,d=await Promise.all(Array.from(a.matchAll(i)).map(async f=>{let m=O(f[0]);if(!m)return null;let p=m;if(!p.startsWith("http")&&!p.startsWith("data:")&&(p=new URL(p,o.href).href),k(p))return null;if(l.resource.has(p))return l.font.add(p),{original:f[0],inlined:`url(${l.resource.get(p)})`};if(l.font.has(p))return null;try{let y=await(await fetch(p)).blob(),w=await new Promise(g=>{let E=new FileReader;E.onload=()=>g(E.result),E.readAsDataURL(y)});return l.resource.set(p,w),l.font.add(p),{original:f[0],inlined:`url(${w})`}}catch{return console.warn("[snapdom] Failed to fetch font resource:",p),null}})),u=a;for(let f of d)f&&(u=u.replace(f.original,f.inlined));s+=u+`
|
|
3
|
+
`}catch{console.warn("[snapdom] Failed to fetch CSS:",o.href)}for(let o of document.styleSheets)try{if(!o.href||c.every(n=>n.href!==o.href)){for(let n of o.cssRules)if(n.type===CSSRule.FONT_FACE_RULE){let a=n.style.getPropertyValue("src"),i=n.style.getPropertyValue("font-family");if(!a||k(i))continue;let d=/url\((["']?)([^"')]+)\1\)/g,u=/local\((["']?)[^)]+?\1\)/g,f=!!a.match(d),m=!!a.match(u);if(!f&&m){s+=`@font-face{font-family:${i};src:${a};font-style:${n.style.getPropertyValue("font-style")||"normal"};font-weight:${n.style.getPropertyValue("font-weight")||"normal"};}`;continue}let p=a,h=Array.from(a.matchAll(d));for(let y of h){let w=y[2].trim();if(!w)continue;let g=w;if(!g.startsWith("http")&&!g.startsWith("data:")&&(g=new URL(g,o.href||location.href).href),!k(g)){if(l.resource.has(g)){l.font.add(g),p=p.replace(y[0],`url(${l.resource.get(g)})`);continue}if(!l.font.has(g))try{let $=await(await fetch(g)).blob(),R=await new Promise(N=>{let x=new FileReader;x.onload=()=>N(x.result),x.readAsDataURL($)});l.resource.set(g,R),l.font.add(g),p=p.replace(y[0],`url(${R})`)}catch{console.warn("[snapdom] Failed to fetch font URL:",g)}}}s+=`@font-face{font-family:${i};src:${p};font-style:${n.style.getPropertyValue("font-style")||"normal"};font-weight:${n.style.getPropertyValue("font-weight")||"normal"};}`}}}catch(n){console.warn("[snapdom] Cannot access stylesheet",o.href,n)}for(let o of document.fonts)if(o.family&&o.status==="loaded"&&o._snapdomSrc){if(k(o.family))continue;let n=o._snapdomSrc;if(!n.startsWith("data:")){if(l.resource.has(o._snapdomSrc))n=l.resource.get(o._snapdomSrc),l.font.add(o._snapdomSrc);else if(!l.font.has(o._snapdomSrc))try{let i=await(await fetch(o._snapdomSrc)).blob();n=await new Promise(d=>{let u=new FileReader;u.onload=()=>d(u.result),u.readAsDataURL(i)}),l.resource.set(o._snapdomSrc,n),l.font.add(o._snapdomSrc)}catch{console.warn("[snapdom] Failed to fetch dynamic font src:",o._snapdomSrc);continue}}s+=`@font-face{font-family:'${o.family}';src:url(${n});font-style:${o.style||"normal"};font-weight:${o.weight||"normal"};}`}if(s&&(l.resource.set("fonts-embed-css",s),e)){let o=document.createElement("style");o.setAttribute("data-snapdom","embedFonts"),o.textContent=s,document.head.appendChild(o)}return s}async function ee(e,t,r){if(!(e instanceof Element)||!(t instanceof Element))return;for(let o of["::before","::after","::first-letter"])try{let n=I(e,o);if(!n||typeof n[Symbol.iterator]!="function"||n.content==="none"&&n.backgroundImage==="none"&&n.backgroundColor==="transparent"&&(n.borderStyle==="none"||parseFloat(n.borderWidth)===0)&&(!n.transform||n.transform==="none")&&n.display==="inline")continue;if(o==="::first-letter"){let C=getComputedStyle(e);if(!(n.color!==C.color||n.fontSize!==C.fontSize||n.fontWeight!==C.fontWeight))continue;let T=Array.from(t.childNodes).find(se=>se.nodeType===Node.TEXT_NODE&&se.textContent?.trim().length>0);if(!T)continue;let L=T.textContent,_=L.match(/^([^\p{L}\p{N}\s]*[\p{L}\p{N}](?:['’])?)/u)?.[0],ke=L.slice(_?.length||0);if(!_||/[\uD800-\uDFFF]/.test(_))continue;let q=document.createElement("span");q.textContent=_,q.dataset.snapdomPseudo="::first-letter";let $e=Q(n),Ie=D($e,"span",r);l.preStyleMap.set(q,Ie);let ae=document.createTextNode(ke);t.replaceChild(ae,T),t.insertBefore(q,ae);continue}let i=n.content,d=/counter\s*\(|counters\s*\(/.test(i)?"- ":ue(i),u=n.backgroundImage,f=n.backgroundColor,m=n.fontFamily,p=parseInt(n.fontSize)||32,h=parseInt(n.fontWeight)||!1,y=n.color||"#000",w=n.display,g=parseFloat(n.width),E=parseFloat(n.height),$=n.borderStyle,R=parseFloat(n.borderWidth),N=n.transform,x=k(m),B=i!=="none"&&d!=="",V=u&&u!=="none",W=f&&f!=="transparent"&&f!=="rgba(0, 0, 0, 0)",Y=w!=="inline"&&(g>0||E>0),G=$&&$!=="none"&&R>0,A=N&&N!=="none";if(!(B||V||W||Y||G||A))continue;let S=document.createElement("span");S.dataset.snapdomPseudo=o,S.style.verticalAlign="middle";let X=Q(n),J=D(X,"span",r);if(l.preStyleMap.set(S,J),x&&d.length===1){let{dataUrl:C,width:v,height:T}=await ge(d,m,h,p,y),L=document.createElement("img");L.src=C,L.style=`height:${p}px;width:${v/T*p}px;object-fit:contain;`,S.appendChild(L),t.dataset.snapdomHasIcon="true"}else if(d.startsWith("url(")){let C=O(d);if(C?.trim())try{let v=document.createElement("img"),T=await M(H(C),r);v.src=T,v.style=`width:${p}px;height:auto;object-fit:contain;`,S.appendChild(v)}catch(v){console.error(`[snapdom] Error in pseudo ${o} for`,e,v)}}else!x&&B&&(S.textContent=d);if(V)try{let C=U(u),v=await Promise.all(C.map(P));S.style.backgroundImage=v.join(", ")}catch(C){console.warn(`[snapdom] Failed to inline background-image for ${o}`,C)}if(W&&(S.style.backgroundColor=f),!(S.childNodes.length>0||S.textContent?.trim()!==""||V||W||Y||G||A))continue;o==="::before"?t.insertBefore(S,t.firstChild):t.appendChild(S)}catch(n){console.warn(`[snapdom] Failed to capture ${o} for`,e,n)}let c=Array.from(e.children),s=Array.from(t.children).filter(o=>!o.dataset.snapdomPseudo);for(let o=0;o<Math.min(c.length,s.length);o++)await ee(c[o],s[o],r)}function we(e){if(!e)return;let t=new Set;if(e.querySelectorAll("use").forEach(a=>{let i=a.getAttribute("xlink:href")||a.getAttribute("href");i&&i.startsWith("#")&&t.add(i.slice(1))}),!t.size)return;let r=Array.from(document.querySelectorAll("svg > symbol, svg > defs")),c=r.filter(a=>a.tagName.toLowerCase()==="symbol"),s=r.filter(a=>a.tagName.toLowerCase()==="defs"),o=e.querySelector("svg.inline-defs-container");o||(o=document.createElementNS("http://www.w3.org/2000/svg","svg"),o.setAttribute("aria-hidden","true"),o.setAttribute("style","position: absolute; width: 0; height: 0; overflow: hidden;"),o.classList.add("inline-defs-container"),e.insertBefore(o,e.firstChild));let n=new Set;e.querySelectorAll("symbol[id], defs > *[id]").forEach(a=>{n.add(a.id)}),t.forEach(a=>{if(n.has(a))return;let i=c.find(d=>d.id===a);if(i){o.appendChild(i.cloneNode(!0)),n.add(a);return}for(let d of s){let u=d.querySelector(`#${CSS.escape(a)}`);if(u){let f=o.querySelector("defs");f||(f=document.createElementNS("http://www.w3.org/2000/svg","defs"),o.appendChild(f)),f.appendChild(u.cloneNode(!0)),n.add(a);break}}})}async function be(e,t=!1,r=!1,c={}){let s,o="";Pe(e);try{we(e)}catch(n){console.warn("inlineExternal defs or symbol failed:",n)}try{s=j(e,t,c,e)}catch(n){throw console.warn("deepClone failed:",n),n}try{await ee(e,s,t,r,c.useProxy)}catch(n){console.warn("inlinePseudoElements failed:",n)}if(t){let n=fe();o=Array.from(n.entries()).map(([a,i])=>`.${i}{${a}}`).join("");for(let[a,i]of l.preStyleMap.entries()){if(a.tagName==="STYLE")continue;if(a.getRootNode&&a.getRootNode()instanceof ShadowRoot){a.setAttribute("style",i.replace(/;/g,"; "));continue}let d=n.get(i);d&&a.classList.add(d);let u=a.style?.backgroundImage,f=a.dataset?.snapdomHasIcon;u&&u!=="none"&&(a.style.backgroundImage=u),f&&(a.style.verticalAlign="middle",a.style.display="inline")}}else for(let[n,a]of l.preStyleMap.entries())n.tagName!=="STYLE"&&n.setAttribute("style",a.replace(/;/g,"; "));for(let[n,a]of l.preNodeMap.entries()){let i=a.scrollLeft,d=a.scrollTop;if((i||d)&&n instanceof HTMLElement){n.style.overflow="hidden",n.style.scrollbarWidth="none",n.style.msOverflowStyle="none";let f=document.createElement("div");for(f.style.transform=`translate(${-i}px, ${-d}px)`,f.style.willChange="transform",f.style.display="inline-block",f.style.width="100%";n.firstChild;)f.appendChild(n.firstChild);n.appendChild(f)}}if(e===l.preNodeMap.get(s)){let n=l.preStyle.get(e)||window.getComputedStyle(e);l.preStyle.set(e,n);let a=pe(n.transform);s.style.margin="0",s.style.position="static",s.style.top="auto",s.style.left="auto",s.style.right="auto",s.style.bottom="auto",s.style.zIndex="auto",s.style.float="none",s.style.clear="none",s.style.transform=a||""}for(let[n,a]of l.preNodeMap.entries())a.tagName==="PRE"&&(n.style.marginTop="0",n.style.marginBlockStart="0");return{clone:s,classCSS:o}}function Pe(e){let t=getComputedStyle(e),r=t.outlineStyle,c=t.outlineWidth,s=t.borderStyle,o=t.borderWidth,n=r!=="none"&&parseFloat(c)>0,a=s==="none"||parseFloat(o)===0;n&&a&&(e.style.border=`${c} solid transparent`)}async function Se(e,t={}){let r=Array.from(e.querySelectorAll("img")),c=async s=>{let o=s.src;try{let n=await M(o,{useProxy:t.useProxy});s.src=n,s.width||(s.width=s.naturalWidth||100),s.height||(s.height=s.naturalHeight||100)}catch{let n=document.createElement("div");n.style=`width: ${s.width||100}px; height: ${s.height||100}px; background: #ccc; display: inline-block; text-align: center; line-height: ${s.height||100}px; color: #666; font-size: 12px;`,n.innerText="img",s.replaceWith(n)}};for(let s=0;s<r.length;s+=4){let o=r.slice(s,s+4).map(c);await Promise.allSettled(o)}}async function xe(e,t,r={}){let c=[[e,t]],s=["background-image","mask","mask-image","-webkit-mask-image","mask-source","mask-box-image-source","mask-border-source","-webkit-mask-box-image-source","border-image","border-image-source","border-image-slice","border-image-width","border-image-outset","border-image-repeat"];for(;c.length;){let[o,n]=c.shift(),a=l.preStyle.get(o)||I(o);l.preStyle.has(o)||l.preStyle.set(o,a);let i=(()=>{let m=a.getPropertyValue("border-image"),p=a.getPropertyValue("border-image-source");return m&&m!=="none"||p&&p!=="none"})();for(let m of s){if(["border-image-slice","border-image-width","border-image-outset","border-image-repeat"].includes(m)&&!i)continue;let p=a.getPropertyValue(m);if(!p||p==="none")continue;let h=U(p),y=await Promise.all(h.map(w=>P(w,r)));y.some(w=>w&&w!=="none"&&!/^url\(undefined/.test(w))&&n.style.setProperty(m,y.join(", "))}let d=a.getPropertyValue("background-color");d&&d!=="transparent"&&d!=="rgba(0, 0, 0, 0)"&&(n.style.backgroundColor=d);let u=Array.from(o.children),f=Array.from(n.children);for(let m=0;m<Math.min(u.length,f.length);m++)c.push([u[m],f[m]])}}async function Ce(e,t={}){if(!e)throw new Error("Element cannot be null or undefined");l.reset();let{compress:r=!0,embedFonts:c=!1,fast:s=!0,scale:o=1,useProxy:n=""}=t,a,i,d="",u="",f,m;if({clone:a,classCSS:i}=await be(e,r,c,t),await new Promise(h=>{F(async()=>{await Se(a,t),h()},{fast:s})}),await new Promise(h=>{F(async()=>{await xe(e,a,t),h()},{fast:s})}),c&&await new Promise(h=>{F(async()=>{d=await K(),h()},{fast:s})}),r){let h=le(a).sort(),y=h.join(",");l.baseStyle.has(y)?u=l.baseStyle.get(y):await new Promise(w=>{F(()=>{u=de(h),l.baseStyle.set(y,u),w()},{fast:s})})}await new Promise(h=>{F(()=>{let y=e.getBoundingClientRect(),w=y.width,g=y.height,E=Number.isFinite(t.width),$=Number.isFinite(t.height),R=typeof o=="number"&&o!==1;if(!R){let A=y.width/y.height;E&&$?(w=t.width,g=t.height):E?(w=t.width,g=w/A):$&&(g=t.height,w=g*A)}if(w=Math.ceil(w),g=Math.ceil(g),a.setAttribute("xmlns","http://www.w3.org/1999/xhtml"),a.style.transformOrigin="top left",!R&&(E||$)){let A=y.width,oe=y.height,S=w/A,X=g/oe,J=a.style.transform||"",re=`scale(${S}, ${X})`;a.style.transform=`${re} ${J}`.trim()}let N="http://www.w3.org/2000/svg",x=document.createElementNS(N,"foreignObject");x.setAttribute("width","100%"),x.setAttribute("height","100%");let B=document.createElement("style");B.textContent=u+d+"svg{overflow:visible;}"+i,x.appendChild(B),x.appendChild(a);let W=new XMLSerializer().serializeToString(x);m=`<svg xmlns="${N}" width="${w}" height="${g}" viewBox="0 0 ${w} ${g}">`+W+"</svg>",f=`data:image/svg+xml;charset=utf-8,${encodeURIComponent(m)}`,h()},{fast:s})});let p=document.getElementById("snapdom-sandbox");return p&&p.style.position==="absolute"&&p.remove(),f}async function Fe(e,{scale:t=1}={}){let r=new Image;return r.src=e,await r.decode(),t!==1&&(r.style.width=`${r.naturalWidth*t}px`,r.style.height=`${r.naturalHeight*t}px`),r}async function Ee(e,{dpr:t=1,scale:r=1}={}){let c=new Image;c.src=e,c.crossOrigin="anonymous",c.loading="eager",c.decoding="sync";let s=me(),o=!1;if(s&&(document.body.appendChild(c),o=!0),await c.decode(),s&&await new Promise(u=>setTimeout(u,100)),c.width===0||c.height===0)throw o&&c.remove(),new Error("Image failed to load or has no dimensions");let n=c.naturalWidth*r,a=c.naturalHeight*r,i=document.createElement("canvas");i.width=Math.ceil(n*t),i.height=Math.ceil(a*t),i.style.width=`${n}px`,i.style.height=`${a}px`;let d=i.getContext("2d");return d.scale(t,t),d.drawImage(c,0,0,n,a),o&&c.remove(),i}async function ve(e,{type:t="svg",scale:r=1,backgroundColor:c="#fff",quality:s}={}){let o={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 n=await ne(e,{dpr:1,scale:r},c);return new Promise(a=>{n.toBlob(i=>a(i),`${o}`,s)})}async function ne(e,{dpr:t=1,scale:r=1},c){let s=await Ee(e,{dpr:t,scale:r});if(!c)return s;let o=document.createElement("canvas");o.width=s.width,o.height=s.height;let n=o.getContext("2d");return n.fillStyle=c,n.fillRect(0,0,o.width,o.height),n.drawImage(s,0,0),o}async function te(e,{dpr:t=1,scale:r=1,backgroundColor:c,quality:s},o="png"){let n=["jpg","jpeg","webp"].includes(o)?"#fff":void 0,i=await ne(e,{dpr:t,scale:r},c??n),d=new Image;return d.src=i.toDataURL(`image/${o}`,s),await d.decode(),d.style.width=`${i.width/t}px`,d.style.height=`${i.height/t}px`,d}async function Ue(e,{dpr:t=1,scale:r=1,backgroundColor:c,format:s="png",filename:o="snapDOM"}={}){if(s==="svg"){let m=await ve(e),p=URL.createObjectURL(m),h=document.createElement("a");h.href=p,h.download=`${o}.svg`,h.click(),URL.revokeObjectURL(p);return}let n=["jpg","jpeg","webp"].includes(s)?"#fff":void 0,i=await ne(e,{dpr:t,scale:r},c??n),d={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",webp:"image/webp"}[s]||"image/png",u=i.toDataURL(d),f=document.createElement("a");f.href=u,f.download=`${o}.${s}`,f.click()}async function b(e,t={}){if(t={scale:1,...t},!e)throw new Error("Element cannot be null or undefined");return t.iconFonts&&he(t.iconFonts),await b.capture(e,t)}b.capture=async(e,t={})=>{let r=await Ce(e,t),c=t.dpr??(window.devicePixelRatio||1),s=t.scale||1;return{url:r,options:t,toRaw:()=>r,toImg:(o={})=>Fe(r,{dpr:c,scale:s,...o}),toCanvas:(o={})=>Ee(r,{dpr:c,scale:s,...o}),toBlob:(o={})=>ve(r,{dpr:c,scale:s,...o}),toPng:(o={})=>te(r,{dpr:c,scale:s,...o},"png"),toJpg:(o={})=>te(r,{dpr:c,scale:s,...o},"jpeg"),toWebp:(o={})=>te(r,{dpr:c,scale:s,...o},"webp"),download:({format:o="png",filename:n="snapDOM",backgroundColor:a,...i}={})=>Ue(r,{dpr:c,scale:s,format:o,filename:n,backgroundColor:a,...i})}};b.toRaw=async(e,t)=>(await b.capture(e,t)).toRaw();b.toImg=async(e,t)=>(await b.capture(e,t)).toImg();b.toCanvas=async(e,t)=>(await b.capture(e,t)).toCanvas();b.toBlob=async(e,t)=>(await b.capture(e,t)).toBlob(t);b.toPng=async(e,t)=>(await b.capture(e,t)).toPng(t);b.toJpg=async(e,t)=>(await b.capture(e,t)).toJpg(t);b.toWebp=async(e,t)=>(await b.capture(e,t)).toWebp(t);b.download=async(e,t={})=>{let{format:r="png",filename:c="capture",backgroundColor:s,...o}=t;return await(await b.capture(e,o)).download({format:r,filename:c,backgroundColor:s})};async function Be(e=document,t={}){let{embedFonts:r=!0,reset:c=!1}=t;if(c){l.reset();return}await document.fonts.ready,ie();let s=[],o=[];e?.querySelectorAll&&(s=Array.from(e.querySelectorAll("img[src]")),o=Array.from(e.querySelectorAll("*")));let n=[];for(let a of s){let i=a.src;l.image.has(i)||n.push(M(i,{useProxy:t.useProxy}).then(d=>l.image.set(i,d)).catch(()=>{}))}for(let a of o){let i=I(a).backgroundImage;if(i&&i!=="none"){let d=U(i);for(let u of d)u.startsWith("url(")&&n.push(P(u,t).catch(()=>{}))}}r&&await K({preCached:!0}),await Promise.all(n)}export{Be as preCache,b as snapdom};
|