@liveroom-tech/react-immersive 6.2.1 → 6.2.3

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 (71) hide show
  1. package/README.md +23 -0
  2. package/dist/AnimationsTab-IKAAKT3P.mjs +1 -0
  3. package/dist/AnnotationsTab-NEJIXCOM.mjs +1 -0
  4. package/dist/CinematicTab-TIQXCPFE.mjs +1 -0
  5. package/dist/ConfigureTab-NYRMOFW4.mjs +6 -0
  6. package/dist/RulesTab-2U4MFYOZ.mjs +1 -0
  7. package/dist/SequencesTab-JZEE5WAM.mjs +1 -0
  8. package/dist/SequencesTab-O7USMDFP.css +1 -0
  9. package/dist/{StreamingTilesModel-6Z7SIC2J.mjs → StreamingTilesModel-IM2DDWO5.mjs} +1 -1
  10. package/dist/binding-builder.css +1 -1
  11. package/dist/binding-builder.d.mts +3 -3
  12. package/dist/binding-builder.d.ts +3 -3
  13. package/dist/binding-builder.js +45 -45
  14. package/dist/binding-builder.mjs +1 -1
  15. package/dist/chunk-37QOMZW6.mjs +1 -0
  16. package/dist/{chunk-NMRTI3NQ.mjs → chunk-3GA7JFNH.mjs} +1 -1
  17. package/dist/chunk-3I7PPFUV.mjs +1 -0
  18. package/dist/chunk-3PLML3PO.mjs +1 -0
  19. package/dist/chunk-5C4H7SRF.mjs +1 -0
  20. package/dist/chunk-CHMFH4D4.mjs +1 -0
  21. package/dist/chunk-CUDL77ZY.mjs +1 -0
  22. package/dist/{chunk-UTVFRMYW.mjs → chunk-IEKGBS46.mjs} +2 -2
  23. package/dist/chunk-LU3BQ7WG.mjs +69 -0
  24. package/dist/chunk-QZNUWZG7.mjs +50 -0
  25. package/dist/{chunk-3OCHN3CA.mjs → chunk-SOAUR4DL.mjs} +1 -1
  26. package/dist/chunk-SXN3YYD3.mjs +1 -0
  27. package/dist/chunk-TI2YXAHW.mjs +3 -0
  28. package/dist/exportSceneMesh-MSQIMBFF.mjs +1 -0
  29. package/dist/hosted.css +1 -1
  30. package/dist/hosted.d.mts +5 -3
  31. package/dist/hosted.d.ts +5 -3
  32. package/dist/hosted.js +44 -44
  33. package/dist/hosted.mjs +1 -1
  34. package/dist/index.css +1 -1
  35. package/dist/index.d.mts +8 -4
  36. package/dist/index.d.ts +8 -4
  37. package/dist/index.js +42 -42
  38. package/dist/index.mjs +1 -1
  39. package/dist/{modelFileResolver-CVmON8hg.d.mts → modelFileResolver-An1aQ0D3.d.mts} +42 -29
  40. package/dist/{modelFileResolver-CVmON8hg.d.ts → modelFileResolver-An1aQ0D3.d.ts} +42 -29
  41. package/dist/{modelViewerProps-BBnZTFO-.d.ts → modelViewerProps-BnVflYRA.d.mts} +22 -3
  42. package/dist/{modelViewerProps-CIY4nsNY.d.mts → modelViewerProps-H_K454u_.d.ts} +22 -3
  43. package/dist/{publicProps-BARVwXu7.d.ts → publicProps-AdNUI06n.d.ts} +1 -1
  44. package/dist/{publicProps-n0Yvr_Km.d.mts → publicProps-BOQBJBA_.d.mts} +1 -1
  45. package/dist/simple-model-viewer.css +1 -1
  46. package/dist/simple-model-viewer.d.mts +6 -2
  47. package/dist/simple-model-viewer.d.ts +6 -2
  48. package/dist/simple-model-viewer.js +5 -5
  49. package/dist/simple-model-viewer.mjs +1 -1
  50. package/dist/utils.d.mts +4 -4
  51. package/dist/utils.d.ts +4 -4
  52. package/dist/utils.js +15 -15
  53. package/dist/utils.mjs +1 -1
  54. package/package.json +7 -5
  55. package/dist/AnimationsTab-NUJTEMZ5.mjs +0 -1
  56. package/dist/AnnotationsTab-OHRVWRKI.mjs +0 -1
  57. package/dist/CinematicTab-IJAY2BS6.mjs +0 -1
  58. package/dist/ConfigureTab-UQRRATCY.mjs +0 -6
  59. package/dist/RulesTab-YVBZGJZX.mjs +0 -1
  60. package/dist/SequencesTab-IC5LWQ6N.css +0 -1
  61. package/dist/SequencesTab-VZKEKAUG.mjs +0 -1
  62. package/dist/chunk-25WC5KDO.mjs +0 -50
  63. package/dist/chunk-7OVEHDDE.mjs +0 -1
  64. package/dist/chunk-AL6UIGWP.mjs +0 -1
  65. package/dist/chunk-KYXJG3TX.mjs +0 -1
  66. package/dist/chunk-LD7QWHB4.mjs +0 -3
  67. package/dist/chunk-RKDATTUM.mjs +0 -1
  68. package/dist/chunk-UAZ6I25Y.mjs +0 -1
  69. package/dist/chunk-UHRJ2RBF.mjs +0 -1
  70. package/dist/chunk-YKDDNX2D.mjs +0 -69
  71. package/dist/exportSceneMesh-YJFOLFHS.mjs +0 -1
