@zumer/snapdom 2.18.0 → 2.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -1
- package/dist/plugins.mjs +1 -1
- package/dist/preCache.mjs +5 -5
- package/dist/snapdom.js +8 -8
- package/dist/snapdom.mjs +8 -8
- package/package.json +7 -4
- package/types/snapdom.d.ts +45 -9
package/README.md
CHANGED
|
@@ -191,6 +191,29 @@ const blob = await snapdom.toBlob(el);
|
|
|
191
191
|
document.body.appendChild(png);
|
|
192
192
|
```
|
|
193
193
|
|
|
194
|
+
## CORS & External Resources
|
|
195
|
+
|
|
196
|
+
When capturing elements that reference **external stylesheets** (e.g., Google Fonts, Font Awesome, or any CDN‑hosted CSS), you **must** ensure that the resources are served with proper CORS headers. Otherwise, the captured image may lack the expected fonts or icons, even though they render correctly in the browser.
|
|
197
|
+
|
|
198
|
+
### Why is this needed?
|
|
199
|
+
|
|
200
|
+
- Browsers block JavaScript (including SnapDOM) from reading the binary data of cross‑origin fonts or images unless the server explicitly allows it via `Access-Control-Allow-Origin`.
|
|
201
|
+
- SnapDOM relies on Canvas, which enforces strict CORS policies — unlike the browser's rendering engine, which is more permissive for on‑screen display.
|
|
202
|
+
|
|
203
|
+
### How to fix it
|
|
204
|
+
|
|
205
|
+
Add the `crossorigin="anonymous"` attribute to the `<link>` tag when loading external stylesheets:
|
|
206
|
+
|
|
207
|
+
```html
|
|
208
|
+
<link
|
|
209
|
+
rel="stylesheet"
|
|
210
|
+
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css"
|
|
211
|
+
crossorigin="anonymous"
|
|
212
|
+
/>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
> **Note**: If you are hosting the fonts or assets **on the same origin** as your page (e.g., using a local server like `http://localhost`), you **do not** need to add `crossorigin` – the browser treats them as same‑origin and allows full access.
|
|
216
|
+
|
|
194
217
|
## Documentation
|
|
195
218
|
|
|
196
219
|
The full reference lives on **[snapdom.dev/docs](https://snapdom.dev/docs/)** — kept there so it stays in sync and searchable:
|
|
@@ -243,6 +266,9 @@ All options are optional and can be passed to `snapdom(el, options)` or any shor
|
|
|
243
266
|
| `outerTransforms` | `boolean` | `true` | Keep root translate/rotate in the output |
|
|
244
267
|
| `outerShadows` | `boolean` | `false` | Expand bounds to include root shadows/blur/outline |
|
|
245
268
|
| `fast` | `boolean` | `true` | Skip idle delays for faster capture |
|
|
269
|
+
| `reconcile` | `boolean` | `false` | Measure the clone against the live DOM and pin any diverging box to its real size. Fixes rare text re-wrap/layout drift at the cost of roughly doubling capture time — snapdom warns once (`console.warn`) if it detects a capture that could benefit from it |
|
|
270
|
+
| `burst` | `boolean` | `false` | Memoizes repeated captures of this element via a scoped MutationObserver — an unchanged repeat skips the pipeline entirely. Without it, snapdom warns once if the same element is captured 3+ times within 2s |
|
|
271
|
+
| `invalidate` | `boolean` | `false` | With `burst: true`, forces a fresh capture for changes automatic tracking can't see (canvas draws, programmatic CSSOM edits) |
|
|
246
272
|
| `plugins` | `array` | — | Per-capture plugins (override globals by name) |
|
|
247
273
|
|
|
248
274
|
📖 **[Full API & every option, explained with examples → snapdom.dev/docs](https://snapdom.dev/docs/)**
|
|
@@ -352,7 +378,7 @@ For detailed guidelines, see [CONTRIBUTING](https://github.com/zumerlab/snapdom/
|
|
|
352
378
|
<a href="https://github.com/titoBouzout" title="titoBouzout"><img src="https://avatars.githubusercontent.com/u/64156?v=4&s=100" style="border-radius:10px; width:60px; height:60px; object-fit:cover; margin:5px;" alt="titoBouzout"/></a>
|
|
353
379
|
<a href="https://github.com/ZiuChen" title="ZiuChen"><img src="https://avatars.githubusercontent.com/u/64892985?v=4&s=100" style="border-radius:10px; width:60px; height:60px; object-fit:cover; margin:5px;" alt="ZiuChen"/></a>
|
|
354
380
|
<a href="https://github.com/adajoy" title="adajoy"><img src="https://avatars.githubusercontent.com/u/26210079?v=4&s=100" style="border-radius:10px; width:60px; height:60px; object-fit:cover; margin:5px;" alt="adajoy"/></a>
|
|
355
|
-
<a href="https://github.com/
|
|
381
|
+
<a href="https://github.com/hjl12345" title="hjl12345"><img src="https://avatars.githubusercontent.com/u/170017602?v=4&s=100" style="border-radius:10px; width:60px; height:60px; object-fit:cover; margin:5px;" alt="hjl12345"/></a>
|
|
356
382
|
</p>
|
|
357
383
|
<!-- CONTRIBUTORS:END -->
|
|
358
384
|
|
package/dist/plugins.mjs
CHANGED
package/dist/preCache.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/*
|
|
2
2
|
* SnapDOM
|
|
3
|
-
* v2.
|
|
3
|
+
* v2.22.0
|
|
4
4
|
* Author: Juan Martin Muda
|
|
5
5
|
* License: MIT
|
|
6
6
|
*/
|
|
7
|
-
var L=class extends Map{constructor(e=100,...n){super(...n),this._maxSize=e}set(e,n){if(this.size>=this._maxSize&&!this.has(e)){let o=this.keys().next().value;o!==void 0&&this.delete(o)}return super.set(e,n)}},u={image:new L(100),background:new L(100),resource:new L(150),defaultStyle:new L(30),baseStyle:new L(50),computedStyle:new WeakMap,measureHints:new WeakMap,font:new Set,session:{styleMap:new Map,styleCache:new WeakMap,nodeMap:new Map}};function et(t="soft"){switch(u.session.__counterEpoch=(u.session.__counterEpoch||0)+1,t){case"auto":{u.session.styleMap=new Map,u.session.nodeMap=new Map;return}case"soft":{u.session.styleMap=new Map,u.session.nodeMap=new Map,u.session.styleCache=new WeakMap;return}case"full":return;case"disabled":{u.session.styleMap=new Map,u.session.nodeMap=new Map,u.session.styleCache=new WeakMap,u.computedStyle=new WeakMap,u.measureHints=new WeakMap,u.baseStyle=new L(50),u.defaultStyle=new L(30),u.image=new L(100),u.background=new L(100),u.resource=new L(150),u.font=new Set;return}default:{u.session.styleMap=new Map,u.session.nodeMap=new Map,u.session.styleCache=new WeakMap;return}}}function V(t){let e=t.match(/url\((['"]?)(.*?)(\1)\)/);if(!e)return null;let n=e[2].trim();return n.startsWith("#")?null:n}function v(t){if(/%[0-9A-Fa-f]{2}/.test(t))return t;try{return encodeURI(t)}catch{return t}}function nt(t,e){if(!t||/^(data|blob|about|#)/i.test(t.trim()))return t;try{let n=e||typeof document<"u"&&(document.baseURI||document.location?.href)||"http://localhost/";return new URL(t,n).href}catch{return t}}function kt(t="[snapDOM]",{ttlMs:e=5*6e4,maxEntries:n=12}={}){let o=new Map,i=0;function r(s,a,l){if(i>=n)return;let f=Date.now();(o.get(a)||0)>f||(o.set(a,f+e),i++,s==="warn"&&console&&console.warn?console.warn(`${t} ${l}`):console&&console.error&&console.error(`${t} ${l}`))}return{warnOnce(s,a){r("warn",s,a)},errorOnce(s,a){r("error",s,a)},reset(){o.clear(),i=0}}}var ot=kt("[snapDOM]",{ttlMs:3*6e4,maxEntries:10}),H=new Map,j=new Map;function At(t){return/^data:|^blob:|^about:blank$/i.test(t)}function Rt(t,e){try{let n=typeof location<"u"&&location.href?location.href:"http://localhost/",o=e.includes("{url}")?e.split("{url}")[0]:e,i=new URL(o||".",n),r=new URL(t,n);if(r.origin===i.origin)return!0;let s=r.searchParams;if(s&&(s.has("url")||s.has("target")))return!0}catch{}return!1}function $t(t,e){if(!e||At(t)||Rt(t,e))return!1;try{let n=typeof location<"u"&&location.href?location.href:"http://localhost/",o=new URL(t,n);return typeof location<"u"?o.origin!==location.origin:!0}catch{return!!e}}function Lt(t,e){if(!e)return t;if(e.includes("{url}"))return e.replace("{urlRaw}",v(t)).replace("{url}",encodeURIComponent(t));if(/[?&]url=?$/.test(e))return`${e}${encodeURIComponent(t)}`;if(e.endsWith("?"))return`${e}url=${encodeURIComponent(t)}`;if(e.endsWith("/"))return`${e}${v(t)}`;let n=e.includes("?")?"&":"?";return`${e}${n}url=${encodeURIComponent(t)}`}function rt(t){return new Promise((e,n)=>{let o=new FileReader;o.onload=()=>e(String(o.result||"")),o.onerror=()=>n(new Error("read_failed")),o.readAsDataURL(t)})}function Mt(t,e){return[e.as||"blob",e.timeout??3e3,e.useProxy||"",e.errorTTL??8e3,t].join("|")}async function _(t,e={}){let n=e.as??"blob",o=e.timeout??3e3,i=e.useProxy||"",r=e.errorTTL??8e3,s=e.headers||{},a=!!e.silent;if(/^data:/i.test(t))try{if(n==="text")return{ok:!0,data:String(t),status:200,url:t,fromCache:!1};if(n==="dataURL")return{ok:!0,data:String(t),status:200,url:t,fromCache:!1,mime:String(t).slice(5).split(";")[0]||""};let[,m="",h=""]=String(t).match(/^data:([^,]*),(.*)$/)||[],g=/;base64/i.test(m)?atob(h):decodeURIComponent(h),y=new Uint8Array([...g].map(S=>S.charCodeAt(0))),C=new Blob([y],{type:(m||"").split(";")[0]||""});return{ok:!0,data:C,status:200,url:t,fromCache:!1,mime:C.type||""}}catch{return{ok:!1,data:null,status:0,url:t,fromCache:!1,reason:"special_url_error"}}if(/^blob:/i.test(t))try{let m=await fetch(t);if(!m.ok)return{ok:!1,data:null,status:m.status,url:t,fromCache:!1,reason:"http_error"};let h=await m.blob(),c=h.type||m.headers.get("content-type")||"";return n==="dataURL"?{ok:!0,data:await rt(h),status:m.status,url:t,fromCache:!1,mime:c}:n==="text"?{ok:!0,data:await h.text(),status:m.status,url:t,fromCache:!1,mime:c}:{ok:!0,data:h,status:m.status,url:t,fromCache:!1,mime:c}}catch{return{ok:!1,data:null,status:0,url:t,fromCache:!1,reason:"network"}}if(/^about:blank$/i.test(t))return n==="dataURL"?{ok:!0,data:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg==",status:200,url:t,fromCache:!1,mime:"image/png"}:{ok:!0,data:n==="text"?"":new Blob([]),status:200,url:t,fromCache:!1};let l=Mt(t,{as:n,timeout:o,useProxy:i,errorTTL:r}),f=j.get(l);if(f&&f.until>Date.now())return{...f.result,fromCache:!0};f&&j.delete(l);let d=H.get(l);if(d)return d;let p=$t(t,i)?Lt(t,i):t,w=e.credentials;if(!w)try{let m=typeof location<"u"&&location.href?location.href:"http://localhost/",h=new URL(t,m);w=typeof location<"u"&&h.origin===location.origin?"include":"omit"}catch{w="omit"}let k=new AbortController,A=setTimeout(()=>k.abort("timeout"),o),b=(async()=>{try{let m=await fetch(p,{signal:k.signal,credentials:w,headers:s});if(!m.ok){let g={ok:!1,data:null,status:m.status,url:p,fromCache:!1,reason:"http_error"};if(r>0&&j.set(l,{until:Date.now()+r,result:g}),!a){let y=`${m.status} ${m.statusText||""}`.trim();ot.warnOnce(`http:${m.status}:${n}:${new URL(t,location?.href??"http://localhost/").origin}`,`HTTP error ${y} while fetching ${n} ${t}`)}return e.onError&&e.onError(g),g}if(n==="text")return{ok:!0,data:await m.text(),status:m.status,url:p,fromCache:!1};let h=await m.blob(),c=h.type||m.headers.get("content-type")||"";return n==="dataURL"?{ok:!0,data:await rt(h),status:m.status,url:p,fromCache:!1,mime:c}:{ok:!0,data:h,status:m.status,url:p,fromCache:!1,mime:c}}catch(m){let h=m&&typeof m=="object"&&"name"in m&&m.name==="AbortError"?String(m.message||"").includes("timeout")?"timeout":"abort":"network",c={ok:!1,data:null,status:0,url:p,fromCache:!1,reason:h};if(!/^blob:/i.test(t)&&r>0&&j.set(l,{until:Date.now()+r,result:c}),!a){let g=`${h}:${n}:${new URL(t,location?.href??"http://localhost/").origin}`,y=h==="timeout"?`Timeout after ${o}ms. Consider increasing timeout or using a proxy for ${t}`:h==="abort"?`Request aborted while fetching ${n} ${t}`:`Network/CORS issue while fetching ${n} ${t}. A proxy may be required`;ot.errorOnce(g,y)}return e.onError&&e.onError(c),c}finally{clearTimeout(A),H.delete(l)}})();return H.set(l,b),b}async function N(t,e={}){if(/^((repeating-)?(linear|radial|conic)-gradient)\(/i.test(t)||t.trim()==="none")return t;let o=V(t);if(!o)return t;let i=nt(o),r=v(i),s=(e.useProxy||"")+"|"+r;if(u.background.has(s)){let a=u.background.get(s);return a?`url("${a}")`:"none"}try{let a=await _(r,{as:"dataURL",useProxy:e.useProxy});return a.ok?(u.background.set(s,a.data),`url("${a.data}")`):(u.background.set(s,null),"none")}catch{return u.background.set(s,null),"none"}}var it=new Set(["meta","script","noscript","title","link","template"]),Y=new Set(["meta","link","style","title","noscript","script","template","g","defs","use","marker","mask","clipPath","pattern","path","polygon","polyline","line","circle","ellipse","rect","filter","lineargradient","radialgradient","stop"]),Et=["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","table","thead","tbody","tr","td","th"];function Q(){for(let t of Et){let e=String(t).toLowerCase();it.has(e)||Y.has(e)||at(e)}}function at(t){if(t=String(t).toLowerCase(),Y.has(t)){let r={};return u.defaultStyle.set(t,r),r}if(u.defaultStyle.has(t))return u.defaultStyle.get(t);let e=document.getElementById("snapdom-sandbox");e||(e=document.createElement("div"),e.id="snapdom-sandbox",e.setAttribute("data-snapdom-sandbox","true"),e.setAttribute("aria-hidden","true"),e.style.position="absolute",e.style.left="-9999px",e.style.top="-9999px",e.style.width="0px",e.style.height="0px",e.style.overflow="hidden",document.body.appendChild(e));let n=document.createElement(t);n.style.all="initial",e.appendChild(n);let o=getComputedStyle(n),i={};for(let r of o){if(ct(r))continue;let s=o.getPropertyValue(r);i[r]=s}return e.removeChild(n),u.defaultStyle.set(t,i),i}var _t=/(?:^|-)(animation|transition)(?:-|$)/i,Ft=/^(--.+|view-timeline|scroll-timeline|animation-trigger|offset-|position-try|app-region|interactivity|overlay|view-transition|-webkit-locale|-webkit-user-(?:drag|modify)|-webkit-tap-highlight-color|-webkit-text-security)$/i,Ut=new Set(["cursor","pointer-events","touch-action","user-select","print-color-adjust","speak","reading-flow","reading-order","anchor-name","anchor-scope","container-name","container-type","timeline-scope","zoom","stroke-color"]),st=new Map;function ct(t){let e=st.get(t);if(e===void 0){let n=String(t).toLowerCase();e=Ut.has(n)||Ft.test(n)||_t.test(n),st.set(t,e)}return e}function It(t){try{let e=t?.ownerDocument;if(!e)return typeof window<"u"?window:null;let n=e.defaultView;if(n&&typeof n.getComputedStyle=="function")return n;if(typeof window<"u"&&window.frames)for(let o=0;o<window.frames.length;o++)try{if(window.frames[o]?.document===e)return window.frames[o]}catch{}}catch{}return typeof window<"u"?window:null}function D(t,e=null){let n=()=>{let r={length:0,getPropertyValue:()=>"",item:()=>""};return r[Symbol.iterator]=function*(){},r};if(!(t instanceof Element)){let r=typeof window<"u"?window:null;if(r&&typeof r.getComputedStyle=="function")try{return r.getComputedStyle(t,e)||n()}catch{return n()}return n()}let o=u.computedStyle.get(t);o||(o=new Map,u.computedStyle.set(t,o));let i=o.get(e);if(!i){let r=It(t),s=null;try{s=r&&typeof r.getComputedStyle=="function"?r.getComputedStyle(t,e):null}catch{}if(!s&&typeof window<"u"&&typeof window.getComputedStyle=="function")try{t.ownerDocument===document&&(s=window.getComputedStyle(t,e))}catch{}i=s||n(),o.set(e,i)}return i}function z(t){let e=[],n=0,o=0;for(let i=0;i<t.length;i++){let r=t[i];r==="("&&n++,r===")"&&n--,r===","&&n===0&&(e.push(t.slice(o,i).trim()),o=i+1)}return e.push(t.slice(o).trim()),e}function W(){if(typeof navigator>"u")return!1;let t=navigator.userAgent||"",e=t.toLowerCase(),n=e.includes("safari")&&!e.includes("chrome")&&!e.includes("crios")&&!e.includes("fxios")&&!e.includes("android"),o=/applewebkit/i.test(t),i=/mobile/i.test(t),r=!/safari/i.test(t),s=o&&i&&r,a=/(micromessenger|wxwork|wecom|windowswechat|macwechat)/i.test(t),l=/(baiduboxapp|baidubrowser|baidusearch|baiduboxlite)/i.test(e),f=/ipad|iphone|ipod/.test(e)&&o;return n||s||a||l||f}var Tt=[/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],xe=Object.assign({materialIconsFilled:"https://fonts.gstatic.com/s/materialicons/v48/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.woff2",materialIconsOutlined:"https://fonts.gstatic.com/s/materialiconsoutlined/v110/gok-H7zzDkdnRel8-DQ6KAXJ69wP1tGnf4ZGhUcel5euIg.woff2",materialIconsRound:"https://fonts.gstatic.com/s/materialiconsround/v109/LDItaoyNOAY6Uewc665JcIzCKsKc_M9flwmPq_HTTw.woff2",materialIconsSharp:"https://fonts.gstatic.com/s/materialiconssharp/v110/oPWQ_lt5nv4pWNJpghLP75WiFR4kLh3kvmvRImcycg.woff2"},typeof window<"u"&&window.__SNAPDOM_ICON_FONTS__||{}),Ot=[];function U(t){let e=typeof t=="string"?t:"",n=[...Tt,...Ot];for(let o of n)if(o instanceof RegExp&&o.test(e))return!0;return!!(/icon/i.test(e)||/glyph/i.test(e)||/symbols/i.test(e)||/feather/i.test(e)||/fontawesome/i.test(e))}var mt=new Set(["serif","sans-serif","monospace","cursive","fantasy","system-ui","emoji","math","fangsong","ui-serif","ui-sans-serif","ui-monospace","ui-rounded"]),Pt=["katex","mathjax","mathml"];function Z(t){if(!t)return"";for(let e of t.split(",")){let n=e.trim().replace(/^['"]+|['"]+$/g,"");if(n&&!mt.has(n.toLowerCase()))return n}return""}function vt(t){if(!t)return[];let e=[];for(let n of t.split(",")){let o=n.trim().replace(/^['"]+|['"]+$/g,"");o&&(mt.has(o.toLowerCase())||e.push(o))}return e}function G(t){let e=String(t??"400").trim().toLowerCase();if(e==="normal")return 400;if(e==="bold")return 700;let n=parseInt(e,10);return Number.isFinite(n)?Math.min(900,Math.max(100,n)):400}function X(t){let e=String(t??"normal").trim().toLowerCase();return e.startsWith("italic")?"italic":e.startsWith("oblique")?"oblique":"normal"}function Nt(t){let e=String(t??"100%").match(/(\d+(?:\.\d+)?)\s*%/);return e?Math.max(50,Math.min(200,parseFloat(e[1]))):100}function Dt(t){let e=String(t||"400").trim(),n=e.match(/^(\d{2,3})\s+(\d{2,3})$/);if(n){let i=G(n[1]),r=G(n[2]);return{min:Math.min(i,r),max:Math.max(i,r)}}let o=G(e);return{min:o,max:o}}function Wt(t){let e=String(t||"normal").trim().toLowerCase();return e==="italic"?{kind:"italic"}:e.startsWith("oblique")?{kind:"oblique"}:{kind:"normal"}}function Bt(t){let e=String(t||"100%").trim(),n=e.match(/(\d+(?:\.\d+)?)\s*%\s+(\d+(?:\.\d+)?)\s*%/);if(n){let r=parseFloat(n[1]),s=parseFloat(n[2]);return{min:Math.min(r,s),max:Math.max(r,s)}}let o=e.match(/(\d+(?:\.\d+)?)\s*%/),i=o?parseFloat(o[1]):100;return{min:i,max:i}}function qt(t){return!t||typeof t!="string"?"":t.replace(/\s+(variable|vf|v[0-9]+)$/i,"").trim().toLowerCase().replace(/\s+/g,"-")}function Vt(t,e,n=[]){if(!t)return!1;try{let o=new URL(t,location.href);if(o.origin===location.origin)return!0;let r=o.host.toLowerCase();if(["fonts.googleapis.com","fonts.gstatic.com","use.typekit.net","p.typekit.net","kit.fontawesome.com","use.fontawesome.com","cdn.jsdelivr.net","unpkg.com","cdnjs.cloudflare.com","esm.sh"].some(l=>r.endsWith(l))||n.some(l=>r===l.toLowerCase()||r.endsWith("."+l.toLowerCase())))return!0;let a=(o.pathname+o.search).toLowerCase();if(/\bfont(s)?\b/.test(a)||/\.woff2?(\b|$)/.test(a)||Pt.some(l=>a.includes(l)))return!0;for(let l of e){let f=l.toLowerCase().replace(/\s+/g,"+"),d=l.toLowerCase().replace(/\s+/g,"-"),p=qt(l);if(a.includes(f)||a.includes(d)||p&&a.includes(p))return!0}return!1}catch{return!1}}function jt(t){let e=new Set;for(let n of t||[]){let o=String(n).split("__")[0]?.trim();o&&e.add(o)}return e}function lt(t,e){return t&&t.replace(/url\(\s*(['"]?)([^)'"]+)\1\s*\)/g,(n,o,i)=>{let r=(i||"").trim();if(!r||/^data:|^blob:|^https?:|^file:|^about:/i.test(r))return n;let s=r;try{s=new URL(r,e||location.href).href}catch{}return`url("${s}")`})}var J=/@import\s+(?:url\(\s*(['"]?)([^)"']+)\1\s*\)|(['"])([^"']+)\3)([^;]*);/g,K=4;async function zt(t,e,n){if(!t)return t;let o=new Set;function i(a,l){try{return new URL(a,l||location.href).href}catch{return a}}async function r(a,l,f=0){if(f>K)return console.warn(`[snapDOM] @import depth exceeded (${K}) at ${l}`),a;let d="",p=0,w;for(;w=J.exec(a);){d+=a.slice(p,w.index),p=J.lastIndex;let k=(w[2]||w[4]||"").trim(),A=i(k,l);if(o.has(A)){console.warn(`[snapDOM] Skipping circular @import: ${A}`);continue}o.add(A);let b="";try{let m=await _(A,{as:"text",useProxy:n,silent:!0});m.ok&&typeof m.data=="string"&&(b=m.data)}catch{}b?(b=lt(b,A),b=await r(b,A,f+1),d+=`
|
|
8
|
-
/* inlined: ${
|
|
9
|
-
${
|
|
10
|
-
`):d+=w[0]}return d+=a.slice(p),d}let s=lt(t,e||location.href);return s=await r(s,e||location.href,0),s}var dt=/url\((["']?)([^"')]+)\1\)/g,Gt=/@font-face[^{}]*\{[^}]*\}/g;function pt(t){if(!t)return[];let e=[],n=t.split(",").map(o=>o.trim()).filter(Boolean);for(let o of n){let i=o.match(/^U\+([0-9A-Fa-f?]+)(?:-([0-9A-Fa-f?]+))?$/);if(!i)continue;let r=i[1],s=i[2],a=l=>{if(!l.includes("?"))return parseInt(l,16);let f=parseInt(l.replace(/\?/g,"0"),16),d=parseInt(l.replace(/\?/g,"F"),16);return[f,d]};if(s){let l=a(r),f=a(s),d=Array.isArray(l)?l[0]:l,p=Array.isArray(f)?f[1]:f;e.push([Math.min(d,p),Math.max(d,p)])}else{let l=a(r);Array.isArray(l)?e.push([l[0],l[1]]):e.push([l,l])}}return e}function ht(t,e){if(!e.length||!t||t.size===0)return!0;for(let n of t)for(let[o,i]of e)if(n>=o&&n<=i)return!0;return!1}function tt(t,e){let n=[];if(!t)return n;for(let o of t.matchAll(dt)){let i=(o[2]||"").trim();if(!(!i||i.startsWith("data:"))){if(!/^https?:/i.test(i))try{i=new URL(i,e||location.href).href}catch{}n.push(i)}}return n}async function gt(t,e,n=""){let o=t;for(let i of t.matchAll(dt)){let r=V(i[0]);if(!r)continue;let s=r;if(!s.startsWith("http")&&!s.startsWith("data:"))try{s=new URL(s,e||location.href).href}catch{}if(!U(s)){if(u.resource?.has(s)){u.font?.add(s),o=o.replace(i[0],`url(${u.resource.get(s)})`);continue}try{let a=await _(s,{as:"dataURL",useProxy:n,silent:!0});if(a.ok&&typeof a.data=="string"){let l=a.data;u.resource?.set(s,l),u.font?.add(s),o=o.replace(i[0],`url(${l})`)}}catch{console.warn("[snapDOM] Failed to fetch font resource:",s)}}}return o}function Xt(t){if(!t.length)return null;let e=(a,l)=>t.some(([f,d])=>!(d<a||f>l)),n=e(0,255)||e(305,305),o=e(256,591)||e(7680,7935),i=e(880,1023),r=e(1024,1279);return e(7840,7929)||e(258,259)||e(416,417)||e(431,432)?"vietnamese":r?"cyrillic":i?"greek":o?"latin-ext":n?"latin":null}function ft(t={}){let e=new Set((t.families||[]).map(i=>String(i).toLowerCase())),n=new Set((t.domains||[]).map(i=>String(i).toLowerCase())),o=new Set((t.subsets||[]).map(i=>String(i).toLowerCase()));return(i,r)=>{if(e.size&&e.has(i.family.toLowerCase()))return!0;if(n.size)for(let s of i.srcUrls)try{if(n.has(new URL(s).host.toLowerCase()))return!0}catch{}if(o.size){let s=Xt(r);if(s&&o.has(s))return!0}return!1}}function Kt(t){if(!t)return t;let e=/@font-face[^{}]*\{[^}]*\}/gi,n=new Set,o=[];for(let r of t.match(e)||[]){let s=r.match(/font-family:\s*([^;]+);/i)?.[1]||"",a=Z(s),l=(r.match(/font-weight:\s*([^;]+);/i)?.[1]||"400").trim(),f=(r.match(/font-style:\s*([^;]+);/i)?.[1]||"normal").trim(),d=(r.match(/font-stretch:\s*([^;]+);/i)?.[1]||"100%").trim(),p=(r.match(/unicode-range:\s*([^;]+);/i)?.[1]||"").trim(),w=(r.match(/src\s*:\s*([^;}]+)[;}]/i)?.[1]||"").trim(),k=tt(w,location.href),A=k.length?k.map(m=>String(m).toLowerCase()).sort().join("|"):w.toLowerCase(),b=[String(a||"").toLowerCase(),l,f,d,p.toLowerCase(),A].join("|");n.has(b)||(n.add(b),o.push(r))}if(o.length===0)return t;let i=0;return t.replace(e,()=>o[i++]||"")}var ut=new WeakMap,Ht=0;function Yt(t){let e=ut.get(t);return e===void 0&&(e=Ht++,ut.set(t,e)),e}function Qt(t,e,n,o,i,r){let s=Array.from(t||[]).sort().join("|"),a=e?JSON.stringify({families:(e.families||[]).map(w=>String(w).toLowerCase()).sort(),domains:(e.domains||[]).map(w=>String(w).toLowerCase()).sort(),subsets:(e.subsets||[]).map(w=>String(w).toLowerCase()).sort()}):"",l=(n||[]).map(w=>`${(w.family||"").toLowerCase()}::${w.weight||"normal"}::${w.style||"normal"}::${w.src||""}`).sort().join("|"),f=o||"",d=(i||[]).map(w=>String(w).toLowerCase()).sort().join("|"),p=Yt(r||document);return`fonts-embed-css::req=${s}::ex=${a}::lf=${l}::px=${f}::fd=${d}::doc=${p}`}async function yt(t,e,n,o){let i;try{i=t.cssRules||[]}catch{return}let r=(s,a)=>{try{return new URL(s,a||location.href).href}catch{return s}};for(let s of i){if(s.type===CSSRule.IMPORT_RULE&&s.styleSheet){let a=s.href?r(s.href,e):e;if(o.depth>=K){console.warn(`[snapDOM] CSSOM import depth exceeded (${K}) at ${a}`);continue}if(a&&o.visitedSheets.has(a)){console.warn(`[snapDOM] Skipping circular CSSOM import: ${a}`);continue}a&&o.visitedSheets.add(a);let l={...o,depth:(o.depth||0)+1};await yt(s.styleSheet,a,n,l);continue}if(s.type===CSSRule.FONT_FACE_RULE){let a=(s.style.getPropertyValue("font-family")||"").trim(),l=Z(a);if(!l||U(l))continue;let f=(s.style.getPropertyValue("font-weight")||"400").trim(),d=(s.style.getPropertyValue("font-style")||"normal").trim(),p=(s.style.getPropertyValue("font-stretch")||"100%").trim(),w=(s.style.getPropertyValue("src")||"").trim(),k=(s.style.getPropertyValue("unicode-range")||"").trim();if(!o.faceMatchesRequired(l,d,f,p))continue;let A=pt(k);if(!ht(o.usedCodepoints,A))continue;let b={family:l,weightSpec:f,styleSpec:d,stretchSpec:p,unicodeRange:k,srcRaw:w,srcUrls:tt(w,e||location.href),href:e||location.href};if(o.simpleExcluder&&o.simpleExcluder(b,A))continue;if(/url\(/i.test(w)){let m=await gt(w,e||location.href,o.useProxy);await n(`@font-face{font-family:${l};src:${m};font-style:${d};font-weight:${f};font-stretch:${p};${k?`unicode-range:${k};`:""}}`)}else await n(`@font-face{font-family:${l};src:${w};font-style:${d};font-weight:${f};font-stretch:${p};${k?`unicode-range:${k};`:""}}`)}}}async function wt({required:t,usedCodepoints:e,exclude:n=void 0,localFonts:o=[],useProxy:i="",fontStylesheetDomains:r=[],doc:s=document}={}){t instanceof Set||(t=new Set),e instanceof Set||(e=new Set);let a=new Map;for(let c of t){let[g,y,C,S]=String(c).split("__");if(!g)continue;let x=g.toLowerCase(),R=a.get(x)||[];R.push({w:parseInt(y,10),s:C,st:parseInt(S,10)}),a.set(x,R)}function l(c,g,y,C){let S=String(c).toLowerCase();if(!a.has(S))return!1;let x=a.get(S),R=Dt(y),M=Wt(g),F=Bt(C),T=R.min!==R.max,O=R.min,P=$=>M.kind==="normal"&&$==="normal"||M.kind!=="normal"&&($==="italic"||$==="oblique"),B=!1;for(let $ of x){let E=T?$.w>=R.min&&$.w<=R.max:$.w===O,I=P(X($.s)),q=$.st>=F.min&&$.st<=F.max;if(E&&I&&q){B=!0;break}}if(B)return!0;if(!T)for(let $ of x){let E=P(X($.s)),I=$.st>=F.min&&$.st<=F.max;if(Math.abs(O-$.w)<=300&&E&&I)return!0}if(!T&&M.kind==="normal"&&x.some(E=>X(E.s)!=="normal"))for(let E of x){let I=Math.abs(O-E.w)<=300,q=E.st>=F.min&&E.st<=F.max;if(I&&q)return!0}return!1}let f=ft(n),d=Qt(t,n,o,i,r,s);if(u.resource?.has(d))return u.resource.get(d);let p=jt(t),w=[],k=J;for(let c of s.querySelectorAll("style")){let g=c.textContent||"";for(let y of g.matchAll(k)){let C=(y[2]||y[4]||"").trim();if(!C||U(C))continue;s.querySelector(`link[rel="stylesheet"][href="${C}"]`)||w.push(C)}}let A=[];w.length&&await Promise.all(w.map(c=>new Promise(g=>{if(s.querySelector(`link[rel="stylesheet"][href="${c}"]`))return g(null);let y=s.createElement("link");y.rel="stylesheet",y.href=c,y.setAttribute("data-snapdom","injected-import"),y.onload=()=>g(y),y.onerror=()=>g(null),s.head.appendChild(y),A.push(y)})));let b="",m=Array.from(s.querySelectorAll('link[rel="stylesheet"]')).filter(c=>!!c.href);for(let c of A)try{c.remove()}catch{}for(let c of m)try{if(U(c.href))continue;let g="",y=!1;try{y=new URL(c.href,location.href).origin===location.origin}catch{}if(!y){let S=Array.isArray(r)?r:[];if(!Vt(c.href,p,S))continue}if(y){let S=Array.from(s.styleSheets).find(x=>x.href===c.href);if(S)try{let x=S.cssRules||[];g=Array.from(x).map(R=>R.cssText).join("")}catch{}}if(!g){let S=await _(c.href,{as:"text",useProxy:i});if(S?.ok&&typeof S.data=="string"&&(g=S.data),U(c.href))continue}g=await zt(g,c.href,i);let C="";for(let S of g.match(Gt)||[]){let x=(S.match(/font-family:\s*([^;]+);/i)?.[1]||"").trim(),R=Z(x);if(!R||U(R))continue;let M=(S.match(/font-weight:\s*([^;]+);/i)?.[1]||"400").trim(),F=(S.match(/font-style:\s*([^;]+);/i)?.[1]||"normal").trim(),T=(S.match(/font-stretch:\s*([^;]+);/i)?.[1]||"100%").trim(),O=(S.match(/unicode-range:\s*([^;]+);/i)?.[1]||"").trim(),P=(S.match(/src\s*:\s*([^;}]+)[;}]/i)?.[1]||"").trim(),B=tt(P,c.href);if(!l(R,F,M,T))continue;let $=pt(O);if(!ht(e,$))continue;let E={family:R,weightSpec:M,styleSpec:F,stretchSpec:T,unicodeRange:O,srcRaw:P,srcUrls:B,href:c.href};if(n&&f(E,$))continue;let I=/url\(/i.test(P)?await gt(S,c.href,i):S;C+=I}C.trim()&&(b+=C)}catch{console.warn("[snapDOM] Failed to process stylesheet:",c.href)}let h={requiredIndex:a,usedCodepoints:e,faceMatchesRequired:l,simpleExcluder:n?ft(n):null,useProxy:i,visitedSheets:new Set,depth:0};for(let c of s.styleSheets)if(!(c.href&&m.some(g=>g.href===c.href)))try{let g=c.href||location.origin+"/";g&&h.visitedSheets.add(g),await yt(c,g,async y=>{b+=y},h)}catch{}try{for(let c of s.fonts||[]){if(!c||!c.family||c.status!=="loaded"||!c._snapdomSrc)continue;let g=String(c.family).replace(/^['"]+|['"]+$/g,"");if(U(g)||!a.has(g.toLowerCase())||n?.families&&n.families.some(C=>String(C).toLowerCase()===g.toLowerCase()))continue;let y=c._snapdomSrc;if(!String(y).startsWith("data:")){if(u.resource?.has(c._snapdomSrc))y=u.resource.get(c._snapdomSrc),u.font?.add(c._snapdomSrc);else if(!u.font?.has(c._snapdomSrc))try{let C=await _(c._snapdomSrc,{as:"dataURL",useProxy:i,silent:!0});if(C.ok&&typeof C.data=="string")y=C.data,u.resource?.set(c._snapdomSrc,y),u.font?.add(c._snapdomSrc);else continue}catch{console.warn("[snapDOM] Failed to fetch dynamic font src:",c._snapdomSrc);continue}}b+=`@font-face{font-family:'${g}';src:url(${y});font-style:${c.style||"normal"};font-weight:${c.weight||"normal"};}`}}catch{}for(let c of o){if(!c||typeof c!="object")continue;let g=String(c.family||"").replace(/^['"]+|['"]+$/g,"");if(!g||U(g)||!a.has(g.toLowerCase())||n?.families&&n.families.some(M=>String(M).toLowerCase()===g.toLowerCase()))continue;let y=c.weight!=null?String(c.weight):"normal",C=c.style!=null?String(c.style):"normal",S=c.stretchPct!=null?`${c.stretchPct}%`:"100%",x=String(c.src||""),R=x;if(!R.startsWith("data:")){if(u.resource?.has(x))R=u.resource.get(x),u.font?.add(x);else if(!u.font?.has(x))try{let M=await _(x,{as:"dataURL",useProxy:i,silent:!0});if(M.ok&&typeof M.data=="string")R=M.data,u.resource?.set(x,R),u.font?.add(x);else continue}catch{console.warn("[snapDOM] Failed to fetch localFonts src:",x);continue}}b+=`@font-face{font-family:'${g}';src:url(${R});font-style:${C};font-weight:${y};font-stretch:${S};}`}return b&&(b=Kt(b),u.resource?.set(d,b)),b}function St(t,e){let n=new Set;if(!t)return n;let o=document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT,null),i=a=>{let l=vt(a.fontFamily);if(l.length)for(let f of l){let d=(p,w,k)=>`${f}__${G(p)}__${X(w)}__${Nt(k)}`;n.add(d(a.fontWeight,a.fontStyle,a.fontStretch))}};i(getComputedStyle(t));let r=getComputedStyle(t,"::before");r&&r.content&&r.content!=="none"&&i(r);let s=getComputedStyle(t,"::after");for(s&&s.content&&s.content!=="none"&&i(s);o.nextNode();){let a=o.currentNode;if(e&&!e(a))continue;let l=getComputedStyle(a);i(l);let f=getComputedStyle(a,"::before");f&&f.content&&f.content!=="none"&&i(f);let d=getComputedStyle(a,"::after");d&&d.content&&d.content!=="none"&&i(d)}return n}function bt(t,e){let n=new Set,o=r=>{if(r)for(let s of r)n.add(s.codePointAt(0))},i=document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT,null);for(;i.nextNode();){let r=i.currentNode;if(r.nodeType===Node.TEXT_NODE){if(e&&r.parentElement&&!e(r.parentElement))continue;o(r.nodeValue||"")}else if(r.nodeType===Node.ELEMENT_NODE){let s=r;if(e&&!e(s))continue;for(let a of["::before","::after"]){let f=getComputedStyle(s,a)?.getPropertyValue("content");if(!(!f||f==="none"))if(/^"/.test(f)||/^'/.test(f))o(f.slice(1,-1));else{let d=f.match(/\\[0-9A-Fa-f]{1,6}/g);if(d)for(let p of d)try{n.add(parseInt(p.slice(1),16))}catch{}}}}}return n}async function Ct(t,e=2,n=document){try{await n.fonts.ready}catch{}let o=Array.from(t||[]).filter(Boolean);if(o.length===0)return;let i=()=>{let r=n.createElement("div");r.style.cssText="position:absolute!important;left:-9999px!important;top:0!important;opacity:0!important;pointer-events:none!important;contain:layout size style;";for(let s of o){let a=n.createElement("span");a.textContent="AaBbGg1234\xC1\xC9\xCD\xD3\xDA\xE7\xF1\u2014\u221E",a.style.fontFamily=`"${s}"`,a.style.fontWeight="700",a.style.fontStyle="italic",a.style.fontSize="32px",a.style.lineHeight="1",a.style.whiteSpace="nowrap",a.style.margin="0",a.style.padding="0",r.appendChild(a)}n.body.appendChild(r),r.offsetWidth,n.body.removeChild(r)};for(let r=0;r<Math.max(1,e);r++)i(),await new Promise(s=>requestAnimationFrame(()=>requestAnimationFrame(s)))}async function xt(t,e,n,o={}){let i=[[t,e]],r=["background-image","mask","mask-image","-webkit-mask","-webkit-mask-image","mask-source","mask-box-image-source","mask-border-source","-webkit-mask-box-image-source","border-image","border-image-source"],s=["mask-position","mask-size","mask-repeat","mask-mode","mask-composite","-webkit-mask-position","-webkit-mask-size","-webkit-mask-repeat","-webkit-mask-composite","mask-origin","mask-clip","-webkit-mask-origin","-webkit-mask-clip","-webkit-mask-position-x","-webkit-mask-position-y"],a=["background-position","background-position-x","background-position-y","background-size","background-repeat","background-origin","background-clip","background-attachment","background-blend-mode"],l=["border-image-slice","border-image-width","border-image-outset","border-image-repeat"];for(;i.length;){let[f,d]=i.shift();if(!d)continue;let p=n.get(f)||D(f);n.has(f)||n.set(f,p);let w=(()=>{let m=p.getPropertyValue("border-image"),h=p.getPropertyValue("border-image-source");return m&&m!=="none"||h&&h!=="none"})(),k=p.getPropertyValue("background-image"),A=p.getPropertyValue("background-color");if(k&&k!=="none"||A&&A!=="rgba(0, 0, 0, 0)"&&A!=="transparent"||/url\s*\(|gradient\s*\(/i.test(p.getPropertyValue("background")||""))for(let m of a){let h=p.getPropertyValue(m);h&&d.style.setProperty(m,h)}for(let m of r){let h=p.getPropertyValue(m);if(m==="background-image"&&(!h||h==="none")){let y=p.getPropertyValue("background");y&&/url\s*\(/.test(y)&&(h=z(y).filter(C=>/url\s*\(/.test(C)).join(", ")||h)}if(!h||h==="none")continue;let c=z(h),g=await Promise.all(c.map(y=>N(y,o)));g.some(y=>y&&y!=="none"&&!/^url\(undefined/.test(y))&&d.style.setProperty(m,g.join(", "))}for(let m of s){let h=p.getPropertyValue(m);!h||h==="initial"||d.style.setProperty(m,h)}if(w)for(let m of l){let h=p.getPropertyValue(m);!h||h==="initial"||d.style.setProperty(m,h)}if(f.shadowRoot){let m=Array.from(f.shadowRoot.children).filter(c=>c.tagName!=="STYLE"),h=Array.from(d.children).filter(c=>!c.dataset?.snapdomPseudo&&!(c.tagName==="STYLE"&&c.dataset?.sd));for(let c=0;c<Math.min(m.length,h.length);c++)i.push([m[c],h[c]])}else{let m=u.session.nodeMap;for(let h of d.children){let c=m.get(h);c&&i.push([c,h])}}}}async function ve(t=document,e={}){let{embedFonts:n=!0,useProxy:o=""}=e,i=e.cache??e.cacheOpt??"full";et(i);try{await document.fonts?.ready}catch{}try{Q()}catch{}u.session=u.session||{},u.session.styleCache||(u.session.styleCache=new WeakMap),u.image=u.image||new L(100),u.background=u.background||new L(100);try{await xt(t,void 0,u.session.styleCache,{useProxy:o})}catch{}let r=[],s=[];try{if(t&&t.nodeType===1){let l=t.querySelectorAll?Array.from(t.querySelectorAll("*")):[];s=[t,...l],r=[],t.tagName==="IMG"&&t.getAttribute("src")&&r.push(t),r.push(...Array.from(t.querySelectorAll?.("img[src]")||[]))}else t?.querySelectorAll&&(r=Array.from(t.querySelectorAll("img[src]")),s=Array.from(t.querySelectorAll("*")))}catch{}let a=[];for(let l of r){let f=l?.currentSrc||l?.src;if(f&&!u.image.has(f)){let d=Promise.resolve().then(async()=>{let p=await _(f,{as:"dataURL",useProxy:o});p?.ok&&typeof p.data=="string"&&u.image.set(f,p.data)}).catch(()=>{});a.push(d)}}for(let l of s){let f="";try{f=l?.style?.backgroundImage||"",(!f||f==="none")&&(f=D(l).backgroundImage)}catch{}if(f&&f!=="none"){let d=f.match(/url\((?:[^()"']+|"(?:[^"]*)"|'(?:[^']*)')\)/gi)||[];for(let p of d){let w=Promise.resolve().then(()=>N(p,{...e,useProxy:o})).catch(()=>{});a.push(w)}}}if(n)try{let l=St(t),f=bt(t);if(typeof W=="function"?W():!!W){let p=new Set(Array.from(l).map(w=>String(w).split("__")[0]).filter(Boolean));await Ct(p,3)}await wt({required:l,usedCodepoints:f,exclude:e.excludeFonts,localFonts:e.localFonts,useProxy:e.useProxy??o,fontStylesheetDomains:e.fontStylesheetDomains})}catch{}await Promise.allSettled(a)}export{ve as preCache};
|
|
7
|
+
var _=class extends Map{constructor(e=100,...n){super(...n),this._maxSize=e}set(e,n){if(this.size>=this._maxSize&&!this.has(e)){let o=this.keys().next().value;o!==void 0&&this.delete(o)}return super.set(e,n)}},f={image:new _(100),background:new _(100),resource:new _(150),defaultStyle:new _(30),baseStyle:new _(50),compress:new _(50),computedStyle:new WeakMap,measureHints:new WeakMap,burstAdvice:new WeakMap,warnedReconcile:!1,font:new Set,session:{styleMap:new Map,styleCache:new WeakMap,nodeMap:new Map}};function nt(t="soft"){switch(f.session.__counterEpoch=(f.session.__counterEpoch||0)+1,t){case"auto":{f.session.styleMap=new Map,f.session.nodeMap=new Map;return}case"soft":{f.session.styleMap=new Map,f.session.nodeMap=new Map,f.session.styleCache=new WeakMap;return}case"full":return;case"disabled":{f.session.styleMap=new Map,f.session.nodeMap=new Map,f.session.styleCache=new WeakMap,f.computedStyle=new WeakMap,f.measureHints=new WeakMap,f.baseStyle=new _(50),f.defaultStyle=new _(30),f.image=new _(100),f.background=new _(100),f.resource=new _(150),f.compress=new _(50),f.font=new Set;return}default:{f.session.styleMap=new Map,f.session.nodeMap=new Map,f.session.styleCache=new WeakMap;return}}}function q(t){let e=t.match(/url\((['"]?)(.*?)(\1)\)/);if(!e)return null;let n=e[2].trim();return n.startsWith("#")?null:n}function ot(t,e=1){let n=t.match(/^\s*-?(?:webkit-)?image-set\(([\s\S]*)\)\s*$/i);if(!n)return null;let o=[];for(let r of n[1].split(",")){let s=r.match(/url\((['"]?)(.*?)(\1)\)/);if(!s)continue;let c=r.match(/(\d+(?:\.\d+)?)\s*(x|dpi|dppx)/i),i=1;if(c){let u=parseFloat(c[1]);i=/dpi/i.test(c[2])?u/96:u}o.push({url:s[2].trim(),dppx:i})}return o.length?(o.sort((r,s)=>r.dppx-s.dppx),(o.find(r=>r.dppx>=e)||o[o.length-1]).url):null}function B(t){if(/%[0-9A-Fa-f]{2}/.test(t))return t;try{return encodeURI(t)}catch{return t}}function rt(t,e){if(!t||/^(data|blob|about|#)/i.test(t.trim()))return t;try{let n=e||typeof document<"u"&&(document.baseURI||document.location?.href)||"http://localhost/";return new URL(t,n).href}catch{return t}}function At(t="[snapDOM]",{ttlMs:e=5*6e4,maxEntries:n=12}={}){let o=new Map,a=0;function r(s,c,i){if(a>=n)return;let u=Date.now();(o.get(c)||0)>u||(o.set(c,u+e),a++,s==="warn"&&console&&console.warn?console.warn(`${t} ${i}`):console&&console.error&&console.error(`${t} ${i}`))}return{warnOnce(s,c){r("warn",s,c)},errorOnce(s,c){r("error",s,c)},reset(){o.clear(),a=0}}}var st=At("[snapDOM]",{ttlMs:3*6e4,maxEntries:10}),K=new Map,X=new Map;function Et(t){return/^data:|^blob:|^about:blank$/i.test(t)}function Rt(t,e){try{let n=typeof location<"u"&&location.href?location.href:"http://localhost/",o=e.includes("{url}")?e.split("{url}")[0]:e,a=new URL(o||".",n),r=new URL(t,n);if(r.origin===a.origin)return!0;let s=r.searchParams;if(s&&(s.has("url")||s.has("target")))return!0}catch{}return!1}function _t(t,e){if(!e||Et(t)||Rt(t,e))return!1;try{let n=typeof location<"u"&&location.href?location.href:"http://localhost/",o=new URL(t,n);return typeof location<"u"?o.origin!==location.origin:!0}catch{return!!e}}function Lt(t,e){if(!e)return t;if(e.includes("{url}"))return e.replace("{urlRaw}",B(t)).replace("{url}",encodeURIComponent(t));if(/[?&]url=?$/.test(e))return`${e}${encodeURIComponent(t)}`;if(e.endsWith("?"))return`${e}url=${encodeURIComponent(t)}`;if(e.endsWith("/"))return`${e}${B(t)}`;let n=e.includes("?")?"&":"?";return`${e}${n}url=${encodeURIComponent(t)}`}function it(t){return new Promise((e,n)=>{let o=new FileReader;o.onload=()=>e(String(o.result||"")),o.onerror=()=>n(new Error("read_failed")),o.readAsDataURL(t)})}function Mt(t,e){return[e.as||"blob",e.timeout??3e3,e.useProxy||"",e.errorTTL??8e3,t].join("|")}async function $(t,e={}){let n=e.as??"blob",o=e.timeout??3e3,a=e.useProxy||"",r=e.errorTTL??8e3,s=e.headers||{},c=!!e.silent;if(/^data:/i.test(t))try{if(n==="text")return{ok:!0,data:String(t),status:200,url:t,fromCache:!1};if(n==="dataURL")return{ok:!0,data:String(t),status:200,url:t,fromCache:!1,mime:String(t).slice(5).split(";")[0]||""};let[,g="",x=""]=String(t).match(/^data:([^,]*),(.*)$/)||[],h=/;base64/i.test(g)?atob(x):decodeURIComponent(x),w=new Uint8Array([...h].map(b=>b.charCodeAt(0))),S=new Blob([w],{type:(g||"").split(";")[0]||""});return{ok:!0,data:S,status:200,url:t,fromCache:!1,mime:S.type||""}}catch{return{ok:!1,data:null,status:0,url:t,fromCache:!1,reason:"special_url_error"}}if(/^blob:/i.test(t))try{let g=await fetch(t);if(!g.ok)return{ok:!1,data:null,status:g.status,url:t,fromCache:!1,reason:"http_error"};let x=await g.blob(),l=x.type||g.headers.get("content-type")||"";return n==="dataURL"?{ok:!0,data:await it(x),status:g.status,url:t,fromCache:!1,mime:l}:n==="text"?{ok:!0,data:await x.text(),status:g.status,url:t,fromCache:!1,mime:l}:{ok:!0,data:x,status:g.status,url:t,fromCache:!1,mime:l}}catch{return{ok:!1,data:null,status:0,url:t,fromCache:!1,reason:"network"}}if(/^about:blank$/i.test(t))return n==="dataURL"?{ok:!0,data:"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg==",status:200,url:t,fromCache:!1,mime:"image/png"}:{ok:!0,data:n==="text"?"":new Blob([]),status:200,url:t,fromCache:!1};let i=Mt(t,{as:n,timeout:o,useProxy:a,errorTTL:r}),u=X.get(i);if(u&&u.until>Date.now())return{...u.result,fromCache:!0};u&&X.delete(i);let p=K.get(i);if(p)return p;let m=_t(t,a)?Lt(t,a):t,d=e.credentials;if(!d)try{let g=typeof location<"u"&&location.href?location.href:"http://localhost/",x=new URL(t,g);d=typeof location<"u"&&x.origin===location.origin?"include":"omit"}catch{d="omit"}let A=new AbortController,E=setTimeout(()=>A.abort("timeout"),o),y=(async()=>{try{let g=await fetch(m,{signal:A.signal,credentials:d,headers:s});if(!g.ok){let h={ok:!1,data:null,status:g.status,url:m,fromCache:!1,reason:"http_error"};if(r>0&&X.set(i,{until:Date.now()+r,result:h}),!c){let w=`${g.status} ${g.statusText||""}`.trim();st.warnOnce(`http:${g.status}:${n}:${new URL(t,location?.href??"http://localhost/").origin}`,`HTTP error ${w} while fetching ${n} ${t}`)}return e.onError&&e.onError(h),h}if(n==="text")return{ok:!0,data:await g.text(),status:g.status,url:m,fromCache:!1};let x=await g.blob(),l=x.type||g.headers.get("content-type")||"";return n==="dataURL"?{ok:!0,data:await it(x),status:g.status,url:m,fromCache:!1,mime:l}:{ok:!0,data:x,status:g.status,url:m,fromCache:!1,mime:l}}catch(g){let x=g&&typeof g=="object"&&"name"in g&&g.name==="AbortError"?String(g.message||"").includes("timeout")?"timeout":"abort":"network",l={ok:!1,data:null,status:0,url:m,fromCache:!1,reason:x};if(!/^blob:/i.test(t)&&r>0&&X.set(i,{until:Date.now()+r,result:l}),!c){let h=`${x}:${n}:${new URL(t,location?.href??"http://localhost/").origin}`,w=x==="timeout"?`Timeout after ${o}ms. Consider increasing timeout or using a proxy for ${t}`:x==="abort"?`Request aborted while fetching ${n} ${t}`:`Network/CORS issue while fetching ${n} ${t}. A proxy may be required`;st.errorOnce(h,w)}return e.onError&&e.onError(l),l}finally{clearTimeout(E),K.delete(i)}})();return K.set(i,y),y}async function D(t,e={}){if(/^((repeating-)?(linear|radial|conic)-gradient)\(/i.test(t)||t.trim()==="none")return t;let o=ot(t,typeof devicePixelRatio<"u"&&devicePixelRatio||1)??q(t);if(!o)return t;let a=rt(o),r=B(a),s=(e.useProxy||"")+"|"+r;if(f.background.has(s)){let c=f.background.get(s);return c?`url("${c}")`:"none"}try{let c=await $(r,{as:"dataURL",useProxy:e.useProxy});return c.ok?(f.background.set(s,c.data),`url("${c.data}")`):(f.background.set(s,null),"none")}catch{return f.background.set(s,null),"none"}}var ct=new Set(["meta","script","noscript","title","link","template"]),Y=new Set(["meta","link","style","title","noscript","script","template","g","defs","use","marker","mask","clipPath","pattern","path","polygon","polyline","line","circle","ellipse","rect","filter","lineargradient","radialgradient","stop"]),$t=["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","table","thead","tbody","tr","td","th"];function Q(){for(let t of $t){let e=String(t).toLowerCase();ct.has(e)||Y.has(e)||lt(e)}}function lt(t){if(t=String(t).toLowerCase(),Y.has(t)){let r={};return f.defaultStyle.set(t,r),r}if(f.defaultStyle.has(t))return f.defaultStyle.get(t);let e=document.getElementById("snapdom-sandbox");e||(e=document.createElement("div"),e.id="snapdom-sandbox",e.setAttribute("data-snapdom-sandbox","true"),e.setAttribute("aria-hidden","true"),e.style.position="absolute",e.style.left="-9999px",e.style.top="-9999px",e.style.width="0px",e.style.height="0px",e.style.overflow="hidden",document.body.appendChild(e));let n=document.createElement(t);n.style.all="initial",e.appendChild(n);let o=getComputedStyle(n),a={};for(let r of o){if(ft(r))continue;let s=o.getPropertyValue(r);a[r]=s}return e.removeChild(n),f.defaultStyle.set(t,a),a}var Ft=/(?:^|-)(animation|transition)(?:-|$)/i,It=/^(--.+|view-timeline|scroll-timeline|animation-trigger|offset-|position-try|app-region|interactivity|overlay|view-transition|-webkit-locale|-webkit-user-(?:drag|modify)|-webkit-tap-highlight-color|-webkit-text-security)$/i,vt=new Set(["cursor","pointer-events","touch-action","user-select","print-color-adjust","speak","reading-flow","reading-order","anchor-name","anchor-scope","container-name","container-type","timeline-scope","zoom","stroke-color"]),at=new Map;function ft(t){let e=at.get(t);if(e===void 0){let n=String(t).toLowerCase();e=vt.has(n)||It.test(n)||Ft.test(n),at.set(t,e)}return e}function Tt(t){try{let e=t?.ownerDocument;if(!e)return typeof window<"u"?window:null;let n=e.defaultView;if(n&&typeof n.getComputedStyle=="function")return n;if(typeof window<"u"&&window.frames)for(let o=0;o<window.frames.length;o++)try{if(window.frames[o]?.document===e)return window.frames[o]}catch{}}catch{}return typeof window<"u"?window:null}function v(t,e=null){let n=()=>{let r={length:0,getPropertyValue:()=>"",item:()=>""};return r[Symbol.iterator]=function*(){},r};if(!(t instanceof Element)){let r=typeof window<"u"?window:null;if(r&&typeof r.getComputedStyle=="function")try{return r.getComputedStyle(t,e)||n()}catch{return n()}return n()}let o=f.computedStyle.get(t);o||(o=new Map,f.computedStyle.set(t,o));let a=o.get(e);if(!a){let r=Tt(t),s=null;try{s=r&&typeof r.getComputedStyle=="function"?r.getComputedStyle(t,e):null}catch{}if(!s&&typeof window<"u"&&typeof window.getComputedStyle=="function")try{t.ownerDocument===document&&(s=window.getComputedStyle(t,e))}catch{}a=s||n(),o.set(e,a)}return a}function j(t){let e=[],n=0,o=0;for(let a=0;a<t.length;a++){let r=t[a];r==="("&&n++,r===")"&&n--,r===","&&n===0&&(e.push(t.slice(o,a).trim()),o=a+1)}return e.push(t.slice(o).trim()),e}function W(){if(typeof navigator>"u")return!1;let t=navigator.userAgent||"",e=t.toLowerCase(),n=e.includes("safari")&&!e.includes("chrome")&&!e.includes("crios")&&!e.includes("fxios")&&!e.includes("android"),o=/applewebkit/i.test(t),a=/mobile/i.test(t),r=!/safari/i.test(t),s=o&&a&&r,c=/(micromessenger|wxwork|wecom|windowswechat|macwechat)/i.test(t),i=/(baiduboxapp|baidubrowser|baidusearch|baiduboxlite)/i.test(e),u=/ipad|iphone|ipod/.test(e)&&o;return n||s||c||i||u}var Pt=[/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],$e=Object.assign({materialIconsFilled:"https://fonts.gstatic.com/s/materialicons/v48/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.woff2",materialIconsOutlined:"https://fonts.gstatic.com/s/materialiconsoutlined/v110/gok-H7zzDkdnRel8-DQ6KAXJ69wP1tGnf4ZGhUcel5euIg.woff2",materialIconsRound:"https://fonts.gstatic.com/s/materialiconsround/v109/LDItaoyNOAY6Uewc665JcIzCKsKc_M9flwmPq_HTTw.woff2",materialIconsSharp:"https://fonts.gstatic.com/s/materialiconssharp/v110/oPWQ_lt5nv4pWNJpghLP75WiFR4kLh3kvmvRImcycg.woff2"},typeof window<"u"&&window.__SNAPDOM_ICON_FONTS__||{}),Ut=[];function I(t){let e=typeof t=="string"?t:"",n=[...Pt,...Ut];for(let o of n)if(o instanceof RegExp&&o.test(e))return!0;return!!(/icon/i.test(e)||/glyph/i.test(e)||/symbols/i.test(e)||/feather/i.test(e)||/fontawesome/i.test(e))}var pt=new Set(["serif","sans-serif","monospace","cursive","fantasy","system-ui","emoji","math","fangsong","ui-serif","ui-sans-serif","ui-monospace","ui-rounded"]),Ot=["katex","mathjax","mathml"];function Z(t){if(!t)return"";for(let e of t.split(",")){let n=e.trim().replace(/^['"]+|['"]+$/g,"");if(n&&!pt.has(n.toLowerCase()))return n}return""}function Bt(t){if(!t)return[];let e=[];for(let n of t.split(",")){let o=n.trim().replace(/^['"]+|['"]+$/g,"");o&&(pt.has(o.toLowerCase())||e.push(o))}return e}function z(t){let e=String(t??"400").trim().toLowerCase();if(e==="normal")return 400;if(e==="bold")return 700;let n=parseInt(e,10);return Number.isFinite(n)?Math.min(900,Math.max(100,n)):400}function G(t){let e=String(t??"normal").trim().toLowerCase();return e.startsWith("italic")?"italic":e.startsWith("oblique")?"oblique":"normal"}function Dt(t){let e=String(t??"100%").match(/(\d+(?:\.\d+)?)\s*%/);return e?Math.max(50,Math.min(200,parseFloat(e[1]))):100}function Wt(t){let e=String(t||"400").trim(),n=e.match(/^(\d{2,3})\s+(\d{2,3})$/);if(n){let a=z(n[1]),r=z(n[2]);return{min:Math.min(a,r),max:Math.max(a,r)}}let o=z(e);return{min:o,max:o}}function Nt(t){let e=String(t||"normal").trim().toLowerCase();return e==="italic"?{kind:"italic"}:e.startsWith("oblique")?{kind:"oblique"}:{kind:"normal"}}function Vt(t){let e=String(t||"100%").trim(),n=e.match(/(\d+(?:\.\d+)?)\s*%\s+(\d+(?:\.\d+)?)\s*%/);if(n){let r=parseFloat(n[1]),s=parseFloat(n[2]);return{min:Math.min(r,s),max:Math.max(r,s)}}let o=e.match(/(\d+(?:\.\d+)?)\s*%/),a=o?parseFloat(o[1]):100;return{min:a,max:a}}function qt(t){return!t||typeof t!="string"?"":t.replace(/\s+(variable|vf|v[0-9]+)$/i,"").trim().toLowerCase().replace(/\s+/g,"-")}function Xt(t,e,n=[]){if(!t)return!1;try{let o=new URL(t,location.href);if(o.origin===location.origin)return!0;let r=o.host.toLowerCase();if(["fonts.googleapis.com","fonts.gstatic.com","use.typekit.net","p.typekit.net","kit.fontawesome.com","use.fontawesome.com","cdn.jsdelivr.net","unpkg.com","cdnjs.cloudflare.com","esm.sh"].some(i=>r.endsWith(i))||n.some(i=>r===i.toLowerCase()||r.endsWith("."+i.toLowerCase())))return!0;let c=(o.pathname+o.search).toLowerCase();if(/\bfont(s)?\b/.test(c)||/\.woff2?(\b|$)/.test(c)||Ot.some(i=>c.includes(i)))return!0;for(let i of e){let u=i.toLowerCase().replace(/\s+/g,"+"),p=i.toLowerCase().replace(/\s+/g,"-"),m=qt(i);if(c.includes(u)||c.includes(p)||m&&c.includes(m))return!0}return!1}catch{return!1}}function jt(t){let e=new Set;for(let n of t||[]){let o=String(n).split("__")[0]?.trim();o&&e.add(o)}return e}function ut(t,e){return t&&t.replace(/url\(\s*(['"]?)([^)'"]+)\1\s*\)/g,(n,o,a)=>{let r=(a||"").trim();if(!r||/^data:|^blob:|^https?:|^file:|^about:/i.test(r))return n;let s=r;try{s=new URL(r,e||location.href).href}catch{}return`url("${s}")`})}var J=/@import\s+(?:url\(\s*(['"]?)([^)"']+)\1\s*\)|(['"])([^"']+)\3)([^;]*);/g,H=4;async function zt(t,e,n){if(!t)return t;let o=new Set;function a(c,i){try{return new URL(c,i||location.href).href}catch{return c}}async function r(c,i,u=0){if(u>H)return console.warn(`[snapDOM] @import depth exceeded (${H}) at ${i}`),c;let p="",m=0,d;for(;d=J.exec(c);){p+=c.slice(m,d.index),m=J.lastIndex;let A=(d[2]||d[4]||"").trim(),E=a(A,i);if(o.has(E)){console.warn(`[snapDOM] Skipping circular @import: ${E}`);continue}o.add(E);let y="";try{let g=await $(E,{as:"text",useProxy:n,silent:!0});g.ok&&typeof g.data=="string"&&(y=g.data)}catch{}y?(y=ut(y,E),y=await r(y,E,u+1),p+=`
|
|
8
|
+
/* inlined: ${E} */
|
|
9
|
+
${y}
|
|
10
|
+
`):p+=d[0]}return p+=c.slice(m),p}let s=ut(t,e||location.href);return s=await r(s,e||location.href,0),s}var ht=/url\((["']?)([^"')]+)\1\)/g,Gt=/@font-face[^{}]*\{[^}]*\}/g;function gt(t){if(!t)return[];let e=[],n=t.split(",").map(o=>o.trim()).filter(Boolean);for(let o of n){let a=o.match(/^U\+([0-9A-Fa-f?]+)(?:-([0-9A-Fa-f?]+))?$/);if(!a)continue;let r=a[1],s=a[2],c=i=>{if(!i.includes("?"))return parseInt(i,16);let u=parseInt(i.replace(/\?/g,"0"),16),p=parseInt(i.replace(/\?/g,"F"),16);return[u,p]};if(s){let i=c(r),u=c(s),p=Array.isArray(i)?i[0]:i,m=Array.isArray(u)?u[1]:u;e.push([Math.min(p,m),Math.max(p,m)])}else{let i=c(r);Array.isArray(i)?e.push([i[0],i[1]]):e.push([i,i])}}return e}function yt(t,e){if(!e.length||!t||t.size===0)return!0;for(let n of t)for(let[o,a]of e)if(n>=o&&n<=a)return!0;return!1}function tt(t,e){let n=[];if(!t)return n;for(let o of t.matchAll(ht)){let a=(o[2]||"").trim();if(!(!a||a.startsWith("data:"))){if(!/^https?:/i.test(a))try{a=new URL(a,e||location.href).href}catch{}n.push(a)}}return n}async function wt(t,e,n=""){let o=t;for(let a of t.matchAll(ht)){let r=q(a[0]);if(!r)continue;let s=r;if(!s.startsWith("http")&&!s.startsWith("data:"))try{s=new URL(s,e||location.href).href}catch{}if(!I(s)){if(f.resource?.has(s)){f.font?.add(s),o=o.replace(a[0],`url(${f.resource.get(s)})`);continue}try{let c=await $(s,{as:"dataURL",useProxy:n,silent:!0});if(c.ok&&typeof c.data=="string"){let i=c.data;f.resource?.set(s,i),f.font?.add(s),o=o.replace(a[0],`url(${i})`)}}catch{console.warn("[snapDOM] Failed to fetch font resource:",s)}}}return o}function Ht(t){if(!t.length)return null;let e=(c,i)=>t.some(([u,p])=>!(p<c||u>i)),n=e(0,255)||e(305,305),o=e(256,591)||e(7680,7935),a=e(880,1023),r=e(1024,1279);return e(7840,7929)||e(258,259)||e(416,417)||e(431,432)?"vietnamese":r?"cyrillic":a?"greek":o?"latin-ext":n?"latin":null}function dt(t={}){let e=new Set((t.families||[]).map(a=>String(a).toLowerCase())),n=new Set((t.domains||[]).map(a=>String(a).toLowerCase())),o=new Set((t.subsets||[]).map(a=>String(a).toLowerCase()));return(a,r)=>{if(e.size&&e.has(a.family.toLowerCase()))return!0;if(n.size)for(let s of a.srcUrls)try{if(n.has(new URL(s).host.toLowerCase()))return!0}catch{}if(o.size){let s=Ht(r);if(s&&o.has(s))return!0}return!1}}function Kt(t){if(!t)return t;let e=/@font-face[^{}]*\{[^}]*\}/gi,n=new Set,o=[];for(let r of t.match(e)||[]){let s=r.match(/font-family:\s*([^;]+);/i)?.[1]||"",c=Z(s),i=(r.match(/font-weight:\s*([^;]+);/i)?.[1]||"400").trim(),u=(r.match(/font-style:\s*([^;]+);/i)?.[1]||"normal").trim(),p=(r.match(/font-stretch:\s*([^;]+);/i)?.[1]||"100%").trim(),m=(r.match(/unicode-range:\s*([^;]+);/i)?.[1]||"").trim(),d=(r.match(/src\s*:\s*([^;}]+)[;}]/i)?.[1]||"").trim(),A=tt(d,location.href),E=A.length?A.map(g=>String(g).toLowerCase()).sort().join("|"):d.toLowerCase(),y=[String(c||"").toLowerCase(),i,u,p,m.toLowerCase(),E].join("|");n.has(y)||(n.add(y),o.push(r))}if(o.length===0)return t;let a=0;return t.replace(e,()=>o[a++]||"")}var mt=new WeakMap,Yt=0;function Qt(t){let e=mt.get(t);return e===void 0&&(e=Yt++,mt.set(t,e)),e}function Jt(t,e,n,o,a,r){let s=Array.from(t||[]).sort().join("|"),c=e?JSON.stringify({families:(e.families||[]).map(d=>String(d).toLowerCase()).sort(),domains:(e.domains||[]).map(d=>String(d).toLowerCase()).sort(),subsets:(e.subsets||[]).map(d=>String(d).toLowerCase()).sort()}):"",i=(n||[]).map(d=>`${(d.family||"").toLowerCase()}::${d.weight||"normal"}::${d.style||"normal"}::${d.src||""}`).sort().join("|"),u=o||"",p=(a||[]).map(d=>String(d).toLowerCase()).sort().join("|"),m=Qt(r||document);return`fonts-embed-css::req=${s}::ex=${c}::lf=${i}::px=${u}::fd=${p}::doc=${m}`}async function bt(t,e,n,o){let a;try{a=t.cssRules||[]}catch{return}let r=(s,c)=>{try{return new URL(s,c||location.href).href}catch{return s}};for(let s of a){if(s.type===CSSRule.IMPORT_RULE&&s.styleSheet){let c=s.href?r(s.href,e):e;if(o.depth>=H){console.warn(`[snapDOM] CSSOM import depth exceeded (${H}) at ${c}`);continue}if(c&&o.visitedSheets.has(c)){console.warn(`[snapDOM] Skipping circular CSSOM import: ${c}`);continue}c&&o.visitedSheets.add(c);let i={...o,depth:(o.depth||0)+1};await bt(s.styleSheet,c,n,i);continue}if(s.type===CSSRule.FONT_FACE_RULE){let c=(s.style.getPropertyValue("font-family")||"").trim(),i=Z(c);if(!i||I(i))continue;let u=(s.style.getPropertyValue("font-weight")||"400").trim(),p=(s.style.getPropertyValue("font-style")||"normal").trim(),m=(s.style.getPropertyValue("font-stretch")||"100%").trim(),d=(s.style.getPropertyValue("src")||"").trim(),A=(s.style.getPropertyValue("unicode-range")||"").trim();if(!o.faceMatchesRequired(i,p,u,m))continue;let E=gt(A);if(!yt(o.usedCodepoints,E))continue;let y={family:i,weightSpec:u,styleSpec:p,stretchSpec:m,unicodeRange:A,srcRaw:d,srcUrls:tt(d,e||location.href),href:e||location.href};if(o.simpleExcluder&&o.simpleExcluder(y,E))continue;if(/url\(/i.test(d)){let g=await wt(d,e||location.href,o.useProxy);await n(`@font-face{font-family:${i};src:${g};font-style:${p};font-weight:${u};font-stretch:${m};${A?`unicode-range:${A};`:""}}`)}else await n(`@font-face{font-family:${i};src:${d};font-style:${p};font-weight:${u};font-stretch:${m};${A?`unicode-range:${A};`:""}}`)}}}async function St({required:t,usedCodepoints:e,exclude:n=void 0,localFonts:o=[],useProxy:a="",fontStylesheetDomains:r=[],doc:s=document}={}){t instanceof Set||(t=new Set),e instanceof Set||(e=new Set);let c=new Map;for(let l of t){let[h,w,S,b]=String(l).split("__");if(!h)continue;let k=h.toLowerCase(),C=c.get(k)||[];C.push({w:parseInt(w,10),s:S,st:parseInt(b,10)}),c.set(k,C)}function i(l,h,w,S){let b=String(l).toLowerCase();if(!c.has(b))return!1;let k=c.get(b),C=Wt(w),L=Nt(h),F=Vt(S),P=C.min!==C.max,U=C.min,O=R=>L.kind==="normal"&&R==="normal"||L.kind!=="normal"&&(R==="italic"||R==="oblique"),N=!1;for(let R of k){let M=P?R.w>=C.min&&R.w<=C.max:R.w===U,T=O(G(R.s)),V=R.st>=F.min&&R.st<=F.max;if(M&&T&&V){N=!0;break}}if(N)return!0;if(!P)for(let R of k){let M=O(G(R.s)),T=R.st>=F.min&&R.st<=F.max;if(Math.abs(U-R.w)<=300&&M&&T)return!0}if(!P&&L.kind==="normal"&&k.some(M=>G(M.s)!=="normal"))for(let M of k){let T=Math.abs(U-M.w)<=300,V=M.st>=F.min&&M.st<=F.max;if(T&&V)return!0}return!1}let u=dt(n),p=Jt(t,n,o,a,r,s);if(f.resource?.has(p))return f.resource.get(p);let m=jt(t),d=[],A=J;for(let l of s.querySelectorAll("style")){let h=l.textContent||"";for(let w of h.matchAll(A)){let S=(w[2]||w[4]||"").trim();if(!S||I(S))continue;s.querySelector(`link[rel="stylesheet"][href="${S}"]`)||d.push(S)}}let E=[];d.length&&await Promise.all(d.map(l=>new Promise(h=>{if(s.querySelector(`link[rel="stylesheet"][href="${l}"]`))return h(null);let w=s.createElement("link");w.rel="stylesheet",w.href=l,w.setAttribute("data-snapdom","injected-import"),w.onload=()=>h(w),w.onerror=()=>h(null),s.head.appendChild(w),E.push(w)})));let y="",g=Array.from(s.querySelectorAll('link[rel="stylesheet"]')).filter(l=>!!l.href);for(let l of E)try{l.remove()}catch{}for(let l of g)try{if(I(l.href))continue;let h="",w=!1;try{w=new URL(l.href,location.href).origin===location.origin}catch{}if(!w){let b=Array.isArray(r)?r:[];if(!Xt(l.href,m,b))continue}if(w){let b=Array.from(s.styleSheets).find(k=>k.href===l.href);if(b)try{let k=b.cssRules||[];h=Array.from(k).map(C=>C.cssText).join("")}catch{}}if(!h){let b=await $(l.href,{as:"text",useProxy:a});if(b?.ok&&typeof b.data=="string"&&(h=b.data),I(l.href))continue}h=await zt(h,l.href,a);let S="";for(let b of h.match(Gt)||[]){let k=(b.match(/font-family:\s*([^;]+);/i)?.[1]||"").trim(),C=Z(k);if(!C||I(C))continue;let L=(b.match(/font-weight:\s*([^;]+);/i)?.[1]||"400").trim(),F=(b.match(/font-style:\s*([^;]+);/i)?.[1]||"normal").trim(),P=(b.match(/font-stretch:\s*([^;]+);/i)?.[1]||"100%").trim(),U=(b.match(/unicode-range:\s*([^;]+);/i)?.[1]||"").trim(),O=(b.match(/src\s*:\s*([^;}]+)[;}]/i)?.[1]||"").trim(),N=tt(O,l.href);if(!i(C,F,L,P))continue;let R=gt(U);if(!yt(e,R))continue;let M={family:C,weightSpec:L,styleSpec:F,stretchSpec:P,unicodeRange:U,srcRaw:O,srcUrls:N,href:l.href};if(n&&u(M,R))continue;let T=/url\(/i.test(O)?await wt(b,l.href,a):b;S+=T}S.trim()&&(y+=S)}catch{console.warn("[snapDOM] Failed to process stylesheet:",l.href)}let x={requiredIndex:c,usedCodepoints:e,faceMatchesRequired:i,simpleExcluder:n?dt(n):null,useProxy:a,visitedSheets:new Set,depth:0};for(let l of s.styleSheets)if(!(l.href&&g.some(h=>h.href===l.href)))try{let h=l.href||location.origin+"/";h&&x.visitedSheets.add(h),await bt(l,h,async w=>{y+=w},x)}catch{}try{for(let l of s.fonts||[]){if(!l||!l.family||l.status!=="loaded"||!l._snapdomSrc)continue;let h=String(l.family).replace(/^['"]+|['"]+$/g,"");if(I(h)||!c.has(h.toLowerCase())||n?.families&&n.families.some(S=>String(S).toLowerCase()===h.toLowerCase()))continue;let w=l._snapdomSrc;if(!String(w).startsWith("data:")){if(f.resource?.has(l._snapdomSrc))w=f.resource.get(l._snapdomSrc),f.font?.add(l._snapdomSrc);else if(!f.font?.has(l._snapdomSrc))try{let S=await $(l._snapdomSrc,{as:"dataURL",useProxy:a,silent:!0});if(S.ok&&typeof S.data=="string")w=S.data,f.resource?.set(l._snapdomSrc,w),f.font?.add(l._snapdomSrc);else continue}catch{console.warn("[snapDOM] Failed to fetch dynamic font src:",l._snapdomSrc);continue}}y+=`@font-face{font-family:'${h}';src:url(${w});font-style:${l.style||"normal"};font-weight:${l.weight||"normal"};}`}}catch{}for(let l of o){if(!l||typeof l!="object")continue;let h=String(l.family||"").replace(/^['"]+|['"]+$/g,"");if(!h||I(h)||!c.has(h.toLowerCase())||n?.families&&n.families.some(L=>String(L).toLowerCase()===h.toLowerCase()))continue;let w=l.weight!=null?String(l.weight):"normal",S=l.style!=null?String(l.style):"normal",b=l.stretchPct!=null?`${l.stretchPct}%`:"100%",k=String(l.src||""),C=k;if(!C.startsWith("data:")){if(f.resource?.has(k))C=f.resource.get(k),f.font?.add(k);else if(!f.font?.has(k))try{let L=await $(k,{as:"dataURL",useProxy:a,silent:!0});if(L.ok&&typeof L.data=="string")C=L.data,f.resource?.set(k,C),f.font?.add(k);else continue}catch{console.warn("[snapDOM] Failed to fetch localFonts src:",k);continue}}y+=`@font-face{font-family:'${h}';src:url(${C});font-style:${S};font-weight:${w};font-stretch:${b};}`}return y&&(y=Kt(y),f.resource?.set(p,y)),y}function kt(t,e){let n=new Set,o=new Set;if(!t)return{required:n,usedCodepoints:o};let a=i=>{if(i)for(let u of i)o.add(u.codePointAt(0))},r=i=>{let u=Bt(i.fontFamily);if(u.length)for(let p of u)n.add(`${p}__${z(i.fontWeight)}__${G(i.fontStyle)}__${Dt(i.fontStretch)}`)},s=i=>{r(v(i));for(let u of["::before","::after"]){let p=v(i,u),m=p&&p.content;if(!(!m||m==="none"||m==="normal"))if(r(p),/^["']/.test(m))a(m.slice(1,-1));else{let d=m.match(/\\[0-9A-Fa-f]{1,6}/g);if(d)for(let A of d)try{o.add(parseInt(A.slice(1),16))}catch{}}}};s(t);let c=document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT,null);for(;c.nextNode();){let i=c.currentNode;if(i.nodeType===Node.TEXT_NODE){if(e&&i.parentElement&&!e(i.parentElement))continue;a(i.nodeValue||"")}else{if(e&&!e(i))continue;s(i)}}return{required:n,usedCodepoints:o}}async function xt(t,e=2,n=document){try{await n.fonts.ready}catch{}let o=Array.from(t||[]).filter(Boolean);if(o.length===0)return;let a=()=>{let r=n.createElement("div");r.setAttribute("data-snapdom-internal",""),r.style.cssText="position:absolute!important;left:-9999px!important;top:0!important;opacity:0!important;pointer-events:none!important;contain:layout size style;";for(let s of o){let c=n.createElement("span");c.textContent="AaBbGg1234\xC1\xC9\xCD\xD3\xDA\xE7\xF1\u2014\u221E",c.style.fontFamily=`"${s}"`,c.style.fontWeight="700",c.style.fontStyle="italic",c.style.fontSize="32px",c.style.lineHeight="1",c.style.whiteSpace="nowrap",c.style.margin="0",c.style.padding="0",r.appendChild(c)}n.body.appendChild(r),r.offsetWidth,n.body.removeChild(r)};for(let r=0;r<Math.max(1,e);r++)a(),await new Promise(s=>requestAnimationFrame(()=>requestAnimationFrame(s)))}var Zt=new WeakMap;var te=0;function et(t){let e=Zt.get(t);if(e&&e.epoch===te){let n=e.snapshot&&e.snapshot.__needsBgInline;if(n!==void 0)return n}return!0}var ee=["background-image","mask","mask-image","-webkit-mask","-webkit-mask-image","mask-source","mask-box-image-source","mask-border-source","-webkit-mask-box-image-source","border-image","border-image-source"],ne=["mask-position","mask-size","mask-repeat","mask-mode","mask-composite","-webkit-mask-position","-webkit-mask-size","-webkit-mask-repeat","-webkit-mask-composite","mask-origin","mask-clip","-webkit-mask-origin","-webkit-mask-clip","-webkit-mask-position-x","-webkit-mask-position-y"],oe=["background-position","background-position-x","background-position-y","background-size","background-repeat","background-origin","background-clip","background-attachment","background-blend-mode"],re=["border-image-slice","border-image-width","border-image-outset","border-image-repeat"];async function se(t,e,n,o){let a=n.get(t)||v(t);n.has(t)||n.set(t,a);let r=a.getPropertyValue("border-image"),s=a.getPropertyValue("border-image-source"),c=r&&r!=="none"||s&&s!=="none",i=a.getPropertyValue("background-image"),u=a.getPropertyValue("background-color");if(i&&i!=="none"||u&&u!=="rgba(0, 0, 0, 0)"&&u!=="transparent"||/url\s*\(|gradient\s*\(/i.test(a.getPropertyValue("background")||""))for(let m of oe){let d=a.getPropertyValue(m);d&&e.style.setProperty(m,d)}for(let m of ee){let d=a.getPropertyValue(m);if(m==="background-image"&&(!d||d==="none")){let y=a.getPropertyValue("background");y&&/url\s*\(/.test(y)&&(d=j(y).filter(g=>/url\s*\(/.test(g)).join(", ")||d)}if(!d||d==="none")continue;let A=j(d),E=await Promise.all(A.map(y=>D(y,o)));E.some(y=>y&&y!=="none"&&!/^url\(undefined/.test(y))&&e.style.setProperty(m,E.join(", "))}for(let m of ne){let d=a.getPropertyValue(m);!d||d==="initial"||e.style.setProperty(m,d)}if(c)for(let m of re){let d=a.getPropertyValue(m);!d||d==="initial"||e.style.setProperty(m,d)}}async function Ct(t,e,n,o={},a=f.session.nodeMap){if(!e)return;let r=[];t&&et(t)&&r.push([t,e]);let s=[e];for(;s.length;){let i=s.pop();if(i.children)for(let u of i.children){if(u.tagName==="STYLE")continue;let p=a.get(u);p&&et(p)&&r.push([p,u]),s.push(u)}}let c=6;for(let i=0;i<r.length;i+=c)await Promise.allSettled(r.slice(i,i+c).map(([u,p])=>se(u,p,n,o)))}async function He(t=document,e={}){let{embedFonts:n=!0,useProxy:o=""}=e,a=e.cache??e.cacheOpt??"full";nt(a);try{await document.fonts?.ready}catch{}try{Q()}catch{}f.session=f.session||{},f.session.styleCache||(f.session.styleCache=new WeakMap),f.image=f.image||new _(100),f.background=f.background||new _(100);try{await Ct(t,void 0,f.session.styleCache,{useProxy:o})}catch{}let r=[],s=[];try{if(t&&t.nodeType===1){let i=t.querySelectorAll?Array.from(t.querySelectorAll("*")):[];s=[t,...i],r=[],t.tagName==="IMG"&&t.getAttribute("src")&&r.push(t),r.push(...Array.from(t.querySelectorAll?.("img[src]")||[]))}else t?.querySelectorAll&&(r=Array.from(t.querySelectorAll("img[src]")),s=Array.from(t.querySelectorAll("*")))}catch{}let c=[];for(let i of r){let u=i?.currentSrc||i?.src;if(u&&!f.image.has(u)){let p=Promise.resolve().then(async()=>{let m=await $(u,{as:"dataURL",useProxy:o});m?.ok&&typeof m.data=="string"&&f.image.set(u,m.data)}).catch(()=>{});c.push(p)}}for(let i of s){let u="";try{u=i?.style?.backgroundImage||"",(!u||u==="none")&&(u=v(i).backgroundImage)}catch{}if(u&&u!=="none"){let p=u.match(/url\((?:[^()"']+|"(?:[^"]*)"|'(?:[^']*)')\)/gi)||[];for(let m of p){let d=Promise.resolve().then(()=>D(m,{...e,useProxy:o})).catch(()=>{});c.push(d)}}}if(n)try{let{required:i,usedCodepoints:u}=kt(t);if(typeof W=="function"?W():!!W){let m=new Set(Array.from(i).map(d=>String(d).split("__")[0]).filter(Boolean));await xt(m,3)}await St({required:i,usedCodepoints:u,exclude:e.excludeFonts,localFonts:e.localFonts,useProxy:e.useProxy??o,fontStylesheetDomains:e.fontStylesheetDomains})}catch{}await Promise.allSettled(c)}export{He as preCache};
|