@epigraph/configurator 1.13.0-alpha → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -9335,7 +9335,7 @@ void main() {
9335
9335
  vec3 clampedHdrColor = max( HALF_FLOAT_MIN, min( HALF_FLOAT_MAX, hdrColor ));
9336
9336
  gl_FragColor = vec4( clampedHdrColor , 1.0 );
9337
9337
  }
9338
- `;class GainMapDecoderMaterial extends ShaderMaterial{constructor({gamma:s,offsetHdr:a,offsetSdr:b,gainMapMin:_e,gainMapMax:bt,maxDisplayBoost:rn,hdrCapacityMin:sn,hdrCapacityMax:yn,sdr:Pn,gainMap:zn}){super({name:"GainMapDecoderMaterial",vertexShader,fragmentShader,uniforms:{sdr:{value:Pn},gainMap:{value:zn},gamma:{value:new Vector3(1/s[0],1/s[1],1/s[2])},offsetHdr:{value:new Vector3().fromArray(a)},offsetSdr:{value:new Vector3().fromArray(b)},gainMapMin:{value:new Vector3().fromArray(_e)},gainMapMax:{value:new Vector3().fromArray(bt)},weightFactor:{value:(Math.log2(rn)-sn)/(yn-sn)}},blending:NoBlending,depthTest:!1,depthWrite:!1}),this._maxDisplayBoost=rn,this._hdrCapacityMin=sn,this._hdrCapacityMax=yn,this.needsUpdate=!0,this.uniformsNeedUpdate=!0}get sdr(){return this.uniforms.sdr.value}set sdr(s){this.uniforms.sdr.value=s}get gainMap(){return this.uniforms.gainMap.value}set gainMap(s){this.uniforms.gainMap.value=s}get offsetHdr(){return this.uniforms.offsetHdr.value.toArray()}set offsetHdr(s){this.uniforms.offsetHdr.value.fromArray(s)}get offsetSdr(){return this.uniforms.offsetSdr.value.toArray()}set offsetSdr(s){this.uniforms.offsetSdr.value.fromArray(s)}get gainMapMin(){return this.uniforms.gainMapMin.value.toArray()}set gainMapMin(s){this.uniforms.gainMapMin.value.fromArray(s)}get gainMapMax(){return this.uniforms.gainMapMax.value.toArray()}set gainMapMax(s){this.uniforms.gainMapMax.value.fromArray(s)}get gamma(){const s=this.uniforms.gamma.value;return[1/s.x,1/s.y,1/s.z]}set gamma(s){const a=this.uniforms.gamma.value;a.x=1/s[0],a.y=1/s[1],a.z=1/s[2]}get hdrCapacityMin(){return this._hdrCapacityMin}set hdrCapacityMin(s){this._hdrCapacityMin=s,this.calculateWeight()}get hdrCapacityMax(){return this._hdrCapacityMax}set hdrCapacityMax(s){this._hdrCapacityMax=s,this.calculateWeight()}get maxDisplayBoost(){return this._maxDisplayBoost}set maxDisplayBoost(s){this._maxDisplayBoost=Math.max(1,Math.min(65504,s)),this.calculateWeight()}calculateWeight(){const s=(Math.log2(this._maxDisplayBoost)-this._hdrCapacityMin)/(this._hdrCapacityMax-this._hdrCapacityMin);this.uniforms.weightFactor.value=Math.max(0,Math.min(1,s))}}class GainMapNotFoundError extends Error{}class XMPMetadataNotFoundError extends Error{}const getAttribute=(o,s,a)=>{var b;let _e;const bt=(b=o.attributes.getNamedItem(s))===null||b===void 0?void 0:b.nodeValue;if(bt)_e=bt;else{const rn=o.getElementsByTagName(s)[0];if(rn){const sn=rn.getElementsByTagName("rdf:li");if(sn.length===3)_e=Array.from(sn).map(yn=>yn.innerHTML);else throw new Error(`Gainmap metadata contains an array of items for ${s} but its length is not 3`)}else{if(a)return a;throw new Error(`Can't find ${s} in gainmap metadata`)}}return _e},extractXMP=o=>{var s,a;let b;typeof TextDecoder<"u"?b=new TextDecoder().decode(o):b=o.toString();let _e=b.indexOf("<x:xmpmeta");const bt=new DOMParser;for(;_e!==-1;){const rn=b.indexOf("x:xmpmeta>",_e);b.slice(_e,rn+10);const sn=b.slice(_e,rn+10);try{const Pn=bt.parseFromString(sn,"text/xml").getElementsByTagName("rdf:Description")[0],zn=getAttribute(Pn,"hdrgm:GainMapMin","0"),ar=getAttribute(Pn,"hdrgm:GainMapMax"),lr=getAttribute(Pn,"hdrgm:Gamma","1"),cr=getAttribute(Pn,"hdrgm:OffsetSDR","0.015625"),hr=getAttribute(Pn,"hdrgm:OffsetHDR","0.015625");let es=(s=Pn.attributes.getNamedItem("hdrgm:HDRCapacityMin"))===null||s===void 0?void 0:s.nodeValue;es||(es="0");const Ur=(a=Pn.attributes.getNamedItem("hdrgm:HDRCapacityMax"))===null||a===void 0?void 0:a.nodeValue;if(!Ur)throw new Error("Incomplete gainmap metadata");return{gainMapMin:Array.isArray(zn)?zn.map(Dr=>parseFloat(Dr)):[parseFloat(zn),parseFloat(zn),parseFloat(zn)],gainMapMax:Array.isArray(ar)?ar.map(Dr=>parseFloat(Dr)):[parseFloat(ar),parseFloat(ar),parseFloat(ar)],gamma:Array.isArray(lr)?lr.map(Dr=>parseFloat(Dr)):[parseFloat(lr),parseFloat(lr),parseFloat(lr)],offsetSdr:Array.isArray(cr)?cr.map(Dr=>parseFloat(Dr)):[parseFloat(cr),parseFloat(cr),parseFloat(cr)],offsetHdr:Array.isArray(hr)?hr.map(Dr=>parseFloat(Dr)):[parseFloat(hr),parseFloat(hr),parseFloat(hr)],hdrCapacityMin:parseFloat(es),hdrCapacityMax:parseFloat(Ur)}}catch{}_e=b.indexOf("<x:xmpmeta",rn)}};class MPFExtractor{constructor(s){this.options={debug:s&&s.debug!==void 0?s.debug:!1,extractFII:s&&s.extractFII!==void 0?s.extractFII:!0,extractNonFII:s&&s.extractNonFII!==void 0?s.extractNonFII:!0}}extract(s){return new Promise((a,b)=>{const _e=this.options.debug,bt=new DataView(s.buffer);if(bt.getUint16(0)!==65496){b(new Error("Not a valid jpeg"));return}const rn=bt.byteLength;let sn=2,yn=0,Pn;for(;sn<rn;){if(++yn>250){b(new Error(`Found no marker after ${yn} loops 😵`));return}if(bt.getUint8(sn)!==255){b(new Error(`Not a valid marker at offset 0x${sn.toString(16)}, found: 0x${bt.getUint8(sn).toString(16)}`));return}if(Pn=bt.getUint8(sn+1),_e&&console.log(`Marker: ${Pn.toString(16)}`),Pn===226){_e&&console.log("Found APP2 marker (0xffe2)");const zn=sn+4;if(bt.getUint32(zn)===1297106432){const ar=zn+4;let lr;if(bt.getUint16(ar)===18761)lr=!1;else if(bt.getUint16(ar)===19789)lr=!0;else{b(new Error("No valid endianness marker found in TIFF header"));return}if(bt.getUint16(ar+2,!lr)!==42){b(new Error("Not valid TIFF data! (no 0x002A marker)"));return}const cr=bt.getUint32(ar+4,!lr);if(cr<8){b(new Error("Not valid TIFF data! (First offset less than 8)"));return}const hr=ar+cr,es=bt.getUint16(hr,!lr),Ur=hr+2;let Dr=0;for(let os=Ur;os<Ur+12*es;os+=12)bt.getUint16(os,!lr)===45057&&(Dr=bt.getUint32(os+8,!lr));const zr=4,rs=hr+2+es*12+zr,as=[];for(let os=rs;os<rs+Dr*16;os+=16){const cs={MPType:bt.getUint32(os,!lr),size:bt.getUint32(os+4,!lr),dataOffset:bt.getUint32(os+8,!lr),dependantImages:bt.getUint32(os+12,!lr),start:-1,end:-1,isFII:!1};cs.dataOffset?(cs.start=ar+cs.dataOffset,cs.isFII=!1):(cs.start=0,cs.isFII=!0),cs.end=cs.start+cs.size,as.push(cs)}if(this.options.extractNonFII&&as.length){const os=new Blob([bt]),cs=[];for(const ga of as){if(ga.isFII&&!this.options.extractFII)continue;const mo=os.slice(ga.start,ga.end+1,"image/jpeg");cs.push(mo)}a(cs)}}}sn+=2+bt.getUint16(sn+2)}})}}const extractGainmapFromJPEG=async o=>{const s=extractXMP(o);if(!s)throw new XMPMetadataNotFoundError("Gain map XMP metadata not found");const b=await new MPFExtractor({extractFII:!0,extractNonFII:!0}).extract(o);if(b.length!==2)throw new GainMapNotFoundError("Gain map recovery image not found");return{sdr:new Uint8Array(await b[0].arrayBuffer()),gainMap:new Uint8Array(await b[1].arrayBuffer()),metadata:s}},getHTMLImageFromBlob=o=>new Promise((s,a)=>{const b=document.createElement("img");b.onload=()=>{s(b)},b.onerror=_e=>{a(_e)},b.src=URL.createObjectURL(o)});class LoaderBase extends Loader{constructor(s,a){super(a),s&&(this._renderer=s),this._internalLoadingManager=new LoadingManager}setRenderer(s){return this._renderer=s,this}setRenderTargetOptions(s){return this._renderTargetOptions=s,this}prepareQuadRenderer(){this._renderer||console.warn("WARNING: An existing WebGL Renderer was not passed to this Loader constructor or in setRenderer, the result of this Loader will need to be converted to a Data Texture with toDataTexture() before you can use it in your renderer.");const s=new GainMapDecoderMaterial({gainMapMax:[1,1,1],gainMapMin:[0,0,0],gamma:[1,1,1],offsetHdr:[1,1,1],offsetSdr:[1,1,1],hdrCapacityMax:1,hdrCapacityMin:0,maxDisplayBoost:1,gainMap:new Texture,sdr:new Texture});return new QuadRenderer({width:16,height:16,type:HalfFloatType,colorSpace:LinearSRGBColorSpace$1,material:s,renderer:this._renderer,renderTargetOptions:this._renderTargetOptions})}async render(s,a,b,_e){const bt=_e?new Blob([_e],{type:"image/jpeg"}):void 0,rn=new Blob([b],{type:"image/jpeg"});let sn,yn,Pn=!1;if(typeof createImageBitmap>"u"){const lr=await Promise.all([bt?getHTMLImageFromBlob(bt):Promise.resolve(void 0),getHTMLImageFromBlob(rn)]);yn=lr[0],sn=lr[1],Pn=!0}else{const lr=await Promise.all([bt?createImageBitmap(bt,{imageOrientation:"flipY"}):Promise.resolve(void 0),createImageBitmap(rn,{imageOrientation:"flipY"})]);yn=lr[0],sn=lr[1]}const zn=new Texture(yn||new ImageData(2,2),UVMapping,ClampToEdgeWrapping,ClampToEdgeWrapping,LinearFilter,LinearMipMapLinearFilter,RGBAFormat,UnsignedByteType,1,LinearSRGBColorSpace$1);zn.flipY=Pn,zn.needsUpdate=!0;const ar=new Texture(sn,UVMapping,ClampToEdgeWrapping,ClampToEdgeWrapping,LinearFilter,LinearMipMapLinearFilter,RGBAFormat,UnsignedByteType,1,SRGBColorSpace$1);ar.flipY=Pn,ar.needsUpdate=!0,s.width=sn.width,s.height=sn.height,s.material.gainMap=zn,s.material.sdr=ar,s.material.gainMapMin=a.gainMapMin,s.material.gainMapMax=a.gainMapMax,s.material.offsetHdr=a.offsetHdr,s.material.offsetSdr=a.offsetSdr,s.material.gamma=a.gamma,s.material.hdrCapacityMin=a.hdrCapacityMin,s.material.hdrCapacityMax=a.hdrCapacityMax,s.material.maxDisplayBoost=Math.pow(2,a.hdrCapacityMax),s.material.needsUpdate=!0,s.render()}}class GainMapLoader extends LoaderBase{load([s,a,b],_e,bt,rn){const sn=this.prepareQuadRenderer();let yn,Pn,zn;const ar=async()=>{if(yn&&Pn&&zn){try{await this.render(sn,zn,yn,Pn)}catch(zs){this.manager.itemError(s),this.manager.itemError(a),this.manager.itemError(b),typeof rn=="function"&&rn(zs),sn.disposeOnDemandRenderer();return}typeof _e=="function"&&_e(sn),this.manager.itemEnd(s),this.manager.itemEnd(a),this.manager.itemEnd(b),sn.disposeOnDemandRenderer()}};let lr=!0,cr=0,hr=0,es=!0,Ur=0,Dr=0,zr=!0,rs=0,as=0;const os=()=>{if(typeof bt=="function"){const zs=cr+Ur+rs,ho=hr+Dr+as,yl=lr&&es&&zr;bt(new ProgressEvent("progress",{lengthComputable:yl,loaded:ho,total:zs}))}};this.manager.itemStart(s),this.manager.itemStart(a),this.manager.itemStart(b);const cs=new FileLoader(this._internalLoadingManager);cs.setResponseType("arraybuffer"),cs.setRequestHeader(this.requestHeader),cs.setPath(this.path),cs.setWithCredentials(this.withCredentials),cs.load(s,async zs=>{if(typeof zs=="string")throw new Error("Invalid sdr buffer");yn=zs,await ar()},zs=>{lr=zs.lengthComputable,hr=zs.loaded,cr=zs.total,os()},zs=>{this.manager.itemError(s),typeof rn=="function"&&rn(zs)});const ga=new FileLoader(this._internalLoadingManager);ga.setResponseType("arraybuffer"),ga.setRequestHeader(this.requestHeader),ga.setPath(this.path),ga.setWithCredentials(this.withCredentials),ga.load(a,async zs=>{if(typeof zs=="string")throw new Error("Invalid gainmap buffer");Pn=zs,await ar()},zs=>{es=zs.lengthComputable,Dr=zs.loaded,Ur=zs.total,os()},zs=>{this.manager.itemError(a),typeof rn=="function"&&rn(zs)});const mo=new FileLoader(this._internalLoadingManager);return mo.setRequestHeader(this.requestHeader),mo.setPath(this.path),mo.setWithCredentials(this.withCredentials),mo.load(b,async zs=>{if(typeof zs!="string")throw new Error("Invalid metadata string");zn=JSON.parse(zs),await ar()},zs=>{zr=zs.lengthComputable,as=zs.loaded,rs=zs.total,os()},zs=>{this.manager.itemError(b),typeof rn=="function"&&rn(zs)}),sn}}class HDRJPGLoader extends LoaderBase{load(s,a,b,_e){const bt=this.prepareQuadRenderer(),rn=new FileLoader(this._internalLoadingManager);return rn.setResponseType("arraybuffer"),rn.setRequestHeader(this.requestHeader),rn.setPath(this.path),rn.setWithCredentials(this.withCredentials),this.manager.itemStart(s),rn.load(s,async sn=>{if(typeof sn=="string")throw new Error("Invalid buffer, received [string], was expecting [ArrayBuffer]");const yn=new Uint8Array(sn);let Pn,zn,ar;try{const lr=await extractGainmapFromJPEG(yn);Pn=lr.sdr,zn=lr.gainMap,ar=lr.metadata}catch(lr){if(lr instanceof XMPMetadataNotFoundError||lr instanceof GainMapNotFoundError)console.warn(`Failure to reconstruct an HDR image from ${s}: Gain map metadata not found in the file, HDRJPGLoader will render the SDR jpeg`),ar={gainMapMin:[0,0,0],gainMapMax:[1,1,1],gamma:[1,1,1],hdrCapacityMin:0,hdrCapacityMax:1,offsetHdr:[0,0,0],offsetSdr:[0,0,0]},Pn=yn;else throw lr}try{await this.render(bt,ar,Pn,zn)}catch(lr){this.manager.itemError(s),typeof _e=="function"&&_e(lr),bt.disposeOnDemandRenderer();return}typeof a=="function"&&a(bt),this.manager.itemEnd(s),bt.disposeOnDemandRenderer()},b,sn=>{this.manager.itemError(s),typeof _e=="function"&&_e(sn)}),bt}}const presetsObj={apartment:"lebombo_1k.hdr",city:"potsdamer_platz_1k.hdr",dawn:"kiara_1_dawn_1k.hdr",forest:"forest_slope_1k.hdr",lobby:"st_fagans_interior_1k.hdr",night:"dikhololo_night_1k.hdr",park:"rooitou_park_1k.hdr",studio:"studio_small_03_1k.hdr",sunset:"venice_sunset_1k.hdr",warehouse:"empty_warehouse_01_1k.hdr"},CUBEMAP_ROOT="https://raw.githack.com/pmndrs/drei-assets/456060a26bbeb8fdf79326f224b6d99b8bcce736/hdri/",isArray=o=>Array.isArray(o);function useEnvironment({files:o=["/px.png","/nx.png","/py.png","/ny.png","/pz.png","/nz.png"],path:s="",preset:a=void 0,encoding:b=void 0,extensions:_e}={}){var bt;let rn=null,sn=!1;if(a){if(!(a in presetsObj))throw new Error("Preset must be one of: "+Object.keys(presetsObj).join(", "));o=presetsObj[a],s=CUBEMAP_ROOT}const yn=isArray(o)&&o.length===6,Pn=isArray(o)&&o.length===3&&o.some(Ur=>Ur.endsWith("json")),zn=isArray(o)?o[0]:o;sn=isArray(o);const ar=yn?"cube":Pn?"webp":zn.startsWith("data:application/exr")?"exr":zn.startsWith("data:application/hdr")?"hdr":zn.startsWith("data:image/jpeg")?"jpg":(bt=zn.split(".").pop())==null||(bt=bt.split("?"))==null||(bt=bt.shift())==null?void 0:bt.toLowerCase();if(rn=ar==="cube"?CubeTextureLoader:ar==="hdr"?RGBELoader:ar==="exr"?EXRLoader:ar==="jpg"||ar==="jpeg"?HDRJPGLoader:ar==="webp"?GainMapLoader:null,!rn)throw new Error("useEnvironment: Unrecognized file extension: "+o);const lr=useThree(Ur=>Ur.gl);reactExports.useLayoutEffect(()=>{if(ar!=="webp"&&ar!=="jpg"&&ar!=="jpeg")return;function Ur(){useLoader.clear(rn,sn?[o]:o)}lr.domElement.addEventListener("webglcontextlost",Ur,{once:!0})},[o,lr.domElement]);const cr=useLoader(rn,sn?[o]:o,Ur=>{(ar==="webp"||ar==="jpg"||ar==="jpeg")&&Ur.setRenderer(lr),Ur.setPath==null||Ur.setPath(s),_e&&_e(Ur)});let hr=sn?cr[0]:cr;if(ar==="jpg"||ar==="jpeg"||ar==="webp"){var es;hr=(es=hr.renderTarget)==null?void 0:es.texture}return hr.mapping=yn?CubeReflectionMapping:EquirectangularReflectionMapping,"colorSpace"in hr?hr.colorSpace=b??yn?"srgb":"srgb-linear":hr.encoding=b??yn?sRGBEncoding:LinearEncoding,hr}const isRef$1=o=>o.current&&o.current.isScene,resolveScene=o=>isRef$1(o)?o.current:o;function setEnvProps(o,s,a,b,_e={}){var bt,rn,sn,yn,Pn;_e={backgroundBlurriness:(bt=_e.blur)!==null&&bt!==void 0?bt:0,backgroundIntensity:1,backgroundRotation:[0,0,0],environmentIntensity:1,environmentRotation:[0,0,0],..._e};const zn=resolveScene(s||a),ar=zn.background,lr=zn.environment,cr={backgroundBlurriness:zn.backgroundBlurriness,backgroundIntensity:zn.backgroundIntensity,backgroundRotation:(rn=(sn=zn.backgroundRotation)==null||sn.clone==null?void 0:sn.clone())!==null&&rn!==void 0?rn:[0,0,0],environmentIntensity:zn.environmentIntensity,environmentRotation:(yn=(Pn=zn.environmentRotation)==null||Pn.clone==null?void 0:Pn.clone())!==null&&yn!==void 0?yn:[0,0,0]};return o!=="only"&&(zn.environment=b),o&&(zn.background=b),applyProps(zn,_e),()=>{o!=="only"&&(zn.environment=lr),o&&(zn.background=ar),applyProps(zn,cr)}}function EnvironmentMap({scene:o,background:s=!1,map:a,...b}){const _e=useThree(bt=>bt.scene);return reactExports.useLayoutEffect(()=>{if(a)return setEnvProps(s,o,_e,a,b)}),null}function EnvironmentCube({background:o=!1,scene:s,blur:a,backgroundBlurriness:b,backgroundIntensity:_e,backgroundRotation:bt,environmentIntensity:rn,environmentRotation:sn,...yn}){const Pn=useEnvironment(yn),zn=useThree(ar=>ar.scene);return reactExports.useLayoutEffect(()=>setEnvProps(o,s,zn,Pn,{blur:a,backgroundBlurriness:b,backgroundIntensity:_e,backgroundRotation:bt,environmentIntensity:rn,environmentRotation:sn})),null}function EnvironmentPortal({children:o,near:s=1,far:a=1e3,resolution:b=256,frames:_e=1,map:bt,background:rn=!1,blur:sn,backgroundBlurriness:yn,backgroundIntensity:Pn,backgroundRotation:zn,environmentIntensity:ar,environmentRotation:lr,scene:cr,files:hr,path:es,preset:Ur=void 0,extensions:Dr}){const zr=useThree(mo=>mo.gl),rs=useThree(mo=>mo.scene),as=reactExports.useRef(null),[os]=reactExports.useState(()=>new Scene),cs=reactExports.useMemo(()=>{const mo=new WebGLCubeRenderTarget(b);return mo.texture.type=HalfFloatType,mo},[b]);reactExports.useLayoutEffect(()=>(_e===1&&as.current.update(zr,os),setEnvProps(rn,cr,rs,cs.texture,{blur:sn,backgroundBlurriness:yn,backgroundIntensity:Pn,backgroundRotation:zn,environmentIntensity:ar,environmentRotation:lr})),[o,os,cs.texture,cr,rs,rn,_e,zr]);let ga=1;return useFrame(()=>{(_e===1/0||ga<_e)&&(as.current.update(zr,os),ga++)}),reactExports.createElement(reactExports.Fragment,null,createPortal(reactExports.createElement(reactExports.Fragment,null,o,reactExports.createElement("cubeCamera",{ref:as,args:[s,a,cs]}),hr||Ur?reactExports.createElement(EnvironmentCube,{background:!0,files:hr,preset:Ur,path:es,extensions:Dr}):bt?reactExports.createElement(EnvironmentMap,{background:!0,map:bt,extensions:Dr}):null),os))}function EnvironmentGround(o){var s,a,b,_e;const bt=useEnvironment(o),rn=o.map||bt;reactExports.useMemo(()=>extend({GroundProjectedEnvImpl:GroundProjectedEnv}),[]);const sn=reactExports.useMemo(()=>[rn],[rn]),yn=(s=o.ground)==null?void 0:s.height,Pn=(a=o.ground)==null?void 0:a.radius,zn=(b=(_e=o.ground)==null?void 0:_e.scale)!==null&&b!==void 0?b:1e3;return reactExports.createElement(reactExports.Fragment,null,reactExports.createElement(EnvironmentMap,_extends$1({},o,{map:rn})),reactExports.createElement("groundProjectedEnvImpl",{args:sn,scale:zn,height:yn,radius:Pn}))}function Environment(o){return o.ground?reactExports.createElement(EnvironmentGround,o):o.map?reactExports.createElement(EnvironmentMap,o):o.children?reactExports.createElement(EnvironmentPortal,o):reactExports.createElement(EnvironmentCube,o)}const LightManager=()=>{const[o,s]=reactExports.useState(!1),a=productDataStore$1(rn=>rn),b=lightStore(rn=>rn),[_e,bt]=reactExports.useState(1);return reactExports.useEffect(()=>{const rn=a.assetsData,sn=rn?.sceneMoodSettings?.envMap;sn&&(lightStore.setState({defaultEnvMapUrl:sn}),b.actions.setEnvLightMap(sn)),b.envMapUrl===""&&b.actions.setEnvLightMap(lightStore.getState().defaultEnvMapUrl);const yn=rn?.sceneMoodSettings?.ambientLightIntensity;yn!==void 0&&bt(yn),s(!0)},[]),reactExports.useEffect(()=>{o!==!1&&(LOGGER.groupCollapsed("SCENE LIGHTING INFO:"),LOGGER.table({title:"Scene Lights",details:{"Environment Map":b.envMapUrl,"Ambient Light Intensity":_e}}),LOGGER.groupEnd())},[o]),jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:o===!0&&jsxRuntimeExports.jsxs("group",{name:"GRP_LIGHTS",children:[jsxRuntimeExports.jsx("ambientLight",{intensity:_e}),jsxRuntimeExports.jsx(Environment,{background:!1,files:CORE_API.getResolvedAssetUrl(b.envMapUrl)})]})})},ColliderGeo=({itemKey:o})=>{const s=reactExports.useRef(null),a=itemStore(b=>b);return reactExports.useEffect(()=>{if(s.current)return a.collidersRef.push(s),a.actions.setCollidersRef([...a.collidersRef]),()=>{const b=a.collidersRef.indexOf(s);b>-1&&a.collidersRef.splice(b,1),a.actions.setCollidersRef([...a.collidersRef])}},[s]),jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:(o.itemData.hasOwnProperty("disableCollider")?!o.itemData.disableCollider:!coreSceneStore.getState().sceneSettings.disableCollider)&&jsxRuntimeExports.jsx("group",{name:"GRP_LoadingPlaceholder",children:jsxRuntimeExports.jsx("group",{position:o.itemData.boundingSphereCenter,scale:[.9,.9,.9],name:"boxGeometry",children:jsxRuntimeExports.jsx(Box,{ref:s,scale:Vec3ToArr(o.itemData.boundingBoxSize),visible:!1})})})})},ProxyGeo=({proxyScene:o,proxyOnly:s,scale:a,itemKey:b})=>{const[_e,bt]=reactExports.useState(!s),rn=reactExports.useRef(null),sn=reactExports.useMemo(()=>o.clone(),[]);return reactExports.useEffect(()=>()=>{dispose3(sn)},[sn]),reactExports.useEffect(()=>{if(s){if(attachmentStore$1.getState().attachmentSystem.currentStructure.getNodeByGUID(b.itemData.guid)==null)return;attachmentStore$1.getState().actions.updateFittingSkuIds(),CORE_API.fireEvent(CORE_API.EVENTS.SCENE.Model_Loaded,b.itemData.skuID),CORE_API.fireEvent(CORE_API.EVENTS.SCENE.Item_Added,{...b,visualizedInScene:!1})}else{const yn=Pn=>{b.itemData.skuID===Pn.data&&bt(!1)};CORE_API.coreWCRef.addEventListener(CORE_API.EVENTS.SCENE.Model_Loaded,yn,{once:!0})}},[]),jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:jsxRuntimeExports.jsx("group",{name:"GRP_ProxyMesh",onClick:()=>{CORE_API.closeContextMenu()},children:jsxRuntimeExports.jsx("primitive",{ref:rn,name:"proxyGeometry",autoFocusEnabled:!s,object:sn,scale:a,visible:_e&&!s,wireframe:_e&&!s,children:_e&&!s&&jsxRuntimeExports.jsx(Html,{center:!0,distanceFactor:b.itemData.boundingBoxSize.x*4>1?1:b.itemData.boundingBoxSize.x*4,position:b.itemData.boundingSphereCenter,zIndexRange:[29,0],children:jsxRuntimeExports.jsx("img",{alt:"Loading...",draggable:"false",src:PUBLIC_DESIGN_ASSETS_ENDPOINT+"/Animation/Loading.svg"})})})})})};function Draggable({children:o,guid:s,onDragStartHandler:a,onDragEndHandler:b,onItemClickHandler:_e,onPointerEnter:bt,onPointerLeave:rn,dragging:sn=!1,intersectingGhostObject:yn=null,isInteractive:Pn=!0,initialIntersectedGhostUUID:zn=null,isSnapAllowed:ar=!1,...lr}){const cr=reactExports.useRef(),hr=reactExports.useRef(-1),es=reactExports.useRef([]),Ur=reactExports.useRef([]),{raycaster:Dr,size:zr,camera:rs}=useThree(),as=hotspotStore$1(gy=>gy.isAnyHotspotActive),os=coreSceneStore(gy=>gy.multipleTouchDetected),[cs,ga]=reactExports.useState(null),{raycasterGhost:mo}=reactExports.useMemo(()=>({raycasterGhost:new Raycaster})),zs=gy=>{let _f;return gy.isGhost===!0?_f=gy:gy.parent?gy.parent.isGhost===!0?_f=gy.parent:_f=zs(gy.parent):_f=null,_f},ho=gy=>{mo.layers.enable(GHOST_LAYER),mo.setFromCamera(gy,rs);const _f=mo.intersectObject(ghostStore.getState().ghostParentRef);let Cy=null;return _f.length>0&&(Cy=zs(_f[0].object)),Cy},yl=gy=>{let _f=gy.whichNodesAreAttachedToUs();return _f.map(Cy=>{yl(Cy).map(aA=>{_f.push(aA)})}),_f},{initialMouse2D:go,mouse2D:Al,mouse3D:_d,offset:by,normal:yy,plane:wy,pointerDownPos:El}=reactExports.useMemo(()=>({initialMouse2D:new Vector2,mouse2D:new Vector2,mouse3D:new Vector3,offset:new Vector3,normal:new Vector3,plane:new Plane,pointerDownPos:new Vector2}),[]);reactExports.useEffect(()=>{let gy=attachmentStore$1.getState().attachmentSystem.currentStructure.getNodeByGUID(s);ga(gy)},[]);const _c=useGesture({onPointerEnter:gy=>{os||coreSceneStore.getState().sceneSettings.disableDragDrop&&coreSceneStore.getState().sceneSettings.disableContextMenu||coreSceneStore.getState().itemDraggedSkuID||coreSceneStore.getState().cameraActive!==!0&&!coreSceneStore.getState().dragging&&!as&&(cs&&!cs.isEndNode?CORE_API.switchCursor(CURSORS.POINTER):CORE_API.switchCursor(CURSORS.GRAB),bt(gy.event))},onPointerLeave:gy=>{os||coreSceneStore.getState().sceneSettings.disableDragDrop&&coreSceneStore.getState().sceneSettings.disableContextMenu||coreSceneStore.getState().itemDraggedSkuID||coreSceneStore.getState().cameraActive!==!0&&!coreSceneStore.getState().dragging&&!as&&(CORE_API.switchCursor(CURSORS.GRAB),rn(gy.event))},onClick:gy=>{if(gy.event.stopPropagation(),!os){if(coreSceneStore.getState().builderMode){const{eventObject:_f,point:Cy}=gy.event;_f.getWorldPosition(by).sub(Cy),_d.copy(Cy);const Fy=gy.event.offsetX,aA=gy.event.offsetY,cA=Fy/zr.width*2-1,Oy=-aA/zr.height*2+1;Al.set(cA,Oy);const IA=new Raycaster;IA.setFromCamera(Al,rs);const $A=IA.intersectObject(coreSceneStore.getState().sceneRef.getObjectByName("proxyGeometry"));$A.length>0&&CORE_API.fireEvent(CORE_API.EVENTS.CONFIGURATION.OnClickItem,{point:$A[0].point,camera:IA.camera})}if(!coreSceneStore.getState().sceneSettings.disableContextMenu)if(!gy.dragging&&!as){if(Math.abs(gy.event.x-El.x)>1)return;_e(gy.event.offsetX,gy.event.offsetY,s)}else hotspotStore$1.getState().actions.exitHotspot(!0)}},onDrag:async gy=>{if(coreSceneStore.getState().simulateDragEnd===!0||coreSceneStore.getState().dragging&&coreSceneStore.getState().draggingItemGUID!==cs.guid||coreSceneStore.getState().sceneSettings.disableDragDrop)return;const _f=gy.event;if(_f.stopPropagation(),as){CORE_API.switchCursor(CURSORS.BLOCKED);return}if(itemStore.getState().selectedItemData){CORE_API.switchCursor(CURSORS.BLOCKED);return}if(Object.keys(itemStore.getState().itemsSpawned).length<2){CORE_API.switchCursor(CURSORS.BLOCKED);return}const Fy=gy.event.offsetX,aA=gy.event.offsetY;if(!coreSceneStore.getState().dragging){if(itemStore.setState({busyDraggingItem:!0}),Math.abs(_f.x-El.x)<=1)return;if(cs&&!cs.canDrag){CORE_API.switchCursor(CURSORS.BLOCKED);return}const YA=cs.whichPlugAreWeAttachedUsing().attachedPlug.guid;let FA=cs.swapRoot();FA||(FA={rootDetachedPlugs:cs.detachNodeFromReceiver()}),es.current=yl(cs),Ur.current=[],es.current.map(NA=>{Ur.current.push(NA.guid),cs.ref.attach(NA.ref),cs.dragging=!0,NA.dragging=!0}),CORE_API.switchCursor(CURSORS.MOVE),coreSceneStore.setState({dragging:!0,draggingItemGUID:cs.guid}),window.pointerDownPos=gy.event.clientX,window.mouseDragging=!1;const zA=productDataStore$1.getState().productData[cs.skuID].lookDetails[cs.currentVariant].thumbnails.low;window.mouseDownImgSrc=CORE_API.getResolvedAssetUrl(zA),window.mouseDownSkuID=cs.skuID,window.moveThreshold=0,ar=!1,yn=null,zn=null,hr.current=-1;const UA=Fy/zr.width*2-1,oE=-aA/zr.height*2+1;go.set(UA,oE);const iC=await a({guid:s,node:cs,detachedData:FA,attachedChildrenGuids:Ur.current});if(!iC||iC.length<=0||iC.transforms===void 0)return;iC.transforms.map((NA,qy)=>{NA.receiverPlugGUID===YA&&(hr.current=qy)})}const cA=Fy/zr.width*2-1,Oy=-aA/zr.height*2+1;Al.set(cA,Oy),Dr.setFromCamera(Al,rs),rs.getWorldDirection(yy).negate(),wy.setFromNormalAndCoplanarPoint(yy,_d),Dr.ray.intersectPlane(wy,_d),cs.ref.visible=!1;const IA=ghostStore.getState().ghostParentRef;if(IA.children.length>0){yn=ho(Al),zn===null&&hr.current!==-1&&hr.current<IA.children.length&&IA.children[hr.current]!==void 0&&(zn=IA.children[hr.current].children[0].uuid);const $A=coreSceneStore.getState().hoveredGhostIndex;yn?$A!==yn.index&&coreSceneStore.setState({hoveredGhostIndex:yn.index}):$A!==-1&&coreSceneStore.setState({hoveredGhostIndex:-1}),cs.ref.position.copy(_d).add(by)}if(cA>1||cA<-1||Oy<-1||Oy>1){itemStore.setState({busyDraggingItem:!1}),CORE_API.switchCursor(CURSORS.GRAB),window.mouseDownImgSrc=null,window.mouseDragging=!1,window.dragImgElRef.style.opacity=0,cs.ref.visible=!0,coreSceneStore.setState({simulateDragEnd:!0,dragging:!1,draggingItemGUID:null,hoveredGhostIndex:-1}),b({node:cs,intersectingGhostObject:yn,attachedChildrenGuids:Ur.current,attachedNodesToCurrentNode:es.current});const $A=attachmentStore$1.getState().attachmentSystem.currentStructure.nodes;DynamicHooks.hookOnSceneItemsUpdated($A)}},onDragStart:({event:gy})=>{if(coreSceneStore.setState({simulateDragEnd:!1}),os||coreSceneStore.getState().sceneSettings.disableDragDrop&&coreSceneStore.getState().sceneSettings.disableContextMenu)return;gy.stopPropagation();const{eventObject:_f,point:Cy}=gy;_f.getWorldPosition(by).sub(Cy),_d.copy(Cy),El.set(gy.x,gy.y)},onDragEnd:({event:gy})=>{if(coreSceneStore.setState({simulateDragEnd:!1}),coreSceneStore.getState().dragging&&coreSceneStore.getState().draggingItemGUID!==cs.guid||coreSceneStore.getState().sceneSettings.disableDragDrop&&coreSceneStore.getState().sceneSettings.disableContextMenu)return;gy.stopPropagation(),window.mouseDownImgSrc=null,window.mouseDragging=!1,window.dragImgElRef.style.opacity=0,cs.ref.visible=!0,coreSceneStore.setState({dragging:!1,hoveredGhostIndex:-1,draggingItemGUID:null}),itemStore.setState({busyDraggingItem:!1}),CORE_API.switchCursor(CURSORS.GRAB),b({node:cs,intersectingGhostObject:yn,attachedChildrenGuids:Ur.current,attachedNodesToCurrentNode:es.current});const _f=attachmentStore$1.getState().attachmentSystem.currentStructure.nodes;DynamicHooks.hookOnSceneItemsUpdated(_f)}});return jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:Pn?jsxRuntimeExports.jsx("group",{ref:cr,..._c(),...lr,children:o}):jsxRuntimeExports.jsx("group",{ref:cr,...lr,children:o})})}const Model=reactExports.forwardRef(({itemKey:o,mainModel:s,scale:a,onDragStartHandler:b,onDragEndHandler:_e,onItemClickHandler:bt,stockAlert:rn=!0},sn)=>{const yn=itemStore(as=>as.focusedGUID),Pn=itemStore(as=>as),zn=itemStore(as=>as.hoveredItemRef),ar=reactExports.useRef(null),lr=reactExports.useRef([]),cr=reactExports.useRef(0),hr=reactExports.useRef(0);reactExports.useEffect(()=>()=>{dispose3(s)},[s]);const es=reactExports.useCallback(()=>{if(!sn.current||(lr.current=findMeshAndCloneMatFromScene(sn.current,sn.current.inStock),lr.current.length==0))return;if(sn.current.inStock===!1){rn==!0&&(rn=!1,CORE_API.alert({alertMsg:"Some item(s) in configuration are out of stock",alertTime:7e3,alertType:"warn",alertLabel:"Stock Alert",persistant:!0,alertId:"outOfStock"}));return}const{current:as}=hr;for(let os=0;os<lr.current.length;os++){const cs=lr.current[os].material;cs.emissiveIntensity=as}},[hr,sn]),Ur=reactExports.useCallback(()=>{cr.current=0},[lr]),Dr=reactExports.useCallback(()=>{cr.current=.005},[lr,s]);useFrame(()=>{if(coreSceneStore.getState().builderMode)return;const as=cameraStore.getState().userDragging,os=0;hr.current=MathUtils.lerp(hr.current,as?os:cr.current,.1),es()}),reactExports.useEffect(()=>{const as=attachmentStore$1.getState().attachmentSystem.currentStructure,os=as.getNodeByGUID(o.itemData.guid);if(os?.isDependent&&!os.isInteractive&&Object.keys(zn).length>0){const cs=as.getNodeByGUID(Object.keys(zn)[0]);if(!cs||!cs.myDependenciesGUID)return;cs.myDependenciesGUID.includes(o.itemData.guid)?Ur():Dr()}else zn.hasOwnProperty(o.itemData.guid)||Object.keys(zn).length==0?Ur():Dr()},[zn]);const zr=reactExports.useCallback(as=>{as.stopPropagation();const os=Pn.selectedItemData;coreSceneStore.setState({canvasTooltipText:"-"+o.itemData.name+"-"}),os||itemStore.setState({hoveredItemRef:{}});let cs=itemStore.getState().hoveredItemRef;cs.hasOwnProperty(o.itemData.guid)||(cs[o.itemData.guid]={instance:sn.current},Pn.actions.setHoveredItemRef({...cs}))},[Pn,zn,ar]),rs=reactExports.useCallback(as=>{as.stopPropagation();const os=Pn.selectedItemData;if(coreSceneStore.setState({canvasTooltipText:""}),os){if(os.itemData.guid==o.itemData.guid)return;zn[o.itemData.guid]&&(delete zn[o.itemData.guid],Pn.actions.setHoveredItemRef({...zn}))}else itemStore.setState({hoveredItemRef:{}})},[ar,Pn,zn]);return reactExports.useEffect(()=>{coreSceneStore.getState().actions.triggerAutoFocus(),attachmentStore$1.getState().actions.updateFittingSkuIds(),CORE_API.fireEvent(CORE_API.EVENTS.SCENE.Item_Added,{...o,visualizedInScene:!0})},[]),jsxRuntimeExports.jsx(Select$1,{enabled:yn===o.itemData.guid,children:jsxRuntimeExports.jsx(Draggable,{guid:o.itemData.guid,onDragStartHandler:b,onDragEndHandler:_e,onItemClickHandler:bt,onPointerEnter:zr,onPointerLeave:rs,isInteractive:o.itemData.isInteractive,children:jsxRuntimeExports.jsx(Clone,{name:"GRP_RenderGeometry",ref:sn,object:s,scale:a,inStock:!0,visible:!0})})})}),ModelAnimation=({modelAnimations:o,mainModel:s,itemKey:a,scale:b,onDragStartHandler:_e,onDragEndHandler:bt,onItemClickHandler:rn})=>{const{ref:sn,actions:yn,names:Pn}=useAnimations(o),zn=hotspotStore$1(hr=>hr),ar=reactExports.useRef(null),lr=reactExports.useCallback((hr,es,Ur,Dr)=>playAnimation(hr,es,Ur,Dr,Pn,yn),[Pn,yn]),cr=reactExports.useCallback(hr=>stopAnimation(hr,Pn,yn),[Pn,yn]);return reactExports.useEffect(()=>{if(ar.current===a.itemData.guid){if(ar.current=null,!zn.lastActiveHotspotData)return;let hr=zn.lastActiveHotspotData.hotspotData;if(!hr)return;if(hr.exitAnim?lr(hr.exitAnim,!1,!1,!1):hr.entryAnim&&lr(hr.entryAnim,!1,!0,!1),hr.activeAnim&&cr(hr.activeAnim),zn.activeHotspotData){if(a.itemData.guid===zn.activeHotspotData.itemData.guid){ar.current=a.itemData.guid;let es=zn.activeHotspotData.hotspotData;if(!es)return;es.entryAnim&&lr(es.entryAnim,!1,!1,!0),es.activeAnim&&lr(es.activeAnim,!0,!1,!1)}}else return}else if(zn.activeHotspotData){if(a.itemData.guid===zn.activeHotspotData.itemData.guid){ar.current=a.itemData.guid;let hr=zn.activeHotspotData.hotspotData;if(!hr)return;hr.entryAnim&&lr(hr.entryAnim,!1,!1,!0),hr.activeAnim&&lr(hr.activeAnim,!0,!1,!1)}}else return},[zn.activeHotspotData]),jsxRuntimeExports.jsx(Model,{ref:sn,mainModel:s,itemKey:a,scale:b,onDragStartHandler:_e,onDragEndHandler:bt,onItemClickHandler:rn})};function playAnimation(o,s,a,b,_e,bt){if(!_e.includes(o))return;const rn=bt[o];rn.setLoop(s?LoopRepeat:LoopOnce),rn.clampWhenFinished=!s,b&&rn.reset(),a?rn.fadeOut(.5).play():rn.fadeIn(.5).play()}function stopAnimation(o,s,a){if(!s.includes(o))return;a[o].stop()}const RenderGeo=({url:o,itemKey:s,scale:a,onDragStartHandler:b,onDragEndHandler:_e,onItemClickHandler:bt})=>{const[rn,sn]=reactExports.useState(!1),yn=useLoader(GLTFLoader,o,Pn=>{Pn.setDRACOLoader(assetStore.getState().dracoLoader),Pn.register(zn=>new GLTFMaterialsVariantsExtension(zn))});return reactExports.useEffect(()=>((async()=>{if(yn.functions){const zn=attachmentStore$1.getState().attachmentSystem.currentStructure.getNodeByGUID(s.itemData.guid);if(zn){zn.modelFunctions=yn.functions;const ar=findVariantForGUID(s.itemData.guid);ar&&(zn.currentVariant=ar,await yn.functions.selectVariant(yn.scene,ar),itemStore.setState({variantChangeAlert:!itemStore.getState().variantChangeAlert}))}}LOGGER.info({title:"model loaded: "+s.itemData.skuID}),s.itemData.hasItemLoaded=!0,itemStore.getState().actions.triggerModelLoaded(),CORE_API.fireEvent(CORE_API.EVENTS.SCENE.Model_Loaded,s.itemData.skuID),await attachmentStore$1.getState().actions.updateFittingSkuIds(),sn(!0)})(),()=>{CORE_API.fireEvent(CORE_API.EVENTS.SCENE.Model_Removed,s.itemData.skuID)}),[yn]),jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:rn&&(yn.animations?jsxRuntimeExports.jsx(ModelAnimation,{modelAnimations:yn.animations,mainModel:yn.scene,itemKey:s,scale:a,onDragStartHandler:b,onDragEndHandler:_e,onItemClickHandler:bt}):jsxRuntimeExports.jsx(Model,{mainModel:yn.scene,itemKey:s,scale:a,onDragStartHandler:b,onDragEndHandler:_e,onItemClickHandler:bt}))})},SceneItem=({position:o,rotation:s,itemKey:a,scale:b,rejectFunc:_e,onItemClickHandler:bt,onDragEndHandler:rn,onDragStartHandler:sn,itemIndex:yn,proxyScene:Pn,proxyOnly:zn})=>{const ar=reactExports.useRef(null);return reactExports.useEffect(()=>{if(!ar.current)return;const lr=coreSceneStore.getState().sceneRef;if(lr&&a.itemData.hasOwnProperty("excludeFromSceneBounds")&&a.itemData.excludeFromSceneBounds){const es=lr.getObjectByName("#GRP_EXCLUDED");es!==void 0&&es.attach(ar.current)}const hr=attachmentStore$1.getState().attachmentSystem.currentStructure.getNodeByGUID(a.itemData.guid);hr&&hr.ref!==ar.current&&(hr.ref=ar.current,hr.transform={position:o,rotation:s})},[ar]),jsxRuntimeExports.jsxs("group",{ref:ar,position:o,quaternion:s,name:`GRP_${a.itemData.name}_`+yn.toString().padStart(2,"0"),children:[jsxRuntimeExports.jsx(ColliderGeo,{itemKey:a}),jsxRuntimeExports.jsx(ProxyGeo,{proxyScene:Pn,scale:b,proxyOnly:zn,itemKey:a}),!zn&&jsxRuntimeExports.jsx(reactExports.Suspense,{children:jsxRuntimeExports.jsx(RenderGeo,{scale:b,itemKey:a,url:resolveAssetUrl(CORE_API.isMobile&&a.itemData.gltfURL_mobile?a.itemData.gltfURL_mobile:a.itemData.gltfURL),onDragStartHandler:sn,onDragEndHandler:rn,onItemClickHandler:bt})})]})};function GhostEventHandler({index:o,children:s,...a}){const b=reactExports.useRef(),_e=useGesture({onPointerEnter:bt=>{bt.event.stopPropagation(),coreSceneStore.getState().itemDraggedSkuID&&coreSceneStore.setState({hoveredGhostIndex:o})},onPointerLeave:bt=>{bt.event.stopPropagation(),coreSceneStore.getState().itemDraggedSkuID&&coreSceneStore.getState().hoveredGhostIndex===o&&coreSceneStore.setState({hoveredGhostIndex:-1})}});return jsxRuntimeExports.jsx("group",{ref:b,..._e(),...a,children:s})}const selectionContext=reactExports.createContext(null);function Selection({children:o,enabled:s=!0}){const[a,b]=reactExports.useState([]),_e=reactExports.useMemo(()=>({selected:a,select:b,enabled:s}),[a,b,s]);return jsxRuntimeExports.jsx(selectionContext.Provider,{value:_e,children:o})}function Select({enabled:o=!1,children:s,...a}){const b=reactExports.useRef(null),_e=reactExports.useContext(selectionContext);return reactExports.useEffect(()=>{if(_e&&o){let bt=!1;const rn=[];if(b.current.traverse(sn=>{sn.type==="Mesh"&&rn.push(sn),_e.selected.indexOf(sn)===-1&&(bt=!0)}),bt)return _e.select(sn=>[...sn,...rn]),()=>{_e.select(sn=>sn.filter(yn=>!rn.includes(yn)))}}},[o,s,_e]),jsxRuntimeExports.jsx("group",{ref:b,...a,children:s})}const EffectComposerContext=reactExports.createContext(null),isConvolution=o=>(o.getAttributes()&EffectAttribute.CONVOLUTION)===EffectAttribute.CONVOLUTION,EffectComposer=React.memo(reactExports.forwardRef(({children:o,camera:s,scene:a,resolutionScale:b,enabled:_e=!0,renderPriority:bt=1,autoClear:rn=!0,depthBuffer:sn,enableNormalPass:yn,stencilBuffer:Pn,multisampling:zn=8,frameBufferType:ar=HalfFloatType},lr)=>{const{gl:cr,scene:hr,camera:es,size:Ur}=useThree(),Dr=a||hr,zr=s||es,[rs,as,os]=reactExports.useMemo(()=>{const zs=isWebGL2Available(),ho=new EffectComposer$1(cr,{depthBuffer:sn,stencilBuffer:Pn,multisampling:zn>0&&zs?zn:0,frameBufferType:ar});ho.addPass(new RenderPass(Dr,zr));let yl=null,go=null;return yn&&(go=new NormalPass(Dr,zr),go.enabled=!1,ho.addPass(go),b!==void 0&&zs&&(yl=new DepthDownsamplingPass({normalBuffer:go.texture,resolutionScale:b}),yl.enabled=!1,ho.addPass(yl))),[ho,go,yl]},[zr,cr,sn,Pn,zn,ar,Dr,yn,b]);reactExports.useEffect(()=>rs?.setSize(Ur.width,Ur.height),[rs,Ur]),useFrame((zs,ho)=>{if(_e){const yl=cr.autoClear;cr.autoClear=rn,Pn&&!rn&&cr.clearStencil(),rs.render(ho),cr.autoClear=yl}},_e?bt:0);const cs=reactExports.useRef(null),ga=useInstanceHandle(cs);reactExports.useLayoutEffect(()=>{const zs=[];if(cs.current&&ga.current&&rs){const ho=ga.current.objects;for(let yl=0;yl<ho.length;yl++){const go=ho[yl];if(go instanceof Effect){const Al=[go];if(!isConvolution(go)){let by=null;for(;(by=ho[yl+1])instanceof Effect&&!isConvolution(by);)Al.push(by),yl++}const _d=new EffectPass(zr,...Al);zs.push(_d)}else go instanceof Pass&&zs.push(go)}for(const yl of zs)rs?.addPass(yl);as&&(as.enabled=!0),os&&(os.enabled=!0)}return()=>{for(const ho of zs)rs?.removePass(ho);as&&(as.enabled=!1),os&&(os.enabled=!1)}},[rs,o,zr,as,os,ga]),reactExports.useEffect(()=>{const zs=cr.toneMapping;return cr.toneMapping=NoToneMapping,()=>{cr.toneMapping=zs}},[]);const mo=reactExports.useMemo(()=>({composer:rs,normalPass:as,downSamplingPass:os,resolutionScale:b,camera:zr,scene:Dr}),[rs,as,os,b,zr,Dr]);return reactExports.useImperativeHandle(lr,()=>rs,[rs]),jsxRuntimeExports.jsx(EffectComposerContext.Provider,{value:mo,children:jsxRuntimeExports.jsx("group",{ref:cs,children:o})})})),resolveRef=o=>typeof o=="object"&&o!=null&&"current"in o?o.current:o,Outline=reactExports.forwardRef(function o({selection:s=[],selectionLayer:a=10,blendFunction:b,patternTexture:_e,edgeStrength:bt,pulseSpeed:rn,visibleEdgeColor:sn,hiddenEdgeColor:yn,width:Pn,height:zn,kernelSize:ar,blur:lr,xRay:cr,...hr},es){const Ur=useThree(os=>os.invalidate),{scene:Dr,camera:zr}=reactExports.useContext(EffectComposerContext),rs=reactExports.useMemo(()=>new OutlineEffect(Dr,zr,{blendFunction:b,patternTexture:_e,edgeStrength:bt,pulseSpeed:rn,visibleEdgeColor:sn,hiddenEdgeColor:yn,width:Pn,height:zn,kernelSize:ar,blur:lr,xRay:cr,...hr}),[b,lr,zr,bt,zn,yn,ar,_e,rn,Dr,sn,Pn,cr]),as=reactExports.useContext(selectionContext);return reactExports.useEffect(()=>{if(!as&&s)return rs.selection.set(Array.isArray(s)?s.map(resolveRef):[resolveRef(s)]),Ur(),()=>{rs.selection.clear(),Ur()}},[rs,s,as,Ur]),reactExports.useEffect(()=>{rs.selectionLayer=a,Ur()},[rs,Ur,a]),reactExports.useRef(),reactExports.useEffect(()=>{var os;if(as&&as.enabled&&(os=as.selected)!=null&&os.length)return rs.selection.set(as.selected),Ur(),()=>{rs.selection.clear(),Ur()}},[as,rs.selection,Ur]),reactExports.useEffect(()=>()=>{rs.dispose()},[rs]),jsxRuntimeExports.jsx("primitive",{ref:es,object:rs})}),ToneMapping=reactExports.forwardRef(function o({blendFunction:s,adaptive:a,mode:b,resolution:_e,maxLuminance:bt,whitePoint:rn,middleGrey:sn,minLuminance:yn,averageLuminance:Pn,adaptationRate:zn,...ar},lr){const cr=reactExports.useMemo(()=>new ToneMappingEffect({blendFunction:s,adaptive:a,mode:b,resolution:_e,maxLuminance:bt,whitePoint:rn,middleGrey:sn,minLuminance:yn,averageLuminance:Pn,adaptationRate:zn}),[s,a,b,_e,bt,rn,sn,yn,Pn,zn]);return reactExports.useEffect(()=>{cr.dispose()},[cr]),jsxRuntimeExports.jsx("primitive",{...ar,ref:lr,object:cr,attributes:EffectAttribute.CONVOLUTION})}),Ghost=({ghostVisibility:o,ghostData:s,ghostTransform:a,index:b})=>{const _e=reactExports.useRef(),bt=reactExports.useMemo(()=>s.proxyScene.clone(),[s]),rn=coreSceneStore(sn=>sn.hoveredGhostIndex);return reactExports.useEffect(()=>()=>{dispose3(bt)},[bt]),reactExports.useEffect(()=>{const{current:sn}=_e;sn&&(sn.userData.incomingPlugName=a.incomingPlugName,sn.userData.receiverPlugName=a.receiverPlugName,sn.userData.incomingPlugGUID=a.incomingPlugGUID,sn.userData.receiverPlugGUID=a.receiverPlugGUID,CORE_API.fireEvent(CORE_API.EVENTS.SCENE.Ghost_Loaded,{ghostData:s,ghostTransform:a}))},[_e]),jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:jsxRuntimeExports.jsx(GhostEventHandler,{index:b,children:jsxRuntimeExports.jsx(Select,{enabled:rn===b,children:jsxRuntimeExports.jsx("primitive",{isGhost:!0,ref:_e,index:b,autoFocusEnabled:o,position:a.position,scale:coreSceneStore.getState().sceneSettings.ghostScale,quaternion:a.rotation,object:bt,castShadow:!1,receiveShadow:!1,frustumCulled:!1},`ghost${b}`)})})})},GhostManager=({intersectingGhostObject:o=null})=>{const{camera:s}=useThree(),a=ghostStore(Pn=>Pn.ghostVisibility),b=ghostStore(Pn=>Pn.ghostData),_e=ghostStore(Pn=>Pn.ghostsTransform),bt=reactExports.useRef(),{_touch2D:rn,raycasterGhost:sn}=reactExports.useMemo(()=>({_touch2D:new Vector2,raycasterGhost:new Raycaster}),[]);reactExports.useEffect(()=>{const{current:Pn}=bt;Pn&&ghostStore.setState({ghostParentRef:Pn})},[bt]);const yn=Pn=>{let zn=0,ar=0;if(Pn.touches&&Pn.touches[0])zn=Pn.touches[0].clientX,ar=Pn.touches[0].clientY;else return;if(!coreSceneStore.getState().itemDraggedSkuID)return;const lr=coreSceneStore.getState().cursorParentRef,cr=coreSceneStore.getState().canvasSize;if(!lr)return;const hr=lr.getBoundingClientRect(),es=hr.top,Ur=hr.left,Dr=(zn-Ur)/cr.width*2-1,zr=(-ar+es)/cr.height*2+1;rn.set(Dr,zr),sn.layers.enable(GHOST_LAYER),sn.setFromCamera(rn,s);const rs=sn.intersectObject(ghostStore.getState().ghostParentRef);rs.length>0?(o=rs[0].object,coreSceneStore.setState({hoveredGhostIndex:o.parent.index})):(o=null,coreSceneStore.setState({hoveredGhostIndex:-1}))};return reactExports.useEffect(()=>(window.addEventListener("touchmove",yn,!1),LOGGER.info({title:"Ghost Manager Mounted!"}),()=>{window.removeEventListener("touchmove",yn,!1)}),[]),jsxRuntimeExports.jsx("group",{name:"#GRP_GhostParent",visible:a,scale:a?[1,1,1]:[0,0,0],ref:bt,children:b&&jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:_e.map((Pn,zn)=>zn<b.count&&jsxRuntimeExports.jsx(Ghost,{ghostVisibility:a,ghostData:b,ghostTransform:Pn,index:zn},"ghosts"+zn))})})},ItemManager=()=>{const o=attachmentStore$1(zs=>zs.attachmentSystem),s=attachmentStore$1(zs=>zs),a=itemStore(zs=>zs.removeItemTrigger),b=itemStore(zs=>zs.variantChangeAlert),_e=hotspotStore$1(zs=>zs),bt=coreSceneStore(zs=>zs.showDimensions),rn=itemStore(zs=>zs),sn=itemStore(zs=>zs.lastDeletedItemData),yn=cameraStore(zs=>zs),Pn=itemStore(zs=>zs.selectedItemData),zn=itemStore(zs=>zs.itemsSpawned),ar=coreSceneStore(zs=>zs.coreReady),lr=reactExports.useRef(null),cr=reactExports.useRef(null),hr=reactExports.useRef(!1),es=reactExports.useRef(null),Ur=reactExports.useRef(null),Dr=reactExports.useRef(!1),zr=reactExports.useRef(!1);reactExports.useRef(!1),reactExports.useRef(!1);const rs=reactExports.useCallback(async({guid:zs,node:ho,detachedData:yl,attachedChildrenGuids:go})=>{if(hr.current!==!0)return hr.current=!0,cameraStore.getState().actions.canCameraRotate(!1),_e.actions.switchHotspotsVisibility(!1,!0),es.current={position:ho.ref.position.clone(),rotation:ho.ref.rotation.clone()},Ur.current=yl,await o.currentStructure.removeNodeFromStructure(ho),go.length<=0&&(go=!1),ghostStore.getState().actions.spawnGhostsForSkuID(zn[zs].itemData.skuID,go)},[yn,zn]),as=reactExports.useCallback(async({node:zs,intersectingGhostObject:ho,attachedChildrenGuids:yl,attachedNodesToCurrentNode:go})=>{if(!hr.current)return;hr.current=!1,cameraStore.getState().actions.canCameraRotate(!0),_e.actions.switchHotspotsVisibility(!0,!0);function Al(){zs.ref.position.set(0,0,0),ghostStore.getState().actions.clearAllGhosts()}if(!ghostStore.getState().ghostData?.connectablePlugs){Al();return}o.currentStructure.addNode(zs);let by=null,yy=null,wy=!1,El=[],_c={};if(coreSceneStore.getState().sceneSettings.ignoreCollisionPostDragging===!1&&yl.map((gy,_f)=>{El[_f]=o.currentStructure.checkCollisionforGUID(gy,yl),El[_f]&&(_c[gy]=zn[gy],o.currentStructure.getNodeByGUID(gy).getAllBranchedNodesAttachedToUs().map(aA=>{_c[aA.guid]=zn[aA.guid]}))}),El.map(gy=>{wy||(wy=gy)}),ho&&wy){coreSceneStore.setState({draggingOnDropCollisionData:{node:zs,attachedChildrenGuids:yl,collidingStatus:El,intersectingGhostObject:ho,initPosition:es.current.position,initRotation:es.current.rotation,detachedPlugs:Ur.current,attachedNodesToCurrentNode:go}}),zs.ref.position.set(ho.position.x,ho.position.y,ho.position.z),zs.ref.setRotationFromEuler(ho.rotation),CORE_API.fireEvent(CORE_API.EVENTS.SCENE.DraggingOnDrop_CollsionDetected,_c);return}if(ho){const gy=ho.userData;by=zs.getPlugByName(gy.incomingPlugName),yy=o.currentStructure.getPlugByGUID(gy.receiverPlugGUID),zs.ref.position.set(ho.position.x,ho.position.y,ho.position.z),zs.ref.setRotationFromEuler(ho.rotation),zs.transform={position:ho.position,rotation:ho.quaternion}}else{const gy=Ur.current.neighbourDetachedPlugs;gy&&(Ur.current.neighbourNode.detachNodeFromReceiver(),o.currentStructure.connectPlugs({incomingPlug:gy.incomingPlug,receiverPlug:gy.receiverPlug})),by=Ur.current.rootDetachedPlugs.incomingPlug,yy=Ur.current.rootDetachedPlugs.receiverPlug,zs.ref.position.set(es.current.position.x,es.current.position.y,es.current.position.z),zs.ref.setRotationFromEuler(es.current.rotation);let _f=new Quaternion().identity();zs.ref.getWorldQuaternion(_f),zs.transform={position:es.current.position,rotation:_f}}o.currentStructure.connectPlugs({incomingPlug:by,receiverPlug:yy}),ghostStore.getState().actions.clearAllGhosts(),itemStore.getState().actions.deselectItem(),go.map(gy=>{zs.ref.parent.attach(gy.ref),gy.transform={position:gy.ref.position,rotation:gy.ref.quaternion},zs.dragging=!1,gy.dragging=!1}),await attachmentStore$1.getState().actions.updateFittingSkuIds()},[yn,coreSceneStore,ghostStore,o,s,zn]),os=reactExports.useCallback((zs,ho,yl)=>{if(coreSceneStore.getState().sceneSettings.disableContextMenu)return;const go=attachmentStore$1.getState().attachmentSystem.currentStructure,Al=go.getNodeByGUID(yl);let _d=[];if(!Al?.myDependenciesGUID)return;Al.myDependenciesGUID.map(wy=>{const El=go.getNodeByGUID(wy);if(!El)return;let _c={guid:wy,name:zn[wy].itemData.guid,data:{...zn[wy],overrideVariant:El.overrideVariant,currentVariant:El.currentVariant,offsetX:zs,offsetY:ho}};_d.push(_c)}),_d.sort((wy,El)=>wy.name>El.name?1:El.name>wy.name?-1:0);let by=inventoryStore.getState().inventoryData[zn[yl].itemData.skuID];const yy={primary:{guid:yl,name:zn[yl].itemData.name,data:{inventory:by,...zn[yl],overrideVariant:Al.overrideVariant,currentVariant:Al.currentVariant,offsetX:zs,offsetY:ho}},dependencies:_d};rn.actions.setSelectedItemData(yy.primary.data),CORE_API.fireEvent(CORE_API.EVENTS.UI.ContextMenu_Show,yy)},[zn]),cs=reactExports.useCallback(zs=>{if(!zs)return;itemStore.setState({lastDeletedItemData:{...zn[zs]}});const ho={...zn[zs]};delete zn[zs],rn.actions.setItemsSpawned({...zn}),CORE_API.fireEvent(CORE_API.EVENTS.SCENE.Item_Removed,ho)},[rn,itemStore,zn]);reactExports.useEffect(()=>{let zs=itemStore.getState().removeItems;if(zs.length<=0&&!sn)return;let ho=zs.pop();cs(ho)},[a,sn]);const ga=reactExports.useCallback(function(zs){const ho=coreSceneStore.getState().sceneSettings,yl=zs>1?!0:zs===1?Object.values(zn)[0].itemData.skuID.toLowerCase()!=="root":!1,go=!yl;LOGGER.groupCollapsed("Resolving buttons visibility"),LOGGER.table({sceneIsEmpty:go,sceneIsNotEmpty:yl}),LOGGER.groupEnd(),ho.showViewInYourSpaceBtn===!0&&(yl&&Dr.current===!1?(CORE_API.fireEvent(CORE_API.EVENTS.UI.ViewInYourSpaceButton_Show),Dr.current=!0):go&&Dr.current===!0&&(CORE_API.fireEvent(CORE_API.EVENTS.UI.ViewInYourSpaceButton_Hide),Dr.current=!1)),ho.showShareBtn===!0&&(yl&&zr.current===!1?(CORE_API.fireEvent(CORE_API.EVENTS.UI.ShareButton_Show),zr.current=!0):go&&zr.current===!0&&(CORE_API.fireEvent(CORE_API.EVENTS.UI.ShareButton_Hide),zr.current=!1))},[zn]);reactExports.useEffect(()=>{coreSceneStore.getState().preconfigurationLoaded&&coreSceneStore.getState().configurationLoaded&&CORE_API.fireEvent(CORE_API.EVENTS.SCENE.Items_Updated,{itemsSpawned:zn});const zs=coreSceneStore.getState().sceneSettings,ho=itemStore.getState().defaultSceneItemCount;Object.keys(zn).length===ho?coreSceneStore.setState({canvasTooltipText:zs.textSettings.tooltipEmptySceneText}):Object.keys(zn).length===ho+1&&coreSceneStore.setState({canvasTooltipText:zs.textSettings.tooltipInstructionText})},[zn]),reactExports.useEffect(()=>{ar===!0&&ga(Object.keys(zn).length)},[zn,ar]),reactExports.useEffect(()=>{if(inventoryStore.getState().actions.refreshInventory(zn),!coreSceneStore.getState().preconfigurationLoaded||!coreSceneStore.getState().configurationLoaded)return;async function zs(){const ho=attachmentStore$1.getState().attachmentSystem;if(!ho)return;const yl=await ho.getCartItemsAsync();CORE_API.fireEvent(CORE_API.EVENTS.SCENE.CartItems_Updated,yl),CORE_API.fireEvent(CORE_API.EVENTS.SCENE.ReplaceableCategory_Updated,ho.currentStructure.getCurrentItemsInReplaceableCategory())}zs()},[zn,b]);const mo=reactExports.useCallback((zs,ho,yl)=>{CORE_API.removeItemByGUID(yl),CORE_API.alert({alertMsg:ho+": "+zs,alertTime:5e3,alertType:"error",alertLabel:"Error",persistant:!0})},[]);return reactExports.useEffect(()=>{const{current:zs}=cr;zs&&attachmentStore$1.setState({colliderMeshRef:zs})},[cr]),reactExports.useEffect(()=>{const{current:zs}=lr;zs&&coreSceneStore.setState({sceneRef:zs})},[lr]),reactExports.useEffect(()=>{let zs=Pn?cameraStore.getState().cameraSettings.zoomingMultiplier:cameraStore.getState().cameraSettings.zoomingMultiplier+.1;zs+=bt?.3:.1,cameraStore.setState({boundsMargin:zs}),coreSceneStore.getState().actions.triggerAutoFocus()},[bt,Pn]),reactExports.useEffect(()=>{const zs=itemStore.getState().itemsSpawned;if(LOGGER.info({title:"item Manager mounted"}),!coreSceneStore.getState().preconfigurationLoaded)attachmentStore$1.getState().actions.loadDefaultStructure();else if(Object.keys(zs).length===1){const ho=Object.keys(zs)[0];itemStore.getState().actions.resolvePlugDependencyOnGUID(ho)}},[]),jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsxs("group",{name:"Scene",ref:lr,onPointerMissed:()=>{Pn&&rn.actions.deselectItem(),hotspotStore$1.getState().isAnyHotspotActive&&hotspotStore$1.getState().actions.exitHotspot()},children:[IS_DEV_ENV,jsxRuntimeExports.jsx("group",{name:"#GRP_EXCLUDED"}),jsxRuntimeExports.jsxs("group",{name:"#ITEMSANDGHOSTS",children:[jsxRuntimeExports.jsx("group",{name:"#ITEMS",children:Object.keys(zn).map((zs,ho)=>jsxRuntimeExports.jsx(SceneItem,{scale:[1,1,1],onDragStartHandler:rs,onDragEndHandler:as,onItemClickHandler:os,itemKey:zn[zs],position:zn[zs].itemData.position,rotation:zn[zs].itemData.rotation,itemIndex:ho,proxyScene:zn[zs].itemData.proxyScene,rejectFunc:mo,proxyOnly:zn[zs].itemData.gltfURL==""},zs))}),jsxRuntimeExports.jsx(GhostManager,{})]})]}),jsxRuntimeExports.jsx("group",{name:"#Parent_ColliderMesh",children:jsxRuntimeExports.jsx("mesh",{ref:cr,visible:!1,enabled:!0,name:"#COLLIDER_MESH",children:jsxRuntimeExports.jsx("meshPhongMaterial",{depthTest:!1,transparent:!0,opacity:.8})})})]})},ContactShadows=reactExports.forwardRef(({scale:o=10,frames:s=1/0,excludeLayer:a=-1,bbmin:b=1,bbmax:_e=1,opacity:bt=1,width:rn=1,height:sn=1,blur:yn=1,near:Pn=0,far:zn=10,resolution:ar=512,smooth:lr=!0,color:cr="#000000",depthWrite:hr=!1,renderOrder:es,...Ur},Dr)=>{const zr=reactExports.useRef(null),rs=useThree(wy=>wy.scene),as=useThree(wy=>wy.gl),os=reactExports.useRef(null);rn=rn*(Array.isArray(o)?o[0]:o||1),sn=sn*(Array.isArray(o)?o[1]:o||1);const[cs,ga,mo,zs,ho,yl,go]=reactExports.useMemo(()=>{const wy=new WebGLRenderTarget(ar,ar),El=new WebGLRenderTarget(ar,ar);El.texture.generateMipmaps=wy.texture.generateMipmaps=!1;const _c=new PlaneGeometry(rn,sn).rotateX(Math.PI/2),gy=new Mesh(_c),_f=new MeshDepthMaterial;_f.depthTest=_f.depthWrite=!1,_f.onBeforeCompile=aA=>{aA.uniforms={...aA.uniforms,ucolor:{value:new Color$1(cr)}},aA.fragmentShader=aA.fragmentShader.replace("void main() {",`uniform vec3 ucolor;
9338
+ `;class GainMapDecoderMaterial extends ShaderMaterial{constructor({gamma:s,offsetHdr:a,offsetSdr:b,gainMapMin:_e,gainMapMax:bt,maxDisplayBoost:rn,hdrCapacityMin:sn,hdrCapacityMax:yn,sdr:Pn,gainMap:zn}){super({name:"GainMapDecoderMaterial",vertexShader,fragmentShader,uniforms:{sdr:{value:Pn},gainMap:{value:zn},gamma:{value:new Vector3(1/s[0],1/s[1],1/s[2])},offsetHdr:{value:new Vector3().fromArray(a)},offsetSdr:{value:new Vector3().fromArray(b)},gainMapMin:{value:new Vector3().fromArray(_e)},gainMapMax:{value:new Vector3().fromArray(bt)},weightFactor:{value:(Math.log2(rn)-sn)/(yn-sn)}},blending:NoBlending,depthTest:!1,depthWrite:!1}),this._maxDisplayBoost=rn,this._hdrCapacityMin=sn,this._hdrCapacityMax=yn,this.needsUpdate=!0,this.uniformsNeedUpdate=!0}get sdr(){return this.uniforms.sdr.value}set sdr(s){this.uniforms.sdr.value=s}get gainMap(){return this.uniforms.gainMap.value}set gainMap(s){this.uniforms.gainMap.value=s}get offsetHdr(){return this.uniforms.offsetHdr.value.toArray()}set offsetHdr(s){this.uniforms.offsetHdr.value.fromArray(s)}get offsetSdr(){return this.uniforms.offsetSdr.value.toArray()}set offsetSdr(s){this.uniforms.offsetSdr.value.fromArray(s)}get gainMapMin(){return this.uniforms.gainMapMin.value.toArray()}set gainMapMin(s){this.uniforms.gainMapMin.value.fromArray(s)}get gainMapMax(){return this.uniforms.gainMapMax.value.toArray()}set gainMapMax(s){this.uniforms.gainMapMax.value.fromArray(s)}get gamma(){const s=this.uniforms.gamma.value;return[1/s.x,1/s.y,1/s.z]}set gamma(s){const a=this.uniforms.gamma.value;a.x=1/s[0],a.y=1/s[1],a.z=1/s[2]}get hdrCapacityMin(){return this._hdrCapacityMin}set hdrCapacityMin(s){this._hdrCapacityMin=s,this.calculateWeight()}get hdrCapacityMax(){return this._hdrCapacityMax}set hdrCapacityMax(s){this._hdrCapacityMax=s,this.calculateWeight()}get maxDisplayBoost(){return this._maxDisplayBoost}set maxDisplayBoost(s){this._maxDisplayBoost=Math.max(1,Math.min(65504,s)),this.calculateWeight()}calculateWeight(){const s=(Math.log2(this._maxDisplayBoost)-this._hdrCapacityMin)/(this._hdrCapacityMax-this._hdrCapacityMin);this.uniforms.weightFactor.value=Math.max(0,Math.min(1,s))}}class GainMapNotFoundError extends Error{}class XMPMetadataNotFoundError extends Error{}const getAttribute=(o,s,a)=>{var b;let _e;const bt=(b=o.attributes.getNamedItem(s))===null||b===void 0?void 0:b.nodeValue;if(bt)_e=bt;else{const rn=o.getElementsByTagName(s)[0];if(rn){const sn=rn.getElementsByTagName("rdf:li");if(sn.length===3)_e=Array.from(sn).map(yn=>yn.innerHTML);else throw new Error(`Gainmap metadata contains an array of items for ${s} but its length is not 3`)}else{if(a)return a;throw new Error(`Can't find ${s} in gainmap metadata`)}}return _e},extractXMP=o=>{var s,a;let b;typeof TextDecoder<"u"?b=new TextDecoder().decode(o):b=o.toString();let _e=b.indexOf("<x:xmpmeta");const bt=new DOMParser;for(;_e!==-1;){const rn=b.indexOf("x:xmpmeta>",_e);b.slice(_e,rn+10);const sn=b.slice(_e,rn+10);try{const Pn=bt.parseFromString(sn,"text/xml").getElementsByTagName("rdf:Description")[0],zn=getAttribute(Pn,"hdrgm:GainMapMin","0"),ar=getAttribute(Pn,"hdrgm:GainMapMax"),lr=getAttribute(Pn,"hdrgm:Gamma","1"),cr=getAttribute(Pn,"hdrgm:OffsetSDR","0.015625"),hr=getAttribute(Pn,"hdrgm:OffsetHDR","0.015625");let es=(s=Pn.attributes.getNamedItem("hdrgm:HDRCapacityMin"))===null||s===void 0?void 0:s.nodeValue;es||(es="0");const Ur=(a=Pn.attributes.getNamedItem("hdrgm:HDRCapacityMax"))===null||a===void 0?void 0:a.nodeValue;if(!Ur)throw new Error("Incomplete gainmap metadata");return{gainMapMin:Array.isArray(zn)?zn.map(Dr=>parseFloat(Dr)):[parseFloat(zn),parseFloat(zn),parseFloat(zn)],gainMapMax:Array.isArray(ar)?ar.map(Dr=>parseFloat(Dr)):[parseFloat(ar),parseFloat(ar),parseFloat(ar)],gamma:Array.isArray(lr)?lr.map(Dr=>parseFloat(Dr)):[parseFloat(lr),parseFloat(lr),parseFloat(lr)],offsetSdr:Array.isArray(cr)?cr.map(Dr=>parseFloat(Dr)):[parseFloat(cr),parseFloat(cr),parseFloat(cr)],offsetHdr:Array.isArray(hr)?hr.map(Dr=>parseFloat(Dr)):[parseFloat(hr),parseFloat(hr),parseFloat(hr)],hdrCapacityMin:parseFloat(es),hdrCapacityMax:parseFloat(Ur)}}catch{}_e=b.indexOf("<x:xmpmeta",rn)}};class MPFExtractor{constructor(s){this.options={debug:s&&s.debug!==void 0?s.debug:!1,extractFII:s&&s.extractFII!==void 0?s.extractFII:!0,extractNonFII:s&&s.extractNonFII!==void 0?s.extractNonFII:!0}}extract(s){return new Promise((a,b)=>{const _e=this.options.debug,bt=new DataView(s.buffer);if(bt.getUint16(0)!==65496){b(new Error("Not a valid jpeg"));return}const rn=bt.byteLength;let sn=2,yn=0,Pn;for(;sn<rn;){if(++yn>250){b(new Error(`Found no marker after ${yn} loops 😵`));return}if(bt.getUint8(sn)!==255){b(new Error(`Not a valid marker at offset 0x${sn.toString(16)}, found: 0x${bt.getUint8(sn).toString(16)}`));return}if(Pn=bt.getUint8(sn+1),_e&&console.log(`Marker: ${Pn.toString(16)}`),Pn===226){_e&&console.log("Found APP2 marker (0xffe2)");const zn=sn+4;if(bt.getUint32(zn)===1297106432){const ar=zn+4;let lr;if(bt.getUint16(ar)===18761)lr=!1;else if(bt.getUint16(ar)===19789)lr=!0;else{b(new Error("No valid endianness marker found in TIFF header"));return}if(bt.getUint16(ar+2,!lr)!==42){b(new Error("Not valid TIFF data! (no 0x002A marker)"));return}const cr=bt.getUint32(ar+4,!lr);if(cr<8){b(new Error("Not valid TIFF data! (First offset less than 8)"));return}const hr=ar+cr,es=bt.getUint16(hr,!lr),Ur=hr+2;let Dr=0;for(let os=Ur;os<Ur+12*es;os+=12)bt.getUint16(os,!lr)===45057&&(Dr=bt.getUint32(os+8,!lr));const zr=4,rs=hr+2+es*12+zr,as=[];for(let os=rs;os<rs+Dr*16;os+=16){const cs={MPType:bt.getUint32(os,!lr),size:bt.getUint32(os+4,!lr),dataOffset:bt.getUint32(os+8,!lr),dependantImages:bt.getUint32(os+12,!lr),start:-1,end:-1,isFII:!1};cs.dataOffset?(cs.start=ar+cs.dataOffset,cs.isFII=!1):(cs.start=0,cs.isFII=!0),cs.end=cs.start+cs.size,as.push(cs)}if(this.options.extractNonFII&&as.length){const os=new Blob([bt]),cs=[];for(const ga of as){if(ga.isFII&&!this.options.extractFII)continue;const mo=os.slice(ga.start,ga.end+1,"image/jpeg");cs.push(mo)}a(cs)}}}sn+=2+bt.getUint16(sn+2)}})}}const extractGainmapFromJPEG=async o=>{const s=extractXMP(o);if(!s)throw new XMPMetadataNotFoundError("Gain map XMP metadata not found");const b=await new MPFExtractor({extractFII:!0,extractNonFII:!0}).extract(o);if(b.length!==2)throw new GainMapNotFoundError("Gain map recovery image not found");return{sdr:new Uint8Array(await b[0].arrayBuffer()),gainMap:new Uint8Array(await b[1].arrayBuffer()),metadata:s}},getHTMLImageFromBlob=o=>new Promise((s,a)=>{const b=document.createElement("img");b.onload=()=>{s(b)},b.onerror=_e=>{a(_e)},b.src=URL.createObjectURL(o)});class LoaderBase extends Loader{constructor(s,a){super(a),s&&(this._renderer=s),this._internalLoadingManager=new LoadingManager}setRenderer(s){return this._renderer=s,this}setRenderTargetOptions(s){return this._renderTargetOptions=s,this}prepareQuadRenderer(){this._renderer||console.warn("WARNING: An existing WebGL Renderer was not passed to this Loader constructor or in setRenderer, the result of this Loader will need to be converted to a Data Texture with toDataTexture() before you can use it in your renderer.");const s=new GainMapDecoderMaterial({gainMapMax:[1,1,1],gainMapMin:[0,0,0],gamma:[1,1,1],offsetHdr:[1,1,1],offsetSdr:[1,1,1],hdrCapacityMax:1,hdrCapacityMin:0,maxDisplayBoost:1,gainMap:new Texture,sdr:new Texture});return new QuadRenderer({width:16,height:16,type:HalfFloatType,colorSpace:LinearSRGBColorSpace$1,material:s,renderer:this._renderer,renderTargetOptions:this._renderTargetOptions})}async render(s,a,b,_e){const bt=_e?new Blob([_e],{type:"image/jpeg"}):void 0,rn=new Blob([b],{type:"image/jpeg"});let sn,yn,Pn=!1;if(typeof createImageBitmap>"u"){const lr=await Promise.all([bt?getHTMLImageFromBlob(bt):Promise.resolve(void 0),getHTMLImageFromBlob(rn)]);yn=lr[0],sn=lr[1],Pn=!0}else{const lr=await Promise.all([bt?createImageBitmap(bt,{imageOrientation:"flipY"}):Promise.resolve(void 0),createImageBitmap(rn,{imageOrientation:"flipY"})]);yn=lr[0],sn=lr[1]}const zn=new Texture(yn||new ImageData(2,2),UVMapping,ClampToEdgeWrapping,ClampToEdgeWrapping,LinearFilter,LinearMipMapLinearFilter,RGBAFormat,UnsignedByteType,1,LinearSRGBColorSpace$1);zn.flipY=Pn,zn.needsUpdate=!0;const ar=new Texture(sn,UVMapping,ClampToEdgeWrapping,ClampToEdgeWrapping,LinearFilter,LinearMipMapLinearFilter,RGBAFormat,UnsignedByteType,1,SRGBColorSpace$1);ar.flipY=Pn,ar.needsUpdate=!0,s.width=sn.width,s.height=sn.height,s.material.gainMap=zn,s.material.sdr=ar,s.material.gainMapMin=a.gainMapMin,s.material.gainMapMax=a.gainMapMax,s.material.offsetHdr=a.offsetHdr,s.material.offsetSdr=a.offsetSdr,s.material.gamma=a.gamma,s.material.hdrCapacityMin=a.hdrCapacityMin,s.material.hdrCapacityMax=a.hdrCapacityMax,s.material.maxDisplayBoost=Math.pow(2,a.hdrCapacityMax),s.material.needsUpdate=!0,s.render()}}class GainMapLoader extends LoaderBase{load([s,a,b],_e,bt,rn){const sn=this.prepareQuadRenderer();let yn,Pn,zn;const ar=async()=>{if(yn&&Pn&&zn){try{await this.render(sn,zn,yn,Pn)}catch(zs){this.manager.itemError(s),this.manager.itemError(a),this.manager.itemError(b),typeof rn=="function"&&rn(zs),sn.disposeOnDemandRenderer();return}typeof _e=="function"&&_e(sn),this.manager.itemEnd(s),this.manager.itemEnd(a),this.manager.itemEnd(b),sn.disposeOnDemandRenderer()}};let lr=!0,cr=0,hr=0,es=!0,Ur=0,Dr=0,zr=!0,rs=0,as=0;const os=()=>{if(typeof bt=="function"){const zs=cr+Ur+rs,ho=hr+Dr+as,yl=lr&&es&&zr;bt(new ProgressEvent("progress",{lengthComputable:yl,loaded:ho,total:zs}))}};this.manager.itemStart(s),this.manager.itemStart(a),this.manager.itemStart(b);const cs=new FileLoader(this._internalLoadingManager);cs.setResponseType("arraybuffer"),cs.setRequestHeader(this.requestHeader),cs.setPath(this.path),cs.setWithCredentials(this.withCredentials),cs.load(s,async zs=>{if(typeof zs=="string")throw new Error("Invalid sdr buffer");yn=zs,await ar()},zs=>{lr=zs.lengthComputable,hr=zs.loaded,cr=zs.total,os()},zs=>{this.manager.itemError(s),typeof rn=="function"&&rn(zs)});const ga=new FileLoader(this._internalLoadingManager);ga.setResponseType("arraybuffer"),ga.setRequestHeader(this.requestHeader),ga.setPath(this.path),ga.setWithCredentials(this.withCredentials),ga.load(a,async zs=>{if(typeof zs=="string")throw new Error("Invalid gainmap buffer");Pn=zs,await ar()},zs=>{es=zs.lengthComputable,Dr=zs.loaded,Ur=zs.total,os()},zs=>{this.manager.itemError(a),typeof rn=="function"&&rn(zs)});const mo=new FileLoader(this._internalLoadingManager);return mo.setRequestHeader(this.requestHeader),mo.setPath(this.path),mo.setWithCredentials(this.withCredentials),mo.load(b,async zs=>{if(typeof zs!="string")throw new Error("Invalid metadata string");zn=JSON.parse(zs),await ar()},zs=>{zr=zs.lengthComputable,as=zs.loaded,rs=zs.total,os()},zs=>{this.manager.itemError(b),typeof rn=="function"&&rn(zs)}),sn}}class HDRJPGLoader extends LoaderBase{load(s,a,b,_e){const bt=this.prepareQuadRenderer(),rn=new FileLoader(this._internalLoadingManager);return rn.setResponseType("arraybuffer"),rn.setRequestHeader(this.requestHeader),rn.setPath(this.path),rn.setWithCredentials(this.withCredentials),this.manager.itemStart(s),rn.load(s,async sn=>{if(typeof sn=="string")throw new Error("Invalid buffer, received [string], was expecting [ArrayBuffer]");const yn=new Uint8Array(sn);let Pn,zn,ar;try{const lr=await extractGainmapFromJPEG(yn);Pn=lr.sdr,zn=lr.gainMap,ar=lr.metadata}catch(lr){if(lr instanceof XMPMetadataNotFoundError||lr instanceof GainMapNotFoundError)console.warn(`Failure to reconstruct an HDR image from ${s}: Gain map metadata not found in the file, HDRJPGLoader will render the SDR jpeg`),ar={gainMapMin:[0,0,0],gainMapMax:[1,1,1],gamma:[1,1,1],hdrCapacityMin:0,hdrCapacityMax:1,offsetHdr:[0,0,0],offsetSdr:[0,0,0]},Pn=yn;else throw lr}try{await this.render(bt,ar,Pn,zn)}catch(lr){this.manager.itemError(s),typeof _e=="function"&&_e(lr),bt.disposeOnDemandRenderer();return}typeof a=="function"&&a(bt),this.manager.itemEnd(s),bt.disposeOnDemandRenderer()},b,sn=>{this.manager.itemError(s),typeof _e=="function"&&_e(sn)}),bt}}const presetsObj={apartment:"lebombo_1k.hdr",city:"potsdamer_platz_1k.hdr",dawn:"kiara_1_dawn_1k.hdr",forest:"forest_slope_1k.hdr",lobby:"st_fagans_interior_1k.hdr",night:"dikhololo_night_1k.hdr",park:"rooitou_park_1k.hdr",studio:"studio_small_03_1k.hdr",sunset:"venice_sunset_1k.hdr",warehouse:"empty_warehouse_01_1k.hdr"},CUBEMAP_ROOT="https://raw.githack.com/pmndrs/drei-assets/456060a26bbeb8fdf79326f224b6d99b8bcce736/hdri/",isArray=o=>Array.isArray(o);function useEnvironment({files:o=["/px.png","/nx.png","/py.png","/ny.png","/pz.png","/nz.png"],path:s="",preset:a=void 0,encoding:b=void 0,extensions:_e}={}){var bt;let rn=null,sn=!1;if(a){if(!(a in presetsObj))throw new Error("Preset must be one of: "+Object.keys(presetsObj).join(", "));o=presetsObj[a],s=CUBEMAP_ROOT}const yn=isArray(o)&&o.length===6,Pn=isArray(o)&&o.length===3&&o.some(Ur=>Ur.endsWith("json")),zn=isArray(o)?o[0]:o;sn=isArray(o);const ar=yn?"cube":Pn?"webp":zn.startsWith("data:application/exr")?"exr":zn.startsWith("data:application/hdr")?"hdr":zn.startsWith("data:image/jpeg")?"jpg":(bt=zn.split(".").pop())==null||(bt=bt.split("?"))==null||(bt=bt.shift())==null?void 0:bt.toLowerCase();if(rn=ar==="cube"?CubeTextureLoader:ar==="hdr"?RGBELoader:ar==="exr"?EXRLoader:ar==="jpg"||ar==="jpeg"?HDRJPGLoader:ar==="webp"?GainMapLoader:null,!rn)throw new Error("useEnvironment: Unrecognized file extension: "+o);const lr=useThree(Ur=>Ur.gl);reactExports.useLayoutEffect(()=>{if(ar!=="webp"&&ar!=="jpg"&&ar!=="jpeg")return;function Ur(){useLoader.clear(rn,sn?[o]:o)}lr.domElement.addEventListener("webglcontextlost",Ur,{once:!0})},[o,lr.domElement]);const cr=useLoader(rn,sn?[o]:o,Ur=>{(ar==="webp"||ar==="jpg"||ar==="jpeg")&&Ur.setRenderer(lr),Ur.setPath==null||Ur.setPath(s),_e&&_e(Ur)});let hr=sn?cr[0]:cr;if(ar==="jpg"||ar==="jpeg"||ar==="webp"){var es;hr=(es=hr.renderTarget)==null?void 0:es.texture}return hr.mapping=yn?CubeReflectionMapping:EquirectangularReflectionMapping,"colorSpace"in hr?hr.colorSpace=b??yn?"srgb":"srgb-linear":hr.encoding=b??yn?sRGBEncoding:LinearEncoding,hr}const isRef$1=o=>o.current&&o.current.isScene,resolveScene=o=>isRef$1(o)?o.current:o;function setEnvProps(o,s,a,b,_e={}){var bt,rn,sn,yn,Pn;_e={backgroundBlurriness:(bt=_e.blur)!==null&&bt!==void 0?bt:0,backgroundIntensity:1,backgroundRotation:[0,0,0],environmentIntensity:1,environmentRotation:[0,0,0],..._e};const zn=resolveScene(s||a),ar=zn.background,lr=zn.environment,cr={backgroundBlurriness:zn.backgroundBlurriness,backgroundIntensity:zn.backgroundIntensity,backgroundRotation:(rn=(sn=zn.backgroundRotation)==null||sn.clone==null?void 0:sn.clone())!==null&&rn!==void 0?rn:[0,0,0],environmentIntensity:zn.environmentIntensity,environmentRotation:(yn=(Pn=zn.environmentRotation)==null||Pn.clone==null?void 0:Pn.clone())!==null&&yn!==void 0?yn:[0,0,0]};return o!=="only"&&(zn.environment=b),o&&(zn.background=b),applyProps(zn,_e),()=>{o!=="only"&&(zn.environment=lr),o&&(zn.background=ar),applyProps(zn,cr)}}function EnvironmentMap({scene:o,background:s=!1,map:a,...b}){const _e=useThree(bt=>bt.scene);return reactExports.useLayoutEffect(()=>{if(a)return setEnvProps(s,o,_e,a,b)}),null}function EnvironmentCube({background:o=!1,scene:s,blur:a,backgroundBlurriness:b,backgroundIntensity:_e,backgroundRotation:bt,environmentIntensity:rn,environmentRotation:sn,...yn}){const Pn=useEnvironment(yn),zn=useThree(ar=>ar.scene);return reactExports.useLayoutEffect(()=>setEnvProps(o,s,zn,Pn,{blur:a,backgroundBlurriness:b,backgroundIntensity:_e,backgroundRotation:bt,environmentIntensity:rn,environmentRotation:sn})),null}function EnvironmentPortal({children:o,near:s=1,far:a=1e3,resolution:b=256,frames:_e=1,map:bt,background:rn=!1,blur:sn,backgroundBlurriness:yn,backgroundIntensity:Pn,backgroundRotation:zn,environmentIntensity:ar,environmentRotation:lr,scene:cr,files:hr,path:es,preset:Ur=void 0,extensions:Dr}){const zr=useThree(mo=>mo.gl),rs=useThree(mo=>mo.scene),as=reactExports.useRef(null),[os]=reactExports.useState(()=>new Scene),cs=reactExports.useMemo(()=>{const mo=new WebGLCubeRenderTarget(b);return mo.texture.type=HalfFloatType,mo},[b]);reactExports.useLayoutEffect(()=>(_e===1&&as.current.update(zr,os),setEnvProps(rn,cr,rs,cs.texture,{blur:sn,backgroundBlurriness:yn,backgroundIntensity:Pn,backgroundRotation:zn,environmentIntensity:ar,environmentRotation:lr})),[o,os,cs.texture,cr,rs,rn,_e,zr]);let ga=1;return useFrame(()=>{(_e===1/0||ga<_e)&&(as.current.update(zr,os),ga++)}),reactExports.createElement(reactExports.Fragment,null,createPortal(reactExports.createElement(reactExports.Fragment,null,o,reactExports.createElement("cubeCamera",{ref:as,args:[s,a,cs]}),hr||Ur?reactExports.createElement(EnvironmentCube,{background:!0,files:hr,preset:Ur,path:es,extensions:Dr}):bt?reactExports.createElement(EnvironmentMap,{background:!0,map:bt,extensions:Dr}):null),os))}function EnvironmentGround(o){var s,a,b,_e;const bt=useEnvironment(o),rn=o.map||bt;reactExports.useMemo(()=>extend({GroundProjectedEnvImpl:GroundProjectedEnv}),[]);const sn=reactExports.useMemo(()=>[rn],[rn]),yn=(s=o.ground)==null?void 0:s.height,Pn=(a=o.ground)==null?void 0:a.radius,zn=(b=(_e=o.ground)==null?void 0:_e.scale)!==null&&b!==void 0?b:1e3;return reactExports.createElement(reactExports.Fragment,null,reactExports.createElement(EnvironmentMap,_extends$1({},o,{map:rn})),reactExports.createElement("groundProjectedEnvImpl",{args:sn,scale:zn,height:yn,radius:Pn}))}function Environment(o){return o.ground?reactExports.createElement(EnvironmentGround,o):o.map?reactExports.createElement(EnvironmentMap,o):o.children?reactExports.createElement(EnvironmentPortal,o):reactExports.createElement(EnvironmentCube,o)}const LightManager=()=>{const[o,s]=reactExports.useState(!1),a=productDataStore$1(rn=>rn),b=lightStore(rn=>rn),[_e,bt]=reactExports.useState(1);return reactExports.useEffect(()=>{const rn=a.assetsData,sn=rn?.sceneMoodSettings?.envMap;sn&&(lightStore.setState({defaultEnvMapUrl:sn}),b.actions.setEnvLightMap(sn)),b.envMapUrl===""&&b.actions.setEnvLightMap(lightStore.getState().defaultEnvMapUrl);const yn=rn?.sceneMoodSettings?.ambientLightIntensity;yn!==void 0&&bt(yn),s(!0)},[]),reactExports.useEffect(()=>{o!==!1&&(LOGGER.groupCollapsed("SCENE LIGHTING INFO:"),LOGGER.table({title:"Scene Lights",details:{"Environment Map":b.envMapUrl,"Ambient Light Intensity":_e}}),LOGGER.groupEnd())},[o]),jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:o===!0&&jsxRuntimeExports.jsxs("group",{name:"GRP_LIGHTS",children:[jsxRuntimeExports.jsx("ambientLight",{intensity:_e}),jsxRuntimeExports.jsx(Environment,{background:!1,files:CORE_API.getResolvedAssetUrl(b.envMapUrl)})]})})},ColliderGeo=({itemKey:o})=>{const s=reactExports.useRef(null),a=itemStore(b=>b);return reactExports.useEffect(()=>{if(s.current)return a.collidersRef.push(s),a.actions.setCollidersRef([...a.collidersRef]),()=>{const b=a.collidersRef.indexOf(s);b>-1&&a.collidersRef.splice(b,1),a.actions.setCollidersRef([...a.collidersRef])}},[s]),jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:(o.itemData.hasOwnProperty("disableCollider")?!o.itemData.disableCollider:!coreSceneStore.getState().sceneSettings.disableCollider)&&jsxRuntimeExports.jsx("group",{name:"GRP_LoadingPlaceholder",children:jsxRuntimeExports.jsx("group",{position:o.itemData.boundingSphereCenter,scale:[.9,.9,.9],name:"boxGeometry",children:jsxRuntimeExports.jsx(Box,{ref:s,scale:Vec3ToArr(o.itemData.boundingBoxSize),visible:!1})})})})},ProxyGeo=({proxyScene:o,proxyOnly:s,scale:a,itemKey:b})=>{const[_e,bt]=reactExports.useState(!s),rn=reactExports.useRef(null),sn=reactExports.useMemo(()=>o.clone(),[]);return reactExports.useEffect(()=>()=>{dispose3(sn)},[sn]),reactExports.useEffect(()=>{if(s){if(attachmentStore$1.getState().attachmentSystem.currentStructure.getNodeByGUID(b.itemData.guid)==null)return;attachmentStore$1.getState().actions.updateFittingSkuIds(),CORE_API.fireEvent(CORE_API.EVENTS.SCENE.Model_Loaded,b.itemData.skuID),CORE_API.fireEvent(CORE_API.EVENTS.SCENE.Item_Added,{...b,visualizedInScene:!1})}else{const yn=Pn=>{b.itemData.skuID===Pn.data&&bt(!1)};CORE_API.coreWCRef.addEventListener(CORE_API.EVENTS.SCENE.Model_Loaded,yn,{once:!0})}},[]),jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:jsxRuntimeExports.jsx("group",{name:"GRP_ProxyMesh",onClick:()=>{CORE_API.closeContextMenu()},children:jsxRuntimeExports.jsx("primitive",{ref:rn,name:"proxyGeometry",autoFocusEnabled:!s,object:sn,scale:a,visible:_e&&!s,wireframe:_e&&!s,children:_e&&!s&&jsxRuntimeExports.jsx(Html,{center:!0,distanceFactor:b.itemData.boundingBoxSize.x*4>1?1:b.itemData.boundingBoxSize.x*4,position:b.itemData.boundingSphereCenter,zIndexRange:[29,0],children:jsxRuntimeExports.jsx("img",{alt:"Loading...",draggable:"false",src:PUBLIC_DESIGN_ASSETS_ENDPOINT+"/Animation/Loading.svg"})})})})})};function Draggable({children:o,guid:s,onDragStartHandler:a,onDragEndHandler:b,onItemClickHandler:_e,onPointerEnter:bt,onPointerLeave:rn,dragging:sn=!1,intersectingGhostObject:yn=null,isInteractive:Pn=!0,initialIntersectedGhostUUID:zn=null,isSnapAllowed:ar=!1,...lr}){const cr=reactExports.useRef(),hr=reactExports.useRef(-1),es=reactExports.useRef([]),Ur=reactExports.useRef([]),{raycaster:Dr,size:zr,camera:rs}=useThree(),as=hotspotStore$1(gy=>gy.isAnyHotspotActive),os=coreSceneStore(gy=>gy.multipleTouchDetected),[cs,ga]=reactExports.useState(null),{raycasterGhost:mo}=reactExports.useMemo(()=>({raycasterGhost:new Raycaster})),zs=gy=>{let _f;return gy.isGhost===!0?_f=gy:gy.parent?gy.parent.isGhost===!0?_f=gy.parent:_f=zs(gy.parent):_f=null,_f},ho=gy=>{mo.layers.enable(GHOST_LAYER),mo.setFromCamera(gy,rs);const _f=mo.intersectObject(ghostStore.getState().ghostParentRef);let Cy=null;return _f.length>0&&(Cy=zs(_f[0].object)),Cy},yl=gy=>{let _f=gy.whichNodesAreAttachedToUs();return _f.map(Cy=>{yl(Cy).map(aA=>{_f.push(aA)})}),_f},{initialMouse2D:go,mouse2D:Al,mouse3D:_d,offset:by,normal:yy,plane:wy,pointerDownPos:El}=reactExports.useMemo(()=>({initialMouse2D:new Vector2,mouse2D:new Vector2,mouse3D:new Vector3,offset:new Vector3,normal:new Vector3,plane:new Plane,pointerDownPos:new Vector2}),[]);reactExports.useEffect(()=>{let gy=attachmentStore$1.getState().attachmentSystem.currentStructure.getNodeByGUID(s);ga(gy)},[]);const _c=useGesture({onPointerEnter:gy=>{os||coreSceneStore.getState().sceneSettings.disableDragDrop&&coreSceneStore.getState().sceneSettings.disableContextMenu||coreSceneStore.getState().itemDraggedSkuID||coreSceneStore.getState().cameraActive!==!0&&!coreSceneStore.getState().dragging&&!as&&(cs&&!cs.isEndNode?CORE_API.switchCursor(CURSORS.POINTER):CORE_API.switchCursor(CURSORS.GRAB),bt(gy.event))},onPointerLeave:gy=>{os||coreSceneStore.getState().sceneSettings.disableDragDrop&&coreSceneStore.getState().sceneSettings.disableContextMenu||coreSceneStore.getState().itemDraggedSkuID||coreSceneStore.getState().cameraActive!==!0&&!coreSceneStore.getState().dragging&&!as&&(CORE_API.switchCursor(CURSORS.GRAB),rn(gy.event))},onClick:gy=>{if(gy.event.stopPropagation(),!os){if(coreSceneStore.getState().builderMode){const{eventObject:_f,point:Cy}=gy.event;_f.getWorldPosition(by).sub(Cy),_d.copy(Cy);const Fy=gy.event.offsetX,aA=gy.event.offsetY,cA=Fy/zr.width*2-1,Oy=-aA/zr.height*2+1;Al.set(cA,Oy);const IA=new Raycaster;IA.setFromCamera(Al,rs);const $A=IA.intersectObject(coreSceneStore.getState().sceneRef.getObjectByName("proxyGeometry"));$A.length>0&&CORE_API.fireEvent(CORE_API.EVENTS.CONFIGURATION.OnClickItem,{point:$A[0].point,camera:IA.camera})}if(!coreSceneStore.getState().sceneSettings.disableContextMenu)if(!gy.dragging&&!as){if(Math.abs(gy.event.x-El.x)>1)return;_e(gy.event.offsetX,gy.event.offsetY,s)}else hotspotStore$1.getState().actions.exitHotspot(!0)}},onDrag:async gy=>{if(coreSceneStore.getState().simulateDragEnd===!0||coreSceneStore.getState().dragging&&coreSceneStore.getState().draggingItemGUID!==cs.guid||coreSceneStore.getState().sceneSettings.disableDragDrop)return;const _f=gy.event;if(_f.stopPropagation(),as){CORE_API.switchCursor(CURSORS.BLOCKED);return}if(itemStore.getState().selectedItemData){CORE_API.switchCursor(CURSORS.BLOCKED);return}if(Object.keys(itemStore.getState().itemsSpawned).length<2){CORE_API.switchCursor(CURSORS.BLOCKED);return}const Fy=gy.event.offsetX,aA=gy.event.offsetY;if(!coreSceneStore.getState().dragging){if(itemStore.setState({busyDraggingItem:!0}),Math.abs(_f.x-El.x)<=1)return;if(cs&&!cs.canDrag){CORE_API.switchCursor(CURSORS.BLOCKED);return}const YA=cs.whichPlugAreWeAttachedUsing().attachedPlug.guid;let FA=cs.swapRoot();FA||(FA={rootDetachedPlugs:cs.detachNodeFromReceiver()}),es.current=yl(cs),Ur.current=[],es.current.map(NA=>{Ur.current.push(NA.guid),cs.ref.attach(NA.ref),cs.dragging=!0,NA.dragging=!0}),CORE_API.switchCursor(CURSORS.MOVE),coreSceneStore.setState({dragging:!0,draggingItemGUID:cs.guid}),window.pointerDownPos=gy.event.clientX,window.mouseDragging=!1;const zA=productDataStore$1.getState().productData[cs.skuID].lookDetails[cs.currentVariant].thumbnails.low;window.mouseDownImgSrc=CORE_API.getResolvedAssetUrl(zA),window.mouseDownSkuID=cs.skuID,window.moveThreshold=0,ar=!1,yn=null,zn=null,hr.current=-1;const UA=Fy/zr.width*2-1,oE=-aA/zr.height*2+1;go.set(UA,oE);const iC=await a({guid:s,node:cs,detachedData:FA,attachedChildrenGuids:Ur.current});if(!iC||iC.length<=0||iC.transforms===void 0)return;iC.transforms.map((NA,qy)=>{NA.receiverPlugGUID===YA&&(hr.current=qy)})}const cA=Fy/zr.width*2-1,Oy=-aA/zr.height*2+1;Al.set(cA,Oy),Dr.setFromCamera(Al,rs),rs.getWorldDirection(yy).negate(),wy.setFromNormalAndCoplanarPoint(yy,_d),Dr.ray.intersectPlane(wy,_d),cs.ref.visible=!1;const IA=ghostStore.getState().ghostParentRef;if(IA.children.length>0){yn=ho(Al),zn===null&&hr.current!==-1&&hr.current<IA.children.length&&IA.children[hr.current]!==void 0&&(zn=IA.children[hr.current].children[0].uuid);const $A=coreSceneStore.getState().hoveredGhostIndex;yn?$A!==yn.index&&coreSceneStore.setState({hoveredGhostIndex:yn.index}):$A!==-1&&coreSceneStore.setState({hoveredGhostIndex:-1}),cs.ref.position.copy(_d).add(by)}if(cA>1||cA<-1||Oy<-1||Oy>1){itemStore.setState({busyDraggingItem:!1}),CORE_API.switchCursor(CURSORS.GRAB),window.mouseDownImgSrc=null,window.mouseDragging=!1,window.dragImgElRef.style.opacity=0,cs.ref.visible=!0,coreSceneStore.setState({simulateDragEnd:!0,dragging:!1,draggingItemGUID:null,hoveredGhostIndex:-1}),b({node:cs,intersectingGhostObject:yn,attachedChildrenGuids:Ur.current,attachedNodesToCurrentNode:es.current});const $A=attachmentStore$1.getState().attachmentSystem.currentStructure.nodes;DynamicHooks.hookOnSceneItemsUpdated($A)}},onDragStart:({event:gy})=>{if(coreSceneStore.setState({simulateDragEnd:!1}),os||coreSceneStore.getState().sceneSettings.disableDragDrop&&coreSceneStore.getState().sceneSettings.disableContextMenu)return;gy.stopPropagation();const{eventObject:_f,point:Cy}=gy;_f.getWorldPosition(by).sub(Cy),_d.copy(Cy),El.set(gy.x,gy.y)},onDragEnd:({event:gy})=>{if(coreSceneStore.setState({simulateDragEnd:!1}),coreSceneStore.getState().dragging&&coreSceneStore.getState().draggingItemGUID!==cs.guid||coreSceneStore.getState().sceneSettings.disableDragDrop&&coreSceneStore.getState().sceneSettings.disableContextMenu)return;gy.stopPropagation(),window.mouseDownImgSrc=null,window.mouseDragging=!1,window.dragImgElRef.style.opacity=0,cs.ref.visible=!0,coreSceneStore.setState({dragging:!1,hoveredGhostIndex:-1,draggingItemGUID:null}),itemStore.setState({busyDraggingItem:!1}),CORE_API.switchCursor(CURSORS.GRAB),b({node:cs,intersectingGhostObject:yn,attachedChildrenGuids:Ur.current,attachedNodesToCurrentNode:es.current});const _f=attachmentStore$1.getState().attachmentSystem.currentStructure.nodes;DynamicHooks.hookOnSceneItemsUpdated(_f)}});return jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:Pn?jsxRuntimeExports.jsx("group",{ref:cr,..._c(),...lr,children:o}):jsxRuntimeExports.jsx("group",{ref:cr,...lr,children:o})})}const Model=reactExports.forwardRef(({itemKey:o,mainModel:s,scale:a,onDragStartHandler:b,onDragEndHandler:_e,onItemClickHandler:bt,stockAlert:rn=!0},sn)=>{const yn=itemStore(as=>as.focusedGUID),Pn=itemStore(as=>as),zn=itemStore(as=>as.hoveredItemRef),ar=reactExports.useRef(null),lr=reactExports.useRef([]),cr=reactExports.useRef(0),hr=reactExports.useRef(0);reactExports.useEffect(()=>()=>{dispose3(s)},[s]);const es=reactExports.useCallback(()=>{if(!sn.current||(lr.current=findMeshAndCloneMatFromScene(sn.current,sn.current.inStock),lr.current.length==0))return;if(sn.current.inStock===!1){rn==!0&&(rn=!1,CORE_API.alert({alertMsg:"Some item(s) in configuration are out of stock",alertTime:7e3,alertType:"warn",alertLabel:"Stock Alert",persistant:!0,alertId:"outOfStock"}));return}const{current:as}=hr;for(let os=0;os<lr.current.length;os++){const cs=lr.current[os].material;cs.emissiveIntensity=as}},[hr,sn]),Ur=reactExports.useCallback(()=>{cr.current=0},[lr]),Dr=reactExports.useCallback(()=>{cr.current=.005},[lr,s]);useFrame(()=>{if(coreSceneStore.getState().builderMode)return;const as=cameraStore.getState().userDragging,os=0;hr.current=MathUtils.lerp(hr.current,as?os:cr.current,.1),es()}),reactExports.useEffect(()=>{const as=attachmentStore$1.getState().attachmentSystem.currentStructure,os=as.getNodeByGUID(o.itemData.guid);if(os?.isDependent&&!os.isInteractive&&Object.keys(zn).length>0){const cs=as.getNodeByGUID(Object.keys(zn)[0]);if(!cs||!cs.myDependenciesGUID)return;cs.myDependenciesGUID.includes(o.itemData.guid)?Ur():Dr()}else zn.hasOwnProperty(o.itemData.guid)||Object.keys(zn).length==0?Ur():Dr()},[zn]);const zr=reactExports.useCallback(as=>{as.stopPropagation();const os=Pn.selectedItemData;coreSceneStore.setState({canvasTooltipText:"-"+o.itemData.name+"-"}),os||itemStore.setState({hoveredItemRef:{}});let cs=itemStore.getState().hoveredItemRef;cs.hasOwnProperty(o.itemData.guid)||(cs[o.itemData.guid]={instance:sn.current},Pn.actions.setHoveredItemRef({...cs}))},[Pn,zn,ar]),rs=reactExports.useCallback(as=>{as.stopPropagation();const os=Pn.selectedItemData;if(coreSceneStore.setState({canvasTooltipText:""}),os){if(os.itemData.guid==o.itemData.guid)return;zn[o.itemData.guid]&&(delete zn[o.itemData.guid],Pn.actions.setHoveredItemRef({...zn}))}else itemStore.setState({hoveredItemRef:{}})},[ar,Pn,zn]);return reactExports.useEffect(()=>{coreSceneStore.getState().actions.triggerAutoFocus(),attachmentStore$1.getState().actions.updateFittingSkuIds(),CORE_API.fireEvent(CORE_API.EVENTS.SCENE.Item_Added,{...o,visualizedInScene:!0})},[]),jsxRuntimeExports.jsx(Select$1,{enabled:yn===o.itemData.guid,children:jsxRuntimeExports.jsx(Draggable,{guid:o.itemData.guid,onDragStartHandler:b,onDragEndHandler:_e,onItemClickHandler:bt,onPointerEnter:zr,onPointerLeave:rs,isInteractive:o.itemData.isInteractive,children:jsxRuntimeExports.jsx(Clone,{name:"GRP_RenderGeometry",ref:sn,object:s,scale:a,inStock:!0,visible:!0})})})}),ModelAnimation=({modelAnimations:o,mainModel:s,itemKey:a,scale:b,onDragStartHandler:_e,onDragEndHandler:bt,onItemClickHandler:rn})=>{const{ref:sn,actions:yn,names:Pn}=useAnimations(o),zn=hotspotStore$1(hr=>hr),ar=reactExports.useRef(null),lr=reactExports.useCallback((hr,es,Ur,Dr)=>playAnimation(hr,es,Ur,Dr,Pn,yn),[Pn,yn]),cr=reactExports.useCallback(hr=>stopAnimation(hr,Pn,yn),[Pn,yn]);return reactExports.useEffect(()=>{if(ar.current===a.itemData.guid){if(ar.current=null,!zn.lastActiveHotspotData)return;let hr=zn.lastActiveHotspotData.hotspotData;if(!hr)return;if(hr.exitAnim?lr(hr.exitAnim,!1,!1,!1):hr.entryAnim&&lr(hr.entryAnim,!1,!0,!1),hr.activeAnim&&cr(hr.activeAnim),zn.activeHotspotData){if(a.itemData.guid===zn.activeHotspotData.itemData.guid){ar.current=a.itemData.guid;let es=zn.activeHotspotData.hotspotData;if(!es)return;es.entryAnim&&lr(es.entryAnim,!1,!1,!0),es.activeAnim&&lr(es.activeAnim,!0,!1,!1)}}else return}else if(zn.activeHotspotData){if(a.itemData.guid===zn.activeHotspotData.itemData.guid){ar.current=a.itemData.guid;let hr=zn.activeHotspotData.hotspotData;if(!hr)return;hr.entryAnim&&lr(hr.entryAnim,!1,!1,!0),hr.activeAnim&&lr(hr.activeAnim,!0,!1,!1)}}else return},[zn.activeHotspotData]),jsxRuntimeExports.jsx(Model,{ref:sn,mainModel:s,itemKey:a,scale:b,onDragStartHandler:_e,onDragEndHandler:bt,onItemClickHandler:rn})};function playAnimation(o,s,a,b,_e,bt){if(!_e.includes(o))return;const rn=bt[o];rn.setLoop(s?LoopRepeat:LoopOnce),rn.clampWhenFinished=!s,b&&rn.reset(),a?rn.fadeOut(.5).play():rn.fadeIn(.5).play()}function stopAnimation(o,s,a){if(!s.includes(o))return;a[o].stop()}const RenderGeo=({url:o,itemKey:s,scale:a,onDragStartHandler:b,onDragEndHandler:_e,onItemClickHandler:bt})=>{const rn=useLoader(GLTFLoader,o,sn=>{sn.setDRACOLoader(assetStore.getState().dracoLoader),sn.register(yn=>new GLTFMaterialsVariantsExtension(yn))});return reactExports.useEffect(()=>((async()=>{if(rn.functions){const yn=attachmentStore$1.getState().attachmentSystem.currentStructure.getNodeByGUID(s.itemData.guid);if(yn){yn.modelFunctions=rn.functions;const Pn=findVariantForGUID(s.itemData.guid);Pn&&(yn.currentVariant=Pn,await rn.functions.selectVariant(rn.scene,Pn),itemStore.setState({variantChangeAlert:!itemStore.getState().variantChangeAlert}))}}LOGGER.info({title:"model loaded: "+s.itemData.skuID}),s.itemData.hasItemLoaded=!0,itemStore.getState().actions.triggerModelLoaded(),CORE_API.fireEvent(CORE_API.EVENTS.SCENE.Model_Loaded,s.itemData.skuID),await attachmentStore$1.getState().actions.updateFittingSkuIds()})(),()=>{CORE_API.fireEvent(CORE_API.EVENTS.SCENE.Model_Removed,s.itemData.skuID)}),[rn]),jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:rn&&(rn.animations?jsxRuntimeExports.jsx(ModelAnimation,{modelAnimations:rn.animations,mainModel:rn.scene,itemKey:s,scale:a,onDragStartHandler:b,onDragEndHandler:_e,onItemClickHandler:bt}):jsxRuntimeExports.jsx(Model,{mainModel:rn.scene,itemKey:s,scale:a,onDragStartHandler:b,onDragEndHandler:_e,onItemClickHandler:bt}))})},SceneItem=({position:o,rotation:s,itemKey:a,scale:b,rejectFunc:_e,onItemClickHandler:bt,onDragEndHandler:rn,onDragStartHandler:sn,itemIndex:yn,proxyScene:Pn,proxyOnly:zn})=>{const ar=reactExports.useRef(null);return reactExports.useEffect(()=>{if(!ar.current)return;const lr=coreSceneStore.getState().sceneRef;if(lr&&a.itemData.hasOwnProperty("excludeFromSceneBounds")&&a.itemData.excludeFromSceneBounds){const es=lr.getObjectByName("#GRP_EXCLUDED");es!==void 0&&es.attach(ar.current)}const hr=attachmentStore$1.getState().attachmentSystem.currentStructure.getNodeByGUID(a.itemData.guid);hr&&hr.ref!==ar.current&&(hr.ref=ar.current,hr.transform={position:o,rotation:s})},[ar]),jsxRuntimeExports.jsxs("group",{ref:ar,position:o,quaternion:s,name:`GRP_${a.itemData.name}_`+yn.toString().padStart(2,"0"),children:[jsxRuntimeExports.jsx(ColliderGeo,{itemKey:a}),jsxRuntimeExports.jsx(ProxyGeo,{proxyScene:Pn,scale:b,proxyOnly:zn,itemKey:a}),!zn&&jsxRuntimeExports.jsx(reactExports.Suspense,{children:jsxRuntimeExports.jsx(RenderGeo,{scale:b,itemKey:a,url:resolveAssetUrl(CORE_API.isMobile&&a.itemData.gltfURL_mobile?a.itemData.gltfURL_mobile:a.itemData.gltfURL),onDragStartHandler:sn,onDragEndHandler:rn,onItemClickHandler:bt})})]})};function GhostEventHandler({index:o,children:s,...a}){const b=reactExports.useRef(),_e=useGesture({onPointerEnter:bt=>{bt.event.stopPropagation(),coreSceneStore.getState().itemDraggedSkuID&&coreSceneStore.setState({hoveredGhostIndex:o})},onPointerLeave:bt=>{bt.event.stopPropagation(),coreSceneStore.getState().itemDraggedSkuID&&coreSceneStore.getState().hoveredGhostIndex===o&&coreSceneStore.setState({hoveredGhostIndex:-1})}});return jsxRuntimeExports.jsx("group",{ref:b,..._e(),...a,children:s})}const selectionContext=reactExports.createContext(null);function Selection({children:o,enabled:s=!0}){const[a,b]=reactExports.useState([]),_e=reactExports.useMemo(()=>({selected:a,select:b,enabled:s}),[a,b,s]);return jsxRuntimeExports.jsx(selectionContext.Provider,{value:_e,children:o})}function Select({enabled:o=!1,children:s,...a}){const b=reactExports.useRef(null),_e=reactExports.useContext(selectionContext);return reactExports.useEffect(()=>{if(_e&&o){let bt=!1;const rn=[];if(b.current.traverse(sn=>{sn.type==="Mesh"&&rn.push(sn),_e.selected.indexOf(sn)===-1&&(bt=!0)}),bt)return _e.select(sn=>[...sn,...rn]),()=>{_e.select(sn=>sn.filter(yn=>!rn.includes(yn)))}}},[o,s,_e]),jsxRuntimeExports.jsx("group",{ref:b,...a,children:s})}const EffectComposerContext=reactExports.createContext(null),isConvolution=o=>(o.getAttributes()&EffectAttribute.CONVOLUTION)===EffectAttribute.CONVOLUTION,EffectComposer=React.memo(reactExports.forwardRef(({children:o,camera:s,scene:a,resolutionScale:b,enabled:_e=!0,renderPriority:bt=1,autoClear:rn=!0,depthBuffer:sn,enableNormalPass:yn,stencilBuffer:Pn,multisampling:zn=8,frameBufferType:ar=HalfFloatType},lr)=>{const{gl:cr,scene:hr,camera:es,size:Ur}=useThree(),Dr=a||hr,zr=s||es,[rs,as,os]=reactExports.useMemo(()=>{const zs=isWebGL2Available(),ho=new EffectComposer$1(cr,{depthBuffer:sn,stencilBuffer:Pn,multisampling:zn>0&&zs?zn:0,frameBufferType:ar});ho.addPass(new RenderPass(Dr,zr));let yl=null,go=null;return yn&&(go=new NormalPass(Dr,zr),go.enabled=!1,ho.addPass(go),b!==void 0&&zs&&(yl=new DepthDownsamplingPass({normalBuffer:go.texture,resolutionScale:b}),yl.enabled=!1,ho.addPass(yl))),[ho,go,yl]},[zr,cr,sn,Pn,zn,ar,Dr,yn,b]);reactExports.useEffect(()=>rs?.setSize(Ur.width,Ur.height),[rs,Ur]),useFrame((zs,ho)=>{if(_e){const yl=cr.autoClear;cr.autoClear=rn,Pn&&!rn&&cr.clearStencil(),rs.render(ho),cr.autoClear=yl}},_e?bt:0);const cs=reactExports.useRef(null),ga=useInstanceHandle(cs);reactExports.useLayoutEffect(()=>{const zs=[];if(cs.current&&ga.current&&rs){const ho=ga.current.objects;for(let yl=0;yl<ho.length;yl++){const go=ho[yl];if(go instanceof Effect){const Al=[go];if(!isConvolution(go)){let by=null;for(;(by=ho[yl+1])instanceof Effect&&!isConvolution(by);)Al.push(by),yl++}const _d=new EffectPass(zr,...Al);zs.push(_d)}else go instanceof Pass&&zs.push(go)}for(const yl of zs)rs?.addPass(yl);as&&(as.enabled=!0),os&&(os.enabled=!0)}return()=>{for(const ho of zs)rs?.removePass(ho);as&&(as.enabled=!1),os&&(os.enabled=!1)}},[rs,o,zr,as,os,ga]),reactExports.useEffect(()=>{const zs=cr.toneMapping;return cr.toneMapping=NoToneMapping,()=>{cr.toneMapping=zs}},[]);const mo=reactExports.useMemo(()=>({composer:rs,normalPass:as,downSamplingPass:os,resolutionScale:b,camera:zr,scene:Dr}),[rs,as,os,b,zr,Dr]);return reactExports.useImperativeHandle(lr,()=>rs,[rs]),jsxRuntimeExports.jsx(EffectComposerContext.Provider,{value:mo,children:jsxRuntimeExports.jsx("group",{ref:cs,children:o})})})),resolveRef=o=>typeof o=="object"&&o!=null&&"current"in o?o.current:o,Outline=reactExports.forwardRef(function o({selection:s=[],selectionLayer:a=10,blendFunction:b,patternTexture:_e,edgeStrength:bt,pulseSpeed:rn,visibleEdgeColor:sn,hiddenEdgeColor:yn,width:Pn,height:zn,kernelSize:ar,blur:lr,xRay:cr,...hr},es){const Ur=useThree(os=>os.invalidate),{scene:Dr,camera:zr}=reactExports.useContext(EffectComposerContext),rs=reactExports.useMemo(()=>new OutlineEffect(Dr,zr,{blendFunction:b,patternTexture:_e,edgeStrength:bt,pulseSpeed:rn,visibleEdgeColor:sn,hiddenEdgeColor:yn,width:Pn,height:zn,kernelSize:ar,blur:lr,xRay:cr,...hr}),[b,lr,zr,bt,zn,yn,ar,_e,rn,Dr,sn,Pn,cr]),as=reactExports.useContext(selectionContext);return reactExports.useEffect(()=>{if(!as&&s)return rs.selection.set(Array.isArray(s)?s.map(resolveRef):[resolveRef(s)]),Ur(),()=>{rs.selection.clear(),Ur()}},[rs,s,as,Ur]),reactExports.useEffect(()=>{rs.selectionLayer=a,Ur()},[rs,Ur,a]),reactExports.useRef(),reactExports.useEffect(()=>{var os;if(as&&as.enabled&&(os=as.selected)!=null&&os.length)return rs.selection.set(as.selected),Ur(),()=>{rs.selection.clear(),Ur()}},[as,rs.selection,Ur]),reactExports.useEffect(()=>()=>{rs.dispose()},[rs]),jsxRuntimeExports.jsx("primitive",{ref:es,object:rs})}),ToneMapping=reactExports.forwardRef(function o({blendFunction:s,adaptive:a,mode:b,resolution:_e,maxLuminance:bt,whitePoint:rn,middleGrey:sn,minLuminance:yn,averageLuminance:Pn,adaptationRate:zn,...ar},lr){const cr=reactExports.useMemo(()=>new ToneMappingEffect({blendFunction:s,adaptive:a,mode:b,resolution:_e,maxLuminance:bt,whitePoint:rn,middleGrey:sn,minLuminance:yn,averageLuminance:Pn,adaptationRate:zn}),[s,a,b,_e,bt,rn,sn,yn,Pn,zn]);return reactExports.useEffect(()=>{cr.dispose()},[cr]),jsxRuntimeExports.jsx("primitive",{...ar,ref:lr,object:cr,attributes:EffectAttribute.CONVOLUTION})}),Ghost=({ghostVisibility:o,ghostData:s,ghostTransform:a,index:b})=>{const _e=reactExports.useRef(),bt=reactExports.useMemo(()=>s.proxyScene.clone(),[s]),rn=coreSceneStore(sn=>sn.hoveredGhostIndex);return reactExports.useEffect(()=>()=>{dispose3(bt)},[bt]),reactExports.useEffect(()=>{const{current:sn}=_e;sn&&(sn.userData.incomingPlugName=a.incomingPlugName,sn.userData.receiverPlugName=a.receiverPlugName,sn.userData.incomingPlugGUID=a.incomingPlugGUID,sn.userData.receiverPlugGUID=a.receiverPlugGUID,CORE_API.fireEvent(CORE_API.EVENTS.SCENE.Ghost_Loaded,{ghostData:s,ghostTransform:a}))},[_e]),jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:jsxRuntimeExports.jsx(GhostEventHandler,{index:b,children:jsxRuntimeExports.jsx(Select,{enabled:rn===b,children:jsxRuntimeExports.jsx("primitive",{isGhost:!0,ref:_e,index:b,autoFocusEnabled:o,position:a.position,scale:coreSceneStore.getState().sceneSettings.ghostScale,quaternion:a.rotation,object:bt,castShadow:!1,receiveShadow:!1,frustumCulled:!1},`ghost${b}`)})})})},GhostManager=({intersectingGhostObject:o=null})=>{const{camera:s}=useThree(),a=ghostStore(Pn=>Pn.ghostVisibility),b=ghostStore(Pn=>Pn.ghostData),_e=ghostStore(Pn=>Pn.ghostsTransform),bt=reactExports.useRef(),{_touch2D:rn,raycasterGhost:sn}=reactExports.useMemo(()=>({_touch2D:new Vector2,raycasterGhost:new Raycaster}),[]);reactExports.useEffect(()=>{const{current:Pn}=bt;Pn&&ghostStore.setState({ghostParentRef:Pn})},[bt]);const yn=Pn=>{let zn=0,ar=0;if(Pn.touches&&Pn.touches[0])zn=Pn.touches[0].clientX,ar=Pn.touches[0].clientY;else return;if(!coreSceneStore.getState().itemDraggedSkuID)return;const lr=coreSceneStore.getState().cursorParentRef,cr=coreSceneStore.getState().canvasSize;if(!lr)return;const hr=lr.getBoundingClientRect(),es=hr.top,Ur=hr.left,Dr=(zn-Ur)/cr.width*2-1,zr=(-ar+es)/cr.height*2+1;rn.set(Dr,zr),sn.layers.enable(GHOST_LAYER),sn.setFromCamera(rn,s);const rs=sn.intersectObject(ghostStore.getState().ghostParentRef);rs.length>0?(o=rs[0].object,coreSceneStore.setState({hoveredGhostIndex:o.parent.index})):(o=null,coreSceneStore.setState({hoveredGhostIndex:-1}))};return reactExports.useEffect(()=>(window.addEventListener("touchmove",yn,!1),LOGGER.info({title:"Ghost Manager Mounted!"}),()=>{window.removeEventListener("touchmove",yn,!1)}),[]),jsxRuntimeExports.jsx("group",{name:"#GRP_GhostParent",visible:a,scale:a?[1,1,1]:[0,0,0],ref:bt,children:b&&jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:_e.map((Pn,zn)=>zn<b.count&&jsxRuntimeExports.jsx(Ghost,{ghostVisibility:a,ghostData:b,ghostTransform:Pn,index:zn},"ghosts"+zn))})})},ItemManager=()=>{const o=attachmentStore$1(zs=>zs.attachmentSystem),s=attachmentStore$1(zs=>zs),a=itemStore(zs=>zs.removeItemTrigger),b=itemStore(zs=>zs.variantChangeAlert),_e=hotspotStore$1(zs=>zs),bt=coreSceneStore(zs=>zs.showDimensions),rn=itemStore(zs=>zs),sn=itemStore(zs=>zs.lastDeletedItemData),yn=cameraStore(zs=>zs),Pn=itemStore(zs=>zs.selectedItemData),zn=itemStore(zs=>zs.itemsSpawned),ar=coreSceneStore(zs=>zs.coreReady),lr=reactExports.useRef(null),cr=reactExports.useRef(null),hr=reactExports.useRef(!1),es=reactExports.useRef(null),Ur=reactExports.useRef(null),Dr=reactExports.useRef(!1),zr=reactExports.useRef(!1);reactExports.useRef(!1),reactExports.useRef(!1);const rs=reactExports.useCallback(async({guid:zs,node:ho,detachedData:yl,attachedChildrenGuids:go})=>{if(hr.current!==!0)return hr.current=!0,cameraStore.getState().actions.canCameraRotate(!1),_e.actions.switchHotspotsVisibility(!1,!0),es.current={position:ho.ref.position.clone(),rotation:ho.ref.rotation.clone()},Ur.current=yl,await o.currentStructure.removeNodeFromStructure(ho),go.length<=0&&(go=!1),ghostStore.getState().actions.spawnGhostsForSkuID(zn[zs].itemData.skuID,go)},[yn,zn]),as=reactExports.useCallback(async({node:zs,intersectingGhostObject:ho,attachedChildrenGuids:yl,attachedNodesToCurrentNode:go})=>{if(!hr.current)return;hr.current=!1,cameraStore.getState().actions.canCameraRotate(!0),_e.actions.switchHotspotsVisibility(!0,!0);function Al(){zs.ref.position.set(0,0,0),ghostStore.getState().actions.clearAllGhosts()}if(!ghostStore.getState().ghostData?.connectablePlugs){Al();return}o.currentStructure.addNode(zs);let by=null,yy=null,wy=!1,El=[],_c={};if(coreSceneStore.getState().sceneSettings.ignoreCollisionPostDragging===!1&&yl.map((gy,_f)=>{El[_f]=o.currentStructure.checkCollisionforGUID(gy,yl),El[_f]&&(_c[gy]=zn[gy],o.currentStructure.getNodeByGUID(gy).getAllBranchedNodesAttachedToUs().map(aA=>{_c[aA.guid]=zn[aA.guid]}))}),El.map(gy=>{wy||(wy=gy)}),ho&&wy){coreSceneStore.setState({draggingOnDropCollisionData:{node:zs,attachedChildrenGuids:yl,collidingStatus:El,intersectingGhostObject:ho,initPosition:es.current.position,initRotation:es.current.rotation,detachedPlugs:Ur.current,attachedNodesToCurrentNode:go}}),zs.ref.position.set(ho.position.x,ho.position.y,ho.position.z),zs.ref.setRotationFromEuler(ho.rotation),CORE_API.fireEvent(CORE_API.EVENTS.SCENE.DraggingOnDrop_CollsionDetected,_c);return}if(ho){const gy=ho.userData;by=zs.getPlugByName(gy.incomingPlugName),yy=o.currentStructure.getPlugByGUID(gy.receiverPlugGUID),zs.ref.position.set(ho.position.x,ho.position.y,ho.position.z),zs.ref.setRotationFromEuler(ho.rotation),zs.transform={position:ho.position,rotation:ho.quaternion}}else{const gy=Ur.current.neighbourDetachedPlugs;gy&&(Ur.current.neighbourNode.detachNodeFromReceiver(),o.currentStructure.connectPlugs({incomingPlug:gy.incomingPlug,receiverPlug:gy.receiverPlug})),by=Ur.current.rootDetachedPlugs.incomingPlug,yy=Ur.current.rootDetachedPlugs.receiverPlug,zs.ref.position.set(es.current.position.x,es.current.position.y,es.current.position.z),zs.ref.setRotationFromEuler(es.current.rotation);let _f=new Quaternion().identity();zs.ref.getWorldQuaternion(_f),zs.transform={position:es.current.position,rotation:_f}}o.currentStructure.connectPlugs({incomingPlug:by,receiverPlug:yy}),ghostStore.getState().actions.clearAllGhosts(),itemStore.getState().actions.deselectItem(),go.map(gy=>{zs.ref.parent.attach(gy.ref),gy.transform={position:gy.ref.position,rotation:gy.ref.quaternion},zs.dragging=!1,gy.dragging=!1}),await attachmentStore$1.getState().actions.updateFittingSkuIds()},[yn,coreSceneStore,ghostStore,o,s,zn]),os=reactExports.useCallback((zs,ho,yl)=>{if(coreSceneStore.getState().sceneSettings.disableContextMenu)return;const go=attachmentStore$1.getState().attachmentSystem.currentStructure,Al=go.getNodeByGUID(yl);let _d=[];if(!Al?.myDependenciesGUID)return;Al.myDependenciesGUID.map(wy=>{const El=go.getNodeByGUID(wy);if(!El)return;let _c={guid:wy,name:zn[wy].itemData.guid,data:{...zn[wy],overrideVariant:El.overrideVariant,currentVariant:El.currentVariant,offsetX:zs,offsetY:ho}};_d.push(_c)}),_d.sort((wy,El)=>wy.name>El.name?1:El.name>wy.name?-1:0);let by=inventoryStore.getState().inventoryData[zn[yl].itemData.skuID];const yy={primary:{guid:yl,name:zn[yl].itemData.name,data:{inventory:by,...zn[yl],overrideVariant:Al.overrideVariant,currentVariant:Al.currentVariant,offsetX:zs,offsetY:ho}},dependencies:_d};rn.actions.setSelectedItemData(yy.primary.data),CORE_API.fireEvent(CORE_API.EVENTS.UI.ContextMenu_Show,yy)},[zn]),cs=reactExports.useCallback(zs=>{if(!zs)return;itemStore.setState({lastDeletedItemData:{...zn[zs]}});const ho={...zn[zs]};delete zn[zs],rn.actions.setItemsSpawned({...zn}),CORE_API.fireEvent(CORE_API.EVENTS.SCENE.Item_Removed,ho)},[rn,itemStore,zn]);reactExports.useEffect(()=>{let zs=itemStore.getState().removeItems;if(zs.length<=0&&!sn)return;let ho=zs.pop();cs(ho)},[a,sn]);const ga=reactExports.useCallback(function(zs){const ho=coreSceneStore.getState().sceneSettings,yl=zs>1?!0:zs===1?Object.values(zn)[0].itemData.skuID.toLowerCase()!=="root":!1,go=!yl;LOGGER.groupCollapsed("Resolving buttons visibility"),LOGGER.table({sceneIsEmpty:go,sceneIsNotEmpty:yl}),LOGGER.groupEnd(),ho.showViewInYourSpaceBtn===!0&&(yl&&Dr.current===!1?(CORE_API.fireEvent(CORE_API.EVENTS.UI.ViewInYourSpaceButton_Show),Dr.current=!0):go&&Dr.current===!0&&(CORE_API.fireEvent(CORE_API.EVENTS.UI.ViewInYourSpaceButton_Hide),Dr.current=!1)),ho.showShareBtn===!0&&(yl&&zr.current===!1?(CORE_API.fireEvent(CORE_API.EVENTS.UI.ShareButton_Show),zr.current=!0):go&&zr.current===!0&&(CORE_API.fireEvent(CORE_API.EVENTS.UI.ShareButton_Hide),zr.current=!1))},[zn]);reactExports.useEffect(()=>{coreSceneStore.getState().preconfigurationLoaded&&coreSceneStore.getState().configurationLoaded&&CORE_API.fireEvent(CORE_API.EVENTS.SCENE.Items_Updated,{itemsSpawned:zn});const zs=coreSceneStore.getState().sceneSettings,ho=itemStore.getState().defaultSceneItemCount;Object.keys(zn).length===ho?coreSceneStore.setState({canvasTooltipText:zs.textSettings.tooltipEmptySceneText}):Object.keys(zn).length===ho+1&&coreSceneStore.setState({canvasTooltipText:zs.textSettings.tooltipInstructionText})},[zn]),reactExports.useEffect(()=>{ar===!0&&ga(Object.keys(zn).length)},[zn,ar]),reactExports.useEffect(()=>{if(inventoryStore.getState().actions.refreshInventory(zn),!coreSceneStore.getState().preconfigurationLoaded||!coreSceneStore.getState().configurationLoaded)return;async function zs(){const ho=attachmentStore$1.getState().attachmentSystem;if(!ho)return;const yl=await ho.getCartItemsAsync();CORE_API.fireEvent(CORE_API.EVENTS.SCENE.CartItems_Updated,yl),CORE_API.fireEvent(CORE_API.EVENTS.SCENE.ReplaceableCategory_Updated,ho.currentStructure.getCurrentItemsInReplaceableCategory())}zs()},[zn,b]);const mo=reactExports.useCallback((zs,ho,yl)=>{CORE_API.removeItemByGUID(yl),CORE_API.alert({alertMsg:ho+": "+zs,alertTime:5e3,alertType:"error",alertLabel:"Error",persistant:!0})},[]);return reactExports.useEffect(()=>{const{current:zs}=cr;zs&&attachmentStore$1.setState({colliderMeshRef:zs})},[cr]),reactExports.useEffect(()=>{const{current:zs}=lr;zs&&coreSceneStore.setState({sceneRef:zs})},[lr]),reactExports.useEffect(()=>{let zs=Pn?cameraStore.getState().cameraSettings.zoomingMultiplier:cameraStore.getState().cameraSettings.zoomingMultiplier+.1;zs+=bt?.3:.1,cameraStore.setState({boundsMargin:zs}),coreSceneStore.getState().actions.triggerAutoFocus()},[bt,Pn]),reactExports.useEffect(()=>{const zs=itemStore.getState().itemsSpawned;if(LOGGER.info({title:"item Manager mounted"}),!coreSceneStore.getState().preconfigurationLoaded)attachmentStore$1.getState().actions.loadDefaultStructure();else if(Object.keys(zs).length===1){const ho=Object.keys(zs)[0];itemStore.getState().actions.resolvePlugDependencyOnGUID(ho)}},[]),jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsxs("group",{name:"Scene",ref:lr,onPointerMissed:()=>{Pn&&rn.actions.deselectItem(),hotspotStore$1.getState().isAnyHotspotActive&&hotspotStore$1.getState().actions.exitHotspot()},children:[IS_DEV_ENV,jsxRuntimeExports.jsx("group",{name:"#GRP_EXCLUDED"}),jsxRuntimeExports.jsxs("group",{name:"#ITEMSANDGHOSTS",children:[jsxRuntimeExports.jsx("group",{name:"#ITEMS",children:Object.keys(zn).map((zs,ho)=>jsxRuntimeExports.jsx(SceneItem,{scale:[1,1,1],onDragStartHandler:rs,onDragEndHandler:as,onItemClickHandler:os,itemKey:zn[zs],position:zn[zs].itemData.position,rotation:zn[zs].itemData.rotation,itemIndex:ho,proxyScene:zn[zs].itemData.proxyScene,rejectFunc:mo,proxyOnly:zn[zs].itemData.gltfURL==""},zs))}),jsxRuntimeExports.jsx(GhostManager,{})]})]}),jsxRuntimeExports.jsx("group",{name:"#Parent_ColliderMesh",children:jsxRuntimeExports.jsx("mesh",{ref:cr,visible:!1,enabled:!0,name:"#COLLIDER_MESH",children:jsxRuntimeExports.jsx("meshPhongMaterial",{depthTest:!1,transparent:!0,opacity:.8})})})]})},ContactShadows=reactExports.forwardRef(({scale:o=10,frames:s=1/0,excludeLayer:a=-1,bbmin:b=1,bbmax:_e=1,opacity:bt=1,width:rn=1,height:sn=1,blur:yn=1,near:Pn=0,far:zn=10,resolution:ar=512,smooth:lr=!0,color:cr="#000000",depthWrite:hr=!1,renderOrder:es,...Ur},Dr)=>{const zr=reactExports.useRef(null),rs=useThree(wy=>wy.scene),as=useThree(wy=>wy.gl),os=reactExports.useRef(null);rn=rn*(Array.isArray(o)?o[0]:o||1),sn=sn*(Array.isArray(o)?o[1]:o||1);const[cs,ga,mo,zs,ho,yl,go]=reactExports.useMemo(()=>{const wy=new WebGLRenderTarget(ar,ar),El=new WebGLRenderTarget(ar,ar);El.texture.generateMipmaps=wy.texture.generateMipmaps=!1;const _c=new PlaneGeometry(rn,sn).rotateX(Math.PI/2),gy=new Mesh(_c),_f=new MeshDepthMaterial;_f.depthTest=_f.depthWrite=!1,_f.onBeforeCompile=aA=>{aA.uniforms={...aA.uniforms,ucolor:{value:new Color$1(cr)}},aA.fragmentShader=aA.fragmentShader.replace("void main() {",`uniform vec3 ucolor;
9339
9339
  void main() {
9340
9340
  `),aA.fragmentShader=aA.fragmentShader.replace("vec4( vec3( 1.0 - fragCoordZ ), opacity );","vec4( ucolor * fragCoordZ * 2.0, ( 1.0 - fragCoordZ ) * 1.0 );")};const Cy=new ShaderMaterial(HorizontalBlurShader),Fy=new ShaderMaterial(VerticalBlurShader);return Fy.depthTest=Cy.depthTest=!1,[wy,_c,_f,gy,Cy,Fy,El]},[ar,rn,sn,o,cr]),Al=wy=>{zs.visible=!0,zs.material=ho,ho.uniforms.tDiffuse.value=cs.texture,ho.uniforms.h.value=wy*1/256,as.setRenderTarget(go),as.render(zs,os.current),zs.material=yl,yl.uniforms.tDiffuse.value=go.texture,yl.uniforms.v.value=wy*1/256,as.setRenderTarget(cs),as.render(zs,os.current),zs.visible=!1};let _d=0,by,yy;return useFrame(()=>{os.current&&(s===1/0||_d<s)&&(_d++,by=rs.background,yy=rs.overrideMaterial,zr.current.visible=!1,rs.background=null,rs.overrideMaterial=mo,as.setRenderTarget(cs),as.render(rs,os.current),Al(yn),lr&&Al(yn*.4),as.setRenderTarget(null),zr.current.visible=!0,rs.overrideMaterial=yy,rs.background=by)}),reactExports.useEffect(()=>()=>{os.current&&os.current.layers.disable(a)},[os]),reactExports.useEffect(()=>()=>{cs.dispose(),go.dispose(),ga.dispose(),mo.dispose(),zs.geometry.dispose(),ho.dispose(),yl.dispose()},[]),reactExports.useImperativeHandle(Dr,()=>zr.current,[]),reactExports.createElement("group",_extends$1({"rotation-x":Math.PI/2},Ur,{ref:zr}),reactExports.createElement("mesh",{renderOrder:es,geometry:ga,layers:2,scale:[1,-1,1],rotation:[-Math.PI/2,0,0]},reactExports.createElement("meshBasicMaterial",{transparent:!0,map:cs.texture,opacity:bt,depthWrite:hr})),reactExports.createElement("orthographicCamera",{ref:os,args:[-rn/2,rn/2,sn/2,-sn/2,Pn,zn]}))}),EffectsComposer=({...o})=>{const[s,a]=reactExports.useState(10),b=coreSceneStore(zn=>zn.bbox),_e=itemStore(zn=>zn.itemsSpawned),bt=ghostStore(zn=>zn.ghostsTransform),rn=coreSceneStore(zn=>zn.sceneSettings),[sn,yn]=reactExports.useState(0),Pn=()=>{yn(zn=>zn+1)};return reactExports.useEffect(()=>{bt.length===0&&Pn()},[_e,bt]),reactExports.useEffect(()=>{if(!b||!b.isBox3){a(10);return}const zn=new Vector3(0,0,0);let ar=zn.distanceTo(b.min)*2,lr=zn.distanceTo(b.max)*2,cr=lr>ar?lr:ar;cr!=1/0&&cr!=-1/0&&(cr+=5,a(cr||10))},[b]),jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsxs(EffectComposer,{multisampling:4,autoClear:!1,disableNormalPass:!0,children:[jsxRuntimeExports.jsx(ToneMapping,{mode:ToneMappingMode.ACES_FILMIC,blendFunction:BlendFunction.NORMAL,adaptive:!1,resolution:256,maxLuminance:40,middleGrey:5}),jsxRuntimeExports.jsx(Outline,{...rn.outlineSettings})]}),rn.contactShadowVisibility&&jsxRuntimeExports.jsx(ContactShadows,{excludeLayer:GHOST_LAYER,position:[0,0,0],opacity:.3,scale:s,blur:.35,far:2,resolution:256,frames:1},sn)]})};function Hotspot({hotspotKey:o}){const s=coreSceneStore(zr=>zr.sceneSettings),a=attachmentStore$1(zr=>zr.attachmentSystem),b=hotspotStore$1(zr=>zr),_e=hotspotStore$1(zr=>zr.activeHotspotData),bt=itemStore(zr=>zr.lastDeletedItemData),rn=ghostStore(zr=>zr.ghostData),sn=hotspotStore$1(zr=>zr.actions),yn=hotspotStore$1(zr=>zr.hotspotsVisibility),Pn=hotspotStore$1(zr=>zr.hotspotsTempVisibility),[zn,ar]=reactExports.useState(null),[lr,cr]=reactExports.useState(!1),hr=reactExports.useRef(null),es=reactExports.useRef(null),Ur=reactExports.useRef(null),Dr=reactExports.useCallback(zr=>{zr.includes(o.itemData.skuID+"_"+o.hotspotData.hotspotID)&&cr(!0)},[o]);return reactExports.useEffect(()=>Dr(b.visitedHotspotsID),[b,Dr]),reactExports.useEffect(()=>{ar(_e?_e.hotspotData.guid:null)},[_e]),reactExports.useEffect(()=>{es.current&&(zn===o.hotspotData.guid?es.current.parentNode.classList.add("topmostActive"):es.current.parentNode.classList.remove("topmostActive"))},[zn]),reactExports.useEffect(()=>{hr.current&&zn===o.hotspotData.guid&&(hr.current.style.opacity=1)},[zn,hr]),reactExports.useEffect(()=>{if(!(!Ur.current&&!bt)){var zr=a.currentStructure.getNodeByGUID(o.itemData.guid);zr?.ref&&(Ur.current.parent=zr.ref)}},[Ur,a,yn,bt]),jsxRuntimeExports.jsx("group",{ref:Ur,position:o.hotspotData.hotspotPointTransform,children:jsxRuntimeExports.jsx(Html,{ref:es,zIndexRange:[6,0],style:yn&&Pn&&!rn&&s.showHotspotsBtn?{opacity:"1",pointerEvents:"all",transition:"0.5s"}:{opacity:"0",pointerEvents:"none",transition:"0.5s"},children:jsxRuntimeExports.jsxs("button",{style:{display:o.hotspotData.visibleInScene==!1?"none":"block"},ref:hr,className:zn===o.hotspotData.guid?"hotspot hotspot-0 active":lr?"hotspot hotspot-0 visited":"hotspot hotspot-0",onPointerEnter:zr=>{zr.stopPropagation(),hr.current&&zn!==o.hotspotData.guid&&(hr.current.getClientRects()[0].left>coreSceneStore.getState().canvasSize.width/1.6?hr.current.classList.add("left"):hr.current.classList.remove("left")),es.current&&es.current.parentNode.classList.add("topmostHover")},onPointerLeave:zr=>{zr.stopPropagation(),es.current&&es.current.parentNode.classList.remove("topmostHover")},id:"hotspot3D_"+o.itemData.skuID+"_"+o.hotspotData.hotspotID,role:"button","aria-label":"Hotspot Button",onClick:zr=>{if(zr.stopPropagation(),b.isAnyHotspotActive&&b.activeHotspotData.hotspotData.guid===o.hotspotData.guid){sn.exitHotspot();return}sn.clickHotspot(o.hotspotData.hotspotID,o.hotspotData.guid,o.itemData.guid)},children:[jsxRuntimeExports.jsx("span",{className:"inner-circle"}),jsxRuntimeExports.jsx("span",{className:"hotspot-annotation",children:o.hotspotData.title})]})})})}const HotspotManager=()=>{const{camera:o}=useThree(),s=reactExports.useRef(null),a=reactExports.useRef(0),[b,_e]=reactExports.useState(null),bt=hotspotStore$1(Ur=>Ur),rn=hotspotStore$1(Ur=>Ur.hotspotsHealthCheck),sn=itemStore(Ur=>Ur.lastDeletedItemData),yn=hotspotStore$1(Ur=>Ur.hotspotsSpawned),Pn=itemStore(Ur=>Ur.itemsSpawned),zn=hotspotStore$1(Ur=>Ur.activeHotspotData),{raycasterHotspot:ar,worldPos:lr}=reactExports.useMemo(()=>({raycasterHotspot:new Raycaster,worldPos:new Vector3}),[]),cr=reactExports.useCallback(()=>{const Ur=hotspotStore$1.getState().hotspotSpawnedForCategoryIDs,Dr=attachmentStore$1.getState().attachmentSystem.globalGeometryVariants;Object.entries(Pn).forEach(([zr,rs])=>{if(!rs.hotspotsData)return;let as=!1;Object.entries(yn).forEach(([os,cs])=>{const ga=cs.hotspotData.geometryVariantID;if(ga&&!Object.values(Dr).includes(ga)){as=!0;const mo=cs.hotspotData.categoryID;Ur.splice(Ur.indexOf(mo),1),delete yn[os]}}),as&&hotspotStore$1.setState({hotspotSpawned:{...yn},hotspotSpawnedForCategoryIDs:Ur}),rs.hotspotsData.forEach(os=>{os.geometryVariantID&&!Object.values(Dr).includes(os.geometryVariantID)||os.categoryID!==""&&Ur.includes(os.categoryID)||(rs.hotspotSpawned=!0,Ur.push(os.categoryID),hr(zr,os))})})},[Pn,yn]),hr=reactExports.useCallback((Ur,Dr)=>{const zr=`${Pn[Ur].itemData.skuID}_${Dr.hotspotID}`;yn[zr]={itemData:{guid:Ur,...Pn[Ur].itemData},hotspotData:{guid:zr,...Dr}},hotspotStore$1.setState({hotspotsSpawned:{...yn}})},[Pn,bt,yn]);reactExports.useEffect(()=>{if(!sn?.itemData)return;if(sn.hotspotSpawned){hotspotStore$1.getState().actions.removeHotspotForItem({...sn});const Dr=hotspotStore$1.getState().hotspotSpawnedForCategoryIDs,zr=sn.hotspotsData.map(rs=>rs.categoryID);filterArrWithCondition(Dr,rs=>!zr.includes(rs)),hotspotStore$1.setState({hotspotSpawnedForCategoryIDs:Dr})}itemStore.setState({lastDeletedItemData:null});const Ur=attachmentStore$1.getState().attachmentSystem;Ur.currentStructure.removeNodeByGUID(sn.itemData.guid),CORE_API.fireEvent(CORE_API.EVENTS.SCENE.MaterialOverrides_Exists,Ur.currentStructure.materialOverrideExists())},[sn]);const es=(Ur,Dr)=>{const zr=Ur.clone().sub(o.position),rs=zr.length();ar.set(o.position,zr.normalize());const as=ar.intersectObject(coreSceneStore.getState().sceneRef);Dr.style.opacity=as.length>0&&as[0].distance<rs||b?.5:1};return reactExports.useEffect(()=>{_e(zn?.hotspotData.guid||null)},[zn]),useFrame(()=>{if(!s.current||s.current.children.length===0)return;a.current=(a.current+1)%s.current.children.length;const Ur=Object.keys(yn)[a.current];if(!yn[Ur])return;const Dr=`hotspot3D_${yn[Ur].itemData.skuID}_${yn[Ur].hotspotData.hotspotID}`,zr=CORE_API.coreWCRef.shadowRootRef.getElementById(Dr);b===Ur||!zr||(s.current.children[a.current].getWorldPosition(lr),es(lr,zr))}),reactExports.useEffect(()=>{cr()},[Object.keys(Pn).length,rn]),reactExports.useEffect(()=>()=>{hotspotStore$1.setState({hotspotsSpawned:{}}),hotspotStore$1.setState({hotspotSpawnedForCategoryIDs:[]})},[]),bt.hotspotsVisibility&&jsxRuntimeExports.jsx("group",{name:"#GRP_HotspotManager",ref:s,children:Object.entries(yn).map(([Ur,Dr])=>jsxRuntimeExports.jsx(Hotspot,{hotspotKey:Dr},Ur))})};var objectTypes$3={boolean:!1,function:!0,object:!0,number:!1,string:!1,undefined:!1},lodash__objecttypes=objectTypes$3,objectTypes$2=lodash__objecttypes;function isObject$4(o){return!!(o&&objectTypes$2[typeof o])}var lodash_isobject=isObject$4,objectProto$1=Object.prototype,toString=objectProto$1.toString,reNative$4=RegExp("^"+String(toString).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),lodash__renative=reNative$4,objectTypes$1=lodash__objecttypes,objectProto=Object.prototype,hasOwnProperty=objectProto.hasOwnProperty,shimKeys$1=function(o){var s,a=o,b=[];if(!a||!objectTypes$1[typeof o])return b;for(s in a)hasOwnProperty.call(a,s)&&b.push(s);return b},lodash__shimkeys=shimKeys$1,isObject$3=lodash_isobject,reNative$3=lodash__renative,shimKeys=lodash__shimkeys,nativeKeys=reNative$3.test(nativeKeys=Object.keys)&&nativeKeys,keys$2=nativeKeys?function(o){return isObject$3(o)?nativeKeys(o):[]}:shimKeys,lodash_keys=keys$2;function noop$1(){}var lodash_noop=noop$1,isObject$2=lodash_isobject,reNative$2=lodash__renative,nativeCreate=reNative$2.test(nativeCreate=Object.create)&&nativeCreate;function baseCreate$2(o,s){return isObject$2(o)?nativeCreate(o):{}}nativeCreate||(baseCreate$2=function(){function o(){}return function(s){if(isObject$2(s)){o.prototype=s;var a=new o;o.prototype=null}return a||commonjsGlobal.Object()}}());var lodash__basecreate=baseCreate$2,noop=lodash_noop,reNative$1=lodash__renative,descriptor={configurable:!1,enumerable:!1,value:null,writable:!1},defineProperty=function(){try{var o={},s=reNative$1.test(s=Object.defineProperty)&&s,a=s(o,o,o)&&s}catch{}return a}(),setBindData$3=defineProperty?function(o,s){descriptor.value=s,defineProperty(o,"__bindData__",descriptor)}:noop,lodash__setbinddata=setBindData$3,baseCreate$1=lodash__basecreate,isObject$1=lodash_isobject,setBindData$2=lodash__setbinddata,arrayRef$2=[],push$2=arrayRef$2.push;function baseBind$1(o){var s=o[0],a=o[2],b=o[4];function _e(){if(a){var bt=a.slice();push$2.apply(bt,arguments)}if(this instanceof _e){var rn=baseCreate$1(s.prototype),sn=s.apply(rn,bt||arguments);return isObject$1(sn)?sn:rn}return s.apply(b,bt||arguments)}return setBindData$2(_e,o),_e}var lodash__basebind=baseBind$1;function slice$2(o,s,a){s||(s=0),typeof a>"u"&&(a=o?o.length:0);for(var b=-1,_e=a-s||0,bt=Array(_e<0?0:_e);++b<_e;)bt[b]=o[s+b];return bt}var lodash__slice=slice$2,baseCreate=lodash__basecreate,isObject=lodash_isobject,setBindData$1=lodash__setbinddata,slice$1=lodash__slice,arrayRef$1=[],push$1=arrayRef$1.push;function baseCreateWrapper$1(o){var s=o[0],a=o[1],b=o[2],_e=o[3],bt=o[4],rn=o[5],sn=a&1,yn=a&2,Pn=a&4,zn=a&8,ar=s;function lr(){var cr=sn?bt:this;if(b){var hr=b.slice();push$1.apply(hr,arguments)}if((_e||Pn)&&(hr||(hr=slice$1(arguments)),_e&&push$1.apply(hr,_e),Pn&&hr.length<rn))return a|=16,baseCreateWrapper$1([s,zn?a:a&-4,hr,null,bt,rn]);if(hr||(hr=arguments),yn&&(s=cr[ar]),this instanceof lr){cr=baseCreate(s.prototype);var es=s.apply(cr,hr);return isObject(es)?es:cr}return s.apply(cr,hr)}return setBindData$1(lr,o),lr}var lodash__basecreatewrapper=baseCreateWrapper$1;function isFunction$1(o){return typeof o=="function"}var lodash_isfunction=isFunction$1,baseBind=lodash__basebind,baseCreateWrapper=lodash__basecreatewrapper,isFunction=lodash_isfunction,arrayRef=[],push=arrayRef.push;function createWrapper$1(o,s,a,b,_e,bt){var rn=s&1,sn=s&2,yn=s&4,Pn=s&16,zn=s&32;if(!sn&&!isFunction(o))throw new TypeError;Pn&&!a.length&&(s&=-17,Pn=a=!1),zn&&!b.length&&(s&=-33,zn=b=!1);var ar=o&&o.__bindData__;if(ar&&ar!==!0)return ar=ar.slice(),rn&&!(ar[1]&1)&&(ar[4]=_e),!rn&&ar[1]&1&&(s|=8),yn&&!(ar[1]&4)&&(ar[5]=bt),Pn&&push.apply(ar[2]||(ar[2]=[]),a),zn&&push.apply(ar[3]||(ar[3]=[]),b),ar[1]|=s,createWrapper$1.apply(null,ar);var lr=s==1||s===17?baseBind:baseCreateWrapper;return lr([o,s,a,b,_e,bt])}var lodash__createwrapper=createWrapper$1,createWrapper=lodash__createwrapper,slice=lodash__slice;function bind$1(o,s){return arguments.length>2?createWrapper(o,17,slice(arguments,2),null,s):createWrapper(o,1,null,null,s)}var lodash_bind=bind$1;function identity$1(o){return o}var lodash_identity=identity$1,reNative=lodash__renative,reThis$1=/\bthis\b/,support$1={};support$1.funcDecomp=!reNative.test(commonjsGlobal.WinRTError)&&reThis$1.test(function(){return this});support$1.funcNames=typeof Function.name=="string";var lodash_support=support$1,bind=lodash_bind,identity=lodash_identity,setBindData=lodash__setbinddata,support=lodash_support,reFuncName=/^\s*function[ \n\r\t]+\w/,reThis=/\bthis\b/,fnToString=Function.prototype.toString;function baseCreateCallback$2(o,s,a){if(typeof o!="function")return identity;if(typeof s>"u"||!("prototype"in o))return o;var b=o.__bindData__;if(typeof b>"u"&&(support.funcNames&&(b=!o.name),b=b||!support.funcDecomp,!b)){var _e=fnToString.call(o);support.funcNames||(b=!reFuncName.test(_e)),b||(b=reThis.test(_e),setBindData(o,b))}if(b===!1||b!==!0&&b[1]&1)return o;switch(a){case 1:return function(bt){return o.call(s,bt)};case 2:return function(bt,rn){return o.call(s,bt,rn)};case 3:return function(bt,rn,sn){return o.call(s,bt,rn,sn)};case 4:return function(bt,rn,sn,yn){return o.call(s,bt,rn,sn,yn)}}return bind(o,s)}var lodash__basecreatecallback=baseCreateCallback$2,baseCreateCallback$1=lodash__basecreatecallback,keys$1=lodash_keys,objectTypes=lodash__objecttypes,forOwn$1=function(o,s,a){var b,_e=o,bt=_e;if(!_e||!objectTypes[typeof _e])return bt;s=s&&typeof a>"u"?s:baseCreateCallback$1(s,a,3);for(var rn=-1,sn=objectTypes[typeof _e]&&keys$1(_e),yn=sn?sn.length:0;++rn<yn;)if(b=sn[rn],s(_e[b],b,o)===!1)return bt;return bt},lodash_forown=forOwn$1,baseCreateCallback=lodash__basecreatecallback,forOwn=lodash_forown;function forEach(o,s,a){var b=-1,_e=o?o.length:0;if(s=s&&typeof a>"u"?s:baseCreateCallback(s,a,3),typeof _e=="number")for(;++b<_e&&s(o[b],b,o)!==!1;);else forOwn(o,s);return o}var lodash_foreach=forEach,metric$b,imperial$9;metric$b={mm:{name:{singular:"Millimeter",plural:"Millimeters"},to_anchor:1/1e3},cm:{name:{singular:"Centimeter",plural:"Centimeters"},to_anchor:1/100},m:{name:{singular:"Meter",plural:"Meters"},to_anchor:1},km:{name:{singular:"Kilometer",plural:"Kilometers"},to_anchor:1e3}};imperial$9={in:{name:{singular:"Inch",plural:"Inches"},to_anchor:1/12},yd:{name:{singular:"Yard",plural:"Yards"},to_anchor:3},"ft-us":{name:{singular:"US Survey Foot",plural:"US Survey Feet"},to_anchor:1.000002},ft:{name:{singular:"Foot",plural:"Feet"},to_anchor:1},mi:{name:{singular:"Mile",plural:"Miles"},to_anchor:5280}};var length={metric:metric$b,imperial:imperial$9,_anchors:{metric:{unit:"m",ratio:3.28084},imperial:{unit:"ft",ratio:1/3.28084}}},metric$a,imperial$8;metric$a={mm2:{name:{singular:"Square Millimeter",plural:"Square Millimeters"},to_anchor:1/1e6},cm2:{name:{singular:"Centimeter",plural:"Centimeters"},to_anchor:1/1e4},m2:{name:{singular:"Square Meter",plural:"Square Meters"},to_anchor:1},ha:{name:{singular:"Hectare",plural:"Hectares"},to_anchor:1e4},km2:{name:{singular:"Square Kilometer",plural:"Square Kilometers"},to_anchor:1e6}};imperial$8={in2:{name:{singular:"Square Inch",plural:"Square Inches"},to_anchor:1/144},yd2:{name:{singular:"Square Yard",plural:"Square Yards"},to_anchor:9},ft2:{name:{singular:"Square Foot",plural:"Square Feet"},to_anchor:1},ac:{name:{singular:"Acre",plural:"Acres"},to_anchor:43560},mi2:{name:{singular:"Square Mile",plural:"Square Miles"},to_anchor:27878400}};var area={metric:metric$a,imperial:imperial$8,_anchors:{metric:{unit:"m2",ratio:10.7639},imperial:{unit:"ft2",ratio:1/10.7639}}},metric$9,imperial$7;metric$9={mcg:{name:{singular:"Microgram",plural:"Micrograms"},to_anchor:1/1e6},mg:{name:{singular:"Milligram",plural:"Milligrams"},to_anchor:1/1e3},g:{name:{singular:"Gram",plural:"Grams"},to_anchor:1},kg:{name:{singular:"Kilogram",plural:"Kilograms"},to_anchor:1e3},mt:{name:{singular:"Metric Tonne",plural:"Metric Tonnes"},to_anchor:1e6}};imperial$7={oz:{name:{singular:"Ounce",plural:"Ounces"},to_anchor:1/16},lb:{name:{singular:"Pound",plural:"Pounds"},to_anchor:1},t:{name:{singular:"Ton",plural:"Tons"},to_anchor:2e3}};var mass={metric:metric$9,imperial:imperial$7,_anchors:{metric:{unit:"g",ratio:1/453.592},imperial:{unit:"lb",ratio:453.592}}},metric$8,imperial$6;metric$8={mm3:{name:{singular:"Cubic Millimeter",plural:"Cubic Millimeters"},to_anchor:1/1e6},cm3:{name:{singular:"Cubic Centimeter",plural:"Cubic Centimeters"},to_anchor:1/1e3},ml:{name:{singular:"Millilitre",plural:"Millilitres"},to_anchor:1/1e3},cl:{name:{singular:"Centilitre",plural:"Centilitres"},to_anchor:1/100},dl:{name:{singular:"Decilitre",plural:"Decilitres"},to_anchor:1/10},l:{name:{singular:"Litre",plural:"Litres"},to_anchor:1},kl:{name:{singular:"Kilolitre",plural:"Kilolitres"},to_anchor:1e3},m3:{name:{singular:"Cubic meter",plural:"Cubic meters"},to_anchor:1e3},km3:{name:{singular:"Cubic kilometer",plural:"Cubic kilometers"},to_anchor:1e12},krm:{name:{singular:"Matsked",plural:"Matskedar"},to_anchor:1/1e3},tsk:{name:{singular:"Tesked",plural:"Teskedar"},to_anchor:5/1e3},msk:{name:{singular:"Matsked",plural:"Matskedar"},to_anchor:15/1e3},kkp:{name:{singular:"Kaffekopp",plural:"Kaffekoppar"},to_anchor:150/1e3},glas:{name:{singular:"Glas",plural:"Glas"},to_anchor:200/1e3},kanna:{name:{singular:"Kanna",plural:"Kannor"},to_anchor:2.617}};imperial$6={tsp:{name:{singular:"Teaspoon",plural:"Teaspoons"},to_anchor:1/6},Tbs:{name:{singular:"Tablespoon",plural:"Tablespoons"},to_anchor:1/2},in3:{name:{singular:"Cubic inch",plural:"Cubic inches"},to_anchor:.55411},"fl-oz":{name:{singular:"Fluid Ounce",plural:"Fluid Ounces"},to_anchor:1},cup:{name:{singular:"Cup",plural:"Cups"},to_anchor:8},pnt:{name:{singular:"Pint",plural:"Pints"},to_anchor:16},qt:{name:{singular:"Quart",plural:"Quarts"},to_anchor:32},gal:{name:{singular:"Gallon",plural:"Gallons"},to_anchor:128},ft3:{name:{singular:"Cubic foot",plural:"Cubic feet"},to_anchor:957.506},yd3:{name:{singular:"Cubic yard",plural:"Cubic yards"},to_anchor:25852.7}};var volume={metric:metric$8,imperial:imperial$6,_anchors:{metric:{unit:"l",ratio:33.8140226},imperial:{unit:"fl-oz",ratio:1/33.8140226}}},metric$7;metric$7={ea:{name:{singular:"Each",plural:"Each"},to_anchor:1},dz:{name:{singular:"Dozen",plural:"Dozens"},to_anchor:12}};var each$1={metric:metric$7,imperial:{},_anchors:{metric:{unit:"ea",ratio:1}}},metric$6,imperial$5;metric$6={C:{name:{singular:"degree Celsius",plural:"degrees Celsius"},to_anchor:1,anchor_shift:0},K:{name:{singular:"degree Kelvin",plural:"degrees Kelvin"},to_anchor:1,anchor_shift:273.15}};imperial$5={F:{name:{singular:"degree Fahrenheit",plural:"degrees Fahrenheit"},to_anchor:1},R:{name:{singular:"degree Rankine",plural:"degrees Rankine"},to_anchor:1,anchor_shift:459.67}};var temperature={metric:metric$6,imperial:imperial$5,_anchors:{metric:{unit:"C",transform:function(o){return o/(5/9)+32}},imperial:{unit:"F",transform:function(o){return(o-32)*(5/9)}}}},time,daysInYear=365.25;time={ns:{name:{singular:"Nanosecond",plural:"Nanoseconds"},to_anchor:1/1e9},mu:{name:{singular:"Microsecond",plural:"Microseconds"},to_anchor:1/1e6},ms:{name:{singular:"Millisecond",plural:"Milliseconds"},to_anchor:1/1e3},s:{name:{singular:"Second",plural:"Seconds"},to_anchor:1},min:{name:{singular:"Minute",plural:"Minutes"},to_anchor:60},h:{name:{singular:"Hour",plural:"Hours"},to_anchor:60*60},d:{name:{singular:"Day",plural:"Days"},to_anchor:60*60*24},week:{name:{singular:"Week",plural:"Weeks"},to_anchor:60*60*24*7},month:{name:{singular:"Month",plural:"Months"},to_anchor:60*60*24*daysInYear/12},year:{name:{singular:"Year",plural:"Years"},to_anchor:60*60*24*daysInYear}};var time_1={metric:time,_anchors:{metric:{unit:"s",ratio:1}}},bits,bytes;bits={b:{name:{singular:"Bit",plural:"Bits"},to_anchor:1},Kb:{name:{singular:"Kilobit",plural:"Kilobits"},to_anchor:1024},Mb:{name:{singular:"Megabit",plural:"Megabits"},to_anchor:1048576},Gb:{name:{singular:"Gigabit",plural:"Gigabits"},to_anchor:1073741824},Tb:{name:{singular:"Terabit",plural:"Terabits"},to_anchor:1099511627776}};bytes={B:{name:{singular:"Byte",plural:"Bytes"},to_anchor:1},KB:{name:{singular:"Kilobyte",plural:"Kilobytes"},to_anchor:1024},MB:{name:{singular:"Megabyte",plural:"Megabytes"},to_anchor:1048576},GB:{name:{singular:"Gigabyte",plural:"Gigabytes"},to_anchor:1073741824},TB:{name:{singular:"Terabyte",plural:"Terabytes"},to_anchor:1099511627776}};var digital={bits,bytes,_anchors:{bits:{unit:"b",ratio:1/8},bytes:{unit:"B",ratio:8}}},metric$5;metric$5={ppm:{name:{singular:"Part-per Million",plural:"Parts-per Million"},to_anchor:1},ppb:{name:{singular:"Part-per Billion",plural:"Parts-per Billion"},to_anchor:.001},ppt:{name:{singular:"Part-per Trillion",plural:"Parts-per Trillion"},to_anchor:1e-6},ppq:{name:{singular:"Part-per Quadrillion",plural:"Parts-per Quadrillion"},to_anchor:1e-9}};var partsPer={metric:metric$5,imperial:{},_anchors:{metric:{unit:"ppm",ratio:1e-6}}},metric$4,imperial$4;metric$4={"m/s":{name:{singular:"Metre per second",plural:"Metres per second"},to_anchor:3.6},"km/h":{name:{singular:"Kilometre per hour",plural:"Kilometres per hour"},to_anchor:1}};imperial$4={"m/h":{name:{singular:"Mile per hour",plural:"Miles per hour"},to_anchor:1},knot:{name:{singular:"Knot",plural:"Knots"},to_anchor:1.150779},"ft/s":{name:{singular:"Foot per second",plural:"Feet per second"},to_anchor:.681818}};var speed={metric:metric$4,imperial:imperial$4,_anchors:{metric:{unit:"km/h",ratio:1/1.609344},imperial:{unit:"m/h",ratio:1.609344}}},metric$3,imperial$3;metric$3={"min/km":{name:{singular:"Minute per kilometre",plural:"Minutes per kilometre"},to_anchor:.06},"s/m":{name:{singular:"Second per metre",plural:"Seconds per metre"},to_anchor:1}};imperial$3={"min/mi":{name:{singular:"Minute per mile",plural:"Minutes per mile"},to_anchor:.0113636},"s/ft":{name:{singular:"Second per foot",plural:"Seconds per foot"},to_anchor:1}};var pace={metric:metric$3,imperial:imperial$3,_anchors:{metric:{unit:"s/m",ratio:.3048},imperial:{unit:"s/ft",ratio:1/.3048}}},metric$2,imperial$2;metric$2={Pa:{name:{singular:"pascal",plural:"pascals"},to_anchor:1/1e3},kPa:{name:{singular:"kilopascal",plural:"kilopascals"},to_anchor:1},MPa:{name:{singular:"megapascal",plural:"megapascals"},to_anchor:1e3},hPa:{name:{singular:"hectopascal",plural:"hectopascals"},to_anchor:1/10},bar:{name:{singular:"bar",plural:"bar"},to_anchor:100},torr:{name:{singular:"torr",plural:"torr"},to_anchor:101325/76e4}};imperial$2={psi:{name:{singular:"pound per square inch",plural:"pounds per square inch"},to_anchor:1/1e3},ksi:{name:{singular:"kilopound per square inch",plural:"kilopound per square inch"},to_anchor:1}};var pressure={metric:metric$2,imperial:imperial$2,_anchors:{metric:{unit:"kPa",ratio:.00014503768078},imperial:{unit:"psi",ratio:1/.00014503768078}}},current;current={A:{name:{singular:"Ampere",plural:"Amperes"},to_anchor:1},mA:{name:{singular:"Milliampere",plural:"Milliamperes"},to_anchor:.001},kA:{name:{singular:"Kiloampere",plural:"Kiloamperes"},to_anchor:1e3}};var current_1={metric:current,_anchors:{metric:{unit:"A",ratio:1}}},voltage;voltage={V:{name:{singular:"Volt",plural:"Volts"},to_anchor:1},mV:{name:{singular:"Millivolt",plural:"Millivolts"},to_anchor:.001},kV:{name:{singular:"Kilovolt",plural:"Kilovolts"},to_anchor:1e3}};var voltage_1={metric:voltage,_anchors:{metric:{unit:"V",ratio:1}}},power;power={W:{name:{singular:"Watt",plural:"Watts"},to_anchor:1},mW:{name:{singular:"Milliwatt",plural:"Milliwatts"},to_anchor:.001},kW:{name:{singular:"Kilowatt",plural:"Kilowatts"},to_anchor:1e3},MW:{name:{singular:"Megawatt",plural:"Megawatts"},to_anchor:1e6},GW:{name:{singular:"Gigawatt",plural:"Gigawatts"},to_anchor:1e9}};var power_1={metric:power,_anchors:{metric:{unit:"W",ratio:1}}},reactivePower;reactivePower={VAR:{name:{singular:"Volt-Ampere Reactive",plural:"Volt-Amperes Reactive"},to_anchor:1},mVAR:{name:{singular:"Millivolt-Ampere Reactive",plural:"Millivolt-Amperes Reactive"},to_anchor:.001},kVAR:{name:{singular:"Kilovolt-Ampere Reactive",plural:"Kilovolt-Amperes Reactive"},to_anchor:1e3},MVAR:{name:{singular:"Megavolt-Ampere Reactive",plural:"Megavolt-Amperes Reactive"},to_anchor:1e6},GVAR:{name:{singular:"Gigavolt-Ampere Reactive",plural:"Gigavolt-Amperes Reactive"},to_anchor:1e9}};var reactivePower_1={metric:reactivePower,_anchors:{metric:{unit:"VAR",ratio:1}}},apparentPower;apparentPower={VA:{name:{singular:"Volt-Ampere",plural:"Volt-Amperes"},to_anchor:1},mVA:{name:{singular:"Millivolt-Ampere",plural:"Millivolt-Amperes"},to_anchor:.001},kVA:{name:{singular:"Kilovolt-Ampere",plural:"Kilovolt-Amperes"},to_anchor:1e3},MVA:{name:{singular:"Megavolt-Ampere",plural:"Megavolt-Amperes"},to_anchor:1e6},GVA:{name:{singular:"Gigavolt-Ampere",plural:"Gigavolt-Amperes"},to_anchor:1e9}};var apparentPower_1={metric:apparentPower,_anchors:{metric:{unit:"VA",ratio:1}}},energy;energy={Wh:{name:{singular:"Watt-hour",plural:"Watt-hours"},to_anchor:3600},mWh:{name:{singular:"Milliwatt-hour",plural:"Milliwatt-hours"},to_anchor:3.6},kWh:{name:{singular:"Kilowatt-hour",plural:"Kilowatt-hours"},to_anchor:36e5},MWh:{name:{singular:"Megawatt-hour",plural:"Megawatt-hours"},to_anchor:36e8},GWh:{name:{singular:"Gigawatt-hour",plural:"Gigawatt-hours"},to_anchor:36e11},J:{name:{singular:"Joule",plural:"Joules"},to_anchor:1},kJ:{name:{singular:"Kilojoule",plural:"Kilojoules"},to_anchor:1e3}};var energy_1={metric:energy,_anchors:{metric:{unit:"J",ratio:1}}},reactiveEnergy;reactiveEnergy={VARh:{name:{singular:"Volt-Ampere Reactive Hour",plural:"Volt-Amperes Reactive Hour"},to_anchor:1},mVARh:{name:{singular:"Millivolt-Ampere Reactive Hour",plural:"Millivolt-Amperes Reactive Hour"},to_anchor:.001},kVARh:{name:{singular:"Kilovolt-Ampere Reactive Hour",plural:"Kilovolt-Amperes Reactive Hour"},to_anchor:1e3},MVARh:{name:{singular:"Megavolt-Ampere Reactive Hour",plural:"Megavolt-Amperes Reactive Hour"},to_anchor:1e6},GVARh:{name:{singular:"Gigavolt-Ampere Reactive Hour",plural:"Gigavolt-Amperes Reactive Hour"},to_anchor:1e9}};var reactiveEnergy_1={metric:reactiveEnergy,_anchors:{metric:{unit:"VARh",ratio:1}}},metric$1,imperial$1;metric$1={"mm3/s":{name:{singular:"Cubic Millimeter per second",plural:"Cubic Millimeters per second"},to_anchor:1/1e6},"cm3/s":{name:{singular:"Cubic Centimeter per second",plural:"Cubic Centimeters per second"},to_anchor:1/1e3},"ml/s":{name:{singular:"Millilitre per second",plural:"Millilitres per second"},to_anchor:1/1e3},"cl/s":{name:{singular:"Centilitre per second",plural:"Centilitres per second"},to_anchor:1/100},"dl/s":{name:{singular:"Decilitre per second",plural:"Decilitres per second"},to_anchor:1/10},"l/s":{name:{singular:"Litre per second",plural:"Litres per second"},to_anchor:1},"l/min":{name:{singular:"Litre per minute",plural:"Litres per minute"},to_anchor:1/60},"l/h":{name:{singular:"Litre per hour",plural:"Litres per hour"},to_anchor:1/3600},"kl/s":{name:{singular:"Kilolitre per second",plural:"Kilolitres per second"},to_anchor:1e3},"kl/min":{name:{singular:"Kilolitre per minute",plural:"Kilolitres per minute"},to_anchor:50/3},"kl/h":{name:{singular:"Kilolitre per hour",plural:"Kilolitres per hour"},to_anchor:5/18},"m3/s":{name:{singular:"Cubic meter per second",plural:"Cubic meters per second"},to_anchor:1e3},"m3/min":{name:{singular:"Cubic meter per minute",plural:"Cubic meters per minute"},to_anchor:50/3},"m3/h":{name:{singular:"Cubic meter per hour",plural:"Cubic meters per hour"},to_anchor:5/18},"km3/s":{name:{singular:"Cubic kilometer per second",plural:"Cubic kilometers per second"},to_anchor:1e12}};imperial$1={"tsp/s":{name:{singular:"Teaspoon per second",plural:"Teaspoons per second"},to_anchor:1/6},"Tbs/s":{name:{singular:"Tablespoon per second",plural:"Tablespoons per second"},to_anchor:1/2},"in3/s":{name:{singular:"Cubic inch per second",plural:"Cubic inches per second"},to_anchor:.55411},"in3/min":{name:{singular:"Cubic inch per minute",plural:"Cubic inches per minute"},to_anchor:.55411/60},"in3/h":{name:{singular:"Cubic inch per hour",plural:"Cubic inches per hour"},to_anchor:.55411/3600},"fl-oz/s":{name:{singular:"Fluid Ounce per second",plural:"Fluid Ounces per second"},to_anchor:1},"fl-oz/min":{name:{singular:"Fluid Ounce per minute",plural:"Fluid Ounces per minute"},to_anchor:1/60},"fl-oz/h":{name:{singular:"Fluid Ounce per hour",plural:"Fluid Ounces per hour"},to_anchor:1/3600},"cup/s":{name:{singular:"Cup per second",plural:"Cups per second"},to_anchor:8},"pnt/s":{name:{singular:"Pint per second",plural:"Pints per second"},to_anchor:16},"pnt/min":{name:{singular:"Pint per minute",plural:"Pints per minute"},to_anchor:4/15},"pnt/h":{name:{singular:"Pint per hour",plural:"Pints per hour"},to_anchor:1/225},"qt/s":{name:{singular:"Quart per second",plural:"Quarts per second"},to_anchor:32},"gal/s":{name:{singular:"Gallon per second",plural:"Gallons per second"},to_anchor:128},"gal/min":{name:{singular:"Gallon per minute",plural:"Gallons per minute"},to_anchor:32/15},"gal/h":{name:{singular:"Gallon per hour",plural:"Gallons per hour"},to_anchor:8/225},"ft3/s":{name:{singular:"Cubic foot per second",plural:"Cubic feet per second"},to_anchor:957.506},"ft3/min":{name:{singular:"Cubic foot per minute",plural:"Cubic feet per minute"},to_anchor:957.506/60},"ft3/h":{name:{singular:"Cubic foot per hour",plural:"Cubic feet per hour"},to_anchor:957.506/3600},"yd3/s":{name:{singular:"Cubic yard per second",plural:"Cubic yards per second"},to_anchor:25852.7},"yd3/min":{name:{singular:"Cubic yard per minute",plural:"Cubic yards per minute"},to_anchor:25852.7/60},"yd3/h":{name:{singular:"Cubic yard per hour",plural:"Cubic yards per hour"},to_anchor:25852.7/3600}};var volumeFlowRate={metric:metric$1,imperial:imperial$1,_anchors:{metric:{unit:"l/s",ratio:33.8140227},imperial:{unit:"fl-oz/s",ratio:1/33.8140227}}},metric,imperial;metric={lx:{name:{singular:"Lux",plural:"Lux"},to_anchor:1}};imperial={"ft-cd":{name:{singular:"Foot-candle",plural:"Foot-candles"},to_anchor:1}};var illuminance={metric,imperial,_anchors:{metric:{unit:"lx",ratio:1/10.76391},imperial:{unit:"ft-cd",ratio:10.76391}}},frequency;frequency={mHz:{name:{singular:"millihertz",plural:"millihertz"},to_anchor:1/1e3},Hz:{name:{singular:"hertz",plural:"hertz"},to_anchor:1},kHz:{name:{singular:"kilohertz",plural:"kilohertz"},to_anchor:1e3},MHz:{name:{singular:"megahertz",plural:"megahertz"},to_anchor:1e3*1e3},GHz:{name:{singular:"gigahertz",plural:"gigahertz"},to_anchor:1e3*1e3*1e3},THz:{name:{singular:"terahertz",plural:"terahertz"},to_anchor:1e3*1e3*1e3*1e3},rpm:{name:{singular:"rotation per minute",plural:"rotations per minute"},to_anchor:1/60},"deg/s":{name:{singular:"degree per second",plural:"degrees per second"},to_anchor:1/360},"rad/s":{name:{singular:"radian per second",plural:"radians per second"},to_anchor:1/(Math.PI*2)}};var frequency_1={metric:frequency,_anchors:{frequency:{unit:"hz",ratio:1}}},angle;angle={rad:{name:{singular:"radian",plural:"radians"},to_anchor:180/Math.PI},deg:{name:{singular:"degree",plural:"degrees"},to_anchor:1},grad:{name:{singular:"gradian",plural:"gradians"},to_anchor:9/10},arcmin:{name:{singular:"arcminute",plural:"arcminutes"},to_anchor:1/60},arcsec:{name:{singular:"arcsecond",plural:"arcseconds"},to_anchor:1/3600}};var angle_1={metric:angle,_anchors:{metric:{unit:"deg",ratio:1}}},convert,keys=lodash_keys,each=lodash_foreach,measures={length,area,mass,volume,each:each$1,temperature,time:time_1,digital,partsPer,speed,pace,pressure,current:current_1,voltage:voltage_1,power:power_1,reactivePower:reactivePower_1,apparentPower:apparentPower_1,energy:energy_1,reactiveEnergy:reactiveEnergy_1,volumeFlowRate,illuminance,frequency:frequency_1,angle:angle_1},Converter;Converter=function(o,s){s?this.val=o/s:this.val=o};Converter.prototype.from=function(o){if(this.destination)throw new Error(".from must be called before .to");return this.origin=this.getUnit(o),this.origin||this.throwUnsupportedUnitError(o),this};Converter.prototype.to=function(o){if(!this.origin)throw new Error(".to must be called after .from");this.destination=this.getUnit(o);var s,a;if(this.destination||this.throwUnsupportedUnitError(o),this.origin.abbr===this.destination.abbr)return this.val;if(this.destination.measure!=this.origin.measure)throw new Error("Cannot convert incompatible measures of "+this.destination.measure+" and "+this.origin.measure);return s=this.val*this.origin.unit.to_anchor,this.origin.unit.anchor_shift&&(s-=this.origin.unit.anchor_shift),this.origin.system!=this.destination.system&&(a=measures[this.origin.measure]._anchors[this.origin.system].transform,typeof a=="function"?s=a(s):s*=measures[this.origin.measure]._anchors[this.origin.system].ratio),this.destination.unit.anchor_shift&&(s+=this.destination.unit.anchor_shift),s/this.destination.unit.to_anchor};Converter.prototype.toBest=function(s){if(!this.origin)throw new Error(".toBest must be called after .from");var s=Object.assign({exclude:[],cutOffNumber:1},s),a;return each(this.possibilities(),function(b){var _e=this.describe(b),bt=s.exclude.indexOf(b)===-1;if(bt&&_e.system===this.origin.system){var rn=this.to(b);(!a||rn>=s.cutOffNumber&&rn<a.val)&&(a={val:rn,unit:b,singular:_e.singular,plural:_e.plural})}}.bind(this)),a};Converter.prototype.getUnit=function(o){var s;return each(measures,function(a,b){if(each(a,function(_e,bt){if(bt=="_anchors"||(each(_e,function(rn,sn){if(sn==o)return s={abbr:o,measure:b,system:bt,unit:rn},!1}),s))return!1}),s)return!1}),s};var describe=function(o){return{abbr:o.abbr,measure:o.measure,system:o.system,singular:o.unit.name.singular,plural:o.unit.name.plural}};Converter.prototype.describe=function(o){var s=Converter.prototype.getUnit(o),a=null;try{a=describe(s)}catch{this.throwUnsupportedUnitError(o)}return a};Converter.prototype.list=function(o){var s=[];return each(measures,function(a,b){o&&o!==b||each(a,function(_e,bt){if(bt=="_anchors")return!1;each(_e,function(rn,sn){s=s.concat(describe({abbr:sn,measure:b,system:bt,unit:rn}))})})}),s};Converter.prototype.throwUnsupportedUnitError=function(o){var s=[];throw each(measures,function(a,b){each(a,function(_e,bt){if(bt=="_anchors")return!1;s=s.concat(keys(_e))})}),new Error("Unsupported unit "+o+", use one of: "+s.join(", "))};Converter.prototype.possibilities=function(o){var s=[];return!this.origin&&!o?each(keys(measures),function(a){each(measures[a],function(b,_e){if(_e=="_anchors")return!1;s=s.concat(keys(b))})}):(o=o||this.origin.measure,each(measures[o],function(a,b){if(b=="_anchors")return!1;s=s.concat(keys(a))})),s};Converter.prototype.measures=function(){return keys(measures)};convert=function(o){return new Converter(o)};var lib=convert;const convert$1=getDefaultExportFromCjs(lib),DimensionsManager=()=>{const o=itemStore(cr=>cr.itemsSpawned),{showDimensions:s,sceneSettings:a,boundData:b}=coreSceneStore(),{sceneScaleUnit:_e,sceneScaleDisplayUnit:bt}=a||{},rn=reactExports.useRef(null),sn=reactExports.useRef(0),yn=reactExports.useMemo(()=>{if(!a)return"#000000";const{r:cr,g:hr,b:es}=a.dimensionColor;return rgbToHex(cr,hr,es)},[a]),[Pn,zn]=reactExports.useMemo(()=>{if(!b||!b.size)return[.2,.01];const cr=Math.min(b.size.x,b.size.z),hr=Math.min(cr/20,.005);return[Math.min(cr,.2),hr]},[b]);reactExports.useEffect(()=>{sn.current=0},[s]),useFrame(()=>{rn.current&&sn.current<1&&(sn.current+=.05,rn.current.scale.set(sn.current,sn.current,sn.current))});const ar=cr=>jsxRuntimeExports.jsxs(Html,{center:!0,className:"dimensionsText ignore",style:{opacity:"1"},zIndexRange:[29,0],children:[convert$1(cr).from("m").to(_e).toFixed(a.measurementPrecision),bt??_e]}),lr=(cr,hr,es,Ur)=>jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:jsxRuntimeExports.jsxs(RoundedBox,{position:cr,rotation:hr,scale:es,visible:!0,children:[jsxRuntimeExports.jsx(RoundedBox,{position:[0,.5,0],scale:Ur==="z"?[7,zn,1]:[1,zn,7],visible:!0,children:jsxRuntimeExports.jsx("meshBasicMaterial",{color:yn})}),jsxRuntimeExports.jsx(RoundedBox,{position:[0,-.5,0],scale:Ur==="z"?[7,zn,1]:[1,zn,7],visible:!0,children:jsxRuntimeExports.jsx("meshBasicMaterial",{color:yn})}),jsxRuntimeExports.jsx("meshBasicMaterial",{color:yn}),ar(b.size[Ur])]})});return!s||!b||Object.keys(b.size).some(cr=>b.size[cr]===0)||Object.keys(o).length===0?null:jsxRuntimeExports.jsxs("group",{ref:rn,children:[lr([b.center.x,b.center.y-b.size.y/2,b.center.z+b.size.z/2+Pn],[0,0,degToRad(90)],[zn,b.size.x,zn],"x"),lr([b.center.x-b.size.x/2-Pn,b.center.y,b.center.z+b.size.z/2+Pn],[0,0,0],[zn,b.size.y,zn],"y"),lr([b.center.x+b.size.x/2+Pn,b.center.y-b.size.y/2,b.center.z],[degToRad(90),0,0],[zn,b.size.z,zn],"z")]})},BaseScene=({...o})=>jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsx(HotspotManager,{}),jsxRuntimeExports.jsx(DimensionsManager,{}),jsxRuntimeExports.jsxs(Selection,{children:[jsxRuntimeExports.jsx(ItemManager,{}),jsxRuntimeExports.jsx(EffectsComposer,{})]})]}),CameraManager=()=>{const o=reactExports.useRef(null),s=hotspotStore$1(cr=>cr.isAnyHotspotActive),a=cameraStore(cr=>cr.cameraSettings),b=cameraStore(cr=>cr.disableAutoRotate),_e=coreSceneStore(cr=>cr.autoFocusTrigger),bt=coreSceneStore(cr=>cr.dragging),rn=cameraStore(cr=>cr.sendCameraDetailsTrigger),sn=cameraStore(cr=>cr.focusPointPosition),yn=cameraStore(cr=>cr.viewPointPosition),{raycaster:Pn,camera:zn}=useThree(),ar=ghostStore(cr=>cr.ghostsTransform),lr=()=>{if(o.current===null)return;const hr=1/o.current._lastZoom,es=cameraStore.getState().boundsMargin,Ur=coreSceneStore.getState().autoFocusRef;let Dr=new Box3;Ur?Dr.setFromObject(Ur):coreSceneStore.getState().sceneRef.traverse(rs=>{rs.autoFocusEnabled&&Dr.expandByObject(rs)}),Ur||coreSceneStore.setState({bbox:Dr});const zr=new Vector3;if(Dr.getSize(zr),zr.x>0){const rs=new Vector3;Dr.getCenter(rs);const as=new Vector3(Dr.max.x,Dr.max.y,Dr.max.z);as.sub(Dr.min),coreSceneStore.setState({boundData:{center:rs,size:as}}),o.current.setBoundary(Dr);const os=new Box3(Dr.min,Dr.max);os.min=new Vector3((os.min.x-es/2)*hr,(os.min.y-es/2)*hr,(os.min.z-es/2)*hr),os.max=new Vector3((os.max.x+es/2)*hr,(os.max.y+es/2)*hr,(os.max.z+es/2)*hr);const cs=os.getBoundingSphere(new Sphere(rs));cs.radius>0&&o.current.fitToSphere(cs,!0)}else{const rs=new Vector3(0,0,0),as=new Vector3(0,0,0);coreSceneStore.setState({boundData:{center:rs,size:as}})}o.current.zoomTo(1,!0)};return reactExports.useEffect(()=>{lr()},[_e]),reactExports.useEffect(()=>{CORE_API!=null&&(itemStore.getState().isBusy()||(coreSceneStore.getState().sceneSettings.focusCameraOnGhosts===!0?CORE_API.focusOnGhosts():CORE_API.refocus()))},[ar]),reactExports.useEffect(()=>{if(o.current===null)return;const cr=cameraStore.getState().savedState,hr=cameraStore.getState().resetToLastPosition;if(s===!1){cr===!0&&(hr===!0?o.current.reset(!0):cameraStore.setState({resetToLastPosition:!0}),cameraStore.setState({savedState:!1}));return}cr===!1&&hr===!0&&(o.current.saveState(),cameraStore.setState({savedState:!0})),o.current.setLookAt(yn.x,yn.y,yn.z,sn.x,sn.y,sn.z,!0)},[s,yn,sn]),reactExports.useEffect(()=>{CORE_API?.fireEvent(CORE_API.EVENTS.CONFIGURATION.CameraDetails_Update,zn)},[rn]),useFrame(cr=>{a.canAutoRotate===!1||o.current===null||b===!1&&s===!1&&(o.current.azimuthAngle+=20*cr*MathUtils.DEG2RAD*a.autoRotateSpeed)}),reactExports.useEffect(()=>{o.current!==null&&(a.canZoom===!0&&bt===!1?(o.current.mouseButtons.wheel=CAMERA_ACTION.ZOOM,o.current.mouseButtons.middle=CAMERA_ACTION.ZOOM):(o.current.mouseButtons.wheel=CAMERA_ACTION.NONE,o.current.mouseButtons.middle=CAMERA_ACTION.NONE),a.canPan===!0&&bt===!1?(o.current.mouseButtons.right=CAMERA_ACTION.OFFSET,a.canZoom===!0&&bt===!1?(o.current.touches.two=CAMERA_ACTION.TOUCH_ZOOM_OFFSET,o.current.touches.three=CAMERA_ACTION.TOUCH_ZOOM_OFFSET):(o.current.touches.two=CAMERA_ACTION.TOUCH_OFFSET,o.current.touches.three=CAMERA_ACTION.TOUCH_OFFSET)):(o.current.mouseButtons.right=CAMERA_ACTION.NONE,a.canZoom===!0&&bt===!1?(o.current.touches.two=CAMERA_ACTION.TOUCH_ZOOM,o.current.touches.three=CAMERA_ACTION.TOUCH_ZOOM):(o.current.touches.two=CAMERA_ACTION.NONE,o.current.touches.three=CAMERA_ACTION.NONE)))},[o,a,bt]),reactExports.useEffect(()=>{if(o.current===null)return;zn.fov=a.fov,zn.updateProjectionMatrix();const cr=()=>{o.current!==null&&(o.current.removeEventListener("rest",cr),cameraStore.setState({userDragging:!1,disableAutoRotate:!1}))};o.current.addEventListener("controlstart",()=>{hotspotStore$1.getState().isAnyHotspotActive&&hotspotStore$1.getState().actions.exitHotspot(),o.current!==null&&(o.current.removeEventListener("rest",cr),cameraStore.setState({userDragging:!0,disableAutoRotate:!0}))}),o.current.addEventListener("controlend",()=>{o.current!==null&&(o.current.active?o.current.addEventListener("rest",cr):cr())}),o.current.addEventListener("transitionstart",()=>{o.current!==null&&cameraStore.getState().userDragging!==!0&&(cameraStore.setState({disableAutoRotate:!0}),o.current.addEventListener("rest",cr))})},[o]),reactExports.useEffect(()=>{o.current&&(Pn.layers.enable(GHOST_LAYER),zn.layers.enable(GHOST_LAYER),cameraStore.setState({cameraControlsRef:o.current}))},[o]),jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:jsxRuntimeExports.jsx(CameraControls,{ref:o,makeDefault:!0,dollySpeed:a.dollySpeed,truckSpeed:a.truckSpeed,minZoom:a.minZoom,maxZoom:a.maxZoom,minPolarAngle:s?-Math.PI:degToRad(a.minPolarAngle),maxPolarAngle:s?Math.PI:degToRad(a.maxPolarAngle)})})},Root=()=>{const{gl:o}=useThree();return reactExports.useEffect(()=>{coreSceneStore.setState({glContext:o})},[]),jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsx(BaseScene,{}),jsxRuntimeExports.jsx(CameraManager,{}),jsxRuntimeExports.jsx(LightManager,{})]})},Alert=({handleCloseAlert:o,alertData:s})=>{const a=reactExports.useRef(null),b=reactExports.useRef(null),_e=reactExports.useRef(null),bt=uiSceneStore(sn=>sn.dialogPopupOpen),rn=()=>{clearTimeout(a.current),_e.current.style="",b.current.style="",o()};return reactExports.useEffect(()=>{if(_e.current===null||b.current===null)return;const sn=s.alertTime?s.alertTime:1e3;_e.current.style="animation: loader "+sn+"ms; animation-timing-function: linear;",b.current.style="animation: loader "+sn+"ms; animation-timing-function: linear;",a.current=setTimeout(rn,sn)},[_e,b,s]),jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment,{children:[jsxRuntimeExports.jsxs("div",{className:"alert-bg ".concat(ALERT_TYPES[s.alertType].cssClass),children:[jsxRuntimeExports.jsx("div",{className:"alert-icon-bg ".concat(ALERT_TYPES[s.alertType].cssClass),children:jsxRuntimeExports.jsx("img",{src:ALERT_TYPES[s.alertType].src,className:"alert-icon",alt:s.alertType})}),jsxRuntimeExports.jsxs("div",{className:"alert-msg-cross-timer-bg",children:[jsxRuntimeExports.jsxs("div",{className:"alert-msg-cross-bg",children:[jsxRuntimeExports.jsxs("div",{className:"alert-msg-bg",style:s.alertLabel?{}:{display:"flex",alignItems:"center"},children:[s.alertLabel&&jsxRuntimeExports.jsx("p",{className:"alert-label",children:s.alertLabel}),jsxRuntimeExports.jsx("span",{className:"alert-msg",children:s.alertMsg})]}),jsxRuntimeExports.jsx("div",{className:"alert-close-btn-bg",children:jsxRuntimeExports.jsx("img",{tabIndex:bt?-1:0,onClick:rn,className:"alert-cross-btn",alt:"Close Button",role:"button","aria-label":"Close Button",src:PUBLIC_DESIGN_ASSETS_ENDPOINT+"/Icon/X.svg"})})]}),jsxRuntimeExports.jsx("div",{ref:b,className:"alert-timer ".concat(ALERT_TYPES[s.alertType].cssClass)})]})]}),jsxRuntimeExports.jsxs("div",{className:"alert-bg alert-mobile ".concat(ALERT_TYPES[s.alertType].cssClass),children:[jsxRuntimeExports.jsxs("div",{className:"alert-icon-msg-cross-bg",children:[jsxRuntimeExports.jsx("div",{className:"alert-icon-bg ".concat(ALERT_TYPES[s.alertType].cssClass),children:jsxRuntimeExports.jsx("img",{src:ALERT_TYPES[s.alertType].src,className:"alert-icon",alt:s.alertType})}),jsxRuntimeExports.jsxs("div",{className:"alert-msg-bg",children:[s.alertLabel&&jsxRuntimeExports.jsx("p",{className:"alert-label",children:s.alertLabel}),jsxRuntimeExports.jsx("span",{className:"alert-msg",children:s.alertMsg_Mobile?s.alertMsg_Mobile:s.alertMsg})]}),jsxRuntimeExports.jsx("div",{className:"alert-close-btn-bg",children:jsxRuntimeExports.jsx("img",{tabIndex:bt?-1:0,onClick:rn,className:"alert-cross-btn",alt:"Close Button",role:"button","aria-label":"Close Button",src:PUBLIC_DESIGN_ASSETS_ENDPOINT+"/Icon/X.svg"})})]}),jsxRuntimeExports.jsx("div",{ref:_e,className:"alert-timer ".concat(ALERT_TYPES[s.alertType].cssClass)})]})]})},AlertManager=()=>{const o=coreSceneStore(sn=>sn.alertData),s=coreSceneStore(sn=>sn.persistantAlertData),a=coreSceneStore(sn=>sn.currentAlertData),b=sn=>{coreSceneStore.setState({currentAlertData:sn})};reactExports.useEffect(()=>{!o||!o.alertMsg||_e(o)},[o]),reactExports.useEffect(()=>{const sn=coreSceneStore.getState().alertQueue;sn.length<=0||(a===null&&(b(sn[0]),sn[0].persistant===!0&&coreSceneStore.setState({persistantAlertData:sn[0]})),coreSceneStore.getState().actions.popFromAlertQueue())},[a]);const _e=reactExports.useCallback(sn=>{if(coreSceneStore.getState().sceneSettings.disableAlerts===!0)return;let yn=sn.alertType,Pn=sn.alertId;const zn=coreSceneStore.getState().sceneSettings.alertControl;let ar=!1;Object.keys(zn).map(hr=>{hr==Pn&&(ar=!0)}),ar==!1&&(Pn="default");let lr=!1;if(Object.keys(ALERT_TYPES).map(hr=>{hr==yn.toLowerCase()&&(lr=!0)}),lr==!1&&(yn=ALERT_TYPES.info.id,sn.alertType=yn),ALERT_TYPES[sn.alertType].level<coreSceneStore.getState().sceneSettings.alertLevel||coreSceneStore.getState().sceneSettings.alertControl[Pn]!==!0)return;const cr=coreSceneStore.getState().actions.addToAlertQueue(sn);a===null&&cr.length===1&&(b(sn),sn.persistant===!0&&coreSceneStore.setState({persistantAlertData:sn}))},[a]),bt=reactExports.useCallback(()=>{b(s)},[s]),rn=reactExports.useCallback(async()=>{b(null)},[]);return reactExports.useEffect(()=>{async function sn(){await wait(1500);let yn=null,Pn={alertMsg:"Add items by selecting from the panel",alertMsg_Mobile:"Add items by selecting from the panel",alertTime:8e3,alertType:"info",alertLabel:"Get Started"};coreSceneStore.getState().alertSettings&&(coreSceneStore.getState().alertSettings.welcomeMessage&&(yn=coreSceneStore.getState().alertSettings.welcomeMessage),coreSceneStore.getState().alertSettings.instructionMessage&&(Pn=coreSceneStore.getState().alertSettings.instructionMessage)),yn!==null&&_e(yn),_e(Pn)}sn()},[]),jsxRuntimeExports.jsxs("div",{className:"alert-space",children:[a===null&&s&&jsxRuntimeExports.jsx("div",{role:"button","aria-label":"Alert Button",onClick:bt,className:"alert-persistant-btn-bg",style:{background:ALERT_TYPES[s.alertType].background,border:"1px solid "+ALERT_TYPES[s.alertType].color},children:jsxRuntimeExports.jsx("img",{style:{filter:ALERT_TYPES[s.alertType].filter},className:"alert-persistant-btn",alt:s.alertType,src:ALERT_TYPES[s.alertType].src})}),a&&jsxRuntimeExports.jsx(Alert,{handleCloseAlert:rn,alertData:a})]})},FocusManager=()=>{const o=itemStore(a=>a.itemsSpawned),s=uiSceneStore(a=>a.dialogPopupOpen);return jsxRuntimeExports.jsx("div",{id:"focusBtns",children:Object.keys(o).map((a,b)=>jsxRuntimeExports.jsx("div",{children:o[a].itemData.isInteractive&&o[a].itemData.gltfURL&&jsxRuntimeExports.jsx("div",{onFocus:()=>{itemStore.setState({focusedGUID:a})},onBlur:()=>{itemStore.setState({focusedGUID:null})},onClick:()=>{const _e=coreSceneStore.getState().canvasSize,bt=itemStore.getState().itemsSpawned,rn=attachmentStore$1.getState().attachmentSystem.currentStructure.getNodeByGUID(a),sn={primary:{guid:a,name:o[a].itemData.name,data:{...bt[a],overrideVariant:rn.overrideVariant,currentVariant:rn.currentVariant,offsetX:_e.width/2,offsetY:_e.height/2}}};itemStore.getState().actions.setSelectedItemData(sn.primary.data),CORE_API.fireEvent(CORE_API.EVENTS.UI.ContextMenu_Show,sn)},role:"button",id:"focusBtn-"+a,tabIndex:s?-1:0,className:"canvasFocusButton","aria-label":o[a].itemData.name?o[a].itemData.name:o[a].itemData.skuID},"focusBtn-key-"+a)},"focusBtn-single-key-"+a))},"focusBtns")},OverlayUIManager=()=>{const o=coreSceneStore(_e=>_e.canvasTooltipText),s=coreSceneStore(_e=>_e.sceneSettings),a=ghostStore(_e=>_e.ghostData),b=itemStore(_e=>_e.defaultSceneItemCount);return jsxRuntimeExports.jsx(jsxRuntimeExports.Fragment,{children:jsxRuntimeExports.jsxs("div",{children:[jsxRuntimeExports.jsx(AlertManager,{}),jsxRuntimeExports.jsx(FocusManager,{}),CORE_API.getSceneItemCount()<=b&&!a&&jsxRuntimeExports.jsx("div",{style:{fontSize:s.emptySceneTextFontSize},className:"emptySceneBG",children:s.emptySceneText}),jsxRuntimeExports.jsx("div",{className:"canvasTooltip",children:o})]})})};function getPlugAttributesFromObject(o){let s={};if(o.type.toLowerCase()==="object3d"){const a=o.userData;if(a?.isPlug===1){const b=a.name;b&&typeof b=="string"&&(s.name=b);const _e=a.type;_e&&typeof _e=="string"?s.type=_e:s.type="";const bt=a.weight;bt&&typeof bt=="number"?s.weight=bt:s.weight=1;const rn=a.affectedNodes;rn&&typeof rn=="string"?s.affectedNodes=rn.replaceAll(" ","").split(","):s.affectedNodes=[];const sn=a.acceptedPlugTypes;sn&&typeof sn=="string"?s.acceptedPlugTypes=sn.replaceAll(" ","").split(","):s.acceptedPlugTypes=[];const yn=a.connectsToPlugTypes;yn&&typeof yn=="string"?s.connectsToPlugTypes=yn.replaceAll(" ","").split(","):s.connectsToPlugTypes=[];const Pn=a.dependencySku;Pn&&typeof Pn=="string"?s.dependencySku=Pn:s.dependencySku="";const zn=a.isDependencySkuInteractive;Pn!==void 0&&typeof zn=="number"?s.isDependencySkuInteractive=zn:s.isDependencySkuInteractive=1}}return s}async function loadAllDynamicHooks(o){if(!o){LOGGER.info({title:"No hook URL provided"});return}try{const s=resolveAssetUrl(o),a=await __vitePreload(()=>import(s),[]);for(const[b,_e]of Object.entries(a))typeof _e=="function"&&(DynamicHooks[b]!==void 0?(DynamicHooks[b]=_e,LOGGER.info({title:`${b} successfully updated from `+s})):LOGGER.warn({title:`No matching hook found for ${b}`}))}catch(s){LOGGER.error({title:`Error loading dynamic hooks from: ${o}`,details:s})}}async function loadAllProxies(o){assetStore.getState().actions.init();const s=assetStore.getState().actions,a=coreSceneStore.getState().sceneSettings;for(const[b,_e]of Object.entries(o)){LOGGER.info({title:`Loading proxy: ${b}`});const bt=performance.now(),rn=await s.loadProxyAsset(b,!0),sn=performance.now();if(LOGGER.info({title:`${b} proxy: ${((sn-bt)/1e3).toFixed(2)} seconds to load.`}),LOGGER.info({title:`Loaded proxy: ${b}`,details:rn}),!rn?.proxy?.data)continue;const yn=!_e.plugs||_e.plugs.length===0;yn&&LOGGER.info({title:`Collecting plugs information for ${b} from the proxy mesh`});let Pn=[];rn.proxy.data.scene.traverse(zn=>{if(yn){const ar=getPlugAttributesFromObject(zn);Object.keys(ar).length>0&&Pn.push(ar)}zn.isMesh&&processMesh(zn,a)}),Pn.length>0&&(_e.plugs=Pn),updateBoundingBoxInfo(_e,rn)}}function processMesh(o,s){o.layers.set(GHOST_LAYER);const a=s.ghostColor;Object.assign(o.material,{color:new Color$1(0,0,0),emissive:new Color$1(a.r/255,a.g/255,a.b/255),emissiveIntensity:.75,alphaTest:a.a,transparent:a.a<1,opacity:a.a,depthTest:!1,reflectivity:0,metalness:0,wireframe:s.ghostAsWireframe})}function updateBoundingBoxInfo(o,s){const{boundingBox:a,boundingSphere:b}=computeProxyBoundingBox(s);if(a&&b){const _e=calculateBoundingBoxSize(a);Object.assign(o,{boundingBox:a,boundingSphereCenter:b.center,boundingBoxSize:_e})}else o.boundingSphereCenter={x:0,y:0,z:0},o.boundingBoxSize={x:0,y:0,z:0}}function calculateBoundingBoxSize(o){return{x:o.max.x-o.min.x,y:o.max.y-o.min.y,z:o.max.z-o.min.z}}function computeProxyBoundingBox(o){const s=o.proxy.data.scene;if(s){let a=null;return s.traverse(b=>{if(b.isMesh){a=b;return}}),a?(a.geometry.boundingBox||a.geometry.computeBoundingBox(),{boundingBox:a.geometry.boundingBox,boundingSphere:a.geometry.boundingSphere}):!1}}const AlertStyles=`.alert-space{position:absolute;width:auto;height:auto;max-width:40%;top:0;margin:1rem}.alert-bg{display:flex;flex-direction:row;border-radius:5.04px}.alert-mobile{display:none}.alert-persistant-btn{width:2rem;height:2rem;margin:4px;filter:invert(100%) brightness(200%)}.alert-persistant-btn-bg{cursor:pointer;display:flex;justify-content:center;align-items:center;border-radius:4px}.alert-persistant-btn-bg:hover{opacity:.9!important}.alert-icon{width:2rem;height:2rem;margin:14px;filter:invert(100%) brightness(200%)}.alert-icon-bg{border-radius:5.04px 0 0 5.04px}.alert-msg-bg{padding:1rem}.alert-label{font-weight:600;font-size:1.125rem;margin:0 0 4px;text-transform:capitalize}.alert-msg{font-size:1rem}.alert-cross-btn{width:1.5rem;cursor:pointer;margin:.5rem}.alert-msg-cross-timer-bg{display:flex;flex-direction:column;justify-content:space-between}.alert-msg-cross-bg{display:flex;flex-direction:row}.alert-timer{width:0%;height:2px;transition:10ms}.alert-bg.alert-info,.alert-bg.alert-mobile.alert-info{background-color:var(--info-light);border:1.26px solid var(--info-dark)}.alert-icon-bg.alert-info{background-color:var(--info-dark);border:1.26px solid var(--info-dark)}.alert-timer.alert-info{background-color:var(--info-dark)}.alert-bg.alert-warn,.alert-bg.alert-mobile.alert-warn{background-color:var(--warn-light);border:1.26px solid var(--warn-dark)}.alert-icon-bg.alert-warn{background-color:var(--warn-dark);border:1.26px solid var(--warn-dark)}.alert-timer.alert-warn{background-color:var(--warn-dark)}.alert-bg.alert-error,.alert-bg.alert-mobile.alert-error{background-color:var(--error-light);border:1.26px solid var(--error-dark)}.alert-icon-bg.alert-error{background-color:var(--error-dark);border:1.26px solid var(--error-dark)}.alert-timer.alert-error{background-color:var(--error-dark)}.alert-bg.alert-success,.alert-bg.alert-mobile.alert-success{background-color:var(--success-light);border:1.26px solid var(--success-dark)}.alert-icon-bg.alert-success{background-color:var(--success-dark);border:1.26px solid var(--success-dark)}.alert-timer.alert-success{background-color:var(--success-dark)}@keyframes loader{0%{width:0%}to{width:100%}}@media only screen and (orientation: portrait){.alert-label{margin:auto}.alert-close-btn-bg{display:flex;justify-content:center}.alert-icon-msg-cross-bg{display:flex;flex-direction:row;width:100%;align-items:center}.alert-space{width:100%;max-width:100%;margin:auto}.alert-bg{display:none;flex-direction:column}.alert-mobile{display:flex;justify-content:center;align-items:flex-start}.alert-icon{margin:4px}.alert-icon-bg{display:flex;justify-content:center;align-items:center;border-radius:5.04px;margin:8px 16px;height:fit-content}.alert-msg-bg{padding:1rem 0rem;width:calc(100% - 70px)}.alert-persistant-btn{margin:4px!important}.alert-persistant-btn-bg{display:flex;justify-content:center;width:calc(8px + 2rem)!important;align-items:center;border-radius:5.04px;margin:8px 16px}}
9341
9341
  `,GenericStyles=`#epigraphConfiguratorCore{width:100%;height:100%;margin:0;padding:0;overflow:hidden;display:flex;align-items:center;justify-content:space-evenly;align-content:center;flex-direction:row}*{user-select:none!important;-webkit-user-select:none!important}.coreContainer{position:relative;width:100%;height:100%}.grabCursor{cursor:url(https://storage.googleapis.com/gsc-epigraph-design/product-assets/Icon/Cursor-Move.svg) 6 3,auto}.grabbingCursor{cursor:url(https://storage.googleapis.com/gsc-epigraph-design/product-assets/Icon/Cursor-Grab.svg) 6 3,auto}.pointerCursor{cursor:url(https://storage.googleapis.com/gsc-epigraph-design/product-assets/Icon/Cursor-Click.svg) 6 2,auto}.blockedCursor{cursor:url(https://storage.googleapis.com/gsc-epigraph-design/product-assets/Icon/Cursor-Block.svg),auto}.moveCursor{cursor:url(https://storage.googleapis.com/gsc-epigraph-design/product-assets/Icon/Cursor-MoveArrows.svg) 8.65 8.65,auto}.mainCanvas{width:100%!important;height:100%!important;background:white}.uninteractable{pointer-events:none;opacity:.8}.dimensionsButtonParent{position:relative;display:flex}.dimensionText{font-size:.8rem;font-style:normal;font-weight:600}.dimensionActive{border-color:#c7c7c7!important}.canvasFocusButton{width:0;height:0;position:absolute;top:0}.color-grid{display:flex;gap:1rem}.canvasTooltip{position:absolute;width:100%;display:flex;padding:1rem;bottom:0;justify-content:center;color:#898989;font-style:italic;font-size:.75rem;font-family:Inter,helvetica,sans-serif;opacity:1;transition:.2s all ease;-webkit-transition:.2s all ease;pointer-events:none;text-transform:uppercase;margin-bottom:5rem}.emptySceneBG{position:absolute;width:100%;height:100%;display:flex;padding:1rem;bottom:0;font-size:2rem;justify-content:center;align-items:center;text-align:center;color:#89898939;font-family:Inter,helvetica,sans-serif;opacity:1;transition:.2s all ease;-webkit-transition:.2s all ease;pointer-events:none;text-transform:uppercase}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@epigraph/configurator",
3
- "version": "1.13.0-alpha",
3
+ "version": "1.13.0",
4
4
  "description": "Epigraph Configurator web component.",
5
5
  "keywords": [],
6
6
  "main": "./dist/index.js",