@@ -1 +1 @@
1
- "use client";import{a as t,b as o,c as d}from"./chunk-7OVEHDDE.mjs";import{a}from"./chunk-MMO7KCYU.mjs";import{c as f}from"./chunk-LD7QWHB4.mjs";import"./chunk-E24EFHB5.mjs";import"./chunk-FXV4CLAK.mjs";import"./chunk-AL6UIGWP.mjs";import"./chunk-YKDDNX2D.mjs";import"./chunk-KYXJG3TX.mjs";import"./chunk-FGAJ2UT7.mjs";import"./chunk-3OCHN3CA.mjs";import"./chunk-UTVFRMYW.mjs";import"./chunk-NMRTI3NQ.mjs";import"./chunk-37YITTIK.mjs";import"./chunk-2AJK643D.mjs";import"./chunk-RKDATTUM.mjs";import{ea as i,fa as r}from"./chunk-25WC5KDO.mjs";import"./chunk-LX3GXQNU.mjs";import"./chunk-7JCFNZJM.mjs";import"./chunk-UHRJ2RBF.mjs";import"./chunk-CCBFMNAU.mjs";import"./chunk-GV4ZRXL6.mjs";import"./chunk-7OWHW66D.mjs";import"./chunk-KFLS7GI6.mjs";import"./chunk-UAZ6I25Y.mjs";import"./chunk-BNKTI3CY.mjs";import"./chunk-UCD76KQ6.mjs";import"./chunk-TUYVYSN5.mjs";import"./chunk-RXZ4Q7CY.mjs";import"./chunk-JR557W27.mjs";import{useEffect as h,useState as m}from"react";import{jsx as l}from"react/jsx-runtime";function c(e){a("binding-builder","BindingBuilder");let[s,u]=m(!1);return h(()=>{let n=()=>u(e.arHandoff!==!1&&i(e.arHandoff)?.autoRestore!==!1&&r(window.location.href));return n(),window.addEventListener("hashchange",n),()=>window.removeEventListener("hashchange",n)},[e.arHandoff]),s?l(d,{modelUrl:"",licenseKey:e.licenseKey,onLicenseStatusChange:e.onLicenseStatusChange,enableXR:!0,arHandoff:e.arHandoff??!0,mobileHandoffUrl:e.mobileHandoffUrl,dracoDecoderPath:e.dracoDecoderPath,ktx2TranscoderPath:e.ktx2TranscoderPath,meshopt:e.meshopt,hideLicenseCheckingOverlay:e.hideLicenseCheckingOverlay}):l(f,{...o(e,t)})}export{c as BindingBuilder};
1
+ "use client";import{a as t,b as o,c as d}from"./chunk-CHMFH4D4.mjs";import{a}from"./chunk-MMO7KCYU.mjs";import{c as f}from"./chunk-TI2YXAHW.mjs";import"./chunk-E24EFHB5.mjs";import"./chunk-FXV4CLAK.mjs";import"./chunk-SXN3YYD3.mjs";import"./chunk-LU3BQ7WG.mjs";import"./chunk-CUDL77ZY.mjs";import"./chunk-FGAJ2UT7.mjs";import"./chunk-SOAUR4DL.mjs";import"./chunk-IEKGBS46.mjs";import"./chunk-3GA7JFNH.mjs";import"./chunk-37YITTIK.mjs";import"./chunk-2AJK643D.mjs";import"./chunk-5C4H7SRF.mjs";import"./chunk-3PLML3PO.mjs";import{ga as i,ha as r}from"./chunk-QZNUWZG7.mjs";import"./chunk-LX3GXQNU.mjs";import"./chunk-7JCFNZJM.mjs";import"./chunk-37QOMZW6.mjs";import"./chunk-CCBFMNAU.mjs";import"./chunk-GV4ZRXL6.mjs";import"./chunk-7OWHW66D.mjs";import"./chunk-KFLS7GI6.mjs";import"./chunk-3I7PPFUV.mjs";import"./chunk-BNKTI3CY.mjs";import"./chunk-UCD76KQ6.mjs";import"./chunk-TUYVYSN5.mjs";import"./chunk-RXZ4Q7CY.mjs";import"./chunk-JR557W27.mjs";import{useEffect as h,useState as m}from"react";import{jsx as l}from"react/jsx-runtime";function c(e){a("binding-builder","BindingBuilder");let[s,u]=m(!1);return h(()=>{let n=()=>u(e.arHandoff!==!1&&i(e.arHandoff)?.autoRestore!==!1&&r(window.location.href));return n(),window.addEventListener("hashchange",n),()=>window.removeEventListener("hashchange",n)},[e.arHandoff]),s?l(d,{modelUrl:"",licenseKey:e.licenseKey,onLicenseStatusChange:e.onLicenseStatusChange,enableXR:!0,arHandoff:e.arHandoff??!0,mobileHandoffUrl:e.mobileHandoffUrl,dracoDecoderPath:e.dracoDecoderPath,ktx2TranscoderPath:e.ktx2TranscoderPath,meshopt:e.meshopt,hideLicenseCheckingOverlay:e.hideLicenseCheckingOverlay}):l(f,{...o(e,t)})}export{c as BindingBuilder};
@@ -0,0 +1 @@
1
+ import{Matrix4 as H,Quaternion as V,Vector3 as b}from"three";function L(e){return new H().set(1,e[0],e[1],0,0,1,e[2],0,0,0,1,0,0,0,0,1)}function _(e,o){e.matrixAutoUpdate=!o,e.updateMatrix(),o&&(e.matrix.makeRotationFromQuaternion(e.quaternion).multiply(L(o)).scale(e.scale).setPosition(e.position),e.matrixWorldNeedsUpdate=!0)}function A(e,o,t){let r=new b().setFromMatrixColumn(e,0),s=new b().setFromMatrixColumn(e,1),n=new b().setFromMatrixColumn(e,2),a=(f,x)=>{let C=f*(x<0?-1:1);return Math.abs(C-x)<1e-10?x:C},u=a(r.length(),o.x);if(Math.abs(u)<1e-12)return{rotation:t.clone(),scale:o.clone(),shear:void 0};r.divideScalar(u);let l=r.dot(s);s.addScaledVector(r,-l);let i=a(s.length(),o.y);if(Math.abs(i)<1e-12)return{rotation:t.clone(),scale:o.clone(),shear:void 0};s.divideScalar(i);let c=r.dot(n);n.addScaledVector(r,-c);let d=s.dot(n);n.addScaledVector(s,-d);let p=a(n.length(),o.z);if(Math.abs(p)<1e-12)return{rotation:t.clone(),scale:o.clone(),shear:void 0};n.divideScalar(p);let h=[l/i,c/p,d/p].map(f=>Math.abs(f)<1e-10?0:f);return{rotation:new V().setFromRotationMatrix(new H().makeBasis(r,s,n)).normalize(),scale:new b(u,i,p),shear:h.some(Boolean)?h:void 0}}import{CanvasTexture as P,Color as $,ImageLoader as W,NoColorSpace as M,RepeatWrapping as S,SRGBColorSpace as k,Texture as j}from"three";var g=new Map,O={color:"#93c5fd",intensity:.07},Q=new $(O.color).multiplyScalar(O.intensity),X=new $(O.color),q=.28,T=new Map,G=new Map;function U(e){return`${e.name}|${e.size}|${e.lastModified}`}function D(e){let o=U(e),t=e.name.lastIndexOf("."),r=t>0?e.name.slice(0,t):e.name,s=t>0?e.name.slice(t):"",n=`materials/${e.name}`,a=2;for(;;){let u=G.get(n);if(u===o||u===void 0&&!T.has(n))return G.set(n,o),n;n=`materials/${r}-${a}${s}`,a+=1}}function J(e){return T.get(e)}function z(e,o){let t=++e.loadGeneration;e.loaded=!1,e.failed=!1;let r=()=>{if(e.loadGeneration!==t)return;e.loaded=!0;let s=e.pending;e.pending=[];for(let n of s)n()};new W().load(o,s=>{e.loadGeneration===t&&(e.texture.image=s,e.texture.needsUpdate=!0,r())},void 0,()=>{e.loadGeneration===t&&(e.failed=!0,console.warn(`Failed to load texture: ${o}`),r())})}function F(e,o){for(let t of[k,M]){let r=g.get(m(e,t));r&&z(r,o)}}function K(e,o){let t=T.get(e);t&&t!==o&&t.startsWith("blob:")&&URL.revokeObjectURL(t),T.set(e,o),F(e,o)}function Z(e){let o=T.get(e);o&&(o.startsWith("blob:")&&URL.revokeObjectURL(o),T.delete(e),G.delete(e),F(e,e))}function m(e,o){return`${o}|${e}`}function B(e,o=M,t){let r=m(e,o),s=g.get(r);if(s)return t&&!s.loaded&&s.pending.push(t),s.texture;let n=T.get(e)??e,a={texture:new j,refCount:0,loaded:!1,pending:t?[t]:[],loadGeneration:0};return a.texture.flipY=!1,a.texture.colorSpace=o,g.set(r,a),z(a,n),a.texture}function ee(e,o=M,t){let r=B(e,o,t);return g.get(m(e,o)).refCount+=1,r}function te(e,o=M){let t=g.get(m(e,o));t&&(t.refCount-=1,t.refCount<=0&&(t.loadGeneration+=1,t.pending=[],t.texture.dispose(),g.delete(m(e,o))))}function oe(e,o,t,r,s,n=1,a=0){let u=e.offsetTextures??(e.offsetTextures={}),l=u[o],i=l;if(!i||i.sourcePath!==r||i.base!==t){l?.texture.dispose();let d=t.clone();d.wrapS=S,d.wrapT=S,d.center.set(.5,.5),d.needsUpdate=!0,i={texture:d,sourcePath:r,base:t},u[o]=i}let c=n>0?n:1;return i.texture.offset.set(s[0],s[1]),i.texture.repeat.set(1/c,1/c),i.texture.rotation=a,i.texture}function ne(e,o){let t=e.offsetTextures,r=t?.[o];r&&(r.texture.dispose(),delete t[o])}function re(e){let o=e.offsetTextures;if(o){for(let t of Object.values(o))t.texture.dispose();delete e.offsetTextures}}var w=null;function se(){if(w)return w;let e=256,o=document.createElement("canvas");o.width=e,o.height=e;let t=o.getContext("2d"),r=t.createRadialGradient(e*.35,e*.35,e*.02,e*.5,e*.5,e*.55);r.addColorStop(0,"#ffffff"),r.addColorStop(.4,"#b5b5b5"),r.addColorStop(1,"#3a3a3a"),t.fillStyle=r,t.fillRect(0,0,e,e);let s=new P(o);return s.colorSpace=k,w=s,s}var y=null;function ie(){if(y)return y;let e=1024,o=8,t=e/o,r=["#ef4444","#f59e0b","#22c55e","#6366f1"],s=document.createElement("canvas");s.width=e,s.height=e;let n=s.getContext("2d");n.textAlign="center",n.textBaseline="middle";for(let u=0;u<o;u+=1)for(let l=0;l<o;l+=1){let i=l*t,c=u*t,d=(Math.floor(l/2)+Math.floor(u/2))%4;n.fillStyle=r[d],n.fillRect(i,c,t,t),n.strokeStyle="rgba(0, 0, 0, 0.28)",n.lineWidth=2;for(let R=1;R<4;R+=1){let v=R*t/4;n.beginPath(),n.moveTo(i+v,c),n.lineTo(i+v,c+t),n.moveTo(i,c+v),n.lineTo(i+t,c+v),n.stroke()}n.strokeStyle="#09090b",n.lineWidth=7,n.strokeRect(i,c,t,t);let p=i+t*.23,h=c+t*.72,f=i+t*.72,x=c+t*.23;n.lineCap="round",n.lineJoin="round",n.beginPath(),n.moveTo(p,h),n.lineTo(f,x),n.lineTo(f-t*.2,x),n.moveTo(f,x),n.lineTo(f,x+t*.2),n.stroke();let C=u*o+l+1;n.font=`700 ${Math.round(t*.2)}px ui-monospace, SFMono-Regular, Menlo, monospace`,n.fillStyle="#ffffff",n.strokeStyle="rgba(0, 0, 0, 0.85)",n.lineWidth=6;let I=String(C).padStart(2,"0");n.strokeText(I,i+t/2,c+t*.82),n.fillText(I,i+t/2,c+t*.82)}let a=new P(s);return a.colorSpace=k,a.wrapS=S,a.wrapT=S,a.flipY=!1,a.anisotropy=8,a.needsUpdate=!0,y=a,a}function ae(e){for(let o of g.values())if(o.texture.source===e.source&&(!o.loaded||o.failed))return!0;return!1}export{L as a,_ as b,A as c,O as d,Q as e,X as f,q as g,D as h,J as i,K as j,Z as k,B as l,ee as m,te as n,oe as o,ne as p,re as q,se as r,ie as s,ae as t};
@@ -1 +1 @@
1
- import{b as o,c as t}from"./chunk-UAZ6I25Y.mjs";import{createContext as l,useContext as n,useMemo as a}from"react";import{jsx as d}from"react/jsx-runtime";var i=l(void 0);function V({labels:e,children:r}){return d(i.Provider,{value:e,children:r})}function u(){let e=n(i);return a(()=>Object.assign((r,s)=>o(e,r,s),{message:r=>t(e,r)}),[e])}export{V as a,u as b};
1
+ import{b as o,c as t}from"./chunk-3I7PPFUV.mjs";import{createContext as l,useContext as n,useMemo as a}from"react";import{jsx as d}from"react/jsx-runtime";var i=l(void 0);function V({labels:e,children:r}){return d(i.Provider,{value:e,children:r})}function u(){let e=n(i);return a(()=>Object.assign((r,s)=>o(e,r,s),{message:r=>t(e,r)}),[e])}export{V as a,u as b};
@@ -0,0 +1 @@
1
+ var a={modelViewer:"3D model viewer",openSceneSettingsPanel:"Open scene settings panel",closeSceneSettingsPanel:"Close scene settings panel",verifyingLicense:"Verifying License",checkingYourLicenseKey:"Checking your license key...",createDevelopmentKey:"Create a free development key",invalidLicense:"Invalid License",licenseHasBeenRevokedOrHasExpired:"License has been revoked or has expired",failedToLoadPleaseContactTheSiteAdministrator:"Failed to load. Please contact the site administrator.",contextRestoringTitle:"Reloading viewer\u2026",contextLostTitle:"3D view interrupted",contextRestoringMessage:"Rebuilding the 3D view. Please wait\u2026",contextLostMessage:"The graphics connection was interrupted. The viewer will rebuild when it returns, or you can reload it now.",reloadViewer:"Reload viewer",texturePositioningHint:"Drag to move \xB7 Scroll to zoom \xB7 Click elsewhere to finish",texturePositioningStartHint:"Double-click to move or zoom",dismiss:"Dismiss",missingUVsAreShownInMagenta:"Missing UVs are shown in magenta.",viewThisModelInARWithAppleQuickLook:"View this model in AR with Apple Quick Look",sequencePlayer:"Sequence player",sequenceSelect:"Sequence",sequencePlay:"Play sequence",sequencePause:"Pause sequence",sequenceStop:"Stop and restore scene",sequencePlayhead:"Sequence playhead",sequenceTime:"Sequence time",sequenceIssues:"Unavailable sequence targets",arConfiguredButton:"AR handoff",arConfiguredTitle:"Take this configuration to AR",arConfiguredDescription:"Your current materials, visible models and placements are included.",arSnapshotStale:"Updating AR to include your latest changes\u2026",arPreparing:"Preparing your scene\u2026",arStart:"Start AR",arStarting:"Starting AR\u2026",arCheckingSupport:"Checking AR support\u2026",arUnavailable:"AR is unavailable in this browser. Open this link in an AR-capable browser on your phone.",arStartFailed:"Could not start AR. Check camera permissions and try again.",arAnimations:"AR animations",arAnimationSelect:"Animation",arAnimationSaved:"Default",arAnimationNone:"No animation",arAnimationClips:"Model clips",arAnimationSequences:"Sequences",arAnimationPlay:"Play animation",arAnimationPause:"Pause animation",arRefresh:"Refresh AR",arRetry:"Try again",arExportDetails:"Export details",arPrepare:"Prepare AR",arPrepareAgain:"Prepare again",arDownloadUSDZ:"Download USDZ for iPhone/iPad",arScanConfigured:"Scan to open this configuration on your phone.",arOpenConfiguredLink:"Open configuration link",viewInAR:"View in AR",openThisExperienceOnAPhoneForAR:"Open this experience on a phone for AR",openOnPhone:"Open on phone",viewThisModelInYourSpace:"View this model in your space",viewThisModelInVR:"View this model in VR",closePhoneHandoff:"Close phone handoff",arScanCode:"Scan the code and choose AR.",qrCodeToOpenThisModelOnAPhone:"QR code to open this model on a phone",disableUVChecker:"Disable UV checker",enableUVChecker:"Enable UV checker",explodedView:"Exploded view",explodeAmount:"Explode amount",removeSectionCut:"Remove section cut",sectionCut:"Section cut",sectionAxis:"Section axis",sectionPosition:"Section position",keepTheOtherSide:"Keep the other side",pauseCinematic:"Pause cinematic",playCinematic:"Play cinematic",stopCinematicAndResetCamera:"Stop cinematic and reset camera",cancel:"Cancel",annotationCategories:"Annotation categories",annotations:"Annotations",all:"All",uncategorized:"Uncategorized",decalDragHint:"Drag the decal on the object. Release to save; Escape to cancel.",showAll:"Show all",materialVariants:"Material variants",startGuidedTour:"Start guided tour",guidedTour:"Guided Tour",previousAnnotation:"Previous annotation",previous:"Prev",stopGuidedTour:"Stop guided tour",nextAnnotation:"Next annotation",next:"Next",exitFullscreen:"Exit fullscreen",enterFullscreen:"Enter fullscreen",resetCameraView:"Reset camera view",orbitControl:"Orbit Control",pointLock:"Pointer lock",cameraController:"Camera controller",cameraControllerSettings:"Camera controller settings",downloadGLB:"Download GLB",downloadGLBDescription:"All visible models, material edits and animations in one file. No annotations or separate editor model slots. Duplicate mesh names may change on reimport.",downloadCombinedGLB:"Download as one GLB",downloadSeparateGLBs:"Download separate GLBs",downloadSeparateGLBsDescription:"One GLB file per model",downloadPNG:"Download PNG",downloadUVLayout:"Download UV Layout",videoFormat:"Video format",auto:"Auto",recordTurntableVideo:"Record turntable video",recordCinematicVideo:"Record cinematic video",videoUnsupported:"Video recording is not supported in this browser.",downloadOptions:"Download options",exporting:"Exporting\u2026",download:"Download",annotationTitlePlaceholder:"Title *",description:"Description",ok:"OK",arRelocate:"Relocate",tapToPlace:"Tap to place",closeAnnotation:"Close annotation",learnMore:"Learn more",stopMeasuring:"Stop measuring",startMeasuring:"Start measuring",toggleBoundingDimensions:"Toggle bounding dimensions",measurementTool:"Measurement tool",distance:"Distance",angle:"Angle",area:"Area",pointToPlane:"Point to plane",wrap:"Circumference (Edge)",wrapHorizontal:"Circumference (Horizontal)",measurementSnapping:"Measurement snapping",noSnapping:"No snapping",snapAuto:"Snap: auto",snapVertex:"Snap: vertex",snapEdge:"Snap: edge",undoMeasurementPoint:"Undo measurement point",clearMeasurements:"Clear measurements",finishArea:"Finish area",savedMeasurements:"Saved measurements ({count})",noSavedMeasurements:"No saved measurements yet. Pick points in the preview, then save a measurement here.",measurementFiles:"Import / export",measurementSourceUnit:"Model units",measurementDisplayUnit:"Display units",measurementName:"Name",measurementNamePlaceholder:"e.g. Door width",saveMeasurement:"Save",knownMeasurementDistance:"Known length",calibrationUnit:"Calibration unit",calibrateMeasurement:"Calibrate",measurementCalibrationHint:"Pick two distance points, enter their known length, then calibrate.",measurementCalibratedScale:"Calibrated: 1 model unit = {scale} m",resetMeasurementCalibration:"Reset calibration",showSavedMeasurement:"Show {name}",renameSavedMeasurement:"Rename {name}",deleteSavedMeasurement:"Delete {name}",exportMeasurementJson:"Export JSON",exportMeasurementCsv:"Export CSV",importMeasurementJson:"Import JSON",measurementReady:"Ready",measurementApproximate:"Approximate LOD",measurementModelChanged:"Different model",measurementObjectMissing:"Object unavailable",measurementGeometryChanged:"Geometry changed \u2014 measure again",measurementPoseChanged:"Pose changed \u2014 measure again",measurementObjectHidden:"Object hidden",measurementInvalid:"Invalid measurement",measurementWaiting:"Waiting for model",openSceneObjectsPanel:"Open scene objects panel",sceneObjects:"Scene Objects",searchNodesLabels:"Search nodes, labels",closeSceneObjectsPanel:"Close scene objects panel",objectNavigator:"Objects in the 3D view",compareBefore:"Before",compareAfter:"After",compareDivider:"Comparison divider",viewIn3D:"View in 3D",objectNavigatorHint:"Arrow keys browse \xB7 Enter selects \xB7 Esc clears",selectionCleared:"Selection cleared",cameraKeyboardHelp:"3D view. Arrow keys orbit, Shift with Up or Down zooms, and W, A, S, D, Space and C move the camera.",isolate:"Isolate",hide:"Hide",show:"Show",closePanel:"Close panel",actions:"Actions",openPanel:"Open panel",close:"Close",position:"Position",decalNudgeHint:"Click to fine-tune \xB7 Hold to move",decalNudgeControls:"Move decal in small steps",text:"Text",yourText:"Your text",textToAdd:"Text to add",textColour:"Text color",addText:"Add text",image:"Image",chooseImage:"Choose image",imageToAdd:"Image to add",added:"Added",colour:"Color",size:"Size",turn:"Turn",rotation:"Rotation",dragTheDecalAcrossTheObjectsSurface:"Drag the decal across the object's surface",move:"Move",remove:"Remove",noneAddedYet:"None added yet",done:"Done",moveForward:"Move forward",moveLeft:"Move left",moveRight:"Move right",moveBackward:"Move backward",productOptions:"Options",productOptionsFor:"{product} options",productReset:"Reset",productOptional:"optional",productNone:"None",productAlsoChanges:"Also changes: {changes}",productUnavailable:"Currently unavailable.",productQuantity:"Quantity",productCheckingPrice:"Checking price and availability\u2026",productTotal:"Total",productAddToCart:"Add to cart",productAddingToCart:"Adding\u2026",productRequestQuote:"Request quote",productRequestingQuote:"Requesting\u2026",productRefresh:"Refresh",productBuy:"Buy now",productCopyLink:"Copy link",productLinkCopied:"Link copied",productShowOptions:"Show options",productHideOptions:"Hide options",productIssues:"Configuration issues",productRequestDone:"Request completed.",productSaved:"Saved: {id}",sceneSettings:"Scene Settings",background:"Background",backgroundColor:"Background Color",showEnvironmentAsBackground:"Show as background",backgroundBlur:"Background Blur",environmentPreset:"Preset",environmentIntensity:"Intensity",toneMapping:"Tone Mapping",toneMappingAces:"ACES Filmic",toneMappingAgx:"AgX",toneMappingNeutral:"Neutral",toneMappingNone:"None",ground:"Ground",groundShadow:"Ground Shadow",groundShadowOpacity:"Shadow Opacity",floorGrid:"Floor Grid",display:"Display",wireframe:"Wireframe",autoRotateSpeed:"Rotation Speed",fieldOfView:"Field of View",modelInfo:"Model",modelInfoObjects:"Objects",modelInfoTriangles:"Triangles",modelInfoMaterials:"Materials",resetSettings:"Reset Settings",environment:"Environment",autoRotate:"Auto Rotate",lighting:"Lighting",exposure:"Exposure",ambientLightIntensity:"Ambient Light Intensity",ambientLightColor:"Ambient Light Color",directLightIntensity:"Direct Light Intensity",directLightColor:"Direct Light Color",searchObjects:"Search objects",uploadedModel:"Uploaded model",clear:"Clear",chooseModel:"Choose model",loadingModel:"Loading model...",releaseToLoadYourModel:"Release to load your model",arFindSurface:"Move your device over a flat surface",arReleaseToPlace:"Release to place",arGestureHint:"Pinch to resize \xB7 Twist to rotate",angleFirstArmHint:"Pick the first arm",angleVertexHint:"Pick the angle's vertex",angleSecondArmHint:"Pick the second arm",angleNewHint:"Pick a point to start a new angle",areaNewHint:"Pick a point to start a new area",areaCornersHint:"Pick polygon corners in order, then Finish area",pointToPlaneFaceHint:"Pick the reference face",pointToPlanePointHint:"Pick a point to measure its perpendicular distance",pointToPlaneNewHint:"Pick a face to start a new measurement",distanceHint:"Pick points on the model to measure distances",wrapHint:"Click a point on the surface to measure its circumference, following the surface (best for limbs)",wrapHorizontalHint:"Click a point to measure a level circumference around it (best for the torso/waist)",visibleEntries:"{count} visible entries",objectCount:"{count} objects",annotationMarker:"Annotation {id}: {title}",recordingVideo:"Recording video \xB7 {progress}%",isolatedObjects:"Isolated: {count} objects",largeModelWarning:"Very large model ({millions}M triangles) \u2014 it may render and move slowly on this device, and click/hover selection on the model is disabled. Use the objects panel to select parts.",preparingLargeModel:"Preparing large model ({millions}M triangles) \u2014 the first display can take a while on this device...",enterAR:"Enter AR",enterVR:"Enter VR",decalImage:"Image {index}",decalText:"Text {index}",decalAdded:"{count} added",up:"up",down:"down",left:"left",right:"right",moveDecal:"Move decal {direction}",moveDecalOnSurface:"Move {direction} on the visible surface",showAllObject:"Show all {name}",isolateObject:"Isolate {name}",isolatedObject:"Isolated: {name}",hideObject:"Hide {name}",showObject:"Show {name}",objectSelected:"{name} selected",objectNavigatorPosition:"{position} of {count}",compareDividerValue:"{before} {percent}%, {after} {rest}%",bindingMismatchOne:"1 object binding doesn't match this model",bindingMismatchMany:"{count} object bindings don't match this model",simpleLargeModelWarning:"Very large model detected ({millions}M triangles) \u2014 it may render and move slowly on this device, and click/hover selection on the model is disabled. Use the scene objects panel to select parts.",dropModelHint:"Drag and drop {formats} here",retryModelLoad:"Retry loading model",loadErrorTitle:"This model couldn't be loaded",loadErrorNotFound:"Nothing was found at this address ({status}). Check that modelUrl points to the file.",loadErrorDenied:"The server refused access to the file ({status}). Check that the file is public, or that a signed URL hasn't expired.",loadErrorStatus:"The server responded with {status} when the file was requested.",loadErrorNetwork:"The download was blocked or failed. Check that the URL is correct and, if the file is on another domain, that its server allows cross-origin requests (CORS) from this site.",loadErrorHtml:"The server sent back a web page instead of a model. There's probably no file at this path: many servers answer a missing file with their index.html.",loadErrorInvalidFile:"The file couldn't be read as {format}. Check that it's a valid {format} file.",loadErrorInvalidExplicitFormat:"The file couldn't be read as {format}. Check that it's a valid {format} file and that modelFormat matches it.",loadErrorMissingFormat:"The file couldn't be read as {format}. The URL has no file extension, so set modelFormat to the file's format.",loadErrorPointCloud:"This PLY file is a point cloud: it has points but no faces, and the viewer shows meshes. Turn it into a mesh first, for example with MeshLab or Blender.",measurementReferenceFaceRequired:"Pick a triangle face to define the reference plane.",measurementTooManyPoints:"Finish or clear this measurement before adding more points.",measurementAngleDistinct:"Pick a point away from the angle's vertex.",areaMinimumPoints:"Pick at least three points to finish the area.",areaDistinctPoints:"Area points must be distinct.",areaStraightLine:"Area points must not lie on one straight line.",areaNotPlanar:"Area points must lie on one plane.",areaEdgesCross:"Area edges must not cross or touch each other.",areaZero:"The polygon has no measurable area.",decalSurfaceMissing:"Could not find a surface on this object for the decal.",decalDirectionMissing:"No visible surface in that direction. Try another arrow or rotate the view.",fullscreenExitFailed:"Could not exit fullscreen. Press Escape to exit.",fullscreenEnterFailed:"Could not enter fullscreen. Check your browser or iframe fullscreen permissions and try again.",uvCoordinatesMissing:"This model does not contain UV coordinates.",uvExportFailed:"Could not create the UV layout archive.",videoExportFailed:"Could not export the video.",videoNotReady:"Viewer not ready for video export.",videoExitXR:"Exit the XR session before recording a video.",videoAlreadyRecording:"A video export is already in progress.",videoPathRequired:"Enable a cinematic camera path before recording it.",videoDurationInvalid:"Video duration must be greater than 0 and at most 300 seconds.",videoFrameRateInvalid:"Video frame rate must be between 1 and 60.",videoBitrateInvalid:"Video bitrate must be a positive number.",videoContextLost:"Video export stopped because the WebGL context was lost.",videoTimedOut:"Video export timed out. Keep the viewer tab visible while recording.",videoEncodingFailed:"The browser could not encode the video.",videoEmpty:"The browser produced an empty video.",videoDidNotStart:"Video recording did not start.",videoWebMUnsupported:"Video recording as WEBM is not supported in this browser.",videoMP4Unsupported:"Video recording as MP4 is not supported in this browser.",videoGIFUnsupported:"Video recording as GIF is not supported in this browser.",videoGifWidthInvalid:"GIF width must be a whole number of pixels from 16 to 4096.",environmentNeutral:"neutral",environmentApartment:"apartment",environmentCity:"city",environmentDawn:"dawn",environmentForest:"forest",environmentLobby:"lobby",environmentNight:"night",environmentPark:"park",environmentStudio:"studio",environmentSunset:"sunset",environmentWarehouse:"warehouse",color:"Color",material:"Material",texturePreview:"texture preview",noTextureApplied:"No texture applied",noTextureCoordinates:"This part has no texture coordinates, so an image can't be placed on it.",replaceImage:"Replace image",uploadImage:"Upload image",removeTexture:"Remove texture",texturePosition:"Texture position",offsetX:"Offset X",offsetY:"Offset Y",confirmTexturePosition:"Confirm this texture position and exit positioning mode",donePositioning:"Done positioning",textureOffsetHint:"Double-click the object in the preview to drag its texture directly (scroll to zoom), or edit its offset numerically.",actionToggleLight:"Toggle Light",actionChangeLightColor:"Change Light Color",actionSetBrightness:"Set Brightness",actionChangeColor:"Change Color",actionChangeMaterial:"Change Material",actionToggleVisibility:"Toggle Visibility"};function r(o,e,t={}){return(o?.[e]??a[e]).replace(/\{(\w+)\}/g,(i,n)=>Object.prototype.hasOwnProperty.call(t,n)?String(t[n]):i)}var s=new Map(Object.entries(a).map(([o,e])=>[e,o]));function l(o,e){let t=s.get(e);return t?r(o,t):e}export{a,r as b,l as c};
@@ -0,0 +1 @@
1
+ import{Children as V,Fragment as U,createContext as q,isValidElement as A,useCallback as F,useContext as G,useEffect as $,useId as W,useLayoutEffect as X,useRef as D,useState as w}from"react";import{createPortal as j}from"react-dom";import{Check as J}from"lucide-react";import{Fragment as Y,jsx as u,jsxs as M}from"react/jsx-runtime";var Q=q(null);function te({value:t,onChange:s,children:b,className:o,id:g,disabled:E=!1,title:T,"aria-label":x}){let B=G(Q),S=h(b),a=S.filter(e=>e.kind==="option"),P=a.find(e=>e.value===t),[i,C]=w(!1),[c,d]=w(-1),[K,O]=w({}),p=D(null),v=D(null),m=W(),f=F(e=>{C(!1),e&&p.current?.focus()},[]),N=e=>{e.disabled||(f(!0),e.value!==t&&s?.({target:{value:e.value},currentTarget:{value:e.value}}))},R=()=>{E||(d(Math.max(0,a.findIndex(e=>e.value===t))),C(!0))};X(()=>{if(!i||!p.current)return;let e=p.current.getBoundingClientRect(),n=window.innerHeight-e.bottom-8,r=e.top-8,l=n<180&&r>n;O({left:e.left,minWidth:e.width,maxHeight:Math.min(320,l?r:n)-4,...l?{bottom:window.innerHeight-e.top+4}:{top:e.bottom+4}})},[i]),$(()=>{if(!i)return;let e=l=>{let I=l.target;v.current?.contains(I)||p.current?.contains(I)||f(!1)},n=l=>l.preventDefault(),r=v.current;return r?.addEventListener("beforexrselect",n),window.addEventListener("pointerdown",e,!0),window.addEventListener("scroll",e,!0),window.addEventListener("resize",e),()=>{r?.removeEventListener("beforexrselect",n),window.removeEventListener("pointerdown",e,!0),window.removeEventListener("scroll",e,!0),window.removeEventListener("resize",e)}},[i,f]),$(()=>{i&&v.current?.querySelector(`[data-index="${c}"]`)?.scrollIntoView({block:"nearest"})},[i,c]);let y=(e,n)=>{for(let r=e+n;r>=0&&r<a.length;r+=n)if(!a[r].disabled)return r;return e},z=e=>{if(!E){if(!i){["ArrowDown","ArrowUp","Enter"," "].includes(e.key)&&(e.preventDefault(),R());return}if(e.key==="ArrowDown")d(n=>y(n,1));else if(e.key==="ArrowUp")d(n=>y(n,-1));else if(e.key==="Home")d(y(-1,1));else if(e.key==="End")d(y(a.length,-1));else if(e.key==="Enter"||e.key===" ")a[c]&&N(a[c]);else if(e.key==="Escape")f(!0);else if(e.key==="Tab"){f(!1);return}else return;e.preventDefault()}},L=B??p.current?.closest(".bb-dialogBackdrop, .ri-viewer, .smv-root, .bb-root")??(typeof document<"u"?document.body:null),H=-1;return M(Y,{children:[u("button",{ref:p,type:"button",id:g,className:`ri-select ${o??""}`,disabled:E,title:T,"aria-label":x,"aria-haspopup":"listbox","aria-expanded":i,"aria-controls":i?m:void 0,"aria-activedescendant":i&&c>=0?`${m}-${c}`:void 0,onClick:()=>i?f(!1):R(),onKeyDown:z,children:u("span",{className:"ri-selectValue",children:P?.label??""})}),i&&L?j(u("div",{ref:v,id:m,className:"ri-selectMenu",role:"listbox","aria-label":x,style:K,children:S.map((e,n)=>{if(e.kind==="group")return u("div",{className:"ri-selectGroup",role:"presentation",children:e.label},`group-${n}`);H+=1;let r=H,l=e.value===t;return M("div",{id:`${m}-${r}`,"data-index":r,role:"option","aria-selected":l,"aria-disabled":e.disabled||void 0,className:`ri-selectOption ${r===c?"ri-selectOption--active":""}`,onPointerEnter:()=>!e.disabled&&d(r),onClick:()=>N(e),children:[u("span",{className:"ri-selectCheck",children:l?u(J,{size:13,"aria-hidden":"true"}):null}),u("span",{className:"ri-selectLabel",children:e.label})]},`${e.value}-${n}`)})}),L):null]})}function h(t,s=[]){return V.forEach(t,b=>{if(!A(b))return;let o=b;if(o.type===U)h(o.props.children,s);else if(o.type==="optgroup")s.push({kind:"group",label:String(o.props.label??"")}),h(o.props.children,s);else if(o.type==="option"){let g=k(o.props.children);s.push({kind:"option",value:o.props.value===void 0?g:String(o.props.value),label:g,disabled:!!o.props.disabled})}}),s}function k(t){return t==null||typeof t=="boolean"?"":typeof t=="string"||typeof t=="number"?String(t):Array.isArray(t)?t.map(k).join(""):A(t)?k(t.props.children):""}export{Q as a,te as b};
@@ -0,0 +1 @@
1
+ import{b as S,c as B,n as h}from"./chunk-UCD76KQ6.mjs";import{Box3 as A,BufferAttribute as I,Mesh as C}from"three";import{acceleratedRaycast as g,computeBoundsTree as O,disposeBoundsTree as W,MeshBVH as E}from"three-mesh-bvh";var T=new WeakMap;function b(e){let t=T.get(e),s=e.index;return t&&t.attribute===s&&t.array===s?.array&&t.version===s?.version?t.source:s?.array??null}function d(e,t){let s=e.index;T.set(e,{source:t,attribute:s,array:s?.array,version:s?.version})}var w=!1,p=new WeakMap,c=new WeakMap,M=new WeakMap;function F(){w||(C.prototype.raycast=g,w=!0)}function H(e){let t=new Set;return e.traverse(s=>{let a=s.geometry;!a||!a.attributes?.position||t.add(a)}),[...t]}function L(e){let t=0;for(let s of e){let a=s.index?s.index.count:s.attributes.position.count;t+=a/3}return t}var P=12e6;function ie(e){return j(e)>P}function j(e){let t=new Set;return e.traverse(s=>{let a=s.geometry;a?.attributes?.position&&t.add(a)}),L([...t])}function V(e,t){let s=b(t);return new Promise((a,n)=>{let r=m=>{let u=m.data;if(!u||!u.error&&!u.serialized)return;if(e.removeEventListener("message",r),e.removeEventListener("error",o),u.error){n(new Error(String(u.error)));return}let{serialized:f}=u,x=E.deserialize(f,t,{setIndex:!1});f.index&&(t.index?t.index.array=f.index:t.setIndex(new I(f.index,1,!1))),d(t,s),t.boundingBox=x.getBoundingBox(new A),a(x)},o=m=>{e.removeEventListener("message",r),e.removeEventListener("error",o),n(new Error(m.message||"BVH worker error"))};e.addEventListener("message",r),e.addEventListener("error",o);let i=t.index?t.index.array.slice():null,l=t.attributes.position.array.slice(),R=[l,...i?[i]:[]].map(m=>m.buffer);e.postMessage({index:i,position:l,options:{groups:[...t.groups]}},R)})}async function U(){if(typeof window>"u"||typeof Worker>"u")return null;try{let{bvhWorkerCode:e}=await import("./bvhWorkerCode-6366A3UC.mjs"),t=new Blob([e],{type:"text/javascript"}),s=URL.createObjectURL(t),a=new Worker(s);return{worker:a,dispose:()=>{a.terminate(),URL.revokeObjectURL(s)}}}catch{return null}}async function _(e,t){if(t)try{return await V(t,e)}catch{}let s=b(e)?.slice()??null,a=O.call(e);return d(e,s),e.boundsTree=void 0,await new Promise(n=>setTimeout(n,0)),a}async function N(e,t,s){if(e.boundsTree)return;if(t.buildPromise)return t.buildPromise;let a=(async()=>{let n=await s();t.references>0&&!e.boundsTree&&(e.boundsTree=n,t.ownedTree=n)})();return t.buildPromise=a.finally(()=>{t.buildPromise=void 0,t.references===0&&p.delete(e)}),t.buildPromise}function oe(e,t){let s=K(e,t);return M.set(e,s),s}async function ue(e){let t=M.get(e);if(!t)return!1;await t;let s=c.get(e);return!!(s?.length&&s.every(a=>a.boundsTree))}async function K(e,t){if(t?.aborted)return;let s=c.get(e);if(!s){if(s=H(e),L(s)>P){c.set(e,[]);return}c.set(e,s);for(let n of s){let r=p.get(n)??{references:0};r.references+=1,p.set(n,r)}}if(s.length===0)return;F();let a=await U();if(t?.aborted){a?.dispose();return}try{for(let n of s){if(t?.aborted)return;let r=p.get(n);r&&await N(n,r,()=>_(n,a?.worker))}}finally{a?.dispose()}}function pe(e){M.delete(e);let t=c.get(e);if(t){c.delete(e);for(let s of t){let a=p.get(s);a&&(a.references=Math.max(0,a.references-1),!(a.references>0)&&(a.ownedTree&&s.boundsTree===a.ownedTree&&(W.call(s),s.boundsTree=void 0),a.ownedTree=void 0,a.buildPromise||p.delete(s)))}}}import{useGLTF as me}from"@react-three/drei";import{useThree as he}from"@react-three/fiber";import{useMemo as de}from"react";import{SRGBColorSpace as X}from"three";import{DRACOLoader as q,MeshoptDecoder as z}from"three-stdlib";function Z(e){return{name:"RI_unlit_emissive_texture",async afterRoot(t){let s=e.json.materials??[],a=new Map;if(s.forEach(r=>{let o=!!r?.extensions?.KHR_materials_unlit,i=!!r?.pbrMetallicRoughness?.baseColorTexture;o&&!i&&r?.emissiveTexture&&r.name&&a.set(r.name,r.emissiveTexture.index)}),a.size===0||!t.scene)return;let n=new Map;await Promise.all([...a].map(async([r,o])=>{let i=await e.getDependency("texture",o);i&&(i.colorSpace=X,n.set(r,i))})),t.scene.traverse(r=>{let o=Array.isArray(r.material)?r.material:r.material?[r.material]:[];for(let i of o){let l=i.name?n.get(i.name):void 0;l&&!i.map&&(i.map=l,i.needsUpdate=!0)}})}}}var J="https://assets.react-immersive.liveroom.dev/three-r184/draco/",Q="https://assets.react-immersive.liveroom.dev/three-r184/basis/",k=new Map,G=new WeakMap;function Y(e){let t=k.get(e);return t||(t=new q,t.setDecoderPath(e),k.set(e,t)),t}function $(e,t){let s=G.get(t);s||(s=new Map,G.set(t,s));let a=s.get(e);return a||(a=new y(e,t),s.set(e,a)),a}var y=class{constructor(t,s){this.transcoderPath=t;this.gl=s;this.real=null}loader(){return this.real??(this.real=import("three/examples/jsm/loaders/KTX2Loader.js").then(({KTX2Loader:t})=>new t().setTranscoderPath(this.transcoderPath).detectSupport(this.gl))),this.real}load(t,s,a,n){this.loader().then(r=>r.load(t,s,a,n),r=>n?.(r))}dispose(){this.real?.then(t=>t.dispose())}};function ve(e,t={},s){let{dracoDecoderPath:a=J,ktx2TranscoderPath:n=Q,meshopt:r=!0}=t;a&&e.setDRACOLoader(Y(a)),r&&e.setMeshoptDecoder(z),n&&s&&e.setKTX2Loader($(n,s)),e.register((o=>Z(o)))}function xe(e){for(let t=e;t;t=t.parent)if(!t.visible)return!1;return!0}import{Color as v,MeshPhysicalMaterial as ee,MeshStandardMaterial as te,Texture as D}from"three";function we(e){if(S(e))return e;if(!e||typeof e!="object")return null;let t=e,s=new te;typeof t.name=="string"&&(s.name=t.name),s.metalness=0,s.roughness=1,t.type==="MeshBasicMaterial"||t.isMeshBasicMaterial===!0?(s.color.set(0),s.emissiveIntensity=1,t.map instanceof D?(s.emissiveMap=t.map,s.emissive.set(16777215)):t.color instanceof v&&s.emissive.copy(t.color)):(t.color instanceof v&&s.color.copy(t.color),t.map instanceof D&&(s.map=t.map),t.emissive instanceof v&&s.emissive.copy(t.emissive),t.emissiveMap instanceof D&&(s.emissiveMap=t.emissiveMap));let n=["aoMap","aoMapIntensity","lightMap","lightMapIntensity","alphaMap","opacity","transparent","alphaTest","side","vertexColors","wireframe","depthTest","depthWrite","visible","toneMapped","fog"];for(let r of n)t[r]!==void 0&&(s[r]=t[r]);return s.needsUpdate=!0,s}function Le(e){if(B(e))return e.clone();let t=new ee;return t.name=e.name,t.color.copy(e.color),t.map=e.map,t.lightMap=e.lightMap,t.lightMapIntensity=e.lightMapIntensity,t.aoMap=e.aoMap,t.aoMapIntensity=e.aoMapIntensity,t.emissive.copy(e.emissive),t.emissiveIntensity=e.emissiveIntensity,t.emissiveMap=e.emissiveMap,t.bumpMap=e.bumpMap,t.bumpScale=e.bumpScale,t.normalMap=e.normalMap,t.normalMapType=e.normalMapType,t.normalScale.copy(h(e.normalScale)),t.displacementMap=e.displacementMap,t.displacementScale=e.displacementScale,t.displacementBias=e.displacementBias,t.roughness=e.roughness,t.roughnessMap=e.roughnessMap,t.metalness=e.metalness,t.metalnessMap=e.metalnessMap,t.alphaMap=e.alphaMap,t.envMap=e.envMap,t.envMapRotation.copy(e.envMapRotation),t.envMapIntensity=e.envMapIntensity,t.wireframe=e.wireframe,t.wireframeLinewidth=e.wireframeLinewidth,t.flatShading=e.flatShading,t.fog=e.fog,t.opacity=e.opacity,t.transparent=e.transparent,t.alphaHash=e.alphaHash,t.blendSrc=e.blendSrc,t.blendDst=e.blendDst,t.blendEquation=e.blendEquation,t.blendSrcAlpha=e.blendSrcAlpha,t.blendDstAlpha=e.blendDstAlpha,t.blendEquationAlpha=e.blendEquationAlpha,t.blending=e.blending,t.premultipliedAlpha=e.premultipliedAlpha,t.dithering=e.dithering,t.alphaTest=e.alphaTest,t.depthTest=e.depthTest,t.depthWrite=e.depthWrite,t.colorWrite=e.colorWrite,t.stencilWrite=e.stencilWrite,t.stencilWriteMask=e.stencilWriteMask,t.stencilFunc=e.stencilFunc,t.stencilRef=e.stencilRef,t.stencilFuncMask=e.stencilFuncMask,t.stencilFail=e.stencilFail,t.stencilZFail=e.stencilZFail,t.stencilZPass=e.stencilZPass,t.side=e.side,t.shadowSide=e.shadowSide,t.toneMapped=e.toneMapped,t.vertexColors=e.vertexColors,t.visible=e.visible,t.clippingPlanes=e.clippingPlanes,t.clipIntersection=e.clipIntersection,t.clipShadows=e.clipShadows,t.forceSinglePass=e.forceSinglePass,t.polygonOffset=e.polygonOffset,t.polygonOffsetFactor=e.polygonOffsetFactor,t.polygonOffsetUnits=e.polygonOffsetUnits,t}function Pe(e){e.userData.baseColor=e.color.clone(),e.userData.baseMap=e.map??null,e.userData.baseVertexColors=e.vertexColors,e.userData.baseMetalness=e.metalness,e.userData.baseMetalnessMap=e.metalnessMap??null,e.userData.baseRoughness=e.roughness,e.userData.baseRoughnessMap=e.roughnessMap??null,e.userData.baseEmissive=e.emissive.clone(),e.userData.baseEmissiveIntensity=e.emissiveIntensity,e.userData.baseEmissiveMap=e.emissiveMap??null,e.userData.baseOpacity=e.opacity,e.userData.baseTransparent=e.transparent,e.userData.baseAlphaMap=e.alphaMap??null,e.userData.baseAlphaTest=e.alphaTest,e.userData.baseAlphaHash=e.alphaHash,e.userData.baseDithering=e.dithering,e.userData.baseBlending=e.blending,e.userData.baseDepthWrite=e.depthWrite,e.userData.baseSide=e.side,e.userData.baseNormalMap=e.normalMap??null,e.userData.baseNormalScale=h(e.normalScale),e.userData.baseBumpMap=e.bumpMap??null,e.userData.baseBumpScale=e.bumpScale,e.userData.baseAoMap=e.aoMap??null,e.userData.baseAoMapIntensity=e.aoMapIntensity,e.userData.baseDisplacementMap=e.displacementMap??null,e.userData.baseDisplacementScale=e.displacementScale,e.userData.baseDisplacementBias=e.displacementBias,e.userData.baseClearcoat=e.clearcoat,e.userData.baseClearcoatMap=e.clearcoatMap??null,e.userData.baseClearcoatRoughness=e.clearcoatRoughness,e.userData.baseClearcoatRoughnessMap=e.clearcoatRoughnessMap??null,e.userData.baseClearcoatNormalMap=e.clearcoatNormalMap??null,e.userData.baseClearcoatNormalScale=h(e.clearcoatNormalScale),e.userData.baseSheen=e.sheen,e.userData.baseSheenColor=e.sheenColor.clone(),e.userData.baseSheenColorMap=e.sheenColorMap??null,e.userData.baseSheenRoughness=e.sheenRoughness,e.userData.baseSheenRoughnessMap=e.sheenRoughnessMap??null,e.userData.baseAnisotropy=e.anisotropy,e.userData.baseAnisotropyRotation=e.anisotropyRotation,e.userData.baseAnisotropyMap=e.anisotropyMap??null,e.userData.baseTransmission=e.transmission,e.userData.baseTransmissionMap=e.transmissionMap??null,e.userData.baseThickness=e.thickness,e.userData.baseThicknessMap=e.thicknessMap??null,e.userData.baseAttenuationColor=e.attenuationColor.clone(),e.userData.baseAttenuationDistance=e.attenuationDistance,e.userData.baseReflectivity=e.reflectivity,e.userData.baseSpecularIntensity=e.specularIntensity,e.userData.baseSpecularIntensityMap=e.specularIntensityMap??null,e.userData.baseSpecularColor=e.specularColor.clone(),e.userData.baseSpecularColorMap=e.specularColorMap??null,e.userData.baseFlatShading=e.flatShading,e.userData.baseEnvMapIntensity=e.envMapIntensity}export{b as a,P as b,ie as c,j as d,oe as e,ue as f,pe as g,xe as h,J as i,Q as j,ve as k,we as l,Le as m,Pe as n};
@@ -0,0 +1 @@
1
+ import{a as i}from"./chunk-MMO7KCYU.mjs";import{p as n}from"./chunk-LU3BQ7WG.mjs";var c={licenseKey:!0,onLicenseStatusChange:!0,arHandoff:!0,mobileHandoffUrl:!0,dracoDecoderPath:!0,ktx2TranscoderPath:!0,meshopt:!0,hideLicenseCheckingOverlay:!0},s={licenseValidationUrl:!0,arLanding:!0,gizmoTool:!0,showFloorGrid:!0,onObjectEditLeaseChange:!0,onSelectionClear:!0,onEmptyCanvasClick:!0,onSceneLoaded:!0,onTexturePositioningChange:!0,endTexturePositioningRef:!0};function u(e,t){let o={};for(let r of Object.keys(t))r in e&&(o[r]=e[r]);return o}function d(e,t){let o={...e};for(let r of Object.keys(t))delete o[r];return o}import{jsx as l}from"react/jsx-runtime";function a(e){return i("model-viewer","ModelViewer"),l(n,{...d(e,s)})}export{c as a,u as b,a as c};
@@ -0,0 +1 @@
1
+ import{b as l}from"./chunk-3GA7JFNH.mjs";import{b as c}from"./chunk-3PLML3PO.mjs";import{useSyncExternalStore as S}from"react";import{Pause as q,Play as b,Square as y}from"lucide-react";import{jsx as a,jsxs as o}from"react/jsx-runtime";var f={sequenceId:null,time:0,duration:0,status:"stopped",previewing:!1,ready:!1,issues:[]},p=()=>f,g=()=>()=>{};function d(t){return S(t?.subscribe??g,t?.getState??p,p)}function P({controls:t,duration:n,showScrubber:r=!0,hasTracks:s=!0}){let e=l(),u=d(t),i=u.status==="playing";return o("div",{className:"ri-sequenceTransport",children:[a("button",{type:"button",onClick:()=>i?t?.pause():t?.play(),disabled:!u.ready||!n||!s,"aria-label":e(i?"sequencePause":"sequencePlay"),title:e(i?"sequencePause":"sequencePlay"),children:a("span",{"aria-hidden":"true",children:i?a(q,{size:15}):a(b,{size:15})})}),a("button",{type:"button",onClick:()=>t?.stop(),disabled:!u.previewing,"aria-label":e("sequenceStop"),title:e("sequenceStop"),children:a(y,{size:14,"aria-hidden":"true"})}),r&&a("input",{"aria-label":e("sequencePlayhead"),type:"range",min:0,max:n||1,step:.01,value:Math.min(u.time,n),disabled:!u.ready||!n,onChange:m=>{t?.pause(),t?.seek(Number(m.target.value))}}),o("output",{"aria-label":e("sequenceTime"),children:[u.time.toFixed(2)," / ",n.toFixed(2),"s"]})]})}function C({controls:t,sequences:n}){let r=l(),s=d(t);return n.length?o("section",{className:"ri-sequencePlayer","aria-label":r("sequencePlayer"),onPointerDown:e=>e.stopPropagation(),children:[a(c,{"aria-label":r("sequenceSelect"),value:s.sequenceId??"",onChange:e=>t.select(e.target.value),children:n.map(e=>a("option",{value:e.id,children:e.name},e.id))}),a(P,{controls:t,duration:s.duration,hasTracks:n.find(e=>e.id===s.sequenceId)?.tracks.some(e=>!e.muted&&e.keyframes.length>0)??!1}),!!s.issues.length&&o("details",{children:[a("summary",{children:r("sequenceIssues")}),s.issues.map(e=>a("p",{children:e},e))]})]}):null}export{d as a,P as b,C as c};
@@ -1,4 +1,4 @@
1
- import{b as oe}from"./chunk-NMRTI3NQ.mjs";import{b as ce}from"./chunk-2AJK643D.mjs";import{i as de}from"./chunk-RKDATTUM.mjs";import{a as F,c as le,d as ue}from"./chunk-KFLS7GI6.mjs";import{b as re}from"./chunk-UAZ6I25Y.mjs";import{e as ie,f as se,g as ae}from"./chunk-BNKTI3CY.mjs";import{a as te,e as ne}from"./chunk-RXZ4Q7CY.mjs";var fe;function pe(e){fe=e}function x(e){fe?.(e)}import{strFromU8 as pt,strToU8 as mt,unzip as bt}from"fflate";var gt=[".glb",".gltf",".obj",".fbx",".usdz",".stl",".ply",".zip"],ht=["model/gltf-binary","model/gltf+json","model/vnd.usdz+zip","application/vnd.usdz+zip","application/zip","application/x-zip-compressed"],M=1024*1024,me=128*M,be=1024,ge=128*M,he=256*M,ve=200,vt=M,g=new Map,nr=".glb,.gltf,.obj,.fbx,.usdz,.stl,.ply,.zip,model/gltf-binary,model/gltf+json,model/vnd.usdz+zip,application/vnd.usdz+zip,application/zip";function S(e){let t=e.split(/[?#]/,1)[0].toLowerCase();return t.endsWith(".obj")?"obj":t.endsWith(".fbx")?"fbx":t.endsWith(".usdz")?"usdz":t.endsWith(".stl")?"stl":t.endsWith(".ply")?"ply":t.endsWith(".gltf")?"gltf":"glb"}function Me(e){return g.get(e)??{format:S(e)}}function yt(e){let t=e.name.toLowerCase();return gt.some(n=>t.endsWith(n))||ht.includes(e.type)}async function rr(e){if(!yt(e))throw new Error("Unsupported model file. Please upload a .glb, .gltf, .obj, .fbx, .usdz, .stl, .ply, or .zip asset.");let t=e.name.toLowerCase();if(t.endsWith(".usdz")||e.type==="model/vnd.usdz+zip"||e.type==="application/vnd.usdz+zip")return ye(e,"usdz");if(t.endsWith(".zip")||wt(e.type))return xt(e);if(t.endsWith(".gltf")||e.type==="model/gltf+json")return we(e);let n=S(e.name);return n==="gltf"?we(e):ye(e,n)}function ye(e,t){let n=URL.createObjectURL(e);return g.set(n,{format:t,entryPath:e.name,sourceBytes:e.size}),{url:n,name:e.name,format:t,cleanup:()=>{x(n),g.delete(n),URL.revokeObjectURL(n)}}}function wt(e){return e==="application/zip"||e==="application/x-zip-compressed"}async function we(e){let t=await e.text(),n=Se(t,e.name);for(let o of Ee(n))if(!I(o))throw new Error(`${e.name} references external assets. Upload a .zip containing the .gltf file and its dependencies.`);let r=URL.createObjectURL(e);return g.set(r,{format:"gltf",entryPath:e.name,sourceBytes:e.size}),{url:r,name:e.name,format:"gltf",cleanup:()=>{x(r),g.delete(r),URL.revokeObjectURL(r)}}}async function xt(e){if(e.size>me)throw new Error(`Model zip is too large. The compressed archive must be ${U(me)} or smaller.`);let t=await Mt(new Uint8Array(await e.arrayBuffer())),n=new Map;for(let[i,a]of Object.entries(t)){let l=D(i);!l||Le(l)||n.set(l,a)}let r=[...n.keys()].filter(i=>/\.(gltf|obj|fbx|stl|ply)$/i.test(i));if(r.length===0)throw new Error("Invalid model zip: no .gltf, .obj, .fbx, .stl, or .ply file found.");if(r.length>1)throw new Error("Invalid model zip: multiple model entry files found.");let o=r[0],s=S(o);if(s==="gltf")return Et(e,o,n);if(s==="obj"||s==="fbx"||s==="stl"||s==="ply")return St(e,o,s,n);throw new Error(`Unsupported model entry ${o}.`)}function Mt(e){return new Promise((t,n)=>{let r=0,o=0,s=null,i=l=>(s??(s=new Error(`Invalid model zip: ${l}`)),!1);bt(e,{filter:l=>{if(s)return!1;if(r+=1,r>be)return i(`archive contains more than ${be.toLocaleString()} entries.`);if(l.originalSize>ge)return i(`${l.name} expands beyond the ${U(ge)} per-file limit.`);if(o+=l.originalSize,o>he)return i(`expanded contents exceed ${U(he)}.`);if(l.originalSize>=vt&&(l.size===0||l.originalSize/l.size>ve))return i(`${l.name} exceeds the ${ve}:1 compression-ratio limit.`);let u=D(l.name);return!!u&&!Le(u)}},(l,u)=>{s?n(s):l?n(new Error(`Invalid model zip: ${l.message}`)):t(u)})})}function U(e){return`${e/M} MiB`}function St(e,t,n,r){let o=[],s={};for(let[a,l]of r){let u=URL.createObjectURL(new Blob([l],{type:Pe(a)}));o.push(u),s[a]=u}let i=s[t];if(!i)throw o.forEach(a=>URL.revokeObjectURL(a)),new Error(`Invalid model zip: could not read ${t}.`);return g.set(i,{format:n,entryPath:t,resourceUrls:s}),{url:i,name:e.name,format:n,cleanup:()=>{x(i),g.delete(i),o.forEach(a=>URL.revokeObjectURL(a))}}}function Et(e,t,n){let r=n.get(t);if(!r)throw new Error("Invalid GLTF zip: no .gltf found.");let o=Se(pt(r),t);Lt(o,t);let s=Pt(t),i=[];try{xe(o.buffers,s,n,i),xe(o.images,s,n,i);let a=new Blob([mt(JSON.stringify(o))],{type:"model/gltf+json"}),l=URL.createObjectURL(a);return i.push(l),g.set(l,{format:"gltf",entryPath:t}),{url:l,name:e.name,format:"gltf",cleanup:()=>{x(l),g.delete(l),i.forEach(u=>URL.revokeObjectURL(u))}}}catch(a){throw i.forEach(l=>URL.revokeObjectURL(l)),a}}function xe(e,t,n,r){for(let o of e??[]){if(typeof o.uri!="string"||I(o.uri))continue;let s=Rt(t,o.uri),i=n.get(s);if(!i)throw new Error(`Invalid GLTF zip: missing referenced asset ${o.uri}.`);let a=URL.createObjectURL(new Blob([i],{type:Pe(s)}));r.push(a),o.uri=a}}function Se(e,t){try{return JSON.parse(e)}catch{throw new Error(`${t} is not a valid .gltf JSON file.`)}}function Ee(e){return[...e.buffers??[],...e.images??[]].map(t=>t.uri).filter(t=>typeof t=="string"&&t.length>0)}function Lt(e,t){for(let n of Ee(e)){if(I(n))continue;let r=/^[a-z][a-z0-9+.-]*:/i.test(n),o=n.startsWith("/")||n.startsWith("\\");if(r||o)throw new Error(`${t} references external assets. Include every dependency inside the uploaded .zip.`)}}function I(e){return e.startsWith("data:")}function D(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(r=>r&&r!==".")){if(n===".."){t.pop();continue}t.push(n)}return t.join("/")}function Le(e){let t=e.split("/");return e.endsWith("/")||t.includes("__MACOSX")||t.some(n=>n===".DS_Store"||n.startsWith("._"))}function Pt(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t)}function Rt(e,t){let n=t.split(/[?#]/)[0],r=At(n);return D(e?`${e}/${r}`:r)}function At(e){try{return decodeURI(e)}catch{return e}}function Pe(e){let t=e.toLowerCase();return t.endsWith(".obj")||t.endsWith(".mtl")?"text/plain":t.endsWith(".fbx")?"application/octet-stream":t.endsWith(".usdz")?"model/vnd.usdz+zip":t.endsWith(".bin")?"application/octet-stream":t.endsWith(".png")?"image/png":t.endsWith(".jpg")||t.endsWith(".jpeg")?"image/jpeg":t.endsWith(".webp")?"image/webp":t.endsWith(".avif")?"image/avif":t.endsWith(".ktx2")?"image/ktx2":"application/octet-stream"}import{useEffect as j,useMemo as zt,useRef as Ct,useState as Ot}from"react";import{Box3 as Ce,Color as G,DoubleSide as kt,ShaderMaterial as Bt,Vector3 as Tt}from"three";import{useThree as Ft}from"@react-three/fiber";var Re="riEditorGizmo",N=new WeakMap;function Ae(e){return e.userData[Re]=!0,e}function ar(e,t){let n=N.get(e);return n||(n=new Set,N.set(e,n)),n.add(t),()=>{n.delete(t)}}function lr(e){let t=[],n=r=>{r.visible=!1,t.push(r)};return e.traverse(r=>{r.visible&&r.userData[Re]&&n(r)}),N.get(e)?.forEach(r=>{r.visible&&n(r)}),()=>{for(let r of t)r.visible=!0}}function ze(e){return!Number.isFinite(e)||e<=0?1:10**Math.floor(Math.log10(e/10))}import{jsx as Oe}from"react/jsx-runtime";var Ut=`
1
+ import{b as oe}from"./chunk-3GA7JFNH.mjs";import{b as ce}from"./chunk-2AJK643D.mjs";import{k as de}from"./chunk-5C4H7SRF.mjs";import{a as F,c as le,d as ue}from"./chunk-KFLS7GI6.mjs";import{b as re}from"./chunk-3I7PPFUV.mjs";import{e as ie,f as se,g as ae}from"./chunk-BNKTI3CY.mjs";import{a as te,e as ne}from"./chunk-RXZ4Q7CY.mjs";var fe;function pe(e){fe=e}function x(e){fe?.(e)}import{strFromU8 as pt,strToU8 as mt,unzip as bt}from"fflate";var gt=[".glb",".gltf",".obj",".fbx",".usdz",".stl",".ply",".zip"],ht=["model/gltf-binary","model/gltf+json","model/vnd.usdz+zip","application/vnd.usdz+zip","application/zip","application/x-zip-compressed"],M=1024*1024,me=128*M,be=1024,ge=128*M,he=256*M,ve=200,vt=M,g=new Map,rr=".glb,.gltf,.obj,.fbx,.usdz,.stl,.ply,.zip,model/gltf-binary,model/gltf+json,model/vnd.usdz+zip,application/vnd.usdz+zip,application/zip";function S(e){let t=e.split(/[?#]/,1)[0].toLowerCase();return t.endsWith(".obj")?"obj":t.endsWith(".fbx")?"fbx":t.endsWith(".usdz")?"usdz":t.endsWith(".stl")?"stl":t.endsWith(".ply")?"ply":t.endsWith(".gltf")?"gltf":"glb"}function Me(e){return g.get(e)??{format:S(e)}}function yt(e){let t=e.name.toLowerCase();return gt.some(n=>t.endsWith(n))||ht.includes(e.type)}async function or(e){if(!yt(e))throw new Error("Unsupported model file. Please upload a .glb, .gltf, .obj, .fbx, .usdz, .stl, .ply, or .zip asset.");let t=e.name.toLowerCase();if(t.endsWith(".usdz")||e.type==="model/vnd.usdz+zip"||e.type==="application/vnd.usdz+zip")return ye(e,"usdz");if(t.endsWith(".zip")||wt(e.type))return xt(e);if(t.endsWith(".gltf")||e.type==="model/gltf+json")return we(e);let n=S(e.name);return n==="gltf"?we(e):ye(e,n)}function ye(e,t){let n=URL.createObjectURL(e);return g.set(n,{format:t,entryPath:e.name,sourceBytes:e.size}),{url:n,name:e.name,format:t,cleanup:()=>{x(n),g.delete(n),URL.revokeObjectURL(n)}}}function wt(e){return e==="application/zip"||e==="application/x-zip-compressed"}async function we(e){let t=await e.text(),n=Se(t,e.name);for(let o of Ee(n))if(!I(o))throw new Error(`${e.name} references external assets. Upload a .zip containing the .gltf file and its dependencies.`);let r=URL.createObjectURL(e);return g.set(r,{format:"gltf",entryPath:e.name,sourceBytes:e.size}),{url:r,name:e.name,format:"gltf",cleanup:()=>{x(r),g.delete(r),URL.revokeObjectURL(r)}}}async function xt(e){if(e.size>me)throw new Error(`Model zip is too large. The compressed archive must be ${U(me)} or smaller.`);let t=await Mt(new Uint8Array(await e.arrayBuffer())),n=new Map;for(let[i,a]of Object.entries(t)){let l=D(i);!l||Le(l)||n.set(l,a)}let r=[...n.keys()].filter(i=>/\.(gltf|obj|fbx|stl|ply)$/i.test(i));if(r.length===0)throw new Error("Invalid model zip: no .gltf, .obj, .fbx, .stl, or .ply file found.");if(r.length>1)throw new Error("Invalid model zip: multiple model entry files found.");let o=r[0],s=S(o);if(s==="gltf")return Et(e,o,n);if(s==="obj"||s==="fbx"||s==="stl"||s==="ply")return St(e,o,s,n);throw new Error(`Unsupported model entry ${o}.`)}function Mt(e){return new Promise((t,n)=>{let r=0,o=0,s=null,i=l=>(s??(s=new Error(`Invalid model zip: ${l}`)),!1);bt(e,{filter:l=>{if(s)return!1;if(r+=1,r>be)return i(`archive contains more than ${be.toLocaleString()} entries.`);if(l.originalSize>ge)return i(`${l.name} expands beyond the ${U(ge)} per-file limit.`);if(o+=l.originalSize,o>he)return i(`expanded contents exceed ${U(he)}.`);if(l.originalSize>=vt&&(l.size===0||l.originalSize/l.size>ve))return i(`${l.name} exceeds the ${ve}:1 compression-ratio limit.`);let u=D(l.name);return!!u&&!Le(u)}},(l,u)=>{s?n(s):l?n(new Error(`Invalid model zip: ${l.message}`)):t(u)})})}function U(e){return`${e/M} MiB`}function St(e,t,n,r){let o=[],s={};for(let[a,l]of r){let u=URL.createObjectURL(new Blob([l],{type:Pe(a)}));o.push(u),s[a]=u}let i=s[t];if(!i)throw o.forEach(a=>URL.revokeObjectURL(a)),new Error(`Invalid model zip: could not read ${t}.`);return g.set(i,{format:n,entryPath:t,resourceUrls:s}),{url:i,name:e.name,format:n,cleanup:()=>{x(i),g.delete(i),o.forEach(a=>URL.revokeObjectURL(a))}}}function Et(e,t,n){let r=n.get(t);if(!r)throw new Error("Invalid GLTF zip: no .gltf found.");let o=Se(pt(r),t);Lt(o,t);let s=Pt(t),i=[];try{xe(o.buffers,s,n,i),xe(o.images,s,n,i);let a=new Blob([mt(JSON.stringify(o))],{type:"model/gltf+json"}),l=URL.createObjectURL(a);return i.push(l),g.set(l,{format:"gltf",entryPath:t}),{url:l,name:e.name,format:"gltf",cleanup:()=>{x(l),g.delete(l),i.forEach(u=>URL.revokeObjectURL(u))}}}catch(a){throw i.forEach(l=>URL.revokeObjectURL(l)),a}}function xe(e,t,n,r){for(let o of e??[]){if(typeof o.uri!="string"||I(o.uri))continue;let s=At(t,o.uri),i=n.get(s);if(!i)throw new Error(`Invalid GLTF zip: missing referenced asset ${o.uri}.`);let a=URL.createObjectURL(new Blob([i],{type:Pe(s)}));r.push(a),o.uri=a}}function Se(e,t){try{return JSON.parse(e)}catch{throw new Error(`${t} is not a valid .gltf JSON file.`)}}function Ee(e){return[...e.buffers??[],...e.images??[]].map(t=>t.uri).filter(t=>typeof t=="string"&&t.length>0)}function Lt(e,t){for(let n of Ee(e)){if(I(n))continue;let r=/^[a-z][a-z0-9+.-]*:/i.test(n),o=n.startsWith("/")||n.startsWith("\\");if(r||o)throw new Error(`${t} references external assets. Include every dependency inside the uploaded .zip.`)}}function I(e){return e.startsWith("data:")}function D(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(r=>r&&r!==".")){if(n===".."){t.pop();continue}t.push(n)}return t.join("/")}function Le(e){let t=e.split("/");return e.endsWith("/")||t.includes("__MACOSX")||t.some(n=>n===".DS_Store"||n.startsWith("._"))}function Pt(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t)}function At(e,t){let n=t.split(/[?#]/)[0],r=Rt(n);return D(e?`${e}/${r}`:r)}function Rt(e){try{return decodeURI(e)}catch{return e}}function Pe(e){let t=e.toLowerCase();return t.endsWith(".obj")||t.endsWith(".mtl")?"text/plain":t.endsWith(".fbx")?"application/octet-stream":t.endsWith(".usdz")?"model/vnd.usdz+zip":t.endsWith(".bin")?"application/octet-stream":t.endsWith(".png")?"image/png":t.endsWith(".jpg")||t.endsWith(".jpeg")?"image/jpeg":t.endsWith(".webp")?"image/webp":t.endsWith(".avif")?"image/avif":t.endsWith(".ktx2")?"image/ktx2":"application/octet-stream"}import{useEffect as j,useMemo as zt,useRef as Ct,useState as Ot}from"react";import{Box3 as Ce,Color as G,DoubleSide as kt,ShaderMaterial as Bt,Vector3 as Tt}from"three";import{useThree as Ft}from"@react-three/fiber";var Ae="riEditorGizmo",N=new WeakMap;function Re(e){return e.userData[Ae]=!0,e}function cr(e,t){let n=N.get(e);return n||(n=new Set,N.set(e,n)),n.add(t),()=>{n.delete(t)}}function dr(e){let t=[],n=r=>{r.visible=!1,t.push(r)};return e.traverse(r=>{r.visible&&r.userData[Ae]&&n(r)}),N.get(e)?.forEach(r=>{r.visible&&n(r)}),()=>{for(let r of t)r.visible=!0}}function ze(e){return!Number.isFinite(e)||e<=0?1:10**Math.floor(Math.log10(e/10))}import{jsx as Oe}from"react/jsx-runtime";var Ut=`
2
2
  varying vec3 vWorld;
3
3
  void main() {
4
4
  vec4 world = modelMatrix * vec4(position, 1.0);
@@ -44,4 +44,4 @@ import{b as oe}from"./chunk-NMRTI3NQ.mjs";import{b as ce}from"./chunk-2AJK643D.m
44
44
  gl_FragColor = vec4(color, uLinearTarget ? pow(alpha, 2.2) : alpha);
45
45
  #include <colorspace_fragment>
46
46
  }
47
- `,Dt=()=>{};function hr({getTarget:e,revision:t,lineColor:n}){let r=Ft(c=>c.invalidate),[o,s]=Ot({y:0,size:10}),i=Ct(null);j(()=>{i.current&&Ae(i.current)},[]),j(()=>{let c=e();if(!c)return;let d=c instanceof Ce?c:new Ce().setFromObject(c);if(d.isEmpty())return;let f=d.getSize(new Tt);s({y:d.min.y,size:Math.max(f.x,f.y,f.z)}),r()},[e,t,r]);let a=zt(()=>new Bt({vertexShader:Ut,fragmentShader:It,transparent:!0,depthWrite:!1,side:kt,uniforms:{uCell:{value:1},uMajor:{value:5},uFade:{value:100},uLinearTarget:{value:!1},uLine:{value:new G},uAxisX:{value:new G("#e5484d")},uAxisZ:{value:new G("#3e8bff")}}}),[]);j(()=>()=>a.dispose(),[a]);let l=ze(o.size);a.uniforms.uCell.value=l,a.uniforms.uMajor.value=l*5,a.uniforms.uFade.value=o.size*12,a.uniforms.uLine.value.set(n);let u=o.size*40;return Oe("mesh",{ref:i,rotation:[-Math.PI/2,0,0],position:[0,o.y-o.size*5e-4,0],raycast:Dt,renderOrder:-1,frustumCulled:!1,material:a,onBeforeRender:c=>{let d=c.getRenderTarget()!==null;a.uniforms.uLinearTarget.value!==d&&(a.uniforms.uLinearTarget.value=d,a.uniformsNeedUpdate=!0)},children:Oe("planeGeometry",{args:[u,u]})})}import{useThree as _}from"@react-three/fiber";import{useEffect as Fe}from"react";import{useEffect as Nt,useState as jt}from"react";function Te(e){return!!e?.isWebGPURenderer}var ke;function Gt(){return ke??(ke=(async()=>{let e=typeof navigator>"u"?void 0:navigator.gpu;if(!e)return!1;try{return!!await e.requestAdapter()}catch{return!1}})()),ke}var Be=!1;function xr(e){let[t,n]=jt(null);return Nt(()=>{if(!e)return;let r=!1;return Gt().then(o=>{r||(!o&&!Be&&(Be=!0,console.info("[react-immersive] WebGPU isn't available in this browser; using WebGL.")),n(o))}),()=>{r=!0}},[e]),e?t===null?null:t?"webgpu":"webgl":"webgl"}async function Mr(e){let{WebGPURenderer:t}=await import("three/webgpu"),n=new t({canvas:e.canvas,antialias:e.antialias??!0,alpha:e.alpha??!0});return await n.init(),n}function Rr({captureRef:e}){let{gl:t,scene:n,camera:r,invalidate:o,get:s}=_();return Fe(()=>{if(!e)return;let i=()=>{let a=s();a.advance(a.frameloop==="never"?a.clock.elapsedTime:performance.now())};return e.current={gl:t,scene:n,camera:r,invalidate:o,drawNow:i},()=>{e.current=null}},[e,t,n,r,o,s]),null}function Ar(){let e=_(n=>n.frameloop),t=_(n=>n.invalidate);return Fe(()=>{e!=="never"&&t()},[e,t]),null}function zr(e){e.dispose(),"forceContextLoss"in e&&!Te(e)&&(e.forceContextLoss(),e.forceContextLoss=()=>{})}function Cr(e){if(!e)return Promise.resolve(null);try{e.drawNow();let t=e.gl.domElement;return new Promise(n=>{t.toBlob(r=>n(r?URL.createObjectURL(r):null),"image/webp",.85)})}catch{return Promise.resolve(null)}}import{useEffect as Kt,useState as qt}from"react";import{useEffect as _t,useState as Ue}from"react";var Vt="200px",Ie=new Map;function De(e,t,n){let r=Ie.get(t);if(!r){let i=new Map;r={observer:new IntersectionObserver(l=>{for(let u of l)i.get(u.target)?.(u.isIntersecting)},{rootMargin:t}),watchers:i},Ie.set(t,r)}let{observer:o,watchers:s}=r;return s.set(e,n),o.observe(e),()=>{s.delete(e),o.unobserve(e)}}function Ne(e){let t=typeof IntersectionObserver<"u",[n,r]=Ue(!t),[o,s]=Ue(!t);return _t(()=>{let i=e.current;if(!i||!t)return;let a=De(i,Vt,r),l=De(i,"0px",s);return()=>{a(),l()}},[e,t]),{near:n,visible:o}}import{useEffect as je,useRef as Ge,useState as Zt}from"react";function V(){return typeof navigator>"u"?!1:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function Wt(){if(typeof navigator>"u")return!1;let e=navigator.userAgent;return/iPhone|iPad|iPod/i.test(e)?!0:navigator.platform==="MacIntel"&&typeof navigator.maxTouchPoints=="number"&&navigator.maxTouchPoints>1}function Tr(){return V()||Wt()}function $t(){if(typeof window>"u"||typeof navigator>"u")return!1;let e=i=>typeof window.matchMedia=="function"&&window.matchMedia(i).matches,t=e("(pointer: coarse)")||e("(any-pointer: coarse)"),n=e("(hover: none)")||e("(any-hover: none)"),r=navigator.maxTouchPoints>0,o=typeof window.screen<"u"&&Math.min(window.screen.width,window.screen.height)<=1024,s=V();return t||s||r&&n||r&&o}function W(){if(!$t())return!1;if(V())return!0;let e=navigator.deviceMemory;return!(typeof e=="number"&&e>=8)}function Fr(e="auto"){switch(e){case"high":return!1;case"low":return!0;default:return W()}}function Xt(e,t){let n=new Set,r=o=>{for(let s of o){if(n.size>=t)return;n.add(s.id)}};return r(e.filter(o=>o.wanted).sort((o,s)=>Number(s.visible)-Number(o.visible)||Number(s.live)-Number(o.live)||o.since-s.since)),r(e.filter(o=>!o.wanted&&o.live).sort((o,s)=>s.since-o.since)),n}var Ht=12,Jt=6,P=new Map,Yt=1,$=!1,_e;function Ve(){$||($=!0,queueMicrotask(()=>{$=!1,_e??(_e=W()?Jt:Ht);let e=Xt([...P.values()],_e);for(let t of P.values()){let n=e.has(t.id);n!==t.live&&(t.live=n,t.onLiveChange(n))}}))}function We({managed:e,wanted:t,visible:n,onPark:r}){let[o,s]=Zt(!1),i=Ge(r);i.current=r;let a=Ge(null);return je(()=>{if(!e)return;let l={id:Yt++,wanted:!1,visible:!1,live:!1,since:performance.now(),onLiveChange:u=>{u||i.current?.(),s(u)}};return P.set(l.id,l),a.current=l,()=>{P.delete(l.id),a.current=null,s(!1),Ve()}},[e]),je(()=>{let l=a.current;!l||l.wanted===t&&l.visible===n||(l.wanted!==t&&(l.since=performance.now()),l.wanted=t,l.visible=n,Ve())},[e,t,n]),e?o:t}function Vr({loading:e="lazy",reveal:t="auto",rootRef:n,onPark:r}){let{near:o,visible:s}=Ne(n),[i,a]=qt(t==="auto");return Kt(()=>{t==="auto"&&a(!0)},[t]),{live:We({managed:e==="lazy",wanted:i&&(e==="eager"||o),visible:s,onPark:r}),visible:s,awaitingReveal:!i,reveal:()=>a(!0)}}import{Box as Qt}from"lucide-react";import{jsx as Z,jsxs as $e}from"react/jsx-runtime";function en({src:e,hidden:t=!1}){return e?Z("img",{className:`ri-poster${t?" ri-poster--hidden":""}`,src:e,alt:"","aria-hidden":"true",draggable:!1,decoding:"async"}):null}function Yr({className:e,background:t,poster:n,onReveal:r}){let o=oe();return $e("div",{className:`${e} ri-viewerPlaceholder`,style:{background:t},children:[Z(en,{src:n}),r?$e("button",{type:"button",className:"ri-revealButton",onClick:r,children:[Z(Qt,{size:16,"aria-hidden":"true"}),o("viewIn3D")]}):null]})}import{Color as tn}from"three";function Ze(e){let t=new tn(0,0,0);try{t.setStyle(e,"srgb-linear")}catch{return!1}let n=[t.r,t.g,t.b].map(r=>r<=.04045?r/12.92:((r+.055)/1.055)**2.4);return .2126*n[0]+.7152*n[1]+.0722*n[2]>.3}function eo(e,t){if(e)return e;let n=t?.background;return n?.enabled&&n.type==="color"?n.color:"#1c1c1d"}var nn={glb:"GLB",gltf:"glTF",obj:"OBJ",fbx:"FBX",usdz:"USDZ",stl:"STL",ply:"PLY"},rn=/\.(glb|gltf|obj|fbx|usdz|stl|ply|zip)$/i;function on(e,t){let n=e?.response?.status;if(typeof n=="number")return n;let r=/responded with (\d{3})/.exec(t);return r?Number(r[1]):null}function io(e,t,n,r){let o=e instanceof Error?e.message:e==null?"":String(e),s=(f,p)=>re(r,f,p),i=s("loadErrorTitle"),a=o||null;if(ce(e))return{title:i,detail:s("loadErrorPointCloud"),technical:a};let l=on(e,o);if(l===404||l===410)return{title:i,detail:s("loadErrorNotFound",{status:l}),technical:a};if(l===401||l===403)return{title:i,detail:s("loadErrorDenied",{status:l}),technical:a};if(l!==null)return{title:i,detail:s("loadErrorStatus",{status:l}),technical:a};if(/failed to fetch|networkerror|load failed|network error/i.test(o))return{title:i,detail:s("loadErrorNetwork"),technical:a};if(/<!doctype|<html/i.test(o))return{title:i,detail:s("loadErrorHtml"),technical:a};let u=t.split(/[?#]/,1)[0],c=nn[n??S(t)],d=rn.test(u);return{title:i,detail:d||n?s(n?"loadErrorInvalidExplicitFormat":"loadErrorInvalidFile",{format:c}):s("loadErrorMissingFormat",{format:c}),technical:a}}import{useEffect as sn,useState as an}from"react";var X=80,ln=99,un=6e3,cn=200;function dn(e,t=0){let n=Math.min(Math.max(e,0),100);return n<100?n/100*X:X+(ln-X)*(1-Math.exp(-t/un))}function lo(e,t=!1){let n=e!==null&&e>=100&&!t,[r,o]=an(0);return sn(()=>{if(!n){o(0);return}let s=performance.now(),i=setInterval(()=>o(performance.now()-s),cn);return()=>clearInterval(i)},[n]),e===null?null:t?100:dn(e,r)}import{DataTexture as fn,DataUtils as Xe,EquirectangularReflectionMapping as pn,HalfFloatType as mn,LinearFilter as He,LinearSRGBColorSpace as bn,RGBAFormat as gn,Vector3 as y}from"three";var Je="neutral",hn=[{direction:[.62,.48,.62],size:[.38,.28],radiance:9},{direction:[-.75,.2,.55],size:[.32,.36],radiance:3.5},{direction:[0,1,0],size:[.55,.55],radiance:4},{direction:[.15,.3,-1],size:[.45,.16],radiance:5}],R=(e,t,n)=>{let r=Math.min(Math.max((n-e)/(t-e),0),1);return r*r*(3-2*r)},vn=hn.map(e=>{let t=new y(...e.direction).normalize(),n=Math.abs(t.y)>.9?new y(0,0,1):new y(0,1,0),r=new y().crossVectors(n,t).normalize(),o=new y().crossVectors(t,r).normalize();return{center:t,right:r,up:o,box:e}}),yn=.9;function wn(e){let t=e.y,n=.2+.18*R(-.35,.05,t)+.17*R(0,.9,t);for(let{center:r,right:o,up:s,box:i}of vn){let a=e.dot(r);if(a<=0)continue;let l=Math.abs(e.dot(o)/a)/i.size[0],u=Math.abs(e.dot(s)/a)/i.size[1],c=(1-R(.82,1,l))*(1-R(.82,1,u));n+=i.radiance*c}return n*yn}var H=null;function Ye(){if(H)return H;let e=512,t=256,n=new Uint16Array(e*t*4),r=new y;for(let s=0;s<t;s++){let i=((s+.5)/t-.5)*Math.PI;for(let a=0;a<e;a++){let l=((a+.5)/e-.5)*2*Math.PI;r.set(Math.cos(i)*Math.cos(l),Math.sin(i),Math.cos(i)*Math.sin(l));let u=Xe.toHalfFloat(wn(r)),c=(s*e+a)*4;n[c]=u,n[c+1]=u,n[c+2]=u,n[c+3]=Xe.toHalfFloat(1)}}let o=new fn(n,e,t,gn,mn);return o.mapping=pn,o.colorSpace=bn,o.magFilter=He,o.minFilter=He,o.generateMipmaps=!1,o.needsUpdate=!0,H=o,o}import{lazy as xn,useLayoutEffect as Mn}from"react";import{useThree as Ke}from"@react-three/fiber";import{jsx as J}from"react/jsx-runtime";var qe=xn(()=>import("./DownloadedEnvironment-NHM4U2LJ.mjs"));function go({preset:e,files:t,...n}){return!t&&e===Je?J(Sn,{...n}):t?J(qe,{files:t,...n}):J(qe,{preset:e,...n})}function Sn({background:e=!1,environmentIntensity:t=1,backgroundIntensity:n=1,backgroundBlurriness:r=0}){let o=Ke(i=>i.scene),s=Ke(i=>i.invalidate);return Mn(()=>{let i=Ye(),a={environment:o.environment,environmentIntensity:o.environmentIntensity,background:o.background,backgroundIntensity:o.backgroundIntensity,backgroundBlurriness:o.backgroundBlurriness};return o.environment=i,o.environmentIntensity=t,e&&(o.background=i,o.backgroundIntensity=n,o.backgroundBlurriness=r),s(),()=>{Object.assign(o,a),s()}},[o,s,e,t,n,r]),null}import{useFrame as Y,useThree as h}from"@react-three/fiber";import{ContactShadows as En}from"@react-three/drei";import{Color as Ln,PerspectiveCamera as Pn}from"three";import{useEffect as A,useLayoutEffect as et,useRef as Rn}from"react";import{Fragment as zn,jsx as Qe,jsxs as Cn}from"react/jsx-runtime";function Eo({active:e}){let t=h(n=>n.invalidate);return A(()=>{e&&t()},[e,t]),Y(()=>{e&&t()}),null}function Lo(e){let t=h(r=>r.gl),n=Rn(t.autoClear);return Y(()=>{n.current=t.autoClear,t.autoClear=!0},-1),Cn(zn,{children:[Qe(En,{...e}),Qe(An,{saved:n})]})}function An({saved:e}){let t=h(n=>n.gl);return Y(()=>{t.autoClear=e.current}),null}function Po({color:e}){let{scene:t,invalidate:n}=h();return et(()=>(t.background=e?new Ln(e):null,n(),()=>{t.background=null}),[t,e,n]),null}function Ro(){let e=h(t=>t.invalidate);return A(()=>{e()},[e]),null}function Ao({rotation:e}){let{scene:t,invalidate:n}=h();return et(()=>{let r=e*Math.PI/180;t.environmentRotation.set(0,r,0),t.backgroundRotation.set(0,r,0)}),A(()=>{n()},[e,n]),null}function zo({cameraConfig:e}){let{camera:t,invalidate:n}=h();return A(()=>{if(!(t instanceof Pn))return;let r=e?.fov;typeof r=="number"&&t.fov!==r&&(t.fov=r,t.updateProjectionMatrix(),n())},[t,e,n]),null}var z=e=>e*Math.PI/180;function ko(e){return{minDistance:e?.minDistance??0,maxDistance:e?.maxDistance??1/0,minPolarAngle:z(e?.minPolarAngle??0),maxPolarAngle:z(e?.maxPolarAngle??180),minAzimuthAngle:z(e?.minAzimuthAngle??-1/0),maxAzimuthAngle:z(e?.maxAzimuthAngle??1/0),boundaryEnclosesCamera:e?.boundaryEnclosesCamera??!1,boundaryFriction:e?.boundaryFriction??0,panBoundary:e?.panBoundary}}import{useEffect as On}from"react";import{useThree as tt}from"@react-three/fiber";function nt(e,t,{zoom:n,pageScroll:r},o){if(!n)return{wheel:t.NONE,middle:t.NONE,two:t.TOUCH_TRUCK};let s=r&&!o?t.NONE:e.wheel;return{...e,wheel:s}}function kn({pageScroll:e}){return e?"pan-y":null}function Uo({controlsRef:e,zoom:t=!0,pageScroll:n=!1}){let r=tt(i=>i.gl.domElement),s=tt(i=>i.events.connected)??r;return On(()=>{let i=e&&typeof e=="object"?e.current:null,a=i?.constructor.ACTION;if(!i||!a||!s||t&&!n)return;let l={zoom:t,pageScroll:n},u={wheel:i.mouseButtons.wheel,middle:i.mouseButtons.middle,two:i.touches.two},c=b=>{i.mouseButtons.wheel=b.wheel,i.mouseButtons.middle=b.middle,i.touches.two=b.two};c(nt(u,a,l));let d=b=>{c(nt(u,a,l,b.ctrlKey||b.metaKey))};s.addEventListener("wheel",d,{capture:!0,passive:!0});let f=kn(l),p=[...new Set([r,s])],m=p.map(b=>[b,b.style.touchAction]),L=null;if(f){let b=()=>{if(i.enabled)for(let v of p)v.style.touchAction!==f&&(v.style.touchAction=f)};b(),L=new MutationObserver(b);for(let v of p)L.observe(v,{attributes:!0,attributeFilter:["style"]})}return()=>{if(s.removeEventListener("wheel",d,{capture:!0}),L?.disconnect(),f)for(let[b,v]of m)b.style.touchAction=v;c(u)}},[e,r,s,t,n]),null}import{useLoader as ot,useThree as Bn}from"@react-three/fiber";import{FileLoader as it,Loader as Tn,LoadingManager as Fn}from"three";import{GLTFLoader as Un}from"three-stdlib";var O=class extends Tn{constructor(){super(...arguments);this.options={source:{format:"glb"}}}configure(n){return this.options=n,this}load(n,r,o,s){let i=performance.now(),a={format:this.options.source.format,name:this.options.source.entryPath??le(n),sourceBytes:this.options.source.sourceBytes??null,failedResources:[]},l=u=>{a.sourceBytes===null&&u.lengthComputable&&u.total>0&&(a.sourceBytes=u.total),o?.(u)};this.loadAsset(n,l,a).then(u=>{a.loadDurationMs=Math.max(0,performance.now()-i),F(u.scene,a),r(u)}).catch(u=>{a.loadDurationMs=Math.max(0,performance.now()-i),u&&typeof u=="object"&&F(u,a),s?.(u)})}async loadAsset(n,r,o){let s=Nn(this.options.source);s.onError=u=>{let c=Object.entries(this.options.source.resourceUrls??{}).find(([,f])=>f===u)?.[0],d=ue(c??u);o.failedResources.includes(d)||o.failedResources.push(d)};let{format:i}=this.options.source;if(i==="obj")return In(n,s,this.options.source,r);if(i==="fbx"){let{FBXLoader:u}=await import("three/examples/jsm/loaders/FBXLoader.js"),c=K(this,new u(s)),d=_n(n,this.options.source);d&&c.setResourcePath(d);let f=await c.loadAsync(n,r);return C(f,"FBXMesh",!1),{scene:f,animations:f.animations??[]}}if(i==="stl"||i==="ply"){let{meshNameFromPath:u,parsePly:c,parseStl:d}=await import("./meshFormats-4C6NHYOA.mjs"),f=await Dn(n,s,r),p=u(this.options.source.entryPath??n,i==="stl"?"STL model":"PLY model"),m=i==="stl"?d(f,p):c(f,p);return C(m,i==="stl"?"STLMesh":"PLYMesh",!0),{scene:m,animations:[]}}if(i==="usdz"){let{USDLoader:u}=await import("three/examples/jsm/loaders/USDLoader.js"),d=await K(this,new u(s)).loadAsync(n,r);return C(d,"USDZMesh",!1),{scene:d,animations:d.animations??[]}}let a=K(this,new Un(s));de(a,this.options.decoderConfig,this.options.renderer),a.register(u=>{let c=u.json,d=f=>Array.isArray(f)?f.filter(p=>typeof p=="string"):[];return o.extensionsUsed=d(c.extensionsUsed),o.extensionsRequired=d(c.extensionsRequired),{name:"RI_asset_diagnostics",beforeRoot:()=>null}});let l=await a.loadAsync(n,r);return{scene:l.scene,animations:l.animations??[],materialVariants:ie(l)}}};pe(e=>{ot.clear(O,e)});function Zo(e,t={},n,r){let o=Bn(a=>a.gl),s=Me(e),i=n?{...s,format:n}:s;return ot(O,e,a=>{a.configure({source:i,decoderConfig:t,renderer:o})},r)}async function In(e,t,n,r){let[{OBJLoader:o},s]=await Promise.all([import("three/examples/jsm/loaders/OBJLoader.js"),rt(e,t,r)]),i=new o(t),a=jn(s);if(a){let u=Gn(a,e,n);if(u)try{let c=await rt(u.url,t),{MTLLoader:d}=await import("three/examples/jsm/loaders/MTLLoader.js"),p=new d(t).parse(c,u.basePath);p.preload(),i.setMaterials(p)}catch(c){console.warn(`[react-immersive] Could not load OBJ material ${a}; rendering geometry with fallback materials.`,c)}}let l=i.parse(s);return C(l,"OBJMesh",!0),{scene:l,animations:[]}}function C(e,t,n){let r=new Set,o=0;e.traverse(s=>{if(!("isMesh"in s&&s.isMesh===!0)){s.name&&r.add(s.name);return}let a=s.name||`${t}_${++o}`;if(!n&&s.name){r.add(s.name);return}let l=a,u=2;for(;r.has(l);)l=`${a}_${u++}`;s.name=l,r.add(l)})}function rt(e,t,n){let r=new it(t);return r.setResponseType("text"),r.loadAsync(e,n)}function Dn(e,t,n){let r=new it(t);return r.setResponseType("arraybuffer"),r.loadAsync(e,n)}function K(e,t){return t.setCrossOrigin(e.crossOrigin),t.setWithCredentials(e.withCredentials),t.setRequestHeader(e.requestHeader),t}function Nn(e){let t=new Fn,n=e.resourceUrls;return n&&t.setURLModifier(r=>{if(/^(?:blob:|data:)/i.test(r))return r;let o=B(at(r).split(/[?#]/)[0]),s=n[o];if(s)return s;let i=k(e.entryPath??""),a=B(i?`${i}/${o}`:o);return n[a]??r}),t}function jn(e){return/^\s*mtllib\s+(.+?)\s*$/im.exec(e)?.[1]?.trim()||null}function Gn(e,t,n){if(n.resourceUrls&&n.entryPath){let r=B(`${k(n.entryPath)}/${at(e)}`),o=n.resourceUrls[r];if(!o)return null;let s=k(r);return{url:o,basePath:s?`${s}/`:""}}try{let r=new URL(e,t).href;return{url:r,basePath:st(r)}}catch{return null}}function _n(e,t){if(t.resourceUrls&&t.entryPath){let n=k(t.entryPath);return n?`${n}/`:""}return st(e)}function st(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t+1)}function k(e){let t=B(e),n=t.lastIndexOf("/");return n===-1?"":t.slice(0,n)}function B(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(r=>r&&r!=="."))n===".."?t.pop():t.push(n);return t.join("/")}function at(e){try{return decodeURI(e)}catch{return e}}import{Box3 as q,Matrix4 as Vn,Sphere as Wn,Vector3 as Q}from"three";var lt=new WeakMap,ut=new Q,$n=new Q,Zn=new Q,Xn=new q,ct=new Vn;function w(e){return"data"in e?e.data.version:e.version}function Hn(e){var l;let{geometry:t,skeleton:n}=e,r=t.getAttribute("position"),o=t.getAttribute("skinIndex"),s=t.getAttribute("skinWeight"),i=lt.get(e);if(i?.geometry===t&&i.position===r&&i.indices===o&&i.weights===s&&i.skeleton===n&&i.bindMatrix.equals(e.bindMatrix)&&i.versions[0]===w(r)&&i.versions[1]===w(o)&&i.versions[2]===w(s)&&i.inverses.length===n.boneInverses.length&&i.inverses.every((u,c)=>u.equals(n.boneInverses[c])))return i;let a={geometry:t,position:r,indices:o,weights:s,skeleton:n,versions:[w(r),w(o),w(s)],bindMatrix:e.bindMatrix.clone(),inverses:n.boneInverses.map(u=>u.clone()),bones:[],weightDeviation:0};e:for(let u=0;u<r.count;u++){ut.fromBufferAttribute(r,u).applyMatrix4(e.bindMatrix);let c=0;for(let f=0;f<4;f++){let p=s.getComponent(u,f);if(p===0)continue;let m=o.getComponent(u,f);if(!Number.isFinite(p)||p<0||!Number.isInteger(m)||!n.bones[m]||!a.inverses[m]){a.bones=null;break e}c+=p,((l=a.bones)[m]??(l[m]=new q)).expandByPoint($n.copy(ut).applyMatrix4(a.inverses[m]))}let d=Math.abs(c-1);if(d>1e-4){a.bones=null;break}a.weightDeviation=Math.max(a.weightDeviation,d)}return lt.set(e,a),a}function Yo(e,{precise:t=!1,updateFallbacks:n=!0}={}){e.updateMatrixWorld(!0),e.traverse(r=>{if(!te(r))return;let o=r;if(!o.skeleton)return;let s=ne(o);s&&o.bindMatrixInverse.copy(s);let a=!!o.geometry.morphAttributes.position?.length?null:Hn(o);if(!t&&!a?.bones&&!n&&o.boundingBox&&o.boundingSphere)return;let l=o.boundingBox??(o.boundingBox=new q),u=o.boundingSphere??(o.boundingSphere=new Wn);if(l.makeEmpty(),t||!a?.bones){let c=o.geometry.getAttribute("position");for(let d=0;d<c.count;d++)l.expandByPoint(o.getVertexPosition(d,Zn))}else{for(let c=0;c<a.bones.length;c++){let d=a.bones[c];d&&(ct.multiplyMatrices(o.bindMatrixInverse,o.skeleton.bones[c].matrixWorld),l.union(Xn.copy(d).applyMatrix4(ct)))}if(!l.isEmpty()){let c=l.min,d=l.max,f=o.bindMatrixInverse.elements,p=Math.max(1,Math.abs(c.x),Math.abs(c.y),Math.abs(c.z),Math.abs(d.x),Math.abs(d.y),Math.abs(d.z)),m=Math.max(Math.abs(c.x-f[12]),Math.abs(d.x-f[12]),Math.abs(c.y-f[13]),Math.abs(d.y-f[13]),Math.abs(c.z-f[14]),Math.abs(d.z-f[14]));l.expandByScalar(a.weightDeviation*m+p*1e-10)}}l.getBoundingSphere(u)})}import{useCallback as dt,useEffect as Jn,useRef as Yn}from"react";import{useThree as Kn}from"@react-three/fiber";function ei(){let e=Kn(o=>o.gl.domElement),t=Yn(void 0),n=dt(o=>{t.current===void 0&&(t.current=e.style.cursor),e.style.cursor=o},[e]),r=dt(()=>{let o=t.current;o!==void 0&&(e.style.cursor=o,t.current=void 0)},[e]);return Jn(()=>()=>{r()},[r]),{setCanvasCursor:n,restoreCanvasCursor:r}}import{Box3 as qn,Vector3 as ft}from"three";function T(e){return[e.x,e.y,e.z]}function oi(e){let t=new qn().setFromObject(e),n=0;return e.traverse(r=>{r.isMesh&&(n+=1)}),{bounds:{min:T(t.min),max:T(t.max),center:T(t.getCenter(new ft)),size:T(t.getSize(new ft))},objectCount:n,materialVariants:se(e),materialVariantGroups:ae(e)}}import{jsx as E,jsxs as ee}from"react/jsx-runtime";function ci({visible:e,title:t,message:n,progress:r,background:o,seeThrough:s=!1}){if(!e)return null;let i=o!==void 0&&Ze(o),a=s?"transparent":o,l=typeof r=="number"&&Number.isFinite(r),u=l?Math.round(Math.min(Math.max(r,0),100)):0;return E("div",{className:`bb-loadingOverlay${i?" bb-loadingOverlay--light":""}`,style:a?{background:a}:void 0,role:"status","aria-live":"polite",children:ee("div",{className:"bb-loadingCard",children:[ee("div",{className:"bb-loadingHeader",children:[E("span",{className:"bb-loadingTitle",title:t??n,children:t??n}),l?ee("span",{className:"bb-loadingPercent",children:[u,"%"]}):null]}),E("div",{className:`bb-loadingProgress ${l?"":"bb-loadingProgress--unknown"}`,role:"progressbar","aria-label":t??n,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":l?u:void 0,children:E("div",{className:"bb-loadingProgress__bar",style:l?{width:`${u}%`}:void 0})}),t?E("span",{className:"bb-loadingMessage",children:n}):null]})})}export{Ae as a,ar as b,lr as c,Wt as d,Tr as e,W as f,Fr as g,x as h,nr as i,Me as j,rr as k,Te as l,xr as m,Mr as n,hr as o,Rr as p,Ar as q,zr as r,Cr as s,Vr as t,en as u,Yr as v,eo as w,io as x,lo as y,Je as z,go as A,Eo as B,Lo as C,Po as D,Ro as E,Ao as F,zo as G,ko as H,Uo as I,Zo as J,Yo as K,ei as L,oi as M,ci as N};
47
+ `,Dt=()=>{};function wr({getTarget:e,revision:t,lineColor:n}){let r=Ft(c=>c.invalidate),[o,s]=Ot({y:0,size:10}),i=Ct(null);j(()=>{i.current&&Re(i.current)},[]),j(()=>{let c=e();if(!c)return;let d=c instanceof Ce?c:new Ce().setFromObject(c);if(d.isEmpty())return;let f=d.getSize(new Tt);s({y:d.min.y,size:Math.max(f.x,f.y,f.z)}),r()},[e,t,r]);let a=zt(()=>new Bt({vertexShader:Ut,fragmentShader:It,transparent:!0,depthWrite:!1,side:kt,uniforms:{uCell:{value:1},uMajor:{value:5},uFade:{value:100},uLinearTarget:{value:!1},uLine:{value:new G},uAxisX:{value:new G("#e5484d")},uAxisZ:{value:new G("#3e8bff")}}}),[]);j(()=>()=>a.dispose(),[a]);let l=ze(o.size);a.uniforms.uCell.value=l,a.uniforms.uMajor.value=l*5,a.uniforms.uFade.value=o.size*12,a.uniforms.uLine.value.set(n);let u=o.size*40;return Oe("mesh",{ref:i,rotation:[-Math.PI/2,0,0],position:[0,o.y-o.size*5e-4,0],raycast:Dt,renderOrder:-1,frustumCulled:!1,material:a,onBeforeRender:c=>{let d=c.getRenderTarget()!==null;a.uniforms.uLinearTarget.value!==d&&(a.uniforms.uLinearTarget.value=d,a.uniformsNeedUpdate=!0)},children:Oe("planeGeometry",{args:[u,u]})})}import{useThree as _}from"@react-three/fiber";import{useEffect as Fe}from"react";import{useEffect as Nt,useState as jt}from"react";function Te(e){return!!e?.isWebGPURenderer}var ke;function Gt(){return ke??(ke=(async()=>{let e=typeof navigator>"u"?void 0:navigator.gpu;if(!e)return!1;try{return!!await e.requestAdapter()}catch{return!1}})()),ke}var Be=!1;function Er(e){let[t,n]=jt(null);return Nt(()=>{if(!e)return;let r=!1;return Gt().then(o=>{r||(!o&&!Be&&(Be=!0,console.info("[react-immersive] WebGPU isn't available in this browser; using WebGL.")),n(o))}),()=>{r=!0}},[e]),e?t===null?null:t?"webgpu":"webgl":"webgl"}async function Lr(e){let{WebGPURenderer:t}=await import("three/webgpu"),n=new t({canvas:e.canvas,antialias:e.antialias??!0,alpha:e.alpha??!0});return await n.init(),n}function Cr({captureRef:e}){let{gl:t,scene:n,camera:r,invalidate:o,get:s}=_();return Fe(()=>{if(!e)return;let i=()=>{let a=s();a.advance(a.frameloop==="never"?a.clock.elapsedTime:performance.now())};return e.current={gl:t,scene:n,camera:r,invalidate:o,drawNow:i},()=>{e.current=null}},[e,t,n,r,o,s]),null}function Or(){let e=_(n=>n.frameloop),t=_(n=>n.invalidate);return Fe(()=>{e!=="never"&&t()},[e,t]),null}function kr(e){e.dispose(),"forceContextLoss"in e&&!Te(e)&&(e.forceContextLoss(),e.forceContextLoss=()=>{})}function Br(e){if(!e)return Promise.resolve(null);try{e.drawNow();let t=e.gl.domElement;return new Promise(n=>{t.toBlob(r=>n(r?URL.createObjectURL(r):null),"image/webp",.85)})}catch{return Promise.resolve(null)}}import{useEffect as Kt,useState as qt}from"react";import{useEffect as _t,useState as Ue}from"react";var Vt="200px",Ie=new Map;function De(e,t,n){let r=Ie.get(t);if(!r){let i=new Map;r={observer:new IntersectionObserver(l=>{for(let u of l)i.get(u.target)?.(u.isIntersecting)},{rootMargin:t}),watchers:i},Ie.set(t,r)}let{observer:o,watchers:s}=r;return s.set(e,n),o.observe(e),()=>{s.delete(e),o.unobserve(e)}}function Ne(e){let t=typeof IntersectionObserver<"u",[n,r]=Ue(!t),[o,s]=Ue(!t);return _t(()=>{let i=e.current;if(!i||!t)return;let a=De(i,Vt,r),l=De(i,"0px",s);return()=>{a(),l()}},[e,t]),{near:n,visible:o}}import{useEffect as je,useRef as Ge,useState as Zt}from"react";function V(){return typeof navigator>"u"?!1:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function Wt(){if(typeof navigator>"u")return!1;let e=navigator.userAgent;return/iPhone|iPad|iPod/i.test(e)?!0:navigator.platform==="MacIntel"&&typeof navigator.maxTouchPoints=="number"&&navigator.maxTouchPoints>1}function Ir(){return V()||Wt()}function $t(){if(typeof window>"u"||typeof navigator>"u")return!1;let e=i=>typeof window.matchMedia=="function"&&window.matchMedia(i).matches,t=e("(pointer: coarse)")||e("(any-pointer: coarse)"),n=e("(hover: none)")||e("(any-hover: none)"),r=navigator.maxTouchPoints>0,o=typeof window.screen<"u"&&Math.min(window.screen.width,window.screen.height)<=1024,s=V();return t||s||r&&n||r&&o}function W(){if(!$t())return!1;if(V())return!0;let e=navigator.deviceMemory;return!(typeof e=="number"&&e>=8)}function Dr(e="auto"){switch(e){case"high":return!1;case"low":return!0;default:return W()}}function Xt(e,t){let n=new Set,r=o=>{for(let s of o){if(n.size>=t)return;n.add(s.id)}};return r(e.filter(o=>o.wanted).sort((o,s)=>Number(s.visible)-Number(o.visible)||Number(s.live)-Number(o.live)||o.since-s.since)),r(e.filter(o=>!o.wanted&&o.live).sort((o,s)=>s.since-o.since)),n}var Ht=12,Jt=6,P=new Map,Yt=1,$=!1,_e;function Ve(){$||($=!0,queueMicrotask(()=>{$=!1,_e??(_e=W()?Jt:Ht);let e=Xt([...P.values()],_e);for(let t of P.values()){let n=e.has(t.id);n!==t.live&&(t.live=n,t.onLiveChange(n))}}))}function We({managed:e,wanted:t,visible:n,onPark:r}){let[o,s]=Zt(!1),i=Ge(r);i.current=r;let a=Ge(null);return je(()=>{if(!e)return;let l={id:Yt++,wanted:!1,visible:!1,live:!1,since:performance.now(),onLiveChange:u=>{u||i.current?.(),s(u)}};return P.set(l.id,l),a.current=l,()=>{P.delete(l.id),a.current=null,s(!1),Ve()}},[e]),je(()=>{let l=a.current;!l||l.wanted===t&&l.visible===n||(l.wanted!==t&&(l.since=performance.now()),l.wanted=t,l.visible=n,Ve())},[e,t,n]),e?o:t}function Zr({loading:e="lazy",reveal:t="auto",rootRef:n,onPark:r}){let{near:o,visible:s}=Ne(n),[i,a]=qt(t==="auto");return Kt(()=>{t==="auto"&&a(!0)},[t]),{live:We({managed:e==="lazy",wanted:i&&(e==="eager"||o),visible:s,onPark:r}),visible:s,awaitingReveal:!i,reveal:()=>a(!0)}}import{Box as Qt}from"lucide-react";import{jsx as Z,jsxs as $e}from"react/jsx-runtime";function en({src:e,hidden:t=!1}){return e?Z("img",{className:`ri-poster${t?" ri-poster--hidden":""}`,src:e,alt:"","aria-hidden":"true",draggable:!1,decoding:"async"}):null}function Qr({className:e,background:t,poster:n,onReveal:r}){let o=oe();return $e("div",{className:`${e} ri-viewerPlaceholder`,style:{background:t},children:[Z(en,{src:n}),r?$e("button",{type:"button",className:"ri-revealButton",onClick:r,children:[Z(Qt,{size:16,"aria-hidden":"true"}),o("viewIn3D")]}):null]})}import{Color as tn}from"three";function Ze(e){let t=new tn(0,0,0);try{t.setStyle(e,"srgb-linear")}catch{return!1}let n=[t.r,t.g,t.b].map(r=>r<=.04045?r/12.92:((r+.055)/1.055)**2.4);return .2126*n[0]+.7152*n[1]+.0722*n[2]>.3}function ro(e,t){if(e)return e;let n=t?.background;return n?.enabled&&n.type==="color"?n.color:"#1c1c1d"}var nn={glb:"GLB",gltf:"glTF",obj:"OBJ",fbx:"FBX",usdz:"USDZ",stl:"STL",ply:"PLY"},rn=/\.(glb|gltf|obj|fbx|usdz|stl|ply|zip)$/i;function on(e,t){let n=e?.response?.status;if(typeof n=="number")return n;let r=/responded with (\d{3})/.exec(t);return r?Number(r[1]):null}function lo(e,t,n,r){let o=e instanceof Error?e.message:e==null?"":String(e),s=(f,p)=>re(r,f,p),i=s("loadErrorTitle"),a=o||null;if(ce(e))return{title:i,detail:s("loadErrorPointCloud"),technical:a};let l=on(e,o);if(l===404||l===410)return{title:i,detail:s("loadErrorNotFound",{status:l}),technical:a};if(l===401||l===403)return{title:i,detail:s("loadErrorDenied",{status:l}),technical:a};if(l!==null)return{title:i,detail:s("loadErrorStatus",{status:l}),technical:a};if(/failed to fetch|networkerror|load failed|network error/i.test(o))return{title:i,detail:s("loadErrorNetwork"),technical:a};if(/<!doctype|<html/i.test(o))return{title:i,detail:s("loadErrorHtml"),technical:a};let u=t.split(/[?#]/,1)[0],c=nn[n??S(t)],d=rn.test(u);return{title:i,detail:d||n?s(n?"loadErrorInvalidExplicitFormat":"loadErrorInvalidFile",{format:c}):s("loadErrorMissingFormat",{format:c}),technical:a}}import{useEffect as sn,useState as an}from"react";var X=80,ln=99,un=6e3,cn=200;function dn(e,t=0){let n=Math.min(Math.max(e,0),100);return n<100?n/100*X:X+(ln-X)*(1-Math.exp(-t/un))}function fo(e,t=!1){let n=e!==null&&e>=100&&!t,[r,o]=an(0);return sn(()=>{if(!n){o(0);return}let s=performance.now(),i=setInterval(()=>o(performance.now()-s),cn);return()=>clearInterval(i)},[n]),e===null?null:t?100:dn(e,r)}import{DataTexture as fn,DataUtils as Xe,EquirectangularReflectionMapping as pn,HalfFloatType as mn,LinearFilter as He,LinearSRGBColorSpace as bn,RGBAFormat as gn,Vector3 as y}from"three";var Je="neutral",hn=[{direction:[.62,.48,.62],size:[.38,.28],radiance:9},{direction:[-.75,.2,.55],size:[.32,.36],radiance:3.5},{direction:[0,1,0],size:[.55,.55],radiance:4},{direction:[.15,.3,-1],size:[.45,.16],radiance:5}],A=(e,t,n)=>{let r=Math.min(Math.max((n-e)/(t-e),0),1);return r*r*(3-2*r)},vn=hn.map(e=>{let t=new y(...e.direction).normalize(),n=Math.abs(t.y)>.9?new y(0,0,1):new y(0,1,0),r=new y().crossVectors(n,t).normalize(),o=new y().crossVectors(t,r).normalize();return{center:t,right:r,up:o,box:e}}),yn=.9;function wn(e){let t=e.y,n=.2+.18*A(-.35,.05,t)+.17*A(0,.9,t);for(let{center:r,right:o,up:s,box:i}of vn){let a=e.dot(r);if(a<=0)continue;let l=Math.abs(e.dot(o)/a)/i.size[0],u=Math.abs(e.dot(s)/a)/i.size[1],c=(1-A(.82,1,l))*(1-A(.82,1,u));n+=i.radiance*c}return n*yn}var H=null;function Ye(){if(H)return H;let e=512,t=256,n=new Uint16Array(e*t*4),r=new y;for(let s=0;s<t;s++){let i=((s+.5)/t-.5)*Math.PI;for(let a=0;a<e;a++){let l=((a+.5)/e-.5)*2*Math.PI;r.set(Math.cos(i)*Math.cos(l),Math.sin(i),Math.cos(i)*Math.sin(l));let u=Xe.toHalfFloat(wn(r)),c=(s*e+a)*4;n[c]=u,n[c+1]=u,n[c+2]=u,n[c+3]=Xe.toHalfFloat(1)}}let o=new fn(n,e,t,gn,mn);return o.mapping=pn,o.colorSpace=bn,o.magFilter=He,o.minFilter=He,o.generateMipmaps=!1,o.needsUpdate=!0,H=o,o}import{lazy as xn,useLayoutEffect as Mn}from"react";import{useThree as Ke}from"@react-three/fiber";import{jsx as J}from"react/jsx-runtime";var qe=xn(()=>import("./DownloadedEnvironment-NHM4U2LJ.mjs"));function yo({preset:e,files:t,...n}){return!t&&e===Je?J(Sn,{...n}):t?J(qe,{files:t,...n}):J(qe,{preset:e,...n})}function Sn({background:e=!1,environmentIntensity:t=1,backgroundIntensity:n=1,backgroundBlurriness:r=0}){let o=Ke(i=>i.scene),s=Ke(i=>i.invalidate);return Mn(()=>{let i=Ye(),a={environment:o.environment,environmentIntensity:o.environmentIntensity,background:o.background,backgroundIntensity:o.backgroundIntensity,backgroundBlurriness:o.backgroundBlurriness};return o.environment=i,o.environmentIntensity=t,e&&(o.background=i,o.backgroundIntensity=n,o.backgroundBlurriness=r),s(),()=>{Object.assign(o,a),s()}},[o,s,e,t,n,r]),null}import{useFrame as Y,useThree as h}from"@react-three/fiber";import{ContactShadows as En}from"@react-three/drei";import{Color as Ln,PerspectiveCamera as Pn}from"three";import{useEffect as R,useLayoutEffect as et,useRef as An}from"react";import{Fragment as zn,jsx as Qe,jsxs as Cn}from"react/jsx-runtime";function Ao({active:e}){let t=h(n=>n.invalidate);return R(()=>{e&&t()},[e,t]),Y(()=>{e&&t()}),null}function Ro(e){let t=h(r=>r.gl),n=An(t.autoClear);return Y(()=>{n.current=t.autoClear,t.autoClear=!0},-1),Cn(zn,{children:[Qe(En,{...e}),Qe(Rn,{saved:n})]})}function Rn({saved:e}){let t=h(n=>n.gl);return Y(()=>{t.autoClear=e.current}),null}function zo({color:e}){let{scene:t,invalidate:n}=h();return et(()=>(t.background=e?new Ln(e):null,n(),()=>{t.background=null}),[t,e,n]),null}function Co(){let e=h(t=>t.invalidate);return R(()=>{e()},[e]),null}function Oo({rotation:e}){let{scene:t,invalidate:n}=h();return et(()=>{let r=e*Math.PI/180;t.environmentRotation.set(0,r,0),t.backgroundRotation.set(0,r,0)}),R(()=>{n()},[e,n]),null}function ko({cameraConfig:e}){let{camera:t,invalidate:n}=h();return R(()=>{if(!(t instanceof Pn))return;let r=e?.fov;typeof r=="number"&&t.fov!==r&&(t.fov=r,t.updateProjectionMatrix(),n())},[t,e,n]),null}var On=["minDistance","maxDistance","minPolarAngle","maxPolarAngle","minAzimuthAngle","maxAzimuthAngle","panBoundary","boundaryEnclosesCamera","boundaryFriction"];function Fo(e){if(!e)return;let t=e.floorOutline;if(t&&t.points?.length>=3)return{floorOutline:t};if(e.insideModel)return{insideModel:!0};if(e.aroundModel)return{aroundModel:!0};let n={};for(let r of On)e[r]!==void 0&&(n[r]=e[r]);return Object.keys(n).length?n:void 0}var z=e=>e*Math.PI/180;function Uo(e){return{minDistance:e?.minDistance??0,maxDistance:e?.maxDistance??1/0,minPolarAngle:z(e?.minPolarAngle??0),maxPolarAngle:z(e?.maxPolarAngle??180),minAzimuthAngle:z(e?.minAzimuthAngle??-1/0),maxAzimuthAngle:z(e?.maxAzimuthAngle??1/0),boundaryEnclosesCamera:e?.boundaryEnclosesCamera??!1,boundaryFriction:e?.boundaryFriction??0,panBoundary:e?.panBoundary}}import{useEffect as kn}from"react";import{useThree as tt}from"@react-three/fiber";function nt(e,t,{zoom:n,pageScroll:r},o){if(!n)return{wheel:t.NONE,middle:t.NONE,two:t.TOUCH_TRUCK};let s=r&&!o?t.NONE:e.wheel;return{...e,wheel:s}}function Bn({pageScroll:e}){return e?"pan-y":null}function jo({controlsRef:e,zoom:t=!0,pageScroll:n=!1}){let r=tt(i=>i.gl.domElement),s=tt(i=>i.events.connected)??r;return kn(()=>{let i=e&&typeof e=="object"?e.current:null,a=i?.constructor.ACTION;if(!i||!a||!s||t&&!n)return;let l={zoom:t,pageScroll:n},u={wheel:i.mouseButtons.wheel,middle:i.mouseButtons.middle,two:i.touches.two},c=b=>{i.mouseButtons.wheel=b.wheel,i.mouseButtons.middle=b.middle,i.touches.two=b.two};c(nt(u,a,l));let d=b=>{c(nt(u,a,l,b.ctrlKey||b.metaKey))};s.addEventListener("wheel",d,{capture:!0,passive:!0});let f=Bn(l),p=[...new Set([r,s])],m=p.map(b=>[b,b.style.touchAction]),L=null;if(f){let b=()=>{if(i.enabled)for(let v of p)v.style.touchAction!==f&&(v.style.touchAction=f)};b(),L=new MutationObserver(b);for(let v of p)L.observe(v,{attributes:!0,attributeFilter:["style"]})}return()=>{if(s.removeEventListener("wheel",d,{capture:!0}),L?.disconnect(),f)for(let[b,v]of m)b.style.touchAction=v;c(u)}},[e,r,s,t,n]),null}import{useLoader as ot,useThree as Tn}from"@react-three/fiber";import{FileLoader as it,Loader as Fn,LoadingManager as Un}from"three";import{GLTFLoader as In}from"three-stdlib";var O=class extends Fn{constructor(){super(...arguments);this.options={source:{format:"glb"}}}configure(n){return this.options=n,this}load(n,r,o,s){let i=performance.now(),a={format:this.options.source.format,name:this.options.source.entryPath??le(n),sourceBytes:this.options.source.sourceBytes??null,failedResources:[]},l=u=>{a.sourceBytes===null&&u.lengthComputable&&u.total>0&&(a.sourceBytes=u.total),o?.(u)};this.loadAsset(n,l,a).then(u=>{a.loadDurationMs=Math.max(0,performance.now()-i),F(u.scene,a),r(u)}).catch(u=>{a.loadDurationMs=Math.max(0,performance.now()-i),u&&typeof u=="object"&&F(u,a),s?.(u)})}async loadAsset(n,r,o){let s=jn(this.options.source);s.onError=u=>{let c=Object.entries(this.options.source.resourceUrls??{}).find(([,f])=>f===u)?.[0],d=ue(c??u);o.failedResources.includes(d)||o.failedResources.push(d)};let{format:i}=this.options.source;if(i==="obj")return Dn(n,s,this.options.source,r);if(i==="fbx"){let{FBXLoader:u}=await import("three/examples/jsm/loaders/FBXLoader.js"),c=K(this,new u(s)),d=Vn(n,this.options.source);d&&c.setResourcePath(d);let f=await c.loadAsync(n,r);return C(f,"FBXMesh",!1),{scene:f,animations:f.animations??[]}}if(i==="stl"||i==="ply"){let{meshNameFromPath:u,parsePly:c,parseStl:d}=await import("./meshFormats-4C6NHYOA.mjs"),f=await Nn(n,s,r),p=u(this.options.source.entryPath??n,i==="stl"?"STL model":"PLY model"),m=i==="stl"?d(f,p):c(f,p);return C(m,i==="stl"?"STLMesh":"PLYMesh",!0),{scene:m,animations:[]}}if(i==="usdz"){let{USDLoader:u}=await import("three/examples/jsm/loaders/USDLoader.js"),d=await K(this,new u(s)).loadAsync(n,r);return C(d,"USDZMesh",!1),{scene:d,animations:d.animations??[]}}let a=K(this,new In(s));de(a,this.options.decoderConfig,this.options.renderer),a.register(u=>{let c=u.json,d=f=>Array.isArray(f)?f.filter(p=>typeof p=="string"):[];return o.extensionsUsed=d(c.extensionsUsed),o.extensionsRequired=d(c.extensionsRequired),{name:"RI_asset_diagnostics",beforeRoot:()=>null}});let l=await a.loadAsync(n,r);return{scene:l.scene,animations:l.animations??[],materialVariants:ie(l)}}};pe(e=>{ot.clear(O,e)});function Yo(e,t={},n,r){let o=Tn(a=>a.gl),s=Me(e),i=n?{...s,format:n}:s;return ot(O,e,a=>{a.configure({source:i,decoderConfig:t,renderer:o})},r)}async function Dn(e,t,n,r){let[{OBJLoader:o},s]=await Promise.all([import("three/examples/jsm/loaders/OBJLoader.js"),rt(e,t,r)]),i=new o(t),a=Gn(s);if(a){let u=_n(a,e,n);if(u)try{let c=await rt(u.url,t),{MTLLoader:d}=await import("three/examples/jsm/loaders/MTLLoader.js"),p=new d(t).parse(c,u.basePath);p.preload(),i.setMaterials(p)}catch(c){console.warn(`[react-immersive] Could not load OBJ material ${a}; rendering geometry with fallback materials.`,c)}}let l=i.parse(s);return C(l,"OBJMesh",!0),{scene:l,animations:[]}}function C(e,t,n){let r=new Set,o=0;e.traverse(s=>{if(!("isMesh"in s&&s.isMesh===!0)){s.name&&r.add(s.name);return}let a=s.name||`${t}_${++o}`;if(!n&&s.name){r.add(s.name);return}let l=a,u=2;for(;r.has(l);)l=`${a}_${u++}`;s.name=l,r.add(l)})}function rt(e,t,n){let r=new it(t);return r.setResponseType("text"),r.loadAsync(e,n)}function Nn(e,t,n){let r=new it(t);return r.setResponseType("arraybuffer"),r.loadAsync(e,n)}function K(e,t){return t.setCrossOrigin(e.crossOrigin),t.setWithCredentials(e.withCredentials),t.setRequestHeader(e.requestHeader),t}function jn(e){let t=new Un,n=e.resourceUrls;return n&&t.setURLModifier(r=>{if(/^(?:blob:|data:)/i.test(r))return r;let o=B(at(r).split(/[?#]/)[0]),s=n[o];if(s)return s;let i=k(e.entryPath??""),a=B(i?`${i}/${o}`:o);return n[a]??r}),t}function Gn(e){return/^\s*mtllib\s+(.+?)\s*$/im.exec(e)?.[1]?.trim()||null}function _n(e,t,n){if(n.resourceUrls&&n.entryPath){let r=B(`${k(n.entryPath)}/${at(e)}`),o=n.resourceUrls[r];if(!o)return null;let s=k(r);return{url:o,basePath:s?`${s}/`:""}}try{let r=new URL(e,t).href;return{url:r,basePath:st(r)}}catch{return null}}function Vn(e,t){if(t.resourceUrls&&t.entryPath){let n=k(t.entryPath);return n?`${n}/`:""}return st(e)}function st(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t+1)}function k(e){let t=B(e),n=t.lastIndexOf("/");return n===-1?"":t.slice(0,n)}function B(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(r=>r&&r!=="."))n===".."?t.pop():t.push(n);return t.join("/")}function at(e){try{return decodeURI(e)}catch{return e}}import{Box3 as q,Matrix4 as Wn,Sphere as $n,Vector3 as Q}from"three";var lt=new WeakMap,ut=new Q,Zn=new Q,Xn=new Q,Hn=new q,ct=new Wn;function w(e){return"data"in e?e.data.version:e.version}function Jn(e){var l;let{geometry:t,skeleton:n}=e,r=t.getAttribute("position"),o=t.getAttribute("skinIndex"),s=t.getAttribute("skinWeight"),i=lt.get(e);if(i?.geometry===t&&i.position===r&&i.indices===o&&i.weights===s&&i.skeleton===n&&i.bindMatrix.equals(e.bindMatrix)&&i.versions[0]===w(r)&&i.versions[1]===w(o)&&i.versions[2]===w(s)&&i.inverses.length===n.boneInverses.length&&i.inverses.every((u,c)=>u.equals(n.boneInverses[c])))return i;let a={geometry:t,position:r,indices:o,weights:s,skeleton:n,versions:[w(r),w(o),w(s)],bindMatrix:e.bindMatrix.clone(),inverses:n.boneInverses.map(u=>u.clone()),bones:[],weightDeviation:0};e:for(let u=0;u<r.count;u++){ut.fromBufferAttribute(r,u).applyMatrix4(e.bindMatrix);let c=0;for(let f=0;f<4;f++){let p=s.getComponent(u,f);if(p===0)continue;let m=o.getComponent(u,f);if(!Number.isFinite(p)||p<0||!Number.isInteger(m)||!n.bones[m]||!a.inverses[m]){a.bones=null;break e}c+=p,((l=a.bones)[m]??(l[m]=new q)).expandByPoint(Zn.copy(ut).applyMatrix4(a.inverses[m]))}let d=Math.abs(c-1);if(d>1e-4){a.bones=null;break}a.weightDeviation=Math.max(a.weightDeviation,d)}return lt.set(e,a),a}function ei(e,{precise:t=!1,updateFallbacks:n=!0}={}){e.updateMatrixWorld(!0),e.traverse(r=>{if(!te(r))return;let o=r;if(!o.skeleton)return;let s=ne(o);s&&o.bindMatrixInverse.copy(s);let a=!!o.geometry.morphAttributes.position?.length?null:Jn(o);if(!t&&!a?.bones&&!n&&o.boundingBox&&o.boundingSphere)return;let l=o.boundingBox??(o.boundingBox=new q),u=o.boundingSphere??(o.boundingSphere=new $n);if(l.makeEmpty(),t||!a?.bones){let c=o.geometry.getAttribute("position");for(let d=0;d<c.count;d++)l.expandByPoint(o.getVertexPosition(d,Xn))}else{for(let c=0;c<a.bones.length;c++){let d=a.bones[c];d&&(ct.multiplyMatrices(o.bindMatrixInverse,o.skeleton.bones[c].matrixWorld),l.union(Hn.copy(d).applyMatrix4(ct)))}if(!l.isEmpty()){let c=l.min,d=l.max,f=o.bindMatrixInverse.elements,p=Math.max(1,Math.abs(c.x),Math.abs(c.y),Math.abs(c.z),Math.abs(d.x),Math.abs(d.y),Math.abs(d.z)),m=Math.max(Math.abs(c.x-f[12]),Math.abs(d.x-f[12]),Math.abs(c.y-f[13]),Math.abs(d.y-f[13]),Math.abs(c.z-f[14]),Math.abs(d.z-f[14]));l.expandByScalar(a.weightDeviation*m+p*1e-10)}}l.getBoundingSphere(u)})}import{useCallback as dt,useEffect as Yn,useRef as Kn}from"react";import{useThree as qn}from"@react-three/fiber";function oi(){let e=qn(o=>o.gl.domElement),t=Kn(void 0),n=dt(o=>{t.current===void 0&&(t.current=e.style.cursor),e.style.cursor=o},[e]),r=dt(()=>{let o=t.current;o!==void 0&&(e.style.cursor=o,t.current=void 0)},[e]);return Yn(()=>()=>{r()},[r]),{setCanvasCursor:n,restoreCanvasCursor:r}}import{Box3 as Qn,Vector3 as ft}from"three";function T(e){return[e.x,e.y,e.z]}function li(e){let t=new Qn().setFromObject(e),n=0;return e.traverse(r=>{r.isMesh&&(n+=1)}),{bounds:{min:T(t.min),max:T(t.max),center:T(t.getCenter(new ft)),size:T(t.getSize(new ft))},objectCount:n,materialVariants:se(e),materialVariantGroups:ae(e)}}import{jsx as E,jsxs as ee}from"react/jsx-runtime";function mi({visible:e,title:t,message:n,progress:r,background:o,seeThrough:s=!1}){if(!e)return null;let i=o!==void 0&&Ze(o),a=s?"transparent":o,l=typeof r=="number"&&Number.isFinite(r),u=l?Math.round(Math.min(Math.max(r,0),100)):0;return E("div",{className:`bb-loadingOverlay${i?" bb-loadingOverlay--light":""}`,style:a?{background:a}:void 0,role:"status","aria-live":"polite",children:ee("div",{className:"bb-loadingCard",children:[ee("div",{className:"bb-loadingHeader",children:[E("span",{className:"bb-loadingTitle",title:t??n,children:t??n}),l?ee("span",{className:"bb-loadingPercent",children:[u,"%"]}):null]}),E("div",{className:`bb-loadingProgress ${l?"":"bb-loadingProgress--unknown"}`,role:"progressbar","aria-label":t??n,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":l?u:void 0,children:E("div",{className:"bb-loadingProgress__bar",style:l?{width:`${u}%`}:void 0})}),t?E("span",{className:"bb-loadingMessage",children:n}):null]})})}export{Re as a,cr as b,dr as c,Wt as d,Ir as e,W as f,Dr as g,x as h,rr as i,Me as j,or as k,Te as l,Er as m,Lr as n,wr as o,Cr as p,Or as q,kr as r,Br as s,Zr as t,en as u,Qr as v,ro as w,lo as x,fo as y,Je as z,yo as A,Ao as B,Ro as C,zo as D,Co as E,Oo as F,ko as G,Fo as H,Uo as I,jo as J,Yo as K,ei as L,oi as M,li as N,mi as O};