string-tune-3d 0.0.12 → 0.0.13

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.js CHANGED
@@ -1,5 +1,5 @@
1
- "use strict";var StringTune3D=(()=>{var Ke=Object.defineProperty;var ft=Object.getOwnPropertyDescriptor;var yt=Object.getOwnPropertyNames;var bt=Object.prototype.hasOwnProperty;var vt=(p,e)=>{for(var t in e)Ke(p,t,{get:e[t],enumerable:!0})},St=(p,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of yt(e))!bt.call(p,r)&&r!==t&&Ke(p,r,{get:()=>e[r],enumerable:!(i=ft(e,r))||i.enumerable});return p};var Mt=p=>St(Ke({},"__esModule",{value:!0}),p);var jt={};vt(jt,{FontConverter:()=>ge,String3D:()=>Ue,String3DCamera:()=>we,String3DCustomFilterRegistry:()=>ce,String3DCustomMaterialRegistry:()=>re,String3DFontRegistry:()=>se,String3DObject:()=>Q,String3DRenderer:()=>Ee,String3DScene:()=>Ce,String3DSynchronizer:()=>Te,ThreeJSEngine:()=>Oe,ThreeJSMaterialFactory:()=>Fe,ThreeJSProvider:()=>qe});var xt=class{constructor(){this.desktop={rebuild:{width:!0,height:!0,scrollHeight:!0}},this.mobile={rebuild:{width:!0,height:!0,scrollHeight:!0}}}},ke=class{constructor(p){this.objectMapOnPage=new Map,this.objectsOnPage=[],this.objectMap=new Map,this.objects=[],this.htmlKey="",this._type=1,this.permissions=new xt,this.tools=p.tools,this.data=p.data,this.settings=p.settings,this.events=p.events,this.centers=p.centers,this.hover=p.hover,this.objectManager=p.objectManager,this.attributesToMap=[{key:"active",type:"boolean",fallback:this.settings.active},{key:"fixed",type:"boolean",fallback:this.settings.fixed},{key:"outside-container",type:"boolean",fallback:this.settings["outside-container"]},{key:"repeat",type:"boolean",fallback:this.settings.repeat},{key:"self-disable",type:"boolean",fallback:this.settings["self-disable"]},{key:"abs",type:"boolean",fallback:this.settings.abs},{key:"key",type:"string",fallback:this.settings.key},{key:"offset-top",type:"dimension",fallback:this.settings["offset-top"]},{key:"offset-bottom",type:"dimension",fallback:this.settings["offset-bottom"]},{key:"inview-top",type:"dimension",fallback:this.settings["inview-top"]},{key:"inview-bottom",type:"dimension",fallback:this.settings["inview-bottom"]},{key:"start",type:"number",fallback:(e,t,i)=>{let r=i.top;return Math.floor(r)+this.data.scroll.container.scrollTop*this.data.viewport.transformScale}},{key:"end",type:"number",fallback:(e,t,i)=>{let r=i.top,s=i.height;return r+s-this.data.scroll.transformedCurrent}},{key:"size",type:"number",fallback:(e,t,i)=>i.height},{key:"half-width",type:"number",fallback:(e,t,i)=>i.width/2},{key:"half-height",type:"number",fallback:(e,t,i)=>i.height/2},{key:"enter-el",type:"string",fallback:this.settings["enter-el"]},{key:"enter-vp",type:"string",fallback:this.settings["enter-vp"]},{key:"exit-el",type:"string",fallback:this.settings["exit-el"]},{key:"exit-vp",type:"string",fallback:this.settings["exit-vp"]}]}get type(){return this._type}initializeObject(p,e,t,i){let r=this.tools.boundingClientRect.process({element:t});for(let{key:s,type:n,fallback:o,transform:a}of this.attributesToMap){let l=typeof o=="function"?o(t,e,r):o,h=this.tools.domAttribute.process({element:t,key:s,fallback:i[s]??this.settings[s]??l}),c=this.parseAttribute(h,n,{element:t,boundingRect:r,viewportHeight:this.data.viewport.windowHeight,baseRem:this.data.viewport.baseRem});a&&(c=a(c)),e.setProperty(s,c)}}calculatePositions(p,e){let t=p.getProperty("start"),i=p.getProperty("size"),r=p.getProperty("offset-bottom"),s=p.getProperty("offset-top"),n=p.getProperty("enter-el"),o=p.getProperty("enter-vp"),a=p.getProperty("exit-el"),l=p.getProperty("exit-vp"),h=0,c=0,u=0,d=0;n==="top"&&o==="top"||n==="left"&&o==="left"?(u=-e+1,h=t-r):n==="top"&&o==="bottom"||n==="left"&&o==="right"?h=t-e-r:n==="bottom"&&o==="top"||n==="right"&&o==="left"?(u=-e-i+1,h=t+i-r):(n==="bottom"&&o==="bottom"||n==="right"&&o==="right")&&(u=-i+1,h=t-e+i-r),a==="top"&&l==="top"||a==="left"&&l==="left"?(d=-i+1,c=t+s):a==="top"&&l==="bottom"||a==="left"&&l==="right"?(d=-e-i+1,c=t-e+s):a==="bottom"&&l==="top"||a==="right"&&l==="left"?c=t+i+s:(a==="bottom"&&l==="bottom"||a==="right"&&l==="right")&&(d=-e+1,c=t-e+i+s),p.setProperty("start-bias",u),p.setProperty("end-bias",d),p.setProperty("start-position",h-this.data.scroll.topPosition),p.setProperty("end-position",c-this.data.scroll.topPosition),p.setProperty("difference-position",c-h);let m=p.getProperty("inview-top")??0,g=p.getProperty("inview-bottom")??0;p.setProperty("inview-start-position",p.getProperty("start-position")+m),p.setProperty("inview-end-position",p.getProperty("end-position")+g)}parseAttribute(p,e,t={}){if(p==null)return null;if(typeof e=="object"&&e.type==="enum")return e.values.includes(p)?p:e.values[0];switch(e){case"number":return parseFloat(p);case"boolean":return p===""||p==="true";case"json":try{return JSON.parse(p)}catch{return null}case"tuple":return p.trim().split(/\s+/);case"easing":return this.tools.easingFunction.process({easing:p});case"color":return this.tools.colorParser.process({value:p});case"dimension":return p=="0"?0:t.element!=null&&t.viewportHeight!=null&&t.baseRem!=null&&t.boundingRect!=null?this.tools.unitParser.process({value:p,element:t.element,viewportHeight:t.viewportHeight,boundingRect:t.boundingRect,baseRem:t.baseRem}):0;case"breakpoint-dimension":if(t.element!=null&&t.viewportHeight!=null&&t.baseRem!=null&&t.boundingRect!=null){let i=p.trim().split("|"),r=[];for(let s of i)if(s.includes(":")){let[n,o]=s.split(":");r.push({breakpoint:parseInt(n),value:this.tools.unitParser.process({value:`${o}|`,element:t.element,viewportHeight:t.viewportHeight,boundingRect:t.boundingRect,baseRem:t.baseRem})})}else r.push({breakpoint:0,value:this.tools.unitParser.process({value:s,element:t.element,viewportHeight:t.viewportHeight,boundingRect:t.boundingRect,baseRem:t.baseRem})});return r}default:return p}}canConnect(p){return p.keys.includes(this.htmlKey)}connectObject(p){p.connect(this),this.onObjectConnected(p)}enterObject(p,e){this.objectMap.has(p)||(this.objectMap.set(p,e),this.objects.push(e))}exitObject(p){let e=this.objectMap.get(p);if(!e)return;this.objectMap.delete(p);let t=this.objects.indexOf(e);t!==-1&&this.objects.splice(t,1)}addObject(p,e){this.objectMapOnPage.has(p)||(this.objectMapOnPage.set(p,e),this.objectsOnPage.push(e))}removeObject(p){let e=this.objectMapOnPage.get(p);if(!e)return;this.objectMapOnPage.delete(p);let t=this.objectsOnPage.indexOf(e);t!==-1&&this.objectsOnPage.splice(t,1),this.onObjectDisconnected(e)}onObjectConnected(p){}onObjectDisconnected(p){}applyToElementAndConnects(p,e,t=e){p.getProperty("self-disable")!==!0&&e(p.htmlElement),p.mirrorObjects.forEach(i=>t(i.htmlElement,i))}destroy(){this.objects=[],this.objectMap=new Map}onInit(){}onSubscribe(){}onUnsubscribe(){}onFrame(p){}onMutate(p){}onScrollMeasure(p){}onMouseMoveMeasure(p){}onResize(){}onResizeWidth(){}onScroll(p){}onDirectionChange(){}onScrollStart(){}onScrollStop(){}onScrollDirectionChange(){}onAxisChange(){}onDeviceChange(){}onScrollConfigChange(){}onSettingsChange(){}onDOMRebuild(){}onMouseMove(p){}onWheel(p){}onDOMMutate(p,e){}};var wt=class{constructor(){this.pendingVars=new Map,this.pendingProps=new Map,this.isOpen=!1}begin(){this.isOpen||(this.isOpen=!0)}setVars(p,e){if(!this.isOpen){console.warn("StyleTxn: call begin() first to set custom properties.");return}let t=this.pendingVars.get(p)??{};for(let[i,r]of Object.entries(e))t[i]!==r&&(t[i]=r);this.pendingVars.set(p,t)}setProps(p,e){if(!this.isOpen){console.warn("StyleTxn: call begin() first to set standard properties.");return}let t=this.pendingProps.get(p)??{};for(let[i,r]of Object.entries(e))t[i]!==r&&(t[i]=r);this.pendingProps.set(p,t)}run(p){let e=this.isOpen;e||this.begin();try{p(),e||this.commit()}catch(t){throw e||this.cancel(),t}}commit(){if(this.isOpen){this.isOpen=!1;for(let[p,e]of this.pendingVars){let t=p.style;for(let[i,r]of Object.entries(e))t.setProperty(i,String(r))}this.pendingVars.clear();for(let[p,e]of this.pendingProps){let t=p.style;for(let[i,r]of Object.entries(e))t[i]=String(r)}this.pendingProps.clear()}}cancel(){this.pendingVars.clear(),this.pendingProps.clear(),this.isOpen=!1}},lt=new wt;var Nt=1/240;var Et=class{constructor(){this.measureQueue=[],this.mutateQueue=[],this.scheduled=!1}measure(p){this.measureQueue.push(p),this.schedule()}mutate(p){this.mutateQueue.push(p),this.schedule()}schedule(){this.scheduled||(this.scheduled=!0,requestAnimationFrame(()=>{let p=this.measureQueue;this.measureQueue=[];for(let t=0;t<p.length;t++)try{p[t]()}catch(i){console.error("Error in frameDOM measure task:",i)}let e=this.mutateQueue;this.mutateQueue=[];for(let t=0;t<e.length;t++)try{e[t]()}catch(i){console.error("Error in frameDOM mutate task:",i)}this.scheduled=!1}))}},Vt=new Et;var Ht=Math.PI*2,Bt=180/Math.PI;var ct=(p=>(p.ACTIVE="-active",p.ENTERING="-entering",p.LEAVING="-leaving",p.DISABLED="-disabled",p))(ct||{}),Dt={PROGRESS:"--sequence-progress",DIRECTION:"--sequence-direction"},Ct=class ht extends ke{constructor(e){super(e),this.activeStep=new Map,this.leavingStep=new Map,this.transitions=new Map,this.elementIndex=new Map,this.triggerElements=new Map,this.globalSettings=new Map,this.stateRegistered=new Set,this.lastEnteredStep=new Map,this.initialized=!1,this.onTriggerClick=t=>{let i=this.triggerElements.get(t.currentTarget);if(!i)return;let r=this.activeStep.get(i.slider)??0,s=this.getMaxStep(i.slider),n,o;if(i.step==="next"){if(n=r+1,o=1,!this.elementIndex.has(`${i.slider}[${n}]`))if(i.loop&&s>=0)n=0;else return}else if(i.step==="prev"){if(n=r-1,o=-1,n<0)if(i.loop&&s>=0)n=s;else return;if(!this.elementIndex.has(`${i.slider}[${n}]`))return}else{if(n=i.step,r===n)return;o=n>r?1:-1}this.startTransition(i.slider,n,o)},this.htmlKey="sequence",this.defaultDuration=this.settings["sequence-duration"]??600,this.attributesToMap=[...this.attributesToMap,{key:"sequence",type:"string",fallback:""},{key:"sequence-trigger",type:"string",fallback:""},{key:"entering-easing",type:"string",fallback:""},{key:"leaving-easing",type:"string",fallback:""},{key:"entering-duration",type:"string",fallback:""},{key:"leaving-duration",type:"string",fallback:""},{key:"sequence-duration",type:"string",fallback:""},{key:"active-step",type:"string",fallback:""}]}onInit(){super.onInit(),this.events.on("sequence",this.onSequenceEvent.bind(this)),this.scanStandaloneTriggers()}scanStandaloneTriggers(){let e=document.querySelectorAll("[string-sequence-trigger]:not([string-inited])");for(let t of Array.from(e)){let i=t.getAttribute("string-sequence-trigger"),r=i?this.parseTriggerKey(i):null;r&&(this.triggerElements.set(t,r),t.addEventListener("click",this.onTriggerClick))}}parseGlobalSettingsFromObject(e){let t=r=>e.getProperty(r),i=t("sequence-duration");this.tryParseGlobalSetting(i,"enteringDuration"),this.tryParseGlobalSetting(i,"leavingDuration"),this.tryParseGlobalSetting(t("entering-duration"),"enteringDuration"),this.tryParseGlobalSetting(t("leaving-duration"),"leavingDuration"),this.tryParseGlobalSetting(t("entering-easing"),"enteringEasing"),this.tryParseGlobalSetting(t("leaving-easing"),"leavingEasing"),this.tryParseGlobalSetting(t("active-step"),"activeStep")}tryParseGlobalSetting(e,t){if(!e)return;let i=e.match(/^(.+)\[(.+)\]$/);if(!i)return;let[,r,s]=i,n=this.globalSettings.get(r)??{};this.globalSettings.set(r,n),n[t]=t==="enteringEasing"||t==="leavingEasing"?s:parseFloat(s),this.applyGlobalSettingsToExistingObjects(r)}applyGlobalSettingsToExistingObjects(e){let t=this.globalSettings.get(e);if(t){for(let[i,r]of this.elementIndex)if(this.parseSequenceKey(i)?.slider===e){t.enteringDuration!==void 0&&(r.enteringDuration=t.enteringDuration),t.leavingDuration!==void 0&&(r.leavingDuration=t.leavingDuration);for(let s of r.objects)this.resolveEasings(s,i)}}}initializeSliders(){let e=new Set;for(let t of this.elementIndex.keys()){let i=this.parseSequenceKey(t);i&&e.add(i.slider)}for(let t of e){if(this.activeStep.has(t))continue;let i=this.globalSettings.get(t)?.activeStep??0;this.elementIndex.has(`${t}[${i}]`)||(i=0),this.switchInstant(t,i,1)}}tryApplyPendingActiveStep(e){if(this.activeStep.has(e))return;let t=this.globalSettings.get(e)?.activeStep;t!==void 0&&this.elementIndex.has(`${e}[${t}]`)&&this.switchInstant(e,t,1)}canConnect(e){return e.keys.includes("sequence")||e.keys.includes("sequence-trigger")}onObjectConnected(e){super.onObjectConnected(e),this.parseGlobalSettingsFromObject(e);let t=e.getProperty("sequence"),i=e.getProperty("sequence-trigger");if(!t&&i){let r=this.parseTriggerKey(i);r&&typeof r.step=="number"&&(t=`${r.slider}[${r.step}]`,e.setProperty("sequence",t))}if(t){let r=this.parseSequenceKey(t);if(r){this.ensureStateEventRegistered(r.slider);let s=this.elementIndex.get(t);if(!s){let{enteringDuration:o,leavingDuration:a}=this.resolveDurations(e,t);s={objects:[],enteringDuration:o,leavingDuration:a},this.elementIndex.set(t,s)}s.objects.push(e),this.resolveEasings(e,t);let n=this.activeStep.get(r.slider);this.setState(e,n===r.step?"-active":"-disabled",n===r.step?1:0,1),this.tryApplyPendingActiveStep(r.slider)}}if(i){let r=this.parseTriggerKey(i);r&&(this.triggerElements.set(e.htmlElement,r),e.htmlElement.addEventListener("click",this.onTriggerClick))}}ensureStateEventRegistered(e){this.stateRegistered.has(e)||(this.stateRegistered.add(e),this.events.registerStateEvent?.(`sequence:active:${e}`))}parseTriggerKey(e){let t=e.match(/^(.+)\[(next|prev|\d+)(\|loop)?\]$/);if(!t)return null;let i=t[2]==="next"||t[2]==="prev"?t[2]:parseInt(t[2],10);return{slider:t[1],step:i,loop:t[3]==="|loop"}}getMaxStep(e){let t=-1;for(let i of this.elementIndex.keys()){let r=this.parseSequenceKey(i);r?.slider===e&&r.step>t&&(t=r.step)}return t}resolveDuration(e,t,i,r){let s=e.getProperty(r),n=e.getProperty("sequence-duration"),o=this.globalSettings.get(t)?.[i];if(s&&!s.includes("[")){let a=parseFloat(s);if(!isNaN(a))return a}if(n&&!n.includes("[")){let a=parseFloat(n);if(!isNaN(a))return a}return o??this.defaultDuration}resolveDurations(e,t){let i=this.parseSequenceKey(t)?.slider??"";return{enteringDuration:this.resolveDuration(e,i,"enteringDuration","entering-duration"),leavingDuration:this.resolveDuration(e,i,"leavingDuration","leaving-duration")}}resolveEasing(e,t,i,r){let s=e.getProperty(r);(!s||typeof s=="string"&&s.includes("["))&&(s=this.globalSettings.get(t)?.[i]??this.settings.easing??"ease-out"),typeof s=="string"&&e.setProperty(r,this.tools.easingFunction.process({easing:s}))}resolveEasings(e,t){let i=this.parseSequenceKey(t)?.slider;i&&(this.resolveEasing(e,i,"enteringEasing","entering-easing"),this.resolveEasing(e,i,"leavingEasing","leaving-easing"))}onObjectDisconnected(e){super.onObjectDisconnected(e);let t=e.getProperty("sequence");if(t){let i=this.elementIndex.get(t);if(i){let r=i.objects.indexOf(e);r!==-1&&i.objects.splice(r,1),i.objects.length||this.elementIndex.delete(t)}}this.triggerElements.has(e.htmlElement)&&(e.htmlElement.removeEventListener("click",this.onTriggerClick),this.triggerElements.delete(e.htmlElement))}parseSequenceKey(e){let t=e.match(/^(.+)\[(\d+)\]$/);return t?{slider:t[1],step:parseInt(t[2],10)}:null}onSequenceEvent(e){let{slider:t,step:i,transitionProgress:r,direction:s=1,duration:n,instant:o}=e;this.activeStep.get(t)===i&&r===void 0||(r!==void 0?this.handleScrub(t,i,r,s):o?this.switchInstant(t,i,s):this.startTransition(t,i,s,n))}startTransition(e,t,i,r){let s=this.activeStep.get(e),n=this.leavingStep.get(e);this.ensureStateEventRegistered(e),n!==void 0&&n!==s&&this.setStepState(e,n,"-disabled",0,i);let o=this.elementIndex.get(`${e}[${t}]`),a=s!==void 0?this.elementIndex.get(`${e}[${s}]`):null;s!==void 0&&this.leavingStep.set(e,s),this.activeStep.set(e,t),this.emitActiveState(e,t);let l={fromStep:s??t,toStep:t,direction:i,startTime:this.data.time.now,enteringDuration:r??o?.enteringDuration??this.defaultDuration,leavingDuration:r??a?.leavingDuration??this.defaultDuration};this.transitions.set(e,l),this.emitTransitionStart(e,l)}handleScrub(e,t,i,r){this.transitions.delete(e);let s=this.activeStep.get(e);if(s!==t){let o=this.leavingStep.get(e);o!==void 0&&this.setStepState(e,o,"-disabled",0,r),s!==void 0&&this.leavingStep.set(e,s),this.activeStep.set(e,t),this.emitActiveState(e,t)}let n=this.leavingStep.get(e)??s??t;this.applyProgress(e,n,t,i,i,r)}switchInstant(e,t,i){this.transitions.delete(e);let r=this.activeStep.get(e),s=this.leavingStep.get(e);s!==void 0&&this.setStepState(e,s,"-disabled",0,i),r!==void 0&&r!==t&&this.setStepState(e,r,"-disabled",0,i),this.activeStep.set(e,t),this.leavingStep.delete(e),this.setStepState(e,t,"-active",1,i),this.emitActiveState(e,t),s!==void 0&&s!==t?this.emitStepLeave(e,s,i,!0):r!==void 0&&r!==t&&this.emitStepLeave(e,r,i,!0),this.emitStepEnter(e,t,i,!0);let n={fromStep:r??t,toStep:t,direction:i,startTime:this.data.time.now,enteringDuration:0,leavingDuration:0};this.emitTransitionStart(e,n),this.emitTransitionEnd(e,t,r??t,i,!0)}applyProgress(e,t,i,r,s,n){let o=this.activeStep.get(e),a=this.leavingStep.get(e);this.setStepState(e,o,r>=1?"-active":"-entering",r,n),a!==void 0&&a!==o&&(s>=1?(this.setStepState(e,a,"-disabled",0,n),this.leavingStep.delete(e),this.emitStepLeave(e,a,n,!1)):this.setStepState(e,a,"-leaving",s,n)),this.emitTransitionProgress(e,t,i,r,s,n),r>=1&&this.emitStepEnter(e,o,n,!1)}setStepState(e,t,i,r,s){let n=this.elementIndex.get(`${e}[${t}]`);if(n)for(let o of n.objects)this.setState(o,i,r,s)}setState(e,t,i,r){let s=e.htmlElement,n=e.getProperty("_state"),o=e.getProperty("_direction"),a=e.getProperty(t==="-leaving"?"leaving-easing":"entering-easing"),l=typeof a=="function"?a(i):i;n!==t&&(s.classList.remove(...ht.ALL_STATES),s.classList.add(t),e.setProperty("_state",t)),o!==r&&(e.setProperty("_direction",r),lt.run(()=>lt.setVars(s,{[Dt.DIRECTION]:r.toString()})))}onFrame(e){super.onFrame(e),this.initialized||(this.initialized=!0,this.initializeSliders());for(let[t,i]of this.transitions){let r=e.time.now-i.startTime,s=Math.min(1,r/i.enteringDuration),n=Math.min(1,r/i.leavingDuration);this.applyProgress(t,i.fromStep,i.toStep,s,n,i.direction),s>=1&&n>=1&&(this.emitTransitionEnd(t,i.toStep,i.fromStep,i.direction,!1),this.transitions.delete(t))}}emitTransitionStart(e,t){let i={slider:e,from:t.fromStep,to:t.toStep,direction:t.direction,enteringDuration:t.enteringDuration,leavingDuration:t.leavingDuration,startedAt:t.startTime};this.events.emit("sequence:transition:start",i),this.events.emit(`sequence:transition:start:${e}`,i)}emitTransitionProgress(e,t,i,r,s,n){let o={slider:e,from:t,to:i,entering:r,leaving:s,direction:n};this.events.emit("sequence:transition:progress",o),this.events.emit(`sequence:transition:progress:${e}`,o)}emitTransitionEnd(e,t,i,r,s){let n={slider:e,from:i,to:t,direction:r,instant:s};this.events.emit("sequence:transition:end",n),this.events.emit(`sequence:transition:end:${e}`,n)}emitStepEnter(e,t,i,r){if(!r&&this.lastEnteredStep.get(e)===t)return;this.lastEnteredStep.set(e,t);let s={slider:e,step:t,direction:i,instant:r};this.events.emit("sequence:step:enter",s),this.events.emit(`sequence:step:enter:${e}`,s)}emitStepLeave(e,t,i,r){if(t==null)return;let s={slider:e,step:t,direction:i,instant:r};this.events.emit("sequence:step:leave",s),this.events.emit(`sequence:step:leave:${e}`,s)}emitActiveState(e,t){let i={slider:e,step:t};this.events.emit("sequence:active",i),this.events.emit(`sequence:active:${e}`,i)}};Ct.ALL_STATES=Object.values(ct);var Ze=class Ae extends ke{constructor(e){super(e),this.htmlKey="form"}initializeObject(e,t,i,r){super.initializeObject(e,t,i,r);let s=t.getProperty("form-events")??[];s.forEach(h=>{h.eventElement.removeEventListener(h.eventType,h.eventCallback)}),s.length=0,t.setProperty("form-events",s),super.onObjectConnected(t);let n=t.htmlElement,o=[],a={};this.getInteractiveFields(n).forEach((h,c)=>this.registerField(h,n,o,a,s,c));let l=h=>{h.preventDefault();let c=!0,u={},d=new Set;for(let m of o){let g=m.field;if(!g.isConnected||!this.shouldValidateField(g))continue;if(this.isRadioField(g)){if(d.has(m.key))continue;d.add(m.key)}let{key:f,rules:S,needsContext:y}=m,b=this.getFieldValue(g);u[f]=b,a[f]=b;let{valid:v,errors:w}=this.tools.validation.process({rules:S,value:b,context:this.buildContext(y,f,a)});this.applyValidationState(n,g,f,v,w,"submit"),v||(c=!1)}if(c)this.events.emit(`form:submit:${t.id}`,u);else{let m=new Set,g=o.find(f=>{let S=f.field;if(!S.isConnected||!this.shouldValidateField(S))return!1;if(this.isRadioField(S)){if(m.has(f.key))return!1;m.add(f.key)}let{key:y,rules:b,needsContext:v}=f,w=this.getFieldValue(S);a[y]=w;let{valid:P}=this.tools.validation.process({rules:b,value:w,context:this.buildContext(v,y,a)});return!P});g?.field&&typeof g.field.focus=="function"&&g.field.focus(),this.events.emit(`form:invalid:${t.id}`)}};n.addEventListener("submit",l),s.push({eventElement:n,eventType:"submit",eventCallback:l}),t.setProperty("form-field-entries",o),t.setProperty("form-field-values",a)}onObjectConnected(e){}onDOMMutate(e,t){this.objects.length!==0&&(e.length>0&&this.handleMutationAdditions(e),t.length>0&&this.handleMutationRemovals(t))}applyValidationState(e,t,i,r,s,n){let o=e.querySelector(`[string-input="error[${i}]"]`),a=e.querySelector(`[string-input="group[${i}]"]`);o&&(o.innerHTML="",s.forEach(h=>{let c=document.createElement("span");c.textContent=h,o.appendChild(c)})),n==="live"?(t.classList.toggle("-invalid",!r),t.classList.remove("-error")):(t.classList.remove("-invalid"),t.classList.toggle("-error",!r)),t.classList.toggle("-valid",r),a&&(n==="live"?(a.classList.toggle("-invalid",!r),a.classList.remove("-error")):(a.classList.remove("-invalid"),a.classList.toggle("-error",!r)),a.classList.toggle("-valid",r));let l=r?"valid":n==="live"?"invalid":"error";this.events.emit(`form:field:${l}:${i}`,{key:i,field:t,errors:s,phase:n,valid:r})}getInteractiveFields(e){return Array.from(e.querySelectorAll("[string-input]")).filter(t=>!this.isServiceFieldAttribute(t.getAttribute("string-input")||"")).filter(t=>this.isFormFieldElement(t)).map(t=>t)}getFieldRules(e){let t=this.tools.domAttribute.process({element:e,key:"input"})??"";return this.tools.ruleParser.process({value:t})}registerField(e,t,i,r,s,n){if(!this.isFormFieldElement(e)||e.closest("form")!==t||i.some(g=>g.field===e))return;let o=this.registerFieldIndex(e,n??i.length),a=this.getInputKey(e,o),l=this.getFieldRules(e),h=this.supportsBeforeInputValidation(l),c=this.requiresContext(l),u=this.getInputEventType(e),d={field:e,key:a,rules:l,supportsRealtime:h,needsContext:c,inputEventType:u,inputHandler:()=>{}},m=g=>{let f=g.currentTarget||g.target;if(!f||!f.isConnected||!this.shouldValidateField(f))return;let S=this.getFieldValue(f);r[d.key]=S;let y=this.buildContext(d.needsContext,d.key,r),{valid:b,errors:v}=this.tools.validation.process({rules:d.rules,value:S,context:y});this.applyValidationState(t,f,d.key,b,v,"live")};if(d.inputHandler=m,e.addEventListener(u,m),s.push({eventElement:e,eventType:u,eventCallback:m}),h&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement)){let g=f=>{let S=f;if(S.isComposing||S.inputType?.startsWith("insertComposition"))return;let y=f.currentTarget||f.target;if(!y||!(y instanceof HTMLInputElement||y instanceof HTMLTextAreaElement)||!y.isConnected)return;let b=y.selectionStart??0,v=y.selectionEnd??0,w=y.value;switch(S.inputType){case"deleteContentBackward":w=b===v&&b>0?y.value.slice(0,b-1)+y.value.slice(v):y.value.slice(0,b)+y.value.slice(v);break;case"deleteContentForward":w=b===v&&b<y.value.length?y.value.slice(0,b)+y.value.slice(b+1):y.value.slice(0,b)+y.value.slice(v);break;case"insertFromPaste":case"insertFromDrop":case"insertReplacementText":w=y.value.slice(0,b)+(S.data||"")+y.value.slice(v);break;default:typeof S.data=="string"&&(w=y.value.slice(0,b)+S.data+y.value.slice(v))}let{errors:P}=this.tools.validation.process({rules:d.rules,value:w,type:"beforeinput",context:this.buildContext(d.needsContext,d.key,r,{applied:!0,value:w})});P.length>0&&f.cancelable&&f.preventDefault()};d.beforeInputHandler=g,e.addEventListener("beforeinput",g),s.push({eventElement:e,eventType:"beforeinput",eventCallback:g})}e.classList.add("-inited"),i.push(d),r[a]=this.getFieldValue(e)}unregisterField(e,t,i,r){let s=t.findIndex(o=>o.field===e);if(s===-1)return;let n=t[s];n.inputHandler&&e.removeEventListener(n.inputEventType,n.inputHandler),n.beforeInputHandler&&e.removeEventListener("beforeinput",n.beforeInputHandler),delete i[n.key],t.splice(s,1);for(let o=r.length-1;o>=0;o--){let a=r[o];a.eventElement===e&&(a.eventCallback===n.inputHandler||n.beforeInputHandler&&a.eventCallback===n.beforeInputHandler)&&r.splice(o,1)}e.classList.remove("-inited")}collectInteractiveFieldsFromNode(e){let t=[];return e instanceof Element?(e.hasAttribute("string-input")&&t.push(e),t.push(...Array.from(e.querySelectorAll("[string-input]")))):e instanceof DocumentFragment&&t.push(...Array.from(e.querySelectorAll("[string-input]"))),t.filter(i=>!this.isServiceFieldAttribute(i.getAttribute("string-input")||"")).filter(i=>this.isFormFieldElement(i))}isRadioField(e){return e instanceof HTMLInputElement&&e.type==="radio"}handleMutationAdditions(e){e.forEach(t=>{this.collectInteractiveFieldsFromNode(t).forEach(i=>{let r=this.getFormStateByContainment(i);r&&this.registerField(i,r.form,r.entries,r.values,r.events)})})}handleMutationRemovals(e){e.forEach(t=>{this.collectInteractiveFieldsFromNode(t).forEach(i=>{let r=this.getFormStateByReference(i);r&&this.unregisterField(i,r.entries,r.values,r.events)})})}getFormStateByContainment(e){let t=this.objects.find(i=>i.htmlElement instanceof HTMLFormElement&&i.htmlElement.contains(e));return t?this.buildFormState(t):null}getFormStateByReference(e){for(let t of this.objects){let i=t.getProperty("form-field-entries");if(i&&i.some(r=>r.field===e))return this.buildFormState(t,i)}return null}buildFormState(e,t){let i=e.htmlElement;if(!(i instanceof HTMLFormElement))return null;let r=t??e.getProperty("form-field-entries"),s=e.getProperty("form-field-values"),n=e.getProperty("form-events");return!r||!s||!n?null:{object:e,form:i,entries:r,values:s,events:n}}registerFieldIndex(e,t){let i=e.getAttribute("data-string-form-index");return i!==null?Number(i):(e.setAttribute("data-string-form-index",String(t)),t)}getFieldIndex(e,t){let i=e.getAttribute("data-string-form-index");if(i!==null){let r=Number(i);return Number.isNaN(r)?t:r}return this.registerFieldIndex(e,t)}shouldValidateField(e){return!(e.disabled||e instanceof HTMLInputElement&&e.type==="hidden")}supportsBeforeInputValidation(e){return e.some(t=>Ae.beforeInputRuleKeys.has(t.key))}requiresContext(e){return e.some(t=>Ae.crossFieldRuleKeys.has(t.key))}buildContext(e,t,i,r){if(!e)return{fieldKey:t};let s=!!r?.applied,n=s?{...i,[t]:r.value}:i;return{fieldKey:t,values:n,getValue:o=>s&&o===t?r.value:n[o]}}getInputKey(e,t){return this.tools.domAttribute.process({element:e,key:"id"})||e.getAttribute("name")||e.getAttribute("id")||`input-${t}`}getFieldValue(e){if(e instanceof HTMLInputElement){if(e.type==="checkbox"){if(e.name){let t=e.form||e.closest("form"),i=t?Array.from(t.querySelectorAll(`input[type="checkbox"][name="${e.name}"]:checked`)):[e];return i.length>1?i.map(r=>r.value):i.length===1?i[0].value:""}return e.checked}if(e.type==="radio"){if(e.name){let t=(e.form||e.closest("form"))?.querySelector(`input[type="radio"][name="${e.name}"]:checked`);return t?t.value:""}return e.checked?e.value:""}return e.type==="file"&&e.files&&e.files.length>0?e.multiple?Array.from(e.files):e.files[0]:e.value}return e instanceof HTMLSelectElement?e.multiple?Array.from(e.selectedOptions).map(t=>t.value):e.value:e instanceof HTMLTextAreaElement?e.value:""}isServiceFieldAttribute(e){return Ae.serviceAttributePrefixes.some(t=>e.startsWith(`${t}[`))}isFormFieldElement(e){return e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement}getInputEventType(e){return e instanceof HTMLSelectElement||e instanceof HTMLInputElement&&(e.type==="checkbox"||e.type==="radio")?"change":"input"}};Ze.beforeInputRuleKeys=new Set(["number","integer","email","phone","letters","lettersSpaces","lettersNumbers","alpha","alpha_num","alpha_dash","digits","url","pattern"]),Ze.crossFieldRuleKeys=new Set(["same","different","after","before"]),Ze.serviceAttributePrefixes=["error","group"];var we=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),n=e/this._width,o=t/this._height,a=(n-.5)*r,l=-(o-.5)*s;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),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 Pt={renderTargets:!1,shaderMaterials:!1,postProcess:!1,customMaterialFactory:!1,particles:!1,text:!1,geometrySimplify:!1};function It(p){let e=p.getCapabilities?.();return e?{...Pt,...e}:{renderTargets:typeof p.createRenderTarget=="function",shaderMaterials:typeof p.createShaderMaterial=="function",postProcess:typeof p.createRenderTarget=="function"&&typeof p.createShaderMaterial=="function",customMaterialFactory:typeof p.getMaterialFactory=="function",particles:typeof p.createParticleSystem=="function",text:typeof p.createTextGeometry=="function"||typeof p.loadFont=="function",geometrySimplify:typeof p.simplifyGeometry=="function"}}function ut(p,e){let t=p.getPostProcessRuntime?.();if(t&&t.isSupported(e))return t;let i=It(p);return!i.postProcess||!i.renderTargets||!i.shaderMaterials||typeof p.createRenderTarget!="function"||typeof p.createShaderMaterial!="function"||typeof e.setRenderTarget!="function"?null:{isSupported:()=>!0,createRenderTarget:(r,s,n)=>p.createRenderTarget(r,s,n),createShaderMaterial:r=>p.createShaderMaterial(r),setRenderTarget:(r,s)=>{r.setRenderTarget?.(s)},clear:(r,s=!0,n=!0,o=!0)=>{r.clear?.(s,n,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,s){let n=e.getCustomFilterRegistry?.()||ce;this.pipeline=i.createPipeline?.({engine:e,renderer:t,width:r,height:s,customFilterRegistry:n})||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 Ee=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.engine.getRecommendedPixelRatio?.(),n=typeof s=="number"&&Number.isFinite(s)?Math.max(.1,s):1;this._renderer.setPixelRatio(n),this._renderer.setSize(i,r),this.engine.configureRenderer?.(this._renderer,{width:i,height:r,pixelRatio:n,container:this._container}),this.postProcessRuntime=ut(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 s=e.getAllObjects(),n=new Map;s.forEach(d=>{let m=d.object;"visible"in m&&n.set(d.object,m.visible)});let o=new Set;i.forEach(d=>{this.collectSubtreeObjects(d.object,o)}),s.forEach(d=>{o.has(d.object)&&this.setVisible(d.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,s.forEach(d=>{let m=n.get(d.object);typeof m<"u"&&this.setVisible(d.object,m)});let h=s.filter(d=>d.type.endsWith("Light")),c=this.engine.supportsObjectLayerIsolation?.(t.camera,s.map(d=>d.object))===!0&&typeof this.engine.beginObjectLayerIsolation=="function"&&typeof this.engine.endObjectLayerIsolation=="function",u=!1;i.forEach(d=>{let m=this.filterCache.get(d.object.id);if(!d.dirty&&m&&m.effectsKey===d.effectsKey&&m.qualityScale===this.qualityScale){m.lastUsedFrame=this.frameId,r.renderToScreen(m.target);return}let f=this.injectEffectContext(d.object.el,d.effects),S=new Set;this.collectSubtreeObjects(d.object,S);let y=null;if(c){let T=d.object.getSubtreeObjects();y=this.engine.beginObjectLayerIsolation?.(t.camera,T,h.map(R=>R.object),this.filterLayer)||null}y||(u=!0,s.forEach(T=>{if(n.get(T.object)===!1){this.setVisible(T.object,!1);return}if(T.type.endsWith("Light")){this.setVisible(T.object,!0);return}this.setVisible(T.object,S.has(T.object))}));let b=r.acquireTarget();this.postProcessRuntime?.setRenderTarget(this._renderer,b),this.postProcessRuntime?.clear(this._renderer,!0,!0,!0),this._renderer.render(e.getScene(),t.camera);let v=r.applyFilters(b,f,this.qualityScale);this.postProcessRuntime?.setRenderTarget(this._renderer,null),r.renderToScreen(v),y&&this.engine.endObjectLayerIsolation?.(t.camera,y),v!==b&&r.releaseTarget(b);let w={target:v,effectsKey:d.effectsKey,lastUsedFrame:this.frameId,qualityScale:this.qualityScale},P=this.filterCache.get(d.object.id);P&&P.target!==v&&r.releaseTarget(P.target),this.filterCache.set(d.object.id,w)}),u&&s.forEach(d=>{let m=n.get(d.object);typeof m<"u"&&this.setVisible(d.object,m)}),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,s=1-(i.top+i.height/2)/this._height,n=o=>Math.max(0,Math.min(1,o));return[n(r),n(s)]}injectEffectContext(e,t){if(!t.some(n=>n.type==="custom"))return t;let i=this.getFilterCenter(e),r=!1,s=t.map(n=>{if(n.type!=="custom"||n.uniforms&&"uCenter"in n.uniforms)return n;let o={...n.uniforms||{},uCenter:i};return r=!0,{...n,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,n=Math.max(.75,1-Math.min(.4,e*.03)),o=n;s<48&&(o=Math.max(.75,n-.1)),s<40&&(o=Math.max(.75,n-.2)),s>58&&(o=Math.min(1,n+.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,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(n=>n?.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,n=typeof s=="number"?s:Number.parseFloat(s);if(!Number.isNaN(n))return n}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 ue(p,e,t){let r=p.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 n=getComputedStyle(p).getPropertyValue(e),o=Number.parseFloat(n);return Number.isNaN(o)?t:o}function Qe(p){return p.startsWith("'")&&p.endsWith("'")||p.startsWith('"')&&p.endsWith('"')?p.slice(1,-1):p}function De(p,e,t=""){let r=p.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(p).getPropertyValue(e);return(s?Qe(s.trim()):"")||t}function ze(p,e,t=!1){let i=De(p,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 dt(p){let e=p.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(p).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 s=r.css?.trim();if(!s||!s.startsWith("--")||this.registeredCssVars.has(s))continue;let n=this.resolveCssSyntax(r.type);try{t.registerProperty({name:s,syntax:n,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())}};re.materials=new Map,re.registeredCssVars=new Set;function pt(p,e){if(e==null||e===""||e==="none")return p.value;let t=e.trim();switch(p.type){case"float":case"int":{let i=parseFloat(t);return isNaN(i)?p.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]]:p.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]]:p.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]]:p.value}case"color":return Tt(t)??p.value;case"texture":{let i=t.match(/url\(['"]?(.*?)['"]?\)/);return i?i[1]:t||p.value}default:return p.value}}function Tt(p){if(p.startsWith("#")){let t=p.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=p.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 Je(p,e,t){let i={};if(p.parse){let r=p.parse(e,t);Object.assign(i,r)}if(p.uniforms)for(let[r,s]of Object.entries(p.uniforms))if(s.css){let n=t.getPropertyValue(s.css).trim();i[r]=pt(s,n)}else r in i||(i[r]=s.value);return i}function et(p){let e=new Map;for(let i of p){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((n,o)=>(n.order??0)-(o.order??0));t.set(i,s.map(n=>n.code).join(`
2
- `))}return t}var Ce=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=s=>{if(s){let n=e.getProperty("parentId");n==null?(this._scene.add(s.object),this._rootObjects.push(s)):this._objects.get(n)?.addChild(s),this._objects.set(e.id,s),this._elementMap.set(e.id,i),s.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,s=r?De(r,"--light-color","#ffffff"):"#ffffff",n=s&&s!=="none"?s:"#ffffff",o=r?ue(r,"--light-intensity",1):1,a;if(t==="point"){let c=r?ue(r,"--light-distance",1e3):1e3,u=r?ue(r,"--light-decay",0):0;a=this.engine.createPointLight(n,o,c,u)}else if(t==="directional")a=this.engine.createDirectionalLight(n,o);else if(t==="spot"){let c=r?ue(r,"--light-distance",0):0,u=r?ue(r,"--light-angle",Math.PI/3):Math.PI/3,d=r?ue(r,"--light-penumbra",0):0,m=r?ue(r,"--light-decay",1):1;a=this.engine.createSpotLight(n,o,c,u,d,m)}else if(t==="hemisphere"){let c=r?De(r,"--light-ground-color","#ffffff"):"#ffffff",u=c&&c!=="none"?c:"#ffffff";a=this.engine.createHemisphereLight(n,u,o)}else a=this.engine.createAmbientLight(n,o);if((r?ze(r,"--shadow-cast",!1):!1)&&a.shadow){a.castShadow=!0;let c=r?ue(r,"--shadow-bias",0):0,u=r?ue(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,s=i?ze(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 n=new Q(e.id,"box",s,this.engine,{geometry:i,material:r});return t(n),n}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)),n=this.engine.createSphereGeometry(.5,r,s),o=this.createMaterialFromObject(e),a=this.engine.createMesh(n,o);this.applyShadowProps(e,a);let l=new Q(e.id,"sphere",a,this.engine,{geometry:n,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 n=new Q(e.id,"plane",s,this.engine,{geometry:i,material:r});return t(n),n}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),n=this.createMaterialFromObject(e),o=this.engine.createMesh(s,n);this.applyShadowProps(e,o);let a=new Q(e.id,"cylinder",o,this.engine,{geometry:s,material:n});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,s=this.resolveModelLoader(r);if(!s)return;let n=e.htmlElement;if(n){let a=this.parseModelLoaderOptions(n);a&&this.engine.configureModelLoader?.(s,a)}let o=e.getProperty("3d-model-center")??!1;s.load(i,a=>{let l=this.engine.resolveLoadedModelRoot?.(a)||(a&&typeof a=="object"?a:null);if(!l)return;let h=n&&this.shouldOverrideModelMaterial(n)?this.createMaterialFromElement(n,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},s=this.engine.createParticleSystem(r),n=new Q(e.id,"particles",s,this.engine);t(n)}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 n=this.engine.createGroup();n.add(s);let o=new Q(e.id,"text",n,this.engine,{geometry:i,material:r});t(o)}getGeometryQuality(e){if(!e)return 1;let t=ue(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=x=>i?i.getPropertyValue(x).trim():"",s=(x,D,O)=>{let N=r(x);return N&&N!=="none"&&N!==""?D(N):O},n=x=>parseFloat(x),o=x=>x,a=x=>{let D=x.match(/url\(['"]?(.*?)['"]?\)/);return D?D[1]:x},l=s("--material-type",x=>x.split("[")[0]||"basic","basic"),h=this.tryCreateCustomMaterial(l,e,i,t);if(h)return h;let c=s("--material-color",o,"#ffffff"),u=s("--opacity",n,1),d=s("--material-metalness",n,0),m=s("--material-roughness",n,1),g=s("--material-emissive",o,"#000000"),f={color:c,transparent:u<1,opacity:u},S=s("--texture-map",a,""),y=s("--texture-normal",a,""),b=s("--texture-roughness",a,""),v=s("--texture-metalness",a,""),w=s("--texture-ao",a,""),P=this.parseFlipY(e),T=e?De(e,"--texture-color-space",""):"",R=!!(S||y||b||v||w),E=l;return E!=="standard"&&R&&(E="standard"),E==="standard"?(S&&(f.map=this.loadTexture(S,{flipY:P,colorSpace:T||"srgb"})),y&&(f.normalMap=this.loadTexture(y,{flipY:P})),b&&(f.roughnessMap=this.loadTexture(b,{flipY:P})),v&&(f.metalnessMap=this.loadTexture(v,{flipY:P})),w&&(f.aoMap=this.loadTexture(w,{flipY:P})),f.metalness=d,f.roughness=m,f.emissive=g,this.engine.createMeshStandardMaterial(f)):this.engine.createMeshBasicMaterial(f)}tryCreateCustomMaterial(e,t,i,r){let s=this.customMaterialRegistry.get(e);if(!s)return null;let n=this.engine.getMaterialFactory?.();if(!n||!n.supports(s))return null;let o={};t&&i&&(o=n.parseUniformsFromCSS(s,t,i));let a=n.create(s,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[n,o]of this._elementMap)if(n===e.id&&o===t){r=o.__stringObject||o.stringObject;break}let s=this.createMaterialFromElement(t,r);this.engine.forEachMesh(e.object,n=>{let o=n.material;Array.isArray(o)?o.forEach(a=>a?.dispose?.()):o?.dispose?.(),n.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?De(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 n=t.getPropertyValue(s);return n&&n!=="0"&&n!=="none"&&n!==""};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))}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 s=JSON.parse(i);s&&typeof s=="object"&&(r.textureMap=s)}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 n=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&&n-l.time<o)return h}let a=i(e);return this.cache.set(e,a),this.meta.set(e,{time:n}),a}clear(){this.cache=new WeakMap,this.meta=new WeakMap}invalidate(e){this.cache.delete(e),this.meta.delete(e)}};var tt=Math.PI/180,Ve=class Ve{sync(e,t,i,r){let s=e.__layoutCache,n=s?s.rect:e.getBoundingClientRect(),o=this.readStyleBundle(e,i),a=n.left+n.width*.5,l=n.top+n.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*tt,t.object.rotation.y=o.rotateY*tt,t.object.rotation.z=-o.rotateZ*tt,t.object.rotation.order="XYZ",t.object.updateMatrixWorld(!0),{scale:o.scale}}readStyleBundle(e,t){return Ve.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)}})}};Ve.styleCache=new J;var Ne=Ve;var He=class He{sync(e,t,i,r){let s=e.__layoutCache,n=s?s.rect:e.getBoundingClientRect(),o=this.readStyleBundle(e,i,t),a=this.resolveScreenAnchor(n,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),d=a.x/i.viewportWidth,m=a.y/i.viewportHeight;this.setObjectPosition(i,t.object,(d-.5)*u.width+l,-(m-.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 d=u.__layoutCache,m=d?d.rect:u.getBoundingClientRect(),g=new Se(u),f=g.readNumber("--translate-x",0),S=g.readNumber("--translate-y",0),y=g.readNumber("--translate-z",0),b=this.resolveScreenAnchor(m,i),v=b.fallbackToViewportCenter?f:0,w=b.fallbackToViewportCenter?S:0,P,T,R;if(i.camera.getMode()==="orthographic")P=b.x-i.viewportWidth/2+v,T=-(b.y-i.viewportHeight/2)+w,R=y;else{let E=i.camera.getFrustumSizeAt(y),x=b.x/i.viewportWidth,D=b.y/i.viewportHeight;P=(x-.5)*E.width+v,T=-(D-.5)*E.height+w,R=y}o.targetOffset&&(P+=o.targetOffset.x,T+=o.targetOffset.y,R+=o.targetOffset.z),this.setObjectPosition(i,c.target,P,T,R),c.target.updateMatrixWorld(!0)}}return null}readStyleBundle(e,t,i){return He.styleCache.get(e,t,r=>{let s=new Se(r),n=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",n.intensity??1),castShadow:s.readBoolean("--shadow-cast",!1)};typeof n.distance<"u"&&(o.distance=s.readNumber("--light-distance",n.distance??0)),typeof n.decay<"u"&&(o.decay=s.readNumber("--light-decay",n.decay??1)),typeof n.angle<"u"&&(o.angle=s.readNumber("--light-angle",n.angle??Math.PI/3)),typeof n.penumbra<"u"&&(o.penumbra=s.readNumber("--light-penumbra",n.penumbra??0));let a=s.readString("--light-ground-color","");a&&(o.groundColor=a),o.castShadow&&n.shadow&&(o.shadowBias=s.readNumber("--shadow-bias",n.shadow.bias??0),o.shadowMapSize=s.readNumber("--shadow-map-size",n.shadow.mapSize.width??512));let l=s.readString("--light-target","").trim();l&&(o.targetId=l);let h=s.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,s){if(!e.engine.setObjectPosition?.(t,i,r,s)){if(t?.position?.set&&typeof t.position.set=="function"){t.position.set(i,r,s);return}if(typeof t?.setPosition=="function"){t.setPosition(i,r,s);return}t?.position&&(t.position.x=i,t.position.y=r,t.position.z=s)}}};He.styleCache=new J;var xe=He;var it=Math.PI/180;function gt(p){let e=(p||"").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,s=Number.parseInt(i.slice(3,5),16)/255,n=Number.parseInt(i.slice(5,7),16)/255;return{r,g:s,b:n}}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 Ft(p){let e=(p||"").trim().toLowerCase();if(!e)return!1;if(e==="black"||e==="#000"||e==="#000000")return!0;let t=gt(e);return t?t.r===0&&t.g===0&&t.b===0:!1}function mt(p,e){if(!p)return!1;if(typeof p.set=="function")try{return p.set(e),!0}catch{}let t=gt(e);return t?typeof p.setRGB=="function"?(p.setRGB(t.r,t.g,t.b),!0):"r"in p&&"g"in p&&"b"in p?(p.r=t.r,p.g=t.g,p.b=t.b,!0):!1:!1}var z=class z{static resolveEmissiveValue(e,t){return!t||t==="none"?void 0:e.style.getPropertyValue("--material-emissive").trim()?t:Ft(t)?void 0:t}static applyVisualProps(e,t,i,r){let s=z.lastVisualProps.get(t);if(s){if(s.opacity===r.opacity&&s.color===r.color&&s.metalness===r.metalness&&s.roughness===r.roughness&&s.emissive===r.emissive&&s.castShadow===r.castShadow&&s.receiveShadow===r.receiveShadow)return;s.opacity=r.opacity,s.color=r.color,s.metalness=r.metalness,s.roughness=r.roughness,s.emissive=r.emissive,s.castShadow=r.castShadow,s.receiveShadow=r.receiveShadow}else z.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 n=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&&mt(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&&mt(c.emissive,r.emissive)))};i.forEachMesh(t.object,c=>{c.castShadow!==n&&(c.castShadow=n),c.receiveShadow!==o&&(c.receiveShadow=o),(Array.isArray(c.material)?c.material:[c.material]).forEach(h)})}sync(e,t,i,r){let{rect:s,width:n,height:o}=this.readLayout(e,i),a=this.readStyleBundle(e,i),{translateZ:l,cssScale:h,rotateX:c,rotateY:u,rotateZ:d,cssScaleZ:m,opacity:g,color:f,metalness:S,roughness:y,emissive:b,castShadow:v,receiveShadow:w,geometryQuality:P}=a,T=s.left+s.width*.5,R=s.top+s.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set(T-i.viewportWidth/2,-(R-i.viewportHeight/2),l);else{let $=i.camera.getFrustumSizeAt(l),B=T/i.viewportWidth,C=R/i.viewportHeight;t.object.position.set((B-.5)*$.width,-(C-.5)*$.height,l)}t.object.rotation.x=-c*it,t.object.rotation.y=u*it,t.object.rotation.z=-d*it,t.object.rotation.order="XYZ";let E=n*h,x=o*h,D=r?.scale||1,O=m*D,N=E<x?E:x,H,_,G;switch(t.type){case"box":case"sphere":{let $=N*D;H=_=$,G=$*m;break}case"model":{let $=t.getOriginalBoundingBox();z.tempVector3||(z.tempVector3=i.engine.createVector3());let B=$.getSize(z.tempVector3),C=e.getAttribute("string-3d-model-fit"),M=parseFloat(e.getAttribute("string-3d-model-scale")||"1"),A=Number.isFinite(M)?M*D:D;if(B.x>0&&B.y>0){let k=E/B.x,I=x/B.y,j=(C==="cover"?k>I?k:I:k<I?k:I)*A;H=_=j,G=j*m}else{let k=N*A;H=_=k,G=k*m}break}case"cylinder":H=E*D,_=x*D,G=E*O;break;default:H=E*D,_=x*D,G=N*.5*O;break}return t.object.scale.set(H,_,G),z.applyVisualProps(e,t,i.engine,{opacity:g,color:f&&f!=="none"?f:void 0,metalness:isNaN(S)?void 0:S,roughness:isNaN(y)?void 0:y,emissive:z.resolveEmissiveValue(e,b),castShadow:v,receiveShadow:w}),this.applyGeometryQuality(t,P,i),this.updateCustomUniforms(e,t,i),{scale:h*D}}applyGeometryQuality(e,t,i){let r=i.engine.simplifyGeometry?.bind(i.engine);if(typeof r!="function")return;let s=Number.isFinite(t)&&t>0?t:1,n=z.lastGeometryQuality.get(e);if(typeof n=="number"&&Math.abs(n-s)<.001)return;z.lastGeometryQuality.set(e,s);let o=a=>{if(!a?.geometry)return;z.originalGeometryByMesh.has(a)||z.originalGeometryByMesh.set(a,a.geometry);let l=z.originalGeometryByMesh.get(a);if(s>=.999){a.geometry=l;return}z.lodGeometryCacheByMesh.has(a)||z.lodGeometryCacheByMesh.set(a,new Map);let h=z.lodGeometryCacheByMesh.get(a),c=s.toFixed(3);if(h.has(c)){a.geometry=h.get(c);return}let u=r(l,s);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 s=getComputedStyle(e),n=o=>{let a=r.getMaterialDefinition?.(o)??o?.userData?.definition;if(!a?.uniforms)return;let l=r.parseUniformsFromCSS(a,e,s);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 d=r.convertUniformValue?.bind(r),m=d?d(u.type,c):c;o.uniforms?.[h]&&(o.uniforms[h].value=m)}};i.engine.forEachMaterial(t.object,n)}readStyleBundle(e,t){return z.styleCache.get(e,t,i=>{let r=i.computedStyleMap?.(),s=getComputedStyle(i),n=(l,h)=>{let c=r?.get?.(l);if(c!=null){let d=typeof c=="object"&&"value"in c?c.value:c,m=typeof d=="number"?d:Number.parseFloat(String(d));if(!Number.isNaN(m))return m}let u=Number.parseFloat(s.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:s.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:n("--translate-z",0),cssScale:n("--scale",1),rotateX:n("--rotate-x",0),rotateY:n("--rotate-y",0),rotateZ:n("--rotate-z",0),cssScaleZ:n("--scale-z",1),opacity:n("--opacity",NaN),color:o("--material-color"),metalness:n("--material-metalness",NaN),roughness:n("--material-roughness",NaN),emissive:o("--material-emissive"),castShadow:a("--shadow-cast",!1),receiveShadow:a("--shadow-receive",!1),geometryQuality:n("--geometry-quality",1)}})}readLayout(e,t){let i=e.__layoutCache;return i||z.layoutCache.get(e,t,r=>{let s=r.getBoundingClientRect(),n=r.offsetWidth||s.width,o=r.offsetHeight||s.height;return{rect:s,width:n,height:o}})}};z.styleCache=new J,z.layoutCache=new J,z.tempVector3=null,z.lastVisualProps=new WeakMap,z.lastGeometryQuality=new WeakMap,z.originalGeometryByMesh=new WeakMap,z.lodGeometryCacheByMesh=new WeakMap;var de=z;var rt=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},W=class W{sync(e,t,i,r){let s=e.__layoutCache,n=s?s.rect:e.getBoundingClientRect(),o=this.readStyleBundle(e,i),a=n.left+n.width*.5,l=n.top+n.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set(a-i.viewportWidth/2,-(l-i.viewportHeight/2),o.translateZ);else{let y=i.camera.getFrustumSizeAt(o.translateZ),b=a/i.viewportWidth,v=l/i.viewportHeight;t.object.position.set((b-.5)*y.width,-(v-.5)*y.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*rt,t.object.rotation.y=o.rotateY*rt,t.object.rotation.z=-o.rotateZ*rt,t.object.rotation.order="XYZ";let u=this.buildConfig(o,n,i,r),d=W.lastConfig.get(t),m=t.object;(!d||!this.isSameConfig(d,u))&&(W.lastConfig.set(t,u),m.setConfig?.(u)),this.updateMaterialOverrides(e,t,i,o),this.updateCustomUniforms(e,t,i);let g=performance.now(),f=W.lastTime.get(t)??g,S=Math.max(0,(g-f)/1e3);return W.lastTime.set(t,g),m.update?.(S),{scale:r?.scale??1}}readStyleBundle(e,t){return W.styleCache.get(e,t,i=>{let r=new Se(i),n=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:n,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),n=this.findTransitionIndex(r,t);if(n===-1){let o=this.parseTransitionShorthand(i.transition),a=o.get(t)||o.get("all");return a?a.duration:0}return this.parseTime(s[n]||s[s.length-1]||"0s")}splitTransitionList(e){let t=[],i="",r=0;for(let s=0;s<e.length;s+=1){let n=e[s];n==="("&&(r+=1),n===")"&&(r=Math.max(0,r-1)),n===","&&r===0?(t.push(i.trim()),i=""):i+=n}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),n="",o="";s.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"||n||(n=a)}),n&&t.set(n.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 n=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*n),spreadX:Math.max(0,l*n),spreadY:Math.max(0,h*n),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 s=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(!(W.materialInstances.has(t)||W.lastMaterialType.has(t)))return;let d=W.materialInstances.get(t);d&&(d.dispose(),W.materialInstances.delete(t)),W.lastMaterialType.delete(t),s.setMaterial?.(null,{points:!0,meshes:!0});return}if(W.lastMaterialType.get(t)!==o){let u=W.materialInstances.get(t);u&&u.dispose();let d=getComputedStyle(e),m=h.parseUniformsFromCSS(l,e,d),g=h.create(l,m);W.materialInstances.set(t,g),W.lastMaterialType.set(t,o);let f=g.material,S=h.isShaderMaterial?.(f)??!!f?.isShaderMaterial;s.setMaterial?.(f,{meshes:!0,points:!1}),s.setMaterial?.(S?f:null,{meshes:!1,points:!0})}}updateCustomUniforms(e,t,i){let r=i.engine.getMaterialFactory?.();if(!r)return;let s=getComputedStyle(e),n=o=>{let a=r.getMaterialDefinition?.(o)??o?.userData?.definition;if(!a?.uniforms)return;let l=r.parseUniformsFromCSS(a,e,s);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 d=r.convertUniformValue?.bind(r),m=d?d(u.type,c):c;o.uniforms?.[h]&&(o.uniforms[h].value=m)}};i.engine.forEachMaterial(t.object,n)}};W.styleCache=new J,W.lastConfig=new WeakMap,W.lastTime=new WeakMap,W.lastMaterialType=new WeakMap,W.materialInstances=new WeakMap;var Be=W;var se=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}};se.fonts=new Map,se.defaultFont=null;var st=null,Pe=null,nt=null,Ie=null;async function Lt(){return Pe||(st||(st=(async()=>typeof window<"u"&&window.opentype?(Pe=window.opentype,Pe):new Promise((p,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=()=>{Pe=window.opentype,p(Pe)},t.onerror=()=>e(new Error("[FontConverter] Failed to load opentype.js")),document.head.appendChild(t)}))()),st)}async function Rt(){return Ie||(nt||(nt=(async()=>typeof window<"u"&&window.Module?.decompress?(Ie=window.Module,Ie):new Promise((p,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 n=window;n.Module?.decompress?(Ie=n.Module,p(Ie)):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)}))()),nt)}async function Ot(p){let e=await Rt(),t=new Uint8Array(p),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 At(p){return new DataView(p).getUint32(0,!1)===2001684018}var ge=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 n=await s;return this.cache.set(t,n),n}finally{this.loadingPromises.delete(t)}}static async doLoad(e,t){let i=await Lt(),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");At(r)&&(r=await Ot(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,n]of Object.entries(r)){let o=Number(s);if(!Number.isFinite(o))continue;let a=e.glyphs.get(n);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 s=0;s<e.glyphs.length;s++){let n=e.glyphs.get(s),o=Array.isArray(n.unicodes)?n.unicodes:n.unicode?[n.unicode]:[];if(o.length===0)continue;let a=n.getPath(0,0,e.unitsPerEm),l=this.pathToOutline(a,t),h=n.advanceWidth??n.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:n.xMin!==void 0?Math.round(n.xMin*t):0,x_max:n.xMax!==void 0?Math.round(n.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()}};ge.cache=new Map,ge.loadingPromises=new Map;var at=Math.PI/180,kt=`
1
+ "use strict";var StringTune3D=(()=>{var it=Object.defineProperty;var Tt=Object.getOwnPropertyDescriptor;var It=Object.getOwnPropertyNames;var Ft=Object.prototype.hasOwnProperty;var Lt=(c,e)=>{for(var t in e)it(c,t,{get:e[t],enumerable:!0})},Ot=(c,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of It(e))!Ft.call(c,r)&&r!==t&&it(c,r,{get:()=>e[r],enumerable:!(i=Tt(e,r))||i.enumerable});return c};var Rt=c=>Ot(it({},"__esModule",{value:!0}),c);var ai={};Lt(ai,{FontConverter:()=>Se,SVGParser:()=>Ee,SVGSynchronizer:()=>Oe,String3D:()=>Ze,String3DCamera:()=>Ce,String3DCustomFilterRegistry:()=>ye,String3DCustomMaterialRegistry:()=>pe,String3DFontRegistry:()=>me,String3DObject:()=>oe,String3DRenderer:()=>Pe,String3DScene:()=>Ie,String3DSynchronizer:()=>Re,ThreeJSEngine:()=>Ve,ThreeJSMaterialFactory:()=>Ae,ThreeJSProvider:()=>Je});var At=class{constructor(){this.desktop={rebuild:{width:!0,height:!0,scrollHeight:!0}},this.mobile={rebuild:{width:!0,height:!0,scrollHeight:!0}}}},He=class{constructor(c){this.objectMapOnPage=new Map,this.objectsOnPage=[],this.objectMap=new Map,this.objects=[],this.htmlKey="",this._type=1,this.permissions=new At,this.tools=c.tools,this.data=c.data,this.settings=c.settings,this.events=c.events,this.centers=c.centers,this.hover=c.hover,this.objectManager=c.objectManager,this.attributesToMap=[{key:"active",type:"boolean",fallback:this.settings.active},{key:"fixed",type:"boolean",fallback:this.settings.fixed},{key:"outside-container",type:"boolean",fallback:this.settings["outside-container"]},{key:"repeat",type:"boolean",fallback:this.settings.repeat},{key:"self-disable",type:"boolean",fallback:this.settings["self-disable"]},{key:"abs",type:"boolean",fallback:this.settings.abs},{key:"key",type:"string",fallback:this.settings.key},{key:"offset-top",type:"dimension",fallback:this.settings["offset-top"]},{key:"offset-bottom",type:"dimension",fallback:this.settings["offset-bottom"]},{key:"inview-top",type:"dimension",fallback:this.settings["inview-top"]},{key:"inview-bottom",type:"dimension",fallback:this.settings["inview-bottom"]},{key:"start",type:"number",fallback:(e,t,i)=>{let r=i.top;return Math.floor(r)+this.data.scroll.container.scrollTop*this.data.viewport.transformScale}},{key:"end",type:"number",fallback:(e,t,i)=>{let r=i.top,s=i.height;return r+s-this.data.scroll.transformedCurrent}},{key:"size",type:"number",fallback:(e,t,i)=>i.height},{key:"half-width",type:"number",fallback:(e,t,i)=>i.width/2},{key:"half-height",type:"number",fallback:(e,t,i)=>i.height/2},{key:"enter-el",type:"string",fallback:this.settings["enter-el"]},{key:"enter-vp",type:"string",fallback:this.settings["enter-vp"]},{key:"exit-el",type:"string",fallback:this.settings["exit-el"]},{key:"exit-vp",type:"string",fallback:this.settings["exit-vp"]}]}get type(){return this._type}initializeObject(c,e,t,i){let r=this.tools.boundingClientRect.process({element:t});for(let{key:s,type:n,fallback:o,transform:a}of this.attributesToMap){let l=typeof o=="function"?o(t,e,r):o,d=this.tools.domAttribute.process({element:t,key:s,fallback:i[s]??this.settings[s]??l}),h=this.parseAttribute(d,n,{element:t,boundingRect:r,viewportHeight:this.data.viewport.windowHeight,baseRem:this.data.viewport.baseRem});a&&(h=a(h)),e.setProperty(s,h)}}calculatePositions(c,e){let t=c.getProperty("start"),i=c.getProperty("size"),r=c.getProperty("offset-bottom"),s=c.getProperty("offset-top"),n=c.getProperty("enter-el"),o=c.getProperty("enter-vp"),a=c.getProperty("exit-el"),l=c.getProperty("exit-vp"),d=0,h=0,u=0,p=0;n==="top"&&o==="top"||n==="left"&&o==="left"?(u=-e+1,d=t-r):n==="top"&&o==="bottom"||n==="left"&&o==="right"?d=t-e-r:n==="bottom"&&o==="top"||n==="right"&&o==="left"?(u=-e-i+1,d=t+i-r):(n==="bottom"&&o==="bottom"||n==="right"&&o==="right")&&(u=-i+1,d=t-e+i-r),a==="top"&&l==="top"||a==="left"&&l==="left"?(p=-i+1,h=t+s):a==="top"&&l==="bottom"||a==="left"&&l==="right"?(p=-e-i+1,h=t-e+s):a==="bottom"&&l==="top"||a==="right"&&l==="left"?h=t+i+s:(a==="bottom"&&l==="bottom"||a==="right"&&l==="right")&&(p=-e+1,h=t-e+i+s),c.setProperty("start-bias",u),c.setProperty("end-bias",p),c.setProperty("start-position",d-this.data.scroll.topPosition),c.setProperty("end-position",h-this.data.scroll.topPosition),c.setProperty("difference-position",h-d);let m=c.getProperty("inview-top")??0,f=c.getProperty("inview-bottom")??0;c.setProperty("inview-start-position",c.getProperty("start-position")+m),c.setProperty("inview-end-position",c.getProperty("end-position")+f)}parseAttribute(c,e,t={}){if(c==null)return null;if(typeof e=="object"&&e.type==="enum")return e.values.includes(c)?c:e.values[0];switch(e){case"number":return parseFloat(c);case"boolean":return c===""||c==="true";case"json":try{return JSON.parse(c)}catch{return null}case"tuple":return c.trim().split(/\s+/);case"easing":return this.tools.easingFunction.process({easing:c});case"color":return this.tools.colorParser.process({value:c});case"dimension":return c=="0"?0:t.element!=null&&t.viewportHeight!=null&&t.baseRem!=null&&t.boundingRect!=null?this.tools.unitParser.process({value:c,element:t.element,viewportHeight:t.viewportHeight,boundingRect:t.boundingRect,baseRem:t.baseRem}):0;case"breakpoint-dimension":if(t.element!=null&&t.viewportHeight!=null&&t.baseRem!=null&&t.boundingRect!=null){let i=c.trim().split("|"),r=[];for(let s of i)if(s.includes(":")){let[n,o]=s.split(":");r.push({breakpoint:parseInt(n),value:this.tools.unitParser.process({value:`${o}|`,element:t.element,viewportHeight:t.viewportHeight,boundingRect:t.boundingRect,baseRem:t.baseRem})})}else r.push({breakpoint:0,value:this.tools.unitParser.process({value:s,element:t.element,viewportHeight:t.viewportHeight,boundingRect:t.boundingRect,baseRem:t.baseRem})});return r}default:return c}}canConnect(c){return c.keys.includes(this.htmlKey)}connectObject(c){c.connect(this),this.onObjectConnected(c)}enterObject(c,e){this.objectMap.has(c)||(this.objectMap.set(c,e),this.objects.push(e))}exitObject(c){let e=this.objectMap.get(c);if(!e)return;this.objectMap.delete(c);let t=this.objects.indexOf(e);t!==-1&&this.objects.splice(t,1)}addObject(c,e){this.objectMapOnPage.has(c)||(this.objectMapOnPage.set(c,e),this.objectsOnPage.push(e))}removeObject(c){let e=this.objectMapOnPage.get(c);if(!e)return;this.objectMapOnPage.delete(c);let t=this.objectsOnPage.indexOf(e);t!==-1&&this.objectsOnPage.splice(t,1),this.onObjectDisconnected(e)}onObjectConnected(c){}onObjectDisconnected(c){}applyToElementAndConnects(c,e,t=e){c.getProperty("self-disable")!==!0&&e(c.htmlElement),c.mirrorObjects.forEach(i=>t(i.htmlElement,i))}destroy(){this.objects=[],this.objectMap=new Map}onInit(){}onSubscribe(){}onUnsubscribe(){}onFrame(c){}onMutate(c){}onScrollMeasure(c){}onMouseMoveMeasure(c){}onResize(){}onResizeWidth(){}onScroll(c){}onDirectionChange(){}onScrollStart(){}onScrollStop(){}onScrollDirectionChange(){}onAxisChange(){}onDeviceChange(){}onScrollConfigChange(){}onSettingsChange(){}onDOMRebuild(){}onMouseMove(c){}onWheel(c){}onDOMMutate(c,e){}};var kt=class{constructor(){this.pendingVars=new Map,this.pendingProps=new Map,this.isOpen=!1}begin(){this.isOpen||(this.isOpen=!0)}setVars(c,e){if(!this.isOpen){console.warn("StyleTxn: call begin() first to set custom properties.");return}let t=this.pendingVars.get(c)??{};for(let[i,r]of Object.entries(e))t[i]!==r&&(t[i]=r);this.pendingVars.set(c,t)}setProps(c,e){if(!this.isOpen){console.warn("StyleTxn: call begin() first to set standard properties.");return}let t=this.pendingProps.get(c)??{};for(let[i,r]of Object.entries(e))t[i]!==r&&(t[i]=r);this.pendingProps.set(c,t)}run(c){let e=this.isOpen;e||this.begin();try{c(),e||this.commit()}catch(t){throw e||this.cancel(),t}}commit(){if(this.isOpen){this.isOpen=!1;for(let[c,e]of this.pendingVars){let t=c.style;for(let[i,r]of Object.entries(e))t.setProperty(i,String(r))}this.pendingVars.clear();for(let[c,e]of this.pendingProps){let t=c.style;for(let[i,r]of Object.entries(e))t[i]=String(r)}this.pendingProps.clear()}}cancel(){this.pendingVars.clear(),this.pendingProps.clear(),this.isOpen=!1}},mt=new kt;var li=1/240;var jt=class{constructor(){this.measureQueue=[],this.mutateQueue=[],this.scheduled=!1}measure(c){this.measureQueue.push(c),this.schedule()}mutate(c){this.mutateQueue.push(c),this.schedule()}schedule(){this.scheduled||(this.scheduled=!0,requestAnimationFrame(()=>{let c=this.measureQueue;this.measureQueue=[];for(let t=0;t<c.length;t++)try{c[t]()}catch(i){console.error("Error in frameDOM measure task:",i)}let e=this.mutateQueue;this.mutateQueue=[];for(let t=0;t<e.length;t++)try{e[t]()}catch(i){console.error("Error in frameDOM mutate task:",i)}this.scheduled=!1}))}},ci=new jt;var hi=Math.PI*2,ui=180/Math.PI;var gt=(c=>(c.ACTIVE="-active",c.ENTERING="-entering",c.LEAVING="-leaving",c.DISABLED="-disabled",c))(gt||{}),Nt={PROGRESS:"--sequence-progress",DIRECTION:"--sequence-direction"},Vt=class ft extends He{constructor(e){super(e),this.activeStep=new Map,this.leavingStep=new Map,this.transitions=new Map,this.elementIndex=new Map,this.triggerElements=new Map,this.globalSettings=new Map,this.stateRegistered=new Set,this.lastEnteredStep=new Map,this.initialized=!1,this.onTriggerClick=t=>{let i=this.triggerElements.get(t.currentTarget);if(!i)return;let r=this.activeStep.get(i.slider)??0,s=this.getMaxStep(i.slider),n,o;if(i.step==="next"){if(n=r+1,o=1,!this.elementIndex.has(`${i.slider}[${n}]`))if(i.loop&&s>=0)n=0;else return}else if(i.step==="prev"){if(n=r-1,o=-1,n<0)if(i.loop&&s>=0)n=s;else return;if(!this.elementIndex.has(`${i.slider}[${n}]`))return}else{if(n=i.step,r===n)return;o=n>r?1:-1}this.startTransition(i.slider,n,o)},this.htmlKey="sequence",this.defaultDuration=this.settings["sequence-duration"]??600,this.attributesToMap=[...this.attributesToMap,{key:"sequence",type:"string",fallback:""},{key:"sequence-trigger",type:"string",fallback:""},{key:"entering-easing",type:"string",fallback:""},{key:"leaving-easing",type:"string",fallback:""},{key:"entering-duration",type:"string",fallback:""},{key:"leaving-duration",type:"string",fallback:""},{key:"sequence-duration",type:"string",fallback:""},{key:"active-step",type:"string",fallback:""}]}onInit(){super.onInit(),this.events.on("sequence",this.onSequenceEvent.bind(this)),this.scanStandaloneTriggers()}scanStandaloneTriggers(){let e=document.querySelectorAll("[string-sequence-trigger]:not([string-inited])");for(let t of Array.from(e)){let i=t.getAttribute("string-sequence-trigger"),r=i?this.parseTriggerKey(i):null;r&&(this.triggerElements.set(t,r),t.addEventListener("click",this.onTriggerClick))}}parseGlobalSettingsFromObject(e){let t=r=>e.getProperty(r),i=t("sequence-duration");this.tryParseGlobalSetting(i,"enteringDuration"),this.tryParseGlobalSetting(i,"leavingDuration"),this.tryParseGlobalSetting(t("entering-duration"),"enteringDuration"),this.tryParseGlobalSetting(t("leaving-duration"),"leavingDuration"),this.tryParseGlobalSetting(t("entering-easing"),"enteringEasing"),this.tryParseGlobalSetting(t("leaving-easing"),"leavingEasing"),this.tryParseGlobalSetting(t("active-step"),"activeStep")}tryParseGlobalSetting(e,t){if(!e)return;let i=e.match(/^(.+)\[(.+)\]$/);if(!i)return;let[,r,s]=i,n=this.globalSettings.get(r)??{};this.globalSettings.set(r,n),n[t]=t==="enteringEasing"||t==="leavingEasing"?s:parseFloat(s),this.applyGlobalSettingsToExistingObjects(r)}applyGlobalSettingsToExistingObjects(e){let t=this.globalSettings.get(e);if(t){for(let[i,r]of this.elementIndex)if(this.parseSequenceKey(i)?.slider===e){t.enteringDuration!==void 0&&(r.enteringDuration=t.enteringDuration),t.leavingDuration!==void 0&&(r.leavingDuration=t.leavingDuration);for(let s of r.objects)this.resolveEasings(s,i)}}}initializeSliders(){let e=new Set;for(let t of this.elementIndex.keys()){let i=this.parseSequenceKey(t);i&&e.add(i.slider)}for(let t of e){if(this.activeStep.has(t))continue;let i=this.globalSettings.get(t)?.activeStep??0;this.elementIndex.has(`${t}[${i}]`)||(i=0),this.switchInstant(t,i,1)}}tryApplyPendingActiveStep(e){if(this.activeStep.has(e))return;let t=this.globalSettings.get(e)?.activeStep;t!==void 0&&this.elementIndex.has(`${e}[${t}]`)&&this.switchInstant(e,t,1)}canConnect(e){return e.keys.includes("sequence")||e.keys.includes("sequence-trigger")}onObjectConnected(e){super.onObjectConnected(e),this.parseGlobalSettingsFromObject(e);let t=e.getProperty("sequence"),i=e.getProperty("sequence-trigger");if(!t&&i){let r=this.parseTriggerKey(i);r&&typeof r.step=="number"&&(t=`${r.slider}[${r.step}]`,e.setProperty("sequence",t))}if(t){let r=this.parseSequenceKey(t);if(r){this.ensureStateEventRegistered(r.slider);let s=this.elementIndex.get(t);if(!s){let{enteringDuration:o,leavingDuration:a}=this.resolveDurations(e,t);s={objects:[],enteringDuration:o,leavingDuration:a},this.elementIndex.set(t,s)}s.objects.push(e),this.resolveEasings(e,t);let n=this.activeStep.get(r.slider);this.setState(e,n===r.step?"-active":"-disabled",n===r.step?1:0,1),this.tryApplyPendingActiveStep(r.slider)}}if(i){let r=this.parseTriggerKey(i);r&&(this.triggerElements.set(e.htmlElement,r),e.htmlElement.addEventListener("click",this.onTriggerClick))}}ensureStateEventRegistered(e){this.stateRegistered.has(e)||(this.stateRegistered.add(e),this.events.registerStateEvent?.(`sequence:active:${e}`))}parseTriggerKey(e){let t=e.match(/^(.+)\[(next|prev|\d+)(\|loop)?\]$/);if(!t)return null;let i=t[2]==="next"||t[2]==="prev"?t[2]:parseInt(t[2],10);return{slider:t[1],step:i,loop:t[3]==="|loop"}}getMaxStep(e){let t=-1;for(let i of this.elementIndex.keys()){let r=this.parseSequenceKey(i);r?.slider===e&&r.step>t&&(t=r.step)}return t}resolveDuration(e,t,i,r){let s=e.getProperty(r),n=e.getProperty("sequence-duration"),o=this.globalSettings.get(t)?.[i];if(s&&!s.includes("[")){let a=parseFloat(s);if(!isNaN(a))return a}if(n&&!n.includes("[")){let a=parseFloat(n);if(!isNaN(a))return a}return o??this.defaultDuration}resolveDurations(e,t){let i=this.parseSequenceKey(t)?.slider??"";return{enteringDuration:this.resolveDuration(e,i,"enteringDuration","entering-duration"),leavingDuration:this.resolveDuration(e,i,"leavingDuration","leaving-duration")}}resolveEasing(e,t,i,r){let s=e.getProperty(r);(!s||typeof s=="string"&&s.includes("["))&&(s=this.globalSettings.get(t)?.[i]??this.settings.easing??"ease-out"),typeof s=="string"&&e.setProperty(r,this.tools.easingFunction.process({easing:s}))}resolveEasings(e,t){let i=this.parseSequenceKey(t)?.slider;i&&(this.resolveEasing(e,i,"enteringEasing","entering-easing"),this.resolveEasing(e,i,"leavingEasing","leaving-easing"))}onObjectDisconnected(e){super.onObjectDisconnected(e);let t=e.getProperty("sequence");if(t){let i=this.elementIndex.get(t);if(i){let r=i.objects.indexOf(e);r!==-1&&i.objects.splice(r,1),i.objects.length||this.elementIndex.delete(t)}}this.triggerElements.has(e.htmlElement)&&(e.htmlElement.removeEventListener("click",this.onTriggerClick),this.triggerElements.delete(e.htmlElement))}parseSequenceKey(e){let t=e.match(/^(.+)\[(\d+)\]$/);return t?{slider:t[1],step:parseInt(t[2],10)}:null}onSequenceEvent(e){let{slider:t,step:i,transitionProgress:r,direction:s=1,duration:n,instant:o}=e;this.activeStep.get(t)===i&&r===void 0||(r!==void 0?this.handleScrub(t,i,r,s):o?this.switchInstant(t,i,s):this.startTransition(t,i,s,n))}startTransition(e,t,i,r){let s=this.activeStep.get(e),n=this.leavingStep.get(e);this.ensureStateEventRegistered(e),n!==void 0&&n!==s&&this.setStepState(e,n,"-disabled",0,i);let o=this.elementIndex.get(`${e}[${t}]`),a=s!==void 0?this.elementIndex.get(`${e}[${s}]`):null;s!==void 0&&this.leavingStep.set(e,s),this.activeStep.set(e,t),this.emitActiveState(e,t);let l={fromStep:s??t,toStep:t,direction:i,startTime:this.data.time.now,enteringDuration:r??o?.enteringDuration??this.defaultDuration,leavingDuration:r??a?.leavingDuration??this.defaultDuration};this.transitions.set(e,l),this.emitTransitionStart(e,l)}handleScrub(e,t,i,r){this.transitions.delete(e);let s=this.activeStep.get(e);if(s!==t){let o=this.leavingStep.get(e);o!==void 0&&this.setStepState(e,o,"-disabled",0,r),s!==void 0&&this.leavingStep.set(e,s),this.activeStep.set(e,t),this.emitActiveState(e,t)}let n=this.leavingStep.get(e)??s??t;this.applyProgress(e,n,t,i,i,r)}switchInstant(e,t,i){this.transitions.delete(e);let r=this.activeStep.get(e),s=this.leavingStep.get(e);s!==void 0&&this.setStepState(e,s,"-disabled",0,i),r!==void 0&&r!==t&&this.setStepState(e,r,"-disabled",0,i),this.activeStep.set(e,t),this.leavingStep.delete(e),this.setStepState(e,t,"-active",1,i),this.emitActiveState(e,t),s!==void 0&&s!==t?this.emitStepLeave(e,s,i,!0):r!==void 0&&r!==t&&this.emitStepLeave(e,r,i,!0),this.emitStepEnter(e,t,i,!0);let n={fromStep:r??t,toStep:t,direction:i,startTime:this.data.time.now,enteringDuration:0,leavingDuration:0};this.emitTransitionStart(e,n),this.emitTransitionEnd(e,t,r??t,i,!0)}applyProgress(e,t,i,r,s,n){let o=this.activeStep.get(e),a=this.leavingStep.get(e);this.setStepState(e,o,r>=1?"-active":"-entering",r,n),a!==void 0&&a!==o&&(s>=1?(this.setStepState(e,a,"-disabled",0,n),this.leavingStep.delete(e),this.emitStepLeave(e,a,n,!1)):this.setStepState(e,a,"-leaving",s,n)),this.emitTransitionProgress(e,t,i,r,s,n),r>=1&&this.emitStepEnter(e,o,n,!1)}setStepState(e,t,i,r,s){let n=this.elementIndex.get(`${e}[${t}]`);if(n)for(let o of n.objects)this.setState(o,i,r,s)}setState(e,t,i,r){let s=e.htmlElement,n=e.getProperty("_state"),o=e.getProperty("_direction"),a=e.getProperty(t==="-leaving"?"leaving-easing":"entering-easing"),l=typeof a=="function"?a(i):i;n!==t&&(s.classList.remove(...ft.ALL_STATES),s.classList.add(t),e.setProperty("_state",t)),o!==r&&(e.setProperty("_direction",r),mt.run(()=>mt.setVars(s,{[Nt.DIRECTION]:r.toString()})))}onFrame(e){super.onFrame(e),this.initialized||(this.initialized=!0,this.initializeSliders());for(let[t,i]of this.transitions){let r=e.time.now-i.startTime,s=Math.min(1,r/i.enteringDuration),n=Math.min(1,r/i.leavingDuration);this.applyProgress(t,i.fromStep,i.toStep,s,n,i.direction),s>=1&&n>=1&&(this.emitTransitionEnd(t,i.toStep,i.fromStep,i.direction,!1),this.transitions.delete(t))}}emitTransitionStart(e,t){let i={slider:e,from:t.fromStep,to:t.toStep,direction:t.direction,enteringDuration:t.enteringDuration,leavingDuration:t.leavingDuration,startedAt:t.startTime};this.events.emit("sequence:transition:start",i),this.events.emit(`sequence:transition:start:${e}`,i)}emitTransitionProgress(e,t,i,r,s,n){let o={slider:e,from:t,to:i,entering:r,leaving:s,direction:n};this.events.emit("sequence:transition:progress",o),this.events.emit(`sequence:transition:progress:${e}`,o)}emitTransitionEnd(e,t,i,r,s){let n={slider:e,from:i,to:t,direction:r,instant:s};this.events.emit("sequence:transition:end",n),this.events.emit(`sequence:transition:end:${e}`,n)}emitStepEnter(e,t,i,r){if(!r&&this.lastEnteredStep.get(e)===t)return;this.lastEnteredStep.set(e,t);let s={slider:e,step:t,direction:i,instant:r};this.events.emit("sequence:step:enter",s),this.events.emit(`sequence:step:enter:${e}`,s)}emitStepLeave(e,t,i,r){if(t==null)return;let s={slider:e,step:t,direction:i,instant:r};this.events.emit("sequence:step:leave",s),this.events.emit(`sequence:step:leave:${e}`,s)}emitActiveState(e,t){let i={slider:e,step:t};this.events.emit("sequence:active",i),this.events.emit(`sequence:active:${e}`,i)}};Vt.ALL_STATES=Object.values(gt);var rt=class ze extends He{constructor(e){super(e),this.htmlKey="form"}initializeObject(e,t,i,r){super.initializeObject(e,t,i,r);let s=t.getProperty("form-events")??[];s.forEach(d=>{d.eventElement.removeEventListener(d.eventType,d.eventCallback)}),s.length=0,t.setProperty("form-events",s),super.onObjectConnected(t);let n=t.htmlElement,o=[],a={};this.getInteractiveFields(n).forEach((d,h)=>this.registerField(d,n,o,a,s,h));let l=d=>{d.preventDefault();let h=!0,u={},p=new Set;for(let m of o){let f=m.field;if(!f.isConnected||!this.shouldValidateField(f))continue;if(this.isRadioField(f)){if(p.has(m.key))continue;p.add(m.key)}let{key:g,rules:S,needsContext:y}=m,b=this.getFieldValue(f);u[g]=b,a[g]=b;let{valid:v,errors:w}=this.tools.validation.process({rules:S,value:b,context:this.buildContext(y,g,a)});this.applyValidationState(n,f,g,v,w,"submit"),v||(h=!1)}if(h)this.events.emit(`form:submit:${t.id}`,u);else{let m=new Set,f=o.find(g=>{let S=g.field;if(!S.isConnected||!this.shouldValidateField(S))return!1;if(this.isRadioField(S)){if(m.has(g.key))return!1;m.add(g.key)}let{key:y,rules:b,needsContext:v}=g,w=this.getFieldValue(S);a[y]=w;let{valid:C}=this.tools.validation.process({rules:b,value:w,context:this.buildContext(v,y,a)});return!C});f?.field&&typeof f.field.focus=="function"&&f.field.focus(),this.events.emit(`form:invalid:${t.id}`)}};n.addEventListener("submit",l),s.push({eventElement:n,eventType:"submit",eventCallback:l}),t.setProperty("form-field-entries",o),t.setProperty("form-field-values",a)}onObjectConnected(e){}onDOMMutate(e,t){this.objects.length!==0&&(e.length>0&&this.handleMutationAdditions(e),t.length>0&&this.handleMutationRemovals(t))}applyValidationState(e,t,i,r,s,n){let o=e.querySelector(`[string-input="error[${i}]"]`),a=e.querySelector(`[string-input="group[${i}]"]`);o&&(o.innerHTML="",s.forEach(d=>{let h=document.createElement("span");h.textContent=d,o.appendChild(h)})),n==="live"?(t.classList.toggle("-invalid",!r),t.classList.remove("-error")):(t.classList.remove("-invalid"),t.classList.toggle("-error",!r)),t.classList.toggle("-valid",r),a&&(n==="live"?(a.classList.toggle("-invalid",!r),a.classList.remove("-error")):(a.classList.remove("-invalid"),a.classList.toggle("-error",!r)),a.classList.toggle("-valid",r));let l=r?"valid":n==="live"?"invalid":"error";this.events.emit(`form:field:${l}:${i}`,{key:i,field:t,errors:s,phase:n,valid:r})}getInteractiveFields(e){return Array.from(e.querySelectorAll("[string-input]")).filter(t=>!this.isServiceFieldAttribute(t.getAttribute("string-input")||"")).filter(t=>this.isFormFieldElement(t)).map(t=>t)}getFieldRules(e){let t=this.tools.domAttribute.process({element:e,key:"input"})??"";return this.tools.ruleParser.process({value:t})}registerField(e,t,i,r,s,n){if(!this.isFormFieldElement(e)||e.closest("form")!==t||i.some(f=>f.field===e))return;let o=this.registerFieldIndex(e,n??i.length),a=this.getInputKey(e,o),l=this.getFieldRules(e),d=this.supportsBeforeInputValidation(l),h=this.requiresContext(l),u=this.getInputEventType(e),p={field:e,key:a,rules:l,supportsRealtime:d,needsContext:h,inputEventType:u,inputHandler:()=>{}},m=f=>{let g=f.currentTarget||f.target;if(!g||!g.isConnected||!this.shouldValidateField(g))return;let S=this.getFieldValue(g);r[p.key]=S;let y=this.buildContext(p.needsContext,p.key,r),{valid:b,errors:v}=this.tools.validation.process({rules:p.rules,value:S,context:y});this.applyValidationState(t,g,p.key,b,v,"live")};if(p.inputHandler=m,e.addEventListener(u,m),s.push({eventElement:e,eventType:u,eventCallback:m}),d&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement)){let f=g=>{let S=g;if(S.isComposing||S.inputType?.startsWith("insertComposition"))return;let y=g.currentTarget||g.target;if(!y||!(y instanceof HTMLInputElement||y instanceof HTMLTextAreaElement)||!y.isConnected)return;let b=y.selectionStart??0,v=y.selectionEnd??0,w=y.value;switch(S.inputType){case"deleteContentBackward":w=b===v&&b>0?y.value.slice(0,b-1)+y.value.slice(v):y.value.slice(0,b)+y.value.slice(v);break;case"deleteContentForward":w=b===v&&b<y.value.length?y.value.slice(0,b)+y.value.slice(b+1):y.value.slice(0,b)+y.value.slice(v);break;case"insertFromPaste":case"insertFromDrop":case"insertReplacementText":w=y.value.slice(0,b)+(S.data||"")+y.value.slice(v);break;default:typeof S.data=="string"&&(w=y.value.slice(0,b)+S.data+y.value.slice(v))}let{errors:C}=this.tools.validation.process({rules:p.rules,value:w,type:"beforeinput",context:this.buildContext(p.needsContext,p.key,r,{applied:!0,value:w})});C.length>0&&g.cancelable&&g.preventDefault()};p.beforeInputHandler=f,e.addEventListener("beforeinput",f),s.push({eventElement:e,eventType:"beforeinput",eventCallback:f})}e.classList.add("-inited"),i.push(p),r[a]=this.getFieldValue(e)}unregisterField(e,t,i,r){let s=t.findIndex(o=>o.field===e);if(s===-1)return;let n=t[s];n.inputHandler&&e.removeEventListener(n.inputEventType,n.inputHandler),n.beforeInputHandler&&e.removeEventListener("beforeinput",n.beforeInputHandler),delete i[n.key],t.splice(s,1);for(let o=r.length-1;o>=0;o--){let a=r[o];a.eventElement===e&&(a.eventCallback===n.inputHandler||n.beforeInputHandler&&a.eventCallback===n.beforeInputHandler)&&r.splice(o,1)}e.classList.remove("-inited")}collectInteractiveFieldsFromNode(e){let t=[];return e instanceof Element?(e.hasAttribute("string-input")&&t.push(e),t.push(...Array.from(e.querySelectorAll("[string-input]")))):e instanceof DocumentFragment&&t.push(...Array.from(e.querySelectorAll("[string-input]"))),t.filter(i=>!this.isServiceFieldAttribute(i.getAttribute("string-input")||"")).filter(i=>this.isFormFieldElement(i))}isRadioField(e){return e instanceof HTMLInputElement&&e.type==="radio"}handleMutationAdditions(e){e.forEach(t=>{this.collectInteractiveFieldsFromNode(t).forEach(i=>{let r=this.getFormStateByContainment(i);r&&this.registerField(i,r.form,r.entries,r.values,r.events)})})}handleMutationRemovals(e){e.forEach(t=>{this.collectInteractiveFieldsFromNode(t).forEach(i=>{let r=this.getFormStateByReference(i);r&&this.unregisterField(i,r.entries,r.values,r.events)})})}getFormStateByContainment(e){let t=this.objects.find(i=>i.htmlElement instanceof HTMLFormElement&&i.htmlElement.contains(e));return t?this.buildFormState(t):null}getFormStateByReference(e){for(let t of this.objects){let i=t.getProperty("form-field-entries");if(i&&i.some(r=>r.field===e))return this.buildFormState(t,i)}return null}buildFormState(e,t){let i=e.htmlElement;if(!(i instanceof HTMLFormElement))return null;let r=t??e.getProperty("form-field-entries"),s=e.getProperty("form-field-values"),n=e.getProperty("form-events");return!r||!s||!n?null:{object:e,form:i,entries:r,values:s,events:n}}registerFieldIndex(e,t){let i=e.getAttribute("data-string-form-index");return i!==null?Number(i):(e.setAttribute("data-string-form-index",String(t)),t)}getFieldIndex(e,t){let i=e.getAttribute("data-string-form-index");if(i!==null){let r=Number(i);return Number.isNaN(r)?t:r}return this.registerFieldIndex(e,t)}shouldValidateField(e){return!(e.disabled||e instanceof HTMLInputElement&&e.type==="hidden")}supportsBeforeInputValidation(e){return e.some(t=>ze.beforeInputRuleKeys.has(t.key))}requiresContext(e){return e.some(t=>ze.crossFieldRuleKeys.has(t.key))}buildContext(e,t,i,r){if(!e)return{fieldKey:t};let s=!!r?.applied,n=s?{...i,[t]:r.value}:i;return{fieldKey:t,values:n,getValue:o=>s&&o===t?r.value:n[o]}}getInputKey(e,t){return this.tools.domAttribute.process({element:e,key:"id"})||e.getAttribute("name")||e.getAttribute("id")||`input-${t}`}getFieldValue(e){if(e instanceof HTMLInputElement){if(e.type==="checkbox"){if(e.name){let t=e.form||e.closest("form"),i=t?Array.from(t.querySelectorAll(`input[type="checkbox"][name="${e.name}"]:checked`)):[e];return i.length>1?i.map(r=>r.value):i.length===1?i[0].value:""}return e.checked}if(e.type==="radio"){if(e.name){let t=(e.form||e.closest("form"))?.querySelector(`input[type="radio"][name="${e.name}"]:checked`);return t?t.value:""}return e.checked?e.value:""}return e.type==="file"&&e.files&&e.files.length>0?e.multiple?Array.from(e.files):e.files[0]:e.value}return e instanceof HTMLSelectElement?e.multiple?Array.from(e.selectedOptions).map(t=>t.value):e.value:e instanceof HTMLTextAreaElement?e.value:""}isServiceFieldAttribute(e){return ze.serviceAttributePrefixes.some(t=>e.startsWith(`${t}[`))}isFormFieldElement(e){return e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement}getInputEventType(e){return e instanceof HTMLSelectElement||e instanceof HTMLInputElement&&(e.type==="checkbox"||e.type==="radio")?"change":"input"}};rt.beforeInputRuleKeys=new Set(["number","integer","email","phone","letters","lettersSpaces","lettersNumbers","alpha","alpha_num","alpha_dash","digits","url","pattern"]),rt.crossFieldRuleKeys=new Set(["same","different","after","before"]),rt.serviceAttributePrefixes=["error","group"];var Ce=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),n=e/this._width,o=t/this._height,a=(n-.5)*r,l=-(o-.5)*s;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),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 zt={renderTargets:!1,shaderMaterials:!1,postProcess:!1,customMaterialFactory:!1,particles:!1,text:!1,geometrySimplify:!1};function Ht(c){let e=c.getCapabilities?.();return e?{...zt,...e}:{renderTargets:typeof c.createRenderTarget=="function",shaderMaterials:typeof c.createShaderMaterial=="function",postProcess:typeof c.createRenderTarget=="function"&&typeof c.createShaderMaterial=="function",customMaterialFactory:typeof c.getMaterialFactory=="function",particles:typeof c.createParticleSystem=="function",text:typeof c.createTextGeometry=="function"||typeof c.loadFont=="function",geometrySimplify:typeof c.simplifyGeometry=="function"}}function yt(c,e){let t=c.getPostProcessRuntime?.();if(t&&t.isSupported(e))return t;let i=Ht(c);return!i.postProcess||!i.renderTargets||!i.shaderMaterials||typeof c.createRenderTarget!="function"||typeof c.createShaderMaterial!="function"||typeof e.setRenderTarget!="function"?null:{isSupported:()=>!0,createRenderTarget:(r,s,n)=>c.createRenderTarget(r,s,n),createShaderMaterial:r=>c.createShaderMaterial(r),setRenderTarget:(r,s)=>{r.setRenderTarget?.(s)},clear:(r,s=!0,n=!0,o=!0)=>{r.clear?.(s,n,o)}}}var ye=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}}};ye.filters=new Map;var Be=class{constructor(e,t,i,r,s){let n=e.getCustomFilterRegistry?.()||ye;this.pipeline=i.createPipeline?.({engine:e,renderer:t,width:r,height:s,customFilterRegistry:n})||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 Pe=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.engine.getRecommendedPixelRatio?.(),n=typeof s=="number"&&Number.isFinite(s)?Math.max(.1,s):1;this._renderer.setPixelRatio(n),this._renderer.setSize(i,r),this.engine.configureRenderer?.(this._renderer,{width:i,height:r,pixelRatio:n,container:this._container}),this.postProcessRuntime=yt(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 s=e.getAllObjects(),n=new Map;s.forEach(p=>{let m=p.object;"visible"in m&&n.set(p.object,m.visible)});let o=new Set;i.forEach(p=>{this.collectSubtreeObjects(p.object,o)}),s.forEach(p=>{o.has(p.object)&&this.setVisible(p.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,s.forEach(p=>{let m=n.get(p.object);typeof m<"u"&&this.setVisible(p.object,m)});let d=s.filter(p=>p.type.endsWith("Light")),h=this.engine.supportsObjectLayerIsolation?.(t.camera,s.map(p=>p.object))===!0&&typeof this.engine.beginObjectLayerIsolation=="function"&&typeof this.engine.endObjectLayerIsolation=="function",u=!1;i.forEach(p=>{let m=this.filterCache.get(p.object.id);if(!p.dirty&&m&&m.effectsKey===p.effectsKey&&m.qualityScale===this.qualityScale){m.lastUsedFrame=this.frameId,r.renderToScreen(m.target);return}let g=this.injectEffectContext(p.object.el,p.effects),S=new Set;this.collectSubtreeObjects(p.object,S);let y=null;if(h){let T=p.object.getSubtreeObjects();y=this.engine.beginObjectLayerIsolation?.(t.camera,T,d.map(I=>I.object),this.filterLayer)||null}y||(u=!0,s.forEach(T=>{if(n.get(T.object)===!1){this.setVisible(T.object,!1);return}if(T.type.endsWith("Light")){this.setVisible(T.object,!0);return}this.setVisible(T.object,S.has(T.object))}));let b=r.acquireTarget();this.postProcessRuntime?.setRenderTarget(this._renderer,b),this.postProcessRuntime?.clear(this._renderer,!0,!0,!0),this._renderer.render(e.getScene(),t.camera);let v=r.applyFilters(b,g,this.qualityScale);this.postProcessRuntime?.setRenderTarget(this._renderer,null),r.renderToScreen(v),y&&this.engine.endObjectLayerIsolation?.(t.camera,y),v!==b&&r.releaseTarget(b);let w={target:v,effectsKey:p.effectsKey,lastUsedFrame:this.frameId,qualityScale:this.qualityScale},C=this.filterCache.get(p.object.id);C&&C.target!==v&&r.releaseTarget(C.target),this.filterCache.set(p.object.id,w)}),u&&s.forEach(p=>{let m=n.get(p.object);typeof m<"u"&&this.setVisible(p.object,m)}),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 Be(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,s=1-(i.top+i.height/2)/this._height,n=o=>Math.max(0,Math.min(1,o));return[n(r),n(s)]}injectEffectContext(e,t){if(!t.some(n=>n.type==="custom"))return t;let i=this.getFilterCenter(e),r=!1,s=t.map(n=>{if(n.type!=="custom"||n.uniforms&&"uCenter"in n.uniforms)return n;let o={...n.uniforms||{},uCenter:i};return r=!0,{...n,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,n=Math.max(.75,1-Math.min(.4,e*.03)),o=n;s<48&&(o=Math.max(.75,n-.1)),s<40&&(o=Math.max(.75,n-.2)),s>58&&(o=Math.min(1,n+.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 oe=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(n=>n?.dispose?.()):s?.dispose&&s.dispose()})}};var Me=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,n=typeof s=="number"?s:Number.parseFloat(s);if(!Number.isNaN(n))return n}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 be(c,e,t){let r=c.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 n=getComputedStyle(c).getPropertyValue(e),o=Number.parseFloat(n);return Number.isNaN(o)?t:o}function st(c){return c.startsWith("'")&&c.endsWith("'")||c.startsWith('"')&&c.endsWith('"')?c.slice(1,-1):c}function Te(c,e,t=""){let r=c.computedStyleMap?.()?.get?.(e);if(typeof r=="string")return st(r.trim());if(r&&typeof r=="object"){let o=r.value;if(typeof o=="string")return st(o.trim())}let s=getComputedStyle(c).getPropertyValue(e);return(s?st(s.trim()):"")||t}function _e(c,e,t=!1){let i=Te(c,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 bt(c){let e=c.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(c).getPropertyValue("--filter")||""),t=t.trim(),t}var pe=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 n=this.resolveCssSyntax(r.type);try{t.registerProperty({name:s,syntax:n,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())}};pe.materials=new Map,pe.registeredCssVars=new Set;function vt(c,e){if(e==null||e===""||e==="none")return c.value;let t=e.trim();switch(c.type){case"float":case"int":{let i=parseFloat(t);return isNaN(i)?c.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]]:c.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]]:c.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]]:c.value}case"color":return Bt(t)??c.value;case"texture":{let i=t.match(/url\(['"]?(.*?)['"]?\)/);return i?i[1]:t||c.value}default:return c.value}}function Bt(c){if(c.startsWith("#")){let t=c.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=c.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 nt(c,e,t){let i={};if(c.parse){let r=c.parse(e,t);Object.assign(i,r)}if(c.uniforms)for(let[r,s]of Object.entries(c.uniforms))if(s.css){let n=t.getPropertyValue(s.css).trim();i[r]=vt(s,n)}else r in i||(i[r]=s.value);return i}function at(c){let e=new Map;for(let i of c){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((n,o)=>(n.order??0)-(o.order??0));t.set(i,s.map(n=>n.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?.()||pe,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 n=e.getProperty("parentId");n==null?(this._scene.add(s.object),this._rootObjects.push(s)):this._objects.get(n)?.addChild(s),this._objects.set(e.id,s),this._elementMap.set(e.id,i),s.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;case"svg":this.createSVG(e,r);break;default:break}}catch{}}createGroup(e,t){let i=this.engine.createGroup(),r=new oe(e.id,"group",i,this.engine);return t(r),r}createLight(e,t,i){let r=e.htmlElement,s=r?Te(r,"--light-color","#ffffff"):"#ffffff",n=s&&s!=="none"?s:"#ffffff",o=r?be(r,"--light-intensity",1):1,a;if(t==="point"){let h=r?be(r,"--light-distance",1e3):1e3,u=r?be(r,"--light-decay",0):0;a=this.engine.createPointLight(n,o,h,u)}else if(t==="directional")a=this.engine.createDirectionalLight(n,o);else if(t==="spot"){let h=r?be(r,"--light-distance",0):0,u=r?be(r,"--light-angle",Math.PI/3):Math.PI/3,p=r?be(r,"--light-penumbra",0):0,m=r?be(r,"--light-decay",1):1;a=this.engine.createSpotLight(n,o,h,u,p,m)}else if(t==="hemisphere"){let h=r?Te(r,"--light-ground-color","#ffffff"):"#ffffff",u=h&&h!=="none"?h:"#ffffff";a=this.engine.createHemisphereLight(n,u,o)}else a=this.engine.createAmbientLight(n,o);if((r?_e(r,"--shadow-cast",!1):!1)&&a.shadow){a.castShadow=!0;let h=r?be(r,"--shadow-bias",0):0,u=r?be(r,"--shadow-map-size",512):512;a.shadow.bias=h,a.shadow.mapSize.width=u,a.shadow.mapSize.height=u}let d=new oe(e.id,t+"Light",a,this.engine);return i(d),d}applyShadowProps(e,t){let i=e.htmlElement,r=i?_e(i,"--shadow-cast",!1):!1,s=i?_e(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 n=new oe(e.id,"box",s,this.engine,{geometry:i,material:r});return t(n),n}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)),n=this.engine.createSphereGeometry(.5,r,s),o=this.createMaterialFromObject(e),a=this.engine.createMesh(n,o);this.applyShadowProps(e,a);let l=new oe(e.id,"sphere",a,this.engine,{geometry:n,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 n=new oe(e.id,"plane",s,this.engine,{geometry:i,material:r});return t(n),n}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),n=this.createMaterialFromObject(e),o=this.engine.createMesh(s,n);this.applyShadowProps(e,o);let a=new oe(e.id,"cylinder",o,this.engine,{geometry:s,material:n});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,s=this.resolveModelLoader(r);if(!s)return;let n=e.htmlElement;if(n){let a=this.parseModelLoaderOptions(n);a&&this.engine.configureModelLoader?.(s,a)}let o=e.getProperty("3d-model-center")??!1;s.load(i,a=>{let l=this.engine.resolveLoadedModelRoot?.(a)||(a&&typeof a=="object"?a:null);if(!l)return;let d=n&&this.shouldOverrideModelMaterial(n)?this.createMaterialFromElement(n,e):null;this.engine.forEachMesh(l,u=>{d&&(u.material=d),this.applyShadowProps(e,u)}),o&&this.centerObject(l);let h=new oe(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),n=new oe(e.id,"particles",s,this.engine);t(n)}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 n=this.engine.createGroup();n.add(s);let o=new oe(e.id,"text",n,this.engine,{geometry:i,material:r});t(o)}createSVG(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 n=this.engine.createGroup();n.add(s);let o=new oe(e.id,"svg",n,this.engine,{geometry:i,material:r});t(o)}getGeometryQuality(e){if(!e)return 1;let t=be(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,D,O)=>{let k=r(M);return k&&k!=="none"&&k!==""?D(k):O},n=M=>parseFloat(M),o=M=>M,a=M=>{let D=M.match(/url\(['"]?(.*?)['"]?\)/);return D?D[1]:M},l=s("--material-type",M=>M.split("[")[0]||"basic","basic"),d=this.tryCreateCustomMaterial(l,e,i,t);if(d)return d;let h=s("--material-color",o,"#ffffff"),u=s("--opacity",n,1),p=s("--material-metalness",n,0),m=s("--material-roughness",n,1),f=s("--material-emissive",o,"#000000"),g={color:h,transparent:u<1,opacity:u},S=s("--texture-map",a,""),y=s("--texture-normal",a,""),b=s("--texture-roughness",a,""),v=s("--texture-metalness",a,""),w=s("--texture-ao",a,""),C=this.parseFlipY(e),T=e?Te(e,"--texture-color-space",""):"",I=!!(S||y||b||v||w),E=l;return E!=="standard"&&I&&(E="standard"),E==="standard"?(S&&(g.map=this.loadTexture(S,{flipY:C,colorSpace:T||"srgb"})),y&&(g.normalMap=this.loadTexture(y,{flipY:C})),b&&(g.roughnessMap=this.loadTexture(b,{flipY:C})),v&&(g.metalnessMap=this.loadTexture(v,{flipY:C})),w&&(g.aoMap=this.loadTexture(w,{flipY:C})),g.metalness=p,g.roughness=m,g.emissive=f,this.engine.createMeshStandardMaterial(g)):this.engine.createMeshBasicMaterial(g)}tryCreateCustomMaterial(e,t,i,r){let s=this.customMaterialRegistry.get(e);if(!s)return null;let n=this.engine.getMaterialFactory?.();if(!n||!n.supports(s))return null;let o={};t&&i&&(o=n.parseUniformsFromCSS(s,t,i));let a=n.create(s,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[n,o]of this._elementMap)if(n===e.id&&o===t){r=o.__stringObject||o.stringObject;break}let s=this.createMaterialFromElement(t,r);this.engine.forEachMesh(e.object,n=>{let o=n.material;Array.isArray(o)?o.forEach(a=>a?.dispose?.()):o?.dispose?.(),n.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?Te(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 n=t.getPropertyValue(s);return n&&n!=="0"&&n!=="none"&&n!==""};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))}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 s=JSON.parse(i);s&&typeof s=="object"&&(r.textureMap=s)}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 ne=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 n=performance.now(),o=Math.max(0,t.styleReadIntervalMs??0);if(o>0&&!r){let l=this.meta.get(e),d=this.cache.get(e);if(l&&d&&n-l.time<o)return d}let a=i(e);return this.cache.set(e,a),this.meta.set(e,{time:n}),a}clear(){this.cache=new WeakMap,this.meta=new WeakMap}invalidate(e){this.cache.delete(e),this.meta.delete(e)}};var ot=Math.PI/180,We=class We{sync(e,t,i,r){let s=e.__layoutCache,n=s?s.rect:e.getBoundingClientRect(),o=this.readStyleBundle(e,i),a=n.left+n.width*.5,l=n.top+n.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set(a-i.viewportWidth/2,-(l-i.viewportHeight/2),o.translateZ);else{let d=i.camera.getFrustumSizeAt(o.translateZ),h=a/i.viewportWidth,u=l/i.viewportHeight;t.object.position.set((h-.5)*d.width,-(u-.5)*d.height,o.translateZ)}return t.object.scale.set(o.scale,o.scale,o.scale),t.object.rotation.x=-o.rotateX*ot,t.object.rotation.y=o.rotateY*ot,t.object.rotation.z=-o.rotateZ*ot,t.object.rotation.order="XYZ",t.object.updateMatrixWorld(!0),{scale:o.scale}}readStyleBundle(e,t){return We.styleCache.get(e,t,i=>{let r=new Me(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)}})}};We.styleCache=new ne;var $e=We;var Ue=class Ue{sync(e,t,i,r){let s=e.__layoutCache,n=s?s.rect:e.getBoundingClientRect(),o=this.readStyleBundle(e,i,t),a=this.resolveScreenAnchor(n,i),l=a.fallbackToViewportCenter?o.translateX:0,d=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)+d,o.translateZ);else{let u=i.camera.getFrustumSizeAt(o.translateZ),p=a.x/i.viewportWidth,m=a.y/i.viewportHeight;this.setObjectPosition(i,t.object,(p-.5)*u.width+l,-(m-.5)*u.height+d,o.translateZ)}let h=t.object;if(o.color&&o.color!=="none"&&h.color&&typeof h.color.set=="function"&&h.color.set(o.color),h.intensity=o.intensity,typeof h.distance<"u"&&o.distance!==void 0&&(h.distance=o.distance),typeof h.decay<"u"&&o.decay!==void 0&&(h.decay=o.decay),typeof h.angle<"u"&&o.angle!==void 0&&(h.angle=o.angle),typeof h.penumbra<"u"&&o.penumbra!==void 0&&(h.penumbra=o.penumbra),o.groundColor&&o.groundColor!=="none"&&h.groundColor&&typeof h.groundColor.set=="function"&&h.groundColor.set(o.groundColor),h.castShadow!==o.castShadow&&(h.castShadow=o.castShadow),o.castShadow&&h.shadow&&(o.shadowBias!==void 0&&(h.shadow.bias=o.shadowBias),o.shadowMapSize!==void 0&&h.shadow.mapSize.width!==o.shadowMapSize&&(h.shadow.mapSize.width=o.shadowMapSize,h.shadow.mapSize.height=o.shadowMapSize)),o.targetId&&o.targetId!=="none"&&h.target){let u=document.querySelector(`[string-id="${o.targetId}"]`);if(u){let p=u.__layoutCache,m=p?p.rect:u.getBoundingClientRect(),f=new Me(u),g=f.readNumber("--translate-x",0),S=f.readNumber("--translate-y",0),y=f.readNumber("--translate-z",0),b=this.resolveScreenAnchor(m,i),v=b.fallbackToViewportCenter?g:0,w=b.fallbackToViewportCenter?S:0,C,T,I;if(i.camera.getMode()==="orthographic")C=b.x-i.viewportWidth/2+v,T=-(b.y-i.viewportHeight/2)+w,I=y;else{let E=i.camera.getFrustumSizeAt(y),M=b.x/i.viewportWidth,D=b.y/i.viewportHeight;C=(M-.5)*E.width+v,T=-(D-.5)*E.height+w,I=y}o.targetOffset&&(C+=o.targetOffset.x,T+=o.targetOffset.y,I+=o.targetOffset.z),this.setObjectPosition(i,h.target,C,T,I),h.target.updateMatrixWorld(!0)}}return null}readStyleBundle(e,t,i){return Ue.styleCache.get(e,t,r=>{let s=new Me(r),n=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",n.intensity??1),castShadow:s.readBoolean("--shadow-cast",!1)};typeof n.distance<"u"&&(o.distance=s.readNumber("--light-distance",n.distance??0)),typeof n.decay<"u"&&(o.decay=s.readNumber("--light-decay",n.decay??1)),typeof n.angle<"u"&&(o.angle=s.readNumber("--light-angle",n.angle??Math.PI/3)),typeof n.penumbra<"u"&&(o.penumbra=s.readNumber("--light-penumbra",n.penumbra??0));let a=s.readString("--light-ground-color","");a&&(o.groundColor=a),o.castShadow&&n.shadow&&(o.shadowBias=s.readNumber("--shadow-bias",n.shadow.bias??0),o.shadowMapSize=s.readNumber("--shadow-map-size",n.shadow.mapSize.width??512));let l=s.readString("--light-target","").trim();l&&(o.targetId=l);let d=s.readString("--light-target-offset","").trim();if(d){let h=this.parseTargetOffset(d);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]}}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,s){if(!e.engine.setObjectPosition?.(t,i,r,s)){if(t?.position?.set&&typeof t.position.set=="function"){t.position.set(i,r,s);return}if(typeof t?.setPosition=="function"){t.setPosition(i,r,s);return}t?.position&&(t.position.x=i,t.position.y=r,t.position.z=s)}}};Ue.styleCache=new ne;var we=Ue;var lt=Math.PI/180;function Mt(c){let e=(c||"").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,s=Number.parseInt(i.slice(3,5),16)/255,n=Number.parseInt(i.slice(5,7),16)/255;return{r,g:s,b:n}}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 _t(c){let e=(c||"").trim().toLowerCase();if(!e)return!1;if(e==="black"||e==="#000"||e==="#000000")return!0;let t=Mt(e);return t?t.r===0&&t.g===0&&t.b===0:!1}function St(c,e){if(!c)return!1;if(typeof c.set=="function")try{return c.set(e),!0}catch{}let t=Mt(e);return t?typeof c.setRGB=="function"?(c.setRGB(t.r,t.g,t.b),!0):"r"in c&&"g"in c&&"b"in c?(c.r=t.r,c.g=t.g,c.b=t.b,!0):!1:!1}var X=class X{static resolveEmissiveValue(e,t){return!t||t==="none"?void 0:e.style.getPropertyValue("--material-emissive").trim()?t:_t(t)?void 0:t}static applyVisualProps(e,t,i,r){let s=X.lastVisualProps.get(t);if(s){if(s.opacity===r.opacity&&s.color===r.color&&s.metalness===r.metalness&&s.roughness===r.roughness&&s.emissive===r.emissive&&s.castShadow===r.castShadow&&s.receiveShadow===r.receiveShadow)return;s.opacity=r.opacity,s.color=r.color,s.metalness=r.metalness,s.roughness=r.roughness,s.emissive=r.emissive,s.castShadow=r.castShadow,s.receiveShadow=r.receiveShadow}else X.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 n=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},d=h=>{h&&(i.applyMaterialProps?.(h,l)||(isNaN(a)||(h.opacity=a,h.transparent=a<1),r.color&&h.color&&St(h.color,r.color),typeof r.metalness=="number"&&"metalness"in h&&(h.metalness=r.metalness),typeof r.roughness=="number"&&"roughness"in h&&(h.roughness=r.roughness),r.emissive&&h.emissive&&St(h.emissive,r.emissive)))};i.forEachMesh(t.object,h=>{h.castShadow!==n&&(h.castShadow=n),h.receiveShadow!==o&&(h.receiveShadow=o),(Array.isArray(h.material)?h.material:[h.material]).forEach(d)})}sync(e,t,i,r){let{rect:s,width:n,height:o}=this.readLayout(e,i),a=this.readStyleBundle(e,i),{translateZ:l,cssScale:d,rotateX:h,rotateY:u,rotateZ:p,cssScaleZ:m,opacity:f,color:g,metalness:S,roughness:y,emissive:b,castShadow:v,receiveShadow:w,geometryQuality:C}=a,T=s.left+s.width*.5,I=s.top+s.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set(T-i.viewportWidth/2,-(I-i.viewportHeight/2),l);else{let B=i.camera.getFrustumSizeAt(l),W=T/i.viewportWidth,P=I/i.viewportHeight;t.object.position.set((W-.5)*B.width,-(P-.5)*B.height,l)}t.object.rotation.x=-h*lt,t.object.rotation.y=u*lt,t.object.rotation.z=-p*lt,t.object.rotation.order="XYZ";let E=n*d,M=o*d,D=r?.scale||1,O=m*D,k=E<M?E:M,$,G,H;switch(t.type){case"box":case"sphere":{let B=k*D;$=G=B,H=B*m;break}case"model":{let B=t.getOriginalBoundingBox();X.tempVector3||(X.tempVector3=i.engine.createVector3());let W=B.getSize(X.tempVector3),P=e.getAttribute("string-3d-model-fit"),x=parseFloat(e.getAttribute("string-3d-model-scale")||"1"),R=Number.isFinite(x)?x*D:D;if(W.x>0&&W.y>0){let L=E/W.x,F=M/W.y,j=(P==="cover"?L>F?L:F:L<F?L:F)*R;$=G=j,H=j*m}else{let L=k*R;$=G=L,H=L*m}break}case"cylinder":$=E*D,G=M*D,H=E*O;break;default:$=E*D,G=M*D,H=k*.5*O;break}return t.object.scale.set($,G,H),X.applyVisualProps(e,t,i.engine,{opacity:f,color:g&&g!=="none"?g:void 0,metalness:isNaN(S)?void 0:S,roughness:isNaN(y)?void 0:y,emissive:X.resolveEmissiveValue(e,b),castShadow:v,receiveShadow:w}),this.applyGeometryQuality(t,C,i),this.updateCustomUniforms(e,t,i),{scale:d*D}}applyGeometryQuality(e,t,i){let r=i.engine.simplifyGeometry?.bind(i.engine);if(typeof r!="function")return;let s=Number.isFinite(t)&&t>0?t:1,n=X.lastGeometryQuality.get(e);if(typeof n=="number"&&Math.abs(n-s)<.001)return;X.lastGeometryQuality.set(e,s);let o=a=>{if(!a?.geometry)return;X.originalGeometryByMesh.has(a)||X.originalGeometryByMesh.set(a,a.geometry);let l=X.originalGeometryByMesh.get(a);if(s>=.999){a.geometry=l;return}X.lodGeometryCacheByMesh.has(a)||X.lodGeometryCacheByMesh.set(a,new Map);let d=X.lodGeometryCacheByMesh.get(a),h=s.toFixed(3);if(d.has(h)){a.geometry=d.get(h);return}let u=r(l,s);u&&(d.set(h,u),a.geometry=u)};i.engine.forEachMesh(e.object,o)}updateCustomUniforms(e,t,i){let r=i.engine.getMaterialFactory?.();if(!r)return;let s=getComputedStyle(e),n=o=>{let a=r.getMaterialDefinition?.(o)??o?.userData?.definition;if(!a?.uniforms)return;let l=r.parseUniformsFromCSS(a,e,s);if(typeof r.applyUniforms=="function"){r.applyUniforms(o,a,l);return}for(let[d,h]of Object.entries(l)){let u=a.uniforms?.[d];if(!u)continue;let p=r.convertUniformValue?.bind(r),m=p?p(u.type,h):h;o.uniforms?.[d]&&(o.uniforms[d].value=m)}};i.engine.forEachMaterial(t.object,n)}readStyleBundle(e,t){return X.styleCache.get(e,t,i=>{let r=i.computedStyleMap?.(),s=getComputedStyle(i),n=(l,d)=>{let h=r?.get?.(l);if(h!=null){let p=typeof h=="object"&&"value"in h?h.value:h,m=typeof p=="number"?p:Number.parseFloat(String(p));if(!Number.isNaN(m))return m}let u=Number.parseFloat(s.getPropertyValue(l));return Number.isNaN(u)?d:u},o=l=>{let d=r?.get?.(l),h=d&&typeof d=="object"&&"value"in d?d.value:d;return typeof h=="string"?h.trim()||void 0:s.getPropertyValue(l).trim()||void 0},a=(l,d=!1)=>{let h=o(l);if(!h)return d;let u=h.toLowerCase();return u==="true"||u==="1"||u==="yes"?!0:u==="false"||u==="0"||u==="no"?!1:d};return{translateZ:n("--translate-z",0),cssScale:n("--scale",1),rotateX:n("--rotate-x",0),rotateY:n("--rotate-y",0),rotateZ:n("--rotate-z",0),cssScaleZ:n("--scale-z",1),opacity:n("--opacity",NaN),color:o("--material-color"),metalness:n("--material-metalness",NaN),roughness:n("--material-roughness",NaN),emissive:o("--material-emissive"),castShadow:a("--shadow-cast",!1),receiveShadow:a("--shadow-receive",!1),geometryQuality:n("--geometry-quality",1)}})}readLayout(e,t){let i=e.__layoutCache;return i||X.layoutCache.get(e,t,r=>{let s=r.getBoundingClientRect(),n=r.offsetWidth||s.width,o=r.offsetHeight||s.height;return{rect:s,width:n,height:o}})}};X.styleCache=new ne,X.layoutCache=new ne,X.tempVector3=null,X.lastVisualProps=new WeakMap,X.lastGeometryQuality=new WeakMap,X.originalGeometryByMesh=new WeakMap,X.lodGeometryCacheByMesh=new WeakMap;var ce=X;var ct=Math.PI/180,N={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},ee=class ee{sync(e,t,i,r){let s=e.__layoutCache,n=s?s.rect:e.getBoundingClientRect(),o=this.readStyleBundle(e,i),a=n.left+n.width*.5,l=n.top+n.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set(a-i.viewportWidth/2,-(l-i.viewportHeight/2),o.translateZ);else{let y=i.camera.getFrustumSizeAt(o.translateZ),b=a/i.viewportWidth,v=l/i.viewportHeight;t.object.position.set((b-.5)*y.width,-(v-.5)*y.height,o.translateZ)}let d=r?.scale??1,h=o.scale*d;t.object.scale.set(h,h,h),t.object.rotation.x=-o.rotateX*ct,t.object.rotation.y=o.rotateY*ct,t.object.rotation.z=-o.rotateZ*ct,t.object.rotation.order="XYZ";let u=this.buildConfig(o,n,i,r),p=ee.lastConfig.get(t),m=t.object;(!p||!this.isSameConfig(p,u))&&(ee.lastConfig.set(t,u),m.setConfig?.(u)),this.updateMaterialOverrides(e,t,i,o),this.updateCustomUniforms(e,t,i);let f=performance.now(),g=ee.lastTime.get(t)??f,S=Math.max(0,(f-g)/1e3);return ee.lastTime.set(t,f),m.update?.(S),{scale:r?.scale??1}}readStyleBundle(e,t){return ee.styleCache.get(e,t,i=>{let r=new Me(i),n=r.readString("--particles-mode",N.mode).toLowerCase()==="instanced"?"instanced":"emitter";return{...N,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:n,count:r.readNumber("--particles-count",N.count),size:r.readNumber("--particles-size",N.size),color:r.readString("--particles-color",N.color),opacity:r.readNumber("--particles-opacity",N.opacity),spread:r.readNumber("--particles-spread",N.spread),seed:r.readNumber("--particles-seed",N.seed),emitRate:r.readNumber("--emit-rate",N.emitRate),emitBurst:r.readNumber("--emit-burst",N.emitBurst),particleLife:r.readNumber("--particle-life",N.particleLife),particleSpeed:r.readNumber("--particle-speed",N.particleSpeed),particleDirection:this.parseVec3(r.readString("--particle-direction","0 1 0"),N.particleDirection),particleGravity:this.parseVec3(r.readString("--particle-gravity","0 -30 0"),N.particleGravity),particleDrag:r.readNumber("--particle-drag",N.particleDrag),particleSizeVariation:r.readNumber("--particle-size-variation",N.particleSizeVariation),particleColorVariation:r.readNumber("--particle-color-variation",N.particleColorVariation),particleShape:this.parseShape(r.readString("--particles-shape",N.particleShape)),particleModelUrl:r.readString("--particles-model",N.particleModelUrl),particleModelLoader:r.readString("--particles-model-loader",N.particleModelLoader),particleModelNode:r.readString("--particles-model-node",N.particleModelNode),instanceShape:this.parseDistribution(r.readString("--instance-shape",N.instanceShape)),instanceModelUrl:r.readString("--instance-model",N.instanceModelUrl),instanceModelLoader:r.readString("--instance-model-loader",N.instanceModelLoader),instanceModelNode:r.readString("--instance-model-node",N.instanceModelNode),instanceScale:r.readNumber("--instance-scale",N.instanceScale),instanceScaleVariation:r.readNumber("--instance-scale-variation",N.instanceScaleVariation),instanceRotationSpeed:r.readNumber("--instance-rotation-speed",N.instanceRotationSpeed),instanceJitter:r.readNumber("--instance-jitter",N.instanceJitter),instanceFlow:r.readNumber("--instance-flow",N.instanceFlow),instanceDisperse:r.readNumber("--instance-disperse",N.instanceDisperse),instanceDisperseScatter:r.readNumber("--instance-scatter",N.instanceDisperseScatter),instanceDisperseScatterX:r.readNumber("--instance-scatter-x",N.instanceDisperseScatterX),instanceDisperseScatterY:r.readNumber("--instance-scatter-y",N.instanceDisperseScatterY),instanceDisperseScatterZ:r.readNumber("--instance-scatter-z",N.instanceDisperseScatterZ),modelTransitionDuration:this.getTransitionDuration(i,"--instance-model")}})}getTransitionDuration(e,t){let i=getComputedStyle(e),r=this.splitTransitionList(i.transitionProperty),s=this.splitTransitionList(i.transitionDuration),n=this.findTransitionIndex(r,t);if(n===-1){let o=this.parseTransitionShorthand(i.transition),a=o.get(t)||o.get("all");return a?a.duration:0}return this.parseTime(s[n]||s[s.length-1]||"0s")}splitTransitionList(e){let t=[],i="",r=0;for(let s=0;s<e.length;s+=1){let n=e[s];n==="("&&(r+=1),n===")"&&(r=Math.max(0,r-1)),n===","&&r===0?(t.push(i.trim()),i=""):i+=n}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),n="",o="";s.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"||n||(n=a)}),n&&t.set(n.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 n=r?.scale??1,o=.5,a,l,d;return e.particlesFit?(l=this.toWorld(t.width*o,e.translateZ,i),d=this.toWorld(t.height*o,e.translateZ,i),a=Math.max(l,d)):(a=this.toWorld(e.spread,e.translateZ,i),l=a,d=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*n),spreadX:Math.max(0,l*n),spreadY:Math.max(0,d*n),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 s=t.object,o=(r.materialType||"basic").split("[")[0].trim().toLowerCase(),l=(i.engine.getCustomMaterialRegistry?.()||pe).get(o),d=i.engine.getMaterialFactory?.();if(!l||!d||!d.supports(l)){if(!(ee.materialInstances.has(t)||ee.lastMaterialType.has(t)))return;let p=ee.materialInstances.get(t);p&&(p.dispose(),ee.materialInstances.delete(t)),ee.lastMaterialType.delete(t),s.setMaterial?.(null,{points:!0,meshes:!0});return}if(ee.lastMaterialType.get(t)!==o){let u=ee.materialInstances.get(t);u&&u.dispose();let p=getComputedStyle(e),m=d.parseUniformsFromCSS(l,e,p),f=d.create(l,m);ee.materialInstances.set(t,f),ee.lastMaterialType.set(t,o);let g=f.material,S=d.isShaderMaterial?.(g)??!!g?.isShaderMaterial;s.setMaterial?.(g,{meshes:!0,points:!1}),s.setMaterial?.(S?g:null,{meshes:!1,points:!0})}}updateCustomUniforms(e,t,i){let r=i.engine.getMaterialFactory?.();if(!r)return;let s=getComputedStyle(e),n=o=>{let a=r.getMaterialDefinition?.(o)??o?.userData?.definition;if(!a?.uniforms)return;let l=r.parseUniformsFromCSS(a,e,s);if(typeof r.applyUniforms=="function"){r.applyUniforms(o,a,l);return}for(let[d,h]of Object.entries(l)){let u=a.uniforms?.[d];if(!u)continue;let p=r.convertUniformValue?.bind(r),m=p?p(u.type,h):h;o.uniforms?.[d]&&(o.uniforms[d].value=m)}};i.engine.forEachMaterial(t.object,n)}};ee.styleCache=new ne,ee.lastConfig=new WeakMap,ee.lastTime=new WeakMap,ee.lastMaterialType=new WeakMap,ee.materialInstances=new WeakMap;var Ge=ee;var me=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}};me.fonts=new Map,me.defaultFont=null;var ht=null,Fe=null,ut=null,Le=null;async function $t(){return Fe||(ht||(ht=(async()=>typeof window<"u"&&window.opentype?(Fe=window.opentype,Fe):new Promise((c,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,c(Fe)},t.onerror=()=>e(new Error("[FontConverter] Failed to load opentype.js")),document.head.appendChild(t)}))()),ht)}async function Wt(){return Le||(ut||(ut=(async()=>typeof window<"u"&&window.Module?.decompress?(Le=window.Module,Le):new Promise((c,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 n=window;n.Module?.decompress?(Le=n.Module,c(Le)):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)}))()),ut)}async function Ut(c){let e=await Wt(),t=new Uint8Array(c),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 Gt(c){return new DataView(c).getUint32(0,!1)===2001684018}var Se=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 n=await s;return this.cache.set(t,n),n}finally{this.loadingPromises.delete(t)}}static async doLoad(e,t){let i=await $t(),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");Gt(r)&&(r=await Ut(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,n]of Object.entries(r)){let o=Number(s);if(!Number.isFinite(o))continue;let a=e.glyphs.get(n);if(!a)continue;let l=a.getPath(0,0,e.unitsPerEm),d=this.pathToOutline(l,t),h=a.advanceWidth??a.xMax??e.unitsPerEm*.5,u=String.fromCharCode(o);i[u]||(i[u]={ha:Math.round(h*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:d})}else for(let s=0;s<e.glyphs.length;s++){let n=e.glyphs.get(s),o=Array.isArray(n.unicodes)?n.unicodes:n.unicode?[n.unicode]:[];if(o.length===0)continue;let a=n.getPath(0,0,e.unitsPerEm),l=this.pathToOutline(a,t),d=n.advanceWidth??n.xMax??e.unitsPerEm*.5;o.forEach(h=>{if(!Number.isFinite(h))return;let u=String.fromCharCode(h);i[u]||(i[u]={ha:Math.round(d*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: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()}};Se.cache=new Map,Se.loadingPromises=new Map;var dt=Math.PI/180,qt=`
3
3
  [data-string3d-text] {
4
4
  -webkit-text-fill-color: transparent;
5
5
  }
@@ -27,9 +27,9 @@
27
27
  transform-style: preserve-3d;
28
28
  transform-origin: center center;
29
29
  }
30
- `,L=class L{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=kt,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",n=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)`:"",s!=="0"?`rotateY(${s}deg)`:"",n!=="0"?`rotateZ(${n}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(s=>{let n=e.textContent||"";if(n===i)return;i=n;let o=t();o&&(this.geometryKeys.delete(o),this.layoutCache.invalidate(e),e.dataset.string3dText!==n&&(e.dataset.string3dText=n))});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){L.injectPseudoElementStyles(),L.setupSelectableText(e),L.setupContentObserver(e,()=>i.scene?.getObjectForElement(e)||t);let{rect:s,width:n,height:o}=this.readLayout(e,i),a=this.readStyleBundle(e,i),{translateZ:l,cssScale:h,rotateX:c,rotateY:u,rotateZ:d,cssScaleZ:m,opacity:g,color:f,metalness:S,roughness:y,emissive:b,castShadow:v,receiveShadow:w,materialType:P,fontFamily:T,fontSize:R,textTransform:E,textDepth:x,textCurveSegments:D,bevelEnabled:O,bevelSize:N,bevelThickness:H,bevelOffset:_,bevelSegments:G,fontCss:$}=a,B=s.left+s.width*.5,C=s.top+s.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set(B-i.viewportWidth/2,-(C-i.viewportHeight/2),l);else{let V=i.camera.getFrustumSizeAt(l),Y=B/i.viewportWidth,oe=C/i.viewportHeight;t.object.position.set((Y-.5)*V.width,-(oe-.5)*V.height,l)}t.object.rotation.x=-c*at,t.object.rotation.y=u*at,t.object.rotation.z=-d*at,t.object.rotation.order="XYZ";let M=this.extractCharacterLayout(e,E),k=this.extractRawText(e,E)||M.map(V=>V.char).join(""),I=this.getTextMesh(t,i);if(!I)return{scale:h*(r?.scale||1)};if(M.length===0)return I.visible=!1,{scale:h*(r?.scale||1)};if(g===0)return t.object.visible=!1,{scale:h*(r?.scale||1)};t.object.visible=!0,I.visible=!0;let j=se.resolveFontFamily(T||"");if(!j)return L.warnedMissingFont||(L.warnedMissingFont=!0),{scale:h*(r?.scale||1)};if(!i.engine.loadFont||!i.engine.createTextGeometry)return L.warnedMissingLoader||(L.warnedMissingLoader=!0),{scale:h*(r?.scale||1)};let U=j.url,Z=L.fontCache.get(U);if(!Z){if(L.markObjectPendingFont(U,t),!L.fontPromises.has(U)){let V=i.engine.loadFont(U).then(Y=>(Y&&(L.fontCache.set(U,Y),L.invalidatePendingObjects(U)),Y));L.fontPromises.set(U,V)}return I.visible=!1,{scale:h*(r?.scale||1)}}L.clearObjectPendingFont(U,t);let X=M.length>0?`${M.length}:${M[0].x.toFixed(1)},${M[0].y.toFixed(1)}:${M[M.length-1].x.toFixed(1)},${M[M.length-1].y.toFixed(1)}`:"empty",K=i.engine.getTextGeometryLayoutSignature?.({text:k,layoutSignature:X,layout:M,elementWidth:s.width,elementHeight:s.height,fontSize:R})||X,q=[k,R.toFixed(3),$||"",s.width.toFixed(1),s.height.toFixed(1),K,x.toFixed(3),D.toFixed(3),O?"1":"0",N.toFixed(3),H.toFixed(3),_.toFixed(3),G.toFixed(3)].join("|");if(L.geometryKeys.get(t)!==q){let V=i.engine.createTextGeometry(k,Z,{size:R,height:x,curveSegments:Math.max(1,Math.round(D)),bevelEnabled:O,bevelThickness:H,bevelSize:N,bevelOffset:_,bevelSegments:Math.max(0,Math.round(G)),lineHeight:0,letterSpacing:0,align:"left",layout:M,elementWidth:s.width,elementHeight:s.height});V&&(V.computeBoundingBox(),i.engine.applyTextGeometryToMesh(I,V)||(I.geometry&&I.geometry.dispose?.(),I.geometry=V),t.geometry=V,L.geometryKeys.set(t,q))}let fe=r?.scale||1,ye=i.camera.getMode()==="orthographic"?1:i.camera.getScaleAtZ(l,i.viewportHeight),ne=h*fe*ye,be=ne*m;t.object.scale.set(ne,ne,be);let ve=-n*.5,pe=o*.5;I.position.set(ve,pe,0);let ae=L.lastMaterialType.get(t);if(ae!==void 0&&ae!==P){let V=i.scene;V&&requestAnimationFrame(()=>{V.recreateMaterialForObject(t,e)})}return L.lastMaterialType.set(t,P),de.applyVisualProps(e,t,i.engine,{opacity:g,color:f&&f!=="none"?f:void 0,metalness:Number.isFinite(S)?S:void 0,roughness:Number.isFinite(y)?y:void 0,emissive:de.resolveEmissiveValue(e,b),castShadow:v,receiveShadow:w}),this.updateCustomUniforms(e,t,i),{scale:ne}}cleanup(e,t){L.cleanupContentObserver(e),L.geometryKeys.delete(t)}extractCharacterLayout(e,t){let i=[];if(typeof document>"u"||!document.createRange)return i;let r=document.createRange(),s=e.getBoundingClientRect(),n=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),o;for(;o=n.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],d=u.left-s.left,m=u.top-s.top,g=this.applyTextTransform(h,t);i.push({char:g,x:d,y:m,width:u.width,height:u.height})}}}return i}extractRawText(e,t){let r=Array.from(e.childNodes).filter(s=>s.nodeType===Node.TEXT_NODE).map(s=>s.textContent||"").join("").split(/\r?\n/).map(s=>s.trim()).filter(s=>s.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 s=getComputedStyle(e),n=o=>{let a=r.getMaterialDefinition?.(o)??o?.userData?.definition;if(!a?.uniforms)return;let l=r.parseUniformsFromCSS(a,e,s);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 d=r.convertUniformValue?.bind(r),m=d?d(u.type,c):c;o.uniforms?.[h]&&(o.uniforms[h].value=m)}};i.engine.forEachMaterial(t.object,n)}readStyleBundle(e,t){return L.styleCache.get(e,t,i=>{let r=i.computedStyleMap?.(),s=getComputedStyle(i),n=(E,x)=>{let D=r?.get?.(E);if(D!=null){let H=typeof D=="object"&&"value"in D?D.value:D,_=typeof H=="number"?H:Number.parseFloat(String(H));if(!Number.isNaN(_))return _}let O=s.getPropertyValue(E),N=Number.parseFloat(O);return Number.isNaN(N)?x:N},o=(E,x="")=>{let D=r?.get?.(E),O=D&&typeof D=="object"&&"value"in D?D.value:D;return typeof O=="string"?O.trim()||x:s.getPropertyValue(E).trim()||x},a=(E,x=!1)=>{let D=o(E);if(!D)return x;let O=D.toLowerCase();return O==="true"||O==="1"||O==="yes"?!0:O==="false"||O==="0"||O==="no"?!1:x},l=o("--material-color"),h=l&&l!=="none"?l:s.color.trim(),c=(()=>{let E=s.fontSize||"",x=Number.parseFloat(E);return Number.isFinite(x)?x:16})(),u=(()=>{let E=s.lineHeight||"";if(!E||E==="normal")return c*1.2;let x=Number.parseFloat(E);return Number.isFinite(x)?E.endsWith("px")?x:x*c:c*1.2})(),d=(()=>{let E=s.letterSpacing||"";if(!E||E==="normal")return 0;let x=Number.parseFloat(E);return Number.isFinite(x)?x:0})(),m=o("--text-fit")||"none",g=n("--text-depth",NaN),f=Number.isFinite(g)?g:Math.max(1,c*.2),S=n("--text-bevel-size",0),y=n("--text-bevel-thickness",0),b=n("--text-bevel-offset",0),v=n("--text-bevel-steps",0),w=(s.textAlign||"left").toLowerCase(),P=w==="center"?"center":w==="right"||w==="end"?"right":"left",T=s.font?.trim(),R=T&&T.length>0?T:[s.fontStyle||"normal",s.fontWeight||"normal",`${s.fontSize||"16px"}/${s.lineHeight||"normal"}`,s.fontFamily||"sans-serif"].join(" ");return{translateZ:n("--translate-z",0),cssScale:n("--scale",1),rotateX:n("--rotate-x",0),rotateY:n("--rotate-y",0),rotateZ:n("--rotate-z",0),cssScaleZ:n("--scale-z",1),opacity:n("--opacity",NaN),color:h,metalness:n("--material-metalness",NaN),roughness:n("--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:s.fontFamily||"",fontCss:R,fontSize:c,lineHeight:u,letterSpacing:d,textAlign:P,textTransform:(s.textTransform||"").toLowerCase(),textDepth:f,textCurveSegments:n("--text-curve-segments",8),bevelEnabled:S>0||y>0,bevelSize:S,bevelThickness:y,bevelOffset:b,bevelSegments:v,textFit:m==="cover"||m==="none"?m:"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||L.layoutCache.get(e,t,r=>{let s=r.getBoundingClientRect();return{rect:s,width:s.width,height:s.height}})}};L.styleCache=new J,L.layoutCache=new J,L.geometryKeys=new WeakMap,L.lastMaterialType=new WeakMap,L.fontCache=new Map,L.fontPromises=new Map,L.pendingFontObjects=new Map,L.contentObservers=new WeakMap,L.warnedMissingFont=!1,L.warnedMissingLoader=!1,L.pseudoStyleInjected=!1;var _e=L;var Te=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 Ne),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 Be),this.strategies.set("text",new _e)}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,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 We=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 $e=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 s=[],n=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,d=this.filterStates.get(a)?.effectsKey||this.stringifyFilterChain(c);s.push({object:o,effects:c,effectsKey:d,dirty:u});return}}o.children.forEach(l=>n(l))};return e.forEach(o=>n(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=dt(e);if(!s||s==="none"){if(r){if(r.animating&&r.clearOnComplete){let g=this.sampleTransition(r,t);return r.animating?g:(this.filterStates.delete(e),null)}let{duration:u,delay:d,easing:m}=this.getFilterTransition(e);if(u<=0&&r.lastDuration>0&&(u=r.lastDuration,d=r.lastDelay,m=r.lastEasing),u>0){let g=this.makeZeroChain(r.effects);return r.from=r.effects,r.to=g,r.startTime=t+d,r.duration=u,r.easing=m,r.animating=!0,r.clearOnComplete=!0,r.lastDuration=u,r.lastDelay=d,r.lastEasing=m,this.sampleTransition(r,t)}}return this.filterStates.delete(e),null}let{effects:n,warnings:o}=this.parseFilterChain(s);if(this.warnFilterIssues(e,s,o),n.length===0)return null;let a=this.filterStates.get(e);if(!a){let{duration:u,delay:d,easing:m}=this.getFilterTransition(e);if(u>0){let g=this.makeZeroChain(n),f={raw:s,effects:n,animating:!0,from:g,to:n,startTime:t+d,duration:u,easing:m,clearOnComplete:!1,lastDuration:u,lastDelay:d,lastEasing:m};return f.effectsKey=this.stringifyFilterChain(n),this.filterStates.set(e,f),this.sampleTransition(f,t)}return this.filterStates.set(e,{raw:s,effects:n,animating:!1,from:n,to:n,startTime:0,duration:0,easing:g=>g,clearOnComplete:!1,lastDuration:0,lastDelay:0,lastEasing:g=>g,effectsKey:this.stringifyFilterChain(n)}),n}if(a.raw===s){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,n),d=a.animating?this.getCurrentChain(a,t):a.effects;if(!u&&this.isZeroChain(n))return a.pendingRaw=s,a.pendingEffects=n,a.raw=s,a.effects=d,a.from=d,a.to=this.makeZeroChain(d),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(n),this.sampleTransition(a,t);let m=u?d:this.makeZeroChain(n);return a.raw=s,a.effects=n,a.from=m,a.to=n,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(n),this.sampleTransition(a,t)}return a.raw=s,a.effects=n,a.animating=!1,a.clearOnComplete=!1,a.effectsKey=this.stringifyFilterChain(n),n}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 m=u.trim().toLowerCase().match(/^(-?\d*\.?\d+)(px)?$/);if(!m)return null;let g=Number.parseFloat(m[1]);return Number.isFinite(g)?g:null},s=u=>{let d=u.trim().toLowerCase();if(!d)return null;if(d.endsWith("%")){let g=Number.parseFloat(d.slice(0,-1));return Number.isFinite(g)?g/100:null}let m=Number.parseFloat(d);return Number.isFinite(m)?m:null},n=u=>{let d=u.trim().toLowerCase();if(!d)return null;if(d.endsWith("rad")){let f=Number.parseFloat(d.slice(0,-3));return Number.isFinite(f)?f:null}let m=d.endsWith("deg")?d.slice(0,-3):d,g=Number.parseFloat(m);return Number.isFinite(g)?g*Math.PI/180:null},o=u=>{let d=u.split(",").map(f=>f.trim()),m=r(d[0]||"");if(m===null)return null;let g=d[1]?s(d[1]):null;return{intensity:Math.max(0,m),threshold:g===null?.8:Math.max(0,Math.min(1,g))}},a=(u,d,m=!1)=>{let g=r(u);return g===null?(t.push(`[String3D] Invalid ${d} value "${u}".`),null):!m&&g<=0?(t.push(`[String3D] ${d} must be > 0.`),null):g},l=(u,d)=>{let m=s(u);return m===null?(t.push(`[String3D] Invalid ${d} value "${u}".`),null):m},h=/([a-zA-Z-]+)\(([^)]*)\)/g,c;for(;c=h.exec(e);){let u=c[1].toLowerCase(),d=(c[2]||"").trim();if(u==="blur"){let m=a(d,"blur",!0);m!==null&&i.push({type:"blur",amount:m})}else if(u==="pixel"||u==="pixelate"){let m=a(d,"pixel",!0);m!==null&&i.push({type:"pixel",size:m})}else if(u==="bloom"){let m=o(d);m?i.push({type:"bloom",...m}):t.push(`[String3D] Invalid bloom value "${d}".`)}else if(u==="brightness"){let m=l(d,"brightness");m!==null&&i.push({type:"brightness",amount:Math.max(0,m)})}else if(u==="contrast"){let m=l(d,"contrast");m!==null&&i.push({type:"contrast",amount:Math.max(0,m)})}else if(u==="saturate"){let m=l(d,"saturate");m!==null&&i.push({type:"saturate",amount:Math.max(0,m)})}else if(u==="grayscale"){let m=l(d,"grayscale");m!==null&&i.push({type:"grayscale",amount:Math.max(0,Math.min(1,m))})}else if(u==="sepia"){let m=l(d,"sepia");m!==null&&i.push({type:"sepia",amount:Math.max(0,Math.min(1,m))})}else if(u==="invert"){let m=l(d,"invert");m!==null&&i.push({type:"invert",amount:Math.max(0,Math.min(1,m))})}else if(u==="hue-rotate"){let m=n(d);m!==null?i.push({type:"hue-rotate",angle:m}):t.push(`[String3D] Invalid hue-rotate value "${d}".`)}else if(u){let m=this.customFilterRegistry.get(u);if(m){let g=m.parse?m.parse(d):{};g===null?t.push(`[String3D] Invalid custom filter "${u}" args "${d}".`):i.push({type:"custom",name:u,uniforms:g})}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),n=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:d=>d}}let a=this.parseTime(r[o]||r[r.length-1]||"0s"),l=this.parseTime(s[o]||s[s.length-1]||"0s"),h=n[o]||n[n.length-1]||"linear";return{duration:a,delay:l,easing:this.parseEasing(h)}}splitTransitionList(e){let t=[],i="",r=0;for(let s=0;s<e.length;s+=1){let n=e[s];n==="("&&(r+=1),n===")"&&(r=Math.max(0,r-1)),n===","&&r===0?(t.push(i.trim()),i=""):i+=n}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),n="",o="",a="",l="";s.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:n||(n=h)}),n&&t.set(n.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 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 n=Object.keys(i.uniforms||{}),o=Object.keys(s.uniforms||{});return n.length!==o.length?!1:n.every(a=>a in(s.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,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)),n=e.easing(s),o=this.interpolateChain(e.from,e.to,n);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)),n=e.easing(s);return this.interpolateChain(e.from,e.to,n)}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,n)=>s+(n-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(([n,o])=>{let a=e.uniforms?.[n];this.isNumeric(a)&&this.isNumeric(o)?s[n]=r(a,o):s[n]=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 ke{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 We(["style","class","string-3d","string-3d-model-fit","string-3d-model-scale"]),this.filterController=new $e(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={}){se.register(t,i),r.default&&se.setDefault(t)}static setDefaultFont(t){se.setDefault(t)}canConnect(t){return super.canConnect(t)}initializeObject(t,i,r,s){super.initializeObject(t,i,r,s),i.setProperty("parentId",null);let n=r.parentElement?.closest('[string-3d="group"]');if(n){let o=n.getAttribute("string-id");o&&(i.setProperty("parentId",o),i.setProperty("parent",n))}}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 Ee(this.canvasContainer,this.engine),this.renderer.attach(),this.camera=new we(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 Ce(this.engine,{modelLoader:i,modelLoaderFactory:r}),this._scene.getScene().add(this.camera.camera),this.synchronizer=new Te(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(n=>{this.syncRecursive(n.el,n,{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=n=>{if(n.el&&(i||!r||r.has(n.el))){let a=n.el.getBoundingClientRect(),l=n.el.offsetWidth||a.width,h=n.el.offsetHeight||a.height;n.el.__layoutCache={rect:a,width:l,height:h}}n.children.forEach(s)};t.forEach(s)}syncRecursive(t,i,r,s,n){if(!this.synchronizer||!t)return;let o=i.type==="particles"||i.type==="text"||s||!n||n.has(t),a=r;if(o){let h=this.synchronizer.syncElement(t,i,r,{dirtySet:n,forceSync:s});h&&typeof h.scale=="number"&&(this.lastSyncData.set(i,h),a=h)}else{let h=this.lastSyncData.get(i);h&&(a=h)}let l=s||o;i.children.forEach(h=>this.syncRecursive(h.el,h,a,l,n))}injectCSS(){if(document.getElementById("string-3d-styles"))return;let t=document.createElement("style");t.id="string-3d-styles",t.textContent=`
30
+ `,V=class V{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=qt,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",n=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",d=i.getPropertyValue("--scale").trim()||"1",h=[o!=="0px"&&o!=="0"?`translateX(${o})`:"",a!=="0px"&&a!=="0"?`translateY(${a})`:"",l!=="0px"&&l!=="0"?`translateZ(${l})`:"",r!=="0"?`rotateX(${r}deg)`:"",s!=="0"?`rotateY(${s}deg)`:"",n!=="0"?`rotateZ(${n}deg)`:"",d!=="1"?`scale(${d})`:""].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 n=e.textContent||"";if(n===i)return;i=n;let o=t();o&&(this.geometryKeys.delete(o),this.layoutCache.invalidate(e),e.dataset.string3dText!==n&&(e.dataset.string3dText=n))});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){V.injectPseudoElementStyles(),V.setupSelectableText(e),V.setupContentObserver(e,()=>i.scene?.getObjectForElement(e)||t);let{rect:s,width:n,height:o}=this.readLayout(e,i),a=this.readStyleBundle(e,i),{translateZ:l,cssScale:d,rotateX:h,rotateY:u,rotateZ:p,cssScaleZ:m,opacity:f,color:g,metalness:S,roughness:y,emissive:b,castShadow:v,receiveShadow:w,materialType:C,fontFamily:T,fontSize:I,textTransform:E,textDepth:M,textCurveSegments:D,bevelEnabled:O,bevelSize:k,bevelThickness:$,bevelOffset:G,bevelSegments:H,fontCss:B}=a,W=s.left+s.width*.5,P=s.top+s.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set(W-i.viewportWidth/2,-(P-i.viewportHeight/2),l);else{let z=i.camera.getFrustumSizeAt(l),q=W/i.viewportWidth,ge=P/i.viewportHeight;t.object.position.set((q-.5)*z.width,-(ge-.5)*z.height,l)}t.object.rotation.x=-h*dt,t.object.rotation.y=u*dt,t.object.rotation.z=-p*dt,t.object.rotation.order="XYZ";let x=this.extractCharacterLayout(e,E),L=this.extractRawText(e,E)||x.map(z=>z.char).join(""),F=this.getTextMesh(t,i);if(!F)return{scale:d*(r?.scale||1)};if(x.length===0)return F.visible=!1,{scale:d*(r?.scale||1)};if(f===0)return t.object.visible=!1,{scale:d*(r?.scale||1)};t.object.visible=!0,F.visible=!0;let j=me.resolveFontFamily(T||"");if(!j)return V.warnedMissingFont||(V.warnedMissingFont=!0),{scale:d*(r?.scale||1)};if(!i.engine.loadFont||!i.engine.createTextGeometry)return V.warnedMissingLoader||(V.warnedMissingLoader=!0),{scale:d*(r?.scale||1)};let U=j.url,_=V.fontCache.get(U);if(!_){if(V.markObjectPendingFont(U,t),!V.fontPromises.has(U)){let z=i.engine.loadFont(U).then(q=>(q&&(V.fontCache.set(U,q),V.invalidatePendingObjects(U)),q));V.fontPromises.set(U,z)}return F.visible=!1,{scale:d*(r?.scale||1)}}V.clearObjectPendingFont(U,t);let Q=x.length>0?`${x.length}:${x[0].x.toFixed(1)},${x[0].y.toFixed(1)}:${x[x.length-1].x.toFixed(1)},${x[x.length-1].y.toFixed(1)}`:"empty",Z=i.engine.getTextGeometryLayoutSignature?.({text:L,layoutSignature:Q,layout:x,elementWidth:s.width,elementHeight:s.height,fontSize:I})||Q,K=[L,I.toFixed(3),B||"",s.width.toFixed(1),s.height.toFixed(1),Z,M.toFixed(3),D.toFixed(3),O?"1":"0",k.toFixed(3),$.toFixed(3),G.toFixed(3),H.toFixed(3)].join("|");if(V.geometryKeys.get(t)!==K){let z=i.engine.createTextGeometry(L,_,{size:I,height:M,curveSegments:Math.max(1,Math.round(D)),bevelEnabled:O,bevelThickness:$,bevelSize:k,bevelOffset:G,bevelSegments:Math.max(0,Math.round(H)),lineHeight:0,letterSpacing:0,align:"left",layout:x,elementWidth:s.width,elementHeight:s.height});z&&(z.computeBoundingBox(),i.engine.applyTextGeometryToMesh(F,z)||(F.geometry&&F.geometry.dispose?.(),F.geometry=z),t.geometry=z,V.geometryKeys.set(t,K))}let ae=r?.scale||1,le=i.camera.getMode()==="orthographic"?1:i.camera.getScaleAtZ(l,i.viewportHeight),Y=d*ae*le,te=Y*m;t.object.scale.set(Y,Y,te);let ie=-n*.5,re=o*.5;F.position.set(ie,re,0);let se=V.lastMaterialType.get(t);if(se!==void 0&&se!==C){let z=i.scene;z&&requestAnimationFrame(()=>{z.recreateMaterialForObject(t,e)})}return V.lastMaterialType.set(t,C),ce.applyVisualProps(e,t,i.engine,{opacity:f,color:g&&g!=="none"?g:void 0,metalness:Number.isFinite(S)?S:void 0,roughness:Number.isFinite(y)?y:void 0,emissive:ce.resolveEmissiveValue(e,b),castShadow:v,receiveShadow:w}),this.updateCustomUniforms(e,t,i),{scale:Y}}cleanup(e,t){V.cleanupContentObserver(e),V.geometryKeys.delete(t)}extractCharacterLayout(e,t){let i=[];if(typeof document>"u"||!document.createRange)return i;let r=document.createRange(),s=e.getBoundingClientRect(),n=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),o;for(;o=n.nextNode();){let a=o.textContent||"";if(!(!a.trim()&&a!==" "))for(let l=0;l<a.length;l++){let d=a[l];if(d===`
31
+ `||d==="\r"||!d.trim())continue;r.setStart(o,l),r.setEnd(o,l+1);let h=r.getClientRects();if(h.length>0){let u=h[0],p=u.left-s.left,m=u.top-s.top,f=this.applyTextTransform(d,t);i.push({char:f,x:p,y:m,width:u.width,height:u.height})}}}return i}extractRawText(e,t){let r=Array.from(e.childNodes).filter(s=>s.nodeType===Node.TEXT_NODE).map(s=>s.textContent||"").join("").split(/\r?\n/).map(s=>s.trim()).filter(s=>s.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 s=getComputedStyle(e),n=o=>{let a=r.getMaterialDefinition?.(o)??o?.userData?.definition;if(!a?.uniforms)return;let l=r.parseUniformsFromCSS(a,e,s);if(typeof r.applyUniforms=="function"){r.applyUniforms(o,a,l);return}for(let[d,h]of Object.entries(l)){let u=a.uniforms?.[d];if(!u)continue;let p=r.convertUniformValue?.bind(r),m=p?p(u.type,h):h;o.uniforms?.[d]&&(o.uniforms[d].value=m)}};i.engine.forEachMaterial(t.object,n)}readStyleBundle(e,t){return V.styleCache.get(e,t,i=>{let r=i.computedStyleMap?.(),s=getComputedStyle(i),n=(E,M)=>{let D=r?.get?.(E);if(D!=null){let $=typeof D=="object"&&"value"in D?D.value:D,G=typeof $=="number"?$:Number.parseFloat(String($));if(!Number.isNaN(G))return G}let O=s.getPropertyValue(E),k=Number.parseFloat(O);return Number.isNaN(k)?M:k},o=(E,M="")=>{let D=r?.get?.(E),O=D&&typeof D=="object"&&"value"in D?D.value:D;return typeof O=="string"?O.trim()||M:s.getPropertyValue(E).trim()||M},a=(E,M=!1)=>{let D=o(E);if(!D)return M;let O=D.toLowerCase();return O==="true"||O==="1"||O==="yes"?!0:O==="false"||O==="0"||O==="no"?!1:M},l=o("--material-color"),d=l&&l!=="none"?l:s.color.trim(),h=(()=>{let E=s.fontSize||"",M=Number.parseFloat(E);return Number.isFinite(M)?M:16})(),u=(()=>{let E=s.lineHeight||"";if(!E||E==="normal")return h*1.2;let M=Number.parseFloat(E);return Number.isFinite(M)?E.endsWith("px")?M:M*h:h*1.2})(),p=(()=>{let E=s.letterSpacing||"";if(!E||E==="normal")return 0;let M=Number.parseFloat(E);return Number.isFinite(M)?M:0})(),m=o("--text-fit")||"none",f=n("--text-depth",NaN),g=Number.isFinite(f)?f:Math.max(1,h*.2),S=n("--text-bevel-size",0),y=n("--text-bevel-thickness",0),b=n("--text-bevel-offset",0),v=n("--text-bevel-steps",0),w=(s.textAlign||"left").toLowerCase(),C=w==="center"?"center":w==="right"||w==="end"?"right":"left",T=s.font?.trim(),I=T&&T.length>0?T:[s.fontStyle||"normal",s.fontWeight||"normal",`${s.fontSize||"16px"}/${s.lineHeight||"normal"}`,s.fontFamily||"sans-serif"].join(" ");return{translateZ:n("--translate-z",0),cssScale:n("--scale",1),rotateX:n("--rotate-x",0),rotateY:n("--rotate-y",0),rotateZ:n("--rotate-z",0),cssScaleZ:n("--scale-z",1),opacity:n("--opacity",NaN),color:d,metalness:n("--material-metalness",NaN),roughness:n("--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:s.fontFamily||"",fontCss:I,fontSize:h,lineHeight:u,letterSpacing:p,textAlign:C,textTransform:(s.textTransform||"").toLowerCase(),textDepth:g,textCurveSegments:n("--text-curve-segments",8),bevelEnabled:S>0||y>0,bevelSize:S,bevelThickness:y,bevelOffset:b,bevelSegments:v,textFit:m==="cover"||m==="none"?m:"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||V.layoutCache.get(e,t,r=>{let s=r.getBoundingClientRect();return{rect:s,width:s.width,height:s.height}})}};V.styleCache=new ne,V.layoutCache=new ne,V.geometryKeys=new WeakMap,V.lastMaterialType=new WeakMap,V.fontCache=new Map,V.fontPromises=new Map,V.pendingFontObjects=new Map,V.contentObservers=new WeakMap,V.warnedMissingFont=!1,V.warnedMissingLoader=!1,V.pseudoStyleInjected=!1;var qe=V;var Ye={a:1,b:0,c:0,d:1,e:0,f:0},Yt={displayNone:!1,visibilityHidden:!1,opacity:1,fill:"#000",fillOpacity:1};function xt(c){return c.a===1&&c.b===0&&c.c===0&&c.d===1&&c.e===0&&c.f===0}function Dt(c,e){return{a:c.a*e.a+c.c*e.b,b:c.b*e.a+c.d*e.b,c:c.a*e.c+c.c*e.d,d:c.b*e.c+c.d*e.d,e:c.a*e.e+c.c*e.f+c.e,f:c.b*e.e+c.d*e.f+c.f}}function Xt(c){let e={...Ye},t=c.match(/(\w+)\s*\(([^)]*)\)/g)||[];for(let i of t){let r=i.match(/(\w+)\s*\(([^)]*)\)/);if(!r)continue;let s=r[1],n=r[2].trim().split(/[\s,]+/).map(Number),o={...Ye};switch(s){case"translate":o={a:1,b:0,c:0,d:1,e:n[0]||0,f:n[1]||0};break;case"scale":{let a=n[0]??1,l=n[1]??a;o={a,b:0,c:0,d:l,e:0,f:0};break}case"rotate":{let a=(n[0]||0)*Math.PI/180,l=Math.cos(a),d=Math.sin(a),h=n[1]||0,u=n[2]||0;o={a:l,b:d,c:-d,d:l,e:h-l*h+d*u,f:u-d*h-l*u};break}case"matrix":n.length>=6&&(o={a:n[0],b:n[1],c:n[2],d:n[3],e:n[4],f:n[5]});break;case"skewX":{let a=(n[0]||0)*Math.PI/180;o={a:1,b:0,c:Math.tan(a),d:1,e:0,f:0};break}case"skewY":{let a=(n[0]||0)*Math.PI/180;o={a:1,b:Math.tan(a),c:0,d:1,e:0,f:0};break}}e=Dt(e,o)}return e}function Kt(c){let e=c.getAttribute("transform");return e?Xt(e):{...Ye}}function Zt(c){let e=new Map;if(!c)return e;for(let t of c.split(";")){let i=t.indexOf(":");if(i===-1)continue;let r=t.slice(0,i).trim().toLowerCase(),s=t.slice(i+1).trim();r&&e.set(r,s)}return e}function Ne(c,e){let t=Zt(c.getAttribute("style")).get(e);if(t!=null&&t!=="")return t;let i=c.getAttribute(e);return i!=null&&i!==""?i:null}function wt(c,e){if(c==null)return e;let t=c.trim();if(!t)return e;let i=parseFloat(t);return Number.isFinite(i)?i:e}function Ct(c,e){let t=(Ne(c,"display")||"").trim().toLowerCase(),i=(Ne(c,"visibility")||"").trim().toLowerCase(),r=wt(Ne(c,"opacity"),1),s=Ne(c,"fill")??e.fill,n=wt(Ne(c,"fill-opacity"),e.fillOpacity);return{displayNone:e.displayNone||t==="none",visibilityHidden:e.visibilityHidden||i==="hidden"||i==="collapse",opacity:e.opacity*Math.max(0,r),fill:s,fillOpacity:Math.max(0,n)}}function Qt(c,e,t){return!e||!e.trim()||c==="g"||c==="svg"||c==="symbol"||c==="a"||t.displayNone||t.visibilityHidden||t.opacity<=0||t.fillOpacity<=0?!1:t.fill.trim().toLowerCase()!=="none"}function Jt(c){let e=parseFloat(c.getAttribute("x")||"0"),t=parseFloat(c.getAttribute("y")||"0"),i=parseFloat(c.getAttribute("width")||"0"),r=parseFloat(c.getAttribute("height")||"0");if(i<=0||r<=0)return"";let s=parseFloat(c.getAttribute("rx")||""),n=parseFloat(c.getAttribute("ry")||""),o=isNaN(s)?isNaN(n)?0:n:s,a=isNaN(n)?o:n;if(o<=0&&a<=0)return`M ${e} ${t} H ${e+i} V ${t+r} H ${e} Z`;let l=Math.min(o,i/2),d=Math.min(a,r/2);return[`M ${e+l} ${t}`,`H ${e+i-l}`,`A ${l} ${d} 0 0 1 ${e+i} ${t+d}`,`V ${t+r-d}`,`A ${l} ${d} 0 0 1 ${e+i-l} ${t+r}`,`H ${e+l}`,`A ${l} ${d} 0 0 1 ${e} ${t+r-d}`,`V ${t+d}`,`A ${l} ${d} 0 0 1 ${e+l} ${t}`,"Z"].join(" ")}function ei(c){let e=parseFloat(c.getAttribute("cx")||"0"),t=parseFloat(c.getAttribute("cy")||"0"),i=parseFloat(c.getAttribute("r")||"0");return i<=0?"":`M ${e-i} ${t} A ${i} ${i} 0 0 1 ${e+i} ${t} A ${i} ${i} 0 0 1 ${e-i} ${t} Z`}function ti(c){let e=parseFloat(c.getAttribute("cx")||"0"),t=parseFloat(c.getAttribute("cy")||"0"),i=parseFloat(c.getAttribute("rx")||"0"),r=parseFloat(c.getAttribute("ry")||"0");return i<=0||r<=0?"":`M ${e-i} ${t} A ${i} ${r} 0 0 1 ${e+i} ${t} A ${i} ${r} 0 0 1 ${e-i} ${t} Z`}function Et(c,e){let t=(c.getAttribute("points")||"").trim();if(!t)return"";let i=t.split(/[\s,]+/).filter(Boolean),r=[];for(let s=0;s+1<i.length;s+=2)r.push(`${s===0?"M":"L"} ${i[s]} ${i[s+1]}`);return r.join(" ")+(e?" Z":"")}function ii(c){let e=c.getAttribute("x1")||"0",t=c.getAttribute("y1")||"0",i=c.getAttribute("x2")||"0",r=c.getAttribute("y2")||"0";return`M ${e} ${t} L ${i} ${r}`}function ri(c){switch(c.tagName.toLowerCase().replace(/^svg:/,"")){case"path":return c.getAttribute("d");case"rect":return Jt(c);case"circle":return ei(c);case"ellipse":return ti(c);case"polygon":return Et(c,!0);case"polyline":return Et(c,!1);case"line":return ii(c);default:return null}}function Pt(c,e,t,i){let r=c.tagName.toLowerCase().replace(/^svg:/,"");if(r==="defs"||r==="title"||r==="desc"||r==="style"||r==="script")return;let s=Kt(c),n=xt(s)?e:Dt(e,s),o=Ct(c,t),a=ri(c);if(Qt(r,a,o)){let l=a.trim();i.push({d:l,transform:xt(n)?null:n})}if(r==="g"||r==="svg"||r==="symbol"||r==="a"||a===null)for(let l of Array.from(c.children))Pt(l,n,o,i)}function si(c){let e=c.getAttribute("viewBox");if(e){let r=e.trim().split(/[\s,]+/).map(Number);if(r.length>=4&&r[2]>0&&r[3]>0)return{x:r[0],y:r[1],width:r[2],height:r[3]}}let t=parseFloat(c.getAttribute("width")||"0"),i=parseFloat(c.getAttribute("height")||"0");return t>0&&i>0?{x:0,y:0,width:t,height:i}:null}var Ee=class c{static fromElement(e){let t=si(e),i=t?.width||parseFloat(e.getAttribute("width")||"0")||100,r=t?.height||parseFloat(e.getAttribute("height")||"0")||100,s=[];for(let n of Array.from(e.children))Pt(n,{...Ye},Ct(e,Yt),s);return{paths:s,viewBox:t,naturalWidth:i,naturalHeight:r}}static fromString(e){if(typeof DOMParser>"u")return null;let i=new DOMParser().parseFromString(e.trim(),"image/svg+xml");if(i.querySelector("parsererror"))return null;let s=i.querySelector("svg");return s?c.fromElement(s):null}};var De=Math.PI/180;function ni(c){return c<.5?2*c*c:-1+(4-2*c)*c}var A=class A{sync(e,t,i,r){A.setupMutationObserver(e,t);let s=e.getBoundingClientRect(),n=this.readStyleBundle(e,i),{translateZ:o,cssScale:a,rotateX:l,rotateY:d,rotateZ:h,cssScaleZ:u,opacity:p,color:m,metalness:f,roughness:g,emissive:S,castShadow:y,receiveShadow:b,materialType:v,svgDepth:w,svgCurveSegments:C,bevelEnabled:T,bevelSize:I,bevelThickness:E,bevelOffset:M,bevelSegments:D,svgSrc:O,morphDuration:k}=n,$=s.left+s.width*.5,G=s.top+s.height*.5;if(i.camera.getMode()==="orthographic")t.object.position.set($-i.viewportWidth/2,-(G-i.viewportHeight/2),o);else{let Y=i.camera.getFrustumSizeAt(o),te=$/i.viewportWidth,ie=G/i.viewportHeight;t.object.position.set((te-.5)*Y.width,-(ie-.5)*Y.height,o)}if(t.object.rotation.x=-l*De,t.object.rotation.z=-h*De,t.object.rotation.order="XYZ",p===0)return t.object.visible=!1,{scale:a*(r?.scale||1)};if(t.object.visible=!0,!i.engine.createSVGGeometry)return t.object.rotation.y=d*De,{scale:a*(r?.scale||1)};let H=i.engine.getPrimaryMesh(t.object);if(!H)return t.object.rotation.y=d*De,{scale:a*(r?.scale||1)};let B=this.resolveSVGData(e,O,t);if(!B)return H.visible=!1,t.object.rotation.y=d*De,{scale:a*(r?.scale||1)};H.visible=!0;let W=B.paths.map(Y=>Y.d).join("~"),P=A.svgSignatures.get(t);P!==void 0&&P!==W&&A.morphStates.set(t,{startTime:performance.now(),duration:k,swapped:!1}),A.svgSignatures.set(t,W);let x=1,R=0,L=A.morphStates.get(t);if(L){let Y=performance.now()-L.startTime,te=Math.min(Y/L.duration,1),ie=ni(te);te>=1?(A.morphStates.delete(t),x=1):ie<.5?x=1-ie*2:(L.swapped||(L.swapped=!0,A.geometryKeys.delete(t)),x=(ie-.5)*2),R=Math.sin(ie*Math.PI)*90*De}t.object.rotation.y=d*De+R;let F=B.viewBox,j=F?.width||B.naturalWidth||s.width,U=F?.height||B.naturalHeight||s.height,_=j>0&&U>0?Math.min(s.width/j,s.height/U):1;if(!(L&&!L.swapped)){let te=[B.paths.map(re=>re.d.length).join(","),_.toFixed(4),s.width.toFixed(1),s.height.toFixed(1),w.toFixed(3),C,T?"1":"0",I.toFixed(3),E.toFixed(3),M.toFixed(3),D].join("|");if(A.geometryKeys.get(t)!==te){let re=B.paths.map(q=>q.transform?{d:q.d,transform:{a:q.transform.a*_,b:q.transform.b*_,c:q.transform.c*_,d:q.transform.d*_,e:q.transform.e*_,f:q.transform.f*_}}:{d:q.d,transform:{a:_,b:0,c:0,d:_,e:0,f:0}}),se=F?{x:F.x*_,y:F.y*_,width:F.width*_,height:F.height*_}:null,z=i.engine.createSVGGeometry(re,se,{depth:w,curveSegments:Math.max(1,Math.round(C)),bevelEnabled:T,bevelThickness:E,bevelSize:I,bevelOffset:M,bevelSegments:Math.max(0,Math.round(D))});z&&(z.computeBoundingBox(),i.engine.applyTextGeometryToMesh(H,z)||(H.geometry&&H.geometry.dispose?.(),H.geometry=z),t.geometry=z,A.geometryKeys.set(t,te))}}let Z=r?.scale||1,K=i.camera.getMode()==="orthographic"?1:i.camera.getScaleAtZ(o,i.viewportHeight),J=a*Z*K,ae=Math.max(1e-4,x);t.object.scale.set(J*ae,J*ae,J*u*ae),H.position.set(0,0,0);let le=A.lastMaterialType.get(t);if(le!==void 0&&le!==v){let Y=i.scene;Y&&requestAnimationFrame(()=>{Y.recreateMaterialForObject(t,e)})}return A.lastMaterialType.set(t,v),ce.applyVisualProps(e,t,i.engine,{opacity:p,color:m&&m!=="none"?m:void 0,metalness:Number.isFinite(f)?f:void 0,roughness:Number.isFinite(g)?g:void 0,emissive:ce.resolveEmissiveValue(e,S),castShadow:y,receiveShadow:b}),{scale:J}}cleanup(e,t){A.geometryKeys.delete(t),A.svgCache.delete(e),A.morphStates.delete(t),A.svgSignatures.delete(t);let i=A.mutationObservers.get(e);i&&(i.disconnect(),A.mutationObservers.delete(e))}resolveSVGData(e,t,i){let r=e.querySelector("svg");if(r){let o=A.svgCache.get(e);if(o)return o;let a=Ee.fromElement(r);if(a&&a.paths.length>0)return A.svgCache.set(e,a),a}let s=t||e.getAttribute("data-svg-src")||"";if(!s)return null;let n=A.svgFetchCache.get(s);if(n!==void 0)return n;if(!A.svgFetchPromises.has(s)){let o=fetch(s).then(a=>a.text()).then(a=>{let l=Ee.fromString(a);return A.svgFetchCache.set(s,l),A.invalidatePendingSrcObjects(s),l}).catch(()=>(A.svgFetchCache.set(s,null),null));A.svgFetchPromises.set(s,o)}return A.markObjectPendingSrc(s,i),null}static markObjectPendingSrc(e,t){let i=this.pendingSrcObjects.get(e);i||(i=new Set,this.pendingSrcObjects.set(e,i)),i.add(t)}static invalidatePendingSrcObjects(e){let t=this.pendingSrcObjects.get(e);t&&(t.forEach(i=>this.geometryKeys.delete(i)),t.clear())}static setupMutationObserver(e,t){if(A.mutationObservers.has(e))return;let i=new MutationObserver(()=>{A.svgCache.delete(e)});i.observe(e,{childList:!0,subtree:!0,attributes:!0}),A.mutationObservers.set(e,i)}readStyleBundle(e,t){return A.styleCache.get(e,t,i=>{let r=i.computedStyleMap?.(),s=getComputedStyle(i),n=(f,g)=>{let S=r?.get?.(f);if(S!=null){let b=typeof S=="object"&&"value"in S?S.value:S,v=typeof b=="number"?b:Number.parseFloat(String(b));if(!Number.isNaN(v))return v}let y=Number.parseFloat(s.getPropertyValue(f));return Number.isNaN(y)?g:y},o=(f,g="")=>{let S=r?.get?.(f),y=S&&typeof S=="object"&&"value"in S?S.value:S;return typeof y=="string"?y.trim()||g:s.getPropertyValue(f).trim()||g},a=(f,g=!1)=>{let S=o(f);if(!S)return g;let y=S.toLowerCase();return y==="true"||y==="1"||y==="yes"?!0:y==="false"||y==="0"||y==="no"?!1:g},l=o("--material-color"),d=l&&l!=="none"?l:s.color.trim(),h=n("--svg-bevel-size",0),u=n("--svg-bevel-thickness",0),p=n("--svg-depth",NaN),m=Number.isFinite(p)?p:10;return{translateZ:n("--translate-z",0),cssScale:n("--scale",1),rotateX:n("--rotate-x",0),rotateY:n("--rotate-y",0),rotateZ:n("--rotate-z",0),cssScaleZ:n("--scale-z",1),opacity:n("--opacity",NaN),color:d,metalness:n("--material-metalness",NaN),roughness:n("--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",svgDepth:m,svgCurveSegments:n("--svg-curve-segments",12),bevelEnabled:h>0||u>0,bevelSize:h,bevelThickness:u,bevelOffset:n("--svg-bevel-offset",0),bevelSegments:n("--svg-bevel-steps",3),svgSrc:o("--svg-src"),morphDuration:n("--svg-morph-duration",600)}})}};A.styleCache=new ne,A.geometryKeys=new WeakMap,A.lastMaterialType=new WeakMap,A.svgCache=new WeakMap,A.svgFetchCache=new Map,A.svgFetchPromises=new Map,A.pendingSrcObjects=new Map,A.mutationObservers=new WeakMap,A.morphStates=new WeakMap,A.svgSignatures=new WeakMap;var Oe=A;var Re=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 ce),this.strategies.set("sphere",new ce),this.strategies.set("plane",new ce),this.strategies.set("cylinder",new ce),this.strategies.set("model",new ce),this.strategies.set("group",new $e),this.strategies.set("pointLight",new we),this.strategies.set("ambientLight",new we),this.strategies.set("directionalLight",new we),this.strategies.set("spotLight",new we),this.strategies.set("hemisphereLight",new we),this.strategies.set("particles",new Ge),this.strategies.set("text",new qe),this.strategies.set("svg",new Oe)}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,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 Xe=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 Ke=class{constructor(e){this.easingParser=e;this.filterStates=new WeakMap;this.filterWarnings=new WeakMap;this.customFilterRegistry=ye}setCustomFilterRegistry(e){this.customFilterRegistry=e||ye}collectTargets(e,t,i,r){let s=[],n=o=>{let a=o.el;if(a){let l=this.filterStates.get(a)?.animating===!0,d=!i||!r||r.has(a)||l,h=this.readFilterChain(a,t,d);if(h&&h.length>0){let u=!i||!r||r.has(a)||l,p=this.filterStates.get(a)?.effectsKey||this.stringifyFilterChain(h);s.push({object:o,effects:h,effectsKey:p,dirty:u});return}}o.children.forEach(l=>n(l))};return e.forEach(o=>n(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=bt(e);if(!s||s==="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:p,easing:m}=this.getFilterTransition(e);if(u<=0&&r.lastDuration>0&&(u=r.lastDuration,p=r.lastDelay,m=r.lastEasing),u>0){let f=this.makeZeroChain(r.effects);return r.from=r.effects,r.to=f,r.startTime=t+p,r.duration=u,r.easing=m,r.animating=!0,r.clearOnComplete=!0,r.lastDuration=u,r.lastDelay=p,r.lastEasing=m,this.sampleTransition(r,t)}}return this.filterStates.delete(e),null}let{effects:n,warnings:o}=this.parseFilterChain(s);if(this.warnFilterIssues(e,s,o),n.length===0)return null;let a=this.filterStates.get(e);if(!a){let{duration:u,delay:p,easing:m}=this.getFilterTransition(e);if(u>0){let f=this.makeZeroChain(n),g={raw:s,effects:n,animating:!0,from:f,to:n,startTime:t+p,duration:u,easing:m,clearOnComplete:!1,lastDuration:u,lastDelay:p,lastEasing:m};return g.effectsKey=this.stringifyFilterChain(n),this.filterStates.set(e,g),this.sampleTransition(g,t)}return this.filterStates.set(e,{raw:s,effects:n,animating:!1,from:n,to:n,startTime:0,duration:0,easing:f=>f,clearOnComplete:!1,lastDuration:0,lastDelay:0,lastEasing:f=>f,effectsKey:this.stringifyFilterChain(n)}),n}if(a.raw===s){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:d,easing:h}=this.getFilterTransition(e);if(l<=0&&a.lastDuration>0&&(l=a.lastDuration,d=a.lastDelay,h=a.lastEasing),l>0){let u=this.canInterpolate(a.effects,n),p=a.animating?this.getCurrentChain(a,t):a.effects;if(!u&&this.isZeroChain(n))return a.pendingRaw=s,a.pendingEffects=n,a.raw=s,a.effects=p,a.from=p,a.to=this.makeZeroChain(p),a.startTime=t+d,a.duration=l,a.easing=h,a.animating=!0,a.clearOnComplete=!1,a.lastDuration=l,a.lastDelay=d,a.lastEasing=h,a.effectsKey=this.stringifyFilterChain(n),this.sampleTransition(a,t);let m=u?p:this.makeZeroChain(n);return a.raw=s,a.effects=n,a.from=m,a.to=n,a.startTime=t+d,a.duration=l,a.easing=h,a.animating=!0,a.clearOnComplete=!1,a.lastDuration=l,a.lastDelay=d,a.lastEasing=h,a.effectsKey=this.stringifyFilterChain(n),this.sampleTransition(a,t)}return a.raw=s,a.effects=n,a.animating=!1,a.clearOnComplete=!1,a.effectsKey=this.stringifyFilterChain(n),n}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 m=u.trim().toLowerCase().match(/^(-?\d*\.?\d+)(px)?$/);if(!m)return null;let f=Number.parseFloat(m[1]);return Number.isFinite(f)?f:null},s=u=>{let p=u.trim().toLowerCase();if(!p)return null;if(p.endsWith("%")){let f=Number.parseFloat(p.slice(0,-1));return Number.isFinite(f)?f/100:null}let m=Number.parseFloat(p);return Number.isFinite(m)?m:null},n=u=>{let p=u.trim().toLowerCase();if(!p)return null;if(p.endsWith("rad")){let g=Number.parseFloat(p.slice(0,-3));return Number.isFinite(g)?g:null}let m=p.endsWith("deg")?p.slice(0,-3):p,f=Number.parseFloat(m);return Number.isFinite(f)?f*Math.PI/180:null},o=u=>{let p=u.split(",").map(g=>g.trim()),m=r(p[0]||"");if(m===null)return null;let f=p[1]?s(p[1]):null;return{intensity:Math.max(0,m),threshold:f===null?.8:Math.max(0,Math.min(1,f))}},a=(u,p,m=!1)=>{let f=r(u);return f===null?(t.push(`[String3D] Invalid ${p} value "${u}".`),null):!m&&f<=0?(t.push(`[String3D] ${p} must be > 0.`),null):f},l=(u,p)=>{let m=s(u);return m===null?(t.push(`[String3D] Invalid ${p} value "${u}".`),null):m},d=/([a-zA-Z-]+)\(([^)]*)\)/g,h;for(;h=d.exec(e);){let u=h[1].toLowerCase(),p=(h[2]||"").trim();if(u==="blur"){let m=a(p,"blur",!0);m!==null&&i.push({type:"blur",amount:m})}else if(u==="pixel"||u==="pixelate"){let m=a(p,"pixel",!0);m!==null&&i.push({type:"pixel",size:m})}else if(u==="bloom"){let m=o(p);m?i.push({type:"bloom",...m}):t.push(`[String3D] Invalid bloom value "${p}".`)}else if(u==="brightness"){let m=l(p,"brightness");m!==null&&i.push({type:"brightness",amount:Math.max(0,m)})}else if(u==="contrast"){let m=l(p,"contrast");m!==null&&i.push({type:"contrast",amount:Math.max(0,m)})}else if(u==="saturate"){let m=l(p,"saturate");m!==null&&i.push({type:"saturate",amount:Math.max(0,m)})}else if(u==="grayscale"){let m=l(p,"grayscale");m!==null&&i.push({type:"grayscale",amount:Math.max(0,Math.min(1,m))})}else if(u==="sepia"){let m=l(p,"sepia");m!==null&&i.push({type:"sepia",amount:Math.max(0,Math.min(1,m))})}else if(u==="invert"){let m=l(p,"invert");m!==null&&i.push({type:"invert",amount:Math.max(0,Math.min(1,m))})}else if(u==="hue-rotate"){let m=n(p);m!==null?i.push({type:"hue-rotate",angle:m}):t.push(`[String3D] Invalid hue-rotate value "${p}".`)}else if(u){let m=this.customFilterRegistry.get(u);if(m){let f=m.parse?m.parse(p):{};f===null?t.push(`[String3D] Invalid custom filter "${u}" args "${p}".`):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),s=this.splitTransitionList(t.transitionDelay),n=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:p=>p}}let a=this.parseTime(r[o]||r[r.length-1]||"0s"),l=this.parseTime(s[o]||s[s.length-1]||"0s"),d=n[o]||n[n.length-1]||"linear";return{duration:a,delay:l,easing:this.parseEasing(d)}}splitTransitionList(e){let t=[],i="",r=0;for(let s=0;s<e.length;s+=1){let n=e[s];n==="("&&(r+=1),n===")"&&(r=Math.max(0,r-1)),n===","&&r===0?(t.push(i.trim()),i=""):i+=n}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),n="",o="",a="",l="";s.forEach(d=>{let h=d.toLowerCase();h.endsWith("ms")||h.endsWith("s")||/^[0-9.]+$/.test(h)?o?a||(a=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=d:n||(n=d)}),n&&t.set(n.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 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 n=Object.keys(i.uniforms||{}),o=Object.keys(s.uniforms||{});return n.length!==o.length?!1:n.every(a=>a in(s.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,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)),n=e.easing(s),o=this.interpolateChain(e.from,e.to,n);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)),n=e.easing(s);return this.interpolateChain(e.from,e.to,n)}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,n)=>s+(n-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(([n,o])=>{let a=e.uniforms?.[n];this.isNumeric(a)&&this.isNumeric(o)?s[n]=r(a,o):s[n]=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 xe=class xe extends He{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 Xe(["style","class","string-3d","string-3d-model-fit","string-3d-model-scale"]),this.filterController=new Ke(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"}],xe._instance=this}static getInstance(){return xe._instance}get scene(){return this._scene}static setProvider(t){xe.provider=t}static registerFont(t,i,r={}){me.register(t,i),r.default&&me.setDefault(t)}static setDefaultFont(t){me.setDefault(t)}canConnect(t){return super.canConnect(t)}initializeObject(t,i,r,s){super.initializeObject(t,i,r,s),i.setProperty("parentId",null);let n=r.parentElement?.closest('[string-3d="group"]');if(n){let o=n.getAttribute("string-id");o&&(i.setProperty("parentId",o),i.setProperty("parent",n))}}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(),!xe.provider)return;this.registerTypedProperties(),this.injectCSS(),this.useDirtySync=!!this.options.useDirtySync,this.useDirtySync&&this.dirtySyncManager.enable();let t=xe.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 Pe(this.canvasContainer,this.engine),this.renderer.attach(),this.camera=new Ce(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 Re(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(n=>{this.syncRecursive(n.el,n,{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=n=>{if(n.el&&(i||!r||r.has(n.el))){let a=n.el.getBoundingClientRect(),l=n.el.offsetWidth||a.width,d=n.el.offsetHeight||a.height;n.el.__layoutCache={rect:a,width:l,height:d}}n.children.forEach(s)};t.forEach(s)}syncRecursive(t,i,r,s,n){if(!this.synchronizer||!t)return;let o=i.type==="particles"||i.type==="text"||s||!n||n.has(t),a=r;if(o){let d=this.synchronizer.syncElement(t,i,r,{dirtySet:n,forceSync:s});d&&typeof d.scale=="number"&&(this.lastSyncData.set(i,d),a=d)}else{let d=this.lastSyncData.get(i);d&&(a=d)}let l=s||o;i.children.forEach(d=>this.syncRecursive(d.el,d,a,l,n))}injectCSS(){if(document.getElementById("string-3d-styles"))return;let t=document.createElement("style");t.id="string-3d-styles",t.textContent=`
33
33
  @property --translate-x { syntax: "<number>"; inherits: false; initial-value: 0; }
34
34
  @property --translate-y { syntax: "<number>"; inherits: false; initial-value: 0; }
35
35
  @property --translate-z { syntax: "<number>"; inherits: false; initial-value: 0; }
@@ -133,23 +133,23 @@
133
133
  rotateZ(calc(var(--rotate-z) * 1deg))
134
134
  scale3d(calc(var(--scale) * var(--scale-x)), calc(var(--scale) * var(--scale-y)), calc(var(--scale) * var(--scale-z)));
135
135
  }
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: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,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 Fe=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 Je(e,t,i)}getMaterialDefinition(e){return e?.userData?.definition||null}isShaderMaterial(e){return!!e?.isShaderMaterial}applyUniforms(e,t,i){let r=e?.userData?.shader,s=e?.userData?.customUniforms;if(r?.uniforms)for(let[n,o]of Object.entries(i)){let a=t.uniforms?.[n];a&&r.uniforms[n]&&(r.uniforms[n].value=this.convertUniformValue(a.type,o))}if(s)for(let[n,o]of Object.entries(i)){let a=t.uniforms?.[n];a&&s[n]&&(s[n].value=this.convertUniformValue(a.type,o))}if(e?.uniforms)for(let[n,o]of Object.entries(i)){let a=t.uniforms?.[n];a&&e.uniforms[n]&&(e.uniforms[n].value=this.convertUniformValue(a.type,o))}}buildUniforms(e,t){let i={};if(e.uniforms)for(let[r,s]of Object.entries(e.uniforms)){let n=t?.[r]??s.value;n=this.convertUniformValue(s.type,n),i[r]={value:n}}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 n=et(e.injections);s.onBeforeCompile=o=>{Object.assign(o.uniforms,t),o.vertexShader=this.injectVertexShader(o.vertexShader,n,t),o.fragmentShader=this.injectFragmentShader(o.fragmentShader,n,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>
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: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,this.pendingConnectedObjects.clear(),this.providerBootstrapped=!1,document.getElementById("string-3d-styles")?.remove(),this.canvasContainer?.id==="string-3d-canvas"&&this.canvasContainer.remove(),super.destroy()}};xe.provider=null,xe._instance=null;var Ze=xe;var Ae=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 nt(e,t,i)}getMaterialDefinition(e){return e?.userData?.definition||null}isShaderMaterial(e){return!!e?.isShaderMaterial}applyUniforms(e,t,i){let r=e?.userData?.shader,s=e?.userData?.customUniforms;if(r?.uniforms)for(let[n,o]of Object.entries(i)){let a=t.uniforms?.[n];a&&r.uniforms[n]&&(r.uniforms[n].value=this.convertUniformValue(a.type,o))}if(s)for(let[n,o]of Object.entries(i)){let a=t.uniforms?.[n];a&&s[n]&&(s[n].value=this.convertUniformValue(a.type,o))}if(e?.uniforms)for(let[n,o]of Object.entries(i)){let a=t.uniforms?.[n];a&&e.uniforms[n]&&(e.uniforms[n].value=this.convertUniformValue(a.type,o))}}buildUniforms(e,t){let i={};if(e.uniforms)for(let[r,s]of Object.entries(e.uniforms)){let n=t?.[r]??s.value;n=this.convertUniformValue(s.type,n),i[r]={value:n}}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 n=at(e.injections);s.onBeforeCompile=o=>{Object.assign(o.uniforms,t),o.vertexShader=this.injectVertexShader(o.vertexShader,n,t),o.fragmentShader=this.injectFragmentShader(o.fragmentShader,n,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>
137
137
  ${s}`));let n=t.get("vertex_header");if(n){let l=this.generateUniformDeclarations(i);r=r.replace("void main() {",`${l}
138
138
  ${n}
139
139
  void main() {`)}let o=t.get("vertex_transform");o&&(r=r.replace("#include <begin_vertex>",`#include <begin_vertex>
140
140
  ${o}`));let a=t.get("vertex_output");return a&&(r=r.replace("#include <project_vertex>",`${a}
141
141
  #include <project_vertex>`)),r}injectFragmentShader(e,t,i){let r=e,s=t.get("fragment_pars");s&&(r=r.replace("#include <common>",`#include <common>
142
- ${s}`));let n=t.get("fragment_header");if(n){let f=this.generateUniformDeclarations(i);r=r.replace("void main() {",`${f}
142
+ ${s}`));let n=t.get("fragment_header");if(n){let g=this.generateUniformDeclarations(i);r=r.replace("void main() {",`${g}
143
143
  ${n}
144
144
  void main() {`)}let o=t.get("fragment_color");o&&(r=r.replace("#include <color_fragment>",`#include <color_fragment>
145
145
  ${o}`));let a=t.get("fragment_normal");a&&(r=r.replace("#include <normal_fragment_maps>",`#include <normal_fragment_maps>
146
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>
150
- ${u}`));let d=t.get("fragment_lights");d&&(r=r.replace("#include <lights_physical_fragment>",`#include <lights_physical_fragment>
151
- ${d}`));let m=t.get("fragment_emissive");m&&(r=r.replace("#include <emissivemap_fragment>",`#include <emissivemap_fragment>
152
- ${m}`));let g=t.get("fragment_output");return g&&(r=r.replace("#include <dithering_fragment>",`${g}
147
+ ${l}`));let d=t.get("fragment_metalness");d&&(r=r.replace("#include <metalnessmap_fragment>",`#include <metalnessmap_fragment>
148
+ ${d}`));let h=t.get("fragment_ao");h&&(r=r.replace("#include <aomap_fragment>",`#include <aomap_fragment>
149
+ ${h}`));let u=t.get("fragment_transmission");u&&(r=r.replace("#include <transmission_fragment>",`#include <transmission_fragment>
150
+ ${u}`));let p=t.get("fragment_lights");p&&(r=r.replace("#include <lights_physical_fragment>",`#include <lights_physical_fragment>
151
+ ${p}`));let m=t.get("fragment_emissive");m&&(r=r.replace("#include <emissivemap_fragment>",`#include <emissivemap_fragment>
152
+ ${m}`));let f=t.get("fragment_output");return f&&(r=r.replace("#include <dithering_fragment>",`${f}
153
153
  #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(`
154
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`
155
155
  varying vec2 vUv;
@@ -170,7 +170,7 @@ ${m}`));let g=t.get("fragment_output");return g&&(r=r.replace("#include <ditheri
170
170
  void main() {
171
171
  gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
172
172
  }
173
- `}dispose(){this.textureCache.forEach(e=>e.dispose()),this.textureCache.clear()}};var ot=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=[]}},Ge=class{constructor(e){this.scale=1;this.customMaterials=new Map;let{engine:t,renderer:i,runtime:r,width:s,height:n,customFilterRegistry:o}=e;this.backend=t.getBackend?.()||"webgl",this.engine=t,this.renderer=i,this.runtime=r,this.customFilterRegistry=o,this.width=s,this.height=n,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 ot(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,s=[],n=a=>{let l=s.indexOf(a);l>=0&&(s.splice(l,1),this.pool.release(a))},o=()=>{let{width:a,height:l}=this.getScaledSize(),h=this.pool.acquire(a,l);return s.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}),n(h),r!==e&&n(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&&n(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 d=o();this.renderPass(this.blurMaterial,u,d,{uDirection:[0,1],uRadius:h}),n(c),n(u);let m=o();this.renderAddPass(r,d,m,l),n(d),r!==e&&n(r),r=m}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&&n(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&&n(r),r=l):n(l)}}),s.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={},s=!0){this.runtime.setRenderTarget(this.renderer,i),this.setMaterial(this.quad,e),this.setUniform(e,"tDiffuse",t.texture);let{width:n,height:o}=this.getScaledSize();this.setUniform(e,"uResolution",[n,o]),this.setUniform(e,"uTexel",[1/n,1/o]),Object.entries(r).forEach(([a,l])=>this.setUniform(e,a,l)),s&&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:s,height:n}=this.getScaledSize();this.setUniform(this.bloomAddMaterial,"uResolution",[s,n]),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:`
173
+ `}dispose(){this.textureCache.forEach(e=>e.dispose()),this.textureCache.clear()}};var pt=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=[]}},Qe=class{constructor(e){this.scale=1;this.customMaterials=new Map;let{engine:t,renderer:i,runtime:r,width:s,height:n,customFilterRegistry:o}=e;this.backend=t.getBackend?.()||"webgl",this.engine=t,this.renderer=i,this.runtime=r,this.customFilterRegistry=o,this.width=s,this.height=n,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=(d,h)=>this.runtime.createRenderTarget(d,h);this.pool=new pt(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,s=[],n=a=>{let l=s.indexOf(a);l>=0&&(s.splice(l,1),this.pool.release(a))},o=()=>{let{width:a,height:l}=this.getScaledSize(),d=this.pool.acquire(a,l);return s.push(d),d};return t.forEach(a=>{if(a.type==="blur"){let l=a.amount*i;if(l<=1e-4)return;let d=o();this.renderPass(this.blurMaterial,r,d,{uDirection:[1,0],uRadius:l});let h=o();this.renderPass(this.blurMaterial,d,h,{uDirection:[0,1],uRadius:l}),n(d),r!==e&&n(r),r=h}else if(a.type==="pixel"){if(a.size<=.5)return;let l=o();this.renderPass(this.pixelMaterial,r,l,{uPixelSize:a.size}),r!==e&&n(r),r=l}else if(a.type==="bloom"){let l=a.intensity;if(l<=1e-4||a.threshold>=.99)return;let d=Math.max(1,4*i),h=o();this.renderPass(this.bloomExtractMaterial,r,h,{uThreshold:a.threshold});let u=o();this.renderPass(this.blurMaterial,h,u,{uDirection:[1,0],uRadius:d});let p=o();this.renderPass(this.blurMaterial,u,p,{uDirection:[0,1],uRadius:d}),n(h),n(u);let m=o();this.renderAddPass(r,p,m,l),n(p),r!==e&&n(r),r=m}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(),d=this.getColorMode(a.type),h=a.type==="hue-rotate"?a.angle:a.amount;this.renderPass(this.colorMaterial,r,l,{uMode:d,uAmount:h}),r!==e&&n(r),r=l}else if(a.type==="custom"){let l=o(),d=this.getCustomMaterial(a.name);d?(this.renderPass(d,r,l,a.uniforms),r!==e&&n(r),r=l):n(l)}}),s.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={},s=!0){this.runtime.setRenderTarget(this.renderer,i),this.setMaterial(this.quad,e),this.setUniform(e,"tDiffuse",t.texture);let{width:n,height:o}=this.getScaledSize();this.setUniform(e,"uResolution",[n,o]),this.setUniform(e,"uTexel",[1/n,1/o]),Object.entries(r).forEach(([a,l])=>this.setUniform(e,a,l)),s&&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:s,height:n}=this.getScaledSize();this.setUniform(this.bloomAddMaterial,"uResolution",[s,n]),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
174
  varying vec2 vUv;
175
175
  uniform sampler2D tDiffuse;
176
176
  void main() {
@@ -277,13 +277,13 @@ ${m}`));let g=t.get("fragment_output");return g&&(r=r.replace("#include <ditheri
277
277
 
278
278
  gl_FragColor = color;
279
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 s=this.resolveCustomFilterShaders(r);if(!s)return null;let n={tDiffuse:{value:null}},{width:o,height:a}=this.getScaledSize();n.uResolution={value:[o,a]},n.uTexel={value:[1/o,1/a]},Object.entries(i.uniforms||{}).forEach(([h,c])=>{n[h]={value:c}});let l=this.createShaderMaterial({uniforms:n,vertexShader:s.vertexShader,fragmentShader:s.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`
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 s=this.resolveCustomFilterShaders(r);if(!s)return null;let n={tDiffuse:{value:null}},{width:o,height:a}=this.getScaledSize();n.uResolution={value:[o,a]},n.uTexel={value:[1/o,1/a]},Object.entries(i.uniforms||{}).forEach(([d,h])=>{n[d]={value:h}});let l=this.createShaderMaterial({uniforms:n,vertexShader:s.vertexShader,fragmentShader:s.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
281
  varying vec2 vUv;
282
282
  void main() {
283
283
  vUv = uv;
284
284
  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
285
285
  }
286
- `}};var Oe=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 Fe(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,s=.1,n=1e4){return new this.THREE.OrthographicCamera(e,t,i,r,s,n)}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,n=1){return new this.THREE.SpotLight(e,t,i,r,s,n)}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(),s=r?r.replace(/\/?$/,"/"):"",n=t.textureMap||null;i.setURLModifier(o=>{let a=n&&Object.prototype.hasOwnProperty.call(n,o)?n[o]:o,l=typeof a=="string"&&a?a:o;return!s||/^(blob:|data:|https?:|file:|\/)/i.test(l)?l:s+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=ge.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 ge.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=[],n=i/e.resolution,o=t[0];if(!o)return s;let a=e.glyphs[o];if(!a||!a.o)return s;let l=0;r&&(l=-this.getOutlineXMin(a.o)*n);let h=this.parseOutlineToShapes(a.o,n,l,e?.outlineFormat);return s.push(...h),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,n=i.length-1;s<i.length;n=s++){let o=i[s].x,a=i[s].y,l=i[n].x,h=i[n].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,s=-1/0;for(let n of e)n.x<t&&(t=n.x),n.x>i&&(i=n.x),n.y<r&&(r=n.y),n.y>s&&(s=n.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]],n=t[r[1]],o=t[r[2]],a=(s.x+n.x+o.x)/3,l=(s.y+n.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 s=new this.THREE.ShapePath,n=e.split(" "),o=0;for(;o<n.length;)switch(n[o]){case"m":{let d=parseFloat(n[o+1])*t+i,m=-parseFloat(n[o+2])*t;s.moveTo(d,m),o+=3}break;case"l":{let d=parseFloat(n[o+1])*t+i,m=-parseFloat(n[o+2])*t;s.lineTo(d,m),o+=3}break;case"q":{let d=parseFloat(n[o+3])*t+i,m=-parseFloat(n[o+4])*t;s.quadraticCurveTo(parseFloat(n[o+1])*t+i,-parseFloat(n[o+2])*t,d,m),o+=5}break;case"b":{let d=parseFloat(n[o+5])*t+i,m=-parseFloat(n[o+6])*t;s.bezierCurveTo(parseFloat(n[o+1])*t+i,-parseFloat(n[o+2])*t,parseFloat(n[o+3])*t+i,-parseFloat(n[o+4])*t,d,m),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 a=s.subPaths;if(!a||a.length===0)return[];let l=a.map(u=>{let d=u.getPoints(),m=this.THREE.ShapeUtils.area(d),g=this.getBoundingBox(d.map(f=>({x:f.x,y:f.y})));return{path:u,points:d,area:Math.abs(m),signedArea:m,bbox:g}});l.sort((u,d)=>d.area-u.area);let h=[],c=new Set;for(let u=0;u<l.length;u++){if(c.has(u))continue;let d=l[u],m=new this.THREE.Shape(d.points);c.add(u);for(let g=0;g<l.length;g++){if(c.has(g)||u===g)continue;let f=l[g];if(f.bbox.minX<d.bbox.minX||f.bbox.maxX>d.bbox.maxX||f.bbox.minY<d.bbox.minY||f.bbox.maxY>d.bbox.maxY)continue;let S=!0,y=[f.points[0],f.points[Math.floor(f.points.length/2)]];for(let b of y)if(!b||!this.pointInPolygon(b.x,b.y,d.points.map(v=>({x:v.x,y:v.y})))){S=!1;break}S&&(m.holes.push(new this.THREE.Path(f.points)),c.add(g))}h.push(m)}return h.length>0?h: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 n=e.curves[s];n.isLineCurve||n.type==="LineCurve"||n.type==="LineCurve3"?t.lineTo(n.v1.x,n.v1.y):n.isQuadraticBezierCurve||n.type==="QuadraticBezierCurve"||n.type==="QuadraticBezierCurve3"?t.quadraticCurveTo(n.v1.x,n.v1.y,n.v0.x,n.v0.y):(n.isCubicBezierCurve||n.type==="CubicBezierCurve"||n.type==="CubicBezierCurve3")&&t.bezierCurveTo(n.v2.x,n.v2.y,n.v1.x,n.v1.y,n.v0.x,n.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),n=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,d=Math.max(0,i.bevelSegments||0),m=Math.max(1,Math.round(i.curveSegments||8)),g=String(e).split(/\r?\n/),f=[],S=t?.data,y=S?.resolution||1e3;if(i.layout&&i.layout.length>0){let v=S?.ascender||y*.8,w=S?.descender||-y*.2,P=v-w,T=v/P,R=i.elementWidth||0,E=i.elementHeight||0,x=0,D=0;i.layout.forEach(O=>{let N=t.generateShapes(O.char,r),H=O.x+x,G=(O.height||r)*T,$=-(O.y+D)-G;N.forEach(B=>{let C=this.translateShape(B,H,$);O.scale&&O.scale!==1&&(C=this.scaleShape(C,O.scale)),f.push(C)})})}else g.forEach((v,w)=>{let{shapes:P,width:T}=this.buildLineShapes(v,t,r,o),R=0;a==="center"?R=-T*.5:a==="right"&&(R=-T);let E=-w*n;P.forEach(x=>{f.push(this.translateShape(x,R,E))})});if(!f.length)return null;let b=new this.THREE.ExtrudeGeometry(f,{depth:s,curveSegments:m,bevelEnabled:l,bevelThickness:h,bevelSize:c,bevelOffset:u,bevelSegments:d});return b.computeBoundingBox(),b}buildLineShapes(e,t,i,r){let s=[],n=0,o=Array.from(e);return o.forEach((a,l)=>{t.generateShapes(a,i).forEach(u=>{let d=this.translateShape(u,n,0);s.push(d)});let c=this.getGlyphAdvance(t,a,i);n+=c,r!==0&&l<o.length-1&&(n+=r)}),{shapes:s,width:n}}getGlyphAdvance(e,t,i){let r=e?.data,s=r?.glyphs||{},o=(s[t]||s[t.charCodeAt(0)]||s["?"])?.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:s}=e.extractPoints(12),n=a=>new this.THREE.Vector2((a.x||0)+t,(a.y||0)+i),o=new this.THREE.Shape(r.map(n));return Array.isArray(s)&&s.forEach(a=>{let l=new this.THREE.Path;l.setFromPoints(a.map(n)),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),n=new this.THREE.Shape(i.map(s));return Array.isArray(r)&&r.forEach(o=>{let a=new this.THREE.Path;a.setFromPoints(o.map(s)),n.holes.push(a)}),n}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 n=(i||"").trim(),o=`${s}|${r}|${n}`;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(s)}catch{h(null);return}c.load(r,u=>{let d=u?.scene||u?.object||u;if(!d){h(null);return}let m=null;if(n){if(d.getObjectByName){let f=d.getObjectByName(n);f?.isMesh&&(m=f)}!m&&d.traverse&&d.traverse(f=>{m||f?.isMesh&&f?.name===n&&(m=f)})}m||(d.isMesh?m=d:d.traverse&&d.traverse(f=>{!m&&f?.isMesh&&(m=f)}));let g=m?.geometry||null;if(!g){h(null);return}this.particleModelCache.set(o,g),h(g)},void 0,()=>{h(null)})});return this.particleModelPromiseCache.set(o,l),l}createParticleSystem(e){let t=this.THREE,i=this,r=n=>{let o=Math.max(1,n|0);return()=>(o^=o<<13,o^=o>>17,o^=o<<5,(o>>>0)%1e5/1e5)};class s 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),d=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||d?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 d=u*3;this.basePositions[d]=this.transitionFromPositions[d]+(this.transitionToPositions[d]-this.transitionFromPositions[d])*h,this.basePositions[d+1]=this.transitionFromPositions[d+1]+(this.transitionToPositions[d+1]-this.transitionFromPositions[d+1])*h,this.basePositions[d+2]=this.transitionFromPositions[d+2]+(this.transitionToPositions[d+2]-this.transitionFromPositions[d+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 M=0;M<a;M+=1){let A=this.randomInSphere(this.cfg.spread);h.set(A,M*3)}return}let u=c.array,d=c.itemSize,m=Math.floor(u.length/d);if(m<=0)return;let g=l?.index?.array,f=Math.floor(g?g.length/3:m/3);if(f<=0)return;let S=1/0,y=1/0,b=1/0,v=-1/0,w=-1/0,P=-1/0;for(let M=0;M<m;M+=1){let A=M*d,k=u[A],I=u[A+1],j=u[A+2];S=Math.min(S,k),y=Math.min(y,I),b=Math.min(b,j),v=Math.max(v,k),w=Math.max(w,I),P=Math.max(P,j)}let T=Math.max(1e-6,v-S),R=Math.max(1e-6,w-y),E=Math.max(1e-6,P-b),x=(this.cfg.spreadX>0?this.cfg.spreadX:this.cfg.spread)*2,D=(this.cfg.spreadY>0?this.cfg.spreadY:this.cfg.spread)*2,O=x>0?x/T:1,N=D>0?D/R:1,H=Math.min(O,N),_=(S+v)*.5,G=(y+w)*.5,$=(b+P)*.5,B=new Float32Array(f),C=0;for(let M=0;M<f;M+=1){let A=M*3,k=g?g[A]:A,I=g?g[A+1]:A+1,j=g?g[A+2]:A+2,U=k*d,Z=I*d,X=j*d,K=u[U],q=u[U+1],he=u[U+2],fe=u[Z],ye=u[Z+1],ne=u[Z+2],be=u[X],ve=u[X+1],pe=u[X+2],ae=fe-K,V=ye-q,Y=ne-he,oe=be-K,le=ve-q,ee=pe-he,te=V*ee-Y*le,ie=Y*oe-ae*ee,me=ae*le-V*oe,Le=Math.sqrt(te*te+ie*ie+me*me)*.5;C+=Le,B[M]=C}if(C<=0){for(let M=0;M<a;M+=1){let A=this.randomInSphere(this.cfg.spread);h.set(A,M*3)}return}for(let M=0;M<a;M+=1){let A=this.rng()*C,k=0,I=f-1;for(;k<I;){let Xe=Math.floor((k+I)/2);A<=B[Xe]?I=Xe:k=Xe+1}let j=k*3,U=g?g[j]:j,Z=g?g[j+1]:j+1,X=g?g[j+2]:j+2,K=U*d,q=Z*d,he=X*d,fe=u[K],ye=u[K+1],ne=u[K+2],be=u[q],ve=u[q+1],pe=u[q+2],ae=u[he],V=u[he+1],Y=u[he+2],oe=this.rng(),le=this.rng(),ee=Math.sqrt(oe),te=1-ee,ie=ee*(1-le),me=ee*le,Le=(fe*te+be*ie+ae*me-_)*H,Ye=(ye*te+ve*ie+V*me-G)*H,Re=(ne*te+pe*ie+Y*me-$)*H;h[M*3]=Le,h[M*3+1]=Ye,h[M*3+2]=Re}}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 d=u*3;this.positions[d]=l,this.positions[d+1]=l,this.positions[d+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
+ `}};var Ve=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 Ae(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"outputColorSpace"in t&&this.THREE.SRGBColorSpace?t.outputColorSpace=this.THREE.SRGBColorSpace:"outputEncoding"in t&&this.THREE.sRGBEncoding&&(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,s=.1,n=1e4){return new this.THREE.OrthographicCamera(e,t,i,r,s,n)}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,n=1){return new this.THREE.SpotLight(e,t,i,r,s,n)}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(),s=r?r.replace(/\/?$/,"/"):"",n=t.textureMap||null;i.setURLModifier(o=>{let a=n&&Object.prototype.hasOwnProperty.call(n,o)?n[o]:o,l=typeof a=="string"&&a?a:o;return!s||/^(blob:|data:|https?:|file:|\/)/i.test(l)?l:s+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=Se.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 Se.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=[],n=i/e.resolution,o=t[0];if(!o)return s;let a=e.glyphs[o];if(!a||!a.o)return s;let l=0;r&&(l=-this.getOutlineXMin(a.o)*n);let d=this.parseOutlineToShapes(a.o,n,l,e?.outlineFormat);return s.push(...d),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,n=i.length-1;s<i.length;n=s++){let o=i[s].x,a=i[s].y,l=i[n].x,d=i[n].y;a>t!=d>t&&e<(l-o)*(t-a)/(d-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,s=-1/0;for(let n of e)n.x<t&&(t=n.x),n.x>i&&(i=n.x),n.y<r&&(r=n.y),n.y>s&&(s=n.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]],n=t[r[1]],o=t[r[2]],a=(s.x+n.x+o.x)/3,l=(s.y+n.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 s=new this.THREE.ShapePath,n=e.split(" "),o=0;for(;o<n.length;)switch(n[o]){case"m":{let p=parseFloat(n[o+1])*t+i,m=-parseFloat(n[o+2])*t;s.moveTo(p,m),o+=3}break;case"l":{let p=parseFloat(n[o+1])*t+i,m=-parseFloat(n[o+2])*t;s.lineTo(p,m),o+=3}break;case"q":{let p=parseFloat(n[o+3])*t+i,m=-parseFloat(n[o+4])*t;s.quadraticCurveTo(parseFloat(n[o+1])*t+i,-parseFloat(n[o+2])*t,p,m),o+=5}break;case"b":{let p=parseFloat(n[o+5])*t+i,m=-parseFloat(n[o+6])*t;s.bezierCurveTo(parseFloat(n[o+1])*t+i,-parseFloat(n[o+2])*t,parseFloat(n[o+3])*t+i,-parseFloat(n[o+4])*t,p,m),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 a=s.subPaths;if(!a||a.length===0)return[];let l=a.map(u=>{let p=u.getPoints(),m=this.THREE.ShapeUtils.area(p),f=this.getBoundingBox(p.map(g=>({x:g.x,y:g.y})));return{path:u,points:p,area:Math.abs(m),signedArea:m,bbox:f}});l.sort((u,p)=>p.area-u.area);let d=[],h=new Set;for(let u=0;u<l.length;u++){if(h.has(u))continue;let p=l[u],m=new this.THREE.Shape(p.points);h.add(u);for(let f=0;f<l.length;f++){if(h.has(f)||u===f)continue;let g=l[f];if(g.bbox.minX<p.bbox.minX||g.bbox.maxX>p.bbox.maxX||g.bbox.minY<p.bbox.minY||g.bbox.maxY>p.bbox.maxY)continue;let S=!0,y=[g.points[0],g.points[Math.floor(g.points.length/2)]];for(let b of y)if(!b||!this.pointInPolygon(b.x,b.y,p.points.map(v=>({x:v.x,y:v.y})))){S=!1;break}S&&(m.holes.push(new this.THREE.Path(g.points)),h.add(f))}d.push(m)}return d.length>0?d: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=this.getCurveEndPoint(i);r&&t.moveTo(r.x,r.y);for(let s=e.curves.length-1;s>=0;s--){let n=e.curves[s];n.isLineCurve||n.type==="LineCurve"||n.type==="LineCurve3"?t.lineTo(n.v1.x,n.v1.y):n.isQuadraticBezierCurve||n.type==="QuadraticBezierCurve"||n.type==="QuadraticBezierCurve3"?t.quadraticCurveTo(n.v1.x,n.v1.y,n.v0.x,n.v0.y):(n.isCubicBezierCurve||n.type==="CubicBezierCurve"||n.type==="CubicBezierCurve3")&&t.bezierCurveTo(n.v2.x,n.v2.y,n.v1.x,n.v1.y,n.v0.x,n.v0.y)}return t}getCurveEndPoint(e){return e?e.v3||e.v2||e.v1||(e.getPoint?e.getPoint(1):null):null}createTextGeometry(e,t,i){if(!e||!t)return null;let r=Math.max(.001,i.size||16),s=Math.max(0,i.height||0),n=Math.max(.001,i.lineHeight||r*1.2),o=Number.isFinite(i.letterSpacing)?i.letterSpacing:0,a=i.align||"left",l=!!i.bevelEnabled,d=Math.max(0,i.bevelThickness||0),h=Math.max(0,i.bevelSize||0),u=i.bevelOffset||0,p=Math.max(0,i.bevelSegments||0),m=Math.max(1,Math.round(i.curveSegments||8)),f=String(e).split(/\r?\n/),g=[],S=t?.data,y=S?.resolution||1e3;if(i.layout&&i.layout.length>0){let v=S?.ascender||y*.8,w=S?.descender||-y*.2,C=v-w,T=v/C,I=i.elementWidth||0,E=i.elementHeight||0,M=0,D=0;i.layout.forEach(O=>{let k=t.generateShapes(O.char,r),$=O.x+M,H=(O.height||r)*T,B=-(O.y+D)-H;k.forEach(W=>{let P=this.translateShape(W,$,B);O.scale&&O.scale!==1&&(P=this.scaleShape(P,O.scale)),g.push(P)})})}else f.forEach((v,w)=>{let{shapes:C,width:T}=this.buildLineShapes(v,t,r,o),I=0;a==="center"?I=-T*.5:a==="right"&&(I=-T);let E=-w*n;C.forEach(M=>{g.push(this.translateShape(M,I,E))})});if(!g.length)return null;let b=new this.THREE.ExtrudeGeometry(g,{depth:s,curveSegments:m,bevelEnabled:l,bevelThickness:d,bevelSize:h,bevelOffset:u,bevelSegments:p});return b.computeBoundingBox(),b}createSVGGeometry(e,t,i){if(!e||e.length===0)return null;let r=Math.max(0,i.depth||0),s=Math.max(1,Math.round(i.curveSegments||12)),n=!!i.bevelEnabled,o=Math.max(0,i.bevelThickness||0),a=Math.max(0,i.bevelSize||0),l=i.bevelOffset||0,d=Math.max(0,i.bevelSegments||0),h=[];for(let m of e){let f=this.parseSVGPathToSubpaths(m.d,m.transform);h.push(...f)}if(h.length===0)return null;if(t){let m=t.x+t.width*.5,f=t.y+t.height*.5;for(let g of h){for(let S of g.points)S.x-=m,S.y+=f;g.bbox=this.getBoundingBox(g.points.map(S=>({x:S.x,y:S.y})))}}let u=this.buildShapesWithHoles(h);if(u.length===0)return null;let p=new this.THREE.ExtrudeGeometry(u,{depth:r,curveSegments:s,bevelEnabled:n,bevelThickness:o,bevelSize:a,bevelOffset:l,bevelSegments:d});return p.center(),p.computeBoundingBox(),p}buildShapesWithHoles(e){if(e.length===0)return[];e.sort((o,a)=>a.area-o.area);let t=e.length,i=new Array(t).fill(-1);for(let o=1;o<t;o++)for(let a=o-1;a>=0;a--)if(this.svgPathContains(e[a],e[o])){i[o]=a;break}let r=new Array(t).fill(0);for(let o=0;o<t;o++){let a=i[o],l=0;for(;a!==-1;)l++,a=i[a];r[o]=l}let s=new Map,n=[];for(let o=0;o<t;o++)if(r[o]%2===0){let a=this.ensurePathWinding(e[o].path,e[o].points,!0),l=this.clonePathAsShape(a);s.set(o,l),n.push(l)}for(let o=0;o<t;o++)if(r[o]%2===1){let a=i[o];for(;a!==-1&&r[a]%2!==0;)a=i[a];let l=a!==-1?s.get(a):void 0;if(l){let d=this.ensurePathWinding(e[o].path,e[o].points,!1);l.holes.push(d)}}return n}svgPathContains(e,t){if(t.bbox.minX<e.bbox.minX||t.bbox.maxX>e.bbox.maxX||t.bbox.minY<e.bbox.minY||t.bbox.maxY>e.bbox.maxY)return!1;let i=e.points.map(s=>({x:s.x,y:s.y})),r=Math.max(1,Math.floor(t.points.length/4));for(let s=0;s<t.points.length;s+=r){let n=t.points[s];if(n&&!this.pointInPolygon(n.x,n.y,i))return!1}return!0}parseSVGPathToSubpaths(e,t){if(!e)return[];let i=new this.THREE.ShapePath,r=this.tokenizeSVGPath(e),s=0,n=0,o=0,a=0,l=0,d="",h=0,u=0,p=(f,g)=>t?[t.a*f+t.c*g+t.e,-(t.b*f+t.d*g+t.f)]:[f,-g];for(;s<r.length;){let f=r[s];if(typeof f!="string"||f.length!==1||!/[MLHVQCSATZmlhvqcsatz]/.test(f)){s++;continue}s++;let g=f===f.toLowerCase()&&f!=="z"&&f!=="Z",S=f.toUpperCase();do{switch(S){case"M":{let y=(g?n:0)+this.nextNum(r,s);s++;let b=(g?o:0)+this.nextNum(r,s);s++,[n,o]=[y,b],a=n,l=o;let[v,w]=p(n,o);i.moveTo(v,w),d=g?"l":"L",h=n,u=o;continue}case"L":{let y=(g?n:0)+this.nextNum(r,s);s++;let b=(g?o:0)+this.nextNum(r,s);s++,[n,o]=[y,b];let[v,w]=p(n,o);i.lineTo(v,w),h=n,u=o;break}case"H":{let y=(g?n:0)+this.nextNum(r,s);s++,n=y;let[b,v]=p(n,o);i.lineTo(b,v),h=n,u=o;break}case"V":{let y=(g?o:0)+this.nextNum(r,s);s++,o=y;let[b,v]=p(n,o);i.lineTo(b,v),h=n,u=o;break}case"Q":{let y=(g?n:0)+this.nextNum(r,s);s++;let b=(g?o:0)+this.nextNum(r,s);s++;let v=(g?n:0)+this.nextNum(r,s);s++;let w=(g?o:0)+this.nextNum(r,s);s++,h=y,u=b,[n,o]=[v,w];let[C,T]=p(y,b),[I,E]=p(n,o);i.quadraticCurveTo(C,T,I,E);break}case"T":{let y=2*n-h,b=2*o-u,v=(g?n:0)+this.nextNum(r,s);s++;let w=(g?o:0)+this.nextNum(r,s);s++,h=y,u=b,[n,o]=[v,w];let[C,T]=p(y,b),[I,E]=p(n,o);i.quadraticCurveTo(C,T,I,E);break}case"C":{let y=(g?n:0)+this.nextNum(r,s);s++;let b=(g?o:0)+this.nextNum(r,s);s++;let v=(g?n:0)+this.nextNum(r,s);s++;let w=(g?o:0)+this.nextNum(r,s);s++;let C=(g?n:0)+this.nextNum(r,s);s++;let T=(g?o:0)+this.nextNum(r,s);s++,h=v,u=w,[n,o]=[C,T];let[I,E]=p(y,b),[M,D]=p(v,w),[O,k]=p(n,o);i.bezierCurveTo(I,E,M,D,O,k);break}case"S":{let y=2*n-h,b=2*o-u,v=(g?n:0)+this.nextNum(r,s);s++;let w=(g?o:0)+this.nextNum(r,s);s++;let C=(g?n:0)+this.nextNum(r,s);s++;let T=(g?o:0)+this.nextNum(r,s);s++,h=v,u=w,[n,o]=[C,T];let[I,E]=p(y,b),[M,D]=p(v,w),[O,k]=p(n,o);i.bezierCurveTo(I,E,M,D,O,k);break}case"A":{let y=Math.abs(this.nextNum(r,s));s++;let b=Math.abs(this.nextNum(r,s));s++;let v=this.nextNum(r,s);s++;let w=this.nextNum(r,s)!==0;s++;let C=this.nextNum(r,s)!==0;s++;let T=(g?n:0)+this.nextNum(r,s);s++;let I=(g?o:0)+this.nextNum(r,s);if(s++,y===0||b===0){[n,o]=[T,I];let[E,M]=p(n,o);i.lineTo(E,M)}else{let E=this.arcToBezier(n,o,y,b,v,w,C,T,I);for(let[M,D,O,k,$,G]of E){let[H,B]=p(M,D),[W,P]=p(O,k),[x,R]=p($,G);i.bezierCurveTo(H,B,W,P,x,R)}[n,o]=[T,I]}h=n,u=o;break}case"Z":{typeof i.closePath=="function"?i.closePath():i.currentPath?.closePath&&i.currentPath.closePath(),n=a,o=l,h=n,u=o;break}}d=f}while(s<r.length&&typeof r[s]=="number"&&S!=="Z")}let m=i.subPaths;return!m||m.length===0?[]:m.map(f=>{let g=f.getPoints(64);if(!g||g.length<3)return null;let S=this.THREE.ShapeUtils.area(g),y=this.getBoundingBox(g.map(b=>({x:b.x,y:b.y})));return{path:f,points:g,area:Math.abs(S),signedArea:S,bbox:y}}).filter(f=>f!==null&&f.area>0)}ensurePathWinding(e,t,i){return this.THREE.ShapeUtils.isClockWise(t)===i?e:this.reversePath(e)}clonePathAsShape(e){let t=new this.THREE.Shape;return t.curves=e.curves.slice(),e.currentPoint&&t.currentPoint.copy(e.currentPoint),t}tokenizeSVGPath(e){let t=[],i=/([MLHVQCSATZmlhvqcsatz])|([+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?)/g,r;for(;(r=i.exec(e))!==null;)r[1]?t.push(r[1]):r[2]&&t.push(parseFloat(r[2]));return t}nextNum(e,t){let i=e[t];return typeof i=="number"?i:0}arcToBezier(e,t,i,r,s,n,o,a,l){let d=s*Math.PI/180,h=Math.cos(d),u=Math.sin(d),p=(e-a)/2,m=(t-l)/2,f=h*p+u*m,g=-u*p+h*m,S=f*f,y=g*g,b=i*i,v=r*r,w=S/b+y/v;if(w>1){let U=Math.sqrt(w);i*=U,r*=U,b=i*i,v=r*r}let C=n!==o?1:-1,T=Math.max(0,b*v-b*y-v*S),I=b*y+v*S,E=C*Math.sqrt(T/I),M=E*(i*g)/r,D=E*-(r*f)/i,O=h*M-u*D+(e+a)/2,k=u*M+h*D+(t+l)/2,$=(f-M)/i,G=(g-D)/r,H=(-f-M)/i,B=(-g-D)/r,W=Math.atan2(G,$),P=Math.atan2(B,H)-W;!o&&P>0&&(P-=2*Math.PI),o&&P<0&&(P+=2*Math.PI);let x=Math.ceil(Math.abs(P)/(Math.PI/2)),R=P/x,L=8/3*Math.sin(R/4)*Math.sin(R/4)/Math.sin(R/2),F=[],j=W;for(let U=0;U<x;U++){let _=j+R,Q=Math.cos(j),Z=Math.sin(j),K=Math.cos(_),J=Math.sin(_),ae=h*i*Q-u*r*Z+O,le=u*i*Q+h*r*Z+k,Y=h*i*K-u*r*J+O,te=u*i*K+h*r*J+k,ie=h*i*-Z-u*r*Q,re=u*i*-Z+h*r*Q,se=h*i*-J-u*r*K,z=u*i*-J+h*r*K;F.push([ae+L*ie,le+L*re,Y-L*se,te-L*z,Y,te]),j=_}return F}buildLineShapes(e,t,i,r){let s=[],n=0,o=Array.from(e);return o.forEach((a,l)=>{t.generateShapes(a,i).forEach(u=>{let p=this.translateShape(u,n,0);s.push(p)});let h=this.getGlyphAdvance(t,a,i);n+=h,r!==0&&l<o.length-1&&(n+=r)}),{shapes:s,width:n}}getGlyphAdvance(e,t,i){let r=e?.data,s=r?.glyphs||{},o=(s[t]||s[t.charCodeAt(0)]||s["?"])?.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:s}=e.extractPoints(12),n=a=>new this.THREE.Vector2((a.x||0)+t,(a.y||0)+i),o=new this.THREE.Shape(r.map(n));return Array.isArray(s)&&s.forEach(a=>{let l=new this.THREE.Path;l.setFromPoints(a.map(n)),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),n=new this.THREE.Shape(i.map(s));return Array.isArray(r)&&r.forEach(o=>{let a=new this.THREE.Path;a.setFromPoints(o.map(s)),n.holes.push(a)}),n}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 n=(i||"").trim(),o=`${s}|${r}|${n}`;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(d=>{let h=null;try{h=this.createModelLoader(s)}catch{d(null);return}h.load(r,u=>{let p=u?.scene||u?.object||u;if(!p){d(null);return}let m=null;if(n){if(p.getObjectByName){let g=p.getObjectByName(n);g?.isMesh&&(m=g)}!m&&p.traverse&&p.traverse(g=>{m||g?.isMesh&&g?.name===n&&(m=g)})}m||(p.isMesh?m=p:p.traverse&&p.traverse(g=>{!m&&g?.isMesh&&(m=g)}));let f=m?.geometry||null;if(!f){d(null);return}this.particleModelCache.set(o,f),d(f)},void 0,()=>{d(null)})});return this.particleModelPromiseCache.set(o,l),l}createParticleSystem(e){let t=this.THREE,i=this,r=n=>{let o=Math.max(1,n|0);return()=>(o^=o<<13,o^=o>>17,o^=o<<5,(o>>>0)%1e5/1e5)};class s 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 d=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.spreadX!==this.cfg.spreadX||l.spreadY!==this.cfg.spreadY||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){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)?this.startModelTransition():(this.refreshModelGeometry(),this.refreshDistributionGeometry(),this.rebuild());return}if(d&&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(d=>{d&&this.distributionKey===l&&(!this.pendingTransition||this.pendingTransitionKey!==l||(this.distributionGeometry=d,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 d=0;d<a;d+=1){let h=this.cfg.instanceShape==="box"?this.randomInBox(this.cfg.spread):this.randomInSphere(this.cfg.spread);this.transitionToPositions.set(h,d*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),d=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 p=u*3;this.basePositions[p]=this.transitionFromPositions[p]+(this.transitionToPositions[p]-this.transitionFromPositions[p])*d,this.basePositions[p+1]=this.transitionFromPositions[p+1]+(this.transitionToPositions[p+1]-this.transitionFromPositions[p+1])*d,this.basePositions[p+2]=this.transitionFromPositions[p+2]+(this.transitionToPositions[p+2]-this.transitionFromPositions[p+2])*d}if(l>=1){for(let u=0;u<h*3;u+=1)this.basePositions[u]=this.transitionToPositions[u];this.cleanupOutgoing()}}fillFromModelToArray(a,l,d){let h=l?.attributes?.position;if(!h?.array||h.itemSize<3){for(let x=0;x<a;x+=1){let R=this.randomInSphere(this.cfg.spread);d.set(R,x*3)}return}let u=h.array,p=h.itemSize,m=Math.floor(u.length/p);if(m<=0)return;let f=l?.index?.array,g=Math.floor(f?f.length/3:m/3);if(g<=0)return;let S=1/0,y=1/0,b=1/0,v=-1/0,w=-1/0,C=-1/0;for(let x=0;x<m;x+=1){let R=x*p,L=u[R],F=u[R+1],j=u[R+2];S=Math.min(S,L),y=Math.min(y,F),b=Math.min(b,j),v=Math.max(v,L),w=Math.max(w,F),C=Math.max(C,j)}let T=Math.max(1e-6,v-S),I=Math.max(1e-6,w-y),E=Math.max(1e-6,C-b),M=(this.cfg.spreadX>0?this.cfg.spreadX:this.cfg.spread)*2,D=(this.cfg.spreadY>0?this.cfg.spreadY:this.cfg.spread)*2,O=M>0?M/T:1,k=D>0?D/I:1,$=Math.min(O,k),G=(S+v)*.5,H=(y+w)*.5,B=(b+C)*.5,W=new Float32Array(g),P=0;for(let x=0;x<g;x+=1){let R=x*3,L=f?f[R]:R,F=f?f[R+1]:R+1,j=f?f[R+2]:R+2,U=L*p,_=F*p,Q=j*p,Z=u[U],K=u[U+1],J=u[U+2],ae=u[_],le=u[_+1],Y=u[_+2],te=u[Q],ie=u[Q+1],re=u[Q+2],se=ae-Z,z=le-K,q=Y-J,ge=te-Z,fe=ie-K,he=re-J,ue=z*he-q*fe,de=q*ge-se*he,ve=se*fe-z*ge,ke=Math.sqrt(ue*ue+de*de+ve*ve)*.5;P+=ke,W[x]=P}if(P<=0){for(let x=0;x<a;x+=1){let R=this.randomInSphere(this.cfg.spread);d.set(R,x*3)}return}for(let x=0;x<a;x+=1){let R=this.rng()*P,L=0,F=g-1;for(;L<F;){let tt=Math.floor((L+F)/2);R<=W[tt]?F=tt:L=tt+1}let j=L*3,U=f?f[j]:j,_=f?f[j+1]:j+1,Q=f?f[j+2]:j+2,Z=U*p,K=_*p,J=Q*p,ae=u[Z],le=u[Z+1],Y=u[Z+2],te=u[K],ie=u[K+1],re=u[K+2],se=u[J],z=u[J+1],q=u[J+2],ge=this.rng(),fe=this.rng(),he=Math.sqrt(ge),ue=1-he,de=he*(1-fe),ve=he*fe,ke=(ae*ue+te*de+se*ve-G)*$,et=(le*ue+ie*de+z*ve-H)*$,je=(Y*ue+re*de+q*ve-B)*$;d[x*3]=ke,d[x*3+1]=et,d[x*3+2]=je}}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 p=u*3;this.positions[p]=l,this.positions[p+1]=l,this.positions[p+2]=l}this.alive=0,this.emitRemainder=0,this.pendingBurst=this.cfg.emitBurst;let d=new t.BufferGeometry;d.setAttribute("position",new t.BufferAttribute(this.positions,3)),d.setAttribute("color",new t.BufferAttribute(this.colors,3)),d.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:`
287
287
  attribute vec3 color;
288
288
  attribute float sizeFactor;
289
289
  varying vec3 vColor;
@@ -303,6 +303,6 @@ ${m}`));let g=t.get("fragment_output");return g&&(r=r.replace("#include <ditheri
303
303
  if (dist > 0.5) discard;
304
304
  gl_FragColor = vec4(vColor, uOpacity);
305
305
  }
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)),m=this.cfg.emitRate*a+this.emitRemainder,g=Math.floor(m);this.emitRemainder=m-g;let f=!1,S=1e6;for(let y=0;y<g;y+=1)this.spawnParticle(h);for(;this.pendingBurst>0;)this.spawnParticle(h),this.pendingBurst-=1;for(let y=0;y<l;y+=1){if(this.life[y]<=0)continue;if(this.life[y]-=a,this.life[y]<=0){this.life[y]=0;let v=y*3;this.positions[v]=S,this.positions[v+1]=S,this.positions[v+2]=S,this.colors[v]=0,this.colors[v+1]=0,this.colors[v+2]=0,f=!0;continue}let b=y*3;this.velocities[b]+=c[0]*a,this.velocities[b+1]+=c[1]*a,this.velocities[b+2]+=c[2]*a,this.velocities[b]*=1-u*a,this.velocities[b+1]*=1-u*a,this.velocities[b+2]*=1-u*a,this.positions[b]+=this.velocities[b]*a,this.positions[b+1]+=this.velocities[b+1]*a,this.positions[b+2]+=this.velocities[b+2]*a}this.points&&(this.points.geometry.attributes.position.needsUpdate=!0,f&&(this.points.geometry.attributes.color.needsUpdate=!0))}spawnParticle(a){let l=this.cfg.count,h=-1;for(let f=0;f<l;f+=1)if(this.life[f]<=0){h=f;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),d=[a[0]*u+(this.rng()-.5)*u*.2,a[1]*u+(this.rng()-.5)*u*.2,a[2]*u+(this.rng()-.5)*u*.2],m=h*3;this.positions.set(c,m),this.velocities.set(d,m),this.life[h]=this.cfg.particleLife,this.sizeFactors[h]=this.rng();let g=new t.Color(this.cfg.color);this.cfg.particleColorVariation>0&&g.offsetHSL((this.rng()-.5)*this.cfg.particleColorVariation,0,0),this.colors[m]=g.r,this.colors[m+1]=g.g,this.colors[m+2]=g.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),d=Math.max(0,this.cfg.instanceDisperseScatter),m=this.cfg.instanceDisperseScatterX>0?this.cfg.instanceDisperseScatterX:d,g=this.cfg.instanceDisperseScatterY>0?this.cfg.instanceDisperseScatterY:d,f=this.cfg.instanceDisperseScatterZ>0?this.cfg.instanceDisperseScatterZ:d,S=this.cfg.instanceRotationSpeed,y=new t.Object3D;for(let b=0;b<l;b+=1){let v=b*3,w=this.basePositions[v],P=this.basePositions[v+1],T=this.basePositions[v+2],R=this.basePhase[b],E=Math.sin((P+a*1.4)*.7+R)*c*this.cfg.spread,x=Math.cos((w-a*1.1)*.6+R)*c*this.cfg.spread,D=Math.sin((T+a*1.2)*.8+R)*c*this.cfg.spread,O=Math.sin(a*2.1+R+this.baseJitter[v]*2.5)*h,N=Math.cos(a*1.7+R+this.baseJitter[v+1]*2.5)*h,H=Math.sin(a*1.9+R+this.baseJitter[v+2]*2.5)*h,_=1+u,G=this.baseJitter[v],$=this.baseJitter[v+1],B=this.baseJitter[v+2],C=Math.sqrt(G*G+$*$+B*B)||1,M=u*this.cfg.spread,A=G/C*m*M,k=$/C*g*M,I=B/C*f*M;y.position.set(w*_+A+E+O,P*_+k+x+N,T*_+I+D+H),y.rotation.set(this.baseJitter[v]*.5,a*S+b*.1,this.baseJitter[v+2]*.5);let j=this.baseScales[b]*this.cfg.size;y.scale.set(j,j,j),y.updateMatrix(),this.instanced.setMatrixAt(b,y.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 M=this.randomInSphere(this.cfg.spread);this.basePositions.set(M,C*3)}return}let c=h.array,u=h.itemSize,d=Math.floor(c.length/u);if(d<=0)return;let m=l?.index?.array,g=Math.floor(m?m.length/3:d/3);if(g<=0)return;let f=1/0,S=1/0,y=1/0,b=-1/0,v=-1/0,w=-1/0;for(let C=0;C<d;C+=1){let M=C*u,A=c[M],k=c[M+1],I=c[M+2];f=Math.min(f,A),S=Math.min(S,k),y=Math.min(y,I),b=Math.max(b,A),v=Math.max(v,k),w=Math.max(w,I)}let P=Math.max(1e-6,b-f),T=Math.max(1e-6,v-S),R=Math.max(1e-6,w-y),E=(this.cfg.spreadX>0?this.cfg.spreadX:this.cfg.spread)*2,x=(this.cfg.spreadY>0?this.cfg.spreadY:this.cfg.spread)*2,D=E>0?E/P:1,O=x>0?x/T:1,N=Math.min(D,O),H=(f+b)*.5,_=(S+v)*.5,G=(y+w)*.5,$=new Float32Array(g),B=0;for(let C=0;C<g;C+=1){let M=C*3,A=m?m[M]:M,k=m?m[M+1]:M+1,I=m?m[M+2]:M+2,j=A*u,U=k*u,Z=I*u,X=c[j],K=c[j+1],q=c[j+2],he=c[U],fe=c[U+1],ye=c[U+2],ne=c[Z],be=c[Z+1],ve=c[Z+2],pe=he-X,ae=fe-K,V=ye-q,Y=ne-X,oe=be-K,le=ve-q,ee=ae*le-V*oe,te=V*Y-pe*le,ie=pe*oe-ae*Y,me=Math.sqrt(ee*ee+te*te+ie*ie)*.5;B+=me,$[C]=B}if(B<=0){for(let C=0;C<a;C+=1){let M=this.randomInSphere(this.cfg.spread);this.basePositions.set(M,C*3)}return}for(let C=0;C<a;C+=1){let M=this.rng()*B,A=0,k=g-1;for(;A<k;){let Re=Math.floor((A+k)/2);M<=$[Re]?k=Re:A=Re+1}let I=A*3,j=m?m[I]:I,U=m?m[I+1]:I+1,Z=m?m[I+2]:I+2,X=j*u,K=U*u,q=Z*u,he=c[X],fe=c[X+1],ye=c[X+2],ne=c[K],be=c[K+1],ve=c[K+2],pe=c[q],ae=c[q+1],V=c[q+2],Y=this.rng(),oe=this.rng(),le=Math.sqrt(Y),ee=1-le,te=le*(1-oe),ie=le*oe,me=(he*ee+ne*te+pe*ie-H)*N,Le=(fe*ee+be*te+ae*ie-_)*N,Ye=(ye*ee+ve*te+V*ie-G)*N;this.basePositions[C*3]=me,this.basePositions[C*3+1]=Le,this.basePositions[C*3+2]=Ye}}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),d=Math.cbrt(this.rng())*a;return[d*Math.sin(u)*Math.cos(c),d*Math.sin(u)*Math.sin(c),d*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 s(e)}forEachMesh(e,t){let i=s=>{s?.isMesh&&t(s)},r=e;if(typeof r?.traverse=="function"){r.traverse(s=>i(s));return}i(r)}forEachMaterial(e,t){let i=s=>{if(!s||!s.isMesh&&!s.isPoints)return;(Array.isArray(s.material)?s.material:[s.material]).forEach(o=>{o&&t(o)})},r=e;if(typeof r?.traverse=="function"){r.traverse(s=>i(s));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 s=e;if(!s?.layers||typeof s.layers.set!="function")return null;let n=new Map,o=(l,h)=>{this.hasLayers(l)&&(n.has(l)||n.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=s.layers.mask;return s.layers.set(r),{cameraMask:a,objectMasks:Array.from(n.entries()).map(([l,h])=>({object:l,mask:h}))}}endObjectLayerIsolation(e,t){let i=e,r=t;Array.isArray(r?.objectMasks)&&r.objectMasks.forEach(s=>{let n=s?.object,o=s?.mask;this.hasLayers(n)&&typeof o=="number"&&(n.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,s=r?.attributes?.position?.count;if(!Number.isFinite(s))return null;let n=Math.max(.05,Math.min(1,t)),o=Math.max(3,Math.floor(s*n));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 n=s.clone().applyMatrix4(r.matrixWorld);t.union(n),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:s})=>new Ge({engine:e,renderer:t,runtime:this.getPostProcessRuntime(),width:i,height:r,customFilterRegistry:s})}}getCustomFilterRegistry(){return{get:e=>ce.get(e)}}getCustomMaterialRegistry(){return{get:e=>re.get(e)}}},qe=class{constructor(e,t={}){this.engine=new Oe(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}}};return Mt(jt);})();
306
+ `});this.points=new t.Points(d,h),this.defaultEmitterMaterial=h,this.add(this.points)}buildInstanced(){let a=Math.max(1,this.cfg.count),l=this.cfg.particleShape==="model"&&this.modelGeometry,d=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(d,h,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 d=l.points??!0;(l.meshes??!0)&&(this.materialOverride=a),d&&(this.materialOverrideForPoints=a),this.applyMaterialOverrides()}updateEmitter(a){let l=this.cfg.count,d=this.normalize(this.cfg.particleDirection),h=this.cfg.particleGravity,u=Math.max(0,Math.min(1,this.cfg.particleDrag)),m=this.cfg.emitRate*a+this.emitRemainder,f=Math.floor(m);this.emitRemainder=m-f;let g=!1,S=1e6;for(let y=0;y<f;y+=1)this.spawnParticle(d);for(;this.pendingBurst>0;)this.spawnParticle(d),this.pendingBurst-=1;for(let y=0;y<l;y+=1){if(this.life[y]<=0)continue;if(this.life[y]-=a,this.life[y]<=0){this.life[y]=0;let v=y*3;this.positions[v]=S,this.positions[v+1]=S,this.positions[v+2]=S,this.colors[v]=0,this.colors[v+1]=0,this.colors[v+2]=0,g=!0;continue}let b=y*3;this.velocities[b]+=h[0]*a,this.velocities[b+1]+=h[1]*a,this.velocities[b+2]+=h[2]*a,this.velocities[b]*=1-u*a,this.velocities[b+1]*=1-u*a,this.velocities[b+2]*=1-u*a,this.positions[b]+=this.velocities[b]*a,this.positions[b+1]+=this.velocities[b+1]*a,this.positions[b+2]+=this.velocities[b+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,d=-1;for(let g=0;g<l;g+=1)if(this.life[g]<=0){d=g;break}if(d===-1)return;let h=this.randomInSphere(this.cfg.spread),u=this.cfg.particleSpeed*(1-this.cfg.particleSizeVariation+this.rng()*this.cfg.particleSizeVariation),p=[a[0]*u+(this.rng()-.5)*u*.2,a[1]*u+(this.rng()-.5)*u*.2,a[2]*u+(this.rng()-.5)*u*.2],m=d*3;this.positions.set(h,m),this.velocities.set(p,m),this.life[d]=this.cfg.particleLife,this.sizeFactors[d]=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[m]=f.r,this.colors[m+1]=f.g,this.colors[m+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,d=this.cfg.instanceJitter,h=this.cfg.instanceFlow,u=Math.max(0,this.cfg.instanceDisperse),p=Math.max(0,this.cfg.instanceDisperseScatter),m=this.cfg.instanceDisperseScatterX>0?this.cfg.instanceDisperseScatterX:p,f=this.cfg.instanceDisperseScatterY>0?this.cfg.instanceDisperseScatterY:p,g=this.cfg.instanceDisperseScatterZ>0?this.cfg.instanceDisperseScatterZ:p,S=this.cfg.instanceRotationSpeed,y=new t.Object3D;for(let b=0;b<l;b+=1){let v=b*3,w=this.basePositions[v],C=this.basePositions[v+1],T=this.basePositions[v+2],I=this.basePhase[b],E=Math.sin((C+a*1.4)*.7+I)*h*this.cfg.spread,M=Math.cos((w-a*1.1)*.6+I)*h*this.cfg.spread,D=Math.sin((T+a*1.2)*.8+I)*h*this.cfg.spread,O=Math.sin(a*2.1+I+this.baseJitter[v]*2.5)*d,k=Math.cos(a*1.7+I+this.baseJitter[v+1]*2.5)*d,$=Math.sin(a*1.9+I+this.baseJitter[v+2]*2.5)*d,G=1+u,H=this.baseJitter[v],B=this.baseJitter[v+1],W=this.baseJitter[v+2],P=Math.sqrt(H*H+B*B+W*W)||1,x=u*this.cfg.spread,R=H/P*m*x,L=B/P*f*x,F=W/P*g*x;y.position.set(w*G+R+E+O,C*G+L+M+k,T*G+F+D+$),y.rotation.set(this.baseJitter[v]*.5,a*S+b*.1,this.baseJitter[v+2]*.5);let j=this.baseScales[b]*this.cfg.size;y.scale.set(j,j,j),y.updateMatrix(),this.instanced.setMatrixAt(b,y.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(d=>{d&&this.modelKey===l&&(this.modelGeometry=d,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(d=>{d&&this.distributionKey===l&&(this.distributionGeometry=d,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 d=0;d<a;d+=1){let h=this.cfg.instanceShape==="box"?this.randomInBox(this.cfg.spread):this.randomInSphere(this.cfg.spread);this.basePositions.set(h,d*3)}for(let d=0;d<a;d+=1){let h=d*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[d]=this.rng()*Math.PI*2;let u=this.cfg.instanceScale*(1-this.cfg.instanceScaleVariation+this.rng()*this.cfg.instanceScaleVariation);this.baseScales[d]=u}}fillFromModel(a,l){let d=l?.attributes?.position;if(!d?.array||d.itemSize<3){for(let P=0;P<a;P+=1){let x=this.randomInSphere(this.cfg.spread);this.basePositions.set(x,P*3)}return}let h=d.array,u=d.itemSize,p=Math.floor(h.length/u);if(p<=0)return;let m=l?.index?.array,f=Math.floor(m?m.length/3:p/3);if(f<=0)return;let g=1/0,S=1/0,y=1/0,b=-1/0,v=-1/0,w=-1/0;for(let P=0;P<p;P+=1){let x=P*u,R=h[x],L=h[x+1],F=h[x+2];g=Math.min(g,R),S=Math.min(S,L),y=Math.min(y,F),b=Math.max(b,R),v=Math.max(v,L),w=Math.max(w,F)}let C=Math.max(1e-6,b-g),T=Math.max(1e-6,v-S),I=Math.max(1e-6,w-y),E=(this.cfg.spreadX>0?this.cfg.spreadX:this.cfg.spread)*2,M=(this.cfg.spreadY>0?this.cfg.spreadY:this.cfg.spread)*2,D=E>0?E/C:1,O=M>0?M/T:1,k=Math.min(D,O),$=(g+b)*.5,G=(S+v)*.5,H=(y+w)*.5,B=new Float32Array(f),W=0;for(let P=0;P<f;P+=1){let x=P*3,R=m?m[x]:x,L=m?m[x+1]:x+1,F=m?m[x+2]:x+2,j=R*u,U=L*u,_=F*u,Q=h[j],Z=h[j+1],K=h[j+2],J=h[U],ae=h[U+1],le=h[U+2],Y=h[_],te=h[_+1],ie=h[_+2],re=J-Q,se=ae-Z,z=le-K,q=Y-Q,ge=te-Z,fe=ie-K,he=se*fe-z*ge,ue=z*q-re*fe,de=re*ge-se*q,ve=Math.sqrt(he*he+ue*ue+de*de)*.5;W+=ve,B[P]=W}if(W<=0){for(let P=0;P<a;P+=1){let x=this.randomInSphere(this.cfg.spread);this.basePositions.set(x,P*3)}return}for(let P=0;P<a;P+=1){let x=this.rng()*W,R=0,L=f-1;for(;R<L;){let je=Math.floor((R+L)/2);x<=B[je]?L=je:R=je+1}let F=R*3,j=m?m[F]:F,U=m?m[F+1]:F+1,_=m?m[F+2]:F+2,Q=j*u,Z=U*u,K=_*u,J=h[Q],ae=h[Q+1],le=h[Q+2],Y=h[Z],te=h[Z+1],ie=h[Z+2],re=h[K],se=h[K+1],z=h[K+2],q=this.rng(),ge=this.rng(),fe=Math.sqrt(q),he=1-fe,ue=fe*(1-ge),de=fe*ge,ve=(J*he+Y*ue+re*de-$)*k,ke=(ae*he+te*ue+se*de-G)*k,et=(le*he+ie*ue+z*de-H)*k;this.basePositions[P*3]=ve,this.basePositions[P*3+1]=ke,this.basePositions[P*3+2]=et}}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(),d=this.rng(),h=l*Math.PI*2,u=Math.acos(2*d-1),p=Math.cbrt(this.rng())*a;return[p*Math.sin(u)*Math.cos(h),p*Math.sin(u)*Math.sin(h),p*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 s(e)}forEachMesh(e,t){let i=s=>{s?.isMesh&&t(s)},r=e;if(typeof r?.traverse=="function"){r.traverse(s=>i(s));return}i(r)}forEachMaterial(e,t){let i=s=>{if(!s||!s.isMesh&&!s.isPoints)return;(Array.isArray(s.material)?s.material:[s.material]).forEach(o=>{o&&t(o)})},r=e;if(typeof r?.traverse=="function"){r.traverse(s=>i(s));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 s=e;if(!s?.layers||typeof s.layers.set!="function")return null;let n=new Map,o=(l,d)=>{this.hasLayers(l)&&(n.has(l)||n.set(l,l.layers.mask),d==="set"?l.layers.set(r):l.layers.enable(r))};t.forEach(l=>o(l,"set")),i.forEach(l=>o(l,"enable"));let a=s.layers.mask;return s.layers.set(r),{cameraMask:a,objectMasks:Array.from(n.entries()).map(([l,d])=>({object:l,mask:d}))}}endObjectLayerIsolation(e,t){let i=e,r=t;Array.isArray(r?.objectMasks)&&r.objectMasks.forEach(s=>{let n=s?.object,o=s?.mask;this.hasLayers(n)&&typeof o=="number"&&(n.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,s=r?.attributes?.position?.count;if(!Number.isFinite(s))return null;let n=Math.max(.05,Math.min(1,t)),o=Math.max(3,Math.floor(s*n));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 n=s.clone().applyMatrix4(r.matrixWorld);t.union(n),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:s})=>new Qe({engine:e,renderer:t,runtime:this.getPostProcessRuntime(),width:i,height:r,customFilterRegistry:s})}}getCustomFilterRegistry(){return{get:e=>ye.get(e)}}getCustomMaterialRegistry(){return{get:e=>pe.get(e)}}},Je=class{constructor(e,t={}){this.engine=new Ve(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}}};return Rt(ai);})();
308
308
  //# sourceMappingURL=index.js.map