@zumer/snapdom 2.16.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 CHANGED
@@ -89,7 +89,6 @@ await result.download({ format: 'jpg', filename: 'card.jpg' });
89
89
  - [Contributors](#contributors)
90
90
  - [Sponsors](#sponsors)
91
91
  - [Show your support](#show-your-support)
92
- - [Star History](#star-history)
93
92
  - [License](#license)
94
93
 
95
94
  ## Installation
@@ -192,6 +191,29 @@ const blob = await snapdom.toBlob(el);
192
191
  document.body.appendChild(png);
193
192
  ```
194
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
+
195
217
  ## Documentation
196
218
 
197
219
  The full reference lives on **[snapdom.dev/docs](https://snapdom.dev/docs/)** — kept there so it stays in sync and searchable:
@@ -215,7 +237,41 @@ The full reference lives on **[snapdom.dev/docs](https://snapdom.dev/docs/)**
215
237
  | `snapdom.toWebp(el, options?)` | Returns a WebP image |
216
238
  | `snapdom.download(el, options?)` | Triggers a download |
217
239
 
218
- 📖 **[Full API & every option → snapdom.dev/docs](https://snapdom.dev/docs/)**
240
+ ### Options at a glance
241
+
242
+ All options are optional and can be passed to `snapdom(el, options)` or any shortcut method.
243
+
244
+ | Option | Type | Default | Description |
245
+ | ------ | ---- | ------- | ----------- |
246
+ | `scale` | `number` | `1` | Output scale multiplier |
247
+ | `dpr` | `number` | `devicePixelRatio` | Pixel density of the rasterized output |
248
+ | `width` / `height` | `number` | `null` | Target output size (keeps aspect ratio if only one is set) |
249
+ | `backgroundColor` | `string` | `null` (`#ffffff` for JPEG/WebP) | Background fill |
250
+ | `quality` | `number` | `0.92` | JPEG/WebP quality (0–1) |
251
+ | `format` | `'png' \| 'jpeg' \| 'webp' \| 'svg'` | `'png'` | Format for `download()` |
252
+ | `type` | `string` | `'svg'` | Blob type for `toBlob()` (`'png'`, `'jpeg'`…) |
253
+ | `filename` | `string` | `'snapDOM'` | Download filename |
254
+ | `embedFonts` | `boolean` | `false` | Inline `@font-face` so text renders with your real fonts |
255
+ | `iconFonts` | `string \| RegExp \| array` | `[]` | Icon font families (always embedded) |
256
+ | `localFonts` | `array` | `[]` | Explicit fonts: `{ family, src, weight?, style? }` |
257
+ | `excludeFonts` | `object` | — | Skip fonts by family / domain / subset |
258
+ | `exclude` | `string[]` | `[]` | CSS selectors to leave out of the capture |
259
+ | `filter` | `(el) => boolean` | `null` | Keep-predicate (return `false` to drop a node) |
260
+ | `excludeMode` / `filterMode` | `'hide' \| 'remove'` | `'hide'` | How excluded nodes are handled |
261
+ | `clip` | `'viewport' \| {x, y, width, height}` | `null` | Capture only a region; offscreen content is pruned |
262
+ | `compress` | `boolean` | `true` | Downsample inlined images to their visible resolution |
263
+ | `useProxy` | `string` | `''` | CORS proxy prefix for cross-origin images |
264
+ | `fallbackURL` | `string \| fn` | — | Fallback image for broken `<img>` |
265
+ | `cache` | `'soft' \| 'auto' \| 'full' \| 'disabled'` | `'soft'` | Cache policy between captures |
266
+ | `outerTransforms` | `boolean` | `true` | Keep root translate/rotate in the output |
267
+ | `outerShadows` | `boolean` | `false` | Expand bounds to include root shadows/blur/outline |
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) |
272
+ | `plugins` | `array` | — | Per-capture plugins (override globals by name) |
273
+
274
+ 📖 **[Full API & every option, explained with examples → snapdom.dev/docs](https://snapdom.dev/docs/)**
219
275
 
220
276
  ## Limitations
221
277
 
@@ -305,6 +361,7 @@ For detailed guidelines, see [CONTRIBUTING](https://github.com/zumerlab/snapdom/
305
361
  <a href="https://github.com/airamhr9" title="airamhr9"><img src="https://avatars.githubusercontent.com/u/57371081?v=4&s=100" style="border-radius:10px; width:60px; height:60px; object-fit:cover; margin:5px;" alt="airamhr9"/></a>
306
362
  <a href="https://github.com/jswhisperer" title="jswhisperer"><img src="https://avatars.githubusercontent.com/u/1177690?v=4&s=100" style="border-radius:10px; width:60px; height:60px; object-fit:cover; margin:5px;" alt="jswhisperer"/></a>
307
363
  <a href="https://github.com/K1ender" title="K1ender"><img src="https://avatars.githubusercontent.com/u/146767945?v=4&s=100" style="border-radius:10px; width:60px; height:60px; object-fit:cover; margin:5px;" alt="K1ender"/></a>
364
+ <a href="https://github.com/mosuzi" title="mosuzi"><img src="https://avatars.githubusercontent.com/u/43341701?v=4&s=100" style="border-radius:10px; width:60px; height:60px; object-fit:cover; margin:5px;" alt="mosuzi"/></a>
308
365
  <a href="https://github.com/17biubiu" title="17biubiu"><img src="https://avatars.githubusercontent.com/u/13295895?v=4&s=100" style="border-radius:10px; width:60px; height:60px; object-fit:cover; margin:5px;" alt="17biubiu"/></a>
309
366
  <a href="https://github.com/av01d" title="av01d"><img src="https://avatars.githubusercontent.com/u/6247646?v=4&s=100" style="border-radius:10px; width:60px; height:60px; object-fit:cover; margin:5px;" alt="av01d"/></a>
310
367
  <a href="https://github.com/CHOYSEN" title="CHOYSEN"><img src="https://avatars.githubusercontent.com/u/25995358?v=4&s=100" style="border-radius:10px; width:60px; height:60px; object-fit:cover; margin:5px;" alt="CHOYSEN"/></a>
@@ -320,9 +377,8 @@ For detailed guidelines, see [CONTRIBUTING](https://github.com/zumerlab/snapdom/
320
377
  <a href="https://github.com/simon1uo" title="simon1uo"><img src="https://avatars.githubusercontent.com/u/60037549?v=4&s=100" style="border-radius:10px; width:60px; height:60px; object-fit:cover; margin:5px;" alt="simon1uo"/></a>
321
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>
322
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>
323
- <a href="https://github.com/harshasiddartha" title="harshasiddartha"><img src="https://avatars.githubusercontent.com/u/147021873?v=4&s=100" style="border-radius:10px; width:60px; height:60px; object-fit:cover; margin:5px;" alt="harshasiddartha"/></a>
324
- <a href="https://github.com/karasHou" title="karasHou"><img src="https://avatars.githubusercontent.com/u/27048083?v=4&s=100" style="border-radius:10px; width:60px; height:60px; object-fit:cover; margin:5px;" alt="karasHou"/></a>
325
- <a href="https://github.com/jhbae200" title="jhbae200"><img src="https://avatars.githubusercontent.com/u/20170610?v=4&s=100" style="border-radius:10px; width:60px; height:60px; object-fit:cover; margin:5px;" alt="jhbae200"/></a>
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>
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>
326
382
  </p>
327
383
  <!-- CONTRIBUTORS:END -->
328
384
 
@@ -334,19 +390,19 @@ If you'd like to support this project too, you can [become a sponsor](https://gi
334
390
 
335
391
  ## Show your support
336
392
 
337
- If snapDOM saved you time, a ⭐ on GitHub helps other developers find it — that's the whole ask.
393
+ If SnapDOM saved you time, a ⭐ on GitHub helps other developers find it — that's the whole ask.
338
394
 
339
- Shipping something built with snapDOM? Add the badge to your README:
395
+ Shipping something built with SnapDOM? Add the badge to your README:
340
396
 
341
- [![Built with snapDOM](https://img.shields.io/badge/built%20with-snapDOM-blue)](https://snapdom.dev)
397
+ [![Built with SnapDOM](https://img.shields.io/badge/built%20with-SnapDOM-blue)](https://snapdom.dev)
342
398
 
343
399
  ```md
344
- [![Built with snapDOM](https://img.shields.io/badge/built%20with-snapDOM-blue)](https://snapdom.dev)
400
+ [![Built with SnapDOM](https://img.shields.io/badge/built%20with-SnapDOM-blue)](https://snapdom.dev)
345
401
  ```
346
402
 
347
- ### Projects using snapDOM
403
+ ### Projects using SnapDOM
348
404
 
349
- snapDOM runs in production across 290+ public repositories ([GitHub dependents graph](https://github.com/zumerlab/snapdom/network/dependents)). A few notable ones, each verified from its own `package.json`:
405
+ SnapDOM runs in production across 290+ public repositories ([GitHub dependents graph](https://github.com/zumerlab/snapdom/network/dependents)). A few notable ones, each verified from its own `package.json`:
350
406
 
351
407
  - [LobeHub](https://github.com/lobehub/lobehub) — platform for operating AI agents
352
408
  - [Trilium Notes](https://github.com/TriliumNext/Trilium) — hierarchical personal knowledge base
@@ -359,11 +415,7 @@ snapDOM runs in production across 290+ public repositories ([GitHub dependents g
359
415
  - [ListenBrainz](https://github.com/metabrainz/listenbrainz-server) — music tracker by MetaBrainz
360
416
  - [SnapDIFF](https://zumerlab.com/snapdiff/) — in-browser visual regression testing *(by Zumerlab)*
361
417
 
362
- See the full gallery at **[snapdom.dev/made-with](https://snapdom.dev/made-with/)**. Shipping snapDOM? [Open a PR](https://github.com/zumerlab/snapdom/pulls) to add your project — real, verifiable projects only.
363
-
364
- ## Star History
365
-
366
- [![Star History Chart](https://api.star-history.com/svg?repos=zumerlab/snapdom&type=Date)](https://www.star-history.com/#zumerlab/snapdom&Date)
418
+ See the full gallery at **[snapdom.dev/made-with](https://snapdom.dev/made-with/)**. Shipping SnapDOM? [Open a PR](https://github.com/zumerlab/snapdom/pulls) to add your project — real, verifiable projects only.
367
419
 
368
420
  ## License
369
421
 
package/dist/plugins.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * SnapDOM
3
- * v2.16.0
3
+ * v2.22.0
4
4
  * Author: Juan Martin Muda
5
5
  * License: MIT
6
6
  */
package/dist/preCache.mjs CHANGED
@@ -1,10 +1,10 @@
1
1
  /*
2
2
  * SnapDOM
3
- * v2.16.0
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)}},f={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(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 L(50),f.defaultStyle=new L(30),f.image=new L(100),f.background=new L(100),f.resource=new L(150),f.font=new Set;return}default:{f.session.styleMap=new Map,f.session.nodeMap=new Map,f.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 xt(t="[snapDOM]",{ttlMs:e=5*6e4,maxEntries:n=12}={}){let o=new Map,a=0;function s(r,c,i){if(a>=n)return;let u=Date.now();(o.get(c)||0)>u||(o.set(c,u+e),a++,r==="warn"&&console&&console.warn?console.warn(`${t} ${i}`):console&&console.error&&console.error(`${t} ${i}`))}return{warnOnce(r,c){s("warn",r,c)},errorOnce(r,c){s("error",r,c)},reset(){o.clear(),a=0}}}var ot=xt("[snapDOM]",{ttlMs:3*6e4,maxEntries:10}),H=new Map,j=new Map;function kt(t){return/^data:|^blob:|^about:blank$/i.test(t)}function At(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),s=new URL(t,n);if(s.origin===a.origin)return!0;let r=s.searchParams;if(r&&(r.has("url")||r.has("target")))return!0}catch{}return!1}function Rt(t,e){if(!e||kt(t)||At(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 $t(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 Lt(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||"",s=e.errorTTL??8e3,r=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[,m="",p=""]=String(t).match(/^data:([^,]*),(.*)$/)||[],h=/;base64/i.test(m)?atob(p):decodeURIComponent(p),y=new Uint8Array([...h].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 p=await m.blob(),l=p.type||m.headers.get("content-type")||"";return n==="dataURL"?{ok:!0,data:await rt(p),status:m.status,url:t,fromCache:!1,mime:l}:n==="text"?{ok:!0,data:await p.text(),status:m.status,url:t,fromCache:!1,mime:l}:{ok:!0,data:p,status:m.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=Lt(t,{as:n,timeout:o,useProxy:a,errorTTL:s}),u=j.get(i);if(u&&u.until>Date.now())return{...u.result,fromCache:!0};u&&j.delete(i);let d=H.get(i);if(d)return d;let g=Rt(t,a)?$t(t,a):t,w=e.credentials;if(!w)try{let m=typeof location<"u"&&location.href?location.href:"http://localhost/",p=new URL(t,m);w=typeof location<"u"&&p.origin===location.origin?"include":"omit"}catch{w="omit"}let R=new AbortController,k=setTimeout(()=>R.abort("timeout"),o),b=(async()=>{try{let m=await fetch(g,{signal:R.signal,credentials:w,headers:r});if(!m.ok){let h={ok:!1,data:null,status:m.status,url:g,fromCache:!1,reason:"http_error"};if(s>0&&j.set(i,{until:Date.now()+s,result:h}),!c){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(h),h}if(n==="text")return{ok:!0,data:await m.text(),status:m.status,url:g,fromCache:!1};let p=await m.blob(),l=p.type||m.headers.get("content-type")||"";return n==="dataURL"?{ok:!0,data:await rt(p),status:m.status,url:g,fromCache:!1,mime:l}:{ok:!0,data:p,status:m.status,url:g,fromCache:!1,mime:l}}catch(m){let p=m&&typeof m=="object"&&"name"in m&&m.name==="AbortError"?String(m.message||"").includes("timeout")?"timeout":"abort":"network",l={ok:!1,data:null,status:0,url:g,fromCache:!1,reason:p};if(!/^blob:/i.test(t)&&s>0&&j.set(i,{until:Date.now()+s,result:l}),!c){let h=`${p}:${n}:${new URL(t,location?.href??"http://localhost/").origin}`,y=p==="timeout"?`Timeout after ${o}ms. Consider increasing timeout or using a proxy for ${t}`:p==="abort"?`Request aborted while fetching ${n} ${t}`:`Network/CORS issue while fetching ${n} ${t}. A proxy may be required`;ot.errorOnce(h,y)}return e.onError&&e.onError(l),l}finally{clearTimeout(k),H.delete(i)}})();return H.set(i,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 a=nt(o),s=v(a),r=(e.useProxy||"")+"|"+s;if(f.background.has(r)){let c=f.background.get(r);return c?`url("${c}")`:"none"}try{let c=await _(s,{as:"dataURL",useProxy:e.useProxy});return c.ok?(f.background.set(r,c.data),`url("${c.data}")`):(f.background.set(r,null),"none")}catch{return f.background.set(r,null),"none"}}var at=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"]),Mt=["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 Mt){let e=String(t).toLowerCase();at.has(e)||Y.has(e)||it(e)}}function it(t){if(t=String(t).toLowerCase(),Y.has(t)){let s={};return f.defaultStyle.set(t,s),s}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 s of o){if(ct(s))continue;let r=o.getPropertyValue(s);a[s]=r}return e.removeChild(n),f.defaultStyle.set(t,a),a}var Et=/(?:^|-)(animation|transition)(?:-|$)/i,_t=/^(--.+|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,Ft=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"]),st=new Map;function ct(t){let e=st.get(t);if(e===void 0){let n=String(t).toLowerCase();e=Ft.has(n)||_t.test(n)||Et.test(n),st.set(t,e)}return e}function Ut(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 s={length:0,getPropertyValue:()=>"",item:()=>""};return s[Symbol.iterator]=function*(){},s};if(!(t instanceof Element)){let s=typeof window<"u"?window:null;if(s&&typeof s.getComputedStyle=="function")try{return s.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 s=Ut(t),r=null;try{r=s&&typeof s.getComputedStyle=="function"?s.getComputedStyle(t,e):null}catch{}if(!r&&typeof window<"u"&&typeof window.getComputedStyle=="function")try{t.ownerDocument===document&&(r=window.getComputedStyle(t,e))}catch{}a=r||n(),o.set(e,a)}return a}function z(t){let e=[],n=0,o=0;for(let a=0;a<t.length;a++){let s=t[a];s==="("&&n++,s===")"&&n--,s===","&&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),s=!/safari/i.test(t),r=o&&a&&s,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||r||c||i||u}var It=[/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],Se=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__||{}),Tt=[];function U(t){let e=typeof t=="string"?t:"",n=[...It,...Tt];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 ut=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&&!ut.has(n.toLowerCase()))return n}return""}function Pt(t){if(!t)return[];let e=[];for(let n of t.split(",")){let o=n.trim().replace(/^['"]+|['"]+$/g,"");o&&(ut.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 vt(t){let e=String(t??"100%").match(/(\d+(?:\.\d+)?)\s*%/);return e?Math.max(50,Math.min(200,parseFloat(e[1]))):100}function Nt(t){let e=String(t||"400").trim(),n=e.match(/^(\d{2,3})\s+(\d{2,3})$/);if(n){let a=G(n[1]),s=G(n[2]);return{min:Math.min(a,s),max:Math.max(a,s)}}let o=G(e);return{min:o,max:o}}function Dt(t){let e=String(t||"normal").trim().toLowerCase();return e==="italic"?{kind:"italic"}:e.startsWith("oblique")?{kind:"oblique"}:{kind:"normal"}}function Wt(t){let e=String(t||"100%").trim(),n=e.match(/(\d+(?:\.\d+)?)\s*%\s+(\d+(?:\.\d+)?)\s*%/);if(n){let s=parseFloat(n[1]),r=parseFloat(n[2]);return{min:Math.min(s,r),max:Math.max(s,r)}}let o=e.match(/(\d+(?:\.\d+)?)\s*%/),a=o?parseFloat(o[1]):100;return{min:a,max:a}}function Bt(t){return!t||typeof t!="string"?"":t.replace(/\s+(variable|vf|v[0-9]+)$/i,"").trim().toLowerCase().replace(/\s+/g,"-")}function qt(t,e,n=[]){if(!t)return!1;try{let o=new URL(t,location.href);if(o.origin===location.origin)return!0;let s=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=>s.endsWith(i))||n.some(i=>s===i.toLowerCase()||s.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,"+"),d=i.toLowerCase().replace(/\s+/g,"-"),g=Bt(i);if(c.includes(u)||c.includes(d)||g&&c.includes(g))return!0}return!1}catch{return!1}}function Vt(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,a)=>{let s=(a||"").trim();if(!s||/^data:|^blob:|^https?:|^file:|^about:/i.test(s))return n;let r=s;try{r=new URL(s,e||location.href).href}catch{}return`url("${r}")`})}var J=/@import\s+(?:url\(\s*(['"]?)([^)"']+)\1\s*\)|(['"])([^"']+)\3)([^;]*);/g,K=4;async function jt(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 s(c,i,u=0){if(u>K)return console.warn(`[snapDOM] @import depth exceeded (${K}) at ${i}`),c;let d="",g=0,w;for(;w=J.exec(c);){d+=c.slice(g,w.index),g=J.lastIndex;let R=(w[2]||w[4]||"").trim(),k=a(R,i);if(o.has(k)){console.warn(`[snapDOM] Skipping circular @import: ${k}`);continue}o.add(k);let b="";try{let m=await _(k,{as:"text",useProxy:n,silent:!0});m.ok&&typeof m.data=="string"&&(b=m.data)}catch{}b?(b=lt(b,k),b=await s(b,k,u+1),d+=`
8
- /* inlined: ${k} */
9
- ${b}
10
- `):d+=w[0]}return d+=c.slice(g),d}let r=lt(t,e||location.href);return r=await s(r,e||location.href,0),r}var mt=/url\((["']?)([^"')]+)\1\)/g,zt=/@font-face[^{}]*\{[^}]*\}/g;function dt(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 s=a[1],r=a[2],c=i=>{if(!i.includes("?"))return parseInt(i,16);let u=parseInt(i.replace(/\?/g,"0"),16),d=parseInt(i.replace(/\?/g,"F"),16);return[u,d]};if(r){let i=c(s),u=c(r),d=Array.isArray(i)?i[0]:i,g=Array.isArray(u)?u[1]:u;e.push([Math.min(d,g),Math.max(d,g)])}else{let i=c(s);Array.isArray(i)?e.push([i[0],i[1]]):e.push([i,i])}}return e}function pt(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(mt)){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 ht(t,e,n=""){let o=t;for(let a of t.matchAll(mt)){let s=V(a[0]);if(!s)continue;let r=s;if(!r.startsWith("http")&&!r.startsWith("data:"))try{r=new URL(r,e||location.href).href}catch{}if(!U(r)){if(f.resource?.has(r)){f.font?.add(r),o=o.replace(a[0],`url(${f.resource.get(r)})`);continue}try{let c=await _(r,{as:"dataURL",useProxy:n,silent:!0});if(c.ok&&typeof c.data=="string"){let i=c.data;f.resource?.set(r,i),f.font?.add(r),o=o.replace(a[0],`url(${i})`)}}catch{console.warn("[snapDOM] Failed to fetch font resource:",r)}}}return o}function Gt(t){if(!t.length)return null;let e=(c,i)=>t.some(([u,d])=>!(d<c||u>i)),n=e(0,255)||e(305,305),o=e(256,591)||e(7680,7935),a=e(880,1023),s=e(1024,1279);return e(7840,7929)||e(258,259)||e(416,417)||e(431,432)?"vietnamese":s?"cyrillic":a?"greek":o?"latin-ext":n?"latin":null}function ft(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,s)=>{if(e.size&&e.has(a.family.toLowerCase()))return!0;if(n.size)for(let r of a.srcUrls)try{if(n.has(new URL(r).host.toLowerCase()))return!0}catch{}if(o.size){let r=Gt(s);if(r&&o.has(r))return!0}return!1}}function Xt(t){if(!t)return t;let e=/@font-face[^{}]*\{[^}]*\}/gi,n=new Set,o=[];for(let s of t.match(e)||[]){let r=s.match(/font-family:\s*([^;]+);/i)?.[1]||"",c=Z(r),i=(s.match(/font-weight:\s*([^;]+);/i)?.[1]||"400").trim(),u=(s.match(/font-style:\s*([^;]+);/i)?.[1]||"normal").trim(),d=(s.match(/font-stretch:\s*([^;]+);/i)?.[1]||"100%").trim(),g=(s.match(/unicode-range:\s*([^;]+);/i)?.[1]||"").trim(),w=(s.match(/src\s*:\s*([^;}]+)[;}]/i)?.[1]||"").trim(),R=tt(w,location.href),k=R.length?R.map(m=>String(m).toLowerCase()).sort().join("|"):w.toLowerCase(),b=[String(c||"").toLowerCase(),i,u,d,g.toLowerCase(),k].join("|");n.has(b)||(n.add(b),o.push(s))}if(o.length===0)return t;let a=0;return t.replace(e,()=>o[a++]||"")}function Kt(t,e,n,o,a){let s=Array.from(t||[]).sort().join("|"),r=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()}):"",c=(n||[]).map(d=>`${(d.family||"").toLowerCase()}::${d.weight||"normal"}::${d.style||"normal"}::${d.src||""}`).sort().join("|"),i=o||"",u=(a||[]).map(d=>String(d).toLowerCase()).sort().join("|");return`fonts-embed-css::req=${s}::ex=${r}::lf=${c}::px=${i}::fd=${u}`}async function gt(t,e,n,o){let a;try{a=t.cssRules||[]}catch{return}let s=(r,c)=>{try{return new URL(r,c||location.href).href}catch{return r}};for(let r of a){if(r.type===CSSRule.IMPORT_RULE&&r.styleSheet){let c=r.href?s(r.href,e):e;if(o.depth>=K){console.warn(`[snapDOM] CSSOM import depth exceeded (${K}) 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 gt(r.styleSheet,c,n,i);continue}if(r.type===CSSRule.FONT_FACE_RULE){let c=(r.style.getPropertyValue("font-family")||"").trim(),i=Z(c);if(!i||U(i))continue;let u=(r.style.getPropertyValue("font-weight")||"400").trim(),d=(r.style.getPropertyValue("font-style")||"normal").trim(),g=(r.style.getPropertyValue("font-stretch")||"100%").trim(),w=(r.style.getPropertyValue("src")||"").trim(),R=(r.style.getPropertyValue("unicode-range")||"").trim();if(!o.faceMatchesRequired(i,d,u,g))continue;let k=dt(R);if(!pt(o.usedCodepoints,k))continue;let b={family:i,weightSpec:u,styleSpec:d,stretchSpec:g,unicodeRange:R,srcRaw:w,srcUrls:tt(w,e||location.href),href:e||location.href};if(o.simpleExcluder&&o.simpleExcluder(b,k))continue;if(/url\(/i.test(w)){let m=await ht(w,e||location.href,o.useProxy);await n(`@font-face{font-family:${i};src:${m};font-style:${d};font-weight:${u};font-stretch:${g};${R?`unicode-range:${R};`:""}}`)}else await n(`@font-face{font-family:${i};src:${w};font-style:${d};font-weight:${u};font-stretch:${g};${R?`unicode-range:${R};`:""}}`)}}}async function yt({required:t,usedCodepoints:e,exclude:n=void 0,localFonts:o=[],useProxy:a="",fontStylesheetDomains:s=[],doc:r=document}={}){t instanceof Set||(t=new Set),e instanceof Set||(e=new Set);let c=new Map;for(let l of t){let[h,y,C,S]=String(l).split("__");if(!h)continue;let x=h.toLowerCase(),A=c.get(x)||[];A.push({w:parseInt(y,10),s:C,st:parseInt(S,10)}),c.set(x,A)}function i(l,h,y,C){let S=String(l).toLowerCase();if(!c.has(S))return!1;let x=c.get(S),A=Nt(y),M=Dt(h),F=Wt(C),T=A.min!==A.max,O=A.min,P=$=>M.kind==="normal"&&$==="normal"||M.kind!=="normal"&&($==="italic"||$==="oblique"),B=!1;for(let $ of x){let E=T?$.w>=A.min&&$.w<=A.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 u=ft(n),d=Kt(t,n,o,a,s);if(f.resource?.has(d))return f.resource.get(d);let g=Vt(t),w=[],R=J;for(let l of r.querySelectorAll("style")){let h=l.textContent||"";for(let y of h.matchAll(R)){let C=(y[2]||y[4]||"").trim();if(!C||U(C))continue;r.querySelector(`link[rel="stylesheet"][href="${C}"]`)||w.push(C)}}let k=[];w.length&&await Promise.all(w.map(l=>new Promise(h=>{if(r.querySelector(`link[rel="stylesheet"][href="${l}"]`))return h(null);let y=r.createElement("link");y.rel="stylesheet",y.href=l,y.setAttribute("data-snapdom","injected-import"),y.onload=()=>h(y),y.onerror=()=>h(null),r.head.appendChild(y),k.push(y)})));let b="",m=Array.from(r.querySelectorAll('link[rel="stylesheet"]')).filter(l=>!!l.href);for(let l of k)try{l.remove()}catch{}for(let l of m)try{if(U(l.href))continue;let h="",y=!1;try{y=new URL(l.href,location.href).origin===location.origin}catch{}if(!y){let S=Array.isArray(s)?s:[];if(!qt(l.href,g,S))continue}if(y){let S=Array.from(r.styleSheets).find(x=>x.href===l.href);if(S)try{let x=S.cssRules||[];h=Array.from(x).map(A=>A.cssText).join("")}catch{}}if(!h){let S=await _(l.href,{as:"text",useProxy:a});if(S?.ok&&typeof S.data=="string"&&(h=S.data),U(l.href))continue}h=await jt(h,l.href,a);let C="";for(let S of h.match(zt)||[]){let x=(S.match(/font-family:\s*([^;]+);/i)?.[1]||"").trim(),A=Z(x);if(!A||U(A))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,l.href);if(!i(A,F,M,T))continue;let $=dt(O);if(!pt(e,$))continue;let E={family:A,weightSpec:M,styleSpec:F,stretchSpec:T,unicodeRange:O,srcRaw:P,srcUrls:B,href:l.href};if(n&&u(E,$))continue;let I=/url\(/i.test(P)?await ht(S,l.href,a):S;C+=I}C.trim()&&(b+=C)}catch{console.warn("[snapDOM] Failed to process stylesheet:",l.href)}let p={requiredIndex:c,usedCodepoints:e,faceMatchesRequired:i,simpleExcluder:n?ft(n):null,useProxy:a,visitedSheets:new Set,depth:0};for(let l of r.styleSheets)if(!(l.href&&m.some(h=>h.href===l.href)))try{let h=l.href||location.origin+"/";h&&p.visitedSheets.add(h),await gt(l,h,async y=>{b+=y},p)}catch{}try{for(let l of r.fonts||[]){if(!l||!l.family||l.status!=="loaded"||!l._snapdomSrc)continue;let h=String(l.family).replace(/^['"]+|['"]+$/g,"");if(U(h)||!c.has(h.toLowerCase())||n?.families&&n.families.some(C=>String(C).toLowerCase()===h.toLowerCase()))continue;let y=l._snapdomSrc;if(!String(y).startsWith("data:")){if(f.resource?.has(l._snapdomSrc))y=f.resource.get(l._snapdomSrc),f.font?.add(l._snapdomSrc);else if(!f.font?.has(l._snapdomSrc))try{let C=await _(l._snapdomSrc,{as:"dataURL",useProxy:a,silent:!0});if(C.ok&&typeof C.data=="string")y=C.data,f.resource?.set(l._snapdomSrc,y),f.font?.add(l._snapdomSrc);else continue}catch{console.warn("[snapDOM] Failed to fetch dynamic font src:",l._snapdomSrc);continue}}b+=`@font-face{font-family:'${h}';src:url(${y});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||U(h)||!c.has(h.toLowerCase())||n?.families&&n.families.some(M=>String(M).toLowerCase()===h.toLowerCase()))continue;let y=l.weight!=null?String(l.weight):"normal",C=l.style!=null?String(l.style):"normal",S=l.stretchPct!=null?`${l.stretchPct}%`:"100%",x=String(l.src||""),A=x;if(!A.startsWith("data:")){if(f.resource?.has(x))A=f.resource.get(x),f.font?.add(x);else if(!f.font?.has(x))try{let M=await _(x,{as:"dataURL",useProxy:a,silent:!0});if(M.ok&&typeof M.data=="string")A=M.data,f.resource?.set(x,A),f.font?.add(x);else continue}catch{console.warn("[snapDOM] Failed to fetch localFonts src:",x);continue}}b+=`@font-face{font-family:'${h}';src:url(${A});font-style:${C};font-weight:${y};font-stretch:${S};}`}return b&&(b=Xt(b),f.resource?.set(d,b)),b}function wt(t){let e=new Set;if(!t)return e;let n=document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT,null),o=r=>{let c=Pt(r.fontFamily);if(c.length)for(let i of c){let u=(d,g,w)=>`${i}__${G(d)}__${X(g)}__${vt(w)}`;e.add(u(r.fontWeight,r.fontStyle,r.fontStretch))}};o(getComputedStyle(t));let a=getComputedStyle(t,"::before");a&&a.content&&a.content!=="none"&&o(a);let s=getComputedStyle(t,"::after");for(s&&s.content&&s.content!=="none"&&o(s);n.nextNode();){let r=n.currentNode,c=getComputedStyle(r);o(c);let i=getComputedStyle(r,"::before");i&&i.content&&i.content!=="none"&&o(i);let u=getComputedStyle(r,"::after");u&&u.content&&u.content!=="none"&&o(u)}return e}function St(t){let e=new Set,n=a=>{if(a)for(let s of a)e.add(s.codePointAt(0))},o=document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT,null);for(;o.nextNode();){let a=o.currentNode;if(a.nodeType===Node.TEXT_NODE)n(a.nodeValue||"");else if(a.nodeType===Node.ELEMENT_NODE){let s=a;for(let r of["::before","::after"]){let i=getComputedStyle(s,r)?.getPropertyValue("content");if(!(!i||i==="none"))if(/^"/.test(i)||/^'/.test(i))n(i.slice(1,-1));else{let u=i.match(/\\[0-9A-Fa-f]{1,6}/g);if(u)for(let d of u)try{e.add(parseInt(d.slice(1),16))}catch{}}}}}return e}async function bt(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 s=n.createElement("div");s.style.cssText="position:absolute!important;left:-9999px!important;top:0!important;opacity:0!important;pointer-events:none!important;contain:layout size style;";for(let r of o){let c=n.createElement("span");c.textContent="AaBbGg1234\xC1\xC9\xCD\xD3\xDA\xE7\xF1\u2014\u221E",c.style.fontFamily=`"${r}"`,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",s.appendChild(c)}n.body.appendChild(s),s.offsetWidth,n.body.removeChild(s)};for(let s=0;s<Math.max(1,e);s++)a(),await new Promise(r=>requestAnimationFrame(()=>requestAnimationFrame(r)))}async function Ct(t,e,n,o={}){let a=[[t,e]],s=["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"],r=["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"],c=["background-position","background-position-x","background-position-y","background-size","background-repeat","background-origin","background-clip","background-attachment","background-blend-mode"],i=["border-image-slice","border-image-width","border-image-outset","border-image-repeat"];for(;a.length;){let[u,d]=a.shift();if(!d)continue;let g=n.get(u)||D(u);n.has(u)||n.set(u,g);let w=(()=>{let m=g.getPropertyValue("border-image"),p=g.getPropertyValue("border-image-source");return m&&m!=="none"||p&&p!=="none"})(),R=g.getPropertyValue("background-image"),k=g.getPropertyValue("background-color");if(R&&R!=="none"||k&&k!=="rgba(0, 0, 0, 0)"&&k!=="transparent"||/url\s*\(|gradient\s*\(/i.test(g.getPropertyValue("background")||""))for(let m of c){let p=g.getPropertyValue(m);p&&d.style.setProperty(m,p)}for(let m of s){let p=g.getPropertyValue(m);if(m==="background-image"&&(!p||p==="none")){let y=g.getPropertyValue("background");y&&/url\s*\(/.test(y)&&(p=z(y).filter(C=>/url\s*\(/.test(C)).join(", ")||p)}if(!p||p==="none")continue;let l=z(p),h=await Promise.all(l.map(y=>N(y,o)));h.some(y=>y&&y!=="none"&&!/^url\(undefined/.test(y))&&d.style.setProperty(m,h.join(", "))}for(let m of r){let p=g.getPropertyValue(m);!p||p==="initial"||d.style.setProperty(m,p)}if(w)for(let m of i){let p=g.getPropertyValue(m);!p||p==="initial"||d.style.setProperty(m,p)}if(u.shadowRoot){let m=Array.from(u.shadowRoot.children).filter(l=>l.tagName!=="STYLE"),p=Array.from(d.children).filter(l=>!l.dataset?.snapdomPseudo&&!(l.tagName==="STYLE"&&l.dataset?.sd));for(let l=0;l<Math.min(m.length,p.length);l++)a.push([m[l],p[l]])}else{let m=f.session.nodeMap;for(let p of d.children){let l=m.get(p);l&&a.push([l,p])}}}}async function Te(t=document,e={}){let{embedFonts:n=!0,useProxy:o=""}=e,a=e.cache??e.cacheOpt??"full";et(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 L(100),f.background=f.background||new L(100);try{await Ct(t,void 0,f.session.styleCache,{useProxy:o})}catch{}let s=[],r=[];try{if(t&&t.nodeType===1){let i=t.querySelectorAll?Array.from(t.querySelectorAll("*")):[];r=[t,...i],s=[],t.tagName==="IMG"&&t.getAttribute("src")&&s.push(t),s.push(...Array.from(t.querySelectorAll?.("img[src]")||[]))}else t?.querySelectorAll&&(s=Array.from(t.querySelectorAll("img[src]")),r=Array.from(t.querySelectorAll("*")))}catch{}let c=[];for(let i of s){let u=i?.currentSrc||i?.src;if(u&&!f.image.has(u)){let d=Promise.resolve().then(async()=>{let g=await _(u,{as:"dataURL",useProxy:o});g?.ok&&typeof g.data=="string"&&f.image.set(u,g.data)}).catch(()=>{});c.push(d)}}for(let i of r){let u="";try{u=i?.style?.backgroundImage||"",(!u||u==="none")&&(u=D(i).backgroundImage)}catch{}if(u&&u!=="none"){let d=u.match(/url\((?:[^()"']+|"(?:[^"]*)"|'(?:[^']*)')\)/gi)||[];for(let g of d){let w=Promise.resolve().then(()=>N(g,{...e,useProxy:o})).catch(()=>{});c.push(w)}}}if(n)try{let i=wt(t),u=St(t);if(typeof W=="function"?W():!!W){let g=new Set(Array.from(i).map(w=>String(w).split("__")[0]).filter(Boolean));await bt(g,3)}await yt({required:i,usedCodepoints:u,exclude:e.excludeFonts,localFonts:e.localFonts,useProxy:e.useProxy??o,fontStylesheetDomains:e.fontStylesheetDomains})}catch{}await Promise.allSettled(c)}export{Te 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};