string-tune-3d 0.0.10 → 0.0.12

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/dist/index.cjs CHANGED
@@ -1,118 +1,5 @@
1
- "use strict";var Ze=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var lt=Object.getOwnPropertyNames;var ct=Object.prototype.hasOwnProperty;var ut=(g,e)=>{for(var t in e)Ze(g,t,{get:e[t],enumerable:!0})},ht=(g,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of lt(e))!ct.call(g,r)&&r!==t&&Ze(g,r,{get:()=>e[r],enumerable:!(i=ot(e,r))||i.enumerable});return g};var mt=g=>ht(Ze({},"__esModule",{value:!0}),g);var vt={};ut(vt,{FontConverter:()=>pe,String3D:()=>We,String3DCamera:()=>De,String3DCustomFilterRegistry:()=>ve,String3DCustomMaterialRegistry:()=>ue,String3DFontRegistry:()=>re,String3DObject:()=>Q,String3DRenderer:()=>we,String3DScene:()=>Ee,String3DSynchronizer:()=>Ie,ThreeJSEngine:()=>Re,ThreeJSMaterialFactory:()=>Le,ThreeJSProvider:()=>Ge});module.exports=mt(vt);var st=require("@fiddle-digital/string-tune");var De=class{constructor(e,t="perspective",i=50,r=.1,s=1e4){this.scaleCache=new Map;this._width=1;this._height=1;this.engine=e,this.mode=t,this.perspectiveFov=i,t==="orthographic"?this._camera=e.createOrthographicCamera(-1,1,1,-1,r,s):this._camera=e.createPerspectiveCamera(i,1,r,s),this._position=e.createVector3(0,0,1e3),this.update()}get camera(){return this._camera}resize(e,t){if(this._width=e,this._height=t,this.mode==="orthographic"){let i=this._camera;i.left=-e/2,i.right=e/2,i.top=t/2,i.bottom=-t/2}else this._camera.aspect=e/t;this.update()}setPosition(e,t,i){this._position.set(e,t,i),this._camera.position.copy(this._position),this.update()}lookAt(e,t,i){this._camera.lookAt(e,t,i),this.update()}update(){this._camera.updateProjectionMatrix(),this._camera.updateMatrixWorld?.()}screenToWorld(e,t,i=0){if(this.mode==="orthographic"){let r=e-this._width/2,s=-(t-this._height/2);return this.engine.createVector3(r,s,i)}else{let{width:r,height:s}=this.getFrustumSizeAt(i),a=e/this._width,o=t/this._height,n=(a-.5)*r,l=-(o-.5)*s;return this.engine.createVector3(n,l,i)}}getFrustumSizeAt(e){if(this.mode==="orthographic")return{width:this._width,height:this._height};let t=this.engine.degToRad(this.perspectiveFov),i=Math.abs(e-this._camera.position.z),r=2*Math.tan(t/2)*i;return{width:r*this._camera.aspect,height:r}}getScaleAtZ(e,t){if(this.mode==="orthographic")return 1;let i=Math.round(e*1e3)/1e3;if(this.scaleCache.has(i))return this.scaleCache.get(i);let{height:r}=this.getFrustumSizeAt(e),s=r/t;return this.scaleCache.set(i,s),s}clearScaleCache(){this.scaleCache.clear()}getMode(){return this.mode}getPerspectiveFov(){return this.perspectiveFov}getPositionZ(){return this._position.z}};var ve=class{static register(e){let t=e.name.trim().toLowerCase();if(!t)throw new Error("[String3D] Custom filter name is required.");this.filters.set(t,{...e,name:t})}static get(e){return this.filters.get(e.trim().toLowerCase())}static has(e){return this.filters.has(e.trim().toLowerCase())}static list(){return Array.from(this.filters.values())}};ve.filters=new Map;var Xe=class{constructor(e){this.pool=[];this.create=e}acquire(e,t){let i=this.pool.pop()||this.create(e,t);return(i.width!==e||i.height!==t)&&i.setSize(e,t),i}release(e){this.pool.push(e)}dispose(){this.pool.forEach(e=>e.dispose()),this.pool=[]}},ze=class{constructor(e,t,i,r){this.scale=1;this.customMaterials=new Map;this.engine=e,this.renderer=t,this.width=i,this.height=r,this.scene=e.createScene(),this.camera=e.createOrthographicCamera(-1,1,1,-1,0,1);let s=e.createPlaneGeometry(2,2);this.copyMaterial=this.createCopyMaterial(),this.blurMaterial=this.createBlurMaterial(),this.pixelMaterial=this.createPixelMaterial(),this.bloomExtractMaterial=this.createBloomExtractMaterial(),this.bloomAddMaterial=this.createBloomAddMaterial(),this.colorMaterial=this.createColorMaterial(),this.quad=e.createMesh(s,this.copyMaterial),this.scene.add(this.quad);let a=(o,n)=>{if(!this.engine.createRenderTarget)throw new Error("[String3DFilterPipeline] Render target support missing.");return this.engine.createRenderTarget(o,n)};this.pool=new Xe(a)}isSupported(){return!!this.engine.createRenderTarget&&!!this.engine.createShaderMaterial&&!!this.renderer.setRenderTarget}resize(e,t){this.width=e,this.height=t}setScale(e){let t=Math.max(.75,Math.min(1,e));this.scale=t}applyFilters(e,t,i=1){let r=e,s=[],a=n=>{let l=s.indexOf(n);l>=0&&(s.splice(l,1),this.pool.release(n))},o=()=>{let{width:n,height:l}=this.getScaledSize(),c=this.pool.acquire(n,l);return s.push(c),c};return t.forEach(n=>{if(n.type==="blur"){let l=n.amount*i;if(l<=1e-4)return;let c=o();this.renderPass(this.blurMaterial,r,c,{uDirection:[1,0],uRadius:l});let h=o();this.renderPass(this.blurMaterial,c,h,{uDirection:[0,1],uRadius:l}),a(c),r!==e&&a(r),r=h}else if(n.type==="pixel"){if(n.size<=.5)return;let l=o();this.renderPass(this.pixelMaterial,r,l,{uPixelSize:n.size}),r!==e&&a(r),r=l}else if(n.type==="bloom"){let l=n.intensity;if(l<=1e-4||n.threshold>=.99)return;let c=Math.max(1,4*i),h=o();this.renderPass(this.bloomExtractMaterial,r,h,{uThreshold:n.threshold});let u=o();this.renderPass(this.blurMaterial,h,u,{uDirection:[1,0],uRadius:c});let m=o();this.renderPass(this.blurMaterial,u,m,{uDirection:[0,1],uRadius:c}),a(h),a(u);let d=o();this.renderAddPass(r,m,d,l),a(m),r!==e&&a(r),r=d}else if(n.type==="brightness"||n.type==="contrast"||n.type==="saturate"||n.type==="grayscale"||n.type==="sepia"||n.type==="invert"||n.type==="hue-rotate"){let l=o(),c=this.getColorMode(n.type),h=n.type==="hue-rotate"?n.angle:n.amount;this.renderPass(this.colorMaterial,r,l,{uMode:c,uAmount:h}),r!==e&&a(r),r=l}else if(n.type==="custom"){let l=o(),c=this.getCustomMaterial(n.name);c?(this.renderPass(c,r,l,n.uniforms),r!==e&&a(r),r=l):a(l)}}),s.forEach(n=>{n!==r&&this.pool.release(n)}),r}acquireTarget(){let{width:e,height:t}=this.getScaledSize();return this.pool.acquire(e,t)}releaseTarget(e){this.pool.release(e)}renderToScreen(e){this.renderPass(this.copyMaterial,e,null,{},!1)}dispose(){this.pool.dispose(),this.customMaterials.forEach(e=>e.dispose()),this.customMaterials.clear()}renderPass(e,t,i,r={},s=!0){let a=this.renderer;a.setRenderTarget&&a.setRenderTarget(i),this.setMaterial(this.quad,e),this.setUniform(e,"tDiffuse",t.texture);let{width:o,height:n}=this.getScaledSize();this.setUniform(e,"uResolution",[o,n]),this.setUniform(e,"uTexel",[1/o,1/n]),Object.entries(r).forEach(([l,c])=>this.setUniform(e,l,c)),s&&a.clear&&a.clear(!0,!0,!0),this.renderer.render(this.scene,this.camera)}renderAddPass(e,t,i,r){let s=this.renderer;s.setRenderTarget&&s.setRenderTarget(i),this.setMaterial(this.quad,this.bloomAddMaterial),this.setUniform(this.bloomAddMaterial,"tBase",e.texture),this.setUniform(this.bloomAddMaterial,"tBloom",t.texture),this.setUniform(this.bloomAddMaterial,"uIntensity",r);let{width:a,height:o}=this.getScaledSize();this.setUniform(this.bloomAddMaterial,"uResolution",[a,o]),s.clear&&s.clear(!0,!0,!0),this.renderer.render(this.scene,this.camera)}setMaterial(e,t){let i=e;i.material!==t&&(i.material=t)}setUniform(e,t,i){let r=e.uniforms;r&&(r[t]?r[t].value=i:r[t]={value:i})}createCopyMaterial(){return this.createShaderMaterial({uniforms:{tDiffuse:{value:null}},vertexShader:this.getVertexShader(),fragmentShader:`
2
- varying vec2 vUv;
3
- uniform sampler2D tDiffuse;
4
- void main() {
5
- gl_FragColor = texture2D(tDiffuse, vUv);
6
- }
7
- `,transparent:!0,depthTest:!1,depthWrite:!1})}createPixelMaterial(){return this.createShaderMaterial({uniforms:{tDiffuse:{value:null},uResolution:{value:[this.width,this.height]},uPixelSize:{value:1}},vertexShader:this.getVertexShader(),fragmentShader:`
8
- varying vec2 vUv;
9
- uniform sampler2D tDiffuse;
10
- uniform vec2 uResolution;
11
- uniform float uPixelSize;
12
- void main() {
13
- vec2 pixel = uPixelSize / uResolution;
14
- vec2 coord = floor(vUv / pixel) * pixel + pixel * 0.5;
15
- gl_FragColor = texture2D(tDiffuse, coord);
16
- }
17
- `,transparent:!0,depthTest:!1,depthWrite:!1})}createBlurMaterial(){return this.createShaderMaterial({uniforms:{tDiffuse:{value:null},uTexel:{value:[1/this.width,1/this.height]},uDirection:{value:[1,0]},uRadius:{value:2}},vertexShader:this.getVertexShader(),fragmentShader:`
18
- varying vec2 vUv;
19
- uniform sampler2D tDiffuse;
20
- uniform vec2 uTexel;
21
- uniform vec2 uDirection;
22
- uniform float uRadius;
23
- void main() {
24
- vec2 off1 = uDirection * uTexel * uRadius;
25
- vec2 off2 = uDirection * uTexel * uRadius * 2.0;
26
- vec2 off3 = uDirection * uTexel * uRadius * 3.0;
27
- vec2 off4 = uDirection * uTexel * uRadius * 4.0;
28
- vec4 color = texture2D(tDiffuse, vUv) * 0.227027;
29
- color += texture2D(tDiffuse, vUv + off1) * 0.1945946;
30
- color += texture2D(tDiffuse, vUv - off1) * 0.1945946;
31
- color += texture2D(tDiffuse, vUv + off2) * 0.1216216;
32
- color += texture2D(tDiffuse, vUv - off2) * 0.1216216;
33
- color += texture2D(tDiffuse, vUv + off3) * 0.054054;
34
- color += texture2D(tDiffuse, vUv - off3) * 0.054054;
35
- color += texture2D(tDiffuse, vUv + off4) * 0.016216;
36
- color += texture2D(tDiffuse, vUv - off4) * 0.016216;
37
- gl_FragColor = color;
38
- }
39
- `,transparent:!0,depthTest:!1,depthWrite:!1})}createBloomExtractMaterial(){return this.createShaderMaterial({uniforms:{tDiffuse:{value:null},uThreshold:{value:.8}},vertexShader:this.getVertexShader(),fragmentShader:`
40
- varying vec2 vUv;
41
- uniform sampler2D tDiffuse;
42
- uniform float uThreshold;
43
- void main() {
44
- vec4 color = texture2D(tDiffuse, vUv);
45
- float brightness = max(max(color.r, color.g), color.b);
46
- gl_FragColor = brightness > uThreshold ? color : vec4(0.0);
47
- }
48
- `,transparent:!0,depthTest:!1,depthWrite:!1})}createBloomAddMaterial(){return this.createShaderMaterial({uniforms:{tBase:{value:null},tBloom:{value:null},uIntensity:{value:1},uResolution:{value:[this.width,this.height]}},vertexShader:this.getVertexShader(),fragmentShader:`
49
- varying vec2 vUv;
50
- uniform sampler2D tBase;
51
- uniform sampler2D tBloom;
52
- uniform float uIntensity;
53
- void main() {
54
- vec4 base = texture2D(tBase, vUv);
55
- vec4 bloom = texture2D(tBloom, vUv);
56
- gl_FragColor = vec4(base.rgb + bloom.rgb * uIntensity, base.a);
57
- }
58
- `,transparent:!0,depthTest:!1,depthWrite:!1})}createColorMaterial(){return this.createShaderMaterial({uniforms:{tDiffuse:{value:null},uMode:{value:0},uAmount:{value:1}},vertexShader:this.getVertexShader(),fragmentShader:`
59
- varying vec2 vUv;
60
- uniform sampler2D tDiffuse;
61
- uniform int uMode;
62
- uniform float uAmount;
63
-
64
- vec3 applyHueRotate(vec3 color, float angle) {
65
- float cosA = cos(angle);
66
- float sinA = sin(angle);
67
- mat3 m = mat3(
68
- 0.213 + cosA * 0.787 - sinA * 0.213,
69
- 0.715 - cosA * 0.715 - sinA * 0.715,
70
- 0.072 - cosA * 0.072 + sinA * 0.928,
71
- 0.213 - cosA * 0.213 + sinA * 0.143,
72
- 0.715 + cosA * 0.285 + sinA * 0.140,
73
- 0.072 - cosA * 0.072 - sinA * 0.283,
74
- 0.213 - cosA * 0.213 - sinA * 0.787,
75
- 0.715 - cosA * 0.715 + sinA * 0.715,
76
- 0.072 + cosA * 0.928 + sinA * 0.072
77
- );
78
- return clamp(m * color, 0.0, 1.0);
79
- }
80
-
81
- void main() {
82
- vec4 color = texture2D(tDiffuse, vUv);
83
- float luma = dot(color.rgb, vec3(0.299, 0.587, 0.114));
84
-
85
- if (uMode == 1) {
86
- color.rgb *= uAmount;
87
- } else if (uMode == 2) {
88
- color.rgb = (color.rgb - 0.5) * uAmount + 0.5;
89
- } else if (uMode == 3) {
90
- color.rgb = mix(vec3(luma), color.rgb, uAmount);
91
- } else if (uMode == 4) {
92
- color.rgb = mix(color.rgb, vec3(luma), uAmount);
93
- } else if (uMode == 5) {
94
- vec3 sepia = vec3(
95
- dot(color.rgb, vec3(0.393, 0.769, 0.189)),
96
- dot(color.rgb, vec3(0.349, 0.686, 0.168)),
97
- dot(color.rgb, vec3(0.272, 0.534, 0.131))
98
- );
99
- color.rgb = mix(color.rgb, sepia, uAmount);
100
- } else if (uMode == 6) {
101
- color.rgb = mix(color.rgb, vec3(1.0) - color.rgb, uAmount);
102
- } else if (uMode == 7) {
103
- color.rgb = applyHueRotate(color.rgb, uAmount);
104
- }
105
-
106
- gl_FragColor = color;
107
- }
108
- `,transparent:!0,depthTest:!1,depthWrite:!1})}getColorMode(e){switch(e){case"brightness":return 1;case"contrast":return 2;case"saturate":return 3;case"grayscale":return 4;case"sepia":return 5;case"invert":return 6;case"hue-rotate":return 7;default:return 0}}createShaderMaterial(e){if(!this.engine.createShaderMaterial)throw new Error("[String3DFilterPipeline] Shader material support missing.");return this.engine.createShaderMaterial(e)}getCustomMaterial(e){let t=e.trim().toLowerCase();if(!t)return null;if(this.customMaterials.has(t))return this.customMaterials.get(t);let i=ve.get(t);if(!i)return null;let r={tDiffuse:{value:null}},{width:s,height:a}=this.getScaledSize();r.uResolution={value:[s,a]},r.uTexel={value:[1/s,1/a]},Object.entries(i.uniforms||{}).forEach(([n,l])=>{r[n]={value:l}});let o=this.createShaderMaterial({uniforms:r,vertexShader:this.getVertexShader(),fragmentShader:i.fragmentShader,transparent:!0,depthTest:!1,depthWrite:!1});return this.customMaterials.set(t,o),o}getScaledSize(){let e=Math.max(1,Math.round(this.width*this.scale)),t=Math.max(1,Math.round(this.height*this.scale));return{width:e,height:t}}getVertexShader(){return`
109
- varying vec2 vUv;
110
- void main() {
111
- vUv = uv;
112
- gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
113
- }
114
- `}};var we=class{constructor(e,t){this.filterPipeline=null;this.filterCache=new Map;this.frameId=0;this.lastFrameTime=performance.now();this.avgFrameMs=16.7;this.qualityScale=1;this.lastQualityChange=0;this.filterLayer=1;this.engine=t,this._container=e;let{width:i,height:r}=e.getBoundingClientRect();this._width=i,this._height=r,this._renderer=t.createRenderer({antialias:!0,alpha:!0,logarithmicDepthBuffer:!0});let s=this._renderer;typeof s.setClearColor=="function"&&s.setClearColor(0,0),this._renderer.setPixelRatio(window.devicePixelRatio),this._renderer.setSize(i,r),this._renderer.shadowMap&&(this._renderer.shadowMap.enabled=!0)}attach(){this._container.appendChild(this._renderer.domElement)}render(e,t,i=[]){if(i.length===0){this._renderer.render(e.getScene(),t.camera);return}let r=this.ensureFilterPipeline();if(!r?.isSupported()){this._renderer.render(e.getScene(),t.camera);return}this.frameId+=1,this.updateQuality(i.length,r);let s=e.getAllObjects(),a=new Map;s.forEach(u=>{let m=u.object;"visible"in m&&a.set(u.object,m.visible)});let o=new Set;i.forEach(u=>{this.collectSubtreeObjects(u.object,o)}),s.forEach(u=>{o.has(u.object)&&this.setVisible(u.object,!1)});let n=this._renderer,l=n.autoClear;n.autoClear=!0,n.setRenderTarget&&n.setRenderTarget(null),n.clear&&n.clear(!0,!0,!0),this._renderer.render(e.getScene(),t.camera),n.autoClear=!1,s.forEach(u=>{let m=a.get(u.object);typeof m<"u"&&this.setVisible(u.object,m)});let c=s.filter(u=>u.type.endsWith("Light")),h=this.supportsLayers(t.camera,s);i.forEach(u=>{let m=this.filterCache.get(u.object.id);if(!u.dirty&&m&&m.effectsKey===u.effectsKey&&m.qualityScale===this.qualityScale){m.lastUsedFrame=this.frameId,r.renderToScreen(m.target);return}let p=this.injectEffectContext(u.object.el,u.effects),f=new Set;this.collectSubtreeObjects(u.object,f);let x=[],v=null;if(h){let O=u.object.getSubtreeObjects();x=this.applyLayerMask(O,c,this.filterLayer),v=this.setCameraLayer(t.camera,this.filterLayer)}else s.forEach(O=>{if(a.get(O.object)===!1){this.setVisible(O.object,!1);return}if(O.type.endsWith("Light")){this.setVisible(O.object,!0);return}this.setVisible(O.object,f.has(O.object))});let y=r.acquireTarget();n.setRenderTarget&&n.setRenderTarget(y),n.clear&&n.clear(!0,!0,!0),this._renderer.render(e.getScene(),t.camera);let S=r.applyFilters(y,p,this.qualityScale);n.setRenderTarget&&n.setRenderTarget(null),r.renderToScreen(S),h&&(this.restoreLayerMask(x),v!==null&&this.restoreCameraLayer(t.camera,v)),S!==y&&r.releaseTarget(y);let L={target:S,effectsKey:u.effectsKey,lastUsedFrame:this.frameId,qualityScale:this.qualityScale},P=this.filterCache.get(u.object.id);P&&P.target!==S&&r.releaseTarget(P.target),this.filterCache.set(u.object.id,L)}),h||s.forEach(u=>{let m=a.get(u.object);typeof m<"u"&&this.setVisible(u.object,m)}),n.autoClear=l,this.evictCache()}resize(e){let{width:t,height:i}=this._container.getBoundingClientRect();this._width=t,this._height=i,this._renderer.setSize(t,i),e.resize(t,i),this.filterPipeline?.resize(t,i),this.invalidateFilterCache()}get width(){return this._width}get height(){return this._height}get renderer(){return this._renderer}destroy(){this._renderer.dispose(),this.filterPipeline?.dispose(),this.filterCache.clear()}ensureFilterPipeline(){return this.canCreateFilterPipeline()?(this.filterPipeline||(this.filterPipeline=new ze(this.engine,this._renderer,this._width,this._height),this.filterPipeline.setScale(this.qualityScale)),this.filterPipeline):null}canCreateFilterPipeline(){return typeof this.engine.createRenderTarget=="function"&&typeof this.engine.createShaderMaterial=="function"&&typeof this._renderer.setRenderTarget=="function"}collectSubtreeObjects(e,t){t.add(e.object),e.children.forEach(i=>this.collectSubtreeObjects(i,t))}setVisible(e,t){let i=e;"visible"in i&&(i.visible=t)}getFilterCenter(e){if(!e||!this._width||!this._height)return[.5,.5];let t=e.__layoutCache,i=t?t.rect:e.getBoundingClientRect(),r=(i.left+i.width/2)/this._width,s=1-(i.top+i.height/2)/this._height,a=o=>Math.max(0,Math.min(1,o));return[a(r),a(s)]}injectEffectContext(e,t){if(!t.some(a=>a.type==="custom"))return t;let i=this.getFilterCenter(e),r=!1,s=t.map(a=>{if(a.type!=="custom"||a.uniforms&&"uCenter"in a.uniforms)return a;let o={...a.uniforms||{},uCenter:i};return r=!0,{...a,uniforms:o}});return r?s:t}updateQuality(e,t){let i=performance.now(),r=Math.max(.1,i-this.lastFrameTime);this.lastFrameTime=i,this.avgFrameMs=this.avgFrameMs*.9+r*.1;let s=1e3/this.avgFrameMs,a=Math.max(.75,1-Math.min(.4,e*.03)),o=a;s<48&&(o=Math.max(.75,a-.1)),s<40&&(o=Math.max(.75,a-.2)),s>58&&(o=Math.min(1,a+.05)),Math.abs(o-this.qualityScale)>=.05&&i-this.lastQualityChange>300&&(this.qualityScale=o,this.lastQualityChange=i,t.setScale(this.qualityScale),this.invalidateFilterCache())}invalidateFilterCache(){this.filterPipeline&&(this.filterCache.forEach(e=>{this.filterPipeline?.releaseTarget(e.target)}),this.filterCache.clear())}evictCache(){if(!this.filterPipeline)return;let e=120;this.filterCache.forEach((t,i)=>{this.frameId-t.lastUsedFrame>e&&(this.filterPipeline?.releaseTarget(t.target),this.filterCache.delete(i))})}supportsLayers(e,t){return!e?.layers||typeof e.layers.set!="function"?!1:t.some(i=>this.hasLayers(i.object))}hasLayers(e){return e?.layers&&typeof e.layers.set=="function"}applyLayerMask(e,t,i){let r=new Map,s=(a,o)=>{let n=a;this.hasLayers(n)&&(r.has(a)||r.set(a,n.layers.mask),o==="set"?n.layers.set(i):n.layers.enable(i))};return e.forEach(a=>s(a,"set")),t.forEach(a=>s(a.object,"enable")),Array.from(r.entries()).map(([a,o])=>({object:a,mask:o}))}restoreLayerMask(e){e.forEach(t=>{let i=t.object;this.hasLayers(i)&&(i.layers.mask=t.mask)})}setCameraLayer(e,t){if(!e?.layers||typeof e.layers.set!="function")return null;let i=e.layers.mask;return e.layers.set(t),i}restoreCameraLayer(e,t){e?.layers&&(e.layers.mask=t)}};var Q=class{constructor(e,t,i,r,s={}){this._uniforms={};this._children=[];this._flatObjectsCache=null;this._subtreeCache=null;this.id=e,this.type=t,this._object=i,this.engine=r,this._material=s.material,this._geometry=s.geometry,this._texture=s.texture,this._quaternion=r.createQuaternion(),this._originalSize=r.createVector3(),this._bbox=r.createBox3(),this.updateBoundingBox()}get children(){return this._children}get object(){return this._object}get material(){return this._material}get originalSize(){return this._originalSize.clone()}get boundingBox(){return this._bbox.clone()}addChild(e){this._children.push(e),this.object.add(e.object),this.invalidateFlatCache(),this.invalidateSubtreeCache()}getWorldMatrix(){return this._object.matrixWorld.clone()}getWorldPosition(){return this.engine.createVector3().setFromMatrixPosition(this._object.matrixWorld)}getOriginalBoundingBox(){if(!this._originalBoundingBox){let e=this.object.scale.clone();this.object.scale.set(1,1,1),this.object.updateMatrixWorld(!0),this._originalBoundingBox=this.engine.computeBoundingBoxRecursively(this.object),this.object.scale.copy(e),this.object.updateMatrixWorld(!0)}return this._originalBoundingBox.clone()}syncTransformFromMatrix(e){let t=this.engine.createVector3(),i=this.engine.createQuaternion(),r=this.engine.createVector3();e.decompose(t,i,r),this._object.position.copy(t),this._object.quaternion.copy(i),this._object.scale.copy(r),this._object.updateMatrix(),this._object.updateMatrixWorld()}applyWorldTransform(e,t,i){this._object.position.copy(e),this._object.quaternion.copy(t),this._object.scale.copy(i),this._object.updateMatrix(),this._object.updateMatrixWorld()}set quaternion(e){this._quaternion.copy(e),this._object.quaternion.copy(this._quaternion),this._object.updateMatrixWorld()}set position(e){this._object.position.copy(e)}set scale(e){this._object.scale.copy(e)}set rotation(e){this._object.rotation.copy(e)}set opacity(e){let t=this._object;t.material&&"opacity"in t.material&&(t.material.opacity=e)}set metalness(e){let t=this._object;t.material&&"metalness"in t.material&&(t.material.metalness=e)}set roughness(e){let t=this._object;t.material&&"roughness"in t.material&&(t.material.roughness=e)}set texture(e){this._texture=e,this._object.isMesh&&e?.applyTexture&&e.applyTexture(this._object)}set material(e){this._material=e}set geometry(e){this._geometry=e}updateBoundingBox(){this._bbox.setFromObject(this._object),this._bbox.getSize(this._originalSize)}destroy(){this.disposeObjectResources(this._object),this._texture?.dispose?.(),this._material?.dispose(),this._geometry?.dispose(),this._subtreeCache=null}getFlatObjects(){if(this._flatObjectsCache)return this._flatObjectsCache;let e=[],t=i=>{e.push(i.object),i.children.forEach(r=>t(r))};return t(this),this._flatObjectsCache=e,e}getSubtreeObjects(){if(this._subtreeCache)return this._subtreeCache;let e=[],t=this._object;return e.push(this._object),typeof t.traverse=="function"&&t.traverse(i=>{i&&i!==this._object&&e.push(i)}),this._subtreeCache=e,e}invalidateFlatCache(){this._flatObjectsCache=null}invalidateSubtreeCache(){this._subtreeCache=null}disposeObjectResources(e){let t=e;t?.geometry?.dispose&&t.geometry.dispose();let i=t?.material;Array.isArray(i)?i.forEach(r=>r?.dispose?.()):i?.dispose&&i.dispose(),typeof t?.traverse=="function"&&t.traverse(r=>{r?.geometry?.dispose&&r.geometry.dispose();let s=r?.material;Array.isArray(s)?s.forEach(a=>a?.dispose?.()):s?.dispose&&s.dispose()})}};var Se=class{constructor(e){this.styleMap=e.computedStyleMap?.(),this.style=getComputedStyle(e)}readNumber(e,t){let i=this.styleMap?.get?.(e);if(i!=null){let s=typeof i=="object"?i.value:i,a=typeof s=="number"?s:Number.parseFloat(s);if(!Number.isNaN(a))return a}let r=Number.parseFloat(this.style.getPropertyValue(e));return Number.isNaN(r)?t:r}readString(e,t=""){let i=this.styleMap?.get?.(e),r=i&&typeof i=="object"?i.value:i;if(typeof r=="string")return this.stripQuotes(r.trim())||t;let s=this.style.getPropertyValue(e).trim();return this.stripQuotes(s)||t}stripQuotes(e){return e.startsWith("'")&&e.endsWith("'")||e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e}readBoolean(e,t=!1){let i=this.readString(e,"");if(!i)return t;let r=i.toLowerCase();return r==="true"||r==="1"||r==="yes"?!0:r==="false"||r==="0"||r==="no"?!1:t}};function ce(g,e,t){let r=g.computedStyleMap?.()?.get?.(e);if(r!==void 0){if(typeof r=="number")return r;if(typeof r=="string"){let n=Number.parseFloat(r);if(!Number.isNaN(n))return n}if(r&&typeof r=="object"){let n=r.value;if(typeof n=="number")return n;if(typeof n=="string"){let l=Number.parseFloat(n);if(!Number.isNaN(l))return l}}}let a=getComputedStyle(g).getPropertyValue(e),o=Number.parseFloat(a);return Number.isNaN(o)?t:o}function qe(g){return g.startsWith("'")&&g.endsWith("'")||g.startsWith('"')&&g.endsWith('"')?g.slice(1,-1):g}function Ce(g,e,t=""){let r=g.computedStyleMap?.()?.get?.(e);if(typeof r=="string")return qe(r.trim());if(r&&typeof r=="object"){let o=r.value;if(typeof o=="string")return qe(o.trim())}let s=getComputedStyle(g).getPropertyValue(e);return(s?qe(s.trim()):"")||t}function je(g,e,t=!1){let i=Ce(g,e,"");if(!i)return t;let r=i.toLowerCase().trim();return r==="true"||r==="1"||r==="yes"?!0:r==="false"||r==="0"||r==="no"?!1:t}function nt(g){let e=g.computedStyleMap?.(),t="",i=e?.get?.("--filter");if(i!==void 0){if(typeof i=="string")t=i;else if(i&&typeof i=="object"){let r=i.value;typeof r=="string"&&(t=r)}}return t||(t=getComputedStyle(g).getPropertyValue("--filter")||""),t=t.trim(),t}var ue=class{static register(e){let t=e.name.trim().toLowerCase();if(!t)throw new Error("[String3D] Custom material name is required.");this.materials.set(t,{...e,name:t}),this.registerCssVarsForMaterial(e)}static registerCssVarsForMaterial(e){let t=globalThis.CSS;if(!t?.registerProperty)return;let i=e.uniforms||{};for(let r of Object.values(i)){let s=r.css?.trim();if(!s||!s.startsWith("--")||this.registeredCssVars.has(s))continue;let a=this.resolveCssSyntax(r.type);try{t.registerProperty({name:s,syntax:a,inherits:!1,initialValue:this.defaultCssInitialValue(r)}),this.registeredCssVars.add(s)}catch{}}}static resolveCssSyntax(e){switch(e){case"color":return"<color>";case"float":case"int":return"<number>";default:return"*"}}static defaultCssInitialValue(e){return e.type==="color"?typeof e.value=="string"?e.value:"#000000":e.type==="float"||e.type==="int"?typeof e.value=="number"?String(e.value):"0":"initial"}static get(e){return this.materials.get(e.trim().toLowerCase())}static has(e){return this.materials.has(e.trim().toLowerCase())}static list(){return Array.from(this.materials.values())}static unregister(e){return this.materials.delete(e.trim().toLowerCase())}};ue.materials=new Map,ue.registeredCssVars=new Set;function at(g,e){if(e==null||e===""||e==="none")return g.value;let t=e.trim();switch(g.type){case"float":case"int":{let i=parseFloat(t);return isNaN(i)?g.value:i}case"vec2":{let i=t.split(/[\s,]+/).map(r=>parseFloat(r.trim()));return i.length>=2&&i.every(r=>!isNaN(r))?[i[0],i[1]]:g.value}case"vec3":{let i=t.split(/[\s,]+/).map(r=>parseFloat(r.trim()));return i.length>=3&&i.every(r=>!isNaN(r))?[i[0],i[1],i[2]]:g.value}case"vec4":{let i=t.split(/[\s,]+/).map(r=>parseFloat(r.trim()));return i.length>=4&&i.every(r=>!isNaN(r))?[i[0],i[1],i[2],i[3]]:g.value}case"color":return dt(t)??g.value;case"texture":{let i=t.match(/url\(['"]?(.*?)['"]?\)/);return i?i[1]:t||g.value}default:return g.value}}function dt(g){if(g.startsWith("#")){let t=g.slice(1);if(t.length===3){let i=parseInt(t[0]+t[0],16)/255,r=parseInt(t[1]+t[1],16)/255,s=parseInt(t[2]+t[2],16)/255;return[i,r,s]}if(t.length===6){let i=parseInt(t.slice(0,2),16)/255,r=parseInt(t.slice(2,4),16)/255,s=parseInt(t.slice(4,6),16)/255;return[i,r,s]}}let e=g.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);return e?[parseInt(e[1])/255,parseInt(e[2])/255,parseInt(e[3])/255]:null}function Ke(g,e,t){let i={};if(g.parse){let r=g.parse(e,t);Object.assign(i,r)}if(g.uniforms)for(let[r,s]of Object.entries(g.uniforms))if(s.css){let a=t.getPropertyValue(s.css).trim();i[r]=at(s,a)}else r in i||(i[r]=s.value);return i}function Qe(g){let e=new Map;for(let i of g){let r=e.get(i.point)||[];r.push(i),e.set(i.point,r)}let t=new Map;for(let[i,r]of e){let s=r.sort((a,o)=>(a.order??0)-(o.order??0));t.set(i,s.map(a=>a.code).join(`
115
- `))}return t}var Ee=class{constructor(e,t={}){this._objects=new Map;this._rootObjects=[];this._elementMap=new Map;this._materialInstances=new Map;this._modelLoaderCache=new Map;this.engine=e,this._modelLoader=t.modelLoader,this._modelLoaderFactory=t.modelLoaderFactory,this._scene=e.createScene()}get rootObjects(){return this._rootObjects}setSynchronizer(e){this._synchronizer=e}getScene(){return this._scene}getObject(e){return this._objects.get(e)}getObjectForElement(e){for(let[t,i]of this._elementMap)if(i===e)return this._objects.get(t)}getAllObjects(){let e=[],t=i=>{e.push(i),i.children.forEach(r=>t(r))};return this._rootObjects.forEach(i=>t(i)),e}hasObject(e){return this._objects.has(e)}deleteObject(e){let t=this._objects.get(e);if(t){let i=this._elementMap.get(e);return i&&this._synchronizer&&this._synchronizer.cleanupElement(i,t),this._scene.remove(t.object),this._objects.delete(e),this._elementMap.delete(e),this._rootObjects=this._rootObjects.filter(r=>r!==t),t.destroy(),!0}return!1}createFromElement(e){let t=e.getProperty("3d");if(!t)return;let i=e.htmlElement;if(!i)return;let r=s=>{if(s){let a=e.getProperty("parentId");a==null?(this._scene.add(s.object),this._rootObjects.push(s)):this._objects.get(a)?.addChild(s),this._objects.set(e.id,s),this._elementMap.set(e.id,i),s.el=i}};switch(t){case"group":this.createGroup(e,r);break;case"pointLight":this.createLight(e,"point",r);break;case"ambientLight":this.createLight(e,"ambient",r);break;case"directionalLight":this.createLight(e,"directional",r);break;case"spotLight":this.createLight(e,"spot",r);break;case"hemisphereLight":this.createLight(e,"hemisphere",r);break;case"model":this.createModel(e,r);break;case"box":this.createBox(e,r);break;case"sphere":this.createSphere(e,r);break;case"plane":this.createPlane(e,r);break;case"cylinder":this.createCylinder(e,r);break;case"particles":this.createParticles(e,r);break;case"text":this.createText(e,r);break}}createGroup(e,t){let i=this.engine.createGroup(),r=new Q(e.id,"group",i,this.engine);return t(r),r}createLight(e,t,i){let r=e.htmlElement,s=r?Ce(r,"--light-color","#ffffff"):"#ffffff",a=s&&s!=="none"?s:"#ffffff",o=r?ce(r,"--light-intensity",1):1,n;if(t==="point"){let h=r?ce(r,"--light-distance",1e3):1e3,u=r?ce(r,"--light-decay",0):0;n=this.engine.createPointLight(a,o,h,u)}else if(t==="directional")n=this.engine.createDirectionalLight(a,o);else if(t==="spot"){let h=r?ce(r,"--light-distance",0):0,u=r?ce(r,"--light-angle",Math.PI/3):Math.PI/3,m=r?ce(r,"--light-penumbra",0):0,d=r?ce(r,"--light-decay",1):1;n=this.engine.createSpotLight(a,o,h,u,m,d)}else if(t==="hemisphere"){let h=r?Ce(r,"--light-ground-color","#ffffff"):"#ffffff",u=h&&h!=="none"?h:"#ffffff";n=this.engine.createHemisphereLight(a,u,o)}else n=this.engine.createAmbientLight(a,o);if((r?je(r,"--shadow-cast",!1):!1)&&n.shadow){n.castShadow=!0;let h=r?ce(r,"--shadow-bias",0):0,u=r?ce(r,"--shadow-map-size",512):512;n.shadow.bias=h,n.shadow.mapSize.width=u,n.shadow.mapSize.height=u}let c=new Q(e.id,t+"Light",n,this.engine);return i(c),c}applyShadowProps(e,t){let i=e.htmlElement,r=i?je(i,"--shadow-cast",!1):!1,s=i?je(i,"--shadow-receive",!1):!1;t.castShadow=r,t.receiveShadow=s}createBox(e,t){let i=this.engine.createBoxGeometry(1,1,1),r=this.createMaterialFromObject(e),s=this.engine.createMesh(i,r);this.applyShadowProps(e,s);let a=new Q(e.id,"box",s,this.engine,{geometry:i,material:r});return t(a),a}createSphere(e,t){let i=this.getGeometryQuality(e.htmlElement),r=Math.max(3,Math.round(32*i)),s=Math.max(2,Math.round(32*i)),a=this.engine.createSphereGeometry(.5,r,s),o=this.createMaterialFromObject(e),n=this.engine.createMesh(a,o);this.applyShadowProps(e,n);let l=new Q(e.id,"sphere",n,this.engine,{geometry:a,material:o});return t(l),l}createPlane(e,t){let i=this.engine.createPlaneGeometry(1,1),r=this.createMaterialFromObject(e),s=this.engine.createMesh(i,r);this.applyShadowProps(e,s);let a=new Q(e.id,"plane",s,this.engine,{geometry:i,material:r});return t(a),a}createCylinder(e,t){let i=this.getGeometryQuality(e.htmlElement),r=Math.max(3,Math.round(32*i)),s=this.engine.createCylinderGeometry(.5,.5,1,r),a=this.createMaterialFromObject(e),o=this.engine.createMesh(s,a);this.applyShadowProps(e,o);let n=new Q(e.id,"cylinder",o,this.engine,{geometry:s,material:a});return t(n),n}createModel(e,t){let i=e.getProperty("3d-model");if(!i)return;let r=e.getProperty("3d-model-loader")||void 0,s=this.resolveModelLoader(r);if(!s)return;let a=e.htmlElement;a&&this.applyModelTextureRemap(s,a);let o=e.getProperty("3d-model-center")??!1;s.load(i,n=>{let l=n?.scene||n?.object||n;if(!l)return;let c=a&&this.shouldOverrideModelMaterial(a)?this.createMaterialFromElement(a,e):null;typeof l.traverse=="function"&&l.traverse(u=>{u.isMesh&&(c&&(u.material=c),this.applyShadowProps(e,u))}),o&&this.centerObject(l);let h=new Q(e.id,"model",l,this.engine);t(h)},void 0,void 0)}createParticles(e,t){if(!this.engine.createParticleSystem)return;let i=e.htmlElement,r={mode:"emitter",count:300,size:2,color:"#ffffff",opacity:1,spread:120,spreadX:0,spreadY:0,seed:1,emitRate:30,emitBurst:0,particleLife:2.5,particleSpeed:40,particleDirection:[0,1,0],particleGravity:[0,-30,0],particleDrag:.1,particleSizeVariation:.6,particleColorVariation:.2,particleShape:"sphere",particleModelUrl:"",particleModelLoader:"",particleModelNode:"",instanceShape:"sphere",instanceModelUrl:"",instanceModelLoader:"",instanceModelNode:"",instanceScale:1,instanceScaleVariation:.5,instanceRotationSpeed:.4,instanceJitter:.2,instanceFlow:.3,instanceDisperse:0,instanceDisperseScatter:0,instanceDisperseScatterX:0,instanceDisperseScatterY:0,instanceDisperseScatterZ:0,modelTransitionDuration:0},s=this.engine.createParticleSystem(r),a=new Q(e.id,"particles",s,this.engine);t(a)}createText(e,t){if(!this.engine.createTextGeometry)return;let i=this.engine.createBoxGeometry(1,1,1),r=this.createMaterialFromObject(e),s=this.engine.createMesh(i,r);this.applyShadowProps(e,s);let a=this.engine.createGroup();a.__textMesh=s,a.add(s);let o=new Q(e.id,"text",a,this.engine,{geometry:i,material:r});t(o)}getGeometryQuality(e){if(!e)return 1;let t=ce(e,"--geometry-quality",1);return!Number.isFinite(t)||t<=0?1:t}resolveModelLoader(e){if(e){if(this._modelLoaderCache.has(e))return this._modelLoaderCache.get(e);if(!this._modelLoaderFactory)return;let t=this._modelLoaderFactory(this.engine,e);return this._modelLoaderCache.set(e,t),t}if(this._modelLoader)return this._modelLoader;if(this._modelLoaderFactory)return this._modelLoaderFactory(this.engine)}centerObject(e){if(!e)return;let t=this.engine.computeBoundingBoxRecursively(e),i=this.getBoxCenter(t);e.position?.set&&e.position.set(-i.x,-i.y,-i.z),e.updateMatrixWorld(!0)}getBoxCenter(e){let t=this.engine.createVector3();return t.x=(e.min.x+e.max.x)/2,t.y=(e.min.y+e.max.y)/2,t.z=(e.min.z+e.max.z)/2,t}createMaterialFromObject(e){return this.createMaterialFromElement(e.htmlElement,e)}createMaterialFromElement(e,t){let i=e?getComputedStyle(e):null,r=M=>i?i.getPropertyValue(M).trim():"",s=(M,C,R)=>{let _=r(M);return _&&_!=="none"&&_!==""?C(_):R},a=M=>parseFloat(M),o=M=>M,n=M=>{let C=M.match(/url\(['"]?(.*?)['"]?\)/);return C?C[1]:M},l=s("--material-type",M=>M.split("[")[0]||"basic","basic"),c=this.tryCreateCustomMaterial(l,e,i,t);if(c)return c;let h=s("--material-color",o,"#ffffff"),u=s("--opacity",a,1),m=s("--material-metalness",a,0),d=s("--material-roughness",a,1),p=s("--material-emissive",o,"#000000"),f={color:h,transparent:u<1,opacity:u},x=s("--texture-map",n,""),v=s("--texture-normal",n,""),y=s("--texture-roughness",n,""),S=s("--texture-metalness",n,""),L=s("--texture-ao",n,""),P=this.parseFlipY(e),O=e?Ce(e,"--texture-color-space",""):"",V=!!(x||v||y||S||L),w=l;return w!=="standard"&&V&&(w="standard"),w==="standard"?(x&&(f.map=this.loadTexture(x,{flipY:P,colorSpace:O})),v&&(f.normalMap=this.loadTexture(v,{flipY:P})),y&&(f.roughnessMap=this.loadTexture(y,{flipY:P})),S&&(f.metalnessMap=this.loadTexture(S,{flipY:P})),L&&(f.aoMap=this.loadTexture(L,{flipY:P})),f.metalness=m,f.roughness=d,f.emissive=p,this.engine.createMeshStandardMaterial(f)):this.engine.createMeshBasicMaterial(f)}tryCreateCustomMaterial(e,t,i,r){let s=ue.get(e);if(!s)return null;let a=this.engine.getMaterialFactory?.();if(!a||!a.supports(s))return null;let o={};t&&i&&(o=a.parseUniformsFromCSS(s,t,i));let n=a.create(s,o);return r&&this._materialInstances.set(r.id,n),n.material}updateMaterialUniforms(e,t){let i=this._materialInstances.get(e);i&&i.update(t)}getMaterialInstance(e){return this._materialInstances.get(e)}recreateMaterialForObject(e,t){let i=this._materialInstances.get(e.id);i&&i.dispose&&i.dispose(),this._materialInstances.delete(e.id);let r;for(let[a,o]of this._elementMap)if(a===e.id&&o===t){r=o.__stringObject||o.stringObject;break}let s=this.createMaterialFromElement(t,r);e.object&&e.object.traverse&&e.object.traverse(a=>{a.material&&(a.material.dispose&&a.material.dispose(),a.material=s)}),e.material=s}loadTexture(e,t={}){let r=this.engine.createTextureLoader().load(e);typeof t.flipY=="boolean"&&(r.flipY=t.flipY);let s=(t.colorSpace||"").toLowerCase().trim();return s&&"colorSpace"in r&&(r.colorSpace=s==="srgb"?"srgb":"linear"),r.needsUpdate=!0,r}parseFlipY(e){let t=e?Ce(e,"--texture-flip-y",""):"";if(t==null||t==="")return;if(typeof t=="boolean")return t;let i=String(t).toLowerCase().trim();if(i==="false"||i==="0"||i==="no")return!1;if(i==="true"||i==="1"||i==="yes")return!0}shouldOverrideModelMaterial(e){let t=getComputedStyle(e),i=s=>{let a=t.getPropertyValue(s);return a&&a!=="0"&&a!=="none"&&a!==""};return i("--material-color")||i("--texture-map")?!0:["--material-type","--material-metalness","--material-roughness","--material-emissive","--opacity","--texture-normal","--texture-roughness","--texture-metalness","--texture-ao"].some(s=>i(s))}applyModelTextureRemap(e,t){let i=(t.getAttribute("string-3d-model-texture-base")||"").trim(),r=i?i.replace(/\/?$/,"/"):"",s=t.getAttribute("string-3d-model-textures"),a=null;if(s)try{a=JSON.parse(s)}catch{}let o=e?.manager;!o||typeof o.setURLModifier!="function"||o.setURLModifier(n=>{let l=a&&n in a?a[n]:n;return!r||/^(blob:|data:|https?:|file:|\/)/i.test(l)?l:r+l.replace(/^\.?\//,"")})}destroy(){this._materialInstances.forEach(e=>e.dispose()),this._materialInstances.clear(),this._objects.forEach(e=>e.destroy()),this._objects.clear(),this._rootObjects=[]}};var J=class{constructor(){this.cache=new WeakMap;this.meta=new WeakMap}get(e,t,i){if(!!t.dirtySet&&t.forceSync===!1&&!t.dirtySet.has(e)){let n=this.cache.get(e);if(n)return n}let s=performance.now(),a=Math.max(0,t.styleReadIntervalMs??0);if(a>0){let n=this.meta.get(e),l=this.cache.get(e);if(n&&l&&s-n.time<a)return l}let o=i(e);return this.cache.set(e,o),this.meta.set(e,{time:s}),o}clear(){this.cache=new WeakMap,this.meta=new WeakMap}};var Je=Math.PI/180,_e=class _e{sync(e,t,i,r){let s=e.__layoutCache,a=s?s.rect:e.getBoundingClientRect(),o=this.readStyleBundle(e,i),n=a.left+a.width*.5,l=a.top+a.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set(n-i.viewportWidth/2,-(l-i.viewportHeight/2),o.translateZ);else{let c=i.camera.getFrustumSizeAt(o.translateZ),h=n/i.viewportWidth,u=l/i.viewportHeight;t.object.position.set((h-.5)*c.width,-(u-.5)*c.height,o.translateZ)}return t.object.scale.set(o.scale,o.scale,o.scale),t.object.rotation.x=-o.rotateX*Je,t.object.rotation.y=o.rotateY*Je,t.object.rotation.z=-o.rotateZ*Je,t.object.rotation.order="XYZ",t.object.updateMatrixWorld(!0),{scale:o.scale}}readStyleBundle(e,t){return _e.styleCache.get(e,t,i=>{let r=new Se(i);return{translateZ:r.readNumber("--translate-z",0),scale:r.readNumber("--scale",1),rotateX:r.readNumber("--rotate-x",0),rotateY:r.readNumber("--rotate-y",0),rotateZ:r.readNumber("--rotate-z",0)}})}};_e.styleCache=new J;var Ve=_e;var Be=class Be{sync(e,t,i,r){let s=e.__layoutCache,a=s?s.rect:e.getBoundingClientRect(),o=this.readStyleBundle(e,i,t),n=a.left+a.width*.5,l=a.top+a.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set(n-i.viewportWidth/2+o.translateX,-(l-i.viewportHeight/2)+o.translateY,o.translateZ);else{let h=i.camera.getFrustumSizeAt(o.translateZ),u=n/i.viewportWidth,m=l/i.viewportHeight;t.object.position.set((u-.5)*h.width+o.translateX,-(m-.5)*h.height+o.translateY,o.translateZ)}let c=t.object;if(o.color&&o.color!=="none"&&c.color&&typeof c.color.set=="function"&&c.color.set(o.color),c.intensity=o.intensity,typeof c.distance<"u"&&o.distance!==void 0&&(c.distance=o.distance),typeof c.decay<"u"&&o.decay!==void 0&&(c.decay=o.decay),typeof c.angle<"u"&&o.angle!==void 0&&(c.angle=o.angle),typeof c.penumbra<"u"&&o.penumbra!==void 0&&(c.penumbra=o.penumbra),o.groundColor&&o.groundColor!=="none"&&c.groundColor&&typeof c.groundColor.set=="function"&&c.groundColor.set(o.groundColor),c.castShadow!==o.castShadow&&(c.castShadow=o.castShadow),o.castShadow&&c.shadow&&(o.shadowBias!==void 0&&(c.shadow.bias=o.shadowBias),o.shadowMapSize!==void 0&&c.shadow.mapSize.width!==o.shadowMapSize&&(c.shadow.mapSize.width=o.shadowMapSize,c.shadow.mapSize.height=o.shadowMapSize)),o.targetId&&o.targetId!=="none"&&c.target){let h=document.querySelector(`[string-id="${o.targetId}"]`);if(h){let u=h.__layoutCache,m=u?u.rect:h.getBoundingClientRect(),p=new Se(h).readNumber("--translate-z",0),f=m.left+m.width*.5,x=m.top+m.height*.5,v,y,S;if(i.camera.getMode()==="orthographic")v=f-i.viewportWidth/2,y=-(x-i.viewportHeight/2),S=p;else{let L=i.camera.getFrustumSizeAt(p),P=f/i.viewportWidth,O=x/i.viewportHeight;v=(P-.5)*L.width,y=-(O-.5)*L.height,S=p}o.targetOffset&&(v+=o.targetOffset.x,y+=o.targetOffset.y,S+=o.targetOffset.z),c.target.position.set(v,y,S),c.target.updateMatrixWorld(!0)}}return null}readStyleBundle(e,t,i){return Be.styleCache.get(e,t,r=>{let s=new Se(r),a=i.object,o={translateZ:s.readNumber("--translate-z",0),translateX:s.readNumber("--translate-x",0),translateY:s.readNumber("--translate-y",0),color:s.readString("--light-color","")||void 0,intensity:s.readNumber("--light-intensity",a.intensity??1),castShadow:s.readBoolean("--shadow-cast",!1)};typeof a.distance<"u"&&(o.distance=s.readNumber("--light-distance",a.distance??0)),typeof a.decay<"u"&&(o.decay=s.readNumber("--light-decay",a.decay??1)),typeof a.angle<"u"&&(o.angle=s.readNumber("--light-angle",a.angle??Math.PI/3)),typeof a.penumbra<"u"&&(o.penumbra=s.readNumber("--light-penumbra",a.penumbra??0));let n=s.readString("--light-ground-color","");n&&(o.groundColor=n),o.castShadow&&a.shadow&&(o.shadowBias=s.readNumber("--shadow-bias",a.shadow.bias??0),o.shadowMapSize=s.readNumber("--shadow-map-size",a.shadow.mapSize.width??512));let l=s.readString("--light-target","").trim();l&&(o.targetId=l);let c=s.readString("--light-target-offset","").trim();if(c){let h=this.parseTargetOffset(c);h&&(o.targetOffset=h)}return o})}parseTargetOffset(e){let t=e.split(/[\s,]+/).map(i=>i.trim()).filter(Boolean).map(i=>Number.parseFloat(i));return t.length<3||t.some(i=>Number.isNaN(i))?null:{x:t[0],y:t[1],z:t[2]}}};Be.styleCache=new J;var xe=Be;var et=Math.PI/180,Y=class Y{static applyVisualProps(e,t,i){let r=Y.lastVisualProps.get(t);if(r){if(r.opacity===i.opacity&&r.color===i.color&&r.metalness===i.metalness&&r.roughness===i.roughness&&r.emissive===i.emissive&&r.castShadow===i.castShadow&&r.receiveShadow===i.receiveShadow)return;r.opacity=i.opacity,r.color=i.color,r.metalness=i.metalness,r.roughness=i.roughness,r.emissive=i.emissive,r.castShadow=i.castShadow,r.receiveShadow=i.receiveShadow}else Y.lastVisualProps.set(t,{opacity:i.opacity,color:i.color,metalness:i.metalness,roughness:i.roughness,emissive:i.emissive,castShadow:i.castShadow,receiveShadow:i.receiveShadow});let s=i.castShadow??!1,a=i.receiveShadow??!1,o=typeof i.opacity=="number"?i.opacity:NaN,n=l=>{l&&(isNaN(o)||(l.opacity=o,l.transparent=o<1),i.color&&l.color&&l.color.set&&l.color.set(i.color),typeof i.metalness=="number"&&"metalness"in l&&(l.metalness=i.metalness),typeof i.roughness=="number"&&"roughness"in l&&(l.roughness=i.roughness),i.emissive&&l.emissive&&l.emissive.set&&l.emissive.set(i.emissive))};if(t.object.traverse)t.object.traverse(l=>{l.isMesh&&(l.castShadow!==s&&(l.castShadow=s),l.receiveShadow!==a&&(l.receiveShadow=a),(Array.isArray(l.material)?l.material:[l.material]).forEach(n))});else if(t.object.isMesh){let l=t.object;l.castShadow!==s&&(l.castShadow=s),l.receiveShadow!==a&&(l.receiveShadow=a),(Array.isArray(l.material)?l.material:[l.material]).forEach(n)}}sync(e,t,i,r){let{rect:s,width:a,height:o}=this.readLayout(e,i),n=this.readStyleBundle(e,i),{translateZ:l,cssScale:c,rotateX:h,rotateY:u,rotateZ:m,cssScaleZ:d,opacity:p,color:f,metalness:x,roughness:v,emissive:y,castShadow:S,receiveShadow:L,geometryQuality:P}=n,O=s.left+s.width*.5,V=s.top+s.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set(O-i.viewportWidth/2,-(V-i.viewportHeight/2),l);else{let H=i.camera.getFrustumSizeAt(l),A=O/i.viewportWidth,D=V/i.viewportHeight;t.object.position.set((A-.5)*H.width,-(D-.5)*H.height,l)}t.object.rotation.x=-h*et,t.object.rotation.y=u*et,t.object.rotation.z=-m*et,t.object.rotation.order="XYZ";let w=a*c,M=o*c,C=r?.scale||1,R=d*C,_=w<M?w:M,B,N,G;switch(t.type){case"box":case"sphere":{let H=_*C;B=N=H,G=H*d;break}case"model":{let H=t.getOriginalBoundingBox();Y.tempVector3||(Y.tempVector3=i.engine.createVector3());let A=H.getSize(Y.tempVector3),D=e.getAttribute("string-3d-model-fit"),b=parseFloat(e.getAttribute("string-3d-model-scale")||"1"),I=Number.isFinite(b)?b*C:C;if(A.x>0&&A.y>0){let z=w/A.x,E=M/A.y,j=(D==="cover"?z>E?z:E:z<E?z:E)*I;B=N=j,G=j*d}else{let z=_*I;B=N=z,G=z*d}break}case"cylinder":B=w*C,N=M*C,G=w*R;break;default:B=w*C,N=M*C,G=_*.5*R;break}return t.object.scale.set(B,N,G),Y.applyVisualProps(e,t,{opacity:p,color:f&&f!=="none"?f:void 0,metalness:isNaN(x)?void 0:x,roughness:isNaN(v)?void 0:v,emissive:y&&y!=="none"?y:void 0,castShadow:S,receiveShadow:L}),this.applyGeometryQuality(t,P,i),this.updateCustomUniforms(e,t,i),{scale:c*C}}applyGeometryQuality(e,t,i){let r=i.engine,s=r?.simplifyGeometry?.bind(r);if(typeof s!="function")return;let a=Number.isFinite(t)&&t>0?t:1,o=Y.lastGeometryQuality.get(e);if(typeof o=="number"&&Math.abs(o-a)<.001)return;Y.lastGeometryQuality.set(e,a);let n=l=>{if(!l?.geometry)return;let c=l.userData||(l.userData={});c.__originalGeometry||(c.__originalGeometry=l.geometry);let h=c.__originalGeometry;if(a>=.999){l.geometry=h;return}c.__lodCache||(c.__lodCache=new Map);let u=a.toFixed(3);if(c.__lodCache.has(u)){l.geometry=c.__lodCache.get(u);return}let m=s(h,a);m&&(c.__lodCache.set(u,m),l.geometry=m)};e.object.traverse?e.object.traverse(l=>{l?.isMesh&&n(l)}):e.object.isMesh&&n(e.object)}updateCustomUniforms(e,t,i){let r=i.engine.getMaterialFactory?.();if(!r)return;let s=getComputedStyle(e),a=o=>{let n=o?.userData?.definition;if(!n?.uniforms)return;let l=r.parseUniformsFromCSS(n,e,s);for(let[c,h]of Object.entries(l)){let u=n.uniforms?.[c];if(!u)continue;let m=r.convertUniformValue?.bind(r),d=m?m(u.type,h):h;o.userData?.shader?.uniforms?.[c]?o.userData.shader.uniforms[c].value=d:o.userData?.customUniforms?.[c]?o.userData.customUniforms[c].value=d:o.uniforms?.[c]&&(o.uniforms[c].value=d)}};if(t.object.traverse)t.object.traverse(o=>{o.isMesh&&(Array.isArray(o.material)?o.material:[o.material]).forEach(a)});else if(t.object.isMesh){let o=t.object;(Array.isArray(o.material)?o.material:[o.material]).forEach(a)}}readStyleBundle(e,t){return Y.styleCache.get(e,t,i=>{let r=i.computedStyleMap?.(),s=getComputedStyle(i),a=(l,c)=>{let h=r?.get?.(l);if(h!=null){let m=typeof h=="object"&&"value"in h?h.value:h,d=typeof m=="number"?m:Number.parseFloat(String(m));if(!Number.isNaN(d))return d}let u=Number.parseFloat(s.getPropertyValue(l));return Number.isNaN(u)?c:u},o=l=>{let c=r?.get?.(l),h=c&&typeof c=="object"&&"value"in c?c.value:c;return typeof h=="string"?h.trim()||void 0:s.getPropertyValue(l).trim()||void 0},n=(l,c=!1)=>{let h=o(l);if(!h)return c;let u=h.toLowerCase();return u==="true"||u==="1"||u==="yes"?!0:u==="false"||u==="0"||u==="no"?!1:c};return{translateZ:a("--translate-z",0),cssScale:a("--scale",1),rotateX:a("--rotate-x",0),rotateY:a("--rotate-y",0),rotateZ:a("--rotate-z",0),cssScaleZ:a("--scale-z",1),opacity:a("--opacity",NaN),color:o("--material-color"),metalness:a("--material-metalness",NaN),roughness:a("--material-roughness",NaN),emissive:o("--material-emissive"),castShadow:n("--shadow-cast",!1),receiveShadow:n("--shadow-receive",!1),geometryQuality:a("--geometry-quality",1)}})}readLayout(e,t){let i=e.__layoutCache;return i||Y.layoutCache.get(e,t,r=>{let s=r.getBoundingClientRect(),a=r.offsetWidth||s.width,o=r.offsetHeight||s.height;return{rect:s,width:a,height:o}})}};Y.styleCache=new J,Y.layoutCache=new J,Y.tempVector3=null,Y.lastVisualProps=new WeakMap,Y.lastGeometryQuality=new WeakMap;var de=Y;var tt=Math.PI/180,F={mode:"emitter",count:300,size:2,color:"#ffffff",opacity:1,spread:120,spreadX:120,spreadY:120,seed:1,emitRate:30,emitBurst:0,particleLife:2.5,particleSpeed:40,particleDirection:[0,1,0],particleGravity:[0,-30,0],particleDrag:.1,particleSizeVariation:.6,particleColorVariation:.2,particleShape:"sphere",particleModelUrl:"",particleModelLoader:"",particleModelNode:"",instanceShape:"sphere",instanceModelUrl:"",instanceModelLoader:"",instanceModelNode:"",instanceScale:1,instanceScaleVariation:.5,instanceRotationSpeed:.4,instanceJitter:.2,instanceFlow:.3,instanceDisperse:0,instanceDisperseScatter:0,instanceDisperseScatterX:0,instanceDisperseScatterY:0,instanceDisperseScatterZ:0,modelTransitionDuration:0},U=class U{sync(e,t,i,r){let s=e.__layoutCache,a=s?s.rect:e.getBoundingClientRect(),o=this.readStyleBundle(e,i),n=a.left+a.width*.5,l=a.top+a.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set(n-i.viewportWidth/2,-(l-i.viewportHeight/2),o.translateZ);else{let x=i.camera.getFrustumSizeAt(o.translateZ),v=n/i.viewportWidth,y=l/i.viewportHeight;t.object.position.set((v-.5)*x.width,-(y-.5)*x.height,o.translateZ)}let c=r?.scale??1,h=o.scale*c;t.object.scale.set(h,h,h),t.object.rotation.x=-o.rotateX*tt,t.object.rotation.y=o.rotateY*tt,t.object.rotation.z=-o.rotateZ*tt,t.object.rotation.order="XYZ";let u=this.buildConfig(o,a,i,r),m=U.lastConfig.get(t);(!m||!this.isSameConfig(m,u))&&(U.lastConfig.set(t,u),t.object.setConfig?.(u)),this.updateMaterialOverrides(e,t,i,o),this.updateCustomUniforms(e,t,i);let d=performance.now(),p=U.lastTime.get(t)??d,f=Math.max(0,(d-p)/1e3);return U.lastTime.set(t,d),t.object.update?.(f),{scale:r?.scale??1}}readStyleBundle(e,t){return U.styleCache.get(e,t,i=>{let r=new Se(i),a=r.readString("--particles-mode",F.mode).toLowerCase()==="instanced"?"instanced":"emitter";return{...F,translateZ:r.readNumber("--translate-z",0),scale:r.readNumber("--scale",1),rotateX:r.readNumber("--rotate-x",0),rotateY:r.readNumber("--rotate-y",0),rotateZ:r.readNumber("--rotate-z",0),particlesFit:r.readNumber("--particles-fit",0)>.5,materialType:r.readString("--material-type","basic"),mode:a,count:r.readNumber("--particles-count",F.count),size:r.readNumber("--particles-size",F.size),color:r.readString("--particles-color",F.color),opacity:r.readNumber("--particles-opacity",F.opacity),spread:r.readNumber("--particles-spread",F.spread),seed:r.readNumber("--particles-seed",F.seed),emitRate:r.readNumber("--emit-rate",F.emitRate),emitBurst:r.readNumber("--emit-burst",F.emitBurst),particleLife:r.readNumber("--particle-life",F.particleLife),particleSpeed:r.readNumber("--particle-speed",F.particleSpeed),particleDirection:this.parseVec3(r.readString("--particle-direction","0 1 0"),F.particleDirection),particleGravity:this.parseVec3(r.readString("--particle-gravity","0 -30 0"),F.particleGravity),particleDrag:r.readNumber("--particle-drag",F.particleDrag),particleSizeVariation:r.readNumber("--particle-size-variation",F.particleSizeVariation),particleColorVariation:r.readNumber("--particle-color-variation",F.particleColorVariation),particleShape:this.parseShape(r.readString("--particles-shape",F.particleShape)),particleModelUrl:r.readString("--particles-model",F.particleModelUrl),particleModelLoader:r.readString("--particles-model-loader",F.particleModelLoader),particleModelNode:r.readString("--particles-model-node",F.particleModelNode),instanceShape:this.parseDistribution(r.readString("--instance-shape",F.instanceShape)),instanceModelUrl:r.readString("--instance-model",F.instanceModelUrl),instanceModelLoader:r.readString("--instance-model-loader",F.instanceModelLoader),instanceModelNode:r.readString("--instance-model-node",F.instanceModelNode),instanceScale:r.readNumber("--instance-scale",F.instanceScale),instanceScaleVariation:r.readNumber("--instance-scale-variation",F.instanceScaleVariation),instanceRotationSpeed:r.readNumber("--instance-rotation-speed",F.instanceRotationSpeed),instanceJitter:r.readNumber("--instance-jitter",F.instanceJitter),instanceFlow:r.readNumber("--instance-flow",F.instanceFlow),instanceDisperse:r.readNumber("--instance-disperse",F.instanceDisperse),instanceDisperseScatter:r.readNumber("--instance-scatter",F.instanceDisperseScatter),instanceDisperseScatterX:r.readNumber("--instance-scatter-x",F.instanceDisperseScatterX),instanceDisperseScatterY:r.readNumber("--instance-scatter-y",F.instanceDisperseScatterY),instanceDisperseScatterZ:r.readNumber("--instance-scatter-z",F.instanceDisperseScatterZ),modelTransitionDuration:this.getTransitionDuration(i,"--instance-model")}})}getTransitionDuration(e,t){let i=getComputedStyle(e),r=this.splitTransitionList(i.transitionProperty),s=this.splitTransitionList(i.transitionDuration),a=this.findTransitionIndex(r,t);if(a===-1){let o=this.parseTransitionShorthand(i.transition),n=o.get(t)||o.get("all");return n?n.duration:0}return this.parseTime(s[a]||s[s.length-1]||"0s")}splitTransitionList(e){let t=[],i="",r=0;for(let s=0;s<e.length;s+=1){let a=e[s];a==="("&&(r+=1),a===")"&&(r=Math.max(0,r-1)),a===","&&r===0?(t.push(i.trim()),i=""):i+=a}return i.trim()&&t.push(i.trim()),t.length>0?t:["all"]}findTransitionIndex(e,t){let i=e.map(s=>s.trim().toLowerCase()),r=i.indexOf(t);return r===-1&&(r=i.indexOf("all")),r}parseTime(e){let t=e.trim().toLowerCase();if(t.endsWith("ms")){let r=Number.parseFloat(t.slice(0,-2));return Number.isFinite(r)?r/1e3:0}if(t.endsWith("s")){let r=Number.parseFloat(t.slice(0,-1));return Number.isFinite(r)?r:0}let i=Number.parseFloat(t);return Number.isFinite(i)?i:0}parseTransitionShorthand(e){let t=new Map;return this.splitTransitionList(e).forEach(r=>{if(!r)return;let s=r.trim().split(/\s+(?![^()]*\))/g),a="",o="";s.forEach(n=>{let l=n.toLowerCase();l.endsWith("ms")||l.endsWith("s")||/^[0-9.]+$/.test(l)?o||(o=l):l.startsWith("cubic-bezier")||l.startsWith("steps")||l==="linear"||l==="ease"||l==="ease-in"||l==="ease-out"||l==="ease-in-out"||a||(a=n)}),a&&t.set(a.trim().toLowerCase(),{duration:this.parseTime(o||"0s")})}),t}parseVec3(e,t){let i=e.split(/[\s,]+/).map(r=>Number.parseFloat(r)).filter(r=>!Number.isNaN(r));return i.length>=3?[i[0],i[1],i[2]]:t}parseShape(e){let t=e.trim().toLowerCase();return t==="box"?"box":t==="model"?"model":"sphere"}parseDistribution(e){return this.parseShape(e)}buildConfig(e,t,i,r){let a=r?.scale??1,o=.5,n,l,c;return e.particlesFit?(l=this.toWorld(t.width*o,e.translateZ,i),c=this.toWorld(t.height*o,e.translateZ,i),n=Math.max(l,c)):(n=this.toWorld(e.spread,e.translateZ,i),l=n,c=n),{...e,count:Math.max(0,Math.floor(e.count)),size:Math.max(.1,e.size),opacity:Math.max(0,Math.min(1,e.opacity)),spread:Math.max(0,n*a),spreadX:Math.max(0,l*a),spreadY:Math.max(0,c*a),seed:Math.max(0,Math.floor(e.seed)),emitRate:Math.max(0,e.emitRate),emitBurst:Math.max(0,e.emitBurst),particleLife:Math.max(.1,e.particleLife),particleSpeed:Math.max(0,e.particleSpeed),particleDrag:Math.max(0,Math.min(1,e.particleDrag)),particleSizeVariation:Math.max(0,e.particleSizeVariation),particleColorVariation:Math.max(0,e.particleColorVariation),instanceScale:Math.max(.1,e.instanceScale),instanceScaleVariation:Math.max(0,e.instanceScaleVariation),instanceRotationSpeed:Math.max(0,e.instanceRotationSpeed),instanceJitter:Math.max(0,e.instanceJitter),instanceFlow:Math.max(0,e.instanceFlow),instanceDisperse:Math.max(0,e.instanceDisperse),instanceDisperseScatter:Math.max(0,e.instanceDisperseScatter),instanceDisperseScatterX:Math.max(0,e.instanceDisperseScatterX),instanceDisperseScatterY:Math.max(0,e.instanceDisperseScatterY),instanceDisperseScatterZ:Math.max(0,e.instanceDisperseScatterZ)}}toWorld(e,t,i){if(i.camera.getMode()==="orthographic")return e;let s=i.camera.getFrustumSizeAt(t).width/Math.max(1,i.viewportWidth);return e*s}isSameConfig(e,t){return JSON.stringify(e)===JSON.stringify(t)}updateMaterialOverrides(e,t,i,r){let a=(r.materialType||"basic").split("[")[0].trim().toLowerCase(),o=ue.get(a),n=i.engine.getMaterialFactory?.();if(!o||!n||!n.supports(o)){if(!(U.materialInstances.has(t)||U.lastMaterialType.has(t)))return;let h=U.materialInstances.get(t);h&&(h.dispose(),U.materialInstances.delete(t)),U.lastMaterialType.delete(t),t.object.setMaterial?.(null,{points:!0,meshes:!0});return}if(U.lastMaterialType.get(t)!==a){let c=U.materialInstances.get(t);c&&c.dispose();let h=getComputedStyle(e),u=n.parseUniformsFromCSS(o,e,h),m=n.create(o,u);U.materialInstances.set(t,m),U.lastMaterialType.set(t,a);let d=m.material,p=!!d?.isShaderMaterial,f=t.object;f.setMaterial?.(d,{meshes:!0,points:!1}),f.setMaterial?.(p?d:null,{meshes:!1,points:!0})}}updateCustomUniforms(e,t,i){let r=i.engine.getMaterialFactory?.();if(!r)return;let s=getComputedStyle(e),a=o=>{let n=o?.userData?.definition;if(!n?.uniforms)return;let l=r.parseUniformsFromCSS(n,e,s);for(let[c,h]of Object.entries(l)){let u=n.uniforms?.[c];if(!u)continue;let m=r.convertUniformValue?.bind(r),d=m?m(u.type,h):h;o.userData?.shader?.uniforms?.[c]?o.userData.shader.uniforms[c].value=d:o.userData?.customUniforms?.[c]?o.userData.customUniforms[c].value=d:o.uniforms?.[c]&&(o.uniforms[c].value=d)}};t.object.traverse&&t.object.traverse(o=>{(o.isMesh||o.isPoints)&&(Array.isArray(o.material)?o.material:[o.material]).forEach(a)})}};U.styleCache=new J,U.lastConfig=new WeakMap,U.lastTime=new WeakMap,U.lastMaterialType=new WeakMap,U.materialInstances=new WeakMap;var Ae=U;var re=class{static normalizeKey(e){return e.trim().toLowerCase()}static register(e,t){let i=e.trim();i&&this.fonts.set(this.normalizeKey(i),{name:i,url:t})}static setDefault(e){let t=e.trim();t&&(this.defaultFont=this.normalizeKey(t))}static get(e){return this.fonts.get(this.normalizeKey(e))}static list(){return Array.from(this.fonts.values())}static resolveFontFamily(e){if(!e)return this.getDefault();let t=e.split(",").map(i=>i.trim().replace(/^["']|["']$/g,"")).filter(Boolean);for(let i of t){let r=this.fonts.get(this.normalizeKey(i));if(r)return r}return this.getDefault()}static getDefault(){return this.defaultFont&&this.fonts.get(this.defaultFont)||null}};re.fonts=new Map,re.defaultFont=null;var it=null,Fe=null,rt=null,Te=null;async function pt(){return Fe||(it||(it=(async()=>typeof window<"u"&&window.opentype?(Fe=window.opentype,Fe):new Promise((g,e)=>{if(typeof document>"u"){e(new Error("[FontConverter] Cannot load opentype.js in non-browser environment"));return}let t=document.createElement("script");t.src="https://cdn.jsdelivr.net/npm/opentype.js@1.3.4/dist/opentype.min.js",t.onload=()=>{Fe=window.opentype,g(Fe)},t.onerror=()=>e(new Error("[FontConverter] Failed to load opentype.js")),document.head.appendChild(t)}))()),it)}async function ft(){return Te||(rt||(rt=(async()=>typeof window<"u"&&window.Module?.decompress?(Te=window.Module,Te):new Promise((g,e)=>{if(typeof document>"u"){e(new Error("[FontConverter] Cannot load woff2 decoder in non-browser environment"));return}let t=document.createElement("script");t.src="https://cdn.jsdelivr.net/npm/wawoff2@2.0.1/build/decompress_binding.js",t.onload=()=>{let i=0,r=500,s=()=>{i++;let a=window;a.Module?.decompress?(Te=a.Module,g(Te)):i>=r?e(new Error("[FontConverter] woff2 decoder initialization timeout")):setTimeout(s,10)};s()},t.onerror=()=>{e(new Error("[FontConverter] Failed to load woff2 decoder"))},document.head.appendChild(t)}))()),rt)}async function gt(g){let e=await ft(),t=new Uint8Array(g),i=e.decompress(t);if(i instanceof Uint8Array){let r=new ArrayBuffer(i.length);return new Uint8Array(r).set(i),r}return i.buffer}function yt(g){return new DataView(g).getUint32(0,!1)===2001684018}var pe=class{static async load(e){let t=typeof e=="string"?e:"buffer-"+Date.now(),i=this.cache.get(t);if(i)return i;let r=this.loadingPromises.get(t);if(r)return r;let s=this.doLoad(e,t);this.loadingPromises.set(t,s);try{let a=await s;return this.cache.set(t,a),a}finally{this.loadingPromises.delete(t)}}static async doLoad(e,t){let i=await pt(),r;if(typeof e=="string")r=await(await fetch(e)).arrayBuffer();else if(e instanceof ArrayBuffer)r=e;else if(e instanceof Uint8Array)r=e.buffer;else throw new Error("[FontConverter] Invalid font source");yt(r)&&(r=await gt(r));let s=i.parse(r);if(!s)throw new Error("[FontConverter] Failed to parse font");return this.convertToTypeFace(s)}static convertToTypeFace(e){let t=1e3/e.unitsPerEm,i={},r=e.tables?.cmap?.glyphIndexMap;if(r&&typeof r=="object")for(let[s,a]of Object.entries(r)){let o=Number(s);if(!Number.isFinite(o))continue;let n=e.glyphs.get(a);if(!n)continue;let l=n.getPath(0,0,e.unitsPerEm),c=this.pathToOutline(l,t),h=n.advanceWidth??n.xMax??e.unitsPerEm*.5,u=String.fromCharCode(o);i[u]||(i[u]={ha:Math.round(h*t),x_min:n.xMin!==void 0?Math.round(n.xMin*t):0,x_max:n.xMax!==void 0?Math.round(n.xMax*t):0,o:c})}else for(let s=0;s<e.glyphs.length;s++){let a=e.glyphs.get(s),o=Array.isArray(a.unicodes)?a.unicodes:a.unicode?[a.unicode]:[];if(o.length===0)continue;let n=a.getPath(0,0,e.unitsPerEm),l=this.pathToOutline(n,t),c=a.advanceWidth??a.xMax??e.unitsPerEm*.5;o.forEach(h=>{if(!Number.isFinite(h))return;let u=String.fromCharCode(h);i[u]||(i[u]={ha:Math.round(c*t),x_min:a.xMin!==void 0?Math.round(a.xMin*t):0,x_max:a.xMax!==void 0?Math.round(a.xMax*t):0,o:l})})}if(!i[" "]){let s=e.charToGlyph(" ");i[" "]={ha:Math.round((s?.advanceWidth||e.unitsPerEm*.25)*t),x_min:0,x_max:0,o:""}}return{glyphs:i,familyName:e.names.fontFamily?.en||e.names.fullName?.en||"Unknown",ascender:Math.round(e.ascender*t),descender:Math.round(e.descender*t),underlinePosition:Math.round((e.tables.post?.underlinePosition||-100)*t),underlineThickness:Math.round((e.tables.post?.underlineThickness||50)*t),boundingBox:{xMin:Math.round((e.tables.head?.xMin||0)*t),xMax:Math.round((e.tables.head?.xMax||1e3)*t),yMin:Math.round((e.tables.head?.yMin||-200)*t),yMax:Math.round((e.tables.head?.yMax||800)*t)},resolution:1e3,outlineFormat:(e.outlinesFormat||e.outlineFormat||"").toString(),original_font_information:{format:0,copyright:e.names.copyright?.en||"",fontFamily:e.names.fontFamily?.en||"",fontSubfamily:e.names.fontSubfamily?.en||"",uniqueID:e.names.uniqueID?.en||"",fullName:e.names.fullName?.en||"",version:e.names.version?.en||"",postScriptName:e.names.postScriptName?.en||""}}}static pathToOutline(e,t){let i=[];for(let r of e.commands)switch(r.type){case"M":i.push(`m ${this.round(r.x*t)} ${this.round(r.y*t)}`);break;case"L":i.push(`l ${this.round(r.x*t)} ${this.round(r.y*t)}`);break;case"Q":i.push(`q ${this.round(r.x1*t)} ${this.round(r.y1*t)} ${this.round(r.x*t)} ${this.round(r.y*t)}`);break;case"C":i.push(`b ${this.round(r.x1*t)} ${this.round(r.y1*t)} ${this.round(r.x2*t)} ${this.round(r.y2*t)} ${this.round(r.x*t)} ${this.round(r.y*t)}`);break;case"Z":i.push("z");break}return i.join(" ")}static round(e){return Math.round(e*1e4)/1e4}static isTypefaceJson(e){let t=e.toLowerCase();return t.endsWith(".json")||t.includes("typeface")}static isFontFile(e){let t=e.toLowerCase();return!!(/\.(ttf|otf|woff2?)(\?|$)/i.test(t)||t.includes("fonts.gstatic.com")||t.includes("/fonts/")&&!t.endsWith(".json"))}static clearCache(){this.cache.clear()}};pe.cache=new Map,pe.loadingPromises=new Map;var Ne=Math.PI/180;var bt=`
1
+ "use strict";var Ze=Object.defineProperty;var ht=Object.getOwnPropertyDescriptor;var mt=Object.getOwnPropertyNames;var pt=Object.prototype.hasOwnProperty;var dt=(d,e)=>{for(var t in e)Ze(d,t,{get:e[t],enumerable:!0})},ft=(d,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of mt(e))!pt.call(d,r)&&r!==t&&Ze(d,r,{get:()=>e[r],enumerable:!(i=ht(e,r))||i.enumerable});return d};var gt=d=>ft(Ze({},"__esModule",{value:!0}),d);var It={};dt(It,{FontConverter:()=>fe,String3D:()=>Ue,String3DCamera:()=>xe,String3DCustomFilterRegistry:()=>ce,String3DCustomMaterialRegistry:()=>re,String3DFontRegistry:()=>ne,String3DObject:()=>Q,String3DRenderer:()=>we,String3DScene:()=>Ie,String3DSynchronizer:()=>Ee,ThreeJSEngine:()=>Le,ThreeJSMaterialFactory:()=>Re,ThreeJSProvider:()=>Ge});module.exports=gt(It);var ut=require("@fiddle-digital/string-tune");var xe=class{constructor(e,t="perspective",i=50,r=.1,n=1e4){this.scaleCache=new Map;this._width=1;this._height=1;this.engine=e,this.mode=t,this.perspectiveFov=i,t==="orthographic"?this._camera=e.createOrthographicCamera(-1,1,1,-1,r,n):this._camera=e.createPerspectiveCamera(i,1,r,n),this._position=e.createVector3(0,0,1e3),this.update()}get camera(){return this._camera}resize(e,t){if(this._width=e,this._height=t,this.mode==="orthographic"){let i=this._camera;i.left=-e/2,i.right=e/2,i.top=t/2,i.bottom=-t/2}else this._camera.aspect=e/t;this.update()}setPosition(e,t,i){this._position.set(e,t,i),this._camera.position.copy(this._position),this.update()}lookAt(e,t,i){this._camera.lookAt(e,t,i),this.update()}update(){this._camera.updateProjectionMatrix(),this._camera.updateMatrixWorld?.()}screenToWorld(e,t,i=0){if(this.mode==="orthographic"){let r=e-this._width/2,n=-(t-this._height/2);return this.engine.createVector3(r,n,i)}else{let{width:r,height:n}=this.getFrustumSizeAt(i),s=e/this._width,o=t/this._height,a=(s-.5)*r,l=-(o-.5)*n;return this.engine.createVector3(a,l,i)}}getFrustumSizeAt(e){if(this.mode==="orthographic")return{width:this._width,height:this._height};let t=this.engine.degToRad(this.perspectiveFov),i=Math.abs(e-this._camera.position.z),r=2*Math.tan(t/2)*i;return{width:r*this._camera.aspect,height:r}}getScaleAtZ(e,t){if(this.mode==="orthographic")return 1;let i=Math.round(e*1e3)/1e3;if(this.scaleCache.has(i))return this.scaleCache.get(i);let{height:r}=this.getFrustumSizeAt(e),n=r/t;return this.scaleCache.set(i,n),n}clearScaleCache(){this.scaleCache.clear()}getMode(){return this.mode}getPerspectiveFov(){return this.perspectiveFov}getPositionZ(){return this._position.z}};var yt={renderTargets:!1,shaderMaterials:!1,postProcess:!1,customMaterialFactory:!1,particles:!1,text:!1,geometrySimplify:!1};function bt(d){let e=d.getCapabilities?.();return e?{...yt,...e}:{renderTargets:typeof d.createRenderTarget=="function",shaderMaterials:typeof d.createShaderMaterial=="function",postProcess:typeof d.createRenderTarget=="function"&&typeof d.createShaderMaterial=="function",customMaterialFactory:typeof d.getMaterialFactory=="function",particles:typeof d.createParticleSystem=="function",text:typeof d.createTextGeometry=="function"||typeof d.loadFont=="function",geometrySimplify:typeof d.simplifyGeometry=="function"}}function at(d,e){let t=d.getPostProcessRuntime?.();if(t&&t.isSupported(e))return t;let i=bt(d);return!i.postProcess||!i.renderTargets||!i.shaderMaterials||typeof d.createRenderTarget!="function"||typeof d.createShaderMaterial!="function"||typeof e.setRenderTarget!="function"?null:{isSupported:()=>!0,createRenderTarget:(r,n,s)=>d.createRenderTarget(r,n,s),createShaderMaterial:r=>d.createShaderMaterial(r),setRenderTarget:(r,n)=>{r.setRenderTarget?.(n)},clear:(r,n=!0,s=!0,o=!0)=>{r.clear?.(n,s,o)}}}var ce=class{static register(e){let t=e.name.trim().toLowerCase();if(!t)throw new Error("[String3D] Custom filter name is required.");this.filters.set(t,{...e,name:t})}static get(e){return this.filters.get(e.trim().toLowerCase())}static has(e){return this.filters.has(e.trim().toLowerCase())}static list(){return Array.from(this.filters.values())}static getImplementation(e,t){let i=this.get(e);if(!i)return;let r=i.implementations?.[t]||i.implementations?.custom;if(r)return r;if(i.fragmentShader&&t==="webgl")return{kind:"shader",language:"glsl",stage:"fragment",code:i.fragmentShader}}};ce.filters=new Map;var je=class{constructor(e,t,i,r,n){let s=e.getCustomFilterRegistry?.()||ce;this.pipeline=i.createPipeline?.({engine:e,renderer:t,width:r,height:n,customFilterRegistry:s})||null}isSupported(){return this.pipeline?.isSupported()??!1}resize(e,t){this.pipeline?.resize(e,t)}setScale(e){this.pipeline?.setScale(e)}applyFilters(e,t,i=1){return this.pipeline?.applyFilters(e,t,i)||e}acquireTarget(){if(!this.pipeline)throw new Error("[String3D] Post-process pipeline runtime is not available.");return this.pipeline.acquireTarget()}releaseTarget(e){this.pipeline?.releaseTarget(e)}renderToScreen(e){this.pipeline?.renderToScreen(e)}dispose(){this.pipeline?.dispose()}};var we=class{constructor(e,t){this.filterPipeline=null;this.filterCache=new Map;this.frameId=0;this.lastFrameTime=performance.now();this.avgFrameMs=16.7;this.qualityScale=1;this.lastQualityChange=0;this.filterLayer=1;this.engine=t,this._container=e;let{width:i,height:r}=e.getBoundingClientRect();this._width=i,this._height=r,this._renderer=t.createRenderer({antialias:!0,alpha:!0,logarithmicDepthBuffer:!0});let n=this.engine.getRecommendedPixelRatio?.(),s=typeof n=="number"&&Number.isFinite(n)?Math.max(.1,n):1;this._renderer.setPixelRatio(s),this._renderer.setSize(i,r),this.engine.configureRenderer?.(this._renderer,{width:i,height:r,pixelRatio:s,container:this._container}),this.postProcessRuntime=at(this.engine,this._renderer)}attach(){this._container.appendChild(this._renderer.domElement)}render(e,t,i=[]){if(i.length===0){this._renderer.render(e.getScene(),t.camera);return}let r=this.ensureFilterPipeline();if(!r?.isSupported()){this._renderer.render(e.getScene(),t.camera);return}this.frameId+=1,this.updateQuality(i.length,r);let n=e.getAllObjects(),s=new Map;n.forEach(m=>{let p=m.object;"visible"in p&&s.set(m.object,p.visible)});let o=new Set;i.forEach(m=>{this.collectSubtreeObjects(m.object,o)}),n.forEach(m=>{o.has(m.object)&&this.setVisible(m.object,!1)});let a=this._renderer,l=a.autoClear;a.autoClear=!0,this.postProcessRuntime?.setRenderTarget(this._renderer,null),this.postProcessRuntime?.clear(this._renderer,!0,!0,!0),this._renderer.render(e.getScene(),t.camera),a.autoClear=!1,n.forEach(m=>{let p=s.get(m.object);typeof p<"u"&&this.setVisible(m.object,p)});let h=n.filter(m=>m.type.endsWith("Light")),c=this.engine.supportsObjectLayerIsolation?.(t.camera,n.map(m=>m.object))===!0&&typeof this.engine.beginObjectLayerIsolation=="function"&&typeof this.engine.endObjectLayerIsolation=="function",u=!1;i.forEach(m=>{let p=this.filterCache.get(m.object.id);if(!m.dirty&&p&&p.effectsKey===m.effectsKey&&p.qualityScale===this.qualityScale){p.lastUsedFrame=this.frameId,r.renderToScreen(p.target);return}let g=this.injectEffectContext(m.object.el,m.effects),D=new Set;this.collectSubtreeObjects(m.object,D);let v=null;if(c){let F=m.object.getSubtreeObjects();v=this.engine.beginObjectLayerIsolation?.(t.camera,F,h.map(O=>O.object),this.filterLayer)||null}v||(u=!0,n.forEach(F=>{if(s.get(F.object)===!1){this.setVisible(F.object,!1);return}if(F.type.endsWith("Light")){this.setVisible(F.object,!0);return}this.setVisible(F.object,D.has(F.object))}));let y=r.acquireTarget();this.postProcessRuntime?.setRenderTarget(this._renderer,y),this.postProcessRuntime?.clear(this._renderer,!0,!0,!0),this._renderer.render(e.getScene(),t.camera);let S=r.applyFilters(y,g,this.qualityScale);this.postProcessRuntime?.setRenderTarget(this._renderer,null),r.renderToScreen(S),v&&this.engine.endObjectLayerIsolation?.(t.camera,v),S!==y&&r.releaseTarget(y);let P={target:S,effectsKey:m.effectsKey,lastUsedFrame:this.frameId,qualityScale:this.qualityScale},T=this.filterCache.get(m.object.id);T&&T.target!==S&&r.releaseTarget(T.target),this.filterCache.set(m.object.id,P)}),u&&n.forEach(m=>{let p=s.get(m.object);typeof p<"u"&&this.setVisible(m.object,p)}),a.autoClear=l,this.evictCache()}resize(e){let{width:t,height:i}=this._container.getBoundingClientRect();this._width=t,this._height=i,this._renderer.setSize(t,i),e.resize(t,i),this.filterPipeline?.resize(t,i),this.invalidateFilterCache()}get width(){return this._width}get height(){return this._height}get renderer(){return this._renderer}destroy(){this._renderer.dispose(),this.filterPipeline?.dispose(),this.filterCache.clear()}ensureFilterPipeline(){let e=this.postProcessRuntime;return!e||!this.canCreateFilterPipeline()?null:(this.filterPipeline||(this.filterPipeline=new je(this.engine,this._renderer,e,this._width,this._height),this.filterPipeline.setScale(this.qualityScale)),this.filterPipeline)}canCreateFilterPipeline(){return!!this.postProcessRuntime}collectSubtreeObjects(e,t){t.add(e.object),e.children.forEach(i=>this.collectSubtreeObjects(i,t))}setVisible(e,t){let i=e;"visible"in i&&(i.visible=t)}getFilterCenter(e){if(!e||!this._width||!this._height)return[.5,.5];let t=e.__layoutCache,i=t?t.rect:e.getBoundingClientRect(),r=(i.left+i.width/2)/this._width,n=1-(i.top+i.height/2)/this._height,s=o=>Math.max(0,Math.min(1,o));return[s(r),s(n)]}injectEffectContext(e,t){if(!t.some(s=>s.type==="custom"))return t;let i=this.getFilterCenter(e),r=!1,n=t.map(s=>{if(s.type!=="custom"||s.uniforms&&"uCenter"in s.uniforms)return s;let o={...s.uniforms||{},uCenter:i};return r=!0,{...s,uniforms:o}});return r?n:t}updateQuality(e,t){let i=performance.now(),r=Math.max(.1,i-this.lastFrameTime);this.lastFrameTime=i,this.avgFrameMs=this.avgFrameMs*.9+r*.1;let n=1e3/this.avgFrameMs,s=Math.max(.75,1-Math.min(.4,e*.03)),o=s;n<48&&(o=Math.max(.75,s-.1)),n<40&&(o=Math.max(.75,s-.2)),n>58&&(o=Math.min(1,s+.05)),Math.abs(o-this.qualityScale)>=.05&&i-this.lastQualityChange>300&&(this.qualityScale=o,this.lastQualityChange=i,t.setScale(this.qualityScale),this.invalidateFilterCache())}invalidateFilterCache(){this.filterPipeline&&(this.filterCache.forEach(e=>{this.filterPipeline?.releaseTarget(e.target)}),this.filterCache.clear())}evictCache(){if(!this.filterPipeline)return;let e=120;this.filterCache.forEach((t,i)=>{this.frameId-t.lastUsedFrame>e&&(this.filterPipeline?.releaseTarget(t.target),this.filterCache.delete(i))})}};var Q=class{constructor(e,t,i,r,n={}){this._uniforms={};this._children=[];this._flatObjectsCache=null;this._subtreeCache=null;this.id=e,this.type=t,this._object=i,this.engine=r,this._material=n.material,this._geometry=n.geometry,this._texture=n.texture,this._quaternion=r.createQuaternion(),this._originalSize=r.createVector3(),this._bbox=r.createBox3(),this.updateBoundingBox()}get children(){return this._children}get object(){return this._object}get material(){return this._material}get originalSize(){return this._originalSize.clone()}get boundingBox(){return this._bbox.clone()}addChild(e){this._children.push(e),this.object.add(e.object),this.invalidateFlatCache(),this.invalidateSubtreeCache()}getWorldMatrix(){return this._object.matrixWorld.clone()}getWorldPosition(){return this.engine.createVector3().setFromMatrixPosition(this._object.matrixWorld)}getOriginalBoundingBox(){if(!this._originalBoundingBox){let e=this.object.scale.clone();this.object.scale.set(1,1,1),this.object.updateMatrixWorld(!0),this._originalBoundingBox=this.engine.computeBoundingBoxRecursively(this.object),this.object.scale.copy(e),this.object.updateMatrixWorld(!0)}return this._originalBoundingBox.clone()}syncTransformFromMatrix(e){let t=this.engine.createVector3(),i=this.engine.createQuaternion(),r=this.engine.createVector3();e.decompose(t,i,r),this._object.position.copy(t),this._object.quaternion.copy(i),this._object.scale.copy(r),this._object.updateMatrix(),this._object.updateMatrixWorld()}applyWorldTransform(e,t,i){this._object.position.copy(e),this._object.quaternion.copy(t),this._object.scale.copy(i),this._object.updateMatrix(),this._object.updateMatrixWorld()}set quaternion(e){this._quaternion.copy(e),this._object.quaternion.copy(this._quaternion),this._object.updateMatrixWorld()}set position(e){this._object.position.copy(e)}set scale(e){this._object.scale.copy(e)}set rotation(e){this._object.rotation.copy(e)}set opacity(e){let t=this._object;t.material&&"opacity"in t.material&&(t.material.opacity=e)}set metalness(e){let t=this._object;t.material&&"metalness"in t.material&&(t.material.metalness=e)}set roughness(e){let t=this._object;t.material&&"roughness"in t.material&&(t.material.roughness=e)}set texture(e){this._texture=e,this._object.isMesh&&e?.applyTexture&&e.applyTexture(this._object)}set material(e){this._material=e}set geometry(e){this._geometry=e}updateBoundingBox(){this._bbox.setFromObject(this._object),this._bbox.getSize(this._originalSize)}destroy(){this.disposeObjectResources(this._object),this._texture?.dispose?.(),this._material?.dispose(),this._geometry?.dispose(),this._subtreeCache=null}getFlatObjects(){if(this._flatObjectsCache)return this._flatObjectsCache;let e=[],t=i=>{e.push(i.object),i.children.forEach(r=>t(r))};return t(this),this._flatObjectsCache=e,e}getSubtreeObjects(){if(this._subtreeCache)return this._subtreeCache;let e=[],t=this._object;return e.push(this._object),typeof t.traverse=="function"&&t.traverse(i=>{i&&i!==this._object&&e.push(i)}),this._subtreeCache=e,e}invalidateFlatCache(){this._flatObjectsCache=null}invalidateSubtreeCache(){this._subtreeCache=null}disposeObjectResources(e){let t=e;t?.geometry?.dispose&&t.geometry.dispose();let i=t?.material;Array.isArray(i)?i.forEach(r=>r?.dispose?.()):i?.dispose&&i.dispose(),typeof t?.traverse=="function"&&t.traverse(r=>{r?.geometry?.dispose&&r.geometry.dispose();let n=r?.material;Array.isArray(n)?n.forEach(s=>s?.dispose?.()):n?.dispose&&n.dispose()})}};var Se=class{constructor(e){this.styleMap=e.computedStyleMap?.(),this.style=getComputedStyle(e)}readNumber(e,t){let i=this.styleMap?.get?.(e);if(i!=null){let n=typeof i=="object"?i.value:i,s=typeof n=="number"?n:Number.parseFloat(n);if(!Number.isNaN(s))return s}let r=Number.parseFloat(this.style.getPropertyValue(e));return Number.isNaN(r)?t:r}readString(e,t=""){let i=this.styleMap?.get?.(e),r=i&&typeof i=="object"?i.value:i;if(typeof r=="string")return this.stripQuotes(r.trim())||t;let n=this.style.getPropertyValue(e).trim();return this.stripQuotes(n)||t}stripQuotes(e){return e.startsWith("'")&&e.endsWith("'")||e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e}readBoolean(e,t=!1){let i=this.readString(e,"");if(!i)return t;let r=i.toLowerCase();return r==="true"||r==="1"||r==="yes"?!0:r==="false"||r==="0"||r==="no"?!1:t}};function he(d,e,t){let r=d.computedStyleMap?.()?.get?.(e);if(r!==void 0){if(typeof r=="number")return r;if(typeof r=="string"){let a=Number.parseFloat(r);if(!Number.isNaN(a))return a}if(r&&typeof r=="object"){let a=r.value;if(typeof a=="number")return a;if(typeof a=="string"){let l=Number.parseFloat(a);if(!Number.isNaN(l))return l}}}let s=getComputedStyle(d).getPropertyValue(e),o=Number.parseFloat(s);return Number.isNaN(o)?t:o}function Xe(d){return d.startsWith("'")&&d.endsWith("'")||d.startsWith('"')&&d.endsWith('"')?d.slice(1,-1):d}function Ce(d,e,t=""){let r=d.computedStyleMap?.()?.get?.(e);if(typeof r=="string")return Xe(r.trim());if(r&&typeof r=="object"){let o=r.value;if(typeof o=="string")return Xe(o.trim())}let n=getComputedStyle(d).getPropertyValue(e);return(n?Xe(n.trim()):"")||t}function ze(d,e,t=!1){let i=Ce(d,e,"");if(!i)return t;let r=i.toLowerCase().trim();return r==="true"||r==="1"||r==="yes"?!0:r==="false"||r==="0"||r==="no"?!1:t}function st(d){let e=d.computedStyleMap?.(),t="",i=e?.get?.("--filter");if(i!==void 0){if(typeof i=="string")t=i;else if(i&&typeof i=="object"){let r=i.value;typeof r=="string"&&(t=r)}}return t||(t=getComputedStyle(d).getPropertyValue("--filter")||""),t=t.trim(),t}var re=class{static register(e){let t=e.name.trim().toLowerCase();if(!t)throw new Error("[String3D] Custom material name is required.");this.materials.set(t,{...e,name:t}),this.registerCssVarsForMaterial(e)}static registerCssVarsForMaterial(e){let t=globalThis.CSS;if(!t?.registerProperty)return;let i=e.uniforms||{};for(let r of Object.values(i)){let n=r.css?.trim();if(!n||!n.startsWith("--")||this.registeredCssVars.has(n))continue;let s=this.resolveCssSyntax(r.type);try{t.registerProperty({name:n,syntax:s,inherits:!1,initialValue:this.defaultCssInitialValue(r)}),this.registeredCssVars.add(n)}catch{}}}static resolveCssSyntax(e){switch(e){case"color":return"<color>";case"float":case"int":return"<number>";default:return"*"}}static defaultCssInitialValue(e){return e.type==="color"?typeof e.value=="string"?e.value:"#000000":e.type==="float"||e.type==="int"?typeof e.value=="number"?String(e.value):"0":"initial"}static get(e){return this.materials.get(e.trim().toLowerCase())}static has(e){return this.materials.has(e.trim().toLowerCase())}static list(){return Array.from(this.materials.values())}static unregister(e){return this.materials.delete(e.trim().toLowerCase())}};re.materials=new Map,re.registeredCssVars=new Set;function ot(d,e){if(e==null||e===""||e==="none")return d.value;let t=e.trim();switch(d.type){case"float":case"int":{let i=parseFloat(t);return isNaN(i)?d.value:i}case"vec2":{let i=t.split(/[\s,]+/).map(r=>parseFloat(r.trim()));return i.length>=2&&i.every(r=>!isNaN(r))?[i[0],i[1]]:d.value}case"vec3":{let i=t.split(/[\s,]+/).map(r=>parseFloat(r.trim()));return i.length>=3&&i.every(r=>!isNaN(r))?[i[0],i[1],i[2]]:d.value}case"vec4":{let i=t.split(/[\s,]+/).map(r=>parseFloat(r.trim()));return i.length>=4&&i.every(r=>!isNaN(r))?[i[0],i[1],i[2],i[3]]:d.value}case"color":return vt(t)??d.value;case"texture":{let i=t.match(/url\(['"]?(.*?)['"]?\)/);return i?i[1]:t||d.value}default:return d.value}}function vt(d){if(d.startsWith("#")){let t=d.slice(1);if(t.length===3){let i=parseInt(t[0]+t[0],16)/255,r=parseInt(t[1]+t[1],16)/255,n=parseInt(t[2]+t[2],16)/255;return[i,r,n]}if(t.length===6){let i=parseInt(t.slice(0,2),16)/255,r=parseInt(t.slice(2,4),16)/255,n=parseInt(t.slice(4,6),16)/255;return[i,r,n]}}let e=d.match(/rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);return e?[parseInt(e[1])/255,parseInt(e[2])/255,parseInt(e[3])/255]:null}function qe(d,e,t){let i={};if(d.parse){let r=d.parse(e,t);Object.assign(i,r)}if(d.uniforms)for(let[r,n]of Object.entries(d.uniforms))if(n.css){let s=t.getPropertyValue(n.css).trim();i[r]=ot(n,s)}else r in i||(i[r]=n.value);return i}function Ke(d){let e=new Map;for(let i of d){let r=e.get(i.point)||[];r.push(i),e.set(i.point,r)}let t=new Map;for(let[i,r]of e){let n=r.sort((s,o)=>(s.order??0)-(o.order??0));t.set(i,n.map(s=>s.code).join(`
2
+ `))}return t}var Ie=class{constructor(e,t={}){this._objects=new Map;this._rootObjects=[];this._elementMap=new Map;this._materialInstances=new Map;this._modelLoaderCache=new Map;this.engine=e,this.customMaterialRegistry=this.engine.getCustomMaterialRegistry?.()||re,this._modelLoader=t.modelLoader,this._modelLoaderFactory=t.modelLoaderFactory,this._scene=e.createScene()}get rootObjects(){return this._rootObjects}setSynchronizer(e){this._synchronizer=e}getScene(){return this._scene}getObject(e){return this._objects.get(e)}getObjectForElement(e){for(let[t,i]of this._elementMap)if(i===e)return this._objects.get(t)}getAllObjects(){let e=[],t=i=>{e.push(i),i.children.forEach(r=>t(r))};return this._rootObjects.forEach(i=>t(i)),e}hasObject(e){return this._objects.has(e)}deleteObject(e){let t=this._objects.get(e);if(t){let i=this._elementMap.get(e);return i&&this._synchronizer&&this._synchronizer.cleanupElement(i,t),this._scene.remove(t.object),this._objects.delete(e),this._elementMap.delete(e),this._rootObjects=this._rootObjects.filter(r=>r!==t),t.destroy(),!0}return!1}createFromElement(e){let t=e.getProperty("3d");if(!t)return;let i=e.htmlElement;if(!i)return;let r=n=>{if(n){let s=e.getProperty("parentId");s==null?(this._scene.add(n.object),this._rootObjects.push(n)):this._objects.get(s)?.addChild(n),this._objects.set(e.id,n),this._elementMap.set(e.id,i),n.el=i}};try{switch(t){case"group":this.createGroup(e,r);break;case"pointLight":this.createLight(e,"point",r);break;case"ambientLight":this.createLight(e,"ambient",r);break;case"directionalLight":this.createLight(e,"directional",r);break;case"spotLight":this.createLight(e,"spot",r);break;case"hemisphereLight":this.createLight(e,"hemisphere",r);break;case"model":this.createModel(e,r);break;case"box":this.createBox(e,r);break;case"sphere":this.createSphere(e,r);break;case"plane":this.createPlane(e,r);break;case"cylinder":this.createCylinder(e,r);break;case"particles":this.createParticles(e,r);break;case"text":this.createText(e,r);break;default:break}}catch{}}createGroup(e,t){let i=this.engine.createGroup(),r=new Q(e.id,"group",i,this.engine);return t(r),r}createLight(e,t,i){let r=e.htmlElement,n=r?Ce(r,"--light-color","#ffffff"):"#ffffff",s=n&&n!=="none"?n:"#ffffff",o=r?he(r,"--light-intensity",1):1,a;if(t==="point"){let c=r?he(r,"--light-distance",1e3):1e3,u=r?he(r,"--light-decay",0):0;a=this.engine.createPointLight(s,o,c,u)}else if(t==="directional")a=this.engine.createDirectionalLight(s,o);else if(t==="spot"){let c=r?he(r,"--light-distance",0):0,u=r?he(r,"--light-angle",Math.PI/3):Math.PI/3,m=r?he(r,"--light-penumbra",0):0,p=r?he(r,"--light-decay",1):1;a=this.engine.createSpotLight(s,o,c,u,m,p)}else if(t==="hemisphere"){let c=r?Ce(r,"--light-ground-color","#ffffff"):"#ffffff",u=c&&c!=="none"?c:"#ffffff";a=this.engine.createHemisphereLight(s,u,o)}else a=this.engine.createAmbientLight(s,o);if((r?ze(r,"--shadow-cast",!1):!1)&&a.shadow){a.castShadow=!0;let c=r?he(r,"--shadow-bias",0):0,u=r?he(r,"--shadow-map-size",512):512;a.shadow.bias=c,a.shadow.mapSize.width=u,a.shadow.mapSize.height=u}let h=new Q(e.id,t+"Light",a,this.engine);return i(h),h}applyShadowProps(e,t){let i=e.htmlElement,r=i?ze(i,"--shadow-cast",!1):!1,n=i?ze(i,"--shadow-receive",!1):!1;t.castShadow=r,t.receiveShadow=n}createBox(e,t){let i=this.engine.createBoxGeometry(1,1,1),r=this.createMaterialFromObject(e),n=this.engine.createMesh(i,r);this.applyShadowProps(e,n);let s=new Q(e.id,"box",n,this.engine,{geometry:i,material:r});return t(s),s}createSphere(e,t){let i=this.getGeometryQuality(e.htmlElement),r=Math.max(3,Math.round(32*i)),n=Math.max(2,Math.round(32*i)),s=this.engine.createSphereGeometry(.5,r,n),o=this.createMaterialFromObject(e),a=this.engine.createMesh(s,o);this.applyShadowProps(e,a);let l=new Q(e.id,"sphere",a,this.engine,{geometry:s,material:o});return t(l),l}createPlane(e,t){let i=this.engine.createPlaneGeometry(1,1),r=this.createMaterialFromObject(e),n=this.engine.createMesh(i,r);this.applyShadowProps(e,n);let s=new Q(e.id,"plane",n,this.engine,{geometry:i,material:r});return t(s),s}createCylinder(e,t){let i=this.getGeometryQuality(e.htmlElement),r=Math.max(3,Math.round(32*i)),n=this.engine.createCylinderGeometry(.5,.5,1,r),s=this.createMaterialFromObject(e),o=this.engine.createMesh(n,s);this.applyShadowProps(e,o);let a=new Q(e.id,"cylinder",o,this.engine,{geometry:n,material:s});return t(a),a}createModel(e,t){let i=e.getProperty("3d-model");if(!i)return;let r=e.getProperty("3d-model-loader")||void 0,n=this.resolveModelLoader(r);if(!n)return;let s=e.htmlElement;if(s){let a=this.parseModelLoaderOptions(s);a&&this.engine.configureModelLoader?.(n,a)}let o=e.getProperty("3d-model-center")??!1;n.load(i,a=>{let l=this.engine.resolveLoadedModelRoot?.(a)||(a&&typeof a=="object"?a:null);if(!l)return;let h=s&&this.shouldOverrideModelMaterial(s)?this.createMaterialFromElement(s,e):null;this.engine.forEachMesh(l,u=>{h&&(u.material=h),this.applyShadowProps(e,u)}),o&&this.centerObject(l);let c=new Q(e.id,"model",l,this.engine);t(c)},void 0,void 0)}createParticles(e,t){if(!this.engine.createParticleSystem)return;let i=e.htmlElement,r={mode:"emitter",count:300,size:2,color:"#ffffff",opacity:1,spread:120,spreadX:0,spreadY:0,seed:1,emitRate:30,emitBurst:0,particleLife:2.5,particleSpeed:40,particleDirection:[0,1,0],particleGravity:[0,-30,0],particleDrag:.1,particleSizeVariation:.6,particleColorVariation:.2,particleShape:"sphere",particleModelUrl:"",particleModelLoader:"",particleModelNode:"",instanceShape:"sphere",instanceModelUrl:"",instanceModelLoader:"",instanceModelNode:"",instanceScale:1,instanceScaleVariation:.5,instanceRotationSpeed:.4,instanceJitter:.2,instanceFlow:.3,instanceDisperse:0,instanceDisperseScatter:0,instanceDisperseScatterX:0,instanceDisperseScatterY:0,instanceDisperseScatterZ:0,modelTransitionDuration:0},n=this.engine.createParticleSystem(r),s=new Q(e.id,"particles",n,this.engine);t(s)}createText(e,t){if(!this.engine.createTextGeometry)return;let i=this.engine.createBoxGeometry(1,1,1),r=this.createMaterialFromObject(e),n=this.engine.createMesh(i,r);this.applyShadowProps(e,n);let s=this.engine.createGroup();s.add(n);let o=new Q(e.id,"text",s,this.engine,{geometry:i,material:r});t(o)}getGeometryQuality(e){if(!e)return 1;let t=he(e,"--geometry-quality",1);return!Number.isFinite(t)||t<=0?1:t}resolveModelLoader(e){if(e){if(this._modelLoaderCache.has(e))return this._modelLoaderCache.get(e);if(!this._modelLoaderFactory)return;let t=this._modelLoaderFactory(this.engine,e);return this._modelLoaderCache.set(e,t),t}if(this._modelLoader)return this._modelLoader;if(this._modelLoaderFactory)return this._modelLoaderFactory(this.engine)}centerObject(e){if(!e)return;let t=this.engine.computeBoundingBoxRecursively(e),i=this.getBoxCenter(t);e.position?.set&&e.position.set(-i.x,-i.y,-i.z),e.updateMatrixWorld(!0)}getBoxCenter(e){let t=this.engine.createVector3();return t.x=(e.min.x+e.max.x)/2,t.y=(e.min.y+e.max.y)/2,t.z=(e.min.z+e.max.z)/2,t}createMaterialFromObject(e){return this.createMaterialFromElement(e.htmlElement,e)}createMaterialFromElement(e,t){let i=e?getComputedStyle(e):null,r=M=>i?i.getPropertyValue(M).trim():"",n=(M,w,L)=>{let _=r(M);return _&&_!=="none"&&_!==""?w(_):L},s=M=>parseFloat(M),o=M=>M,a=M=>{let w=M.match(/url\(['"]?(.*?)['"]?\)/);return w?w[1]:M},l=n("--material-type",M=>M.split("[")[0]||"basic","basic"),h=this.tryCreateCustomMaterial(l,e,i,t);if(h)return h;let c=n("--material-color",o,"#ffffff"),u=n("--opacity",s,1),m=n("--material-metalness",s,0),p=n("--material-roughness",s,1),f=n("--material-emissive",o,"#000000"),g={color:c,transparent:u<1,opacity:u},D=n("--texture-map",a,""),v=n("--texture-normal",a,""),y=n("--texture-roughness",a,""),S=n("--texture-metalness",a,""),P=n("--texture-ao",a,""),T=this.parseFlipY(e),F=e?Ce(e,"--texture-color-space",""):"",O=!!(D||v||y||S||P),x=l;return x!=="standard"&&O&&(x="standard"),x==="standard"?(D&&(g.map=this.loadTexture(D,{flipY:T,colorSpace:F||"srgb"})),v&&(g.normalMap=this.loadTexture(v,{flipY:T})),y&&(g.roughnessMap=this.loadTexture(y,{flipY:T})),S&&(g.metalnessMap=this.loadTexture(S,{flipY:T})),P&&(g.aoMap=this.loadTexture(P,{flipY:T})),g.metalness=m,g.roughness=p,g.emissive=f,this.engine.createMeshStandardMaterial(g)):this.engine.createMeshBasicMaterial(g)}tryCreateCustomMaterial(e,t,i,r){let n=this.customMaterialRegistry.get(e);if(!n)return null;let s=this.engine.getMaterialFactory?.();if(!s||!s.supports(n))return null;let o={};t&&i&&(o=s.parseUniformsFromCSS(n,t,i));let a=s.create(n,o);return r&&this._materialInstances.set(r.id,a),a.material}updateMaterialUniforms(e,t){let i=this._materialInstances.get(e);i&&i.update(t)}getMaterialInstance(e){return this._materialInstances.get(e)}recreateMaterialForObject(e,t){let i=this._materialInstances.get(e.id);i&&i.dispose&&i.dispose(),this._materialInstances.delete(e.id);let r;for(let[s,o]of this._elementMap)if(s===e.id&&o===t){r=o.__stringObject||o.stringObject;break}let n=this.createMaterialFromElement(t,r);this.engine.forEachMesh(e.object,s=>{let o=s.material;Array.isArray(o)?o.forEach(a=>a?.dispose?.()):o?.dispose?.(),s.material=n}),e.material=n}loadTexture(e,t={}){let r=this.engine.createTextureLoader().load(e);typeof t.flipY=="boolean"&&(r.flipY=t.flipY);let n=(t.colorSpace||"").toLowerCase().trim();return n&&"colorSpace"in r&&(r.colorSpace=n==="srgb"?"srgb":"linear"),r.needsUpdate=!0,r}parseFlipY(e){let t=e?Ce(e,"--texture-flip-y",""):"";if(t==null||t==="")return;if(typeof t=="boolean")return t;let i=String(t).toLowerCase().trim();if(i==="false"||i==="0"||i==="no")return!1;if(i==="true"||i==="1"||i==="yes")return!0}shouldOverrideModelMaterial(e){let t=getComputedStyle(e),i=n=>{let s=t.getPropertyValue(n);return s&&s!=="0"&&s!=="none"&&s!==""};return i("--material-color")||i("--texture-map")?!0:["--material-type","--material-metalness","--material-roughness","--material-emissive","--opacity","--texture-normal","--texture-roughness","--texture-metalness","--texture-ao"].some(n=>i(n))}parseModelLoaderOptions(e){let t=(e.getAttribute("string-3d-model-texture-base")||"").trim(),i=e.getAttribute("string-3d-model-textures"),r={};if(t&&(r.textureBaseUrl=t.replace(/\/?$/,"/")),i)try{let n=JSON.parse(i);n&&typeof n=="object"&&(r.textureMap=n)}catch{}return r.textureBaseUrl||r.textureMap?r:null}destroy(){this._materialInstances.forEach(e=>e.dispose()),this._materialInstances.clear(),this._objects.forEach(e=>e.destroy()),this._objects.clear(),this._rootObjects=[]}};var J=class{constructor(){this.cache=new WeakMap;this.meta=new WeakMap}get(e,t,i){let r=!!t.dirtySet&&t.dirtySet.has(e);if(!!t.dirtySet&&t.forceSync===!1&&!r){let l=this.cache.get(e);if(l)return l}let s=performance.now(),o=Math.max(0,t.styleReadIntervalMs??0);if(o>0&&!r){let l=this.meta.get(e),h=this.cache.get(e);if(l&&h&&s-l.time<o)return h}let a=i(e);return this.cache.set(e,a),this.meta.set(e,{time:s}),a}clear(){this.cache=new WeakMap,this.meta=new WeakMap}invalidate(e){this.cache.delete(e),this.meta.delete(e)}};var Qe=Math.PI/180,Be=class Be{sync(e,t,i,r){let n=e.__layoutCache,s=n?n.rect:e.getBoundingClientRect(),o=this.readStyleBundle(e,i),a=s.left+s.width*.5,l=s.top+s.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set(a-i.viewportWidth/2,-(l-i.viewportHeight/2),o.translateZ);else{let h=i.camera.getFrustumSizeAt(o.translateZ),c=a/i.viewportWidth,u=l/i.viewportHeight;t.object.position.set((c-.5)*h.width,-(u-.5)*h.height,o.translateZ)}return t.object.scale.set(o.scale,o.scale,o.scale),t.object.rotation.x=-o.rotateX*Qe,t.object.rotation.y=o.rotateY*Qe,t.object.rotation.z=-o.rotateZ*Qe,t.object.rotation.order="XYZ",t.object.updateMatrixWorld(!0),{scale:o.scale}}readStyleBundle(e,t){return Be.styleCache.get(e,t,i=>{let r=new Se(i);return{translateZ:r.readNumber("--translate-z",0),scale:r.readNumber("--scale",1),rotateX:r.readNumber("--rotate-x",0),rotateY:r.readNumber("--rotate-y",0),rotateZ:r.readNumber("--rotate-z",0)}})}};Be.styleCache=new J;var Ve=Be;var _e=class _e{sync(e,t,i,r){let n=e.__layoutCache,s=n?n.rect:e.getBoundingClientRect(),o=this.readStyleBundle(e,i,t),a=this.resolveScreenAnchor(s,i),l=a.fallbackToViewportCenter?o.translateX:0,h=a.fallbackToViewportCenter?o.translateY:0;if(i.camera.getMode()==="orthographic")this.setObjectPosition(i,t.object,a.x-i.viewportWidth/2+l,-(a.y-i.viewportHeight/2)+h,o.translateZ);else{let u=i.camera.getFrustumSizeAt(o.translateZ),m=a.x/i.viewportWidth,p=a.y/i.viewportHeight;this.setObjectPosition(i,t.object,(m-.5)*u.width+l,-(p-.5)*u.height+h,o.translateZ)}let c=t.object;if(o.color&&o.color!=="none"&&c.color&&typeof c.color.set=="function"&&c.color.set(o.color),c.intensity=o.intensity,typeof c.distance<"u"&&o.distance!==void 0&&(c.distance=o.distance),typeof c.decay<"u"&&o.decay!==void 0&&(c.decay=o.decay),typeof c.angle<"u"&&o.angle!==void 0&&(c.angle=o.angle),typeof c.penumbra<"u"&&o.penumbra!==void 0&&(c.penumbra=o.penumbra),o.groundColor&&o.groundColor!=="none"&&c.groundColor&&typeof c.groundColor.set=="function"&&c.groundColor.set(o.groundColor),c.castShadow!==o.castShadow&&(c.castShadow=o.castShadow),o.castShadow&&c.shadow&&(o.shadowBias!==void 0&&(c.shadow.bias=o.shadowBias),o.shadowMapSize!==void 0&&c.shadow.mapSize.width!==o.shadowMapSize&&(c.shadow.mapSize.width=o.shadowMapSize,c.shadow.mapSize.height=o.shadowMapSize)),o.targetId&&o.targetId!=="none"&&c.target){let u=document.querySelector(`[string-id="${o.targetId}"]`);if(u){let m=u.__layoutCache,p=m?m.rect:u.getBoundingClientRect(),f=new Se(u),g=f.readNumber("--translate-x",0),D=f.readNumber("--translate-y",0),v=f.readNumber("--translate-z",0),y=this.resolveScreenAnchor(p,i),S=y.fallbackToViewportCenter?g:0,P=y.fallbackToViewportCenter?D:0,T,F,O;if(i.camera.getMode()==="orthographic")T=y.x-i.viewportWidth/2+S,F=-(y.y-i.viewportHeight/2)+P,O=v;else{let x=i.camera.getFrustumSizeAt(v),M=y.x/i.viewportWidth,w=y.y/i.viewportHeight;T=(M-.5)*x.width+S,F=-(w-.5)*x.height+P,O=v}o.targetOffset&&(T+=o.targetOffset.x,F+=o.targetOffset.y,O+=o.targetOffset.z),this.setObjectPosition(i,c.target,T,F,O),c.target.updateMatrixWorld(!0)}}return null}readStyleBundle(e,t,i){return _e.styleCache.get(e,t,r=>{let n=new Se(r),s=i.object,o={translateZ:n.readNumber("--translate-z",0),translateX:n.readNumber("--translate-x",0),translateY:n.readNumber("--translate-y",0),color:n.readString("--light-color","")||void 0,intensity:n.readNumber("--light-intensity",s.intensity??1),castShadow:n.readBoolean("--shadow-cast",!1)};typeof s.distance<"u"&&(o.distance=n.readNumber("--light-distance",s.distance??0)),typeof s.decay<"u"&&(o.decay=n.readNumber("--light-decay",s.decay??1)),typeof s.angle<"u"&&(o.angle=n.readNumber("--light-angle",s.angle??Math.PI/3)),typeof s.penumbra<"u"&&(o.penumbra=n.readNumber("--light-penumbra",s.penumbra??0));let a=n.readString("--light-ground-color","");a&&(o.groundColor=a),o.castShadow&&s.shadow&&(o.shadowBias=n.readNumber("--shadow-bias",s.shadow.bias??0),o.shadowMapSize=n.readNumber("--shadow-map-size",s.shadow.mapSize.width??512));let l=n.readString("--light-target","").trim();l&&(o.targetId=l);let h=n.readString("--light-target-offset","").trim();if(h){let c=this.parseTargetOffset(h);c&&(o.targetOffset=c)}return o})}parseTargetOffset(e){let t=e.split(/[\s,]+/).map(i=>i.trim()).filter(Boolean).map(i=>Number.parseFloat(i));return t.length<3||t.some(i=>Number.isNaN(i))?null:{x:t[0],y:t[1],z:t[2]}}resolveScreenAnchor(e,t){return e.width>1&&e.height>1?{x:e.left+e.width*.5,y:e.top+e.height*.5,fallbackToViewportCenter:!1}:{x:t.viewportWidth*.5,y:t.viewportHeight*.5,fallbackToViewportCenter:!0}}setObjectPosition(e,t,i,r,n){if(!e.engine.setObjectPosition?.(t,i,r,n)){if(t?.position?.set&&typeof t.position.set=="function"){t.position.set(i,r,n);return}if(typeof t?.setPosition=="function"){t.setPosition(i,r,n);return}t?.position&&(t.position.x=i,t.position.y=r,t.position.z=n)}}};_e.styleCache=new J;var De=_e;var Je=Math.PI/180;function ct(d){let e=(d||"").trim().toLowerCase();if(!e)return null;if(/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.test(e)){let i=e.length===4?`#${e[1]}${e[1]}${e[2]}${e[2]}${e[3]}${e[3]}`:e,r=Number.parseInt(i.slice(1,3),16)/255,n=Number.parseInt(i.slice(3,5),16)/255,s=Number.parseInt(i.slice(5,7),16)/255;return{r,g:n,b:s}}let t=e.match(/rgba?\(([^)]+)\)/i);if(t){let i=t[1].replace(/\//g," ").split(/[\s,]+/).map(r=>Number.parseFloat(r.trim())).filter(r=>Number.isFinite(r));if(i.length>=3)return{r:i[0]/255,g:i[1]/255,b:i[2]/255}}return e==="black"?{r:0,g:0,b:0}:e==="white"?{r:1,g:1,b:1}:null}function St(d){let e=(d||"").trim().toLowerCase();if(!e)return!1;if(e==="black"||e==="#000"||e==="#000000")return!0;let t=ct(e);return t?t.r===0&&t.g===0&&t.b===0:!1}function lt(d,e){if(!d)return!1;if(typeof d.set=="function")try{return d.set(e),!0}catch{}let t=ct(e);return t?typeof d.setRGB=="function"?(d.setRGB(t.r,t.g,t.b),!0):"r"in d&&"g"in d&&"b"in d?(d.r=t.r,d.g=t.g,d.b=t.b,!0):!1:!1}var B=class B{static resolveEmissiveValue(e,t){return!t||t==="none"?void 0:e.style.getPropertyValue("--material-emissive").trim()?t:St(t)?void 0:t}static applyVisualProps(e,t,i,r){let n=B.lastVisualProps.get(t);if(n){if(n.opacity===r.opacity&&n.color===r.color&&n.metalness===r.metalness&&n.roughness===r.roughness&&n.emissive===r.emissive&&n.castShadow===r.castShadow&&n.receiveShadow===r.receiveShadow)return;n.opacity=r.opacity,n.color=r.color,n.metalness=r.metalness,n.roughness=r.roughness,n.emissive=r.emissive,n.castShadow=r.castShadow,n.receiveShadow=r.receiveShadow}else B.lastVisualProps.set(t,{opacity:r.opacity,color:r.color,metalness:r.metalness,roughness:r.roughness,emissive:r.emissive,castShadow:r.castShadow,receiveShadow:r.receiveShadow});let s=r.castShadow??!1,o=r.receiveShadow??!1,a=typeof r.opacity=="number"?r.opacity:NaN,l={opacity:Number.isFinite(a)?a:void 0,color:r.color,metalness:Number.isFinite(r.metalness)?r.metalness:void 0,roughness:Number.isFinite(r.roughness)?r.roughness:void 0,emissive:r.emissive},h=c=>{c&&(i.applyMaterialProps?.(c,l)||(isNaN(a)||(c.opacity=a,c.transparent=a<1),r.color&&c.color&&lt(c.color,r.color),typeof r.metalness=="number"&&"metalness"in c&&(c.metalness=r.metalness),typeof r.roughness=="number"&&"roughness"in c&&(c.roughness=r.roughness),r.emissive&&c.emissive&&lt(c.emissive,r.emissive)))};i.forEachMesh(t.object,c=>{c.castShadow!==s&&(c.castShadow=s),c.receiveShadow!==o&&(c.receiveShadow=o),(Array.isArray(c.material)?c.material:[c.material]).forEach(h)})}sync(e,t,i,r){let{rect:n,width:s,height:o}=this.readLayout(e,i),a=this.readStyleBundle(e,i),{translateZ:l,cssScale:h,rotateX:c,rotateY:u,rotateZ:m,cssScaleZ:p,opacity:f,color:g,metalness:D,roughness:v,emissive:y,castShadow:S,receiveShadow:P,geometryQuality:T}=a,F=n.left+n.width*.5,O=n.top+n.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set(F-i.viewportWidth/2,-(O-i.viewportHeight/2),l);else{let W=i.camera.getFrustumSizeAt(l),A=F/i.viewportWidth,C=O/i.viewportHeight;t.object.position.set((A-.5)*W.width,-(C-.5)*W.height,l)}t.object.rotation.x=-c*Je,t.object.rotation.y=u*Je,t.object.rotation.z=-m*Je,t.object.rotation.order="XYZ";let x=s*h,M=o*h,w=r?.scale||1,L=p*w,_=x<M?x:M,k,H,$;switch(t.type){case"box":case"sphere":{let W=_*w;k=H=W,$=W*p;break}case"model":{let W=t.getOriginalBoundingBox();B.tempVector3||(B.tempVector3=i.engine.createVector3());let A=W.getSize(B.tempVector3),C=e.getAttribute("string-3d-model-fit"),b=parseFloat(e.getAttribute("string-3d-model-scale")||"1"),j=Number.isFinite(b)?b*w:w;if(A.x>0&&A.y>0){let z=x/A.x,I=M/A.y,V=(C==="cover"?z>I?z:I:z<I?z:I)*j;k=H=V,$=V*p}else{let z=_*j;k=H=z,$=z*p}break}case"cylinder":k=x*w,H=M*w,$=x*L;break;default:k=x*w,H=M*w,$=_*.5*L;break}return t.object.scale.set(k,H,$),B.applyVisualProps(e,t,i.engine,{opacity:f,color:g&&g!=="none"?g:void 0,metalness:isNaN(D)?void 0:D,roughness:isNaN(v)?void 0:v,emissive:B.resolveEmissiveValue(e,y),castShadow:S,receiveShadow:P}),this.applyGeometryQuality(t,T,i),this.updateCustomUniforms(e,t,i),{scale:h*w}}applyGeometryQuality(e,t,i){let r=i.engine.simplifyGeometry?.bind(i.engine);if(typeof r!="function")return;let n=Number.isFinite(t)&&t>0?t:1,s=B.lastGeometryQuality.get(e);if(typeof s=="number"&&Math.abs(s-n)<.001)return;B.lastGeometryQuality.set(e,n);let o=a=>{if(!a?.geometry)return;B.originalGeometryByMesh.has(a)||B.originalGeometryByMesh.set(a,a.geometry);let l=B.originalGeometryByMesh.get(a);if(n>=.999){a.geometry=l;return}B.lodGeometryCacheByMesh.has(a)||B.lodGeometryCacheByMesh.set(a,new Map);let h=B.lodGeometryCacheByMesh.get(a),c=n.toFixed(3);if(h.has(c)){a.geometry=h.get(c);return}let u=r(l,n);u&&(h.set(c,u),a.geometry=u)};i.engine.forEachMesh(e.object,o)}updateCustomUniforms(e,t,i){let r=i.engine.getMaterialFactory?.();if(!r)return;let n=getComputedStyle(e),s=o=>{let a=r.getMaterialDefinition?.(o)??o?.userData?.definition;if(!a?.uniforms)return;let l=r.parseUniformsFromCSS(a,e,n);if(typeof r.applyUniforms=="function"){r.applyUniforms(o,a,l);return}for(let[h,c]of Object.entries(l)){let u=a.uniforms?.[h];if(!u)continue;let m=r.convertUniformValue?.bind(r),p=m?m(u.type,c):c;o.uniforms?.[h]&&(o.uniforms[h].value=p)}};i.engine.forEachMaterial(t.object,s)}readStyleBundle(e,t){return B.styleCache.get(e,t,i=>{let r=i.computedStyleMap?.(),n=getComputedStyle(i),s=(l,h)=>{let c=r?.get?.(l);if(c!=null){let m=typeof c=="object"&&"value"in c?c.value:c,p=typeof m=="number"?m:Number.parseFloat(String(m));if(!Number.isNaN(p))return p}let u=Number.parseFloat(n.getPropertyValue(l));return Number.isNaN(u)?h:u},o=l=>{let h=r?.get?.(l),c=h&&typeof h=="object"&&"value"in h?h.value:h;return typeof c=="string"?c.trim()||void 0:n.getPropertyValue(l).trim()||void 0},a=(l,h=!1)=>{let c=o(l);if(!c)return h;let u=c.toLowerCase();return u==="true"||u==="1"||u==="yes"?!0:u==="false"||u==="0"||u==="no"?!1:h};return{translateZ:s("--translate-z",0),cssScale:s("--scale",1),rotateX:s("--rotate-x",0),rotateY:s("--rotate-y",0),rotateZ:s("--rotate-z",0),cssScaleZ:s("--scale-z",1),opacity:s("--opacity",NaN),color:o("--material-color"),metalness:s("--material-metalness",NaN),roughness:s("--material-roughness",NaN),emissive:o("--material-emissive"),castShadow:a("--shadow-cast",!1),receiveShadow:a("--shadow-receive",!1),geometryQuality:s("--geometry-quality",1)}})}readLayout(e,t){let i=e.__layoutCache;return i||B.layoutCache.get(e,t,r=>{let n=r.getBoundingClientRect(),s=r.offsetWidth||n.width,o=r.offsetHeight||n.height;return{rect:n,width:s,height:o}})}};B.styleCache=new J,B.layoutCache=new J,B.tempVector3=null,B.lastVisualProps=new WeakMap,B.lastGeometryQuality=new WeakMap,B.originalGeometryByMesh=new WeakMap,B.lodGeometryCacheByMesh=new WeakMap;var me=B;var et=Math.PI/180,E={mode:"emitter",count:300,size:2,color:"#ffffff",opacity:1,spread:120,spreadX:120,spreadY:120,seed:1,emitRate:30,emitBurst:0,particleLife:2.5,particleSpeed:40,particleDirection:[0,1,0],particleGravity:[0,-30,0],particleDrag:.1,particleSizeVariation:.6,particleColorVariation:.2,particleShape:"sphere",particleModelUrl:"",particleModelLoader:"",particleModelNode:"",instanceShape:"sphere",instanceModelUrl:"",instanceModelLoader:"",instanceModelNode:"",instanceScale:1,instanceScaleVariation:.5,instanceRotationSpeed:.4,instanceJitter:.2,instanceFlow:.3,instanceDisperse:0,instanceDisperseScatter:0,instanceDisperseScatterX:0,instanceDisperseScatterY:0,instanceDisperseScatterZ:0,modelTransitionDuration:0},U=class U{sync(e,t,i,r){let n=e.__layoutCache,s=n?n.rect:e.getBoundingClientRect(),o=this.readStyleBundle(e,i),a=s.left+s.width*.5,l=s.top+s.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set(a-i.viewportWidth/2,-(l-i.viewportHeight/2),o.translateZ);else{let v=i.camera.getFrustumSizeAt(o.translateZ),y=a/i.viewportWidth,S=l/i.viewportHeight;t.object.position.set((y-.5)*v.width,-(S-.5)*v.height,o.translateZ)}let h=r?.scale??1,c=o.scale*h;t.object.scale.set(c,c,c),t.object.rotation.x=-o.rotateX*et,t.object.rotation.y=o.rotateY*et,t.object.rotation.z=-o.rotateZ*et,t.object.rotation.order="XYZ";let u=this.buildConfig(o,s,i,r),m=U.lastConfig.get(t),p=t.object;(!m||!this.isSameConfig(m,u))&&(U.lastConfig.set(t,u),p.setConfig?.(u)),this.updateMaterialOverrides(e,t,i,o),this.updateCustomUniforms(e,t,i);let f=performance.now(),g=U.lastTime.get(t)??f,D=Math.max(0,(f-g)/1e3);return U.lastTime.set(t,f),p.update?.(D),{scale:r?.scale??1}}readStyleBundle(e,t){return U.styleCache.get(e,t,i=>{let r=new Se(i),s=r.readString("--particles-mode",E.mode).toLowerCase()==="instanced"?"instanced":"emitter";return{...E,translateZ:r.readNumber("--translate-z",0),scale:r.readNumber("--scale",1),rotateX:r.readNumber("--rotate-x",0),rotateY:r.readNumber("--rotate-y",0),rotateZ:r.readNumber("--rotate-z",0),particlesFit:r.readNumber("--particles-fit",0)>.5,materialType:r.readString("--material-type","basic"),mode:s,count:r.readNumber("--particles-count",E.count),size:r.readNumber("--particles-size",E.size),color:r.readString("--particles-color",E.color),opacity:r.readNumber("--particles-opacity",E.opacity),spread:r.readNumber("--particles-spread",E.spread),seed:r.readNumber("--particles-seed",E.seed),emitRate:r.readNumber("--emit-rate",E.emitRate),emitBurst:r.readNumber("--emit-burst",E.emitBurst),particleLife:r.readNumber("--particle-life",E.particleLife),particleSpeed:r.readNumber("--particle-speed",E.particleSpeed),particleDirection:this.parseVec3(r.readString("--particle-direction","0 1 0"),E.particleDirection),particleGravity:this.parseVec3(r.readString("--particle-gravity","0 -30 0"),E.particleGravity),particleDrag:r.readNumber("--particle-drag",E.particleDrag),particleSizeVariation:r.readNumber("--particle-size-variation",E.particleSizeVariation),particleColorVariation:r.readNumber("--particle-color-variation",E.particleColorVariation),particleShape:this.parseShape(r.readString("--particles-shape",E.particleShape)),particleModelUrl:r.readString("--particles-model",E.particleModelUrl),particleModelLoader:r.readString("--particles-model-loader",E.particleModelLoader),particleModelNode:r.readString("--particles-model-node",E.particleModelNode),instanceShape:this.parseDistribution(r.readString("--instance-shape",E.instanceShape)),instanceModelUrl:r.readString("--instance-model",E.instanceModelUrl),instanceModelLoader:r.readString("--instance-model-loader",E.instanceModelLoader),instanceModelNode:r.readString("--instance-model-node",E.instanceModelNode),instanceScale:r.readNumber("--instance-scale",E.instanceScale),instanceScaleVariation:r.readNumber("--instance-scale-variation",E.instanceScaleVariation),instanceRotationSpeed:r.readNumber("--instance-rotation-speed",E.instanceRotationSpeed),instanceJitter:r.readNumber("--instance-jitter",E.instanceJitter),instanceFlow:r.readNumber("--instance-flow",E.instanceFlow),instanceDisperse:r.readNumber("--instance-disperse",E.instanceDisperse),instanceDisperseScatter:r.readNumber("--instance-scatter",E.instanceDisperseScatter),instanceDisperseScatterX:r.readNumber("--instance-scatter-x",E.instanceDisperseScatterX),instanceDisperseScatterY:r.readNumber("--instance-scatter-y",E.instanceDisperseScatterY),instanceDisperseScatterZ:r.readNumber("--instance-scatter-z",E.instanceDisperseScatterZ),modelTransitionDuration:this.getTransitionDuration(i,"--instance-model")}})}getTransitionDuration(e,t){let i=getComputedStyle(e),r=this.splitTransitionList(i.transitionProperty),n=this.splitTransitionList(i.transitionDuration),s=this.findTransitionIndex(r,t);if(s===-1){let o=this.parseTransitionShorthand(i.transition),a=o.get(t)||o.get("all");return a?a.duration:0}return this.parseTime(n[s]||n[n.length-1]||"0s")}splitTransitionList(e){let t=[],i="",r=0;for(let n=0;n<e.length;n+=1){let s=e[n];s==="("&&(r+=1),s===")"&&(r=Math.max(0,r-1)),s===","&&r===0?(t.push(i.trim()),i=""):i+=s}return i.trim()&&t.push(i.trim()),t.length>0?t:["all"]}findTransitionIndex(e,t){let i=e.map(n=>n.trim().toLowerCase()),r=i.indexOf(t);return r===-1&&(r=i.indexOf("all")),r}parseTime(e){let t=e.trim().toLowerCase();if(t.endsWith("ms")){let r=Number.parseFloat(t.slice(0,-2));return Number.isFinite(r)?r/1e3:0}if(t.endsWith("s")){let r=Number.parseFloat(t.slice(0,-1));return Number.isFinite(r)?r:0}let i=Number.parseFloat(t);return Number.isFinite(i)?i:0}parseTransitionShorthand(e){let t=new Map;return this.splitTransitionList(e).forEach(r=>{if(!r)return;let n=r.trim().split(/\s+(?![^()]*\))/g),s="",o="";n.forEach(a=>{let l=a.toLowerCase();l.endsWith("ms")||l.endsWith("s")||/^[0-9.]+$/.test(l)?o||(o=l):l.startsWith("cubic-bezier")||l.startsWith("steps")||l==="linear"||l==="ease"||l==="ease-in"||l==="ease-out"||l==="ease-in-out"||s||(s=a)}),s&&t.set(s.trim().toLowerCase(),{duration:this.parseTime(o||"0s")})}),t}parseVec3(e,t){let i=e.split(/[\s,]+/).map(r=>Number.parseFloat(r)).filter(r=>!Number.isNaN(r));return i.length>=3?[i[0],i[1],i[2]]:t}parseShape(e){let t=e.trim().toLowerCase();return t==="box"?"box":t==="model"?"model":"sphere"}parseDistribution(e){return this.parseShape(e)}buildConfig(e,t,i,r){let s=r?.scale??1,o=.5,a,l,h;return e.particlesFit?(l=this.toWorld(t.width*o,e.translateZ,i),h=this.toWorld(t.height*o,e.translateZ,i),a=Math.max(l,h)):(a=this.toWorld(e.spread,e.translateZ,i),l=a,h=a),{...e,count:Math.max(0,Math.floor(e.count)),size:Math.max(.1,e.size),opacity:Math.max(0,Math.min(1,e.opacity)),spread:Math.max(0,a*s),spreadX:Math.max(0,l*s),spreadY:Math.max(0,h*s),seed:Math.max(0,Math.floor(e.seed)),emitRate:Math.max(0,e.emitRate),emitBurst:Math.max(0,e.emitBurst),particleLife:Math.max(.1,e.particleLife),particleSpeed:Math.max(0,e.particleSpeed),particleDrag:Math.max(0,Math.min(1,e.particleDrag)),particleSizeVariation:Math.max(0,e.particleSizeVariation),particleColorVariation:Math.max(0,e.particleColorVariation),instanceScale:Math.max(.1,e.instanceScale),instanceScaleVariation:Math.max(0,e.instanceScaleVariation),instanceRotationSpeed:Math.max(0,e.instanceRotationSpeed),instanceJitter:Math.max(0,e.instanceJitter),instanceFlow:Math.max(0,e.instanceFlow),instanceDisperse:Math.max(0,e.instanceDisperse),instanceDisperseScatter:Math.max(0,e.instanceDisperseScatter),instanceDisperseScatterX:Math.max(0,e.instanceDisperseScatterX),instanceDisperseScatterY:Math.max(0,e.instanceDisperseScatterY),instanceDisperseScatterZ:Math.max(0,e.instanceDisperseScatterZ)}}toWorld(e,t,i){if(i.camera.getMode()==="orthographic")return e;let n=i.camera.getFrustumSizeAt(t).width/Math.max(1,i.viewportWidth);return e*n}isSameConfig(e,t){return JSON.stringify(e)===JSON.stringify(t)}updateMaterialOverrides(e,t,i,r){let n=t.object,o=(r.materialType||"basic").split("[")[0].trim().toLowerCase(),l=(i.engine.getCustomMaterialRegistry?.()||re).get(o),h=i.engine.getMaterialFactory?.();if(!l||!h||!h.supports(l)){if(!(U.materialInstances.has(t)||U.lastMaterialType.has(t)))return;let m=U.materialInstances.get(t);m&&(m.dispose(),U.materialInstances.delete(t)),U.lastMaterialType.delete(t),n.setMaterial?.(null,{points:!0,meshes:!0});return}if(U.lastMaterialType.get(t)!==o){let u=U.materialInstances.get(t);u&&u.dispose();let m=getComputedStyle(e),p=h.parseUniformsFromCSS(l,e,m),f=h.create(l,p);U.materialInstances.set(t,f),U.lastMaterialType.set(t,o);let g=f.material,D=h.isShaderMaterial?.(g)??!!g?.isShaderMaterial;n.setMaterial?.(g,{meshes:!0,points:!1}),n.setMaterial?.(D?g:null,{meshes:!1,points:!0})}}updateCustomUniforms(e,t,i){let r=i.engine.getMaterialFactory?.();if(!r)return;let n=getComputedStyle(e),s=o=>{let a=r.getMaterialDefinition?.(o)??o?.userData?.definition;if(!a?.uniforms)return;let l=r.parseUniformsFromCSS(a,e,n);if(typeof r.applyUniforms=="function"){r.applyUniforms(o,a,l);return}for(let[h,c]of Object.entries(l)){let u=a.uniforms?.[h];if(!u)continue;let m=r.convertUniformValue?.bind(r),p=m?m(u.type,c):c;o.uniforms?.[h]&&(o.uniforms[h].value=p)}};i.engine.forEachMaterial(t.object,s)}};U.styleCache=new J,U.lastConfig=new WeakMap,U.lastTime=new WeakMap,U.lastMaterialType=new WeakMap,U.materialInstances=new WeakMap;var Ne=U;var ne=class{static normalizeKey(e){return e.trim().toLowerCase()}static register(e,t){let i=e.trim();i&&this.fonts.set(this.normalizeKey(i),{name:i,url:t})}static setDefault(e){let t=e.trim();t&&(this.defaultFont=this.normalizeKey(t))}static get(e){return this.fonts.get(this.normalizeKey(e))}static list(){return Array.from(this.fonts.values())}static resolveFontFamily(e){if(!e)return this.getDefault();let t=e.split(",").map(i=>i.trim().replace(/^["']|["']$/g,"")).filter(Boolean);for(let i of t){let r=this.fonts.get(this.normalizeKey(i));if(r)return r}return this.getDefault()}static getDefault(){return this.defaultFont&&this.fonts.get(this.defaultFont)||null}};ne.fonts=new Map,ne.defaultFont=null;var tt=null,Fe=null,it=null,Te=null;async function Mt(){return Fe||(tt||(tt=(async()=>typeof window<"u"&&window.opentype?(Fe=window.opentype,Fe):new Promise((d,e)=>{if(typeof document>"u"){e(new Error("[FontConverter] Cannot load opentype.js in non-browser environment"));return}let t=document.createElement("script");t.src="https://cdn.jsdelivr.net/npm/opentype.js@1.3.4/dist/opentype.min.js",t.onload=()=>{Fe=window.opentype,d(Fe)},t.onerror=()=>e(new Error("[FontConverter] Failed to load opentype.js")),document.head.appendChild(t)}))()),tt)}async function Dt(){return Te||(it||(it=(async()=>typeof window<"u"&&window.Module?.decompress?(Te=window.Module,Te):new Promise((d,e)=>{if(typeof document>"u"){e(new Error("[FontConverter] Cannot load woff2 decoder in non-browser environment"));return}let t=document.createElement("script");t.src="https://cdn.jsdelivr.net/npm/wawoff2@2.0.1/build/decompress_binding.js",t.onload=()=>{let i=0,r=500,n=()=>{i++;let s=window;s.Module?.decompress?(Te=s.Module,d(Te)):i>=r?e(new Error("[FontConverter] woff2 decoder initialization timeout")):setTimeout(n,10)};n()},t.onerror=()=>{e(new Error("[FontConverter] Failed to load woff2 decoder"))},document.head.appendChild(t)}))()),it)}async function xt(d){let e=await Dt(),t=new Uint8Array(d),i=e.decompress(t);if(i instanceof Uint8Array){let r=new ArrayBuffer(i.length);return new Uint8Array(r).set(i),r}return i.buffer}function wt(d){return new DataView(d).getUint32(0,!1)===2001684018}var fe=class{static async load(e){let t=typeof e=="string"?e:"buffer-"+Date.now(),i=this.cache.get(t);if(i)return i;let r=this.loadingPromises.get(t);if(r)return r;let n=this.doLoad(e,t);this.loadingPromises.set(t,n);try{let s=await n;return this.cache.set(t,s),s}finally{this.loadingPromises.delete(t)}}static async doLoad(e,t){let i=await Mt(),r;if(typeof e=="string")r=await(await fetch(e)).arrayBuffer();else if(e instanceof ArrayBuffer)r=e;else if(e instanceof Uint8Array)r=e.buffer;else throw new Error("[FontConverter] Invalid font source");wt(r)&&(r=await xt(r));let n=i.parse(r);if(!n)throw new Error("[FontConverter] Failed to parse font");return this.convertToTypeFace(n)}static convertToTypeFace(e){let t=1e3/e.unitsPerEm,i={},r=e.tables?.cmap?.glyphIndexMap;if(r&&typeof r=="object")for(let[n,s]of Object.entries(r)){let o=Number(n);if(!Number.isFinite(o))continue;let a=e.glyphs.get(s);if(!a)continue;let l=a.getPath(0,0,e.unitsPerEm),h=this.pathToOutline(l,t),c=a.advanceWidth??a.xMax??e.unitsPerEm*.5,u=String.fromCharCode(o);i[u]||(i[u]={ha:Math.round(c*t),x_min:a.xMin!==void 0?Math.round(a.xMin*t):0,x_max:a.xMax!==void 0?Math.round(a.xMax*t):0,o:h})}else for(let n=0;n<e.glyphs.length;n++){let s=e.glyphs.get(n),o=Array.isArray(s.unicodes)?s.unicodes:s.unicode?[s.unicode]:[];if(o.length===0)continue;let a=s.getPath(0,0,e.unitsPerEm),l=this.pathToOutline(a,t),h=s.advanceWidth??s.xMax??e.unitsPerEm*.5;o.forEach(c=>{if(!Number.isFinite(c))return;let u=String.fromCharCode(c);i[u]||(i[u]={ha:Math.round(h*t),x_min:s.xMin!==void 0?Math.round(s.xMin*t):0,x_max:s.xMax!==void 0?Math.round(s.xMax*t):0,o:l})})}if(!i[" "]){let n=e.charToGlyph(" ");i[" "]={ha:Math.round((n?.advanceWidth||e.unitsPerEm*.25)*t),x_min:0,x_max:0,o:""}}return{glyphs:i,familyName:e.names.fontFamily?.en||e.names.fullName?.en||"Unknown",ascender:Math.round(e.ascender*t),descender:Math.round(e.descender*t),underlinePosition:Math.round((e.tables.post?.underlinePosition||-100)*t),underlineThickness:Math.round((e.tables.post?.underlineThickness||50)*t),boundingBox:{xMin:Math.round((e.tables.head?.xMin||0)*t),xMax:Math.round((e.tables.head?.xMax||1e3)*t),yMin:Math.round((e.tables.head?.yMin||-200)*t),yMax:Math.round((e.tables.head?.yMax||800)*t)},resolution:1e3,outlineFormat:(e.outlinesFormat||e.outlineFormat||"").toString(),original_font_information:{format:0,copyright:e.names.copyright?.en||"",fontFamily:e.names.fontFamily?.en||"",fontSubfamily:e.names.fontSubfamily?.en||"",uniqueID:e.names.uniqueID?.en||"",fullName:e.names.fullName?.en||"",version:e.names.version?.en||"",postScriptName:e.names.postScriptName?.en||""}}}static pathToOutline(e,t){let i=[];for(let r of e.commands)switch(r.type){case"M":i.push(`m ${this.round(r.x*t)} ${this.round(r.y*t)}`);break;case"L":i.push(`l ${this.round(r.x*t)} ${this.round(r.y*t)}`);break;case"Q":i.push(`q ${this.round(r.x1*t)} ${this.round(r.y1*t)} ${this.round(r.x*t)} ${this.round(r.y*t)}`);break;case"C":i.push(`b ${this.round(r.x1*t)} ${this.round(r.y1*t)} ${this.round(r.x2*t)} ${this.round(r.y2*t)} ${this.round(r.x*t)} ${this.round(r.y*t)}`);break;case"Z":i.push("z");break}return i.join(" ")}static round(e){return Math.round(e*1e4)/1e4}static isTypefaceJson(e){let t=e.toLowerCase();return t.endsWith(".json")||t.includes("typeface")}static isFontFile(e){let t=e.toLowerCase();return!!(/\.(ttf|otf|woff2?)(\?|$)/i.test(t)||t.includes("fonts.gstatic.com")||t.includes("/fonts/")&&!t.endsWith(".json"))}static clearCache(){this.cache.clear()}};fe.cache=new Map,fe.loadingPromises=new Map;var rt=Math.PI/180,Ct=`
116
3
  [data-string3d-text] {
117
4
  -webkit-text-fill-color: transparent;
118
5
  }
@@ -140,8 +27,9 @@
140
27
  transform-style: preserve-3d;
141
28
  transform-origin: center center;
142
29
  }
143
- `,T=class T{static markObjectPendingFont(e,t){let i=this.pendingFontObjects.get(e);i||(i=new Set,this.pendingFontObjects.set(e,i)),i.add(t)}static clearObjectPendingFont(e,t){let i=this.pendingFontObjects.get(e);i&&i.delete(t)}static invalidatePendingObjects(e){let t=this.pendingFontObjects.get(e);t&&(t.forEach(i=>{this.geometryKeys.delete(i)}),t.clear())}static injectPseudoElementStyles(){if(this.pseudoStyleInjected||typeof document>"u")return;let e=document.createElement("style");e.setAttribute("data-string3d","pseudo-text"),e.textContent=bt,document.head.appendChild(e),this.pseudoStyleInjected=!0}static setupSelectableText(e){let t=e.textContent||"";e.dataset.string3dText!==t&&(e.dataset.string3dText=t);let i=getComputedStyle(e);i.position==="static"&&(e.style.position="relative");let r=i.getPropertyValue("--rotate-x").trim()||"0",s=i.getPropertyValue("--rotate-y").trim()||"0",a=i.getPropertyValue("--rotate-z").trim()||"0",o=i.getPropertyValue("--translate-x").trim()||"0px",n=i.getPropertyValue("--translate-y").trim()||"0px",l=i.getPropertyValue("--translate-z").trim()||"0px",c=i.getPropertyValue("--scale").trim()||"1",h=[o!=="0px"&&o!=="0"?`translateX(${o})`:"",n!=="0px"&&n!=="0"?`translateY(${n})`:"",l!=="0px"&&l!=="0"?`translateZ(${l})`:"",r!=="0"?`rotateX(${r}deg)`:"",s!=="0"?`rotateY(${s}deg)`:"",a!=="0"?`rotateZ(${a}deg)`:"",c!=="1"?`scale(${c})`:""].filter(Boolean).join(" ");e.style.setProperty("--string3d-transform",h||"none")}static setupContentObserver(e,t){if(this.contentObservers.has(e))return;let i=e.textContent||"",r=new MutationObserver(s=>{let a=e.textContent||"";if(a===i)return;i=a;let n=window.StringTune3D?.String3D?.getInstance?.()?.scene?.getObjectForElement?.(e);n&&(this.geometryKeys.delete(n),this.layoutCache.invalidate(e),e.dataset.string3dText!==a&&(e.dataset.string3dText=a))});r.observe(e,{characterData:!0,childList:!0,subtree:!0}),this.contentObservers.set(e,r)}static cleanupContentObserver(e){let t=this.contentObservers.get(e);t&&(t.disconnect(),this.contentObservers.delete(e))}sync(e,t,i,r){T.injectPseudoElementStyles(),T.setupSelectableText(e),T.setupContentObserver(e,t);let{rect:s,width:a,height:o}=this.readLayout(e,i),n=this.readStyleBundle(e,i),{translateZ:l,cssScale:c,rotateX:h,rotateY:u,rotateZ:m,cssScaleZ:d,opacity:p,color:f,metalness:x,roughness:v,emissive:y,castShadow:S,receiveShadow:L,materialType:P,fontFamily:O,fontSize:V,textTransform:w,textDepth:M,textCurveSegments:C,bevelEnabled:R,bevelSize:_,bevelThickness:B,bevelOffset:N,bevelSegments:G,fontCss:H}=n,A=s.left+s.width*.5,D=s.top+s.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set(A-i.viewportWidth/2,-(D-i.viewportHeight/2),l);else{let k=i.camera.getFrustumSizeAt(l),Z=A/i.viewportWidth,le=D/i.viewportHeight;t.object.position.set((Z-.5)*k.width,-(le-.5)*k.height,l)}t.object.rotation.x=-h*Ne,t.object.rotation.y=u*Ne,t.object.rotation.z=-m*Ne,t.object.rotation.order="XYZ",t.object.rotation.z=-m*Ne,t.object.rotation.order="XYZ";let b=this.extractCharacterLayout(e,w),I=b.map(k=>k.char).join(""),z=!!H,E=this.getTextMesh(t);if(!E)return{scale:c*(r?.scale||1)};if(b.length===0)return E.visible=!1,{scale:c*(r?.scale||1)};if(p===0)return t.object.visible=!1,{scale:c*(r?.scale||1)};t.object.visible=!0,E.visible=!0;let j=re.resolveFontFamily(O||"");if(!j)return T.warnedMissingFont||(T.warnedMissingFont=!0),{scale:c*(r?.scale||1)};if(!i.engine.loadFont||!i.engine.createTextGeometry)return T.warnedMissingLoader||(T.warnedMissingLoader=!0),{scale:c*(r?.scale||1)};let W=j.url,X=T.fontCache.get(W);if(!X){if(T.markObjectPendingFont(W,t),!T.fontPromises.has(W)){let k=i.engine.loadFont(W).then(Z=>(Z&&(T.fontCache.set(W,Z),T.invalidatePendingObjects(W)),Z));T.fontPromises.set(W,k)}return E.visible=!1,{scale:c*(r?.scale||1)}}T.clearObjectPendingFont(W,t);let q=b.length>0?`${b.length}:${b[0].x.toFixed(1)},${b[0].y.toFixed(1)}:${b[b.length-1].x.toFixed(1)},${b[b.length-1].y.toFixed(1)}`:"empty",$=[I,V.toFixed(3),H||"",s.width.toFixed(1),s.height.toFixed(1),q,M.toFixed(3),C.toFixed(3),R?"1":"0",_.toFixed(3),B.toFixed(3),N.toFixed(3),G.toFixed(3)].join("|");if(T.geometryKeys.get(t)!==$){let k=i.engine.createTextGeometry(I,X,{size:V,height:M,curveSegments:Math.max(1,Math.round(C)),bevelEnabled:R,bevelThickness:B,bevelSize:_,bevelOffset:N,bevelSegments:Math.max(0,Math.round(G)),lineHeight:0,letterSpacing:0,align:"left",layout:b,elementWidth:s.width,elementHeight:s.height});k&&(k.computeBoundingBox(),E.geometry&&E.geometry.dispose?.(),E.geometry=k,t.geometry=k,T.geometryKeys.set(t,$))}let ne=r?.scale||1,fe=i.camera.getMode()==="orthographic"?1:i.camera.getScaleAtZ(l,i.viewportHeight),ae=c*ne*fe,ge=ae*d;t.object.scale.set(ae,ae,ge);let ye=-a*.5,be=o*.5;E.position.set(ye,be,0);let oe=T.lastMaterialType.get(t);return oe!==void 0&&oe!==P&&i.scene&&i.scene.recreateMaterialForObject&&requestAnimationFrame(()=>{i.scene&&i.scene.recreateMaterialForObject&&i.scene.recreateMaterialForObject(t,e)}),T.lastMaterialType.set(t,P),de.applyVisualProps(e,t,{opacity:p,color:f&&f!=="none"?f:void 0,metalness:Number.isFinite(x)?x:void 0,roughness:Number.isFinite(v)?v:void 0,emissive:y&&y!=="none"?y:void 0,castShadow:S,receiveShadow:L}),this.updateCustomUniforms(e,t,i),{scale:ae}}cleanup(e,t){T.cleanupContentObserver(e),T.geometryKeys.delete(t)}extractCharacterLayout(e,t){let i=[];if(typeof document>"u"||!document.createRange)return i;let r=document.createRange(),s=e.getBoundingClientRect(),a=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),o;for(;o=a.nextNode();){let n=o.textContent||"";if(!(!n.trim()&&n!==" "))for(let l=0;l<n.length;l++){let c=n[l];if(c===`
144
- `||c==="\r"||!c.trim())continue;r.setStart(o,l),r.setEnd(o,l+1);let h=r.getClientRects();if(h.length>0){let u=h[0],m=u.left-s.left,d=u.top-s.top,p=this.applyTextTransform(c,t);i.push({char:p,x:m,y:d,width:u.width,height:u.height})}}}return i}getTextMesh(e){let t=e.object;if(t?.__textMesh)return t.__textMesh;if(t?.isMesh)return t;if(Array.isArray(t?.children)){let i=t.children.find(r=>r?.isMesh);if(i)return t.__textMesh=i,i}return null}updateCustomUniforms(e,t,i){let r=i.engine.getMaterialFactory?.();if(!r)return;let s=getComputedStyle(e),a=o=>{let n=o?.userData?.definition;if(!n?.uniforms)return;let l=r.parseUniformsFromCSS(n,e,s);for(let[c,h]of Object.entries(l)){let u=n.uniforms?.[c];if(!u)continue;let m=r.convertUniformValue?.bind(r),d=m?m(u.type,h):h;o.userData?.shader?.uniforms?.[c]?o.userData.shader.uniforms[c].value=d:o.userData?.customUniforms?.[c]?o.userData.customUniforms[c].value=d:o.uniforms?.[c]&&(o.uniforms[c].value=d)}};if(t.object.traverse)t.object.traverse(o=>{o.isMesh&&(Array.isArray(o.material)?o.material:[o.material]).forEach(a)});else{let o=this.getTextMesh(t);if(!o)return;(Array.isArray(o.material)?o.material:[o.material]).forEach(a)}}readStyleBundle(e,t){return T.styleCache.get(e,t,i=>{let r=i.computedStyleMap?.(),s=getComputedStyle(i),a=(w,M)=>{let C=r?.get?.(w);if(C!=null){let B=typeof C=="object"&&"value"in C?C.value:C,N=typeof B=="number"?B:Number.parseFloat(String(B));if(!Number.isNaN(N))return N}let R=s.getPropertyValue(w),_=Number.parseFloat(R);return Number.isNaN(_)?M:_},o=w=>{let M=r?.get?.(w),C=M&&typeof M=="object"&&"value"in M?M.value:M;return typeof C=="string"?C.trim():s.getPropertyValue(w).trim()},n=(w,M=!1)=>{let C=o(w);if(!C)return M;let R=C.toLowerCase();return R==="true"||R==="1"||R==="yes"?!0:R==="false"||R==="0"||R==="no"?!1:M},l=o("--material-color"),c=l&&l!=="none"?l:s.color.trim(),h=(()=>{let w=s.fontSize||"",M=Number.parseFloat(w);return Number.isFinite(M)?M:16})(),u=(()=>{let w=s.lineHeight||"";if(!w||w==="normal")return h*1.2;let M=Number.parseFloat(w);return Number.isFinite(M)?w.endsWith("px")?M:M*h:h*1.2})(),m=(()=>{let w=s.letterSpacing||"";if(!w||w==="normal")return 0;let M=Number.parseFloat(w);return Number.isFinite(M)?M:0})(),d=o("--text-fit")||"none",p=a("--text-depth",NaN),f=Number.isFinite(p)?p:Math.max(1,h*.2),x=a("--text-bevel-size",0),v=a("--text-bevel-thickness",0),y=a("--text-bevel-offset",0),S=a("--text-bevel-steps",0),L=(s.textAlign||"left").toLowerCase(),P=L==="center"?"center":L==="right"||L==="end"?"right":"left",O=s.font?.trim(),V=O&&O.length>0?O:[s.fontStyle||"normal",s.fontWeight||"normal",`${s.fontSize||"16px"}/${s.lineHeight||"normal"}`,s.fontFamily||"sans-serif"].join(" ");return{translateZ:a("--translate-z",0),cssScale:a("--scale",1),rotateX:a("--rotate-x",0),rotateY:a("--rotate-y",0),rotateZ:a("--rotate-z",0),cssScaleZ:a("--scale-z",1),opacity:a("--opacity",NaN),color:c,metalness:a("--material-metalness",NaN),roughness:a("--material-roughness",NaN),emissive:o("--material-emissive"),castShadow:n("--shadow-cast",!1),receiveShadow:n("--shadow-receive",!1),materialType:o("--material-type","basic").split("[")[0]||"basic",fontFamily:s.fontFamily||"",fontCss:V,fontSize:h,lineHeight:u,letterSpacing:m,textAlign:P,textTransform:(s.textTransform||"").toLowerCase(),textDepth:f,textCurveSegments:a("--text-curve-segments",8),bevelEnabled:x>0||v>0,bevelSize:x,bevelThickness:v,bevelOffset:y,bevelSegments:S,textFit:d==="cover"||d==="none"?d:"contain"}})}applyTextTransform(e,t){return!t||t==="none"?e:t==="uppercase"?e.toUpperCase():t==="lowercase"?e.toLowerCase():t==="capitalize"?e.replace(/\b(\p{L})/gu,i=>i.toUpperCase()):e}readLayout(e,t){let i=e.__layoutCache;return i||T.layoutCache.get(e,t,r=>{let s=r.getBoundingClientRect();return{rect:s,width:s.width,height:s.height}})}};T.styleCache=new J,T.layoutCache=new J,T.geometryKeys=new WeakMap,T.lastMaterialType=new WeakMap,T.fontCache=new Map,T.fontPromises=new Map,T.pendingFontObjects=new Map,T.contentObservers=new WeakMap,T.warnedMissingFont=!1,T.warnedMissingLoader=!1,T.pseudoStyleInjected=!1;var He=T;var Ie=class{constructor(e,t,i,r){this.camera=e;this.viewportWidth=t;this.viewportHeight=i;this.engine=r;this.strategies=new Map;this.styleReadIntervalMs=0;this.layoutReadIntervalMs=0;this.strategies.set("box",new de),this.strategies.set("sphere",new de),this.strategies.set("plane",new de),this.strategies.set("cylinder",new de),this.strategies.set("model",new de),this.strategies.set("group",new Ve),this.strategies.set("pointLight",new xe),this.strategies.set("ambientLight",new xe),this.strategies.set("directionalLight",new xe),this.strategies.set("spotLight",new xe),this.strategies.set("hemisphereLight",new xe),this.strategies.set("particles",new Ae),this.strategies.set("text",new He)}syncElement(e,t,i,r){let s=this.strategies.get(t.type);return s?s.sync(e,t,{camera:this.camera,viewportWidth:this.viewportWidth,viewportHeight:this.viewportHeight,engine:this.engine,dirtySet:r?.dirtySet,forceSync:r?.forceSync,styleReadIntervalMs:this.styleReadIntervalMs,layoutReadIntervalMs:this.layoutReadIntervalMs},i):null}setSyncOptions(e){this.styleReadIntervalMs=Math.max(0,e.styleReadIntervalMs??0),this.layoutReadIntervalMs=Math.max(0,e.layoutReadIntervalMs??0)}updateViewportSize(e,t){this.viewportWidth=e,this.viewportHeight=t}cleanupElement(e,t){let i=this.strategies.get(t.type);i?.cleanup&&i.cleanup(e,t)}};var ke=class{constructor(e){this.handleScrollBound=()=>this.handleScroll();this.dirtyElements=new Set;this.observedElements=new Set;this.resizeObserver=null;this.mutationObserver=null;this.enabled=!1;this.domVersion=0;this.attributeFilter=e}enable(){this.enabled||(this.enabled=!0,this.setupObservers(),this.setupScrollListeners())}disable(){this.enabled&&(this.enabled=!1,this.removeScrollListeners(),this.resizeObserver?.disconnect(),this.mutationObserver?.disconnect(),this.dirtyElements.clear(),this.observedElements.clear())}observeElement(e){!this.enabled||this.observedElements.has(e)||(this.observedElements.add(e),this.resizeObserver?.observe(e),this.mutationObserver?.observe(e,{attributes:!0,attributeFilter:this.attributeFilter}))}observeScene(e){this.enabled&&e.forEach(t=>this.observeRecursive(t))}markDirty(e){this.enabled&&(this.dirtyElements.add(e),this.bumpVersion())}markAllDirty(){this.enabled&&(this.observedElements.forEach(e=>this.dirtyElements.add(e)),this.bumpVersion())}getDirtySet(){return this.enabled?this.dirtyElements:null}clearDirty(){this.dirtyElements.clear()}getVersion(){return this.domVersion}isEnabled(){return this.enabled}observeRecursive(e){e.el instanceof HTMLElement&&this.observeElement(e.el),e.children.forEach(t=>this.observeRecursive(t))}handleScroll(){this.markAllDirty()}setupObservers(){typeof ResizeObserver<"u"&&(this.resizeObserver=new ResizeObserver(e=>{e.forEach(t=>{t.target instanceof HTMLElement&&this.markDirty(t.target)})})),typeof MutationObserver<"u"&&(this.mutationObserver=new MutationObserver(e=>{e.forEach(t=>{t.target instanceof HTMLElement&&this.markDirty(t.target)})}))}setupScrollListeners(){window.addEventListener("scroll",this.handleScrollBound,{passive:!0}),window.addEventListener("resize",this.handleScrollBound,{passive:!0}),window.visualViewport&&(window.visualViewport.addEventListener("scroll",this.handleScrollBound,{passive:!0}),window.visualViewport.addEventListener("resize",this.handleScrollBound,{passive:!0}))}removeScrollListeners(){window.removeEventListener("scroll",this.handleScrollBound),window.removeEventListener("resize",this.handleScrollBound),window.visualViewport&&(window.visualViewport.removeEventListener("scroll",this.handleScrollBound),window.visualViewport.removeEventListener("resize",this.handleScrollBound))}bumpVersion(){this.domVersion+=1}};var Ue=class{constructor(e){this.easingParser=e;this.filterStates=new WeakMap;this.filterWarnings=new WeakMap}collectTargets(e,t,i,r){let s=[],a=o=>{let n=o.el;if(n){let l=this.filterStates.get(n)?.animating===!0,c=!i||!r||r.has(n)||l,h=this.readFilterChain(n,t,c);if(h&&h.length>0){let u=!i||!r||r.has(n)||l,m=this.filterStates.get(n)?.effectsKey||this.stringifyFilterChain(h);s.push({object:o,effects:h,effectsKey:m,dirty:u});return}}o.children.forEach(l=>a(l))};return e.forEach(o=>a(o)),s}clear(){this.filterStates=new WeakMap,this.filterWarnings=new WeakMap}readFilterChain(e,t,i){let r=this.filterStates.get(e);if(!i&&r)return r.animating?this.sampleTransition(r,t):r.effects;let s=nt(e);if(!s||s==="none"){if(r){if(r.animating&&r.clearOnComplete){let p=this.sampleTransition(r,t);return r.animating?p:(this.filterStates.delete(e),null)}let{duration:u,delay:m,easing:d}=this.getFilterTransition(e);if(u<=0&&r.lastDuration>0&&(u=r.lastDuration,m=r.lastDelay,d=r.lastEasing),u>0){let p=this.makeZeroChain(r.effects);return r.from=r.effects,r.to=p,r.startTime=t+m,r.duration=u,r.easing=d,r.animating=!0,r.clearOnComplete=!0,r.lastDuration=u,r.lastDelay=m,r.lastEasing=d,this.sampleTransition(r,t)}}return this.filterStates.delete(e),null}let{effects:a,warnings:o}=this.parseFilterChain(s);if(this.warnFilterIssues(e,s,o),a.length===0)return null;let n=this.filterStates.get(e);if(!n){let{duration:u,delay:m,easing:d}=this.getFilterTransition(e);if(u>0){let p=this.makeZeroChain(a),f={raw:s,effects:a,animating:!0,from:p,to:a,startTime:t+m,duration:u,easing:d,clearOnComplete:!1,lastDuration:u,lastDelay:m,lastEasing:d};return f.effectsKey=this.stringifyFilterChain(a),this.filterStates.set(e,f),this.sampleTransition(f,t)}return this.filterStates.set(e,{raw:s,effects:a,animating:!1,from:a,to:a,startTime:0,duration:0,easing:p=>p,clearOnComplete:!1,lastDuration:0,lastDelay:0,lastEasing:p=>p,effectsKey:this.stringifyFilterChain(a)}),a}if(n.raw===s){if(n.animating){let u=this.sampleTransition(n,t);return!n.animating&&n.clearOnComplete?(this.filterStates.delete(e),null):u}return n.effects}n.pendingEffects=void 0,n.pendingRaw=void 0;let{duration:l,delay:c,easing:h}=this.getFilterTransition(e);if(l<=0&&n.lastDuration>0&&(l=n.lastDuration,c=n.lastDelay,h=n.lastEasing),l>0){let u=this.canInterpolate(n.effects,a),m=n.animating?this.getCurrentChain(n,t):n.effects;if(!u&&this.isZeroChain(a))return n.pendingRaw=s,n.pendingEffects=a,n.raw=s,n.effects=m,n.from=m,n.to=this.makeZeroChain(m),n.startTime=t+c,n.duration=l,n.easing=h,n.animating=!0,n.clearOnComplete=!1,n.lastDuration=l,n.lastDelay=c,n.lastEasing=h,n.effectsKey=this.stringifyFilterChain(a),this.sampleTransition(n,t);let d=u?m:this.makeZeroChain(a);return n.raw=s,n.effects=a,n.from=d,n.to=a,n.startTime=t+c,n.duration=l,n.easing=h,n.animating=!0,n.clearOnComplete=!1,n.lastDuration=l,n.lastDelay=c,n.lastEasing=h,n.effectsKey=this.stringifyFilterChain(a),this.sampleTransition(n,t)}return n.raw=s,n.effects=a,n.animating=!1,n.clearOnComplete=!1,n.effectsKey=this.stringifyFilterChain(a),a}warnFilterIssues(e,t,i){i.length===0||this.filterWarnings.get(e)===t||this.filterWarnings.set(e,t)}parseFilterChain(e){let t=[],i=[],r=u=>{let d=u.trim().toLowerCase().match(/^(-?\d*\.?\d+)(px)?$/);if(!d)return null;let p=Number.parseFloat(d[1]);return Number.isFinite(p)?p:null},s=u=>{let m=u.trim().toLowerCase();if(!m)return null;if(m.endsWith("%")){let p=Number.parseFloat(m.slice(0,-1));return Number.isFinite(p)?p/100:null}let d=Number.parseFloat(m);return Number.isFinite(d)?d:null},a=u=>{let m=u.trim().toLowerCase();if(!m)return null;if(m.endsWith("rad")){let f=Number.parseFloat(m.slice(0,-3));return Number.isFinite(f)?f:null}let d=m.endsWith("deg")?m.slice(0,-3):m,p=Number.parseFloat(d);return Number.isFinite(p)?p*Math.PI/180:null},o=u=>{let m=u.split(",").map(f=>f.trim()),d=r(m[0]||"");if(d===null)return null;let p=m[1]?s(m[1]):null;return{intensity:Math.max(0,d),threshold:p===null?.8:Math.max(0,Math.min(1,p))}},n=(u,m,d=!1)=>{let p=r(u);return p===null?(t.push(`[String3D] Invalid ${m} value "${u}".`),null):!d&&p<=0?(t.push(`[String3D] ${m} must be > 0.`),null):p},l=(u,m)=>{let d=s(u);return d===null?(t.push(`[String3D] Invalid ${m} value "${u}".`),null):d},c=/([a-zA-Z-]+)\(([^)]*)\)/g,h;for(;h=c.exec(e);){let u=h[1].toLowerCase(),m=(h[2]||"").trim();if(u==="blur"){let d=n(m,"blur",!0);d!==null&&i.push({type:"blur",amount:d})}else if(u==="pixel"||u==="pixelate"){let d=n(m,"pixel",!0);d!==null&&i.push({type:"pixel",size:d})}else if(u==="bloom"){let d=o(m);d?i.push({type:"bloom",...d}):t.push(`[String3D] Invalid bloom value "${m}".`)}else if(u==="brightness"){let d=l(m,"brightness");d!==null&&i.push({type:"brightness",amount:Math.max(0,d)})}else if(u==="contrast"){let d=l(m,"contrast");d!==null&&i.push({type:"contrast",amount:Math.max(0,d)})}else if(u==="saturate"){let d=l(m,"saturate");d!==null&&i.push({type:"saturate",amount:Math.max(0,d)})}else if(u==="grayscale"){let d=l(m,"grayscale");d!==null&&i.push({type:"grayscale",amount:Math.max(0,Math.min(1,d))})}else if(u==="sepia"){let d=l(m,"sepia");d!==null&&i.push({type:"sepia",amount:Math.max(0,Math.min(1,d))})}else if(u==="invert"){let d=l(m,"invert");d!==null&&i.push({type:"invert",amount:Math.max(0,Math.min(1,d))})}else if(u==="hue-rotate"){let d=a(m);d!==null?i.push({type:"hue-rotate",angle:d}):t.push(`[String3D] Invalid hue-rotate value "${m}".`)}else if(u){let d=ve.get(u);if(d){let p=d.parse?d.parse(m):{};p===null?t.push(`[String3D] Invalid custom filter "${u}" args "${m}".`):i.push({type:"custom",name:u,uniforms:p})}else t.push(`[String3D] Unknown filter "${u}".`)}}return i.length===0&&t.push("[String3D] No valid filters parsed from --filter."),{effects:i,warnings:t}}getFilterTransition(e){let t=getComputedStyle(e),i=this.splitTransitionList(t.transitionProperty),r=this.splitTransitionList(t.transitionDuration),s=this.splitTransitionList(t.transitionDelay),a=this.splitTransitionList(t.transitionTimingFunction),o=this.findTransitionIndex(i,"--filter");if(o===-1){let h=this.parseTransitionShorthand(t.transition),u=h.get("--filter")||h.get("all");return u||{duration:0,delay:0,easing:m=>m}}let n=this.parseTime(r[o]||r[r.length-1]||"0s"),l=this.parseTime(s[o]||s[s.length-1]||"0s"),c=a[o]||a[a.length-1]||"linear";return{duration:n,delay:l,easing:this.parseEasing(c)}}splitTransitionList(e){let t=[],i="",r=0;for(let s=0;s<e.length;s+=1){let a=e[s];a==="("&&(r+=1),a===")"&&(r=Math.max(0,r-1)),a===","&&r===0?(t.push(i.trim()),i=""):i+=a}return i.trim()&&t.push(i.trim()),t.length>0?t:["all"]}findTransitionIndex(e,t){let i=e.map(s=>s.trim().toLowerCase()),r=i.indexOf(t);return r===-1&&(r=i.indexOf("all")),r}parseTime(e){let t=e.trim().toLowerCase();if(t.endsWith("ms")){let r=Number.parseFloat(t.slice(0,-2));return Number.isFinite(r)?r:0}if(t.endsWith("s")){let r=Number.parseFloat(t.slice(0,-1));return Number.isFinite(r)?r*1e3:0}let i=Number.parseFloat(t);return Number.isFinite(i)?i:0}parseTransitionShorthand(e){let t=new Map;return this.splitTransitionList(e).forEach(r=>{if(!r)return;let s=r.trim().split(/\s+(?![^()]*\))/g),a="",o="",n="",l="";s.forEach(c=>{let h=c.toLowerCase();h.endsWith("ms")||h.endsWith("s")||/^[0-9.]+$/.test(h)?o?n||(n=h):o=h:h.startsWith("cubic-bezier")||h.startsWith("steps")||h==="linear"||h==="ease"||h==="ease-in"||h==="ease-out"||h==="ease-in-out"?l=c:a||(a=c)}),a&&t.set(a.trim().toLowerCase(),{duration:this.parseTime(o||"0s"),delay:this.parseTime(n||"0s"),easing:this.parseEasing(l||"linear")})}),t}parseEasing(e){let t=e.trim();if(!t)return i=>i;if(!this.easingParser)return i=>i;try{let i=this.easingParser(t);return typeof i=="function"?i:r=>r}catch{return i=>i}}canInterpolate(e,t){return e.length!==t.length?!1:e.every((i,r)=>{let s=t[r];if(i.type!==s.type)return!1;if(i.type==="custom"&&s.type==="custom"){if(i.name!==s.name)return!1;let a=Object.keys(i.uniforms||{}),o=Object.keys(s.uniforms||{});return a.length!==o.length?!1:a.every(n=>n in(s.uniforms||{})&&this.isNumeric(i.uniforms?.[n]))}return!0})}makeZeroChain(e){return e.map(t=>{switch(t.type){case"blur":return{type:"blur",amount:0};case"pixel":return{type:"pixel",size:0};case"bloom":return{type:"bloom",intensity:0,threshold:t.threshold};case"brightness":return{type:"brightness",amount:1};case"contrast":return{type:"contrast",amount:1};case"saturate":return{type:"saturate",amount:1};case"grayscale":return{type:"grayscale",amount:0};case"sepia":return{type:"sepia",amount:0};case"invert":return{type:"invert",amount:0};case"hue-rotate":return{type:"hue-rotate",angle:0};case"custom":{let i={};return Object.entries(t.uniforms||{}).forEach(([r,s])=>{i[r]=this.isNumeric(s)?0:s}),{type:"custom",name:t.name,uniforms:i}}default:return t}})}sampleTransition(e,t){if(!e.animating)return e.effects;if(t<e.startTime)return e.from;let i=t-e.startTime,r=Math.max(1,e.duration),s=Math.min(1,Math.max(0,i/r)),a=e.easing(s),o=this.interpolateChain(e.from,e.to,a);return s>=1&&(e.animating=!1,e.from=e.to,e.pendingEffects&&e.pendingRaw===e.raw?(e.effects=e.pendingEffects,e.raw=e.pendingRaw||e.raw,e.pendingEffects=void 0,e.pendingRaw=void 0):e.pendingEffects&&(e.pendingEffects=void 0,e.pendingRaw=void 0)),o}getCurrentChain(e,t){if(!e.animating)return e.effects;if(t<e.startTime)return e.from;let i=t-e.startTime,r=Math.max(1,e.duration),s=Math.min(1,Math.max(0,i/r)),a=e.easing(s);return this.interpolateChain(e.from,e.to,a)}interpolateChain(e,t,i){return this.canInterpolate(e,t)?e.map((r,s)=>this.interpolateEffect(r,t[s],i)):t}interpolateEffect(e,t,i){let r=(s,a)=>s+(a-s)*i;if(e.type==="blur"&&t.type==="blur")return{type:"blur",amount:r(e.amount,t.amount)};if(e.type==="pixel"&&t.type==="pixel")return{type:"pixel",size:r(e.size,t.size)};if(e.type==="bloom"&&t.type==="bloom")return{type:"bloom",intensity:r(e.intensity,t.intensity),threshold:r(e.threshold,t.threshold)};if(e.type==="brightness"&&t.type==="brightness")return{type:"brightness",amount:r(e.amount,t.amount)};if(e.type==="contrast"&&t.type==="contrast")return{type:"contrast",amount:r(e.amount,t.amount)};if(e.type==="saturate"&&t.type==="saturate")return{type:"saturate",amount:r(e.amount,t.amount)};if(e.type==="grayscale"&&t.type==="grayscale")return{type:"grayscale",amount:r(e.amount,t.amount)};if(e.type==="sepia"&&t.type==="sepia")return{type:"sepia",amount:r(e.amount,t.amount)};if(e.type==="invert"&&t.type==="invert")return{type:"invert",amount:r(e.amount,t.amount)};if(e.type==="hue-rotate"&&t.type==="hue-rotate")return{type:"hue-rotate",angle:r(e.angle,t.angle)};if(e.type==="custom"&&t.type==="custom"&&e.name===t.name){let s={};return Object.entries(t.uniforms||{}).forEach(([a,o])=>{let n=e.uniforms?.[a];this.isNumeric(n)&&this.isNumeric(o)?s[a]=r(n,o):s[a]=o}),{type:"custom",name:t.name,uniforms:s}}return t}stringifyFilterChain(e){return e.map(i=>{if(i.type==="blur")return`blur:${i.amount}`;if(i.type==="pixel")return`pixel:${i.size}`;if(i.type==="bloom")return`bloom:${i.intensity},${i.threshold}`;if(i.type==="brightness")return`brightness:${i.amount}`;if(i.type==="contrast")return`contrast:${i.amount}`;if(i.type==="saturate")return`saturate:${i.amount}`;if(i.type==="grayscale")return`grayscale:${i.amount}`;if(i.type==="sepia")return`sepia:${i.amount}`;if(i.type==="invert")return`invert:${i.amount}`;if(i.type==="hue-rotate")return`hue-rotate:${i.angle}`;if(i.type==="custom"){let r=Object.keys(i.uniforms||{}).sort().map(s=>`${s}=${i.uniforms[s]}`).join(",");return`custom:${i.name}:${r}`}return"unknown"}).join("|")}isNumeric(e){return typeof e=="number"&&Number.isFinite(e)}isZeroChain(e){return e.every(t=>{switch(t.type){case"blur":return t.amount<=0;case"pixel":return t.size<=0;case"bloom":return t.intensity<=0;case"brightness":return t.amount===1;case"contrast":return t.amount===1;case"saturate":return t.amount===1;case"grayscale":return t.amount===0;case"sepia":return t.amount===0;case"invert":return t.amount===0;case"hue-rotate":return t.angle===0;case"custom":return!1;default:return!1}})}};var Me=class Me extends st.StringModule{constructor(t){super(t);this.renderer=null;this.camera=null;this._scene=null;this.synchronizer=null;this.engine=null;this.canvasContainer=null;this.isLoading=new Map;this.useDirtySync=!1;this.lastSyncData=new WeakMap;this.needsInitialResize=!0;this.htmlKey="3d",this.options=this.buildOptionsFromSettings(),this.dirtySyncManager=new ke(["style","class","string-3d","string-3d-model-fit","string-3d-model-scale"]),this.filterController=new Ue(i=>this.tools.easingFunction.process({easing:i})),this.attributesToMap=[...this.attributesToMap,{key:"3d",type:"string",fallback:"box"},{key:"3d-model",type:"string",fallback:""},{key:"3d-segments",type:"number",fallback:32},{key:"3d-segments-width",type:"number",fallback:32},{key:"3d-segments-height",type:"number",fallback:32},{key:"3d-model-loader",type:"string",fallback:""},{key:"3d-model-scale",type:"number",fallback:1},{key:"3d-model-center",type:"boolean",fallback:!1},{key:"3d-model-fit",type:"string",fallback:"contain"}],Me._instance=this}static getInstance(){return Me._instance}get scene(){return this._scene}static setProvider(t){Me.provider=t}static registerFont(t,i,r={}){re.register(t,i),r.default&&re.setDefault(t)}static setDefaultFont(t){re.setDefault(t)}canConnect(t){return super.canConnect(t)}initializeObject(t,i,r,s){super.initializeObject(t,i,r,s),i.setProperty("parentId",null);let a=r.parentElement?.closest('[string-3d="group"]');if(a){let o=a.getAttribute("string-id");o&&(i.setProperty("parentId",o),i.setProperty("parent",a))}}onResize(){this.renderer&&this.camera&&this.synchronizer&&(this.renderer.resize(this.camera),this.synchronizer.updateViewportSize(this.renderer.width,this.renderer.height),this.camera.clearScaleCache(),this.useDirtySync&&this.dirtySyncManager.markAllDirty())}onInit(){if(this.options=this.buildOptionsFromSettings(),!Me.provider)return;this.engine=Me.provider.getEngine(),this.canvasContainer=this.createOrGetContainer(),this.registerTypedProperties(),this.injectCSS(),this.useDirtySync=!!this.options.useDirtySync,this.useDirtySync&&this.dirtySyncManager.enable(),this.renderer=new we(this.canvasContainer,this.engine),this.renderer.attach(),this.camera=new De(this.engine,"orthographic"),this.camera.setPosition(0,0,1e3),this.camera.resize(this.renderer.width,this.renderer.height);let t=this.resolveModelLoader(),i=this.resolveModelLoaderFactory();this._scene=new Ee(this.engine,{modelLoader:t,modelLoaderFactory:i}),this._scene.getScene().add(this.camera.camera),this.synchronizer=new Ie(this.camera,this.renderer.width,this.renderer.height,this.engine),this.synchronizer.setSyncOptions({styleReadIntervalMs:this.options.styleReadIntervalMs,layoutReadIntervalMs:this.options.layoutReadIntervalMs}),this._scene.setSynchronizer(this.synchronizer)}onSettingsChange(){this.options=this.buildOptionsFromSettings();let t=!!this.options.useDirtySync;t&&!this.useDirtySync?(this.useDirtySync=!0,this.dirtySyncManager.enable(),this._scene&&this.dirtySyncManager.observeScene(this._scene.rootObjects),this.dirtySyncManager.markAllDirty()):!t&&this.useDirtySync&&(this.useDirtySync=!1,this.dirtySyncManager.disable()),this.synchronizer?.setSyncOptions({styleReadIntervalMs:this.options.styleReadIntervalMs,layoutReadIntervalMs:this.options.layoutReadIntervalMs})}buildOptionsFromSettings(){return{hideHTML:this.getSettingValue("hideHTML",!1),container:this.getSettingValue("container",void 0),zIndex:this.getSettingValue("zIndex",1),modelLoaderType:this.getSettingValue("modelLoaderType",void 0),modelLoader:this.getSettingValue("modelLoader",void 0),modelLoaderFactory:this.getSettingValue("modelLoaderFactory",void 0),useDirtySync:this.getSettingValue("useDirtySync",!1),styleReadIntervalMs:this.getSettingValue("styleReadIntervalMs",0),layoutReadIntervalMs:this.getSettingValue("layoutReadIntervalMs",0)}}getSettingValue(t,i){return!this.settings||!(t in this.settings)?i:this.settings[t]}resolveModelLoader(){if(this.engine){if(this.options.modelLoader)return this.options.modelLoader;if(!this.options.modelLoaderFactory&&this.options.modelLoaderType)try{return this.engine.createModelLoader(this.options.modelLoaderType)}catch{}}}resolveModelLoaderFactory(){if(this.engine){if(this.options.modelLoaderFactory)return this.options.modelLoaderFactory;if(this.options.modelLoaderType)return(t,i)=>{let r=i||this.options.modelLoaderType;if(!r)throw new Error("[String3D] Model loader type not provided");return t.createModelLoader(r)}}}createOrGetContainer(){if(this.options.container instanceof HTMLElement)return this.applyContainerStyles(this.options.container),this.options.container;if(typeof this.options.container=="string"){let i=document.getElementById(this.options.container);if(i)return this.applyContainerStyles(i),i}let t=document.createElement("div");return t.id="string-3d-canvas",this.applyContainerStyles(t),document.body.insertBefore(t,document.body.firstChild),t}applyContainerStyles(t){Object.assign(t.style,{position:"fixed",left:"0",top:"0",width:"100vw",height:"100lvh",zIndex:String(this.options.zIndex),pointerEvents:"none"})}onObjectConnected(t){this.isLoading.has(t.id)||!this._scene||(this.isLoading.set(t.id,!0),this._scene.createFromElement(t),this.useDirtySync&&t.htmlElement&&(this.dirtySyncManager.observeElement(t.htmlElement),this.dirtySyncManager.markDirty(t.htmlElement)),this.options.hideHTML&&t.htmlElement&&(t.htmlElement.style.opacity="0",t.htmlElement.style.pointerEvents="none"))}onFrame(t){if(!this.renderer||!this._scene||!this.camera||!this.synchronizer)return;this.needsInitialResize&&(this.needsInitialResize=!1,this.renderer.resize(this.camera),this.synchronizer.updateViewportSize(this.renderer.width,this.renderer.height));let i=this.useDirtySync?this.dirtySyncManager.getDirtySet():null,r=!i||i.size===0;this.batchReadLayouts(this._scene.rootObjects,r,i),this._scene.rootObjects.forEach(a=>{this.syncRecursive(a.el,a,{scale:1},r,i)});let s=this.filterController.collectTargets(this._scene.rootObjects,performance.now(),this.useDirtySync,i);this.renderer.render(this._scene,this.camera,s),this.useDirtySync&&this.dirtySyncManager.clearDirty()}batchReadLayouts(t,i,r){let s=a=>{if(a.el&&(i||!r||r.has(a.el))){let n=a.el.getBoundingClientRect(),l=a.el.offsetWidth||n.width,c=a.el.offsetHeight||n.height;a.el.__layoutCache={rect:n,width:l,height:c}}a.children.forEach(s)};t.forEach(s)}syncRecursive(t,i,r,s,a){if(!this.synchronizer||!t)return;let o=i.type==="particles"||i.type==="text"||s||!a||a.has(t),n=r;if(o){let c=this.synchronizer.syncElement(t,i,r,{dirtySet:a,forceSync:s});c&&typeof c.scale=="number"&&(this.lastSyncData.set(i,c),n=c)}else{let c=this.lastSyncData.get(i);c&&(n=c)}let l=s||o;i.children.forEach(c=>this.syncRecursive(c.el,c,n,l,a))}injectCSS(){if(document.getElementById("string-3d-styles"))return;let t=document.createElement("style");t.id="string-3d-styles",t.textContent=`
30
+ `,R=class R{static markObjectPendingFont(e,t){let i=this.pendingFontObjects.get(e);i||(i=new Set,this.pendingFontObjects.set(e,i)),i.add(t)}static clearObjectPendingFont(e,t){let i=this.pendingFontObjects.get(e);i&&i.delete(t)}static invalidatePendingObjects(e){let t=this.pendingFontObjects.get(e);t&&(t.forEach(i=>{this.geometryKeys.delete(i)}),t.clear())}static injectPseudoElementStyles(){if(this.pseudoStyleInjected||typeof document>"u")return;let e=document.createElement("style");e.setAttribute("data-string3d","pseudo-text"),e.textContent=Ct,document.head.appendChild(e),this.pseudoStyleInjected=!0}static setupSelectableText(e){let t=e.textContent||"";e.dataset.string3dText!==t&&(e.dataset.string3dText=t);let i=getComputedStyle(e);i.position==="static"&&(e.style.position="relative");let r=i.getPropertyValue("--rotate-x").trim()||"0",n=i.getPropertyValue("--rotate-y").trim()||"0",s=i.getPropertyValue("--rotate-z").trim()||"0",o=i.getPropertyValue("--translate-x").trim()||"0px",a=i.getPropertyValue("--translate-y").trim()||"0px",l=i.getPropertyValue("--translate-z").trim()||"0px",h=i.getPropertyValue("--scale").trim()||"1",c=[o!=="0px"&&o!=="0"?`translateX(${o})`:"",a!=="0px"&&a!=="0"?`translateY(${a})`:"",l!=="0px"&&l!=="0"?`translateZ(${l})`:"",r!=="0"?`rotateX(${r}deg)`:"",n!=="0"?`rotateY(${n}deg)`:"",s!=="0"?`rotateZ(${s}deg)`:"",h!=="1"?`scale(${h})`:""].filter(Boolean).join(" ");e.style.setProperty("--string3d-transform",c||"none")}static setupContentObserver(e,t){if(this.contentObservers.has(e))return;let i=e.textContent||"",r=new MutationObserver(n=>{let s=e.textContent||"";if(s===i)return;i=s;let o=t();o&&(this.geometryKeys.delete(o),this.layoutCache.invalidate(e),e.dataset.string3dText!==s&&(e.dataset.string3dText=s))});r.observe(e,{characterData:!0,childList:!0,subtree:!0}),this.contentObservers.set(e,r)}static cleanupContentObserver(e){let t=this.contentObservers.get(e);t&&(t.disconnect(),this.contentObservers.delete(e))}sync(e,t,i,r){R.injectPseudoElementStyles(),R.setupSelectableText(e),R.setupContentObserver(e,()=>i.scene?.getObjectForElement(e)||t);let{rect:n,width:s,height:o}=this.readLayout(e,i),a=this.readStyleBundle(e,i),{translateZ:l,cssScale:h,rotateX:c,rotateY:u,rotateZ:m,cssScaleZ:p,opacity:f,color:g,metalness:D,roughness:v,emissive:y,castShadow:S,receiveShadow:P,materialType:T,fontFamily:F,fontSize:O,textTransform:x,textDepth:M,textCurveSegments:w,bevelEnabled:L,bevelSize:_,bevelThickness:k,bevelOffset:H,bevelSegments:$,fontCss:W}=a,A=n.left+n.width*.5,C=n.top+n.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set(A-i.viewportWidth/2,-(C-i.viewportHeight/2),l);else{let N=i.camera.getFrustumSizeAt(l),Z=A/i.viewportWidth,oe=C/i.viewportHeight;t.object.position.set((Z-.5)*N.width,-(oe-.5)*N.height,l)}t.object.rotation.x=-c*rt,t.object.rotation.y=u*rt,t.object.rotation.z=-m*rt,t.object.rotation.order="XYZ";let b=this.extractCharacterLayout(e,x),z=this.extractRawText(e,x)||b.map(N=>N.char).join(""),I=this.getTextMesh(t,i);if(!I)return{scale:h*(r?.scale||1)};if(b.length===0)return I.visible=!1,{scale:h*(r?.scale||1)};if(f===0)return t.object.visible=!1,{scale:h*(r?.scale||1)};t.object.visible=!0,I.visible=!0;let V=ne.resolveFontFamily(F||"");if(!V)return R.warnedMissingFont||(R.warnedMissingFont=!0),{scale:h*(r?.scale||1)};if(!i.engine.loadFont||!i.engine.createTextGeometry)return R.warnedMissingLoader||(R.warnedMissingLoader=!0),{scale:h*(r?.scale||1)};let G=V.url,K=R.fontCache.get(G);if(!K){if(R.markObjectPendingFont(G,t),!R.fontPromises.has(G)){let N=i.engine.loadFont(G).then(Z=>(Z&&(R.fontCache.set(G,Z),R.invalidatePendingObjects(G)),Z));R.fontPromises.set(G,N)}return I.visible=!1,{scale:h*(r?.scale||1)}}R.clearObjectPendingFont(G,t);let X=b.length>0?`${b.length}:${b[0].x.toFixed(1)},${b[0].y.toFixed(1)}:${b[b.length-1].x.toFixed(1)},${b[b.length-1].y.toFixed(1)}`:"empty",q=i.engine.getTextGeometryLayoutSignature?.({text:z,layoutSignature:X,layout:b,elementWidth:n.width,elementHeight:n.height,fontSize:O})||X,Y=[z,O.toFixed(3),W||"",n.width.toFixed(1),n.height.toFixed(1),q,M.toFixed(3),w.toFixed(3),L?"1":"0",_.toFixed(3),k.toFixed(3),H.toFixed(3),$.toFixed(3)].join("|");if(R.geometryKeys.get(t)!==Y){let N=i.engine.createTextGeometry(z,K,{size:O,height:M,curveSegments:Math.max(1,Math.round(w)),bevelEnabled:L,bevelThickness:k,bevelSize:_,bevelOffset:H,bevelSegments:Math.max(0,Math.round($)),lineHeight:0,letterSpacing:0,align:"left",layout:b,elementWidth:n.width,elementHeight:n.height});N&&(N.computeBoundingBox(),i.engine.applyTextGeometryToMesh(I,N)||(I.geometry&&I.geometry.dispose?.(),I.geometry=N),t.geometry=N,R.geometryKeys.set(t,Y))}let ge=r?.scale||1,ye=i.camera.getMode()==="orthographic"?1:i.camera.getScaleAtZ(l,i.viewportHeight),ae=h*ge*ye,be=ae*p;t.object.scale.set(ae,ae,be);let ve=-s*.5,pe=o*.5;I.position.set(ve,pe,0);let se=R.lastMaterialType.get(t);if(se!==void 0&&se!==T){let N=i.scene;N&&requestAnimationFrame(()=>{N.recreateMaterialForObject(t,e)})}return R.lastMaterialType.set(t,T),me.applyVisualProps(e,t,i.engine,{opacity:f,color:g&&g!=="none"?g:void 0,metalness:Number.isFinite(D)?D:void 0,roughness:Number.isFinite(v)?v:void 0,emissive:me.resolveEmissiveValue(e,y),castShadow:S,receiveShadow:P}),this.updateCustomUniforms(e,t,i),{scale:ae}}cleanup(e,t){R.cleanupContentObserver(e),R.geometryKeys.delete(t)}extractCharacterLayout(e,t){let i=[];if(typeof document>"u"||!document.createRange)return i;let r=document.createRange(),n=e.getBoundingClientRect(),s=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),o;for(;o=s.nextNode();){let a=o.textContent||"";if(!(!a.trim()&&a!==" "))for(let l=0;l<a.length;l++){let h=a[l];if(h===`
31
+ `||h==="\r"||!h.trim())continue;r.setStart(o,l),r.setEnd(o,l+1);let c=r.getClientRects();if(c.length>0){let u=c[0],m=u.left-n.left,p=u.top-n.top,f=this.applyTextTransform(h,t);i.push({char:f,x:m,y:p,width:u.width,height:u.height})}}}return i}extractRawText(e,t){let r=Array.from(e.childNodes).filter(n=>n.nodeType===Node.TEXT_NODE).map(n=>n.textContent||"").join("").split(/\r?\n/).map(n=>n.trim()).filter(n=>n.length>0).join(`
32
+ `).trim();return r?this.applyTextTransform(r,t):""}getTextMesh(e,t){return t.engine.getPrimaryMesh(e.object)}updateCustomUniforms(e,t,i){let r=i.engine.getMaterialFactory?.();if(!r)return;let n=getComputedStyle(e),s=o=>{let a=r.getMaterialDefinition?.(o)??o?.userData?.definition;if(!a?.uniforms)return;let l=r.parseUniformsFromCSS(a,e,n);if(typeof r.applyUniforms=="function"){r.applyUniforms(o,a,l);return}for(let[h,c]of Object.entries(l)){let u=a.uniforms?.[h];if(!u)continue;let m=r.convertUniformValue?.bind(r),p=m?m(u.type,c):c;o.uniforms?.[h]&&(o.uniforms[h].value=p)}};i.engine.forEachMaterial(t.object,s)}readStyleBundle(e,t){return R.styleCache.get(e,t,i=>{let r=i.computedStyleMap?.(),n=getComputedStyle(i),s=(x,M)=>{let w=r?.get?.(x);if(w!=null){let k=typeof w=="object"&&"value"in w?w.value:w,H=typeof k=="number"?k:Number.parseFloat(String(k));if(!Number.isNaN(H))return H}let L=n.getPropertyValue(x),_=Number.parseFloat(L);return Number.isNaN(_)?M:_},o=(x,M="")=>{let w=r?.get?.(x),L=w&&typeof w=="object"&&"value"in w?w.value:w;return typeof L=="string"?L.trim()||M:n.getPropertyValue(x).trim()||M},a=(x,M=!1)=>{let w=o(x);if(!w)return M;let L=w.toLowerCase();return L==="true"||L==="1"||L==="yes"?!0:L==="false"||L==="0"||L==="no"?!1:M},l=o("--material-color"),h=l&&l!=="none"?l:n.color.trim(),c=(()=>{let x=n.fontSize||"",M=Number.parseFloat(x);return Number.isFinite(M)?M:16})(),u=(()=>{let x=n.lineHeight||"";if(!x||x==="normal")return c*1.2;let M=Number.parseFloat(x);return Number.isFinite(M)?x.endsWith("px")?M:M*c:c*1.2})(),m=(()=>{let x=n.letterSpacing||"";if(!x||x==="normal")return 0;let M=Number.parseFloat(x);return Number.isFinite(M)?M:0})(),p=o("--text-fit")||"none",f=s("--text-depth",NaN),g=Number.isFinite(f)?f:Math.max(1,c*.2),D=s("--text-bevel-size",0),v=s("--text-bevel-thickness",0),y=s("--text-bevel-offset",0),S=s("--text-bevel-steps",0),P=(n.textAlign||"left").toLowerCase(),T=P==="center"?"center":P==="right"||P==="end"?"right":"left",F=n.font?.trim(),O=F&&F.length>0?F:[n.fontStyle||"normal",n.fontWeight||"normal",`${n.fontSize||"16px"}/${n.lineHeight||"normal"}`,n.fontFamily||"sans-serif"].join(" ");return{translateZ:s("--translate-z",0),cssScale:s("--scale",1),rotateX:s("--rotate-x",0),rotateY:s("--rotate-y",0),rotateZ:s("--rotate-z",0),cssScaleZ:s("--scale-z",1),opacity:s("--opacity",NaN),color:h,metalness:s("--material-metalness",NaN),roughness:s("--material-roughness",NaN),emissive:o("--material-emissive"),castShadow:a("--shadow-cast",!1),receiveShadow:a("--shadow-receive",!1),materialType:o("--material-type","basic").split("[")[0]||"basic",fontFamily:n.fontFamily||"",fontCss:O,fontSize:c,lineHeight:u,letterSpacing:m,textAlign:T,textTransform:(n.textTransform||"").toLowerCase(),textDepth:g,textCurveSegments:s("--text-curve-segments",8),bevelEnabled:D>0||v>0,bevelSize:D,bevelThickness:v,bevelOffset:y,bevelSegments:S,textFit:p==="cover"||p==="none"?p:"contain"}})}applyTextTransform(e,t){return!t||t==="none"?e:t==="uppercase"?e.toUpperCase():t==="lowercase"?e.toLowerCase():t==="capitalize"?e.replace(/\b(\p{L})/gu,i=>i.toUpperCase()):e}readLayout(e,t){let i=e.__layoutCache;return i||R.layoutCache.get(e,t,r=>{let n=r.getBoundingClientRect();return{rect:n,width:n.width,height:n.height}})}};R.styleCache=new J,R.layoutCache=new J,R.geometryKeys=new WeakMap,R.lastMaterialType=new WeakMap,R.fontCache=new Map,R.fontPromises=new Map,R.pendingFontObjects=new Map,R.contentObservers=new WeakMap,R.warnedMissingFont=!1,R.warnedMissingLoader=!1,R.pseudoStyleInjected=!1;var ke=R;var Ee=class{constructor(e,t,i,r){this.camera=e;this.viewportWidth=t;this.viewportHeight=i;this.engine=r;this.strategies=new Map;this.styleReadIntervalMs=0;this.layoutReadIntervalMs=0;this.strategies.set("box",new me),this.strategies.set("sphere",new me),this.strategies.set("plane",new me),this.strategies.set("cylinder",new me),this.strategies.set("model",new me),this.strategies.set("group",new Ve),this.strategies.set("pointLight",new De),this.strategies.set("ambientLight",new De),this.strategies.set("directionalLight",new De),this.strategies.set("spotLight",new De),this.strategies.set("hemisphereLight",new De),this.strategies.set("particles",new Ne),this.strategies.set("text",new ke)}syncElement(e,t,i,r){let n=this.strategies.get(t.type);return n?n.sync(e,t,{camera:this.camera,viewportWidth:this.viewportWidth,viewportHeight:this.viewportHeight,engine:this.engine,scene:this.scene,dirtySet:r?.dirtySet,forceSync:r?.forceSync,styleReadIntervalMs:this.styleReadIntervalMs,layoutReadIntervalMs:this.layoutReadIntervalMs},i):null}setSyncOptions(e){this.styleReadIntervalMs=Math.max(0,e.styleReadIntervalMs??0),this.layoutReadIntervalMs=Math.max(0,e.layoutReadIntervalMs??0)}setScene(e){this.scene=e}updateViewportSize(e,t){this.viewportWidth=e,this.viewportHeight=t}cleanupElement(e,t){let i=this.strategies.get(t.type);i?.cleanup&&i.cleanup(e,t)}};var Ae=class{constructor(e){this.handleScrollBound=()=>this.handleScroll();this.dirtyElements=new Set;this.observedElements=new Set;this.resizeObserver=null;this.mutationObserver=null;this.enabled=!1;this.domVersion=0;this.attributeFilter=e}enable(){this.enabled||(this.enabled=!0,this.setupObservers(),this.setupScrollListeners())}disable(){this.enabled&&(this.enabled=!1,this.removeScrollListeners(),this.resizeObserver?.disconnect(),this.mutationObserver?.disconnect(),this.dirtyElements.clear(),this.observedElements.clear())}observeElement(e){!this.enabled||this.observedElements.has(e)||(this.observedElements.add(e),this.resizeObserver?.observe(e),this.mutationObserver?.observe(e,{attributes:!0,attributeFilter:this.attributeFilter}))}observeScene(e){this.enabled&&e.forEach(t=>this.observeRecursive(t))}markDirty(e){this.enabled&&(this.dirtyElements.add(e),this.bumpVersion())}markAllDirty(){this.enabled&&(this.observedElements.forEach(e=>this.dirtyElements.add(e)),this.bumpVersion())}getDirtySet(){return this.enabled?this.dirtyElements:null}clearDirty(){this.dirtyElements.clear()}getVersion(){return this.domVersion}isEnabled(){return this.enabled}observeRecursive(e){e.el instanceof HTMLElement&&this.observeElement(e.el),e.children.forEach(t=>this.observeRecursive(t))}handleScroll(){this.markAllDirty()}setupObservers(){typeof ResizeObserver<"u"&&(this.resizeObserver=new ResizeObserver(e=>{e.forEach(t=>{t.target instanceof HTMLElement&&this.markDirty(t.target)})})),typeof MutationObserver<"u"&&(this.mutationObserver=new MutationObserver(e=>{e.forEach(t=>{t.target instanceof HTMLElement&&this.markDirty(t.target)})}))}setupScrollListeners(){window.addEventListener("scroll",this.handleScrollBound,{passive:!0}),window.addEventListener("resize",this.handleScrollBound,{passive:!0}),window.visualViewport&&(window.visualViewport.addEventListener("scroll",this.handleScrollBound,{passive:!0}),window.visualViewport.addEventListener("resize",this.handleScrollBound,{passive:!0}))}removeScrollListeners(){window.removeEventListener("scroll",this.handleScrollBound),window.removeEventListener("resize",this.handleScrollBound),window.visualViewport&&(window.visualViewport.removeEventListener("scroll",this.handleScrollBound),window.visualViewport.removeEventListener("resize",this.handleScrollBound))}bumpVersion(){this.domVersion+=1}};var He=class{constructor(e){this.easingParser=e;this.filterStates=new WeakMap;this.filterWarnings=new WeakMap;this.customFilterRegistry=ce}setCustomFilterRegistry(e){this.customFilterRegistry=e||ce}collectTargets(e,t,i,r){let n=[],s=o=>{let a=o.el;if(a){let l=this.filterStates.get(a)?.animating===!0,h=!i||!r||r.has(a)||l,c=this.readFilterChain(a,t,h);if(c&&c.length>0){let u=!i||!r||r.has(a)||l,m=this.filterStates.get(a)?.effectsKey||this.stringifyFilterChain(c);n.push({object:o,effects:c,effectsKey:m,dirty:u});return}}o.children.forEach(l=>s(l))};return e.forEach(o=>s(o)),n}clear(){this.filterStates=new WeakMap,this.filterWarnings=new WeakMap}readFilterChain(e,t,i){let r=this.filterStates.get(e);if(!i&&r)return r.animating?this.sampleTransition(r,t):r.effects;let n=st(e);if(!n||n==="none"){if(r){if(r.animating&&r.clearOnComplete){let f=this.sampleTransition(r,t);return r.animating?f:(this.filterStates.delete(e),null)}let{duration:u,delay:m,easing:p}=this.getFilterTransition(e);if(u<=0&&r.lastDuration>0&&(u=r.lastDuration,m=r.lastDelay,p=r.lastEasing),u>0){let f=this.makeZeroChain(r.effects);return r.from=r.effects,r.to=f,r.startTime=t+m,r.duration=u,r.easing=p,r.animating=!0,r.clearOnComplete=!0,r.lastDuration=u,r.lastDelay=m,r.lastEasing=p,this.sampleTransition(r,t)}}return this.filterStates.delete(e),null}let{effects:s,warnings:o}=this.parseFilterChain(n);if(this.warnFilterIssues(e,n,o),s.length===0)return null;let a=this.filterStates.get(e);if(!a){let{duration:u,delay:m,easing:p}=this.getFilterTransition(e);if(u>0){let f=this.makeZeroChain(s),g={raw:n,effects:s,animating:!0,from:f,to:s,startTime:t+m,duration:u,easing:p,clearOnComplete:!1,lastDuration:u,lastDelay:m,lastEasing:p};return g.effectsKey=this.stringifyFilterChain(s),this.filterStates.set(e,g),this.sampleTransition(g,t)}return this.filterStates.set(e,{raw:n,effects:s,animating:!1,from:s,to:s,startTime:0,duration:0,easing:f=>f,clearOnComplete:!1,lastDuration:0,lastDelay:0,lastEasing:f=>f,effectsKey:this.stringifyFilterChain(s)}),s}if(a.raw===n){if(a.animating){let u=this.sampleTransition(a,t);return!a.animating&&a.clearOnComplete?(this.filterStates.delete(e),null):u}return a.effects}a.pendingEffects=void 0,a.pendingRaw=void 0;let{duration:l,delay:h,easing:c}=this.getFilterTransition(e);if(l<=0&&a.lastDuration>0&&(l=a.lastDuration,h=a.lastDelay,c=a.lastEasing),l>0){let u=this.canInterpolate(a.effects,s),m=a.animating?this.getCurrentChain(a,t):a.effects;if(!u&&this.isZeroChain(s))return a.pendingRaw=n,a.pendingEffects=s,a.raw=n,a.effects=m,a.from=m,a.to=this.makeZeroChain(m),a.startTime=t+h,a.duration=l,a.easing=c,a.animating=!0,a.clearOnComplete=!1,a.lastDuration=l,a.lastDelay=h,a.lastEasing=c,a.effectsKey=this.stringifyFilterChain(s),this.sampleTransition(a,t);let p=u?m:this.makeZeroChain(s);return a.raw=n,a.effects=s,a.from=p,a.to=s,a.startTime=t+h,a.duration=l,a.easing=c,a.animating=!0,a.clearOnComplete=!1,a.lastDuration=l,a.lastDelay=h,a.lastEasing=c,a.effectsKey=this.stringifyFilterChain(s),this.sampleTransition(a,t)}return a.raw=n,a.effects=s,a.animating=!1,a.clearOnComplete=!1,a.effectsKey=this.stringifyFilterChain(s),s}warnFilterIssues(e,t,i){i.length===0||this.filterWarnings.get(e)===t||this.filterWarnings.set(e,t)}parseFilterChain(e){let t=[],i=[],r=u=>{let p=u.trim().toLowerCase().match(/^(-?\d*\.?\d+)(px)?$/);if(!p)return null;let f=Number.parseFloat(p[1]);return Number.isFinite(f)?f:null},n=u=>{let m=u.trim().toLowerCase();if(!m)return null;if(m.endsWith("%")){let f=Number.parseFloat(m.slice(0,-1));return Number.isFinite(f)?f/100:null}let p=Number.parseFloat(m);return Number.isFinite(p)?p:null},s=u=>{let m=u.trim().toLowerCase();if(!m)return null;if(m.endsWith("rad")){let g=Number.parseFloat(m.slice(0,-3));return Number.isFinite(g)?g:null}let p=m.endsWith("deg")?m.slice(0,-3):m,f=Number.parseFloat(p);return Number.isFinite(f)?f*Math.PI/180:null},o=u=>{let m=u.split(",").map(g=>g.trim()),p=r(m[0]||"");if(p===null)return null;let f=m[1]?n(m[1]):null;return{intensity:Math.max(0,p),threshold:f===null?.8:Math.max(0,Math.min(1,f))}},a=(u,m,p=!1)=>{let f=r(u);return f===null?(t.push(`[String3D] Invalid ${m} value "${u}".`),null):!p&&f<=0?(t.push(`[String3D] ${m} must be > 0.`),null):f},l=(u,m)=>{let p=n(u);return p===null?(t.push(`[String3D] Invalid ${m} value "${u}".`),null):p},h=/([a-zA-Z-]+)\(([^)]*)\)/g,c;for(;c=h.exec(e);){let u=c[1].toLowerCase(),m=(c[2]||"").trim();if(u==="blur"){let p=a(m,"blur",!0);p!==null&&i.push({type:"blur",amount:p})}else if(u==="pixel"||u==="pixelate"){let p=a(m,"pixel",!0);p!==null&&i.push({type:"pixel",size:p})}else if(u==="bloom"){let p=o(m);p?i.push({type:"bloom",...p}):t.push(`[String3D] Invalid bloom value "${m}".`)}else if(u==="brightness"){let p=l(m,"brightness");p!==null&&i.push({type:"brightness",amount:Math.max(0,p)})}else if(u==="contrast"){let p=l(m,"contrast");p!==null&&i.push({type:"contrast",amount:Math.max(0,p)})}else if(u==="saturate"){let p=l(m,"saturate");p!==null&&i.push({type:"saturate",amount:Math.max(0,p)})}else if(u==="grayscale"){let p=l(m,"grayscale");p!==null&&i.push({type:"grayscale",amount:Math.max(0,Math.min(1,p))})}else if(u==="sepia"){let p=l(m,"sepia");p!==null&&i.push({type:"sepia",amount:Math.max(0,Math.min(1,p))})}else if(u==="invert"){let p=l(m,"invert");p!==null&&i.push({type:"invert",amount:Math.max(0,Math.min(1,p))})}else if(u==="hue-rotate"){let p=s(m);p!==null?i.push({type:"hue-rotate",angle:p}):t.push(`[String3D] Invalid hue-rotate value "${m}".`)}else if(u){let p=this.customFilterRegistry.get(u);if(p){let f=p.parse?p.parse(m):{};f===null?t.push(`[String3D] Invalid custom filter "${u}" args "${m}".`):i.push({type:"custom",name:u,uniforms:f})}else t.push(`[String3D] Unknown filter "${u}".`)}}return i.length===0&&t.push("[String3D] No valid filters parsed from --filter."),{effects:i,warnings:t}}getFilterTransition(e){let t=getComputedStyle(e),i=this.splitTransitionList(t.transitionProperty),r=this.splitTransitionList(t.transitionDuration),n=this.splitTransitionList(t.transitionDelay),s=this.splitTransitionList(t.transitionTimingFunction),o=this.findTransitionIndex(i,"--filter");if(o===-1){let c=this.parseTransitionShorthand(t.transition),u=c.get("--filter")||c.get("all");return u||{duration:0,delay:0,easing:m=>m}}let a=this.parseTime(r[o]||r[r.length-1]||"0s"),l=this.parseTime(n[o]||n[n.length-1]||"0s"),h=s[o]||s[s.length-1]||"linear";return{duration:a,delay:l,easing:this.parseEasing(h)}}splitTransitionList(e){let t=[],i="",r=0;for(let n=0;n<e.length;n+=1){let s=e[n];s==="("&&(r+=1),s===")"&&(r=Math.max(0,r-1)),s===","&&r===0?(t.push(i.trim()),i=""):i+=s}return i.trim()&&t.push(i.trim()),t.length>0?t:["all"]}findTransitionIndex(e,t){let i=e.map(n=>n.trim().toLowerCase()),r=i.indexOf(t);return r===-1&&(r=i.indexOf("all")),r}parseTime(e){let t=e.trim().toLowerCase();if(t.endsWith("ms")){let r=Number.parseFloat(t.slice(0,-2));return Number.isFinite(r)?r:0}if(t.endsWith("s")){let r=Number.parseFloat(t.slice(0,-1));return Number.isFinite(r)?r*1e3:0}let i=Number.parseFloat(t);return Number.isFinite(i)?i:0}parseTransitionShorthand(e){let t=new Map;return this.splitTransitionList(e).forEach(r=>{if(!r)return;let n=r.trim().split(/\s+(?![^()]*\))/g),s="",o="",a="",l="";n.forEach(h=>{let c=h.toLowerCase();c.endsWith("ms")||c.endsWith("s")||/^[0-9.]+$/.test(c)?o?a||(a=c):o=c:c.startsWith("cubic-bezier")||c.startsWith("steps")||c==="linear"||c==="ease"||c==="ease-in"||c==="ease-out"||c==="ease-in-out"?l=h:s||(s=h)}),s&&t.set(s.trim().toLowerCase(),{duration:this.parseTime(o||"0s"),delay:this.parseTime(a||"0s"),easing:this.parseEasing(l||"linear")})}),t}parseEasing(e){let t=e.trim();if(!t)return i=>i;if(!this.easingParser)return i=>i;try{let i=this.easingParser(t);return typeof i=="function"?i:r=>r}catch{return i=>i}}canInterpolate(e,t){return e.length!==t.length?!1:e.every((i,r)=>{let n=t[r];if(i.type!==n.type)return!1;if(i.type==="custom"&&n.type==="custom"){if(i.name!==n.name)return!1;let s=Object.keys(i.uniforms||{}),o=Object.keys(n.uniforms||{});return s.length!==o.length?!1:s.every(a=>a in(n.uniforms||{})&&this.isNumeric(i.uniforms?.[a]))}return!0})}makeZeroChain(e){return e.map(t=>{switch(t.type){case"blur":return{type:"blur",amount:0};case"pixel":return{type:"pixel",size:0};case"bloom":return{type:"bloom",intensity:0,threshold:t.threshold};case"brightness":return{type:"brightness",amount:1};case"contrast":return{type:"contrast",amount:1};case"saturate":return{type:"saturate",amount:1};case"grayscale":return{type:"grayscale",amount:0};case"sepia":return{type:"sepia",amount:0};case"invert":return{type:"invert",amount:0};case"hue-rotate":return{type:"hue-rotate",angle:0};case"custom":{let i={};return Object.entries(t.uniforms||{}).forEach(([r,n])=>{i[r]=this.isNumeric(n)?0:n}),{type:"custom",name:t.name,uniforms:i}}default:return t}})}sampleTransition(e,t){if(!e.animating)return e.effects;if(t<e.startTime)return e.from;let i=t-e.startTime,r=Math.max(1,e.duration),n=Math.min(1,Math.max(0,i/r)),s=e.easing(n),o=this.interpolateChain(e.from,e.to,s);return n>=1&&(e.animating=!1,e.from=e.to,e.pendingEffects&&e.pendingRaw===e.raw?(e.effects=e.pendingEffects,e.raw=e.pendingRaw||e.raw,e.pendingEffects=void 0,e.pendingRaw=void 0):e.pendingEffects&&(e.pendingEffects=void 0,e.pendingRaw=void 0)),o}getCurrentChain(e,t){if(!e.animating)return e.effects;if(t<e.startTime)return e.from;let i=t-e.startTime,r=Math.max(1,e.duration),n=Math.min(1,Math.max(0,i/r)),s=e.easing(n);return this.interpolateChain(e.from,e.to,s)}interpolateChain(e,t,i){return this.canInterpolate(e,t)?e.map((r,n)=>this.interpolateEffect(r,t[n],i)):t}interpolateEffect(e,t,i){let r=(n,s)=>n+(s-n)*i;if(e.type==="blur"&&t.type==="blur")return{type:"blur",amount:r(e.amount,t.amount)};if(e.type==="pixel"&&t.type==="pixel")return{type:"pixel",size:r(e.size,t.size)};if(e.type==="bloom"&&t.type==="bloom")return{type:"bloom",intensity:r(e.intensity,t.intensity),threshold:r(e.threshold,t.threshold)};if(e.type==="brightness"&&t.type==="brightness")return{type:"brightness",amount:r(e.amount,t.amount)};if(e.type==="contrast"&&t.type==="contrast")return{type:"contrast",amount:r(e.amount,t.amount)};if(e.type==="saturate"&&t.type==="saturate")return{type:"saturate",amount:r(e.amount,t.amount)};if(e.type==="grayscale"&&t.type==="grayscale")return{type:"grayscale",amount:r(e.amount,t.amount)};if(e.type==="sepia"&&t.type==="sepia")return{type:"sepia",amount:r(e.amount,t.amount)};if(e.type==="invert"&&t.type==="invert")return{type:"invert",amount:r(e.amount,t.amount)};if(e.type==="hue-rotate"&&t.type==="hue-rotate")return{type:"hue-rotate",angle:r(e.angle,t.angle)};if(e.type==="custom"&&t.type==="custom"&&e.name===t.name){let n={};return Object.entries(t.uniforms||{}).forEach(([s,o])=>{let a=e.uniforms?.[s];this.isNumeric(a)&&this.isNumeric(o)?n[s]=r(a,o):n[s]=o}),{type:"custom",name:t.name,uniforms:n}}return t}stringifyFilterChain(e){return e.map(i=>{if(i.type==="blur")return`blur:${i.amount}`;if(i.type==="pixel")return`pixel:${i.size}`;if(i.type==="bloom")return`bloom:${i.intensity},${i.threshold}`;if(i.type==="brightness")return`brightness:${i.amount}`;if(i.type==="contrast")return`contrast:${i.amount}`;if(i.type==="saturate")return`saturate:${i.amount}`;if(i.type==="grayscale")return`grayscale:${i.amount}`;if(i.type==="sepia")return`sepia:${i.amount}`;if(i.type==="invert")return`invert:${i.amount}`;if(i.type==="hue-rotate")return`hue-rotate:${i.angle}`;if(i.type==="custom"){let r=Object.keys(i.uniforms||{}).sort().map(n=>`${n}=${i.uniforms[n]}`).join(",");return`custom:${i.name}:${r}`}return"unknown"}).join("|")}isNumeric(e){return typeof e=="number"&&Number.isFinite(e)}isZeroChain(e){return e.every(t=>{switch(t.type){case"blur":return t.amount<=0;case"pixel":return t.size<=0;case"bloom":return t.intensity<=0;case"brightness":return t.amount===1;case"contrast":return t.amount===1;case"saturate":return t.amount===1;case"grayscale":return t.amount===0;case"sepia":return t.amount===0;case"invert":return t.amount===0;case"hue-rotate":return t.angle===0;case"custom":return!1;default:return!1}})}};var Me=class Me extends ut.StringModule{constructor(t){super(t);this.renderer=null;this.camera=null;this._scene=null;this.synchronizer=null;this.engine=null;this.canvasContainer=null;this.isLoading=new Map;this.useDirtySync=!1;this.lastSyncData=new WeakMap;this.needsInitialResize=!0;this.providerBootstrapped=!1;this.pendingConnectedObjects=new Map;this.htmlKey="3d",this.options=this.buildOptionsFromSettings(),this.dirtySyncManager=new Ae(["style","class","string-3d","string-3d-model-fit","string-3d-model-scale"]),this.filterController=new He(i=>this.tools.easingFunction.process({easing:i})),this.attributesToMap=[...this.attributesToMap,{key:"3d",type:"string",fallback:"box"},{key:"3d-model",type:"string",fallback:""},{key:"3d-segments",type:"number",fallback:32},{key:"3d-segments-width",type:"number",fallback:32},{key:"3d-segments-height",type:"number",fallback:32},{key:"3d-model-loader",type:"string",fallback:""},{key:"3d-model-scale",type:"number",fallback:1},{key:"3d-model-center",type:"boolean",fallback:!1},{key:"3d-model-fit",type:"string",fallback:"contain"}],Me._instance=this}static getInstance(){return Me._instance}get scene(){return this._scene}static setProvider(t){Me.provider=t}static registerFont(t,i,r={}){ne.register(t,i),r.default&&ne.setDefault(t)}static setDefaultFont(t){ne.setDefault(t)}canConnect(t){return super.canConnect(t)}initializeObject(t,i,r,n){super.initializeObject(t,i,r,n),i.setProperty("parentId",null);let s=r.parentElement?.closest('[string-3d="group"]');if(s){let o=s.getAttribute("string-id");o&&(i.setProperty("parentId",o),i.setProperty("parent",s))}}onResize(){this.renderer&&this.camera&&this.synchronizer&&(this.renderer.resize(this.camera),this.synchronizer.updateViewportSize(this.renderer.width,this.renderer.height),this.camera.clearScaleCache(),this.useDirtySync&&this.dirtySyncManager.markAllDirty())}onInit(){if(this.options=this.buildOptionsFromSettings(),!Me.provider)return;this.registerTypedProperties(),this.injectCSS(),this.useDirtySync=!!this.options.useDirtySync,this.useDirtySync&&this.dirtySyncManager.enable();let t=Me.provider,i=t.initialize?.();if(i&&typeof i.then=="function"){i.then(()=>{this.bootstrapProvider(t)}).catch(()=>{});return}this.bootstrapProvider(t)}bootstrapProvider(t){if(this.providerBootstrapped)return;this.engine=t.getEngine(),this.filterController.setCustomFilterRegistry(this.engine.getCustomFilterRegistry?.()),this.canvasContainer=this.createOrGetContainer(),this.renderer=new we(this.canvasContainer,this.engine),this.renderer.attach(),this.camera=new xe(this.engine,"orthographic"),this.camera.setPosition(0,0,1e3),this.camera.lookAt(0,0,0),this.camera.resize(this.renderer.width,this.renderer.height);let i=this.resolveModelLoader(),r=this.resolveModelLoaderFactory();this._scene=new Ie(this.engine,{modelLoader:i,modelLoaderFactory:r}),this._scene.getScene().add(this.camera.camera),this.synchronizer=new Ee(this.camera,this.renderer.width,this.renderer.height,this.engine),this.synchronizer.setScene(this._scene),this.synchronizer.setSyncOptions({styleReadIntervalMs:this.options.styleReadIntervalMs,layoutReadIntervalMs:this.options.layoutReadIntervalMs}),this._scene.setSynchronizer(this.synchronizer),this.providerBootstrapped=!0,this.flushPendingConnections()}flushPendingConnections(){let t=Array.from(this.pendingConnectedObjects.values());this.pendingConnectedObjects.clear(),t.forEach(i=>this.onObjectConnected(i))}onSettingsChange(){this.options=this.buildOptionsFromSettings();let t=!!this.options.useDirtySync;t&&!this.useDirtySync?(this.useDirtySync=!0,this.dirtySyncManager.enable(),this._scene&&this.dirtySyncManager.observeScene(this._scene.rootObjects),this.dirtySyncManager.markAllDirty()):!t&&this.useDirtySync&&(this.useDirtySync=!1,this.dirtySyncManager.disable()),this.synchronizer?.setSyncOptions({styleReadIntervalMs:this.options.styleReadIntervalMs,layoutReadIntervalMs:this.options.layoutReadIntervalMs})}buildOptionsFromSettings(){return{hideHTML:this.getSettingValue("hideHTML",!1),container:this.getSettingValue("container",void 0),zIndex:this.getSettingValue("zIndex",1),modelLoaderType:this.getSettingValue("modelLoaderType",void 0),modelLoader:this.getSettingValue("modelLoader",void 0),modelLoaderFactory:this.getSettingValue("modelLoaderFactory",void 0),useDirtySync:this.getSettingValue("useDirtySync",!1),styleReadIntervalMs:this.getSettingValue("styleReadIntervalMs",0),layoutReadIntervalMs:this.getSettingValue("layoutReadIntervalMs",0)}}getSettingValue(t,i){return!this.settings||!(t in this.settings)?i:this.settings[t]}resolveModelLoader(){if(this.engine){if(this.options.modelLoader)return this.options.modelLoader;if(!this.options.modelLoaderFactory&&this.options.modelLoaderType)try{return this.engine.createModelLoader(this.options.modelLoaderType)}catch{}}}resolveModelLoaderFactory(){if(this.engine){if(this.options.modelLoaderFactory)return this.options.modelLoaderFactory;if(this.options.modelLoaderType)return(t,i)=>{let r=i||this.options.modelLoaderType;if(!r)throw new Error("[String3D] Model loader type not provided");return t.createModelLoader(r)}}}createOrGetContainer(){if(this.options.container instanceof HTMLElement)return this.applyContainerStyles(this.options.container),this.options.container;if(typeof this.options.container=="string"){let i=document.getElementById(this.options.container);if(i)return this.applyContainerStyles(i),i}let t=document.createElement("div");return t.id="string-3d-canvas",this.applyContainerStyles(t),document.body.insertBefore(t,document.body.firstChild),t}applyContainerStyles(t){Object.assign(t.style,{position:"fixed",left:"0",top:"0",width:"100vw",height:"100lvh",zIndex:String(this.options.zIndex),pointerEvents:"none"})}onObjectConnected(t){if(!this._scene){this.pendingConnectedObjects.set(t.id,t);return}if(this.pendingConnectedObjects.delete(t.id),!this.isLoading.has(t.id)&&(this.isLoading.set(t.id,!0),this._scene.createFromElement(t),this.useDirtySync&&t.htmlElement&&(this.dirtySyncManager.observeElement(t.htmlElement),this.dirtySyncManager.markDirty(t.htmlElement)),this.options.hideHTML&&t.htmlElement)){let i=t.htmlElement.getAttribute("string-3d");t.htmlElement.style.color="transparent",t.htmlElement.style.setProperty("-webkit-text-fill-color","transparent")}}onFrame(t){if(!this.renderer||!this._scene||!this.camera||!this.synchronizer)return;this.needsInitialResize&&(this.needsInitialResize=!1,this.renderer.resize(this.camera),this.synchronizer.updateViewportSize(this.renderer.width,this.renderer.height));let i=this.useDirtySync?this.dirtySyncManager.getDirtySet():null,r=!i||i.size===0;this.batchReadLayouts(this._scene.rootObjects,r,i),this._scene.rootObjects.forEach(s=>{this.syncRecursive(s.el,s,{scale:1},r,i)});let n=this.filterController.collectTargets(this._scene.rootObjects,performance.now(),this.useDirtySync,i);this.renderer.render(this._scene,this.camera,n),this.useDirtySync&&this.dirtySyncManager.clearDirty()}batchReadLayouts(t,i,r){let n=s=>{if(s.el&&(i||!r||r.has(s.el))){let a=s.el.getBoundingClientRect(),l=s.el.offsetWidth||a.width,h=s.el.offsetHeight||a.height;s.el.__layoutCache={rect:a,width:l,height:h}}s.children.forEach(n)};t.forEach(n)}syncRecursive(t,i,r,n,s){if(!this.synchronizer||!t)return;let o=i.type==="particles"||i.type==="text"||n||!s||s.has(t),a=r;if(o){let h=this.synchronizer.syncElement(t,i,r,{dirtySet:s,forceSync:n});h&&typeof h.scale=="number"&&(this.lastSyncData.set(i,h),a=h)}else{let h=this.lastSyncData.get(i);h&&(a=h)}let l=n||o;i.children.forEach(h=>this.syncRecursive(h.el,h,a,l,s))}injectCSS(){if(document.getElementById("string-3d-styles"))return;let t=document.createElement("style");t.id="string-3d-styles",t.textContent=`
145
33
  @property --translate-x { syntax: "<number>"; inherits: false; initial-value: 0; }
146
34
  @property --translate-y { syntax: "<number>"; inherits: false; initial-value: 0; }
147
35
  @property --translate-z { syntax: "<number>"; inherits: false; initial-value: 0; }
@@ -245,25 +133,25 @@
245
133
  rotateZ(calc(var(--rotate-z) * 1deg))
246
134
  scale3d(calc(var(--scale) * var(--scale-x)), calc(var(--scale) * var(--scale-y)), calc(var(--scale) * var(--scale-z)));
247
135
  }
248
- `,document.head.appendChild(t)}registerTypedProperties(){let t=globalThis.CSS;if(!t?.registerProperty)return;[{name:"--translate-x",initialValue:"0"},{name:"--translate-y",initialValue:"0"},{name:"--translate-z",initialValue:"0"},{name:"--rotate-x",initialValue:"0"},{name:"--rotate-y",initialValue:"0"},{name:"--rotate-z",initialValue:"0"},{name:"--scale",initialValue:"1"},{name:"--scale-x",initialValue:"1"},{name:"--scale-y",initialValue:"1"},{name:"--scale-z",initialValue:"1"},{name:"--opacity",initialValue:"1"},{name:"--filter",initialValue:"none"},{name:"--material-type",initialValue:"basic"},{name:"--material-color",initialValue:"#ffffff"},{name:"--material-metalness",initialValue:"0"},{name:"--material-roughness",initialValue:"1"},{name:"--material-emissive",initialValue:"#000000"},{name:"--rim-color",initialValue:"#00c8ff"},{name:"--rim-power",initialValue:"1.5"},{name:"--rim-strength",initialValue:"1"},{name:"--uv-strength",initialValue:"0.7"},{name:"--texture-map",initialValue:"none"},{name:"--texture-normal",initialValue:"none"},{name:"--texture-roughness",initialValue:"none"},{name:"--texture-metalness",initialValue:"none"},{name:"--texture-ao",initialValue:"none"},{name:"--light-color",initialValue:"#ffffff"},{name:"--light-intensity",initialValue:"1"},{name:"--light-distance",initialValue:"1000"},{name:"--light-decay",initialValue:"0"},{name:"--light-angle",initialValue:"1.0472"},{name:"--light-penumbra",initialValue:"0"},{name:"--light-ground-color",initialValue:"#ffffff"},{name:"--light-target",initialValue:"none"},{name:"--shadow-cast",initialValue:"0"},{name:"--shadow-receive",initialValue:"0"},{name:"--shadow-bias",initialValue:"0"},{name:"--shadow-map-size",initialValue:"512"},{name:"--texture-flip-y",initialValue:"1"},{name:"--texture-color-space",initialValue:"none"},{name:"--particles-mode",initialValue:"emitter"},{name:"--particles-count",initialValue:"300"},{name:"--particles-size",initialValue:"2"},{name:"--particles-color",initialValue:"#ffffff"},{name:"--particles-opacity",initialValue:"1"},{name:"--particles-spread",initialValue:"120"},{name:"--particles-seed",initialValue:"1"},{name:"--particles-shape",initialValue:"sphere"},{name:"--particles-fit",initialValue:"0"},{name:"--particles-model",initialValue:"none"},{name:"--particles-model-loader",initialValue:"none"},{name:"--particles-model-node",initialValue:"none"},{name:"--instance-model",initialValue:"none"},{name:"--instance-model-loader",initialValue:"none"},{name:"--instance-model-node",initialValue:"none"},{name:"--emit-rate",initialValue:"30"},{name:"--emit-burst",initialValue:"0"},{name:"--particle-life",initialValue:"2.5"},{name:"--particle-speed",initialValue:"40"},{name:"--particle-direction",initialValue:"0 1 0"},{name:"--particle-gravity",initialValue:"0 -30 0"},{name:"--particle-drag",initialValue:"0.1"},{name:"--particle-size-variation",initialValue:"0.6"},{name:"--particle-color-variation",initialValue:"0.2"},{name:"--instance-shape",initialValue:"sphere"},{name:"--instance-scale",initialValue:"1"},{name:"--instance-scale-variation",initialValue:"0.5"},{name:"--instance-rotation-speed",initialValue:"0.4"},{name:"--instance-jitter",initialValue:"0.2"},{name:"--instance-flow",initialValue:"0.3"},{name:"--instance-disperse",initialValue:"0"},{name:"--instance-scatter",initialValue:"0"},{name:"--instance-scatter-x",initialValue:"0"},{name:"--instance-scatter-y",initialValue:"0"},{name:"--instance-scatter-z",initialValue:"0"},{name:"--text-depth",initialValue:"8"},{name:"--text-curve-segments",initialValue:"8"},{name:"--text-bevel-size",initialValue:"0"},{name:"--text-bevel-thickness",initialValue:"0"},{name:"--text-bevel-offset",initialValue:"0"},{name:"--text-bevel-steps",initialValue:"0"},{name:"--text-fit",initialValue:"contain"}].forEach(({name:r,initialValue:s})=>{try{t.registerProperty({name:r,syntax:r==="--filter"||r==="--light-target"||r.startsWith("--texture-")||r==="--material-type"||r==="--particles-mode"||r==="--particles-shape"||r==="--particles-model"||r==="--particles-model-loader"||r==="--particles-model-node"||r==="--instance-model"||r==="--instance-model-loader"||r==="--instance-model-node"||r==="--particle-direction"||r==="--particle-gravity"||r==="--instance-shape"||r==="--text-fit"?"*":r.includes("color")||r.includes("emissive")?"<color>":"<number>",inherits:!1,initialValue:s})}catch{}})}destroy(){this.renderer?.destroy(),this._scene?.destroy(),this.isLoading.clear(),this.dirtySyncManager.disable(),this.filterController.clear(),this.lastSyncData=new WeakMap,document.getElementById("string-3d-styles")?.remove(),this.canvasContainer?.id==="string-3d-canvas"&&this.canvasContainer.remove(),super.destroy()}};Me.provider=null,Me._instance=null;var We=Me;var Le=class{constructor(e){this.textureCache=new Map;this.THREE=e,this.textureLoader=new e.TextureLoader}supports(e){return!0}create(e,t){let i=this.buildUniforms(e,t),r;return e.extends==="shader"||!e.extends&&e.vertexShader?r=this.createShaderMaterial(e,i):r=this.createExtendedMaterial(e,i),this.applyMaterialProperties(r,e),{material:r,definition:e,update:o=>{this.updateUniforms(r,e,o)},dispose:()=>{r.dispose()}}}parseUniformsFromCSS(e,t,i){return Ke(e,t,i)}buildUniforms(e,t){let i={};if(e.uniforms)for(let[r,s]of Object.entries(e.uniforms)){let a=t?.[r]??s.value;a=this.convertUniformValue(s.type,a),i[r]={value:a}}return i}convertUniformValue(e,t){switch(e){case"vec2":return Array.isArray(t)?new this.THREE.Vector2(t[0],t[1]):t;case"vec3":return Array.isArray(t)?new this.THREE.Vector3(t[0],t[1],t[2]):t;case"vec4":return Array.isArray(t)?new this.THREE.Vector4(t[0],t[1],t[2],t[3]):t;case"color":return Array.isArray(t)?new this.THREE.Color(t[0],t[1],t[2]):typeof t=="string"?new this.THREE.Color(t):t;case"texture":return typeof t=="string"&&t?this.loadTexture(t):t;default:return t}}loadTexture(e){if(this.textureCache.has(e))return this.textureCache.get(e);let t=this.textureLoader.load(e);return this.textureCache.set(e,t),t}createShaderMaterial(e,t){let i=new this.THREE.ShaderMaterial({uniforms:t,vertexShader:e.vertexShader||this.getDefaultVertexShader(),fragmentShader:e.fragmentShader||this.getDefaultFragmentShader(),lights:e.lights??!1,transparent:e.properties?.transparent??!1});return i.userData.customUniforms=t,i.userData.definition=e,i}createExtendedMaterial(e,t){let i=e.extends||"standard",r;switch(i){case"basic":r=this.THREE.MeshBasicMaterial;break;case"physical":r=this.THREE.MeshPhysicalMaterial;break;case"standard":default:r=this.THREE.MeshStandardMaterial;break}let s=new r({transparent:e.properties?.transparent??!1});if(e.injections&&e.injections.length>0){let a=Qe(e.injections);s.onBeforeCompile=o=>{Object.assign(o.uniforms,t),o.vertexShader=this.injectVertexShader(o.vertexShader,a,t),o.fragmentShader=this.injectFragmentShader(o.fragmentShader,a,t),s.userData.shader=o}}return s.userData.customUniforms=t,s.userData.definition=e,s}injectVertexShader(e,t,i){let r=e,s=t.get("vertex_pars");s&&(r=r.replace("#include <common>",`#include <common>
249
- ${s}`));let a=t.get("vertex_header");if(a){let l=this.generateUniformDeclarations(i);r=r.replace("void main() {",`${l}
250
- ${a}
136
+ `,document.head.appendChild(t)}registerTypedProperties(){let t=globalThis.CSS;if(!t?.registerProperty)return;[{name:"--translate-x",initialValue:"0"},{name:"--translate-y",initialValue:"0"},{name:"--translate-z",initialValue:"0"},{name:"--rotate-x",initialValue:"0"},{name:"--rotate-y",initialValue:"0"},{name:"--rotate-z",initialValue:"0"},{name:"--scale",initialValue:"1"},{name:"--scale-x",initialValue:"1"},{name:"--scale-y",initialValue:"1"},{name:"--scale-z",initialValue:"1"},{name:"--opacity",initialValue:"1"},{name:"--filter",initialValue:"none"},{name:"--material-type",initialValue:"basic"},{name:"--material-color",initialValue:"#ffffff"},{name:"--material-metalness",initialValue:"0"},{name:"--material-roughness",initialValue:"1"},{name:"--material-emissive",initialValue:"#000000"},{name:"--rim-color",initialValue:"#00c8ff"},{name:"--rim-power",initialValue:"1.5"},{name:"--rim-strength",initialValue:"1"},{name:"--uv-strength",initialValue:"0.7"},{name:"--texture-map",initialValue:"none"},{name:"--texture-normal",initialValue:"none"},{name:"--texture-roughness",initialValue:"none"},{name:"--texture-metalness",initialValue:"none"},{name:"--texture-ao",initialValue:"none"},{name:"--light-color",initialValue:"#ffffff"},{name:"--light-intensity",initialValue:"1"},{name:"--light-distance",initialValue:"1000"},{name:"--light-decay",initialValue:"0"},{name:"--light-angle",initialValue:"1.0472"},{name:"--light-penumbra",initialValue:"0"},{name:"--light-ground-color",initialValue:"#ffffff"},{name:"--light-target",initialValue:"none"},{name:"--shadow-cast",initialValue:"0"},{name:"--shadow-receive",initialValue:"0"},{name:"--shadow-bias",initialValue:"0"},{name:"--shadow-map-size",initialValue:"512"},{name:"--texture-flip-y",initialValue:"1"},{name:"--texture-color-space",initialValue:"none"},{name:"--particles-mode",initialValue:"emitter"},{name:"--particles-count",initialValue:"300"},{name:"--particles-size",initialValue:"2"},{name:"--particles-color",initialValue:"#ffffff"},{name:"--particles-opacity",initialValue:"1"},{name:"--particles-spread",initialValue:"120"},{name:"--particles-seed",initialValue:"1"},{name:"--particles-shape",initialValue:"sphere"},{name:"--particles-fit",initialValue:"0"},{name:"--particles-model",initialValue:"none"},{name:"--particles-model-loader",initialValue:"none"},{name:"--particles-model-node",initialValue:"none"},{name:"--instance-model",initialValue:"none"},{name:"--instance-model-loader",initialValue:"none"},{name:"--instance-model-node",initialValue:"none"},{name:"--emit-rate",initialValue:"30"},{name:"--emit-burst",initialValue:"0"},{name:"--particle-life",initialValue:"2.5"},{name:"--particle-speed",initialValue:"40"},{name:"--particle-direction",initialValue:"0 1 0"},{name:"--particle-gravity",initialValue:"0 -30 0"},{name:"--particle-drag",initialValue:"0.1"},{name:"--particle-size-variation",initialValue:"0.6"},{name:"--particle-color-variation",initialValue:"0.2"},{name:"--instance-shape",initialValue:"sphere"},{name:"--instance-scale",initialValue:"1"},{name:"--instance-scale-variation",initialValue:"0.5"},{name:"--instance-rotation-speed",initialValue:"0.4"},{name:"--instance-jitter",initialValue:"0.2"},{name:"--instance-flow",initialValue:"0.3"},{name:"--instance-disperse",initialValue:"0"},{name:"--instance-scatter",initialValue:"0"},{name:"--instance-scatter-x",initialValue:"0"},{name:"--instance-scatter-y",initialValue:"0"},{name:"--instance-scatter-z",initialValue:"0"},{name:"--text-depth",initialValue:"8"},{name:"--text-curve-segments",initialValue:"8"},{name:"--text-bevel-size",initialValue:"0"},{name:"--text-bevel-thickness",initialValue:"0"},{name:"--text-bevel-offset",initialValue:"0"},{name:"--text-bevel-steps",initialValue:"0"},{name:"--text-fit",initialValue:"contain"}].forEach(({name:r,initialValue:n})=>{try{t.registerProperty({name:r,syntax:r==="--filter"||r==="--light-target"||r.startsWith("--texture-")||r==="--material-type"||r==="--particles-mode"||r==="--particles-shape"||r==="--particles-model"||r==="--particles-model-loader"||r==="--particles-model-node"||r==="--instance-model"||r==="--instance-model-loader"||r==="--instance-model-node"||r==="--particle-direction"||r==="--particle-gravity"||r==="--instance-shape"||r==="--text-fit"?"*":r.includes("color")||r.includes("emissive")?"<color>":"<number>",inherits:!1,initialValue:n})}catch{}})}destroy(){this.renderer?.destroy(),this._scene?.destroy(),this.isLoading.clear(),this.dirtySyncManager.disable(),this.filterController.clear(),this.lastSyncData=new WeakMap,this.pendingConnectedObjects.clear(),this.providerBootstrapped=!1,document.getElementById("string-3d-styles")?.remove(),this.canvasContainer?.id==="string-3d-canvas"&&this.canvasContainer.remove(),super.destroy()}};Me.provider=null,Me._instance=null;var Ue=Me;var Re=class{constructor(e){this.textureCache=new Map;this.meshTransmissionMaterialClass=null;this.THREE=e,this.textureLoader=new e.TextureLoader}supports(e){return!0}create(e,t){let i=this.buildUniforms(e,t),r;return e.extends==="shader"||!e.extends&&e.vertexShader?r=this.createShaderMaterial(e,i):r=this.createExtendedMaterial(e,i),this.applyMaterialProperties(r,e),{material:r,definition:e,update:o=>{this.updateUniforms(r,e,o)},dispose:()=>{r.dispose()}}}parseUniformsFromCSS(e,t,i){return qe(e,t,i)}getMaterialDefinition(e){return e?.userData?.definition||null}isShaderMaterial(e){return!!e?.isShaderMaterial}applyUniforms(e,t,i){let r=e?.userData?.shader,n=e?.userData?.customUniforms;if(r?.uniforms)for(let[s,o]of Object.entries(i)){let a=t.uniforms?.[s];a&&r.uniforms[s]&&(r.uniforms[s].value=this.convertUniformValue(a.type,o))}if(n)for(let[s,o]of Object.entries(i)){let a=t.uniforms?.[s];a&&n[s]&&(n[s].value=this.convertUniformValue(a.type,o))}if(e?.uniforms)for(let[s,o]of Object.entries(i)){let a=t.uniforms?.[s];a&&e.uniforms[s]&&(e.uniforms[s].value=this.convertUniformValue(a.type,o))}}buildUniforms(e,t){let i={};if(e.uniforms)for(let[r,n]of Object.entries(e.uniforms)){let s=t?.[r]??n.value;s=this.convertUniformValue(n.type,s),i[r]={value:s}}return i}convertUniformValue(e,t){switch(e){case"vec2":return Array.isArray(t)?new this.THREE.Vector2(t[0],t[1]):t;case"vec3":return Array.isArray(t)?new this.THREE.Vector3(t[0],t[1],t[2]):t;case"vec4":return Array.isArray(t)?new this.THREE.Vector4(t[0],t[1],t[2],t[3]):t;case"color":return Array.isArray(t)?new this.THREE.Color(t[0],t[1],t[2]):typeof t=="string"?new this.THREE.Color(t):t;case"texture":return typeof t=="string"&&t?this.loadTexture(t):t;default:return t}}loadTexture(e){if(this.textureCache.has(e))return this.textureCache.get(e);let t=this.textureLoader.load(e);return this.textureCache.set(e,t),t}createShaderMaterial(e,t){let i=new this.THREE.ShaderMaterial({uniforms:t,vertexShader:e.vertexShader||this.getDefaultVertexShader(),fragmentShader:e.fragmentShader||this.getDefaultFragmentShader(),lights:e.lights??!1,transparent:e.properties?.transparent??!1});return i.userData.customUniforms=t,i.userData.definition=e,i}createExtendedMaterial(e,t){let i=e.extends||"standard",r;switch(i){case"basic":r=this.THREE.MeshBasicMaterial;break;case"physical":r=this.THREE.MeshPhysicalMaterial;break;case"standard":default:r=this.THREE.MeshStandardMaterial;break}let n=new r({transparent:e.properties?.transparent??!1});if(e.injections&&e.injections.length>0){let s=Ke(e.injections);n.onBeforeCompile=o=>{Object.assign(o.uniforms,t),o.vertexShader=this.injectVertexShader(o.vertexShader,s,t),o.fragmentShader=this.injectFragmentShader(o.fragmentShader,s,t),n.userData.shader=o}}return n.userData.customUniforms=t,n.userData.definition=e,n}injectVertexShader(e,t,i){let r=e,n=t.get("vertex_pars");n&&(r=r.replace("#include <common>",`#include <common>
137
+ ${n}`));let s=t.get("vertex_header");if(s){let l=this.generateUniformDeclarations(i);r=r.replace("void main() {",`${l}
138
+ ${s}
251
139
  void main() {`)}let o=t.get("vertex_transform");o&&(r=r.replace("#include <begin_vertex>",`#include <begin_vertex>
252
- ${o}`));let n=t.get("vertex_output");return n&&(r=r.replace("#include <project_vertex>",`${n}
253
- #include <project_vertex>`)),r}injectFragmentShader(e,t,i){let r=e,s=t.get("fragment_pars");s&&(r=r.replace("#include <common>",`#include <common>
254
- ${s}`));let a=t.get("fragment_header");if(a){let f=this.generateUniformDeclarations(i);r=r.replace("void main() {",`${f}
255
- ${a}
140
+ ${o}`));let a=t.get("vertex_output");return a&&(r=r.replace("#include <project_vertex>",`${a}
141
+ #include <project_vertex>`)),r}injectFragmentShader(e,t,i){let r=e,n=t.get("fragment_pars");n&&(r=r.replace("#include <common>",`#include <common>
142
+ ${n}`));let s=t.get("fragment_header");if(s){let g=this.generateUniformDeclarations(i);r=r.replace("void main() {",`${g}
143
+ ${s}
256
144
  void main() {`)}let o=t.get("fragment_color");o&&(r=r.replace("#include <color_fragment>",`#include <color_fragment>
257
- ${o}`));let n=t.get("fragment_normal");n&&(r=r.replace("#include <normal_fragment_maps>",`#include <normal_fragment_maps>
258
- ${n}`));let l=t.get("fragment_roughness");l&&(r=r.replace("#include <roughnessmap_fragment>",`#include <roughnessmap_fragment>
259
- ${l}`));let c=t.get("fragment_metalness");c&&(r=r.replace("#include <metalnessmap_fragment>",`#include <metalnessmap_fragment>
260
- ${c}`));let h=t.get("fragment_ao");h&&(r=r.replace("#include <aomap_fragment>",`#include <aomap_fragment>
261
- ${h}`));let u=t.get("fragment_transmission");u&&(r=r.replace("#include <transmission_fragment>",`#include <transmission_fragment>
145
+ ${o}`));let a=t.get("fragment_normal");a&&(r=r.replace("#include <normal_fragment_maps>",`#include <normal_fragment_maps>
146
+ ${a}`));let l=t.get("fragment_roughness");l&&(r=r.replace("#include <roughnessmap_fragment>",`#include <roughnessmap_fragment>
147
+ ${l}`));let h=t.get("fragment_metalness");h&&(r=r.replace("#include <metalnessmap_fragment>",`#include <metalnessmap_fragment>
148
+ ${h}`));let c=t.get("fragment_ao");c&&(r=r.replace("#include <aomap_fragment>",`#include <aomap_fragment>
149
+ ${c}`));let u=t.get("fragment_transmission");u&&(r=r.replace("#include <transmission_fragment>",`#include <transmission_fragment>
262
150
  ${u}`));let m=t.get("fragment_lights");m&&(r=r.replace("#include <lights_physical_fragment>",`#include <lights_physical_fragment>
263
- ${m}`));let d=t.get("fragment_emissive");d&&(r=r.replace("#include <emissivemap_fragment>",`#include <emissivemap_fragment>
264
- ${d}`));let p=t.get("fragment_output");return p&&(r=r.replace("#include <dithering_fragment>",`${p}
265
- #include <dithering_fragment>`)),r}generateUniformDeclarations(e){let t=[];for(let[i,r]of Object.entries(e)){let s=this.inferGLSLType(r.value);t.push(`uniform ${s} ${i};`)}return t.join(`
266
- `)}inferGLSLType(e){return typeof e=="number"?"float":typeof e=="boolean"?"bool":e instanceof this.THREE.Vector2?"vec2":e instanceof this.THREE.Vector3?"vec3":e instanceof this.THREE.Vector4?"vec4":e instanceof this.THREE.Color?"vec3":e instanceof this.THREE.Matrix3?"mat3":e instanceof this.THREE.Matrix4?"mat4":e?.isTexture?"sampler2D":"float"}applyMaterialProperties(e,t){let i=t.properties;if(i){if(i.transparent!==void 0&&(e.transparent=i.transparent),i.side!==void 0)switch(i.side){case"front":e.side=this.THREE.FrontSide;break;case"back":e.side=this.THREE.BackSide;break;case"double":e.side=this.THREE.DoubleSide;break}if(i.depthWrite!==void 0&&(e.depthWrite=i.depthWrite),i.depthTest!==void 0&&(e.depthTest=i.depthTest),i.blending!==void 0)switch(i.blending){case"additive":e.blending=this.THREE.AdditiveBlending;break;case"subtractive":e.blending=this.THREE.SubtractiveBlending;break;case"multiply":e.blending=this.THREE.MultiplyBlending;break;default:e.blending=this.THREE.NormalBlending}i.wireframe!==void 0&&(e.wireframe=i.wireframe)}}updateUniforms(e,t,i){let r=e.userData?.shader,s=e.userData?.customUniforms;if(r?.uniforms)for(let[a,o]of Object.entries(i)){let n=t.uniforms?.[a];n&&r.uniforms[a]&&(r.uniforms[a].value=this.convertUniformValue(n.type,o))}else if(s)for(let[a,o]of Object.entries(i)){let n=t.uniforms?.[a];n&&s[a]&&(s[a].value=this.convertUniformValue(n.type,o))}if(e.uniforms)for(let[a,o]of Object.entries(i)){let n=t.uniforms?.[a];n&&e.uniforms[a]&&(e.uniforms[a].value=this.convertUniformValue(n.type,o))}}getDefaultVertexShader(){return`
151
+ ${m}`));let p=t.get("fragment_emissive");p&&(r=r.replace("#include <emissivemap_fragment>",`#include <emissivemap_fragment>
152
+ ${p}`));let f=t.get("fragment_output");return f&&(r=r.replace("#include <dithering_fragment>",`${f}
153
+ #include <dithering_fragment>`)),r}generateUniformDeclarations(e){let t=[];for(let[i,r]of Object.entries(e)){let n=this.inferGLSLType(r.value);t.push(`uniform ${n} ${i};`)}return t.join(`
154
+ `)}inferGLSLType(e){return typeof e=="number"?"float":typeof e=="boolean"?"bool":e instanceof this.THREE.Vector2?"vec2":e instanceof this.THREE.Vector3?"vec3":e instanceof this.THREE.Vector4?"vec4":e instanceof this.THREE.Color?"vec3":e instanceof this.THREE.Matrix3?"mat3":e instanceof this.THREE.Matrix4?"mat4":e?.isTexture?"sampler2D":"float"}applyMaterialProperties(e,t){let i=t.properties;if(i){if(i.transparent!==void 0&&(e.transparent=i.transparent),i.opacity!==void 0&&"opacity"in e&&(e.opacity=i.opacity),i.side!==void 0)switch(i.side){case"front":e.side=this.THREE.FrontSide;break;case"back":e.side=this.THREE.BackSide;break;case"double":e.side=this.THREE.DoubleSide;break}if(i.depthWrite!==void 0&&(e.depthWrite=i.depthWrite),i.depthTest!==void 0&&(e.depthTest=i.depthTest),i.blending!==void 0)switch(i.blending){case"additive":e.blending=this.THREE.AdditiveBlending;break;case"subtractive":e.blending=this.THREE.SubtractiveBlending;break;case"multiply":e.blending=this.THREE.MultiplyBlending;break;default:e.blending=this.THREE.NormalBlending}i.wireframe!==void 0&&(e.wireframe=i.wireframe),i.color!==void 0&&e.color&&e.color.set(i.color),i.emissive!==void 0&&e.emissive&&e.emissive.set(i.emissive),i.metalness!==void 0&&"metalness"in e&&(e.metalness=i.metalness),i.roughness!==void 0&&"roughness"in e&&(e.roughness=i.roughness),i.transmission!==void 0&&"transmission"in e&&(e.transmission=i.transmission),i.thickness!==void 0&&"thickness"in e&&(e.thickness=i.thickness),i.ior!==void 0&&"ior"in e&&(e.ior=i.ior),i.reflectivity!==void 0&&"reflectivity"in e&&(e.reflectivity=i.reflectivity),i.clearcoat!==void 0&&"clearcoat"in e&&(e.clearcoat=i.clearcoat),i.clearcoatRoughness!==void 0&&"clearcoatRoughness"in e&&(e.clearcoatRoughness=i.clearcoatRoughness),i.attenuationDistance!==void 0&&"attenuationDistance"in e&&(e.attenuationDistance=i.attenuationDistance),i.attenuationColor!==void 0&&e.attenuationColor&&e.attenuationColor.set(i.attenuationColor)}}updateUniforms(e,t,i){this.applyUniforms(e,t,i)}getDefaultVertexShader(){return`
267
155
  varying vec2 vUv;
268
156
  varying vec3 vNormal;
269
157
  varying vec3 vPosition;
@@ -282,7 +170,120 @@ ${d}`));let p=t.get("fragment_output");return p&&(r=r.replace("#include <ditheri
282
170
  void main() {
283
171
  gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
284
172
  }
285
- `}dispose(){this.textureCache.forEach(e=>e.dispose()),this.textureCache.clear()}};var Re=class{constructor(e,t={}){this.materialFactory=null;this.particleModelCache=new Map;this.particleModelPromiseCache=new Map;this.fontCache=new Map;this.fontPromiseCache=new Map;this.fontMetricsCache=new Map;this.THREE=e,this.loaders=t,this.materialFactory=new Le(e)}getMaterialFactory(){return this.materialFactory}createVector3(e=0,t=0,i=0){return new this.THREE.Vector3(e,t,i)}createVector2(e=0,t=0){return new this.THREE.Vector2(e,t)}createQuaternion(e=0,t=0,i=0,r=1){return new this.THREE.Quaternion(e,t,i,r)}createEuler(e=0,t=0,i=0,r="XYZ"){return new this.THREE.Euler(e,t,i,r)}createMatrix4(){return new this.THREE.Matrix4}createBox3(e,t){return new this.THREE.Box3(e,t)}createScene(){return new this.THREE.Scene}createRenderer(e){let t=new this.THREE.WebGLRenderer(e);return t.outputEncoding=this.THREE.sRGBEncoding,t}createPerspectiveCamera(e=45,t=1,i=.1,r=2e3){return new this.THREE.PerspectiveCamera(e,t,i,r)}createOrthographicCamera(e,t,i,r,s=.1,a=1e4){return new this.THREE.OrthographicCamera(e,t,i,r,s,a)}createGroup(){return new this.THREE.Group}createMesh(e,t){return new this.THREE.Mesh(e,t)}createBoxGeometry(e,t,i){return new this.THREE.BoxGeometry(e,t,i)}createSphereGeometry(e,t=32,i=32){return new this.THREE.SphereGeometry(e,t,i)}createPlaneGeometry(e,t){return new this.THREE.PlaneGeometry(e,t)}createCylinderGeometry(e,t,i,r=32){return new this.THREE.CylinderGeometry(e,t,i,r)}createMeshBasicMaterial(e){return new this.THREE.MeshBasicMaterial(e)}createMeshStandardMaterial(e){return new this.THREE.MeshStandardMaterial(e)}createShaderMaterial(e){return new this.THREE.ShaderMaterial(e)}createPointLight(e,t=1,i=0,r=2){return new this.THREE.PointLight(e,t,i,r)}createSpotLight(e,t=1,i=0,r=Math.PI/3,s=0,a=1){return new this.THREE.SpotLight(e,t,i,r,s,a)}createHemisphereLight(e,t,i=1){return new this.THREE.HemisphereLight(e,t,i)}createAmbientLight(e,t=1){return new this.THREE.AmbientLight(e,t)}createDirectionalLight(e,t=1){return new this.THREE.DirectionalLight(e,t)}createTextureLoader(){return new this.THREE.TextureLoader}createModelLoader(e){let t=this.loaders[e];if(!t)throw new Error(`[ThreeJSEngine] Model loader "${e}" not registered`);return new t}createRenderTarget(e,t,i={}){let r={minFilter:this.THREE.LinearFilter,magFilter:this.THREE.LinearFilter,format:this.THREE.RGBAFormat,depthBuffer:!0,stencilBuffer:!1};return new this.THREE.WebGLRenderTarget(e,t,{...r,...i})}loadFont(e){let t=e.trim();if(!t||t==="none")return Promise.resolve(null);if(this.fontCache.has(t))return Promise.resolve(this.fontCache.get(t));let i=this.fontPromiseCache.get(t);if(i)return i;let r=pe.isFontFile(t),s;return r?s=this.loadFontWithConverter(t):s=this.loadFontWithLoader(t),this.fontPromiseCache.set(t,s),s}async loadFontWithConverter(e){try{let t=await pe.load(e),i=this.createFontFromData(t);return this.fontCache.set(e,i),i}catch{return null}}loadFontWithLoader(e){let t=this.loaders.font||this.loaders.FontLoader;if(!t)return Promise.resolve(null);let i=new t;return new Promise(r=>{i.load(e,s=>{this.fontCache.set(e,s),r(s)},void 0,()=>{r(null)})})}createFontFromData(e){let t=this.loaders.font||this.loaders.FontLoader;if(t&&t.utils&&t.utils.convert){let r=new t;if(r.parse)return r.parse(e)}return{data:e,isFont:!0,generateShapes:(r,s)=>this.generateShapesFromFontData(e,r,s,!1),generateNormalizedShapes:(r,s)=>this.generateShapesFromFontData(e,r,s,!0)}}generateShapesFromFontData(e,t,i,r=!1){let s=[],a=i/e.resolution,o=t[0];if(!o)return s;let n=e.glyphs[o];if(!n||!n.o)return s;let l=0;r&&(l=-this.getOutlineXMin(n.o)*a);let c=this.parseOutlineToShapes(n.o,a,l,e?.outlineFormat);return s.push(...c),s}getOutlineXMin(e){let t=e.split(" "),i=1/0,r=0;for(;r<t.length;)switch(t[r]){case"m":case"l":i=Math.min(i,parseFloat(t[r+1])||0),r+=3;break;case"q":i=Math.min(i,parseFloat(t[r+1])||0),i=Math.min(i,parseFloat(t[r+3])||0),r+=5;break;case"b":i=Math.min(i,parseFloat(t[r+1])||0),i=Math.min(i,parseFloat(t[r+3])||0),i=Math.min(i,parseFloat(t[r+5])||0),r+=7;break;default:r++;break}return i===1/0?0:i}getOutlineXMax(e){let t=e.split(" "),i=-1/0,r=0;for(;r<t.length;)switch(t[r]){case"m":case"l":i=Math.max(i,parseFloat(t[r+1])||0),r+=3;break;case"q":i=Math.max(i,parseFloat(t[r+1])||0),i=Math.max(i,parseFloat(t[r+3])||0),r+=5;break;case"b":i=Math.max(i,parseFloat(t[r+1])||0),i=Math.max(i,parseFloat(t[r+3])||0),i=Math.max(i,parseFloat(t[r+5])||0),r+=7;break;default:r++;break}return i===-1/0?0:i}getOutlineYMin(e){let t=e.split(" "),i=1/0,r=0;for(;r<t.length;)switch(t[r]){case"m":case"l":i=Math.min(i,parseFloat(t[r+2])||0),r+=3;break;case"q":i=Math.min(i,parseFloat(t[r+2])||0),i=Math.min(i,parseFloat(t[r+4])||0),r+=5;break;case"b":i=Math.min(i,parseFloat(t[r+2])||0),i=Math.min(i,parseFloat(t[r+4])||0),i=Math.min(i,parseFloat(t[r+6])||0),r+=7;break;default:r++;break}return i===1/0?0:i}pointInPolygon(e,t,i){let r=!1;for(let s=0,a=i.length-1;s<i.length;a=s++){let o=i[s].x,n=i[s].y,l=i[a].x,c=i[a].y;n>t!=c>t&&e<(l-o)*(t-n)/(c-n)+o&&(r=!r)}return r}samplePathPoints(e,t=80){return e?.getPoints?e.getPoints(t).map(i=>({x:i.x,y:i.y})):[]}getBoundingBox(e){if(e.length===0)return{minX:0,maxX:0,minY:0,maxY:0,area:0};let t=1/0,i=-1/0,r=1/0,s=-1/0;for(let a of e)a.x<t&&(t=a.x),a.x>i&&(i=a.x),a.y<r&&(r=a.y),a.y>s&&(s=a.y);return{minX:t,maxX:i,minY:r,maxY:s,area:(i-t)*(s-r)}}getInteriorPoint(e){if(e.length<3)return e[0]||{x:0,y:0};let t=e.map(r=>new this.THREE.Vector2(r.x,r.y)),i=this.THREE.ShapeUtils.triangulateShape(t,[]);for(let r of i){let s=t[r[0]],a=t[r[1]],o=t[r[2]],n=(s.x+a.x+o.x)/3,l=(s.y+a.y+o.y)/3;if(this.pointInPolygon(n,l,e))return{x:n,y:l}}return e[0]}parseOutlineToShapes(e,t,i=0,r){if(!e)return[];let s=new this.THREE.ShapePath,a=e.split(" "),o=0;for(;o<a.length;)switch(a[o]){case"m":{let m=parseFloat(a[o+1])*t+i,d=-parseFloat(a[o+2])*t;s.moveTo(m,d),o+=3}break;case"l":{let m=parseFloat(a[o+1])*t+i,d=-parseFloat(a[o+2])*t;s.lineTo(m,d),o+=3}break;case"q":{let m=parseFloat(a[o+3])*t+i,d=-parseFloat(a[o+4])*t;s.quadraticCurveTo(parseFloat(a[o+1])*t+i,-parseFloat(a[o+2])*t,m,d),o+=5}break;case"b":{let m=parseFloat(a[o+5])*t+i,d=-parseFloat(a[o+6])*t;s.bezierCurveTo(parseFloat(a[o+1])*t+i,-parseFloat(a[o+2])*t,parseFloat(a[o+3])*t+i,-parseFloat(a[o+4])*t,m,d),o+=7}break;case"z":typeof s.closePath=="function"?s.closePath():s.currentPath&&typeof s.currentPath.closePath=="function"&&s.currentPath.closePath(),o+=1;break;default:o++;break}let n=s.subPaths;if(!n||n.length===0)return[];let l=n.map(u=>{let m=u.getPoints(),d=this.THREE.ShapeUtils.area(m),p=this.getBoundingBox(m.map(f=>({x:f.x,y:f.y})));return{path:u,points:m,area:Math.abs(d),signedArea:d,bbox:p}});l.sort((u,m)=>m.area-u.area);let c=[],h=new Set;for(let u=0;u<l.length;u++){if(h.has(u))continue;let m=l[u],d=new this.THREE.Shape(m.points);h.add(u);for(let p=0;p<l.length;p++){if(h.has(p)||u===p)continue;let f=l[p];if(f.bbox.minX<m.bbox.minX||f.bbox.maxX>m.bbox.maxX||f.bbox.minY<m.bbox.minY||f.bbox.maxY>m.bbox.maxY)continue;let x=!0,v=[f.points[0],f.points[Math.floor(f.points.length/2)]];for(let y of v)if(!y||!this.pointInPolygon(y.x,y.y,m.points.map(S=>({x:S.x,y:S.y})))){x=!1;break}x&&(d.holes.push(new this.THREE.Path(f.points)),h.add(p))}c.push(d)}return c.length>0?c:s.toShapes(!0)}reversePath(e){let t=new this.THREE.Path;if(!e.curves||e.curves.length===0)return t;let i=e.curves[e.curves.length-1],r=i.v2||i.v3||(i.getPoint?i.getPoint(1):null);r&&t.moveTo(r.x,r.y);for(let s=e.curves.length-1;s>=0;s--){let a=e.curves[s];a.isLineCurve||a.type==="LineCurve"||a.type==="LineCurve3"?t.lineTo(a.v1.x,a.v1.y):a.isQuadraticBezierCurve||a.type==="QuadraticBezierCurve"||a.type==="QuadraticBezierCurve3"?t.quadraticCurveTo(a.v1.x,a.v1.y,a.v0.x,a.v0.y):(a.isCubicBezierCurve||a.type==="CubicBezierCurve"||a.type==="CubicBezierCurve3")&&t.bezierCurveTo(a.v2.x,a.v2.y,a.v1.x,a.v1.y,a.v0.x,a.v0.y)}return t}createTextGeometry(e,t,i){if(!e||!t)return null;let r=Math.max(.001,i.size||16),s=Math.max(0,i.height||0),a=Math.max(.001,i.lineHeight||r*1.2),o=Number.isFinite(i.letterSpacing)?i.letterSpacing:0,n=i.align||"left",l=!!i.bevelEnabled,c=Math.max(0,i.bevelThickness||0),h=Math.max(0,i.bevelSize||0),u=i.bevelOffset||0,m=Math.max(0,i.bevelSegments||0),d=Math.max(1,Math.round(i.curveSegments||8)),p=String(e).split(/\r?\n/),f=[],x=t?.data,v=x?.resolution||1e3;if(i.layout&&i.layout.length>0){let S=x?.ascender||v*.8,L=x?.descender||-v*.2,P=S-L,O=S/P,V=i.elementWidth||0,w=i.elementHeight||0,M=0,C=0;i.layout.forEach(R=>{let _=t.generateShapes(R.char,r),B=R.x+M,G=(R.height||r)*O,H=-(R.y+C)-G;_.forEach(A=>{let D=this.translateShape(A,B,H);R.scale&&R.scale!==1&&(D=this.scaleShape(D,R.scale)),f.push(D)})})}else p.forEach((S,L)=>{let{shapes:P,width:O}=this.buildLineShapes(S,t,r,o),V=0;n==="center"?V=-O*.5:n==="right"&&(V=-O);let w=-L*a;P.forEach(M=>{f.push(this.translateShape(M,V,w))})});if(!f.length)return null;let y=new this.THREE.ExtrudeGeometry(f,{depth:s,curveSegments:d,bevelEnabled:l,bevelThickness:c,bevelSize:h,bevelOffset:u,bevelSegments:m});return y.computeBoundingBox(),y}buildLineShapes(e,t,i,r){let s=[],a=0,o=Array.from(e);return o.forEach((n,l)=>{t.generateShapes(n,i).forEach(u=>{let m=this.translateShape(u,a,0);s.push(m)});let h=this.getGlyphAdvance(t,n,i);a+=h,r!==0&&l<o.length-1&&(a+=r)}),{shapes:s,width:a}}getGlyphAdvance(e,t,i){let r=e?.data,s=r?.glyphs||{},o=(s[t]||s[t.charCodeAt(0)]||s["?"])?.ha??r?.ha,n=r?.resolution||1e3;return typeof o=="number"?o/n*i:i*.5}translateShape(e,t,i){if(!e||!t&&!i)return e;if(typeof e.translate=="function")return e.translate(t,i),e;if(typeof e.applyMatrix4=="function"){let r=new this.THREE.Matrix4().makeTranslation(t,i,0);return e.applyMatrix4(r),e}if(typeof e.extractPoints=="function"){let{shape:r,holes:s}=e.extractPoints(12),a=n=>new this.THREE.Vector2((n.x||0)+t,(n.y||0)+i),o=new this.THREE.Shape(r.map(a));return Array.isArray(s)&&s.forEach(n=>{let l=new this.THREE.Path;l.setFromPoints(n.map(a)),o.holes.push(l)}),o}return e}scaleShape(e,t){if(t===1)return e;if(typeof e.scale=="function")return e.scale(t,t),e;if(typeof e.applyMatrix4=="function"){let i=new this.THREE.Matrix4().makeScale(t,t,1);return e.applyMatrix4(i),e}if(typeof e.extractPoints=="function"){let{shape:i,holes:r}=e.extractPoints(12),s=o=>new this.THREE.Vector2((o.x||0)*t,(o.y||0)*t),a=new this.THREE.Shape(i.map(s));return Array.isArray(r)&&r.forEach(o=>{let n=new this.THREE.Path;n.setFromPoints(o.map(s)),a.holes.push(n)}),a}return e}resolveParticleModelGeometry(e,t,i){let r=e.trim();if(!r||r==="none")return Promise.resolve(null);let s=t&&t!=="none"?t:this.loaders.gltf?"gltf":Object.keys(this.loaders)[0];if(!s)return Promise.resolve(null);let a=(i||"").trim(),o=`${s}|${r}|${a}`;if(this.particleModelCache.has(o))return Promise.resolve(this.particleModelCache.get(o));let n=this.particleModelPromiseCache.get(o);if(n)return n;let l=new Promise(c=>{let h=null;try{h=this.createModelLoader(s)}catch{c(null);return}h.load(r,u=>{let m=u?.scene||u?.object||u;if(!m){c(null);return}let d=null;if(a){if(m.getObjectByName){let f=m.getObjectByName(a);f?.isMesh&&(d=f)}!d&&m.traverse&&m.traverse(f=>{d||f?.isMesh&&f?.name===a&&(d=f)})}d||(m.isMesh?d=m:m.traverse&&m.traverse(f=>{!d&&f?.isMesh&&(d=f)}));let p=d?.geometry||null;if(!p){c(null);return}this.particleModelCache.set(o,p),c(p)},void 0,()=>{c(null)})});return this.particleModelPromiseCache.set(o,l),l}createParticleSystem(e){let t=this.THREE,i=this,r=a=>{let o=Math.max(1,a|0);return()=>(o^=o<<13,o^=o>>17,o^=o<<5,(o>>>0)%1e5/1e5)};class s extends t.Object3D{constructor(n){super();this.rng=r(e.seed);this.points=null;this.instanced=null;this.positions=new Float32Array(0);this.velocities=new Float32Array(0);this.life=new Float32Array(0);this.colors=new Float32Array(0);this.sizeFactors=new Float32Array(0);this.alive=0;this.emitRemainder=0;this.pendingBurst=0;this.basePositions=new Float32Array(0);this.baseScales=new Float32Array(0);this.baseJitter=new Float32Array(0);this.basePhase=new Float32Array(0);this.elapsed=0;this.modelGeometry=null;this.modelKey="";this.instancedUsesSharedGeometry=!1;this.distributionGeometry=null;this.distributionKey="";this.materialOverride=null;this.materialOverrideForPoints=null;this.defaultEmitterMaterial=null;this.defaultInstancedMaterial=null;this.transitionStartTime=0;this.transitionDuration=0;this.isTransitioning=!1;this.transitionFromPositions=new Float32Array(0);this.transitionToPositions=new Float32Array(0);this.pendingTransition=!1;this.pendingTransitionKey="";this.pendingDistributionLoad=!1;this.cfg={...n},this.refreshModelGeometry(),this.rebuild()}setConfig(n){let l=this.cfg;this.cfg={...n};let c=this.cfg.mode==="emitter"&&(l.emitRate!==this.cfg.emitRate||l.emitBurst!==this.cfg.emitBurst||l.particleLife!==this.cfg.particleLife||l.particleSpeed!==this.cfg.particleSpeed||!this.isVec3Equal(l.particleDirection,this.cfg.particleDirection)||!this.isVec3Equal(l.particleGravity,this.cfg.particleGravity)||l.particleDrag!==this.cfg.particleDrag||l.particleSizeVariation!==this.cfg.particleSizeVariation||l.particleColorVariation!==this.cfg.particleColorVariation||l.color!==this.cfg.color);if(l.mode!==this.cfg.mode||l.count!==this.cfg.count||l.seed!==this.cfg.seed||l.spread!==this.cfg.spread||l.particleShape!==this.cfg.particleShape||l.particleModelUrl!==this.cfg.particleModelUrl||l.particleModelLoader!==this.cfg.particleModelLoader||l.particleModelNode!==this.cfg.particleModelNode||l.instanceShape!==this.cfg.instanceShape||l.instanceModelUrl!==this.cfg.instanceModelUrl||l.instanceModelLoader!==this.cfg.instanceModelLoader||l.instanceModelNode!==this.cfg.instanceModelNode||l.instanceScale!==this.cfg.instanceScale||l.instanceScaleVariation!==this.cfg.instanceScaleVariation){let u=this.cfg.mode==="instanced"&&this.instanced&&this.cfg.modelTransitionDuration>0&&(l.particleModelUrl!==this.cfg.particleModelUrl||l.particleModelLoader!==this.cfg.particleModelLoader||l.particleModelNode!==this.cfg.particleModelNode||l.particleShape!==this.cfg.particleShape),m=this.cfg.mode==="instanced"&&this.instanced&&this.cfg.modelTransitionDuration>0&&(l.instanceModelUrl!==this.cfg.instanceModelUrl||l.instanceModelLoader!==this.cfg.instanceModelLoader||l.instanceModelNode!==this.cfg.instanceModelNode||l.instanceShape!==this.cfg.instanceShape);u||m?this.startModelTransition():(this.refreshModelGeometry(),this.refreshDistributionGeometry(),this.rebuild());return}if(c&&this.resetEmitter(),this.points){let u=this.points.material.uniforms;u&&(u.uOpacity&&(u.uOpacity.value=this.cfg.opacity),u.uSize&&(u.uSize.value=this.cfg.size),u.uSizeVar&&(u.uSizeVar.value=this.cfg.particleSizeVariation),u.uPointSize&&(u.uPointSize.value=this.cfg.size))}this.instanced&&(this.instanced.material.opacity=this.cfg.opacity,this.instanced.material.color=new t.Color(this.cfg.color)),this.pendingBurst=this.cfg.emitBurst}startModelTransition(){this.transitionFromPositions=new Float32Array(this.basePositions),this.transitionDuration=this.cfg.modelTransitionDuration;let n=this.cfg.instanceModelUrl?.trim(),l=`${this.cfg.instanceModelLoader}|${n}|${this.cfg.instanceModelNode}`;this.pendingTransition=!0,this.pendingTransitionKey=l,this.refreshModelGeometry(),this.refreshDistributionGeometryForTransition()}refreshDistributionGeometryForTransition(){if(this.cfg.instanceShape!=="model"){this.startMorphTransition();return}let n=this.cfg.instanceModelUrl?.trim();if(!n||n==="none"){this.startMorphTransition();return}let l=`${this.cfg.instanceModelLoader}|${n}|${this.cfg.instanceModelNode}`;if(this.distributionKey===l&&this.distributionGeometry){this.startMorphTransition();return}this.distributionKey=l,i.resolveParticleModelGeometry(n,this.cfg.instanceModelLoader,this.cfg.instanceModelNode).then(c=>{c&&this.distributionKey===l&&(!this.pendingTransition||this.pendingTransitionKey!==l||(this.distributionGeometry=c,this.startMorphTransition()))})}startMorphTransition(){this.pendingTransition=!1,this.pendingTransitionKey="";let n=Math.max(1,this.cfg.count);if(this.transitionToPositions=new Float32Array(n*3),this.cfg.instanceShape==="model"&&this.distributionGeometry)this.fillFromModelToArray(n,this.distributionGeometry,this.transitionToPositions);else for(let c=0;c<n;c+=1){let h=this.cfg.instanceShape==="box"?this.randomInBox(this.cfg.spread):this.randomInSphere(this.cfg.spread);this.transitionToPositions.set(h,c*3)}this.transitionStartTime=this.elapsed,this.isTransitioning=!0}cleanupOutgoing(){this.isTransitioning=!1,this.pendingTransition=!1,this.pendingTransitionKey="",this.transitionFromPositions=new Float32Array(0),this.transitionToPositions=new Float32Array(0)}updateTransition(){if(!this.isTransitioning)return;let n=this.elapsed-this.transitionStartTime,l=Math.min(1,n/this.transitionDuration),c=l<.5?2*l*l:1-Math.pow(-2*l+2,2)/2,h=Math.min(this.transitionFromPositions.length/3,this.transitionToPositions.length/3,this.basePositions.length/3);for(let u=0;u<h;u+=1){let m=u*3;this.basePositions[m]=this.transitionFromPositions[m]+(this.transitionToPositions[m]-this.transitionFromPositions[m])*c,this.basePositions[m+1]=this.transitionFromPositions[m+1]+(this.transitionToPositions[m+1]-this.transitionFromPositions[m+1])*c,this.basePositions[m+2]=this.transitionFromPositions[m+2]+(this.transitionToPositions[m+2]-this.transitionFromPositions[m+2])*c}if(l>=1){for(let u=0;u<h*3;u+=1)this.basePositions[u]=this.transitionToPositions[u];this.cleanupOutgoing()}}fillFromModelToArray(n,l,c){let h=l?.attributes?.position;if(!h?.array||h.itemSize<3){for(let b=0;b<n;b+=1){let I=this.randomInSphere(this.cfg.spread);c.set(I,b*3)}return}let u=h.array,m=h.itemSize,d=Math.floor(u.length/m);if(d<=0)return;let p=l?.index?.array,f=Math.floor(p?p.length/3:d/3);if(f<=0)return;let x=1/0,v=1/0,y=1/0,S=-1/0,L=-1/0,P=-1/0;for(let b=0;b<d;b+=1){let I=b*m,z=u[I],E=u[I+1],j=u[I+2];x=Math.min(x,z),v=Math.min(v,E),y=Math.min(y,j),S=Math.max(S,z),L=Math.max(L,E),P=Math.max(P,j)}let O=Math.max(1e-6,S-x),V=Math.max(1e-6,L-v),w=Math.max(1e-6,P-y),M=(this.cfg.spreadX>0?this.cfg.spreadX:this.cfg.spread)*2,C=(this.cfg.spreadY>0?this.cfg.spreadY:this.cfg.spread)*2,R=M>0?M/O:1,_=C>0?C/V:1,B=Math.min(R,_),N=(x+S)*.5,G=(v+L)*.5,H=(y+P)*.5,A=new Float32Array(f),D=0;for(let b=0;b<f;b+=1){let I=b*3,z=p?p[I]:I,E=p?p[I+1]:I+1,j=p?p[I+2]:I+2,W=z*m,X=E*m,q=j*m,$=u[W],K=u[W+1],ne=u[W+2],fe=u[X],ae=u[X+1],ge=u[X+2],ye=u[q],be=u[q+1],oe=u[q+2],k=fe-$,Z=ae-K,le=ge-ne,he=ye-$,se=be-K,ee=oe-ne,te=Z*ee-le*se,ie=le*he-k*ee,me=k*se-Z*he,Oe=Math.sqrt(te*te+ie*ie+me*me)*.5;D+=Oe,A[b]=D}if(D<=0){for(let b=0;b<n;b+=1){let I=this.randomInSphere(this.cfg.spread);c.set(I,b*3)}return}for(let b=0;b<n;b+=1){let I=this.rng()*D,z=0,E=f-1;for(;z<E;){let $e=Math.floor((z+E)/2);I<=A[$e]?E=$e:z=$e+1}let j=z*3,W=p?p[j]:j,X=p?p[j+1]:j+1,q=p?p[j+2]:j+2,$=W*m,K=X*m,ne=q*m,fe=u[$],ae=u[$+1],ge=u[$+2],ye=u[K],be=u[K+1],oe=u[K+2],k=u[ne],Z=u[ne+1],le=u[ne+2],he=this.rng(),se=this.rng(),ee=Math.sqrt(he),te=1-ee,ie=ee*(1-se),me=ee*se,Oe=(fe*te+ye*ie+k*me-N)*B,Ye=(ae*te+be*ie+Z*me-G)*B,Pe=(ge*te+oe*ie+le*me-H)*B;c[b*3]=Oe,c[b*3+1]=Ye,c[b*3+2]=Pe}}update(n){n<=0||(this.elapsed+=n,this.updateTransition(),this.cfg.mode==="emitter"?this.updateEmitter(n):this.updateInstanced(this.elapsed))}dispose(){this.cleanupOutgoing(),this.points&&(this.points.geometry.dispose(),this.points.material.dispose()),this.instanced&&(this.instancedUsesSharedGeometry||this.instanced.geometry.dispose(),this.instanced.material.dispose())}rebuild(){if(this.points&&(this.remove(this.points),this.points.geometry.dispose(),this.points.material.dispose(),this.points=null),this.instanced&&(this.remove(this.instanced),this.instancedUsesSharedGeometry||this.instanced.geometry.dispose(),this.instanced.material.dispose(),this.instanced=null),this.elapsed=0,this.cfg.mode==="emitter")this.buildEmitter();else{let n=this.cfg.instanceShape==="model",l=this.distributionGeometry!==null;if(n&&!l){this.pendingDistributionLoad=!0,this.refreshDistributionGeometry();return}this.pendingDistributionLoad=!1,this.refreshDistributionGeometry(),this.buildInstanced()}this.applyMaterialOverrides()}buildEmitter(){let n=Math.max(1,this.cfg.count);this.positions=new Float32Array(n*3),this.velocities=new Float32Array(n*3),this.life=new Float32Array(n),this.colors=new Float32Array(n*3),this.sizeFactors=new Float32Array(n);let l=1e6;for(let u=0;u<n;u+=1){let m=u*3;this.positions[m]=l,this.positions[m+1]=l,this.positions[m+2]=l}this.alive=0,this.emitRemainder=0,this.pendingBurst=this.cfg.emitBurst;let c=new t.BufferGeometry;c.setAttribute("position",new t.BufferAttribute(this.positions,3)),c.setAttribute("color",new t.BufferAttribute(this.colors,3)),c.setAttribute("sizeFactor",new t.BufferAttribute(this.sizeFactors,1));let h=new t.ShaderMaterial({transparent:this.cfg.opacity<1,depthWrite:!1,uniforms:{uOpacity:{value:this.cfg.opacity},uSize:{value:this.cfg.size},uSizeVar:{value:this.cfg.particleSizeVariation}},vertexShader:`
173
+ `}dispose(){this.textureCache.forEach(e=>e.dispose()),this.textureCache.clear()}};var nt=class{constructor(e){this.pool=[];this.create=e}acquire(e,t){let i=this.pool.pop()||this.create(e,t);return(i.width!==e||i.height!==t)&&i.setSize(e,t),i}release(e){this.pool.push(e)}dispose(){this.pool.forEach(e=>e.dispose()),this.pool=[]}},We=class{constructor(e){this.scale=1;this.customMaterials=new Map;let{engine:t,renderer:i,runtime:r,width:n,height:s,customFilterRegistry:o}=e;this.backend=t.getBackend?.()||"webgl",this.engine=t,this.renderer=i,this.runtime=r,this.customFilterRegistry=o,this.width=n,this.height=s,this.scene=t.createScene(),this.camera=t.createOrthographicCamera(-1,1,1,-1,0,1);let a=t.createPlaneGeometry(2,2);this.copyMaterial=this.createCopyMaterial(),this.blurMaterial=this.createBlurMaterial(),this.pixelMaterial=this.createPixelMaterial(),this.bloomExtractMaterial=this.createBloomExtractMaterial(),this.bloomAddMaterial=this.createBloomAddMaterial(),this.colorMaterial=this.createColorMaterial(),this.quad=t.createMesh(a,this.copyMaterial),this.scene.add(this.quad);let l=(h,c)=>this.runtime.createRenderTarget(h,c);this.pool=new nt(l)}isSupported(){return this.runtime.isSupported(this.renderer)}resize(e,t){this.width=e,this.height=t}setScale(e){let t=Math.max(.75,Math.min(1,e));this.scale=t}applyFilters(e,t,i=1){let r=e,n=[],s=a=>{let l=n.indexOf(a);l>=0&&(n.splice(l,1),this.pool.release(a))},o=()=>{let{width:a,height:l}=this.getScaledSize(),h=this.pool.acquire(a,l);return n.push(h),h};return t.forEach(a=>{if(a.type==="blur"){let l=a.amount*i;if(l<=1e-4)return;let h=o();this.renderPass(this.blurMaterial,r,h,{uDirection:[1,0],uRadius:l});let c=o();this.renderPass(this.blurMaterial,h,c,{uDirection:[0,1],uRadius:l}),s(h),r!==e&&s(r),r=c}else if(a.type==="pixel"){if(a.size<=.5)return;let l=o();this.renderPass(this.pixelMaterial,r,l,{uPixelSize:a.size}),r!==e&&s(r),r=l}else if(a.type==="bloom"){let l=a.intensity;if(l<=1e-4||a.threshold>=.99)return;let h=Math.max(1,4*i),c=o();this.renderPass(this.bloomExtractMaterial,r,c,{uThreshold:a.threshold});let u=o();this.renderPass(this.blurMaterial,c,u,{uDirection:[1,0],uRadius:h});let m=o();this.renderPass(this.blurMaterial,u,m,{uDirection:[0,1],uRadius:h}),s(c),s(u);let p=o();this.renderAddPass(r,m,p,l),s(m),r!==e&&s(r),r=p}else if(a.type==="brightness"||a.type==="contrast"||a.type==="saturate"||a.type==="grayscale"||a.type==="sepia"||a.type==="invert"||a.type==="hue-rotate"){let l=o(),h=this.getColorMode(a.type),c=a.type==="hue-rotate"?a.angle:a.amount;this.renderPass(this.colorMaterial,r,l,{uMode:h,uAmount:c}),r!==e&&s(r),r=l}else if(a.type==="custom"){let l=o(),h=this.getCustomMaterial(a.name);h?(this.renderPass(h,r,l,a.uniforms),r!==e&&s(r),r=l):s(l)}}),n.forEach(a=>{a!==r&&this.pool.release(a)}),r}acquireTarget(){let{width:e,height:t}=this.getScaledSize();return this.pool.acquire(e,t)}releaseTarget(e){this.pool.release(e)}renderToScreen(e){this.renderPass(this.copyMaterial,e,null,{},!1)}dispose(){this.pool.dispose(),this.customMaterials.forEach(e=>e.dispose()),this.customMaterials.clear()}renderPass(e,t,i,r={},n=!0){this.runtime.setRenderTarget(this.renderer,i),this.setMaterial(this.quad,e),this.setUniform(e,"tDiffuse",t.texture);let{width:s,height:o}=this.getScaledSize();this.setUniform(e,"uResolution",[s,o]),this.setUniform(e,"uTexel",[1/s,1/o]),Object.entries(r).forEach(([a,l])=>this.setUniform(e,a,l)),n&&this.runtime.clear(this.renderer,!0,!0,!0),this.renderer.render(this.scene,this.camera)}renderAddPass(e,t,i,r){this.runtime.setRenderTarget(this.renderer,i),this.setMaterial(this.quad,this.bloomAddMaterial),this.setUniform(this.bloomAddMaterial,"tBase",e.texture),this.setUniform(this.bloomAddMaterial,"tBloom",t.texture),this.setUniform(this.bloomAddMaterial,"uIntensity",r);let{width:n,height:s}=this.getScaledSize();this.setUniform(this.bloomAddMaterial,"uResolution",[n,s]),this.runtime.clear(this.renderer,!0,!0,!0),this.renderer.render(this.scene,this.camera)}setMaterial(e,t){let i=e;i.material!==t&&(i.material=t)}setUniform(e,t,i){let r=e.uniforms;r&&(r[t]?r[t].value=i:r[t]={value:i})}createCopyMaterial(){return this.createShaderMaterial({uniforms:{tDiffuse:{value:null}},vertexShader:this.getVertexShader(),fragmentShader:`
174
+ varying vec2 vUv;
175
+ uniform sampler2D tDiffuse;
176
+ void main() {
177
+ gl_FragColor = texture2D(tDiffuse, vUv);
178
+ }
179
+ `,transparent:!0,depthTest:!1,depthWrite:!1})}createPixelMaterial(){return this.createShaderMaterial({uniforms:{tDiffuse:{value:null},uResolution:{value:[this.width,this.height]},uPixelSize:{value:1}},vertexShader:this.getVertexShader(),fragmentShader:`
180
+ varying vec2 vUv;
181
+ uniform sampler2D tDiffuse;
182
+ uniform vec2 uResolution;
183
+ uniform float uPixelSize;
184
+ void main() {
185
+ vec2 pixel = uPixelSize / uResolution;
186
+ vec2 coord = floor(vUv / pixel) * pixel + pixel * 0.5;
187
+ gl_FragColor = texture2D(tDiffuse, coord);
188
+ }
189
+ `,transparent:!0,depthTest:!1,depthWrite:!1})}createBlurMaterial(){return this.createShaderMaterial({uniforms:{tDiffuse:{value:null},uTexel:{value:[1/this.width,1/this.height]},uDirection:{value:[1,0]},uRadius:{value:2}},vertexShader:this.getVertexShader(),fragmentShader:`
190
+ varying vec2 vUv;
191
+ uniform sampler2D tDiffuse;
192
+ uniform vec2 uTexel;
193
+ uniform vec2 uDirection;
194
+ uniform float uRadius;
195
+ void main() {
196
+ vec2 off1 = uDirection * uTexel * uRadius;
197
+ vec2 off2 = uDirection * uTexel * uRadius * 2.0;
198
+ vec2 off3 = uDirection * uTexel * uRadius * 3.0;
199
+ vec2 off4 = uDirection * uTexel * uRadius * 4.0;
200
+ vec4 color = texture2D(tDiffuse, vUv) * 0.227027;
201
+ color += texture2D(tDiffuse, vUv + off1) * 0.1945946;
202
+ color += texture2D(tDiffuse, vUv - off1) * 0.1945946;
203
+ color += texture2D(tDiffuse, vUv + off2) * 0.1216216;
204
+ color += texture2D(tDiffuse, vUv - off2) * 0.1216216;
205
+ color += texture2D(tDiffuse, vUv + off3) * 0.054054;
206
+ color += texture2D(tDiffuse, vUv - off3) * 0.054054;
207
+ color += texture2D(tDiffuse, vUv + off4) * 0.016216;
208
+ color += texture2D(tDiffuse, vUv - off4) * 0.016216;
209
+ gl_FragColor = color;
210
+ }
211
+ `,transparent:!0,depthTest:!1,depthWrite:!1})}createBloomExtractMaterial(){return this.createShaderMaterial({uniforms:{tDiffuse:{value:null},uThreshold:{value:.8}},vertexShader:this.getVertexShader(),fragmentShader:`
212
+ varying vec2 vUv;
213
+ uniform sampler2D tDiffuse;
214
+ uniform float uThreshold;
215
+ void main() {
216
+ vec4 color = texture2D(tDiffuse, vUv);
217
+ float brightness = max(max(color.r, color.g), color.b);
218
+ gl_FragColor = brightness > uThreshold ? color : vec4(0.0);
219
+ }
220
+ `,transparent:!0,depthTest:!1,depthWrite:!1})}createBloomAddMaterial(){return this.createShaderMaterial({uniforms:{tBase:{value:null},tBloom:{value:null},uIntensity:{value:1},uResolution:{value:[this.width,this.height]}},vertexShader:this.getVertexShader(),fragmentShader:`
221
+ varying vec2 vUv;
222
+ uniform sampler2D tBase;
223
+ uniform sampler2D tBloom;
224
+ uniform float uIntensity;
225
+ void main() {
226
+ vec4 base = texture2D(tBase, vUv);
227
+ vec4 bloom = texture2D(tBloom, vUv);
228
+ gl_FragColor = vec4(base.rgb + bloom.rgb * uIntensity, base.a);
229
+ }
230
+ `,transparent:!0,depthTest:!1,depthWrite:!1})}createColorMaterial(){return this.createShaderMaterial({uniforms:{tDiffuse:{value:null},uMode:{value:0},uAmount:{value:1}},vertexShader:this.getVertexShader(),fragmentShader:`
231
+ varying vec2 vUv;
232
+ uniform sampler2D tDiffuse;
233
+ uniform int uMode;
234
+ uniform float uAmount;
235
+
236
+ vec3 applyHueRotate(vec3 color, float angle) {
237
+ float cosA = cos(angle);
238
+ float sinA = sin(angle);
239
+ mat3 m = mat3(
240
+ 0.213 + cosA * 0.787 - sinA * 0.213,
241
+ 0.715 - cosA * 0.715 - sinA * 0.715,
242
+ 0.072 - cosA * 0.072 + sinA * 0.928,
243
+ 0.213 - cosA * 0.213 + sinA * 0.143,
244
+ 0.715 + cosA * 0.285 + sinA * 0.140,
245
+ 0.072 - cosA * 0.072 - sinA * 0.283,
246
+ 0.213 - cosA * 0.213 - sinA * 0.787,
247
+ 0.715 - cosA * 0.715 + sinA * 0.715,
248
+ 0.072 + cosA * 0.928 + sinA * 0.072
249
+ );
250
+ return clamp(m * color, 0.0, 1.0);
251
+ }
252
+
253
+ void main() {
254
+ vec4 color = texture2D(tDiffuse, vUv);
255
+ float luma = dot(color.rgb, vec3(0.299, 0.587, 0.114));
256
+
257
+ if (uMode == 1) {
258
+ color.rgb *= uAmount;
259
+ } else if (uMode == 2) {
260
+ color.rgb = (color.rgb - 0.5) * uAmount + 0.5;
261
+ } else if (uMode == 3) {
262
+ color.rgb = mix(vec3(luma), color.rgb, uAmount);
263
+ } else if (uMode == 4) {
264
+ color.rgb = mix(color.rgb, vec3(luma), uAmount);
265
+ } else if (uMode == 5) {
266
+ vec3 sepia = vec3(
267
+ dot(color.rgb, vec3(0.393, 0.769, 0.189)),
268
+ dot(color.rgb, vec3(0.349, 0.686, 0.168)),
269
+ dot(color.rgb, vec3(0.272, 0.534, 0.131))
270
+ );
271
+ color.rgb = mix(color.rgb, sepia, uAmount);
272
+ } else if (uMode == 6) {
273
+ color.rgb = mix(color.rgb, vec3(1.0) - color.rgb, uAmount);
274
+ } else if (uMode == 7) {
275
+ color.rgb = applyHueRotate(color.rgb, uAmount);
276
+ }
277
+
278
+ gl_FragColor = color;
279
+ }
280
+ `,transparent:!0,depthTest:!1,depthWrite:!1})}getColorMode(e){switch(e){case"brightness":return 1;case"contrast":return 2;case"saturate":return 3;case"grayscale":return 4;case"sepia":return 5;case"invert":return 6;case"hue-rotate":return 7;default:return 0}}createShaderMaterial(e){return this.runtime.createShaderMaterial(e)}getCustomMaterial(e){let t=e.trim().toLowerCase();if(!t)return null;if(this.customMaterials.has(t))return this.customMaterials.get(t);let i=this.customFilterRegistry.get(t);if(!i)return null;let r=this.resolveCustomFilterImplementation(i);if(!r)return null;let n=this.resolveCustomFilterShaders(r);if(!n)return null;let s={tDiffuse:{value:null}},{width:o,height:a}=this.getScaledSize();s.uResolution={value:[o,a]},s.uTexel={value:[1/o,1/a]},Object.entries(i.uniforms||{}).forEach(([h,c])=>{s[h]={value:c}});let l=this.createShaderMaterial({uniforms:s,vertexShader:n.vertexShader,fragmentShader:n.fragmentShader,transparent:!0,depthTest:!1,depthWrite:!1});return this.customMaterials.set(t,l),l}resolveCustomFilterImplementation(e){let t=e.implementations?.[this.backend]||e.implementations?.custom;if(t)return t;if(e.fragmentShader&&this.backend==="webgl")return{kind:"shader",language:"glsl",stage:"fragment",code:e.fragmentShader}}resolveCustomFilterShaders(e){return e.kind!=="shader"||e.language!=="glsl"&&e.language!=="custom"||e.stage&&e.stage!=="fragment"?null:{vertexShader:e.vertexCode||this.getVertexShader(),fragmentShader:e.code}}getScaledSize(){let e=Math.max(1,Math.round(this.width*this.scale)),t=Math.max(1,Math.round(this.height*this.scale));return{width:e,height:t}}getVertexShader(){return`
281
+ varying vec2 vUv;
282
+ void main() {
283
+ vUv = uv;
284
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
285
+ }
286
+ `}};var Le=class{constructor(e,t={}){this.materialFactory=null;this.particleModelCache=new Map;this.particleModelPromiseCache=new Map;this.fontCache=new Map;this.fontPromiseCache=new Map;this.fontMetricsCache=new Map;this.THREE=e,this.loaders=t,this.materialFactory=new Re(e)}getMaterialFactory(){return this.materialFactory}createVector3(e=0,t=0,i=0){return new this.THREE.Vector3(e,t,i)}createVector2(e=0,t=0){return new this.THREE.Vector2(e,t)}createQuaternion(e=0,t=0,i=0,r=1){return new this.THREE.Quaternion(e,t,i,r)}createEuler(e=0,t=0,i=0,r="XYZ"){return new this.THREE.Euler(e,t,i,r)}createMatrix4(){return new this.THREE.Matrix4}createBox3(e,t){return new this.THREE.Box3(e,t)}createScene(){return new this.THREE.Scene}createRenderer(e){let t=new this.THREE.WebGLRenderer(e);return t.outputEncoding=this.THREE.sRGBEncoding,t}getRecommendedPixelRatio(){return typeof window<"u"&&Number.isFinite(window.devicePixelRatio)?Math.max(.1,window.devicePixelRatio):1}configureRenderer(e,t){let i=e;typeof i.setClearColor=="function"&&i.setClearColor(0,0),e.shadowMap&&(e.shadowMap.enabled=!0)}createPerspectiveCamera(e=45,t=1,i=.1,r=2e3){return new this.THREE.PerspectiveCamera(e,t,i,r)}createOrthographicCamera(e,t,i,r,n=.1,s=1e4){return new this.THREE.OrthographicCamera(e,t,i,r,n,s)}createGroup(){return new this.THREE.Group}createMesh(e,t){return new this.THREE.Mesh(e,t)}createBoxGeometry(e,t,i){return new this.THREE.BoxGeometry(e,t,i)}createSphereGeometry(e,t=32,i=32){return new this.THREE.SphereGeometry(e,t,i)}createPlaneGeometry(e,t){return new this.THREE.PlaneGeometry(e,t)}createCylinderGeometry(e,t,i,r=32){return new this.THREE.CylinderGeometry(e,t,i,r)}createMeshBasicMaterial(e){return new this.THREE.MeshBasicMaterial(e)}createMeshStandardMaterial(e){return new this.THREE.MeshStandardMaterial(e)}createShaderMaterial(e){return new this.THREE.ShaderMaterial(e)}createPointLight(e,t=1,i=0,r=2){return new this.THREE.PointLight(e,t,i,r)}createSpotLight(e,t=1,i=0,r=Math.PI/3,n=0,s=1){return new this.THREE.SpotLight(e,t,i,r,n,s)}createHemisphereLight(e,t,i=1){return new this.THREE.HemisphereLight(e,t,i)}createAmbientLight(e,t=1){return new this.THREE.AmbientLight(e,t)}createDirectionalLight(e,t=1){return new this.THREE.DirectionalLight(e,t)}createTextureLoader(){return new this.THREE.TextureLoader}createModelLoader(e){let t=this.loaders[e];if(!t)throw new Error(`[ThreeJSEngine] Model loader "${e}" not registered`);return new t}configureModelLoader(e,t){let i=e?.manager;if(!i||typeof i.setURLModifier!="function")return;let r=(t.textureBaseUrl||"").trim(),n=r?r.replace(/\/?$/,"/"):"",s=t.textureMap||null;i.setURLModifier(o=>{let a=s&&Object.prototype.hasOwnProperty.call(s,o)?s[o]:o,l=typeof a=="string"&&a?a:o;return!n||/^(blob:|data:|https?:|file:|\/)/i.test(l)?l:n+l.replace(/^\.?\//,"")})}resolveLoadedModelRoot(e){return!e||typeof e!="object"?null:e?.scene||e?.object||e}createRenderTarget(e,t,i={}){let r={minFilter:this.THREE.LinearFilter,magFilter:this.THREE.LinearFilter,format:this.THREE.RGBAFormat,depthBuffer:!0,stencilBuffer:!1};return new this.THREE.WebGLRenderTarget(e,t,{...r,...i})}loadFont(e){let t=e.trim();if(!t||t==="none")return Promise.resolve(null);if(this.fontCache.has(t))return Promise.resolve(this.fontCache.get(t));let i=this.fontPromiseCache.get(t);if(i)return i;let r=fe.isFontFile(t),n;return r?n=this.loadFontWithConverter(t):n=this.loadFontWithLoader(t),this.fontPromiseCache.set(t,n),n}async loadFontWithConverter(e){try{let t=await fe.load(e),i=this.createFontFromData(t);return this.fontCache.set(e,i),i}catch{return null}}loadFontWithLoader(e){let t=this.loaders.font||this.loaders.FontLoader;if(!t)return Promise.resolve(null);let i=new t;return new Promise(r=>{i.load(e,n=>{this.fontCache.set(e,n),r(n)},void 0,()=>{r(null)})})}createFontFromData(e){let t=this.loaders.font||this.loaders.FontLoader;if(t&&t.utils&&t.utils.convert){let r=new t;if(r.parse)return r.parse(e)}return{data:e,isFont:!0,generateShapes:(r,n)=>this.generateShapesFromFontData(e,r,n,!1),generateNormalizedShapes:(r,n)=>this.generateShapesFromFontData(e,r,n,!0)}}generateShapesFromFontData(e,t,i,r=!1){let n=[],s=i/e.resolution,o=t[0];if(!o)return n;let a=e.glyphs[o];if(!a||!a.o)return n;let l=0;r&&(l=-this.getOutlineXMin(a.o)*s);let h=this.parseOutlineToShapes(a.o,s,l,e?.outlineFormat);return n.push(...h),n}getOutlineXMin(e){let t=e.split(" "),i=1/0,r=0;for(;r<t.length;)switch(t[r]){case"m":case"l":i=Math.min(i,parseFloat(t[r+1])||0),r+=3;break;case"q":i=Math.min(i,parseFloat(t[r+1])||0),i=Math.min(i,parseFloat(t[r+3])||0),r+=5;break;case"b":i=Math.min(i,parseFloat(t[r+1])||0),i=Math.min(i,parseFloat(t[r+3])||0),i=Math.min(i,parseFloat(t[r+5])||0),r+=7;break;default:r++;break}return i===1/0?0:i}getOutlineXMax(e){let t=e.split(" "),i=-1/0,r=0;for(;r<t.length;)switch(t[r]){case"m":case"l":i=Math.max(i,parseFloat(t[r+1])||0),r+=3;break;case"q":i=Math.max(i,parseFloat(t[r+1])||0),i=Math.max(i,parseFloat(t[r+3])||0),r+=5;break;case"b":i=Math.max(i,parseFloat(t[r+1])||0),i=Math.max(i,parseFloat(t[r+3])||0),i=Math.max(i,parseFloat(t[r+5])||0),r+=7;break;default:r++;break}return i===-1/0?0:i}getOutlineYMin(e){let t=e.split(" "),i=1/0,r=0;for(;r<t.length;)switch(t[r]){case"m":case"l":i=Math.min(i,parseFloat(t[r+2])||0),r+=3;break;case"q":i=Math.min(i,parseFloat(t[r+2])||0),i=Math.min(i,parseFloat(t[r+4])||0),r+=5;break;case"b":i=Math.min(i,parseFloat(t[r+2])||0),i=Math.min(i,parseFloat(t[r+4])||0),i=Math.min(i,parseFloat(t[r+6])||0),r+=7;break;default:r++;break}return i===1/0?0:i}pointInPolygon(e,t,i){let r=!1;for(let n=0,s=i.length-1;n<i.length;s=n++){let o=i[n].x,a=i[n].y,l=i[s].x,h=i[s].y;a>t!=h>t&&e<(l-o)*(t-a)/(h-a)+o&&(r=!r)}return r}samplePathPoints(e,t=80){return e?.getPoints?e.getPoints(t).map(i=>({x:i.x,y:i.y})):[]}getBoundingBox(e){if(e.length===0)return{minX:0,maxX:0,minY:0,maxY:0,area:0};let t=1/0,i=-1/0,r=1/0,n=-1/0;for(let s of e)s.x<t&&(t=s.x),s.x>i&&(i=s.x),s.y<r&&(r=s.y),s.y>n&&(n=s.y);return{minX:t,maxX:i,minY:r,maxY:n,area:(i-t)*(n-r)}}getInteriorPoint(e){if(e.length<3)return e[0]||{x:0,y:0};let t=e.map(r=>new this.THREE.Vector2(r.x,r.y)),i=this.THREE.ShapeUtils.triangulateShape(t,[]);for(let r of i){let n=t[r[0]],s=t[r[1]],o=t[r[2]],a=(n.x+s.x+o.x)/3,l=(n.y+s.y+o.y)/3;if(this.pointInPolygon(a,l,e))return{x:a,y:l}}return e[0]}parseOutlineToShapes(e,t,i=0,r){if(!e)return[];let n=new this.THREE.ShapePath,s=e.split(" "),o=0;for(;o<s.length;)switch(s[o]){case"m":{let m=parseFloat(s[o+1])*t+i,p=-parseFloat(s[o+2])*t;n.moveTo(m,p),o+=3}break;case"l":{let m=parseFloat(s[o+1])*t+i,p=-parseFloat(s[o+2])*t;n.lineTo(m,p),o+=3}break;case"q":{let m=parseFloat(s[o+3])*t+i,p=-parseFloat(s[o+4])*t;n.quadraticCurveTo(parseFloat(s[o+1])*t+i,-parseFloat(s[o+2])*t,m,p),o+=5}break;case"b":{let m=parseFloat(s[o+5])*t+i,p=-parseFloat(s[o+6])*t;n.bezierCurveTo(parseFloat(s[o+1])*t+i,-parseFloat(s[o+2])*t,parseFloat(s[o+3])*t+i,-parseFloat(s[o+4])*t,m,p),o+=7}break;case"z":typeof n.closePath=="function"?n.closePath():n.currentPath&&typeof n.currentPath.closePath=="function"&&n.currentPath.closePath(),o+=1;break;default:o++;break}let a=n.subPaths;if(!a||a.length===0)return[];let l=a.map(u=>{let m=u.getPoints(),p=this.THREE.ShapeUtils.area(m),f=this.getBoundingBox(m.map(g=>({x:g.x,y:g.y})));return{path:u,points:m,area:Math.abs(p),signedArea:p,bbox:f}});l.sort((u,m)=>m.area-u.area);let h=[],c=new Set;for(let u=0;u<l.length;u++){if(c.has(u))continue;let m=l[u],p=new this.THREE.Shape(m.points);c.add(u);for(let f=0;f<l.length;f++){if(c.has(f)||u===f)continue;let g=l[f];if(g.bbox.minX<m.bbox.minX||g.bbox.maxX>m.bbox.maxX||g.bbox.minY<m.bbox.minY||g.bbox.maxY>m.bbox.maxY)continue;let D=!0,v=[g.points[0],g.points[Math.floor(g.points.length/2)]];for(let y of v)if(!y||!this.pointInPolygon(y.x,y.y,m.points.map(S=>({x:S.x,y:S.y})))){D=!1;break}D&&(p.holes.push(new this.THREE.Path(g.points)),c.add(f))}h.push(p)}return h.length>0?h:n.toShapes(!0)}reversePath(e){let t=new this.THREE.Path;if(!e.curves||e.curves.length===0)return t;let i=e.curves[e.curves.length-1],r=i.v2||i.v3||(i.getPoint?i.getPoint(1):null);r&&t.moveTo(r.x,r.y);for(let n=e.curves.length-1;n>=0;n--){let s=e.curves[n];s.isLineCurve||s.type==="LineCurve"||s.type==="LineCurve3"?t.lineTo(s.v1.x,s.v1.y):s.isQuadraticBezierCurve||s.type==="QuadraticBezierCurve"||s.type==="QuadraticBezierCurve3"?t.quadraticCurveTo(s.v1.x,s.v1.y,s.v0.x,s.v0.y):(s.isCubicBezierCurve||s.type==="CubicBezierCurve"||s.type==="CubicBezierCurve3")&&t.bezierCurveTo(s.v2.x,s.v2.y,s.v1.x,s.v1.y,s.v0.x,s.v0.y)}return t}createTextGeometry(e,t,i){if(!e||!t)return null;let r=Math.max(.001,i.size||16),n=Math.max(0,i.height||0),s=Math.max(.001,i.lineHeight||r*1.2),o=Number.isFinite(i.letterSpacing)?i.letterSpacing:0,a=i.align||"left",l=!!i.bevelEnabled,h=Math.max(0,i.bevelThickness||0),c=Math.max(0,i.bevelSize||0),u=i.bevelOffset||0,m=Math.max(0,i.bevelSegments||0),p=Math.max(1,Math.round(i.curveSegments||8)),f=String(e).split(/\r?\n/),g=[],D=t?.data,v=D?.resolution||1e3;if(i.layout&&i.layout.length>0){let S=D?.ascender||v*.8,P=D?.descender||-v*.2,T=S-P,F=S/T,O=i.elementWidth||0,x=i.elementHeight||0,M=0,w=0;i.layout.forEach(L=>{let _=t.generateShapes(L.char,r),k=L.x+M,$=(L.height||r)*F,W=-(L.y+w)-$;_.forEach(A=>{let C=this.translateShape(A,k,W);L.scale&&L.scale!==1&&(C=this.scaleShape(C,L.scale)),g.push(C)})})}else f.forEach((S,P)=>{let{shapes:T,width:F}=this.buildLineShapes(S,t,r,o),O=0;a==="center"?O=-F*.5:a==="right"&&(O=-F);let x=-P*s;T.forEach(M=>{g.push(this.translateShape(M,O,x))})});if(!g.length)return null;let y=new this.THREE.ExtrudeGeometry(g,{depth:n,curveSegments:p,bevelEnabled:l,bevelThickness:h,bevelSize:c,bevelOffset:u,bevelSegments:m});return y.computeBoundingBox(),y}buildLineShapes(e,t,i,r){let n=[],s=0,o=Array.from(e);return o.forEach((a,l)=>{t.generateShapes(a,i).forEach(u=>{let m=this.translateShape(u,s,0);n.push(m)});let c=this.getGlyphAdvance(t,a,i);s+=c,r!==0&&l<o.length-1&&(s+=r)}),{shapes:n,width:s}}getGlyphAdvance(e,t,i){let r=e?.data,n=r?.glyphs||{},o=(n[t]||n[t.charCodeAt(0)]||n["?"])?.ha??r?.ha,a=r?.resolution||1e3;return typeof o=="number"?o/a*i:i*.5}translateShape(e,t,i){if(!e||!t&&!i)return e;if(typeof e.translate=="function")return e.translate(t,i),e;if(typeof e.applyMatrix4=="function"){let r=new this.THREE.Matrix4().makeTranslation(t,i,0);return e.applyMatrix4(r),e}if(typeof e.extractPoints=="function"){let{shape:r,holes:n}=e.extractPoints(12),s=a=>new this.THREE.Vector2((a.x||0)+t,(a.y||0)+i),o=new this.THREE.Shape(r.map(s));return Array.isArray(n)&&n.forEach(a=>{let l=new this.THREE.Path;l.setFromPoints(a.map(s)),o.holes.push(l)}),o}return e}scaleShape(e,t){if(t===1)return e;if(typeof e.scale=="function")return e.scale(t,t),e;if(typeof e.applyMatrix4=="function"){let i=new this.THREE.Matrix4().makeScale(t,t,1);return e.applyMatrix4(i),e}if(typeof e.extractPoints=="function"){let{shape:i,holes:r}=e.extractPoints(12),n=o=>new this.THREE.Vector2((o.x||0)*t,(o.y||0)*t),s=new this.THREE.Shape(i.map(n));return Array.isArray(r)&&r.forEach(o=>{let a=new this.THREE.Path;a.setFromPoints(o.map(n)),s.holes.push(a)}),s}return e}resolveParticleModelGeometry(e,t,i){let r=e.trim();if(!r||r==="none")return Promise.resolve(null);let n=t&&t!=="none"?t:this.loaders.gltf?"gltf":Object.keys(this.loaders)[0];if(!n)return Promise.resolve(null);let s=(i||"").trim(),o=`${n}|${r}|${s}`;if(this.particleModelCache.has(o))return Promise.resolve(this.particleModelCache.get(o));let a=this.particleModelPromiseCache.get(o);if(a)return a;let l=new Promise(h=>{let c=null;try{c=this.createModelLoader(n)}catch{h(null);return}c.load(r,u=>{let m=u?.scene||u?.object||u;if(!m){h(null);return}let p=null;if(s){if(m.getObjectByName){let g=m.getObjectByName(s);g?.isMesh&&(p=g)}!p&&m.traverse&&m.traverse(g=>{p||g?.isMesh&&g?.name===s&&(p=g)})}p||(m.isMesh?p=m:m.traverse&&m.traverse(g=>{!p&&g?.isMesh&&(p=g)}));let f=p?.geometry||null;if(!f){h(null);return}this.particleModelCache.set(o,f),h(f)},void 0,()=>{h(null)})});return this.particleModelPromiseCache.set(o,l),l}createParticleSystem(e){let t=this.THREE,i=this,r=s=>{let o=Math.max(1,s|0);return()=>(o^=o<<13,o^=o>>17,o^=o<<5,(o>>>0)%1e5/1e5)};class n extends t.Object3D{constructor(a){super();this.rng=r(e.seed);this.points=null;this.instanced=null;this.positions=new Float32Array(0);this.velocities=new Float32Array(0);this.life=new Float32Array(0);this.colors=new Float32Array(0);this.sizeFactors=new Float32Array(0);this.alive=0;this.emitRemainder=0;this.pendingBurst=0;this.basePositions=new Float32Array(0);this.baseScales=new Float32Array(0);this.baseJitter=new Float32Array(0);this.basePhase=new Float32Array(0);this.elapsed=0;this.modelGeometry=null;this.modelKey="";this.instancedUsesSharedGeometry=!1;this.distributionGeometry=null;this.distributionKey="";this.materialOverride=null;this.materialOverrideForPoints=null;this.defaultEmitterMaterial=null;this.defaultInstancedMaterial=null;this.transitionStartTime=0;this.transitionDuration=0;this.isTransitioning=!1;this.transitionFromPositions=new Float32Array(0);this.transitionToPositions=new Float32Array(0);this.pendingTransition=!1;this.pendingTransitionKey="";this.pendingDistributionLoad=!1;this.cfg={...a},this.refreshModelGeometry(),this.rebuild()}setConfig(a){let l=this.cfg;this.cfg={...a};let h=this.cfg.mode==="emitter"&&(l.emitRate!==this.cfg.emitRate||l.emitBurst!==this.cfg.emitBurst||l.particleLife!==this.cfg.particleLife||l.particleSpeed!==this.cfg.particleSpeed||!this.isVec3Equal(l.particleDirection,this.cfg.particleDirection)||!this.isVec3Equal(l.particleGravity,this.cfg.particleGravity)||l.particleDrag!==this.cfg.particleDrag||l.particleSizeVariation!==this.cfg.particleSizeVariation||l.particleColorVariation!==this.cfg.particleColorVariation||l.color!==this.cfg.color);if(l.mode!==this.cfg.mode||l.count!==this.cfg.count||l.seed!==this.cfg.seed||l.spread!==this.cfg.spread||l.particleShape!==this.cfg.particleShape||l.particleModelUrl!==this.cfg.particleModelUrl||l.particleModelLoader!==this.cfg.particleModelLoader||l.particleModelNode!==this.cfg.particleModelNode||l.instanceShape!==this.cfg.instanceShape||l.instanceModelUrl!==this.cfg.instanceModelUrl||l.instanceModelLoader!==this.cfg.instanceModelLoader||l.instanceModelNode!==this.cfg.instanceModelNode||l.instanceScale!==this.cfg.instanceScale||l.instanceScaleVariation!==this.cfg.instanceScaleVariation){let u=this.cfg.mode==="instanced"&&this.instanced&&this.cfg.modelTransitionDuration>0&&(l.particleModelUrl!==this.cfg.particleModelUrl||l.particleModelLoader!==this.cfg.particleModelLoader||l.particleModelNode!==this.cfg.particleModelNode||l.particleShape!==this.cfg.particleShape),m=this.cfg.mode==="instanced"&&this.instanced&&this.cfg.modelTransitionDuration>0&&(l.instanceModelUrl!==this.cfg.instanceModelUrl||l.instanceModelLoader!==this.cfg.instanceModelLoader||l.instanceModelNode!==this.cfg.instanceModelNode||l.instanceShape!==this.cfg.instanceShape);u||m?this.startModelTransition():(this.refreshModelGeometry(),this.refreshDistributionGeometry(),this.rebuild());return}if(h&&this.resetEmitter(),this.points){let u=this.points.material.uniforms;u&&(u.uOpacity&&(u.uOpacity.value=this.cfg.opacity),u.uSize&&(u.uSize.value=this.cfg.size),u.uSizeVar&&(u.uSizeVar.value=this.cfg.particleSizeVariation),u.uPointSize&&(u.uPointSize.value=this.cfg.size))}this.instanced&&(this.instanced.material.opacity=this.cfg.opacity,this.instanced.material.color=new t.Color(this.cfg.color)),this.pendingBurst=this.cfg.emitBurst}startModelTransition(){this.transitionFromPositions=new Float32Array(this.basePositions),this.transitionDuration=this.cfg.modelTransitionDuration;let a=this.cfg.instanceModelUrl?.trim(),l=`${this.cfg.instanceModelLoader}|${a}|${this.cfg.instanceModelNode}`;this.pendingTransition=!0,this.pendingTransitionKey=l,this.refreshModelGeometry(),this.refreshDistributionGeometryForTransition()}refreshDistributionGeometryForTransition(){if(this.cfg.instanceShape!=="model"){this.startMorphTransition();return}let a=this.cfg.instanceModelUrl?.trim();if(!a||a==="none"){this.startMorphTransition();return}let l=`${this.cfg.instanceModelLoader}|${a}|${this.cfg.instanceModelNode}`;if(this.distributionKey===l&&this.distributionGeometry){this.startMorphTransition();return}this.distributionKey=l,i.resolveParticleModelGeometry(a,this.cfg.instanceModelLoader,this.cfg.instanceModelNode).then(h=>{h&&this.distributionKey===l&&(!this.pendingTransition||this.pendingTransitionKey!==l||(this.distributionGeometry=h,this.startMorphTransition()))})}startMorphTransition(){this.pendingTransition=!1,this.pendingTransitionKey="";let a=Math.max(1,this.cfg.count);if(this.transitionToPositions=new Float32Array(a*3),this.cfg.instanceShape==="model"&&this.distributionGeometry)this.fillFromModelToArray(a,this.distributionGeometry,this.transitionToPositions);else for(let h=0;h<a;h+=1){let c=this.cfg.instanceShape==="box"?this.randomInBox(this.cfg.spread):this.randomInSphere(this.cfg.spread);this.transitionToPositions.set(c,h*3)}this.transitionStartTime=this.elapsed,this.isTransitioning=!0}cleanupOutgoing(){this.isTransitioning=!1,this.pendingTransition=!1,this.pendingTransitionKey="",this.transitionFromPositions=new Float32Array(0),this.transitionToPositions=new Float32Array(0)}updateTransition(){if(!this.isTransitioning)return;let a=this.elapsed-this.transitionStartTime,l=Math.min(1,a/this.transitionDuration),h=l<.5?2*l*l:1-Math.pow(-2*l+2,2)/2,c=Math.min(this.transitionFromPositions.length/3,this.transitionToPositions.length/3,this.basePositions.length/3);for(let u=0;u<c;u+=1){let m=u*3;this.basePositions[m]=this.transitionFromPositions[m]+(this.transitionToPositions[m]-this.transitionFromPositions[m])*h,this.basePositions[m+1]=this.transitionFromPositions[m+1]+(this.transitionToPositions[m+1]-this.transitionFromPositions[m+1])*h,this.basePositions[m+2]=this.transitionFromPositions[m+2]+(this.transitionToPositions[m+2]-this.transitionFromPositions[m+2])*h}if(l>=1){for(let u=0;u<c*3;u+=1)this.basePositions[u]=this.transitionToPositions[u];this.cleanupOutgoing()}}fillFromModelToArray(a,l,h){let c=l?.attributes?.position;if(!c?.array||c.itemSize<3){for(let b=0;b<a;b+=1){let j=this.randomInSphere(this.cfg.spread);h.set(j,b*3)}return}let u=c.array,m=c.itemSize,p=Math.floor(u.length/m);if(p<=0)return;let f=l?.index?.array,g=Math.floor(f?f.length/3:p/3);if(g<=0)return;let D=1/0,v=1/0,y=1/0,S=-1/0,P=-1/0,T=-1/0;for(let b=0;b<p;b+=1){let j=b*m,z=u[j],I=u[j+1],V=u[j+2];D=Math.min(D,z),v=Math.min(v,I),y=Math.min(y,V),S=Math.max(S,z),P=Math.max(P,I),T=Math.max(T,V)}let F=Math.max(1e-6,S-D),O=Math.max(1e-6,P-v),x=Math.max(1e-6,T-y),M=(this.cfg.spreadX>0?this.cfg.spreadX:this.cfg.spread)*2,w=(this.cfg.spreadY>0?this.cfg.spreadY:this.cfg.spread)*2,L=M>0?M/F:1,_=w>0?w/O:1,k=Math.min(L,_),H=(D+S)*.5,$=(v+P)*.5,W=(y+T)*.5,A=new Float32Array(g),C=0;for(let b=0;b<g;b+=1){let j=b*3,z=f?f[j]:j,I=f?f[j+1]:j+1,V=f?f[j+2]:j+2,G=z*m,K=I*m,X=V*m,q=u[G],Y=u[G+1],ue=u[G+2],ge=u[K],ye=u[K+1],ae=u[K+2],be=u[X],ve=u[X+1],pe=u[X+2],se=ge-q,N=ye-Y,Z=ae-ue,oe=be-q,le=ve-Y,ee=pe-ue,te=N*ee-Z*le,ie=Z*oe-se*ee,de=se*le-N*oe,Pe=Math.sqrt(te*te+ie*ie+de*de)*.5;C+=Pe,A[b]=C}if(C<=0){for(let b=0;b<a;b+=1){let j=this.randomInSphere(this.cfg.spread);h.set(j,b*3)}return}for(let b=0;b<a;b+=1){let j=this.rng()*C,z=0,I=g-1;for(;z<I;){let Ye=Math.floor((z+I)/2);j<=A[Ye]?I=Ye:z=Ye+1}let V=z*3,G=f?f[V]:V,K=f?f[V+1]:V+1,X=f?f[V+2]:V+2,q=G*m,Y=K*m,ue=X*m,ge=u[q],ye=u[q+1],ae=u[q+2],be=u[Y],ve=u[Y+1],pe=u[Y+2],se=u[ue],N=u[ue+1],Z=u[ue+2],oe=this.rng(),le=this.rng(),ee=Math.sqrt(oe),te=1-ee,ie=ee*(1-le),de=ee*le,Pe=(ge*te+be*ie+se*de-H)*k,$e=(ye*te+ve*ie+N*de-$)*k,Oe=(ae*te+pe*ie+Z*de-W)*k;h[b*3]=Pe,h[b*3+1]=$e,h[b*3+2]=Oe}}update(a){a<=0||(this.elapsed+=a,this.updateTransition(),this.cfg.mode==="emitter"?this.updateEmitter(a):this.updateInstanced(this.elapsed))}dispose(){this.cleanupOutgoing(),this.points&&(this.points.geometry.dispose(),this.points.material.dispose()),this.instanced&&(this.instancedUsesSharedGeometry||this.instanced.geometry.dispose(),this.instanced.material.dispose())}rebuild(){if(this.points&&(this.remove(this.points),this.points.geometry.dispose(),this.points.material.dispose(),this.points=null),this.instanced&&(this.remove(this.instanced),this.instancedUsesSharedGeometry||this.instanced.geometry.dispose(),this.instanced.material.dispose(),this.instanced=null),this.elapsed=0,this.cfg.mode==="emitter")this.buildEmitter();else{let a=this.cfg.instanceShape==="model",l=this.distributionGeometry!==null;if(a&&!l){this.pendingDistributionLoad=!0,this.refreshDistributionGeometry();return}this.pendingDistributionLoad=!1,this.refreshDistributionGeometry(),this.buildInstanced()}this.applyMaterialOverrides()}buildEmitter(){let a=Math.max(1,this.cfg.count);this.positions=new Float32Array(a*3),this.velocities=new Float32Array(a*3),this.life=new Float32Array(a),this.colors=new Float32Array(a*3),this.sizeFactors=new Float32Array(a);let l=1e6;for(let u=0;u<a;u+=1){let m=u*3;this.positions[m]=l,this.positions[m+1]=l,this.positions[m+2]=l}this.alive=0,this.emitRemainder=0,this.pendingBurst=this.cfg.emitBurst;let h=new t.BufferGeometry;h.setAttribute("position",new t.BufferAttribute(this.positions,3)),h.setAttribute("color",new t.BufferAttribute(this.colors,3)),h.setAttribute("sizeFactor",new t.BufferAttribute(this.sizeFactors,1));let c=new t.ShaderMaterial({transparent:this.cfg.opacity<1,depthWrite:!1,uniforms:{uOpacity:{value:this.cfg.opacity},uSize:{value:this.cfg.size},uSizeVar:{value:this.cfg.particleSizeVariation}},vertexShader:`
286
287
  attribute vec3 color;
287
288
  attribute float sizeFactor;
288
289
  varying vec3 vColor;
@@ -302,6 +303,6 @@ ${d}`));let p=t.get("fragment_output");return p&&(r=r.replace("#include <ditheri
302
303
  if (dist > 0.5) discard;
303
304
  gl_FragColor = vec4(vColor, uOpacity);
304
305
  }
305
- `});this.points=new t.Points(c,h),this.defaultEmitterMaterial=h,this.add(this.points)}buildInstanced(){let n=Math.max(1,this.cfg.count),l=this.cfg.particleShape==="model"&&this.modelGeometry,c=this.cfg.particleShape==="model"&&this.modelGeometry?this.modelGeometry:this.cfg.particleShape==="box"?new t.BoxGeometry(1,1,1):new t.SphereGeometry(.5,8,8);this.instancedUsesSharedGeometry=l;let h=new t.MeshStandardMaterial({color:new t.Color(this.cfg.color),transparent:this.cfg.opacity<1,opacity:this.cfg.opacity});this.defaultInstancedMaterial=h,this.instanced=new t.InstancedMesh(c,h,n),this.basePositions=new Float32Array(n*3),this.baseScales=new Float32Array(n),this.baseJitter=new Float32Array(n*3),this.basePhase=new Float32Array(n),this.fillBasePositions(n),this.applyInstancedTransforms(0),this.add(this.instanced)}setMaterial(n,l={}){let c=l.points??!0;(l.meshes??!0)&&(this.materialOverride=n),c&&(this.materialOverrideForPoints=n),this.applyMaterialOverrides()}updateEmitter(n){let l=this.cfg.count,c=this.normalize(this.cfg.particleDirection),h=this.cfg.particleGravity,u=Math.max(0,Math.min(1,this.cfg.particleDrag)),d=this.cfg.emitRate*n+this.emitRemainder,p=Math.floor(d);this.emitRemainder=d-p;let f=!1,x=1e6;for(let v=0;v<p;v+=1)this.spawnParticle(c);for(;this.pendingBurst>0;)this.spawnParticle(c),this.pendingBurst-=1;for(let v=0;v<l;v+=1){if(this.life[v]<=0)continue;if(this.life[v]-=n,this.life[v]<=0){this.life[v]=0;let S=v*3;this.positions[S]=x,this.positions[S+1]=x,this.positions[S+2]=x,this.colors[S]=0,this.colors[S+1]=0,this.colors[S+2]=0,f=!0;continue}let y=v*3;this.velocities[y]+=h[0]*n,this.velocities[y+1]+=h[1]*n,this.velocities[y+2]+=h[2]*n,this.velocities[y]*=1-u*n,this.velocities[y+1]*=1-u*n,this.velocities[y+2]*=1-u*n,this.positions[y]+=this.velocities[y]*n,this.positions[y+1]+=this.velocities[y+1]*n,this.positions[y+2]+=this.velocities[y+2]*n}this.points&&(this.points.geometry.attributes.position.needsUpdate=!0,f&&(this.points.geometry.attributes.color.needsUpdate=!0))}spawnParticle(n){let l=this.cfg.count,c=-1;for(let f=0;f<l;f+=1)if(this.life[f]<=0){c=f;break}if(c===-1)return;let h=this.randomInSphere(this.cfg.spread),u=this.cfg.particleSpeed*(1-this.cfg.particleSizeVariation+this.rng()*this.cfg.particleSizeVariation),m=[n[0]*u+(this.rng()-.5)*u*.2,n[1]*u+(this.rng()-.5)*u*.2,n[2]*u+(this.rng()-.5)*u*.2],d=c*3;this.positions.set(h,d),this.velocities.set(m,d),this.life[c]=this.cfg.particleLife,this.sizeFactors[c]=this.rng();let p=new t.Color(this.cfg.color);this.cfg.particleColorVariation>0&&p.offsetHSL((this.rng()-.5)*this.cfg.particleColorVariation,0,0),this.colors[d]=p.r,this.colors[d+1]=p.g,this.colors[d+2]=p.b,this.points&&(this.points.geometry.attributes.color.needsUpdate=!0,this.points.geometry.attributes.sizeFactor.needsUpdate=!0)}updateInstanced(n){this.applyInstancedTransforms(n),this.instanced&&(this.instanced.instanceMatrix.needsUpdate=!0)}applyInstancedTransforms(n){if(!this.instanced)return;let l=this.cfg.count,c=this.cfg.instanceJitter,h=this.cfg.instanceFlow,u=Math.max(0,this.cfg.instanceDisperse),m=Math.max(0,this.cfg.instanceDisperseScatter),d=this.cfg.instanceDisperseScatterX>0?this.cfg.instanceDisperseScatterX:m,p=this.cfg.instanceDisperseScatterY>0?this.cfg.instanceDisperseScatterY:m,f=this.cfg.instanceDisperseScatterZ>0?this.cfg.instanceDisperseScatterZ:m,x=this.cfg.instanceRotationSpeed,v=new t.Object3D;for(let y=0;y<l;y+=1){let S=y*3,L=this.basePositions[S],P=this.basePositions[S+1],O=this.basePositions[S+2],V=this.basePhase[y],w=Math.sin((P+n*1.4)*.7+V)*h*this.cfg.spread,M=Math.cos((L-n*1.1)*.6+V)*h*this.cfg.spread,C=Math.sin((O+n*1.2)*.8+V)*h*this.cfg.spread,R=Math.sin(n*2.1+V+this.baseJitter[S]*2.5)*c,_=Math.cos(n*1.7+V+this.baseJitter[S+1]*2.5)*c,B=Math.sin(n*1.9+V+this.baseJitter[S+2]*2.5)*c,N=1+u,G=this.baseJitter[S],H=this.baseJitter[S+1],A=this.baseJitter[S+2],D=Math.sqrt(G*G+H*H+A*A)||1,b=u*this.cfg.spread,I=G/D*d*b,z=H/D*p*b,E=A/D*f*b;v.position.set(L*N+I+w+R,P*N+z+M+_,O*N+E+C+B),v.rotation.set(this.baseJitter[S]*.5,n*x+y*.1,this.baseJitter[S+2]*.5);let j=this.baseScales[y]*this.cfg.size;v.scale.set(j,j,j),v.updateMatrix(),this.instanced.setMatrixAt(y,v.matrix)}}applyMaterialOverrides(){if(this.points){let n=this.materialOverrideForPoints||this.defaultEmitterMaterial;n&&this.points.material!==n&&(this.points.material=n,this.ensurePointMaterial(n))}if(this.instanced){let n=this.materialOverride||this.defaultInstancedMaterial;n&&this.instanced.material!==n&&(this.instanced.material=n)}}ensurePointMaterial(n){n?.isShaderMaterial&&(n.uniforms||(n.uniforms={}),n.uniforms.uPointSize||(n.uniforms.uPointSize={value:this.cfg.size}),n.uniforms.uOpacity||(n.uniforms.uOpacity={value:this.cfg.opacity}),n.vertexShader.includes("gl_PointSize")||(n.vertexShader.includes("uPointSize")||(n.vertexShader=`uniform float uPointSize;
306
- ${n.vertexShader}`),n.vertexShader=n.vertexShader.replace(/void\\s+main\\s*\\(\\)\\s*\\{/,"void main() {\\n gl_PointSize = uPointSize;"),n.needsUpdate=!0))}refreshModelGeometry(){if(this.cfg.particleShape!=="model"){this.modelGeometry=null,this.modelKey="";return}let n=this.cfg.particleModelUrl?.trim();if(!n||n==="none"){this.modelGeometry=null,this.modelKey="";return}let l=`${this.cfg.particleModelLoader}|${n}|${this.cfg.particleModelNode}`;this.modelKey===l&&this.modelGeometry||(this.modelKey=l,i.resolveParticleModelGeometry(n,this.cfg.particleModelLoader,this.cfg.particleModelNode).then(c=>{c&&this.modelKey===l&&(this.modelGeometry=c,this.cfg.mode==="instanced"&&this.cfg.particleShape==="model"&&this.rebuild())}))}refreshDistributionGeometry(){if(this.cfg.instanceShape!=="model"){this.distributionGeometry=null,this.distributionKey="";return}let n=this.cfg.instanceModelUrl?.trim();if(!n||n==="none"){this.distributionGeometry=null,this.distributionKey="";return}let l=`${this.cfg.instanceModelLoader}|${n}|${this.cfg.instanceModelNode}`;this.distributionKey===l&&this.distributionGeometry||(this.distributionKey=l,i.resolveParticleModelGeometry(n,this.cfg.instanceModelLoader,this.cfg.instanceModelNode).then(c=>{c&&this.distributionKey===l&&(this.distributionGeometry=c,this.cfg.mode==="instanced"&&this.cfg.instanceShape==="model"&&(this.pendingDistributionLoad?(this.pendingDistributionLoad=!1,this.buildInstanced(),this.applyMaterialOverrides()):this.rebuild()))}))}fillBasePositions(n){if(this.cfg.instanceShape==="model"&&this.distributionGeometry)this.fillFromModel(n,this.distributionGeometry);else for(let c=0;c<n;c+=1){let h=this.cfg.instanceShape==="box"?this.randomInBox(this.cfg.spread):this.randomInSphere(this.cfg.spread);this.basePositions.set(h,c*3)}for(let c=0;c<n;c+=1){let h=c*3;this.baseJitter[h]=this.rng()*2-1,this.baseJitter[h+1]=this.rng()*2-1,this.baseJitter[h+2]=this.rng()*2-1,this.basePhase[c]=this.rng()*Math.PI*2;let u=this.cfg.instanceScale*(1-this.cfg.instanceScaleVariation+this.rng()*this.cfg.instanceScaleVariation);this.baseScales[c]=u}}fillFromModel(n,l){let c=l?.attributes?.position;if(!c?.array||c.itemSize<3){for(let D=0;D<n;D+=1){let b=this.randomInSphere(this.cfg.spread);this.basePositions.set(b,D*3)}return}let h=c.array,u=c.itemSize,m=Math.floor(h.length/u);if(m<=0)return;let d=l?.index?.array,p=Math.floor(d?d.length/3:m/3);if(p<=0)return;let f=1/0,x=1/0,v=1/0,y=-1/0,S=-1/0,L=-1/0;for(let D=0;D<m;D+=1){let b=D*u,I=h[b],z=h[b+1],E=h[b+2];f=Math.min(f,I),x=Math.min(x,z),v=Math.min(v,E),y=Math.max(y,I),S=Math.max(S,z),L=Math.max(L,E)}let P=Math.max(1e-6,y-f),O=Math.max(1e-6,S-x),V=Math.max(1e-6,L-v),w=(this.cfg.spreadX>0?this.cfg.spreadX:this.cfg.spread)*2,M=(this.cfg.spreadY>0?this.cfg.spreadY:this.cfg.spread)*2,C=w>0?w/P:1,R=M>0?M/O:1,_=Math.min(C,R),B=(f+y)*.5,N=(x+S)*.5,G=(v+L)*.5,H=new Float32Array(p),A=0;for(let D=0;D<p;D+=1){let b=D*3,I=d?d[b]:b,z=d?d[b+1]:b+1,E=d?d[b+2]:b+2,j=I*u,W=z*u,X=E*u,q=h[j],$=h[j+1],K=h[j+2],ne=h[W],fe=h[W+1],ae=h[W+2],ge=h[X],ye=h[X+1],be=h[X+2],oe=ne-q,k=fe-$,Z=ae-K,le=ge-q,he=ye-$,se=be-K,ee=k*se-Z*he,te=Z*le-oe*se,ie=oe*he-k*le,me=Math.sqrt(ee*ee+te*te+ie*ie)*.5;A+=me,H[D]=A}if(A<=0){for(let D=0;D<n;D+=1){let b=this.randomInSphere(this.cfg.spread);this.basePositions.set(b,D*3)}return}for(let D=0;D<n;D+=1){let b=this.rng()*A,I=0,z=p-1;for(;I<z;){let Pe=Math.floor((I+z)/2);b<=H[Pe]?z=Pe:I=Pe+1}let E=I*3,j=d?d[E]:E,W=d?d[E+1]:E+1,X=d?d[E+2]:E+2,q=j*u,$=W*u,K=X*u,ne=h[q],fe=h[q+1],ae=h[q+2],ge=h[$],ye=h[$+1],be=h[$+2],oe=h[K],k=h[K+1],Z=h[K+2],le=this.rng(),he=this.rng(),se=Math.sqrt(le),ee=1-se,te=se*(1-he),ie=se*he,me=(ne*ee+ge*te+oe*ie-B)*_,Oe=(fe*ee+ye*te+k*ie-N)*_,Ye=(ae*ee+be*te+Z*ie-G)*_;this.basePositions[D*3]=me,this.basePositions[D*3+1]=Oe,this.basePositions[D*3+2]=Ye}}resetEmitter(){if(!this.points)return;let n=1e6;for(let l=0;l<this.positions.length;l+=3)this.positions[l]=n,this.positions[l+1]=n,this.positions[l+2]=n;this.velocities.fill(0),this.life.fill(0),this.colors.fill(0),this.sizeFactors.fill(0),this.alive=0,this.emitRemainder=0,this.pendingBurst=this.cfg.emitBurst,this.points.geometry.attributes.position.needsUpdate=!0,this.points.geometry.attributes.color.needsUpdate=!0,this.points.geometry.attributes.sizeFactor.needsUpdate=!0}normalize(n){let l=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2])||1;return[n[0]/l,n[1]/l,n[2]/l]}isVec3Equal(n,l){return n[0]===l[0]&&n[1]===l[1]&&n[2]===l[2]}randomInSphere(n){let l=this.rng(),c=this.rng(),h=l*Math.PI*2,u=Math.acos(2*c-1),m=Math.cbrt(this.rng())*n;return[m*Math.sin(u)*Math.cos(h),m*Math.sin(u)*Math.sin(h),m*Math.cos(u)]}randomInBox(n){let l=n*.5;return[(this.rng()*2-1)*l,(this.rng()*2-1)*l,(this.rng()*2-1)*l]}}return new s(e)}simplifyGeometry(e,t){let i=this.THREE?.SimplifyModifier;if(!i)return null;let r=e,s=r?.attributes?.position?.count;if(!Number.isFinite(s))return null;let a=Math.max(.05,Math.min(1,t)),o=Math.max(3,Math.floor(s*a));if(o>=s)return e;try{return new i().modify(r,o)}catch{return null}}degToRad(e){return this.THREE.MathUtils.degToRad(e)}radToDeg(e){return this.THREE.MathUtils.radToDeg(e)}computeBoundingBoxRecursively(e){let t=new this.THREE.Box3,i=!1;return e.traverse&&e.traverse(r=>{if(r.visible&&r.geometry){typeof r.geometry.computeBoundingBox=="function"&&r.geometry.computeBoundingBox();let s=r.geometry.boundingBox;if(s){let a=s.clone().applyMatrix4(r.matrixWorld);t.union(a),i=!0}}}),i?t:new this.THREE.Box3}},Ge=class{constructor(e,t={}){this.engine=new Re(e,t)}getEngine(){return this.engine}getName(){return"Three.js"}};0&&(module.exports={FontConverter,String3D,String3DCamera,String3DCustomFilterRegistry,String3DCustomMaterialRegistry,String3DFontRegistry,String3DObject,String3DRenderer,String3DScene,String3DSynchronizer,ThreeJSEngine,ThreeJSMaterialFactory,ThreeJSProvider});
306
+ `});this.points=new t.Points(h,c),this.defaultEmitterMaterial=c,this.add(this.points)}buildInstanced(){let a=Math.max(1,this.cfg.count),l=this.cfg.particleShape==="model"&&this.modelGeometry,h=this.cfg.particleShape==="model"&&this.modelGeometry?this.modelGeometry:this.cfg.particleShape==="box"?new t.BoxGeometry(1,1,1):new t.SphereGeometry(.5,8,8);this.instancedUsesSharedGeometry=l;let c=new t.MeshStandardMaterial({color:new t.Color(this.cfg.color),transparent:this.cfg.opacity<1,opacity:this.cfg.opacity});this.defaultInstancedMaterial=c,this.instanced=new t.InstancedMesh(h,c,a),this.basePositions=new Float32Array(a*3),this.baseScales=new Float32Array(a),this.baseJitter=new Float32Array(a*3),this.basePhase=new Float32Array(a),this.fillBasePositions(a),this.applyInstancedTransforms(0),this.add(this.instanced)}setMaterial(a,l={}){let h=l.points??!0;(l.meshes??!0)&&(this.materialOverride=a),h&&(this.materialOverrideForPoints=a),this.applyMaterialOverrides()}updateEmitter(a){let l=this.cfg.count,h=this.normalize(this.cfg.particleDirection),c=this.cfg.particleGravity,u=Math.max(0,Math.min(1,this.cfg.particleDrag)),p=this.cfg.emitRate*a+this.emitRemainder,f=Math.floor(p);this.emitRemainder=p-f;let g=!1,D=1e6;for(let v=0;v<f;v+=1)this.spawnParticle(h);for(;this.pendingBurst>0;)this.spawnParticle(h),this.pendingBurst-=1;for(let v=0;v<l;v+=1){if(this.life[v]<=0)continue;if(this.life[v]-=a,this.life[v]<=0){this.life[v]=0;let S=v*3;this.positions[S]=D,this.positions[S+1]=D,this.positions[S+2]=D,this.colors[S]=0,this.colors[S+1]=0,this.colors[S+2]=0,g=!0;continue}let y=v*3;this.velocities[y]+=c[0]*a,this.velocities[y+1]+=c[1]*a,this.velocities[y+2]+=c[2]*a,this.velocities[y]*=1-u*a,this.velocities[y+1]*=1-u*a,this.velocities[y+2]*=1-u*a,this.positions[y]+=this.velocities[y]*a,this.positions[y+1]+=this.velocities[y+1]*a,this.positions[y+2]+=this.velocities[y+2]*a}this.points&&(this.points.geometry.attributes.position.needsUpdate=!0,g&&(this.points.geometry.attributes.color.needsUpdate=!0))}spawnParticle(a){let l=this.cfg.count,h=-1;for(let g=0;g<l;g+=1)if(this.life[g]<=0){h=g;break}if(h===-1)return;let c=this.randomInSphere(this.cfg.spread),u=this.cfg.particleSpeed*(1-this.cfg.particleSizeVariation+this.rng()*this.cfg.particleSizeVariation),m=[a[0]*u+(this.rng()-.5)*u*.2,a[1]*u+(this.rng()-.5)*u*.2,a[2]*u+(this.rng()-.5)*u*.2],p=h*3;this.positions.set(c,p),this.velocities.set(m,p),this.life[h]=this.cfg.particleLife,this.sizeFactors[h]=this.rng();let f=new t.Color(this.cfg.color);this.cfg.particleColorVariation>0&&f.offsetHSL((this.rng()-.5)*this.cfg.particleColorVariation,0,0),this.colors[p]=f.r,this.colors[p+1]=f.g,this.colors[p+2]=f.b,this.points&&(this.points.geometry.attributes.color.needsUpdate=!0,this.points.geometry.attributes.sizeFactor.needsUpdate=!0)}updateInstanced(a){this.applyInstancedTransforms(a),this.instanced&&(this.instanced.instanceMatrix.needsUpdate=!0)}applyInstancedTransforms(a){if(!this.instanced)return;let l=this.cfg.count,h=this.cfg.instanceJitter,c=this.cfg.instanceFlow,u=Math.max(0,this.cfg.instanceDisperse),m=Math.max(0,this.cfg.instanceDisperseScatter),p=this.cfg.instanceDisperseScatterX>0?this.cfg.instanceDisperseScatterX:m,f=this.cfg.instanceDisperseScatterY>0?this.cfg.instanceDisperseScatterY:m,g=this.cfg.instanceDisperseScatterZ>0?this.cfg.instanceDisperseScatterZ:m,D=this.cfg.instanceRotationSpeed,v=new t.Object3D;for(let y=0;y<l;y+=1){let S=y*3,P=this.basePositions[S],T=this.basePositions[S+1],F=this.basePositions[S+2],O=this.basePhase[y],x=Math.sin((T+a*1.4)*.7+O)*c*this.cfg.spread,M=Math.cos((P-a*1.1)*.6+O)*c*this.cfg.spread,w=Math.sin((F+a*1.2)*.8+O)*c*this.cfg.spread,L=Math.sin(a*2.1+O+this.baseJitter[S]*2.5)*h,_=Math.cos(a*1.7+O+this.baseJitter[S+1]*2.5)*h,k=Math.sin(a*1.9+O+this.baseJitter[S+2]*2.5)*h,H=1+u,$=this.baseJitter[S],W=this.baseJitter[S+1],A=this.baseJitter[S+2],C=Math.sqrt($*$+W*W+A*A)||1,b=u*this.cfg.spread,j=$/C*p*b,z=W/C*f*b,I=A/C*g*b;v.position.set(P*H+j+x+L,T*H+z+M+_,F*H+I+w+k),v.rotation.set(this.baseJitter[S]*.5,a*D+y*.1,this.baseJitter[S+2]*.5);let V=this.baseScales[y]*this.cfg.size;v.scale.set(V,V,V),v.updateMatrix(),this.instanced.setMatrixAt(y,v.matrix)}}applyMaterialOverrides(){if(this.points){let a=this.materialOverrideForPoints||this.defaultEmitterMaterial;a&&this.points.material!==a&&(this.points.material=a,this.ensurePointMaterial(a))}if(this.instanced){let a=this.materialOverride||this.defaultInstancedMaterial;a&&this.instanced.material!==a&&(this.instanced.material=a)}}ensurePointMaterial(a){a?.isShaderMaterial&&(a.uniforms||(a.uniforms={}),a.uniforms.uPointSize||(a.uniforms.uPointSize={value:this.cfg.size}),a.uniforms.uOpacity||(a.uniforms.uOpacity={value:this.cfg.opacity}),a.vertexShader.includes("gl_PointSize")||(a.vertexShader.includes("uPointSize")||(a.vertexShader=`uniform float uPointSize;
307
+ ${a.vertexShader}`),a.vertexShader=a.vertexShader.replace(/void\\s+main\\s*\\(\\)\\s*\\{/,"void main() {\\n gl_PointSize = uPointSize;"),a.needsUpdate=!0))}refreshModelGeometry(){if(this.cfg.particleShape!=="model"){this.modelGeometry=null,this.modelKey="";return}let a=this.cfg.particleModelUrl?.trim();if(!a||a==="none"){this.modelGeometry=null,this.modelKey="";return}let l=`${this.cfg.particleModelLoader}|${a}|${this.cfg.particleModelNode}`;this.modelKey===l&&this.modelGeometry||(this.modelKey=l,i.resolveParticleModelGeometry(a,this.cfg.particleModelLoader,this.cfg.particleModelNode).then(h=>{h&&this.modelKey===l&&(this.modelGeometry=h,this.cfg.mode==="instanced"&&this.cfg.particleShape==="model"&&this.rebuild())}))}refreshDistributionGeometry(){if(this.cfg.instanceShape!=="model"){this.distributionGeometry=null,this.distributionKey="";return}let a=this.cfg.instanceModelUrl?.trim();if(!a||a==="none"){this.distributionGeometry=null,this.distributionKey="";return}let l=`${this.cfg.instanceModelLoader}|${a}|${this.cfg.instanceModelNode}`;this.distributionKey===l&&this.distributionGeometry||(this.distributionKey=l,i.resolveParticleModelGeometry(a,this.cfg.instanceModelLoader,this.cfg.instanceModelNode).then(h=>{h&&this.distributionKey===l&&(this.distributionGeometry=h,this.cfg.mode==="instanced"&&this.cfg.instanceShape==="model"&&(this.pendingDistributionLoad?(this.pendingDistributionLoad=!1,this.buildInstanced(),this.applyMaterialOverrides()):this.rebuild()))}))}fillBasePositions(a){if(this.cfg.instanceShape==="model"&&this.distributionGeometry)this.fillFromModel(a,this.distributionGeometry);else for(let h=0;h<a;h+=1){let c=this.cfg.instanceShape==="box"?this.randomInBox(this.cfg.spread):this.randomInSphere(this.cfg.spread);this.basePositions.set(c,h*3)}for(let h=0;h<a;h+=1){let c=h*3;this.baseJitter[c]=this.rng()*2-1,this.baseJitter[c+1]=this.rng()*2-1,this.baseJitter[c+2]=this.rng()*2-1,this.basePhase[h]=this.rng()*Math.PI*2;let u=this.cfg.instanceScale*(1-this.cfg.instanceScaleVariation+this.rng()*this.cfg.instanceScaleVariation);this.baseScales[h]=u}}fillFromModel(a,l){let h=l?.attributes?.position;if(!h?.array||h.itemSize<3){for(let C=0;C<a;C+=1){let b=this.randomInSphere(this.cfg.spread);this.basePositions.set(b,C*3)}return}let c=h.array,u=h.itemSize,m=Math.floor(c.length/u);if(m<=0)return;let p=l?.index?.array,f=Math.floor(p?p.length/3:m/3);if(f<=0)return;let g=1/0,D=1/0,v=1/0,y=-1/0,S=-1/0,P=-1/0;for(let C=0;C<m;C+=1){let b=C*u,j=c[b],z=c[b+1],I=c[b+2];g=Math.min(g,j),D=Math.min(D,z),v=Math.min(v,I),y=Math.max(y,j),S=Math.max(S,z),P=Math.max(P,I)}let T=Math.max(1e-6,y-g),F=Math.max(1e-6,S-D),O=Math.max(1e-6,P-v),x=(this.cfg.spreadX>0?this.cfg.spreadX:this.cfg.spread)*2,M=(this.cfg.spreadY>0?this.cfg.spreadY:this.cfg.spread)*2,w=x>0?x/T:1,L=M>0?M/F:1,_=Math.min(w,L),k=(g+y)*.5,H=(D+S)*.5,$=(v+P)*.5,W=new Float32Array(f),A=0;for(let C=0;C<f;C+=1){let b=C*3,j=p?p[b]:b,z=p?p[b+1]:b+1,I=p?p[b+2]:b+2,V=j*u,G=z*u,K=I*u,X=c[V],q=c[V+1],Y=c[V+2],ue=c[G],ge=c[G+1],ye=c[G+2],ae=c[K],be=c[K+1],ve=c[K+2],pe=ue-X,se=ge-q,N=ye-Y,Z=ae-X,oe=be-q,le=ve-Y,ee=se*le-N*oe,te=N*Z-pe*le,ie=pe*oe-se*Z,de=Math.sqrt(ee*ee+te*te+ie*ie)*.5;A+=de,W[C]=A}if(A<=0){for(let C=0;C<a;C+=1){let b=this.randomInSphere(this.cfg.spread);this.basePositions.set(b,C*3)}return}for(let C=0;C<a;C+=1){let b=this.rng()*A,j=0,z=f-1;for(;j<z;){let Oe=Math.floor((j+z)/2);b<=W[Oe]?z=Oe:j=Oe+1}let I=j*3,V=p?p[I]:I,G=p?p[I+1]:I+1,K=p?p[I+2]:I+2,X=V*u,q=G*u,Y=K*u,ue=c[X],ge=c[X+1],ye=c[X+2],ae=c[q],be=c[q+1],ve=c[q+2],pe=c[Y],se=c[Y+1],N=c[Y+2],Z=this.rng(),oe=this.rng(),le=Math.sqrt(Z),ee=1-le,te=le*(1-oe),ie=le*oe,de=(ue*ee+ae*te+pe*ie-k)*_,Pe=(ge*ee+be*te+se*ie-H)*_,$e=(ye*ee+ve*te+N*ie-$)*_;this.basePositions[C*3]=de,this.basePositions[C*3+1]=Pe,this.basePositions[C*3+2]=$e}}resetEmitter(){if(!this.points)return;let a=1e6;for(let l=0;l<this.positions.length;l+=3)this.positions[l]=a,this.positions[l+1]=a,this.positions[l+2]=a;this.velocities.fill(0),this.life.fill(0),this.colors.fill(0),this.sizeFactors.fill(0),this.alive=0,this.emitRemainder=0,this.pendingBurst=this.cfg.emitBurst,this.points.geometry.attributes.position.needsUpdate=!0,this.points.geometry.attributes.color.needsUpdate=!0,this.points.geometry.attributes.sizeFactor.needsUpdate=!0}normalize(a){let l=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2])||1;return[a[0]/l,a[1]/l,a[2]/l]}isVec3Equal(a,l){return a[0]===l[0]&&a[1]===l[1]&&a[2]===l[2]}randomInSphere(a){let l=this.rng(),h=this.rng(),c=l*Math.PI*2,u=Math.acos(2*h-1),m=Math.cbrt(this.rng())*a;return[m*Math.sin(u)*Math.cos(c),m*Math.sin(u)*Math.sin(c),m*Math.cos(u)]}randomInBox(a){let l=a*.5;return[(this.rng()*2-1)*l,(this.rng()*2-1)*l,(this.rng()*2-1)*l]}}return new n(e)}forEachMesh(e,t){let i=n=>{n?.isMesh&&t(n)},r=e;if(typeof r?.traverse=="function"){r.traverse(n=>i(n));return}i(r)}forEachMaterial(e,t){let i=n=>{if(!n||!n.isMesh&&!n.isPoints)return;(Array.isArray(n.material)?n.material:[n.material]).forEach(o=>{o&&t(o)})},r=e;if(typeof r?.traverse=="function"){r.traverse(n=>i(n));return}i(r)}getPrimaryMesh(e){let t=null;return this.forEachMesh(e,i=>{t||(t=i)}),t}applyTextGeometryToMesh(e,t){let i=t;return typeof i?.applyToMesh!="function"?!1:(i.applyToMesh(e),!0)}setObjectPosition(e,t,i,r){return e?.position?.set&&typeof e.position.set=="function"?(e.position.set(t,i,r),!0):typeof e?.setPosition=="function"?(e.setPosition(t,i,r),!0):e?.position?(e.position.x=t,e.position.y=i,e.position.z=r,!0):!1}supportsObjectLayerIsolation(e,t){let i=e;return!i?.layers||typeof i.layers.set!="function"?!1:t.some(r=>this.hasLayers(r))}beginObjectLayerIsolation(e,t,i,r){let n=e;if(!n?.layers||typeof n.layers.set!="function")return null;let s=new Map,o=(l,h)=>{this.hasLayers(l)&&(s.has(l)||s.set(l,l.layers.mask),h==="set"?l.layers.set(r):l.layers.enable(r))};t.forEach(l=>o(l,"set")),i.forEach(l=>o(l,"enable"));let a=n.layers.mask;return n.layers.set(r),{cameraMask:a,objectMasks:Array.from(s.entries()).map(([l,h])=>({object:l,mask:h}))}}endObjectLayerIsolation(e,t){let i=e,r=t;Array.isArray(r?.objectMasks)&&r.objectMasks.forEach(n=>{let s=n?.object,o=n?.mask;this.hasLayers(s)&&typeof o=="number"&&(s.layers.mask=o)}),i?.layers&&typeof r?.cameraMask=="number"&&(i.layers.mask=r.cameraMask)}applyMaterialProps(e,t){let i=e;if(!i)return!1;let r=!1;if(typeof t.opacity=="number"&&Number.isFinite(t.opacity)&&(i.opacity=t.opacity,"transparent"in i&&(i.transparent=t.opacity<1),r=!0),t.color&&i.color&&typeof i.color.set=="function")try{i.color.set(t.color),r=!0}catch{}if(typeof t.metalness=="number"&&Number.isFinite(t.metalness)&&"metalness"in i&&(i.metalness=t.metalness,r=!0),typeof t.roughness=="number"&&Number.isFinite(t.roughness)&&"roughness"in i&&(i.roughness=t.roughness,r=!0),t.emissive&&i.emissive&&typeof i.emissive.set=="function")try{i.emissive.set(t.emissive),r=!0}catch{}return r}hasLayers(e){return!!e?.layers&&typeof e.layers.set=="function"}simplifyGeometry(e,t){let i=this.THREE?.SimplifyModifier;if(!i)return null;let r=e,n=r?.attributes?.position?.count;if(!Number.isFinite(n))return null;let s=Math.max(.05,Math.min(1,t)),o=Math.max(3,Math.floor(n*s));if(o>=n)return e;try{return new i().modify(r,o)}catch{return null}}degToRad(e){return this.THREE.MathUtils.degToRad(e)}radToDeg(e){return this.THREE.MathUtils.radToDeg(e)}computeBoundingBoxRecursively(e){let t=new this.THREE.Box3,i=!1;return e.traverse&&e.traverse(r=>{if(r.visible&&r.geometry){typeof r.geometry.computeBoundingBox=="function"&&r.geometry.computeBoundingBox();let n=r.geometry.boundingBox;if(n){let s=n.clone().applyMatrix4(r.matrixWorld);t.union(s),i=!0}}}),i?t:new this.THREE.Box3}getBackend(){return"webgl"}getCapabilities(){return{renderTargets:!0,shaderMaterials:!0,postProcess:!0,customMaterialFactory:!0,particles:!0,text:!0,geometrySimplify:!!this.THREE?.SimplifyModifier}}getPostProcessRuntime(){return{isSupported:e=>typeof e.setRenderTarget=="function",createRenderTarget:(e,t,i)=>this.createRenderTarget(e,t,i),createShaderMaterial:e=>this.createShaderMaterial(e),setRenderTarget:(e,t)=>{e.setRenderTarget?.(t)},clear:(e,t=!0,i=!0,r=!0)=>{e.clear?.(t,i,r)},createPipeline:({engine:e,renderer:t,width:i,height:r,customFilterRegistry:n})=>new We({engine:e,renderer:t,runtime:this.getPostProcessRuntime(),width:i,height:r,customFilterRegistry:n})}}getCustomFilterRegistry(){return{get:e=>ce.get(e)}}getCustomMaterialRegistry(){return{get:e=>re.get(e)}}},Ge=class{constructor(e,t={}){this.engine=new Le(e,t)}initialize(){}getEngine(){return this.engine}getName(){return"Three.js"}getBackend(){return this.engine.getBackend?.()??"webgl"}getCapabilities(){return this.engine.getCapabilities?.()||{renderTargets:!1,shaderMaterials:!1,postProcess:!1,customMaterialFactory:!1,particles:!1,text:!1,geometrySimplify:!1}}};0&&(module.exports={FontConverter,String3D,String3DCamera,String3DCustomFilterRegistry,String3DCustomMaterialRegistry,String3DFontRegistry,String3DObject,String3DRenderer,String3DScene,String3DSynchronizer,ThreeJSEngine,ThreeJSMaterialFactory,ThreeJSProvider});
307
308
  //# sourceMappingURL=index.cjs.map