@liveroom-tech/react-immersive 6.2.0 → 6.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AnimationsTab-IKAAKT3P.mjs +1 -0
- package/dist/AnnotationsTab-NEJIXCOM.mjs +1 -0
- package/dist/CinematicTab-TIQXCPFE.mjs +1 -0
- package/dist/ConfigureTab-NYRMOFW4.mjs +6 -0
- package/dist/DownloadedEnvironment-NHM4U2LJ.mjs +1 -0
- package/dist/RulesTab-2U4MFYOZ.mjs +1 -0
- package/dist/SequencesTab-LTMJTB76.mjs +1 -0
- package/dist/SequencesTab-O7USMDFP.css +1 -0
- package/dist/StreamingTilesModel-IM2DDWO5.mjs +16 -0
- package/dist/binding-builder.css +1 -1
- package/dist/binding-builder.d.mts +3 -3
- package/dist/binding-builder.d.ts +3 -3
- package/dist/binding-builder.js +55 -54
- package/dist/binding-builder.mjs +1 -1
- package/dist/chunk-2AJK643D.mjs +1 -0
- package/dist/chunk-2LGQKX6Z.mjs +50 -0
- package/dist/chunk-37QOMZW6.mjs +1 -0
- package/dist/chunk-3PLML3PO.mjs +1 -0
- package/dist/chunk-5C4H7SRF.mjs +1 -0
- package/dist/chunk-IT2PUTJS.mjs +1 -0
- package/dist/chunk-KFLS7GI6.mjs +1 -0
- package/dist/chunk-LEOHZ5HM.mjs +69 -0
- package/dist/{chunk-GXY3VML4.mjs → chunk-NMRTI3NQ.mjs} +1 -1
- package/dist/chunk-RSUXTWM6.mjs +1 -0
- package/dist/chunk-RXZ4Q7CY.mjs +1 -0
- package/dist/chunk-SOAUR4DL.mjs +1 -0
- package/dist/chunk-SXN3YYD3.mjs +1 -0
- package/dist/chunk-TUYVYSN5.mjs +1 -0
- package/dist/{chunk-IOLT2VXU.mjs → chunk-UAZ6I25Y.mjs} +1 -1
- package/dist/chunk-UCD76KQ6.mjs +1 -0
- package/dist/chunk-WU3SQZGD.mjs +3 -0
- package/dist/chunk-XKJQC3N5.mjs +47 -0
- package/dist/exportSceneMesh-MSQIMBFF.mjs +1 -0
- package/dist/hosted.css +1 -1
- package/dist/hosted.d.mts +5 -3
- package/dist/hosted.d.ts +5 -3
- package/dist/hosted.js +54 -53
- package/dist/hosted.mjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +56 -55
- package/dist/index.mjs +1 -1
- package/dist/meshFormats-4C6NHYOA.mjs +1 -0
- package/dist/modelFileResolver-Bq4pW9vc.d.mts +1734 -0
- package/dist/modelFileResolver-Bq4pW9vc.d.ts +1734 -0
- package/dist/modelViewerProps-BnrJO5DK.d.ts +950 -0
- package/dist/modelViewerProps-wjBT4fks.d.mts +950 -0
- package/dist/{publicProps-Cmh9JtzJ.d.ts → publicProps-BZPMIRwj.d.ts} +1 -1
- package/dist/{publicProps-TMARX628.d.mts → publicProps-CW5X_HFh.d.mts} +1 -1
- package/dist/simple-model-viewer.css +1 -1
- package/dist/simple-model-viewer.d.mts +22 -4
- package/dist/simple-model-viewer.d.ts +22 -4
- package/dist/simple-model-viewer.js +5 -5
- package/dist/simple-model-viewer.mjs +1 -1
- package/dist/utils.d.mts +4 -4
- package/dist/utils.d.ts +4 -4
- package/dist/utils.js +2 -2
- package/dist/utils.mjs +1 -1
- package/dist/xrRuntime-5S7KYUVB.mjs +1 -0
- package/package.json +1 -1
- package/dist/AnimationsTab-NUJTEMZ5.mjs +0 -1
- package/dist/AnnotationsTab-OHRVWRKI.mjs +0 -1
- package/dist/CinematicTab-IJAY2BS6.mjs +0 -1
- package/dist/ConfigureTab-UQRRATCY.mjs +0 -6
- package/dist/RulesTab-YVBZGJZX.mjs +0 -1
- package/dist/SequencesTab-IC5LWQ6N.css +0 -1
- package/dist/SequencesTab-ODR5IGDX.mjs +0 -1
- package/dist/chunk-2CUPPOBW.mjs +0 -3
- package/dist/chunk-3MIILDHB.mjs +0 -83
- package/dist/chunk-3XZKDTB2.mjs +0 -1
- package/dist/chunk-6Q6YZ7O5.mjs +0 -1
- package/dist/chunk-7MN2TMY6.mjs +0 -47
- package/dist/chunk-AL6UIGWP.mjs +0 -1
- package/dist/chunk-EWNN4BBR.mjs +0 -1
- package/dist/chunk-X4WRTDO6.mjs +0 -50
- package/dist/modelFileResolver-ChKYsF21.d.mts +0 -495
- package/dist/modelFileResolver-ChKYsF21.d.ts +0 -495
- package/dist/modelViewerProps-Ch6pIZIE.d.ts +0 -2159
- package/dist/modelViewerProps-HazR2IE_.d.mts +0 -2159
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import{c as qg}from"./chunk-RSUXTWM6.mjs";import{c as xl,h as Wr,i as _h}from"./chunk-FGAJ2UT7.mjs";import{a as ih,b as yi,c as bd,d as bl,e as Ro,f as hl,g as vh,i as Sh,j as Ch,k as Aa,l as fr,m as vl}from"./chunk-SOAUR4DL.mjs";import{A as sh,B as lh,C as ch,D as uh,E as dh,F as ph,G as mh,H as fh,I as gh,J as bh,K as Ra,L as yl,M as Mh,N as Ph,O as Eh,a as fi,b as Lg,c as Qs,d as fl,e as Ib,f as zb,g as Vb,j as dd,l as Ur,m as Kb,n as Qb,o as Jb,p as Yb,q as Zb,r as eh,s as th,t as nh,u as md,v as rh,w as fd,x as oh,y as ah}from"./chunk-XKJQC3N5.mjs";import{a as Wg,b as oe}from"./chunk-NMRTI3NQ.mjs";import{a as Oh}from"./chunk-37YITTIK.mjs";import{a as Ub,b as pd,c as gl,d as $b,e as Wb,f as Xb,g as qb,h as hh,l as yh,m as xh,n as wh}from"./chunk-5C4H7SRF.mjs";import{a as Xg,b as Ct}from"./chunk-3PLML3PO.mjs";import{A as tb,Aa as Dh,Ba as Th,Ca as Lh,D as Ae,J as sl,K as nb,L as ll,M as rb,N as ob,O as ib,P as ab,Q as sb,R as cl,S as lb,T as ul,U as Ca,V as cb,W as id,X as dl,Y as ub,Z as db,_ as pb,a as Vr,b as Fr,c as Dg,d as Tg,da as kb,e as Hr,ea as ml,f as _g,g as td,ga as ld,h as Bg,ha as Rb,i as jg,ia as Ab,j as Zs,ja as Ob,k as Vg,ka as cd,l as Fg,la as Eb,m as Hg,ma as Bb,na as jb,o as $g,oa as Nb,p as eb,sa as gd,va as Rh,w as Sa,wa as Ah,x as al,z as od}from"./chunk-2LGQKX6Z.mjs";import{e as Js}from"./chunk-LX3GXQNU.mjs";import{d as hb,e as pl,f as ko,g as vb,h as yb,i as sd,j as xb,k as wb,l as Sb,o as Cb,q as Mb,r as Pb,s as Ma}from"./chunk-7JCFNZJM.mjs";import{b as rl,c as Ug,d as bi,e as wa,i as ol,l as Kg,m as il,n as hi,o as Qg,q as Jg,r as Yg,s as Zg}from"./chunk-37QOMZW6.mjs";import{c as kh}from"./chunk-CCBFMNAU.mjs";import{a as Ys}from"./chunk-GV4ZRXL6.mjs";import{a as nd,b as Ng,c as Ig,d as zg,e as rd,f as el,g as xa,h as tl}from"./chunk-7OWHW66D.mjs";import{a as Fb,b as ka,c as ud,e as Hb,f as Gb}from"./chunk-KFLS7GI6.mjs";import{a as mb,b as fb,c as gb,d as mr,g as bb,h as ad}from"./chunk-BNKTI3CY.mjs";import{a as Db,d as ln,e as Pa,f as Tb,g as vi,h as Lb,p as _b}from"./chunk-UCD76KQ6.mjs";import{a as $r,b as hd}from"./chunk-TUYVYSN5.mjs";import{a as qn,b as Gr,c as nl,d as gi,e as Gg,g as pr}from"./chunk-RXZ4Q7CY.mjs";var Bh={showObjectBindingDataPanel:!1,showSceneObjectsPanel:!1,showDownloadButton:!1,showResetButton:!1,showAnnotationNavigation:!1,showMaterialVariants:!1},uM=Object.freeze({minimal:Object.freeze({...Bh}),showcase:Object.freeze({...Bh,autoRotate:!0}),configurator:Object.freeze({showObjectBindingDataPanel:!0,showSceneObjectsPanel:!1,showDownloadButton:!1,showResetButton:!0,showMaterialVariants:!0}),inspector:Object.freeze({showObjectBindingDataPanel:!0,showSceneObjectsPanel:!0,showDownloadButton:!0,showResetButton:!0,showViewGizmo:!0,showMeasureTools:!0,showUvCheckerButton:!0,showExplodeControls:!0,showSectionTools:!0,showIsolateControls:!0,enableKeyboardNavigation:!0})}),dM=["preset","ui","tools","controls","perf","tiles","xr","decoders"];function jh(e){let t={};for(let n of Object.keys(e))e[n]!==void 0&&(t[n]=e[n]);return t}function pM({ui:e,tools:t,controls:n,perf:r,tiles:o,xr:i,decoders:s}){let l=e?.download,c=e?.mouseController,u=t?.measure,p=n?.autoRotate;return{showObjectBindingDataPanel:e?.objectPanel,showSceneObjectsPanel:e?.sceneObjects,showDownloadButton:l===void 0?void 0:l!==!1,downloadFilename:typeof l=="string"?l:void 0,showResetButton:e?.reset,showFullscreenButton:e?.fullscreen,showLoadingOverlay:e?.loadingOverlay,showViewGizmo:e?.viewGizmo,showMouseController:c===void 0?void 0:c!==!1,mouseControllerPosition:typeof c=="object"?c.position:void 0,mouseControllerOpacity:typeof c=="object"?c.opacity:void 0,showAnnotationNavigation:e?.annotationNavigation,showAnnotationOnHover:e?.annotationOnHover,showAnnotationFilters:e?.annotationFilters,highlightOnHover:e?.highlightOnHover,showMaterialVariants:e?.materialVariants,showObjectNavigator:e?.objectNavigator,showMeasureTools:u===void 0?void 0:u!==!1,measurementUnit:typeof u=="object"?u.unit:void 0,showUvCheckerButton:t?.uvChecker,showExplodeControls:t?.explode,showSectionTools:t?.section,showSequenceControls:t?.sequences,showIsolateControls:t?.isolate,texturePositioning:t?.texturePositioning,enableCameraControls:n?.enabled,enableKeyboardNavigation:n?.keyboard,reducedMotion:n?.reducedMotion,disableZoom:n?.zoom===void 0?void 0:!n.zoom,pageScroll:n?.pageScroll,zoomOnSelected:n?.zoomOnSelect,autoRotate:p===void 0?void 0:p!==!1,autoRotateSpeed:typeof p=="number"?p:void 0,refitOnResize:n?.refitOnResize,cameraLimits:n?.limits,moveSensitivity:n?.moveSensitivity,zoomSensitivity:n?.zoomSensitivity,renderMode:r?.renderMode,maxDpr:r?.maxDpr,performanceProfile:r?.profile,preserveDrawingBuffer:r?.preserveDrawingBuffer,webgpu:r?.webgpu,tilesetUrl:o?.url,tilesErrorTarget:o?.errorTarget,tilesCacheSize:o?.cacheSize,enableXR:i?.enabled,usdzUrl:i?.usdzUrl,arScaleMode:i?.scaleMode,mobileHandoffUrl:i?.mobileHandoffUrl,arHandoff:i?.arHandoff,dracoDecoderPath:s?.draco,ktx2TranscoderPath:s?.ktx2,meshopt:s?.meshopt}}function Nh(e){let t={...e};for(let n of dM)delete t[n];return{...e.preset?uM[e.preset]:void 0,...jh(t),...jh(pM(e))}}import{useCallback as xi,useEffect as wl,useMemo as vd,useRef as wi,useState as Si}from"react";var Ih=e=>e instanceof Error?e.message:String(e);function mM(e){if(!e||!Number.isSafeInteger(e.amountMinor)||e.amountMinor<0||!/^[A-Z]{3}$/.test(e.currency)||e.expiresAt!==void 0&&(!Number.isFinite(Date.parse(e.expiresAt))||Date.parse(e.expiresAt)<=Date.now()))throw new Error("The pricing service returned an invalid price.");return{amountMinor:e.amountMinor,currency:e.currency,...e.expiresAt?{expiresAt:e.expiresAt}:{},...e.label?{label:String(e.label)}:{}}}function fM(e,t){let n=new Set;if(!e||typeof e.available!="boolean"||e.message!==void 0&&typeof e.message!="string")throw new Error("The availability service returned invalid data.");if(e.options!==void 0){if(!Array.isArray(e.options))throw new Error("The availability service returned invalid data.");for(let r of e.options){let o=JSON.stringify([r?.groupId,r?.optionId]);if(!r||typeof r.available!="boolean"||r.reason!==void 0&&typeof r.reason!="string"||n.has(o)||!t.groups.some(i=>i.id===r.groupId&&i.options.some(s=>s.id===r.optionId)))throw new Error("The availability service returned invalid data.");n.add(o)}}return{available:e.available,...e.message!==void 0?{message:e.message}:{},...e.options?{options:e.options.map(({groupId:r,optionId:o,available:i,reason:s})=>({groupId:r,optionId:o,available:i,...s!==void 0?{reason:s}:{}}))}:{}}}function zh(e){let t=JSON.stringify(e.product),n=vd(()=>hb(e.product),[t]),r=JSON.stringify([n.id,n.revision]),[o,i]=Si(()=>({productIdentity:r,selections:e.initialSelections??pl(n)})),s=e.selections??(o.productIdentity===r?o.selections:pl(n)),[l,c]=Si(e.initialQuantity??1),u=JSON.stringify(s),p=vd(()=>ko(n,s,l),[n,u,l]),m=e.adapter,a=m?.key??"",f=`${t}
|
|
2
|
+
${p.key}
|
|
3
|
+
${a}`;if(m&&(typeof m.key!="string"||!m.key.trim()))throw new Error("A commerce adapter needs a stable key identifying its backend/pricing context.");let[d,h]=Si(0),[b,x]=Si(null),[v,S]=Si(null),[y,k]=Si({identity:f,pending:null,result:null,error:null}),w=wi(!1),M=wi(!0),E=wi(0),P=wi(null),O=wi(null),R=wi({options:e,product:n,base:p,identity:f,commerce:b,adapter:m,optionStates:[]}),A=e.selections!==void 0&&!e.onSelectionsChange,D=b?.identity===f&&b.adapterKey===a?b:null,B=D?.configuration??p,V=vd(()=>Cb(n,p.selections,D?.availability??void 0,l),[n,p,D?.availability,l]);R.current={options:e,product:n,base:p,identity:f,commerce:b,adapter:m,optionStates:V},wl(()=>{k({identity:f,pending:null,result:null,error:null}),S(null)},[f]);let $=xi(()=>{w.current=!1,k(Q=>({...Q,error:null,result:null})),h(Q=>Q+1)},[]);wl(()=>{let Q=new AbortController,te=++E.current;return w.current=!1,p.valid?(x({identity:f,adapterKey:a,status:"loading",configuration:p,price:null,availability:null,error:null}),(async()=>{try{let X=structuredClone(p),F={signal:Q.signal};if(m?.resolveSku){let re=await m.resolveSku(structuredClone(X),F);if(re!==null&&(typeof re!="string"||!re.trim()))throw new Error("The SKU service returned an invalid SKU.");X.sku=re}if(Q.signal.aborted)return;let[I,Y]=await Promise.all([m?.getPrice?Promise.resolve().then(()=>m.getPrice(structuredClone(X),F)).then(mM):Promise.resolve(null),m?.getAvailability?Promise.resolve().then(()=>m.getAvailability(structuredClone(X),F)).then(re=>fM(re,n)):Promise.resolve(null)]);if(Q.signal.aborted||te!==E.current||R.current.identity!==f||R.current.adapter?.key!==m?.key)return;w.current=!0,x({identity:f,adapterKey:a,status:"ready",configuration:X,price:I??null,availability:Y??null,error:null})}catch(X){if(Q.signal.aborted||te!==E.current||R.current.identity!==f||R.current.adapter?.key!==m?.key)return;x({identity:f,adapterKey:a,status:"error",configuration:p,price:null,availability:null,error:Ih(X)})}})(),()=>Q.abort()):(x(null),()=>Q.abort())},[f,a,d]),wl(()=>{let Q=D?.price?.expiresAt;if(!Q)return;let te=Date.parse(Q)-Date.now(),X,F=()=>{let I=Date.parse(Q)-Date.now();if(I>0){X=setTimeout(F,Math.min(I,2147483647));return}w.current=!1,x(Y=>Y?.identity===f?{...Y,status:"error",error:"The price expired. Refresh it before continuing."}:Y)};return X=setTimeout(F,Math.min(Math.max(te,0),2147483647)),()=>clearTimeout(X)},[D?.price?.expiresAt,f]),wl(()=>(M.current=!0,()=>{M.current=!1,w.current=!1,E.current++,P.current?.controller.abort()}),[]);let U=xi(Q=>{let te=R.current;if(te.options.selections!==void 0&&!te.options.onSelectionsChange)throw new Error("Selections are controlled; supply onSelectionsChange to edit them.");if(P.current)throw new Error("Wait for the current cart or quote request to finish.");let X=ko(te.product,Q,te.base.quantity);if(X.issues.some(F=>F.code==="unknown-group"||F.code==="unknown-option"))throw new Error("Selections reference unknown product options.");if(X.key===te.base.key){S(null);return}w.current=!1,S(null),h(F=>F+1),te.options.onSelectionsChange&&te.options.onSelectionsChange(structuredClone(X.selections)),te.options.selections===void 0&&i({productIdentity:JSON.stringify([te.product.id,te.product.revision]),selections:X.selections})},[]),T=xi((Q,te)=>{let X=R.current,F=X.product.groups.find(re=>re.id===Q),I=X.optionStates.find(re=>re.groupId===Q&&re.optionId===te);if(!F||te!==null&&!I)throw new Error("Unknown product option.");let Y=te===null?ko(X.product,{...X.base.selections,[Q]:null},X.base.quantity).issues.filter(re=>re.groupIds.includes(Q)&&re.code!=="sku"):[];return Y.length||I&&!I.available?(S(I?.reasons.join(" ")||Y.map(re=>re.message).join(" ")),!1):(U({...X.base.selections,[Q]:te}),!0)},[U]),L=xi((Q,te)=>{let X=R.current,F=vb(X.product,X.base.selections,Q,te,X.base.quantity);return F?(U(F),!0):(S("This choice isn't available with any combination."),!1)},[U]),W=xi(Q=>{if(P.current)throw new Error("Wait for the current cart or quote request to finish.");ko(R.current.product,R.current.base.selections,Q),Q!==R.current.base.quantity&&(w.current=!1,c(Q))},[]),ee=xi(Q=>{if(P.current)return P.current.kind===Q&&P.current.identity===R.current.identity?P.current.promise:Promise.reject(new Error("Another commerce request is already running."));let te=R.current,X=te.commerce,F=Q==="cart"?te.adapter?.addToCart:te.adapter?.requestQuote,I=xe=>(k({identity:te.identity,pending:null,result:null,error:xe}),Promise.reject(new Error(xe)));if(!F)return I("No commerce adapter is configured for this action.");if(!te.base.valid)return I("Resolve the option conflicts before continuing.");if(!w.current||!X||X.identity!==te.identity||X.adapterKey!==(te.adapter?.key??"")||X.status!=="ready")return I("Wait for current pricing and availability, or retry the service request.");if(X.availability?.available===!1||X.availability?.options?.some(xe=>!xe.available&&te.base.selections[xe.groupId]===xe.optionId))return I(X.availability?.message??"This configuration is currently unavailable.");if(Q==="cart"&&te.adapter?.resolveSku&&!X.configuration.sku)return I("No SKU is available for this configuration.");if(X.price?.expiresAt&&Date.parse(X.price.expiresAt)<=Date.now())return $(),I("The price expired. Refresh it before continuing.");let Y=structuredClone(X.configuration),re=X.price?structuredClone(X.price):null,Fe=new AbortController,K=te.identity;(O.current?.identity!==K||O.current.kind!==Q)&&(O.current={identity:K,kind:Q,key:crypto.randomUUID()});let we=O.current.key;k({identity:K,pending:Q,result:null,error:null});let Pe=Promise.resolve().then(()=>(Fe.signal.throwIfAborted(),F(Y,{signal:Fe.signal,idempotencyKey:we,price:re}))).then(xe=>{if(!xe||typeof xe!="object"||xe.id!==void 0&&typeof xe.id!="string"||xe.message!==void 0&&typeof xe.message!="string")throw new Error("The commerce service returned an invalid result.");let wt={...xe.id?{id:xe.id}:{},...xe.message?{message:xe.message}:{}};return R.current.identity===K&&!Fe.signal.aborted&&k({identity:K,pending:null,result:wt,error:null}),O.current=null,wt}).catch(xe=>{throw R.current.identity===K&&!Fe.signal.aborted&&k({identity:K,pending:null,result:null,error:Ih(xe)}),xe}).finally(()=>{P.current?.promise===Pe&&(P.current=null),M.current&&k(xe=>({...xe,pending:null}))});return P.current={identity:K,kind:Q,promise:Pe,controller:Fe},Pe},[$]),Z=p.valid&&D?.status==="ready"&&w.current&&!P.current&&D.availability?.available!==!1&&!D.availability?.options?.some(Q=>!Q.available&&p.selections[Q.groupId]===Q.optionId)&&(!D.price?.expiresAt||Date.parse(D.price.expiresAt)>Date.now());return{product:n,configuration:B,optionStates:V,selectOption:T,selectOptionWithFix:L,setSelections:U,reset:()=>U(pl(n)),setQuantity:W,exportConfiguration:()=>Mb(B),importConfiguration:Q=>{let te=Pb(Q,n);U(te.selections),W(te.quantity)},viewerProps:{...e.objectBindings!==void 0?{objectBindings:e.objectBindings}:{},sceneConfig:{...e.sceneConfig??al,product:{definition:n,selections:p.selections}}},status:D?.status??(p.valid?"loading":"idle"),price:D?.price??(m?.getPrice||!p.valid?null:yb(n,B)),checkoutUrl:D?.availability?.available===!1?null:xb(n,B),availability:D?.availability??null,error:v??(y.identity===f?y.error:null)??D?.error??null,readOnly:A,pendingAction:P.current?P.current.kind:null,result:y.identity===f?y.result:null,canAddToCart:!!(Z&&m?.addToCart&&(!m.resolveSku||B.sku)),canRequestQuote:!!(Z&&m?.requestQuote),hasCommerce:!!m,hasCart:!!m?.addToCart,hasQuote:!!m?.requestQuote,addToCart:()=>ee("cart"),requestQuote:()=>ee("quote"),refresh:$}}import{useId as gM}from"react";import{Fragment as vM,jsx as Qe,jsxs as At}from"react/jsx-runtime";function bM(e,t){return t.map(n=>e.groups.find(r=>r.id===n.groupId)?.options.find(r=>r.id===n.optionId)?.label).filter(Boolean).join(", ")}function hM({c:e,group:t,option:n,state:r,name:o,display:i,busy:s}){let l=oe(),c=`${o}-${n.id}-reason`,u=!r.available&&r.fix?.length?r.fix:null,p=!r.available&&!u,m=u?l("productAlsoChanges",{changes:bM(e.product,u)}):r.available?"":r.reasons.join(" "),a=n.priceDeltaMinor&&e.product.pricing?sd(n.priceDeltaMinor,e.product.pricing.currency,!0):"",f=["ri-productChoice",r.selected&&"ri-productChoice--selected",!r.available&&"ri-productChoice--unavailable"].filter(Boolean).join(" "),d=Qe("input",{type:"radio",name:o,checked:r.selected,disabled:p||s||e.readOnly,"aria-describedby":m?c:void 0,onChange:()=>{u?e.selectOptionWithFix(t.id,n.id):e.selectOption(t.id,n.id)}});return i==="swatches"?At("label",{className:`${f} ri-productSwatch`,title:[n.label,a,m].filter(Boolean).join(" \xB7 "),children:[d,Qe("span",{className:"ri-productSwatchChip",style:{background:n.swatch??"var(--ri-ui-field)"},"aria-hidden":"true"}),At("span",{className:"ri-productVisuallyHidden",children:[n.label,a?` ${a}`:""]}),m?Qe("span",{id:c,className:"ri-productVisuallyHidden",children:m}):null]}):i==="chips"?At("label",{className:`${f} ri-productChip`,title:m||void 0,children:[d,At("span",{children:[n.label,a?Qe("em",{children:a}):null]}),m?Qe("span",{id:c,className:"ri-productVisuallyHidden",children:m}):null]}):At("label",{className:f,children:[d,n.swatch?Qe("span",{className:"ri-productSwatchChip",style:{background:n.swatch},"aria-hidden":"true"}):null,At("span",{className:"ri-productChoiceText",children:[At("span",{className:"ri-productChoiceTitle",children:[Qe("span",{children:n.label}),a?Qe("em",{children:a}):null]}),n.description?Qe("small",{children:n.description}):null,m?Qe("small",{id:c,children:m}):null]})]})}function yd({configurator:e,className:t="",showCommerce:n=!0,actions:r}){let o=oe(),i=!!e.pendingAction,s=gM(),l=e.price?sd(e.price.amountMinor,e.price.currency):"",c=n&&(e.hasCommerce||!!e.product.pricing||!!e.product.checkout);return At("section",{className:`ri-productOptions ${t}`,"aria-label":o("productOptionsFor",{product:e.product.label}),children:[At("div",{className:"ri-productHeader",children:[Qe("strong",{children:e.product.label}),Qe("button",{type:"button",disabled:i||e.readOnly,onClick:e.reset,children:o("productReset")})]}),e.product.groups.map((u,p)=>{let m=`${s}-${p}`,a=u.display??"list",f=u.options.find(h=>h.id===e.configuration.selections[u.id]),d=u.required?[]:ko(e.product,{...e.configuration.selections,[u.id]:null},e.configuration.quantity).issues.filter(h=>h.groupIds.includes(u.id)).map(h=>h.message);return At("fieldset",{disabled:i||e.readOnly,children:[At("legend",{children:[u.label,u.required?null:At("small",{children:[" (",o("productOptional"),")"]}),a==="swatches"&&f?Qe("span",{className:"ri-productLegendValue",children:f.label}):null]}),At("div",{className:`ri-productChoices ri-productChoices--${a}`,children:[u.required?null:At("label",{className:`ri-productChoice${a==="swatches"||a==="chips"?" ri-productChip":""}${e.configuration.selections[u.id]===null?" ri-productChoice--selected":""}${d.length?" ri-productChoice--unavailable":""}`,title:d.join(" ")||void 0,children:[Qe("input",{type:"radio",name:m,checked:e.configuration.selections[u.id]===null,disabled:!!d.length,onChange:()=>e.selectOption(u.id,null)}),Qe("span",{children:o("productNone")})]}),u.options.map(h=>{let b=e.optionStates.find(x=>x.groupId===u.id&&x.optionId===h.id);return Qe(hM,{c:e,group:u,option:h,state:b,name:m,display:a,busy:i},h.id)})]})]},u.id)}),e.configuration.issues.length?Qe("ul",{className:"ri-productIssues","aria-label":o("productIssues"),children:e.configuration.issues.map((u,p)=>Qe("li",{children:u.message},p))}):null,c?At("div",{className:"ri-productCommerce",children:[At("label",{className:"ri-productQuantity",children:[o("productQuantity"),Qe("input",{type:"number",min:1,max:9999,step:1,value:e.configuration.quantity,disabled:i,onChange:u=>{let p=u.target.valueAsNumber;Number.isSafeInteger(p)&&p>=1&&p<=9999&&e.setQuantity(p)}})]}),e.status==="loading"&&e.hasCommerce?Qe("p",{role:"status",children:o("productCheckingPrice")}):At(vM,{children:[l?At("p",{className:"ri-productPrice",children:[l,Qe("small",{children:e.price?.label??o("productTotal")})]}):null,e.configuration.sku?At("p",{className:"ri-productSku",children:["SKU: ",e.configuration.sku]}):null,e.availability?.available===!1?Qe("p",{className:"ri-productIssues",children:e.availability.message??o("productUnavailable")}):null]}),At("div",{className:"ri-productActions",children:[e.checkoutUrl?Qe("a",{className:"ri-productPrimary",href:e.checkoutUrl,target:"_blank",rel:"noopener noreferrer",children:e.product.checkout?.label??o("productBuy")}):null,e.hasCart?Qe("button",{type:"button",className:e.checkoutUrl?void 0:"ri-productPrimary",disabled:!e.canAddToCart,onClick:()=>{e.addToCart().catch(()=>{})},children:e.pendingAction==="cart"?o("productAddingToCart"):o("productAddToCart")}):null,e.hasQuote?Qe("button",{type:"button",disabled:!e.canRequestQuote,onClick:()=>{e.requestQuote().catch(()=>{})},children:e.pendingAction==="quote"?o("productRequestingQuote"):o("productRequestQuote")}):null,e.hasCommerce?Qe("button",{type:"button",disabled:i||!e.configuration.valid,onClick:e.refresh,children:o("productRefresh")}):null,r]})]}):r?Qe("div",{className:"ri-productActions",children:r}):null,e.error?Qe("p",{className:"ri-productError",role:"alert",children:e.error}):null,e.result?Qe("p",{className:"ri-productSuccess",role:"status",children:e.result.message??(e.result.id?o("productSaved",{id:e.result.id}):o("productRequestDone"))}):null]})}import{useCallback as Xr,useEffect as yM,useRef as Vh,useState as xd}from"react";var wd={currentClip:null,isPlaying:!1,speed:1,time:0,duration:0,active:[]};function $D(){let e=Vh(null),t=Vh(null),[n,r]=xd([]),[o,i]=xd([]),[s,l]=xd(wd);yM(()=>()=>{t.current?.()},[]);let c=Xr(b=>{t.current?.(),e.current=b,r(b.clips),i(b.clipDetails??b.clips.map(x=>({sourceName:x,duration:0}))),l(b.getState?.()??wd),t.current=b.subscribe?.(l)??null},[]),u=Xr(()=>{t.current?.(),t.current=null,e.current=null,r([]),i([]),l(wd)},[]),p=Xr(b=>{let x=e.current;x&&(b(x),!x.subscribe&&x.getState&&l(x.getState()))},[]),m=Xr((b,x)=>p(v=>v.play(b,x)),[p]),a=Xr(b=>p(x=>x.pause(b)),[p]),f=Xr(b=>p(x=>x.stop(b)),[p]),d=Xr((b,x)=>p(v=>v.setSpeed(b,x)),[p]),h=Xr((b,x)=>p(v=>v.seek?.(b,x)),[p]);return{clips:n,clipDetails:o,...s,isRenderPaused:s.isRenderPaused??!1,play:m,pause:a,stop:f,setSpeed:d,seek:h,handleAnimationsReady:c,clearAnimations:u}}import{Fragment as Sl,jsx as fe,jsxs as ue}from"react/jsx-runtime";var gr=e=>e.toLocaleString(),Ci=e=>e==null?"Unknown":e>=1024*1024?`${(e/1024/1024).toFixed(1)} MiB`:`${(e/1024).toFixed(1)} KiB`,Sd=e=>e===null?"Unavailable":gr(e);function xM({report:e,runtimeStats:t,onRefresh:n,onSelectObject:r}){return ue("div",{className:"ri-assetDiagnostics",children:[ue("div",{className:"ri-diagnosticsActions",children:[n&&fe("button",{type:"button",disabled:!e||e.status==="failed",onClick:n,children:"Rescan asset"}),fe("button",{type:"button",disabled:!e,onClick:()=>{$r(new Blob([JSON.stringify({asset:e,runtime:t??null},null,2)],{type:"application/json"}),"asset-diagnostics.json")},children:"Download report"})]}),e?ue(Sl,{children:[ue("div",{className:`ri-diagnosticsSummary ri-diagnosticsSummary--${e.issues.some(o=>o.severity==="error")?"error":e.issues.some(o=>o.severity==="warning")?"warning":"info"}`,children:[fe("strong",{children:e.status==="failed"?"Asset could not be inspected":e.issues.some(o=>o.severity==="error")?"Issues need attention":e.issues.some(o=>o.severity==="warning")?"Review recommended":"No blocking issues found"}),ue("span",{children:[e.issues.filter(o=>o.severity==="error").length," errors \xB7 ",e.issues.filter(o=>o.severity==="warning").length," warnings \xB7 ",e.issues.filter(o=>o.severity==="info").length," notes"]})]}),ue("p",{className:"ri-diagnosticsSource",children:[e.source.name??"Loaded asset"," ",fe("span",{children:e.source.format?.toUpperCase()})]}),ue("details",{className:"ri-diagnosticsDetail",children:[fe("summary",{children:"Asset statistics"}),ue("dl",{className:"ri-diagnosticsMetrics",children:[ue("div",{children:[fe("dt",{children:"Source"}),fe("dd",{children:e.source.name??"Loaded asset"})]}),ue("div",{children:[fe("dt",{children:"Format"}),fe("dd",{children:e.source.format?.toUpperCase()??"Unknown"})]}),ue("div",{children:[fe("dt",{children:"Source file size"}),fe("dd",{children:Ci(e.source.sourceBytes)})]}),ue("div",{children:[fe("dt",{children:"Initial asset load"}),fe("dd",{children:e.source.loadDurationMs==null?"Unknown":`${(e.source.loadDurationMs/1e3).toFixed(2)} s`})]}),ue("div",{children:[fe("dt",{children:"Units"}),fe("dd",{children:e.units==="unknown"?"Unknown \u2014 verify scale":e.units})]}),e.bounds&&ue("div",{children:[fe("dt",{children:"Bounds (scene units)"}),fe("dd",{children:e.bounds.size.map(o=>Number(o.toPrecision(4))).join(" \xD7 ")})]}),e.statistics&&ue(Sl,{children:[ue("div",{children:[fe("dt",{children:"Meshes / instances"}),ue("dd",{children:[gr(e.statistics.meshes)," / ",gr(e.statistics.instances)]})]}),ue("div",{children:[fe("dt",{children:"Unique triangles"}),fe("dd",{children:gr(e.statistics.triangles)})]}),ue("div",{children:[fe("dt",{children:"Unique vertices"}),fe("dd",{children:gr(e.statistics.vertices)})]}),ue("div",{children:[fe("dt",{children:"Materials / textures"}),ue("dd",{children:[gr(e.statistics.materials)," / ",gr(e.statistics.textures)]})]}),ue("div",{children:[fe("dt",{children:"Geometry buffers"}),fe("dd",{children:Ci(e.statistics.geometryBytes)})]}),ue("div",{children:[fe("dt",{children:"Texture memory estimate"}),ue("dd",{children:[Ci(e.statistics.estimatedTextureBytes),e.statistics.unknownTextureSizes?` + ${e.statistics.unknownTextureSizes} unknown`:""]})]})]})]}),ue("p",{className:"ri-diagnosticsNote",children:[e.scope==="resident-tiles"?"Counts cover loaded tiles only. ":"Counts include loaded hidden meshes. ","Buffer sizes and texture memory are estimates, not a GPU memory budget. Units do not verify physical scale."]})]}),fe("div",{className:"ri-diagnosticsIssues",children:e.issues.map((o,i)=>ue("details",{className:`ri-diagnosticsIssue ri-diagnosticsIssue--${o.severity}`,children:[ue("summary",{children:[fe("span",{className:"ri-diagnosticsSeverity",children:o.severity}),o.title,o.count!==void 0&&fe("span",{className:"ri-diagnosticsCount",children:gr(o.count)})]}),ue("div",{children:[fe("p",{children:o.detail}),fe("p",{className:"ri-diagnosticsFix",children:o.suggestion}),!!o.objects?.length&&fe("ul",{"aria-label":`Affected objects: ${o.title}`,children:o.objects.map((s,l)=>fe("li",{children:r&&!["failed-resources","large-textures"].includes(o.code)?fe("button",{type:"button",onClick:()=>r(s),children:s}):s},`${s}-${l}`))}),o.count&&o.count>(o.objects?.length??0)&&o.objects&&ue("small",{children:["Showing the first ",o.objects.length," of ",gr(o.count),"."]})]})]},`${o.code}-${i}`))}),!!e.textures.length&&ue("details",{className:"ri-diagnosticsDetail",children:[ue("summary",{children:["Texture dimensions (",e.textures.length,")"]}),fe("ul",{children:e.textures.map((o,i)=>ue("li",{children:[fe("strong",{children:o.name}),ue("span",{children:[o.width??"?"," \xD7 ",o.height??"?",o.compressed?" \xB7 compressed":""," \xB7 ",Ci(o.estimatedBytes)]})]},i))})]}),!!e.extensions.length&&ue("details",{className:"ri-diagnosticsDetail",children:[ue("summary",{children:["glTF extensions (",e.extensions.length,")"]}),fe("ul",{children:e.extensions.map(o=>ue("li",{children:[fe("strong",{children:o.name}),ue("span",{children:[o.recognized?"Recognized":"Not recognized",o.required?" \xB7 required":" \xB7 optional"]})]},o.name))}),fe("p",{className:"ri-diagnosticsNote",children:"Recognized by the bundled loader; compressed formats still require configured decoders and device support."})]})]}):fe("p",{className:"ri-diagnosticsNote",role:"status",children:"Waiting for the active asset to load\u2026"}),ue("details",{className:"ri-diagnosticsDetail ri-diagnosticsRuntimeDetail",children:[fe("summary",{children:"Runtime statistics \xB7 live"}),ue("section",{className:"ri-diagnosticsRuntime","aria-label":"Runtime statistics",children:[ue("h4",{children:["Runtime statistics ",fe("span",{children:"Live \xB7 this canvas"})]}),t?ue(Sl,{children:[ue("dl",{className:"ri-diagnosticsMetrics",children:[ue("div",{children:[fe("dt",{children:"Renderer / render loop"}),ue("dd",{children:[t.renderer.toUpperCase()," / ",t.renderMode]})]}),ue("div",{children:[fe("dt",{children:"Draw calls (last pass)"}),fe("dd",{children:Sd(t.drawCalls)})]}),ue("div",{children:[fe("dt",{children:"Triangles (last pass)"}),fe("dd",{children:Sd(t.triangles)})]}),ue("div",{children:[fe("dt",{children:"Frame interval / FPS"}),fe("dd",{children:t.frameIntervalMs===null?"Idle / no active frame sample":`${t.frameIntervalMs.toFixed(1)} ms / ${t.fps?.toFixed(0)}`})]}),ue("div",{children:[fe("dt",{children:"Quality profile"}),ue("dd",{children:[t.quality.profile," \xB7 ",t.quality.reducedGpuLoad?"reduced GPU load":"full quality"]})]}),ue("div",{children:[fe("dt",{children:"Pixel ratio"}),fe("dd",{children:t.quality.dpr.toFixed(2)})]}),ue("div",{children:[fe("dt",{children:"Shadows / post FX"}),ue("dd",{children:[t.quality.shadows?"On":"Off"," / ",t.quality.postProcessing?"Allowed":"Skipped"]})]}),t.streaming&&ue(Sl,{children:[ue("div",{children:[fe("dt",{children:"Tile cache / base budget"}),ue("dd",{children:[Ci(t.streaming.cachedBytes)," / ",Ci(t.streaming.budgetBytes)]})]}),ue("div",{children:[fe("dt",{children:"Cached / loading / parsing tiles"}),ue("dd",{children:[Sd(t.streaming.cachedTiles)," / ",t.streaming.downloading," / ",t.streaming.parsing]})]}),ue("div",{children:[fe("dt",{children:"Detail / error target"}),ue("dd",{children:["\xD7",t.streaming.detailFactor.toFixed(1)," / ",t.streaming.errorTarget.toFixed(1)]})]})]})]}),t.streaming&&(t.streaming.cacheFull||t.streaming.detailFactor>1)&&ue("p",{className:"ri-diagnosticsPressure",children:[t.streaming.cacheFull?"Tile cache is full. ":"",t.streaming.detailFactor>1?"Detail was reduced by the existing memory-pressure safeguard. ":"","Try smaller textures or a larger cache budget when the device can support it."]}),fe("p",{className:"ri-diagnosticsNote",children:"Frame intervals describe active frame callbacks, not CPU/GPU execution time. Long demand-loop idle gaps are excluded. Draw counts may reflect a post-processing pass. Sampling does not keep rendering awake."})]}):fe("p",{className:"ri-diagnosticsNote",children:"Collecting a sample\u2026"})]})]})]})}import{AlertTriangle as wM}from"lucide-react";import{jsx as Oa,jsxs as Fh}from"react/jsx-runtime";function Cl({title:e,message:t,tone:n="default",showKeySetup:r=!1}){let o=oe();return Fh("div",{className:`ri-license-overlay${n==="error"?" ri-license-overlay--error":""}`,children:[Fh("div",{className:"ri-license-overlay__header",children:[n==="error"?Oa(wM,{size:16,className:"ri-license-overlay__icon","aria-hidden":"true"}):Oa("span",{className:"ri-license-overlay__statusDot","aria-hidden":"true"}),Oa("span",{className:"ri-license-overlay__title",children:e})]}),t?Oa("p",{className:"ri-license-overlay__message",children:t}):null,r&&Oa("a",{href:"https://react-immersive.liveroom.dev/console",target:"_blank",rel:"noopener noreferrer",children:o("createDevelopmentKey")})]})}import{useEffect as kd,useState as kM,useRef as RM}from"react";var SM="ri:license-grant:v1",CM={"260cd89ea13f":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwjr3ofKTkkcxOM0GYl/RlJj9JsuyjSF8sYmCd2YqsHJCEO8EvlNDrO2Kl4agFKo6dRhyR2/oWeiU6P9WIqRbvw=="},Hh=new Map;function Uh(e){let t=atob(e);return Uint8Array.from(t,n=>n.charCodeAt(0)).buffer}function Gh(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return Uh(t.padEnd(Math.ceil(t.length/4)*4,"="))}function MM(e){if(!e||typeof e!="object")return!1;let t=e;return t.version===1&&typeof t.licenseKeyHash=="string"&&typeof t.domain=="string"&&(t.environment==="development"||t.environment==="production")&&typeof t.tier=="string"&&t.tier.length>0&&typeof t.issuedAt=="number"&&Number.isInteger(t.issuedAt)&&typeof t.expiresAt=="number"&&Number.isInteger(t.expiresAt)}async function Ml(e){let t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e.trim())),n=String.fromCharCode(...new Uint8Array(t));return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function Cd(e,t){return`${SM}:${t}:${e}`}function PM(e,t){let n=Hh.get(e);if(n)return n;let r=crypto.subtle.importKey("spki",Uh(t),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);return Hh.set(e,r),r}async function Md(e,t,n){if(!globalThis.crypto?.subtle)return null;try{let[r,o,i,s,...l]=e.split("."),c=CM[o];if(r!=="ri1"||!c||!i||!s||l.length>0)return null;let u=JSON.parse(new TextDecoder().decode(Gh(i)));if(!MM(u)||!await crypto.subtle.verify({name:"ECDSA",hash:"SHA-256"},await PM(o,c),Gh(s),new TextEncoder().encode(`${r}.${o}.${i}`)))return null;let m=Math.floor(Date.now()/1e3),a=u.expiresAt-u.issuedAt;return u.licenseKeyHash!==t||u.domain!==n||u.expiresAt<=m||u.issuedAt>m+300||a<=0||a>43200?null:{environment:u.environment,tier:u.tier,expiresAt:u.expiresAt}}catch{return null}}async function $h(e,t,n){try{return await Md(e,await Ml(t),n)}catch{return null}}async function Wh(e,t,n){try{let r=await Ml(t);return await Md(e,r,n)?(localStorage.setItem(Cd(r,n),e),!0):!1}catch{return!1}}async function Xh(e,t){try{let n=await Ml(e),r=Cd(n,t),o=localStorage.getItem(r);if(!o)return null;let i=await Md(o,n,t);return i||localStorage.removeItem(r),i}catch{return null}}async function Pd(e,t){try{let n=await Ml(e);localStorage.removeItem(Cd(n,t))}catch{}}var AM=["localhost","127.0.0.1","0.0.0.0"],OM=e=>AM.includes(e)||e.endsWith(".local")||e.endsWith(".localhost"),Jh="https://react-immersive.liveroom.dev/api/validate-license",Od=()=>typeof window<"u",EM=300*1e3,DM=5e3,TM=400,Ad=new Map,Rd=new Map,qr=class extends Error{},Yh=async(e,t,n)=>{let r=await Xh(e,t);return r?(console.warn("[react-immersive] License server unreachable \u2014 using a previously verified, time-limited offline grant."),{status:"valid",reason:"Previously verified offline grant",environment:r.environment,tier:r.tier,isLocalDomain:n}):null},qh=async(e,t,n)=>{let r=await Yh(e,t,n);return r||(console.warn("[react-immersive] License server unreachable and no valid offline grant is available \u2014 license validation failed."),{status:"invalid",reason:"Could not reach license server",isLocalDomain:n})},LM=e=>e instanceof qr||e instanceof TypeError,_M=()=>new Promise(e=>setTimeout(e,TM)),BM=e=>e==="development"||e==="production",jM=e=>{if(!e||typeof e!="object")return!1;let t=e;return!(typeof t.valid!="boolean"||t.reason!==void 0&&typeof t.reason!="string"||t.environment!==void 0&&!BM(t.environment)||t.tier!==void 0&&typeof t.tier!="string"||t.offlineGrant!==void 0&&typeof t.offlineGrant!="string")},NM=e=>{if(!e||typeof e!="object")return null;let t=e,n=t.reason??t.error;return typeof n=="string"&&n.trim()?n:null},Zh=(e,t,n)=>`${n}::${e}::${t}`,ev=e=>{let t=Ad.get(e);return t?Date.now()-t.timestamp>EM?(Ad.delete(e),null):t.result:null},IM=(e,t)=>({status:e.valid?"valid":"invalid",reason:e.reason,environment:e.environment,tier:e.tier,isLocalDomain:t}),zM=(e,t)=>({status:"invalid",reason:e,isLocalDomain:t});async function VM(e,t,n,r){let o=Zh(e,t,r),i=ev(o);if(i)return i;let s=Rd.get(o);if(s)return s;let l=(async()=>{for(let c=0;c<2;c+=1)try{return await FM(e,t,n,o,r)}catch(u){if(!LM(u))throw u;if(c===0){let p=await Yh(e,t,n);if(p)return p;await _M();continue}return qh(e,t,n)}return qh(e,t,n)})().finally(()=>{Rd.delete(o)});return Rd.set(o,l),l}async function FM(e,t,n,r,o){let i=new AbortController,s=setTimeout(()=>i.abort(),DM),l;try{l=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},cache:"no-store",signal:i.signal,body:JSON.stringify({licenseKey:e,domain:t})})}catch(p){throw i.signal.aborted?new qr("License validation timed out"):p}finally{clearTimeout(s)}let c;try{c=await l.json()}catch{throw new qr(`License server returned a non-JSON response${l.status?` (${l.status})`:""}`)}if(!l.ok){if(l.status===429||l.status>=500)throw new qr(`License server error (${l.status})`);let p=NM(c)??`License validation failed${l.status?` (${l.status})`:""}`;return await Pd(e,t),zM(p,n)}if(!jM(c))throw new qr("License server returned an unexpected payload");let u=IM(c,n);if(u.status==="valid"&&o!==Jh){let p=c.offlineGrant?await $h(c.offlineGrant,e,t):null;if(!p)throw new qr("License validation endpoint did not return a verifiable signed grant");u={...u,environment:p.environment,tier:p.tier}}return u.status==="valid"?(Ad.set(r,{result:u,timestamp:Date.now()}),c.offlineGrant&&(await Wh(c.offlineGrant,e,t)||console.warn("[react-immersive] The license server returned an invalid offline grant; it was not cached."))):await Pd(e,t),u}var Kh=(e,t)=>{let n=e.trim();return!Od()||!n?null:ev(Zh(n,window.location.hostname.toLowerCase(),t))},Qh=new Set,HM=e=>{if(e.status!=="invalid"||e.isLocalDomain||!Od())return;let t=window.location.hostname,n=e.reason??"License validation failed",r=`${t}
|
|
4
|
+
${n}`;Qh.has(r)||(Qh.add(r),console.warn(`[react-immersive] The viewer is not licensed for ${t}: ${n}. See https://react-immersive.liveroom.dev/docs/licensing`))},tv=(e,t=Jh,n)=>{let[r,o]=kM(()=>Kh(e,t)??{status:"checking",isLocalDomain:!1}),i=RM(n);return i.current=n,kd(()=>{i.current?.(r)},[r]),kd(()=>{HM(r)},[r]),kd(()=>{if(!Od())return;let s=!1,l=f=>{s||o(f)},c=e.trim(),u=window.location.hostname.toLowerCase(),p=OM(u),m=Kh(e,t);return m?(l(m),()=>{s=!0}):(l({status:"checking",isLocalDomain:p}),c?((async()=>{try{l(await VM(c,u,p,t))}catch(f){let d=f instanceof TypeError?"Could not reach license server":f instanceof Error?f.message:"License validation failed";l({status:"invalid",reason:d,isLocalDomain:p})}})(),()=>{s=!0}):(l({status:"invalid",reason:"No license key provided",isLocalDomain:p}),()=>{s=!0}))},[e,t]),r};import{Box3 as GM,Mesh as UM,Raycaster as $M,Triangle as WM,Vector3 as Kn}from"three";function nv(e,t){if(!(e instanceof UM)||!t)return null;let n=e.geometry.getAttribute("position");if(!n?.count)return null;e.updateWorldMatrix(!0,!1),t.updateWorldMatrix(!0,!1);let r=new GM,o=new Kn;if(qn(e)){let w=e;w.computeBoundingBox(),w.computeBoundingSphere();for(let M=0;M<n.count;M++)r.expandByPoint(e.getVertexPosition(M,o))}else e.geometry.boundingBox||e.geometry.computeBoundingBox(),r.copy(e.geometry.boundingBox);if(r.applyMatrix4(e.matrixWorld),r.isEmpty())return null;let i=r.getCenter(new Kn),s=t.getWorldPosition(new Kn),l=t.getWorldDirection(new Kn),c=t.isOrthographicCamera,u=new $M,p=w=>{if(c){let E=s.distanceTo(i)+r.getSize(o).length()+1;u.set(w.clone().addScaledVector(l,-E),l)}else u.set(s,w.clone().sub(s).normalize());let M=u.intersectObject(e,!1)[0];return M?yi({...M,ray:u.ray},e):null},m=p(i);if(m)return m;let a=e.geometry.index,f=a?.count??n.count,d=new Kn,h=new Kn,b=new Kn,x=new Kn,v=new Kn,S=new Kn,y=null,k=1/0;for(let w=0;w+2<f;w+=3){if(e.getVertexPosition(a?a.getX(w):w,d).applyMatrix4(e.matrixWorld),e.getVertexPosition(a?a.getX(w+1):w+1,h).applyMatrix4(e.matrixWorld),e.getVertexPosition(a?a.getX(w+2):w+2,b).applyMatrix4(e.matrixWorld),x.copy(d).add(h).add(b).multiplyScalar(1/3),WM.getNormal(d,h,b,v),c?S.copy(l).negate():S.copy(s).sub(x),v.dot(S)<=0)continue;let M=x.distanceToSquared(i);M<k&&(k=M,y=x.clone())}return y?p(y):null}import{Mesh as XM,Raycaster as qM,Triangle as KM,Vector2 as rv,Vector3 as br}from"three";function ov(e,t,n,r){if(!(e instanceof XM)||!t)return null;e.updateWorldMatrix(!0,!1),t.updateWorldMatrix(!0,!1);let o=new br().fromArray(n.position);if(qn(e)){let u=e;u.computeBoundingBox(),u.computeBoundingSphere();let p=u.geometry.getAttribute("position");if(!p)return null;let m=u.geometry.index,a=m?.count??p.count,f=new KM,d=new br,h=new br,b=1/0,x=null;for(let v=0;v+2<a;v+=3){let S=[0,1,2].map(k=>m?m.getX(v+k):v+k);f.a.fromBufferAttribute(p,S[0]),f.b.fromBufferAttribute(p,S[1]),f.c.fromBufferAttribute(p,S[2]),f.closestPointToPoint(o,d);let y=d.distanceToSquared(o);if(!(y>=b||!f.getBarycoord(d,h))&&(b=y,x=new br().addScaledVector(u.getVertexPosition(S[0],new br),h.x).addScaledVector(u.getVertexPosition(S[1],new br),h.y).addScaledVector(u.getVertexPosition(S[2],new br),h.z),b<1e-12))break}if(!x)return null;o.copy(x)}if(o.applyMatrix4(e.matrixWorld).project(t),!Number.isFinite(o.x)||o.z<-1||o.z>1)return null;let i=new rv(r==="left"?-.0035:r==="right"?.0035:0,r==="down"?-.0035:r==="up"?.0035:0),s=new qM,l=n.size*.01,c=new br().fromArray(n.position);for(let u=1;u>=1/1024;u/=2){s.setFromCamera(new rv(o.x,o.y).addScaledVector(i,u),t);let p=s.intersectObject(e,!1)[0];if(p){let m=yi({...p,ray:s.ray},e);if(new br().fromArray(m.position).distanceTo(c)<=l)return m}}return null}import{Box3 as Ea,PerspectiveCamera as iv,Sphere as QM,Vector3 as Mi}from"three";function av(e,t,n,r,o,i=!1){return!!(e?.usesSlots&&t.usesSlots&&e.url!==t.url&&n.includes(e.url)&&n.includes(t.url)&&r[e.url]&&r[t.url]&&(i||o[e.url]&&o[t.url]))}function Ed(e,t,n){let r=t?.camera;if(!(r instanceof iv))return null;let i=(e instanceof Ea?e:new Ea().setFromObject(e)).getSize(new Mi).length();return!Number.isFinite(i)||i<=0?null:(r.near=i/100,r.far=i*100,r.updateProjectionMatrix(),t&&n===void 0&&(t.maxDistance=i*10),i)}function sv(e,t){let n=e.camera;if(!(n instanceof iv)||!(t>0))return;let r=Math.min(Math.max(e.distance/200,t/1e5),t/100);Math.abs(r-n.near)<=n.near*.01||(n.near=r,n.updateProjectionMatrix())}var Pl={paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5},Da={kind:"model"};function lv(e,t){let n=new Ea().setFromObject(t);return n.isEmpty()?!1:(n.expandByScalar(n.getSize(new Mi).length()*.05),n.containsPoint(e.getTarget(new Mi)))}function cv(e,t){return e.getTarget(new Mi).distanceTo(t)<=Math.max(e.distance,1)*.001}async function Dd(e,t,n=.6){let r=e.smoothTime;e.smoothTime=Zs(e,n);try{return await t()}finally{e.smoothTime=r}}async function uv(e,t,{flyIn:n,onStart:r,invalidate:o}){if(n){let i=(t instanceof Ea?t:new Ea().setFromObject(t)).getBoundingSphere(new QM),s=i.center.clone(),c=e.getPosition(new Mi).clone().sub(e.getTarget(new Mi));c.lengthSq()<1e-6&&c.set(0,0,1),c.normalize();let u=Math.max(i.radius*10,20),p=s.clone().add(c.multiplyScalar(u));await e.setLookAt(p.x,p.y,p.z,s.x,s.y,s.z,!1)}r(),await Dd(e,()=>e.fitToBox(t,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),await new Promise(i=>{let s=performance.now(),l=()=>{e.active===!1||performance.now()-s>8e3?(e.dispatchEvent({type:"update"}),o(),i()):(o(),setTimeout(l,100))};setTimeout(l,100)})}import{useEffect as JM,useMemo as dv,useRef as YM}from"react";import{useFrame as ZM,useThree as e1}from"@react-three/fiber";import{Box3 as t1,Box3Helper as n1,Group as r1}from"three";import{jsx as o1}from"react/jsx-runtime";function pv({source:e,highlights:t}){let n=e1(s=>s.invalidate),r=dv(()=>new r1,[]),o=dv(()=>t.map(s=>{let l=new n1(new t1,s.color);l.raycast=()=>{};let c=l.material;return c.depthTest=!1,c.transparent=!0,c.opacity=.85,l.renderOrder=1e3,fi(l),{helper:l,id:s.objectId}}),[t]);JM(()=>{for(let{helper:s}of o)r.add(s);return n(),()=>{for(let{helper:s}of o)r.remove(s),s.geometry.dispose(),s.material.dispose();n()}},[r,o,n]);let i=YM(null);return ZM(()=>{let s=e.current;if(!s){r.visible=!1;return}r.visible=!0,(i.current?.root!==s||i.current.helpers!==o)&&(i.current={root:s,helpers:o,nodes:Vr(s).nodesById});let l=i.current.nodes;for(let{helper:c,id:u}of o){let p=l[u];c.visible=!!p,p&&c.box.setFromObject(p)}}),o1("primitive",{object:r})}function mv(e){let t=[],n="",r=null,o=null,i=0,s="stopped",l=!1,c=[],u=0,p=!1,m=!1,a={sequenceId:null,time:0,duration:0,status:s,previewing:l,ready:!1,issues:[]},f=new Set,d=()=>t.find(y=>y.id===o),h=()=>{a={sequenceId:o,time:i,duration:d()?.duration??0,status:s,previewing:l,ready:!!r,issues:c},f.forEach(y=>y())},b=()=>{r?.restore(),i=0,s="stopped",l=!1,h(),r?.invalidate()},x=y=>t.some(k=>k.id===y)?(o===y||(r?.restore(),o=y,i=0,s="stopped",l=!1,c=r?.inspect(d())??[],h(),r?.invalidate()),!0):!1,v=y=>{if(y&&!x(y))return!1;let k=d();return!r||!k?.tracks.some(w=>!w.muted&&w.keyframes.length)?!1:(e?.(),m=!0,i>=k.duration&&(i=0),s="playing",l=!0,c=r.inspect(k),h(),r.invalidate(),!0)},S=()=>{if(!r||!p||m)return;let y=t.find(k=>k.autoPlay);y&&v(y.id)};return{getState:()=>a,subscribe:y=>(f.add(y),()=>{f.delete(y)}),select:x,play:v,stop:b,pause:()=>{s==="playing"&&(s="paused",h())},seek:y=>{let k=d();return!r||!k||!Number.isFinite(y)?!1:(e?.(),i=Math.max(0,Math.min(k.duration,y)),l=!0,s!=="playing"&&(s="paused"),c=r.inspect(k),h(),r.invalidate(),!0)},capture:y=>r?.capture(y)??null,configure:(y,k)=>{p=k;try{let w=Js(y??[]),M=JSON.stringify(w);if(n===M){S();return}r?.restore(),t=w,n=M,d()||(o=t[0]?.id??null,i=0,l=!1),i=Math.min(i,d()?.duration??0),s=l?"paused":"stopped",c=d()?r?.inspect(d())??[]:[],h(),r?.invalidate(),S()}catch(w){b(),t=[],n="",o=null,c=[w instanceof Error?w.message:"Invalid sequence configuration."],h()}},connect:y=>{r?.restore(),r=y,y||(s="stopped",l=!1,i=0),c=d()?r?.inspect(d())??[]:[],h(),S()},advance:y=>{let k=d();if(!k||!r||s!=="playing"||!Number.isFinite(y)||y<0)return;let w=Math.min(y,.1);i+=w,u+=w,i>=k.duration&&(k.loop?i%=k.duration:(i=k.duration,s="finished")),(u>=1/30||s==="finished")&&(u=0,h())},frame:()=>{let y=d();return l&&y?{sequence:y,time:i,playing:s==="playing"}:null},destroy:()=>{r?.restore(),r=null,s="stopped",l=!1,i=0,h()}}}import{useLayoutEffect as kl,useMemo as i1,useRef as a1}from"react";import{useFrame as s1,useThree as l1}from"@react-three/fiber";function fv({controller:e,source:t,controls:n,animations:r,ready:o,sequences:i,autoPlay:s,authoredRevision:l,cameraEnabled:c=!0}){let u=l1(a=>a.invalidate),p=a1({source:t,controls:n,animations:r,cameraEnabled:c});p.current={source:t,controls:n,animations:r,cameraEnabled:c};let m=i1(()=>$g({root:()=>p.current.source.current,controls:()=>p.current.controls.current,animations:()=>p.current.animations.current,cameraEnabled:()=>p.current.cameraEnabled,invalidate:u}),[e,u]);return kl(()=>(u(),()=>m.restore()),[m,l,i,u]),kl(()=>{e.configure(i,s)},[e,i,s]),kl(()=>(e.connect(o?m:null),()=>e.connect(null)),[e,m,o]),kl(()=>{if(!c)return;let a=n.current,f=()=>e.pause();return a?.addEventListener("controlstart",f),()=>a?.removeEventListener("controlstart",f)},[e,n,o,c]),s1((a,f)=>{if(!o)return;e.advance(f);let d=e.frame();d&&m.apply(d),d?.playing&&u()}),null}import{useEffect as gv,useRef as bv,useState as hv}from"react";function vv(e,t){if(!e?.configuration)return e;let n=e.configuration,r=n.models?.find(i=>Ae(i)===t||i.url===t);if(!r)return e;let o=n.activeModelId??n.modelUrl;return{...e,objectBindings:r.objectBindings,configuration:{...n,models:n.models?.map(i=>Ae(i)===o?{...i,sceneConfig:n.sceneConfig,objectBindings:e.objectBindings??i.objectBindings}:i),activeModelId:Ae(r),modelUrl:r.url,sceneConfig:r.sceneConfig??n.sceneConfig}}}function yv(e){let[t,n]=hv(null),[r,o]=hv(null),i=ml(e.arHandoff),s=!!e.arHandoff&&i?.autoRestore!==!1,l=i?.storage,c=`${e.modelUrl}
|
|
5
|
+
${e.activeModelId??""}`,u=bv(c);u.current=c;let p=bv(c);if(gv(()=>{c!==p.current&&(p.current=c,n(null))},[c]),gv(()=>{if(!s||typeof window>"u"){n(null),o(null);return}let a,f=()=>{a?.abort(),a=new AbortController;let d=a.signal,h=u.current;o(null),Ob(window.location.href,l,d).then(b=>{!d.aborted&&u.current===h&&n(b)}).catch(b=>{!d.aborted&&u.current===h&&(n(null),o(b instanceof Error?b.message:"Could not restore the AR configuration."))})};return f(),window.addEventListener("hashchange",f),()=>{a?.abort(),window.removeEventListener("hashchange",f)}},[s,l]),!t?.configuration)return{props:e,error:r};let m=t.configuration;return{error:r,props:{...e,...m,objectBindings:t.objectBindings??e.objectBindings,onObjectBindingsChange:a=>{n(f=>f?.configuration?{...f,objectBindings:a,configuration:{...f.configuration,models:f.configuration.models?.map(d=>Ae(d)===(f.configuration?.activeModelId??f.configuration?.modelUrl)?{...d,objectBindings:a}:d)}}:f),e.onObjectBindingsChange?.(a)},onSceneConfigChange:a=>{n(f=>f?.configuration?{...f,configuration:{...f.configuration,sceneConfig:a}}:f),e.onSceneConfigChange?.(a)},onIsolationChange:a=>{n(f=>f?.configuration?{...f,configuration:{...f.configuration,isolation:a}}:f),e.onIsolationChange?.(a)},onActiveModelChange:a=>{n(f=>vv(f,a)),e.onActiveModelChange?.(a)},onModelChange:a=>{n(f=>vv(f,a)),e.onModelChange?.(a)}}}}import{useCallback as Td,useEffect as Rl,useRef as Ta,useState as Ld}from"react";function xv({enabled:e,options:t,state:n,getSources:r,baseUrl:o,revision:i="",autoPrepare:s=!1,preparePhoneLink:l=!0}){let c,u=!1;try{c=e?Rb(n,t?.assetVersion,t?.maxTextureSize)+(o??"")+i:"disabled"}catch{u=!0,c="invalid-configuration"+(t?.assetVersion??"")+i}l||(c+=":usdz-only");let[p,m]=Ld(!1),[a,f]=Ld(!1),[d,h]=Ld(null),b=Ta(null),x=Ta(!1),v=Ta(null),S=Ta(null),y=Ta({key:c,state:n,options:t,getSources:r,baseUrl:o,enabled:e,invalidConfiguration:u,preparePhoneLink:l});y.current={key:c,state:n,options:t,getSources:r,baseUrl:o,enabled:e,invalidConfiguration:u,preparePhoneLink:l};let k=Td(()=>{v.current&&URL.revokeObjectURL(v.current),v.current=null},[]);Rl(()=>{b.current?.abort(),x.current=!1,f(!1),k(),h(R=>e&&R?{key:R.key,invalidated:!0,warnings:[]}:null),e||m(!1)},[c,e,k]),Rl(()=>()=>{b.current?.abort(),k()},[k]);let w=e&&!d?.invalidated&&d?.key===c,M=w&&!!(d.usdzUrl||d.phoneUrl),E=a?"preparing":e?d&&!w?"stale":w?M?"ready":"error":"idle":"idle";Rl(()=>{y.current.options?.onStatusChange?.(E)},[E]);let P=Td(()=>{b.current?.abort(),x.current&&(h(null),k()),x.current=!1,f(!1),m(!1)},[k]),O=Td(async()=>{let R=y.current;if(!R.enabled)return;b.current?.abort(),k(),h(null),f(!0),x.current=!0;let A=new AbortController;b.current=A;let D=()=>!A.signal.aborted&&y.current.key===R.key&&y.current.enabled,B=ee=>{D()&&h(Z=>({...Z?.key===R.key&&!Z.invalidated?Z:{key:R.key,warnings:[]},...ee}))},V;try{if(R.invalidConfiguration)throw new Error("Invalid configuration");V=structuredClone(R.state)}catch{let ee=new Error("Configuration contains data that cannot be copied for AR. Use JSON-compatible binding metadata.");x.current=!1,f(!1),B({exportError:ee.message}),R.options?.onError?.(ee);return}let $,U={configurationKey:R.key,state:V,signal:A.signal,exportUSDZ:()=>$??($=Promise.resolve().then(()=>Nb(R.getSources(),{scaleMode:R.state.configuration?.arScaleMode,maxTextureSize:R.options?.maxTextureSize,signal:A.signal})))},T=[],L=async()=>{try{let ee=R.options?.createUSDZ?await R.options.createUSDZ(U):(await U.exportUSDZ()).blob,Z=$?await $.then(te=>te.warnings,()=>[]):[];if(!D())return;let Q;if(typeof ee=="string")Q=ld(ee,window.location.href);else if(ee instanceof Blob&&ee.size>0)Q=URL.createObjectURL(ee),v.current=Q;else throw new Error("The USDZ adapter returned an empty asset.");B({usdzUrl:Q,warnings:Z})}catch(ee){let Z=ee instanceof Error?ee.message:String(ee);T.push(Z),B({exportError:Z})}},W=async()=>{try{let ee=R.options?.createMobileUrl?await R.options.createMobileUrl(U):await kb(U.state,window.location.href).then(Q=>Ab(Q,R.baseUrl||window.location.href,R.options?.storage,A.signal));if(!D())return;let Z=ld(ee,window.location.href);if(Z.length>2200)throw new Error("The phone link is too long for a reliable QR code.");B({phoneUrl:Z})}catch(ee){let Z=ee instanceof Error?ee.message:String(ee);!R.options?.createMobileUrl&&Z.includes("durable URL")&&(Z="QR sharing isn\u2019t available for local uploads. Download the USDZ and send it to your phone."),!R.options?.createMobileUrl&&(Z.includes("reachable from your phone")||Z.includes("asset URL points to this computer"))&&(Z="QR sharing needs a viewer page and model files your phone can reach. Use an online viewer, or download the USDZ."),T.push(Z),B({linkError:Z})}};await Promise.all([L(),R.preparePhoneLink?W():Promise.resolve()]),D()&&(x.current=!1,f(!1),T.length&&R.options?.onError?.(new Error(T.join(`
|
|
6
|
+
`))))},[k]);return Rl(()=>{if(!e||!p&&!s){S.current=null;return}M||a||S.current===c||(S.current=c,O())},[e,p,s,c,M,a,O]),{open:e&&p,show:()=>m(!0),close:P,prepare:O,status:E,busy:a,prepared:w?d:null}}import{useEffect as p1,useId as m1,useRef as f1}from"react";import{lazy as c1,Suspense as u1}from"react";import{jsx as _d}from"react/jsx-runtime";var d1=c1(()=>import("qrcode.react").then(e=>({default:e.QRCodeSVG})));function Al(e){let t=e.size??128;return _d(u1,{fallback:_d("span",{"aria-hidden":"true",style:{display:"inline-block",width:t,height:t}}),children:_d(d1,{...e})})}import{Download as g1,ExternalLink as b1,LoaderCircle as h1,RefreshCw as v1,Smartphone as y1,X as x1}from"lucide-react";import{Fragment as w1,jsx as Mt,jsxs as Pi}from"react/jsx-runtime";function wv({handoff:e,filename:t,onQuickLook:n}){let r=oe(),o=m1(),i=f1(null),s=e.close;p1(()=>{let p=document.activeElement;i.current?.focus();let m=a=>{if(a.key==="Escape"&&(a.preventDefault(),s()),a.key!=="Tab")return;let f=Array.from(i.current.querySelectorAll("button:not(:disabled), a[href], summary")),d=f[0],h=f[f.length-1];a.shiftKey&&(document.activeElement===d||document.activeElement===i.current)?(a.preventDefault(),h?.focus()):!a.shiftKey&&(document.activeElement===h||document.activeElement===i.current)&&(a.preventDefault(),d?.focus())};return document.addEventListener("keydown",m),()=>{document.removeEventListener("keydown",m),p?.focus()}},[s]);let l=e.prepared,c=!e.busy&&(e.status==="ready"||e.status==="error"),u=e.status==="error"?r("arRetry"):r("arRefresh");return Mt("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:p=>{p.target===p.currentTarget&&s()},children:Pi("section",{ref:i,tabIndex:-1,className:"ri-mobileHandoffDialog ri-configuredARDialog",role:"dialog","aria-modal":"true","aria-labelledby":o,"aria-busy":e.busy&&!l?.phoneUrl&&!l?.usdzUrl,children:[Mt("button",{type:"button",className:"ri-mobileHandoffClose",onClick:s,"aria-label":r("closePhoneHandoff"),children:Mt(x1,{size:18})}),Mt(y1,{size:22,"aria-hidden":"true"}),Mt("h2",{id:o,children:r("arConfiguredTitle")}),Mt("div",{role:"status","aria-live":"polite",className:"ri-configuredARProgress",children:(e.busy||e.status==="idle"||e.status==="stale")&&Pi("p",{children:[Mt(h1,{size:16,"aria-hidden":"true"}),r("arPreparing")]})}),l?.phoneUrl&&Pi(w1,{children:[Mt("p",{children:r("arScanConfigured")}),Mt("div",{className:"ri-mobileHandoffQr",children:Mt(Al,{value:l.phoneUrl,size:208,level:"M",marginSize:4,title:r("qrCodeToOpenThisModelOnAPhone")})})]}),l?.usdzUrl&&fl()&&Pi("a",{rel:"ar",className:"ri-configuredARLaunch",href:l.usdzUrl,onClick:n,children:[Mt("img",{alt:"",width:"1",height:"1",src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="}),r("viewInAR")]}),(l?.phoneUrl||l?.usdzUrl||c)&&Pi("div",{className:"ri-configuredARActions",children:[l?.phoneUrl&&Mt("a",{className:"ri-configuredARAction",href:l.phoneUrl,target:"_blank",rel:"noopener noreferrer",title:r("arOpenConfiguredLink"),"aria-label":r("arOpenConfiguredLink"),children:Mt(b1,{size:16,"aria-hidden":"true"})}),l?.usdzUrl&&Mt("a",{className:"ri-configuredARAction",href:l.usdzUrl,download:`${t}-configured.usdz`,title:r("arDownloadUSDZ"),"aria-label":r("arDownloadUSDZ"),children:Mt(g1,{size:16,"aria-hidden":"true"})}),c&&Mt("button",{type:"button",className:"ri-configuredARAction",onClick:()=>{e.prepare()},title:u,"aria-label":u,children:Mt(v1,{size:16,"aria-hidden":"true"})})]}),l?.exportError&&Mt("p",{role:"alert",children:l.exportError}),l?.linkError&&Mt("p",{role:"status",children:l.linkError}),!!l?.warnings.length&&Pi("details",{className:"ri-configuredARDetails",children:[Mt("summary",{children:r("arExportDetails")}),l.warnings.map(p=>Mt("p",{className:"ri-configuredARNote",children:p},p))]})]})})}import{useState as Sv}from"react";import{Smartphone as Cv}from"lucide-react";import{jsx as ki,jsxs as Bd}from"react/jsx-runtime";function Mv({xrStore:e,arSupported:t,checkingAR:n,quickLookSupported:r,modelReady:o,inARSession:i,handoff:s,onQuickLook:l,animationControls:c}){let u=oe(),[p,m]=Sv(!1),[a,f]=Sv(null);if(i)return null;let d=!!(e&&t),h=s.prepared?.usdzUrl,b=!d&&r?s.prepared?.exportError:void 0,x=d||r,v=o&&(d||!!(r&&h)),S=n?u("arCheckingSupport"):x?o?!v&&!b?u("arPreparing"):null:u("loadingModel"):u("arUnavailable"),y=async()=>{if(e){m(!0),f(null);try{await e.enterAR()}catch(k){f(k instanceof Error?k.message:u("arStartFailed"))}finally{m(!1)}}};return Bd("div",{className:"ri-arLandingControls",children:[r&&!d&&o&&c,v&&!d&&h?Bd("a",{className:"ri-arLandingStart",rel:"ar",href:h,onClick:l,children:[ki("img",{alt:"",width:"1",height:"1",src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="}),ki(Cv,{size:20,"aria-hidden":"true"}),u("arStart")]}):b?ki("button",{type:"button",className:"ri-arLandingStart",onClick:()=>{s.prepare()},children:u("arRetry")}):Bd("button",{type:"button",className:"ri-arLandingStart",disabled:!v||p,onClick:()=>{y()},children:[ki(Cv,{size:20,"aria-hidden":"true"}),u(p?"arStarting":"arStart")]}),S&&ki("p",{role:"status",children:S}),(a||b)&&ki("p",{role:"alert",children:a||b})]})}import{useCallback as kv,useEffect as S1,useMemo as C1,useRef as M1,useState as P1,useSyncExternalStore as k1}from"react";import{Pause as R1,Play as A1}from"lucide-react";function Ol(e,t){return[...e.flatMap(n=>n.controls.clips.flatMap(r=>{let o=n.config?.clips.find(i=>i.sourceName===r);return o?.hidden?[]:[{kind:"clip",id:JSON.stringify(["clip",n.id,r]),label:o?.displayName?.trim()||r,source:n,clip:r}]})),...t.filter(n=>n.tracks.some(r=>!r.muted&&r.keyframes.length&&r.target.kind!=="camera")).map(n=>({kind:"sequence",id:JSON.stringify(["sequence",n.id]),label:n.name,sequence:n}))]}function La(e,t,n,r=!1){(r||e.kind==="clip"&&n.getState().previewing)&&n.stop(),r&&t.forEach(({controls:o})=>o.stop()),e.kind==="clip"?e.source.controls.play(e.clip):n.play(e.sequence.id)}function Pv(e,t){e.kind==="clip"?e.source.controls.pause(e.clip):t.pause()}import{jsx as Ao,jsxs as Rv}from"react/jsx-runtime";function Av({sources:e,sequences:t,sequenceControls:n}){let r=oe(),[o,i]=P1(null),s=M1(null),l=C1(()=>Ol(e,t),[e,t]),c=kv(d=>{let h=e.map(b=>b.controls.subscribe?.(d));return h.push(n.subscribe(d)),()=>h.forEach(b=>b?.())},[e,n]),u=kv(()=>{let d=n.getState();return JSON.stringify([e.map(({controls:h})=>{let b=h.getState?.();return[b?.currentClip,b?.active.map(x=>[x.clip,x.status])]}),[d.sequenceId,d.status,d.previewing,d.ready]])},[e,n]);k1(c,u,u),S1(()=>{let d=s.current,h=b=>b.preventDefault();return d?.addEventListener("beforexrselect",h),()=>d?.removeEventListener("beforexrselect",h)},[l.length]);let p=n.getState(),m=l.find(d=>d.id===o)??l.find(d=>d.kind==="sequence"&&p.previewing&&d.sequence.id===p.sequenceId)??l.find(d=>d.kind==="clip"&&d.source.controls.getState?.().currentClip===d.clip)??l[0];if(!m)return null;let a=m.kind==="clip"?m.source.controls.getState?.().active.some(d=>d.clip===m.clip&&d.status==="playing"):p.sequenceId===m.sequence.id&&p.status==="playing",f=r(a?"arAnimationPause":"arAnimationPlay");return Rv("div",{className:"ri-arAnimations",ref:s,role:"group","aria-label":r("arAnimations"),onPointerDown:d=>d.stopPropagation(),onTouchStart:d=>d.stopPropagation(),onTouchMove:d=>d.stopPropagation(),children:[Rv(Ct,{"aria-label":r("arAnimationSelect"),value:m.id,onChange:d=>{let h=l.find(b=>b.id===d.target.value);h&&(i(h.id),La(h,e,n,!0))},children:[e.map(d=>{let h=l.filter(b=>b.kind==="clip"&&b.source.id===d.id);return h.length?Ao("optgroup",{label:e.length>1?d.label:r("arAnimationClips"),children:h.map(b=>Ao("option",{value:b.id,children:b.label},b.id))},d.id):null}),l.some(d=>d.kind==="sequence")&&Ao("optgroup",{label:r("arAnimationSequences"),children:l.filter(d=>d.kind==="sequence").map(d=>Ao("option",{value:d.id,children:d.label},d.id))})]}),Ao("button",{type:"button",className:"ri-arActionButton","aria-label":f,title:f,disabled:m.kind==="sequence"&&!p.ready,onClick:()=>{a?Pv(m,n):La(m,e,n)},children:a?Ao(R1,{size:18,"aria-hidden":"true"}):Ao(A1,{size:18,"aria-hidden":"true"})})]})}import{jsx as Ri,jsxs as O1}from"react/jsx-runtime";function Ov({options:e,sources:t,value:n,onChange:r}){let o=oe();if(!e.length)return null;let i=e.filter(u=>u.kind==="clip"?u.source.config?.autoplayClip===u.clip:u.sequence.autoPlay),s=i.length===1?i[0]:void 0,l=s?.label??o(i.length?"arAnimationSaved":"arAnimationNone"),c=s?e.filter(u=>u.id!==s.id):e;return Ri("div",{className:"ri-arAnimations ri-arQuickLookAnimations",children:O1(Ct,{"aria-label":o("arAnimationSelect"),value:s?.id===n?"":n,onChange:u=>r(u.target.value),children:[Ri("option",{value:"",children:l}),t.map(u=>{let p=c.filter(m=>m.kind==="clip"&&m.source.id===u.id);return p.length?Ri("optgroup",{label:t.length>1?u.label:o("arAnimationClips"),children:p.map(m=>Ri("option",{value:m.id,children:m.label},m.id))},u.id):null}),c.some(u=>u.kind==="sequence")&&Ri("optgroup",{label:o("arAnimationSequences"),children:c.filter(u=>u.kind==="sequence").map(u=>Ri("option",{value:u.id,children:u.label},u.id))})]})})}function Ev(e,t,n){return t?e.map(r=>({...r,sceneConfig:{...r.sceneConfig,animations:{clips:r.sceneConfig?.animations.clips??[],autoplayClip:t.kind==="clip"&&r.instanceId===t.source.id?t.clip:null},sequences:(r.sceneConfig?.sequences??[]).map(o=>({...o,autoPlay:t.kind==="sequence"&&r.instanceId===n&&o.id===t.sequence.id}))}})):e}import{useRef as le,useState as be,useEffect as Ee,useCallback as de,useMemo as rt,Suspense as O0,lazy as nD}from"react";import{createPortal as rD}from"react-dom";import{Raycaster as E1,Vector3 as jd}from"three";var D1=48;async function Dv(e,t,n){let r=await Xb(e);return n.aborted||!r?null:T1(e,t)}function T1(e,t){let n=t.getSize(new jd);if(!(n.x>0&&n.z>0))return null;let r=Math.max(n.x,n.z)/D1,o=Math.max(1,Math.ceil(n.x/r)),i=Math.max(1,Math.ceil(n.z/r)),s=new Uint8Array(o*i),l=new E1;l.firstHitOnly=!0;let c=new jd(0,-1,0),u=new jd;l.far=n.y*1.1+r;for(let h=0;h<i;h++)for(let b=0;b<o;b++)u.set(t.min.x+(b+.5)*r,t.max.y+r*.5,t.min.z+(h+.5)*r),l.set(u,c),l.intersectObject(e,!0).some(v=>L1(v.object))&&(s[h*o+b]=1);let p=(h,b)=>h>=0&&b>=0&&h<o&&b<i&&s[b*o+h]===1,m=new Uint8Array(o*i);for(let h=0;h<i;h++)for(let b=0;b<o;b++)p(b,h)&&p(b-1,h)&&p(b+1,h)&&p(b,h-1)&&p(b,h+1)&&(m[h*o+b]=1);let a=m.some(Boolean)?m:s,f=[];for(let h=0;h<i;h++)for(let b=0;b<o;b++)a[h*o+b]&&f.push([t.min.x+(b+.5)*r,t.min.z+(h+.5)*r]);if(f.length===0)return null;let d=n.y*.02;return{minX:t.min.x,minZ:t.min.z,cell:r,cells:f,inside:a,columns:o,rows:i,floor:t.min.y+d,ceiling:t.max.y-d}}function El(e,t){let[n,r,o]=t,i=Math.min(e.ceiling,Math.max(e.floor,r)),s=Math.floor((n-e.minX)/e.cell),l=Math.floor((o-e.minZ)/e.cell);if(s>=0&&l>=0&&s<e.columns&&l<e.rows&&e.inside[l*e.columns+s]===1)return i===r?null:[n,i,o];let u=e.cells[0],p=1/0;for(let m of e.cells){let a=(m[0]-n)**2+(m[1]-o)**2;a<p&&(p=a,u=m)}return[u[0],i,u[1]]}function L1(e){for(let t=e;t;t=t.parent)if(!t.visible)return!1;return!0}function Lv(e){return!!(e&&e.points.length>=3&&e.points.every(t=>t.every(Number.isFinite))&&_v(e.points)!==0&&Number.isFinite(e.floor)&&Number.isFinite(e.ceiling)&&e.ceiling>e.floor)}function Tv(e,t,n){let r=!1;for(let o=0,i=e.length-1;o<e.length;i=o++){let[s,l]=e[o],[c,u]=e[i];l>n!=u>n&&t<(c-s)*(n-l)/(u-l)+s&&(r=!r)}return r}function Dl(e,t){let[n,r,o]=t,{points:i}=e,s=i.map(([S])=>S),l=i.map(([,S])=>S),c=Math.max(...s)-Math.min(...s)+(Math.max(...l)-Math.min(...l)),u=e.ceiling-e.floor,p=Math.max(.001,c*.03),m=Math.min(p,u*.25),a=Math.min(e.ceiling-m,Math.max(e.floor+m,r)),f=Tv(i,n,o),d=_v(i)>0?1:-1,h=Math.max(Number.EPSILON,c*1e-10),b=i.flatMap(([S,y],k)=>{let[w,M]=i[(k+1)%i.length],E=w-S,P=M-y,O=E*E+P*P;if(O===0)return[];let R=Math.sqrt(O),A=Math.min(1,Math.max(0,((n-S)*E+(o-y)*P)/O)),D=S+A*E,B=y+A*P;return[{ax:S,az:y,dx:E,dz:P,length:R,t:A,distance:Math.hypot(n-D,o-B)}]});b.sort((S,y)=>S.distance-y.distance);let x=null,v=1/0;for(let[S,y]of b.entries()){let k=Math.min(.25,p/y.length),w=Math.min(1-k,Math.max(k,y.t)),M=y.ax+w*y.dx,E=y.az+w*y.dz,P=-y.dz/y.length*d,O=y.dx/y.length*d,R=_1(i,M,E,P,O,h);if(!Number.isFinite(R))continue;let A=Math.min(p,R*.25);if(S===0&&f&&y.distance+h>=A)return a===r?null:[n,a,o];let D=[M+P*A,E+O*A];if(!Tv(i,D[0],D[1]))continue;let B=Math.hypot(D[0]-n,D[1]-o);B<v&&(x=D,v=B)}return!x||f&&v<=h?a===r?null:[n,a,o]:[x[0],a,x[1]]}function _v(e){return e.reduce((t,[n,r],o)=>{let[i,s]=e[(o+1)%e.length];return t+n*s-i*r},0)}function _1(e,t,n,r,o,i){let s=1/0;for(let l=0;l<e.length;l++){let[c,u]=e[l],[p,m]=e[(l+1)%e.length],a=p-c,f=m-u,d=r*f-o*a;if(Math.abs(d)<=i)continue;let h=((c-t)*f-(u-n)*a)/d,b=((c-t)*o-(u-n)*r)/d;h>i&&b>=0&&b<=1&&(s=Math.min(s,h))}return s}import{Vector3 as _a}from"three";function Nd(e,t,n,r,o,i){let s=new _a(...t);if(s.distanceTo(new _a(...e))>=o)return e;let l=n.clone().sub(r);l.lengthSq()<1e-12&&l.set(0,0,1),l.normalize();let c=[l];for(let m of[-1,0,1])for(let a of[-1,0,1])for(let f of[-1,0,1])(m||a||f)&&c.push(new _a(m,a,f).normalize());c.sort((m,a)=>a.dot(l)-m.dot(l));let u=e,p=s.distanceTo(new _a(...u));for(let m of c){let a=s.clone().addScaledVector(m,o).toArray(),f=i(a)??a,d=s.distanceTo(new _a(...f));if(d>=o*(1-1e-6))return f;d>p&&(u=f,p=d)}return u}import{Box3 as E0,Color as oD,Raycaster as iD,Sphere as aD,Vector2 as sD,Vector3 as ro}from"three";import{Component as B1}from"react";var Qn=class extends B1{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n,r){this.props.onLoadError?.(n)}render(){return this.state.hasError?null:this.props.children}};import{useCallback as Bv,useEffect as jv,useState as j1}from"react";function Nv({enabled:e,activeUrl:t,models:n,errorsRef:r,activeFailed:o,activeError:i,onActiveError:s,onExtraError:l}){let[c,u]=j1(0),p=Bv((a,f)=>{r.current.set(a,f),u(d=>d+1),a!==t&&l?.(a,f)},[t,r,l]),m=Bv(a=>{r.current.delete(a)&&u(f=>f+1)},[r]);return jv(()=>{let a=new Set(e?n?.map(Ae):[]);for(let f of r.current.keys())a.has(f)||r.current.delete(f)},[e,n,r]),jv(()=>{if(!e||!r.current.has(t))return;let a=r.current.get(t);o&&Object.is(i,a)||s(a)},[e,t,n,r,c,o,i,s]),{reportError:p,clearError:m}}import{useCallback as N1,useEffect as Iv,useRef as Tl}from"react";function zv(e,t){let n=Tl({}),r=Tl({}),o=Tl({}),i=Tl(0),s=N1(l=>{var c;return(c=o.current)[l]??(c[l]={current:{}})},[]);return Iv(()=>{let l=new Set(e?t?.map(Ae):[]);for(let c of Object.keys(n.current))l.has(c)||delete n.current[c];for(let c of Object.keys(r.current))l.has(c)||delete r.current[c];for(let c of Object.keys(o.current))l.has(c)||(o.current[c].current={},delete o.current[c])},[e,t]),Iv(()=>{let l=++i.current;return()=>{queueMicrotask(()=>{i.current===l&&(n.current={},r.current={},Object.values(o.current).forEach(c=>{c.current={}}),o.current={})})}},[]),{scenesByUrlRef:n,cameraHomesByUrlRef:r,materialRefsByUrlRef:o,getMaterialRefsForUrl:s}}import{useCallback as Vv,useEffect as V1,useState as Fv}from"react";import{useEffect as I1,useRef as z1}from"react";function hr(e,t){let n=z1(t);I1(()=>{let r=n.current;n.current=t,t.some((o,i)=>!Object.is(o,r[i]))&&e()},t)}var F1={};function Hv({modelUrl:e,activeModelId:t,tilesetUrl:n,models:r,objectBindings:o="auto",onChange:i,initialBindings:s,initialModelEdits:l}){let c=t??e,u=!!(r?.length&&!n),p=o==="auto"&&!u,m=!p&&i!==void 0,a=o==="auto"?F1:o,[f,d]=Fv(()=>s??a),[h,b]=Fv(()=>{let k=new Map(l),w=u?r?.find(M=>Ae(M)===c):void 0;return w&&s&&l===void 0&&k.set(c,{source:w.objectBindings,bindings:s}),k});hr(()=>{m||d(a)},[m,a]),V1(()=>{let k=new Map(u?r?.map(w=>[Ae(w),w.objectBindings]):[]);b(w=>{let M=[...w].filter(([E,P])=>!m&&k.get(E)===P.source);return M.length===w.size?w:new Map(M)})},[u,r,m]);let x=Vv(k=>{let w=m?void 0:h.get(Ae(k));return w?.source===k.objectBindings?w.bindings:k.objectBindings},[m,h]),v=u?r?.find(k=>Ae(k)===c):void 0,S=v?x(v):m?a:f,y=Vv(k=>{m||(v?b(w=>new Map(w).set(Ae(v),{source:v.objectBindings,bindings:k})):d(k)),i?.(k)},[m,v,i]);return{autoBindings:p,controlled:m,currentBindings:S,applyBindings:y,bindingsForModel:x,modelEdits:h}}import{PerspectiveCamera as Id,Vector2 as H1}from"three";function Ll(e,t={}){if(!e)return Promise.reject(new Error("Viewer not ready"));let{gl:n,scene:r,camera:o,invalidate:i}=e,s=Ur(n);if(!s&&!n.getContextAttributes().preserveDrawingBuffer)return Promise.reject(new Error("Screenshot capture is disabled. Set preserveDrawingBuffer on ModelViewer to enable it."));let{transparent:l=!1,type:c="image/png",quality:u}=t,p=n.getSize(new H1),m=n.getPixelRatio(),a=o instanceof Id?o.aspect:null,f=r.background,d=t.width??p.x,h=t.height??p.y,b=d!==p.x||h!==p.y,x=Qs(r);l&&(r.background=null),b&&(n.setPixelRatio(1),n.setSize(d,h,!1),o instanceof Id&&(o.aspect=d/h,o.updateProjectionMatrix()));let v=()=>{x(),l&&(r.background=f),b&&(n.setPixelRatio(m),n.setSize(p.x,p.y,!1),o instanceof Id&&a!==null&&(o.aspect=a,o.updateProjectionMatrix())),i()};if(s)try{return n.render(r,o),Promise.resolve(n.domElement.toDataURL(c,u))}catch(S){return Promise.reject(S)}finally{v()}return i(),new Promise((S,y)=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{let k,w;try{k=n.domElement.toDataURL(c,u)}catch(M){w=M}v(),w?y(w):S(k)})})})}import{useEffect as G1,useRef as U1}from"react";import{GizmoHelper as $1,GizmoViewport as W1}from"@react-three/drei";import{useThree as X1}from"@react-three/fiber";import{jsx as zd}from"react/jsx-runtime";function Gv({onUpdate:e}){let t=X1(r=>r.scene),n=U1(null);return G1(()=>{if(n.current)return Lg(t,n.current)},[t]),zd($1,{alignment:"top-right",margin:[80,80],renderPriority:2,onUpdate:e,children:zd("group",{ref:n,children:zd(W1,{axisColors:["#e5484d","#46a758","#3e8bff"],labelColor:"white"})})})}import{useCallback as Bl,useEffect as eP,useRef as qv,useState as Kv}from"react";import{Vector3 as Qv}from"three";import{useEffect as _l,useMemo as vr,useRef as yr}from"react";import{useFrame as q1,useThree as K1}from"@react-three/fiber";import{Box3 as Q1,CatmullRomCurve3 as Uv,Sphere as J1,Spherical as Y1,Vector3 as Kr}from"three";function Vd(e){if(e.duration!==void 0)return e.duration;let t=e.waypoints??[];if(t.length<2)return 24;let n=e.loop===!1?t.slice(0,-1):t;return Math.max(n.reduce((r,o)=>r+(o.segmentDuration??3.5),0),4)}var Z1=1.2;function Ai({controlsRef:e,sceneRef:t,config:n,playing:r,resetOnPlay:o=!1,onFinished:i,onUserInteract:s,onStop:l,playOnce:c=!1,startAtPath:u=!1,onStarted:p,onProgress:m}){let a=K1(T=>T.invalidate),f=vr(()=>n.waypoints??[],[n.waypoints]),d=f.length>=2,h=n.loop??!0,b=Vd(n),x=vr(()=>f.map(T=>[...T.position,...T.target,T.azimuthAngle??"",T.polarAngle??"",T.segmentDuration??""].join(",")).join(";"),[f]),v=vr(()=>{let T=[];if(f.length<2)return T;let L=0;for(let W=0;W<f.length-1;W++)L+=f[W].segmentDuration??3.5,T.push(L);return h&&f.length>1&&(L+=f[f.length-1].segmentDuration??3.5,T.push(L)),T},[f,h]),S=vr(()=>T=>{if(f.length<2||v.length===0)return T/b;let L=v[v.length-1],W=h?T%b:Math.min(T,b),ee=b>0?W/b*L:0;for(let Z=0;Z<v.length;Z++)if(ee<=v[Z]){let Q=Z===0?0:v[Z-1],te=v[Z]-Q,X=te>0?(ee-Q)/te:0,F=h?f.length:f.length-1,I=Z/F,Y=1/F;return I+X*Y}return 1},[f.length,v,b,h]),y=vr(()=>d?{position:new Uv(f.map(T=>new Kr(...T.position)),h,"catmullrom",.5),target:new Uv(f.map(T=>new Kr(...T.target)),h,"catmullrom",.5)}:null,[x,d,h]),k=vr(()=>{if(!d||!f.every(L=>Number.isFinite(L.azimuthAngle)&&Number.isFinite(L.polarAngle)))return null;let T=f.map(L=>({azimuth:L.azimuthAngle,polar:L.polarAngle,distance:new Kr(...L.position).distanceTo(new Kr(...L.target))}));for(let L=1;L<T.length;L+=1){let W=T[L-1].azimuth,ee=T[L].azimuth;T[L].azimuth=ee+Math.round((W-ee)/(Math.PI*2))*Math.PI*2}return T},[x,d]),w=yr(0),M=yr(0),E=yr(new Kr),P=yr(new Kr),O=yr(!1),R=yr(!0),A=yr(0),D=yr(!1),B=yr(null),V=vr(()=>new Kr,[]),$=vr(()=>new Kr,[]),U=vr(()=>new Y1,[]);return _l(()=>{w.current=0,A.current=0,M.current=0,D.current=!1},[x,h,b]),_l(()=>{o&&(A.current=0,w.current=0,D.current=!1)},[o]),_l(()=>{if(!r){O.current=!1,w.current>0&&!o?A.current=w.current:o&&(A.current=0),(w.current>0||D.current)&&l?.();return}w.current>=b&&!h&&(w.current=0,A.current=0,D.current=!1);let T=e.current;if(T&&(T.getPosition(E.current),T.getTarget(P.current)),o||D.current||A.current===0?(w.current=0,A.current=0,D.current=!1):A.current>0&&A.current<b?w.current=A.current:(w.current=0,A.current=0),M.current=0,!d){let L=t.current;if(L){let W=new Q1().setFromObject(L).getBoundingSphere(new J1);B.current={center:W.center.clone(),radius:W.radius>0?W.radius:1}}}O.current=!0,R.current=!0,a()},[r,d,e,t,a,b,h,x,o,l]),_l(()=>{if(!r||!s)return;let T=e.current;if(!T)return;let L=()=>{D.current||s()};return T.addEventListener("controlstart",L),()=>T.removeEventListener("controlstart",L)},[r,e,s]),q1((T,L)=>{if(!r||!O.current)return;let W=e.current;if(!W)return;let ee=R.current;R.current=!1,(!ee||!u)&&(w.current+=L,M.current+=L);let Z=(!h||c)&&w.current>=b,Q=Z&&h?0:S(w.current);if(Q=h?Q%1:Math.min(Q,1),y)if(y.target.getPoint(Q,$),k){let X=h?k.length:k.length-1,F=Math.min(Q,1)*X,I=Math.min(Math.floor(F),X-1),Y=(I+1)%k.length,re=Q>=1?1:F-I,Fe=re*re*(3-2*re),K=k[I],we=k[Y],Pe=we.azimuth+Math.round((K.azimuth-we.azimuth)/(Math.PI*2))*Math.PI*2,xe=K.azimuth+(Pe-K.azimuth)*Fe,wt=K.polar+(we.polar-K.polar)*Fe,pt=K.distance+(we.distance-K.distance)*Fe;U.set(Math.max(pt,1e-6),Math.min(Math.max(wt,1e-6),Math.PI-1e-6),xe),V.setFromSpherical(U).add($)}else y.position.getPoint(Q,V);else{let X=B.current;if(!X)return;let F=Q*Math.PI*2,I=X.radius*2.2;V.set(X.center.x+Math.cos(F)*I,X.center.y+X.radius*.6,X.center.z+Math.sin(F)*I),$.copy(X.center)}let te=u?1:Math.min(M.current/Z1,1);if(te<1){let X=te*te*(3-2*te);V.lerpVectors(E.current,V,X),$.lerpVectors(P.current,$,X)}if(W.setLookAt(V.x,V.y,V.z,$.x,$.y,$.z,!1),ee&&p?.(),m?.(Math.min(w.current/b,1)),Z){O.current=!1,D.current=!0,w.current=0,A.current=0,i?.();return}a()}),null}function $v(){return typeof document<"u"&&typeof HTMLCanvasElement<"u"&&typeof HTMLCanvasElement.prototype.captureStream=="function"}function Wv(e,t={}){let{fps:n=15,gifWidth:r=480,signal:o}=t;if(!Number.isFinite(n)||n<1||n>60)throw new Error("Video frame rate must be between 1 and 60.");if(!Number.isInteger(r)||r<16||r>4096)throw new Error("GIF width must be a whole number of pixels from 16 to 4096.");if(o?.aborted)throw new DOMException("Video export cancelled.","AbortError");if(typeof e.captureStream!="function"||typeof document>"u")throw new Error("Video recording as GIF is not supported in this browser.");let i=1e3/n,s,l,c,u=null,p,m=0,a=0,f=0,d=null,h=0,b=0,x=0,v=!1,S=!1,y,k,w,M,E,P,O=new Promise((L,W)=>{E=L,P=W}),R=()=>{clearTimeout(y),clearInterval(k),w!==void 0&&cancelAnimationFrame(w),M!==void 0&&cancelAnimationFrame(M),o?.removeEventListener("abort",D),e.removeEventListener("webglcontextlost",B),c&&(c.pause(),c.srcObject=null),l?.getTracks().forEach(L=>L.stop())},A=(L=new DOMException("Video export cancelled.","AbortError"))=>{v||(v=!0,R(),P(L))},D=()=>A(),B=()=>A(new Error("Video export stopped because the WebGL context was lost.")),V=()=>A(new Error("Video export timed out. Keep the viewer tab visible while recording."));o?.addEventListener("abort",D,{once:!0}),e.addEventListener("webglcontextlost",B),y=setTimeout(V,3e4);let $=(async()=>{if(s=await import("gifenc"),!v&&(l=e.captureStream(n),c=document.createElement("video"),c.muted=!0,c.playsInline=!0,c.srcObject=l,await c.play(),!v)){if(u=document.createElement("canvas").getContext("2d",{willReadFrequently:!0}),!u)throw new Error("Video recording as GIF is not supported in this browser.");p=s.GIFEncoder()}})().catch(L=>A(L)),U=L=>{if(!d||!p)return;let W=Math.max(2,Math.round((L-h)/10)-x);x+=W,p.writeFrame(d.index,m,a,{palette:d.palette,delay:W*10}),d=null},T=()=>{if(v||!s||!c||!u||!p||c.readyState<2||!c.videoWidth)return;let L=performance.now();if(!(f>0&&L-b<i/2)){m||(m=Math.min(r,c.videoWidth),a=Math.max(1,Math.round(m*c.videoHeight/c.videoWidth)),u.canvas.width=m,u.canvas.height=a);try{u.drawImage(c,0,0,m,a);let{data:W}=u.getImageData(0,0,m,a),ee=s.quantize(W,256),Z=s.applyPalette(W,ee);f===0&&(h=L),U(L),d={index:Z,palette:ee},b=L,f+=1}catch(W){A(W)}}};return{result:O,cancel:A,start(L){v||w!==void 0||(w=requestAnimationFrame(()=>{$.then(()=>{v||(T(),k=setInterval(T,i),clearTimeout(y),y=setTimeout(V,(L+30)*1e3))})}))},finish(){v||S||(S=!0,M=requestAnimationFrame(()=>{$.then(()=>{if(v||(T(),v))return;if(!p||f===0){A(new Error("The browser produced an empty video."));return}U(b+i),p.finish();let L=new Blob([p.bytes()],{type:"image/gif"});v=!0,R(),E(L)})}))}}}var Fd={webm:["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"],mp4:["video/mp4;codecs=avc1.42E01E","video/mp4"]};function xr(e="auto"){return e==="gif"?$v()?"image/gif":null:typeof MediaRecorder>"u"?null:(e==="auto"?[...Fd.webm,...Fd.mp4]:Fd[e]).find(n=>MediaRecorder.isTypeSupported(n))??null}function Xv(e,t={}){if(t.format==="gif")return Wv(e,t);let{fps:n=30,videoBitsPerSecond:r=8e6,signal:o}=t;if(!Number.isFinite(n)||n<1||n>60)throw new Error("Video frame rate must be between 1 and 60.");if(!Number.isFinite(r)||r<=0)throw new Error("Video bitrate must be a positive number.");if(o?.aborted)throw new DOMException("Video export cancelled.","AbortError");let i=xr(t.format);if(!i||typeof e.captureStream!="function"){let w=t.format&&t.format!=="auto"?` as ${t.format.toUpperCase()}`:"";throw new Error(`Video recording${w} is not supported in this browser.`)}let s,l,c=!1,u=!1,p,m,a,f=[],d,h,b=new Promise((w,M)=>{d=w,h=M}),x=()=>{clearTimeout(p),m!==void 0&&cancelAnimationFrame(m),a!==void 0&&cancelAnimationFrame(a),o?.removeEventListener("abort",S),e.removeEventListener("webglcontextlost",y),l&&(l.ondataavailable=null,l.onstop=null,l.onerror=null),s?.getTracks().forEach(w=>w.stop())},v=(w=new DOMException("Video export cancelled.","AbortError"))=>{if(!c){if(c=!0,x(),l&&l.state!=="inactive")try{l.stop()}catch{}h(w)}},S=()=>v(),y=()=>v(new Error("Video export stopped because the WebGL context was lost.")),k=()=>v(new Error("Video export timed out. Keep the viewer tab visible while recording."));return o?.addEventListener("abort",S,{once:!0}),e.addEventListener("webglcontextlost",y),p=setTimeout(k,3e4),{result:b,cancel:v,start(w){c||m!==void 0||(m=requestAnimationFrame(()=>{if(!c)try{s=e.captureStream(n);let M=new MediaRecorder(s,{mimeType:i,videoBitsPerSecond:r});l=M,M.ondataavailable=({data:E})=>{E.size>0&&f.push(E)},M.onerror=()=>v(new Error("The browser could not encode the video.")),M.onstop=()=>{if(c)return;c=!0,x();let E=new Blob(f,{type:M.mimeType||i});E.size===0?h(new Error("The browser produced an empty video.")):d(E)},M.start(1e3),clearTimeout(p),p=setTimeout(k,(w+30)*1e3)}catch(M){v(M)}}))},finish(){c||u||(u=!0,a=requestAnimationFrame(()=>{if(!c)try{if(!l)throw new Error("Video recording did not start.");l.stop()}catch(w){v(w)}}))}}}function Jv(e){let t=qv(e);t.current=e;let n=qv(null),[r,o]=Kv(null),[i,s]=Kv(0),l=Bl(()=>n.current?.cancel(),[]),c=Bl(()=>n.current!==null,[]);eP(()=>l,[e.modelUrl,l]);let u=Bl(async(m={})=>{let{rendererCaptureRef:a,controlsRef:f,cinematicConfig:d,ready:h,onCaptureStart:b}=t.current,x=a.current,v=f.current;if(!h||!x||!v)throw new Error("Viewer not ready for video export.");if(x.gl.xr.isPresenting)throw new Error("Exit the XR session before recording a video.");if(n.current)throw new Error("A video export is already in progress.");let S=m.mode??(d?"cinematic":"turntable");if(S==="cinematic"&&!d)throw new Error("Enable a cinematic camera path before recording it.");let y=S==="cinematic"?d:{loop:!0},k=m.duration??(S==="turntable"&&m.format==="gif"?8:Vd(y));if(!Number.isFinite(k)||k<=0||k>300)throw new Error("Video duration must be greater than 0 and at most 300 seconds.");let w=Xv(x.gl.domElement,m);n.current=w;let M=v.getPosition(new Qv),E=v.getTarget(new Qv),P=v.enabled,O=Qs(x.scene);v.stop(),v.enabled=!1,s(0),b(),o({config:{...y,duration:k,autoPlay:!1},onStarted:()=>w.start(k),onFinished:w.finish});try{return await w.result}finally{O(),v.enabled=P,v.setLookAt(M.x,M.y,M.z,E.x,E.y,E.z,!1),x.invalidate(),n.current=null,o(null)}},[]),p=Bl(m=>{let a=Math.floor(m*100);s(f=>f===a?f:a)},[]);return{captureVideo:u,cancelVideo:l,isRecording:c,recording:r,progress:i,onProgress:p}}import{useCallback as tP,useEffect as nP,useRef as rP,useState as Ba}from"react";function Yv(e){let[t,n]=Ba(null),[r,o]=Ba(!1),[i,s]=Ba(!1),[l,c]=Ba(!1),[u,p]=Ba(null),m=rP(!1);nP(()=>{if(!t||!e){o(!1),s(!1),p(null);return}let f=t.ownerDocument;o(f.fullscreenEnabled===!0&&typeof t.requestFullscreen=="function"&&typeof f.exitFullscreen=="function");let d=()=>{s(f.fullscreenElement===t),p(null)};return d(),f.addEventListener("fullscreenchange",d),()=>f.removeEventListener("fullscreenchange",d)},[t,e]);let a=tP(async()=>{if(!t||!e||!r||m.current)return;let f=t.ownerDocument,d=f.fullscreenElement===t;m.current=!0,c(!0),p(null);try{d?await f.exitFullscreen():await t.requestFullscreen(),s(f.fullscreenElement===t)}catch{p(d?"Could not exit fullscreen. Press Escape to exit.":"Could not enter fullscreen. Check your browser or iframe fullscreen permissions and try again.")}finally{m.current=!1,c(!1)}},[t,e,r]);return{rootRef:n,supported:r,active:i,pending:l,error:u,toggle:a}}import{useCallback as jl,useEffect as ey,useRef as ja,useState as Hd}from"react";function Zv(e,{onLost:t,onRestored:n,initiallyLost:r=!1}){let o=r,i=l=>{l.preventDefault(),!o&&(o=!0,t())},s=()=>{o&&(o=!1,n())};return e.addEventListener("webglcontextlost",i),e.addEventListener("webglcontextrestored",s),r&&t(),()=>{e.removeEventListener("webglcontextlost",i),e.removeEventListener("webglcontextrestored",s)}}function ty(e){let t=ja(e);t.current=e;let[n,r]=Hd(null),[o,i]=Hd(0),[s,l]=Hd("ready"),c=ja(null),u=ja(!1),p=ja(null),m=ja(null),a=jl(b=>{m.current?.dispose(),m.current=null,p.current=b,r(b)},[]),f=jl(()=>{u.current||(u.current=!0,t.current?.(),c.current?.(),c.current=null,p.current&&(m.current=p.current),p.current=null,r(null),l("rebuilding"),i(b=>b+1))},[]),d=jl(()=>{c.current?.(),c.current=null;let b=p.current;p.current=null,r(null),b&&eh(b)},[]),h=jl(()=>{u.current=!1,l("lost")},[]);return ey(()=>()=>{m.current?.dispose(),m.current=null},[]),ey(()=>{if(!n)return;if(u.current=!1,l("ready"),Ur(n)){let x=n,v=x.onDeviceLost;return x.onDeviceLost=S=>{console.warn("[react-immersive] The WebGPU device was lost.",S),h()},()=>{x.onDeviceLost=v}}let b=Zv(n.domElement,{initiallyLost:n.getContext().isContextLost(),onLost:h,onRestored:f});return c.current=b,()=>{b(),c.current===b&&(c.current=null)}},[n,h,f]),{generation:o,status:s,reload:f,fail:h,release:d,onRendererCreated:a}}function Nl(e,t){return t||e}async function ny(e,t){await e.setLookAt(...t.position,...t.target,!1);let n=e.camera;t.fov!=null&&Number.isFinite(t.fov)&&t.fov>0&&t.fov<180&&"fov"in n&&(n.fov=t.fov,n.updateProjectionMatrix()),t.zoom!=null&&Number.isFinite(t.zoom)&&t.zoom>0&&await e.zoomTo(t.zoom,!1)}import{Component as oP}from"react";var Oi=class extends oP{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n,r){this.props.onError?.(n)}render(){return this.state.hasError?this.props.fallback??null:this.props.children}};import{useEffect as iP,useMemo as aP,useRef as sP}from"react";function ry({modelUrl:e,tilesetUrl:t=null,getOptions:n,now:r=()=>performance.now(),timestamp:o=()=>new Date().toISOString(),sessionId:i=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`viewer-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`,log:s=c=>console.info("[react-immersive engagement]",c),warn:l=c=>console.warn("[react-immersive] onEngagement callback failed:",c)}){let c=r(),u=()=>{let R=n();return!!(R.onEngagement||R.debugEngagement)},p=R=>Math.max(0,Math.round(r()-R)),m=R=>{let{onEngagement:A,debugEngagement:D}=n();if(!A&&!D)return;let B={...R,sessionId:i,timestamp:o(),elapsedMs:p(c),modelUrl:e,tilesetUrl:t};D&&s(B);try{Promise.resolve(A?.(B)).catch(l)}catch(V){l(V)}},a=null,f=null,d="[]",h=null,b=null,x=R=>{a=R},v=R=>{!u()||a===R.objectKey||(a=R.objectKey,m({type:"part-viewed",...R}))},S=(R,A,D=null)=>{let B=JSON.stringify([D,A,R]);!u()||R===A||B===f||(f=B,m({type:"variant-chosen",variant:R,previousVariant:A,group:D}))},y=R=>{let A=JSON.stringify(R);A!==d&&(d=A,f=null)},k=()=>{!u()||h!==null||(h=r(),m({type:"ar-started"}))},w=(R="session-ended")=>{if(h===null)return;let A=p(h);h=null,m({type:"ar-ended",durationMs:A,reason:R})},M=(R="stopped")=>{if(!b)return;let{startedAt:A,annotationCount:D}=b;b=null,m({type:"tour-stopped",annotationCount:D,durationMs:p(A),reason:R})};return{setSelectedPart:x,viewPart:v,setActiveVariants:y,chooseVariant:S,startAR:k,endAR:w,startTour:R=>{!u()||R<=0||(M("restarted"),b={startedAt:r(),annotationCount:R},m({type:"tour-started",annotationCount:R}))},stopTour:M,completeTour:()=>{if(!b)return;let{startedAt:R,annotationCount:A}=b;b=null,m({type:"tour-completed",annotationCount:A,durationMs:p(R)})},interrupt:()=>{w("interrupted"),M("interrupted")},requestARLaunch:R=>m({type:"ar-launch-requested",channel:R})}}function oy(e){let t=sP(e);t.current=e;let n=!!(e.onEngagement||e.debugEngagement),r=aP(()=>ry({modelUrl:e.modelUrl,tilesetUrl:e.tilesetUrl,getOptions:()=>t.current}),[e.modelUrl,e.tilesetUrl,n]);return iP(()=>()=>r.interrupt(),[r]),r}import{Color as lP}from"three";function iy(e,t,n){let r=t[n]?.modelObjectId;return e.lighting.lights.filter(o=>{let i=o.attachment?.objectId;return i?Ys(t,i)===n||i===r:!1})}function Gd(e,t){return e.lighting.lights.some(n=>t[n.id])?{...e,lighting:{...e.lighting,lights:e.lighting.lights.map(n=>t[n.id]?{...n,...t[n.id]}:n)}}:e}function ay(e){let t=null;if(e?.traverse(o=>{if(t)return;let i=o.material;for(let s of Array.isArray(i)?i:i?[i]:[])if(s.emissive instanceof lP){t=s;return}}),!t)return{color:"#000000",intensity:0,on:!1};let n=`#${t.emissive.getHexString()}`,r=t.emissiveIntensity??1;return{color:n,intensity:r,on:n!=="#000000"&&r>0}}import{lazy as cP,Suspense as uP}from"react";import{jsx as Ud}from"react/jsx-runtime";var dP=cP(()=>import("react-colorful").then(e=>({default:e.HexColorPicker})));function Il(e){return Ud(uP,{fallback:Ud("div",{"aria-hidden":"true",style:{width:200,height:200}}),children:Ud(dP,{...e})})}import{Fragment as sy,jsx as Qr,jsxs as Na}from"react/jsx-runtime";function ly({kind:e,color:t,brightness:n,onColorChange:r,onBrightnessChange:o,onClose:i}){return Qr("div",{className:"ri-popover ri-popover--inline",style:{padding:12},onPointerDown:s=>s.stopPropagation(),children:e==="change-light-color"?Na(sy,{children:[Qr("p",{className:"ri-popoverLabel",children:"Light color"}),Qr(Il,{color:t,onChange:r}),Na("div",{className:"ri-inlineRow",children:[Qr("span",{className:"ri-colorCode",children:t}),Qr("button",{className:"ri-secondaryButton",onClick:i,children:"Done"})]})]}):Na(sy,{children:[Qr("p",{className:"ri-popoverLabel",children:"Brightness"}),Qr("input",{type:"range",min:0,max:200,step:1,value:n,"aria-label":"Brightness",style:{width:"100%"},onChange:s=>o(Number(s.target.value))}),Na("div",{className:"ri-inlineRow",children:[Na("span",{className:"ri-colorCode",children:[n,"%"]}),Qr("button",{className:"ri-secondaryButton",onClick:i,children:"Done"})]})]})})}import{useCallback as $d,useRef as pP}from"react";var zl=e=>e==="#000000"?"#ffffff":e;function cy({nodeRefsMap:e,currentObjectBindingsRef:t,applyObjectBindings:n}){let r=pP({}),o=$d(s=>{let l=ay(e.current[s]),c=t.current[s]?.style?.material,u=c?.emissive??l.color,p=c?.emissiveIntensity??l.intensity;return{color:u,intensity:p,on:u!=="#000000"&&p>0}},[]),i=$d((s,l)=>{let c=t.current,u=c[s];u&&n({...c,[s]:{...u,style:{...u.style,material:{...u.style?.material,...l}}}})},[n]);return{glowMemoryRef:r,readObjectGlow:o,applyGlow:i}}function uy({setCurrentAction:e,bindingKeyIndex:t,currentObjectBindings:n,applyObjectBindings:r,resolveObjectKey:o,closeColorPicker:i,setColorPicker:s,setMaterialPopupsByObject:l,setItemMaterials:c,getPopoverPosition:u,decalRequestRef:p,setDecalError:m,setDecalDragging:a,setDecalControl:f,resolvedSceneConfigRef:d,applyLightPatches:h,readObjectGlow:b,applyGlow:x,glowMemoryRef:v,setLightControl:S,onAction:y}){return $d(k=>{let{objectId:w,action:M,binding:E}=k;switch(e(k),M.id){case"toggle-visibility":{let P=w;E?.modelObjectId&&(P=t.byModelObjectId.get(E.modelObjectId)??P);let O=n[P],R=O?.visible===!1;O&&r({...n,[P]:{...O,visible:R}});break}case"change-color":i(),l(P=>{if(!(w in P))return P;let O={...P};return delete O[w],O}),s(u(w,225,250,E,k));break;case"change-material":i(),l(P=>{if(w in P){let O={...P};return delete O[w],O}return{...P,[w]:u(w,300,320,E,k)}});break;case"add-text":case"add-image":{i();let P=M.id;p.current++,m(null),a(null),f(O=>O?.objectId===w&&O.kind===P?null:{objectId:w,kind:P,activeId:null});break}case"toggle-light":case"change-light-color":case"set-brightness":{let P=o(w,E);if(!P)break;let O=iy(d.current,n,P);if(M.id==="toggle-light"){if(O.length>0){let B=!O.some(V=>V.visible);h(Object.fromEntries(O.map(V=>[V.id,{visible:B}])));break}let D=b(P);D.on?(v.current[P]=D.intensity,x(P,{emissiveIntensity:0})):x(P,{emissive:zl(D.color),emissiveIntensity:v.current[P]??1});break}let R=M.id,A=O.length>0?null:b(P);S(D=>D?.objectId===w&&D.kind===R?null:{objectId:w,kind:R,target:A?{type:"glow",objectKey:P,baseIntensity:A.on?A.intensity:v.current[P]??1}:{type:"lights",lightIds:O.map(B=>B.id),baseIntensity:Object.fromEntries(O.map(B=>[B.id,B.intensity]))},percent:A&&!A.on?0:100});break}default:break}y?.(k)},[r,x,h,b,n,u,y,i,o,t])}import{jsx as mP}from"react/jsx-runtime";function dy({control:e,lights:t,readObjectGlow:n,applyGlow:r,glowMemoryRef:o,applyLightPatches:i,onControlChange:s}){let l=e.target,c=l.type==="lights"?t.find(u=>u.id===l.lightIds[0])?.color??"#ffffff":zl(n(l.objectKey).color);return mP(ly,{kind:e.kind,color:c,brightness:e.percent,onColorChange:u=>{if(l.type==="lights"){i(Object.fromEntries(l.lightIds.map(m=>[m,{color:u}])));return}let p=n(l.objectKey);r(l.objectKey,{emissive:u,emissiveIntensity:p.intensity>0?p.intensity:o.current[l.objectKey]??1})},onBrightnessChange:u=>{if(s({...e,percent:u}),l.type==="lights"){i(Object.fromEntries(l.lightIds.map(p=>[p,{intensity:(l.baseIntensity[p]??0)*(u/100)}])));return}r(l.objectKey,{emissive:zl(n(l.objectKey).color),emissiveIntensity:l.baseIntensity*(u/100)})},onClose:()=>s(null)})}import{useRef as yP,useState as gy}from"react";import{ArrowDown as fP,ArrowLeft as gP,ArrowRight as bP,ArrowUp as hP}from"lucide-react";import{useEffect as vP,useRef as Wd}from"react";function py(e){let t=!1,n,r=()=>{t||(e(),t||(n=setTimeout(r,70)))};return e(),n=setTimeout(r,300),()=>{t=!0,clearTimeout(n)}}import{jsx as Ia,jsxs as my}from"react/jsx-runtime";function fy({onNudge:e}){let t=oe(),n=Wd(e);n.current=e;let r=Wd(null),o=Wd(null),i=()=>{r.current?.(),r.current=null,o.current=null};return vP(()=>{let s=c=>{c.pointerId===o.current&&i()},l=c=>{c.key==="Escape"&&i()};return window.addEventListener("pointerup",s,!0),window.addEventListener("pointercancel",s,!0),window.addEventListener("blur",i),window.addEventListener("keydown",l),()=>{i(),window.removeEventListener("pointerup",s,!0),window.removeEventListener("pointercancel",s,!0),window.removeEventListener("blur",i),window.removeEventListener("keydown",l)}},[]),my("div",{className:"ri-decalPosition",children:[my("div",{children:[Ia("div",{className:"ri-decalPosition__label",children:t("position")}),Ia("div",{className:"ri-decalPosition__hint",children:t("decalNudgeHint")})]}),Ia("div",{className:"ri-decalPosition__pad",role:"group","aria-label":t("decalNudgeControls"),children:[["up",hP],["left",gP],["right",bP],["down",fP]].map(([s,l])=>Ia("button",{type:"button",className:`ri-decalPosition__button ri-decalPosition__button--${s}`,"aria-label":t("moveDecal",{direction:t(s)}),title:t("moveDecalOnSurface",{direction:t(s)}),onPointerDown:c=>{c.button===0&&(c.preventDefault(),c.currentTarget.focus({preventScroll:!0}),i(),o.current=c.pointerId,r.current=py(()=>n.current(s)))},onClick:c=>{c.detail===0&&n.current(s)},children:Ia(l,{size:16})},s))})]})}import{Fragment as by,jsx as Pt,jsxs as Jn}from"react/jsx-runtime";var xP=e=>Math.round(e*180/Math.PI);function hy({kind:e,decals:t,activeId:n,error:r,moving:o,defaultSize:i,onSelect:s,onAddText:l,onAddImage:c,onChange:u,onMove:p,onNudge:m,onRemove:a,onClose:f}){let d=oe(),[h,b]=gy(""),[x,v]=gy("#ffffff"),S=yP(null),y=t.find(w=>w.id===n)??null;return Jn("div",{className:"ri-popover ri-popover--inline ri-decalControl",onPointerDown:w=>w.stopPropagation(),children:[e==="add-text"?Jn(by,{children:[Pt("p",{className:"ri-popoverLabel",children:d("text")}),Jn("div",{className:"ri-decalControl__row",children:[Pt("input",{className:"ri-decalControl__input",value:h,placeholder:d("yourText"),"aria-label":d("textToAdd"),onChange:w=>b(w.target.value)}),Pt("input",{type:"color",className:"ri-decalControl__color",value:x,"aria-label":d("textColour"),onChange:w=>v(w.target.value)})]}),Pt("button",{type:"button",className:"ri-uploadButton",disabled:!h.trim(),onClick:()=>{l(h.trim(),x)&&b("")},children:d("addText")})]}):Jn(by,{children:[Pt("p",{className:"ri-popoverLabel",children:d("image")}),Pt("button",{type:"button",className:"ri-uploadButton",onClick:()=>S.current?.click(),children:d("chooseImage")}),Pt("input",{ref:S,type:"file",accept:"image/png,image/jpeg,image/webp,image/svg+xml",className:"ri-hiddenInput","aria-label":d("imageToAdd"),onChange:w=>{let M=w.target.files?.[0];w.target.value="",M&&c(M)}})]}),r?Pt("div",{className:"ri-decalControl__hint",role:"alert",children:r}):null,t.length>0?Pt("div",{className:"ri-decalControl__list",role:"group","aria-label":d("added"),children:t.map((w,M)=>Pt("button",{type:"button",className:`ri-decalControl__chip ${w.id===n?"ri-decalControl__chip--active":""}`,"aria-pressed":w.id===n,onClick:()=>s(w.id),children:w.image?d("decalImage",{index:M+1}):w.text||d("decalText",{index:M+1})},w.id))}):null,y?Jn("div",{className:"ri-decalControl__editor",children:[Pt(fy,{onNudge:w=>m(y.id,w)}),y.image?null:Jn("div",{className:"ri-decalControl__row",children:[Pt("input",{className:"ri-decalControl__input",value:y.text??"","aria-label":d("text"),onChange:w=>u(y.id,{text:w.target.value})}),Pt("input",{type:"color",className:"ri-decalControl__color",value:y.color??"#ffffff","aria-label":d("colour"),onChange:w=>u(y.id,{color:w.target.value})})]}),Jn("label",{className:"ri-decalControl__slider",children:[Pt("span",{children:d("size")}),Pt("input",{type:"range",min:i/10,max:i*4,step:i/50,value:y.size,"aria-label":d("size"),onChange:w=>u(y.id,{size:Number(w.target.value)})})]}),Jn("label",{className:"ri-decalControl__slider",children:[Pt("span",{children:d("turn")}),Pt("input",{type:"range",min:-180,max:180,step:1,value:xP(y.rotation??0),"aria-label":d("rotation"),onChange:w=>u(y.id,{rotation:Number(w.target.value)*Math.PI/180})})]}),Jn("div",{className:"ri-inlineRow",children:[Pt("button",{type:"button",className:"ri-secondaryButton","aria-pressed":o,title:d("dragTheDecalAcrossTheObjectsSurface"),onClick:()=>p(y.id),children:d("move")}),Pt("button",{type:"button",className:"ri-removeButton",onClick:()=>a(y.id),children:d("remove")})]})]}):null,Jn("div",{className:"ri-inlineRow",children:[Pt("span",{className:"ri-colorCode",children:t.length===0?d("noneAddedYet"):d("decalAdded",{count:t.length})}),Pt("button",{type:"button",className:"ri-secondaryButton",onClick:f,children:d("done")})]})]})}import{useEffect as zP,useRef as VP}from"react";import{useThree as FP}from"@react-three/fiber";import{Mesh as HP,Raycaster as GP,Vector2 as Jd,Vector3 as Ry}from"three";import{BufferGeometry as wP,CanvasTexture as SP,Float32BufferAttribute as Vl,Matrix4 as CP,Object3D as MP,SRGBColorSpace as PP,Uint16BufferAttribute as kP,Vector3 as wr}from"three";var RP=.5,za=4;function AP(e,t=0){let n=new wr(...e);n.lengthSq()<1e-12&&n.set(0,0,1),n.normalize();let r=new MP;return Math.abs(n.y)>.999&&r.up.set(0,0,-Math.sign(n.y)),r.lookAt(n),r.rotateZ(t),r.rotation.clone()}function OP(e,t,n){let r=null;if(e.bones&&t.bones){r=new Map;for(let[o,i]of e.bones)r.set(o,i*(1-n));for(let[o,i]of t.bones)r.set(o,(r.get(o)??0)+i*n)}return{position:e.position.clone().lerp(t.position,n),normal:e.normal.clone().lerp(t.normal,n),bones:r}}function vy(e,t,n,r){let o=s=>r?s.position[t]<=n:s.position[t]>=n,i=[];for(let s=0;s<e.length;s++){let l=e[s],c=e[(s+1)%e.length],u=o(l);if(u&&i.push(l),u!==o(c)){let p=c.position[t]-l.position[t];i.push(OP(l,c,(n-l.position[t])/p))}}return i}function Fl(e,t,n){let r=e.geometry,o=r.getAttribute("position");if(!o)return null;let i=r.getAttribute("normal"),s=r.getAttribute("skinIndex"),l=r.getAttribute("skinWeight"),c=!!(s&&l),u=r.getIndex(),p=Math.max(t.size,1e-6),m=p/(n>0&&Number.isFinite(n)?n:1),a=Math.max(p,m)*RP,f={x:p/2,y:m/2,z:a/2},d=new CP().makeRotationFromEuler(AP(t.normal,t.rotation)).setPosition(...t.position),h=d.clone().invert(),b=(V,$)=>{let U=null;if(c){U=new Map;for(let T=0;T<za;T++){let L=l.getComponent(V,T);if(L<=0)continue;let W=s.getComponent(V,T);U.set(W,(U.get(W)??0)+L)}}return{position:$.clone(),normal:i?new wr().fromBufferAttribute(i,V):new wr,bones:U}},x=[],v=[],S=[],y=[],k=[],w=new wr,M=new wr,E=new wr,P=V=>{if(S.push(.5+V.position.x/p,.5-V.position.y/m),w.copy(V.position).applyMatrix4(d),x.push(w.x,w.y,w.z),v.push(V.normal.x,V.normal.y,V.normal.z),!V.bones)return;let $=[...V.bones].sort((T,L)=>L[1]-T[1]).slice(0,za),U=$.reduce((T,[,L])=>T+L,0)||1;for(let T=0;T<za;T++)y.push($[T]?.[0]??0),k.push(($[T]?.[1]??0)/U)},O=["x","y","z"],R=[new wr,new wr,new wr],A=[0,0,0],D=(u?u.count:o.count)/3;for(let V=0;V<D;V++){for(let T=0;T<3;T++){let L=V*3+T;A[T]=u?u.getX(L):L,R[T].fromBufferAttribute(o,A[T]).applyMatrix4(h)}if(O.some(T=>R[0][T]>f[T]&&R[1][T]>f[T]&&R[2][T]>f[T]||R[0][T]<-f[T]&&R[1][T]<-f[T]&&R[2][T]<-f[T]))continue;let $=R.map((T,L)=>b(A[L],T));if(!i){M.copy($[1].position).sub($[0].position),E.copy($[2].position).sub($[0].position);let T=M.cross(E).transformDirection(d);for(let L of $)L.normal.copy(T)}let U=$;for(let T of O)if(U=vy(U,T,f[T],!0),U=vy(U,T,-f[T],!1),U.length<3)break;for(let T=1;T+1<U.length;T++)P(U[0]),P(U[T]),P(U[T+1])}if(x.length===0)return null;let B=new wP;return B.setAttribute("position",new Vl(x,3)),B.setAttribute("normal",new Vl(v,3)),B.setAttribute("uv",new Vl(S,2)),c&&(B.setAttribute("skinIndex",new kP(y,za)),B.setAttribute("skinWeight",new Vl(k,za))),B}function xy(e){return JSON.stringify([e.image??null,e.image?null:[e.text??"",e.color,e.fontFamily,e.fontWeight],e.position,e.normal,e.size,e.rotation??0])}var yy=256,Xd=24;function wy(e){let t=`${e.fontWeight??"bold"} ${yy-Xd*2}px ${e.fontFamily||"sans-serif"}`,n=document.createElement("canvas"),r=n.getContext("2d");r.font=t;let o=e.text||" ";n.width=Math.min(Math.max(Math.ceil(r.measureText(o).width)+Xd*2,8),4096),n.height=yy,r.font=t,r.textAlign="center",r.textBaseline="middle",r.fillStyle=e.color??"#ffffff",r.fillText(o,n.width/2,n.height/2,n.width-Xd);let i=new SP(n);return i.flipY=!1,i.colorSpace=PP,{texture:i,aspect:n.width/n.height}}import{useEffect as Sy,useRef as EP}from"react";import{BufferGeometry as DP,Float32BufferAttribute as TP,Mesh as LP,MeshStandardMaterial as _P,SkinnedMesh as BP,SRGBColorSpace as My}from"three";var Oo="riDecal",Qd="riDecalId";function qd(){return new DP().setAttribute("position",new TP([],3))}function Cy(e){let t=e.image;return t?.width&&t.height?t.width/t.height:1}function Kd(e){e.disposed=!0,e.node.remove(e.mesh),e.mesh.geometry.dispose(),e.mesh.material.dispose(),e.imagePath&&hi(e.imagePath,My),e.ownTexture?.dispose()}function jP(e,t,n,r){let o=new _P({transparent:!0,polygonOffset:!0,polygonOffsetFactor:-4,depthWrite:!1,metalness:0,roughness:.7}),i=qn(e)&&e.skeleton?e:null,s=i?new BP(qd(),o):new LP(qd(),o);if(i){let u=s;u.bind(i.skeleton,i.bindMatrix),u.frustumCulled=!1,u.onBeforeRender=()=>{let p=Gg(i);p&&u.bindMatrixInverse.copy(p)}}s.userData[Oo]=!0,s.userData[Qd]=t.id,s.raycast=()=>{},s.castShadow=!1,s.receiveShadow=!0,s.renderOrder=1;let l={node:e,mesh:s,signature:n,disposed:!1},c=u=>{let p=Fl(e,t,u);s.geometry.dispose(),s.geometry=p??qd(),s.visible=p!==null};if(t.image){l.imagePath=t.image;let u=il(t.image,My,()=>{l.disposed||(c(Cy(u)),o.needsUpdate=!0,r())});o.map=u,c(Cy(u))}else{let{texture:u,aspect:p}=wy(t);l.ownTexture=u,o.map=u,c(p)}return e.add(s),l}function Py({objectBindings:e,nodeMap:t,invalidate:n}){let r=EP(new Map);Sy(()=>{let o=r.current,i=new Set;for(let[s,l]of Object.entries(e)){if(!l.decals?.length)continue;let c=t[l.modelObjectId??s];if(ln(c))for(let u of l.decals){if(!u.image&&!u.text)continue;let p=`${s}
|
|
7
|
+
${u.id}`,m=xy(u),a=o.get(p);a&&(a.node!==c||a.signature!==m)&&(Kd(a),a=void 0),a||(a=jP(c,u,m,n),o.set(p,a)),a.mesh.material.opacity=(u.opacity??1)*(l.style?.material?.opacity??1),i.add(p)}}for(let[s,l]of o)i.has(s)||(Kd(l),o.delete(s));n()},[e,t,n]),Sy(()=>{let o=r.current;return()=>{for(let i of o.values())Kd(i);o.clear()}},[])}import{Mesh as NP,SkinnedMesh as IP}from"three";function ky(e,t){let n=[];if(qn(e)){let r=e;r.computeBoundingSphere(),r.computeBoundingBox(),IP.prototype.raycast.call(r,t,n)}else NP.prototype.raycast.call(e,t,n);return n.sort((r,o)=>r.distance-o.distance)[0]}function Ay({target:e,nodes:t,controls:n}){let{camera:r,gl:o,invalidate:i}=FP(),s=VP(e);return s.current=e,zP(()=>{let l=o.domElement,c=new GP,u=new Jd,p=l.style.cursor,m=l.style.touchAction;l.style.cursor="grab",l.style.touchAction="none";let a=0,f=null,d=null,h=(M,E=new Jd)=>{let P=l.getBoundingClientRect();u.set((M.clientX-P.left-E.x)/P.width*2-1,-((M.clientY-P.top-E.y)/P.height)*2+1),c.setFromCamera(u,r)},b=M=>{if(!d)return;h(M,d.offset),d.node.updateWorldMatrix(!0,!1);let E=c.intersectObject(d.node,!1)[0];if(!E)return;let P=yi({...E,ray:c.ray},d.node),O=Fl(d.node,{...d.decal,...P},d.aspect);O&&(d.mesh.geometry!==d.geometry&&d.mesh.geometry.dispose(),d.mesh.geometry=O,d.surface=P,i())},x=M=>{if(!d)return;cancelAnimationFrame(a),a=0,f=null;let E=d;d=null,E.mesh.geometry!==E.geometry&&(M&&E.surface?E.geometry.dispose():(E.mesh.geometry.dispose(),E.mesh.geometry=E.geometry)),E.controller&&(E.controller.enabled=E.controlsEnabled),l.hasPointerCapture(E.pointerId)&&l.releasePointerCapture(E.pointerId),l.style.cursor="grab",i();let P=()=>{window.removeEventListener("click",O,!0),window.removeEventListener("pointerdown",P,!0),clearTimeout(R)},O=A=>{A.target===l&&(A.preventDefault(),A.stopImmediatePropagation()),P()},R=setTimeout(P,300);window.addEventListener("click",O,!0),window.addEventListener("pointerdown",P,!0),M&&E.surface&&s.current.onCommit(E.surface)},v=M=>{if(M.button!==0||d)return;let E=s.current,P=t.current[E.objectId];if(!(P instanceof HP)||!P.visible)return;let O=P.children.find(T=>T.userData[Oo]&&T.userData[Qd]===E.decal.id);if(!O?.visible)return;P.updateWorldMatrix(!0,!0),h(M);let R=ky(O,c),A=c.intersectObject(P,!1)[0];if(!R||!A||R.distance>A.distance+1e-4)return;let D=new Ry;if(qn(O)){let T=new Ry,L=O.geometry.getAttribute("position").count;if(!L)return;for(let W=0;W<L;W++)D.add(O.getVertexPosition(W,T));D.divideScalar(L).applyMatrix4(O.matrixWorld)}else D.fromArray(E.decal.position).applyMatrix4(P.matrixWorld);D.project(r);let B=l.getBoundingClientRect(),V=new Jd(M.clientX-(B.left+(D.x+1)/2*B.width),M.clientY-(B.top+(1-D.y)/2*B.height)),$=O.material.map?.image,U=n.current;d={pointerId:M.pointerId,node:P,mesh:O,geometry:O.geometry,decal:E.decal,surface:null,offset:V,aspect:$?.width&&$.height?$.width/$.height:1,controller:U,controlsEnabled:U?.enabled??!1},U&&(U.enabled=!1),M.preventDefault(),M.stopImmediatePropagation(),l.setPointerCapture(M.pointerId),l.style.cursor="grabbing"},S=M=>{!d||M.pointerId!==d.pointerId||(M.preventDefault(),M.stopImmediatePropagation(),f=M,a||(a=requestAnimationFrame(()=>{a=0,f&&b(f)})))},y=M=>{!d||M.pointerId!==d.pointerId||(M.preventDefault(),M.stopImmediatePropagation(),f&&b(f),x(!0))},k=()=>x(!1),w=M=>{M.key==="Escape"&&(x(!1),s.current.onCancel())};return l.addEventListener("pointerdown",v,!0),window.addEventListener("pointermove",S,{capture:!0,passive:!1}),window.addEventListener("pointerup",y,!0),window.addEventListener("pointercancel",k),window.addEventListener("blur",k),window.addEventListener("keydown",w),l.addEventListener("lostpointercapture",k),()=>{x(!1),l.style.cursor=p,l.style.touchAction=m,l.removeEventListener("pointerdown",v,!0),window.removeEventListener("pointermove",S,!0),window.removeEventListener("pointerup",y,!0),window.removeEventListener("pointercancel",k),window.removeEventListener("blur",k),window.removeEventListener("keydown",w),l.removeEventListener("lostpointercapture",k)}},[r,o,i,t,n,e.objectId,e.decal]),null}import{useCallback as Ei,useEffect as ZP,useState as Fa}from"react";import{strToU8 as $P}from"fflate";import{zip as UP}from"fflate";function Oy(e,t=6){return new Promise((n,r)=>{UP(e,{level:t},(o,i)=>{o?r(o):n(i)})})}var Va=2048,Ey=["#00e5ff","#ff4fd8","#ffe45e","#7cff6b","#ff784f","#a78bfa","#38bdf8","#fb7185"];function Dy(e){return e.split("&").join("&").split("<").join("<").split(">").join(">").split('"').join(""").split("'").join("'")}function ep(e,t){return e.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||t}function Ly(e){return ep(e,"model")}function Yd(e,t){return e.index?Math.round(e.index.getX(t)):t}function WP(e,t,n){let r=Yd(e,n),o=Yd(e,n+1),i=Yd(e,n+2);if(r>=t.count||o>=t.count||i>=t.count)return null;let s=[{index:r,u:t.getX(r),v:t.getY(r)},{index:o,u:t.getX(o),v:t.getY(o)},{index:i,u:t.getX(i),v:t.getY(i)}];return s.every(l=>Number.isFinite(l.u)&&Number.isFinite(l.v))?s:null}function Ty(e){return`${e.u.toFixed(6)},${e.v.toFixed(6)}`}function Zd(e,t,n,r){let o,i;r?(o=t.index,i=n.index):(o=Ty(t),i=Ty(n));let s=o<i?`${o}|${i}`:`${i}|${o}`,l=e.get(s);l?l.count+=1:e.set(s,{count:1,start:t,end:n})}function XP(e,t,n){Zd(e,t[0],t[1],n),Zd(e,t[1],t[2],n),Zd(e,t[2],t[0],n)}function qP(e,t){return Array.isArray(e)?e[t]??null:e}function KP(e){let t=new Map,n=0,r=0,o=0;return e.traverse(i=>{let s=i;if(!s.isMesh||!s.geometry||!s.material)return;let l=s.geometry,c=l.getAttribute("uv");if(!c||c.itemSize<2||c.count<3)return;n+=1;let u=s.name||`Mesh ${n}`,p=l.index?.count??c.count,m=l.groups.length>0?l.groups:[{start:0,count:p,materialIndex:0}];for(let a of m){let f=a.materialIndex??0,d=qP(s.material,f);if(!d)continue;let h=t.get(d.uuid);h||(r+=1,h={name:d.name||`Material ${r}`,layers:new Map},t.set(d.uuid,h));let b=h.layers.get(s.uuid);b||(b={name:u,color:Ey[o%Ey.length],edges:new Map},o+=1,h.layers.set(s.uuid,b));let x=Math.max(0,a.start),v=Math.min(p,x+a.count);for(let S=x;S+2<v;S+=3){let y=WP(l,c,S);y&&XP(b.edges,y,!!l.index)}}}),[...t.values()].filter(i=>[...i.layers.values()].some(s=>s.edges.size>0))}function Hl(e){return(e*Va).toFixed(2)}function QP(e){return`M${Hl(e.start.u)} ${Hl(1-e.start.v)}L${Hl(e.end.u)} ${Hl(1-e.end.v)}`}function JP(e){let t=Dy(e.name),n=[...e.layers.values()].filter(r=>r.edges.size>0).map((r,o)=>{let i=Dy(r.name),s=`${ep(r.name,"mesh")}-${o+1}`,l=[...r.edges.values()],c=l.filter(m=>m.count===1),p=(c.length>0?c:l).map(QP).join("");return[` <g id="${s}" data-mesh="${i}" fill="none" stroke="${r.color}"`,' stroke-width="1" stroke-linejoin="round" vector-effect="non-scaling-stroke">',` <title>${i}</title>`,` <path d="${p}"/>`," </g>"].join(`
|
|
8
|
+
`)}).join(`
|
|
9
|
+
`);return['<?xml version="1.0" encoding="UTF-8"?>',`<svg xmlns="http://www.w3.org/2000/svg" width="${Va}" height="${Va}" viewBox="0 0 ${Va} ${Va}">`,` <title>${t} UV layout</title>`," <desc>UV0 island-outline template exported by React Immersive. The SVG canvas maps to the complete 0\u20131 texture area.</desc>",' <rect width="2048" height="2048" fill="none" stroke="#94a3b8" stroke-width="2"/>',n,"</svg>"].join(`
|
|
10
|
+
`)}function YP(e){let t=[],n=new Set;return e.forEach((r,o)=>{let i=KP(r.scene);if(i.length===0)return;let s=Ly(r.label||`model-${o+1}`);i.forEach((l,c)=>{let u=ep(l.name,`material-${c+1}`),p=i.length===1?`${s}-uv-layout.svg`:`${s}-uv-${u}-${c+1}.svg`;if(n.has(p)){let m=p.replace(/\.svg$/,""),a=2;for(;n.has(`${m}-${a}.svg`);)a+=1;p=`${m}-${a}.svg`}n.add(p),t.push({filename:p,materialName:l.name,meshCount:[...l.layers.values()].filter(m=>m.edges.size>0).length,svg:JP(l)})})}),t}async function tp(e,t="model"){let n=YP(e);if(n.length===0)return n;if(n.length===1)return $r(new Blob([n[0].svg],{type:"image/svg+xml;charset=utf-8"}),n[0].filename),n;let r=Object.fromEntries(n.map(i=>[i.filename,$P(i.svg)])),o=await Oy(r);return $r(new Blob([o],{type:"application/zip"}),`${Ly(t)}-uv-layouts.zip`),n}async function _y(e,t="model"){return tp([{scene:e,label:t}],t)}function np(e){import("./exportSceneMesh-MSQIMBFF.mjs").then(t=>t.exportSceneMesh(e),t=>{console.error("[react-immersive] Couldn't load the model exporter.",t),e.onComplete()})}function By({sceneRef:e,materialRefs:t,rendererCaptureRef:n,objectBindings:r,downloadFilename:o,getAllLoadedModels:i,getAllLoadedModelUvSources:s,captureVideo:l,openConfiguredAR:c}){let[u,p]=Fa(!1),[m,a]=Fa(!1),[f,d]=Fa(null),[h,b]=Fa(null),[x,v]=Fa("auto");ZP(()=>{if(!m)return;let P=()=>a(!1);return window.addEventListener("pointerdown",P),()=>window.removeEventListener("pointerdown",P)},[m]);let S=Ei(()=>{d(null),b(null),a(P=>!P)},[]),y=Ei(()=>{let P=i?.()??null;if(P&&P.length>0){a(!1),p(!0),np({sources:P,downloadFilename:o,onComplete:()=>p(!1)});return}let O=e.current;O&&(a(!1),p(!0),np({sources:[{scene:O,objectBindings:r,matRefs:t.current??{}}],downloadFilename:o,onComplete:()=>p(!1)}))},[o,t,r,e,i]),k=Ei(async()=>{let P=i?.()??null;if(!P||P.length===0)return;a(!1),p(!0);let O=new Set;try{for(let R=0;R<P.length;R++){let A=P[R],D=(A.label||`model-${R+1}`).replace(/[\\/:*?"<>|]+/g,"-"),B=D,V=2;for(;O.has(B);)B=`${D}-${V++}`;O.add(B),await new Promise($=>{np({sources:[A],downloadFilename:o,filenameSuffix:`-${B}`,onComplete:$})}),await new Promise($=>setTimeout($,300))}}finally{p(!1)}},[o,i]),w=Ei(()=>{a(!1),Ll(n.current).then(P=>{let O=document.createElement("a");O.href=P,O.download=`${o}.png`,document.body.appendChild(O),O.click(),document.body.removeChild(O)}).catch(P=>{console.error("Screenshot failed:",P)})},[o,n]),M=Ei(async()=>{let P=s?.()??null;try{let O;if(P&&P.length>0)O=await tp(P,o);else{let R=e.current;if(!R)return;O=await _y(R,o)}if(O.length===0){d("This model does not contain UV coordinates.");return}d(null),a(!1)}catch(O){console.error("UV layout export failed:",O),d("Could not create the UV layout archive.")}},[o,e,s]),E=Ei(async P=>{a(!1),b(null);try{let O=await l({mode:P,format:x}),R=O.type==="image/gif"?"gif":O.type.startsWith("video/mp4")?"mp4":"webm",A=URL.createObjectURL(O),D=document.createElement("a");D.href=A,D.download=`${o}-${P}.${R}`,document.body.appendChild(D);try{D.click()}finally{D.remove(),setTimeout(()=>URL.revokeObjectURL(A),1e3)}}catch(O){if(O instanceof DOMException&&O.name==="AbortError")return;b(O instanceof Error?O.message:"Could not export the video."),a(!0)}},[l,o,x]);return{openConfiguredAR:c?()=>{a(!1),c()}:void 0,isDownloading:u,downloadMenuOpen:m,uvExportError:f,toggleDownloadMenu:S,handleDownloadMesh:y,handleDownloadSeparateMeshes:k,handleDownloadScreenshot:w,handleDownloadUvLayout:M,handleDownloadVideo:E,videoFormat:x,setVideoFormat:v,videoExportError:h}}import{useCallback as nn,useEffect as Ga,useRef as Wl,useReducer as ik,useState as Eo}from"react";import{Box3 as $y,Raycaster as ak,Vector2 as ap,Vector3 as sp}from"three";var Gl={tool:"distance",points:[],areaClosed:!1,error:null};function jy(e,t){if(t.type==="tool")return{...Gl,tool:t.tool};if(t.type==="clear")return{...Gl,tool:e.tool};if(t.type==="fail")return{...e,error:t.error};if(t.type==="clearError")return{...e,error:null};if(t.type==="wrapResult")return{...e,points:t.points,areaClosed:!1,error:null};if(t.type==="undo")return{...e,points:e.points.slice(0,-1),areaClosed:!1,error:null};if(t.type==="finishArea"){if(e.tool!=="area")return e;let i=ll(e.points.map(s=>s.position));return"error"in i?{...e,error:i.error}:{...e,areaClosed:!0,error:null}}if(t.type!=="place")return e;let r=e.areaClosed||e.tool==="angle"&&e.points.length===3||e.tool==="pointToPlane"&&e.points.length===2?[]:e.points;if(e.tool==="pointToPlane"&&r.length===0&&!t.point.normal)return{...e,error:"Pick a triangle face to define the reference plane."};if(r.length>=256)return{...e,error:"Finish or clear this measurement before adding more points."};let o=[...r,t.point];return e.tool==="angle"&&o.length===3&&sl(o.map(i=>i.position))===null?{...e,error:"Pick a point away from the angle's vertex."}:{...e,points:o,areaClosed:!1,error:null}}import{Matrix3 as Iy,Matrix4 as ek,Mesh as zy,Vector3 as Ul}from"three";var tk=new WeakMap,nk=new WeakMap,rp=new WeakMap,rk=0;function op(e){return rp.has(e)||rp.set(e,++rk),`${rp.get(e)}:${e.version??e.data?.version??0}:${e.count}`}var Vy=new ArrayBuffer(8),ok=new Float64Array(Vy),Ny=new Uint32Array(Vy);function An(e,t){return ok[0]=t,Math.imul(Math.imul(e^Ny[0],16777619)^Ny[1],16777619)}function Fy(e){return Hy(e,!0)}function Hy(e,t){let n=e.getAttribute("position");if(!n)return"no-position";let r=e.getIndex(),o=t?Ub(e):r?.array??null,i=t?tk:nk,s=[e.getAttribute("skinIndex"),e.getAttribute("skinWeight")].filter(Boolean),l=`${op(n)}:${r?op(r):"none"}:${e.morphTargetsRelative}:${[...e.morphAttributes.position??[],...s].map(op).join(";")}`,c=i.get(e);if(c?.position===n&&c.index===o&&c.version===l)return c.signature;let u=e.morphTargetsRelative?An(2166136261,1):2166136261;for(let m=0;m<n.count;m++)u=An(u,n.getX(m)),u=An(u,n.getY(m)),u=An(u,n.getZ(m));if(o)for(let m=0;m<o.length;m++)u=An(u,o[m]);for(let m of e.morphAttributes.position??[])for(let a=0;a<m.count;a++)u=An(u,m.getX(a)),u=An(u,m.getY(a)),u=An(u,m.getZ(a));for(let m of s)for(let a=0;a<m.count;a++)for(let f=0;f<m.itemSize;f++)u=An(u,m.getComponent(a,f));let p=`${n.count}:${o?.length??0}:${u>>>0}`;return i.set(e,{position:n,index:o,version:l,signature:p}),p}function Gy(e){let t=2166136261,n=e.skeleton;if(n){for(let r of[e.bindMatrix,...n.boneInverses])for(let o of r.elements)t=An(t,o);for(let r of n.bones){r.matrixAutoUpdate&&r.updateMatrix();for(let o of r.matrix.elements)t=An(t,o)}}for(let r of e.morphTargetInfluences??[])t=An(t,r);return`${n?"skin":"mesh"}:${t>>>0}`}function Uy(e,t){e.updateWorldMatrix(!0,!1);let n=e.matrixWorld.clone();if(t!==void 0){if(!e.isInstancedMesh||t>=e.count)return null;let r=new ek;e.getMatrixAt(t,r),n.multiply(r)}return Math.abs(n.determinant())>1e-15?n:null}function ip(e,t){if(!(t.object instanceof zy))return e;let n=Fr(t.object),r=Uy(t.object,t.instanceId);if(!n||!r)return e;let o=r.clone().invert(),i=s=>new Ul(...s).applyMatrix4(o).toArray();return{...e,anchor:{nodeId:n,localPosition:i(e.position),geometrySignature:Fy(t.object.geometry),poseSignature:Gy(t.object),...t.instanceId!==void 0?{instanceId:t.instanceId}:{},...e.normal?{localNormal:new Ul(...e.normal).applyNormalMatrix(new Iy().getNormalMatrix(o)).toArray()}:{},...e.faceVertices?{localFaceVertices:e.faceVertices.map(i)}:{}}}}function $l(e,t,n,r,o){let i=u=>({measurement:e,points:[],status:u});if(e.modelId!==n||Ca(e.tilesetUrl??"")!==Ca(r??""))return i("model-changed");if(!t)return i("missing-object");let s=o??Ha(t),l=[],c=new Map;for(let u of e.points){if(!u.anchor){l.push(u);continue}let p=u.anchor,m=s(p.nodeId);if(!(m instanceof zy))return i("missing-object");for(let h=m;h;h=h.parent)if(!h.visible)return i("hidden-object");if(Fy(m.geometry)!==p.geometrySignature&&Hy(m.geometry,!1)!==p.geometrySignature)return i("geometry-changed");let a=c.get(m);if(a===void 0&&(a=Gy(m),c.set(m,a)),a!==p.poseSignature)return i("pose-changed");let f=Uy(m,p.instanceId);if(!f)return i("geometry-changed");let d=h=>new Ul(...h).applyMatrix4(f).toArray();l.push({...u,position:d(p.localPosition),...p.localNormal?{normal:new Ul(...p.localNormal).applyNormalMatrix(new Iy().getNormalMatrix(f)).toArray()}:{},...p.localFaceVertices?{faceVertices:p.localFaceVertices.map(d)}:{}})}return{measurement:e,points:l,status:e.approximate?"approximate":"ready"}}function Ha(e){let t=new Map;return e.traverse(n=>{let r=Fr(n);r&&t.set(r,t.has(r)?null:n)}),n=>t.get(n)??null}function sk(e){let t=new $y().setFromObject(e),n=new sp;return t.getSize(n),{min:[t.min.x,t.min.y,t.min.z],max:[t.max.x,t.max.y,t.max.z],size:[n.x,n.y,n.z]}}function lk(e){let t=new $y().setFromObject(e);if(t.isEmpty())return null;let n=t.getCenter(new sp),r=t.getSize(new sp).length()/2;return!Number.isFinite(r)||r<=0?null:{center:[n.x,n.y,n.z],radius:r}}function Wy({canvasAreaRef:e,controlsRef:t,sceneRef:n,modelUrl:r,tilesetUrl:o,measurementModelId:i,savedMeasurements:s,measurementSettings:l,measurementUnit:c,onMeasurementsChange:u,onMeasurementSettingsChange:p,onCollectionChange:m,modelRotation:a,bindingTransformSignature:f,modelLoaded:d,enabled:h}){let[b,x]=Eo(!1),[v,S]=ik(jy,Gl),[y,k]=Eo("none"),[w,M]=Eo(null),[E,P]=Eo(!1),[O,R]=Eo(null),[A,D]=Eo(null),B=Wl(!1),V=Wl(0),$=Wl(null),U=Wl(null);B.current=b&&h;let T=nn(ie=>{ie.updateMatrixWorld(!0),R(sk(ie)),D(lk(ie))},[]),L=nn(()=>{S({type:"clear"}),M(null)},[]),W=nn(ie=>{S({type:"tool",tool:ie}),M(null)},[]),ee=nn(()=>S({type:"undo"}),[]),Z=nn(()=>S({type:"finishArea"}),[]),Q=nn(()=>x(ie=>!ie),[]),te=nn(()=>P(ie=>!ie),[]),X=nn(ie=>{!B.current||ie.button!==0||($.current={x:ie.clientX,y:ie.clientY})},[]),F=nn((ie,He)=>{let Ge=e.current,he=t.current?.camera,Re=n.current;if(!Ge||!he||!Re)return null;let De=Ge.getBoundingClientRect();if(!De.width||!De.height)return null;Re.updateMatrixWorld(!0),he.updateMatrixWorld(!0);let Ue=new ap(ie-De.left,He-De.top),Lt=new ak;return Lt.setFromCamera(new ap(Ue.x/De.width*2-1,1-Ue.y/De.height*2),he),Lt.intersectObject(Re,!0).find(ab)??null},[e,t,n]),I=nn((ie,He)=>{let Ge=e.current,he=t.current?.camera,Re=F(ie,He);if(!Re||!Ge||!he)return null;let De=Ge.getBoundingClientRect(),Ue=new ap(ie-De.left,He-De.top);return ip(sb(Re,he,Ue,De,y),Re)},[e,t,F,y]),Y=nn(()=>{U.current!==null&&cancelAnimationFrame(U.current),U.current=null,M(null)},[]),re=nn(ie=>{if(!B.current||y==="none"||ie.buttons!==0||ie.target.closest("button, input, select, label, textarea, .ri-measureTools")){Y();return}U.current!==null&&cancelAnimationFrame(U.current);let{clientX:He,clientY:Ge}=ie;U.current=requestAnimationFrame(()=>{U.current=null;let he=I(He,Ge);M(he?.snapped?he:null)})},[Y,I,y]),Fe=nn(ie=>{if(!B.current)return;let He=$.current;if($.current=null,He&&Math.hypot(ie.clientX-He.x,ie.clientY-He.y)>6||ie.target.closest("button, input, select, label, textarea, .ri-measureTools"))return;if(v.tool==="wrap"||v.tool==="wrapHorizontal"){let Re=F(ie.clientX,ie.clientY);if(!Re)return;let De=v.tool==="wrapHorizontal"?ib(Re):ob(Re);if("error"in De){S({type:"fail",error:De.error});return}let Ue=De.points.map((Lt,Nt)=>({id:V.current+Nt+1,...ip({position:Lt},Re)}));V.current+=Ue.length,S({type:"wrapResult",points:Ue});return}let he=I(ie.clientX,ie.clientY);he&&(V.current+=1,S({type:"place",point:{...he,id:V.current}}))},[v.tool,I,F]);Ga(()=>{L(),R(null),D(null)},[r,L]),Ga(()=>{L()},[a[0],a[1],a[2],f,L]),Ga(()=>(Y(),Y),[Y,b,y]),Ga(()=>{h||(x(!1),Y())},[h,Y]),Ga(()=>{let ie=n.current;!d||!ie||T(ie)},[f,d,T,n]);let[K,we]=Eo([]),Pe=v.points.length>0&&id(v.tool,v.points)!==null&&(v.tool!=="area"||v.areaClosed),xe=v.tool==="distance"&&v.points.length===2,wt=nn(ie=>{if(!Pe)return;if(v.points.length>8192){S({type:"fail",error:"A saved measurement can contain up to 8,192 points. Choose a simpler surface and measure again."});return}if(v.points.some(Ge=>!Ge.anchor)){S({type:"fail",error:"This surface has no stable measurement anchor. Give the mesh a unique name and measure again."});return}if(s.length>=256){S({type:"fail",error:"A model can keep up to 256 named measurements."});return}let He={id:crypto.randomUUID(),name:ie.trim()||`Measurement ${s.length+1}`,modelId:i,...o?{tilesetUrl:o,approximate:!0}:{},tool:v.tool,points:structuredClone(v.points),createdAt:new Date().toISOString()};u([...s,He]),L()},[Pe,s,i,o,v,u,L]),pt=nn((ie,He)=>{try{if(!xe)throw new Error("Pick two distance points before calibrating.");let Ge=id("distance",v.points).value;p(cb(Ge,ie,He,l)),S({type:"clearError"})}catch(Ge){S({type:"fail",error:Ge instanceof Error?Ge.message:String(Ge)})}},[xe,v.points,l,p]),Tt={settings:l,items:s};return{saveMeasurement:wt,canSaveMeasurement:Pe,canCalibrate:xe,calibrate:pt,savedResults:K,setSavedResults:we,exportMeasurementJson:()=>$r(new Blob([db(Tt)],{type:"application/json"}),"measurements.json"),exportMeasurementCsv:()=>{let ie=n.current?Ha(n.current):void 0,He=s.map(Ge=>{let he=$l(Ge,n.current,i,o,ie);return dl(Ge,l,c,he.points,he.status)});$r(new Blob([pb(Tt,He,c)],{type:"text/csv;charset=utf-8"}),"measurements.csv")},importMeasurements:ie=>{try{m(ub(ie)),L()}catch(He){S({type:"fail",error:He instanceof Error?He.message:String(He)})}},measureMode:b,measureModeRef:B,measurePoints:v.points,measurementTool:v.tool,areaClosed:v.areaClosed,measurementError:v.error,selectMeasurementTool:W,undoMeasurementPoint:ee,finishMeasureArea:Z,snapMode:y,setSnapMode:k,snapPreview:w,handleMeasurePointerMove:re,clearSnapPreview:Y,showDimensions:E,measureBox:O,modelBounds:A,refreshBounds:T,clearMeasurements:L,toggleMeasureMode:Q,toggleDimensions:te,handleMeasurePointerDown:X,handleMeasureClick:Fe}}import{createPortal as ck}from"react-dom";import{MapPin as uk}from"lucide-react";import{useCallback as Do,useEffect as Jr,useMemo as dk,useRef as pk,useState as Hn}from"react";function Xy(e,t){let n=null,r=i=>{let s=i.mode==="immersive-ar"?i.session??null:null;s!==n&&(n&&t.endAR(),n=s,n&&t.startAR())},o=e.subscribe(r);return r(e.getState()),()=>{o(),n&&t.endAR("interrupted"),n=null}}import{jsx as Di,jsxs as lp}from"react/jsx-runtime";var qy={canPlace:!1,isPlacementMode:!0,isModelPlaced:!1};function Qy({enableXR:e,configuredHandoff:t=!1,usdzUrl:n,mobileHandoffUrl:r,engagement:o,animationControls:i}){let s=oe(),l=pk(null),[c,u]=Hn(null),[p,m]=Hn(()=>e&&Ky());Jr(()=>{if(!e||!Ky()){u(null),m(!1);return}let I=!1;return m(!0),import("./xrRuntime-5S7KYUVB.mjs").then(Y=>{if(I)return;let re=null;try{re=Y.createXRStore({emulate:!1})}catch{re=null}u(re?{store:re,runtime:Y}:null),m(!1)},()=>{I||(u(null),m(!1))}),()=>{I=!0}},[e]);let a=c?.store??null,[f,d]=Hn(!1),[h,b]=Hn(e),[x,v]=Hn(!1),[S,y]=Hn(!0),[k,w]=Hn(null),[M,E]=Hn(!1),[P,O]=Hn(!1),[R,A]=Hn(qy),[D,B]=Hn(!1),V=dk(()=>e&&(t||!!n?.trim())&&fl(),[e,n,t]);Jr(()=>{y(Ib())},[]);let $=Do(()=>{if(typeof window>"u")return null;try{let I=new URL(r?.trim()||window.location.href,window.location.href);return I.protocol==="http:"||I.protocol==="https:"?I.toString():null}catch{return null}},[r]);Jr(()=>{if(!e||S){w(null),E(!1);return}w($())},[e,S,$]),Jr(()=>{if(a)return a.subscribe(I=>O(I.session!=null&&I.mode==="immersive-ar"))},[a]),Jr(()=>{if(a)return Xy(a,o)},[a,o]),Jr(()=>{B(!1),A(qy)},[P]),Jr(()=>{if(!e||typeof navigator>"u"){b(!1);return}let I=navigator.xr;if(!I?.isSessionSupported){b(!1);return}let Y=!1;return b(!0),I.isSessionSupported("immersive-ar").then(re=>!Y&&d(re)).catch(()=>{}).finally(()=>{Y||b(!1)}),I.isSessionSupported("immersive-vr").then(re=>!Y&&v(re)).catch(()=>{}),()=>{Y=!0}},[e]);let U=Do(()=>{let I=$();I&&(o.requestARLaunch("mobile-handoff"),w(I),E(!0))},[$,o]),T=Do(()=>E(!1),[]),L=Do(()=>{let I=n?.trim();if(!I)return;o.requestARLaunch("quick-look");let Y=document.createElement("a");Y.setAttribute("rel","ar"),Y.href=I,Y.style.display="none";let re=document.createElement("img");re.alt="",re.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",Y.appendChild(re),document.body.appendChild(Y),Y.click(),Y.remove()},[n,o]),W=Do(I=>{A(I),I.isPlacementMode||B(!1)},[]),ee=Do(I=>{B(!1),I?l.current?.finishPlacementMode():l.current?.cancelPlacementMode()},[]),Z=Do(I=>{I.preventDefault(),B(!0),l.current?.startPlacementMode()},[]);Jr(()=>{if(!D)return;let I=()=>ee(!0),Y=()=>ee(!1);return window.addEventListener("pointerup",I),window.addEventListener("pointercancel",Y),()=>{window.removeEventListener("pointerup",I),window.removeEventListener("pointercancel",Y)}},[ee,D]);let Q=R.isModelPlaced?R.isPlacementMode?R.canPlace?s("arReleaseToPlace"):s("arFindSurface"):null:R.canPlace?null:s("arFindSurface"),te=R.isModelPlaced&&!R.isPlacementMode?s("arGestureHint"):null,X=a?.getState().domOverlayRoot??null,F=P&&X?ck(lp(Xg.Provider,{value:X,children:[te&&Di("div",{className:"ri-arHintOverlay",children:Di("div",{className:"ri-arHint",children:te})}),Di("div",{className:"ri-arOverlay",children:lp("div",{className:"ri-arControls",children:[i,Q&&Di("div",{className:"ri-arStatus",children:Q}),R.isModelPlaced&&lp("button",{type:"button",className:`ri-arActionButton ${D?"ri-arActionButton--active":""}`,onPointerDown:I=>Z(I.nativeEvent),"aria-pressed":D,children:[Di(uk,{size:14}),s("arRelocate")]}),!R.isModelPlaced&&R.canPlace&&Di("button",{type:"button",className:"ri-arActionButton ri-arActionButton--primary",onClick:()=>l.current?.placeCurrent(),children:s("tapToPlace")})]})})]}),X):null;return{xrStore:a,xrRuntime:c?.runtime??null,xrResolving:p,inARSession:P,presenterRef:l,arSupported:f,checkingAR:h,vrSupported:x,quickLookSupported:V,resolvedMobileHandoffUrl:k,isMobileHandoffOpen:M,arOverlay:F,openMobileHandoff:U,closeMobileHandoff:T,openQuickLook:L,handleARStateChange:W}}function Ky(){if(typeof navigator>"u")return!1;let e=navigator.xr;return!!(e&&typeof e.isSessionSupported=="function"&&typeof e.addEventListener=="function")}import{useEffect as mk,useRef as Yy}from"react";import{useFrame as fk,useThree as gk}from"@react-three/fiber";var Xl=e=>typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null,ql=class{constructor(){this.lastFrame=null;this.intervals=[]}frame(t,n){let r=this.lastFrame===null?0:t-this.lastFrame;r>0&&(n==="always"||r<=250)&&this.intervals.length<1e3&&this.intervals.push(r),this.lastFrame=t}sample(t,n,r){let i=n.renderMode!=="never"&&this.lastFrame!==null&&r-this.lastFrame<=250?this.intervals:[],s=i.length?i.reduce((c,u)=>c+u,0)/i.length:null;this.intervals=[];let l=t.info;return{sampledAt:new Date().toISOString(),...structuredClone(n),drawCalls:Xl(n.renderer==="webgpu"?l?.render?.drawCalls:l?.render?.calls),triangles:Xl(l?.render?.triangles),geometries:Xl(l?.memory?.geometries),textures:Xl(l?.memory?.textures),frameIntervalMs:s,fps:s?1e3/s:null,frameSamples:i.length}}};function Jy(e=1e3){return Number.isFinite(e)?Math.min(1e4,Math.max(250,e)):1e3}function Zy(e){let t=gk(i=>i.get),n=Yy(e);n.current=e;let r=Yy(new ql);fk(i=>r.current.frame(performance.now(),i.frameloop));let o=Jy(e.intervalMs);return mk(()=>{let i=setInterval(()=>{let{gl:s,viewport:l,frameloop:c}=t(),u=n.current,p=r.current.sample(s,{renderer:Ur(s)?"webgpu":"webgl",renderMode:c,quality:{profile:u.profile,reducedGpuLoad:u.reducedGpuLoad,dpr:s.getPixelRatio?.()??l.dpr,shadows:s.shadowMap?.enabled??u.shadows,postProcessing:u.postProcessing},streaming:u.streamingRef?.current??null},performance.now());u.onStats(p)},o);return()=>clearInterval(i)},[t,o]),null}import{Canvas as PR,useThree as yx}from"@react-three/fiber";import{ACESFilmicToneMapping as kR,LinearToneMapping as RR,NoToneMapping as wx,ReinhardToneMapping as AR}from"three";import{Suspense as OR,useEffect as ER,useMemo as ec,useState as DR}from"react";import{useThree as Wa}from"@react-three/fiber";import{Autofocus as Wk,Bloom as Xk,BrightnessContrast as qk,ChromaticAberration as Kk,ColorAverage as Qk,DepthOfField as Jk,DotScreen as Yk,EffectComposer as Zk,Glitch as eR,GodRays as tR,Grid as nR,HueSaturation as rR,Noise as oR,Outline as iR,Pixelation as aR,Ramp as sR,Scanline as lR,SelectiveBloom as cR,Sepia as uR,SMAA as dR,SSAO as pR,ToneMapping as mR,Vignette as fR}from"@react-three/postprocessing";import{BlendFunction as Li,KernelSize as gR}from"postprocessing";import{Color as Xa,Vector2 as Ua}from"three";import{memo as bR,useCallback as hR,useEffect as bp,useLayoutEffect as vR,useMemo as Lo,useRef as hp,useState as hx}from"react";import{forwardRef as bk,useImperativeHandle as hk,useMemo as vk}from"react";import{BlendFunction as yk,Effect as xk}from"postprocessing";import{Uniform as wk}from"three";import{jsx as Ck}from"react/jsx-runtime";var Sk=`
|
|
11
|
+
uniform float exposure;
|
|
12
|
+
void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
|
|
13
|
+
outputColor = vec4(inputColor.rgb * exposure, inputColor.a);
|
|
14
|
+
}
|
|
15
|
+
`,cp=class extends xk{constructor(t=1){super("ExposureEffect",Sk,{blendFunction:yk.NORMAL,uniforms:new Map([["exposure",new wk(t)]])})}set exposure(t){this.uniforms.get("exposure").value=t}},ex=bk(function({exposure:t},n){let r=vk(()=>new cp(t),[]);return r.exposure=t,hk(n,()=>r,[r]),Ck("primitive",{object:r,dispose:null})});import{useFrame as Mk,useThree as Kl}from"@react-three/fiber";import*as ox from"@react-three/postprocessing";import{BlendFunction as Pk}from"postprocessing";import{Color as kk,MathUtils as Rk,Mesh as Ak,Vector2 as tx,Vector3 as nx}from"three";import{useEffect as rx,useMemo as Ql,useRef as up}from"react";import{jsx as Ek}from"react/jsx-runtime";var Ok=ox.LensFlareEffect;function ix({config:e}){let t=Kl(a=>a.camera),n=Kl(a=>a.raycaster),r=Kl(a=>a.scene),o=Kl(a=>a.viewport),i=up(null),s=up(new nx),l=up(new tx),c=Ql(()=>new nx(...e.lensPosition),[e.lensPosition]),u=Ql(()=>new kk(e.colorGain??"#141414"),[e.colorGain]),p=Ql(()=>new tx(0,0),[]),m=Ql(()=>new Ok({blendFunction:Pk.NORMAL,enabled:!0,glareSize:e.glareSize,lensPosition:c,screenRes:p,starPoints:6,flareSize:e.flareSize,flareSpeed:e.flareSpeed,flareShape:e.flareShape,animated:e.animated,anamorphic:e.anamorphic,colorGain:u,lensDirtTexture:null,haloScale:e.haloScale,secondaryGhosts:e.secondaryGhosts,aditionalStreaks:e.aditionalStreaks,ghostScale:e.ghostScale,opacity:e.opacity,starBurst:e.starBurst}),[u,e.aditionalStreaks,e.anamorphic,e.animated,e.flareShape,e.flareSize,e.flareSpeed,e.glareSize,e.haloScale,e.ghostScale,e.opacity,e.secondaryGhosts,e.starBurst,c,p]);return rx(()=>(i.current=m,()=>{m.dispose(),i.current=null}),[m]),rx(()=>{let a=m.uniforms.get("screenRes");a&&(a.value.x=o.width,a.value.y=o.height)},[m,o]),Mk((a,f)=>{let d=i.current;if(!d)return;let h=d.uniforms.get("lensPosition"),b=d.uniforms.get("opacity");if(!h||!b)return;let x=1;if(s.current.copy(c).project(t),s.current.z>1)return;h.value.x=s.current.x,h.value.y=s.current.y,l.current.x=s.current.x,l.current.y=s.current.y,n.setFromCamera(l.current,t);let v=n.intersectObjects(r.children,!0),{object:S}=v[0]||{};S&&(S.userData?.lensflare==="no-occlusion"?x=0:S instanceof Ak&&(S.material.uniforms?._transmission?.value>.2||S.material._transmission&&S.material._transmission>.2?x=.2:S.material.transparent&&(x=S.material.opacity))),b.value=Rk.damp(b.value,x,12,f)}),Ek("primitive",{object:m,dispose:null})}import{useThree as ux}from"@react-three/fiber";import{EffectPass as Fk}from"postprocessing";import{useEffect as Hk,useMemo as Gk}from"react";import{BlendFunction as Dk,Effect as Tk,RenderPass as Lk}from"postprocessing";import{Color as ax,Mesh as cx,NearestFilter as Jl,NoBlending as _k,ShaderMaterial as sx,Uniform as To,Vector2 as Bk,Vector3 as jk,WebGLRenderTarget as lx}from"three";var Nk=`
|
|
16
|
+
#include <common>
|
|
17
|
+
#include <morphtarget_pars_vertex>
|
|
18
|
+
#include <skinning_pars_vertex>
|
|
19
|
+
#include <clipping_planes_pars_vertex>
|
|
20
|
+
#include <logdepthbuf_pars_vertex>
|
|
21
|
+
void main() {
|
|
22
|
+
#include <skinbase_vertex>
|
|
23
|
+
#include <begin_vertex>
|
|
24
|
+
#include <morphtarget_vertex>
|
|
25
|
+
#include <skinning_vertex>
|
|
26
|
+
#include <project_vertex>
|
|
27
|
+
#include <logdepthbuf_vertex>
|
|
28
|
+
#include <clipping_planes_vertex>
|
|
29
|
+
}`,Ik=`
|
|
30
|
+
#include <common>
|
|
31
|
+
#include <clipping_planes_pars_fragment>
|
|
32
|
+
#include <logdepthbuf_pars_fragment>
|
|
33
|
+
uniform vec3 objectId;
|
|
34
|
+
uniform bool onlySelected;
|
|
35
|
+
void main() {
|
|
36
|
+
#include <clipping_planes_fragment>
|
|
37
|
+
#include <logdepthbuf_fragment>
|
|
38
|
+
if (onlySelected && length(objectId) < 0.001) discard;
|
|
39
|
+
gl_FragColor = vec4(objectId, step(0.001, length(objectId)));
|
|
40
|
+
}`,zk=`
|
|
41
|
+
uniform sampler2D selectionMask;
|
|
42
|
+
uniform sampler2D visibleMask;
|
|
43
|
+
uniform vec2 texelSize;
|
|
44
|
+
uniform vec3 outlineColor;
|
|
45
|
+
uniform float edgeStrength;
|
|
46
|
+
float different(vec4 a, vec4 b) {
|
|
47
|
+
return max(a.a, b.a) * step(0.001, length(a.rgb - b.rgb) + abs(a.a - b.a));
|
|
48
|
+
}
|
|
49
|
+
float visible(vec4 id, vec4 surface) {
|
|
50
|
+
return surface.a * (1.0 - step(0.001, length(id.rgb - surface.rgb)));
|
|
51
|
+
}
|
|
52
|
+
float edgeAt(vec2 uv, vec2 offset, vec4 center, float centerVisible) {
|
|
53
|
+
vec4 neighbor = texture2D(selectionMask, uv + offset);
|
|
54
|
+
return different(center, neighbor) * max(centerVisible, visible(neighbor, texture2D(visibleMask, uv + offset)));
|
|
55
|
+
}
|
|
56
|
+
void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
|
|
57
|
+
vec4 c = texture2D(selectionMask, uv);
|
|
58
|
+
float shown = visible(c, texture2D(visibleMask, uv));
|
|
59
|
+
float edge = max(max(edgeAt(uv, vec2(texelSize.x, 0.0), c, shown), edgeAt(uv, vec2(-texelSize.x, 0.0), c, shown)),
|
|
60
|
+
max(edgeAt(uv, vec2(0.0, texelSize.y), c, shown), edgeAt(uv, vec2(0.0, -texelSize.y), c, shown)));
|
|
61
|
+
outputColor = vec4(outlineColor * edge * edgeStrength, max(inputColor.a, edge));
|
|
62
|
+
}`,Yl=class extends Tk{constructor(n,r,o,i,s={}){super("SelectionOutlineEffect",zk,{blendFunction:Dk.SCREEN,uniforms:new Map([["selectionMask",new To(null)],["visibleMask",new To(null)],["texelSize",new To(new Bk)],["outlineColor",new To(new ax(s.visibleEdgeColor??2278750))],["edgeStrength",new To(s.edgeStrength??3)]])});this.scene=n;this.camera=r;this.getObjects=o;this.layer=i;this.maskTarget=new lx(1,1,{minFilter:Jl,magFilter:Jl});this.visibleTarget=new lx(1,1,{minFilter:Jl,magFilter:Jl});this.visibleTarget.texture.name="SelectionOutline.VisibleIDs",this.uniforms.get("visibleMask").value=this.visibleTarget.texture,this.maskTarget.texture.name="SelectionOutline.IDs",this.uniforms.get("selectionMask").value=this.maskTarget.texture,this.maskMaterial=new sx({name:"SelectionOutline.IDs",vertexShader:Nk,fragmentShader:Ik,uniforms:{objectId:new To(new jk),onlySelected:new To(!1)},blending:_k,toneMapped:!1,clipping:!0}),this.maskPass=new Lk(n,r,this.maskMaterial),this.maskPass.skipShadowMapUpdate=!0,this.maskPass.ignoreBackground=!0,this.maskPass.clearPass.overrideClearColor=new ax(0),this.maskPass.clearPass.overrideClearAlpha=0}update(n){let r=Vk(this.scene,this.getObjects()),o=[],i=this.camera.layers.mask;try{this.scene.traverseVisible(s=>{if(!(s instanceof cx))return;let l=r.get(s)??0,c=s.onBeforeRender;s.onBeforeRender=function(...u){c.apply(this,u);let p=u[4];p instanceof sx&&p.uniforms.objectId&&(p.uniforms.objectId.value.set((l&255)/255,(l>>>8&255)/255,(l>>>16&255)/255),p.uniformsNeedUpdate=!0)},o.push(()=>{s.onBeforeRender=c})}),this.maskMaterial.uniforms.onlySelected.value=!1,this.maskPass.render(n,this.visibleTarget,null);for(let s of r.keys()){let l=s.layers.mask;s.layers.enable(this.layer),o.push(()=>{s.layers.mask=l})}this.camera.layers.set(this.layer),this.maskMaterial.uniforms.onlySelected.value=!0,this.maskPass.render(n,this.maskTarget,null)}finally{this.camera.layers.mask=i;for(let s of o)s()}}setSize(n,r){this.maskTarget.setSize(n,r),this.visibleTarget.setSize(n,r),this.uniforms.get("texelSize").value.set(1/n,1/r)}dispose(){this.maskPass.dispose(),this.maskMaterial.dispose(),this.maskTarget.dispose(),this.visibleTarget.dispose()}};function Vk(e,t){let n=new Map(t.map((i,s)=>[i,s+1])),r=new Map,o=(i,s)=>{if(!i.visible)return;let l=n.get(i)??s;l&&i instanceof cx&&r.set(i,l);for(let c of i.children)o(c,l)};return o(e,0),r}import{jsx as Uk}from"react/jsx-runtime";function dx({objects:e,layer:t,options:n}){let r=ux(s=>s.scene),o=ux(s=>s.camera),i=Gk(()=>new Fk(o,new Yl(r,o,()=>e.current,t,n)),[r,o,e,t,n]);return Hk(()=>()=>i.dispose(),[i]),Uk("primitive",{object:i,dispose:null})}function px(e){let t=[e];for(;t.length>0;){let n=t.pop();if(n.visible){if(n.isMesh)return!0;t.push(...n.children)}}return!1}function mx(e,t){let n=e.update,r=t,o=NaN,i=NaN;return e.update=function(...s){(o!==r.near||i!==r.far)&&(this.mainCamera=t,o=r.near,i=r.far),n.apply(this,s)},()=>{e.update=n}}import{RampType as dp}from"@react-three/postprocessing";import{GlitchMode as pp,KernelSize as Ti,ToneMappingMode as mp}from"postprocessing";import{Color as $k}from"three";function fx(e){return e==="linear"?mp.LINEAR:e==="reinhard"?mp.REINHARD:mp.ACES_FILMIC}function Zl(e){switch(e){case"verySmall":return Ti.VERY_SMALL;case"small":return Ti.SMALL;case"medium":return Ti.MEDIUM;case"large":return Ti.LARGE;case"veryLarge":return Ti.VERY_LARGE;case"huge":return Ti.HUGE}}function gx(e){switch(e){case"constantMild":return pp.CONSTANT_MILD;case"constantWild":return pp.CONSTANT_WILD;default:return pp.SPORADIC}}function fp(e){let t=new $k(e);return[t.r,t.g,t.b,1]}function bx(e){return e==="radial"?dp.Radial:e==="mirroredLinear"?dp.MirroredLinear:dp.Linear}import{Fragment as MR,jsx as Ze,jsxs as gp}from"react/jsx-runtime";var _o={edgeStrength:1,pulseSpeed:0,visibleEdgeColor:new Xa(bi.color).getHex(),hiddenEdgeColor:new Xa(bi.color).multiplyScalar(.35).getHex(),kernelSize:gR.VERY_SMALL,blur:!1,xRay:!1},yR={edgeStrength:3};function xR(e){let t=[];return e.traverse(n=>{n.isMesh&&t.push(n)}),t}function wR(e){if(e.isMesh)return[e];let t=[];return e.traverseVisible(n=>{n.isMesh&&t.push(n)}),t}var $a=[],SR=bR(function({sceneConfig:t,selectedObjectRef:n,selectedObjectOutlineColor:r,highlightOnHover:o=!1,disabled:i=!1,onOutlineEffect:s,hasMultiSelection:l,multiOutlineObjects:c}){let u=Wa(R=>R.scene),p=Wa(R=>R.gl),m=hp(null),a=t?.postProcessing,f=n??null,d=a?.outline.enabled===!0,h=d||o,b=Lo(()=>new Xa(r??"#22c55e").getHex(),[r]),x=Lo(()=>({...yR,blendFunction:Li.SCREEN,visibleEdgeColor:b}),[b]),v=2;for(;v===a?.outline.selectionLayer||v===a?.selectiveBloom.selectionLayer;)v+=1;let[S,y]=hx(()=>p.xr?.isPresenting??!1);bp(()=>{let R=p.xr;if(!R)return;let A=()=>y(!0),D=()=>y(!1);return R.addEventListener("sessionstart",A),R.addEventListener("sessionend",D),y(R.isPresenting),()=>{R.removeEventListener("sessionstart",A),R.removeEventListener("sessionend",D)}},[p]);let k=u.children.filter(R=>R.isLight),w=Lo(()=>new Ua(a?.chromaticAberration.offsetX??.002,a?.chromaticAberration.offsetY??.002),[a?.chromaticAberration.offsetX,a?.chromaticAberration.offsetY]),M=Lo(()=>new Xa(a?.outline.visibleEdgeColor??"#ffffff").getHex(),[a?.outline.visibleEdgeColor]),E=Lo(()=>new Xa(a?.outline.hiddenEdgeColor??"#22090a").getHex(),[a?.outline.hiddenEdgeColor]),P=Lo(()=>fp(a?.ramp.startColor??"#000000"),[a?.ramp.startColor]),O=Lo(()=>fp(a?.ramp.endColor??"#ffffff"),[a?.ramp.endColor]);return!a||S||i?null:gp(MR,{children:[a.godRays.enabled===!0&&gp("mesh",{ref:m,position:a.godRays.sunPosition,visible:!1,frustumCulled:!1,children:[Ze("sphereGeometry",{args:[.1,8,8]}),Ze("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),gp(Zk,{multisampling:0,enableNormalPass:a.ssao.enabled===!0,autoClear:!1,children:[a.smaa.enabled===!0&&Ze(dR,{}),a.ssao.enabled===!0&&Ze(pR,{samples:a.ssao.samples,rings:a.ssao.rings,intensity:a.ssao.intensity,radius:a.ssao.radius,bias:a.ssao.bias,luminanceInfluence:a.ssao.luminanceInfluence,fade:a.ssao.fade,minRadiusScale:a.ssao.minRadiusScale,worldDistanceThreshold:a.ssao.worldDistanceThreshold,worldDistanceFalloff:a.ssao.worldDistanceFalloff,worldProximityThreshold:a.ssao.worldProximityThreshold,worldProximityFalloff:a.ssao.worldProximityFalloff}),a.autofocus.enabled===!0&&Ze(Wk,{focusDistance:a.autofocus.focusDistance,focusRange:a.autofocus.focusRange,focalLength:a.autofocus.focalLength,bokehScale:a.autofocus.bokehScale,target:a.autofocus.target,mouse:a.autofocus.mouse,debug:a.autofocus.debug||void 0,manual:a.autofocus.manual,smoothTime:a.autofocus.smoothTime}),a.autofocus.enabled!==!0&&a.depthOfField.enabled===!0&&Ze(Jk,{focusDistance:a.depthOfField.focusDistance,focusRange:a.depthOfField.focusRange,focalLength:a.depthOfField.focalLength,bokehScale:a.depthOfField.bokehScale}),a.bloom.enabled===!0&&Ze(Xk,{intensity:a.bloom.intensity,luminanceThreshold:a.bloom.luminanceThreshold,luminanceSmoothing:a.bloom.luminanceSmoothing,mipmapBlur:a.bloom.mipmapBlur,radius:a.bloom.radius,levels:a.bloom.levels}),a.selectiveBloom.enabled===!0&&Ze(cR,{selection:f??void 0,lights:k,selectionLayer:a.selectiveBloom.selectionLayer,intensity:a.selectiveBloom.intensity,luminanceThreshold:a.selectiveBloom.luminanceThreshold,luminanceSmoothing:a.selectiveBloom.luminanceSmoothing,kernelSize:Zl(a.selectiveBloom.kernelSize),mipmapBlur:a.selectiveBloom.mipmapBlur,inverted:a.selectiveBloom.inverted,ignoreBackground:a.selectiveBloom.ignoreBackground}),h&&Ze(iR,{ref:s,selection:$a,selectionLayer:a.outline.selectionLayer,blendFunction:Li.SCREEN,edgeStrength:d?a.outline.edgeStrength:_o.edgeStrength,pulseSpeed:d?a.outline.pulseSpeed:_o.pulseSpeed,visibleEdgeColor:d?M:_o.visibleEdgeColor,hiddenEdgeColor:d?E:_o.hiddenEdgeColor,kernelSize:d?Zl(a.outline.kernelSize):_o.kernelSize,blur:d?a.outline.blur:_o.blur,xRay:d?a.outline.xRay:_o.xRay}),l&&Ze(dx,{objects:c,layer:v,options:x}),a.chromaticAberration.enabled===!0&&Ze(Kk,{offset:w,radialModulation:a.chromaticAberration.radialModulation,modulationOffset:a.chromaticAberration.modulationOffset}),a.colorAverage.enabled===!0&&Ze(Qk,{}),a.dotScreen.enabled===!0&&Ze(Yk,{angle:a.dotScreen.angle,scale:a.dotScreen.scale}),a.glitch.enabled===!0&&Ze(eR,{mode:gx(a.glitch.mode),delay:new Ua(a.glitch.delay[0],a.glitch.delay[1]),duration:new Ua(a.glitch.duration[0],a.glitch.duration[1]),strength:new Ua(a.glitch.strength[0],a.glitch.strength[1]),chromaticAberrationOffset:new Ua(a.glitch.chromaticAberrationOffset[0],a.glitch.chromaticAberrationOffset[1]),columns:a.glitch.columns,ratio:a.glitch.ratio,active:!0}),a.grid.enabled===!0&&Ze(nR,{scale:a.grid.scale,lineWidth:a.grid.lineWidth}),a.lensflare.enabled===!0&&Ze(ix,{config:a.lensflare}),a.godRays.enabled===!0&&Ze(tR,{sun:m,samples:a.godRays.samples,density:a.godRays.density,decay:a.godRays.decay,weight:a.godRays.weight,exposure:a.godRays.exposure,clampMax:a.godRays.clampMax,blur:a.godRays.blur,kernelSize:Zl(a.godRays.kernelSize)}),a.noise.enabled===!0&&Ze(oR,{premultiply:a.noise.premultiply,opacity:a.noise.opacity,blendFunction:Li.ADD}),a.brightnessContrast.enabled===!0&&Ze(qk,{brightness:a.brightnessContrast.brightness,contrast:a.brightnessContrast.contrast}),a.hueSaturation.enabled===!0&&Ze(rR,{hue:a.hueSaturation.hue,saturation:a.hueSaturation.saturation}),a.toneMapping.enabled===!0&&Ze(ex,{exposure:a.toneMapping.exposure}),a.vignette.enabled===!0&&Ze(fR,{eskil:a.vignette.eskil,offset:a.vignette.offset,darkness:a.vignette.darkness,blendFunction:Li.NORMAL}),a.toneMapping.enabled===!0&&Ze(mR,{mode:fx(a.toneMapping.mode),resolution:a.toneMapping.resolution,whitePoint:a.toneMapping.whitePoint,middleGrey:a.toneMapping.middleGrey,minLuminance:a.toneMapping.minLuminance,averageLuminance:a.toneMapping.averageLuminance,adaptationRate:a.toneMapping.adaptationRate}),a.sepia.enabled===!0&&Ze(uR,{intensity:a.sepia.intensity,blendFunction:Li.NORMAL}),a.scanline.enabled===!0&&Ze(lR,{density:a.scanline.density,blendFunction:Li.OVERLAY}),a.pixelation.enabled===!0&&Ze(aR,{granularity:a.pixelation.granularity}),a.ramp.enabled===!0&&Ze(sR,{rampType:bx(a.ramp.rampType),rampStart:a.ramp.rampStart,rampEnd:a.ramp.rampEnd,startColor:P,endColor:O,opacity:a.ramp.rampMask?1:a.ramp.opacity??.5,rampBias:a.ramp.rampBias,rampGain:a.ramp.rampGain,rampMask:a.ramp.rampMask,rampInvert:a.ramp.rampInvert})]})]})});function CR(e,t){return e.length===t.length&&e.every((n,r)=>n===t[r])}function vx({hoveredObjectRef:e,selectedObjectRefs:t,...n}){let r=Wa(m=>m.scene),o=Wa(m=>m.camera),i=Wa(m=>m.invalidate),[s,l]=hx(null),c=hp($a);c.current=t??$a;let u=hR(m=>l(m),[]);vR(()=>{if(s)return mx(s,o)},[s,o]);let p=hp({effect:null,objects:$a});return bp(()=>{if(!s)return;let a=n.sceneConfig?.postProcessing?.outline.enabled===!0?xR(r):e&&px(e)?wR(e):$a;p.current.effect===s&&CR(p.current.objects,a)||(p.current={effect:s,objects:a},s.selection.set(a),i())}),bp(()=>{i()},[t,i]),Ze(SR,{...n,onOutlineEffect:u,hasMultiSelection:c.current.length>0,multiOutlineObjects:c})}import{Fragment as BR,jsx as Jt,jsxs as xx}from"react/jsx-runtime";var TR=1.5;function vp({runtimeStats:e,children:t,camera:n,backgroundColor:r,shadows:o=!0,sceneConfig:i,selectedObjectRef:s,selectedObjectRefs:l,selectedObjectOutlineColor:c,hoveredObjectRef:u,highlightOnHover:p,renderMode:m="demand",maxDpr:a=2,xrStore:f,xrRuntime:d,rendererCaptureRef:h,preserveDrawingBuffer:b=!1,reduceGpuLoad:x,suspended:v=!1,paused:S=!1,onRendererCreated:y,onPointerMissed:k,backend:w="webgl"}){let M=w==="webgpu",E=x??zb(),P=E?Math.min(a,TR):a,O=o&&!E,R=ec(()=>{if(r)return{background:r};if(!i?.background.enabled)return{background:"transparent"};if(i.background.type==="color")return{background:i.background.color};if(i.background.type==="image"&&i.background.imageUrl.trim()){let W=i.background.imageUrl.trim(),ee=ol(W)??W;return{backgroundImage:`url(${JSON.stringify(ee)})`,backgroundPosition:"center",backgroundRepeat:"no-repeat",backgroundSize:"cover"}}return{background:"linear-gradient(180deg, #3a3a3c 0%, #1c1c1d 100%)"}},[r,i]),A=ec(()=>{if(r)return r;let W=i?.background;if(W?.enabled){if(W.type==="color")return W.color;if(W.type==="image"&&W.imageUrl.trim()||W.type==="environment")return null}return"#1c1c1d"},[r,i]),D=ec(()=>{let W=i?.postProcessing;return W?!!(W.glitch.enabled||W.noise.enabled||W.lensflare.enabled&&W.lensflare.animated):!1},[i?.postProcessing]),[B,V]=DR(!1),$=i?.environment,U=i?.groundShadows,T=ec(()=>{if(!$)return null;if($.source==="custom"){let W=$.customEnvironmentUrl.trim();return eb(W)?{files:W}:null}return{preset:$.preset}},[$]),L=xx(BR,{children:[Jt(Yb,{captureRef:h}),e&&Jt(Zy,{...e,reducedGpuLoad:E,shadows:O,postProcessing:!E&&!M}),Jt(Zb,{}),Jt(mh,{cameraConfig:n}),Jt(lh,{active:D}),Jt(uh,{color:A}),T?Jt(Oi,{onError:W=>console.warn("Failed to load environment map:",W),children:xx(OR,{fallback:null,children:[Jt(sh,{...T,environmentIntensity:$?.intensity??.25,backgroundIntensity:$?.intensity??.25,background:i?.background.enabled===!0&&i.background.type==="environment"}),Jt(dh,{})]})}):null,Jt(ph,{rotation:$?.rotation??0}),f&&d&&Jt(d.XRPerformanceManager,{onPresentingChange:V}),U?.enabled&&U.mode==="shadowCatcher"&&!B&&!M&&Jt(ch,{position:[0,U.height,0],scale:U.size,opacity:U.intensity,blur:U.borderFade,far:15,resolution:1024,color:"#000000"}),t,Jt(vx,{sceneConfig:i,selectedObjectRef:s,selectedObjectRefs:l,selectedObjectOutlineColor:c,hoveredObjectRef:u,highlightOnHover:p,disabled:E||M}),M?Jt(_R,{toneMapping:i?.postProcessing.toneMapping}):null]});return Jt(PR,{frameloop:v||S&&!B?"never":m,onCreated:({gl:W})=>y?.(W),onPointerMissed:k,dpr:[1,P],shadows:O?"percentage":!1,resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:R,camera:n??{fov:50},gl:M?Qb:{preserveDrawingBuffer:b,toneMapping:wx,toneMappingExposure:1},flat:M||void 0,children:f&&d&&!M?Jt(d.XRScene,{store:f,renderMode:m,suspended:v,children:L}):L})}var LR={linear:RR,reinhard:AR,aces:kR};function _R({toneMapping:e}){let t=yx(s=>s.gl),n=yx(s=>s.invalidate),r=e?.enabled===!0,o=e?.mode??"aces",i=e?.exposure??1;return ER(()=>{t.toneMapping=r?LR[o]:wx,t.toneMappingExposure=r?i:1,n()},[t,n,r,o,i]),null}import{useThree as jR}from"@react-three/fiber";import{CameraControls as NR,PointerLockControls as IR}from"@react-three/drei";import{Box3 as zR,Vector3 as Sx}from"three";import{useEffect as Sr,useRef as VR}from"react";import{Fragment as FR,jsx as yp,jsxs as HR}from"react/jsx-runtime";function xp({controlsRef:e,onReady:t,onCameraChange:n,cameraLimits:r,controllerType:o="orbit",onPointerLockExit:i,reducedMotion:s=!1,zoom:l=!0,pageScroll:c=!1}){let u=o==="orbit",p=jR(a=>a.frameloop);Sr(()=>{if(!e||typeof e!="object")return;let a=e.current;a&&td(a,u?p==="never"?"paused":"active":"disconnected")},[e,p,u]),Sr(()=>{let a=e&&typeof e=="object"?e.current:null;return()=>{a&&td(a,"disconnected")}},[e,u]);let m=VR(null);return Sr(()=>{if(!u)return m.current?.lock(),()=>{m.current?.unlock()}},[u]),Sr(()=>{u&&document.pointerLockElement&&document.exitPointerLock()},[u]),Sr(()=>{if(u)return;let a=()=>{document.pointerLockElement||i?.()};return document.addEventListener("pointerlockchange",a),()=>{document.removeEventListener("pointerlockchange",a)}},[u,i]),Sr(()=>{if(!u||!e||typeof e!="object"||!("current"in e))return;let a=e.current;a&&jg(a,s)},[u,e,s]),Sr(()=>{if(!u||!n||!e||typeof e!="object"||!("current"in e))return;let a=e.current;if(!a)return;let f=()=>{n(a.camera,a)};return a.addEventListener("update",f),()=>{a.removeEventListener("update",f)}},[u,e,n]),Sr(()=>{if(!u||!e||typeof e!="object"||!("current"in e))return;let a=e.current;if(!a)return;let f=gh(r);a.minDistance=f.minDistance,a.maxDistance=f.maxDistance,a.minPolarAngle=f.minPolarAngle,a.maxPolarAngle=f.maxPolarAngle,a.minAzimuthAngle=f.minAzimuthAngle,a.maxAzimuthAngle=f.maxAzimuthAngle,a.boundaryEnclosesCamera=f.boundaryEnclosesCamera,a.boundaryFriction=f.boundaryFriction,a.setBoundary(f.panBoundary?new zR(new Sx(...f.panBoundary[0]),new Sx(...f.panBoundary[1])):void 0)},[u,e,r?.minDistance,r?.maxDistance,r?.minPolarAngle,r?.maxPolarAngle,r?.minAzimuthAngle,r?.maxAzimuthAngle,r?.boundaryEnclosesCamera,r?.boundaryFriction,r?.panBoundary]),Sr(()=>{let a=u&&e&&typeof e=="object"?e.current:null;return t?.(a),()=>t?.(null)},[u,e,t]),u?HR(FR,{children:[yp(NR,{ref:e,makeDefault:!0,smoothTime:s?0:.3,dollyToCursor:!0}),yp(bh,{controlsRef:e,zoom:l,pageScroll:c})]}):yp(IR,{ref:m,makeDefault:!0,selector:"[data-ri-pointer-lock-trigger]"})}import{useRef as nc,useMemo as Ka,useEffect as GR}from"react";import{useFrame as Px,useThree as kx}from"@react-three/fiber";import{Vector3 as UR}from"three";var qa=new WeakMap;function Cx(e,t,n){let r=qa.get(e);r||(r=new Map,qa.set(e,r)),r.set(t,n)}function tc(e,t){let n=qa.get(e);n?.delete(t),n?.size===0&&qa.delete(e)}function Mx(e,t){return qa.get(e)?.get(t)??null}import{Fragment as XR,jsx as jo,jsxs as qR}from"react/jsx-runtime";function Bo(e,t){if(!t)return e;let n=t*Math.PI/180,r=Math.cos(n),o=Math.sin(n);return[e[0]*r+e[2]*o,e[1],-e[0]*o+e[2]*r]}function Rx(e,t,n=[0,0,0]){let[r,o,i]=e.center,s=e.radius,l=[t[0]-n[0],t[1]-n[1],t[2]-n[2]],c=Math.hypot(l[0],l[1],l[2]),u=c>1e-6?[l[0]/c,l[1]/c,l[2]/c]:[0,1,0],p=s*2;return{position:[r+u[0]*p,o+u[1]*p,i+u[2]*p],target:e.center,extent:s,near:Math.max(s/100,.001),far:p+s*2}}function Ax(e,t){let n=t[0]-e.center[0],r=t[1]-e.center[1],o=t[2]-e.center[2],i=Math.hypot(n,r,o);return{near:Math.max(i-e.radius,i*.01,.001),far:i+e.radius*2}}function Ox(e,t){if(!e)return;let n=e.shadow.camera,r=t?.near??.5,o=t?.far??40;n.near=r,n.far=o,n.updateProjectionMatrix()}function Qa(e,t,n){return t&&n&&!e.attachedToCamera?n.center:[0,0,0]}var $R={ambient:{intensity:.25,color:"#ffffff"},lights:[{id:"light-hemi",type:"hemisphere",color:"#ffffff",intensity:.3,position:[0,1,0],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0},{id:"light-key",type:"directional",color:"#ffffff",intensity:2.5,position:[3,6,3],attachedToCamera:!1,castShadow:!0,shadowBias:-5e-4,visible:!0},{id:"light-fill",type:"directional",color:"#ffffff",intensity:0,position:[-3,4,-3],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0}]},WR={enabled:!0,mapSize:2048,bias:-5e-4,normalBias:.02,radius:3};function Ex({light:e,shadows:t,shadowsEnabled:n,environmentRotation:r,modelBounds:o,objectBindings:i,nodeRefs:s}){let l=nc(null),c=nc(null),u=nc(null),p=kx(S=>S.camera),m=kx(S=>S.scene),a=Ka(()=>new UR,[]),f=Ka(()=>e.attachedToCamera||e.attachment?e.position:Bo(e.position,r),[e.position,e.attachedToCamera,e.attachment,r]);Px(()=>{let S=l.current??c.current??u.current;if(!S)return;if(e.attachedToCamera){S.position.copy(p.position);return}let y=e.attachment;if(!y)return;let k=i?Ys(i,y.objectId):null,M=(k?i?.[k]:void 0)?.modelObjectId??y.objectId,E=(k?s?.current[k]:void 0)??Hr(m,M);E&&(a.fromArray(y.offset),E.localToWorld(a),S.position.copy(a))});let d=n&&t.enabled&&e.castShadow,h=Ka(()=>(e.type==="spot"||e.type==="directional")&&e.target&&!e.attachedToCamera?e.attachment?e.target:Bo(e.target,r):null,[e.type,e.target,e.attachedToCamera,e.attachment,r]),b=Ka(()=>e.type==="directional"&&d&&o&&!e.attachedToCamera?Rx(o,f,h??void 0):null,[e.type,e.attachedToCamera,d,o,f,h]),x=Ka(()=>e.type==="spot"&&d&&o&&!e.attachedToCamera?Ax(o,f):null,[e.type,e.attachedToCamera,d,o,f]);GR(()=>{let S=l.current??u.current;if(!S)return;let[y,k,w]=h&&!(e.type==="directional"&&b)?h:b?.target??Qa(e,d,o);S.target.position.set(y,k,w),S.target.updateMatrixWorld()},[e,d,o,h,b]);let v=nc(!1);return Px(()=>{let S=l.current??c.current??u.current;if(!S||e.attachedToCamera||e.attachment)return;let y=l.current??u.current,k=Mx(m,e.id);if(!k){if(!v.current)return;if(v.current=!1,S.position.fromArray(b?.position??f),Ox(u.current,x),y){let[P,O,R]=h&&!(e.type==="directional"&&b)?h:b?.target??Qa(e,d,o);y.target.position.set(P,O,R),y.target.updateMatrixWorld()}return}v.current=!0;let w=Bo(k.position,r),M=k.target?Bo(k.target,r):h??Qa(e,d,o),E=e.type==="directional"&&d&&o?Rx(o,w,M):null;S.position.fromArray(E?.position??w),Ox(u.current,d&&o?Ax(o,w):null),y&&(y.target.position.fromArray(E?.target??M),y.target.updateMatrixWorld())}),!e.visible||e.type==="none"?null:e.type==="directional"?jo("directionalLight",{ref:l,color:e.color,intensity:e.intensity,position:b?.position??f,castShadow:d,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias,"shadow-normalBias":t.normalBias,"shadow-radius":t.radius,"shadow-camera-near":b?.near??.5,"shadow-camera-far":b?.far??40,"shadow-camera-left":-(b?.extent??8),"shadow-camera-right":b?.extent??8,"shadow-camera-top":b?.extent??8,"shadow-camera-bottom":-(b?.extent??8)}):e.type==="point"?jo("pointLight",{ref:c,color:e.color,intensity:e.intensity,position:f,distance:e.distance,decay:e.decay,castShadow:d,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias}):e.type==="spot"?jo("spotLight",{ref:u,color:e.color,intensity:e.intensity,position:f,angle:e.angle??Math.PI/6,penumbra:e.penumbra??.2,distance:e.distance,decay:e.decay,castShadow:d,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias,"shadow-normalBias":t.normalBias,"shadow-radius":t.radius,"shadow-camera-near":x?.near??.5,"shadow-camera-far":x?.far??40}):e.type==="hemisphere"?jo("hemisphereLight",{color:e.color,groundColor:"#444444",intensity:e.intensity}):null}function wp({lightingConfig:e,shadowConfig:t,shadowsEnabled:n=!0,environmentRotation:r=0,environmentConfig:o,modelBounds:i,objectBindings:s,nodeRefs:l}){let c=e??$R,u=t??WR,p=o?.shadowLight,m=Bo([5,10,5],r);return qR(XR,{children:[jo("ambientLight",{intensity:c.ambient.intensity,color:c.ambient.color}),c.lights.map(a=>jo(Ex,{light:a,shadows:u,shadowsEnabled:n,environmentRotation:r,modelBounds:i,objectBindings:s,nodeRefs:l},a.id)),p?.enabled&&jo(Ex,{light:{id:"light-env-shadow",type:"directional",color:"#ffffff",intensity:p.intensity,position:m,attachedToCamera:!1,castShadow:!0,shadowBias:p.bias,visible:!0},shadows:u,shadowsEnabled:n,environmentRotation:0,modelBounds:i,objectBindings:s,nodeRefs:l})]})}import{useState as Cp,useEffect as We,useRef as Et,useMemo as xt,useCallback as QR,Suspense as JR}from"react";import{useFrame as rc,useThree as _x}from"@react-three/fiber";import{useCallback as KR,useEffect as Dx,useRef as Sp,useState as Tx}from"react";function Lx(e,t,n){let[r,o]=Tx({}),i=Sp(new Map),[s,l]=Tx(0),c=Sp(t);c.current=t;let u=Sp(n);u.current=n;let p=KR((m,a)=>{c.current?.some(f=>f.url===m)&&o(f=>f[m]===a?f:{...f,[m]:a})},[]);return Dx(()=>{let m=new Set(t?.map(f=>f.url)),a=!1;for(let[f,d]of i.current)m.has(f)&&r[f]===d&&d.parent===e||(d.removeFromParent(),i.current.delete(f),a=!0);for(let[f,d]of Object.entries(r))!m.has(f)||i.current.get(f)===d||(e.add(d),i.current.set(f,d),a=!0,u.current?.(f,d));o(f=>{let d=Object.entries(f).filter(([h])=>m.has(h));return d.length===Object.keys(f).length?f:Object.fromEntries(d)}),a&&l(f=>f+1)},[e,t,r]),Dx(()=>()=>{i.current.forEach(m=>m.removeFromParent()),i.current.clear()},[]),{rootsByUrl:r,revision:s,onSourceReady:p}}import{Color as YR,MeshStandardMaterial as ZR,MeshBasicMaterial as Mp,MeshNormalMaterial as eA,MeshMatcapMaterial as tA,DoubleSide as nA,NormalBlending as rA,Box3 as oc,Vector3 as No,Matrix4 as oA,MathUtils as ic}from"three";import{SkeletonUtils as Bx}from"three-stdlib";import{jsx as sc,jsxs as sA}from"react/jsx-runtime";function ac(e,t,n){let r=n.get(e);r&&(t?.rotation?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2],r.rotation.order):e.rotation.copy(r.rotation),t?.scale?e.scale.fromArray(t.scale):e.scale.copy(r.scale),e.position.fromArray(vh(t?.position??r.position.toArray(),[e.rotation.x,e.rotation.y,e.rotation.z],e.scale.toArray(),t?.pivot,r.rotation.order,t?.shear)),rl(e,t?.shear))}function Ot(e,t=!1){if(!e||typeof e!="object")return"-";let n=e;return[n.channel??0,t?n.format??"":"",n.isVideoTexture?n.colorSpace??"":""].join(":")}function _i(e){let t=e,n=Number(t.clearcoat)>0,r=Number(t.sheen)>0,o=Number(t.anisotropy)>0,i=Number(t.transmission)>0,s=t.transparent===!1&&t.blending===rA&&t.alphaToCoverage!==!0;return[Ot(t.map),Ot(t.aoMap),Ot(t.lightMap),Ot(t.bumpMap),Ot(t.normalMap,!0),t.normalMap?t.normalMapType:"",Ot(t.displacementMap),Ot(t.emissiveMap),Ot(t.metalnessMap),Ot(t.roughnessMap),o,Ot(o?t.anisotropyMap:null),n,Ot(n?t.clearcoatMap:null),Ot(n?t.clearcoatNormalMap:null,!0),Ot(n?t.clearcoatRoughnessMap:null),r,Ot(r?t.sheenColorMap:null),Ot(r?t.sheenRoughnessMap:null),Ot(t.specularColorMap),Ot(t.specularIntensityMap),i,Ot(i?t.transmissionMap:null),Ot(i?t.thicknessMap:null),Ot(t.alphaMap),Number(t.alphaTest)>0,!!t.alphaHash,!!t.flatShading,!!t.dithering,!!t.vertexColors,t.side,s].join("|")}var iA={};function Ja({url:e,objectBindings:t,selectedItem:n,itemMaterials:r,interactive:o=!0,onItemClick:i,onItemHover:s,onItemDoubleClick:l,onItemContextMenu:c,onModelLoaded:u,onAnimationsReady:p,nodeRefsOut:m,onNodeRefsChange:a,materialRefsOut:f,panelHoveredItem:d,sceneConfig:h,zoomOnSelected:b=!0,highlightOnHover:x=!0,decoderConfig:v,modelFormat:S,onLoadProgress:y,explodeFactor:k=0,suspendBindingTransforms:w=!1,originalNodePoses:M,mergeModels:E,onMergeModelLoaded:P,onMergeModelError:O,pulses:R=iA}){let A=Ra(e,v,S,y),D=_x(_=>_.invalidate),[B,V]=Cp(null),$=Et(null),{setCanvasCursor:U,restoreCanvasCursor:T}=Mh();We(()=>{(!o||!x)&&(V(null),s?.(null),T())},[o,x,s,T]);let L=xt(()=>{let _=Bx.clone(A.scene),N=ka(A.scene);return N&&Fb(_,N),hd(_),_},[A.scene]),{rootsByUrl:W,revision:ee,onSourceReady:Z}=Lx(L,E,P),Q=Et(new Map),[te,X]=Cp(0),F=QR((_,N,z)=>{Z(_,N),Q.current.get(_)!==z&&(Q.current.set(_,z),X(H=>H+1))},[Z]);We(()=>{let _=new Set(E?.map(z=>z.url)),N=!1;for(let z of Q.current.keys())_.has(z)||(Q.current.delete(z),N=!0);N&&X(z=>z+1)},[E]);let I=xt(()=>Vr(L),[L,ee]),Y=I.nodesById,{originalMaterials:re,ownMeshes:Fe}=xt(()=>{let _=new WeakMap,N=new WeakSet;return L.traverse(z=>{ln(z)&&(_.set(z,z.material),N.add(z))}),{originalMaterials:_,ownMeshes:N}},[L]);xt(()=>{L.traverse(_=>{ln(_)&&!re.has(_)&&re.set(_,_.material)})},[L,ee,re]);let K=A.materialVariants,Pe=(h?mr(h.model):[]).join(`
|
|
63
|
+
`),[xe,wt]=Cp(null);We(()=>{let _=Pe?Pe.split(`
|
|
64
|
+
`):[],N=[];for(let H of _){let ne=K?K.names.indexOf(H):-1;if(ne>=0){N.push(ne);continue}console.warn(`[react-immersive] The model has no material variant "${H}".`+(K?` Its variants are: ${K.names.join(", ")}.`:" It has no material variants."))}if(!K||N.length===0){wt(null);return}let z=!1,J=[];return L.traverse(H=>{if(!ln(H)||!Fe.has(H))return;let ne=fb(mb(H),N);ne!==null&&J.push(K.resolveMaterial(ne,H).then(pe=>[H,pe]))}),Promise.all(J).then(H=>{z||wt({scene:L,key:Pe,materials:new Map(H)})}).catch(H=>{z||console.warn(`[react-immersive] Material variants "${_.join('", "')}" failed to load.`,H)}),()=>{z=!0}},[L,Fe,K,Pe]);let pt=xe?.scene===L?xe.materials:void 0,Tt=_=>pt?.get(_)??re.get(_)??Ch(_);We(()=>{I.duplicateNames.size!==0&&console.warn("[react-immersive] Duplicate model node names were assigned unique binding IDs.",Object.fromEntries(I.duplicateNames))},[I]);let ae=xt(()=>new WeakMap,[L]),ke=xt(()=>{let _=new WeakMap;if(L.traverse(N=>{let z=ae.get(N);z||(z={position:N.position.clone(),rotation:N.rotation.clone(),scale:N.scale.clone()},ae.set(N,z)),_.set(N,{position:z.position.clone(),rotation:z.rotation.clone(),scale:z.scale.clone()})}),M)for(let[N,z]of Object.entries(M)){let J=Y[N],H=J&&_.get(J);H&&(H.position.fromArray(z.position),z.rotation&&H.rotation.set(z.rotation[0],z.rotation[1],z.rotation[2],H.rotation.order),z.scale&&H.scale.fromArray(z.scale))}return _},[L,Y,M,ae]);We(()=>{let _=!1,N=null,z=null,J=window,H=Object.entries(Y).filter(([,Ve])=>ln(Ve)),ne=new oc,pe=[],ot=0;L.traverse(Ve=>{!ln(Ve)||Ve.userData[Oo]||(Ve.castShadow=!1,Ve.receiveShadow=!0)});let Xe=()=>{if(_)return;let Ve=new Set,bt=ne.getSize(new No),Se=new No;for(let{name:_t,box:Zt}of pe)Zt.getSize(Se),Se.x>bt.x*.7&&Se.z>bt.z*.7&&Se.y>bt.y*.4&&Ve.add(_t);L.traverse(_t=>{if(!ln(_t)||_t.userData[Oo])return;let Zt=Fr(_t);_t.castShadow=!Zt||!Ve.has(Zt),_t.receiveShadow=!0}),D()},St=()=>{_||(J.requestIdleCallback?N=J.requestIdleCallback(gt,{timeout:100}):z=window.setTimeout(()=>gt(),0))},gt=Ve=>{if(N=null,z=null,_)return;let bt=performance.now(),Se=0;for(;ot<H.length&&!(Se>0&&!(Ve?Ve.didTimeout?Se<16:Ve.timeRemaining()>1:performance.now()-bt<8));){let[_t,Zt]=H[ot];ot+=1,Se+=1;let gn=new oc().setFromObject(Zt);gn.isEmpty()||(pe.push({name:_t,box:gn}),ne.union(gn))}ot<H.length?St():Xe()};return St(),()=>{_=!0,N!==null&&J.cancelIdleCallback?.(N),z!==null&&window.clearTimeout(z)}},[D,Y,L]),We(()=>{yl(L,{precise:!0})},[L,ee]),We(()=>{let _=new AbortController;return Wb(L,_.signal),()=>{_.abort(),qb(L)}},[L,ee]);let Ye=xt(()=>{let _={};for(let[N,z]of Object.entries(t))_[z.modelObjectId??N]=N;return _},[t]),ie=xt(()=>Object.entries(t).map(([_,N])=>`${_}${N.modelObjectId??_}`).sort().join(""),[t]),He=xt(()=>Object.entries(t).map(([_,N])=>JSON.stringify([_,N.modelObjectId??_,N.transform??null])).sort().join(""),[t]),Ge=Et(new Map);We(()=>{let _=new Map,N=new Map;for(let[H,ne]of Object.entries(t)){if(!ne.transform)continue;let pe=Y[ne.modelObjectId??H];pe&&(_.set(pe,ne.transform),N.set(pe,Gr(pe)))}let z=new Set([...Ge.current.keys(),..._.keys()]);for(let H of z){ac(H,void 0,ke);for(let ne of Gr(H))pr(ne)}L.updateMatrixWorld(!0);let J=new Map;for(let H of N.values())for(let ne of H)if(!J.has(ne)){let pe=[];for(let ot=ne;ot;ot=ot.parent)pe.unshift(ot.matrix.clone());J.set(ne,{world:ne.matrixWorld.clone(),transforms:pe})}for(let[H,ne]of _)ac(H,ne,ke);Ge.current=_,L.updateMatrixWorld(!0);for(let[H,ne]of J)gi(H,ne.world,ne.transforms);D()},[L,Y,ke,He,D]),We(()=>()=>{for(let _ of Gr(L))pr(_)},[L]);let he=xt(()=>{let _={};for(let[N,z]of Object.entries(t)){let J=z.modelObjectId??N,H=Y[J];if(!ln(H))continue;let ne=Tt(H);ne&&(_[N]=Aa(ne,pe=>{let ot=yh(pe),Xe=xh(ot??new ZR);return wh(Xe),Xe}))}return _},[Y,ie,re,pt]);We(()=>(f&&(f.current=he),()=>{f?.current===he&&(f.current={})}),[he,f]),We(()=>()=>{for(let _ of Object.values(he))fr(_,N=>{Jg(N.userData),N.dispose()})},[he]);let Re=h?.model.shading??"lit",De=h?.model.renderer??"pbr",Ue=h?.wireframe.enabled??!1,Lt=h?.wireframe.color??"#93c5fd",Nt=h?.wireframe.opacity??1,Mn=xt(()=>{let _={};if(Re!=="unlit")return _;for(let[N,z]of Object.entries(he))_[N]=Aa(z,J=>{let H=new Mp;return H.color.copy(J.color),H.map=J.map,H.alphaMap=J.alphaMap,H.alphaTest=J.alphaTest,H.transparent=J.transparent,H.opacity=J.opacity,H.side=J.side,H});return _},[he,Re]),pn=xt(()=>{let _={};if(Re!=="normals")return _;for(let[N,z]of Object.entries(he))_[N]=Aa(z,()=>new eA);return _},[he,Re]),Ln=xt(()=>{let _={};if(Re!=="lit"||De!=="matcap")return _;let N=Yg();for(let[z,J]of Object.entries(he))_[z]=Aa(J,H=>{let ne=new tA;return ne.matcap=N,ne.color.copy(H.color),ne.alphaMap=H.alphaMap,ne.alphaTest=H.alphaTest,ne.side=H.side,ne});return _},[he,Re,De]);We(()=>()=>{for(let _ of Object.values(Mn))fr(_,N=>N.dispose());for(let _ of Object.values(pn))fr(_,N=>N.dispose());for(let _ of Object.values(Ln))fr(_,N=>N.dispose())},[Mn,pn,Ln]);let Wo=_=>Re==="normals"?pn[_]:Re==="unlit"?Mn[_]:De==="matcap"?Ln[_]:he[_],Pn=Et(u);Pn.current=u,We(()=>{Pn.current?.(L)},[L]);let ce=xt(()=>{let _={};for(let[N,z]of Object.entries(t)){let J=z.modelObjectId??N,H=Y[J];H&&(_[N]=H)}return _},[Y,ie]);We(()=>(m.current=ce,a?.(),()=>{m.current===ce&&(m.current={})}),[ce,m,a]);let ve=Et({});We(()=>()=>{for(let _ of Object.values(ve.current))for(let[N,z]of Object.entries(_))z&&hi(z,vi(N));ve.current={}},[]);let qe=Et(new Map);We(()=>()=>{qe.current.clear()},[]);let ze=xt(()=>{let _=new Map;for(let[N,z]of Object.entries(t)){let J=d===z||d?.id===z.id||d?.modelObjectId===z.modelObjectId,H=x&&(B===N||J),ne=H||n===N;(H||ne)&&_.set(N,{emissive:H,matcap:ne})}return _},[t,x,B,n,d]),$e=Et(ze);$e.current=ze,We(()=>{let _=new Set;for(let[N,z]of Object.entries(t)){_.add(N);let J=z.modelObjectId??N,H=Y[J];if(!H)continue;if(z.removed){H.parent&&(qe.current.set(H,H.parent),H.parent.remove(H),L.dispatchEvent({type:"childremoved",child:H}));continue}let ne=qe.current.get(H);if(ne&&(H.parent||(ne.add(H),L.dispatchEvent({type:"childadded",child:H})),qe.current.delete(H)),H.visible=z.visible!==!1,!ln(H))continue;let pe=he[N];if(!pe)continue;if(De!=="uv-checker"){let Se=Wo(N);Se&&(H.material=Se)}if(z.visible===!1)continue;let ot=Mn[N],Xe=Ln[N],St=r[N]??r[z.modelObjectId??N],gt=z.style?.material,Ve=ve.current[N]??{};for(let Se of Pa){let _t=Lb(gt,Se),Zt=Ve[Se];if(Zt===_t)continue;let gn=vi(Se);Zt&&hi(Zt,gn),_t?(il(_t,gn,D),Ve[Se]=_t):delete Ve[Se]}Object.keys(Ve).length>0?ve.current[N]=Ve:delete ve.current[N];let bt=St?.hex??gt?.baseColor;fr(pe,(Se,_t)=>{let Zt=_i(Se);Sh(Se,gt,bt);let gn=Se.userData.reactImmersiveConfiguredEmissive;gn?.isColor?gn.copy(Se.emissive):Se.userData.reactImmersiveConfiguredEmissive=Se.emissive.clone();let ir=$e.current.get(N);ir?.emissive&&Se.emissive.add(wa),Zt!==_i(Se)&&(Se.needsUpdate=!0);let on=vl(ot,_t);if(on){let Ko=_i(on);on.color.copy(Se.color),on.map=Se.map,on.vertexColors=Se.vertexColors,on.alphaMap=Se.alphaMap,on.alphaTest=Se.alphaTest,on.transparent=Se.transparent,on.opacity=Se.opacity,on.side=Se.side,Ko!==_i(on)&&(on.needsUpdate=!0)}let en=vl(Xe,_t);if(en){let Ko=_i(en);ir?.matcap?en.color.set(bi.color):en.color.copy(Se.color),en.map=Se.map,en.vertexColors=Se.vertexColors,en.alphaMap=Se.alphaMap,en.alphaTest=Se.alphaTest,en.transparent=Se.transparent,en.opacity=Se.opacity,en.side=Se.side,Ko!==_i(en)&&(en.needsUpdate=!0)}})}for(let N of Object.keys(ve.current))if(!_.has(N)){for(let[z,J]of Object.entries(ve.current[N]))J&&hi(J,vi(z));delete ve.current[N]}D()},[t,Y,he,Mn,pn,Ln,r,Re,De,D]);let $t=Et(new Map);We(()=>{let _=$t.current,N=new Set([..._.keys(),...ze.keys()]),z=!1;for(let J of N){let H=_.get(J),ne=ze.get(J),pe=!!H?.emissive!=!!ne?.emissive,ot=!!H?.matcap!=!!ne?.matcap;if(!pe&&!ot)continue;z=!0;let Xe=he[J],St=Ln[J];Xe&&fr(Xe,(gt,Ve)=>{let bt=gt.userData.reactImmersiveConfiguredEmissive;pe&&bt?.isColor&&(gt.emissive.copy(bt),ne?.emissive&>.emissive.add(wa));let Se=vl(St,Ve);ot&&Se&&(ne?.matcap?Se.color.set(bi.color):Se.color.copy(gt.color))})}$t.current=ze,z&&D()},[ze,he,Ln,D]),Py({objectBindings:t,nodeMap:Y,invalidate:D});let ft=xt(()=>Object.entries(R).map(([_,N])=>({key:_,color:new YR(N.color),speed:N.speed})),[R]),It=Et(new Set);We(()=>{let _=new Set(ft.map(({key:N})=>N));for(let N of It.current){if(_.has(N)||!he[N])continue;let z=$e.current.get(N)?.emissive;fr(he[N],J=>{let H=J.userData.reactImmersiveConfiguredEmissive;H?.isColor&&(J.emissive.copy(H),z&&J.emissive.add(wa))})}It.current=_,D()},[ft,he,D]),rc(({clock:_})=>{if(ft.length===0)return;let N=_.getElapsedTime();for(let{key:z,color:J,speed:H}of ft){let ne=he[z];if(!ne)continue;let pe=(1-Math.cos(2*Math.PI*H*N))/2,ot=$e.current.get(z)?.emissive;fr(ne,Xe=>{let St=Xe.userData.reactImmersiveConfiguredEmissive;St?.isColor&&(Xe.emissive.copy(St).lerp(J,pe),ot&&Xe.emissive.add(wa))})}D()}),We(()=>{if(De==="uv-checker")return;let _=new Set(Object.values(ce)),N=!1;L.traverse(z=>{if(!ln(z)||_.has(z)||!re.has(z))return;let J=pt?.get(z)??re.get(z);z.material!==J&&(z.material=J,N=!0)}),N&&D()},[L,ce,re,pt,De,D]),We(()=>{if(De!=="uv-checker")return;let _=Zg(),N=[];return L.traverse(z=>{if(!ln(z)||z.userData[Oo])return;let J=z.material,H=Array.isArray(J)?J:[J],ne=!!z.geometry.getAttribute("uv"),pe=H.map((Xe,St)=>{let gt=new Mp({color:ne?"#ffffff":"#ff00ff",map:ne?_:null,side:Xe.side});return gt.name=`${z.name||"mesh"}-uv-checker-${St}`,gt.toneMapped=!1,gt}),ot=Array.isArray(J)?pe:pe[0];z.material=ot,N.push({node:z,original:J,diagnostic:ot})}),D(),()=>{for(let{node:z,original:J,diagnostic:H}of N){z.material=J;let ne=Array.isArray(H)?H:[H];for(let pe of ne)pe.dispose()}D()}},[L,De,D,ee]),We(()=>{if(!Ue)return;let _=[];for(let[N,z]of Object.entries(t)){let J=z.modelObjectId??N,H=Y[J];if(!ln(H))continue;let ne=new Mp({color:Lt,wireframe:!0,transparent:!0,opacity:Nt,depthTest:!1,depthWrite:!1,side:nA,toneMapped:!1}),pe=H.clone(!1);pe.name="",pe.position.set(0,0,0),pe.quaternion.identity(),pe.scale.set(1,1,1),pe.matrix.identity(),pe.matrixAutoUpdate=!0,pe.material=ne,pe.castShadow=!1,pe.receiveShadow=!1,pe.frustumCulled=!1,pe.renderOrder=1,pe.userData={isWireframeOverlay:!0},pe.raycast=()=>{},H.morphTargetInfluences&&(pe.morphTargetInfluences=H.morphTargetInfluences),H.add(pe),_.push({node:H,overlay:pe})}return D(),()=>{for(let{node:N,overlay:z}of _)N.remove(z),z.material.dispose()}},[Ue,Lt,Nt,Y,t,D]);let vt=xt(()=>{let _=Array.from(Q.current.values()).flat();return jb([...A.animations,..._])},[A.animations,te]);We(()=>{L.animations=vt.map(({clip:_})=>_)},[L,vt]);let mn=Et(p);mn.current=p;let _n=Et(h);_n.current=h;let fn=_x(_=>_.frameloop==="never"),Wt=Et(fn);Wt.current=fn;let zt=Et(null),yt=Et(null),Rt=Et(new Set),rn=Et(0),Vt=_=>{Rt.current.forEach(N=>N({..._,isRenderPaused:Wt.current}))};We(()=>{let _=Bb({root:L,clips:vt,getClipConfig:z=>_b(_n.current,z),onChange:()=>{Vt(_.getState()),yl(L),D()}});zt.current=_,yt.current={clips:vt.map(({sourceName:z})=>z),clipDetails:vt.map(({sourceName:z,duration:J})=>({sourceName:z,duration:J})),play:_.play,pause:_.pause,stop:_.stop,setSpeed:_.setSpeed,seek:_.seek,getState:()=>({..._.getState(),isRenderPaused:Wt.current}),subscribe:z=>(Rt.current.add(z),z({..._.getState(),isRenderPaused:Wt.current}),()=>{Rt.current.delete(z)})},Vt(_.getState());let N=_n.current?.animations.autoplayClip;return N&&_.play(N),()=>{_.dispose(),zt.current=null,yt.current=null,Vt(_.getState())}},[L,vt]),We(()=>{zt.current&&Vt(zt.current.getState())},[fn]);let Bn=!!p;We(()=>{Bn&&yt.current&&mn.current?.(yt.current)},[L,vt,Bn,o]),We(()=>{h?.animations&&zt.current?.applyClipConfigs()},[h?.animations]),rc((_,N)=>{let z=zt.current;if(z?.isRunning()){if(z.update(N),!w)for(let[J,H]of Ge.current)ac(J,H,ke);rn.current+=N,yl(L,{updateFallbacks:rn.current>=.066}),D(),rn.current>=.066&&(rn.current=0,Vt(z.getState()))}});let Yt=xt(()=>(h?.model.rotation??[0,0,0]).map(_=>_*Math.PI/180),[h?.model.rotation]);rc((_,N)=>{if(!$.current)return;let z=$.current.rotation;z.x=ic.lerp(z.x,Yt[0],1-Math.exp(-5*N)),z.y=ic.lerp(z.y,Yt[1],1-Math.exp(-5*N)),z.z=ic.lerp(z.z,Yt[2],1-Math.exp(-5*N)),Math.abs(z.x-Yt[0])<1e-4&&Math.abs(z.y-Yt[1])<1e-4&&Math.abs(z.z-Yt[2])<1e-4||D()});let Xo=Et([]),qo=Et(0),Un=Et(0),Ki=xt(()=>new No,[]);We(()=>{let _=new Map;for(let[Xe,St]of Object.entries(t)){let gt=Y[St.modelObjectId??Xe];gt&&_.set(gt,St)}for(let Xe of Xo.current)ac(Xe.node,_.get(Xe.node)?.transform,ke);Un.current=0,L.updateWorldMatrix(!0,!0);let N=new oc().setFromObject(L),z=N.getCenter(new No),J=N.getSize(new No).length()*.5;qo.current=Number.isFinite(J)?J:0;let H=[..._.keys()],ne=new Set(H),pe=[],ot=new No;for(let Xe of H){if(!Xe.parent)continue;let St=Xe.parent,gt=!1;for(;St;){if(ne.has(St)){gt=!0;break}St=St.parent}if(gt)continue;let Ve=new oc().setFromObject(Xe);if(Ve.isEmpty())continue;Ve.getCenter(ot);let bt=ot.clone().sub(z);bt.lengthSq()<1e-8||(bt.normalize(),pe.push({node:Xe,restLocalPos:Xe.position.clone(),restWorldPos:Xe.getWorldPosition(new No),worldDir:bt,parentInverse:new oA().copy(Xe.parent.matrixWorld).invert()}))}Xo.current=pe,D()},[L,Y,ie,He,ke,D]),We(()=>{D()},[k,D]),rc((_,N)=>{let z=Xo.current;if(z.length===0)return;let J=Math.min(Math.max(k,0),1),H=Un.current;if(Math.abs(H-J)<1e-4){if(H===J)return;Un.current=J}else Un.current=ic.lerp(H,J,1-Math.exp(-6*N)),D();let ne=Un.current*qo.current;for(let pe of z)Ki.copy(pe.worldDir).multiplyScalar(ne).add(pe.restWorldPos).applyMatrix4(pe.parentInverse),pe.node.position.copy(Ki),pe.node.matrixAutoUpdate||(pe.node.matrix.setPosition(pe.node.position),pe.node.matrixWorldNeedsUpdate=!0)});let rr=_=>{if(!hh(_))return null;let N=_;for(;N;){let z=Fr(N),J=z?Ye[z]:void 0;if(J&&t[J]){let H=t[J];return H.visible===!1?null:[J,H]}N=N.parent}return null},or=_=>{let N=rr(_);if(!N)return null;let[z,J]=N;return Y[J.modelObjectId??z]??null},oo=ih(_=>{let N=rr(_);return N&&N[1].selectable!==!1?N[1]:null},o?c:void 0,or),ps=_=>{if(oo.consumeClick())return;let N=rr(_.object);if(!N)return;let[,z]=N;z.selectable!==!1&&(_.stopPropagation(),i(z,bd(_,or(_.object))))},io=_=>{let N=rr(_.object);if(!N)return;let[,z]=N;if(z.selectable===!1)return;l?.(z,bd(_,or(_.object)))&&_.stopPropagation()},ms=_=>{if(!x)return;let N=rr(_.object);if(!N)return;let[z,J]=N;J.hoverable!==!1&&(_.stopPropagation(),U("pointer"),V(z),s?.(J))},jc=_=>{x&&(_.stopPropagation(),T(),V(null),s?.(null))},ao=xt(()=>!gl(L),[L,ee]);return We(()=>{let _=Pe&&(xe?.scene!==L||xe.key!==Pe),N=E?.some(z=>!W[z.url]||W[z.url].parent!==L);return cd(L,_?"Wait for the selected material variants to finish loading before preparing AR.":N?"Wait for all merged models to finish loading before preparing AR.":De!=="pbr"?"Switch the model renderer to PBR before preparing a USDZ snapshot, or provide arHandoff.createUSDZ.":void 0),()=>cd(L)},[L,xe,Pe,E,W,ee,De]),sA("group",{ref:$,children:[sc("primitive",{object:L,...o&&ao?{onClick:ps,onDoubleClick:io,...c?{onPointerDown:oo.onPointerDown}:{},...x?{onPointerOver:ms,onPointerOut:jc}:{}}:{}}),E?.map(_=>sc(Qn,{onLoadError:N=>O?.(_.url,N),children:sc(JR,{fallback:null,children:sc(aA,{url:_.url,namePrefix:_.namePrefix,decoderConfig:v,onReady:F})})},_.url))]})}function aA({url:e,namePrefix:t,decoderConfig:n,onReady:r}){let o=Ra(e,n),i=xt(()=>{let c=Bx.clone(o.scene);return Dg(c,t),hd(c),c},[o.scene,t]),s=xt(()=>o.animations.map(c=>Tg(c,t)),[o.animations,t]),l=Et(r);return l.current=r,We(()=>{l.current(e,i,s)},[e,i,s]),null}import{Suspense as lA,useEffect as cA,useRef as uA}from"react";import{jsx as lc}from"react/jsx-runtime";function dA({url:e,decoderConfig:t,onModelLoaded:n}){let{scene:r}=Ra(e,t),o=uA(n);return o.current=n,cA(()=>{o.current?.(r)},[r]),lc("primitive",{object:r})}function jx({url:e,decoderConfig:t,onLoadError:n,onModelLoaded:r}){return lc(Qn,{onLoadError:o=>n?.(e,o),children:lc(lA,{fallback:null,children:lc(dA,{url:e,decoderConfig:t,onModelLoaded:r})})})}import{Suspense as pA,useCallback as Nx,useMemo as mA,useRef as Ix}from"react";import{jsx as cc}from"react/jsx-runtime";var fA={};function zx({entry:e,isActive:t,decoderConfig:n,itemMaterials:r,sceneConfig:o,zoomOnSelected:i,highlightOnHover:s,explodeFactor:l,suspendBindingTransforms:c,onLoadProgress:u,onAnimationsReady:p,onModelAnimationsReady:m,onLoadError:a,onModelLoaded:f,selectedItem:d,panelHoveredItem:h,onItemClick:b,onItemDoubleClick:x,onItemContextMenu:v,onItemHover:S,nodeRefsOut:y,onNodeRefsChange:k,materialRefsOut:w,onMergeModelLoaded:M,onMergeModelError:E,pulses:P}){let O=Ix({}),R=Ix({}),A=Nx(()=>{},[]),D=mA(()=>t?null:Ma(e.objectBindings,e.sceneConfig?.product,mr((e.sceneConfig??o)?.model??{})),[t,e.objectBindings,e.sceneConfig,o]),B=e.sceneConfig?.product&&D?{...e.sceneConfig,model:{...e.sceneConfig.model,activeVariants:D.activeVariants}}:e.sceneConfig??o,V=Nx(U=>{t&&p?.(U),m?.(Ae(e),U)},[t,p,m,e.url,e.id]),$=!!p||!!m;return cc(Qn,{onLoadError:U=>a?.(Ae(e),U),children:cc(pA,{fallback:null,children:cc("group",{position:e.transform?.position,rotation:e.transform?.rotation,scale:e.transform?.scale,visible:e.visible!==!1,children:cc(Ja,{url:e.url,interactive:t&&e.visible!==!1,objectBindings:t?e.objectBindings:D?.objectBindings??e.objectBindings,selectedItem:t?d:null,itemMaterials:t?r:fA,onItemClick:t?b:A,onItemDoubleClick:t?x:void 0,onItemContextMenu:t?v:void 0,onItemHover:t?S:void 0,onModelLoaded:f?U=>f(Ae(e),U):void 0,onAnimationsReady:$?V:void 0,nodeRefsOut:t?y:O,onNodeRefsChange:t?k:void 0,materialRefsOut:w??R,panelHoveredItem:t?h:void 0,sceneConfig:t?o:B,zoomOnSelected:t&&i,highlightOnHover:t&&!!s,decoderConfig:n,onLoadProgress:t?u:void 0,explodeFactor:l,suspendBindingTransforms:t?c:!1,originalNodePoses:e.originalNodePoses,mergeModels:e.mergeModels,onMergeModelLoaded:M,onMergeModelError:E,pulses:t?P:void 0})})})},e.url)}import{Matrix4 as Pp}from"three";var gA=new Pp().makeRotationX(Math.PI/2);function Vx(e){e.updateMatrixWorld(!0);let t=new Pp().copy(e.matrixWorld).invert().premultiply(gA),n=new Pp,r=[];for(let[o,i]of Object.entries(Vr(e).nodesById)){let s=i;if(!s.isMesh||!s.geometry||!i.name)continue;let l=s.geometry;l.boundingBox||l.computeBoundingBox();let c=l.boundingBox.clone().applyMatrix4(n.multiplyMatrices(t,i.matrixWorld)),u=l.index?l.index.count:l.getAttribute("position")?.count??0;r.push({name:o,triangles:Math.floor(u/3),minimum:c.min.toArray(),maximum:c.max.toArray()})}return r.sort((o,i)=>o.name.localeCompare(i.name))}import{useMemo as Yr,useRef as Gn,useState as Io,useEffect as Cr,useCallback as Bi}from"react";import{Html as Fx}from"@react-three/drei";import{useFrame as Hx,useThree as Rp}from"@react-three/fiber";import{MathUtils as kp,Vector3 as ji}from"three";import{jsx as cn,jsxs as Ap}from"react/jsx-runtime";var bA=[],hA=.02;function Gx(e,t,n=!1,r){let o=Gn(null),[i,s]=Io(!0),l=Gn(!0),c=Yr(()=>new ji,[]),u=Rp(b=>b.scene),p=Gn(null),m=Gn(null),a=Yr(()=>new ji(...e.anchorLocalPosition??e.localPosition??e.worldPosition),[e.anchorLocalPosition,e.localPosition,e.worldPosition]),f=Yr(()=>new ji,[]),d=Yr(()=>new ji,[]),h=Yr(()=>new ji,[]);return Cr(()=>{p.current=null},[e.anchorNodeName]),Hx(({camera:b})=>{let x=o.current,v=x?.parent;if(!x||!v)return;let S=r?r.current:u;m.current!==S&&(m.current=S,p.current=null);let y=p.current;if(e.anchorNodeName&&(!y||!y.parent)&&(y=S?Hr(S,e.anchorNodeName):null,p.current=y),y?(y.updateWorldMatrix(!0,!1),f.copy(a).applyMatrix4(y.matrixWorld)):(f.copy(a),v.localToWorld(f)),t){let w=t.current.get(e.id);w||(w=new ji,t.current.set(e.id,w)),w.copy(f)}b.getWorldPosition(c);let k=!n||zg(e,c.distanceTo(f));k!==l.current&&(l.current=k,s(k)),h.copy(c).sub(f),h.lengthSq()>0?(h.normalize(),d.copy(f).addScaledVector(h,hA)):d.copy(f),v.worldToLocal(d),x.position.copy(d)}),{anchorRef:o,inRange:i}}function vA({anchorSceneRef:e,annotation:t,occluders:n,worldPositionsRef:r,onClick:o,onHover:i,showAnnotationOnHover:s}){let l=oe(),[c,u]=Io(!1),{anchorRef:p,inRange:m}=Gx(t,r,!0,e),a=c||!m,[f,d]=Io(!1),[h,b]=Io(1),x=Gn(null),v=Gn(null),S=Gn(null);Cr(()=>{m||(x.current&&clearTimeout(x.current),f&&(d(!1),i?.(null)))},[m,f,i]),Cr(()=>()=>{x.current&&(clearTimeout(x.current),x.current=null),S.current&&(clearTimeout(S.current),S.current=null)},[]);let y=P=>{P.stopPropagation(),P.preventDefault(),x.current&&(clearTimeout(x.current),x.current=null),x.current=window.setTimeout(()=>{o?.(t),x.current=null},10)},k=P=>{P.stopPropagation(),d(!0),b(100),S.current&&(clearTimeout(S.current),S.current=null),i?.(t)},w=P=>{P.stopPropagation(),d(!1),b(1),S.current&&clearTimeout(S.current),S.current=window.setTimeout(()=>{i?.(null),s&&i?.(null),S.current=null},50)},M=P=>{P.stopPropagation();let O=P.currentTarget;O.dataset.pointerX=String(P.clientX),O.dataset.pointerY=String(P.clientY)},E=P=>{P.stopPropagation();let O=P.currentTarget,R=parseFloat(O.dataset.pointerX||"0"),A=parseFloat(O.dataset.pointerY||"0"),D=P.clientX-R,B=P.clientY-A;Math.sqrt(D*D+B*B)<10&&y(P)};return cn("group",{ref:p,children:cn(Fx,{center:!0,occlude:n,onOcclude:u,pointerEvents:a?"none":"auto",zIndexRange:[1,200],style:{pointerEvents:a?"none":"auto",zIndex:h},className:"annotation-html-wrapper",transparent:!0,children:cn("div",{ref:v,className:`ri-annotationMarker ${f?"ri-annotationMarker--hovered":""}`,title:t.title,style:{display:a?"none":"flex"},onPointerDown:M,onPointerUp:E,onPointerEnter:k,onPointerLeave:w,onDoubleClick:P=>{P.stopPropagation(),o?.(t)},role:"button",tabIndex:0,"aria-label":l("annotationMarker",{id:t.id,title:t.title}),onKeyDown:P=>{(P.key==="Enter"||P.key===" ")&&(P.preventDefault(),P.stopPropagation(),o?.(t))},children:cn("span",{className:"ri-annotationMarker-id",children:t.id})})})})}function yA({anchorSceneRef:e,annotation:t,occluders:n,popupRef:r,onClose:o,hideCloseButton:i=!1}){let s=oe(),[l,c]=Io(!1),{anchorRef:u}=Gx(t,void 0,!1,e),p=Ap("div",{ref:r,className:"ri-viewAnnotationPopup",style:{display:l?"none":"block"},onPointerDown:m=>m.stopPropagation(),onClick:m=>m.stopPropagation(),children:[Ap("div",{className:"ri-viewAnnotationHeader",children:[cn("h4",{className:"ri-viewAnnotationTitle",children:t.title}),!i&&cn("button",{onClick:m=>{m.stopPropagation(),o?.()},className:"ri-viewAnnotationClose","aria-label":s("closeAnnotation"),children:"\xD7"})]}),t.category&&cn("span",{className:"ri-annotationCategory",children:t.category}),t.description&&cn("p",{className:"ri-viewAnnotationDescription",children:t.description}),t.images?.map((m,a)=>{let f=nd(m.src);return f?cn("img",{className:"ri-annotationImage",src:f,alt:m.alt??"",loading:"lazy"},`${f}-${a}`):null}),t.links?.map((m,a)=>{let f=nd(m.href);return f?cn("a",{className:"ri-annotationLink",href:f,target:"_blank",rel:"noopener noreferrer",children:m.label||s("learnMore")},`${f}-${a}`):null})]});return cn("group",{ref:u,children:cn(Fx,{occlude:n,onOcclude:c,pointerEvents:l?"none":"auto",zIndexRange:[1e3,2e3],style:{pointerEvents:l?"none":"auto",zIndex:1e3},transparent:!0,children:p})})}function uc({anchorSceneRef:e,annotations:t,sceneConfig:n,activeAnnotation:r,popupRef:o,canvasRootRef:i,worldPositionsRef:s,modelLoaded:l,onAnnotationClick:c,onAnnotationHover:u,onCloseAnnotation:p,hideCloseButton:m=!1,showAnnotationOnHover:a=!1,guidedTour:f=!1}){let d=Rp(T=>T.invalidate),h=Rp(T=>T.scene),[b,x]=Io(null),[v,S]=Io(!1),y=Gn(null);Cr(()=>{y.current!==null&&r===null&&(x(null),S(!1)),y.current=r?.id??null},[r]);let k=Gn(null),w=Gn(null),M=Gn(null),E=Yr(()=>{let T=[];return h.traverse(L=>{let W=L;W.isMesh&&!W.isSkinnedMesh&&T.push({current:L})}),T},[h,t,l]),P=Bi(()=>{d();let T=()=>{d(),w.current=window.requestAnimationFrame(()=>{d(),w.current=null})};w.current=window.requestAnimationFrame(T)},[d]);Cr(()=>{P()},[t,P]),Cr(()=>{P()},[r,P]),Cr(()=>()=>{w.current!==null&&window.cancelAnimationFrame(w.current),M.current&&clearTimeout(M.current)},[]);let O=r||b,R=Yr(()=>O?t.find(T=>T.id===O.id)??null:null,[O,t]),A=Bi(T=>{if(v&&b?.id===T.id){S(!1),x(null),p?.();return}S(!0),x(T),c?.(T)},[v,b,c,p]),D=Bi(T=>{u?.(T),a&&!v&&(M.current&&(clearTimeout(M.current),M.current=null),T?x(T):M.current=window.setTimeout(()=>{x(null),p?.(),M.current=null},100))},[v,u,a,p]),B=Bi(()=>{S(!1),x(null),p?.()},[p]),V=Bi(T=>{let L=T.target;if(L.closest?.(".ri-annotationMarker")||L.closest?.(".ri-viewAnnotationPopup")||L.closest?.(".annotation-html-wrapper"))return;let W=i.current;W&&W.contains(L)&&(S(!1),x(null),p?.())},[i,p]),$=Bi(T=>{T.key==="Escape"&&v&&(S(!1),x(null),p?.())},[v,p]);Cr(()=>{let T=i.current;return T&&(T.addEventListener("click",V),T.addEventListener("pointerdown",V)),document.addEventListener("keydown",$),()=>{T&&(T.removeEventListener("click",V),T.removeEventListener("pointerdown",V)),document.removeEventListener("keydown",$)}},[i,V,$]);let U=Yr(()=>(n?.model.rotation??[0,0,0]).map(T=>T*Math.PI/180),[n?.model.rotation]);return Cr(()=>{d()},[d,U]),Hx((T,L)=>{if(!k.current)return;k.current.rotation.x=kp.lerp(k.current.rotation.x,U[0],1-Math.exp(-5*L)),k.current.rotation.y=kp.lerp(k.current.rotation.y,U[1],1-Math.exp(-5*L)),k.current.rotation.z=kp.lerp(k.current.rotation.z,U[2],1-Math.exp(-5*L));let{rotation:W}=k.current;Math.abs(W.x-U[0])+Math.abs(W.y-U[1])+Math.abs(W.z-U[2])>1e-4&&d()}),Ap("group",{ref:k,children:[t.map(T=>{let L=`${T.worldPosition.join(",")}-${T.title}-${T.id}`;return cn(vA,{anchorSceneRef:e,annotation:T,occluders:E,worldPositionsRef:s,onClick:A,onHover:D,showAnnotationOnHover:a},L)}),R?cn(yA,{anchorSceneRef:e,annotation:R,occluders:f?bA:E,popupRef:o,onClose:B,hideCloseButton:m},`popup-${R.id}`):null]})}import{useEffect as Xx,useMemo as Za}from"react";import{Html as Ep}from"@react-three/drei";import{useEffect as xA,useMemo as wA}from"react";import{Line as SA}from"@react-three/drei";import{useThree as CA}from"@react-three/fiber";import{BufferGeometry as MA,Line as PA,LineBasicMaterial as kA,LineDashedMaterial as RA,Vector3 as Ux}from"three";import{jsx as Op}from"react/jsx-runtime";function Zr(e){return CA(n=>Ur(n.gl))?Op(AA,{...e}):Op(SA,{points:e.points,color:e.color,lineWidth:e.lineWidth,dashed:e.dashed})}function AA({points:e,color:t,dashed:n=!1}){let r=wA(()=>{let o=new MA().setFromPoints(e.map(l=>l instanceof Ux?l:new Ux(...l))),i=n?new RA({color:t,dashSize:.02,gapSize:.02}):new kA({color:t}),s=new PA(o,i);return n&&s.computeLineDistances(),s},[e,t,n]);return xA(()=>()=>{r.geometry.dispose(),r.material.dispose()},[r]),Op("primitive",{object:r})}import{BoxGeometry as OA,BufferGeometry as EA,DoubleSide as DA,EdgesGeometry as TA,Float32BufferAttribute as LA,Vector3 as Mr}from"three";import{Fragment as Ya,jsx as lt,jsxs as xn}from"react/jsx-runtime";var eo="#22d3ee",_A="#facc15";function zo(e,t){let n=e<10?e.toFixed(3):e.toFixed(2);return t?`${n} ${t}`:n}function $x(e,t){return[(e[0]+t[0])/2,(e[1]+t[1])/2,(e[2]+t[2])/2]}function BA(e){let t=e.reduce((n,r)=>[n[0]+r[0],n[1]+r[1],n[2]+r[2]],[0,0,0]);return[t[0]/e.length,t[1]/e.length,t[2]/e.length]}function Pr({position:e,children:t}){return lt(Ep,{center:!0,position:e,zIndexRange:[20,0],style:{pointerEvents:"none"},children:lt("div",{className:"ri-measureLabel",children:t})})}function Wx({positions:e,triangles:t}){let n=Za(()=>{let r=new Mr(...e[0]),o=new EA;return o.setAttribute("position",new LA(e.flatMap(i=>new Mr(...i).sub(r).toArray()),3)),o.setIndex(t.flat()),o},[e,t]);return Xx(()=>()=>n.dispose(),[n]),lt("mesh",{position:e[0],geometry:n,raycast:()=>{},renderOrder:100,children:lt("meshBasicMaterial",{color:eo,side:DA,transparent:!0,opacity:.18,depthWrite:!1})})}var jA=[[0,1,2]];function NA({positions:e}){let t=sl(e);if(t===null)return null;let n=new Mr(...e[1]),r=new Mr(...e[0]).sub(n),o=new Mr(...e[2]).sub(n),i=Math.min(r.length(),o.length())*.22;r.normalize(),o.normalize();let s=r.clone().cross(o);s.lengthSq()<1e-12&&s.copy(r).cross(Math.abs(r.y)<.9?new Mr(0,1,0):new Mr(1,0,0)),s.normalize();let l=t*Math.PI/180,c=Array.from({length:33},(p,m)=>r.clone().applyAxisAngle(s,l*m/32).multiplyScalar(i).add(n).toArray()),u=r.clone().applyAxisAngle(s,l/2).multiplyScalar(i*1.4).add(n).toArray();return xn(Ya,{children:[lt(Zr,{points:c,color:eo,lineWidth:2}),xn(Pr,{position:u,children:[t.toFixed(2),"\xB0"]})]})}function IA({box:e,unit:t,scale:n}){let r=Za(()=>[(e.min[0]+e.max[0])/2,(e.min[1]+e.max[1])/2,(e.min[2]+e.max[2])/2],[e.min,e.max]),o=Za(()=>{let[c,u,p]=e.size,m=new OA(c||1e-4,u||1e-4,p||1e-4),a=new TA(m);return m.dispose(),a},[e.size]);Xx(()=>()=>{o.dispose()},[o]);let[i,s,l]=e.size;return xn("group",{position:r,children:[lt("lineSegments",{geometry:o,children:lt("lineBasicMaterial",{color:_A})}),xn(Pr,{position:[0,-s/2,l/2],children:["W ",zo(i*n,t)]}),xn(Pr,{position:[-i/2,0,l/2],children:["H ",zo(s*n,t)]}),xn(Pr,{position:[i/2,-s/2,0],children:["D ",zo(l*n,t)]})]})}function Ni({points:e,unit:t,scale:n=1,box:r,showDimensions:o,tool:i="distance",areaClosed:s=!1,snapPreview:l}){let c=Za(()=>e.map(m=>m.position),[e]),u=Za(()=>i==="area"&&s?ll(c):null,[i,s,c]),p=i==="pointToPlane"&&e.length===2?nb(e[0],e[1].position):null;return xn("group",{children:[i!=="wrap"&&i!=="wrapHorizontal"&&e.map(m=>lt(Ep,{center:!0,position:m.position,zIndexRange:[15,0],style:{pointerEvents:"none"},children:lt("div",{className:`ri-measureDot${m.snapped?" ri-measureDot--snapped":""}`})},m.id)),i==="distance"&&e.slice(1).map((m,a)=>{let f=e[a].position,d=m.position,h=new Mr(...f).distanceTo(new Mr(...d));return xn("group",{children:[lt(Zr,{points:[f,d],color:eo,lineWidth:2}),lt(Pr,{position:$x(f,d),children:zo(h*n,t)})]},`${e[a].id}-${m.id}`)}),(i==="angle"||i==="area")&&c.length>=2&<(Zr,{points:s?[...c,c[0]]:c,color:eo,lineWidth:2}),i==="angle"&<(NA,{positions:c}),u&&!("error"in u)&&xn(Ya,{children:[lt(Wx,{positions:c,triangles:u.triangles}),lt(Pr,{position:u.center,children:zo(u.area*n**2,t?`${t}\xB2`:"")})]}),i==="pointToPlane"&&e[0]?.faceVertices&&xn(Ya,{children:[lt(Wx,{positions:e[0].faceVertices,triangles:jA}),lt(Zr,{points:[...e[0].faceVertices,e[0].faceVertices[0]],color:eo,lineWidth:1}),e.length===1&<(Pr,{position:e[0].position,children:"Reference plane"})]}),p&&xn(Ya,{children:[lt(Zr,{points:[e[1].position,p.projection],color:eo,lineWidth:2}),lt(Zr,{points:[e[0].position,p.projection],color:eo,lineWidth:1,dashed:!0}),lt(Pr,{position:$x(e[1].position,p.projection),children:zo(p.distance*n,t)})]}),(i==="wrap"||i==="wrapHorizontal")&&c.length>=3&&xn(Ya,{children:[lt(Zr,{points:[...c,c[0]],color:eo,lineWidth:2}),lt(Pr,{position:BA(c),children:zo(rb(c,!0)*n,t)})]}),l&&xn(Ep,{center:!0,position:l.position,zIndexRange:[20,0],style:{pointerEvents:"none"},children:[lt("div",{className:"ri-measureSnapTarget"}),lt("div",{className:"ri-measureSnapLabel",children:l.snapped==="vertex"?"Vertex":"Edge"})]}),o&&r?lt(IA,{box:r,unit:t,scale:n}):null]})}import{Eraser as qx,PencilRuler as Kx,RulerDimensionLine as zA,Undo2 as Qx,X as VA}from"lucide-react";import{useEffect as FA,useLayoutEffect as HA,useRef as Jx,useState as dc}from"react";import{createPortal as GA}from"react-dom";import{Fragment as es,jsx as me,jsxs as et}from"react/jsx-runtime";function Dp(e){let t=oe(),{isInsideEditor:n,measurementPanelTarget:r,tier:o}=Wr(),i=n&&!xl(o,"calibratedMeasurements"),s=Jx(null),[l,c]=dc(!1),[u,p]=dc(""),[m,a]=dc("1"),[f,d]=dc("m"),h=Jx(null),b={ready:"measurementReady",approximate:"measurementApproximate","model-changed":"measurementModelChanged","missing-object":"measurementObjectMissing","geometry-changed":"measurementGeometryChanged","pose-changed":"measurementPoseChanged","hidden-object":"measurementObjectHidden",invalid:"measurementInvalid"};HA(()=>{if(!s.current)return;let A=()=>e.onHeight(s.current?.getBoundingClientRect().height??34),D=new ResizeObserver(A);return D.observe(s.current),A(),()=>D.disconnect()},[e.onHeight]);let x=n&&e.active&&!r,{onToggle:v}=e;FA(()=>{x&&v()},[x,v]);let{tool:S,pointCount:y,areaClosed:k}=e,w=S==="angle"?[t("angleFirstArmHint"),t("angleVertexHint"),t("angleSecondArmHint"),t("angleNewHint")][y]:S==="area"?t(k?"areaNewHint":"areaCornersHint"):S==="pointToPlane"?[t("pointToPlaneFaceHint"),t("pointToPlanePointHint"),t("pointToPlaneNewHint")][y]:t(S==="wrap"?"wrapHint":S==="wrapHorizontal"?"wrapHorizontalHint":"distanceHint"),M=n?"ri-measureField":"ri-measureSelect",E=et(Ct,{className:M,"aria-label":t("measurementTool"),value:S,disabled:e.disabled,onChange:A=>e.onTool(A.target.value),children:[me("option",{value:"distance",children:t("distance")}),me("option",{value:"angle",children:t("angle")}),me("option",{value:"area",children:t("area")}),me("option",{value:"pointToPlane",children:t("pointToPlane")}),me("option",{value:"wrap",children:t("wrap")}),me("option",{value:"wrapHorizontal",children:t("wrapHorizontal")})]}),P=et(Ct,{className:M,"aria-label":t("measurementSnapping"),value:e.snap,disabled:e.disabled,onChange:A=>e.onSnap(A.target.value),children:[me("option",{value:"none",children:t("noSnapping")}),me("option",{value:"auto",children:t("snapAuto")}),me("option",{value:"vertex",children:t("snapVertex")}),me("option",{value:"edge",children:t("snapEdge")})]}),O=e.active&&S==="area"&&!k&&me("button",{type:"button",className:n?"ri-measureAction":"ri-measureFinish",onClick:e.onFinishArea,disabled:e.disabled||y<3,children:t("finishArea")}),R=et("div",{className:`ri-measureLibrary${n?" ri-measureLibrary--sidebar":""}`,onClick:A=>A.stopPropagation(),onPointerDown:A=>A.stopPropagation(),onPointerMove:A=>A.stopPropagation(),onKeyDown:A=>A.stopPropagation(),children:[n&&me("div",{className:"ri-measureActions",children:et("button",{type:"button",className:`ri-measureAction ri-measureStart${e.active?" ri-measureStart--active":""}`,disabled:e.disabled,onClick:e.onToggle,"aria-pressed":e.active,children:[me(Kx,{size:13}),e.active?t("stopMeasuring"):t("startMeasuring")]})}),n&&e.active&&et(es,{children:[et("div",{className:"ri-measureRow",children:[me("span",{children:"Tool"}),E]}),et("div",{className:"ri-measureRow",children:[me("span",{children:"Snapping"}),P]}),!e.error&&me("p",{className:"ri-measureGuide",role:"status",children:w}),(y>0||O)&&et("div",{className:"ri-measureActions",children:[y>0&&et(es,{children:[et("button",{type:"button",className:"ri-measureAction",onClick:e.onUndo,disabled:e.disabled,children:[me(Qx,{size:13}),"Undo point"]}),et("button",{type:"button",className:"ri-measureAction",onClick:e.onClear,disabled:e.disabled,children:[me(qx,{size:13}),"Clear"]})]}),O]})]}),n&&et("label",{className:"ri-measureRow",children:[me("span",{children:"Bounding box"}),me("input",{type:"checkbox","aria-label":t("toggleBoundingDimensions"),checked:e.showDimensions,disabled:e.disabled,onChange:e.onDimensions})]}),et("label",{className:"ri-measureRow",children:[me("span",{children:t("measurementSourceUnit")}),me(Ct,{"aria-label":t("measurementSourceUnit"),className:"ri-measureField",disabled:e.disabled||e.settingsReadOnly,value:e.settings.sourceUnit??"m",onChange:A=>e.onSettings({...e.settings,sourceUnit:A.target.value,metersPerUnit:void 0}),children:cl.map(A=>me("option",{value:A,children:A},A))})]}),et("label",{className:"ri-measureRow",children:[me("span",{children:t("measurementDisplayUnit")}),et(Ct,{"aria-label":t("measurementDisplayUnit"),className:"ri-measureField",disabled:e.disabled||e.settingsReadOnly,value:e.displayUnit,onChange:A=>e.onSettings({...e.settings,displayUnit:A.target.value}),children:[!lb(e.displayUnit)&&me("option",{value:e.displayUnit,children:e.displayUnit}),cl.map(A=>me("option",{value:A,children:A},A))]})]}),e.active&&et(es,{children:[et("div",{className:"ri-measureRow",children:[me("span",{children:t("measurementName")}),et("span",{className:"ri-measureCombo",children:[me("input",{"aria-label":t("measurementName"),className:"ri-measureField",value:u,onChange:A=>p(A.target.value),placeholder:t("measurementNamePlaceholder")}),me("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||e.readOnly||!e.canSave||i,title:i?"Saving measurements requires the Starter plan or higher.":void 0,onClick:()=>{e.onSave(u),p(""),c(!0)},children:t("saveMeasurement")})]})]}),et("div",{className:"ri-measureRow",title:t("measurementCalibrationHint"),children:[me("span",{children:t("knownMeasurementDistance")}),et("span",{className:"ri-measureCombo",children:[me("input",{"aria-label":t("knownMeasurementDistance"),type:"number",min:"0",step:"any",className:"ri-measureField",value:m,onChange:A=>a(A.target.value)}),me(Ct,{"aria-label":t("calibrationUnit"),className:"ri-measureField ri-measureField--unit",value:f,onChange:A=>d(A.target.value),children:cl.map(A=>me("option",{children:A},A))}),me("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||e.settingsReadOnly||!e.canCalibrate||i,title:i?"Calibration requires the Starter plan or higher.":void 0,onClick:()=>e.onCalibrate(Number(m),f),children:t("calibrateMeasurement")})]})]})]}),e.settings.metersPerUnit!==void 0&&et("div",{className:"ri-measureRow",children:[me("span",{children:t("measurementCalibratedScale",{scale:e.settings.metersPerUnit.toPrecision(6)})}),me("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||e.settingsReadOnly,onClick:()=>e.onSettings({...e.settings,metersPerUnit:void 0}),children:t("resetMeasurementCalibration")})]}),e.items.length>0&&me("div",{className:"ri-savedMeasurementList",children:e.items.map(A=>{let D=e.results.find(B=>B.id===A.id);return et("div",{className:"ri-savedMeasurementRow",children:[me("input",{type:"checkbox","aria-label":t("showSavedMeasurement",{name:A.name}),checked:A.visible!==!1,disabled:e.disabled||e.readOnly,onChange:B=>e.onItems(e.items.map(V=>V.id===A.id?{...V,visible:B.target.checked}:V))}),me("input",{"aria-label":t("renameSavedMeasurement",{name:A.name}),className:"ri-savedMeasurementName",defaultValue:A.name,disabled:e.disabled||e.readOnly,onBlur:B=>{let V=B.target.value.trim()||A.name;V!==A.name?e.onItems(e.items.map($=>$.id===A.id?{...$,name:V}:$)):B.target.value=V}},`${A.id}:${A.name}`),me("span",{className:"ri-savedMeasurementValue",title:t(D?b[D.status]:"measurementWaiting"),children:D?.value!=null?`${D.value.toFixed(3)} ${D.unit}`:"\u2014"}),me("button",{type:"button",className:"ri-savedMeasurementDelete","aria-label":t("deleteSavedMeasurement",{name:A.name}),disabled:e.disabled||e.readOnly,onClick:()=>e.onItems(e.items.filter(B=>B.id!==A.id)),children:me(VA,{size:13})})]},A.id)})}),!e.items.length&&me("p",{className:"ri-measureEmpty",children:t("noSavedMeasurements")}),et("details",{className:"ri-measureTransfer",children:[me("summary",{children:t("measurementFiles")}),et("div",{className:"ri-measureActions",children:[me("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||!e.items.length,onClick:e.onExportJson,children:t("exportMeasurementJson")}),me("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||!e.items.length,onClick:e.onExportCsv,children:t("exportMeasurementCsv")}),me("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||e.readOnly||e.settingsReadOnly,onClick:()=>h.current?.click(),children:t("importMeasurementJson")}),me("input",{ref:h,type:"file",accept:".json,application/json",hidden:!0,onChange:A=>{let D=A.target.files?.[0];if(A.target.value="",!!D){if(D.size>5*1024*1024){e.onImport("{}");return}D.text().then(e.onImport).catch(()=>e.onImport("{}"))}}})]})]}),n&&e.error&&me("p",{className:"ri-measureLibraryError",role:"status",children:t.message(e.error)})]});return n?r?GA(R,r):null:et("div",{ref:s,className:"ri-measureTools",style:{top:e.top},children:[et("div",{className:"ri-measureToolbarRow",children:[me("button",{type:"button",className:`ri-measureButton ${e.active?"ri-measureButton--active":""}`,disabled:e.disabled,onClick:e.onToggle,title:e.active?t("stopMeasuring"):t("startMeasuring"),"aria-pressed":e.active,children:me(Kx,{size:16})}),me("button",{type:"button",className:`ri-measureButton ${e.showDimensions?"ri-measureButton--active":""}`,disabled:e.disabled,onClick:e.onDimensions,title:t("toggleBoundingDimensions"),"aria-pressed":e.showDimensions,children:me(zA,{size:16})}),e.items.length>0&&me("button",{type:"button",className:"ri-measureSelect","aria-expanded":l,onClick:()=>c(!l),children:t("savedMeasurements",{count:e.items.length})}),e.active&&et(es,{children:[E,P]}),y>0&&et(es,{children:[me("button",{type:"button",className:"ri-measureButton",onClick:e.onUndo,disabled:e.disabled,title:t("undoMeasurementPoint"),children:me(Qx,{size:16})}),me("button",{type:"button",className:"ri-measureButton",onClick:e.onClear,disabled:e.disabled,title:t("clearMeasurements"),children:me(qx,{size:16})})]}),O]}),(e.active||l&&e.items.length>0)&&R,(e.active||e.error)&&me("div",{className:`ri-measureHint${e.error?" ri-measureHint--error":""}`,role:"status",children:e.error?t.message(e.error):w})]})}import{useCallback as UA,useEffect as Yx,useRef as pc,useState as $A}from"react";import{useFrame as WA}from"@react-three/fiber";import{Fragment as qA,jsx as Zx}from"react/jsx-runtime";var XA=100;function mc({items:e,sceneRef:t,modelId:n,tilesetUrl:r,settings:o,legacyUnit:i,revision:s,onResults:l}){let[c,u]=$A([]),p=pc(""),m=UA(()=>{let x=e.length&&t.current?Ha(t.current):void 0,v=e.map(k=>$l(k,t.current,n,r,x)),S=v.map(({measurement:k,points:w,status:M})=>dl(k,o,i,w,M)),y=JSON.stringify([v.map(({measurement:k,points:w,status:M})=>[k.id,k.tool,k.visible,M,w.map(E=>[E.position,E.normal,E.faceVertices])]),S]);p.current!==y&&(p.current=y,u(v),l(S))},[e,t,n,r,o,i,l]);Yx(()=>{m()},[m,s]);let a=pc(0),f=pc(null),d=pc(m);d.current=m,Yx(()=>()=>{f.current&&clearTimeout(f.current)},[]),WA(()=>{if(!e.length)return;let x=a.current+XA-performance.now();x<=0?(a.current=performance.now(),m()):f.current??(f.current=setTimeout(()=>{f.current=null,a.current=performance.now(),d.current()},x))});let{factor:h,displayUnit:b}=ul(o,i);return Zx(qA,{children:c.filter(({measurement:x,status:v})=>x.visible!==!1&&(v==="ready"||v==="approximate")).map(({measurement:x,points:v})=>Zx(Ni,{points:v,unit:b,scale:h,box:null,showDimensions:!1,tool:x.tool,areaClosed:x.tool==="area"},x.id))})}import{useRef as Vo,useState as KA,useCallback as Yn,useEffect as QA}from"react";import{jsx as wn,jsxs as Tp}from"react/jsx-runtime";var JA={up:{width:38,height:22},down:{width:38,height:22},left:{width:22,height:38},right:{width:22,height:38}},YA={up:"4 16 12 8 20 16",down:"4 8 12 16 20 8",left:"16 4 8 12 16 20",right:"8 4 16 12 8 20"},fc=({direction:e})=>{let t=JA[e],n=YA[e];return Tp("svg",{"aria-hidden":"true",className:"mc__arrow-icon",focusable:"false",viewBox:"0 0 24 24",width:t.width,height:t.height,fill:"none",xmlns:"http://www.w3.org/2000/svg",style:{display:"block",width:`${t.width}px`,height:`${t.height}px`,pointerEvents:"none",padding:0,margin:0,overflow:"visible"},children:[wn("polyline",{points:n,stroke:"rgba(0, 0, 0, 0.9)",strokeWidth:"6",strokeLinecap:"round",strokeLinejoin:"round"}),wn("polyline",{points:n,stroke:"#2095F2",strokeWidth:"4",strokeLinecap:"round",strokeLinejoin:"round"})]})},kr=16,ZA={"bottom-left":{bottom:kr,left:kr,top:"auto",right:"auto",transform:"none"},"bottom-right":{bottom:kr,right:kr,top:"auto",left:"auto",transform:"none"},"top-left":{top:kr,left:kr,bottom:"auto",right:"auto",transform:"none"},"top-right":{top:kr,right:kr,bottom:"auto",left:"auto",transform:"none"},center:{top:"50%",left:"50%",bottom:"auto",right:"auto",transform:"translate(-50%, -50%)"},"center-bottom":{bottom:-10,left:"50%",top:"auto",right:"auto",transform:"translateX(-50%)"},"center-top":{top:kr,left:"50%",bottom:"auto",right:"auto",transform:"translateX(-50%)"}},eO=({controlsRef:e,enabled:t=!0,opacity:n=.9,moveSensitivity:r=.001,rotateSensitivity:o=.01,position:i="center-bottom"})=>{let s=oe(),l=Vo(null),[c,u]=KA({x:0,y:0}),p=Vo(!1),m=Vo({x:0,y:0}),a=Vo(void 0),f=Vo(void 0),d=Vo(null),h=Vo(0),b=()=>e.current,x=(B,V,$)=>{let U=Math.hypot(B,V);if(U>$){let T=$/U;return{x:B*T,y:V*T}}return{x:B,y:V}},v=B=>{let $=Math.abs(B);return $<.12?0:Math.sign(B)*(($-.12)/(1-.12))},S=Yn(()=>{let B=()=>{let{x:V,y:$}=m.current,U=v(V),T=v($);if(t&&(U!==0||T!==0)){let L=b();L&&L.rotate(-U*o,-T*o,!0)}a.current=requestAnimationFrame(B)};a.current=requestAnimationFrame(B)},[t,o]),y=Yn(()=>{a.current&&cancelAnimationFrame(a.current)},[]),k=Yn((B,V)=>{if(!l.current||!p.current)return;let $=l.current.getBoundingClientRect(),U=$.left+$.width/2,T=$.top+$.height/2,L=$.width/2-18,W=B-U,ee=V-T,Z=x(W,ee,L);u(Z),m.current={x:Z.x/L,y:Z.y/L}},[]),w=Yn(B=>{if(!t)return;B.preventDefault(),B.stopPropagation(),p.current=!0,S();let V="touches"in B?B.touches[0]:B;k(V.clientX,V.clientY)},[t,S,k]),M=Yn(B=>{if(!p.current)return;B.preventDefault();let V="touches"in B?B.touches[0]:B;k(V.clientX,V.clientY)},[k]),E=Yn(()=>{p.current=!1,u({x:0,y:0}),m.current={x:0,y:0},y()},[y]),P=r*10,O=Yn(B=>{t&&b()?.forward(B*P,!0)},[t,P]),R=Yn(B=>{t&&b()?.truck(B*P,0,!0)},[t,P]),A=Yn((B,V,$)=>{if(!t)return;f.current&&cancelAnimationFrame(f.current),d.current={control:B,amount:V,action:$},h.current=0,$(V);let U=T=>{if(!d.current)return;if(h.current===0){h.current=T,f.current=requestAnimationFrame(U);return}if(T-h.current>200){let{amount:W,action:ee}=d.current;ee(W),h.current=T}f.current=requestAnimationFrame(U)};f.current=requestAnimationFrame(U)},[t]),D=Yn(B=>{d.current?.control===B&&(f.current&&(cancelAnimationFrame(f.current),f.current=void 0),d.current=null,h.current=0)},[]);return QA(()=>(window.addEventListener("mousemove",M),window.addEventListener("mouseup",E),window.addEventListener("touchmove",M,{passive:!1}),window.addEventListener("touchend",E),window.addEventListener("touchcancel",E),()=>{window.removeEventListener("mousemove",M),window.removeEventListener("mouseup",E),window.removeEventListener("touchmove",M),window.removeEventListener("touchend",E),window.removeEventListener("touchcancel",E),y(),f.current&&cancelAnimationFrame(f.current)}),[M,E,y]),t?wn("div",{className:"mc__wrapper",style:{opacity:n,...ZA[i]},children:Tp("div",{className:"mc__dpad",children:[wn("button",{"aria-label":s("moveForward"),className:"mc__arrow mc__arrow--up",onMouseDown:()=>A("up",1,O),onMouseUp:()=>D("up"),onMouseLeave:()=>D("up"),onTouchStart:B=>{B.preventDefault(),A("up",1,O)},onTouchEnd:()=>D("up"),onTouchCancel:()=>D("up"),children:wn(fc,{direction:"up"})}),Tp("div",{className:"mc__middle-row",children:[wn("button",{"aria-label":s("moveLeft"),className:"mc__arrow mc__arrow--left",onMouseDown:()=>A("left",-1,R),onMouseUp:()=>D("left"),onMouseLeave:()=>D("left"),onTouchStart:B=>{B.preventDefault(),A("left",-1,R)},onTouchEnd:()=>D("left"),onTouchCancel:()=>D("left"),children:wn(fc,{direction:"left"})}),wn("div",{ref:l,className:"mc__joystick",onMouseDown:w,onTouchStart:w,children:wn("div",{className:"mc__knob",style:{transform:`translate(${c.x}px, ${c.y}px)`}})}),wn("button",{"aria-label":s("moveRight"),className:"mc__arrow mc__arrow--right",onMouseDown:()=>A("right",1,R),onMouseUp:()=>D("right"),onMouseLeave:()=>D("right"),onTouchStart:B=>{B.preventDefault(),A("right",1,R)},onTouchEnd:()=>D("right"),onTouchCancel:()=>D("right"),children:wn(fc,{direction:"right"})})]}),wn("button",{"aria-label":s("moveBackward"),className:"mc__arrow mc__arrow--down",onMouseDown:()=>A("down",-1,O),onMouseUp:()=>D("down"),onMouseLeave:()=>D("down"),onTouchStart:B=>{B.preventDefault(),A("down",-1,O)},onTouchEnd:()=>D("down"),onTouchCancel:()=>D("down"),children:wn(fc,{direction:"down"})})]})}):null},ew=eO;import{useEffect as gc,useMemo as tO,useRef as tw,useState as nw}from"react";import{Check as nO,Link as rO,SlidersHorizontal as oO,X as iO}from"lucide-react";import{jsx as Ii,jsxs as Lp}from"react/jsx-runtime";function rw({product:e,options:t,onSelectionsChange:n,top:r=12}){let o=oe(),i={"--ri-product-dock-top":`${r}px`},{adapter:s,urlParam:l,onConfigurationChange:c,defaultClosed:u}=t,p=tO(()=>{let w=l&&typeof window<"u"?new URLSearchParams(window.location.search).get(l):null;return w?Sb(w,e.definition):e.selections},[]),m=zh({product:e.definition,initialSelections:p,adapter:s}),{selections:a}=m.configuration,f=JSON.stringify(a),[d,h]=nw(()=>!u&&(typeof window>"u"||window.innerWidth>640)),[b,x]=nw(!1),v=tw(n);v.current=n,gc(()=>{v.current(a)},[f]);let S=tw(c);S.current=c,gc(()=>{S.current?.(m.configuration,m.checkoutUrl)},[m.configuration.key,m.checkoutUrl]);let y=()=>{let w=new URL(window.location.href);return w.searchParams.set(l,wb(a)),w.href};gc(()=>{l&&window.history.replaceState(window.history.state,"",y())},[l,f]),gc(()=>{if(!b)return;let w=setTimeout(()=>x(!1),2e3);return()=>clearTimeout(w)},[b]);let k=!!l&&typeof window<"u"&&window.self===window.top;return d?Lp("div",{className:"ri-productDock",style:i,children:[Ii("button",{type:"button",className:"ri-productDockClose",onClick:()=>h(!1),title:o("productHideOptions"),"aria-label":o("productHideOptions"),children:Ii(iO,{size:14,"aria-hidden":"true"})}),Ii(yd,{configurator:m,actions:k?Lp("button",{type:"button",onClick:()=>{navigator.clipboard.writeText(y()).then(()=>x(!0)).catch(()=>{})},children:[b?Ii(nO,{size:13,"aria-hidden":"true"}):Ii(rO,{size:13,"aria-hidden":"true"}),o(b?"productLinkCopied":"productCopyLink")]}):void 0})]}):Lp("button",{type:"button",className:"ri-productDockToggle",style:i,onClick:()=>h(!0),title:o("productShowOptions"),children:[Ii(oO,{size:14,"aria-hidden":"true"}),o("productOptions")]})}import{useMemo as sO}from"react";import{useEffect as aO}from"react";import{useThree as ow}from"@react-three/fiber";var iw=new WeakMap;function bc(e){let t=ow(r=>r.get),n=ow(r=>r.setEvents);aO(()=>{if(!e)return;let r=iw.get(t);if(!r){let i=new Set;r=i,iw.set(t,i);let s=t().events.filter;n({filter:(l,c)=>{let u=s?s(l,c):l;return i.size===0?u:u.filter(p=>{for(let m of i)if(!m(p))return!1;return!0})}})}r.add(e);let o=r;return()=>{o.delete(e)}},[e,t,n])}function _p({setAside:e,nodeRefs:t}){let n=sO(()=>{if(e.size===0)return null;let r={refs:null,bound:new Map};return o=>{let i=t.current??{};if(r.refs!==i){let l=new Map;for(let[c,u]of Object.entries(i))l.set(u,e.has(c));r={refs:i,bound:l}}let{bound:s}=r;for(let l=o.object;l;l=l.parent){let c=s.get(l);if(c!==void 0)return!c}return!0}},[e,t]);return bc(n),null}import{useEffect as ts,useMemo as zi,useRef as dO,useState as dw}from"react";import{Edges as pO}from"@react-three/drei";import{useFrame as mO,useThree as Bp}from"@react-three/fiber";import{DoubleSide as fO,Quaternion as gO,Vector3 as Fo}from"three";import{Vector3 as hc,Plane as lO}from"three";var aw={x:0,y:1,z:2},cO=e=>Math.min(Math.max(e,0),1);function uO(e,t){let n=1/0,r=-1/0;for(let o=0;o<8;o++){let i=new hc(...e.min);for(let l=0;l<3;l++)o&1<<l&&i.setComponent(l,e.max[l]);let s=i.dot(t);n=Math.min(n,s),r=Math.max(r,s)}return[n,r]}function sw(e,t){if(!e.enabled||t.min.some((r,o)=>!Number.isFinite(r)||!Number.isFinite(t.max[o])||r>t.max[o]))return{cuts:[],intersection:!1};let n=(r,o,i,s,l)=>{let c=l?new hc(...l).normalize():new hc().setComponent(aw[o],1),[u,p]=uO(t,c),m=u+(p-u)*cO(i),a=s?1:-1;return{id:r,direction:c,min:u,max:p,coordinate:m,plane:new lO(c.clone().multiplyScalar(a),-m*a)}};if(e.mode==="box"){let r=e.box??{min:[0,0,0],max:[1,1,1]};return{intersection:!!e.invertBox,cuts:["x","y","z"].flatMap((o,i)=>[n(`${o}-min`,o,r.min[i],!e.invertBox),n(`${o}-max`,o,r.max[i],!!e.invertBox)])}}return e.mode==="planes"?{intersection:!1,cuts:(e.planes??[]).filter(r=>r.enabled).map(r=>n(r.id,r.axis,r.position,r.flip,r.normal))}:{intersection:!1,cuts:[n("plane",e.axis,e.position,e.flip,e.normal)]}}function lw(e,t,n){return e.length?t?e.some(r=>r.distanceToPoint(n)>=-1e-4):e.every(r=>r.distanceToPoint(n)>=-1e-4):!0}function vc(e,t,n){if(e.mode==="planes")return{planes:e.planes?.map(r=>r.id===t?{...r,position:n}:r)};if(e.mode==="box"){let r=e.box??{min:[0,0,0],max:[1,1,1]},o=[...r.min],i=[...r.max],s=aw[t[0]];return t.endsWith("min")?o[s]=Math.max(0,Math.min(n,i[s]-.001)):i[s]=Math.min(1,Math.max(n,o[s]+.001)),{box:{min:o,max:i}}}return{position:n}}function cw(e,t,n,r){let o=n.clone().addScaledVector(r,-n.dot(r));if(o.lengthSq()<1e-8)return null;o.normalize();let i=e.direction.dot(o);if(Math.abs(i)<1e-8)return null;let s=t.clone().sub(e.origin).dot(o)/i;return Number.isFinite(s)?e.at(s,new hc).dot(r):null}import{DoubleSide as yc}from"three";function uw(){let e=new Map;function t(n){let r=e.get(n);r&&(n.clippingPlanes===r.owned&&(n.clippingPlanes=r.planes,n.clipShadows=r.shadows,n.clipIntersection=r.intersection,n.side===yc&&(n.side=r.side),n.needsUpdate=!0),e.delete(n))}return{apply(n,r,o){let i=e.get(n);i&&n.clippingPlanes!==i.owned&&(e.delete(n),i=void 0),i||(i={planes:n.clippingPlanes,side:n.side,shadows:n.clipShadows,intersection:n.clipIntersection,owned:r},e.set(n,i)),n.side!==yc&&(i.side=n.side),!(n.clippingPlanes===r&&n.clipIntersection===o&&n.side===yc&&n.clipShadows)&&(i.owned=r,n.clippingPlanes=r,n.clipIntersection=o,n.clipShadows=!0,n.side=yc,n.needsUpdate=!0)},retain(n){for(let r of e.keys())n.has(r)||t(r)},restore(){for(let n of e.keys())t(n)}}}import{jsx as xc,jsxs as hO}from"react/jsx-runtime";function jp({section:e,box:t,modelRef:n,showHandle:r,onChange:o,onDraggingChange:i}){let s=Bp(v=>v.gl),l=Bp(v=>v.raycaster),c=Bp(v=>v.invalidate),u=zi(()=>tb(e),[e]),{cuts:p,intersection:m}=zi(()=>t?sw(u,t):{cuts:[],intersection:!1},[u,t]),a=zi(()=>p.map(v=>v.plane),[p]),f=a.length>0,d=zi(()=>uw(),[]);ts(()=>{if(!f)return;let v=s.localClippingEnabled;return s.localClippingEnabled=!0,c(),()=>{d.restore(),s.localClippingEnabled=v,c()}},[f,s,d,c]),ts(()=>{c()},[a,m,c]);let h=zi(()=>new Set,[]);mO(()=>{f&&(h.clear(),n.current?.traverse(v=>{let S=v.material;if(S){if(!Array.isArray(S)){h.add(S),d.apply(S,a,m);return}for(let y of S)h.add(y),d.apply(y,a,m)}}),d.retain(h))});let b=zi(()=>f?v=>{if(v.object.userData.riSectionHandle)return!0;let S=v.object;for(;S&&S!==n.current;)S=S.parent;return!S||lw(a,m,v.point)}:null,[f,a,m,n]);bc(b),ts(()=>{if(!f)return;let v=l,S=v.firstHitOnly;return v.firstHitOnly=!1,()=>{v.firstHitOnly=S}},[f,l]),ts(()=>()=>i(!1),[i]);let x=p.find(v=>v.id===u.activePlaneId)??(u.mode==="planes"&&u.activePlaneId?null:p[0]);return!f||!r||!t||!x?null:xc(bO,{cut:x,box:t,onMove:v=>o(vc(u,x.id,v)),onDraggingChange:i},x.id)}function bO({cut:e,box:t,onMove:n,onDraggingChange:r}){let[o,i]=dw(!1),[s,l]=dw(!1),c=dO(null),u=new Fo(...t.min).add(new Fo(...t.max)).multiplyScalar(.5);u.addScaledVector(e.direction,e.coordinate-u.dot(e.direction));let p=new gO().setFromUnitVectors(new Fo(0,0,1),e.direction),m=new Fo(1,0,0).applyQuaternion(p),a=new Fo(0,1,0).applyQuaternion(p),f=new Fo(...t.max).sub(new Fo(...t.min)),d=b=>Math.max(.01,Math.abs(b.x)*f.x+Math.abs(b.y)*f.y+Math.abs(b.z)*f.z)*1.08;ts(()=>()=>r(!1),[r]);let h=b=>{c.current&&(b.target?.releasePointerCapture?.(b.pointerId),c.current=null,l(!1),r(!1))};return hO("mesh",{ref:b=>{b&&(fi(b),b.userData.riSectionHandle=!0)},position:u,quaternion:p,renderOrder:2,onPointerOver:b=>{b.stopPropagation(),i(!0)},onPointerOut:()=>i(!1),onPointerDown:b=>{b.stopPropagation(),b.target?.setPointerCapture?.(b.pointerId),c.current={point:b.point.clone(),view:b.ray.direction.clone(),at:b.point.dot(e.direction),cut:e.coordinate},l(!0),r(!0)},onPointerMove:b=>{let x=c.current;if(!x)return;b.stopPropagation();let v=cw(b.ray,x.point,x.view,e.direction);v!==null&&e.max>e.min&&n(Math.max(0,Math.min(1,(x.cut+v-x.at-e.min)/(e.max-e.min))))},onPointerUp:h,onPointerCancel:h,onClick:b=>b.stopPropagation(),children:[xc("planeGeometry",{args:[d(m),d(a)]}),xc("meshBasicMaterial",{color:"#22d3ee",transparent:!0,opacity:s?.22:o?.16:.08,side:fO,depthWrite:!1,toneMapped:!1}),xc(pO,{color:"#22d3ee",renderOrder:3})]})}import{jsx as wc,jsxs as pw}from"react/jsx-runtime";var Np=({colorPicker:e,onClose:t,savedHex:n,itemMaterials:r,setItemMaterials:o,inline:i=!1})=>{let s=oe(),l=r[e.objectId]?.hex??n??"#ffffff";return pw("div",{className:`ri-popover${i?" ri-popover--inline":""}`,style:i?{padding:12}:{left:e.x,top:e.y,width:"min(225px, calc(100vw - 24px))",padding:12},onPointerDown:c=>c.stopPropagation(),children:[wc("p",{className:"ri-popoverLabel",children:s("color")}),wc(Il,{color:l,onChange:c=>o(u=>({...u,[e.objectId]:{...u[e.objectId],hex:c}}))}),pw("div",{className:"ri-inlineRow",children:[wc("span",{className:"ri-colorCode",children:l}),wc("button",{className:"ri-secondaryButton",onClick:t,children:s("done")})]})]})};import{jsx as kt,jsxs as Rr}from"react/jsx-runtime";var Ip=({materialPopup:e,textureUrl:t,triggerFileUpload:n,clearTexture:r,canPlaceImage:o=!0,inline:i=!1,offset:s,rotationDegrees:l,onOffsetChange:c,onRotationChange:u,isPositioning:p=!1,onEndPositioning:m})=>{let a=oe();return Rr("div",{className:`ri-popover${i?" ri-popover--inline":""}`,style:i?{overflow:"hidden"}:{left:e.x,top:e.y,width:"min(300px, calc(100vw - 24px))",overflow:"hidden"},onPointerDown:f=>f.stopPropagation(),children:[kt("div",{className:"ri-popoverHeader",children:kt("p",{className:"ri-popoverLabel",style:{marginBottom:0},children:a("material")})}),Rr("div",{className:"ri-materialBody",children:[t?kt("div",{className:"ri-previewFrame",children:kt("img",{src:t,alt:a("texturePreview"),className:"ri-previewImage"})}):Rr("div",{className:"ri-emptyState",children:[kt("svg",{width:"24",height:"24",fill:"none",stroke:"currentColor",strokeWidth:1.5,viewBox:"0 0 24 24",children:kt("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M2.25 15.75l5.159-5.159a2.25 2.25 0 013.182 0l5.159 5.159m-1.5-1.5l1.409-1.409a2.25 2.25 0 013.182 0l2.909 2.909M3 21h18M3 3h18"})}),kt("span",{style:{fontSize:12},children:a("noTextureApplied")})]}),o?kt("button",{onClick:()=>n(e.objectId),className:"ri-uploadButton",children:a(t?"replaceImage":"uploadImage")}):kt("p",{className:"ri-formatHint",children:a("noTextureCoordinates")}),t&&kt("button",{onClick:()=>r(e.objectId),className:"ri-removeButton",children:a("removeTexture")}),o?kt("p",{className:"ri-formatHint",children:"JPG \xB7 PNG \xB7 WebP"}):null,t&&(c||u)&&Rr("div",{className:"ri-texturePosition",children:[kt("p",{className:"ri-texturePositionLabel",children:a("texturePosition")}),Rr("div",{className:"ri-texturePositionGrid",children:[Rr("label",{className:"ri-texturePositionField",children:[kt("span",{children:a("offsetX")}),kt("input",{type:"number",step:.01,value:s?.[0]??0,onChange:f=>c?.(e.objectId,0,Number(f.target.value))})]}),Rr("label",{className:"ri-texturePositionField",children:[kt("span",{children:a("offsetY")}),kt("input",{type:"number",step:.01,value:s?.[1]??0,onChange:f=>c?.(e.objectId,1,Number(f.target.value))})]})]}),Rr("label",{className:"ri-texturePositionField ri-texturePositionField--full",children:[kt("span",{children:a("rotation")}),Rr("div",{className:"ri-texturePositionSliderRow",children:[kt("input",{type:"range",min:0,max:360,step:1,value:l??0,onChange:f=>u?.(e.objectId,Number(f.target.value))}),kt("input",{type:"number",min:0,max:360,step:1,value:Math.round(l??0),onChange:f=>u?.(e.objectId,Number(f.target.value))})]})]}),p?kt("button",{type:"button",className:"ri-uploadButton",onClick:m,title:a("confirmTexturePosition"),children:a("donePositioning")}):kt("p",{className:"ri-texturePositionHint",children:a("textureOffsetHint")})]})]})]})};import{Fragment as vO,useEffect as zp,useLayoutEffect as yO,useRef as Vp,useState as Fp}from"react";import{Fragment as Hp,jsx as Gt,jsxs as Vi}from"react/jsx-runtime";function mw({entries:e}){return Gt(Hp,{children:e.map(([t,n])=>{let r=n!==null&&typeof n=="object",o=r?Object.entries(n):[];return r&&o.length>0?Vi("div",{className:"ri-left-panel__data-group",children:[Gt("span",{className:"ri-left-panel__data-key",children:t}),Gt("div",{className:"ri-left-panel__data-children",children:Gt(mw,{entries:o})})]},t):Vi("div",{className:"ri-left-panel__data-row",children:[Gt("span",{className:"ri-left-panel__data-key",children:t}),Gt("span",{className:`ri-left-panel__data-value ri-left-panel__data-value--${typeof n}`,children:r?Array.isArray(n)?"[]":"{}":String(n)})]},t)})})}function xO({content:e}){let t=e!=null,[n,r]=Fp(t),[o,i]=Fp(t),s=Vp(e);return t&&(s.current=e),zp(()=>{if(t){r(!0);return}if(n){i(!1);let l=setTimeout(()=>r(!1),300);return()=>clearTimeout(l)}},[t,n]),zp(()=>{if(n&&t){let l=requestAnimationFrame(()=>i(!0));return()=>cancelAnimationFrame(l)}},[n,t]),n?Gt("div",{className:`ri-left-panel__action-extra${o?" ri-left-panel__action-extra--open":""}`,children:Gt("div",{className:"ri-left-panel__action-extra-inner",children:e??s.current})}):null}function Gp({isOpen:e,selectedObject:t,currentAction:n,onClose:r,onAction:o,renderActionExtra:i,translateDefaultActions:s=!1}){let l=oe(),c=Vp(null),u=Vp(()=>{});yO(()=>{if(!e)return;let d=c.current,h=document.activeElement;return u.current=()=>{h instanceof HTMLElement&&h!==document.body&&h.isConnected?h.focus({preventScroll:!0}):d?.closest(".ri-viewerLeft")?.querySelector(".ri-canvasArea")?.focus({preventScroll:!0})},()=>{d?.contains(document.activeElement)&&h instanceof HTMLElement&&h.isConnected&&h.focus({preventScroll:!0})}},[e]);let[p,m]=Fp(t);zp(()=>{t&&m(t)},[t]);let a=t??p,f=a?Object.entries(a).filter(([d])=>d!=="actions"&&d!=="decals"):[];return Gt("div",{ref:c,inert:!e,className:`ri-left-panel ${e?"ri-left-panel--open":"ri-left-panel--closed"}`,children:a&&Vi(Hp,{children:[Vi("div",{className:"ri-left-panel__header",children:[Gt("p",{className:"ri-left-panel__title",children:a.label}),Gt("button",{onClick:()=>{u.current(),r()},className:"ri-left-panel__close-btn","aria-label":l("closePanel"),children:"\u2715"})]}),f.length>0&&Gt("div",{className:"ri-left-panel__data",children:Gt(mw,{entries:f})}),Gt("hr",{className:"ri-left-panel__divider"}),a.actions&&a.actions.length>0&&Vi(Hp,{children:[Gt("div",{className:"ri-left-panel__actions-label",children:l("actions")}),Gt("div",{className:"ri-left-panel__actions-list",children:a.actions.map((d,h)=>{let b=n?.action.id===d.id&&(n.binding===a||n.binding?.id===a.id||n.binding?.modelObjectId===a.modelObjectId||n.objectId===a.id||n.objectId===a.modelObjectId),x=i?.(d.id);return Vi(vO,{children:[Gt("button",{onClick:v=>o({objectId:a.modelObjectId||a.id||"",action:d,binding:a,screenX:v.clientX,screenY:v.clientY}),className:["ri-left-panel__action-btn",`ri-left-panel__action-btn--${d.id}`,b?"ri-left-panel__action-btn--active":""].filter(Boolean).join(" "),"data-action-id":d.id,"data-label":d.label,children:s?l.message(d.label):d.label}),Gt(xO,{content:x})]},h)})})]})]})})}import{useMemo as SO,useState as gw}from"react";import{Boxes as CO,Focus as MO}from"lucide-react";import{useState as wO}from"react";import{jsx as Ar,jsxs as ns}from"react/jsx-runtime";function fw({openButtonLabel:e,openButtonAriaLabel:t,eyebrow:n,title:r,searchValue:o,onSearchChange:i,searchPlaceholder:s,children:l,isOpen:c,onToggle:u,openButtonIcon:p,closeButtonIcon:m,closeButtonAriaLabel:a}){let f=oe(),[d,h]=wO(!1),b=c!==void 0?c:d,x=v=>{c===void 0&&h(v),u?.(v)};return ns("div",{className:`ri-sidepanel-wrap ${b?"ri-sidepanel-wrap--open":"ri-sidepanel-wrap--closed"}`,children:[!b&&ns("button",{type:"button",className:"ri-sidepanel__open-btn",onClick:()=>x(!0),"aria-label":t,title:f("openPanel"),children:[p,e?Ar("span",{children:e}):null]}),ns("div",{className:`ri-sidepanel ${b?"ri-sidepanel--open":"ri-sidepanel--closed"}`,"aria-hidden":!b,children:[ns("div",{className:"ri-sidepanel__header",children:[ns("div",{className:"ri-sidepanel__header-top",children:[Ar("span",{className:"ri-sidepanel__eyebrow",children:n}),Ar("button",{type:"button",className:"ri-sidepanel__close-btn",onClick:()=>x(!1),"aria-label":a,title:f("close"),children:m??Ar("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:Ar("path",{d:"M1 1L11 11M11 1L1 11",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"})})})]}),Ar("p",{className:"ri-sidepanel__title",children:r})]}),Ar("div",{className:"ri-sidepanel__search-wrap",children:Ar("input",{className:"ri-sidepanel__search",type:"text",placeholder:s,value:o,onChange:v=>i(v.target.value)})}),Ar("div",{className:"ri-sidepanel__list",children:l})]})]})}import{jsx as Or,jsxs as PO}from"react/jsx-runtime";function Up({objectBindings:e,onAction:t,onFocus:n,onHover:r,isOpen:o,onToggle:i,isolatedKeys:s=null,onIsolate:l}){let c=oe(),[u,p]=gw(null),[m,a]=gw(""),f=SO(()=>Object.entries(e).filter(([d,h])=>{let b=m.toLowerCase();return d.toLowerCase().includes(b)||(h.label??"").toLowerCase().includes(b)}),[e,m]);return Or(fw,{openButtonLabel:"",openButtonAriaLabel:c("openSceneObjectsPanel"),openButtonIcon:Or(CO,{width:16,height:16,"aria-hidden":"true"}),eyebrow:c("sceneObjects"),title:c("visibleEntries",{count:f.length}),searchValue:m,onSearchChange:a,searchPlaceholder:c("searchNodesLabels"),isOpen:o,onToggle:i,closeButtonAriaLabel:c("closeSceneObjectsPanel"),children:f.map(([d,h])=>{let b=h.visible!==!1,x=u===d,v=s?.has(d)??!1;return PO("div",{onClick:()=>n(h),onMouseEnter:()=>{p(d),r?.(h)},onMouseLeave:()=>{p(null),r?.(null)},className:`ri-sidepanel__row${x?" ri-sidepanel__row--hovered":""}${s!==null&&!v?" ri-sidepanel__row--setAside":""}`,children:[Or("button",{type:"button",className:`ri-sidepanel__label ri-sidepanel__labelButton${x?" ri-sidepanel__label--hovered":""}`,onFocus:()=>{p(d),r?.(h)},onBlur:()=>{p(null),r?.(null)},children:h.label??d}),l?Or("button",{type:"button",onClick:y=>{y.stopPropagation(),l(h)},className:`ri-sidepanel__isolate-btn${v?" ri-sidepanel__isolate-btn--active":""}`,title:c(v?"showAll":"isolate"),"aria-label":c(v?"showAllObject":"isolateObject",{name:h.label??d}),"aria-pressed":v,children:Or(MO,{width:14,height:14,"aria-hidden":"true"})}):null,Or("button",{type:"button",onClick:y=>{y.stopPropagation(),t?.({objectId:d,action:{id:"toggle-visibility",label:"Toggle Visibility",type:"command"},binding:h})},className:"ri-sidepanel__vis-btn",title:c(b?"hide":"show"),"aria-label":c(b?"hideObject":"showObject",{name:h.label??d}),children:Or("span",{className:`ri-sidepanel__checkbox${b?" ri-sidepanel__checkbox--checked":""}`,children:b&&Or("svg",{width:"9",height:"9",viewBox:"0 0 10 10",fill:"none",children:Or("path",{d:"M1.5 5L4 7.5L8.5 2.5",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})})})})]},d)})})}import{useEffect as yw,useId as kO,useRef as xw,useState as ww}from"react";function bw(e,t){let n=[];for(let[r,o]of Object.entries(e))(t.bindings[r]??o).visible!==!1&&(t.setAside.has(r)||n.push({key:r,binding:o,label:o.label||r}));return n}function hw(e,t,n){if(n===0)return null;switch(e){case"ArrowDown":case"ArrowRight":return Math.min(t+1,n-1);case"ArrowUp":case"ArrowLeft":return Math.max(t-1,0);case"Home":return 0;case"End":return n-1;default:return null}}function vw(e,t,n){let r=n.toLocaleLowerCase();if(!r)return null;let o=[...r].every(l=>l===r[0]),i=r.length>1&&!o?t:t+1,s=o?[r,r[0]]:[r];for(let l of s)for(let c=0;c<e.length;c++){let u=((i+c)%e.length+e.length)%e.length;if(e[u].label.toLocaleLowerCase().startsWith(l))return u}return null}import{jsx as Sc,jsxs as Sw}from"react/jsx-runtime";var RO=600;function Cw({objects:e,selectedKey:t,onHighlight:n,onSelect:r,onClearSelection:o}){let i=oe(),s=kO(),[l,c]=ww(!1),[u,p]=ww(null),m=xw({query:"",at:0}),a=u?e.findIndex(y=>y.key===u):-1,f=a>=0?e[a]:null;yw(()=>{t&&e.some(y=>y.key===t)&&p(t)},[t,e]);let d=l?f?.binding??null:null,h=xw(n);h.current=n,yw(()=>{if(l)return h.current(d),()=>h.current(null)},[l,d]);let b=y=>{y!==null&&e[y]&&p(e[y].key)},x=y=>{let k=f?a:-1,w=hw(y.key,Math.max(k,0),e.length);if(w!==null){y.preventDefault(),b(k<0&&y.key!=="End"?0:w);return}if(y.key==="Enter"||y.key===" "){if(!f)return;y.preventDefault(),r(f.binding);return}if(y.key==="Escape"){if(!t)return;y.preventDefault(),y.stopPropagation(),o();return}if(y.key.length===1&&y.key!==" "&&!y.ctrlKey&&!y.metaKey&&!y.altKey){let M=Date.now(),E=m.current;E.query=M-E.at>RO?y.key:E.query+y.key,E.at=M,y.preventDefault(),b(vw(e,k,E.query))}};if(e.length===0)return null;let v=`${s}-option`,S=`${s}-hint`;return Sw("div",{className:`ri-objectNavigator${l?" ri-objectNavigator--focused":""}`,children:[Sc("div",{role:"listbox",tabIndex:0,className:"ri-objectNavigator__list","aria-label":i("objectNavigator"),"aria-describedby":S,"aria-activedescendant":f?v:void 0,onFocus:()=>{c(!0),f||p(e[0].key)},onBlur:()=>c(!1),onKeyDown:x,children:f?Sw("div",{id:v,role:"option","aria-selected":f.key===t,"aria-setsize":e.length,"aria-posinset":a+1,className:`ri-objectNavigator__option${f.key===t?" ri-objectNavigator__option--selected":""}`,children:[Sc("span",{className:"ri-objectNavigator__name",children:f.label}),Sc("span",{className:"ri-objectNavigator__position","aria-hidden":"true",children:i("objectNavigatorPosition",{position:a+1,count:e.length})})]}):null}),Sc("div",{id:S,className:"ri-objectNavigator__hint",children:i("objectNavigatorHint")})]})}import{RotateCcw as cD}from"lucide-react";import{useRef as dt,useEffect as Fi,useMemo as On,useCallback as Cc,useSyncExternalStore as DO}from"react";import{useThree as TO,useFrame as LO}from"@react-three/fiber";import{Sphere as _O,PivotControls as BO}from"@react-three/drei";import{Vector3 as Sn,Vector2 as jO,AdditiveBlending as $p,TextureLoader as NO,Matrix4 as IO,Quaternion as Hi,Euler as Mc}from"three";var Mw="data:image/png;base64,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";var Pw="data:image/png;base64,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";var kw="data:image/png;base64,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";import{Fragment as XO,jsx as Je,jsxs as un}from"react/jsx-runtime";var Wp=-100,Xp=100,Bw=.03,zO=.03,VO=.03,qp=.5,FO=Mw,HO=Pw,GO=kw,UO=Math.PI/4,Rw=.4,Gi=64,Aw=Bw*3,Kp="#4d7dff",Pc="#ffcc00",Ow=.02,Ew=.012,Dw=new Sn(0,1,0),kc=32,Tw="#ff9d3d",Rc=4;function Qp(e){let t=new Float32Array((Gi+1)*3);for(let n=0;n<=Gi;n++){let r=n/Gi*Math.PI*2,o=Math.cos(r)*Rw,i=Math.sin(r)*Rw,s=0,l=0,c=0;e==="x"?(l=o,c=i):e==="y"?(s=o,c=i):(s=o,l=i),t[n*3]=s,t[n*3+1]=l,t[n*3+2]=c}return t}function $O(e){let t=Math.abs(e.y)<.99?new Sn(0,1,0):new Sn(1,0,0),n=new Sn().crossVectors(e,t).normalize(),r=new Sn().crossVectors(e,n).normalize();return[n,r]}function Lw(e,t,n=1e-5){return Math.abs(e[0]-t[0])<n&&Math.abs(e[1]-t[1])<n&&Math.abs(e[2]-t[2])<n}var Ho=null,rs=null,Yp=new Set;function Jp(e){Ho!==e&&(Ho=e,Yp.forEach(t=>t()))}function WO(e){return Yp.add(e),()=>Yp.delete(e)}function _w(){return Ho}function jw({light:e,position:t,rotation:n=[0,0,0],color:r,intensity:o,visible:i,onPositionChange:s,onRotationChange:l,target:c,onTransformChange:u,onDraggingChange:p}){let{activeTab:m,activeSubTab:a,setActiveTab:f,setActiveSubTab:d}=Wr(),{camera:h,gl:b,raycaster:x,invalidate:v,scene:S}=TO(),y=dt(null),k=dt(null),w=dt(null),M=dt(null),E=dt(null),P=dt(null),O=dt(null),R=dt(null),A=dt(null),D=dt(null),B=dt(null),V=dt(null),$=dt(null),U=On(()=>new IO,[]),T=On(()=>new Hi,[]),L=On(()=>new Sn(1,1,1),[]),W=dt([0,0,0]),ee=dt([0,0,0]),Z=dt(!1),Q=dt(null),te=dt(null),X=dt(new Sn),F=dt(null),I=dt(null),Y=dt(p);Fi(()=>{Y.current=p},[p]);let re=On(()=>new Sn(t[0],t[1],t[2]),[t]),Fe=On(()=>new Mc(n[0],n[1],n[2]),[n]),K=On(()=>new Float32Array(6),[]),we=On(()=>Qp("x"),[]),Pe=On(()=>Qp("y"),[]),xe=On(()=>Qp("z"),[]),wt=On(()=>new Float32Array((kc+1)*3),[]),pt=On(()=>new Float32Array(Rc*2*3),[]),Tt=e?.type==="point",ae=e?.type==="spot",ke=e?.type==="directional",Ye=Tt?HO:ae?GO:FO,ie=Tt?zO:ae?VO:Bw,He=On(()=>new NO().load(Ye),[Ye]),Ge=DO(WO,_w,_w),he=!!e&&Ge===e.id,Re=dt(new Sn),De=dt(new Mc),Ue=dt(new Sn),Lt=c?.[0]??0,Nt=c?.[1]??0,Mn=c?.[2]??0;Fi(()=>{Z.current||(Re.current.copy(re),De.current.copy(Fe),Ue.current.set(Lt,Nt,Mn),v())},[re,Fe,Lt,Nt,Mn,v]),Fi(()=>{e&&Ho===e.id&&!i&&Jp(null)},[e?.id,i]),Fi(()=>()=>{e&&Ho===e.id&&Jp(null),I.current!==null&&(cancelAnimationFrame(I.current),I.current=null),e&&tc(S,e.id)},[e?.id,S]),Fi(()=>{if(!he)return;let ce=$.current;return rs=ce,()=>{rs===ce&&(rs=null)}});let pn=Cc(()=>{if(Z.current||!he)return;let ce=Re.current,ve=new Hi().setFromEuler(De.current);U.compose(ce,ve,L)},[U,L,he]);LO(()=>{if(y.current&&y.current.position.copy(Re.current),pn(),w.current){w.current.lookAt(h.position);let ce=h,ve;ce.isOrthographicCamera?ve=ie/ce.zoom:ve=h.position.distanceTo(Re.current)*ie,w.current.scale.setScalar(ve)}if(A.current){let ce=h,ve;ce.isOrthographicCamera?ve=Aw/ce.zoom:ve=h.position.distanceTo(Re.current)*Aw,A.current.scale.setScalar(ve)}if(E.current){let ce=E.current.getAttribute("position"),ve=ce.array;ve[0]=Re.current.x,ve[1]=Re.current.y,ve[2]=Re.current.z,ve[3]=Ue.current.x,ve[4]=Ue.current.y,ve[5]=Ue.current.z,ce.needsUpdate=!0,E.current.computeBoundingSphere()}if(P.current){let ce=Ue.current,ve=Re.current.clone().sub(ce),qe=ve.length();P.current.visible=qe>qp,qe>1e-6&&(P.current.position.copy(ce).addScaledVector(ve,.5),P.current.scale.set(1,qe,1),P.current.quaternion.setFromUnitVectors(Dw,ve.normalize()))}if(M.current&&(M.current.visible=Re.current.distanceTo(Ue.current)>qp),O.current&&R.current){let ce=Ue.current,ve=ce.clone().sub(Re.current),qe=ve.length()>qp;if(O.current.visible=qe,R.current.visible=qe,qe){let ze=h,$e=ze.isOrthographicCamera?Ew/ze.zoom:h.position.distanceTo(ce)*Ew;ve.normalize(),O.current.position.copy(ce).addScaledVector(ve,-$e),O.current.quaternion.setFromUnitVectors(Dw,ve),O.current.scale.setScalar($e),R.current.position.copy(ce),R.current.scale.setScalar($e*.45)}}if(ae&&D.current&&B.current&&V.current){let ce=Re.current,ve=Ue.current.clone().sub(ce),qe=ve.length();if(qe>1e-6){D.current.visible=!0;let ze=ve.normalize(),$e=qe,$t=e?.angle??Math.PI/6,ft=$e*Math.tan($t),It=ce.clone().add(ze.clone().multiplyScalar($e)),[vt,mn]=$O(ze),_n=B.current.getAttribute("position"),fn=_n.array;for(let yt=0;yt<=kc;yt++){let Rt=yt/kc*Math.PI*2,rn=It.x+(vt.x*Math.cos(Rt)+mn.x*Math.sin(Rt))*ft,Vt=It.y+(vt.y*Math.cos(Rt)+mn.y*Math.sin(Rt))*ft,Bn=It.z+(vt.z*Math.cos(Rt)+mn.z*Math.sin(Rt))*ft;fn[yt*3]=rn,fn[yt*3+1]=Vt,fn[yt*3+2]=Bn}_n.needsUpdate=!0,B.current.computeBoundingSphere();let Wt=V.current.getAttribute("position"),zt=Wt.array;for(let yt=0;yt<Rc;yt++){let Rt=yt/Rc*Math.PI*2,rn=It.x+(vt.x*Math.cos(Rt)+mn.x*Math.sin(Rt))*ft,Vt=It.y+(vt.y*Math.cos(Rt)+mn.y*Math.sin(Rt))*ft,Bn=It.z+(vt.z*Math.cos(Rt)+mn.z*Math.sin(Rt))*ft,Yt=yt*6;zt[Yt]=ce.x,zt[Yt+1]=ce.y,zt[Yt+2]=ce.z,zt[Yt+3]=rn,zt[Yt+4]=Vt,zt[Yt+5]=Bn}Wt.needsUpdate=!0,V.current.computeBoundingSphere()}else D.current.visible=!1}});let Ln=Cc(()=>{I.current!==null&&(cancelAnimationFrame(I.current),I.current=null),e&&tc(S,e.id),W.current=t,ee.current=[n[0],n[1],n[2]],X.current.copy(Ue.current),Z.current=!0,Q.current=null,te.current=null,F.current=null,Y.current?.(!0)},[t,n,e?.id,S]),Wo=Cc((ce,ve)=>{let qe=ve,ze=new Sn(W.current[0],W.current[1],W.current[2]),$e=new Sn,$t=new Hi,ft=new Sn;qe.decompose($e,$t,ft);let It=ze.clone().applyMatrix4(qe),vt=[Math.min(Math.max(It.x,Wp),Xp),Math.min(Math.max(It.y,Wp),Xp),Math.min(Math.max(It.z,Wp),Xp)],mn=new Hi().setFromEuler(new Mc(ee.current[0],ee.current[1],ee.current[2],"XYZ")),_n=new Hi().copy($t).multiply(mn),fn=new Mc().setFromQuaternion(_n,"XYZ"),Wt=[fn.x,fn.y,fn.z];if(ae||ke){let yt=X.current.clone().applyMatrix4(qe);Ue.current.copy(yt),F.current=yt.toArray()}Re.current.set(vt[0],vt[1],vt[2]),De.current.set(Wt[0],Wt[1],Wt[2]),Q.current=vt,te.current=Wt,e&&Cx(S,e.id,{position:vt,...F.current?{target:F.current}:{}});let zt=new Hi().setFromEuler(De.current);U.compose(Re.current,zt,L),v()},[U,L,v,ae,ke,e?.id,S]),Pn=Cc(()=>{Z.current=!1;let ce=Q.current,ve=te.current,qe=F.current;Q.current=null,te.current=null,F.current=null;let ze=ce&&!Lw(ce,W.current),$e=ve&&!Lw(ve,ee.current);u?(ze||$e)&&u({position:ce??W.current,rotation:ve??ee.current,...qe?{target:qe}:{}}):(ze&&s&&s(ce),$e&&l&&l(ve)),e&&tc(S,e.id),ze||$e?I.current=requestAnimationFrame(()=>{I.current=null,Y.current?.(!1)}):Y.current?.(!1)},[s,l,u,e?.id,S]);return Fi(()=>{let ce=ze=>{let $e=b.domElement.getBoundingClientRect();return new jO((ze.clientX-$e.left)/$e.width*2-1,-((ze.clientY-$e.top)/$e.height)*2+1)},ve=ze=>!!ze.target.closest?.("button, input, textarea, .ri-annotationPopup, .ri-colorPicker, .ri-materialPicker"),qe=ze=>{if(ve(ze)||e&&Ho===e.id)return;let $e=ce(ze);if(x.setFromCamera($e,h),rs&&x.intersectObject(rs,!0).length>0)return;let $t=[];if(k.current&&$t.push(k.current),w.current&&$t.push(w.current),$t.length===0)return;if(x.intersectObjects($t,!1).length>0){let It=e?.id??null;Ho!==It&&(Jp(It),f?.("scene"),d?.("lighting")),ze.preventDefault(),ze.stopPropagation()}};return b.domElement.addEventListener("pointerdown",qe),()=>{b.domElement.removeEventListener("pointerdown",qe)}},[h,x,b,e,f,d]),m!=="scene"||a!=="lighting"||!e||!i||e.type==="none"||e.type==="hemisphere"?null:un("group",{ref:ce=>{ce&&fi(ce)},children:[un("group",{ref:y,children:[Je("sprite",{ref:w,children:Je("spriteMaterial",{map:He,transparent:!0,opacity:.9,blending:$p,depthWrite:!1,rotation:ae?UO:0},Ye)}),Je(_O,{ref:k,args:[.25,16,16],children:Je("meshBasicMaterial",{transparent:!0,opacity:.01})}),Tt&&un("group",{ref:A,children:[un("lineLoop",{renderOrder:999,children:[Je("bufferGeometry",{children:Je("bufferAttribute",{attach:"attributes-position",args:[we,3],count:Gi+1})}),Je("lineBasicMaterial",{color:Kp,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),un("lineLoop",{renderOrder:999,children:[Je("bufferGeometry",{children:Je("bufferAttribute",{attach:"attributes-position",args:[Pe,3],count:Gi+1})}),Je("lineBasicMaterial",{color:Kp,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),un("lineLoop",{renderOrder:999,children:[Je("bufferGeometry",{children:Je("bufferAttribute",{attach:"attributes-position",args:[xe,3],count:Gi+1})}),Je("lineBasicMaterial",{color:Kp,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]})]})]}),!Tt&&!ae&&un(XO,{children:[un("mesh",{ref:P,children:[Je("cylinderGeometry",{args:[Ow,Ow,1,8,1,!0]}),Je("meshBasicMaterial",{color:Pc,transparent:!0,opacity:.05,blending:$p,depthWrite:!1,depthTest:!1})]}),un("mesh",{ref:O,renderOrder:999,children:[Je("coneGeometry",{args:[.45,2,12]}),Je("meshBasicMaterial",{color:Pc,transparent:!0,opacity:.9,depthTest:!1,depthWrite:!1})]}),un("mesh",{ref:R,renderOrder:999,children:[Je("sphereGeometry",{args:[1,12,8]}),Je("meshBasicMaterial",{color:Pc,transparent:!0,opacity:.9,depthTest:!1,depthWrite:!1})]}),un("line",{ref:M,children:[Je("bufferGeometry",{ref:E,children:Je("bufferAttribute",{attach:"attributes-position",args:[K,3],count:2})}),Je("lineBasicMaterial",{color:Pc,transparent:!0,opacity:.7,blending:$p})]})]}),ae&&un("group",{ref:D,children:[un("lineLoop",{renderOrder:999,children:[Je("bufferGeometry",{ref:B,children:Je("bufferAttribute",{attach:"attributes-position",args:[wt,3],count:kc+1})}),Je("lineBasicMaterial",{color:Tw,transparent:!0,opacity:.85,depthTest:!1,depthWrite:!1})]}),un("lineSegments",{renderOrder:999,children:[Je("bufferGeometry",{ref:V,children:Je("bufferAttribute",{attach:"attributes-position",args:[pt,3],count:Rc*2})}),Je("lineBasicMaterial",{color:Tw,transparent:!0,opacity:.5,depthTest:!1,depthWrite:!1})]})]}),he&&(s||u)&&Je(BO,{ref:$,matrix:U,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableScaling:!0,disableRotations:Tt,onDragStart:Ln,onDrag:Wo,onDragEnd:Pn})]})}import{useCallback as Zn,useEffect as qO,useLayoutEffect as KO,useMemo as dn,useRef as En}from"react";import{Html as QO,PivotControls as JO}from"@react-three/drei";import{useFrame as YO,useThree as Zp}from"@react-three/fiber";import{Euler as Nw,Matrix4 as os,Quaternion as is,Vector3 as Cn}from"three";import{Maximize2 as ZO}from"lucide-react";import{jsx as as,jsxs as tE}from"react/jsx-runtime";var eE=.01,em=.5;function tm({node:e,space:t,moveEnabled:n,gizmoTool:r,scaleEnabled:o,onTransformChange:i,onDraggingChange:s,transform:l}){let c=Zp(K=>K.invalidate),u=Zp(K=>K.camera),p=Zp(K=>K.size),m=dn(()=>Ro(e),[e]),a=dn(()=>new Cn,[e]);l?.pivot?a.fromArray(l.pivot.point):a.copy(m);let f=dn(()=>{let K=bl(e);if(!K)return[a.clone().add(new Cn(em,em,em))];let we=[];for(let Pe of[K.min.x,K.max.x])for(let xe of[K.min.y,K.max.y])for(let wt of[K.min.z,K.max.z])we.push(new Cn(Pe,xe,wt));return we},[e,a]),d=dn(()=>new Cn,[]),h=dn(()=>new Cn,[]),b=En(null),x=dn(()=>new os,[]),v=En(!1),S=En(new os),y=En(new os),k=En(null),w=En([]),M=En(null),E=En(s);E.current=s;let P=dn(()=>new Cn,[]),O=dn(()=>new is,[]),R=dn(()=>new Cn,[]),A=dn(()=>new is,[]),D=dn(()=>new Cn(1,1,1),[]),B=dn(()=>new is,[]),V=dn(()=>new Cn,[]),$=dn(()=>new Cn,[]),U=En([0,0,0]),T=En(new Cn(1,1,1)),L=En({point:[0,0,0],offset:[0,0,0]}),W=Zn(()=>{v.current||(e.updateWorldMatrix(!0,!1),P.copy(a).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(O),A.copy(O),t==="world"&&A.identity(),x.compose(P,A,D))},[P,x,A,D,e,a,t,O]),ee=Zn(()=>{e.updateWorldMatrix(!0,!1);let K=1/0;for(let we of f){d.copy(we).applyMatrix4(e.matrixWorld);let Pe=d.distanceToSquared(u.position);Pe<K&&(K=Pe,h.copy(d))}b.current?.position.copy(h)},[u,h,f,e,d]);KO(()=>(W(),ee(),()=>{let K=M.current!==null;K&&(cancelAnimationFrame(M.current),M.current=null),(v.current||K)&&(v.current=!1,E.current(!1));for(let we of w.current)pr(we);w.current=[]}),[W]),YO(()=>{W(),ee()});let Z=Zn(()=>{M.current!==null&&(cancelAnimationFrame(M.current),M.current=null),e.updateWorldMatrix(!0,!0),w.current=[];for(let K of Gr(e))nl(K)||(gi(K,K.matrixWorld),w.current.push(K));e.updateWorldMatrix(!0,!1),P.copy(a).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(O),e.getWorldScale(R),S.current.compose(P,O,R),y.current.copy(x),U.current=[e.rotation.x,e.rotation.y,e.rotation.z],T.current.copy(e.scale),L.current=l?.pivot??hl(a.toArray(),U.current,e.scale.toArray(),e.rotation.order),k.current=null,v.current=!0,s(!0)},[P,x,e,s,a,O,R,l?.pivot]),Q=Zn((K,we)=>{let Pe=S.current.clone().premultiply(we),xe=y.current.clone().premultiply(we);Pe.decompose(V,O,$);let wt=V.clone();xe.decompose(P,A,D),t==="world"&&A.identity(),x.compose(P,A,D),K.decompose(V,B,$);let pt=new Nw().setFromQuaternion(B,e.rotation.order),[Tt,ae,ke]=U.current,Ye=[Tt+pt.x,ae+pt.y,ke+pt.z],ie=new is().setFromEuler(new Nw(Ye[0],Ye[1],Ye[2],e.rotation.order));e.scale.copy(T.current);let Ge=(e.parent?.matrixWorld||new os).clone().invert(),he=wt.clone().applyMatrix4(Ge),Re=a.clone().multiply(e.scale).applyQuaternion(ie),De=he.clone().sub(Re);e.position.copy(De),e.rotation.set(Ye[0],Ye[1],Ye[2],e.rotation.order),e.updateMatrixWorld(!0),c();let Ue=L.current,Lt=he.clone().sub(new Cn(...Ue.offset)),Nt=[Lt.x,Lt.y,Lt.z];k.current={position:Nt,rotation:Ye,pivot:Ue}},[P,B,x,A,D,c,e,a,V,$,t,O]),te=Zn(()=>{v.current=!1;let K=k.current;if(k.current=null,K)i(K),M.current=requestAnimationFrame(()=>{M.current=null,s(!1)});else if(w.current.length>0){for(let we of w.current)pr(we);e.updateMatrixWorld(!0),c(),s(!1)}else s(!1);w.current=[]},[c,e,s,i]),X=En(null),F=Zn(K=>{let we=K.clone().project(u);return{x:p.left+(we.x*.5+.5)*p.width,y:p.top+(-we.y*.5+.5)*p.height}},[u,p]),I=Zn((K,we)=>{let Pe=Math.max(eE,Number.isFinite(K)?K:1);e.scale.copy(T.current).multiplyScalar(Pe);let wt=(e.parent?.matrixWorld||new os).clone().invert(),pt=we.clone().applyMatrix4(wt),Tt=new is().setFromEuler(e.rotation),ae=a.clone().multiply(e.scale).applyQuaternion(Tt),ke=pt.clone().sub(ae);e.position.set(ke.x,ke.y,ke.z),e.updateMatrixWorld(!0),ee(),c(),k.current={position:pt.clone().sub(new Cn(...L.current.offset)).toArray(),scale:e.scale.toArray(),pivot:L.current}},[c,e,a,ee]),Y=Zn(K=>{if(!o)return;K.stopPropagation(),K.preventDefault(),K.currentTarget.setPointerCapture(K.pointerId),Z();let we=P.clone(),Pe=F(we),xe=Math.max(1,Math.hypot(K.clientX-Pe.x,K.clientY-Pe.y));X.current={pointerId:K.pointerId,centerScreen:Pe,startDistance:xe,pivotWorld:we}},[Z,P,F,o]),re=Zn(K=>{let we=X.current;if(!we||K.pointerId!==we.pointerId)return;K.stopPropagation();let Pe=Math.hypot(K.clientX-we.centerScreen.x,K.clientY-we.centerScreen.y);I(Pe/we.startDistance,we.pivotWorld)},[I]),Fe=Zn(K=>{let we=X.current;!we||K.pointerId!==we.pointerId||(K.stopPropagation(),K.currentTarget.hasPointerCapture(K.pointerId)&&K.currentTarget.releasePointerCapture(K.pointerId),X.current=null,te())},[te]);return qO(()=>{o||X.current&&(X.current=null,te())},[o,te]),tE("group",{children:[as(JO,{matrix:x,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#e5484d","#46a758","#3e8bff"],hoveredColor:"#35c0dc",opacity:.95,depthTest:!1,disableAxes:!n||r==="rotate",disableSliders:!n||r==="rotate",disableRotations:!n||r==="move",disableScaling:!0,onDragStart:Z,onDrag:(K,we,Pe,xe)=>Q(we,xe),onDragEnd:te}),o&&as("group",{ref:b,children:as(QO,{portal:void 0,zIndexRange:[10,0],style:{pointerEvents:"none",transition:"opacity 0.2s"},children:as("div",{onPointerDown:Y,onPointerMove:re,onPointerUp:Fe,onPointerCancel:Fe,title:"Drag to resize",style:{position:"absolute",transform:"translate(-50%, -50%)",width:24,height:24,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:"#113456",border:"2px solid #ffffff",boxShadow:"0 2px 6px rgba(0,0,0,0.5)",cursor:"nwse-resize",touchAction:"none",pointerEvents:"auto"},children:as(ZO,{size:13,color:"#ffffff"})})})})]})}import{useCallback as er,useEffect as rE,useLayoutEffect as Vw,useMemo as Go,useRef as Dn}from"react";import{Html as oE,PivotControls as iE}from"@react-three/drei";import{useFrame as aE,useThree as om}from"@react-three/fiber";import{Matrix4 as ss,Quaternion as sE,Vector3 as Uo}from"three";import{Maximize2 as lE}from"lucide-react";import{Matrix4 as nE,Vector3 as Iw}from"three";function nm(e){let t=new Set(e.map(({node:r})=>r)),n=new Set;return e.filter(({node:r})=>{if(n.has(r))return!1;n.add(r);for(let o=r.parent;o;o=o.parent)if(t.has(o))return!1;return!0})}function zw(e){return nm(e).map(({key:t,node:n,transform:r})=>{n.updateWorldMatrix(!0,!0);let o=r?.pivot?.point??Ro(n).toArray(),i=r?.pivot??hl(o,[n.rotation.x,n.rotation.y,n.rotation.z],n.scale.toArray(),n.rotation.order,r?.shear);return{key:t,node:n,pivot:i,startWorld:n.matrixWorld.clone(),startMatrix:n.matrix.clone(),startMatrixAutoUpdate:n.matrixAutoUpdate,startPosition:n.position.clone(),startQuaternion:n.quaternion.clone(),startScale:n.scale.clone(),pivotWorld:new Iw(...i.point).applyMatrix4(n.matrixWorld)}})}function rm(e,t,n=1){return e.map(r=>{let{node:o,pivot:i}=r;o.parent?.updateWorldMatrix(!0,!1);let s=(o.parent?.matrixWorld.clone()??new nE).invert(),l=s.clone().multiply(t).multiply(r.startWorld),{rotation:c,scale:u,shear:p}=Ug(l,r.startScale.clone().multiplyScalar(n),r.startQuaternion),m=r.pivotWorld.clone().applyMatrix4(t).applyMatrix4(s);return o.position.setFromMatrixPosition(l),o.quaternion.copy(c),o.scale.copy(u),rl(o,p),o.updateMatrixWorld(!0),{key:r.key,transform:{position:m.clone().sub(new Iw(...i.offset)).toArray(),rotation:[o.rotation.x,o.rotation.y,o.rotation.z],scale:u.toArray(),pivot:i,shear:p}}})}import{jsx as ls,jsxs as uE}from"react/jsx-runtime";var cE=.01;function im({entries:e,referenceNode:t,space:n,moveEnabled:r,gizmoTool:o,scaleEnabled:i,onTransformChange:s,onDraggingChange:l}){let c=om(F=>F.invalidate),u=om(F=>F.camera),p=om(F=>F.size),m=Dn(e);m.current=e;let a=Dn([]);(e.length!==a.current.length||e.some((F,I)=>F.key!==a.current[I].key||F.node!==a.current[I].node))&&(a.current=e);let f=a.current,d=Go(()=>nm(f).map(({node:F})=>F),[f]),h=t??e[e.length-1]?.node,b=Go(()=>new Uo,[]),x=Go(()=>new sE,[]),v=Go(()=>new ss,[]),S=Go(()=>new Uo(1,1,1),[]),y=Go(()=>new Uo,[]),k=Dn(null),w=Go(()=>d.flatMap(F=>{let I=bl(F);if(!I)return[{node:F,point:Ro(F).addScalar(.5)}];let Y=[];for(let re of[I.min.x,I.max.x])for(let Fe of[I.min.y,I.max.y])for(let K of[I.min.z,I.max.z])Y.push({node:F,point:new Uo(re,Fe,K)});return Y}),[d]),M=Dn(!1),E=Dn(new ss),P=Dn([]),O=Dn(null),R=Dn([]),A=Dn(null),D=Dn(null),B=Dn(l);B.current=l;let V=Dn(s);V.current=s;let $=er(()=>{if(!M.current){b.set(0,0,0);for(let F of d)F.updateWorldMatrix(!0,!1),b.add(Ro(F).applyMatrix4(F.matrixWorld));d.length&&b.divideScalar(d.length),x.identity(),n==="local"&&h&&(h.updateWorldMatrix(!0,!1),h.getWorldQuaternion(x)),v.compose(b,x,S)}},[b,v,x,d,h,n,S]),U=er(()=>{let F=1/0,I=new Uo;for(let{node:Y,point:re}of w){Y.updateWorldMatrix(!0,!1),I.copy(re).applyMatrix4(Y.matrixWorld);let Fe=I.distanceToSquared(u.position);Fe<F&&(F=Fe,y.copy(I))}k.current?.position.copy(y)},[u,w,y]),T=er(()=>{let F=D.current;D.current=null,F?.target.hasPointerCapture(F.pointerId)&&F.target.releasePointerCapture(F.pointerId)},[]);Vw(()=>{$(),U()},[$,U]),Vw(()=>()=>{T();let F=A.current!==null;if(F&&(cancelAnimationFrame(A.current),A.current=null),M.current)for(let I of P.current)I.node.matrixAutoUpdate=I.startMatrixAutoUpdate,I.node.matrix.copy(I.startMatrix),I.node.position.copy(I.startPosition),I.node.quaternion.copy(I.startQuaternion),I.node.scale.copy(I.startScale),I.node.updateMatrixWorld(!0);(M.current||F)&&(M.current=!1,O.current=null,B.current(!1),c());for(let I of R.current)pr(I);R.current=[]},[f,c,T]),aE(()=>{$(),U()});let L=er(()=>{A.current!==null&&(cancelAnimationFrame(A.current),A.current=null),$(),P.current=zw(m.current),R.current=[];for(let{node:F}of P.current)for(let I of Gr(F))nl(I)||(gi(I,I.matrixWorld),R.current.push(I));E.current.copy(v),O.current=null,M.current=!0,B.current(!0)},[v,$]),W=er((F,I)=>{if(!M.current)return;E.current.clone().premultiply(I).decompose(b,x,new Uo),n==="world"&&x.identity(),v.compose(b,x,S),O.current=rm(P.current,I),U(),c()},[b,v,x,c,n,U,S]),ee=er(()=>{if(!M.current)return;M.current=!1,T();let F=O.current;if(O.current=null,F?.length)A.current=requestAnimationFrame(()=>{A.current=null,B.current(!1)}),V.current(F);else{for(let I of R.current)pr(I);c(),B.current(!1)}R.current=[]},[c,T]);rE(()=>{(!i&&D.current||!r&&M.current&&!D.current)&&ee()},[i,r,ee]);let Z=er(F=>{let I=F.clone().project(u);return{x:p.left+(I.x*.5+.5)*p.width,y:p.top+(-I.y*.5+.5)*p.height}},[u,p]),Q=er(F=>{if(!i)return;F.stopPropagation(),F.preventDefault(),F.currentTarget.setPointerCapture(F.pointerId),L();let I=Z(b);D.current={pointerId:F.pointerId,target:F.currentTarget,centerScreen:I,startDistance:Math.max(1,Math.hypot(F.clientX-I.x,F.clientY-I.y))}},[L,b,Z,i]),te=er(F=>{let I=D.current;if(!I||F.pointerId!==I.pointerId)return;F.stopPropagation();let Y=Math.hypot(F.clientX-I.centerScreen.x,F.clientY-I.centerScreen.y),re=Math.max(cE,Y/I.startDistance),Fe=new Uo().setFromMatrixPosition(E.current),K=new ss().makeTranslation(...Fe.toArray()).multiply(new ss().makeScale(re,re,re)).multiply(new ss().makeTranslation(...Fe.clone().negate().toArray()));O.current=rm(P.current,K,re),U(),c()},[c,U]),X=er(F=>{F.pointerId===D.current?.pointerId&&(F.stopPropagation(),ee())},[ee]);return uE("group",{children:[ls(iE,{matrix:v,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#e5484d","#46a758","#3e8bff"],hoveredColor:"#35c0dc",opacity:.95,depthTest:!1,disableAxes:!r||o==="rotate",disableSliders:!r||o==="rotate",disableRotations:!r||o==="move",disableScaling:!0,onDragStart:L,onDrag:(F,I,Y,re)=>W(I,re),onDragEnd:ee}),i&&ls("group",{ref:k,children:ls(oE,{children:ls("div",{onPointerDown:Q,onPointerMove:te,onPointerUp:X,onPointerCancel:X,title:"Drag to resize",style:{position:"absolute",transform:"translate(-50%, -50%)",width:24,height:24,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:"#113456",border:"2px solid #ffffff",boxShadow:"0 1px 4px rgba(0,0,0,0.4)",cursor:"nwse-resize",touchAction:"none",pointerEvents:"auto"},children:ls(lE,{size:13,color:"#ffffff"})})})})]})}import{Vector3 as dE}from"three";function pE(e){let t=e.object;if(!t.isSkinnedMesh||!e.face||!t.skeleton)return null;let n=t.geometry,r=n.getAttribute("skinIndex"),o=n.getAttribute("skinWeight"),i=n.getAttribute("position");if(!r||!o||!i)return null;let s=t.worldToLocal(e.point.clone()),l=[e.face.a,e.face.b,e.face.c],c=new dE,u=l[0],p=1/0;for(let f of l){c.fromBufferAttribute(i,f);let d=c.distanceToSquared(s);d<p&&(p=d,u=f)}let m=r.getComponent(u,0),a=o.getComponent(u,0);for(let f=1;f<4;f++){let d=o.getComponent(u,f);d>a&&(a=d,m=r.getComponent(u,f))}return t.skeleton.bones[m]??null}function Fw(e){let t=pE(e)??e.object,n=Fr(t);if(!n)return null;t.updateWorldMatrix(!0,!1);let r=t.worldToLocal(e.point.clone());return{anchorNodeName:n,anchorLocalPosition:[r.x,r.y,r.z]}}function Hw(e,t,n){if(!e.anchorNodeName||!e.anchorLocalPosition)return!1;let r=Hr(t,e.anchorNodeName);return r?(r.updateWorldMatrix(!0,!1),n.set(...e.anchorLocalPosition).applyMatrix4(r.matrixWorld),!0):!1}import{useEffect as mE,useMemo as am,useRef as Gw}from"react";import{useFrame as fE,useThree as gE}from"@react-three/fiber";import{Vector3 as sm}from"three";function Ac({annotation:e,enabled:t,controlsRef:n,offsetRef:r}){let o=gE(a=>a.scene),i=Gw(null),s=Gw(!1),l=am(()=>new sm,[]),c=am(()=>new sm,[]),u=am(()=>new sm,[]),p=e?.anchorNodeName,m=e?.anchorLocalPosition;return mE(()=>{i.current=null,s.current=!1},[p,e?.id]),fE(()=>{let a=n.current,f=r.current;if(!t||!a||!f||!p||!m){s.current=!1;return}let d=i.current;if((!d||!d.parent)&&(d=Hr(o,p),i.current=d),!d){s.current=!1;return}d.updateWorldMatrix(!0,!1),l.set(m[0],m[1],m[2]).applyMatrix4(d.matrixWorld),!(s.current&&l.distanceToSquared(c)<1e-8)&&(c.copy(l),s.current=!0,u.copy(l).add(f),a.setLookAt(u.x,u.y,u.z,l.x,l.y,l.z,!0))}),null}import{useCallback as tr,useEffect as Ui,useMemo as $i,useRef as lm,useState as to}from"react";import{Box3 as bE,Raycaster as hE,Vector3 as $o}from"three";var vE=[[0,0],[35,0],[-35,0],[0,30],[35,30],[-35,30],[70,0],[-70,0],[70,30],[-70,30],[0,60]];function yE(e,t,n,r){let o=[],i=!0;for(let a=e.parent;a;a=a.parent)if(!a.visible){i=!1;break}i&&e.traverseVisible(a=>{let f=a;f.isMesh&&!f.isSkinnedMesh&&o.push(a)});let s=Math.abs(n.y)>.99?new $o(1,0,0):new $o(0,1,0),l=new $o().crossVectors(s,n).normalize(),c=r*.02,u=new hE,p={direction:n.clone(),clearance:-1};for(let[a,f]of vE){let d=n.clone().applyAxisAngle(s,a*Math.PI/180).applyAxisAngle(l,-f*Math.PI/180).normalize();u.set(t.clone().addScaledVector(d,c),d),u.far=r-c;let h=u.intersectObjects(o,!1)[0];if(!h)return t.clone().addScaledVector(d,r);h.distance>p.clearance&&(p={direction:d,clearance:h.distance})}let m=Math.max(c+p.clearance*.85,c*2);return t.clone().addScaledVector(p.direction,m)}function Uw({sceneAnnotations:e,controlledAnnotationCategories:t,onAnnotationCategoriesChange:n,showAnnotationFilters:r,initialCategories:o,controlledActiveAnnotation:i,onActiveAnnotationChange:s,onAnnotationsChange:l,controlsRef:c,sceneRef:u,annotationWorldPositionsRef:p,tourCameraOffsetRef:m,initialCameraStateRef:a,engagement:f,engagementRef:d}){let[h,b]=to(!1),[x,v]=to(()=>e??[]);Ui(()=>{if(x.length>0){let ae=x.reduce((ke,Ye)=>Math.max(ke,Ye.id),0);M.current=ae}else M.current=0},[x]);let[S,y]=to(null),[k,w]=to({title:"",description:""}),M=lm(0),[E,P]=to(null),[O,R]=to(-1),[A,D]=to(!1),B=lm(null),[V,$]=to(()=>o),U=t===void 0?V:t,T=$i(()=>Ig(x,U),[x,U]),L=$i(()=>[...new Set(x.map(Ng))].sort(),[x]),W=r&&L.some(Boolean),ee=ae=>{t===void 0&&$(ae),n?.(ae)},Z=$i(()=>[...T].sort((ae,ke)=>ae.id-ke.id),[T]),Q=$i(()=>JSON.stringify([U?.map(ae=>ae.trim()).sort()??null,Z]),[U,Z]),te=$i(()=>O<0||O>=Z.length?null:Z[O],[O,Z]),X=tr(ae=>{if(i!==void 0){s?.(ae);return}P(ae?{annotation:ae}:null)},[i,s]),F=lm(null),I=tr(ae=>{let ke=c.current,Ye=u.current;if(!ke)return;let ie=new $o,He=p.current.get(ae.id);He?ie.copy(He):Ye&&Hw(ae,Ye,ie)||ie.set(ae.worldPosition[0],ae.worldPosition[1],ae.worldPosition[2]),m.current=null;let Ge=ke.smoothTime;ke.smoothTime=Zs(ke,.6);let he=ae.worldNormal;if(rd(ae.cameraView))xa(ke,ae.cameraView);else{if(Ye){let Re=new bE().setFromObject(Ye),De=new $o;Re.getCenter(De);let Ue=new $o;Re.getSize(Ue);let Lt=Ue.length()*.2,Nt;he?Nt=new $o(he[0],he[1],he[2]):Nt=ie.clone().sub(De),Nt.lengthSq()<1e-6&&Nt.set(0,0,1),Nt.normalize();let Mn=Math.max(Lt*.6,.3),pn=yE(Ye,ie,Nt,Mn);ke.setPosition(pn.x,pn.y,pn.z,!0),ae.anchorNodeName&&ae.anchorLocalPosition&&(m.current=pn.clone().sub(ie))}ke.setTarget(ie.x,ie.y,ie.z,!0),F.current&&tl(ke,F.current)}B.current&&clearTimeout(B.current),B.current=setTimeout(()=>{ke.smoothTime=Ge,B.current=null},800),X(ae)},[X]),Y=tr(()=>{Z.length!==0&&(c.current&&(F.current=el(c.current)),f.startTour(Z.length),b(!0),R(0),I(Z[0]))},[Z,I,f]),re=tr(()=>{if(Z.length===0||O<0)return;D(!0);let ae=(O-1+Z.length)%Z.length;R(ae),I(Z[ae]),setTimeout(()=>D(!1),500)},[O,Z,I]),Fe=tr(()=>{if(Z.length===0||O<0)return;if(O===Z.length-1){if(f.completeTour(),b(!1),R(-1),X(null),c.current&&a.current){let ke=a.current;xa(c.current,{...F.current,...ke}),F.current=null}return}D(!0);let ae=O+1;R(ae),I(Z[ae]),setTimeout(()=>D(!1),500)},[O,Z,I,X,f]),K=tr(()=>{if(f.stopTour(),b(!1),R(-1),X(null),c.current&&a.current){let ae=a.current;xa(c.current,{...F.current,...ae}),F.current=null}},[X,f]);Ui(()=>{d.current.stopTour("annotations-changed"),F.current&&c.current&&(xa(c.current,{...F.current,...a.current??{}}),F.current=null),m.current=null,R(-1),b(!1)},[Q]),Ui(()=>()=>{B.current&&clearTimeout(B.current)},[]),Ui(()=>{te&&h&&F.current&&X(te)},[te,X,h]),Ui(()=>{if(e===void 0)return;let ae=e.map(ke=>({...ke,localPosition:ke.localPosition??ke.worldPosition}));v(ae)},[e]);let we=tr(()=>{if(i!==void 0){s?.(null);return}P(null)},[i,s]),Pe=i!==void 0?i:E?.annotation??null,xe=$i(()=>Pe?T.find(ke=>ke.id===Pe.id)??null:null,[Pe,T]);Ui(()=>{Pe&&!xe&&we()},[Pe,xe,we]);let wt=tr(()=>{if(!S||!k.title.trim())return;M.current+=1;let ke={id:M.current,worldPosition:S.worldPosition,localPosition:S.localPosition,worldNormal:S.worldNormal,anchorNodeName:S.anchor?.anchorNodeName,anchorLocalPosition:S.anchor?.anchorLocalPosition,title:k.title.trim(),description:k.description},Ye=[...x,ke];v(Ye),l?.(Ye),y(null)},[S,k,x,l]),pt=tr(()=>y(null),[]),Tt=tr(ae=>{rd(ae.cameraView)?I(ae):X(ae)},[X,I]);return{annotations:x,pendingAnnotation:S,setPendingAnnotation:y,annotationForm:k,setAnnotationForm:w,currentAnnotationIndex:O,isNavigating:A,localAnnotationCategories:V,selectedAnnotationCategories:U,visibleAnnotations:T,availableAnnotationCategories:L,annotationFiltersVisible:W,changeAnnotationCategories:ee,sortedAnnotations:Z,currentAnnotation:te,setActiveAnnotation:X,focusAnnotation:I,startGuidedTour:Y,goToPreviousAnnotation:re,goToNextAnnotation:Fe,stopGuidedTour:K,closeViewingAnnotation:we,activeAnnotation:Pe,activeViewingAnnotation:xe,isGuidedTourActive:h,handleAnnotationOk:wt,handleAnnotationCancel:pt,handleAnnotationMarkerClick:Tt}}import{useCallback as Oc,useEffect as $w,useMemo as xE,useRef as wE}from"react";import{Vector3 as SE}from"three";var Ww=()=>`decal-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;function Xw({currentObjectBindings:e,currentObjectBindingsRef:t,applyObjectBindings:n,nodeRefsMap:r,controlsRef:o,decalMove:i,decalDragging:s,setDecalDragging:l,setDecalError:c,setDecalControl:u,decalRequestRef:p,onTextureUpload:m,currentPanelObjectId:a,modelUrl:f}){let d=Oc((w,M)=>{let E=t.current,P=E[w];if(!P)return;let O=M(P.decals??[]);n({...E,[w]:{...P,decals:O.length>0?O:void 0}})},[n,e]),h=xE(()=>{if(!s)return null;let{objectKey:w,decalId:M}=s,E=e[w],P=E?.decals?.find(O=>O.id===M);return P?{objectId:E.modelObjectId??w,decal:P,onCancel:()=>l(null),onCommit:O=>{d(w,R=>R.map(A=>A.id===M?{...A,...O}:A)),l(null)}}:null},[s,e,d]),b=i??h,x=Oc((w,M)=>{p.current++;let E=t.current[w],P=r.current[E?.modelObjectId??w],O=nv(P,o.current?.camera);if(!O)return c("Could not find a surface on this object for the decal."),!1;let R={...M,...O};return d(w,A=>[...A,R]),c(null),u(A=>A&&{...A,activeId:R.id}),l({objectKey:w,decalId:R.id}),!0},[d]),v=Oc(w=>{let M=t.current[w],E=r.current[M?.modelObjectId??w]?.geometry;if(!E)return .2;E.boundingBox||E.computeBoundingBox();let P=E.boundingBox?.getSize(new SE),O=P?Math.max(P.x,P.y,P.z):0;return O>0&&Number.isFinite(O)?O/3:.2},[]),S=wE([]);$w(()=>()=>{for(let w of S.current)URL.revokeObjectURL(w)},[]);let y=Oc(async(w,M,E)=>{let P=++p.current;l(null);let O;if(m){if(O=await m(E,w),P!==p.current)return}else O=URL.createObjectURL(E),S.current.push(O);x(M,{id:Ww(),image:O,size:v(M)})},[v,m,x]);return $w(()=>{p.current++,c(null),l(null)},[a,f]),{editDecals:d,activeDecalMove:b,addCenteredDecal:x,decalSizeFor:v,startImageDecal:y,decalControlHandlers:(w,M)=>({onSelect:E=>{p.current++,c(null),l(null),u({...w,activeId:E})},onAddText:(E,P)=>x(M,{id:Ww(),text:E,color:P,size:v(M)}),onAddImage:E=>{y(w.objectId,M,E)},onChange:(E,P)=>d(M,O=>O.map(R=>R.id===E?{...R,...P}:R)),onNudge:(E,P)=>{let O=t.current[M],R=O?.decals?.find(B=>B.id===E);if(!R)return;let A=r.current[O.modelObjectId??M],D=ov(A,o.current?.camera,R,P);if(!D){c("No visible surface in that direction. Try another arrow or rotate the view.");return}c(null),l(null),d(M,B=>B.map(V=>V.id===E?{...V,...D}:V))},onMove:E=>{p.current++,e[M]?.decals?.find(O=>O.id===E)&&(c(null),l(O=>O?.objectKey===M&&O.decalId===E?null:{objectKey:M,decalId:E}))},onRemove:E=>{l(null),d(M,P=>P.filter(O=>O.id!==E)),u({...w,activeId:null})},onClose:()=>{p.current++,c(null),l(null),u(null)}})}}import{useEffect as CE,useRef as qw}from"react";function Kw({canvasAreaElement:e,controlsRef:t,sceneSizeRef:n,invalidate:r,enabled:o}){let i=qw(new Set),s=qw(null);CE(()=>{let l=e;if(!l||!o)return;let c=new Set(["w","a","s","d"," ","c"]),u=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]),p=0,m=b=>b.code==="Space"?" ":b.key.toLowerCase(),a=()=>{i.current.clear(),p=0,s.current!==null&&(cancelAnimationFrame(s.current),s.current=null)},f=b=>{let x=t.current,v=i.current;if(!x||v.size===0){s.current=null,p=0;return}let S=p?Math.min((b-p)/1e3,.05):1/60;p=b;let y=Math.max(x.distance*.75,(n?.current??0)*.1,.01)*S;v.has("w")&&x.forward(y,!1),v.has("s")&&x.forward(-y,!1),v.has("a")&&x.truck(-y,0,!1),v.has("d")&&x.truck(y,0,!1),v.has(" ")&&x.truck(0,y,!1),v.has("c")&&x.truck(0,-y,!1),r?.(),s.current=requestAnimationFrame(f)},d=b=>{if(b.target!==l){a();return}if(u.has(b.key)){let v=t.current;if(!v)return;b.preventDefault();let S=Math.PI/90,y=Math.max(v.distance*.05,.01);b.key==="ArrowUp"?b.shiftKey?v.forward(y,!0):v.rotate(0,-S,!0):b.key==="ArrowDown"?b.shiftKey?v.forward(-y,!0):v.rotate(0,S,!0):b.key==="ArrowLeft"?v.rotate(-S,0,!0):v.rotate(S,0,!0),r?.();return}let x=m(b);c.has(x)&&(b.preventDefault(),i.current.add(x),s.current===null&&(s.current=requestAnimationFrame(f)))},h=b=>{i.current.delete(m(b))};return l.addEventListener("keydown",d),l.addEventListener("keyup",h),l.addEventListener("blur",a),()=>{l.removeEventListener("keydown",d),l.removeEventListener("keyup",h),l.removeEventListener("blur",a),a()}},[e,t,o])}import{useCallback as Wi,useEffect as cm,useRef as Xi}from"react";var Qw=1,ME=4,PE=.0015,kE=.1,RE=8;function Jw({moveZoomTarget:e,setMoveZoomTarget:t,currentObjectBindingsRef:n,materialRefsOut:r,rendererCaptureRef:o,canvasAreaRef:i,canvasAreaElement:s,applyBindingStyle:l}){let c=Xi(null),u=Xi(!1),p=Xi([0,0]),m=Xi([0,0]),a=Xi(1),f=Xi(null),d=Wi((y,k)=>{let w=e;if(!w)return;let M=n.current[w.objectKey]?.style?.material?.[w.textureKey],E=M?.path;if(!E)return;let P=M?.rotation??0,O=vi(w.textureKey),R=Kg(E,O),A=r.current[w.objectKey],D=Array.isArray(A)?A:A?[A]:[],B=Tb[w.textureKey];for(let V of D){let $=V;B in $&&($[B]=Qg($.userData,w.textureKey,R,E,y,k,P))}o.current?.invalidate()},[e]),h=Wi(y=>{if(!e)return;y.currentTarget.setPointerCapture?.(y.pointerId),c.current={x:y.clientX,y:y.clientY},u.current=!1;let k=n.current[e.objectKey]?.style?.material?.[e.textureKey];if(p.current=k?.offset??[0,0],m.current=p.current,a.current=k?.scale??1,f.current===null){let w=()=>{o.current?.invalidate(),f.current=requestAnimationFrame(w)};f.current=requestAnimationFrame(w)}},[e]),b=Wi(y=>{if(!e||!c.current)return;let k=i.current,w=k?.clientWidth||1,M=k?.clientHeight||1,E=y.clientX-c.current.x,P=y.clientY-c.current.y;if(!u.current&&Math.hypot(E,P)<ME)return;u.current=!0;let O=-(E/w)*Qw,R=P/M*Qw,[A,D]=p.current,B=[A+O,D+R];m.current=B,d(B,a.current),l(e.objectKey,V=>({...V,material:{...V?.material,[e.textureKey]:{...V?.material?.[e.textureKey],path:n.current[e.objectKey]?.style?.material?.[e.textureKey]?.path,offset:B}}}))},[e,d,l]),x=Wi(y=>{if(!e)return;y.target?.releasePointerCapture?.(y.pointerId),f.current!==null&&(cancelAnimationFrame(f.current),f.current=null);let k=u.current,w=e;if(k){l(w.objectKey,M=>({...M,material:{...M?.material,[w.textureKey]:{...M?.material?.[w.textureKey],path:n.current[w.objectKey]?.style?.material?.[w.textureKey]?.path,offset:m.current}}})),c.current=null,u.current=!1;return}c.current=null,t(null)},[e,l]);cm(()=>{if(!e)return f.current!==null&&(cancelAnimationFrame(f.current),f.current=null),()=>{f.current!==null&&(cancelAnimationFrame(f.current),f.current=null)}},[e]),cm(()=>{let y=s;if(!(!y||!e))return y.addEventListener("pointermove",b),y.addEventListener("pointerup",x),y.addEventListener("pointercancel",x),()=>{y.removeEventListener("pointermove",b),y.removeEventListener("pointerup",x),y.removeEventListener("pointercancel",x)}},[s,e,b,x]);let v=Wi(y=>{if(!e)return;y.preventDefault();let k=e,w=Math.exp(-y.deltaY*PE),M=Math.min(RE,Math.max(kE,a.current*w));a.current=M,d(m.current,M),l(k.objectKey,E=>({...E,material:{...E?.material,[k.textureKey]:{...E?.material?.[k.textureKey],path:n.current[k.objectKey]?.style?.material?.[k.textureKey]?.path,scale:M}}}))},[e,d,l]);return cm(()=>{let y=s;if(!(!y||!e))return y.addEventListener("wheel",v,{passive:!1}),()=>y.removeEventListener("wheel",v)},[s,e,v]),{beginMoveZoom:Wi(y=>{u.current=!1,c.current=null,t(y)},[t]),handleMoveZoomPointerDown:h}}import{useFrame as AE,useThree as OE}from"@react-three/fiber";var EE=.2;function um({enabled:e,speed:t,controlsRef:n}){let r=OE(o=>o.invalidate);return AE((o,i)=>{!e||!n.current||(n.current.rotate(i*EE*t,0,!1),r())}),null}import{AlertTriangle as cs,RotateCcw as DE,X as Yw}from"lucide-react";import{jsx as Dt,jsxs as no}from"react/jsx-runtime";function Zw({count:e,onDismiss:t}){let n=oe();return no("div",{className:"ri-bindingsMismatchBanner",children:[Dt(cs,{size:14,className:"ri-bindingsMismatchBanner__icon"}),Dt("span",{children:n(e===1?"bindingMismatchOne":"bindingMismatchMany",{count:e})}),Dt("button",{type:"button",className:"ri-bindingsMismatchBanner__dismiss",onClick:r=>{r.stopPropagation(),t()},"aria-label":n("dismiss"),children:Dt(Yw,{size:12})})]})}function e0({triangles:e,offset:t,onDismiss:n}){let r=oe();return no("div",{className:`ri-largeModelBanner ${t?"ri-largeModelBanner--offset":""}`,children:[Dt(cs,{size:14,className:"ri-largeModelBanner__icon"}),Dt("span",{children:r("largeModelWarning",{millions:Math.round(e/1e6)})}),Dt("button",{type:"button",className:"ri-largeModelBanner__dismiss",onClick:o=>{o.stopPropagation(),n()},"aria-label":r("dismiss"),children:Dt(Yw,{size:12})})]})}function t0({missing:e,total:t}){let n=oe();return no("div",{className:"ri-uvCheckerBanner",role:"status",children:[Dt(cs,{size:14,className:"ri-uvCheckerBanner__icon"}),no("span",{children:[e===t?"UV Checker: this model has no UV0 coordinates.":`UV Checker: ${e} of ${t} meshes have no UV0 coordinates.`," ",n("missingUVsAreShownInMagenta")]})]})}function n0({failure:e,source:t}){return Dt("div",{className:"ri-loadError",role:"alert",children:no("div",{className:"ri-loadError__card",children:[no("div",{className:"ri-loadError__header",children:[Dt(cs,{size:16,"aria-hidden":"true"}),Dt("span",{className:"ri-loadError__title",children:e.title})]}),Dt("p",{className:"ri-loadError__detail",children:e.detail}),Dt("p",{className:"ri-loadError__source",children:t}),e.technical&&Dt("p",{className:"ri-loadError__technical",children:e.technical})]})})}function r0({rebuilding:e,onReload:t}){let n=oe();return Dt("div",{className:"ri-contextRecovery",role:"alert",children:no("div",{className:"ri-contextRecovery__card",children:[Dt(cs,{size:24,"aria-hidden":"true"}),Dt("h2",{children:n(e?"contextRestoringTitle":"contextLostTitle")}),Dt("p",{children:n(e?"contextRestoringMessage":"contextLostMessage")}),no("button",{type:"button",onClick:t,disabled:e,children:[Dt(DE,{size:16,"aria-hidden":"true"}),n("reloadViewer")]})]})})}import{useCallback as Ec}from"react";function o0({applyBindingStyle:e,resolveObjectKey:t,onTextureUpload:n,fileInputRef:r,pendingObjectId:o,createdBlobUrls:i,texturePositioning:s,setMoveZoomTarget:l}){let c=Ec((x,v)=>{let S=i.current[x];S&&URL.revokeObjectURL(S),v.startsWith("blob:")?i.current[x]=v:delete i.current[x],e(x,y=>({...y,material:{...y?.material,texture:{path:v}}}))},[e]),u=x=>{let v=x.target.files?.[0],S=o.current;if(!v||!S)return;let y=t(S);y&&(n?n(v,y).then(k=>c(y,k),k=>console.error("onTextureUpload failed:",k)):c(y,URL.createObjectURL(v)),x.target.value="")},p=x=>{o.current=x,r.current?.click()},m=x=>{let v=t(x);if(!v)return;e(v,y=>y?.material?.texture?{...y,material:{...y.material,texture:void 0}}:y);let S=i.current[v];S&&(URL.revokeObjectURL(S),delete i.current[v])},a=!!s,f=typeof s=="object"?s:void 0,d=Ec((x,v,S)=>{if(f?.onOffsetChange){f.onOffsetChange(x,v,S);return}e(x,y=>{let k=y?.material?.texture;if(!k?.path)return y;let w=k.offset??[0,0],M=[w[0],w[1]];return M[v]=S,{...y,material:{...y?.material,texture:{...k,offset:M}}}})},[e,f]),h=Ec((x,v)=>{if(f?.onRotationChange){f.onRotationChange(x,v);return}e(x,S=>{let y=S?.material?.texture;if(!y?.path)return S;let k=(v%360+360)%360;return{...S,material:{...S?.material,texture:{...y,rotation:k*Math.PI/180}}}})},[e,f]),b=Ec(()=>{l(null),f?.onEndPositioning?.()},[f]);return{handleFileChange:u,triggerFileUpload:p,clearTexture:m,texturePositioningEnabled:a,texturePositioningOverrides:f,setMaterialTextureOffset:d,setMaterialTextureRotation:h,endMaterialTexturePositioning:b}}function i0({materialPopup:e,resolveObjectKey:t,currentObjectBindings:n,nodeRefsMap:r,moveZoomTarget:o,texturePositioningEnabled:i,texturePositioningOverrides:s,setMaterialTextureOffset:l,setMaterialTextureRotation:c,endMaterialTexturePositioning:u}){let p=e?t(e.objectId):null,m=p?n[p]?.style?.material?.texture?.path:void 0,a=m?ol(m)??m:void 0,f=Db(p?r.current[p]:null),d=i?s?.offset??(p?n[p]?.style?.material?.texture?.offset:void 0):void 0,h=i?s?.rotationDegrees??(p?((n[p]?.style?.material?.texture?.rotation??0)*180/Math.PI%360+360)%360:0):0,b=i?s?.isPositioning??!!(p&&o?.objectKey===p&&o?.textureKey==="texture"):!1;return{materialTextureUrl:a,materialTargetTakesImage:f,materialTextureOffset:d,materialTextureRotationDegrees:h,isMaterialTexturePositioning:b,materialTextureOnOffsetChange:i?l:void 0,materialTextureOnRotationChange:i?c:void 0,materialTextureOnEndPositioning:i?u:void 0}}import{useId as a0}from"react";import{Box as dm,Camera as TE,ChevronLeft as LE,ChevronRight as _E,Download as BE,FileImage as jE,Maximize as NE,Minimize as IE,Orbit as zE,Play as s0,Square as VE}from"lucide-react";import{Fragment as qi,jsx as ye,jsxs as tt}from"react/jsx-runtime";function l0({categories:e,selected:t,disabled:n,onChange:r}){let o=oe();return tt("div",{className:"ri-annotationFilters",role:"group","aria-label":o("annotationCategories"),onPointerDown:i=>i.stopPropagation(),children:[ye("span",{children:o("annotations")}),ye("button",{type:"button","aria-pressed":t===null,disabled:n,onClick:()=>r(null),children:o("all")}),e.map(i=>ye("button",{type:"button",disabled:n,"aria-pressed":t?.some(s=>s.trim()===i)??!1,onClick:()=>r(t===null?[i]:t.some(s=>s.trim()===i)?t.filter(s=>s.trim()!==i):[...t,i]),children:i||o("uncategorized")},i))]})}function c0({onCancel:e}){let t=oe();return tt("div",{className:"ri-isolationPill",role:"status",onPointerDown:n=>n.stopPropagation(),children:[ye("span",{className:"ri-isolationPill__label",children:t("decalDragHint")}),ye("button",{type:"button",className:"ri-isolationPill__button",onClick:e,children:t("cancel")})]})}function u0({label:e,onShowAll:t}){let n=oe();return tt("div",{className:"ri-isolationPill",onPointerDown:r=>r.stopPropagation(),children:[ye("span",{className:"ri-isolationPill__label",children:e}),ye("button",{type:"button",className:"ri-isolationPill__button",onClick:t,children:n("showAll")})]})}function d0({groups:e,activeVariants:t,onSelect:n}){let r=oe();return ye(qi,{children:e.map((o,i)=>tt("div",{className:"ri-variantPicker",role:"group","aria-label":o.name??r("materialVariants"),onPointerDown:s=>s.stopPropagation(),children:[o.name?ye("span",{className:"ri-variantPicker__group","aria-hidden":"true",children:o.name}):null,o.variants.map(s=>{let l=t.includes(s.name);return tt("button",{type:"button",className:`ri-variantPicker__option ${l?"ri-variantPicker__option--active":""}`,"aria-pressed":l,onClick:()=>n(s.name),children:[s.swatch?ye("span",{className:"ri-variantPicker__swatch",style:{background:s.swatch},"aria-hidden":"true"}):null,s.label]},s.name)})]},o.name??`group-${i}`))})}function p0({count:e,active:t,index:n,navigating:r,onStart:o,onPrevious:i,onNext:s,onStop:l}){let c=oe();return t?tt(qi,{children:[tt("button",{className:"ri-tourButton",onClick:i,disabled:r||e===0||n<=0,title:c("previousAnnotation"),children:[ye(LE,{size:16}),ye("span",{children:c("previous")})]}),ye("button",{className:"ri-tourButton ri-tourButton--stop",onClick:l,title:c("stopGuidedTour"),children:ye(VE,{size:16})}),tt("button",{className:"ri-tourButton ri-tourButton--next",onClick:s,disabled:r||e===0,title:c("nextAnnotation"),children:[ye("span",{children:c("next")}),ye(_E,{size:16})]})]}):ye("button",{className:"ri-navButtonSingle",onClick:o,disabled:e===0,title:c("startGuidedTour"),children:c("guidedTour")})}function m0({fullscreen:e,disabled:t}){let n=oe();return tt("div",{className:"mv-fullscreenWrapper",children:[e.error&&ye("div",{className:"mv-fullscreenError",role:"alert",children:n.message(e.error)}),ye("button",{type:"button",className:"mv-fullscreenButton",onClick:()=>{e.toggle()},disabled:e.pending||t,title:e.active?n("exitFullscreen"):n("enterFullscreen"),"aria-label":e.active?n("exitFullscreen"):n("enterFullscreen"),"aria-pressed":e.active,children:e.active?ye(IE,{}):ye(NE,{})})]})}function f0({open:e,current:t,disabled:n,onSelect:r,onToggle:o}){let i=oe();return tt("div",{className:"mv-controllersWrapper",onPointerDown:s=>s.stopPropagation(),children:[e&&tt("div",{className:"mv-controllersMenu",children:[ye("button",{type:"button",className:`mv-controllersMenuItem ${t==="orbit"?"mv-controllersMenuItem--active":""}`,onClick:()=>r("orbit"),children:i("orbitControl")}),ye("button",{type:"button",className:`mv-controllersMenuItem ${t==="pointerLock"?"mv-controllersMenuItem--active":""}`,onClick:()=>r("pointerLock"),children:i("pointLock")})]}),ye("button",{className:"mv-controllersButton",onClick:o,title:i("cameraController"),"aria-label":i("cameraControllerSettings"),disabled:n,children:ye(zE,{size:15})})]})}function g0({menu:e,recording:t,hasScene:n,canCaptureImage:r,canRecord:o,hasCinematic:i,hasMultipleModels:s=!1}){let l=oe(),c=a0(),u=a0(),{isDownloading:p,downloadMenuOpen:m,uvExportError:a,toggleDownloadMenu:f,handleDownloadMesh:d,handleDownloadSeparateMeshes:h,handleDownloadScreenshot:b,handleDownloadUvLayout:x,handleDownloadVideo:v,videoFormat:S,setVideoFormat:y,videoExportError:k}=e;return tt("div",{className:"mv-downloadWrapper",onPointerDown:w=>w.stopPropagation(),children:[m&&tt("div",{className:"mv-downloadMenu",children:[tt("button",{className:"mv-downloadMenuItem",onClick:d,disabled:p||t||!n,"aria-describedby":c,children:[ye(dm,{size:14}),l(s?"downloadCombinedGLB":"downloadGLB")]}),ye("p",{className:"mv-downloadMenuDescription",id:c,children:l("downloadGLBDescription")}),e.openConfiguredAR&&tt("button",{type:"button",className:"mv-downloadMenuItem",onClick:e.openConfiguredAR,disabled:t||!n,"aria-haspopup":"dialog",children:[ye(dm,{size:14}),l("arConfiguredButton")]}),s&&tt(qi,{children:[tt("button",{className:"mv-downloadMenuItem",onClick:h,disabled:p||t||!n,"aria-describedby":u,children:[ye(dm,{size:14}),l("downloadSeparateGLBs")]}),ye("p",{className:"mv-downloadMenuDescription",id:u,children:l("downloadSeparateGLBsDescription")})]}),ye("div",{className:"mv-downloadMenuDivider"}),r&&tt(qi,{children:[tt("button",{className:"mv-downloadMenuItem",onClick:b,disabled:t||!n,children:[ye(TE,{size:14}),l("downloadPNG")]}),ye("div",{className:"mv-downloadMenuDivider"})]}),tt("button",{className:"mv-downloadMenuItem",onClick:x,disabled:t||!n,children:[ye(jE,{size:14}),l("downloadUVLayout")]}),ye("div",{className:"mv-downloadMenuDivider"}),tt("label",{className:"mv-downloadMenuItem",children:[l("videoFormat"),tt(Ct,{"aria-label":l("videoFormat"),value:S,onChange:w=>y(w.target.value),children:[ye("option",{value:"auto",children:l("auto")}),ye("option",{value:"webm",disabled:!xr("webm"),children:"WebM"}),ye("option",{value:"mp4",disabled:!xr("mp4"),children:"MP4"}),ye("option",{value:"gif",disabled:!xr("gif"),children:"GIF"})]})]}),tt("button",{className:"mv-downloadMenuItem",onClick:()=>{v("turntable")},disabled:t||!o||!xr(S),children:[ye(s0,{size:14}),l("recordTurntableVideo")]}),i&&tt("button",{className:"mv-downloadMenuItem",onClick:()=>{v("cinematic")},disabled:t||!o||!xr(S),children:[ye(s0,{size:14}),l("recordCinematicVideo")]}),!xr()&&!xr("gif")&&ye("div",{className:"mv-downloadMenuNotice",role:"status",children:l("videoUnsupported")}),k&&ye("div",{className:"mv-downloadMenuNotice",role:"alert",children:l.message(k)}),a&&ye("div",{className:"mv-downloadMenuNotice",role:"status","aria-live":"polite",children:l.message(a)})]}),ye("button",{className:"mv-downloadButton",onClick:f,disabled:p||t||!n,title:l("downloadOptions"),children:p?tt(qi,{children:[ye("span",{className:"mv-downloadButton__spinner"}),l("exporting")]}):tt(qi,{children:[ye(BE,{size:15}),l("download")]})})]})}function b0({x:e,y:t,form:n,setForm:r,onOk:o,onCancel:i}){let s=oe();return tt("div",{className:"ri-annotationPopup",style:{left:e,top:t},onPointerDown:l=>l.stopPropagation(),onClick:l=>l.stopPropagation(),children:[ye("input",{autoFocus:!0,className:"ri-annotationInput",placeholder:s("annotationTitlePlaceholder"),value:n.title,onChange:l=>r(c=>({...c,title:l.target.value})),onKeyDown:l=>{l.key==="Enter"&&o(),l.key==="Escape"&&i()}}),ye("textarea",{className:"ri-annotationTextarea",placeholder:s("description"),value:n.description,onChange:l=>r(c=>({...c,description:l.target.value})),onKeyDown:l=>{l.key==="Escape"&&i()},rows:5}),tt("div",{className:"ri-annotationActions",children:[ye("button",{onClick:o,className:`ri-annotationOkBtn ${n.title.trim()?"":"disabled"}`,disabled:!n.title.trim(),children:s("ok")}),ye("button",{onClick:i,className:"ri-annotationCancelBtn",children:s("cancel")}),ye("div",{className:"ri-annotationIcons"})]})]})}import{useEffect as FE,useState as h0}from"react";import{Fragment as Dc,jsx as at,jsxs as nt}from"react/jsx-runtime";function v0({section:e,onChange:t}){let{isInsideEditor:n,tier:r}=Wr(),o=n&&!xl(r,"sectionPlanes"),[i,s]=h0(""),l=e.mode??"plane",c=e.planes??[],u=c.find(d=>d.id===e.activePlaneId)??c[0],p=l==="planes"?u:e,m=d=>t(l==="planes"?{planes:c.map(h=>h.id===u?.id?{...h,...d}:h)}:d),a={x:0,y:1,z:2},f=()=>globalThis.crypto?.randomUUID?.()??`section-${Date.now()}-${Math.random().toString(36).slice(2)}`;return nt("div",{className:"ri-sectionControls",children:[o?at(_h,{requiredTier:"starter",feature:"Multiple planes and section boxes"}):null,nt("label",{children:["Cut type",nt(Ct,{value:l,disabled:o,onChange:d=>{let h=d.target.value;t({mode:h,...h==="planes"&&!c.length?{planes:[{id:"cut-1",name:"Plane 1",axis:e.axis,position:e.position,flip:e.flip,enabled:!0,...e.normal?{normal:e.normal}:{}}],activePlaneId:"cut-1"}:{}})},children:[at("option",{value:"plane",children:"Single plane"}),at("option",{value:"planes",children:"Multiple planes"}),at("option",{value:"box",children:"Section box"})]})]}),l==="planes"&&nt(Dc,{children:[nt("label",{children:["Active plane",at(Ct,{value:u?.id??"",onChange:d=>t({activePlaneId:d.target.value}),children:c.map(d=>nt("option",{value:d.id,children:[d.name,d.enabled?"":" (off)"]},d.id))})]}),nt("div",{className:"ri-sectionControls__actions",children:[at("button",{type:"button",disabled:c.length>=6,onClick:()=>{let d=f();t({planes:[...c,{id:d,name:`Plane ${c.length+1}`,axis:"x",position:.5,flip:!1,enabled:!0}],activePlaneId:d})},children:"Add plane"}),at("button",{type:"button",disabled:!u,onClick:()=>t({planes:c.filter(d=>d.id!==u?.id),activePlaneId:c.find(d=>d.id!==u?.id)?.id}),children:"Remove plane"})]}),u&&nt(Dc,{children:[nt("label",{children:["Name",at("input",{value:u.name,maxLength:200,onChange:d=>m({name:d.target.value.trim()||"Plane"})})]}),nt("label",{className:"ri-sectionControls__check",children:[at("input",{type:"checkbox",checked:u.enabled,onChange:d=>m({enabled:d.target.checked})}),"Enable this plane"]})]})]}),l==="box"?nt(Dc,{children:[nt("label",{children:["Draggable face",at(Ct,{value:e.activePlaneId?.match(/^[xyz]-(min|max)$/)?e.activePlaneId:"x-min",onChange:d=>t({activePlaneId:d.target.value}),children:["x","y","z"].flatMap(d=>["min","max"].map(h=>nt("option",{value:`${d}-${h}`,children:[d.toUpperCase()," ",h]},`${d}-${h}`)))})]}),at("div",{className:"ri-sectionControls__bounds",children:["x","y","z"].flatMap(d=>["min","max"].map(h=>{let b=(e.box??{min:[0,0,0],max:[1,1,1]})[h][a[d]];return nt("label",{children:[d.toUpperCase()," ",h,nt("output",{children:[Math.round(b*100),"%"]}),at("input",{"aria-label":`${d.toUpperCase()} ${h}`,type:"range",min:"0",max:"1",step:".001",value:b,onChange:x=>t(vc(e,`${d}-${h}`,Number(x.target.value)))})]},d+h)}))}),nt("label",{className:"ri-sectionControls__check",children:[at("input",{type:"checkbox",checked:!!e.invertBox,onChange:d=>t({invertBox:d.target.checked})}),"Keep outside box"]})]}):p&&nt(Dc,{children:[nt("label",{children:["Orientation",nt(Ct,{value:p.normal?"custom":p.axis,onChange:d=>d.target.value==="custom"?m({normal:[1,1,0]}):m({axis:d.target.value,normal:void 0}),children:[at("option",{value:"x",children:"X"}),at("option",{value:"y",children:"Y"}),at("option",{value:"z",children:"Z"}),at("option",{value:"custom",children:"Angled plane"})]})]}),p.normal&&at("div",{className:"ri-sectionControls__vector",children:[0,1,2].map(d=>nt("label",{children:["Normal ","XYZ"[d],at(HE,{label:`Normal ${"XYZ"[d]}`,value:p.normal[d],onChange:h=>{let b=[...p.normal];b[d]=h,Math.hypot(...b)>1e-8&&m({normal:b})}})]},d))}),nt("label",{children:["Position",nt("output",{children:[Math.round(p.position*100),"%"]}),at("input",{type:"range",min:"0",max:"1",step:".001","aria-label":"Section position",value:p.position,onChange:d=>m({position:Number(d.target.value)})})]}),nt("label",{className:"ri-sectionControls__check",children:[at("input",{type:"checkbox",checked:p.flip,onChange:d=>m({flip:d.target.checked})}),"Keep the other side"]})]}),nt("details",{children:[nt("summary",{children:["Saved section presets (",e.presets?.length??0,")"]}),nt("form",{onSubmit:d=>{d.preventDefault();let h=i.trim();!h||(e.presets?.length??0)>=32||(t({presets:[...e.presets??[],{id:f(),name:h,settings:od(e)}]}),s(""))},children:[nt("label",{children:["Preset name",at("input",{value:i,maxLength:200,onChange:d=>s(d.target.value)})]}),at("button",{disabled:!i.trim()||(e.presets?.length??0)>=32,children:"Save current section"})]}),e.presets?.map(d=>nt("div",{className:"ri-sectionControls__actions",children:[at("button",{type:"button",onClick:()=>t({...od(d.settings),normal:d.settings.normal,planes:d.settings.planes,activePlaneId:d.settings.activePlaneId,box:d.settings.box,invertBox:d.settings.invertBox,mode:d.settings.mode}),children:d.name}),at("button",{type:"button","aria-label":`Delete preset ${d.name}`,onClick:()=>t({presets:e.presets?.filter(h=>h.id!==d.id)}),children:"Delete"})]},d.id))]}),at("p",{children:"Visual cuts of the active asset. Multiple planes keep their common region. Presets are saved with your scene."})]})}function HE({label:e,value:t,onChange:n}){let[r,o]=h0(String(t));return FE(()=>o(String(t)),[t]),at("input",{type:"number",step:".1","aria-label":e,value:r,onChange:i=>{let s=i.target.value;o(s),s.trim()&&Number.isFinite(Number(s))&&n(Number(s))},onBlur:()=>o(String(t))})}import{useState as GE}from"react";import{Box as UE,ChevronDown as $E,Expand as WE,Grid3X3 as XE,Pause as qE,Play as KE,QrCode as QE,RectangleGoggles as JE,Slice as YE,Smartphone as y0,Square as ZE,X as eD}from"lucide-react";import{jsx as Be,jsxs as nr}from"react/jsx-runtime";function x0({top:e,configuredHandoff:t=!1,xrStore:n,arSupported:r,vrSupported:o,quickLookSupported:i,mobileHandoffUrl:s,mobileHandoffOpen:l,onQuickLook:c,onOpenMobileHandoff:u}){let p=oe();return nr("div",{className:"ri-xrTools",style:{top:`${e}px`},children:[!r&&i&&nr("button",{type:"button",className:"ri-xrButton",onClick:c,title:p("viewThisModelInARWithAppleQuickLook"),children:[Be(UE,{size:16}),p("viewInAR")]}),(s||t&&!i)&&nr("button",{type:"button",className:"ri-xrButton",onClick:u,title:p(t?"arConfiguredTitle":"openThisExperienceOnAPhoneForAR"),"aria-haspopup":"dialog","aria-expanded":l,children:[Be(QE,{size:16}),Be("span",{children:p(t?"arConfiguredButton":"openOnPhone")})]}),n&&r&&nr("button",{type:"button",className:"ri-xrButton",onClick:()=>n.enterAR().catch(m=>{console.error("Failed to enter AR session:",m)}),title:p("viewThisModelInYourSpace"),children:[Be(y0,{size:16}),Be("span",{children:p("enterAR")})]}),n&&o&&nr("button",{type:"button",className:"ri-xrButton",onClick:()=>n.enterVR().catch(m=>{console.error("Failed to enter VR session:",m)}),title:p("viewThisModelInVR"),children:[Be(JE,{size:16}),Be("span",{children:p("enterVR")})]})]})}function w0({url:e,onClose:t}){let n=oe();return Be("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:r=>{r.target===r.currentTarget&&t()},children:nr("section",{className:"ri-mobileHandoffDialog",role:"dialog","aria-modal":"true","aria-labelledby":"ri-mobileHandoffTitle",children:[Be("button",{type:"button",className:"ri-mobileHandoffClose",onClick:t,"aria-label":n("closePhoneHandoff"),children:Be(eD,{size:18})}),Be(y0,{size:22,"aria-hidden":"true"}),Be("h2",{id:"ri-mobileHandoffTitle",children:n("viewInAR")}),Be("p",{children:n("arScanCode")}),Be("div",{className:"ri-mobileHandoffQr",children:Be(Al,{value:e,size:208,level:"M",marginSize:4,title:n("qrCodeToOpenThisModelOnAPhone")})})]})})}function S0({top:e,active:t,onToggle:n}){let r=oe();return Be("div",{className:"ri-uvCheckerTools",style:{top:`${e}px`},children:Be("button",{type:"button",className:`ri-measureButton ${t?"ri-measureButton--active":""}`,onClick:n,title:r(t?"disableUVChecker":"enableUVChecker"),"aria-label":r(t?"disableUVChecker":"enableUVChecker"),"aria-pressed":t,children:Be(XE,{size:16})})})}function C0({top:e,open:t,factor:n,onToggleOpen:r,onFactorChange:o}){let i=oe();return nr("div",{className:"ri-explodeTools",style:{top:`${e}px`},children:[Be("button",{type:"button",className:`ri-measureButton ${t||n>0?"ri-measureButton--active":""}`,onClick:r,title:i("explodedView"),"aria-pressed":t,children:Be(WE,{size:16})}),t&&Be("div",{className:"ri-explodeSlider",onPointerDown:s=>s.stopPropagation(),children:Be("input",{type:"range",min:0,max:100,value:Math.round(n*100),onChange:s=>o(Number(s.target.value)/100),"aria-label":i("explodeAmount")})})]})}function M0({top:e,section:t,onChange:n}){let r=oe(),[o,i]=GE(!1);return nr("div",{className:"ri-sectionTools",style:{top:`${e}px`},children:[Be("button",{type:"button",className:`ri-measureButton ${t.enabled?"ri-measureButton--active":""}`,onClick:()=>n({enabled:!t.enabled}),title:t.enabled?r("removeSectionCut"):r("sectionCut"),"aria-label":r("sectionCut"),"aria-pressed":t.enabled,children:Be(YE,{size:16})}),t.enabled&&Be("button",{type:"button",className:"ri-measureButton","aria-label":"Section settings",title:"Section settings","aria-expanded":o,onClick:()=>i(s=>!s),children:Be($E,{size:14})}),t.enabled&&o&&Be("div",{className:"ri-sectionPanel",onPointerDown:s=>s.stopPropagation(),children:Be(v0,{section:t,onChange:n})})]})}function P0({top:e,playing:t,disabled:n,onPlay:r,onPause:o,onStop:i}){let s=oe();return nr("div",{className:"ri-cinematicTools",style:{top:`${e}px`},children:[Be("button",{type:"button",className:`ri-measureButton ${t?"ri-measureButton--active":""}`,disabled:n,onClick:t?o:r,title:s(t?"pauseCinematic":"playCinematic"),"aria-pressed":t,children:t?Be(qE,{size:16}):Be(KE,{size:16})}),t&&Be("button",{type:"button",className:"ri-measureButton ri-measureButton--stop",onClick:i,title:s("stopCinematicAndResetCamera"),children:Be(ZE,{size:16})})]})}function k0({progress:e,onCancel:t}){let n=oe();return Be("div",{className:"ri-recordingOverlay",onPointerDown:r=>r.stopPropagation(),children:nr("div",{className:"ri-isolationPill",role:"status","aria-live":"polite",children:[Be("span",{className:"ri-isolationPill__label",children:n("recordingVideo",{progress:e})}),Be("button",{type:"button",className:"ri-isolationPill__button",onClick:t,children:n("cancel")})]})})}function R0(e){let t={total:0,missing:0};return e.traverse(n=>{let r=n;!r.isMesh||!r.geometry||(t.total+=1,r.geometry.getAttribute("uv")||(t.missing+=1))}),t}import{useEffect as tD}from"react";function A0({enabled:e,canvasAreaElement:t,fitAttemptedRef:n,fitInFlightRef:r,controlsRef:o,cameraFramingRef:i,nodeRefsMap:s,fitScene:l}){tD(()=>{if(!e)return;let c=t;if(!c)return;let u=null,p=new ResizeObserver(()=>{!n.current||r.current||(u&&clearTimeout(u),u=setTimeout(()=>{let m=o.current,a=i.current;if(a.kind==="view"&&m){if(cv(m,a.target))return}else if(a.kind==="object"&&m){let f=s.current[a.key];if(f&&lv(m,f)){m.fitToBox(f,!0,Pl).catch(()=>{});return}}l()},150))});return p.observe(c),()=>{p.disconnect(),u&&clearTimeout(u)}},[t,l,e])}import{Fragment as pm,jsx as q,jsxs as Tn}from"react/jsx-runtime";var lD=nD(()=>import("./StreamingTilesModel-IM2DDWO5.mjs"));function us(e){let n=e.split(/[?#]/)[0].split("/");return(n[n.length-1]||e).replace(/\.[^./]+$/,"")||e}var uD=Object.freeze({}),dD=[],pD={};function mD(e){let t=yv(Nh(e)),n=t.props,r=Nl(n.activeModelId??Ae(n.models?.find(b=>b.url===n.modelUrl)??{url:n.modelUrl}),n.tilesetUrl),o=le(r);o.current=r;let i=le(null),s=le(null),l=de(()=>{let b=s.current;b&&(i.current=b.snapshot())},[]),c=ty(l),u=oy(e),[p,m]=be(null);Ee(()=>()=>{p&&URL.revokeObjectURL(p)},[p]);let a=()=>{l();let b=o.current;s.current?.captureFrame().then(x=>{x&&(b===o.current?m(x):URL.revokeObjectURL(x))})};hr(()=>{i.current=null,m(null)},[r]);let f=le(null),d=nh({loading:n.loading,reveal:n.reveal,rootRef:f,onPark:a}),{release:h}=c;return Ee(()=>{d.live||h()},[d.live,h]),q(Wg,{labels:e.labels,children:Tn("div",{className:"ri-viewerSlot",ref:f,children:[t.error&&q("div",{className:"ri-configuredARError",role:"alert",children:t.error}),d.live?q(gD,{...n,contextRecovery:c,engagement:u,resumeRef:i,viewerHandleRef:s,offscreen:!d.visible,frame:p},c.generation):q(rh,{className:"ri-viewer",background:fd(n.backgroundColor,n.sceneConfig),poster:p??n.poster,onReveal:d.awaitingReveal?d.reveal:void 0})]})})}var fD={};function gD({labels:e,contextRecovery:t,engagement:n,modelUrl:r,tilesetUrl:o,tilesErrorTarget:i=8,tilesCacheSize:s=800,onObjectCatalog:l,modelFormat:c,licenseKey:u,licenseValidationUrl:p,onLicenseStatusChange:m,hideLicenseCheckingOverlay:a=!1,objectBindings:f="auto",selectedObject:d,comparisonHighlights:h,multiSelectedKeys:b,selectedObjectRefs:x,selectedObjectOutlineColor:v,panelHoveredObject:S,onObjectBindingsChange:y,onObjectSelect:k,onObjectHover:w,onObjectDoubleClick:M,onDecalDoubleClick:E,onObjectContextMenu:P,decalMove:O,onObjectEditLeaseChange:R,onSelectionClear:A,onEmptyCanvasClick:D,onSceneLoaded:B,onModelLoaded:V,onAssetDiagnostics:$,onRuntimeStats:U,runtimeStatsIntervalMs:T,onLoadError:L,onProgress:W,onCameraControllerChange:ee,cameraControllerType:Z,onAction:Q,onHiddenObjectsChange:te,onCameraChange:X,onViewerReady:F,onTextureUpload:I,onAnimationsReady:Y,onSequencesReady:re,showSequenceControls:Fe=!0,sequenceAutoPlay:K=!0,onModelAnimationsReady:we,onAnnotationsChange:Pe,activeAnnotation:xe,onActiveAnnotationChange:wt,camera:pt,cameraLimits:Tt,backgroundColor:ae,shadows:ke=!0,showObjectBindingDataPanel:Ye=!0,customObjectBindingDataPanel:ie,customSceneObjectsPanel:He,showSceneObjectsPanel:Ge=!0,showDownloadButton:he=!0,downloadFilename:Re="model",showResetButton:De=!0,showFullscreenButton:Ue=!1,showLoadingOverlay:Lt=!0,showMouseController:Nt=!1,mouseControllerPosition:Mn="center-bottom",mouseControllerOpacity:pn=1,moveSensitivity:Ln=.08,zoomSensitivity:Wo=1,sceneConfig:Pn,onSceneConfigChange:ce,disableZoom:ve=!1,pageScroll:qe=!1,zoomOnSelected:ze=!0,highlightOnHover:$e=!0,enableCameraControls:$t=!0,onAutoFit:ft,refitOnResize:It=!0,renderMode:vt="demand",maxDpr:mn=2,preserveDrawingBuffer:_n=!1,webgpu:fn=!1,performanceProfile:Wt="auto",dracoDecoderPath:zt,ktx2TranscoderPath:yt,meshopt:Rt=!0,showMeasureTools:rn=!1,showUvCheckerButton:Vt=!1,showExplodeControls:Bn=!1,showMaterialVariants:Yt=!0,showObjectNavigator:Xo=!0,showSectionTools:qo=!1,isolation:Un,onIsolationChange:Ki,showIsolateControls:rr=!1,cinematic:or,measurementUnit:oo="m",measurements:ps,onMeasurementsChange:io,measurementSettings:ms,measurementModelId:jc,onMeasurementSettingsChange:ao,enableXR:_=!1,usdzUrl:N,arScaleMode:z="normalized",mobileHandoffUrl:J,arHandoff:H,arLanding:ne=!1,showAnnotationNavigation:pe=!0,showAnnotationOnHover:ot=!1,showAnnotationFilters:Xe=!0,annotationCategories:St,onAnnotationCategoriesChange:gt,moveModeEnabled:Ve=!1,scaleModeEnabled:bt=!1,gizmoTool:Se,showFloorGrid:_t=!1,productOptions:Zt,objectTransformSpace:gn="world",enableKeyboardNavigation:ir=!1,reducedMotion:on="user",showViewGizmo:en=!1,overlay:Ko,unsafe_sceneChildren:gm,autoRotate:j0,autoRotateSpeed:N0,onTexturePositioningChange:Nc,endTexturePositioningRef:fs,texturePositioning:bm,extraModelUrls:I0,onExtraModelError:hm,onExtraModelLoaded:gs,originalNodePoses:z0,models:je,mergeModels:Ic,onMergeModelLoaded:vm,onMergeModelError:ym,poster:zc,resumeRef:xm,viewerHandleRef:Vc,offscreen:V0,frame:Fc,onModelChange:wm,activeModelId:F0,onActiveModelChange:Hc}){let Xt=oe(),ge=F0??Ae(je?.find(g=>g.url===r)??{url:r}),Sm=je?.find(g=>Ae(g)===ge)?.visible!==!1,jn=Nl(ge,o),[Bt]=be(()=>xm.current?.model===jn?xm.current:null),Er=Oh(on);Ee(()=>()=>n.interrupt(),[n]);let Cm=le(n);Cm.current=n;let{autoBindings:Gc,controlled:Mm,currentBindings:Me,applyBindings:Nn,bindingsForModel:so,modelEdits:H0}=Hv({modelUrl:r,activeModelId:ge,tilesetUrl:o,models:je,objectBindings:f,onChange:y,initialBindings:Bt?.objectBindings,initialModelEdits:Bt?.modelBindingEdits}),{isInsideEditor:kn,activeTab:G0,activeSubTab:U0,annotating:bs,openMeasurementsPanel:$0,xrToolsTarget:Pm}=Wr(),W0=kn&&G0==="scene"&&U0==="lighting",Qo=tv(u,p,m),[Uc,X0]=be(()=>Bt?.lightEdits??{}),[hs,km]=be(Bt?.variantEdit),[vs,Rm]=be(Bt?.sectionEdit),[ys,Am]=be(()=>Bt?.measurementEdits??{}),$c=JSON.stringify(Pn?.measurements??null),Om=le(new Map);Ee(()=>{let g=Om.current.get(jn);Om.current.set(jn,$c),g!==void 0&&g!==$c&&Am(C=>{let j={...C};return delete j[jn],j})},[jn,$c]);let Ce=rt(()=>{let g=Gd(Pn??al,Uc);return hs!==void 0&&(g={...g,model:ad(g.model,hs)}),vs!==void 0&&(g={...g,section:{...Sa,...g.section,...vs}}),ys[jn]&&(g={...g,measurements:ys[jn]}),g},[Pn,Uc,hs,vs,ys,jn]),Em=Ce.camera?.limits,Qi=rt(()=>fh(Tt??Em),[Em,Tt]),Jo=le(Ce);Jo.current=Ce;let Ji=de(g=>{let C=Jo.current,j={settings:{},items:[],...C.measurements,...g};ce?ce({...C,measurements:j}):Am(G=>({...G,[jn]:j}))},[jn,ce]),Dm=de(g=>{io?io(g):Ji({items:g})},[io,Ji]),Tm=de(g=>{ao?ao(g):Ji({settings:g})},[ao,Ji]),xs=ps??Ce.measurements?.items??dD,Yi=ms??Ce.measurements?.settings??pD,Wc=jc??Ca(ge),Zi=ul(Yi,oo),Xc=rt(()=>mr(Ce.model),[Ce.model]);Ee(()=>{n.setActiveVariants(Xc)},[Xc,n]);let q0=Pn?mr(Pn.model).join(`
|
|
65
|
+
`):"";hr(()=>{km(void 0)},[q0,ge,r]);let K0=JSON.stringify(Pn?.section??null);hr(()=>{Rm(void 0)},[K0,ge,r]);let Lm=de(g=>{if(ce){let C=Jo.current;ce({...C,section:{...Sa,...C.section,...g}});return}Rm(C=>({...C,...g}))},[ce]),[_m,Q0]=be(!1),Bm=le([]),J0=de(g=>{let C=Jo.current,j=mr(C.model),G=Bm.current,se=G.find(_e=>_e.variants.some(Ie=>Ie.name===g)),Oe=j.find(_e=>se?se.variants.some(Ie=>Ie.name===_e):_e===g)??null,Te=j.includes(g)?j.filter(_e=>_e!==g):gb(j,g,G);if(n.chooseVariant(Te.includes(g)?g:null,Oe,se?.name??null),ce){ce({...C,model:ad(C.model,Te)});return}km(Te)},[ce,n]),jm=de(g=>{if(ce){ce(Gd(Jo.current,g));return}X0(C=>{let j={...C};for(let[G,se]of Object.entries(g))j[G]={...C[G],...se};return j})},[ce]),[qc,Nm]=be(null),[Kc,Im]=be(null),[zm,Vm]=be(null),Fm=le(0),[Qc,Hm]=be(null),[Gm,Um]=be(Bt?.uvCheckerOverride??null),ea=Ce.model.renderer==="uv-checker",Jc=Vt?Gm??ea:ea,an=rt(()=>{let g=Jc?"uv-checker":ea?"pbr":Ce.model.renderer;return g===Ce.model.renderer?Ce:{...Ce,model:{...Ce.model,renderer:g}}},[ea,Ce,Jc]);hr(()=>{Um(null)},[ge,r,Ce.model.renderer,Vt,o]);let Yc=rt(()=>fd(ae,Ce),[ae,Ce]),ws=rt(()=>({dracoDecoderPath:zt,ktx2TranscoderPath:yt,meshopt:Rt}),[zt,yt,Rt]),Y0=rt(()=>Vb(Wt),[Wt]),Le=le(null),[lo,Z0]=be(null),[$m,eS]=be(()=>Bt&&Bt.cameraControllerType!=="pointerLock"?Bt.cameraControllerType:"orbit"),[tS,Wm]=be(!1),co=Z!==void 0?Z:$m,Ss=de(g=>{Wm(!1),g!==co&&(eS(g),ee?.(g))},[co,ee]),[ta,Xm]=be(!1),qm=le({dragging:!1,endedAt:-1/0}),Km=de(g=>{qm.current={dragging:g,endedAt:g?-1/0:performance.now()},Xm(g)},[]),[tn,na]=be(null),ra=!!(bm||Nc||fs),Qm=le(Nc);Qm.current=Nc,Ee(()=>{Qm.current?.(tn)},[tn]),Ee(()=>{if(fs)return fs.current=()=>na(null),()=>{fs.current=null}},[]),Ee(()=>{Le.current&&(Le.current.dollySpeed=Math.max(Wo,0))},[Wo]),Ee(()=>{Le.current&&(Le.current.enabled=$t&&!ta&&!_m&&!tn)},[$t,ta,_m,tn]);let Zc=le(null),eu=le(new Map),Jm=le(null),nS=le(null),qt=le(null),Ym=le({});Ee(()=>()=>{for(let g of Object.values(Ym.current))URL.revokeObjectURL(g)},[]);let Ft=le({}),Yo=le(Da),[rS,oS]=be(0),tu=de(()=>{oS(g=>g+1)},[]),Dr=le({}),ut=!!(je&&je.length>=1&&!o),Cs=le(je);Cs.current=je;let Ms=le(new Map),{scenesByUrlRef:uo,cameraHomesByUrlRef:In,materialRefsByUrlRef:Zm,getMaterialRefsForUrl:iS}=zv(ut,je),Ps=le(null),ef=le(null),ks=Yv(Ue),zn=le(null),[nu,aS]=be(null),sS=de(g=>{zn.current=g,aS(g)},[]),Rs=le(null),[ar,oa]=be({}),[tf,ru]=be(null),[As,ou]=be(null),[lS,cS]=be(null),[uS,dS]=be(null),[Ht,iu]=be(null),[pS,mS]=be({}),Ne=le(null),au=le(null),su=le(!1),nf=le(r);nf.current=r;let Os=le(null),lu=le($);lu.current=$;let Tr=le(null),Zo=le(0);Kw({canvasAreaElement:nu,controlsRef:Le,sceneSizeRef:Zo,invalidate:()=>qt.current?.invalidate(),enabled:ir&&$t&&!Ve&&!bt});let rf=le(null),[fS,gS]=be(0),$n=le(!1),ia=le(!1),aa=le(null),Es=le(!!pt);Es.current=!!pt;let Vn=le(null),Ds=le(Bt?.camera?{camera:Bt.camera,home:Bt.home}:null),[Ts,po]=be(!!r),[Lr,mo]=be(!r||!!ft||!!pt),[Ke,of]=be(!1),sa=!!Qi?.insideModel,af=!sa&&!!Qi?.aroundModel,[cu,uu]=be(null),[ei,du]=be(null),ti=rt(()=>cu?{...Qi,...cu}:Qi,[cu,Qi]),sf=le(ti);sf.current=ti;let[la,lf]=be([]),[ca,pu]=be(!1),[fo,mu]=be(null),[cf,ni]=be(!1),[bS,hS]=be(0),fu=le(""),uf=le(new Set),df=le(""),[pf,mf]=be(!1),gu=le(new Set),[ff,vS]=be(0),[bu,yS]=be(null),[xS,gf]=be(!1),[hu,bf]=be({total:0,missing:0}),[wS,hf]=be("loadingModel"),[SS,vu]=be(null),CS=ah(SS),Wn=le({}),ri=de(()=>{let g=Le.current;if(!g||Vn.current)return;Vn.current=Vg(g,Tr.current??Ne.current);let C=aa.current;C?.usesSlots&&(In.current[C.url]=Vn.current)},[In]),[oi,vf]=be(()=>Bt?.explodeFactor??0),[MS,yf]=be(!1);hr(()=>{vf(0),yf(!1)},[ge,r,o]);let Xn=rt(()=>{let g=Ce.cinematic,C=g?.enabled?{waypoints:g.waypoints,duration:g.duration,loop:g.loop,autoPlay:g.autoPlay}:null;return or===void 0?C&&(C.waypoints?.length??0)>=2?C:null:or===!1?null:or===!0?C??{}:{...C??{},...or}},[or,Ce]),[ua,Kt]=be(!1),[xf,_r]=be(!1),yu=le(!1);Ee(()=>{Kt(!1),_r(!1),yu.current=!1},[ge,r,o]),Ee(()=>{if(!(!Xn?.autoPlay||yu.current)&&Ke&&Lr&&!Ts){if(yu.current=!0,Er)return;Kt(!0),_r(!1)}},[Xn,Ke,Lr,Ts,Er]);let PS=de(()=>{Kt(!1),_r(!0)},[]),{captureVideo:xu,cancelVideo:wu,isRecording:wf,recording:st,progress:kS,onProgress:Sf}=Jv({rendererCaptureRef:qt,controlsRef:Le,cinematicConfig:Xn,ready:t.status==="ready"&&Ke&&Lr&&!Ts,modelUrl:`${ge}|${o??""}`,onCaptureStart:PS});Ee(()=>{t.status==="lost"&&(n.interrupt(),wu(),Kt(!1),Le.current?.stop())},[t.status,wu,n]);let sn=rt(()=>mv(()=>Kt(!1)),[ge,r]),Su=rt(()=>({current:null}),[ge,r]),[Cf,Mf]=be(()=>new Map),Ls=de((g,C)=>{Mf(j=>j.get(g)===C?j:new Map(j).set(g,C))},[]),Pf=le(Y);Pf.current=Y;let kf=le(we);kf.current=we;let Cu=le(re);Cu.current=re;let Rf=de(g=>{Su.current=g,Pf.current?.(g),ut||Ls(ge,g)},[Su,ut,Ls,ge]),RS=de((g,C)=>{Ls(g,C),kf.current?.(g,C)},[Ls]),ii=rt(()=>{try{return Js(Ce.sequences??[])}catch{return[]}},[Ce.sequences]),ai=rt(()=>(ut&&je?je:[{url:r,id:ge}]).flatMap(C=>{let j=Ae(C),G=Cf.get(j);return!G||C.visible===!1?[]:[{id:j,label:C.label||us(C.url),controls:G,config:j===ge?Ce.animations:(C.sceneConfig??Ce).animations}]}),[ut,je,r,ge,Cf,Ce]),Af=JSON.stringify(ut&&je?je.map(Ae):[ge]),Mu=rt(()=>Ol(ai,ii),[ai,ii]),[AS,OS]=be(""),_s=Mu.find(g=>g.id===AS),ES=g=>{OS(g);let C=Mu.find(j=>j.id===g);if(C)La(C,ai,sn,!0);else{sn.stop();for(let G of ai)G.controls.stop(),G.config?.autoplayClip&&G.controls.play(G.config.autoplayClip);let j=ii.find(G=>G.autoPlay);j&&sn.play(j.id)}};Ee(()=>{let g=new Set(JSON.parse(Af));Mf(C=>[...C.keys()].every(j=>g.has(j))?C:new Map([...C].filter(([j])=>g.has(j))))},[Af]);let{xrStore:DS,xrRuntime:Pu,xrResolving:TS,inARSession:ku,presenterRef:LS,arSupported:Bs,checkingAR:_S,vrSupported:Of,quickLookSupported:js,resolvedMobileHandoffUrl:Ns,isMobileHandoffOpen:Ef,arOverlay:BS,openMobileHandoff:jS,closeMobileHandoff:NS,openQuickLook:IS,handleARStateChange:zS}=Qy({enableXR:_,usdzUrl:N,mobileHandoffUrl:J,configuredHandoff:!!H,engagement:n,animationControls:Ke?q(Av,{sources:ai,sequences:ii,sequenceControls:sn}):null});Ee(()=>(Cu.current?.(Ke?sn:null),()=>Cu.current?.(null)),[sn,Ke]),Ee(()=>()=>sn.destroy(),[sn]),Ee(()=>{Er&&sn.pause()},[sn,Er]);let si=Kb(fn),Df=le(si);Df.current=si;let Br=si==="webgpu",da=Br?null:DS,Tf=qo||Ce.section?.enabled===!0;Ee(()=>{if(!Br)return;let g=[Tf&&"the section cut",(Ve||bt)&&"the transform gizmo"].filter(Boolean);g.length!==0&&console.info(`[react-immersive] With WebGPU, ${g.join(" and ")} ${g.length>1?"aren't":"isn't"} available; ${g.length>1?"they need":"it needs"} WebGL.`)},[Br,Tf,Ve,bt]);let{annotations:wD,pendingAnnotation:go,setPendingAnnotation:Lf,annotationForm:VS,setAnnotationForm:Ru,currentAnnotationIndex:FS,isNavigating:HS,localAnnotationCategories:GS,selectedAnnotationCategories:US,visibleAnnotations:_f,availableAnnotationCategories:$S,annotationFiltersVisible:Au,changeAnnotationCategories:WS,sortedAnnotations:Ou,currentAnnotation:Bf,setActiveAnnotation:SD,focusAnnotation:CD,startGuidedTour:XS,goToPreviousAnnotation:qS,goToNextAnnotation:KS,stopGuidedTour:QS,closeViewingAnnotation:Is,activeAnnotation:MD,activeViewingAnnotation:zs,isGuidedTourActive:bo,handleAnnotationOk:JS,handleAnnotationCancel:YS,handleAnnotationMarkerClick:jf}=Uw({sceneAnnotations:Pn?.annotations,controlledAnnotationCategories:St,onAnnotationCategoriesChange:gt,showAnnotationFilters:Xe,initialCategories:Bt?.annotationCategories??null,controlledActiveAnnotation:xe,onActiveAnnotationChange:wt,onAnnotationsChange:Pe,controlsRef:Le,sceneRef:Ne,annotationWorldPositionsRef:eu,tourCameraOffsetRef:Zc,initialCameraStateRef:Vn,engagement:n,engagementRef:Cm}),ZS=Ce.section??Sa,Nf=!ne&&Yt&&Ke&&la.length>0;Bm.current=la;let If=!ne&&(De||he||Ue&&ks.supported||pe&&Ou.length>0);Wn.current=Me,Ee(()=>{if(!tn)return;let g=Me[tn.objectKey]?.style?.material?.[tn.textureKey]?.path;(!ra||!g)&&na(null)},[Me,ra,tn]);let Eu=le({}),[Vs,eC]=be({});Ee(()=>{let g={...Vs},C=!1,j=new Set;for(let[G,se]of Object.entries(Me)){j.add(G);let Oe=se.style?.material,Te=Eu.current[G]??{},_e={};for(let mt of Pa){let jt=Oe?.[mt]?.path;jt&&(_e[mt]=jt,jt!==Te[mt]&&(g[G]!==mt&&(C=!0),g[G]=mt))}let Ie=g[G];if(Ie&&!_e[Ie]){let mt=Pa.find(jt=>!!_e[jt]);mt?g[G]=mt:delete g[G],C=!0}Eu.current[G]=_e}for(let G of Object.keys(g))j.has(G)||(delete g[G],delete Eu.current[G],C=!0);C&&eC(g)},[Me]);let Fs=rt(()=>Object.entries(Me).map(([g,C])=>JSON.stringify([g,C.modelObjectId,C.transform??null])).sort().join(""),[Me]);Ee(()=>{let g=Ne.current;if(!(sa||af)||!Ke||!g){uu(null),du(null);return}let C=new E0().setFromObject(g);if(C.isEmpty())return;du(null);let j=new AbortController;if(sa&&!gl(g)&&Dv(g,C.clone(),j.signal).then(G=>{!j.signal.aborted&&Ne.current===g&&du(G)}).catch(()=>{}),sa){let G=C.getSize(new ro).multiplyScalar(.02);C.min.add(G),C.max.sub(G),uu({panBoundary:[C.min.toArray(),C.max.toArray()],boundaryEnclosesCamera:!0})}else{let G=C.getBoundingSphere(new aD).radius;uu({panBoundary:[C.min.toArray(),C.max.toArray()],minDistance:G*.5,maxDistance:Math.max(G*4,.01),maxPolarAngle:90})}return()=>j.abort()},[sa,af,Ke,ge,Fs]),Ee(()=>{let g=lo;if(!g||!ei)return;let C=new ro,j=new ro,G=()=>{g.getTarget(C,!0),g.getPosition(j,!0);let se=El(ei,C.toArray()),Oe=El(ei,j.toArray());if(!se&&!Oe)return;let[Te,_e,Ie]=Nd(Oe??j.toArray(),se??C.toArray(),j,C,ei.cell*2,cr=>El(ei,cr)),[mt,jt,vn]=se??C.toArray();g.setLookAt(Te,_e,Ie,mt,jt,vn,!1),qt.current?.invalidate()};return G(),g.addEventListener("update",G),()=>g.removeEventListener("update",G)},[ei,lo]);let zf=ti?.floorOutline,Du=Lv(zf)?JSON.stringify(zf):"";Ee(()=>{let g=lo;if(!g||!Du)return;let C=JSON.parse(Du),j=new ro,G=new ro,se=!1,Oe=()=>{if(se)return;g.getTarget(j,!0),g.getPosition(G,!0);let Te=Dl(C,j.toArray()),_e=Dl(C,G.toArray());if(!Te&&!_e)return;se=!0;let Ie=Math.max(...C.points.map(([Qt])=>Qt))-Math.min(...C.points.map(([Qt])=>Qt)),[mt,jt,vn]=Nd(_e??G.toArray(),Te??j.toArray(),G,j,Math.max(Ie*.04,.05),Qt=>Dl(C,Qt)),[cr,Mo,Po]=Te??j.toArray();g.setLookAt(mt,jt,vn,cr,Mo,Po,!1),se=!1,qt.current?.invalidate()};return Oe(),g.addEventListener("update",Oe),()=>g.removeEventListener("update",Oe)},[Du,lo]),Ee(()=>{let g=Tr.current??Ne.current;!Ke||!lo||!g||(Zo.current=Ed(g,lo,ti?.maxDistance)??Zo.current,qt.current?.invalidate())},[Ke,lo,ti?.maxDistance]);let{measureMode:bn,measureModeRef:Tu,measurePoints:Lu,measurementTool:_u,areaClosed:Bu,measurementError:tC,selectMeasurementTool:nC,undoMeasurementPoint:rC,finishMeasureArea:oC,snapMode:iC,setSnapMode:aC,snapPreview:Vf,handleMeasurePointerMove:sC,clearSnapPreview:Ff,showDimensions:ju,measureBox:Hs,modelBounds:Hf,refreshBounds:Gf,clearMeasurements:lC,toggleMeasureMode:cC,toggleDimensions:uC,handleMeasurePointerDown:dC,handleMeasureClick:pC,saveMeasurement:mC,canSaveMeasurement:fC,canCalibrate:gC,calibrate:bC,savedResults:hC,setSavedResults:Uf,exportMeasurementJson:vC,exportMeasurementCsv:yC,importMeasurements:xC}=Wy({canvasAreaRef:zn,controlsRef:Le,sceneRef:Ne,modelUrl:ge,tilesetUrl:o,measurementModelId:Wc,savedMeasurements:xs,measurementSettings:Yi,measurementUnit:oo,onMeasurementsChange:Dm,onMeasurementSettingsChange:Tm,onCollectionChange:g=>{io?.(g.items),ao?.(g.settings),Ji(g)},modelRotation:Ce.model.rotation,bindingTransformSignature:Fs,modelLoaded:Ke,enabled:rn&&!st}),wC=de(()=>{if(!je||je.length<2)return null;let g=je.map(C=>{let j=uo.current[Ae(C)];if(!j)return null;let G=Ae(C)===ge?Dr.current:Zm.current[Ae(C)]?.current??{};return{scene:j,objectBindings:so(C),matRefs:G,label:C.label||us(C.url)}}).filter(C=>C!==null);return g.length>0?g:null},[je,ge,r,so]),SC=de(()=>{if(!je||je.length<2)return null;let g=je.map(C=>{let j=uo.current[Ae(C)];return j?{scene:j,label:C.label||us(C.url)}:null}).filter(C=>C!==null);return g.length>0?g:null},[je]);Ee(()=>{(ua||bn||st||t.status!=="ready")&&sn.stop()},[sn,ua,bn,st,t.status]);let Nu=le(null),Gs=le(Ce),CC=de(()=>{if(!Ke)throw new Error("Wait for the current model to finish loading before preparing AR.");if(o)throw new Error("Streaming tiles are incomplete model data. Provide arHandoff.createUSDZ to prepare this asset.");let g=ut?je:void 0,C=g?g.filter(j=>j.visible!==!1).map(j=>{let G=Ae(j),se=uo.current[G];if(!se)throw new Error("Wait for every visible model to finish loading before preparing AR.");let Oe=G===ge?Nu.current??so(j):Ma(so(j),j.sceneConfig?.product).objectBindings;return{scene:se,instanceId:G,objectBindings:Oe,sceneConfig:G===ge?Gs.current:j.sceneConfig??Gs.current,materialOverrides:G===ge?Dr.current:Zm.current[G]?.current}}):Ne.current?[{scene:Ne.current,instanceId:ge,sceneConfig:Gs.current,objectBindings:Nu.current??Me,materialOverrides:Dr.current}]:[];if(!C.length)throw new Error("Wait for a visible model to finish loading before preparing AR.");for(let j of C)Eb(j.scene);return Ev(C,ne?_s:void 0,ge)},[Ke,o,ut,je,so,ge,Me,ne,_s]),[MC,PC]=be(34),$f=le(void 0),kC=By({openConfiguredAR:_&&H?()=>$f.current?.():void 0,sceneRef:Ne,materialRefs:Dr,rendererCaptureRef:qt,objectBindings:Me,downloadFilename:Re,getAllLoadedModels:wC,getAllLoadedModelUvSources:SC,captureVideo:xu}),Wf=rt(()=>Object.fromEntries(Object.entries(Me).filter(([,g])=>g.visible===!1).map(([g])=>[g,!0])),[Me]),jr=rt(()=>{let g=new WeakMap,C=new Map,j=new Map;for(let[G,se]of Object.entries(Me))g.set(se,G),C.has(se.id)||C.set(se.id,G),j.has(se.modelObjectId)||j.set(se.modelObjectId,G);return{byReference:g,byId:C,byModelObjectId:j}},[Me]),Fn=de(g=>g?jr.byReference.get(g)??jr.byModelObjectId.get(g.modelObjectId)??jr.byId.get(g.id)??null:null,[jr]),Iu=d!==void 0,ho=Iu?d??null:uS,it=Fn(ho);Ee(()=>{n.setSelectedPart(it)},[it,n]);let vo=it?Ft.current[it]??null:null,RC=it?Vs[it]:void 0,Xf=Fn($e?S??As??lS:null),AC=Xf?Ft.current[Xf]??null:null,zu=x??(b?b.map(g=>Ft.current[g]).filter(Boolean):null),Us=rt(()=>{let g=zu??(vo&&Me[it??""]?.transform?.shear?[vo]:null);if(!g?.length)return null;let C=new Set(g),j=Object.entries(Ft.current).filter(([,G])=>C.has(G)).map(([G,se])=>({key:G,node:se,transform:Me[G]?.transform}));return j.length>1||j.some(({transform:G})=>G?.shear)?j:null},[zu,Me,vo,it]),qf=de(g=>{cS(g),w?.(g)},[w]),Kf=Ye&&ho!==null&&it!==null,yo=(it?Me[it]:null)??ho,pa=yo&&(yo.modelObjectId||yo.id)||null,ma=pa?pS[pa]??null:null,[OC,Qf]=be(""),Jf=le(null);Ee(()=>{let g=Jf.current;if(g!==it)if(Jf.current=it,it){let C=yo?.label||ho?.label||it;Qf(Xt("objectSelected",{name:C}))}else g&&Qf(Xt("selectionCleared"))},[it,yo,ho,Xt]),Ee(()=>{te?.(Wf)},[Wf,te]);let li=de((g,C)=>{if(co==="pointerLock"){Ss("orbit");return}g&&C?n.viewPart({objectId:g.id,objectKey:Fn(g)??(g.modelObjectId||g.id),label:g.label,source:C}):g||n.setSelectedPart(null),Iu||dS(g),k?.(g)},[co,Ss,Iu,k,Fn,n]),Yf=le(Bt?.objectBindings?`${r}
|
|
66
|
+
${o??""}`:null),$s=de((g,C)=>{if(!Gc)return;let j=`${r}
|
|
67
|
+
${o??""}`,G=Yf.current===j?Wn.current:uD;Yf.current=j;let se=Dh(g,C);for(let Oe of Object.keys(se))G[Oe]&&(se[Oe]=G[Oe]);Nn(se)},[Gc,r,o,Nn]),{glowMemoryRef:Zf,readObjectGlow:eg,applyGlow:tg}=cy({nodeRefsMap:Ft,currentObjectBindingsRef:Wn,applyObjectBindings:Nn}),EC=de(g=>{let C=it;if(!C||!g)return;let j=Wn.current[C];j&&Nn({...Wn.current,[C]:{...j,transform:{...j.transform,...g}}})},[Nn,it]),DC=de(g=>{let C=Wn.current,j={...C};for(let{key:G,transform:se}of g){let Oe=C[G];Oe&&(j[G]={...Oe,transform:{...Oe.transform,...se}})}Nn(j)},[Nn]),sr=de((g,C)=>Me[g]?g:C?Fn(C):jr.byId.get(g)??jr.byModelObjectId.get(g)??null,[Me,Fn,jr]),Ws=de((g,C)=>{let j=sr(g),G=j?Me[j]:void 0;!j||!G||Nn({...Me,[j]:{...G,style:C(G.style)}})},[sr,Me,Nn]),Nr=de(()=>{Ht&&ar[Ht.objectId]?.hex!==void 0&&oa(g=>({...g,[Ht.objectId]:{}})),iu(null)},[Ht,ar]),ng=de(()=>{if(Ht){let g=ar[Ht.objectId]?.hex;g!==void 0&&(Ws(Ht.objectId,C=>({...C,material:{...C?.material,baseColor:g}})),oa(C=>({...C,[Ht.objectId]:{}})))}iu(null)},[Ht,ar,Ws]),rg=Ht?Me[sr(Ht.objectId)??Ht.objectId]?.style?.material?.baseColor:void 0,Vu=de(()=>{li(null),ru(null),Nr()},[li,Nr]),TC=de((g,C,j,G,se)=>{let Oe=ef.current,Te=zn.current,_e=Le.current?.camera;if(!Oe)return{objectId:g,x:24,y:24};let Ie=Oe.getBoundingClientRect(),mt=12,jt=Ie.width-C-mt,vn=Ie.height-j-mt,cr=Math.max(mt,(Ie.width-C)/2),Mo=Math.max(mt,(Ie.height-j)/2),Po=sr(g,G),Qt=Po?Ft.current[Po]:null,yn=(ur,dr)=>dr<=mt?mt:Math.min(Math.max(ur,mt),dr);if(Te&&_e&&Qt){let ur=Te.getBoundingClientRect(),dr=new ro;new E0().setFromObject(Qt).getCenter(dr),dr.project(_e);let zr=(dr.x+1)/2*ur.width+(ur.left-Ie.left),ya=(1-dr.y)/2*ur.height+(ur.top-Ie.top);return{objectId:g,x:yn(zr+24,jt),y:yn(ya-j/2,vn)}}let ha=typeof se?.screenX=="number"?se.screenX-Ie.left:cr,va=typeof se?.screenY=="number"?se.screenY-Ie.top:Mo;return{objectId:g,x:yn(ha,jt),y:yn(va,vn)}},[sr]),Xs=uy({setCurrentAction:ru,bindingKeyIndex:jr,currentObjectBindings:Me,applyObjectBindings:Nn,resolveObjectKey:sr,closeColorPicker:Nr,setColorPicker:iu,setMaterialPopupsByObject:mS,setItemMaterials:oa,getPopoverPosition:TC,decalRequestRef:Fm,setDecalError:Vm,setDecalDragging:Hm,setDecalControl:Im,resolvedSceneConfigRef:Jo,applyLightPatches:jm,readObjectGlow:eg,applyGlow:tg,glowMemoryRef:Zf,setLightControl:Nm,onAction:Q});Ee(()=>{if(Ht)return window.addEventListener("pointerdown",Nr),()=>window.removeEventListener("pointerdown",Nr)},[Ht,Nr]),Ee(()=>{if(!zs)return;let g=C=>{if(Rs.current&&!Rs.current.contains(C.target)){if(C.target.closest?.(".ri-annotationMarker"))return;Is()}};return document.addEventListener("mousedown",g),document.addEventListener("touchstart",g),()=>{document.removeEventListener("mousedown",g),document.removeEventListener("touchstart",g)}},[zs,Is]),Ee(()=>{if(!go)return;let g=C=>{let j=C.target;if(j.closest?.(".ri-annotationPopup")||j.closest?.("button, input, textarea, .ri-measureTools, .ri-xrTools, .ri-buttonContainer"))return;let G=zn.current;!G||!G.contains(j)||(Lf(null),Ru({title:"",description:""}))};return document.addEventListener("mousedown",g,!0),document.addEventListener("touchstart",g,!0),()=>{document.removeEventListener("mousedown",g,!0),document.removeEventListener("touchstart",g,!0)}},[go]);let{handleFileChange:LC,triggerFileUpload:og,clearTexture:ig,texturePositioningEnabled:_C,texturePositioningOverrides:BC,setMaterialTextureOffset:jC,setMaterialTextureRotation:NC,endMaterialTexturePositioning:IC}=o0({applyBindingStyle:Ws,resolveObjectKey:sr,onTextureUpload:I,fileInputRef:Jm,pendingObjectId:nS,createdBlobUrls:Ym,texturePositioning:bm,setMoveZoomTarget:na}),Fu=le(F);Fu.current=F;let Rn=de(()=>{let g=Le.current;!g||!Fu.current||Fu.current({objectBindings:Wn.current,homeCameraState:Vn.current,captureImage:C=>wf()?Promise.reject(new Error("Wait for video export to finish before capturing an image.")):Ll(qt.current,C),isLoadingTiles:()=>su.current,captureVideo:xu,invalidate:()=>qt.current?.invalidate(),rendererBackend:Df.current??"webgl",raw:{controls:g,scene:Ne.current,nodes:Ft.current}})},[xu,wf]),ci=de(async(g=!1)=>{let C=Le.current,j=Tr.current??Ne.current;if(!C||!j)return!1;Yo.current=Da;try{return await uv(C,j,{flyIn:g,onStart:()=>mo(!0),invalidate:()=>qt.current?.invalidate()}),(Tr.current??Ne.current)!==j?!1:($n.current=!0,ri(),Rn(),!0)}catch(G){return console.error("Fit scene error:",G),!1}},[ri,Rn]);Ee(()=>{let g={url:ge,usesSlots:ut},C=av(aa.current,g,(Cs.current??[]).map(_e=>Ae(_e)),uo.current,In.current,kn),j=aa.current?In.current[aa.current.url]:void 0;if(C&&j&&!In.current[ge]&&(In.current[ge]=j),aa.current=g,$n.current=!1,ia.current=!1,Vn.current=ut?In.current[ge]??null:null,Ne.current=null,au.current=null,su.current=!1,Os.current=null,Tr.current=null,of(!1),lf([]),pu(!1),mu(null),ni(!1),fu.current="",uf.current=new Set,gu.current=new Set,bf({total:0,missing:0}),hf("loadingModel"),vu(null),Bt?.model!==Nl(ge,o)&&(Ds.current=null),!r){po(!1),mo(!0);return}if(ut&&Ms.current.has(ge)){po(!1),mo(!0);return}po(!C),mo(C||!!ft||Es.current);let G=!1,se=null,Oe=_e=>{se=setTimeout(Te,_e)},Te=()=>{if(G||$n.current||ia.current||ut&&Ms.current.has(ge))return;let _e=Tr.current??Ne.current;if(!Le.current||!_e){Oe(100);return}Zo.current=Ed(_e,Le.current,sf.current?.maxDistance)??Zo.current;let Ie=Ds.current;if(Ie){Ds.current=null,ny(Le.current,Ie.camera),$n.current=!0,Ie.home?(Vn.current=Ie.home,ut&&(In.current[ge]=Ie.home)):ri(),Rn(),po(!1),mo(!0),qt.current?.invalidate();return}if(Bg(Le.current)||C){$n.current=!0,ri(),Rn(),po(!1),mo(!0),qt.current?.invalidate();return}ia.current=!0,(ft?ft():Es.current?Promise.resolve(!0):ci(!0)).then(jt=>{G||($n.current=jt!==!1,$n.current?(ri(),Rn(),po(!1)):G||Oe(100))}).catch(()=>{$n.current=!1,G||Oe(100)}).finally(()=>{G||(ia.current=!1)})};return Oe(50),()=>{G=!0,se&&clearTimeout(se)}},[ri,In,ci,ge,kn,r,Rn,ft,Bt,o,ut]),A0({enabled:It,canvasAreaElement:nu,fitAttemptedRef:$n,fitInFlightRef:ia,controlsRef:Le,cameraFramingRef:Yo,nodeRefsMap:Ft,fitScene:ci});let qs=de(g=>{let C=Le.current;if(!C)return;let j=g.cameraState;if(j?.position&&j?.target){let[Oe,Te,_e]=j.position,Ie=new ro(...j.target);C.setPosition(Oe,Te,_e,!0),C.setTarget(Ie.x,Ie.y,Ie.z,!0),Yo.current={kind:"view",target:Ie};return}let G=Fn(g),se=G?Ft.current[G]:null;!G||!se||(C.fitToBox(se,!0,Pl).catch(()=>{}),Yo.current={kind:"object",key:G})},[Fn]);Ee(()=>{it||(Yo.current=Da)},[it]);let Hu=de((g,C="canvas")=>{if(Tu.current)return;let j=qm.current;j.dragging||performance.now()-j.endedAt<150||(Kt(!1),Nr(),ru(null),li(g,C),!(ve||!ze)&&qs(g))},[li,Nr,qs,ve,ze]),{beginMoveZoom:ag,handleMoveZoomPointerDown:zC}=Jw({moveZoomTarget:tn,setMoveZoomTarget:na,currentObjectBindingsRef:Wn,materialRefsOut:Dr,rendererCaptureRef:qt,canvasAreaRef:zn,canvasAreaElement:nu,applyBindingStyle:Ws}),sg=de(g=>{if(!ra)return!1;let C=Fn(g);if(!C)return!1;let j=Vs[C];return j?(ag({objectKey:C,textureKey:j}),!0):!1},[ra,Fn,Vs,ag]),Gu=le(!1),{editDecals:kD,activeDecalMove:ui,addCenteredDecal:RD,decalSizeFor:VC,startImageDecal:AD,decalControlHandlers:FC}=Xw({currentObjectBindings:Me,currentObjectBindingsRef:Wn,applyObjectBindings:Nn,nodeRefsMap:Ft,controlsRef:Le,decalMove:O,decalDragging:Qc,setDecalDragging:Hm,setDecalError:Vm,setDecalControl:Im,decalRequestRef:Fm,onTextureUpload:I,currentPanelObjectId:pa,modelUrl:ge}),Ks=Zt===!0?fD:Zt||null,xo=an.product?JSON.stringify([ge,an.product.definition.id,an.product.definition.revision]):null,[Uu,HC]=be(null),di=rt(()=>an.product&&Ks&&Uu?.key===xo?{...an.product,selections:Uu.selections}:an.product,[an.product,Ks,Uu,xo]),GC=de(g=>{HC(xo?{key:xo,selections:g}:null)},[xo]),fa=rt(()=>Ma(Me,di,mr(an.model),la),[Me,di,an.model,la]);Nu.current=fa.objectBindings;let Ut=rt(()=>di?{...an,product:di,model:{...an.model,activeVariants:fa.activeVariants}}:an,[an,di,fa.activeVariants]);Gs.current=Ut;let lg=rt(()=>kh(fa.objectBindings,Ut.styleRules),[fa.objectBindings,Ut.styleRules]),[cg,ug]=be(()=>Bt?.isolation??null);hr(()=>{ug(null)},[ge,r]);let wo=Un!==void 0?Un:cg,$u=de(g=>{Un===void 0&&ug(g),Ki?.(g)},[Un,Ki]),hn=rt(()=>Ah(lg,wo),[lg,wo]),UC=rt(()=>({bindings:hn.bindings,model:Ut.model,camera:Ut.camera,animations:Ut.animations}),[hn.bindings,Ut.model,Ut.camera,Ut.animations]),So=xv({revision:JSON.stringify([oi,ne?_s?.id:null]),enabled:_&&!!H,options:ml(H),baseUrl:J,autoPrepare:ne&&!Bs&&js&&Ke,preparePhoneLink:!ne,state:{version:1,objectBindings:Me,configuration:{modelUrl:r,modelFormat:c,tilesetUrl:o,activeModelId:ge,models:je?.map(g=>({...g,objectBindings:so(g),sceneConfig:Ae(g)===ge?Ut:g.sceneConfig})),mergeModels:Ic,sceneConfig:Ut,arScaleMode:z,isolation:wo,backgroundColor:ae,shadows:ke}},getSources:CC});$f.current=So.show;let lr=rt(()=>hn.setAside.size>0?Rh(Me,wo):null,[hn,Me,wo]),$C=de(g=>{let C=Fn(g),j=C!==null&&lr?.size===1&&lr.has(C);$u(j?null:{...wo,target:g.id})},[$u,wo,lr]),{sourceOf:Ir}=hn,WC=rt(()=>Xo?bw(Me,hn):[],[Xo,Me,hn]),Wu=de(g=>{let C=Ir(g);Hu(C)},[Hu,Ir]),Xu=de(g=>qf(g&&Ir(g)),[qf,Ir]),qu=de((g,C)=>{let j=Ir(g);return M?.({binding:j,...C})===!0?(Gu.current=!0,!0):sg(j)},[M,sg,Ir]),Ku=rt(()=>P?(g,C)=>P({binding:Ir(g),...C}):void 0,[P,Ir]),dg=de(g=>{li(g,"panel"),!ve&&qs(g)},[li,qs,ve]);Ee(()=>{Rn()},[Rn,Me,rS]);let pg=le(0),mg=de((g,C)=>{pg.current=C.distance,sv(C,Zo.current),X?.(Hg(g,C)),Rn()},[Rn,X]),XC=de(g=>{rf.current=new Set(g.map(C=>C.name)),gS(C=>C+1),$s(g.map(C=>C.name)),l?.(g)},[$s,l]),qC=de(g=>{Tr.current=g,qt.current?.invalidate()},[]),pi=de(g=>{Ne.current=g,Gf(g),bf(R0(g));let C=$b(g);yS(C>pd?C:null),gf(!1),vu(null),C>pd&&hf("preparingLargeModel"),of(!0),lf(bb(g)),pu(!1),mu(null),mf(!1),o||(l&&l(Vx(g)),$s(Lh(g),Th(g))),B?.(g),V?.(Ph(g)),Rn()},[$s,Rn,V,l,B,Gf,o]),KC=de(()=>Tr.current??Ne.current,[]),{background:Qu}=Ce,QC=Qu.enabled&&Qu.type==="color"&&new oD(Qu.color).getHSL({h:0,s:0,l:0}).l>.5?"#000000":"#ffffff",ga=Ke?Ne.current:null,fg=!!$;Ee(()=>{if(!fg)return;if(ca){if(Os.current?.url!==r||Os.current.error!==fo)return;let C=fo&&typeof fo=="object"?ka(fo):void 0;lu.current?.(Gb({...C,name:C?.name??ud(r),format:C?.format??c??dd(r).format}));return}if(!ga||Ne.current!==ga)return;let g=dd(r);lu.current?.(Hb(ga,{scope:o?"resident-tiles":"asset",source:{...ka(ga),format:o?"3d-tiles":c??g.format,name:g.entryPath??ud(r)}}))},[fg,ga,r,c,o,ff,ca,fo]);let Ju=de(g=>{po(!1),mo(!0),pu(!0),mu(g),Os.current={url:nf.current,error:g},L?.(g)},[L]),{reportError:gg,clearError:bg}=Nv({enabled:ut,activeUrl:ge,models:je,errorsRef:Ms,activeFailed:ca,activeError:fo,onActiveError:Ju,onExtraError:hm}),JC=de((g,C)=>{!ut||!Cs.current?.some(j=>Ae(j)===g)||(delete uo.current[g],delete In.current[g],gg(g,C))},[ut,gg,In]),YC=de((g,C)=>{!ut||!Cs.current?.some(j=>Ae(j)===g)||(bg(g),uo.current[g]=C,g===ge&&(Ps.current!==g||Ne.current!==C)&&(Ps.current=g,pi(C)),gs?.(g,C))},[ut,ge,r,pi,gs,bg]);Ee(()=>{if(!ut||Ms.current.has(ge))return;let g=uo.current[ge];g&&(Ps.current===ge&&Ne.current===g||(Ps.current=ge,pi(g)))},[ut,ge,r,Ke,pi]);let hg=de((g,C)=>{gu.current.add(g),vS(j=>j+1),vm?.(g,C)},[vm]),vg=ut&&je?je.find(g=>Ae(g)===ge)?.mergeModels:Ic,yg=rt(()=>new Set((vg??[]).map(g=>g.url)),[vg]),xg=de(g=>{g.lengthComputable&&g.total>0&&vu(g.loaded/g.total*100),W?.(g)},[W]),ZC=de((g,C,j,G)=>{if(!ce)return;let se={...Ce,lighting:{...Ce.lighting,lights:Ce.lighting.lights.map(Oe=>Oe.id===g?{...Oe,position:C,...j?{rotation:j}:{},...G?{target:G}:{}}:Oe)}};ce(se)},[Ce,ce]);Ee(()=>{let g=Ne.current;if(!Ke||!g){ni(!1);return}if(Array.from(yg).some(Te=>!gu.current.has(Te))){ni(!1);return}let j=Object.entries(Me).filter(([,Te])=>!Te.removed);if(j.length===0){ni(!1);return}let G=o?rf.current:(()=>{let Te=uf.current;for(let _e of Object.keys(Vr(g).nodesById))Te.add(_e);return Te})();if(!G||G.size===0){ni(!1);return}let se=j.map(([Te,_e])=>_e.modelObjectId??Te).filter(Te=>!G.has(Te));ni(se.length>0),hS(se.length);let Oe=se.join(`
|
|
68
|
+
`);if(se.length>0&&Oe!==fu.current){let Te=se.slice(0,10).map(Ie=>`"${Ie}"`).join(", "),_e=se.length>10?` and ${se.length-10} more`:"";console.warn(`[react-immersive] ${se.length} object binding(s) point at nodes this model doesn't have, so they can't be selected: ${Te}${_e}. Each binding's modelObjectId (or its key) must match a node name; log onObjectCatalog to see this model's names.`)}fu.current=Oe},[Ke,Me,fS,o,yg,ff]),Ee(()=>{if(Q||kn)return;let g=[];for(let[j,G]of Object.entries(Me))for(let se of G.actions??[])gd.includes(se.id)||g.push(`"${se.id}" on "${G.label??j}"`);let C=g.join(`
|
|
69
|
+
`);if(g.length>0&&C!==df.current){let j=g.slice(0,10).join(", "),G=g.length>10?` and ${g.length-10} more`:"";console.warn(`[react-immersive] ${g.length} action button(s) do nothing because ModelViewer has no onAction handler: ${j}${G}. ModelViewer itself handles ${gd.join(", ")}; handle other ids in onAction, or pass useViewerActions().handleAction to run their effects.`)}df.current=C},[Me,kn,Q]);let Yu=de(async()=>{if(Le.current&&Vn.current&&tl(Le.current,Vn.current),ft){await ft();return}let g=Le.current;if(!g)return;let C=Vn.current;try{if(C&&!Es.current&&Number.isFinite(C.azimuthAngle)&&Number.isFinite(C.polarAngle))g.rotateTo(C.azimuthAngle,C.polarAngle,!0),await ci();else if(C){Yo.current=Da;let j=Fg(C,g);await Dd(g,()=>g.setLookAt(j[0],j[1],j[2],C.target[0],C.target[1],C.target[2],!0))}else await ci()}catch(j){console.error("Reset camera error:",j)}},[ft,ci]),OD=de(()=>{_r(!1),Kt(!0)},[]),ED=de(()=>{Kt(!1)},[]),eM=de(()=>{Kt(!1),_r(!0),setTimeout(()=>{Yu()},100)},[Yu]),tM=de((g,C)=>{mg(g,C)},[mg]),nM=de(g=>{if(Tu.current)return;if(Gu.current){Gu.current=!1;return}if(g.target.closest("button, input, textarea, .ri-colorPicker, .ri-materialPicker, .ri-annotationPopup, .ri-annotationMarker, .ri-viewAnnotationPopup"))return;let j=zn.current,G=Le.current,se=G?.camera,Oe=Ne.current;if(!j||!G||!se||!Oe||!bs&&!G.enabled)return;let Te=j.getBoundingClientRect(),_e=(g.clientX-Te.left)/Te.width*2-1,Ie=-((g.clientY-Te.top)/Te.height)*2+1,mt=new iD;mt.setFromCamera(new sD(_e,Ie),se);let jt=mt.intersectObject(Oe,!0);if(jt.length===0)return;if(!bs&&E){let Qt=jt[0].point,yn=null;for(let[ha,va]of Object.entries(Wn.current)){if(!va.decals?.length)continue;let ur=Ft.current[ha];if(!ur)continue;let dr=ur.worldToLocal(Qt.clone());for(let zr of va.decals){if(!zr.position)continue;let ya=dr.distanceTo(new ro(zr.position[0],zr.position[1],zr.position[2]));ya<=zr.size/2&&(!yn||ya<yn.distance)&&(yn={binding:va,id:zr.id,distance:ya})}}if(yn){na(null),E(yn.binding,yn.id);return}}if(!bs){let{x:Qt,y:yn,z:ha}=jt[0].point;G.setOrbitPoint(Qt,yn,ha);return}let vn=jt[0],cr=vn.point,Mo=Oe.worldToLocal(vn.point.clone()),Po=[0,0,1];if(vn.face){let Qt=vn.face.normal.clone().transformDirection(vn.object.matrixWorld).normalize();Po=[Qt.x,Qt.y,Qt.z]}Lf({worldPosition:[cr.x,cr.y,cr.z],localPosition:[Mo.x,Mo.y,Mo.z],worldNormal:Po,anchor:Fw(vn),screenX:g.clientX-Te.left,screenY:g.clientY-Te.top}),Ru({title:"",description:""})},[bs,E]);if(Ee(()=>{Vc.current={snapshot:()=>{let g=Le.current,C=Ds.current;return{model:jn,camera:$n.current&&g?el(g):C?.camera,home:Vn.current??C?.home,lightEdits:Uc,variantEdit:hs,sectionEdit:vs,measurementEdits:ys,isolation:cg,objectBindings:Mm||ut?void 0:Me,modelBindingEdits:Mm?void 0:H0,explodeFactor:oi,cameraControllerType:$m,uvCheckerOverride:Gm,annotationCategories:GS}},captureFrame:()=>{let g=qt.current;return!g||t.status!=="ready"||!Ke||!Lr?Promise.resolve(null):th(g)}}}),Ee(()=>()=>{Vc.current=null},[Vc]),Qo.status==="checking"){let g=Fc??zc;return g?q("div",{className:"ri-viewer ri-viewerPlaceholder",style:{background:Yc},children:q(md,{src:g})}):q("div",{className:"ri-viewer ri-viewer--license-checking",children:!a&&q(Cl,{title:Xt("verifyingLicense"),message:Xt("checkingYourLicenseKey")})})}if(Qo.status==="invalid")return q("div",{className:"ri-viewer ri-viewer--license-invalid",children:q(Cl,{tone:"error",title:Xt("invalidLicense"),showKeySetup:Qo.isLocalDomain&&Qo.reason==="No license key provided",message:Qo.isLocalDomain?Qo.reason??Xt("licenseHasBeenRevokedOrHasExpired"):Xt("failedToLoadPleaseContactTheSiteAdministrator")})});let{materialTextureUrl:wg,materialTargetTakesImage:Sg,materialTextureOffset:Cg,materialTextureRotationDegrees:Mg,isMaterialTexturePositioning:Pg,materialTextureOnOffsetChange:kg,materialTextureOnRotationChange:Rg,materialTextureOnEndPositioning:Ag}=i0({materialPopup:ma,resolveObjectKey:sr,currentObjectBindings:Me,nodeRefsMap:Ft,moveZoomTarget:tn,texturePositioningEnabled:_C,texturePositioningOverrides:BC,setMaterialTextureOffset:jC,setMaterialTextureRotation:NC,endMaterialTexturePositioning:IC}),rM=zn.current?.offsetWidth??600,oM=zn.current?.offsetHeight??400,iM=350,aM=290,sM=go?Math.min(go.screenX+12,rM-iM-8):0,lM=go?Math.min(go.screenY,oM-aM-8):0,cM=Lt&&!!r&&!ca&&!Ke,Og=_&&(da&&(Bs||Of)||js||!!H||!!Ns),mi=Og&&!kn&&!ne,ba=rn&&!kn,Zu=qo&&!kn,Eg=(mi?1:0)+(Vt?1:0),Co=g=>(kn?50:16)+g*42+(ba&&g>Eg?Math.max(0,MC-34):0),ed=Og&&!ne?q(x0,{configuredHandoff:!!H,top:Co(0),xrStore:da,arSupported:Bs,vrSupported:Of,quickLookSupported:js,mobileHandoffUrl:Ns,mobileHandoffOpen:H?So.open:Ef,onQuickLook:H?So.show:IS,onOpenMobileHandoff:H?So.show:jS}):null;return Tn("div",{className:"ri-viewer",ref:ks.rootRef,style:{background:Yc},"data-reduced-motion":Er?"":void 0,children:[q("div",{className:"ri-visuallyHidden",role:"status","aria-atomic":"true",children:OC}),t.status!=="ready"&&q(r0,{rebuilding:t.status==="rebuilding",onReload:t.reload}),Tn("div",{className:"ri-viewerLeft",ref:ef,inert:t.status!=="ready",children:[Ye&&(ie?ie({isOpen:Kf,selectedObject:yo,currentAction:tf,onClose:Vu,onAction:Xs}):q(Gp,{translateDefaultActions:Gc,isOpen:Kf,selectedObject:yo,currentAction:tf,onClose:Vu,onAction:Xs,renderActionExtra:g=>{if(g==="change-color"&&Ht)return q(Np,{inline:!0,colorPicker:Ht,onClose:ng,savedHex:rg,itemMaterials:ar,setItemMaterials:oa});if((g==="change-light-color"||g==="set-brightness")&&qc?.kind===g&&qc.objectId===pa)return q(dy,{control:qc,lights:Ce.lighting.lights,readObjectGlow:eg,applyGlow:tg,glowMemoryRef:Zf,applyLightPatches:jm,onControlChange:Nm});if((g==="add-text"||g==="add-image")&&Kc?.kind===g&&Kc.objectId===pa){let C=Kc,j=sr(C.objectId);if(!j)return null;let G=g==="add-image";return q(hy,{kind:g,decals:(Me[j]?.decals??[]).filter(se=>!!se.image===G),activeId:C.activeId,error:zm?Xt.message(zm):null,moving:Qc?.objectKey===j&&Qc.decalId===C.activeId,defaultSize:VC(j),...FC(C,j)})}return g==="change-material"&&ma?q(Ip,{inline:!0,triggerFileUpload:og,materialPopup:ma,textureUrl:wg,clearTexture:ig,canPlaceImage:Sg,offset:Cg,rotationDegrees:Mg,onOffsetChange:kg,onRotationChange:Rg,isPositioning:Pg,onEndPositioning:Ag}):null}})),Tn("div",{className:`ri-canvasArea ${bn?"ri-canvasArea--measuring":""} ${Lr?"":"ri-canvasArea--positioning"} ${Ve||bt?"ri-canvasArea--moveMode":""}`,ref:sS,tabIndex:ir?0:void 0,role:ir?"group":void 0,"aria-label":ir?Xt("cameraKeyboardHelp"):void 0,onDoubleClick:nM,onPointerDown:g=>{if(ir&&zn.current?.focus({preventScroll:!0}),tn){zC(g);return}dC(g)},onClick:tn?void 0:pC,onPointerMove:sC,onPointerLeave:Ff,onWheel:Ff,children:[Ke&&!bn&&t.status==="ready"?q(Cw,{objects:WC,selectedKey:it,onHighlight:ou,onSelect:g=>Hu(g,"keyboard"),onClearSelection:()=>{Vu(),A?.()}}):null,ra&&!o&&(tn||RC)&&q("div",{className:"ri-moveZoomHint",role:"status",style:{position:"absolute",top:12,left:"50%",transform:"translateX(-50%)",zIndex:5,padding:"6px 12px",borderRadius:999,fontSize:12,fontWeight:500,color:"#fff",background:tn?"rgba(37, 99, 235, 0.92)":"rgba(0, 0, 0, 0.6)",pointerEvents:"none",whiteSpace:"nowrap"},children:Xt(tn?"texturePositioningHint":"texturePositioningStartHint")}),cf&&!pf&&q(Zw,{count:bS,onDismiss:()=>mf(!0)}),bu!==null&&!xS&&q(e0,{triangles:bu,offset:cf&&!pf,onDismiss:()=>gf(!0)}),Ut.model.renderer==="uv-checker"&&hu.missing>0&&q(t0,{missing:hu.missing,total:hu.total}),q("input",{ref:Jm,type:"file",accept:"image/png,image/jpeg,image/webp",className:"ri-hiddenInput",onChange:LC}),q(Oi,{onError:t.fail,children:si&&!TS?Tn(vp,{backend:si,onRendererCreated:t.onRendererCreated,onPointerMissed:D?()=>{Tu.current||D()}:void 0,suspended:t.status!=="ready",paused:V0&&!st,camera:pt,backgroundColor:ae,shadows:ke&&Ce.shadows.enabled,sceneConfig:Ut,selectedObjectRef:vo,selectedObjectRefs:zu,selectedObjectOutlineColor:v,hoveredObjectRef:AC,highlightOnHover:$e,renderMode:vt,maxDpr:mn,reduceGpuLoad:Y0,runtimeStats:U?{onStats:U,intervalMs:T,profile:Wt,streamingRef:au}:void 0,xrStore:da,xrRuntime:Pu,rendererCaptureRef:qt,preserveDrawingBuffer:_n,children:[q(wp,{lightingConfig:Ce.lighting,shadowConfig:Ce.shadows,shadowsEnabled:ke,environmentRotation:Ce.environment.rotation,environmentConfig:Ce.environment,modelBounds:Hf,objectBindings:Me,nodeRefs:Ft}),W0&&Ce.lighting.lights.map(g=>!g.visible||g.type==="none"||g.type==="hemisphere"||g.attachment?null:q("group",{rotation:[0,g.attachedToCamera?0:Ce.environment.rotation*Math.PI/180,0],children:q(jw,{light:g,position:g.position,rotation:g.rotation,color:g.color,intensity:g.intensity,visible:g.visible,target:g.type==="spot"||g.type==="directional"?g.target??Bo(Qa(g,ke&&Ce.shadows.enabled&&g.castShadow,Hf),g.attachedToCamera?0:-Ce.environment.rotation):void 0,onTransformChange:({position:C,rotation:j,target:G})=>ZC(g.id,C,j,G),onDraggingChange:Xm})},g.id)),q(_p,{setAside:hn.setAside,nodeRefs:Ft}),!Br&&q(jp,{section:Ce.section??Sa,box:Hs,modelRef:Ne,showHandle:qo,onChange:Lm,onDraggingChange:Q0}),q(xp,{controlsRef:Le,onReady:Z0,onCameraChange:tM,cameraLimits:ti,controllerType:co,onPointerLockExit:()=>Ss("orbit"),reducedMotion:Er,zoom:!ve,pageScroll:qe}),q(um,{enabled:st||bn||ui||Er||co==="pointerLock"?!1:j0??Ce.model.autoRotate??!1,speed:N0??Ce.model.autoRotateSpeed??1,controlsRef:Le}),_t&&!Br&&!st&&q(Jb,{getTarget:KC,revision:`${ge}:${Ke}`,lineColor:QC}),en&&!st&&q(Gv,{onUpdate:()=>{let g=Le.current;if(g){g.camera.up.set(0,1,0);let C=pg.current;C>0&&g.dollyTo(C,!1),g.update(0)}qt.current?.invalidate()}}),(Ve||bt)&&!Br&&!Us&&vo&&it&&q(tm,{node:vo,space:gn,moveEnabled:Ve,gizmoTool:Se,scaleEnabled:bt,onTransformChange:EC,transform:Me[it]?.transform,onDraggingChange:g=>{Km(g),ho&&R?.(ho,g)}},it),(Ve||bt)&&!Br&&Us&&q(im,{entries:Us,referenceNode:vo,space:gn,moveEnabled:Ve,gizmoTool:Se,scaleEnabled:bt,onTransformChange:DC,onDraggingChange:g=>{Km(g);for(let C of Us){let j=Me[C.key];j&&R?.(j,g)}}}),ui&&q(Ay,{target:ui,nodes:Ft,controls:Le}),(()=>{let g=ut&&je?Tn(pm,{children:[je.map(C=>q(zx,{entry:{...C,objectBindings:Ae(C)===ge?hn.bindings:so(C)},isActive:Ae(C)===ge,pulses:hn.pulses,decoderConfig:ws,itemMaterials:ar,sceneConfig:Ut,zoomOnSelected:ze,highlightOnHover:$e,explodeFactor:oi,suspendBindingTransforms:ta,onLoadProgress:xg,onAnimationsReady:Rf,onModelAnimationsReady:RS,onLoadError:JC,onModelLoaded:YC,selectedItem:it,panelHoveredItem:S??As,onItemClick:Wu,onItemDoubleClick:qu,onItemContextMenu:Ku,onItemHover:Xu,nodeRefsOut:Ft,onNodeRefsChange:tu,materialRefsOut:Ae(C)===ge?Dr:iS(Ae(C)),onMergeModelLoaded:hg,onMergeModelError:ym},Ae(C))),q(uc,{anchorSceneRef:Ne,annotations:Sm?_f:[],sceneConfig:Ce,activeAnnotation:zs,popupRef:Rs,canvasRootRef:zn,worldPositionsRef:eu,modelLoaded:Ke,onAnnotationClick:jf,onCloseAnnotation:Is,hideCloseButton:bo,guidedTour:bo,showAnnotationOnHover:ot}),q(Ac,{annotation:Bf,enabled:bo&&!st,controlsRef:Le,offsetRef:Zc}),st?q(Ai,{controlsRef:Le,sceneRef:Ne,config:st.config,playing:!0,resetOnPlay:!0,playOnce:!0,startAtPath:!0,onStarted:st.onStarted,onFinished:st.onFinished,onProgress:Sf},"video-export"):Xn&&q(Ai,{controlsRef:Le,sceneRef:Ne,config:Xn,playing:ua&&!bn,resetOnPlay:xf,onFinished:()=>{Kt(!1),_r(!1)},onUserInteract:()=>{Kt(!1)}},"cinematic-preview"),rn&&Tn(pm,{children:[q(mc,{items:xs,sceneRef:Ne,modelId:Wc,tilesetUrl:o,settings:Yi,legacyUnit:oo,revision:Fs,onResults:Uf}),q(Ni,{points:Lu,unit:Zi.displayUnit,scale:Zi.factor,box:Hs,showDimensions:ju,tool:_u,areaClosed:Bu,snapPreview:bn?Vf:null})]})]}):q(Qn,{onLoadError:Ju,children:Tn(O0,{fallback:null,children:[o?q(lD,{diagnosticsRef:U?au:void 0,loadingRef:su,url:o,rotation:Ut.model.rotation,errorTarget:i,cacheSize:s,decoderConfig:ws,objectBindings:hn.bindings,itemMaterials:ar,sceneConfig:Ut,selectedItem:it,panelHoveredItem:S??As,highlightOnHover:$e,onItemClick:Wu,onItemHover:Xu,onItemDoubleClick:qu,onItemContextMenu:Ku,onObjectCatalog:XC,onTilesetBounds:qC,onModelLoaded:pi,onLoadError:Ju,nodeRefsOut:Ft,onNodeRefsChange:tu,materialRefsOut:Dr,explodeFactor:oi,suspendBindingTransforms:ta}):q(Ja,{url:r,modelFormat:c,objectBindings:hn.bindings,selectedItem:it,itemMaterials:ar,onItemClick:Wu,onItemDoubleClick:qu,onItemContextMenu:Ku,onItemHover:Xu,onModelLoaded:pi,onAnimationsReady:Rf,nodeRefsOut:Ft,onNodeRefsChange:tu,materialRefsOut:Dr,panelHoveredItem:S??As,sceneConfig:Ut,zoomOnSelected:ze,highlightOnHover:$e,decoderConfig:ws,onLoadProgress:xg,explodeFactor:oi,suspendBindingTransforms:ta,originalNodePoses:z0,mergeModels:Ic,onMergeModelLoaded:hg,onMergeModelError:ym,pulses:hn.pulses}),I0?.map(C=>q(jx,{url:C,decoderConfig:ws,onLoadError:hm,onModelLoaded:gs?j=>gs(C,j):void 0},C)),q(uc,{anchorSceneRef:Ne,annotations:Sm?_f:[],sceneConfig:Ce,activeAnnotation:zs,popupRef:Rs,canvasRootRef:zn,worldPositionsRef:eu,modelLoaded:Ke,onAnnotationClick:jf,onCloseAnnotation:Is,hideCloseButton:bo,guidedTour:bo,showAnnotationOnHover:ot}),q(Ac,{annotation:Bf,enabled:bo&&!st,controlsRef:Le,offsetRef:Zc}),st?q(Ai,{controlsRef:Le,sceneRef:Ne,config:st.config,playing:!0,resetOnPlay:!0,playOnce:!0,startAtPath:!0,onStarted:st.onStarted,onFinished:st.onFinished,onProgress:Sf},"video-export"):Xn&&q(Ai,{controlsRef:Le,sceneRef:Ne,config:Xn,playing:ua&&!bn,resetOnPlay:xf,onFinished:()=>{Kt(!1),_r(!1)},onUserInteract:()=>{Kt(!1)}},"cinematic-preview"),rn&&Tn(pm,{children:[q(mc,{items:xs,sceneRef:Ne,modelId:Wc,tilesetUrl:o,settings:Yi,legacyUnit:oo,revision:Fs,onResults:Uf}),q(Ni,{points:Lu,unit:Zi.displayUnit,scale:Zi.factor,box:Hs,showDimensions:ju,tool:_u,areaClosed:Bu,snapPreview:bn?Vf:null})]})]})},o??r);return da&&Pu?q(Pu.XRModelPresenter,{ref:LS,box:Hs,scaleMode:z,onARStateChange:zS,children:g}):g})(),q(fv,{controller:sn,source:Ne,controls:Le,animations:Su,cameraEnabled:!ku,ready:Ke&&Lr,sequences:Ce.sequences,autoPlay:K&&!Er,authoredRevision:UC}),h&&q(pv,{source:Ne,highlights:h}),gm&&q(O0,{fallback:null,children:gm})]}):null}),q(md,{src:Fc??zc,hidden:Ke&&Lr}),Ko&&q("div",{className:"ri-overlay",children:Ko}),Lt&&r&&ca&&q(n0,{failure:oh(fo,o||r,o?void 0:c,e),source:o||r}),q(Eh,{visible:cM,message:Xt(wS,{millions:Math.round((bu??0)/1e6)}),progress:CS??void 0,background:Yc,seeThrough:!!(Fc??zc)}),kn?Pm&&ed&&rD(ed,Pm):ed,ne&&q(Mv,{xrStore:da,arSupported:Bs,checkingAR:_S,quickLookSupported:js,modelReady:Ke,inARSession:ku,handoff:So,animationControls:q(Ov,{options:Mu,sources:ai,value:_s?.id??"",onChange:ES}),onQuickLook:()=>n.requestARLaunch("quick-look")}),BS,Fe&&!ne&&!kn&&!ku&&!st&&!bn&&ii.length>0&&q(qg,{controls:sn,sequences:ii}),So.open&&q(wv,{handoff:So,filename:Re,onQuickLook:()=>n.requestARLaunch("quick-look")}),!H&&Ef&&Ns&&q(w0,{url:Ns,onClose:NS}),Vt&&q(S0,{top:Co(mi?1:0),active:Jc,onToggle:()=>Um(g=>!(g??ea))}),rn&&q(Dp,{top:Co(Eg),active:bn,disabled:!!st,tool:_u,snap:iC,pointCount:Lu.length,areaClosed:Bu,error:tC,showDimensions:ju,onToggle:()=>{Kt(!1),bn||$0?.(),cC()},onTool:nC,onSnap:aC,onUndo:rC,onClear:lC,onFinishArea:oC,onDimensions:uC,onHeight:PC,settings:Yi,displayUnit:Zi.displayUnit,onSettings:Tm,items:xs,results:hC,onItems:Dm,onSave:mC,canSave:fC,canCalibrate:gC,onCalibrate:bC,onExportJson:vC,onExportCsv:yC,onImport:xC,readOnly:ps!==void 0&&!io,settingsReadOnly:ms!==void 0&&!ao}),Bn&&q(C0,{top:Co((mi?1:0)+(Vt?1:0)+(ba?1:0)),open:MS,factor:oi,onToggleOpen:()=>yf(g=>!g),onFactorChange:vf}),Zu&&!Br&&q(M0,{top:Co((mi?1:0)+(Vt?1:0)+(ba?1:0)+(Bn?1:0)),section:ZS,onChange:Lm}),Xn&&q(P0,{top:Co((mi?1:0)+(Vt?1:0)+(ba?1:0)+(Bn?1:0)+(Zu?1:0)),playing:ua,disabled:!!st||bn,onPlay:()=>{_r(!1),Kt(!0)},onPause:()=>Kt(!1),onStop:eM}),st&&q(k0,{progress:kS,onCancel:wu}),!kn&&ut&&je&&je.length>1&&(wm||Hc)&&q("div",{className:"ri-modelSwitcher",style:{top:`${Co((mi?1:0)+(Vt?1:0)+(ba?1:0)+(Bn?1:0)+(Zu?1:0)+(Xn?1:0))}px`},role:"group","aria-label":"Switch model",children:je.map(g=>q("button",{type:"button",className:`ri-modelSwitcherButton ${Ae(g)===ge?"ri-modelSwitcherButton--active":""}`,onClick:()=>Hc?Hc(Ae(g)):wm?.(g.url),title:`Switch to ${g.label||us(g.url)}`,"aria-pressed":Ae(g)===ge,children:g.label||us(g.url)},Ae(g)))}),(Au||Nf||ui||rr&&lr)&&Tn("div",{className:`ri-bottomStack ${If?"ri-bottomStack--aboveButtons":""} ${Au?"ri-bottomStack--annotationFilters":""}`,children:[Au&&q(l0,{categories:$S,selected:US,disabled:!!st,onChange:WS}),ui&&q(c0,{onCancel:ui.onCancel}),rr&&lr&&q(u0,{label:lr.size===1?Xt("isolatedObject",{name:(()=>{let[g]=lr;return Me[g]?.label??g})()}):Xt("isolatedObjects",{count:lr.size}),onShowAll:()=>$u(null)}),Nf&&q(d0,{groups:la,activeVariants:Xc,onSelect:J0})]}),If&&Tn("div",{className:"ri-buttonContainer",children:[q("div",{className:"ri-tourControls",children:pe&&Ou.length>0&&q(p0,{count:Ou.length,active:bo,index:FS,navigating:HS,onStart:XS,onPrevious:qS,onNext:KS,onStop:QS})}),Tn("div",{className:"mv-rightControls",children:[Ue&&ks.supported&&q(m0,{fullscreen:ks,disabled:!!st}),De&&q("button",{className:"mv-resetButton",onClick:Yu,disabled:!!st,title:Xt("resetCameraView"),children:q(cD,{})}),q(f0,{open:tS,current:co,disabled:!!st,onSelect:Ss,onToggle:()=>Wm(g=>!g)}),he&&q(g0,{menu:kC,recording:!!st,hasScene:!!Ne.current,canCaptureImage:_n||si==="webgpu",canRecord:Ke&&Lr&&!Ts,hasCinematic:!!Xn,hasMultipleModels:!!(je&&je.length>=2)})]})]}),go&&q(b0,{x:sM,y:lM,form:VS,setForm:Ru,onOk:JS,onCancel:YS})]}),ie&&Ht&&q(Np,{colorPicker:Ht,onClose:ng,savedHex:rg,itemMaterials:ar,setItemMaterials:oa}),ie&&ma&&q(Ip,{triggerFileUpload:og,materialPopup:ma,textureUrl:wg,clearTexture:ig,canPlaceImage:Sg,offset:Cg,rotationDegrees:Mg,onOffsetChange:kg,onRotationChange:Rg,isPositioning:Pg,onEndPositioning:Ag})]}),Ks&&di&&xo?q(rw,{product:an.product,options:Ks,onSelectionsChange:GC,top:Ge?56:12},xo):null,Ge&&q("div",{className:"ri-viewerRight",inert:t.status!=="ready",children:He?He({objectBindings:Me,onAction:Xs,onFocus:dg,onHover:ou}):q(Up,{objectBindings:Me,onAction:Xs,onFocus:dg,onHover:ou,isolatedKeys:lr,onIsolate:rr?$C:void 0})}),Nt&&q(ew,{controlsRef:Le,enabled:t.status==="ready",opacity:pn,moveSensitivity:Ln,position:Mn})]})}import{useState as Tc}from"react";import{ArrowRight as bD,ChevronRight as hD,Download as vD}from"lucide-react";import{jsx as ct,jsxs as ht}from"react/jsx-runtime";function Lc(e){return e===void 0?"Not set":JSON.stringify(e)}var mm={changes:"Changes only",all:"All objects",added:"Added",removed:"Removed",modified:"Modified",unchanged:"Unchanged",ambiguous:"Unmatched"},D0={all:"All categories",identity:"Identity",appearance:"Appearance",transform:"Transform",visibility:"Visibility",data:"Data",behavior:"Behavior"};function T0({change:e}){return ht("div",{className:"ri-semanticPanel__change",children:[ct("code",{title:e.path,children:e.path}),ht("span",{children:[ct("del",{title:Lc(e.before),children:Lc(e.before)}),ct(bD,{size:11,"aria-hidden":"true"}),ct("ins",{title:Lc(e.after),children:Lc(e.after)})]})]})}function kH({report:e,selected:t,onSelect:n,onClear:r,matchBy:o,onMatchByChange:i,showOutlines:s,onShowOutlinesChange:l}){let[c,u]=Tc(!0),[p,m]=Tc(""),[a,f]=Tc("changes"),[d,h]=Tc("all"),b=e.objects.filter(v=>(a==="all"||(a==="changes"?v.status!=="unchanged":v.status===a))&&(d==="all"||v.changes.some(S=>S.category===d))&&`${v.label} ${v.identity}`.toLowerCase().includes(p.toLowerCase())),x=()=>{let v=URL.createObjectURL(new Blob([JSON.stringify(e,null,2)],{type:"application/json"})),S=document.createElement("a");S.href=v,S.download="configuration-comparison.json",S.click(),setTimeout(()=>URL.revokeObjectURL(v),1e3)};return ht("aside",{className:"ri-semanticPanel","aria-label":"Configuration comparison",onPointerDown:v=>v.stopPropagation(),children:[ht("button",{className:"ri-semanticPanel__heading",type:"button","aria-expanded":c,onClick:()=>u(!c),children:[ct(hD,{size:13,"aria-hidden":"true",className:c?"ri-semanticPanel__chevron--open":void 0}),"Changes",ht("span",{className:"ri-semanticPanel__counts",children:[ht("span",{"data-status":"added",title:`${e.counts.added} added`,children:["+",e.counts.added]}),ht("span",{"data-status":"removed",title:`${e.counts.removed} removed`,children:["\u2212",e.counts.removed]}),ht("span",{"data-status":"modified",title:`${e.counts.modified} modified`,children:["~",e.counts.modified]})]})]}),c&&ht("div",{className:"ri-semanticPanel__body",children:[i&&ht("details",{children:[ct("summary",{children:"Matching"}),ht("label",{children:["Match by",ht(Ct,{"aria-label":"Match objects by",value:typeof o=="object"?"metadata":o??"modelObjectId",onChange:v=>i(v.target.value==="metadata"?{metadataKey:"partId"}:v.target.value),children:[ct("option",{value:"modelObjectId",children:"Model object ID"}),ct("option",{value:"id",children:"Binding ID"}),ct("option",{value:"metadata",children:"Metadata value"})]})]}),typeof o=="object"&&ht("label",{children:["Key",ct("input",{"aria-label":"Comparison metadata key",value:o.metadataKey,onChange:v=>i({metadataKey:v.target.value})})]})]}),ct("input",{className:"ri-semanticPanel__search","aria-label":"Search comparison",placeholder:"Filter objects",value:p,onChange:v=>m(v.target.value)}),ht("div",{className:"ri-semanticPanel__filters",children:[ct(Ct,{"aria-label":"Filter comparison status",value:a,onChange:v=>f(v.target.value),children:Object.keys(mm).map(v=>ct("option",{value:v,children:mm[v]},v))}),ct(Ct,{"aria-label":"Filter change category",value:d,onChange:v=>h(v.target.value),children:Object.keys(D0).map(v=>ct("option",{value:v,children:D0[v]},v))})]}),ht("div",{className:"ri-semanticPanel__rows",children:[b.map(v=>ht("div",{className:"ri-semanticPanel__row","data-status":v.status,children:[ht("button",{type:"button","aria-pressed":t===v.id,onClick:()=>n(v),children:[ct("span",{children:v.label}),ct("small",{children:mm[v.status]})]}),t===v.id&&ht("div",{className:"ri-semanticPanel__details",children:[v.message&&ct("p",{children:v.message}),v.changes.map(S=>ct(T0,{change:S},S.path)),!v.changes.length&&!v.message&&ct("p",{children:v.status==="unchanged"?"No authored changes.":`Object ${v.status}.`})]})]},v.id)),!b.length&&ct("p",{className:"ri-semanticPanel__empty",children:"No matching objects."})]}),e.sceneChanges.length>0&&ht("details",{children:[ht("summary",{children:["Scene changes (",e.sceneChanges.length,")"]}),ct("div",{className:"ri-semanticPanel__details",children:e.sceneChanges.map(v=>ct(T0,{change:v},v.path))})]}),ht("div",{className:"ri-semanticPanel__footer",title:"Compares authored bindings and settings. Geometry changes inside model files are not detected.",children:[ht("label",{className:"ri-semanticPanel__outlineToggle",children:[ct("input",{type:"checkbox",checked:s,onChange:v=>l(v.target.checked)}),"Outlines"]}),t&&r&&ct("button",{type:"button",onClick:r,children:"Clear focus"}),ht("button",{type:"button",onClick:x,children:[ct(vD,{size:12,"aria-hidden":"true"}),"Report"]})]})]})]})}import{Vector3 as _c}from"three";var ds=1e-6;function DH(){let e=[null,null],t=0,n=!1,r=new _c,o=new _c,i=new _c,s=new _c,l=(u,p)=>{let m=e[u],a=e[p];if(!m||!a)return;m.controls.getPosition(r,!1),m.controls.getTarget(i,!1),a.controls.getPosition(o,!1),a.controls.getTarget(s,!1);let f=m.controls.camera.zoom,d=m.controls.camera.fov,h=typeof d=="number"&&typeof a.controls.camera.fov=="number"&&Math.abs(d-a.controls.camera.fov)>=ds;if(!(r.distanceToSquared(o)<ds&&i.distanceToSquared(s)<ds&&Math.abs(f-a.controls.camera.zoom)<ds&&!h)){n=!0;try{h&&(a.controls.camera.fov=d,a.controls.camera.updateProjectionMatrix?.()),Math.abs(f-a.controls.camera.zoom)>=ds&&a.controls.zoomTo(f,!1),a.controls.setLookAt(r.x,r.y,r.z,i.x,i.y,i.z,!1)}finally{n=!1}a.invalidate()}},c=u=>{n||(u===t?l(u,1-u):l(t,u))};return{attach(u,p,m){let a=e[u];if(a?.controls===p){a.invalidate=m;return}a?.detach();let f=()=>c(u),d=()=>{t=u},h=_g(p,d);p.addEventListener("update",f),p.addEventListener("controlstart",d),e[u]={controls:p,invalidate:m,detach:()=>{h(),p.removeEventListener("update",f),p.removeEventListener("controlstart",d)}},l(t,1-t)},setLeader(u){t=u},get leader(){return t},detach(){e.forEach(u=>u?.detach()),e[0]=e[1]=null}}}import{Fragment as yD,jsx as fm,jsxs as B0}from"react/jsx-runtime";var Bc=.05,L0=.2,_0=e=>Math.min(Math.max(Number.isFinite(e)?e:.5,0),1);function _H({split:e,onSplitChange:t,labels:n,containerRef:r,beforeAction:o}){let i=oe(),s=m=>{let a=r.current?.getBoundingClientRect();a&&a.width>0&&t(_0((m-a.left)/a.width))},l=m=>{m.preventDefault(),m.stopPropagation(),m.currentTarget.setPointerCapture(m.pointerId),m.currentTarget.focus(),s(m.clientX)},c=m=>{m.currentTarget.hasPointerCapture(m.pointerId)&&s(m.clientX)},u=m=>{let a={ArrowLeft:e-Bc,ArrowDown:e-Bc,ArrowRight:e+Bc,ArrowUp:e+Bc,PageDown:e-L0,PageUp:e+L0,Home:0,End:1}[m.key];a!==void 0&&(m.preventDefault(),m.stopPropagation(),t(_0(a)))},p=Math.round(e*100);return B0(yD,{children:[B0("span",{className:"ri-compare__label ri-compare__label--before",hidden:e<.08,children:[n[0],o]}),fm("span",{className:"ri-compare__label ri-compare__label--after",hidden:e>.92,children:n[1]}),fm("div",{className:"ri-compare__divider",role:"slider",tabIndex:0,"aria-label":i("compareDivider"),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":p,"aria-valuetext":i("compareDividerValue",{before:n[0],after:n[1],percent:p,rest:100-p}),onPointerDown:l,onPointerMove:c,onKeyDown:u,children:fm("span",{className:"ri-compare__handle","aria-hidden":"true"})})]})}export{Cl as a,uM as b,fy as c,Oy as d,tv as e,zh as f,yd as g,Jp as h,WO as i,_w as j,nv as k,ov as l,v0 as m,Ed as n,Pl as o,mD as p,kH as q,DH as r,_0 as s,_H as t,$D as u,xM as v};
|