@zumer/snapdom 2.15.0 β†’ 2.16.0-colin.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
@@ -41,14 +41,11 @@ It converts any DOM subtree into a self-contained representation that can be exp
41
41
 
42
42
  > πŸ“– **[Documentation, guides & live demos β†’ snapdom.dev](https://snapdom.dev)**
43
43
 
44
- * Full DOM capture
45
- * Embedded styles, pseudo-elements, and fonts
46
- * Export to SVG, PNG, JPG, WebP, `canvas`, or Blob
47
- * ⚑ Ultra fast, no dependencies
48
- * 100% based on standard Web APIs
49
- * Support same-origin `Γ¬frame`
50
- * Support CSS counter() and CSS counters()
51
- * Support `...` line-clamp
44
+ ## Features
45
+
46
+ Full DOM capture with embedded styles, pseudo-elements and fonts; export to SVG, PNG, JPG, WebP, `canvas` or Blob β€” ultra fast, dependency-free, and 100% based on standard Web APIs.
47
+
48
+ πŸ‘‰ **See the complete technical feature list in [FEATURES.md](FEATURES.md).**
52
49
 
53
50
  ## Website & Live Demos
54
51
 
@@ -77,54 +74,21 @@ await result.download({ format: 'jpg', filename: 'card.jpg' });
77
74
 
78
75
  ---
79
76
 
80
- ## Capture Flow
81
-
82
- SnapDOM transforms your DOM element through these stages:
83
-
84
- ```
85
- DOM Element
86
- ↓
87
- Clone
88
- ↓
89
- Styles & Pseudo
90
- ↓
91
- Images & Backgrounds
92
- ↓
93
- Fonts
94
- ↓
95
- SVG foreignObject
96
- ↓
97
- data:image/svg+xml
98
- ↓
99
- toPng / toSvg / toBlob / download
100
- ```
101
-
102
- | Stage | What happens |
103
- |-------|--------------|
104
- | **Clone** | Deep clone with styles, Shadow DOM, iframes. Exclude/filter nodes. |
105
- | **Styles & Pseudo** | Inline `::before`/`::after` as elements, resolve `counter()`/`counters()`. |
106
- | **Images & Backgrounds** | Fetch and inline external images/backgrounds as data URLs. |
107
- | **Fonts** | Embed `@font-face` (optional) and icon fonts. |
108
- | **SVG** | Wrap clone in `<foreignObject>`, serialize to `data:image/svg+xml`. |
109
- | **Export** | Convert SVG to PNG/JPG/WebP/Blob or trigger download. |
110
-
111
- Plugin hooks: `beforeSnap` β†’ `beforeClone` β†’ `afterClone` β†’ `beforeRender` β†’ `afterRender` β†’ `beforeExport` β†’ `afterExport`.
112
-
113
-
114
77
  ## Table of Contents
115
78
 
116
79
  - [Quick Start](#quick-start)
117
- - [Capture Flow](#capture-flow)
80
+ - [Features](#features)
81
+ - [Website & Live Demos](#website--live-demos)
118
82
  - [Installation](#installation)
119
83
  - [Build Outputs](#build-outputs)
120
84
  - [Usage](#usage)
121
85
  - [Documentation](#documentation) β€” full API, Options, Plugins & Cache reference on [snapdom.dev/docs](https://snapdom.dev/docs/)
122
86
  - [Limitations](#limitations)
123
87
  - [Performance Benchmarks](#performance-benchmarks)
124
- - [Roadmap](#roadmap)
125
88
  - [Development](#development)
126
89
  - [Contributors](#contributors)
127
90
  - [Sponsors](#sponsors)
91
+ - [Show your support](#show-your-support)
128
92
  - [License](#license)
129
93
 
130
94
  ## Installation
@@ -250,7 +214,38 @@ The full reference lives on **[snapdom.dev/docs](https://snapdom.dev/docs/)**
250
214
  | `snapdom.toWebp(el, options?)` | Returns a WebP image |
251
215
  | `snapdom.download(el, options?)` | Triggers a download |
252
216
 
253
- πŸ“– **[Full API & every option β†’ snapdom.dev/docs](https://snapdom.dev/docs/)**
217
+ ### Options at a glance
218
+
219
+ All options are optional and can be passed to `snapdom(el, options)` or any shortcut method.
220
+
221
+ | Option | Type | Default | Description |
222
+ | ------ | ---- | ------- | ----------- |
223
+ | `scale` | `number` | `1` | Output scale multiplier |
224
+ | `dpr` | `number` | `devicePixelRatio` | Pixel density of the rasterized output |
225
+ | `width` / `height` | `number` | `null` | Target output size (keeps aspect ratio if only one is set) |
226
+ | `backgroundColor` | `string` | `null` (`#ffffff` for JPEG/WebP) | Background fill |
227
+ | `quality` | `number` | `0.92` | JPEG/WebP quality (0–1) |
228
+ | `format` | `'png' \| 'jpeg' \| 'webp' \| 'svg'` | `'png'` | Format for `download()` |
229
+ | `type` | `string` | `'svg'` | Blob type for `toBlob()` (`'png'`, `'jpeg'`…) |
230
+ | `filename` | `string` | `'snapDOM'` | Download filename |
231
+ | `embedFonts` | `boolean` | `false` | Inline `@font-face` so text renders with your real fonts |
232
+ | `iconFonts` | `string \| RegExp \| array` | `[]` | Icon font families (always embedded) |
233
+ | `localFonts` | `array` | `[]` | Explicit fonts: `{ family, src, weight?, style? }` |
234
+ | `excludeFonts` | `object` | β€” | Skip fonts by family / domain / subset |
235
+ | `exclude` | `string[]` | `[]` | CSS selectors to leave out of the capture |
236
+ | `filter` | `(el) => boolean` | `null` | Keep-predicate (return `false` to drop a node) |
237
+ | `excludeMode` / `filterMode` | `'hide' \| 'remove'` | `'hide'` | How excluded nodes are handled |
238
+ | `clip` | `'viewport' \| {x, y, width, height}` | `null` | Capture only a region; offscreen content is pruned |
239
+ | `compress` | `boolean` | `true` | Downsample inlined images to their visible resolution |
240
+ | `useProxy` | `string` | `''` | CORS proxy prefix for cross-origin images |
241
+ | `fallbackURL` | `string \| fn` | β€” | Fallback image for broken `<img>` |
242
+ | `cache` | `'soft' \| 'auto' \| 'full' \| 'disabled'` | `'soft'` | Cache policy between captures |
243
+ | `outerTransforms` | `boolean` | `true` | Keep root translate/rotate in the output |
244
+ | `outerShadows` | `boolean` | `false` | Expand bounds to include root shadows/blur/outline |
245
+ | `fast` | `boolean` | `true` | Skip idle delays for faster capture |
246
+ | `plugins` | `array` | β€” | Per-capture plugins (override globals by name) |
247
+
248
+ πŸ“– **[Full API & every option, explained with examples β†’ snapdom.dev/docs](https://snapdom.dev/docs/)**
254
249
 
255
250
  ## Limitations
256
251
 
@@ -298,35 +293,6 @@ npm run test:benchmark
298
293
  ```
299
294
 
300
295
 
301
- ## Roadmap
302
-
303
- Planned improvements for future versions of SnapDOM:
304
-
305
- * [X] **Implement plugin system**
306
- SnapDOM will support external plugins to extend or override internal behavior (e.g. custom node transformers, exporters, or filters).
307
-
308
- * [ ] **Refactor to modular architecture**
309
- Internal logic will be split into smaller, focused modules to improve maintainability and code reuse.
310
-
311
- * [X] **Decouple internal logic from global options**
312
- Functions will be redesigned to avoid relying directly on `options`. A centralized capture context will improve clarity, autonomy, and testability. See [`next` branch](https://github.com/zumerlab/snapdom/tree/main)
313
-
314
- * [X] **Expose cache control**
315
- Users will be able to manually clear image and font caches or configure their own caching strategies.
316
-
317
- * [X] **Auto font preloading**
318
- Required fonts will be automatically detected and preloaded before capture, reducing the need for manual `preCache()` calls.
319
-
320
- * [X] **Document plugin development**
321
- A full guide will be provided for creating and registering custom SnapDOM plugins.
322
-
323
- * [ ] **Make export utilities tree-shakeable**
324
- Export functions like `toPng`, `toJpg`, `toBlob`, etc. will be restructured into independent modules to support tree shaking and minimal builds.
325
-
326
- Have ideas or feature requests?
327
- Feel free to share suggestions or feedback in [GitHub Discussions](https://github.com/zumerlab/snapdom/discussions).
328
-
329
-
330
296
  ## Development
331
297
 
332
298
  **Source layout:**
@@ -369,6 +335,7 @@ For detailed guidelines, see [CONTRIBUTING](https://github.com/zumerlab/snapdom/
369
335
  <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>
370
336
  <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>
371
337
  <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>
338
+ <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>
372
339
  <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>
373
340
  <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>
374
341
  <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>
@@ -384,9 +351,8 @@ For detailed guidelines, see [CONTRIBUTING](https://github.com/zumerlab/snapdom/
384
351
  <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>
385
352
  <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>
386
353
  <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
+ <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>
387
355
  <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>
388
- <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>
389
- <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>
390
356
  </p>
391
357
  <!-- CONTRIBUTORS:END -->
392
358
 
@@ -396,9 +362,34 @@ Special thanks to [@megaphonecolin](https://github.com/megaphonecolin), [@sdrape
396
362
 
397
363
  If you'd like to support this project too, you can [become a sponsor](https://github.com/sponsors/tinchox5).
398
364
 
399
- ## Star History
365
+ ## Show your support
366
+
367
+ If SnapDOM saved you time, a ⭐ on GitHub helps other developers find it β€” that's the whole ask.
368
+
369
+ Shipping something built with SnapDOM? Add the badge to your README:
370
+
371
+ [![Built with SnapDOM](https://img.shields.io/badge/built%20with-SnapDOM-blue)](https://snapdom.dev)
372
+
373
+ ```md
374
+ [![Built with SnapDOM](https://img.shields.io/badge/built%20with-SnapDOM-blue)](https://snapdom.dev)
375
+ ```
376
+
377
+ ### Projects using SnapDOM
378
+
379
+ 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`:
380
+
381
+ - [LobeHub](https://github.com/lobehub/lobehub) β€” platform for operating AI agents
382
+ - [Trilium Notes](https://github.com/TriliumNext/Trilium) β€” hierarchical personal knowledge base
383
+ - [Sealos](https://github.com/labring/sealos) β€” AI-native cloud operating system
384
+ - [Tencent tmagic-editor](https://github.com/Tencent/tmagic-editor) β€” low-code page editor
385
+ - [Playroom](https://github.com/seek-oss/playroom) β€” JSX design tool by SEEK
386
+ - [GPT-Vis](https://github.com/antvis/GPT-Vis) β€” AI-friendly data viz by Ant Group's AntV
387
+ - [Rabby Wallet](https://github.com/RabbyHub/Rabby) β€” browser wallet for EVM chains
388
+ - [uMap](https://github.com/umap-project/umap) β€” OpenStreetMap map builder
389
+ - [ListenBrainz](https://github.com/metabrainz/listenbrainz-server) β€” music tracker by MetaBrainz
390
+ - [SnapDIFF](https://zumerlab.com/snapdiff/) β€” in-browser visual regression testing *(by Zumerlab)*
400
391
 
401
- [![Star History Chart](https://api.star-history.com/svg?repos=zumerlab/snapdom&type=Date)](https://www.star-history.com/#zumerlab/snapdom&Date)
392
+ 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.
402
393
 
403
394
  ## License
404
395
 
package/dist/plugins.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * SnapDOM
3
- * v2.15.0
3
+ * v2.16.0-colin.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.15.0
3
+ * v2.16.0-colin.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} */
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: ${A} */
9
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};
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};