@liveroom-tech/react-immersive 6.2.0 → 6.2.1
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/DownloadedEnvironment-NHM4U2LJ.mjs +1 -0
- package/dist/{SequencesTab-ODR5IGDX.mjs → SequencesTab-VZKEKAUG.mjs} +1 -1
- package/dist/StreamingTilesModel-6Z7SIC2J.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 +59 -58
- package/dist/binding-builder.mjs +1 -1
- package/dist/chunk-25WC5KDO.mjs +50 -0
- package/dist/chunk-2AJK643D.mjs +1 -0
- package/dist/chunk-3OCHN3CA.mjs +1 -0
- package/dist/{chunk-3XZKDTB2.mjs → chunk-7OVEHDDE.mjs} +1 -1
- package/dist/chunk-KFLS7GI6.mjs +1 -0
- package/dist/{chunk-EWNN4BBR.mjs → chunk-KYXJG3TX.mjs} +1 -1
- package/dist/{chunk-2CUPPOBW.mjs → chunk-LD7QWHB4.mjs} +2 -2
- package/dist/{chunk-GXY3VML4.mjs → chunk-NMRTI3NQ.mjs} +1 -1
- package/dist/chunk-RKDATTUM.mjs +1 -0
- package/dist/chunk-RXZ4Q7CY.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-UHRJ2RBF.mjs +1 -0
- package/dist/chunk-UTVFRMYW.mjs +47 -0
- package/dist/chunk-YKDDNX2D.mjs +69 -0
- package/dist/exportSceneMesh-YJFOLFHS.mjs +1 -0
- package/dist/hosted.css +1 -1
- package/dist/hosted.d.mts +3 -3
- package/dist/hosted.d.ts +3 -3
- package/dist/hosted.js +58 -57
- 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 +52 -51
- package/dist/index.mjs +1 -1
- package/dist/meshFormats-4C6NHYOA.mjs +1 -0
- package/dist/modelFileResolver-CVmON8hg.d.mts +1724 -0
- package/dist/modelFileResolver-CVmON8hg.d.ts +1724 -0
- package/dist/modelViewerProps-BBnZTFO-.d.ts +949 -0
- package/dist/modelViewerProps-CIY4nsNY.d.mts +949 -0
- package/dist/{publicProps-Cmh9JtzJ.d.ts → publicProps-BARVwXu7.d.ts} +1 -1
- package/dist/{publicProps-TMARX628.d.mts → publicProps-n0Yvr_Km.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/chunk-3MIILDHB.mjs +0 -83
- package/dist/chunk-6Q6YZ7O5.mjs +0 -1
- package/dist/chunk-7MN2TMY6.mjs +0 -47
- 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 Cg}from"./chunk-KYXJG3TX.mjs";import{c as cl,h as Fn,i as sh}from"./chunk-FGAJ2UT7.mjs";import{a as _b,b as ui,c as Zu,d as il,e as So,f as al,g as $b,i as Kb,j as Qb,k as xa,l as ln,m as sl}from"./chunk-3OCHN3CA.mjs";import{A as Bb,B as jb,C as Nb,D as Ib,E as zb,F as Vb,G as Fb,H as Hb,I as Gb,J as ya,K as ll,L as Jb,M as Yb,N as nh,a as ii,b as cg,c as Vs,d as ol,e as mb,f as fb,g as gb,j as qu,l as zn,m as Cb,n as Mb,o as Pb,p as kb,q as Rb,r as Ab,s as Ob,t as Eb,u as Qu,v as Db,w as Ju,x as Tb,y as Lb}from"./chunk-UTVFRMYW.mjs";import{a as Sg,b as re}from"./chunk-NMRTI3NQ.mjs";import{a as rh}from"./chunk-37YITTIK.mjs";import{a as Ku,b as yb,c as xb,d as wb,e as Sb,f as Ub,j as Wb,k as Xb,l as qb}from"./chunk-RKDATTUM.mjs";import{A as Eg,Aa as oh,Ba as ih,Ca as ah,D as Re,J as Js,K as Dg,L as Ys,M as Tg,N as _g,O as Lg,P as Bg,Q as jg,R as Zs,S as Ng,T as el,U as ga,V as Ig,W as Hu,X as tl,Y as zg,Z as Vg,_ as Fg,a as Bn,b as jn,c as sg,d as lg,da as tb,e as Nn,ea as nl,f as ug,g as Iu,ga as $u,h as dg,ha as rb,i as pg,ia as nb,j as Gs,ja as ob,k as bg,ka as Wu,l as hg,la as ib,m as vg,ma as ub,na as db,o as wg,oa as pb,p as Og,sa as Yu,va as eh,w as fa,wa as th,x as Qs,z as Fu}from"./chunk-25WC5KDO.mjs";import{e as Fs}from"./chunk-LX3GXQNU.mjs";import{d as Wg,e as rl,f as wo,g as Xg,h as qg,i as Uu,j as Kg,k as Qg,l as Jg,o as Yg,q as Zg,r as eb,s as ba}from"./chunk-7JCFNZJM.mjs";import{b as Xs,c as xg,d as si,e as ma,i as qs,l as Mg,m as Ks,n as li,o as Pg,q as kg,r as Rg,s as Ag}from"./chunk-UHRJ2RBF.mjs";import{c as Zb}from"./chunk-CCBFMNAU.mjs";import{a as Hs}from"./chunk-GV4ZRXL6.mjs";import{a as zu,b as mg,c as fg,d as gg,e as Vu,f as Us,g as pa,h as $s}from"./chunk-7OWHW66D.mjs";import{a as bb,b as va,c as Xu,e as hb,f as vb}from"./chunk-KFLS7GI6.mjs";import{a as Hg,b as Gg,c as Ug,d as sn,g as $g,h as Gu}from"./chunk-BNKTI3CY.mjs";import{a as ab,d as sr,e as ha,f as sb,g as ci,h as lb,p as cb}from"./chunk-UCD76KQ6.mjs";import{a as Vn,b as ed}from"./chunk-TUYVYSN5.mjs";import{a as Wr,b as In,c as Ws,d as ai,e as yg,g as an}from"./chunk-RXZ4Q7CY.mjs";var lh={showObjectBindingDataPanel:!1,showSceneObjectsPanel:!1,showDownloadButton:!1,showResetButton:!1,showAnnotationNavigation:!1,showMaterialVariants:!1},TC=Object.freeze({minimal:Object.freeze({...lh}),showcase:Object.freeze({...lh,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})}),_C=["preset","ui","tools","controls","perf","tiles","xr","decoders"];function ch(e){let t={};for(let r of Object.keys(e))e[r]!==void 0&&(t[r]=e[r]);return t}function LC({ui:e,tools:t,controls:r,perf:n,tiles:o,xr:i,decoders:a}){let l=e?.download,c=e?.mouseController,d=t?.measure,p=r?.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:d===void 0?void 0:d!==!1,measurementUnit:typeof d=="object"?d.unit:void 0,showUvCheckerButton:t?.uvChecker,showExplodeControls:t?.explode,showSectionTools:t?.section,showSequenceControls:t?.sequences,showIsolateControls:t?.isolate,texturePositioning:t?.texturePositioning,enableCameraControls:r?.enabled,enableKeyboardNavigation:r?.keyboard,reducedMotion:r?.reducedMotion,disableZoom:r?.zoom===void 0?void 0:!r.zoom,pageScroll:r?.pageScroll,zoomOnSelected:r?.zoomOnSelect,autoRotate:p===void 0?void 0:p!==!1,autoRotateSpeed:typeof p=="number"?p:void 0,refitOnResize:r?.refitOnResize,cameraLimits:r?.limits,moveSensitivity:r?.moveSensitivity,zoomSensitivity:r?.zoomSensitivity,renderMode:n?.renderMode,maxDpr:n?.maxDpr,performanceProfile:n?.profile,preserveDrawingBuffer:n?.preserveDrawingBuffer,webgpu:n?.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:a?.draco,ktx2TranscoderPath:a?.ktx2,meshopt:a?.meshopt}}function uh(e){let t={...e};for(let r of _C)delete t[r];return{...e.preset?TC[e.preset]:void 0,...ch(t),...ch(LC(e))}}import{useCallback as di,useEffect as ul,useMemo as td,useRef as pi,useState as mi}from"react";var dh=e=>e instanceof Error?e.message:String(e);function BC(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 jC(e,t){let r=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 n of e.options){let o=JSON.stringify([n?.groupId,n?.optionId]);if(!n||typeof n.available!="boolean"||n.reason!==void 0&&typeof n.reason!="string"||r.has(o)||!t.groups.some(i=>i.id===n.groupId&&i.options.some(a=>a.id===n.optionId)))throw new Error("The availability service returned invalid data.");r.add(o)}}return{available:e.available,...e.message!==void 0?{message:e.message}:{},...e.options?{options:e.options.map(({groupId:n,optionId:o,available:i,reason:a})=>({groupId:n,optionId:o,available:i,...a!==void 0?{reason:a}:{}}))}:{}}}function ph(e){let t=JSON.stringify(e.product),r=td(()=>Wg(e.product),[t]),n=JSON.stringify([r.id,r.revision]),[o,i]=mi(()=>({productIdentity:n,selections:e.initialSelections??rl(r)})),a=e.selections??(o.productIdentity===n?o.selections:rl(r)),[l,c]=mi(e.initialQuantity??1),d=JSON.stringify(a),p=td(()=>wo(r,a,l),[r,d,l]),m=e.adapter,s=m?.key??"",f=`${t}
|
|
2
|
+
${p.key}
|
|
3
|
+
${s}`;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[u,h]=mi(0),[v,x]=mi(null),[b,S]=mi(null),[w,P]=mi({identity:f,pending:null,result:null,error:null}),y=pi(!1),M=pi(!0),_=pi(0),C=pi(null),E=pi(null),R=pi({options:e,product:r,base:p,identity:f,commerce:v,adapter:m,optionStates:[]}),O=e.selections!==void 0&&!e.onSelectionsChange,D=v?.identity===f&&v.adapterKey===s?v:null,B=D?.configuration??p,V=td(()=>Yg(r,p.selections,D?.availability??void 0,l),[r,p,D?.availability,l]);R.current={options:e,product:r,base:p,identity:f,commerce:v,adapter:m,optionStates:V},ul(()=>{P({identity:f,pending:null,result:null,error:null}),S(null)},[f]);let G=di(()=>{y.current=!1,P(Q=>({...Q,error:null,result:null})),h(Q=>Q+1)},[]);ul(()=>{let Q=new AbortController,te=++_.current;return y.current=!1,p.valid?(x({identity:f,adapterKey:s,status:"loading",configuration:p,price:null,availability:null,error:null}),(async()=>{try{let q=structuredClone(p),H={signal:Q.signal};if(m?.resolveSku){let ne=await m.resolveSku(structuredClone(q),H);if(ne!==null&&(typeof ne!="string"||!ne.trim()))throw new Error("The SKU service returned an invalid SKU.");q.sku=ne}if(Q.signal.aborted)return;let[N,J]=await Promise.all([m?.getPrice?Promise.resolve().then(()=>m.getPrice(structuredClone(q),H)).then(BC):Promise.resolve(null),m?.getAvailability?Promise.resolve().then(()=>m.getAvailability(structuredClone(q),H)).then(ne=>jC(ne,r)):Promise.resolve(null)]);if(Q.signal.aborted||te!==_.current||R.current.identity!==f||R.current.adapter?.key!==m?.key)return;y.current=!0,x({identity:f,adapterKey:s,status:"ready",configuration:q,price:N??null,availability:J??null,error:null})}catch(q){if(Q.signal.aborted||te!==_.current||R.current.identity!==f||R.current.adapter?.key!==m?.key)return;x({identity:f,adapterKey:s,status:"error",configuration:p,price:null,availability:null,error:dh(q)})}})(),()=>Q.abort()):(x(null),()=>Q.abort())},[f,s,u]),ul(()=>{let Q=D?.price?.expiresAt;if(!Q)return;let te=Date.parse(Q)-Date.now(),q,H=()=>{let N=Date.parse(Q)-Date.now();if(N>0){q=setTimeout(H,Math.min(N,2147483647));return}y.current=!1,x(J=>J?.identity===f?{...J,status:"error",error:"The price expired. Refresh it before continuing."}:J)};return q=setTimeout(H,Math.min(Math.max(te,0),2147483647)),()=>clearTimeout(q)},[D?.price?.expiresAt,f]),ul(()=>(M.current=!0,()=>{M.current=!1,y.current=!1,_.current++,C.current?.controller.abort()}),[]);let U=di(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(C.current)throw new Error("Wait for the current cart or quote request to finish.");let q=wo(te.product,Q,te.base.quantity);if(q.issues.some(H=>H.code==="unknown-group"||H.code==="unknown-option"))throw new Error("Selections reference unknown product options.");if(q.key===te.base.key){S(null);return}y.current=!1,S(null),h(H=>H+1),te.options.onSelectionsChange&&te.options.onSelectionsChange(structuredClone(q.selections)),te.options.selections===void 0&&i({productIdentity:JSON.stringify([te.product.id,te.product.revision]),selections:q.selections})},[]),T=di((Q,te)=>{let q=R.current,H=q.product.groups.find(ne=>ne.id===Q),N=q.optionStates.find(ne=>ne.groupId===Q&&ne.optionId===te);if(!H||te!==null&&!N)throw new Error("Unknown product option.");let J=te===null?wo(q.product,{...q.base.selections,[Q]:null},q.base.quantity).issues.filter(ne=>ne.groupIds.includes(Q)&&ne.code!=="sku"):[];return J.length||N&&!N.available?(S(N?.reasons.join(" ")||J.map(ne=>ne.message).join(" ")),!1):(U({...q.base.selections,[Q]:te}),!0)},[U]),A=di((Q,te)=>{let q=R.current,H=Xg(q.product,q.base.selections,Q,te,q.base.quantity);return H?(U(H),!0):(S("This choice isn't available with any combination."),!1)},[U]),Z=di(Q=>{if(C.current)throw new Error("Wait for the current cart or quote request to finish.");wo(R.current.product,R.current.base.selections,Q),Q!==R.current.base.quantity&&(y.current=!1,c(Q))},[]),ee=di(Q=>{if(C.current)return C.current.kind===Q&&C.current.identity===R.current.identity?C.current.promise:Promise.reject(new Error("Another commerce request is already running."));let te=R.current,q=te.commerce,H=Q==="cart"?te.adapter?.addToCart:te.adapter?.requestQuote,N=ve=>(P({identity:te.identity,pending:null,result:null,error:ve}),Promise.reject(new Error(ve)));if(!H)return N("No commerce adapter is configured for this action.");if(!te.base.valid)return N("Resolve the option conflicts before continuing.");if(!y.current||!q||q.identity!==te.identity||q.adapterKey!==(te.adapter?.key??"")||q.status!=="ready")return N("Wait for current pricing and availability, or retry the service request.");if(q.availability?.available===!1||q.availability?.options?.some(ve=>!ve.available&&te.base.selections[ve.groupId]===ve.optionId))return N(q.availability?.message??"This configuration is currently unavailable.");if(Q==="cart"&&te.adapter?.resolveSku&&!q.configuration.sku)return N("No SKU is available for this configuration.");if(q.price?.expiresAt&&Date.parse(q.price.expiresAt)<=Date.now())return G(),N("The price expired. Refresh it before continuing.");let J=structuredClone(q.configuration),ne=q.price?structuredClone(q.price):null,Ne=new AbortController,K=te.identity;(E.current?.identity!==K||E.current.kind!==Q)&&(E.current={identity:K,kind:Q,key:crypto.randomUUID()});let xe=E.current.key;P({identity:K,pending:Q,result:null,error:null});let Pe=Promise.resolve().then(()=>(Ne.signal.throwIfAborted(),H(J,{signal:Ne.signal,idempotencyKey:xe,price:ne}))).then(ve=>{if(!ve||typeof ve!="object"||ve.id!==void 0&&typeof ve.id!="string"||ve.message!==void 0&&typeof ve.message!="string")throw new Error("The commerce service returned an invalid result.");let mt={...ve.id?{id:ve.id}:{},...ve.message?{message:ve.message}:{}};return R.current.identity===K&&!Ne.signal.aborted&&P({identity:K,pending:null,result:mt,error:null}),E.current=null,mt}).catch(ve=>{throw R.current.identity===K&&!Ne.signal.aborted&&P({identity:K,pending:null,result:null,error:dh(ve)}),ve}).finally(()=>{C.current?.promise===Pe&&(C.current=null),M.current&&P(ve=>({...ve,pending:null}))});return C.current={identity:K,kind:Q,promise:Pe,controller:Ne},Pe},[G]),Y=p.valid&&D?.status==="ready"&&y.current&&!C.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:r,configuration:B,optionStates:V,selectOption:T,selectOptionWithFix:A,setSelections:U,reset:()=>U(rl(r)),setQuantity:Z,exportConfiguration:()=>Zg(B),importConfiguration:Q=>{let te=eb(Q,r);U(te.selections),Z(te.quantity)},viewerProps:{...e.objectBindings!==void 0?{objectBindings:e.objectBindings}:{},sceneConfig:{...e.sceneConfig??Qs,product:{definition:r,selections:p.selections}}},status:D?.status??(p.valid?"loading":"idle"),price:D?.price??(m?.getPrice||!p.valid?null:qg(r,B)),checkoutUrl:D?.availability?.available===!1?null:Kg(r,B),availability:D?.availability??null,error:b??(w.identity===f?w.error:null)??D?.error??null,readOnly:O,pendingAction:C.current?C.current.kind:null,result:w.identity===f?w.result:null,canAddToCart:!!(Y&&m?.addToCart&&(!m.resolveSku||B.sku)),canRequestQuote:!!(Y&&m?.requestQuote),hasCommerce:!!m,hasCart:!!m?.addToCart,hasQuote:!!m?.requestQuote,addToCart:()=>ee("cart"),requestQuote:()=>ee("quote"),refresh:G}}import{useId as NC}from"react";import{Fragment as VC,jsx as Je,jsxs as Ot}from"react/jsx-runtime";function IC(e,t){return t.map(r=>e.groups.find(n=>n.id===r.groupId)?.options.find(n=>n.id===r.optionId)?.label).filter(Boolean).join(", ")}function zC({c:e,group:t,option:r,state:n,name:o,display:i,busy:a}){let l=re(),c=`${o}-${r.id}-reason`,d=!n.available&&n.fix?.length?n.fix:null,p=!n.available&&!d,m=d?l("productAlsoChanges",{changes:IC(e.product,d)}):n.available?"":n.reasons.join(" "),s=r.priceDeltaMinor&&e.product.pricing?Uu(r.priceDeltaMinor,e.product.pricing.currency,!0):"",f=["ri-productChoice",n.selected&&"ri-productChoice--selected",!n.available&&"ri-productChoice--unavailable"].filter(Boolean).join(" "),u=Je("input",{type:"radio",name:o,checked:n.selected,disabled:p||a||e.readOnly,"aria-describedby":m?c:void 0,onChange:()=>{d?e.selectOptionWithFix(t.id,r.id):e.selectOption(t.id,r.id)}});return i==="swatches"?Ot("label",{className:`${f} ri-productSwatch`,title:[r.label,s,m].filter(Boolean).join(" \xB7 "),children:[u,Je("span",{className:"ri-productSwatchChip",style:{background:r.swatch??"var(--ri-ui-field)"},"aria-hidden":"true"}),Ot("span",{className:"ri-productVisuallyHidden",children:[r.label,s?` ${s}`:""]}),m?Je("span",{id:c,className:"ri-productVisuallyHidden",children:m}):null]}):i==="chips"?Ot("label",{className:`${f} ri-productChip`,title:m||void 0,children:[u,Ot("span",{children:[r.label,s?Je("em",{children:s}):null]}),m?Je("span",{id:c,className:"ri-productVisuallyHidden",children:m}):null]}):Ot("label",{className:f,children:[u,r.swatch?Je("span",{className:"ri-productSwatchChip",style:{background:r.swatch},"aria-hidden":"true"}):null,Ot("span",{className:"ri-productChoiceText",children:[Ot("span",{className:"ri-productChoiceTitle",children:[Je("span",{children:r.label}),s?Je("em",{children:s}):null]}),r.description?Je("small",{children:r.description}):null,m?Je("small",{id:c,children:m}):null]})]})}function rd({configurator:e,className:t="",showCommerce:r=!0,actions:n}){let o=re(),i=!!e.pendingAction,a=NC(),l=e.price?Uu(e.price.amountMinor,e.price.currency):"",c=r&&(e.hasCommerce||!!e.product.pricing||!!e.product.checkout);return Ot("section",{className:`ri-productOptions ${t}`,"aria-label":o("productOptionsFor",{product:e.product.label}),children:[Ot("div",{className:"ri-productHeader",children:[Je("strong",{children:e.product.label}),Je("button",{type:"button",disabled:i||e.readOnly,onClick:e.reset,children:o("productReset")})]}),e.product.groups.map((d,p)=>{let m=`${a}-${p}`,s=d.display??"list",f=d.options.find(h=>h.id===e.configuration.selections[d.id]),u=d.required?[]:wo(e.product,{...e.configuration.selections,[d.id]:null},e.configuration.quantity).issues.filter(h=>h.groupIds.includes(d.id)).map(h=>h.message);return Ot("fieldset",{disabled:i||e.readOnly,children:[Ot("legend",{children:[d.label,d.required?null:Ot("small",{children:[" (",o("productOptional"),")"]}),s==="swatches"&&f?Je("span",{className:"ri-productLegendValue",children:f.label}):null]}),Ot("div",{className:`ri-productChoices ri-productChoices--${s}`,children:[d.required?null:Ot("label",{className:`ri-productChoice${s==="swatches"||s==="chips"?" ri-productChip":""}${e.configuration.selections[d.id]===null?" ri-productChoice--selected":""}${u.length?" ri-productChoice--unavailable":""}`,title:u.join(" ")||void 0,children:[Je("input",{type:"radio",name:m,checked:e.configuration.selections[d.id]===null,disabled:!!u.length,onChange:()=>e.selectOption(d.id,null)}),Je("span",{children:o("productNone")})]}),d.options.map(h=>{let v=e.optionStates.find(x=>x.groupId===d.id&&x.optionId===h.id);return Je(zC,{c:e,group:d,option:h,state:v,name:m,display:s,busy:i},h.id)})]})]},d.id)}),e.configuration.issues.length?Je("ul",{className:"ri-productIssues","aria-label":o("productIssues"),children:e.configuration.issues.map((d,p)=>Je("li",{children:d.message},p))}):null,c?Ot("div",{className:"ri-productCommerce",children:[Ot("label",{className:"ri-productQuantity",children:[o("productQuantity"),Je("input",{type:"number",min:1,max:9999,step:1,value:e.configuration.quantity,disabled:i,onChange:d=>{let p=d.target.valueAsNumber;Number.isSafeInteger(p)&&p>=1&&p<=9999&&e.setQuantity(p)}})]}),e.status==="loading"&&e.hasCommerce?Je("p",{role:"status",children:o("productCheckingPrice")}):Ot(VC,{children:[l?Ot("p",{className:"ri-productPrice",children:[l,Je("small",{children:e.price?.label??o("productTotal")})]}):null,e.configuration.sku?Ot("p",{className:"ri-productSku",children:["SKU: ",e.configuration.sku]}):null,e.availability?.available===!1?Je("p",{className:"ri-productIssues",children:e.availability.message??o("productUnavailable")}):null]}),Ot("div",{className:"ri-productActions",children:[e.checkoutUrl?Je("a",{className:"ri-productPrimary",href:e.checkoutUrl,target:"_blank",rel:"noopener noreferrer",children:e.product.checkout?.label??o("productBuy")}):null,e.hasCart?Je("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?Je("button",{type:"button",disabled:!e.canRequestQuote,onClick:()=>{e.requestQuote().catch(()=>{})},children:e.pendingAction==="quote"?o("productRequestingQuote"):o("productRequestQuote")}):null,e.hasCommerce?Je("button",{type:"button",disabled:i||!e.configuration.valid,onClick:e.refresh,children:o("productRefresh")}):null,n]})]}):n?Je("div",{className:"ri-productActions",children:n}):null,e.error?Je("p",{className:"ri-productError",role:"alert",children:e.error}):null,e.result?Je("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 Hn,useEffect as FC,useRef as mh,useState as nd}from"react";var od={currentClip:null,isPlaying:!1,speed:1,time:0,duration:0,active:[]};function sD(){let e=mh(null),t=mh(null),[r,n]=nd([]),[o,i]=nd([]),[a,l]=nd(od);FC(()=>()=>{t.current?.()},[]);let c=Hn(v=>{t.current?.(),e.current=v,n(v.clips),i(v.clipDetails??v.clips.map(x=>({sourceName:x,duration:0}))),l(v.getState?.()??od),t.current=v.subscribe?.(l)??null},[]),d=Hn(()=>{t.current?.(),t.current=null,e.current=null,n([]),i([]),l(od)},[]),p=Hn(v=>{let x=e.current;x&&(v(x),!x.subscribe&&x.getState&&l(x.getState()))},[]),m=Hn((v,x)=>p(b=>b.play(v,x)),[p]),s=Hn(v=>p(x=>x.pause(v)),[p]),f=Hn(v=>p(x=>x.stop(v)),[p]),u=Hn((v,x)=>p(b=>b.setSpeed(v,x)),[p]),h=Hn((v,x)=>p(b=>b.seek?.(v,x)),[p]);return{clips:r,clipDetails:o,...a,isRenderPaused:a.isRenderPaused??!1,play:m,pause:s,stop:f,setSpeed:u,seek:h,handleAnimationsReady:c,clearAnimations:d}}import{Fragment as dl,jsx as pe,jsxs as le}from"react/jsx-runtime";var cn=e=>e.toLocaleString(),fi=e=>e==null?"Unknown":e>=1024*1024?`${(e/1024/1024).toFixed(1)} MiB`:`${(e/1024).toFixed(1)} KiB`,id=e=>e===null?"Unavailable":cn(e);function HC({report:e,runtimeStats:t,onRefresh:r,onSelectObject:n}){return le("div",{className:"ri-assetDiagnostics",children:[le("div",{className:"ri-diagnosticsActions",children:[r&&pe("button",{type:"button",disabled:!e||e.status==="failed",onClick:r,children:"Rescan asset"}),pe("button",{type:"button",disabled:!e,onClick:()=>{Vn(new Blob([JSON.stringify({asset:e,runtime:t??null},null,2)],{type:"application/json"}),"asset-diagnostics.json")},children:"Download report"})]}),e?le(dl,{children:[le("div",{className:`ri-diagnosticsSummary ri-diagnosticsSummary--${e.issues.some(o=>o.severity==="error")?"error":e.issues.some(o=>o.severity==="warning")?"warning":"info"}`,children:[pe("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"}),le("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"]})]}),le("p",{className:"ri-diagnosticsSource",children:[e.source.name??"Loaded asset"," ",pe("span",{children:e.source.format?.toUpperCase()})]}),le("details",{className:"ri-diagnosticsDetail",children:[pe("summary",{children:"Asset statistics"}),le("dl",{className:"ri-diagnosticsMetrics",children:[le("div",{children:[pe("dt",{children:"Source"}),pe("dd",{children:e.source.name??"Loaded asset"})]}),le("div",{children:[pe("dt",{children:"Format"}),pe("dd",{children:e.source.format?.toUpperCase()??"Unknown"})]}),le("div",{children:[pe("dt",{children:"Source file size"}),pe("dd",{children:fi(e.source.sourceBytes)})]}),le("div",{children:[pe("dt",{children:"Initial asset load"}),pe("dd",{children:e.source.loadDurationMs==null?"Unknown":`${(e.source.loadDurationMs/1e3).toFixed(2)} s`})]}),le("div",{children:[pe("dt",{children:"Units"}),pe("dd",{children:e.units==="unknown"?"Unknown \u2014 verify scale":e.units})]}),e.bounds&&le("div",{children:[pe("dt",{children:"Bounds (scene units)"}),pe("dd",{children:e.bounds.size.map(o=>Number(o.toPrecision(4))).join(" \xD7 ")})]}),e.statistics&&le(dl,{children:[le("div",{children:[pe("dt",{children:"Meshes / instances"}),le("dd",{children:[cn(e.statistics.meshes)," / ",cn(e.statistics.instances)]})]}),le("div",{children:[pe("dt",{children:"Unique triangles"}),pe("dd",{children:cn(e.statistics.triangles)})]}),le("div",{children:[pe("dt",{children:"Unique vertices"}),pe("dd",{children:cn(e.statistics.vertices)})]}),le("div",{children:[pe("dt",{children:"Materials / textures"}),le("dd",{children:[cn(e.statistics.materials)," / ",cn(e.statistics.textures)]})]}),le("div",{children:[pe("dt",{children:"Geometry buffers"}),pe("dd",{children:fi(e.statistics.geometryBytes)})]}),le("div",{children:[pe("dt",{children:"Texture memory estimate"}),le("dd",{children:[fi(e.statistics.estimatedTextureBytes),e.statistics.unknownTextureSizes?` + ${e.statistics.unknownTextureSizes} unknown`:""]})]})]})]}),le("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."]})]}),pe("div",{className:"ri-diagnosticsIssues",children:e.issues.map((o,i)=>le("details",{className:`ri-diagnosticsIssue ri-diagnosticsIssue--${o.severity}`,children:[le("summary",{children:[pe("span",{className:"ri-diagnosticsSeverity",children:o.severity}),o.title,o.count!==void 0&&pe("span",{className:"ri-diagnosticsCount",children:cn(o.count)})]}),le("div",{children:[pe("p",{children:o.detail}),pe("p",{className:"ri-diagnosticsFix",children:o.suggestion}),!!o.objects?.length&&pe("ul",{"aria-label":`Affected objects: ${o.title}`,children:o.objects.map((a,l)=>pe("li",{children:n&&!["failed-resources","large-textures"].includes(o.code)?pe("button",{type:"button",onClick:()=>n(a),children:a}):a},`${a}-${l}`))}),o.count&&o.count>(o.objects?.length??0)&&o.objects&&le("small",{children:["Showing the first ",o.objects.length," of ",cn(o.count),"."]})]})]},`${o.code}-${i}`))}),!!e.textures.length&&le("details",{className:"ri-diagnosticsDetail",children:[le("summary",{children:["Texture dimensions (",e.textures.length,")"]}),pe("ul",{children:e.textures.map((o,i)=>le("li",{children:[pe("strong",{children:o.name}),le("span",{children:[o.width??"?"," \xD7 ",o.height??"?",o.compressed?" \xB7 compressed":""," \xB7 ",fi(o.estimatedBytes)]})]},i))})]}),!!e.extensions.length&&le("details",{className:"ri-diagnosticsDetail",children:[le("summary",{children:["glTF extensions (",e.extensions.length,")"]}),pe("ul",{children:e.extensions.map(o=>le("li",{children:[pe("strong",{children:o.name}),le("span",{children:[o.recognized?"Recognized":"Not recognized",o.required?" \xB7 required":" \xB7 optional"]})]},o.name))}),pe("p",{className:"ri-diagnosticsNote",children:"Recognized by the bundled loader; compressed formats still require configured decoders and device support."})]})]}):pe("p",{className:"ri-diagnosticsNote",role:"status",children:"Waiting for the active asset to load\u2026"}),le("details",{className:"ri-diagnosticsDetail ri-diagnosticsRuntimeDetail",children:[pe("summary",{children:"Runtime statistics \xB7 live"}),le("section",{className:"ri-diagnosticsRuntime","aria-label":"Runtime statistics",children:[le("h4",{children:["Runtime statistics ",pe("span",{children:"Live \xB7 this canvas"})]}),t?le(dl,{children:[le("dl",{className:"ri-diagnosticsMetrics",children:[le("div",{children:[pe("dt",{children:"Renderer / render loop"}),le("dd",{children:[t.renderer.toUpperCase()," / ",t.renderMode]})]}),le("div",{children:[pe("dt",{children:"Draw calls (last pass)"}),pe("dd",{children:id(t.drawCalls)})]}),le("div",{children:[pe("dt",{children:"Triangles (last pass)"}),pe("dd",{children:id(t.triangles)})]}),le("div",{children:[pe("dt",{children:"Frame interval / FPS"}),pe("dd",{children:t.frameIntervalMs===null?"Idle / no active frame sample":`${t.frameIntervalMs.toFixed(1)} ms / ${t.fps?.toFixed(0)}`})]}),le("div",{children:[pe("dt",{children:"Quality profile"}),le("dd",{children:[t.quality.profile," \xB7 ",t.quality.reducedGpuLoad?"reduced GPU load":"full quality"]})]}),le("div",{children:[pe("dt",{children:"Pixel ratio"}),pe("dd",{children:t.quality.dpr.toFixed(2)})]}),le("div",{children:[pe("dt",{children:"Shadows / post FX"}),le("dd",{children:[t.quality.shadows?"On":"Off"," / ",t.quality.postProcessing?"Allowed":"Skipped"]})]}),t.streaming&&le(dl,{children:[le("div",{children:[pe("dt",{children:"Tile cache / base budget"}),le("dd",{children:[fi(t.streaming.cachedBytes)," / ",fi(t.streaming.budgetBytes)]})]}),le("div",{children:[pe("dt",{children:"Cached / loading / parsing tiles"}),le("dd",{children:[id(t.streaming.cachedTiles)," / ",t.streaming.downloading," / ",t.streaming.parsing]})]}),le("div",{children:[pe("dt",{children:"Detail / error target"}),le("dd",{children:["\xD7",t.streaming.detailFactor.toFixed(1)," / ",t.streaming.errorTarget.toFixed(1)]})]})]})]}),t.streaming&&(t.streaming.cacheFull||t.streaming.detailFactor>1)&&le("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."]}),pe("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."})]}):pe("p",{className:"ri-diagnosticsNote",children:"Collecting a sample\u2026"})]})]})]})}import{AlertTriangle as GC}from"lucide-react";import{jsx as wa,jsxs as fh}from"react/jsx-runtime";function pl({title:e,message:t,tone:r="default",showKeySetup:n=!1}){let o=re();return fh("div",{className:`ri-license-overlay${r==="error"?" ri-license-overlay--error":""}`,children:[fh("div",{className:"ri-license-overlay__header",children:[r==="error"?wa(GC,{size:16,className:"ri-license-overlay__icon","aria-hidden":"true"}):wa("span",{className:"ri-license-overlay__statusDot","aria-hidden":"true"}),wa("span",{className:"ri-license-overlay__title",children:e})]}),t?wa("p",{className:"ri-license-overlay__message",children:t}):null,n&&wa("a",{href:"https://react-immersive.liveroom.dev/console",target:"_blank",rel:"noopener noreferrer",children:o("createDevelopmentKey")})]})}import{useEffect as cd,useState as qC,useRef as KC}from"react";var UC="ri:license-grant:v1",$C={"260cd89ea13f":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwjr3ofKTkkcxOM0GYl/RlJj9JsuyjSF8sYmCd2YqsHJCEO8EvlNDrO2Kl4agFKo6dRhyR2/oWeiU6P9WIqRbvw=="},gh=new Map;function hh(e){let t=atob(e);return Uint8Array.from(t,r=>r.charCodeAt(0)).buffer}function bh(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return hh(t.padEnd(Math.ceil(t.length/4)*4,"="))}function WC(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())),r=String.fromCharCode(...new Uint8Array(t));return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function ad(e,t){return`${UC}:${t}:${e}`}function XC(e,t){let r=gh.get(e);if(r)return r;let n=crypto.subtle.importKey("spki",hh(t),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);return gh.set(e,n),n}async function sd(e,t,r){if(!globalThis.crypto?.subtle)return null;try{let[n,o,i,a,...l]=e.split("."),c=$C[o];if(n!=="ri1"||!c||!i||!a||l.length>0)return null;let d=JSON.parse(new TextDecoder().decode(bh(i)));if(!WC(d)||!await crypto.subtle.verify({name:"ECDSA",hash:"SHA-256"},await XC(o,c),bh(a),new TextEncoder().encode(`${n}.${o}.${i}`)))return null;let m=Math.floor(Date.now()/1e3),s=d.expiresAt-d.issuedAt;return d.licenseKeyHash!==t||d.domain!==r||d.expiresAt<=m||d.issuedAt>m+300||s<=0||s>43200?null:{environment:d.environment,tier:d.tier,expiresAt:d.expiresAt}}catch{return null}}async function vh(e,t,r){try{return await sd(e,await ml(t),r)}catch{return null}}async function yh(e,t,r){try{let n=await ml(t);return await sd(e,n,r)?(localStorage.setItem(ad(n,r),e),!0):!1}catch{return!1}}async function xh(e,t){try{let r=await ml(e),n=ad(r,t),o=localStorage.getItem(n);if(!o)return null;let i=await sd(o,r,t);return i||localStorage.removeItem(n),i}catch{return null}}async function ld(e,t){try{let r=await ml(e);localStorage.removeItem(ad(r,t))}catch{}}var QC=["localhost","127.0.0.1","0.0.0.0"],JC=e=>QC.includes(e)||e.endsWith(".local")||e.endsWith(".localhost"),Mh="https://react-immersive.liveroom.dev/api/validate-license",pd=()=>typeof window<"u",YC=300*1e3,ZC=5e3,eM=400,dd=new Map,ud=new Map,Gn=class extends Error{},Ph=async(e,t,r)=>{let n=await xh(e,t);return n?(console.warn("[react-immersive] License server unreachable \u2014 using a previously verified, time-limited offline grant."),{status:"valid",reason:"Previously verified offline grant",environment:n.environment,tier:n.tier,isLocalDomain:r}):null},wh=async(e,t,r)=>{let n=await Ph(e,t,r);return n||(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:r})},tM=e=>e instanceof Gn||e instanceof TypeError,rM=()=>new Promise(e=>setTimeout(e,eM)),nM=e=>e==="development"||e==="production",oM=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&&!nM(t.environment)||t.tier!==void 0&&typeof t.tier!="string"||t.offlineGrant!==void 0&&typeof t.offlineGrant!="string")},iM=e=>{if(!e||typeof e!="object")return null;let t=e,r=t.reason??t.error;return typeof r=="string"&&r.trim()?r:null},kh=(e,t,r)=>`${r}::${e}::${t}`,Rh=e=>{let t=dd.get(e);return t?Date.now()-t.timestamp>YC?(dd.delete(e),null):t.result:null},aM=(e,t)=>({status:e.valid?"valid":"invalid",reason:e.reason,environment:e.environment,tier:e.tier,isLocalDomain:t}),sM=(e,t)=>({status:"invalid",reason:e,isLocalDomain:t});async function lM(e,t,r,n){let o=kh(e,t,n),i=Rh(o);if(i)return i;let a=ud.get(o);if(a)return a;let l=(async()=>{for(let c=0;c<2;c+=1)try{return await cM(e,t,r,o,n)}catch(d){if(!tM(d))throw d;if(c===0){let p=await Ph(e,t,r);if(p)return p;await rM();continue}return wh(e,t,r)}return wh(e,t,r)})().finally(()=>{ud.delete(o)});return ud.set(o,l),l}async function cM(e,t,r,n,o){let i=new AbortController,a=setTimeout(()=>i.abort(),ZC),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 Gn("License validation timed out"):p}finally{clearTimeout(a)}let c;try{c=await l.json()}catch{throw new Gn(`License server returned a non-JSON response${l.status?` (${l.status})`:""}`)}if(!l.ok){if(l.status===429||l.status>=500)throw new Gn(`License server error (${l.status})`);let p=iM(c)??`License validation failed${l.status?` (${l.status})`:""}`;return await ld(e,t),sM(p,r)}if(!oM(c))throw new Gn("License server returned an unexpected payload");let d=aM(c,r);if(d.status==="valid"&&o!==Mh){let p=c.offlineGrant?await vh(c.offlineGrant,e,t):null;if(!p)throw new Gn("License validation endpoint did not return a verifiable signed grant");d={...d,environment:p.environment,tier:p.tier}}return d.status==="valid"?(dd.set(n,{result:d,timestamp:Date.now()}),c.offlineGrant&&(await yh(c.offlineGrant,e,t)||console.warn("[react-immersive] The license server returned an invalid offline grant; it was not cached."))):await ld(e,t),d}var Sh=(e,t)=>{let r=e.trim();return!pd()||!r?null:Rh(kh(r,window.location.hostname.toLowerCase(),t))},Ch=new Set,uM=e=>{if(e.status!=="invalid"||e.isLocalDomain||!pd())return;let t=window.location.hostname,r=e.reason??"License validation failed",n=`${t}
|
|
4
|
+
${r}`;Ch.has(n)||(Ch.add(n),console.warn(`[react-immersive] The viewer is not licensed for ${t}: ${r}. See https://react-immersive.liveroom.dev/docs/licensing`))},Ah=(e,t=Mh,r)=>{let[n,o]=qC(()=>Sh(e,t)??{status:"checking",isLocalDomain:!1}),i=KC(r);return i.current=r,cd(()=>{i.current?.(n)},[n]),cd(()=>{uM(n)},[n]),cd(()=>{if(!pd())return;let a=!1,l=f=>{a||o(f)},c=e.trim(),d=window.location.hostname.toLowerCase(),p=JC(d),m=Sh(e,t);return m?(l(m),()=>{a=!0}):(l({status:"checking",isLocalDomain:p}),c?((async()=>{try{l(await lM(c,d,p,t))}catch(f){let u=f instanceof TypeError?"Could not reach license server":f instanceof Error?f.message:"License validation failed";l({status:"invalid",reason:u,isLocalDomain:p})}})(),()=>{a=!0}):(l({status:"invalid",reason:"No license key provided",isLocalDomain:p}),()=>{a=!0}))},[e,t]),n};import{Box3 as dM,Mesh as pM,Raycaster as mM,Triangle as fM,Vector3 as Xr}from"three";function Oh(e,t){if(!(e instanceof pM)||!t)return null;let r=e.geometry.getAttribute("position");if(!r?.count)return null;e.updateWorldMatrix(!0,!1),t.updateWorldMatrix(!0,!1);let n=new dM,o=new Xr;if(Wr(e)){let y=e;y.computeBoundingBox(),y.computeBoundingSphere();for(let M=0;M<r.count;M++)n.expandByPoint(e.getVertexPosition(M,o))}else e.geometry.boundingBox||e.geometry.computeBoundingBox(),n.copy(e.geometry.boundingBox);if(n.applyMatrix4(e.matrixWorld),n.isEmpty())return null;let i=n.getCenter(new Xr),a=t.getWorldPosition(new Xr),l=t.getWorldDirection(new Xr),c=t.isOrthographicCamera,d=new mM,p=y=>{if(c){let _=a.distanceTo(i)+n.getSize(o).length()+1;d.set(y.clone().addScaledVector(l,-_),l)}else d.set(a,y.clone().sub(a).normalize());let M=d.intersectObject(e,!1)[0];return M?ui({...M,ray:d.ray},e):null},m=p(i);if(m)return m;let s=e.geometry.index,f=s?.count??r.count,u=new Xr,h=new Xr,v=new Xr,x=new Xr,b=new Xr,S=new Xr,w=null,P=1/0;for(let y=0;y+2<f;y+=3){if(e.getVertexPosition(s?s.getX(y):y,u).applyMatrix4(e.matrixWorld),e.getVertexPosition(s?s.getX(y+1):y+1,h).applyMatrix4(e.matrixWorld),e.getVertexPosition(s?s.getX(y+2):y+2,v).applyMatrix4(e.matrixWorld),x.copy(u).add(h).add(v).multiplyScalar(1/3),fM.getNormal(u,h,v,b),c?S.copy(l).negate():S.copy(a).sub(x),b.dot(S)<=0)continue;let M=x.distanceToSquared(i);M<P&&(P=M,w=x.clone())}return w?p(w):null}import{Mesh as gM,Raycaster as bM,Triangle as hM,Vector2 as Eh,Vector3 as un}from"three";function Dh(e,t,r,n){if(!(e instanceof gM)||!t)return null;e.updateWorldMatrix(!0,!1),t.updateWorldMatrix(!0,!1);let o=new un().fromArray(r.position);if(Wr(e)){let d=e;d.computeBoundingBox(),d.computeBoundingSphere();let p=d.geometry.getAttribute("position");if(!p)return null;let m=d.geometry.index,s=m?.count??p.count,f=new hM,u=new un,h=new un,v=1/0,x=null;for(let b=0;b+2<s;b+=3){let S=[0,1,2].map(P=>m?m.getX(b+P):b+P);f.a.fromBufferAttribute(p,S[0]),f.b.fromBufferAttribute(p,S[1]),f.c.fromBufferAttribute(p,S[2]),f.closestPointToPoint(o,u);let w=u.distanceToSquared(o);if(!(w>=v||!f.getBarycoord(u,h))&&(v=w,x=new un().addScaledVector(d.getVertexPosition(S[0],new un),h.x).addScaledVector(d.getVertexPosition(S[1],new un),h.y).addScaledVector(d.getVertexPosition(S[2],new un),h.z),v<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 Eh(n==="left"?-.0035:n==="right"?.0035:0,n==="down"?-.0035:n==="up"?.0035:0),a=new bM,l=r.size*.01,c=new un().fromArray(r.position);for(let d=1;d>=1/1024;d/=2){a.setFromCamera(new Eh(o.x,o.y).addScaledVector(i,d),t);let p=a.intersectObject(e,!1)[0];if(p){let m=ui({...p,ray:a.ray},e);if(new un().fromArray(m.position).distanceTo(c)<=l)return m}}return null}import{Box3 as Sa,PerspectiveCamera as Th,Sphere as vM,Vector3 as gi}from"three";function _h(e,t,r,n,o,i=!1){return!!(e?.usesSlots&&t.usesSlots&&e.url!==t.url&&r.includes(e.url)&&r.includes(t.url)&&n[e.url]&&n[t.url]&&(i||o[e.url]&&o[t.url]))}function Lh(e,t,r){let n=t?.camera;if(!(n instanceof Th))return null;let i=(e instanceof Sa?e:new Sa().setFromObject(e)).getSize(new gi).length();return!Number.isFinite(i)||i<=0?null:(n.near=i/100,n.far=i*100,n.updateProjectionMatrix(),t&&r===void 0&&(t.maxDistance=i*10),i)}function Bh(e,t){let r=e.camera;if(!(r instanceof Th)||!(t>0))return;let n=Math.min(Math.max(e.distance/200,t/1e5),t/100);Math.abs(n-r.near)<=r.near*.01||(r.near=n,r.updateProjectionMatrix())}var fl={paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5},Ca={kind:"model"};function jh(e,t){let r=new Sa().setFromObject(t);return r.isEmpty()?!1:(r.expandByScalar(r.getSize(new gi).length()*.05),r.containsPoint(e.getTarget(new gi)))}function Nh(e,t){return e.getTarget(new gi).distanceTo(t)<=Math.max(e.distance,1)*.001}async function md(e,t,r=.6){let n=e.smoothTime;e.smoothTime=Gs(e,r);try{return await t()}finally{e.smoothTime=n}}async function Ih(e,t,{flyIn:r,onStart:n,invalidate:o}){if(r){let i=(t instanceof Sa?t:new Sa().setFromObject(t)).getBoundingSphere(new vM),a=i.center.clone(),c=e.getPosition(new gi).clone().sub(e.getTarget(new gi));c.lengthSq()<1e-6&&c.set(0,0,1),c.normalize();let d=Math.max(i.radius*10,20),p=a.clone().add(c.multiplyScalar(d));await e.setLookAt(p.x,p.y,p.z,a.x,a.y,a.z,!1)}n(),await md(e,()=>e.fitToBox(t,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),await new Promise(i=>{let a=performance.now(),l=()=>{e.active===!1||performance.now()-a>8e3?(e.dispatchEvent({type:"update"}),o(),i()):(o(),setTimeout(l,100))};setTimeout(l,100)})}import{useEffect as yM,useMemo as zh,useRef as xM}from"react";import{useFrame as wM,useThree as SM}from"@react-three/fiber";import{Box3 as CM,Box3Helper as MM,Group as PM}from"three";import{jsx as kM}from"react/jsx-runtime";function Vh({source:e,highlights:t}){let r=SM(a=>a.invalidate),n=zh(()=>new PM,[]),o=zh(()=>t.map(a=>{let l=new MM(new CM,a.color);l.raycast=()=>{};let c=l.material;return c.depthTest=!1,c.transparent=!0,c.opacity=.85,l.renderOrder=1e3,ii(l),{helper:l,id:a.objectId}}),[t]);yM(()=>{for(let{helper:a}of o)n.add(a);return r(),()=>{for(let{helper:a}of o)n.remove(a),a.geometry.dispose(),a.material.dispose();r()}},[n,o,r]);let i=xM(null);return wM(()=>{let a=e.current;if(!a){n.visible=!1;return}n.visible=!0,(i.current?.root!==a||i.current.helpers!==o)&&(i.current={root:a,helpers:o,nodes:Bn(a).nodesById});let l=i.current.nodes;for(let{helper:c,id:d}of o){let p=l[d];c.visible=!!p,p&&c.box.setFromObject(p)}}),kM("primitive",{object:n})}function Fh(e){let t=[],r="",n=null,o=null,i=0,a="stopped",l=!1,c=[],d=0,p=!1,m=!1,s={sequenceId:null,time:0,duration:0,status:a,previewing:l,ready:!1,issues:[]},f=new Set,u=()=>t.find(w=>w.id===o),h=()=>{s={sequenceId:o,time:i,duration:u()?.duration??0,status:a,previewing:l,ready:!!n,issues:c},f.forEach(w=>w())},v=()=>{n?.restore(),i=0,a="stopped",l=!1,h(),n?.invalidate()},x=w=>t.some(P=>P.id===w)?(o===w||(n?.restore(),o=w,i=0,a="stopped",l=!1,c=n?.inspect(u())??[],h(),n?.invalidate()),!0):!1,b=w=>{if(w&&!x(w))return!1;let P=u();return!n||!P?.tracks.some(y=>!y.muted&&y.keyframes.length)?!1:(e?.(),m=!0,i>=P.duration&&(i=0),a="playing",l=!0,c=n.inspect(P),h(),n.invalidate(),!0)},S=()=>{if(!n||!p||m)return;let w=t.find(P=>P.autoPlay);w&&b(w.id)};return{getState:()=>s,subscribe:w=>(f.add(w),()=>{f.delete(w)}),select:x,play:b,stop:v,pause:()=>{a==="playing"&&(a="paused",h())},seek:w=>{let P=u();return!n||!P||!Number.isFinite(w)?!1:(e?.(),i=Math.max(0,Math.min(P.duration,w)),l=!0,a!=="playing"&&(a="paused"),c=n.inspect(P),h(),n.invalidate(),!0)},capture:w=>n?.capture(w)??null,configure:(w,P)=>{p=P;try{let y=Fs(w??[]),M=JSON.stringify(y);if(r===M){S();return}n?.restore(),t=y,r=M,u()||(o=t[0]?.id??null,i=0,l=!1),i=Math.min(i,u()?.duration??0),a=l?"paused":"stopped",c=u()?n?.inspect(u())??[]:[],h(),n?.invalidate(),S()}catch(y){v(),t=[],r="",o=null,c=[y instanceof Error?y.message:"Invalid sequence configuration."],h()}},connect:w=>{n?.restore(),n=w,w||(a="stopped",l=!1,i=0),c=u()?n?.inspect(u())??[]:[],h(),S()},advance:w=>{let P=u();if(!P||!n||a!=="playing"||!Number.isFinite(w)||w<0)return;let y=Math.min(w,.1);i+=y,d+=y,i>=P.duration&&(P.loop?i%=P.duration:(i=P.duration,a="finished")),(d>=1/30||a==="finished")&&(d=0,h())},frame:()=>{let w=u();return l&&w?{sequence:w,time:i,playing:a==="playing"}:null},destroy:()=>{n?.restore(),n=null,a="stopped",l=!1,i=0,h()}}}import{useLayoutEffect as gl,useMemo as RM,useRef as AM}from"react";import{useFrame as OM,useThree as EM}from"@react-three/fiber";function Hh({controller:e,source:t,controls:r,animations:n,ready:o,sequences:i,autoPlay:a,authoredRevision:l,cameraEnabled:c=!0}){let d=EM(s=>s.invalidate),p=AM({source:t,controls:r,animations:n,cameraEnabled:c});p.current={source:t,controls:r,animations:n,cameraEnabled:c};let m=RM(()=>wg({root:()=>p.current.source.current,controls:()=>p.current.controls.current,animations:()=>p.current.animations.current,cameraEnabled:()=>p.current.cameraEnabled,invalidate:d}),[e,d]);return gl(()=>(d(),()=>m.restore()),[m,l,i,d]),gl(()=>{e.configure(i,a)},[e,i,a]),gl(()=>(e.connect(o?m:null),()=>e.connect(null)),[e,m,o]),gl(()=>{if(!c)return;let s=r.current,f=()=>e.pause();return s?.addEventListener("controlstart",f),()=>s?.removeEventListener("controlstart",f)},[e,r,o,c]),OM((s,f)=>{if(!o)return;e.advance(f);let u=e.frame();u&&m.apply(u),u?.playing&&d()}),null}import{useEffect as Gh,useRef as Uh,useState as $h}from"react";function Wh(e,t){if(!e?.configuration)return e;let r=e.configuration,n=r.models?.find(i=>Re(i)===t||i.url===t);if(!n)return e;let o=r.activeModelId??r.modelUrl;return{...e,objectBindings:n.objectBindings,configuration:{...r,models:r.models?.map(i=>Re(i)===o?{...i,sceneConfig:r.sceneConfig,objectBindings:e.objectBindings??i.objectBindings}:i),activeModelId:Re(n),modelUrl:n.url,sceneConfig:n.sceneConfig??r.sceneConfig}}}function Xh(e){let[t,r]=$h(null),[n,o]=$h(null),i=nl(e.arHandoff),a=!!e.arHandoff&&i?.autoRestore!==!1,l=i?.storage,c=`${e.modelUrl}
|
|
5
|
+
${e.activeModelId??""}`,d=Uh(c);d.current=c;let p=Uh(c);if(Gh(()=>{c!==p.current&&(p.current=c,r(null))},[c]),Gh(()=>{if(!a||typeof window>"u"){r(null),o(null);return}let s,f=()=>{s?.abort(),s=new AbortController;let u=s.signal,h=d.current;o(null),ob(window.location.href,l,u).then(v=>{!u.aborted&&d.current===h&&r(v)}).catch(v=>{!u.aborted&&d.current===h&&(r(null),o(v instanceof Error?v.message:"Could not restore the AR configuration."))})};return f(),window.addEventListener("hashchange",f),()=>{s?.abort(),window.removeEventListener("hashchange",f)}},[a,l]),!t?.configuration)return{props:e,error:n};let m=t.configuration;return{error:n,props:{...e,...m,objectBindings:t.objectBindings??e.objectBindings,onObjectBindingsChange:s=>{r(f=>f?.configuration?{...f,objectBindings:s,configuration:{...f.configuration,models:f.configuration.models?.map(u=>Re(u)===(f.configuration?.activeModelId??f.configuration?.modelUrl)?{...u,objectBindings:s}:u)}}:f),e.onObjectBindingsChange?.(s)},onSceneConfigChange:s=>{r(f=>f?.configuration?{...f,configuration:{...f.configuration,sceneConfig:s}}:f),e.onSceneConfigChange?.(s)},onIsolationChange:s=>{r(f=>f?.configuration?{...f,configuration:{...f.configuration,isolation:s}}:f),e.onIsolationChange?.(s)},onActiveModelChange:s=>{r(f=>Wh(f,s)),e.onActiveModelChange?.(s)},onModelChange:s=>{r(f=>Wh(f,s)),e.onModelChange?.(s)}}}}import{useCallback as fd,useEffect as bl,useRef as Ma,useState as gd}from"react";function qh({enabled:e,options:t,state:r,getSources:n,baseUrl:o,revision:i="",autoPrepare:a=!1,preparePhoneLink:l=!0}){let c,d=!1;try{c=e?rb(r,t?.assetVersion,t?.maxTextureSize)+(o??"")+i:"disabled"}catch{d=!0,c="invalid-configuration"+(t?.assetVersion??"")+i}l||(c+=":usdz-only");let[p,m]=gd(!1),[s,f]=gd(!1),[u,h]=gd(null),v=Ma(null),x=Ma(!1),b=Ma(null),S=Ma(null),w=Ma({key:c,state:r,options:t,getSources:n,baseUrl:o,enabled:e,invalidConfiguration:d,preparePhoneLink:l});w.current={key:c,state:r,options:t,getSources:n,baseUrl:o,enabled:e,invalidConfiguration:d,preparePhoneLink:l};let P=fd(()=>{b.current&&URL.revokeObjectURL(b.current),b.current=null},[]);bl(()=>{v.current?.abort(),x.current=!1,f(!1),P(),h(R=>e&&R?{key:R.key,invalidated:!0,warnings:[]}:null),e||m(!1)},[c,e,P]),bl(()=>()=>{v.current?.abort(),P()},[P]);let y=e&&!u?.invalidated&&u?.key===c,M=y&&!!(u.usdzUrl||u.phoneUrl),_=s?"preparing":e?u&&!y?"stale":y?M?"ready":"error":"idle":"idle";bl(()=>{w.current.options?.onStatusChange?.(_)},[_]);let C=fd(()=>{v.current?.abort(),x.current&&(h(null),P()),x.current=!1,f(!1),m(!1)},[P]),E=fd(async()=>{let R=w.current;if(!R.enabled)return;v.current?.abort(),P(),h(null),f(!0),x.current=!0;let O=new AbortController;v.current=O;let D=()=>!O.signal.aborted&&w.current.key===R.key&&w.current.enabled,B=ee=>{D()&&h(Y=>({...Y?.key===R.key&&!Y.invalidated?Y:{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 G,U={configurationKey:R.key,state:V,signal:O.signal,exportUSDZ:()=>G??(G=Promise.resolve().then(()=>pb(R.getSources(),{scaleMode:R.state.configuration?.arScaleMode,maxTextureSize:R.options?.maxTextureSize,signal:O.signal})))},T=[],A=async()=>{try{let ee=R.options?.createUSDZ?await R.options.createUSDZ(U):(await U.exportUSDZ()).blob,Y=G?await G.then(te=>te.warnings,()=>[]):[];if(!D())return;let Q;if(typeof ee=="string")Q=$u(ee,window.location.href);else if(ee instanceof Blob&&ee.size>0)Q=URL.createObjectURL(ee),b.current=Q;else throw new Error("The USDZ adapter returned an empty asset.");B({usdzUrl:Q,warnings:Y})}catch(ee){let Y=ee instanceof Error?ee.message:String(ee);T.push(Y),B({exportError:Y})}},Z=async()=>{try{let ee=R.options?.createMobileUrl?await R.options.createMobileUrl(U):await tb(U.state,window.location.href).then(Q=>nb(Q,R.baseUrl||window.location.href,R.options?.storage,O.signal));if(!D())return;let Y=$u(ee,window.location.href);if(Y.length>2200)throw new Error("The phone link is too long for a reliable QR code.");B({phoneUrl:Y})}catch(ee){let Y=ee instanceof Error?ee.message:String(ee);!R.options?.createMobileUrl&&Y.includes("durable URL")&&(Y="QR sharing isn\u2019t available for local uploads. Download the USDZ and send it to your phone."),!R.options?.createMobileUrl&&(Y.includes("reachable from your phone")||Y.includes("asset URL points to this computer"))&&(Y="QR sharing needs a viewer page and model files your phone can reach. Use an online viewer, or download the USDZ."),T.push(Y),B({linkError:Y})}};await Promise.all([A(),R.preparePhoneLink?Z():Promise.resolve()]),D()&&(x.current=!1,f(!1),T.length&&R.options?.onError?.(new Error(T.join(`
|
|
6
|
+
`))))},[P]);return bl(()=>{if(!e||!p&&!a){S.current=null;return}M||s||S.current===c||(S.current=c,E())},[e,p,a,c,M,s,E]),{open:e&&p,show:()=>m(!0),close:C,prepare:E,status:_,busy:s,prepared:y?u:null}}import{useEffect as LM,useId as BM,useRef as jM}from"react";import{lazy as DM,Suspense as TM}from"react";import{jsx as bd}from"react/jsx-runtime";var _M=DM(()=>import("qrcode.react").then(e=>({default:e.QRCodeSVG})));function hl(e){let t=e.size??128;return bd(TM,{fallback:bd("span",{"aria-hidden":"true",style:{display:"inline-block",width:t,height:t}}),children:bd(_M,{...e})})}import{Download as NM,ExternalLink as IM,LoaderCircle as zM,RefreshCw as VM,Smartphone as FM,X as HM}from"lucide-react";import{Fragment as GM,jsx as Ct,jsxs as bi}from"react/jsx-runtime";function Kh({handoff:e,filename:t,onQuickLook:r}){let n=re(),o=BM(),i=jM(null),a=e.close;LM(()=>{let p=document.activeElement;i.current?.focus();let m=s=>{if(s.key==="Escape"&&(s.preventDefault(),a()),s.key!=="Tab")return;let f=Array.from(i.current.querySelectorAll("button:not(:disabled), a[href], summary")),u=f[0],h=f[f.length-1];s.shiftKey&&(document.activeElement===u||document.activeElement===i.current)?(s.preventDefault(),h?.focus()):!s.shiftKey&&(document.activeElement===h||document.activeElement===i.current)&&(s.preventDefault(),u?.focus())};return document.addEventListener("keydown",m),()=>{document.removeEventListener("keydown",m),p?.focus()}},[a]);let l=e.prepared,c=!e.busy&&(e.status==="ready"||e.status==="error"),d=e.status==="error"?n("arRetry"):n("arRefresh");return Ct("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:p=>{p.target===p.currentTarget&&a()},children:bi("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:[Ct("button",{type:"button",className:"ri-mobileHandoffClose",onClick:a,"aria-label":n("closePhoneHandoff"),children:Ct(HM,{size:18})}),Ct(FM,{size:22,"aria-hidden":"true"}),Ct("h2",{id:o,children:n("arConfiguredTitle")}),Ct("div",{role:"status","aria-live":"polite",className:"ri-configuredARProgress",children:(e.busy||e.status==="idle"||e.status==="stale")&&bi("p",{children:[Ct(zM,{size:16,"aria-hidden":"true"}),n("arPreparing")]})}),l?.phoneUrl&&bi(GM,{children:[Ct("p",{children:n("arScanConfigured")}),Ct("div",{className:"ri-mobileHandoffQr",children:Ct(hl,{value:l.phoneUrl,size:208,level:"M",marginSize:4,title:n("qrCodeToOpenThisModelOnAPhone")})})]}),l?.usdzUrl&&ol()&&bi("a",{rel:"ar",className:"ri-configuredARLaunch",href:l.usdzUrl,onClick:r,children:[Ct("img",{alt:"",width:"1",height:"1",src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="}),n("viewInAR")]}),(l?.phoneUrl||l?.usdzUrl||c)&&bi("div",{className:"ri-configuredARActions",children:[l?.phoneUrl&&Ct("a",{className:"ri-configuredARAction",href:l.phoneUrl,target:"_blank",rel:"noopener noreferrer",title:n("arOpenConfiguredLink"),"aria-label":n("arOpenConfiguredLink"),children:Ct(IM,{size:16,"aria-hidden":"true"})}),l?.usdzUrl&&Ct("a",{className:"ri-configuredARAction",href:l.usdzUrl,download:`${t}-configured.usdz`,title:n("arDownloadUSDZ"),"aria-label":n("arDownloadUSDZ"),children:Ct(NM,{size:16,"aria-hidden":"true"})}),c&&Ct("button",{type:"button",className:"ri-configuredARAction",onClick:()=>{e.prepare()},title:d,"aria-label":d,children:Ct(VM,{size:16,"aria-hidden":"true"})})]}),l?.exportError&&Ct("p",{role:"alert",children:l.exportError}),l?.linkError&&Ct("p",{role:"status",children:l.linkError}),!!l?.warnings.length&&bi("details",{className:"ri-configuredARDetails",children:[Ct("summary",{children:n("arExportDetails")}),l.warnings.map(p=>Ct("p",{className:"ri-configuredARNote",children:p},p))]})]})})}import{useState as Qh}from"react";import{Smartphone as Jh}from"lucide-react";import{jsx as hi,jsxs as hd}from"react/jsx-runtime";function Yh({xrStore:e,arSupported:t,checkingAR:r,quickLookSupported:n,modelReady:o,inARSession:i,handoff:a,onQuickLook:l,animationControls:c}){let d=re(),[p,m]=Qh(!1),[s,f]=Qh(null);if(i)return null;let u=!!(e&&t),h=a.prepared?.usdzUrl,v=!u&&n?a.prepared?.exportError:void 0,x=u||n,b=o&&(u||!!(n&&h)),S=r?d("arCheckingSupport"):x?o?!b&&!v?d("arPreparing"):null:d("loadingModel"):d("arUnavailable"),w=async()=>{if(e){m(!0),f(null);try{await e.enterAR()}catch(P){f(P instanceof Error?P.message:d("arStartFailed"))}finally{m(!1)}}};return hd("div",{className:"ri-arLandingControls",children:[n&&!u&&o&&c,b&&!u&&h?hd("a",{className:"ri-arLandingStart",rel:"ar",href:h,onClick:l,children:[hi("img",{alt:"",width:"1",height:"1",src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="}),hi(Jh,{size:20,"aria-hidden":"true"}),d("arStart")]}):v?hi("button",{type:"button",className:"ri-arLandingStart",onClick:()=>{a.prepare()},children:d("arRetry")}):hd("button",{type:"button",className:"ri-arLandingStart",disabled:!b||p,onClick:()=>{w()},children:[hi(Jh,{size:20,"aria-hidden":"true"}),d(p?"arStarting":"arStart")]}),S&&hi("p",{role:"status",children:S}),(s||v)&&hi("p",{role:"alert",children:s||v})]})}import{useCallback as ev,useEffect as UM,useMemo as $M,useRef as WM,useState as XM,useSyncExternalStore as qM}from"react";import{Pause as KM,Play as QM}from"lucide-react";function vl(e,t){return[...e.flatMap(r=>r.controls.clips.flatMap(n=>{let o=r.config?.clips.find(i=>i.sourceName===n);return o?.hidden?[]:[{kind:"clip",id:JSON.stringify(["clip",r.id,n]),label:o?.displayName?.trim()||n,source:r,clip:n}]})),...t.filter(r=>r.tracks.some(n=>!n.muted&&n.keyframes.length&&n.target.kind!=="camera")).map(r=>({kind:"sequence",id:JSON.stringify(["sequence",r.id]),label:r.name,sequence:r}))]}function Pa(e,t,r,n=!1){(n||e.kind==="clip"&&r.getState().previewing)&&r.stop(),n&&t.forEach(({controls:o})=>o.stop()),e.kind==="clip"?e.source.controls.play(e.clip):r.play(e.sequence.id)}function Zh(e,t){e.kind==="clip"?e.source.controls.pause(e.clip):t.pause()}import{jsx as Co,jsxs as tv}from"react/jsx-runtime";function rv({sources:e,sequences:t,sequenceControls:r}){let n=re(),[o,i]=XM(null),a=WM(null),l=$M(()=>vl(e,t),[e,t]),c=ev(u=>{let h=e.map(v=>v.controls.subscribe?.(u));return h.push(r.subscribe(u)),()=>h.forEach(v=>v?.())},[e,r]),d=ev(()=>{let u=r.getState();return JSON.stringify([e.map(({controls:h})=>{let v=h.getState?.();return[v?.currentClip,v?.active.map(x=>[x.clip,x.status])]}),[u.sequenceId,u.status,u.previewing,u.ready]])},[e,r]);qM(c,d,d),UM(()=>{let u=a.current,h=v=>v.preventDefault();return u?.addEventListener("beforexrselect",h),()=>u?.removeEventListener("beforexrselect",h)},[l.length]);let p=r.getState(),m=l.find(u=>u.id===o)??l.find(u=>u.kind==="sequence"&&p.previewing&&u.sequence.id===p.sequenceId)??l.find(u=>u.kind==="clip"&&u.source.controls.getState?.().currentClip===u.clip)??l[0];if(!m)return null;let s=m.kind==="clip"?m.source.controls.getState?.().active.some(u=>u.clip===m.clip&&u.status==="playing"):p.sequenceId===m.sequence.id&&p.status==="playing",f=n(s?"arAnimationPause":"arAnimationPlay");return tv("div",{className:"ri-arAnimations",ref:a,role:"group","aria-label":n("arAnimations"),onPointerDown:u=>u.stopPropagation(),onTouchStart:u=>u.stopPropagation(),onTouchMove:u=>u.stopPropagation(),children:[tv("select",{"aria-label":n("arAnimationSelect"),value:m.id,onChange:u=>{let h=l.find(v=>v.id===u.target.value);h&&(i(h.id),Pa(h,e,r,!0))},children:[e.map(u=>{let h=l.filter(v=>v.kind==="clip"&&v.source.id===u.id);return h.length?Co("optgroup",{label:e.length>1?u.label:n("arAnimationClips"),children:h.map(v=>Co("option",{value:v.id,children:v.label},v.id))},u.id):null}),l.some(u=>u.kind==="sequence")&&Co("optgroup",{label:n("arAnimationSequences"),children:l.filter(u=>u.kind==="sequence").map(u=>Co("option",{value:u.id,children:u.label},u.id))})]}),Co("button",{type:"button",className:"ri-arActionButton","aria-label":f,title:f,disabled:m.kind==="sequence"&&!p.ready,onClick:()=>{s?Zh(m,r):Pa(m,e,r)},children:s?Co(KM,{size:18,"aria-hidden":"true"}):Co(QM,{size:18,"aria-hidden":"true"})})]})}import{jsx as vi,jsxs as JM}from"react/jsx-runtime";function nv({options:e,sources:t,value:r,onChange:n}){let o=re();if(!e.length)return null;let i=e.filter(d=>d.kind==="clip"?d.source.config?.autoplayClip===d.clip:d.sequence.autoPlay),a=i.length===1?i[0]:void 0,l=a?.label??o(i.length?"arAnimationSaved":"arAnimationNone"),c=a?e.filter(d=>d.id!==a.id):e;return vi("div",{className:"ri-arAnimations ri-arQuickLookAnimations",children:JM("select",{"aria-label":o("arAnimationSelect"),value:a?.id===r?"":r,onChange:d=>n(d.target.value),children:[vi("option",{value:"",children:l}),t.map(d=>{let p=c.filter(m=>m.kind==="clip"&&m.source.id===d.id);return p.length?vi("optgroup",{label:t.length>1?d.label:o("arAnimationClips"),children:p.map(m=>vi("option",{value:m.id,children:m.label},m.id))},d.id):null}),c.some(d=>d.kind==="sequence")&&vi("optgroup",{label:o("arAnimationSequences"),children:c.filter(d=>d.kind==="sequence").map(d=>vi("option",{value:d.id,children:d.label},d.id))})]})})}function ov(e,t,r){return t?e.map(n=>({...n,sceneConfig:{...n.sceneConfig,animations:{clips:n.sceneConfig?.animations.clips??[],autoplayClip:t.kind==="clip"&&n.instanceId===t.source.id?t.clip:null},sequences:(n.sceneConfig?.sequences??[]).map(o=>({...o,autoPlay:t.kind==="sequence"&&n.instanceId===r&&o.id===t.sequence.id}))}})):e}import{useRef as se,useState as he,useEffect as Te,useCallback as de,useMemo as lt,Suspense as Zw,lazy as vE}from"react";import{createPortal as yE}from"react-dom";import{Box3 as xE,Color as wE,Raycaster as SE,Vector2 as CE,Vector3 as Wp}from"three";import{Component as YM}from"react";var qr=class extends YM{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(r,n){this.props.onLoadError?.(r)}render(){return this.state.hasError?null:this.props.children}};import{useCallback as iv,useEffect as av,useState as ZM}from"react";function sv({enabled:e,activeUrl:t,models:r,errorsRef:n,activeFailed:o,activeError:i,onActiveError:a,onExtraError:l}){let[c,d]=ZM(0),p=iv((s,f)=>{n.current.set(s,f),d(u=>u+1),s!==t&&l?.(s,f)},[t,n,l]),m=iv(s=>{n.current.delete(s)&&d(f=>f+1)},[n]);return av(()=>{let s=new Set(e?r?.map(Re):[]);for(let f of n.current.keys())s.has(f)||n.current.delete(f)},[e,r,n]),av(()=>{if(!e||!n.current.has(t))return;let s=n.current.get(t);o&&Object.is(i,s)||a(s)},[e,t,r,n,c,o,i,a]),{reportError:p,clearError:m}}import{useCallback as e1,useEffect as lv,useRef as yl}from"react";function cv(e,t){let r=yl({}),n=yl({}),o=yl({}),i=yl(0),a=e1(l=>{var c;return(c=o.current)[l]??(c[l]={current:{}})},[]);return lv(()=>{let l=new Set(e?t?.map(Re):[]);for(let c of Object.keys(r.current))l.has(c)||delete r.current[c];for(let c of Object.keys(n.current))l.has(c)||delete n.current[c];for(let c of Object.keys(o.current))l.has(c)||(o.current[c].current={},delete o.current[c])},[e,t]),lv(()=>{let l=++i.current;return()=>{queueMicrotask(()=>{i.current===l&&(r.current={},n.current={},Object.values(o.current).forEach(c=>{c.current={}}),o.current={})})}},[]),{scenesByUrlRef:r,cameraHomesByUrlRef:n,materialRefsByUrlRef:o,getMaterialRefsForUrl:a}}import{useCallback as uv,useEffect as n1,useState as dv}from"react";import{useEffect as t1,useRef as r1}from"react";function dn(e,t){let r=r1(t);t1(()=>{let n=r.current;r.current=t,t.some((o,i)=>!Object.is(o,n[i]))&&e()},t)}var o1={};function pv({modelUrl:e,activeModelId:t,tilesetUrl:r,models:n,objectBindings:o="auto",onChange:i,initialBindings:a,initialModelEdits:l}){let c=t??e,d=!!(n?.length&&!r),p=o==="auto"&&!d,m=!p&&i!==void 0,s=o==="auto"?o1:o,[f,u]=dv(()=>a??s),[h,v]=dv(()=>{let P=new Map(l),y=d?n?.find(M=>Re(M)===c):void 0;return y&&a&&l===void 0&&P.set(c,{source:y.objectBindings,bindings:a}),P});dn(()=>{m||u(s)},[m,s]),n1(()=>{let P=new Map(d?n?.map(y=>[Re(y),y.objectBindings]):[]);v(y=>{let M=[...y].filter(([_,C])=>!m&&P.get(_)===C.source);return M.length===y.size?y:new Map(M)})},[d,n,m]);let x=uv(P=>{let y=m?void 0:h.get(Re(P));return y?.source===P.objectBindings?y.bindings:P.objectBindings},[m,h]),b=d?n?.find(P=>Re(P)===c):void 0,S=b?x(b):m?s:f,w=uv(P=>{m||(b?v(y=>new Map(y).set(Re(b),{source:b.objectBindings,bindings:P})):u(P)),i?.(P)},[m,b,i]);return{autoBindings:p,controlled:m,currentBindings:S,applyBindings:w,bindingsForModel:x,modelEdits:h}}import{PerspectiveCamera as vd,Vector2 as i1}from"three";function xl(e,t={}){if(!e)return Promise.reject(new Error("Viewer not ready"));let{gl:r,scene:n,camera:o,invalidate:i}=e,a=zn(r);if(!a&&!r.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:d}=t,p=r.getSize(new i1),m=r.getPixelRatio(),s=o instanceof vd?o.aspect:null,f=n.background,u=t.width??p.x,h=t.height??p.y,v=u!==p.x||h!==p.y,x=Vs(n);l&&(n.background=null),v&&(r.setPixelRatio(1),r.setSize(u,h,!1),o instanceof vd&&(o.aspect=u/h,o.updateProjectionMatrix()));let b=()=>{x(),l&&(n.background=f),v&&(r.setPixelRatio(m),r.setSize(p.x,p.y,!1),o instanceof vd&&s!==null&&(o.aspect=s,o.updateProjectionMatrix())),i()};if(a)try{return r.render(n,o),Promise.resolve(r.domElement.toDataURL(c,d))}catch(S){return Promise.reject(S)}finally{b()}return i(),new Promise((S,w)=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{let P,y;try{P=r.domElement.toDataURL(c,d)}catch(M){y=M}b(),y?w(y):S(P)})})})}import{useEffect as a1,useRef as s1}from"react";import{GizmoHelper as l1,GizmoViewport as c1}from"@react-three/drei";import{useThree as u1}from"@react-three/fiber";import{jsx as yd}from"react/jsx-runtime";function mv({onUpdate:e}){let t=u1(n=>n.scene),r=s1(null);return a1(()=>{if(r.current)return cg(t,r.current)},[t]),yd(l1,{alignment:"top-right",margin:[80,80],renderPriority:2,onUpdate:e,children:yd("group",{ref:r,children:yd(c1,{axisColors:["#e5484d","#46a758","#3e8bff"],labelColor:"white"})})})}import{useCallback as Sl,useEffect as h1,useRef as vv,useState as yv}from"react";import{Vector3 as xv}from"three";import{useEffect as wl,useMemo as pn,useRef as mn}from"react";import{useFrame as d1,useThree as p1}from"@react-three/fiber";import{Box3 as m1,CatmullRomCurve3 as fv,Sphere as f1,Spherical as g1,Vector3 as Un}from"three";function xd(e){if(e.duration!==void 0)return e.duration;let t=e.waypoints??[];if(t.length<2)return 24;let r=e.loop===!1?t.slice(0,-1):t;return Math.max(r.reduce((n,o)=>n+(o.segmentDuration??3.5),0),4)}var b1=1.2;function yi({controlsRef:e,sceneRef:t,config:r,playing:n,resetOnPlay:o=!1,onFinished:i,onUserInteract:a,onStop:l,playOnce:c=!1,startAtPath:d=!1,onStarted:p,onProgress:m}){let s=p1(T=>T.invalidate),f=pn(()=>r.waypoints??[],[r.waypoints]),u=f.length>=2,h=r.loop??!0,v=xd(r),x=pn(()=>f.map(T=>[...T.position,...T.target,T.azimuthAngle??"",T.polarAngle??"",T.segmentDuration??""].join(",")).join(";"),[f]),b=pn(()=>{let T=[];if(f.length<2)return T;let A=0;for(let Z=0;Z<f.length-1;Z++)A+=f[Z].segmentDuration??3.5,T.push(A);return h&&f.length>1&&(A+=f[f.length-1].segmentDuration??3.5,T.push(A)),T},[f,h]),S=pn(()=>T=>{if(f.length<2||b.length===0)return T/v;let A=b[b.length-1],Z=h?T%v:Math.min(T,v),ee=v>0?Z/v*A:0;for(let Y=0;Y<b.length;Y++)if(ee<=b[Y]){let Q=Y===0?0:b[Y-1],te=b[Y]-Q,q=te>0?(ee-Q)/te:0,H=h?f.length:f.length-1,N=Y/H,J=1/H;return N+q*J}return 1},[f.length,b,v,h]),w=pn(()=>u?{position:new fv(f.map(T=>new Un(...T.position)),h,"catmullrom",.5),target:new fv(f.map(T=>new Un(...T.target)),h,"catmullrom",.5)}:null,[x,u,h]),P=pn(()=>{if(!u||!f.every(A=>Number.isFinite(A.azimuthAngle)&&Number.isFinite(A.polarAngle)))return null;let T=f.map(A=>({azimuth:A.azimuthAngle,polar:A.polarAngle,distance:new Un(...A.position).distanceTo(new Un(...A.target))}));for(let A=1;A<T.length;A+=1){let Z=T[A-1].azimuth,ee=T[A].azimuth;T[A].azimuth=ee+Math.round((Z-ee)/(Math.PI*2))*Math.PI*2}return T},[x,u]),y=mn(0),M=mn(0),_=mn(new Un),C=mn(new Un),E=mn(!1),R=mn(!0),O=mn(0),D=mn(!1),B=mn(null),V=pn(()=>new Un,[]),G=pn(()=>new Un,[]),U=pn(()=>new g1,[]);return wl(()=>{y.current=0,O.current=0,M.current=0,D.current=!1},[x,h,v]),wl(()=>{o&&(O.current=0,y.current=0,D.current=!1)},[o]),wl(()=>{if(!n){E.current=!1,y.current>0&&!o?O.current=y.current:o&&(O.current=0),(y.current>0||D.current)&&l?.();return}y.current>=v&&!h&&(y.current=0,O.current=0,D.current=!1);let T=e.current;if(T&&(T.getPosition(_.current),T.getTarget(C.current)),o||D.current||O.current===0?(y.current=0,O.current=0,D.current=!1):O.current>0&&O.current<v?y.current=O.current:(y.current=0,O.current=0),M.current=0,!u){let A=t.current;if(A){let Z=new m1().setFromObject(A).getBoundingSphere(new f1);B.current={center:Z.center.clone(),radius:Z.radius>0?Z.radius:1}}}E.current=!0,R.current=!0,s()},[n,u,e,t,s,v,h,x,o,l]),wl(()=>{if(!n||!a)return;let T=e.current;if(!T)return;let A=()=>{D.current||a()};return T.addEventListener("controlstart",A),()=>T.removeEventListener("controlstart",A)},[n,e,a]),d1((T,A)=>{if(!n||!E.current)return;let Z=e.current;if(!Z)return;let ee=R.current;R.current=!1,(!ee||!d)&&(y.current+=A,M.current+=A);let Y=(!h||c)&&y.current>=v,Q=Y&&h?0:S(y.current);if(Q=h?Q%1:Math.min(Q,1),w)if(w.target.getPoint(Q,G),P){let q=h?P.length:P.length-1,H=Math.min(Q,1)*q,N=Math.min(Math.floor(H),q-1),J=(N+1)%P.length,ne=Q>=1?1:H-N,Ne=ne*ne*(3-2*ne),K=P[N],xe=P[J],Pe=xe.azimuth+Math.round((K.azimuth-xe.azimuth)/(Math.PI*2))*Math.PI*2,ve=K.azimuth+(Pe-K.azimuth)*Ne,mt=K.polar+(xe.polar-K.polar)*Ne,ft=K.distance+(xe.distance-K.distance)*Ne;U.set(Math.max(ft,1e-6),Math.min(Math.max(mt,1e-6),Math.PI-1e-6),ve),V.setFromSpherical(U).add(G)}else w.position.getPoint(Q,V);else{let q=B.current;if(!q)return;let H=Q*Math.PI*2,N=q.radius*2.2;V.set(q.center.x+Math.cos(H)*N,q.center.y+q.radius*.6,q.center.z+Math.sin(H)*N),G.copy(q.center)}let te=d?1:Math.min(M.current/b1,1);if(te<1){let q=te*te*(3-2*te);V.lerpVectors(_.current,V,q),G.lerpVectors(C.current,G,q)}if(Z.setLookAt(V.x,V.y,V.z,G.x,G.y,G.z,!1),ee&&p?.(),m?.(Math.min(y.current/v,1)),Y){E.current=!1,D.current=!0,y.current=0,O.current=0,i?.();return}s()}),null}function gv(){return typeof document<"u"&&typeof HTMLCanvasElement<"u"&&typeof HTMLCanvasElement.prototype.captureStream=="function"}function bv(e,t={}){let{fps:r=15,gifWidth:n=480,signal:o}=t;if(!Number.isFinite(r)||r<1||r>60)throw new Error("Video frame rate must be between 1 and 60.");if(!Number.isInteger(n)||n<16||n>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/r,a,l,c,d=null,p,m=0,s=0,f=0,u=null,h=0,v=0,x=0,b=!1,S=!1,w,P,y,M,_,C,E=new Promise((A,Z)=>{_=A,C=Z}),R=()=>{clearTimeout(w),clearInterval(P),y!==void 0&&cancelAnimationFrame(y),M!==void 0&&cancelAnimationFrame(M),o?.removeEventListener("abort",D),e.removeEventListener("webglcontextlost",B),c&&(c.pause(),c.srcObject=null),l?.getTracks().forEach(A=>A.stop())},O=(A=new DOMException("Video export cancelled.","AbortError"))=>{b||(b=!0,R(),C(A))},D=()=>O(),B=()=>O(new Error("Video export stopped because the WebGL context was lost.")),V=()=>O(new Error("Video export timed out. Keep the viewer tab visible while recording."));o?.addEventListener("abort",D,{once:!0}),e.addEventListener("webglcontextlost",B),w=setTimeout(V,3e4);let G=(async()=>{if(a=await import("gifenc"),!b&&(l=e.captureStream(r),c=document.createElement("video"),c.muted=!0,c.playsInline=!0,c.srcObject=l,await c.play(),!b)){if(d=document.createElement("canvas").getContext("2d",{willReadFrequently:!0}),!d)throw new Error("Video recording as GIF is not supported in this browser.");p=a.GIFEncoder()}})().catch(A=>O(A)),U=A=>{if(!u||!p)return;let Z=Math.max(2,Math.round((A-h)/10)-x);x+=Z,p.writeFrame(u.index,m,s,{palette:u.palette,delay:Z*10}),u=null},T=()=>{if(b||!a||!c||!d||!p||c.readyState<2||!c.videoWidth)return;let A=performance.now();if(!(f>0&&A-v<i/2)){m||(m=Math.min(n,c.videoWidth),s=Math.max(1,Math.round(m*c.videoHeight/c.videoWidth)),d.canvas.width=m,d.canvas.height=s);try{d.drawImage(c,0,0,m,s);let{data:Z}=d.getImageData(0,0,m,s),ee=a.quantize(Z,256),Y=a.applyPalette(Z,ee);f===0&&(h=A),U(A),u={index:Y,palette:ee},v=A,f+=1}catch(Z){O(Z)}}};return{result:E,cancel:O,start(A){b||y!==void 0||(y=requestAnimationFrame(()=>{G.then(()=>{b||(T(),P=setInterval(T,i),clearTimeout(w),w=setTimeout(V,(A+30)*1e3))})}))},finish(){b||S||(S=!0,M=requestAnimationFrame(()=>{G.then(()=>{if(b||(T(),b))return;if(!p||f===0){O(new Error("The browser produced an empty video."));return}U(v+i),p.finish();let A=new Blob([p.bytes()],{type:"image/gif"});b=!0,R(),_(A)})}))}}}var wd={webm:["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"],mp4:["video/mp4;codecs=avc1.42E01E","video/mp4"]};function fn(e="auto"){return e==="gif"?gv()?"image/gif":null:typeof MediaRecorder>"u"?null:(e==="auto"?[...wd.webm,...wd.mp4]:wd[e]).find(r=>MediaRecorder.isTypeSupported(r))??null}function hv(e,t={}){if(t.format==="gif")return bv(e,t);let{fps:r=30,videoBitsPerSecond:n=8e6,signal:o}=t;if(!Number.isFinite(r)||r<1||r>60)throw new Error("Video frame rate must be between 1 and 60.");if(!Number.isFinite(n)||n<=0)throw new Error("Video bitrate must be a positive number.");if(o?.aborted)throw new DOMException("Video export cancelled.","AbortError");let i=fn(t.format);if(!i||typeof e.captureStream!="function"){let y=t.format&&t.format!=="auto"?` as ${t.format.toUpperCase()}`:"";throw new Error(`Video recording${y} is not supported in this browser.`)}let a,l,c=!1,d=!1,p,m,s,f=[],u,h,v=new Promise((y,M)=>{u=y,h=M}),x=()=>{clearTimeout(p),m!==void 0&&cancelAnimationFrame(m),s!==void 0&&cancelAnimationFrame(s),o?.removeEventListener("abort",S),e.removeEventListener("webglcontextlost",w),l&&(l.ondataavailable=null,l.onstop=null,l.onerror=null),a?.getTracks().forEach(y=>y.stop())},b=(y=new DOMException("Video export cancelled.","AbortError"))=>{if(!c){if(c=!0,x(),l&&l.state!=="inactive")try{l.stop()}catch{}h(y)}},S=()=>b(),w=()=>b(new Error("Video export stopped because the WebGL context was lost.")),P=()=>b(new Error("Video export timed out. Keep the viewer tab visible while recording."));return o?.addEventListener("abort",S,{once:!0}),e.addEventListener("webglcontextlost",w),p=setTimeout(P,3e4),{result:v,cancel:b,start(y){c||m!==void 0||(m=requestAnimationFrame(()=>{if(!c)try{a=e.captureStream(r);let M=new MediaRecorder(a,{mimeType:i,videoBitsPerSecond:n});l=M,M.ondataavailable=({data:_})=>{_.size>0&&f.push(_)},M.onerror=()=>b(new Error("The browser could not encode the video.")),M.onstop=()=>{if(c)return;c=!0,x();let _=new Blob(f,{type:M.mimeType||i});_.size===0?h(new Error("The browser produced an empty video.")):u(_)},M.start(1e3),clearTimeout(p),p=setTimeout(P,(y+30)*1e3)}catch(M){b(M)}}))},finish(){c||d||(d=!0,s=requestAnimationFrame(()=>{if(!c)try{if(!l)throw new Error("Video recording did not start.");l.stop()}catch(y){b(y)}}))}}}function wv(e){let t=vv(e);t.current=e;let r=vv(null),[n,o]=yv(null),[i,a]=yv(0),l=Sl(()=>r.current?.cancel(),[]),c=Sl(()=>r.current!==null,[]);h1(()=>l,[e.modelUrl,l]);let d=Sl(async(m={})=>{let{rendererCaptureRef:s,controlsRef:f,cinematicConfig:u,ready:h,onCaptureStart:v}=t.current,x=s.current,b=f.current;if(!h||!x||!b)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(r.current)throw new Error("A video export is already in progress.");let S=m.mode??(u?"cinematic":"turntable");if(S==="cinematic"&&!u)throw new Error("Enable a cinematic camera path before recording it.");let w=S==="cinematic"?u:{loop:!0},P=m.duration??(S==="turntable"&&m.format==="gif"?8:xd(w));if(!Number.isFinite(P)||P<=0||P>300)throw new Error("Video duration must be greater than 0 and at most 300 seconds.");let y=hv(x.gl.domElement,m);r.current=y;let M=b.getPosition(new xv),_=b.getTarget(new xv),C=b.enabled,E=Vs(x.scene);b.stop(),b.enabled=!1,a(0),v(),o({config:{...w,duration:P,autoPlay:!1},onStarted:()=>y.start(P),onFinished:y.finish});try{return await y.result}finally{E(),b.enabled=C,b.setLookAt(M.x,M.y,M.z,_.x,_.y,_.z,!1),x.invalidate(),r.current=null,o(null)}},[]),p=Sl(m=>{let s=Math.floor(m*100);a(f=>f===s?f:s)},[]);return{captureVideo:d,cancelVideo:l,isRecording:c,recording:n,progress:i,onProgress:p}}import{useCallback as v1,useEffect as y1,useRef as x1,useState as ka}from"react";function Sv(e){let[t,r]=ka(null),[n,o]=ka(!1),[i,a]=ka(!1),[l,c]=ka(!1),[d,p]=ka(null),m=x1(!1);y1(()=>{if(!t||!e){o(!1),a(!1),p(null);return}let f=t.ownerDocument;o(f.fullscreenEnabled===!0&&typeof t.requestFullscreen=="function"&&typeof f.exitFullscreen=="function");let u=()=>{a(f.fullscreenElement===t),p(null)};return u(),f.addEventListener("fullscreenchange",u),()=>f.removeEventListener("fullscreenchange",u)},[t,e]);let s=v1(async()=>{if(!t||!e||!n||m.current)return;let f=t.ownerDocument,u=f.fullscreenElement===t;m.current=!0,c(!0),p(null);try{u?await f.exitFullscreen():await t.requestFullscreen(),a(f.fullscreenElement===t)}catch{p(u?"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,n]);return{rootRef:r,supported:n,active:i,pending:l,error:d,toggle:s}}import{useCallback as Cl,useEffect as Mv,useRef as Ra,useState as Sd}from"react";function Cv(e,{onLost:t,onRestored:r,initiallyLost:n=!1}){let o=n,i=l=>{l.preventDefault(),!o&&(o=!0,t())},a=()=>{o&&(o=!1,r())};return e.addEventListener("webglcontextlost",i),e.addEventListener("webglcontextrestored",a),n&&t(),()=>{e.removeEventListener("webglcontextlost",i),e.removeEventListener("webglcontextrestored",a)}}function Pv(e){let t=Ra(e);t.current=e;let[r,n]=Sd(null),[o,i]=Sd(0),[a,l]=Sd("ready"),c=Ra(null),d=Ra(!1),p=Ra(null),m=Ra(null),s=Cl(v=>{m.current?.dispose(),m.current=null,p.current=v,n(v)},[]),f=Cl(()=>{d.current||(d.current=!0,t.current?.(),c.current?.(),c.current=null,p.current&&(m.current=p.current),p.current=null,n(null),l("rebuilding"),i(v=>v+1))},[]),u=Cl(()=>{c.current?.(),c.current=null;let v=p.current;p.current=null,n(null),v&&Ab(v)},[]),h=Cl(()=>{d.current=!1,l("lost")},[]);return Mv(()=>()=>{m.current?.dispose(),m.current=null},[]),Mv(()=>{if(!r)return;if(d.current=!1,l("ready"),zn(r)){let x=r,b=x.onDeviceLost;return x.onDeviceLost=S=>{console.warn("[react-immersive] The WebGPU device was lost.",S),h()},()=>{x.onDeviceLost=b}}let v=Cv(r.domElement,{initiallyLost:r.getContext().isContextLost(),onLost:h,onRestored:f});return c.current=v,()=>{v(),c.current===v&&(c.current=null)}},[r,h,f]),{generation:o,status:a,reload:f,fail:h,release:u,onRendererCreated:s}}function Ml(e,t){return t||e}async function kv(e,t){await e.setLookAt(...t.position,...t.target,!1);let r=e.camera;t.fov!=null&&Number.isFinite(t.fov)&&t.fov>0&&t.fov<180&&"fov"in r&&(r.fov=t.fov,r.updateProjectionMatrix()),t.zoom!=null&&Number.isFinite(t.zoom)&&t.zoom>0&&await e.zoomTo(t.zoom,!1)}import{Component as w1}from"react";var xi=class extends w1{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(r,n){this.props.onError?.(r)}render(){return this.state.hasError?this.props.fallback??null:this.props.children}};import{useEffect as S1,useMemo as C1,useRef as M1}from"react";function Rv({modelUrl:e,tilesetUrl:t=null,getOptions:r,now:n=()=>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:a=c=>console.info("[react-immersive engagement]",c),warn:l=c=>console.warn("[react-immersive] onEngagement callback failed:",c)}){let c=n(),d=()=>{let R=r();return!!(R.onEngagement||R.debugEngagement)},p=R=>Math.max(0,Math.round(n()-R)),m=R=>{let{onEngagement:O,debugEngagement:D}=r();if(!O&&!D)return;let B={...R,sessionId:i,timestamp:o(),elapsedMs:p(c),modelUrl:e,tilesetUrl:t};D&&a(B);try{Promise.resolve(O?.(B)).catch(l)}catch(V){l(V)}},s=null,f=null,u="[]",h=null,v=null,x=R=>{s=R},b=R=>{!d()||s===R.objectKey||(s=R.objectKey,m({type:"part-viewed",...R}))},S=(R,O,D=null)=>{let B=JSON.stringify([D,O,R]);!d()||R===O||B===f||(f=B,m({type:"variant-chosen",variant:R,previousVariant:O,group:D}))},w=R=>{let O=JSON.stringify(R);O!==u&&(u=O,f=null)},P=()=>{!d()||h!==null||(h=n(),m({type:"ar-started"}))},y=(R="session-ended")=>{if(h===null)return;let O=p(h);h=null,m({type:"ar-ended",durationMs:O,reason:R})},M=(R="stopped")=>{if(!v)return;let{startedAt:O,annotationCount:D}=v;v=null,m({type:"tour-stopped",annotationCount:D,durationMs:p(O),reason:R})};return{setSelectedPart:x,viewPart:b,setActiveVariants:w,chooseVariant:S,startAR:P,endAR:y,startTour:R=>{!d()||R<=0||(M("restarted"),v={startedAt:n(),annotationCount:R},m({type:"tour-started",annotationCount:R}))},stopTour:M,completeTour:()=>{if(!v)return;let{startedAt:R,annotationCount:O}=v;v=null,m({type:"tour-completed",annotationCount:O,durationMs:p(R)})},interrupt:()=>{y("interrupted"),M("interrupted")},requestARLaunch:R=>m({type:"ar-launch-requested",channel:R})}}function Av(e){let t=M1(e);t.current=e;let r=!!(e.onEngagement||e.debugEngagement),n=C1(()=>Rv({modelUrl:e.modelUrl,tilesetUrl:e.tilesetUrl,getOptions:()=>t.current}),[e.modelUrl,e.tilesetUrl,r]);return S1(()=>()=>n.interrupt(),[n]),n}import{Color as P1}from"three";function Ov(e,t,r){let n=t[r]?.modelObjectId;return e.lighting.lights.filter(o=>{let i=o.attachment?.objectId;return i?Hs(t,i)===r||i===n:!1})}function Cd(e,t){return e.lighting.lights.some(r=>t[r.id])?{...e,lighting:{...e.lighting,lights:e.lighting.lights.map(r=>t[r.id]?{...r,...t[r.id]}:r)}}:e}function Ev(e){let t=null;if(e?.traverse(o=>{if(t)return;let i=o.material;for(let a of Array.isArray(i)?i:i?[i]:[])if(a.emissive instanceof P1){t=a;return}}),!t)return{color:"#000000",intensity:0,on:!1};let r=`#${t.emissive.getHexString()}`,n=t.emissiveIntensity??1;return{color:r,intensity:n,on:r!=="#000000"&&n>0}}import{lazy as k1,Suspense as R1}from"react";import{jsx as Md}from"react/jsx-runtime";var A1=k1(()=>import("react-colorful").then(e=>({default:e.HexColorPicker})));function Pl(e){return Md(R1,{fallback:Md("div",{"aria-hidden":"true",style:{width:200,height:200}}),children:Md(A1,{...e})})}import{Fragment as Dv,jsx as $n,jsxs as Aa}from"react/jsx-runtime";function Tv({kind:e,color:t,brightness:r,onColorChange:n,onBrightnessChange:o,onClose:i}){return $n("div",{className:"ri-popover ri-popover--inline",style:{padding:12},onPointerDown:a=>a.stopPropagation(),children:e==="change-light-color"?Aa(Dv,{children:[$n("p",{className:"ri-popoverLabel",children:"Light color"}),$n(Pl,{color:t,onChange:n}),Aa("div",{className:"ri-inlineRow",children:[$n("span",{className:"ri-colorCode",children:t}),$n("button",{className:"ri-secondaryButton",onClick:i,children:"Done"})]})]}):Aa(Dv,{children:[$n("p",{className:"ri-popoverLabel",children:"Brightness"}),$n("input",{type:"range",min:0,max:200,step:1,value:r,"aria-label":"Brightness",style:{width:"100%"},onChange:a=>o(Number(a.target.value))}),Aa("div",{className:"ri-inlineRow",children:[Aa("span",{className:"ri-colorCode",children:[r,"%"]}),$n("button",{className:"ri-secondaryButton",onClick:i,children:"Done"})]})]})})}import{useCallback as Pd,useRef as O1}from"react";var kl=e=>e==="#000000"?"#ffffff":e;function _v({nodeRefsMap:e,currentObjectBindingsRef:t,applyObjectBindings:r}){let n=O1({}),o=Pd(a=>{let l=Ev(e.current[a]),c=t.current[a]?.style?.material,d=c?.emissive??l.color,p=c?.emissiveIntensity??l.intensity;return{color:d,intensity:p,on:d!=="#000000"&&p>0}},[]),i=Pd((a,l)=>{let c=t.current,d=c[a];d&&r({...c,[a]:{...d,style:{...d.style,material:{...d.style?.material,...l}}}})},[r]);return{glowMemoryRef:n,readObjectGlow:o,applyGlow:i}}function Lv({setCurrentAction:e,bindingKeyIndex:t,currentObjectBindings:r,applyObjectBindings:n,resolveObjectKey:o,closeColorPicker:i,setColorPicker:a,setMaterialPopupsByObject:l,setItemMaterials:c,getPopoverPosition:d,decalRequestRef:p,setDecalError:m,setDecalDragging:s,setDecalControl:f,resolvedSceneConfigRef:u,applyLightPatches:h,readObjectGlow:v,applyGlow:x,glowMemoryRef:b,setLightControl:S,onAction:w}){return Pd(P=>{let{objectId:y,action:M,binding:_}=P;switch(e(P),M.id){case"toggle-visibility":{let C=y;_?.modelObjectId&&(C=t.byModelObjectId.get(_.modelObjectId)??C);let E=r[C],R=E?.visible===!1;E&&n({...r,[C]:{...E,visible:R}});break}case"change-color":i(),l(C=>{if(!(y in C))return C;let E={...C};return delete E[y],E}),c(C=>{let E=o(y,_)??y,R=C[y]?.hex,O=r[E]?.style?.material?.baseColor;return{...C,[y]:{...C[y],hex:R??O??"#ffffff"}}}),a(d(y,225,250,_,P));break;case"change-material":i(),l(C=>{if(y in C){let E={...C};return delete E[y],E}return{...C,[y]:d(y,300,320,_,P)}});break;case"add-text":case"add-image":{i();let C=M.id;p.current++,m(null),s(null),f(E=>E?.objectId===y&&E.kind===C?null:{objectId:y,kind:C,activeId:null});break}case"toggle-light":case"change-light-color":case"set-brightness":{let C=o(y,_);if(!C)break;let E=Ov(u.current,r,C);if(M.id==="toggle-light"){if(E.length>0){let B=!E.some(V=>V.visible);h(Object.fromEntries(E.map(V=>[V.id,{visible:B}])));break}let D=v(C);D.on?(b.current[C]=D.intensity,x(C,{emissiveIntensity:0})):x(C,{emissive:kl(D.color),emissiveIntensity:b.current[C]??1});break}let R=M.id,O=E.length>0?null:v(C);S(D=>D?.objectId===y&&D.kind===R?null:{objectId:y,kind:R,target:O?{type:"glow",objectKey:C,baseIntensity:O.on?O.intensity:b.current[C]??1}:{type:"lights",lightIds:E.map(B=>B.id),baseIntensity:Object.fromEntries(E.map(B=>[B.id,B.intensity]))},percent:O&&!O.on?0:100});break}default:break}w?.(P)},[n,x,h,v,r,d,w,i,o,t])}import{jsx as E1}from"react/jsx-runtime";function Bv({control:e,lights:t,readObjectGlow:r,applyGlow:n,glowMemoryRef:o,applyLightPatches:i,onControlChange:a}){let l=e.target,c=l.type==="lights"?t.find(d=>d.id===l.lightIds[0])?.color??"#ffffff":kl(r(l.objectKey).color);return E1(Tv,{kind:e.kind,color:c,brightness:e.percent,onColorChange:d=>{if(l.type==="lights"){i(Object.fromEntries(l.lightIds.map(m=>[m,{color:d}])));return}let p=r(l.objectKey);n(l.objectKey,{emissive:d,emissiveIntensity:p.intensity>0?p.intensity:o.current[l.objectKey]??1})},onBrightnessChange:d=>{if(a({...e,percent:d}),l.type==="lights"){i(Object.fromEntries(l.lightIds.map(p=>[p,{intensity:(l.baseIntensity[p]??0)*(d/100)}])));return}n(l.objectKey,{emissive:kl(r(l.objectKey).color),emissiveIntensity:l.baseIntensity*(d/100)})},onClose:()=>a(null)})}import{useRef as j1,useState as zv}from"react";import{ArrowDown as D1,ArrowLeft as T1,ArrowRight as _1,ArrowUp as L1}from"lucide-react";import{useEffect as B1,useRef as kd}from"react";function jv(e){let t=!1,r,n=()=>{t||(e(),t||(r=setTimeout(n,70)))};return e(),r=setTimeout(n,300),()=>{t=!0,clearTimeout(r)}}import{jsx as Oa,jsxs as Nv}from"react/jsx-runtime";function Iv({onNudge:e}){let t=re(),r=kd(e);r.current=e;let n=kd(null),o=kd(null),i=()=>{n.current?.(),n.current=null,o.current=null};return B1(()=>{let a=c=>{c.pointerId===o.current&&i()},l=c=>{c.key==="Escape"&&i()};return window.addEventListener("pointerup",a,!0),window.addEventListener("pointercancel",a,!0),window.addEventListener("blur",i),window.addEventListener("keydown",l),()=>{i(),window.removeEventListener("pointerup",a,!0),window.removeEventListener("pointercancel",a,!0),window.removeEventListener("blur",i),window.removeEventListener("keydown",l)}},[]),Nv("div",{className:"ri-decalPosition",children:[Nv("div",{children:[Oa("div",{className:"ri-decalPosition__label",children:t("position")}),Oa("div",{className:"ri-decalPosition__hint",children:t("decalNudgeHint")})]}),Oa("div",{className:"ri-decalPosition__pad",role:"group","aria-label":t("decalNudgeControls"),children:[["up",L1],["left",T1],["right",_1],["down",D1]].map(([a,l])=>Oa("button",{type:"button",className:`ri-decalPosition__button ri-decalPosition__button--${a}`,"aria-label":t("moveDecal",{direction:t(a)}),title:t("moveDecalOnSurface",{direction:t(a)}),onPointerDown:c=>{c.button===0&&(c.preventDefault(),c.currentTarget.focus({preventScroll:!0}),i(),o.current=c.pointerId,n.current=jv(()=>r.current(a)))},onClick:c=>{c.detail===0&&r.current(a)},children:Oa(l,{size:16})},a))})]})}import{Fragment as Vv,jsx as Mt,jsxs as Kr}from"react/jsx-runtime";var N1=e=>Math.round(e*180/Math.PI);function Fv({kind:e,decals:t,activeId:r,error:n,moving:o,defaultSize:i,onSelect:a,onAddText:l,onAddImage:c,onChange:d,onMove:p,onNudge:m,onRemove:s,onClose:f}){let u=re(),[h,v]=zv(""),[x,b]=zv("#ffffff"),S=j1(null),w=t.find(y=>y.id===r)??null;return Kr("div",{className:"ri-popover ri-popover--inline ri-decalControl",onPointerDown:y=>y.stopPropagation(),children:[e==="add-text"?Kr(Vv,{children:[Mt("p",{className:"ri-popoverLabel",children:u("text")}),Kr("div",{className:"ri-decalControl__row",children:[Mt("input",{className:"ri-decalControl__input",value:h,placeholder:u("yourText"),"aria-label":u("textToAdd"),onChange:y=>v(y.target.value)}),Mt("input",{type:"color",className:"ri-decalControl__color",value:x,"aria-label":u("textColour"),onChange:y=>b(y.target.value)})]}),Mt("button",{type:"button",className:"ri-uploadButton",disabled:!h.trim(),onClick:()=>{l(h.trim(),x)&&v("")},children:u("addText")})]}):Kr(Vv,{children:[Mt("p",{className:"ri-popoverLabel",children:u("image")}),Mt("button",{type:"button",className:"ri-uploadButton",onClick:()=>S.current?.click(),children:u("chooseImage")}),Mt("input",{ref:S,type:"file",accept:"image/png,image/jpeg,image/webp,image/svg+xml",className:"ri-hiddenInput","aria-label":u("imageToAdd"),onChange:y=>{let M=y.target.files?.[0];y.target.value="",M&&c(M)}})]}),n?Mt("div",{className:"ri-decalControl__hint",role:"alert",children:n}):null,t.length>0?Mt("div",{className:"ri-decalControl__list",role:"group","aria-label":u("added"),children:t.map((y,M)=>Mt("button",{type:"button",className:`ri-decalControl__chip ${y.id===r?"ri-decalControl__chip--active":""}`,"aria-pressed":y.id===r,onClick:()=>a(y.id),children:y.image?u("decalImage",{index:M+1}):y.text||u("decalText",{index:M+1})},y.id))}):null,w?Kr("div",{className:"ri-decalControl__editor",children:[Mt(Iv,{onNudge:y=>m(w.id,y)}),w.image?null:Kr("div",{className:"ri-decalControl__row",children:[Mt("input",{className:"ri-decalControl__input",value:w.text??"","aria-label":u("text"),onChange:y=>d(w.id,{text:y.target.value})}),Mt("input",{type:"color",className:"ri-decalControl__color",value:w.color??"#ffffff","aria-label":u("colour"),onChange:y=>d(w.id,{color:y.target.value})})]}),Kr("label",{className:"ri-decalControl__slider",children:[Mt("span",{children:u("size")}),Mt("input",{type:"range",min:i/10,max:i*4,step:i/50,value:w.size,"aria-label":u("size"),onChange:y=>d(w.id,{size:Number(y.target.value)})})]}),Kr("label",{className:"ri-decalControl__slider",children:[Mt("span",{children:u("turn")}),Mt("input",{type:"range",min:-180,max:180,step:1,value:N1(w.rotation??0),"aria-label":u("rotation"),onChange:y=>d(w.id,{rotation:Number(y.target.value)*Math.PI/180})})]}),Kr("div",{className:"ri-inlineRow",children:[Mt("button",{type:"button",className:"ri-secondaryButton","aria-pressed":o,title:u("dragTheDecalAcrossTheObjectsSurface"),onClick:()=>p(w.id),children:u("move")}),Mt("button",{type:"button",className:"ri-removeButton",onClick:()=>s(w.id),children:u("remove")})]})]}):null,Kr("div",{className:"ri-inlineRow",children:[Mt("span",{className:"ri-colorCode",children:t.length===0?u("noneAddedYet"):u("decalAdded",{count:t.length})}),Mt("button",{type:"button",className:"ri-secondaryButton",onClick:f,children:u("done")})]})]})}import{useEffect as rP,useRef as nP}from"react";import{useThree as oP}from"@react-three/fiber";import{Mesh as iP,Raycaster as aP,Vector2 as Dd,Vector3 as Jv}from"three";import{BufferGeometry as I1,CanvasTexture as z1,Float32BufferAttribute as Rl,Matrix4 as V1,Object3D as F1,SRGBColorSpace as H1,Uint16BufferAttribute as G1,Vector3 as gn}from"three";var U1=.5,Ea=4;function $1(e,t=0){let r=new gn(...e);r.lengthSq()<1e-12&&r.set(0,0,1),r.normalize();let n=new F1;return Math.abs(r.y)>.999&&n.up.set(0,0,-Math.sign(r.y)),n.lookAt(r),n.rotateZ(t),n.rotation.clone()}function W1(e,t,r){let n=null;if(e.bones&&t.bones){n=new Map;for(let[o,i]of e.bones)n.set(o,i*(1-r));for(let[o,i]of t.bones)n.set(o,(n.get(o)??0)+i*r)}return{position:e.position.clone().lerp(t.position,r),normal:e.normal.clone().lerp(t.normal,r),bones:n}}function Hv(e,t,r,n){let o=a=>n?a.position[t]<=r:a.position[t]>=r,i=[];for(let a=0;a<e.length;a++){let l=e[a],c=e[(a+1)%e.length],d=o(l);if(d&&i.push(l),d!==o(c)){let p=c.position[t]-l.position[t];i.push(W1(l,c,(r-l.position[t])/p))}}return i}function Al(e,t,r){let n=e.geometry,o=n.getAttribute("position");if(!o)return null;let i=n.getAttribute("normal"),a=n.getAttribute("skinIndex"),l=n.getAttribute("skinWeight"),c=!!(a&&l),d=n.getIndex(),p=Math.max(t.size,1e-6),m=p/(r>0&&Number.isFinite(r)?r:1),s=Math.max(p,m)*U1,f={x:p/2,y:m/2,z:s/2},u=new V1().makeRotationFromEuler($1(t.normal,t.rotation)).setPosition(...t.position),h=u.clone().invert(),v=(V,G)=>{let U=null;if(c){U=new Map;for(let T=0;T<Ea;T++){let A=l.getComponent(V,T);if(A<=0)continue;let Z=a.getComponent(V,T);U.set(Z,(U.get(Z)??0)+A)}}return{position:G.clone(),normal:i?new gn().fromBufferAttribute(i,V):new gn,bones:U}},x=[],b=[],S=[],w=[],P=[],y=new gn,M=new gn,_=new gn,C=V=>{if(S.push(.5+V.position.x/p,.5-V.position.y/m),y.copy(V.position).applyMatrix4(u),x.push(y.x,y.y,y.z),b.push(V.normal.x,V.normal.y,V.normal.z),!V.bones)return;let G=[...V.bones].sort((T,A)=>A[1]-T[1]).slice(0,Ea),U=G.reduce((T,[,A])=>T+A,0)||1;for(let T=0;T<Ea;T++)w.push(G[T]?.[0]??0),P.push((G[T]?.[1]??0)/U)},E=["x","y","z"],R=[new gn,new gn,new gn],O=[0,0,0],D=(d?d.count:o.count)/3;for(let V=0;V<D;V++){for(let T=0;T<3;T++){let A=V*3+T;O[T]=d?d.getX(A):A,R[T].fromBufferAttribute(o,O[T]).applyMatrix4(h)}if(E.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 G=R.map((T,A)=>v(O[A],T));if(!i){M.copy(G[1].position).sub(G[0].position),_.copy(G[2].position).sub(G[0].position);let T=M.cross(_).transformDirection(u);for(let A of G)A.normal.copy(T)}let U=G;for(let T of E)if(U=Hv(U,T,f[T],!0),U=Hv(U,T,-f[T],!1),U.length<3)break;for(let T=1;T+1<U.length;T++)C(U[0]),C(U[T]),C(U[T+1])}if(x.length===0)return null;let B=new I1;return B.setAttribute("position",new Rl(x,3)),B.setAttribute("normal",new Rl(b,3)),B.setAttribute("uv",new Rl(S,2)),c&&(B.setAttribute("skinIndex",new G1(w,Ea)),B.setAttribute("skinWeight",new Rl(P,Ea))),B}function Uv(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 Gv=256,Rd=24;function $v(e){let t=`${e.fontWeight??"bold"} ${Gv-Rd*2}px ${e.fontFamily||"sans-serif"}`,r=document.createElement("canvas"),n=r.getContext("2d");n.font=t;let o=e.text||" ";r.width=Math.min(Math.max(Math.ceil(n.measureText(o).width)+Rd*2,8),4096),r.height=Gv,n.font=t,n.textAlign="center",n.textBaseline="middle",n.fillStyle=e.color??"#ffffff",n.fillText(o,r.width/2,r.height/2,r.width-Rd);let i=new z1(r);return i.flipY=!1,i.colorSpace=H1,{texture:i,aspect:r.width/r.height}}import{useEffect as Wv,useRef as X1}from"react";import{BufferGeometry as q1,Float32BufferAttribute as K1,Mesh as Q1,MeshStandardMaterial as J1,SkinnedMesh as Y1,SRGBColorSpace as qv}from"three";var Mo="riDecal",Ed="riDecalId";function Ad(){return new q1().setAttribute("position",new K1([],3))}function Xv(e){let t=e.image;return t?.width&&t.height?t.width/t.height:1}function Od(e){e.disposed=!0,e.node.remove(e.mesh),e.mesh.geometry.dispose(),e.mesh.material.dispose(),e.imagePath&&li(e.imagePath,qv),e.ownTexture?.dispose()}function Z1(e,t,r,n){let o=new J1({transparent:!0,polygonOffset:!0,polygonOffsetFactor:-4,depthWrite:!1,metalness:0,roughness:.7}),i=Wr(e)&&e.skeleton?e:null,a=i?new Y1(Ad(),o):new Q1(Ad(),o);if(i){let d=a;d.bind(i.skeleton,i.bindMatrix),d.frustumCulled=!1,d.onBeforeRender=()=>{let p=yg(i);p&&d.bindMatrixInverse.copy(p)}}a.userData[Mo]=!0,a.userData[Ed]=t.id,a.raycast=()=>{},a.castShadow=!1,a.receiveShadow=!0,a.renderOrder=1;let l={node:e,mesh:a,signature:r,disposed:!1},c=d=>{let p=Al(e,t,d);a.geometry.dispose(),a.geometry=p??Ad(),a.visible=p!==null};if(t.image){l.imagePath=t.image;let d=Ks(t.image,qv,()=>{l.disposed||(c(Xv(d)),o.needsUpdate=!0,n())});o.map=d,c(Xv(d))}else{let{texture:d,aspect:p}=$v(t);l.ownTexture=d,o.map=d,c(p)}return e.add(a),l}function Kv({objectBindings:e,nodeMap:t,invalidate:r}){let n=X1(new Map);Wv(()=>{let o=n.current,i=new Set;for(let[a,l]of Object.entries(e)){if(!l.decals?.length)continue;let c=t[l.modelObjectId??a];if(sr(c))for(let d of l.decals){if(!d.image&&!d.text)continue;let p=`${a}
|
|
7
|
+
${d.id}`,m=Uv(d),s=o.get(p);s&&(s.node!==c||s.signature!==m)&&(Od(s),s=void 0),s||(s=Z1(c,d,m,r),o.set(p,s)),s.mesh.material.opacity=(d.opacity??1)*(l.style?.material?.opacity??1),i.add(p)}}for(let[a,l]of o)i.has(a)||(Od(l),o.delete(a));r()},[e,t,r]),Wv(()=>{let o=n.current;return()=>{for(let i of o.values())Od(i);o.clear()}},[])}import{Mesh as eP,SkinnedMesh as tP}from"three";function Qv(e,t){let r=[];if(Wr(e)){let n=e;n.computeBoundingSphere(),n.computeBoundingBox(),tP.prototype.raycast.call(n,t,r)}else eP.prototype.raycast.call(e,t,r);return r.sort((n,o)=>n.distance-o.distance)[0]}function Yv({target:e,nodes:t,controls:r}){let{camera:n,gl:o,invalidate:i}=oP(),a=nP(e);return a.current=e,rP(()=>{let l=o.domElement,c=new aP,d=new Dd,p=l.style.cursor,m=l.style.touchAction;l.style.cursor="grab",l.style.touchAction="none";let s=0,f=null,u=null,h=(M,_=new Dd)=>{let C=l.getBoundingClientRect();d.set((M.clientX-C.left-_.x)/C.width*2-1,-((M.clientY-C.top-_.y)/C.height)*2+1),c.setFromCamera(d,n)},v=M=>{if(!u)return;h(M,u.offset),u.node.updateWorldMatrix(!0,!1);let _=c.intersectObject(u.node,!1)[0];if(!_)return;let C=ui({..._,ray:c.ray},u.node),E=Al(u.node,{...u.decal,...C},u.aspect);E&&(u.mesh.geometry!==u.geometry&&u.mesh.geometry.dispose(),u.mesh.geometry=E,u.surface=C,i())},x=M=>{if(!u)return;cancelAnimationFrame(s),s=0,f=null;let _=u;u=null,_.mesh.geometry!==_.geometry&&(M&&_.surface?_.geometry.dispose():(_.mesh.geometry.dispose(),_.mesh.geometry=_.geometry)),_.controller&&(_.controller.enabled=_.controlsEnabled),l.hasPointerCapture(_.pointerId)&&l.releasePointerCapture(_.pointerId),l.style.cursor="grab",i();let C=()=>{window.removeEventListener("click",E,!0),window.removeEventListener("pointerdown",C,!0),clearTimeout(R)},E=O=>{O.target===l&&(O.preventDefault(),O.stopImmediatePropagation()),C()},R=setTimeout(C,300);window.addEventListener("click",E,!0),window.addEventListener("pointerdown",C,!0),M&&_.surface&&a.current.onCommit(_.surface)},b=M=>{if(M.button!==0||u)return;let _=a.current,C=t.current[_.objectId];if(!(C instanceof iP)||!C.visible)return;let E=C.children.find(T=>T.userData[Mo]&&T.userData[Ed]===_.decal.id);if(!E?.visible)return;C.updateWorldMatrix(!0,!0),h(M);let R=Qv(E,c),O=c.intersectObject(C,!1)[0];if(!R||!O||R.distance>O.distance+1e-4)return;let D=new Jv;if(Wr(E)){let T=new Jv,A=E.geometry.getAttribute("position").count;if(!A)return;for(let Z=0;Z<A;Z++)D.add(E.getVertexPosition(Z,T));D.divideScalar(A).applyMatrix4(E.matrixWorld)}else D.fromArray(_.decal.position).applyMatrix4(C.matrixWorld);D.project(n);let B=l.getBoundingClientRect(),V=new Dd(M.clientX-(B.left+(D.x+1)/2*B.width),M.clientY-(B.top+(1-D.y)/2*B.height)),G=E.material.map?.image,U=r.current;u={pointerId:M.pointerId,node:C,mesh:E,geometry:E.geometry,decal:_.decal,surface:null,offset:V,aspect:G?.width&&G.height?G.width/G.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=>{!u||M.pointerId!==u.pointerId||(M.preventDefault(),M.stopImmediatePropagation(),f=M,s||(s=requestAnimationFrame(()=>{s=0,f&&v(f)})))},w=M=>{!u||M.pointerId!==u.pointerId||(M.preventDefault(),M.stopImmediatePropagation(),f&&v(f),x(!0))},P=()=>x(!1),y=M=>{M.key==="Escape"&&(x(!1),a.current.onCancel())};return l.addEventListener("pointerdown",b,!0),window.addEventListener("pointermove",S,{capture:!0,passive:!1}),window.addEventListener("pointerup",w,!0),window.addEventListener("pointercancel",P),window.addEventListener("blur",P),window.addEventListener("keydown",y),l.addEventListener("lostpointercapture",P),()=>{x(!1),l.style.cursor=p,l.style.touchAction=m,l.removeEventListener("pointerdown",b,!0),window.removeEventListener("pointermove",S,!0),window.removeEventListener("pointerup",w,!0),window.removeEventListener("pointercancel",P),window.removeEventListener("blur",P),window.removeEventListener("keydown",y),l.removeEventListener("lostpointercapture",P)}},[n,o,i,t,r,e.objectId,e.decal]),null}import{useCallback as wi,useEffect as bP,useState as Ta}from"react";import{strToU8 as lP}from"fflate";import{zip as sP}from"fflate";function Zv(e,t=6){return new Promise((r,n)=>{sP(e,{level:t},(o,i)=>{o?n(o):r(i)})})}var Da=2048,ey=["#00e5ff","#ff4fd8","#ffe45e","#7cff6b","#ff784f","#a78bfa","#38bdf8","#fb7185"];function ty(e){return e.split("&").join("&").split("<").join("<").split(">").join(">").split('"').join(""").split("'").join("'")}function Ld(e,t){return e.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||t}function ny(e){return Ld(e,"model")}function Td(e,t){return e.index?Math.round(e.index.getX(t)):t}function cP(e,t,r){let n=Td(e,r),o=Td(e,r+1),i=Td(e,r+2);if(n>=t.count||o>=t.count||i>=t.count)return null;let a=[{index:n,u:t.getX(n),v:t.getY(n)},{index:o,u:t.getX(o),v:t.getY(o)},{index:i,u:t.getX(i),v:t.getY(i)}];return a.every(l=>Number.isFinite(l.u)&&Number.isFinite(l.v))?a:null}function ry(e){return`${e.u.toFixed(6)},${e.v.toFixed(6)}`}function _d(e,t,r,n){let o,i;n?(o=t.index,i=r.index):(o=ry(t),i=ry(r));let a=o<i?`${o}|${i}`:`${i}|${o}`,l=e.get(a);l?l.count+=1:e.set(a,{count:1,start:t,end:r})}function uP(e,t,r){_d(e,t[0],t[1],r),_d(e,t[1],t[2],r),_d(e,t[2],t[0],r)}function dP(e,t){return Array.isArray(e)?e[t]??null:e}function pP(e){let t=new Map,r=0,n=0,o=0;return e.traverse(i=>{let a=i;if(!a.isMesh||!a.geometry||!a.material)return;let l=a.geometry,c=l.getAttribute("uv");if(!c||c.itemSize<2||c.count<3)return;r+=1;let d=a.name||`Mesh ${r}`,p=l.index?.count??c.count,m=l.groups.length>0?l.groups:[{start:0,count:p,materialIndex:0}];for(let s of m){let f=s.materialIndex??0,u=dP(a.material,f);if(!u)continue;let h=t.get(u.uuid);h||(n+=1,h={name:u.name||`Material ${n}`,layers:new Map},t.set(u.uuid,h));let v=h.layers.get(a.uuid);v||(v={name:d,color:ey[o%ey.length],edges:new Map},o+=1,h.layers.set(a.uuid,v));let x=Math.max(0,s.start),b=Math.min(p,x+s.count);for(let S=x;S+2<b;S+=3){let w=cP(l,c,S);w&&uP(v.edges,w,!!l.index)}}}),[...t.values()].filter(i=>[...i.layers.values()].some(a=>a.edges.size>0))}function Ol(e){return(e*Da).toFixed(2)}function mP(e){return`M${Ol(e.start.u)} ${Ol(1-e.start.v)}L${Ol(e.end.u)} ${Ol(1-e.end.v)}`}function fP(e){let t=ty(e.name),r=[...e.layers.values()].filter(n=>n.edges.size>0).map((n,o)=>{let i=ty(n.name),a=`${Ld(n.name,"mesh")}-${o+1}`,l=[...n.edges.values()],c=l.filter(m=>m.count===1),p=(c.length>0?c:l).map(mP).join("");return[` <g id="${a}" data-mesh="${i}" fill="none" stroke="${n.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="${Da}" height="${Da}" viewBox="0 0 ${Da} ${Da}">`,` <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"/>',r,"</svg>"].join(`
|
|
10
|
+
`)}function gP(e){let t=[],r=new Set;return e.forEach((n,o)=>{let i=pP(n.scene);if(i.length===0)return;let a=ny(n.label||`model-${o+1}`);i.forEach((l,c)=>{let d=Ld(l.name,`material-${c+1}`),p=i.length===1?`${a}-uv-layout.svg`:`${a}-uv-${d}-${c+1}.svg`;if(r.has(p)){let m=p.replace(/\.svg$/,""),s=2;for(;r.has(`${m}-${s}.svg`);)s+=1;p=`${m}-${s}.svg`}r.add(p),t.push({filename:p,materialName:l.name,meshCount:[...l.layers.values()].filter(m=>m.edges.size>0).length,svg:fP(l)})})}),t}async function Bd(e,t="model"){let r=gP(e);if(r.length===0)return r;if(r.length===1)return Vn(new Blob([r[0].svg],{type:"image/svg+xml;charset=utf-8"}),r[0].filename),r;let n=Object.fromEntries(r.map(i=>[i.filename,lP(i.svg)])),o=await Zv(n);return Vn(new Blob([o],{type:"application/zip"}),`${ny(t)}-uv-layouts.zip`),r}async function oy(e,t="model"){return Bd([{scene:e,label:t}],t)}function jd(e){import("./exportSceneMesh-YJFOLFHS.mjs").then(t=>t.exportSceneMesh(e),t=>{console.error("[react-immersive] Couldn't load the model exporter.",t),e.onComplete()})}function iy({sceneRef:e,materialRefs:t,rendererCaptureRef:r,objectBindings:n,downloadFilename:o,getAllLoadedModels:i,getAllLoadedModelUvSources:a,captureVideo:l,openConfiguredAR:c}){let[d,p]=Ta(!1),[m,s]=Ta(!1),[f,u]=Ta(null),[h,v]=Ta(null),[x,b]=Ta("auto");bP(()=>{if(!m)return;let C=()=>s(!1);return window.addEventListener("pointerdown",C),()=>window.removeEventListener("pointerdown",C)},[m]);let S=wi(()=>{u(null),v(null),s(C=>!C)},[]),w=wi(()=>{let C=i?.()??null;if(C&&C.length>0){s(!1),p(!0),jd({sources:C,downloadFilename:o,onComplete:()=>p(!1)});return}let E=e.current;E&&(s(!1),p(!0),jd({sources:[{scene:E,objectBindings:n,matRefs:t.current??{}}],downloadFilename:o,onComplete:()=>p(!1)}))},[o,t,n,e,i]),P=wi(async()=>{let C=i?.()??null;if(!C||C.length===0)return;s(!1),p(!0);let E=new Set;try{for(let R=0;R<C.length;R++){let O=C[R],D=(O.label||`model-${R+1}`).replace(/[\\/:*?"<>|]+/g,"-"),B=D,V=2;for(;E.has(B);)B=`${D}-${V++}`;E.add(B),await new Promise(G=>{jd({sources:[O],downloadFilename:o,filenameSuffix:`-${B}`,onComplete:G})}),await new Promise(G=>setTimeout(G,300))}}finally{p(!1)}},[o,i]),y=wi(()=>{s(!1),xl(r.current).then(C=>{let E=document.createElement("a");E.href=C,E.download=`${o}.png`,document.body.appendChild(E),E.click(),document.body.removeChild(E)}).catch(C=>{console.error("Screenshot failed:",C)})},[o,r]),M=wi(async()=>{let C=a?.()??null;try{let E;if(C&&C.length>0)E=await Bd(C,o);else{let R=e.current;if(!R)return;E=await oy(R,o)}if(E.length===0){u("This model does not contain UV coordinates.");return}u(null),s(!1)}catch(E){console.error("UV layout export failed:",E),u("Could not create the UV layout archive.")}},[o,e,a]),_=wi(async C=>{s(!1),v(null);try{let E=await l({mode:C,format:x}),R=E.type==="image/gif"?"gif":E.type.startsWith("video/mp4")?"mp4":"webm",O=URL.createObjectURL(E),D=document.createElement("a");D.href=O,D.download=`${o}-${C}.${R}`,document.body.appendChild(D);try{D.click()}finally{D.remove(),setTimeout(()=>URL.revokeObjectURL(O),1e3)}}catch(E){if(E instanceof DOMException&&E.name==="AbortError")return;v(E instanceof Error?E.message:"Could not export the video."),s(!0)}},[l,o,x]);return{openConfiguredAR:c?()=>{s(!1),c()}:void 0,isDownloading:d,downloadMenuOpen:m,uvExportError:f,toggleDownloadMenu:S,handleDownloadMesh:w,handleDownloadSeparateMeshes:P,handleDownloadScreenshot:y,handleDownloadUvLayout:M,handleDownloadVideo:_,videoFormat:x,setVideoFormat:b,videoExportError:h}}import{useCallback as tr,useEffect as La,useRef as _l,useReducer as xP,useState as Po}from"react";import{Box3 as gy,Raycaster as wP,Vector2 as Vd,Vector3 as Fd}from"three";var El={tool:"distance",points:[],areaClosed:!1,error:null};function ay(e,t){if(t.type==="tool")return{...El,tool:t.tool};if(t.type==="clear")return{...El,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=Ys(e.points.map(a=>a.position));return"error"in i?{...e,error:i.error}:{...e,areaClosed:!0,error:null}}if(t.type!=="place")return e;let n=e.areaClosed||e.tool==="angle"&&e.points.length===3||e.tool==="pointToPlane"&&e.points.length===2?[]:e.points;if(e.tool==="pointToPlane"&&n.length===0&&!t.point.normal)return{...e,error:"Pick a triangle face to define the reference plane."};if(n.length>=256)return{...e,error:"Finish or clear this measurement before adding more points."};let o=[...n,t.point];return e.tool==="angle"&&o.length===3&&Js(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 cy,Matrix4 as hP,Mesh as uy,Vector3 as Dl}from"three";var sy=new WeakMap,Nd=new WeakMap,vP=0;function Id(e){return Nd.has(e)||Nd.set(e,++vP),`${Nd.get(e)}:${e.version??e.data?.version??0}:${e.count}`}var dy=new ArrayBuffer(8),yP=new Float64Array(dy),ly=new Uint32Array(dy);function Mr(e,t){return yP[0]=t,Math.imul(Math.imul(e^ly[0],16777619)^ly[1],16777619)}function py(e){let t=e.getAttribute("position");if(!t)return"no-position";let r=e.getIndex(),n=[e.getAttribute("skinIndex"),e.getAttribute("skinWeight")].filter(Boolean),o=`${Id(t)}:${r?Id(r):"none"}:${e.morphTargetsRelative}:${[...e.morphAttributes.position??[],...n].map(Id).join(";")}`,i=sy.get(e);if(i?.position===t&&i.index===r&&i.version===o)return i.signature;let a=e.morphTargetsRelative?Mr(2166136261,1):2166136261;for(let c=0;c<t.count;c++)a=Mr(a,t.getX(c)),a=Mr(a,t.getY(c)),a=Mr(a,t.getZ(c));if(r)for(let c=0;c<r.count;c++)a=Mr(a,r.getX(c));for(let c of e.morphAttributes.position??[])for(let d=0;d<c.count;d++)a=Mr(a,c.getX(d)),a=Mr(a,c.getY(d)),a=Mr(a,c.getZ(d));for(let c of n)for(let d=0;d<c.count;d++)for(let p=0;p<c.itemSize;p++)a=Mr(a,c.getComponent(d,p));let l=`${t.count}:${r?.count??0}:${a>>>0}`;return sy.set(e,{position:t,index:r,version:o,signature:l}),l}function my(e){let t=2166136261,r=e.skeleton;if(r){for(let n of[e.bindMatrix,...r.boneInverses])for(let o of n.elements)t=Mr(t,o);for(let n of r.bones){n.matrixAutoUpdate&&n.updateMatrix();for(let o of n.matrix.elements)t=Mr(t,o)}}for(let n of e.morphTargetInfluences??[])t=Mr(t,n);return`${r?"skin":"mesh"}:${t>>>0}`}function fy(e,t){e.updateWorldMatrix(!0,!1);let r=e.matrixWorld.clone();if(t!==void 0){if(!e.isInstancedMesh||t>=e.count)return null;let n=new hP;e.getMatrixAt(t,n),r.multiply(n)}return Math.abs(r.determinant())>1e-15?r:null}function zd(e,t){if(!(t.object instanceof uy))return e;let r=jn(t.object),n=fy(t.object,t.instanceId);if(!r||!n)return e;let o=n.clone().invert(),i=a=>new Dl(...a).applyMatrix4(o).toArray();return{...e,anchor:{nodeId:r,localPosition:i(e.position),geometrySignature:py(t.object.geometry),poseSignature:my(t.object),...t.instanceId!==void 0?{instanceId:t.instanceId}:{},...e.normal?{localNormal:new Dl(...e.normal).applyNormalMatrix(new cy().getNormalMatrix(o)).toArray()}:{},...e.faceVertices?{localFaceVertices:e.faceVertices.map(i)}:{}}}}function Tl(e,t,r,n,o){let i=d=>({measurement:e,points:[],status:d});if(e.modelId!==r||ga(e.tilesetUrl??"")!==ga(n??""))return i("model-changed");if(!t)return i("missing-object");let a=o??_a(t),l=[],c=new Map;for(let d of e.points){if(!d.anchor){l.push(d);continue}let p=d.anchor,m=a(p.nodeId);if(!(m instanceof uy))return i("missing-object");for(let h=m;h;h=h.parent)if(!h.visible)return i("hidden-object");if(py(m.geometry)!==p.geometrySignature)return i("geometry-changed");let s=c.get(m);if(s===void 0&&(s=my(m),c.set(m,s)),s!==p.poseSignature)return i("pose-changed");let f=fy(m,p.instanceId);if(!f)return i("geometry-changed");let u=h=>new Dl(...h).applyMatrix4(f).toArray();l.push({...d,position:u(p.localPosition),...p.localNormal?{normal:new Dl(...p.localNormal).applyNormalMatrix(new cy().getNormalMatrix(f)).toArray()}:{},...p.localFaceVertices?{faceVertices:p.localFaceVertices.map(u)}:{}})}return{measurement:e,points:l,status:e.approximate?"approximate":"ready"}}function _a(e){let t=new Map;return e.traverse(r=>{let n=jn(r);n&&t.set(n,t.has(n)?null:r)}),r=>t.get(r)??null}function SP(e){let t=new gy().setFromObject(e),r=new Fd;return t.getSize(r),{min:[t.min.x,t.min.y,t.min.z],max:[t.max.x,t.max.y,t.max.z],size:[r.x,r.y,r.z]}}function CP(e){let t=new gy().setFromObject(e);if(t.isEmpty())return null;let r=t.getCenter(new Fd),n=t.getSize(new Fd).length()/2;return!Number.isFinite(n)||n<=0?null:{center:[r.x,r.y,r.z],radius:n}}function by({canvasAreaRef:e,controlsRef:t,sceneRef:r,modelUrl:n,tilesetUrl:o,measurementModelId:i,savedMeasurements:a,measurementSettings:l,measurementUnit:c,onMeasurementsChange:d,onMeasurementSettingsChange:p,onCollectionChange:m,modelRotation:s,bindingTransformSignature:f,modelLoaded:u,enabled:h}){let[v,x]=Po(!1),[b,S]=xP(ay,El),[w,P]=Po("none"),[y,M]=Po(null),[_,C]=Po(!1),[E,R]=Po(null),[O,D]=Po(null),B=_l(!1),V=_l(0),G=_l(null),U=_l(null);B.current=v&&h;let T=tr(ie=>{ie.updateMatrixWorld(!0),R(SP(ie)),D(CP(ie))},[]),A=tr(()=>{S({type:"clear"}),M(null)},[]),Z=tr(ie=>{S({type:"tool",tool:ie}),M(null)},[]),ee=tr(()=>S({type:"undo"}),[]),Y=tr(()=>S({type:"finishArea"}),[]),Q=tr(()=>x(ie=>!ie),[]),te=tr(()=>C(ie=>!ie),[]),q=tr(ie=>{!B.current||ie.button!==0||(G.current={x:ie.clientX,y:ie.clientY})},[]),H=tr((ie,Ie)=>{let ze=e.current,ge=t.current?.camera,ke=r.current;if(!ze||!ge||!ke)return null;let Oe=ze.getBoundingClientRect();if(!Oe.width||!Oe.height)return null;ke.updateMatrixWorld(!0),ge.updateMatrixWorld(!0);let We=new Vd(ie-Oe.left,Ie-Oe.top),Lt=new wP;return Lt.setFromCamera(new Vd(We.x/Oe.width*2-1,1-We.y/Oe.height*2),ge),Lt.intersectObject(ke,!0).find(Bg)??null},[e,t,r]),N=tr((ie,Ie)=>{let ze=e.current,ge=t.current?.camera,ke=H(ie,Ie);if(!ke||!ze||!ge)return null;let Oe=ze.getBoundingClientRect(),We=new Vd(ie-Oe.left,Ie-Oe.top);return zd(jg(ke,ge,We,Oe,w),ke)},[e,t,H,w]),J=tr(()=>{U.current!==null&&cancelAnimationFrame(U.current),U.current=null,M(null)},[]),ne=tr(ie=>{if(!B.current||w==="none"||ie.buttons!==0||ie.target.closest("button, input, select, label, textarea, .ri-measureTools")){J();return}U.current!==null&&cancelAnimationFrame(U.current);let{clientX:Ie,clientY:ze}=ie;U.current=requestAnimationFrame(()=>{U.current=null;let ge=N(Ie,ze);M(ge?.snapped?ge:null)})},[J,N,w]),Ne=tr(ie=>{if(!B.current)return;let Ie=G.current;if(G.current=null,Ie&&Math.hypot(ie.clientX-Ie.x,ie.clientY-Ie.y)>6||ie.target.closest("button, input, select, label, textarea, .ri-measureTools"))return;if(b.tool==="wrap"||b.tool==="wrapHorizontal"){let ke=H(ie.clientX,ie.clientY);if(!ke)return;let Oe=b.tool==="wrapHorizontal"?Lg(ke):_g(ke);if("error"in Oe){S({type:"fail",error:Oe.error});return}let We=Oe.points.map((Lt,Bt)=>({id:V.current+Bt+1,...zd({position:Lt},ke)}));V.current+=We.length,S({type:"wrapResult",points:We});return}let ge=N(ie.clientX,ie.clientY);ge&&(V.current+=1,S({type:"place",point:{...ge,id:V.current}}))},[b.tool,N,H]);La(()=>{A(),R(null),D(null)},[n,A]),La(()=>{A()},[s[0],s[1],s[2],f,A]),La(()=>(J(),J),[J,v,w]),La(()=>{h||(x(!1),J())},[h,J]),La(()=>{let ie=r.current;!u||!ie||T(ie)},[f,u,T,r]);let[K,xe]=Po([]),Pe=b.points.length>0&&Hu(b.tool,b.points)!==null&&(b.tool!=="area"||b.areaClosed),ve=b.tool==="distance"&&b.points.length===2,mt=tr(ie=>{if(!Pe)return;if(b.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(b.points.some(ze=>!ze.anchor)){S({type:"fail",error:"This surface has no stable measurement anchor. Give the mesh a unique name and measure again."});return}if(a.length>=256){S({type:"fail",error:"A model can keep up to 256 named measurements."});return}let Ie={id:crypto.randomUUID(),name:ie.trim()||`Measurement ${a.length+1}`,modelId:i,...o?{tilesetUrl:o,approximate:!0}:{},tool:b.tool,points:structuredClone(b.points),createdAt:new Date().toISOString()};d([...a,Ie]),A()},[Pe,a,i,o,b,d,A]),ft=tr((ie,Ie)=>{try{if(!ve)throw new Error("Pick two distance points before calibrating.");let ze=Hu("distance",b.points).value;p(Ig(ze,ie,Ie,l)),S({type:"clearError"})}catch(ze){S({type:"fail",error:ze instanceof Error?ze.message:String(ze)})}},[ve,b.points,l,p]),xt={settings:l,items:a};return{saveMeasurement:mt,canSaveMeasurement:Pe,canCalibrate:ve,calibrate:ft,savedResults:K,setSavedResults:xe,exportMeasurementJson:()=>Vn(new Blob([Vg(xt)],{type:"application/json"}),"measurements.json"),exportMeasurementCsv:()=>{let ie=r.current?_a(r.current):void 0,Ie=a.map(ze=>{let ge=Tl(ze,r.current,i,o,ie);return tl(ze,l,c,ge.points,ge.status)});Vn(new Blob([Fg(xt,Ie,c)],{type:"text/csv;charset=utf-8"}),"measurements.csv")},importMeasurements:ie=>{try{m(zg(ie)),A()}catch(Ie){S({type:"fail",error:Ie instanceof Error?Ie.message:String(Ie)})}},measureMode:v,measureModeRef:B,measurePoints:b.points,measurementTool:b.tool,areaClosed:b.areaClosed,measurementError:b.error,selectMeasurementTool:Z,undoMeasurementPoint:ee,finishMeasureArea:Y,snapMode:w,setSnapMode:P,snapPreview:y,handleMeasurePointerMove:ne,clearSnapPreview:J,showDimensions:_,measureBox:E,modelBounds:O,refreshBounds:T,clearMeasurements:A,toggleMeasureMode:Q,toggleDimensions:te,handleMeasurePointerDown:q,handleMeasureClick:Ne}}import{createPortal as MP}from"react-dom";import{MapPin as PP}from"lucide-react";import{useCallback as ko,useEffect as Wn,useMemo as kP,useRef as RP,useState as Ir}from"react";function hy(e,t){let r=null,n=i=>{let a=i.mode==="immersive-ar"?i.session??null:null;a!==r&&(r&&t.endAR(),r=a,r&&t.startAR())},o=e.subscribe(n);return n(e.getState()),()=>{o(),r&&t.endAR("interrupted"),r=null}}import{Fragment as AP,jsx as Si,jsxs as Hd}from"react/jsx-runtime";var vy={canPlace:!1,isPlacementMode:!0,isModelPlaced:!1};function xy({enableXR:e,configuredHandoff:t=!1,usdzUrl:r,mobileHandoffUrl:n,engagement:o,animationControls:i}){let a=re(),l=RP(null),[c,d]=Ir(null),[p,m]=Ir(()=>e&&yy());Wn(()=>{if(!e||!yy()){d(null),m(!1);return}let N=!1;return m(!0),import("./xrRuntime-5S7KYUVB.mjs").then(J=>{if(N)return;let ne=null;try{ne=J.createXRStore({emulate:!1})}catch{ne=null}d(ne?{store:ne,runtime:J}:null),m(!1)},()=>{N||(d(null),m(!1))}),()=>{N=!0}},[e]);let s=c?.store??null,[f,u]=Ir(!1),[h,v]=Ir(e),[x,b]=Ir(!1),[S,w]=Ir(!0),[P,y]=Ir(null),[M,_]=Ir(!1),[C,E]=Ir(!1),[R,O]=Ir(vy),[D,B]=Ir(!1),V=kP(()=>e&&(t||!!r?.trim())&&ol(),[e,r,t]);Wn(()=>{w(mb())},[]);let G=ko(()=>{if(typeof window>"u")return null;try{let N=new URL(n?.trim()||window.location.href,window.location.href);return N.protocol==="http:"||N.protocol==="https:"?N.toString():null}catch{return null}},[n]);Wn(()=>{if(!e||S){y(null),_(!1);return}y(G())},[e,S,G]),Wn(()=>{if(s)return s.subscribe(N=>E(N.session!=null&&N.mode==="immersive-ar"))},[s]),Wn(()=>{if(s)return hy(s,o)},[s,o]),Wn(()=>{B(!1),O(vy)},[C]),Wn(()=>{if(!e||typeof navigator>"u"){v(!1);return}let N=navigator.xr;if(!N?.isSessionSupported){v(!1);return}let J=!1;return v(!0),N.isSessionSupported("immersive-ar").then(ne=>!J&&u(ne)).catch(()=>{}).finally(()=>{J||v(!1)}),N.isSessionSupported("immersive-vr").then(ne=>!J&&b(ne)).catch(()=>{}),()=>{J=!0}},[e]);let U=ko(()=>{let N=G();N&&(o.requestARLaunch("mobile-handoff"),y(N),_(!0))},[G,o]),T=ko(()=>_(!1),[]),A=ko(()=>{let N=r?.trim();if(!N)return;o.requestARLaunch("quick-look");let J=document.createElement("a");J.setAttribute("rel","ar"),J.href=N,J.style.display="none";let ne=document.createElement("img");ne.alt="",ne.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",J.appendChild(ne),document.body.appendChild(J),J.click(),J.remove()},[r,o]),Z=ko(N=>{O(N),N.isPlacementMode||B(!1)},[]),ee=ko(N=>{B(!1),N?l.current?.finishPlacementMode():l.current?.cancelPlacementMode()},[]),Y=ko(N=>{N.preventDefault(),B(!0),l.current?.startPlacementMode()},[]);Wn(()=>{if(!D)return;let N=()=>ee(!0),J=()=>ee(!1);return window.addEventListener("pointerup",N),window.addEventListener("pointercancel",J),()=>{window.removeEventListener("pointerup",N),window.removeEventListener("pointercancel",J)}},[ee,D]);let Q=R.isModelPlaced?R.isPlacementMode?R.canPlace?a("arReleaseToPlace"):a("arFindSurface"):null:R.canPlace?null:a("arFindSurface"),te=R.isModelPlaced&&!R.isPlacementMode?a("arGestureHint"):null,q=s?.getState().domOverlayRoot??null,H=C&&q?MP(Hd(AP,{children:[te&&Si("div",{className:"ri-arHintOverlay",children:Si("div",{className:"ri-arHint",children:te})}),Si("div",{className:"ri-arOverlay",children:Hd("div",{className:"ri-arControls",children:[i,Q&&Si("div",{className:"ri-arStatus",children:Q}),R.isModelPlaced&&Hd("button",{type:"button",className:`ri-arActionButton ${D?"ri-arActionButton--active":""}`,onPointerDown:N=>Y(N.nativeEvent),"aria-pressed":D,children:[Si(PP,{size:14}),a("arRelocate")]}),!R.isModelPlaced&&R.canPlace&&Si("button",{type:"button",className:"ri-arActionButton ri-arActionButton--primary",onClick:()=>l.current?.placeCurrent(),children:a("tapToPlace")})]})})]}),q):null;return{xrStore:s,xrRuntime:c?.runtime??null,xrResolving:p,inARSession:C,presenterRef:l,arSupported:f,checkingAR:h,vrSupported:x,quickLookSupported:V,resolvedMobileHandoffUrl:P,isMobileHandoffOpen:M,arOverlay:H,openMobileHandoff:U,closeMobileHandoff:T,openQuickLook:A,handleARStateChange:Z}}function yy(){if(typeof navigator>"u")return!1;let e=navigator.xr;return!!(e&&typeof e.isSessionSupported=="function"&&typeof e.addEventListener=="function")}import{useEffect as OP,useRef as Sy}from"react";import{useFrame as EP,useThree as DP}from"@react-three/fiber";var Ll=e=>typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null,Bl=class{constructor(){this.lastFrame=null;this.intervals=[]}frame(t,r){let n=this.lastFrame===null?0:t-this.lastFrame;n>0&&(r==="always"||n<=250)&&this.intervals.length<1e3&&this.intervals.push(n),this.lastFrame=t}sample(t,r,n){let i=r.renderMode!=="never"&&this.lastFrame!==null&&n-this.lastFrame<=250?this.intervals:[],a=i.length?i.reduce((c,d)=>c+d,0)/i.length:null;this.intervals=[];let l=t.info;return{sampledAt:new Date().toISOString(),...structuredClone(r),drawCalls:Ll(r.renderer==="webgpu"?l?.render?.drawCalls:l?.render?.calls),triangles:Ll(l?.render?.triangles),geometries:Ll(l?.memory?.geometries),textures:Ll(l?.memory?.textures),frameIntervalMs:a,fps:a?1e3/a:null,frameSamples:i.length}}};function wy(e=1e3){return Number.isFinite(e)?Math.min(1e4,Math.max(250,e)):1e3}function Cy(e){let t=DP(i=>i.get),r=Sy(e);r.current=e;let n=Sy(new Bl);EP(i=>n.current.frame(performance.now(),i.frameloop));let o=wy(e.intervalMs);return OP(()=>{let i=setInterval(()=>{let{gl:a,viewport:l,frameloop:c}=t(),d=r.current,p=n.current.sample(a,{renderer:zn(a)?"webgpu":"webgl",renderMode:c,quality:{profile:d.profile,reducedGpuLoad:d.reducedGpuLoad,dpr:a.getPixelRatio?.()??l.dpr,shadows:a.shadowMap?.enabled??d.shadows,postProcessing:d.postProcessing},streaming:d.streamingRef?.current??null},performance.now());d.onStats(p)},o);return()=>clearInterval(i)},[t,o]),null}import{Canvas as Fk,useThree as Gy}from"@react-three/fiber";import{ACESFilmicToneMapping as Hk,LinearToneMapping as Gk,NoToneMapping as $y,ReinhardToneMapping as Uk}from"three";import{Suspense as $k,useEffect as Wk,useMemo as Fl,useState as Xk}from"react";import{useThree as Na}from"@react-three/fiber";import{Autofocus as lk,Bloom as ck,BrightnessContrast as uk,ChromaticAberration as dk,ColorAverage as pk,DepthOfField as mk,DotScreen as fk,EffectComposer as gk,Glitch as bk,GodRays as hk,Grid as vk,HueSaturation as yk,Noise as xk,Outline as wk,Pixelation as Sk,Ramp as Ck,Scanline as Mk,SelectiveBloom as Pk,Sepia as kk,SMAA as Rk,SSAO as Ak,ToneMapping as Ok,Vignette as Ek}from"@react-three/postprocessing";import{BlendFunction as Mi,KernelSize as Dk}from"postprocessing";import{Color as Ia,Vector2 as Ba}from"three";import{memo as Tk,useCallback as _k,useEffect as Qd,useLayoutEffect as Lk,useMemo as Ao,useRef as Jd,useState as Fy}from"react";import{forwardRef as TP,useImperativeHandle as _P,useMemo as LP}from"react";import{BlendFunction as BP,Effect as jP}from"postprocessing";import{Uniform as NP}from"three";import{jsx as zP}from"react/jsx-runtime";var IP=`
|
|
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
|
+
`,Gd=class extends jP{constructor(t=1){super("ExposureEffect",IP,{blendFunction:BP.NORMAL,uniforms:new Map([["exposure",new NP(t)]])})}set exposure(t){this.uniforms.get("exposure").value=t}},My=TP(function({exposure:t},r){let n=LP(()=>new Gd(t),[]);return n.exposure=t,_P(r,()=>n,[n]),zP("primitive",{object:n,dispose:null})});import{useFrame as VP,useThree as jl}from"@react-three/fiber";import*as Ay from"@react-three/postprocessing";import{BlendFunction as FP}from"postprocessing";import{Color as HP,MathUtils as GP,Mesh as UP,Vector2 as Py,Vector3 as ky}from"three";import{useEffect as Ry,useMemo as Nl,useRef as Ud}from"react";import{jsx as WP}from"react/jsx-runtime";var $P=Ay.LensFlareEffect;function Oy({config:e}){let t=jl(s=>s.camera),r=jl(s=>s.raycaster),n=jl(s=>s.scene),o=jl(s=>s.viewport),i=Ud(null),a=Ud(new ky),l=Ud(new Py),c=Nl(()=>new ky(...e.lensPosition),[e.lensPosition]),d=Nl(()=>new HP(e.colorGain??"#141414"),[e.colorGain]),p=Nl(()=>new Py(0,0),[]),m=Nl(()=>new $P({blendFunction:FP.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:d,lensDirtTexture:null,haloScale:e.haloScale,secondaryGhosts:e.secondaryGhosts,aditionalStreaks:e.aditionalStreaks,ghostScale:e.ghostScale,opacity:e.opacity,starBurst:e.starBurst}),[d,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 Ry(()=>(i.current=m,()=>{m.dispose(),i.current=null}),[m]),Ry(()=>{let s=m.uniforms.get("screenRes");s&&(s.value.x=o.width,s.value.y=o.height)},[m,o]),VP((s,f)=>{let u=i.current;if(!u)return;let h=u.uniforms.get("lensPosition"),v=u.uniforms.get("opacity");if(!h||!v)return;let x=1;if(a.current.copy(c).project(t),a.current.z>1)return;h.value.x=a.current.x,h.value.y=a.current.y,l.current.x=a.current.x,l.current.y=a.current.y,r.setFromCamera(l.current,t);let b=r.intersectObjects(n.children,!0),{object:S}=b[0]||{};S&&(S.userData?.lensflare==="no-occlusion"?x=0:S instanceof UP&&(S.material.uniforms?._transmission?.value>.2||S.material._transmission&&S.material._transmission>.2?x=.2:S.material.transparent&&(x=S.material.opacity))),v.value=GP.damp(v.value,x,12,f)}),WP("primitive",{object:m,dispose:null})}import{useThree as Ly}from"@react-three/fiber";import{EffectPass as nk}from"postprocessing";import{useEffect as ok,useMemo as ik}from"react";import{BlendFunction as XP,Effect as qP,RenderPass as KP}from"postprocessing";import{Color as Ey,Mesh as _y,NearestFilter as Il,NoBlending as QP,ShaderMaterial as Dy,Uniform as Ro,Vector2 as JP,Vector3 as YP,WebGLRenderTarget as Ty}from"three";var ZP=`
|
|
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
|
+
}`,ek=`
|
|
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
|
+
}`,tk=`
|
|
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
|
+
}`,zl=class extends qP{constructor(r,n,o,i,a={}){super("SelectionOutlineEffect",tk,{blendFunction:XP.SCREEN,uniforms:new Map([["selectionMask",new Ro(null)],["visibleMask",new Ro(null)],["texelSize",new Ro(new JP)],["outlineColor",new Ro(new Ey(a.visibleEdgeColor??2278750))],["edgeStrength",new Ro(a.edgeStrength??3)]])});this.scene=r;this.camera=n;this.getObjects=o;this.layer=i;this.maskTarget=new Ty(1,1,{minFilter:Il,magFilter:Il});this.visibleTarget=new Ty(1,1,{minFilter:Il,magFilter:Il});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 Dy({name:"SelectionOutline.IDs",vertexShader:ZP,fragmentShader:ek,uniforms:{objectId:new Ro(new YP),onlySelected:new Ro(!1)},blending:QP,toneMapped:!1,clipping:!0}),this.maskPass=new KP(r,n,this.maskMaterial),this.maskPass.skipShadowMapUpdate=!0,this.maskPass.ignoreBackground=!0,this.maskPass.clearPass.overrideClearColor=new Ey(0),this.maskPass.clearPass.overrideClearAlpha=0}update(r){let n=rk(this.scene,this.getObjects()),o=[],i=this.camera.layers.mask;try{this.scene.traverseVisible(a=>{if(!(a instanceof _y))return;let l=n.get(a)??0,c=a.onBeforeRender;a.onBeforeRender=function(...d){c.apply(this,d);let p=d[4];p instanceof Dy&&p.uniforms.objectId&&(p.uniforms.objectId.value.set((l&255)/255,(l>>>8&255)/255,(l>>>16&255)/255),p.uniformsNeedUpdate=!0)},o.push(()=>{a.onBeforeRender=c})}),this.maskMaterial.uniforms.onlySelected.value=!1,this.maskPass.render(r,this.visibleTarget,null);for(let a of n.keys()){let l=a.layers.mask;a.layers.enable(this.layer),o.push(()=>{a.layers.mask=l})}this.camera.layers.set(this.layer),this.maskMaterial.uniforms.onlySelected.value=!0,this.maskPass.render(r,this.maskTarget,null)}finally{this.camera.layers.mask=i;for(let a of o)a()}}setSize(r,n){this.maskTarget.setSize(r,n),this.visibleTarget.setSize(r,n),this.uniforms.get("texelSize").value.set(1/r,1/n)}dispose(){this.maskPass.dispose(),this.maskMaterial.dispose(),this.maskTarget.dispose(),this.visibleTarget.dispose()}};function rk(e,t){let r=new Map(t.map((i,a)=>[i,a+1])),n=new Map,o=(i,a)=>{if(!i.visible)return;let l=r.get(i)??a;l&&i instanceof _y&&n.set(i,l);for(let c of i.children)o(c,l)};return o(e,0),n}import{jsx as ak}from"react/jsx-runtime";function By({objects:e,layer:t,options:r}){let n=Ly(a=>a.scene),o=Ly(a=>a.camera),i=ik(()=>new nk(o,new zl(n,o,()=>e.current,t,r)),[n,o,e,t,r]);return ok(()=>()=>i.dispose(),[i]),ak("primitive",{object:i,dispose:null})}function jy(e){let t=[e];for(;t.length>0;){let r=t.pop();if(r.visible){if(r.isMesh)return!0;t.push(...r.children)}}return!1}function Ny(e,t){let r=e.update,n=t,o=NaN,i=NaN;return e.update=function(...a){(o!==n.near||i!==n.far)&&(this.mainCamera=t,o=n.near,i=n.far),r.apply(this,a)},()=>{e.update=r}}import{RampType as $d}from"@react-three/postprocessing";import{GlitchMode as Wd,KernelSize as Ci,ToneMappingMode as Xd}from"postprocessing";import{Color as sk}from"three";function Iy(e){return e==="linear"?Xd.LINEAR:e==="reinhard"?Xd.REINHARD:Xd.ACES_FILMIC}function Vl(e){switch(e){case"verySmall":return Ci.VERY_SMALL;case"small":return Ci.SMALL;case"medium":return Ci.MEDIUM;case"large":return Ci.LARGE;case"veryLarge":return Ci.VERY_LARGE;case"huge":return Ci.HUGE}}function zy(e){switch(e){case"constantMild":return Wd.CONSTANT_MILD;case"constantWild":return Wd.CONSTANT_WILD;default:return Wd.SPORADIC}}function qd(e){let t=new sk(e);return[t.r,t.g,t.b,1]}function Vy(e){return e==="radial"?$d.Radial:e==="mirroredLinear"?$d.MirroredLinear:$d.Linear}import{Fragment as Vk,jsx as Ze,jsxs as Kd}from"react/jsx-runtime";var Oo={edgeStrength:1,pulseSpeed:0,visibleEdgeColor:new Ia(si.color).getHex(),hiddenEdgeColor:new Ia(si.color).multiplyScalar(.35).getHex(),kernelSize:Dk.VERY_SMALL,blur:!1,xRay:!1},Bk={edgeStrength:3};function jk(e){let t=[];return e.traverse(r=>{r.isMesh&&t.push(r)}),t}function Nk(e){if(e.isMesh)return[e];let t=[];return e.traverseVisible(r=>{r.isMesh&&t.push(r)}),t}var ja=[],Ik=Tk(function({sceneConfig:t,selectedObjectRef:r,selectedObjectOutlineColor:n,highlightOnHover:o=!1,disabled:i=!1,onOutlineEffect:a,hasMultiSelection:l,multiOutlineObjects:c}){let d=Na(R=>R.scene),p=Na(R=>R.gl),m=Jd(null),s=t?.postProcessing,f=r??null,u=s?.outline.enabled===!0,h=u||o,v=Ao(()=>new Ia(n??"#22c55e").getHex(),[n]),x=Ao(()=>({...Bk,blendFunction:Mi.SCREEN,visibleEdgeColor:v}),[v]),b=2;for(;b===s?.outline.selectionLayer||b===s?.selectiveBloom.selectionLayer;)b+=1;let[S,w]=Fy(()=>p.xr?.isPresenting??!1);Qd(()=>{let R=p.xr;if(!R)return;let O=()=>w(!0),D=()=>w(!1);return R.addEventListener("sessionstart",O),R.addEventListener("sessionend",D),w(R.isPresenting),()=>{R.removeEventListener("sessionstart",O),R.removeEventListener("sessionend",D)}},[p]);let P=d.children.filter(R=>R.isLight),y=Ao(()=>new Ba(s?.chromaticAberration.offsetX??.002,s?.chromaticAberration.offsetY??.002),[s?.chromaticAberration.offsetX,s?.chromaticAberration.offsetY]),M=Ao(()=>new Ia(s?.outline.visibleEdgeColor??"#ffffff").getHex(),[s?.outline.visibleEdgeColor]),_=Ao(()=>new Ia(s?.outline.hiddenEdgeColor??"#22090a").getHex(),[s?.outline.hiddenEdgeColor]),C=Ao(()=>qd(s?.ramp.startColor??"#000000"),[s?.ramp.startColor]),E=Ao(()=>qd(s?.ramp.endColor??"#ffffff"),[s?.ramp.endColor]);return!s||S||i?null:Kd(Vk,{children:[s.godRays.enabled===!0&&Kd("mesh",{ref:m,position:s.godRays.sunPosition,visible:!1,frustumCulled:!1,children:[Ze("sphereGeometry",{args:[.1,8,8]}),Ze("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),Kd(gk,{multisampling:0,enableNormalPass:s.ssao.enabled===!0,autoClear:!1,children:[s.smaa.enabled===!0&&Ze(Rk,{}),s.ssao.enabled===!0&&Ze(Ak,{samples:s.ssao.samples,rings:s.ssao.rings,intensity:s.ssao.intensity,radius:s.ssao.radius,bias:s.ssao.bias,luminanceInfluence:s.ssao.luminanceInfluence,fade:s.ssao.fade,minRadiusScale:s.ssao.minRadiusScale,worldDistanceThreshold:s.ssao.worldDistanceThreshold,worldDistanceFalloff:s.ssao.worldDistanceFalloff,worldProximityThreshold:s.ssao.worldProximityThreshold,worldProximityFalloff:s.ssao.worldProximityFalloff}),s.autofocus.enabled===!0&&Ze(lk,{focusDistance:s.autofocus.focusDistance,focusRange:s.autofocus.focusRange,focalLength:s.autofocus.focalLength,bokehScale:s.autofocus.bokehScale,target:s.autofocus.target,mouse:s.autofocus.mouse,debug:s.autofocus.debug||void 0,manual:s.autofocus.manual,smoothTime:s.autofocus.smoothTime}),s.autofocus.enabled!==!0&&s.depthOfField.enabled===!0&&Ze(mk,{focusDistance:s.depthOfField.focusDistance,focusRange:s.depthOfField.focusRange,focalLength:s.depthOfField.focalLength,bokehScale:s.depthOfField.bokehScale}),s.bloom.enabled===!0&&Ze(ck,{intensity:s.bloom.intensity,luminanceThreshold:s.bloom.luminanceThreshold,luminanceSmoothing:s.bloom.luminanceSmoothing,mipmapBlur:s.bloom.mipmapBlur,radius:s.bloom.radius,levels:s.bloom.levels}),s.selectiveBloom.enabled===!0&&Ze(Pk,{selection:f??void 0,lights:P,selectionLayer:s.selectiveBloom.selectionLayer,intensity:s.selectiveBloom.intensity,luminanceThreshold:s.selectiveBloom.luminanceThreshold,luminanceSmoothing:s.selectiveBloom.luminanceSmoothing,kernelSize:Vl(s.selectiveBloom.kernelSize),mipmapBlur:s.selectiveBloom.mipmapBlur,inverted:s.selectiveBloom.inverted,ignoreBackground:s.selectiveBloom.ignoreBackground}),h&&Ze(wk,{ref:a,selection:ja,selectionLayer:s.outline.selectionLayer,blendFunction:Mi.SCREEN,edgeStrength:u?s.outline.edgeStrength:Oo.edgeStrength,pulseSpeed:u?s.outline.pulseSpeed:Oo.pulseSpeed,visibleEdgeColor:u?M:Oo.visibleEdgeColor,hiddenEdgeColor:u?_:Oo.hiddenEdgeColor,kernelSize:u?Vl(s.outline.kernelSize):Oo.kernelSize,blur:u?s.outline.blur:Oo.blur,xRay:u?s.outline.xRay:Oo.xRay}),l&&Ze(By,{objects:c,layer:b,options:x}),s.chromaticAberration.enabled===!0&&Ze(dk,{offset:y,radialModulation:s.chromaticAberration.radialModulation,modulationOffset:s.chromaticAberration.modulationOffset}),s.colorAverage.enabled===!0&&Ze(pk,{}),s.dotScreen.enabled===!0&&Ze(fk,{angle:s.dotScreen.angle,scale:s.dotScreen.scale}),s.glitch.enabled===!0&&Ze(bk,{mode:zy(s.glitch.mode),delay:new Ba(s.glitch.delay[0],s.glitch.delay[1]),duration:new Ba(s.glitch.duration[0],s.glitch.duration[1]),strength:new Ba(s.glitch.strength[0],s.glitch.strength[1]),chromaticAberrationOffset:new Ba(s.glitch.chromaticAberrationOffset[0],s.glitch.chromaticAberrationOffset[1]),columns:s.glitch.columns,ratio:s.glitch.ratio,active:!0}),s.grid.enabled===!0&&Ze(vk,{scale:s.grid.scale,lineWidth:s.grid.lineWidth}),s.lensflare.enabled===!0&&Ze(Oy,{config:s.lensflare}),s.godRays.enabled===!0&&Ze(hk,{sun:m,samples:s.godRays.samples,density:s.godRays.density,decay:s.godRays.decay,weight:s.godRays.weight,exposure:s.godRays.exposure,clampMax:s.godRays.clampMax,blur:s.godRays.blur,kernelSize:Vl(s.godRays.kernelSize)}),s.noise.enabled===!0&&Ze(xk,{premultiply:s.noise.premultiply,opacity:s.noise.opacity,blendFunction:Mi.ADD}),s.brightnessContrast.enabled===!0&&Ze(uk,{brightness:s.brightnessContrast.brightness,contrast:s.brightnessContrast.contrast}),s.hueSaturation.enabled===!0&&Ze(yk,{hue:s.hueSaturation.hue,saturation:s.hueSaturation.saturation}),s.toneMapping.enabled===!0&&Ze(My,{exposure:s.toneMapping.exposure}),s.vignette.enabled===!0&&Ze(Ek,{eskil:s.vignette.eskil,offset:s.vignette.offset,darkness:s.vignette.darkness,blendFunction:Mi.NORMAL}),s.toneMapping.enabled===!0&&Ze(Ok,{mode:Iy(s.toneMapping.mode),resolution:s.toneMapping.resolution,whitePoint:s.toneMapping.whitePoint,middleGrey:s.toneMapping.middleGrey,minLuminance:s.toneMapping.minLuminance,averageLuminance:s.toneMapping.averageLuminance,adaptationRate:s.toneMapping.adaptationRate}),s.sepia.enabled===!0&&Ze(kk,{intensity:s.sepia.intensity,blendFunction:Mi.NORMAL}),s.scanline.enabled===!0&&Ze(Mk,{density:s.scanline.density,blendFunction:Mi.OVERLAY}),s.pixelation.enabled===!0&&Ze(Sk,{granularity:s.pixelation.granularity}),s.ramp.enabled===!0&&Ze(Ck,{rampType:Vy(s.ramp.rampType),rampStart:s.ramp.rampStart,rampEnd:s.ramp.rampEnd,startColor:C,endColor:E,opacity:s.ramp.rampMask?1:s.ramp.opacity??.5,rampBias:s.ramp.rampBias,rampGain:s.ramp.rampGain,rampMask:s.ramp.rampMask,rampInvert:s.ramp.rampInvert})]})]})});function zk(e,t){return e.length===t.length&&e.every((r,n)=>r===t[n])}function Hy({hoveredObjectRef:e,selectedObjectRefs:t,...r}){let n=Na(m=>m.scene),o=Na(m=>m.camera),i=Na(m=>m.invalidate),[a,l]=Fy(null),c=Jd(ja);c.current=t??ja;let d=_k(m=>l(m),[]);Lk(()=>{if(a)return Ny(a,o)},[a,o]);let p=Jd({effect:null,objects:ja});return Qd(()=>{if(!a)return;let s=r.sceneConfig?.postProcessing?.outline.enabled===!0?jk(n):e&&jy(e)?Nk(e):ja;p.current.effect===a&&zk(p.current.objects,s)||(p.current={effect:a,objects:s},a.selection.set(s),i())}),Qd(()=>{i()},[t,i]),Ze(Ik,{...r,onOutlineEffect:d,hasMultiSelection:c.current.length>0,multiOutlineObjects:c})}import{Fragment as Jk,jsx as Kt,jsxs as Uy}from"react/jsx-runtime";var qk=1.5;function Yd({runtimeStats:e,children:t,camera:r,backgroundColor:n,shadows:o=!0,sceneConfig:i,selectedObjectRef:a,selectedObjectRefs:l,selectedObjectOutlineColor:c,hoveredObjectRef:d,highlightOnHover:p,renderMode:m="demand",maxDpr:s=2,xrStore:f,xrRuntime:u,rendererCaptureRef:h,preserveDrawingBuffer:v=!1,reduceGpuLoad:x,suspended:b=!1,paused:S=!1,onRendererCreated:w,backend:P="webgl"}){let y=P==="webgpu",M=x??fb(),_=M?Math.min(s,qk):s,C=o&&!M,E=Fl(()=>{if(n)return{background:n};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 A=i.background.imageUrl.trim(),Z=qs(A)??A;return{backgroundImage:`url(${JSON.stringify(Z)})`,backgroundPosition:"center",backgroundRepeat:"no-repeat",backgroundSize:"cover"}}return{background:"linear-gradient(180deg, #3a3a3c 0%, #1c1c1d 100%)"}},[n,i]),R=Fl(()=>{if(n)return n;let A=i?.background;if(A?.enabled){if(A.type==="color")return A.color;if(A.type==="image"&&A.imageUrl.trim()||A.type==="environment")return null}return"#1c1c1d"},[n,i]),O=Fl(()=>{let A=i?.postProcessing;return A?!!(A.glitch.enabled||A.noise.enabled||A.lensflare.enabled&&A.lensflare.animated):!1},[i?.postProcessing]),[D,B]=Xk(!1),V=i?.environment,G=i?.groundShadows,U=Fl(()=>{if(!V)return null;if(V.source==="custom"){let A=V.customEnvironmentUrl.trim();return Og(A)?{files:A}:null}return{preset:V.preset}},[V]),T=Uy(Jk,{children:[Kt(kb,{captureRef:h}),e&&Kt(Cy,{...e,reducedGpuLoad:M,shadows:C,postProcessing:!M&&!y}),Kt(Rb,{}),Kt(Fb,{cameraConfig:r}),Kt(jb,{active:O}),Kt(Ib,{color:R}),U?Kt(xi,{onError:A=>console.warn("Failed to load environment map:",A),children:Uy($k,{fallback:null,children:[Kt(Bb,{...U,environmentIntensity:V?.intensity??.25,backgroundIntensity:V?.intensity??.25,background:i?.background.enabled===!0&&i.background.type==="environment"}),Kt(zb,{})]})}):null,Kt(Vb,{rotation:V?.rotation??0}),f&&u&&Kt(u.XRPerformanceManager,{onPresentingChange:B}),G?.enabled&&G.mode==="shadowCatcher"&&!D&&!y&&Kt(Nb,{position:[0,G.height,0],scale:G.size,opacity:G.intensity,blur:G.borderFade,far:15,resolution:1024,color:"#000000"}),t,Kt(Hy,{sceneConfig:i,selectedObjectRef:a,selectedObjectRefs:l,selectedObjectOutlineColor:c,hoveredObjectRef:d,highlightOnHover:p,disabled:M||y}),y?Kt(Qk,{toneMapping:i?.postProcessing.toneMapping}):null]});return Kt(Fk,{frameloop:b||S&&!D?"never":m,onCreated:({gl:A})=>w?.(A),dpr:[1,_],shadows:C?"percentage":!1,resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:E,camera:r??{fov:50},gl:y?Mb:{preserveDrawingBuffer:v,toneMapping:$y,toneMappingExposure:1},flat:y||void 0,children:f&&u&&!y?Kt(u.XRScene,{store:f,renderMode:m,suspended:b,children:T}):T})}var Kk={linear:Gk,reinhard:Uk,aces:Hk};function Qk({toneMapping:e}){let t=Gy(a=>a.gl),r=Gy(a=>a.invalidate),n=e?.enabled===!0,o=e?.mode??"aces",i=e?.exposure??1;return Wk(()=>{t.toneMapping=n?Kk[o]:$y,t.toneMappingExposure=n?i:1,r()},[t,r,n,o,i]),null}import{useThree as Yk}from"@react-three/fiber";import{CameraControls as Zk,PointerLockControls as eR}from"@react-three/drei";import{Box3 as tR,Vector3 as Wy}from"three";import{useEffect as Xn,useRef as rR}from"react";import{Fragment as nR,jsx as Zd,jsxs as oR}from"react/jsx-runtime";function ep({controlsRef:e,onCameraChange:t,cameraLimits:r,controllerType:n="orbit",onPointerLockExit:o,reducedMotion:i=!1,zoom:a=!0,pageScroll:l=!1}){let c=n==="orbit",d=Yk(m=>m.frameloop);Xn(()=>{if(!e||typeof e!="object")return;let m=e.current;m&&Iu(m,c?d==="never"?"paused":"active":"disconnected")},[e,d,c]),Xn(()=>{let m=e&&typeof e=="object"?e.current:null;return()=>{m&&Iu(m,"disconnected")}},[e,c]);let p=rR(null);return Xn(()=>{if(!c)return p.current?.lock(),()=>{p.current?.unlock()}},[c]),Xn(()=>{c&&document.pointerLockElement&&document.exitPointerLock()},[c]),Xn(()=>{if(c)return;let m=()=>{document.pointerLockElement||o?.()};return document.addEventListener("pointerlockchange",m),()=>{document.removeEventListener("pointerlockchange",m)}},[c,o]),Xn(()=>{if(!c||!e||typeof e!="object"||!("current"in e))return;let m=e.current;m&&pg(m,i)},[c,e,i]),Xn(()=>{if(!c||!t||!e||typeof e!="object"||!("current"in e))return;let m=e.current;if(!m)return;let s=()=>{t(m.camera,m)};return m.addEventListener("update",s),()=>{m.removeEventListener("update",s)}},[c,e,t]),Xn(()=>{if(!c||!e||typeof e!="object"||!("current"in e))return;let m=e.current;if(!m)return;let s=Hb(r);m.minDistance=s.minDistance,m.maxDistance=s.maxDistance,m.minPolarAngle=s.minPolarAngle,m.maxPolarAngle=s.maxPolarAngle,m.minAzimuthAngle=s.minAzimuthAngle,m.maxAzimuthAngle=s.maxAzimuthAngle,m.boundaryEnclosesCamera=s.boundaryEnclosesCamera,m.boundaryFriction=s.boundaryFriction,m.setBoundary(s.panBoundary?new tR(new Wy(...s.panBoundary[0]),new Wy(...s.panBoundary[1])):void 0)},[c,e,r?.minDistance,r?.maxDistance,r?.minPolarAngle,r?.maxPolarAngle,r?.minAzimuthAngle,r?.maxAzimuthAngle,r?.boundaryEnclosesCamera,r?.boundaryFriction,r?.panBoundary]),c?oR(nR,{children:[Zd(Zk,{ref:e,makeDefault:!0,smoothTime:i?0:.3,dollyToCursor:!0}),Zd(Gb,{controlsRef:e,zoom:a,pageScroll:l})]}):Zd(eR,{ref:p,makeDefault:!0,selector:"[data-ri-pointer-lock-trigger]"})}import{useRef as Gl,useMemo as Va,useEffect as iR}from"react";import{useFrame as Ky,useThree as Qy}from"@react-three/fiber";import{Vector3 as aR}from"three";var za=new WeakMap;function Xy(e,t,r){let n=za.get(e);n||(n=new Map,za.set(e,n)),n.set(t,r)}function Hl(e,t){let r=za.get(e);r?.delete(t),r?.size===0&&za.delete(e)}function qy(e,t){return za.get(e)?.get(t)??null}import{Fragment as cR,jsx as Do,jsxs as uR}from"react/jsx-runtime";function Eo(e,t){if(!t)return e;let r=t*Math.PI/180,n=Math.cos(r),o=Math.sin(r);return[e[0]*n+e[2]*o,e[1],-e[0]*o+e[2]*n]}function Jy(e,t,r=[0,0,0]){let[n,o,i]=e.center,a=e.radius,l=[t[0]-r[0],t[1]-r[1],t[2]-r[2]],c=Math.hypot(l[0],l[1],l[2]),d=c>1e-6?[l[0]/c,l[1]/c,l[2]/c]:[0,1,0],p=a*2;return{position:[n+d[0]*p,o+d[1]*p,i+d[2]*p],target:e.center,extent:a,near:Math.max(a/100,.001),far:p+a*2}}function Yy(e,t){let r=t[0]-e.center[0],n=t[1]-e.center[1],o=t[2]-e.center[2],i=Math.hypot(r,n,o);return{near:Math.max(i-e.radius,i*.01,.001),far:i+e.radius*2}}function Zy(e,t){if(!e)return;let r=e.shadow.camera,n=t?.near??.5,o=t?.far??40;r.near=n,r.far=o,r.updateProjectionMatrix()}function Fa(e,t,r){return t&&r&&!e.attachedToCamera?r.center:[0,0,0]}var sR={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:[6,12,6],attachedToCamera:!1,castShadow:!0,shadowBias:-5e-4,visible:!0},{id:"light-fill",type:"directional",color:"#ffffff",intensity:0,position:[-6,8,-6],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0}]},lR={enabled:!0,mapSize:2048,bias:-5e-4,normalBias:.02,radius:3};function ex({light:e,shadows:t,shadowsEnabled:r,environmentRotation:n,modelBounds:o,objectBindings:i,nodeRefs:a}){let l=Gl(null),c=Gl(null),d=Gl(null),p=Qy(S=>S.camera),m=Qy(S=>S.scene),s=Va(()=>new aR,[]),f=Va(()=>e.attachedToCamera||e.attachment?e.position:Eo(e.position,n),[e.position,e.attachedToCamera,e.attachment,n]);Ky(()=>{let S=l.current??c.current??d.current;if(!S)return;if(e.attachedToCamera){S.position.copy(p.position);return}let w=e.attachment;if(!w)return;let P=i?Hs(i,w.objectId):null,M=(P?i?.[P]:void 0)?.modelObjectId??w.objectId,_=(P?a?.current[P]:void 0)??Nn(m,M);_&&(s.fromArray(w.offset),_.localToWorld(s),S.position.copy(s))});let u=r&&t.enabled&&e.castShadow,h=Va(()=>(e.type==="spot"||e.type==="directional")&&e.target&&!e.attachedToCamera?e.attachment?e.target:Eo(e.target,n):null,[e.type,e.target,e.attachedToCamera,e.attachment,n]),v=Va(()=>e.type==="directional"&&u&&o&&!e.attachedToCamera?Jy(o,f,h??void 0):null,[e.type,e.attachedToCamera,u,o,f,h]),x=Va(()=>e.type==="spot"&&u&&o&&!e.attachedToCamera?Yy(o,f):null,[e.type,e.attachedToCamera,u,o,f]);iR(()=>{let S=l.current??d.current;if(!S)return;let[w,P,y]=h&&!(e.type==="directional"&&v)?h:v?.target??Fa(e,u,o);S.target.position.set(w,P,y),S.target.updateMatrixWorld()},[e,u,o,h,v]);let b=Gl(!1);return Ky(()=>{let S=l.current??c.current??d.current;if(!S||e.attachedToCamera||e.attachment)return;let w=l.current??d.current,P=qy(m,e.id);if(!P){if(!b.current)return;if(b.current=!1,S.position.fromArray(v?.position??f),Zy(d.current,x),w){let[C,E,R]=h&&!(e.type==="directional"&&v)?h:v?.target??Fa(e,u,o);w.target.position.set(C,E,R),w.target.updateMatrixWorld()}return}b.current=!0;let y=Eo(P.position,n),M=P.target?Eo(P.target,n):h??Fa(e,u,o),_=e.type==="directional"&&u&&o?Jy(o,y,M):null;S.position.fromArray(_?.position??y),Zy(d.current,u&&o?Yy(o,y):null),w&&(w.target.position.fromArray(_?.target??M),w.target.updateMatrixWorld())}),!e.visible||e.type==="none"?null:e.type==="directional"?Do("directionalLight",{ref:l,color:e.color,intensity:e.intensity,position:v?.position??f,castShadow:u,"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":v?.near??.5,"shadow-camera-far":v?.far??40,"shadow-camera-left":-(v?.extent??8),"shadow-camera-right":v?.extent??8,"shadow-camera-top":v?.extent??8,"shadow-camera-bottom":-(v?.extent??8)}):e.type==="point"?Do("pointLight",{ref:c,color:e.color,intensity:e.intensity,position:f,distance:e.distance,decay:e.decay,castShadow:u,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias}):e.type==="spot"?Do("spotLight",{ref:d,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:u,"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"?Do("hemisphereLight",{color:e.color,groundColor:"#444444",intensity:e.intensity}):null}function tp({lightingConfig:e,shadowConfig:t,shadowsEnabled:r=!0,environmentRotation:n=0,environmentConfig:o,modelBounds:i,objectBindings:a,nodeRefs:l}){let c=e??sR,d=t??lR,p=o?.shadowLight,m=Eo([5,10,5],n);return uR(cR,{children:[Do("ambientLight",{intensity:c.ambient.intensity,color:c.ambient.color}),c.lights.map(s=>Do(ex,{light:s,shadows:d,shadowsEnabled:r,environmentRotation:n,modelBounds:i,objectBindings:a,nodeRefs:l},s.id)),p?.enabled&&Do(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:d,shadowsEnabled:r,environmentRotation:0,modelBounds:i,objectBindings:a,nodeRefs:l})]})}import{useState as np,useEffect as Ue,useRef as Dt,useMemo as yt,useCallback as pR,Suspense as mR}from"react";import{useFrame as Ul,useThree as ox}from"@react-three/fiber";import{useCallback as dR,useEffect as tx,useRef as rp,useState as rx}from"react";function nx(e,t,r){let[n,o]=rx({}),i=rp(new Map),[a,l]=rx(0),c=rp(t);c.current=t;let d=rp(r);d.current=r;let p=dR((m,s)=>{c.current?.some(f=>f.url===m)&&o(f=>f[m]===s?f:{...f,[m]:s})},[]);return tx(()=>{let m=new Set(t?.map(f=>f.url)),s=!1;for(let[f,u]of i.current)m.has(f)&&n[f]===u&&u.parent===e||(u.removeFromParent(),i.current.delete(f),s=!0);for(let[f,u]of Object.entries(n))!m.has(f)||i.current.get(f)===u||(e.add(u),i.current.set(f,u),s=!0,d.current?.(f,u));o(f=>{let u=Object.entries(f).filter(([h])=>m.has(h));return u.length===Object.keys(f).length?f:Object.fromEntries(u)}),s&&l(f=>f+1)},[e,t,n]),tx(()=>()=>{i.current.forEach(m=>m.removeFromParent()),i.current.clear()},[]),{rootsByUrl:n,revision:a,onSourceReady:p}}import{Color as fR,MeshStandardMaterial as gR,MeshBasicMaterial as op,MeshNormalMaterial as bR,MeshMatcapMaterial as hR,DoubleSide as vR,NormalBlending as yR,Box3 as $l,Vector3 as To,Matrix4 as xR,MathUtils as Wl}from"three";import{SkeletonUtils as ix}from"three-stdlib";import{jsx as ql,jsxs as CR}from"react/jsx-runtime";function Xl(e,t,r){let n=r.get(e);n&&(t?.rotation?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2],n.rotation.order):e.rotation.copy(n.rotation),t?.scale?e.scale.fromArray(t.scale):e.scale.copy(n.scale),e.position.fromArray($b(t?.position??n.position.toArray(),[e.rotation.x,e.rotation.y,e.rotation.z],e.scale.toArray(),t?.pivot,n.rotation.order,t?.shear)),Xs(e,t?.shear))}function Et(e,t=!1){if(!e||typeof e!="object")return"-";let r=e;return[r.channel??0,t?r.format??"":"",r.isVideoTexture?r.colorSpace??"":""].join(":")}function Pi(e){let t=e,r=Number(t.clearcoat)>0,n=Number(t.sheen)>0,o=Number(t.anisotropy)>0,i=Number(t.transmission)>0,a=t.transparent===!1&&t.blending===yR&&t.alphaToCoverage!==!0;return[Et(t.map),Et(t.aoMap),Et(t.lightMap),Et(t.bumpMap),Et(t.normalMap,!0),t.normalMap?t.normalMapType:"",Et(t.displacementMap),Et(t.emissiveMap),Et(t.metalnessMap),Et(t.roughnessMap),o,Et(o?t.anisotropyMap:null),r,Et(r?t.clearcoatMap:null),Et(r?t.clearcoatNormalMap:null,!0),Et(r?t.clearcoatRoughnessMap:null),n,Et(n?t.sheenColorMap:null),Et(n?t.sheenRoughnessMap:null),Et(t.specularColorMap),Et(t.specularIntensityMap),i,Et(i?t.transmissionMap:null),Et(i?t.thicknessMap:null),Et(t.alphaMap),Number(t.alphaTest)>0,!!t.alphaHash,!!t.flatShading,!!t.dithering,!!t.vertexColors,t.side,a].join("|")}var wR={};function Ha({url:e,objectBindings:t,selectedItem:r,itemMaterials:n,interactive:o=!0,onItemClick:i,onItemHover:a,onItemDoubleClick:l,onItemContextMenu:c,onModelLoaded:d,onAnimationsReady:p,nodeRefsOut:m,onNodeRefsChange:s,materialRefsOut:f,panelHoveredItem:u,sceneConfig:h,zoomOnSelected:v=!0,highlightOnHover:x=!0,decoderConfig:b,modelFormat:S,onLoadProgress:w,explodeFactor:P=0,suspendBindingTransforms:y=!1,originalNodePoses:M,mergeModels:_,onMergeModelLoaded:C,onMergeModelError:E,pulses:R=wR}){let O=ya(e,b,S,w),D=ox(L=>L.invalidate),[B,V]=np(null),G=Dt(null),{setCanvasCursor:U,restoreCanvasCursor:T}=Jb();Ue(()=>{(!o||!x)&&(V(null),a?.(null),T())},[o,x,a,T]);let A=yt(()=>{let L=ix.clone(O.scene),j=va(O.scene);return j&&bb(L,j),ed(L),L},[O.scene]),{rootsByUrl:Z,revision:ee,onSourceReady:Y}=nx(A,_,C),Q=Dt(new Map),[te,q]=np(0),H=pR((L,j,I)=>{Y(L,j),Q.current.get(L)!==I&&(Q.current.set(L,I),q(F=>F+1))},[Y]);Ue(()=>{let L=new Set(_?.map(I=>I.url)),j=!1;for(let I of Q.current.keys())L.has(I)||(Q.current.delete(I),j=!0);j&&q(I=>I+1)},[_]);let N=yt(()=>Bn(A),[A,ee]),J=N.nodesById,{originalMaterials:ne,ownMeshes:Ne}=yt(()=>{let L=new WeakMap,j=new WeakSet;return A.traverse(I=>{sr(I)&&(L.set(I,I.material),j.add(I))}),{originalMaterials:L,ownMeshes:j}},[A]);yt(()=>{A.traverse(L=>{sr(L)&&!ne.has(L)&&ne.set(L,L.material)})},[A,ee,ne]);let K=O.materialVariants,Pe=(h?sn(h.model):[]).join(`
|
|
63
|
+
`),[ve,mt]=np(null);Ue(()=>{let L=Pe?Pe.split(`
|
|
64
|
+
`):[],j=[];for(let F of L){let ae=K?K.names.indexOf(F):-1;if(ae>=0){j.push(ae);continue}console.warn(`[react-immersive] The model has no material variant "${F}".`+(K?` Its variants are: ${K.names.join(", ")}.`:" It has no material variants."))}if(!K||j.length===0){mt(null);return}let I=!1,W=[];return A.traverse(F=>{if(!sr(F)||!Ne.has(F))return;let ae=Gg(Hg(F),j);ae!==null&&W.push(K.resolveMaterial(ae,F).then(ce=>[F,ce]))}),Promise.all(W).then(F=>{I||mt({scene:A,key:Pe,materials:new Map(F)})}).catch(F=>{I||console.warn(`[react-immersive] Material variants "${L.join('", "')}" failed to load.`,F)}),()=>{I=!0}},[A,Ne,K,Pe]);let ft=ve?.scene===A?ve.materials:void 0,xt=L=>ft?.get(L)??ne.get(L)??Qb(L);Ue(()=>{N.duplicateNames.size!==0&&console.warn("[react-immersive] Duplicate model node names were assigned unique binding IDs.",Object.fromEntries(N.duplicateNames))},[N]);let oe=yt(()=>new WeakMap,[A]),Ae=yt(()=>{let L=new WeakMap;if(A.traverse(j=>{let I=oe.get(j);I||(I={position:j.position.clone(),rotation:j.rotation.clone(),scale:j.scale.clone()},oe.set(j,I)),L.set(j,{position:I.position.clone(),rotation:I.rotation.clone(),scale:I.scale.clone()})}),M)for(let[j,I]of Object.entries(M)){let W=J[j],F=W&&L.get(W);F&&(F.position.fromArray(I.position),I.rotation&&F.rotation.set(I.rotation[0],I.rotation[1],I.rotation[2],F.rotation.order),I.scale&&F.scale.fromArray(I.scale))}return L},[A,J,M,oe]);Ue(()=>{let L=!1,j=null,I=null,W=window,F=Object.entries(J).filter(([,je])=>sr(je)),ae=new $l,ce=[],it=0;A.traverse(je=>{!sr(je)||je.userData[Mo]||(je.castShadow=!1,je.receiveShadow=!0)});let Xe=()=>{if(L)return;let je=new Set,Ft=ae.getSize(new To),we=new To;for(let{name:Rt,box:Yt}of ce)Yt.getSize(we),we.x>Ft.x*.7&&we.z>Ft.z*.7&&we.y>Ft.y*.4&&je.add(Rt);A.traverse(Rt=>{if(!sr(Rt)||Rt.userData[Mo])return;let Yt=jn(Rt);Rt.castShadow=!Yt||!je.has(Yt),Rt.receiveShadow=!0}),D()},St=()=>{L||(W.requestIdleCallback?j=W.requestIdleCallback(qe,{timeout:100}):I=window.setTimeout(()=>qe(),0))},qe=je=>{if(j=null,I=null,L)return;let Ft=performance.now(),we=0;for(;it<F.length&&!(we>0&&!(je?je.didTimeout?we<16:je.timeRemaining()>1:performance.now()-Ft<8));){let[Rt,Yt]=F[it];it+=1,we+=1;let $t=new $l().setFromObject(Yt);$t.isEmpty()||(ce.push({name:Rt,box:$t}),ae.union($t))}it<F.length?St():Xe()};return St(),()=>{L=!0,j!==null&&W.cancelIdleCallback?.(j),I!==null&&window.clearTimeout(I)}},[D,J,A]),Ue(()=>{ll(A,{precise:!0})},[A,ee]),Ue(()=>{let L=new AbortController;return wb(A,L.signal),()=>{L.abort(),Sb(A)}},[A,ee]);let $e=yt(()=>{let L={};for(let[j,I]of Object.entries(t))L[I.modelObjectId??j]=j;return L},[t]),ie=yt(()=>Object.entries(t).map(([L,j])=>`${L}${j.modelObjectId??L}`).sort().join(""),[t]),Ie=yt(()=>Object.entries(t).map(([L,j])=>JSON.stringify([L,j.modelObjectId??L,j.transform??null])).sort().join(""),[t]),ze=Dt(new Map);Ue(()=>{let L=new Map,j=new Map;for(let[F,ae]of Object.entries(t)){if(!ae.transform)continue;let ce=J[ae.modelObjectId??F];ce&&(L.set(ce,ae.transform),j.set(ce,In(ce)))}let I=new Set([...ze.current.keys(),...L.keys()]);for(let F of I){Xl(F,void 0,Ae);for(let ae of In(F))an(ae)}A.updateMatrixWorld(!0);let W=new Map;for(let F of j.values())for(let ae of F)if(!W.has(ae)){let ce=[];for(let it=ae;it;it=it.parent)ce.unshift(it.matrix.clone());W.set(ae,{world:ae.matrixWorld.clone(),transforms:ce})}for(let[F,ae]of L)Xl(F,ae,Ae);ze.current=L,A.updateMatrixWorld(!0);for(let[F,ae]of W)ai(F,ae.world,ae.transforms);D()},[A,J,Ae,Ie,D]),Ue(()=>()=>{for(let L of In(A))an(L)},[A]);let ge=yt(()=>{let L={};for(let[j,I]of Object.entries(t)){let W=I.modelObjectId??j,F=J[W];if(!sr(F))continue;let ae=xt(F);ae&&(L[j]=xa(ae,ce=>{let it=Wb(ce),Xe=Xb(it??new gR);return qb(Xe),Xe}))}return L},[J,ie,ne,ft]);Ue(()=>(f&&(f.current=ge),()=>{f?.current===ge&&(f.current={})}),[ge,f]),Ue(()=>()=>{for(let L of Object.values(ge))ln(L,j=>{kg(j.userData),j.dispose()})},[ge]);let ke=h?.model.shading??"lit",Oe=h?.model.renderer??"pbr",We=h?.wireframe.enabled??!1,Lt=h?.wireframe.color??"#93c5fd",Bt=h?.wireframe.opacity??1,yr=yt(()=>{let L={};if(ke!=="unlit")return L;for(let[j,I]of Object.entries(ge))L[j]=xa(I,W=>{let F=new op;return F.color.copy(W.color),F.map=W.map,F.alphaMap=W.alphaMap,F.alphaTest=W.alphaTest,F.transparent=W.transparent,F.opacity=W.opacity,F.side=W.side,F});return L},[ge,ke]),dr=yt(()=>{let L={};if(ke!=="normals")return L;for(let[j,I]of Object.entries(ge))L[j]=xa(I,()=>new bR);return L},[ge,ke]),xr=yt(()=>{let L={};if(ke!=="lit"||Oe!=="matcap")return L;let j=Rg();for(let[I,W]of Object.entries(ge))L[I]=xa(W,F=>{let ae=new hR;return ae.matcap=j,ae.color.copy(F.color),ae.alphaMap=F.alphaMap,ae.alphaTest=F.alphaTest,ae.side=F.side,ae});return L},[ge,ke,Oe]);Ue(()=>()=>{for(let L of Object.values(yr))ln(L,j=>j.dispose());for(let L of Object.values(dr))ln(L,j=>j.dispose());for(let L of Object.values(xr))ln(L,j=>j.dispose())},[yr,dr,xr]);let Or=L=>ke==="normals"?dr[L]:ke==="unlit"?yr[L]:Oe==="matcap"?xr[L]:ge[L],kt=Dt(d);kt.current=d,Ue(()=>{kt.current?.(A)},[A]);let ye=yt(()=>{let L={};for(let[j,I]of Object.entries(t)){let W=I.modelObjectId??j,F=J[W];F&&(L[j]=F)}return L},[J,ie]);Ue(()=>(m.current=ye,s?.(),()=>{m.current===ye&&(m.current={})}),[ye,m,s]);let Se=Dt({});Ue(()=>()=>{for(let L of Object.values(Se.current))for(let[j,I]of Object.entries(L))I&&li(I,ci(j));Se.current={}},[]);let Ve=Dt(new Map);Ue(()=>()=>{Ve.current.clear()},[]);let _e=yt(()=>{let L=new Map;for(let[j,I]of Object.entries(t)){let W=u===I||u?.id===I.id||u?.modelObjectId===I.modelObjectId,F=x&&(B===j||W),ae=F||r===j;(F||ae)&&L.set(j,{emissive:F,matcap:ae})}return L},[t,x,B,r,u]),Qe=Dt(_e);Qe.current=_e,Ue(()=>{let L=new Set;for(let[j,I]of Object.entries(t)){L.add(j);let W=I.modelObjectId??j,F=J[W];if(!F)continue;if(I.removed){F.parent&&(Ve.current.set(F,F.parent),F.parent.remove(F),A.dispatchEvent({type:"childremoved",child:F}));continue}let ae=Ve.current.get(F);if(ae&&(F.parent||(ae.add(F),A.dispatchEvent({type:"childadded",child:F})),Ve.current.delete(F)),F.visible=I.visible!==!1,!sr(F))continue;let ce=ge[j];if(!ce)continue;if(Oe!=="uv-checker"){let we=Or(j);we&&(F.material=we)}if(I.visible===!1)continue;let it=yr[j],Xe=xr[j],St=n[j]??n[I.modelObjectId??j],qe=I.style?.material,je=Se.current[j]??{};for(let we of ha){let Rt=lb(qe,we),Yt=je[we];if(Yt===Rt)continue;let $t=ci(we);Yt&&li(Yt,$t),Rt?(Ks(Rt,$t,D),je[we]=Rt):delete je[we]}Object.keys(je).length>0?Se.current[j]=je:delete Se.current[j];let Ft=St?.hex??qe?.baseColor;ln(ce,(we,Rt)=>{let Yt=Pi(we);Kb(we,qe,Ft);let $t=we.userData.reactImmersiveConfiguredEmissive;$t?.isColor?$t.copy(we.emissive):we.userData.reactImmersiveConfiguredEmissive=we.emissive.clone();let Fi=Qe.current.get(j);Fi?.emissive&&we.emissive.add(ma),Yt!==Pi(we)&&(we.needsUpdate=!0);let or=sl(it,Rt);if(or){let Go=Pi(or);or.color.copy(we.color),or.map=we.map,or.vertexColors=we.vertexColors,or.alphaMap=we.alphaMap,or.alphaTest=we.alphaTest,or.transparent=we.transparent,or.opacity=we.opacity,or.side=we.side,Go!==Pi(or)&&(or.needsUpdate=!0)}let Wt=sl(Xe,Rt);if(Wt){let Go=Pi(Wt);Fi?.matcap?Wt.color.set(si.color):Wt.color.copy(we.color),Wt.map=we.map,Wt.vertexColors=we.vertexColors,Wt.alphaMap=we.alphaMap,Wt.alphaTest=we.alphaTest,Wt.transparent=we.transparent,Wt.opacity=we.opacity,Wt.side=we.side,Go!==Pi(Wt)&&(Wt.needsUpdate=!0)}})}for(let j of Object.keys(Se.current))if(!L.has(j)){for(let[I,W]of Object.entries(Se.current[j]))W&&li(W,ci(I));delete Se.current[j]}D()},[t,J,ge,yr,dr,xr,n,ke,Oe,D]);let wt=Dt(new Map);Ue(()=>{let L=wt.current,j=new Set([...L.keys(),..._e.keys()]),I=!1;for(let W of j){let F=L.get(W),ae=_e.get(W),ce=!!F?.emissive!=!!ae?.emissive,it=!!F?.matcap!=!!ae?.matcap;if(!ce&&!it)continue;I=!0;let Xe=ge[W],St=xr[W];Xe&&ln(Xe,(qe,je)=>{let Ft=qe.userData.reactImmersiveConfiguredEmissive;ce&&Ft?.isColor&&(qe.emissive.copy(Ft),ae?.emissive&&qe.emissive.add(ma));let we=sl(St,je);it&&we&&(ae?.matcap?we.color.set(si.color):we.color.copy(qe.color))})}wt.current=_e,I&&D()},[_e,ge,xr,D]),Kv({objectBindings:t,nodeMap:J,invalidate:D});let Gt=yt(()=>Object.entries(R).map(([L,j])=>({key:L,color:new fR(j.color),speed:j.speed})),[R]),jt=Dt(new Set);Ue(()=>{let L=new Set(Gt.map(({key:j})=>j));for(let j of jt.current){if(L.has(j)||!ge[j])continue;let I=Qe.current.get(j)?.emissive;ln(ge[j],W=>{let F=W.userData.reactImmersiveConfiguredEmissive;F?.isColor&&(W.emissive.copy(F),I&&W.emissive.add(ma))})}jt.current=L,D()},[Gt,ge,D]),Ul(({clock:L})=>{if(Gt.length===0)return;let j=L.getElapsedTime();for(let{key:I,color:W,speed:F}of Gt){let ae=ge[I];if(!ae)continue;let ce=(1-Math.cos(2*Math.PI*F*j))/2,it=Qe.current.get(I)?.emissive;ln(ae,Xe=>{let St=Xe.userData.reactImmersiveConfiguredEmissive;St?.isColor&&(Xe.emissive.copy(St).lerp(W,ce),it&&Xe.emissive.add(ma))})}D()}),Ue(()=>{if(Oe==="uv-checker")return;let L=new Set(Object.values(ye)),j=!1;A.traverse(I=>{if(!sr(I)||L.has(I)||!ne.has(I))return;let W=ft?.get(I)??ne.get(I);I.material!==W&&(I.material=W,j=!0)}),j&&D()},[A,ye,ne,ft,Oe,D]),Ue(()=>{if(Oe!=="uv-checker")return;let L=Ag(),j=[];return A.traverse(I=>{if(!sr(I)||I.userData[Mo])return;let W=I.material,F=Array.isArray(W)?W:[W],ae=!!I.geometry.getAttribute("uv"),ce=F.map((Xe,St)=>{let qe=new op({color:ae?"#ffffff":"#ff00ff",map:ae?L:null,side:Xe.side});return qe.name=`${I.name||"mesh"}-uv-checker-${St}`,qe.toneMapped=!1,qe}),it=Array.isArray(W)?ce:ce[0];I.material=it,j.push({node:I,original:W,diagnostic:it})}),D(),()=>{for(let{node:I,original:W,diagnostic:F}of j){I.material=W;let ae=Array.isArray(F)?F:[F];for(let ce of ae)ce.dispose()}D()}},[A,Oe,D,ee]),Ue(()=>{if(!We)return;let L=[];for(let[j,I]of Object.entries(t)){let W=I.modelObjectId??j,F=J[W];if(!sr(F))continue;let ae=new op({color:Lt,wireframe:!0,transparent:!0,opacity:Bt,depthTest:!1,depthWrite:!1,side:vR,toneMapped:!1}),ce=F.clone(!1);ce.name="",ce.position.set(0,0,0),ce.quaternion.identity(),ce.scale.set(1,1,1),ce.matrix.identity(),ce.matrixAutoUpdate=!0,ce.material=ae,ce.castShadow=!1,ce.receiveShadow=!1,ce.frustumCulled=!1,ce.renderOrder=1,ce.userData={isWireframeOverlay:!0},ce.raycast=()=>{},F.morphTargetInfluences&&(ce.morphTargetInfluences=F.morphTargetInfluences),F.add(ce),L.push({node:F,overlay:ce})}return D(),()=>{for(let{node:j,overlay:I}of L)j.remove(I),I.material.dispose()}},[We,Lt,Bt,J,t,D]);let ht=yt(()=>{let L=Array.from(Q.current.values()).flat();return db([...O.animations,...L])},[O.animations,te]);Ue(()=>{A.animations=ht.map(({clip:L})=>L)},[A,ht]);let rr=Dt(p);rr.current=p;let Vr=Dt(h);Vr.current=h;let Qt=ox(L=>L.frameloop==="never"),Jt=Dt(Qt);Jt.current=Qt;let Nt=Dt(null),vt=Dt(null),gt=Dt(new Set),Vt=Dt(0),nr=L=>{gt.current.forEach(j=>j({...L,isRenderPaused:Jt.current}))};Ue(()=>{let L=ub({root:A,clips:ht,getClipConfig:I=>cb(Vr.current,I),onChange:()=>{nr(L.getState()),ll(A),D()}});Nt.current=L,vt.current={clips:ht.map(({sourceName:I})=>I),clipDetails:ht.map(({sourceName:I,duration:W})=>({sourceName:I,duration:W})),play:L.play,pause:L.pause,stop:L.stop,setSpeed:L.setSpeed,seek:L.seek,getState:()=>({...L.getState(),isRenderPaused:Jt.current}),subscribe:I=>(gt.current.add(I),I({...L.getState(),isRenderPaused:Jt.current}),()=>{gt.current.delete(I)})},nr(L.getState());let j=Vr.current?.animations.autoplayClip;return j&&L.play(j),()=>{L.dispose(),Nt.current=null,vt.current=null,nr(L.getState())}},[A,ht]),Ue(()=>{Nt.current&&nr(Nt.current.getState())},[Qt]);let Cn=!!p;Ue(()=>{Cn&&vt.current&&rr.current?.(vt.current)},[A,ht,Cn,o]),Ue(()=>{h?.animations&&Nt.current?.applyClipConfigs()},[h?.animations]),Ul((L,j)=>{let I=Nt.current;if(I?.isRunning()){if(I.update(j),!y)for(let[W,F]of ze.current)Xl(W,F,Ae);Vt.current+=j,ll(A,{updateFallbacks:Vt.current>=.066}),D(),Vt.current>=.066&&(Vt.current=0,nr(I.getState()))}});let Ut=yt(()=>(h?.model.rotation??[0,0,0]).map(L=>L*Math.PI/180),[h?.model.rotation]);Ul((L,j)=>{if(!G.current)return;let I=G.current.rotation;I.x=Wl.lerp(I.x,Ut[0],1-Math.exp(-5*j)),I.y=Wl.lerp(I.y,Ut[1],1-Math.exp(-5*j)),I.z=Wl.lerp(I.z,Ut[2],1-Math.exp(-5*j)),Math.abs(I.x-Ut[0])<1e-4&&Math.abs(I.y-Ut[1])<1e-4&&Math.abs(I.z-Ut[2])<1e-4||D()});let Zn=Dt([]),eo=Dt(0),Mn=Dt(0),Fo=yt(()=>new To,[]);Ue(()=>{let L=new Map;for(let[Xe,St]of Object.entries(t)){let qe=J[St.modelObjectId??Xe];qe&&L.set(qe,St)}for(let Xe of Zn.current)Xl(Xe.node,L.get(Xe.node)?.transform,Ae);Mn.current=0,A.updateWorldMatrix(!0,!0);let j=new $l().setFromObject(A),I=j.getCenter(new To),W=j.getSize(new To).length()*.5;eo.current=Number.isFinite(W)?W:0;let F=[...L.keys()],ae=new Set(F),ce=[],it=new To;for(let Xe of F){if(!Xe.parent)continue;let St=Xe.parent,qe=!1;for(;St;){if(ae.has(St)){qe=!0;break}St=St.parent}if(qe)continue;let je=new $l().setFromObject(Xe);if(je.isEmpty())continue;je.getCenter(it);let Ft=it.clone().sub(I);Ft.lengthSq()<1e-8||(Ft.normalize(),ce.push({node:Xe,restLocalPos:Xe.position.clone(),restWorldPos:Xe.getWorldPosition(new To),worldDir:Ft,parentInverse:new xR().copy(Xe.parent.matrixWorld).invert()}))}Zn.current=ce,D()},[A,J,ie,Ie,Ae,D]),Ue(()=>{D()},[P,D]),Ul((L,j)=>{let I=Zn.current;if(I.length===0)return;let W=Math.min(Math.max(P,0),1),F=Mn.current;if(Math.abs(F-W)<1e-4){if(F===W)return;Mn.current=W}else Mn.current=Wl.lerp(F,W,1-Math.exp(-6*j)),D();let ae=Mn.current*eo.current;for(let ce of I)Fo.copy(ce.worldDir).multiplyScalar(ae).add(ce.restWorldPos).applyMatrix4(ce.parentInverse),ce.node.position.copy(Fo),ce.node.matrixAutoUpdate||(ce.node.matrix.setPosition(ce.node.position),ce.node.matrixWorldNeedsUpdate=!0)});let Er=L=>{if(!Ub(L))return null;let j=L;for(;j;){let I=jn(j),W=I?$e[I]:void 0;if(W&&t[W]){let F=t[W];return F.visible===!1?null:[W,F]}j=j.parent}return null},Pn=L=>{let j=Er(L);if(!j)return null;let[I,W]=j;return J[W.modelObjectId??I]??null},Vi=_b(L=>{let j=Er(L);return j&&j[1].selectable!==!1?j[1]:null},o?c:void 0,Pn),to=L=>{if(Vi.consumeClick())return;let j=Er(L.object);if(!j)return;let[,I]=j;I.selectable!==!1&&(L.stopPropagation(),i(I,Zu(L,Pn(L.object))))},ns=L=>{let j=Er(L.object);if(!j)return;let[,I]=j;if(I.selectable===!1)return;l?.(I,Zu(L,Pn(L.object)))&&L.stopPropagation()},Cc=L=>{if(!x)return;let j=Er(L.object);if(!j)return;let[I,W]=j;W.hoverable!==!1&&(L.stopPropagation(),U("pointer"),V(I),a?.(W))},ro=L=>{x&&(L.stopPropagation(),T(),V(null),a?.(null))},Ho=yt(()=>!yb(A),[A,ee]);return Ue(()=>{let L=Pe&&(ve?.scene!==A||ve.key!==Pe),j=_?.some(I=>!Z[I.url]||Z[I.url].parent!==A);return Wu(A,L?"Wait for the selected material variants to finish loading before preparing AR.":j?"Wait for all merged models to finish loading before preparing AR.":Oe!=="pbr"?"Switch the model renderer to PBR before preparing a USDZ snapshot, or provide arHandoff.createUSDZ.":void 0),()=>Wu(A)},[A,ve,Pe,_,Z,ee,Oe]),CR("group",{ref:G,children:[ql("primitive",{object:A,...o&&Ho?{onClick:to,onDoubleClick:ns,...c?{onPointerDown:Vi.onPointerDown}:{},...x?{onPointerOver:Cc,onPointerOut:ro}:{}}:{}}),_?.map(L=>ql(qr,{onLoadError:j=>E?.(L.url,j),children:ql(mR,{fallback:null,children:ql(SR,{url:L.url,namePrefix:L.namePrefix,decoderConfig:b,onReady:H})})},L.url))]})}function SR({url:e,namePrefix:t,decoderConfig:r,onReady:n}){let o=ya(e,r),i=yt(()=>{let c=ix.clone(o.scene);return sg(c,t),ed(c),c},[o.scene,t]),a=yt(()=>o.animations.map(c=>lg(c,t)),[o.animations,t]),l=Dt(n);return l.current=n,Ue(()=>{l.current(e,i,a)},[e,i,a]),null}import{Suspense as MR,useEffect as PR,useRef as kR}from"react";import{jsx as Kl}from"react/jsx-runtime";function RR({url:e,decoderConfig:t,onModelLoaded:r}){let{scene:n}=ya(e,t),o=kR(r);return o.current=r,PR(()=>{o.current?.(n)},[n]),Kl("primitive",{object:n})}function ax({url:e,decoderConfig:t,onLoadError:r,onModelLoaded:n}){return Kl(qr,{onLoadError:o=>r?.(e,o),children:Kl(MR,{fallback:null,children:Kl(RR,{url:e,decoderConfig:t,onModelLoaded:n})})})}import{Suspense as AR,useCallback as sx,useMemo as OR,useRef as lx}from"react";import{jsx as Ql}from"react/jsx-runtime";var ER={};function cx({entry:e,isActive:t,decoderConfig:r,itemMaterials:n,sceneConfig:o,zoomOnSelected:i,highlightOnHover:a,explodeFactor:l,suspendBindingTransforms:c,onLoadProgress:d,onAnimationsReady:p,onModelAnimationsReady:m,onLoadError:s,onModelLoaded:f,selectedItem:u,panelHoveredItem:h,onItemClick:v,onItemDoubleClick:x,onItemContextMenu:b,onItemHover:S,nodeRefsOut:w,onNodeRefsChange:P,materialRefsOut:y,onMergeModelLoaded:M,onMergeModelError:_,pulses:C}){let E=lx({}),R=lx({}),O=sx(()=>{},[]),D=OR(()=>t?null:ba(e.objectBindings,e.sceneConfig?.product,sn((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=sx(U=>{t&&p?.(U),m?.(Re(e),U)},[t,p,m,e.url,e.id]),G=!!p||!!m;return Ql(qr,{onLoadError:U=>s?.(Re(e),U),children:Ql(AR,{fallback:null,children:Ql("group",{position:e.transform?.position,rotation:e.transform?.rotation,scale:e.transform?.scale,visible:e.visible!==!1,children:Ql(Ha,{url:e.url,interactive:t&&e.visible!==!1,objectBindings:t?e.objectBindings:D?.objectBindings??e.objectBindings,selectedItem:t?u:null,itemMaterials:t?n:ER,onItemClick:t?v:O,onItemDoubleClick:t?x:void 0,onItemContextMenu:t?b:void 0,onItemHover:t?S:void 0,onModelLoaded:f?U=>f(Re(e),U):void 0,onAnimationsReady:G?V:void 0,nodeRefsOut:t?w:E,onNodeRefsChange:t?P:void 0,materialRefsOut:y??R,panelHoveredItem:t?h:void 0,sceneConfig:t?o:B,zoomOnSelected:t&&i,highlightOnHover:t&&!!a,decoderConfig:r,onLoadProgress:t?d:void 0,explodeFactor:l,suspendBindingTransforms:t?c:!1,originalNodePoses:e.originalNodePoses,mergeModels:e.mergeModels,onMergeModelLoaded:M,onMergeModelError:_,pulses:t?C:void 0})})})},e.url)}import{Matrix4 as ip}from"three";var DR=new ip().makeRotationX(Math.PI/2);function ux(e){e.updateMatrixWorld(!0);let t=new ip().copy(e.matrixWorld).invert().premultiply(DR),r=new ip,n=[];for(let[o,i]of Object.entries(Bn(e).nodesById)){let a=i;if(!a.isMesh||!a.geometry||!i.name)continue;let l=a.geometry;l.boundingBox||l.computeBoundingBox();let c=l.boundingBox.clone().applyMatrix4(r.multiplyMatrices(t,i.matrixWorld)),d=l.index?l.index.count:l.getAttribute("position")?.count??0;n.push({name:o,triangles:Math.floor(d/3),minimum:c.min.toArray(),maximum:c.max.toArray()})}return n.sort((o,i)=>o.name.localeCompare(i.name))}import{useMemo as qn,useRef as zr,useState as _o,useEffect as bn,useCallback as ki}from"react";import{Html as dx}from"@react-three/drei";import{useFrame as px,useThree as sp}from"@react-three/fiber";import{MathUtils as ap,Vector3 as Ri}from"three";import{jsx as lr,jsxs as lp}from"react/jsx-runtime";var TR=[],_R=.02;function mx(e,t,r=!1,n){let o=zr(null),[i,a]=_o(!0),l=zr(!0),c=qn(()=>new Ri,[]),d=sp(v=>v.scene),p=zr(null),m=zr(null),s=qn(()=>new Ri(...e.anchorLocalPosition??e.localPosition??e.worldPosition),[e.anchorLocalPosition,e.localPosition,e.worldPosition]),f=qn(()=>new Ri,[]),u=qn(()=>new Ri,[]),h=qn(()=>new Ri,[]);return bn(()=>{p.current=null},[e.anchorNodeName]),px(({camera:v})=>{let x=o.current,b=x?.parent;if(!x||!b)return;let S=n?n.current:d;m.current!==S&&(m.current=S,p.current=null);let w=p.current;if(e.anchorNodeName&&(!w||!w.parent)&&(w=S?Nn(S,e.anchorNodeName):null,p.current=w),w?(w.updateWorldMatrix(!0,!1),f.copy(s).applyMatrix4(w.matrixWorld)):(f.copy(s),b.localToWorld(f)),t){let y=t.current.get(e.id);y||(y=new Ri,t.current.set(e.id,y)),y.copy(f)}v.getWorldPosition(c);let P=!r||gg(e,c.distanceTo(f));P!==l.current&&(l.current=P,a(P)),h.copy(c).sub(f),h.lengthSq()>0?(h.normalize(),u.copy(f).addScaledVector(h,_R)):u.copy(f),b.worldToLocal(u),x.position.copy(u)}),{anchorRef:o,inRange:i}}function LR({anchorSceneRef:e,annotation:t,occluders:r,worldPositionsRef:n,onClick:o,onHover:i,showAnnotationOnHover:a}){let l=re(),[c,d]=_o(!1),{anchorRef:p,inRange:m}=mx(t,n,!0,e),s=c||!m,[f,u]=_o(!1),[h,v]=_o(1),x=zr(null),b=zr(null),S=zr(null);bn(()=>{m||(x.current&&clearTimeout(x.current),f&&(u(!1),i?.(null)))},[m,f,i]),bn(()=>()=>{x.current&&(clearTimeout(x.current),x.current=null),S.current&&(clearTimeout(S.current),S.current=null)},[]);let w=C=>{C.stopPropagation(),C.preventDefault(),x.current&&(clearTimeout(x.current),x.current=null),x.current=window.setTimeout(()=>{o?.(t),x.current=null},10)},P=C=>{C.stopPropagation(),u(!0),v(100),S.current&&(clearTimeout(S.current),S.current=null),i?.(t)},y=C=>{C.stopPropagation(),u(!1),v(1),S.current&&clearTimeout(S.current),S.current=window.setTimeout(()=>{i?.(null),a&&i?.(null),S.current=null},50)},M=C=>{C.stopPropagation();let E=C.currentTarget;E.dataset.pointerX=String(C.clientX),E.dataset.pointerY=String(C.clientY)},_=C=>{C.stopPropagation();let E=C.currentTarget,R=parseFloat(E.dataset.pointerX||"0"),O=parseFloat(E.dataset.pointerY||"0"),D=C.clientX-R,B=C.clientY-O;Math.sqrt(D*D+B*B)<10&&w(C)};return lr("group",{ref:p,children:lr(dx,{center:!0,occlude:r,onOcclude:d,pointerEvents:s?"none":"auto",zIndexRange:[1,200],style:{pointerEvents:s?"none":"auto",zIndex:h},className:"annotation-html-wrapper",transparent:!0,children:lr("div",{ref:b,className:`ri-annotationMarker ${f?"ri-annotationMarker--hovered":""}`,title:t.title,style:{display:s?"none":"flex"},onPointerDown:M,onPointerUp:_,onPointerEnter:P,onPointerLeave:y,onDoubleClick:C=>{C.stopPropagation(),o?.(t)},role:"button",tabIndex:0,"aria-label":l("annotationMarker",{id:t.id,title:t.title}),onKeyDown:C=>{(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),C.stopPropagation(),o?.(t))},children:lr("span",{className:"ri-annotationMarker-id",children:t.id})})})})}function BR({anchorSceneRef:e,annotation:t,occluders:r,popupRef:n,onClose:o,hideCloseButton:i=!1}){let a=re(),[l,c]=_o(!1),{anchorRef:d}=mx(t,void 0,!1,e),p=lp("div",{ref:n,className:"ri-viewAnnotationPopup",style:{display:l?"none":"block"},onPointerDown:m=>m.stopPropagation(),onClick:m=>m.stopPropagation(),children:[lp("div",{className:"ri-viewAnnotationHeader",children:[lr("h4",{className:"ri-viewAnnotationTitle",children:t.title}),!i&&lr("button",{onClick:m=>{m.stopPropagation(),o?.()},className:"ri-viewAnnotationClose","aria-label":a("closeAnnotation"),children:"\xD7"})]}),t.category&&lr("span",{className:"ri-annotationCategory",children:t.category}),t.description&&lr("p",{className:"ri-viewAnnotationDescription",children:t.description}),t.images?.map((m,s)=>{let f=zu(m.src);return f?lr("img",{className:"ri-annotationImage",src:f,alt:m.alt??"",loading:"lazy"},`${f}-${s}`):null}),t.links?.map((m,s)=>{let f=zu(m.href);return f?lr("a",{className:"ri-annotationLink",href:f,target:"_blank",rel:"noopener noreferrer",children:m.label||a("learnMore")},`${f}-${s}`):null})]});return lr("group",{ref:d,children:lr(dx,{occlude:r,onOcclude:c,pointerEvents:l?"none":"auto",zIndexRange:[1e3,2e3],style:{pointerEvents:l?"none":"auto",zIndex:1e3},transparent:!0,children:p})})}function Jl({anchorSceneRef:e,annotations:t,sceneConfig:r,activeAnnotation:n,popupRef:o,canvasRootRef:i,worldPositionsRef:a,modelLoaded:l,onAnnotationClick:c,onAnnotationHover:d,onCloseAnnotation:p,hideCloseButton:m=!1,showAnnotationOnHover:s=!1,guidedTour:f=!1}){let u=sp(T=>T.invalidate),h=sp(T=>T.scene),[v,x]=_o(null),[b,S]=_o(!1),w=zr(null);bn(()=>{w.current!==null&&n===null&&(x(null),S(!1)),w.current=n?.id??null},[n]);let P=zr(null),y=zr(null),M=zr(null),_=qn(()=>{let T=[];return h.traverse(A=>{let Z=A;Z.isMesh&&!Z.isSkinnedMesh&&T.push({current:A})}),T},[h,t,l]),C=ki(()=>{u();let T=()=>{u(),y.current=window.requestAnimationFrame(()=>{u(),y.current=null})};y.current=window.requestAnimationFrame(T)},[u]);bn(()=>{C()},[t,C]),bn(()=>{C()},[n,C]),bn(()=>()=>{y.current!==null&&window.cancelAnimationFrame(y.current),M.current&&clearTimeout(M.current)},[]);let E=n||v,R=qn(()=>E?t.find(T=>T.id===E.id)??null:null,[E,t]),O=ki(T=>{if(b&&v?.id===T.id){S(!1),x(null),p?.();return}S(!0),x(T),c?.(T)},[b,v,c,p]),D=ki(T=>{d?.(T),s&&!b&&(M.current&&(clearTimeout(M.current),M.current=null),T?x(T):M.current=window.setTimeout(()=>{x(null),p?.(),M.current=null},100))},[b,d,s,p]),B=ki(()=>{S(!1),x(null),p?.()},[p]),V=ki(T=>{let A=T.target;if(A.closest?.(".ri-annotationMarker")||A.closest?.(".ri-viewAnnotationPopup")||A.closest?.(".annotation-html-wrapper"))return;let Z=i.current;Z&&Z.contains(A)&&(S(!1),x(null),p?.())},[i,p]),G=ki(T=>{T.key==="Escape"&&b&&(S(!1),x(null),p?.())},[b,p]);bn(()=>{let T=i.current;return T&&(T.addEventListener("click",V),T.addEventListener("pointerdown",V)),document.addEventListener("keydown",G),()=>{T&&(T.removeEventListener("click",V),T.removeEventListener("pointerdown",V)),document.removeEventListener("keydown",G)}},[i,V,G]);let U=qn(()=>(r?.model.rotation??[0,0,0]).map(T=>T*Math.PI/180),[r?.model.rotation]);return bn(()=>{u()},[u,U]),px((T,A)=>{if(!P.current)return;P.current.rotation.x=ap.lerp(P.current.rotation.x,U[0],1-Math.exp(-5*A)),P.current.rotation.y=ap.lerp(P.current.rotation.y,U[1],1-Math.exp(-5*A)),P.current.rotation.z=ap.lerp(P.current.rotation.z,U[2],1-Math.exp(-5*A));let{rotation:Z}=P.current;Math.abs(Z.x-U[0])+Math.abs(Z.y-U[1])+Math.abs(Z.z-U[2])>1e-4&&u()}),lp("group",{ref:P,children:[t.map(T=>{let A=`${T.worldPosition.join(",")}-${T.title}-${T.id}`;return lr(LR,{anchorSceneRef:e,annotation:T,occluders:_,worldPositionsRef:a,onClick:O,onHover:D,showAnnotationOnHover:s},A)}),R?lr(BR,{anchorSceneRef:e,annotation:R,occluders:f?TR:_,popupRef:o,onClose:B,hideCloseButton:m},`popup-${R.id}`):null]})}import{useEffect as hx,useMemo as Ua}from"react";import{Html as up}from"@react-three/drei";import{useEffect as jR,useMemo as NR}from"react";import{Line as IR}from"@react-three/drei";import{useThree as zR}from"@react-three/fiber";import{BufferGeometry as VR,Line as FR,LineBasicMaterial as HR,LineDashedMaterial as GR,Vector3 as fx}from"three";import{jsx as cp}from"react/jsx-runtime";function Kn(e){return zR(r=>zn(r.gl))?cp(UR,{...e}):cp(IR,{points:e.points,color:e.color,lineWidth:e.lineWidth,dashed:e.dashed})}function UR({points:e,color:t,dashed:r=!1}){let n=NR(()=>{let o=new VR().setFromPoints(e.map(l=>l instanceof fx?l:new fx(...l))),i=r?new GR({color:t,dashSize:.02,gapSize:.02}):new HR({color:t}),a=new FR(o,i);return r&&a.computeLineDistances(),a},[e,t,r]);return jR(()=>()=>{n.geometry.dispose(),n.material.dispose()},[n]),cp("primitive",{object:n})}import{BoxGeometry as $R,BufferGeometry as WR,DoubleSide as XR,EdgesGeometry as qR,Float32BufferAttribute as KR,Vector3 as hn}from"three";import{Fragment as Ga,jsx as st,jsxs as gr}from"react/jsx-runtime";var Qn="#22d3ee",QR="#facc15";function Lo(e,t){let r=e<10?e.toFixed(3):e.toFixed(2);return t?`${r} ${t}`:r}function gx(e,t){return[(e[0]+t[0])/2,(e[1]+t[1])/2,(e[2]+t[2])/2]}function JR(e){let t=e.reduce((r,n)=>[r[0]+n[0],r[1]+n[1],r[2]+n[2]],[0,0,0]);return[t[0]/e.length,t[1]/e.length,t[2]/e.length]}function vn({position:e,children:t}){return st(up,{center:!0,position:e,zIndexRange:[20,0],style:{pointerEvents:"none"},children:st("div",{className:"ri-measureLabel",children:t})})}function bx({positions:e,triangles:t}){let r=Ua(()=>{let n=new hn(...e[0]),o=new WR;return o.setAttribute("position",new KR(e.flatMap(i=>new hn(...i).sub(n).toArray()),3)),o.setIndex(t.flat()),o},[e,t]);return hx(()=>()=>r.dispose(),[r]),st("mesh",{position:e[0],geometry:r,raycast:()=>{},renderOrder:100,children:st("meshBasicMaterial",{color:Qn,side:XR,transparent:!0,opacity:.18,depthWrite:!1})})}var YR=[[0,1,2]];function ZR({positions:e}){let t=Js(e);if(t===null)return null;let r=new hn(...e[1]),n=new hn(...e[0]).sub(r),o=new hn(...e[2]).sub(r),i=Math.min(n.length(),o.length())*.22;n.normalize(),o.normalize();let a=n.clone().cross(o);a.lengthSq()<1e-12&&a.copy(n).cross(Math.abs(n.y)<.9?new hn(0,1,0):new hn(1,0,0)),a.normalize();let l=t*Math.PI/180,c=Array.from({length:33},(p,m)=>n.clone().applyAxisAngle(a,l*m/32).multiplyScalar(i).add(r).toArray()),d=n.clone().applyAxisAngle(a,l/2).multiplyScalar(i*1.4).add(r).toArray();return gr(Ga,{children:[st(Kn,{points:c,color:Qn,lineWidth:2}),gr(vn,{position:d,children:[t.toFixed(2),"\xB0"]})]})}function eA({box:e,unit:t,scale:r}){let n=Ua(()=>[(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=Ua(()=>{let[c,d,p]=e.size,m=new $R(c||1e-4,d||1e-4,p||1e-4),s=new qR(m);return m.dispose(),s},[e.size]);hx(()=>()=>{o.dispose()},[o]);let[i,a,l]=e.size;return gr("group",{position:n,children:[st("lineSegments",{geometry:o,children:st("lineBasicMaterial",{color:QR})}),gr(vn,{position:[0,-a/2,l/2],children:["W ",Lo(i*r,t)]}),gr(vn,{position:[-i/2,0,l/2],children:["H ",Lo(a*r,t)]}),gr(vn,{position:[i/2,-a/2,0],children:["D ",Lo(l*r,t)]})]})}function Ai({points:e,unit:t,scale:r=1,box:n,showDimensions:o,tool:i="distance",areaClosed:a=!1,snapPreview:l}){let c=Ua(()=>e.map(m=>m.position),[e]),d=Ua(()=>i==="area"&&a?Ys(c):null,[i,a,c]),p=i==="pointToPlane"&&e.length===2?Dg(e[0],e[1].position):null;return gr("group",{children:[i!=="wrap"&&i!=="wrapHorizontal"&&e.map(m=>st(up,{center:!0,position:m.position,zIndexRange:[15,0],style:{pointerEvents:"none"},children:st("div",{className:`ri-measureDot${m.snapped?" ri-measureDot--snapped":""}`})},m.id)),i==="distance"&&e.slice(1).map((m,s)=>{let f=e[s].position,u=m.position,h=new hn(...f).distanceTo(new hn(...u));return gr("group",{children:[st(Kn,{points:[f,u],color:Qn,lineWidth:2}),st(vn,{position:gx(f,u),children:Lo(h*r,t)})]},`${e[s].id}-${m.id}`)}),(i==="angle"||i==="area")&&c.length>=2&&st(Kn,{points:a?[...c,c[0]]:c,color:Qn,lineWidth:2}),i==="angle"&&st(ZR,{positions:c}),d&&!("error"in d)&&gr(Ga,{children:[st(bx,{positions:c,triangles:d.triangles}),st(vn,{position:d.center,children:Lo(d.area*r**2,t?`${t}\xB2`:"")})]}),i==="pointToPlane"&&e[0]?.faceVertices&&gr(Ga,{children:[st(bx,{positions:e[0].faceVertices,triangles:YR}),st(Kn,{points:[...e[0].faceVertices,e[0].faceVertices[0]],color:Qn,lineWidth:1}),e.length===1&&st(vn,{position:e[0].position,children:"Reference plane"})]}),p&&gr(Ga,{children:[st(Kn,{points:[e[1].position,p.projection],color:Qn,lineWidth:2}),st(Kn,{points:[e[0].position,p.projection],color:Qn,lineWidth:1,dashed:!0}),st(vn,{position:gx(e[1].position,p.projection),children:Lo(p.distance*r,t)})]}),(i==="wrap"||i==="wrapHorizontal")&&c.length>=3&&gr(Ga,{children:[st(Kn,{points:[...c,c[0]],color:Qn,lineWidth:2}),st(vn,{position:JR(c),children:Lo(Tg(c,!0)*r,t)})]}),l&&gr(up,{center:!0,position:l.position,zIndexRange:[20,0],style:{pointerEvents:"none"},children:[st("div",{className:"ri-measureSnapTarget"}),st("div",{className:"ri-measureSnapLabel",children:l.snapped==="vertex"?"Vertex":"Edge"})]}),o&&n?st(eA,{box:n,unit:t,scale:r}):null]})}import{Eraser as vx,PencilRuler as yx,RulerDimensionLine as tA,Undo2 as xx,X as rA}from"lucide-react";import{useEffect as nA,useLayoutEffect as oA,useRef as wx,useState as Yl}from"react";import{createPortal as iA}from"react-dom";import{Fragment as $a,jsx as ue,jsxs as et}from"react/jsx-runtime";function dp(e){let t=re(),{isInsideEditor:r,measurementPanelTarget:n,tier:o}=Fn(),i=r&&!cl(o,"calibratedMeasurements"),a=wx(null),[l,c]=Yl(!1),[d,p]=Yl(""),[m,s]=Yl("1"),[f,u]=Yl("m"),h=wx(null),v={ready:"measurementReady",approximate:"measurementApproximate","model-changed":"measurementModelChanged","missing-object":"measurementObjectMissing","geometry-changed":"measurementGeometryChanged","pose-changed":"measurementPoseChanged","hidden-object":"measurementObjectHidden",invalid:"measurementInvalid"};oA(()=>{if(!a.current)return;let O=()=>e.onHeight(a.current?.getBoundingClientRect().height??34),D=new ResizeObserver(O);return D.observe(a.current),O(),()=>D.disconnect()},[e.onHeight]);let x=r&&e.active&&!n,{onToggle:b}=e;nA(()=>{x&&b()},[x,b]);let{tool:S,pointCount:w,areaClosed:P}=e,y=S==="angle"?[t("angleFirstArmHint"),t("angleVertexHint"),t("angleSecondArmHint"),t("angleNewHint")][w]:S==="area"?t(P?"areaNewHint":"areaCornersHint"):S==="pointToPlane"?[t("pointToPlaneFaceHint"),t("pointToPlanePointHint"),t("pointToPlaneNewHint")][w]:t(S==="wrap"?"wrapHint":S==="wrapHorizontal"?"wrapHorizontalHint":"distanceHint"),M=r?"ri-measureField":"ri-measureSelect",_=et("select",{className:M,"aria-label":t("measurementTool"),value:S,disabled:e.disabled,onChange:O=>e.onTool(O.target.value),children:[ue("option",{value:"distance",children:t("distance")}),ue("option",{value:"angle",children:t("angle")}),ue("option",{value:"area",children:t("area")}),ue("option",{value:"pointToPlane",children:t("pointToPlane")}),ue("option",{value:"wrap",children:t("wrap")}),ue("option",{value:"wrapHorizontal",children:t("wrapHorizontal")})]}),C=et("select",{className:M,"aria-label":t("measurementSnapping"),value:e.snap,disabled:e.disabled,onChange:O=>e.onSnap(O.target.value),children:[ue("option",{value:"none",children:t("noSnapping")}),ue("option",{value:"auto",children:t("snapAuto")}),ue("option",{value:"vertex",children:t("snapVertex")}),ue("option",{value:"edge",children:t("snapEdge")})]}),E=e.active&&S==="area"&&!P&&ue("button",{type:"button",className:r?"ri-measureAction":"ri-measureFinish",onClick:e.onFinishArea,disabled:e.disabled||w<3,children:t("finishArea")}),R=et("div",{className:`ri-measureLibrary${r?" ri-measureLibrary--sidebar":""}`,onClick:O=>O.stopPropagation(),onPointerDown:O=>O.stopPropagation(),onPointerMove:O=>O.stopPropagation(),onKeyDown:O=>O.stopPropagation(),children:[r&&ue("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:[ue(yx,{size:13}),e.active?t("stopMeasuring"):t("startMeasuring")]})}),r&&e.active&&et($a,{children:[et("div",{className:"ri-measureRow",children:[ue("span",{children:"Tool"}),_]}),et("div",{className:"ri-measureRow",children:[ue("span",{children:"Snapping"}),C]}),!e.error&&ue("p",{className:"ri-measureGuide",role:"status",children:y}),(w>0||E)&&et("div",{className:"ri-measureActions",children:[w>0&&et($a,{children:[et("button",{type:"button",className:"ri-measureAction",onClick:e.onUndo,disabled:e.disabled,children:[ue(xx,{size:13}),"Undo point"]}),et("button",{type:"button",className:"ri-measureAction",onClick:e.onClear,disabled:e.disabled,children:[ue(vx,{size:13}),"Clear"]})]}),E]})]}),r&&et("label",{className:"ri-measureRow",children:[ue("span",{children:"Bounding box"}),ue("input",{type:"checkbox","aria-label":t("toggleBoundingDimensions"),checked:e.showDimensions,disabled:e.disabled,onChange:e.onDimensions})]}),et("label",{className:"ri-measureRow",children:[ue("span",{children:t("measurementSourceUnit")}),ue("select",{"aria-label":t("measurementSourceUnit"),className:"ri-measureField",disabled:e.disabled||e.settingsReadOnly,value:e.settings.sourceUnit??"m",onChange:O=>e.onSettings({...e.settings,sourceUnit:O.target.value,metersPerUnit:void 0}),children:Zs.map(O=>ue("option",{value:O,children:O},O))})]}),et("label",{className:"ri-measureRow",children:[ue("span",{children:t("measurementDisplayUnit")}),et("select",{"aria-label":t("measurementDisplayUnit"),className:"ri-measureField",disabled:e.disabled||e.settingsReadOnly,value:e.displayUnit,onChange:O=>e.onSettings({...e.settings,displayUnit:O.target.value}),children:[!Ng(e.displayUnit)&&ue("option",{value:e.displayUnit,children:e.displayUnit}),Zs.map(O=>ue("option",{value:O,children:O},O))]})]}),e.active&&et($a,{children:[et("div",{className:"ri-measureRow",children:[ue("span",{children:t("measurementName")}),et("span",{className:"ri-measureCombo",children:[ue("input",{"aria-label":t("measurementName"),className:"ri-measureField",value:d,onChange:O=>p(O.target.value),placeholder:t("measurementNamePlaceholder")}),ue("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(d),p(""),c(!0)},children:t("saveMeasurement")})]})]}),et("div",{className:"ri-measureRow",title:t("measurementCalibrationHint"),children:[ue("span",{children:t("knownMeasurementDistance")}),et("span",{className:"ri-measureCombo",children:[ue("input",{"aria-label":t("knownMeasurementDistance"),type:"number",min:"0",step:"any",className:"ri-measureField",value:m,onChange:O=>s(O.target.value)}),ue("select",{"aria-label":t("calibrationUnit"),className:"ri-measureField ri-measureField--unit",value:f,onChange:O=>u(O.target.value),children:Zs.map(O=>ue("option",{children:O},O))}),ue("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:[ue("span",{children:t("measurementCalibratedScale",{scale:e.settings.metersPerUnit.toPrecision(6)})}),ue("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&&ue("div",{className:"ri-savedMeasurementList",children:e.items.map(O=>{let D=e.results.find(B=>B.id===O.id);return et("div",{className:"ri-savedMeasurementRow",children:[ue("input",{type:"checkbox","aria-label":t("showSavedMeasurement",{name:O.name}),checked:O.visible!==!1,disabled:e.disabled||e.readOnly,onChange:B=>e.onItems(e.items.map(V=>V.id===O.id?{...V,visible:B.target.checked}:V))}),ue("input",{"aria-label":t("renameSavedMeasurement",{name:O.name}),className:"ri-savedMeasurementName",defaultValue:O.name,disabled:e.disabled||e.readOnly,onBlur:B=>{let V=B.target.value.trim()||O.name;V!==O.name?e.onItems(e.items.map(G=>G.id===O.id?{...G,name:V}:G)):B.target.value=V}},`${O.id}:${O.name}`),ue("span",{className:"ri-savedMeasurementValue",title:t(D?v[D.status]:"measurementWaiting"),children:D?.value!=null?`${D.value.toFixed(3)} ${D.unit}`:"\u2014"}),ue("button",{type:"button",className:"ri-savedMeasurementDelete","aria-label":t("deleteSavedMeasurement",{name:O.name}),disabled:e.disabled||e.readOnly,onClick:()=>e.onItems(e.items.filter(B=>B.id!==O.id)),children:ue(rA,{size:13})})]},O.id)})}),!e.items.length&&ue("p",{className:"ri-measureEmpty",children:t("noSavedMeasurements")}),et("details",{className:"ri-measureTransfer",children:[ue("summary",{children:t("measurementFiles")}),et("div",{className:"ri-measureActions",children:[ue("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||!e.items.length,onClick:e.onExportJson,children:t("exportMeasurementJson")}),ue("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||!e.items.length,onClick:e.onExportCsv,children:t("exportMeasurementCsv")}),ue("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||e.readOnly||e.settingsReadOnly,onClick:()=>h.current?.click(),children:t("importMeasurementJson")}),ue("input",{ref:h,type:"file",accept:".json,application/json",hidden:!0,onChange:O=>{let D=O.target.files?.[0];if(O.target.value="",!!D){if(D.size>5*1024*1024){e.onImport("{}");return}D.text().then(e.onImport).catch(()=>e.onImport("{}"))}}})]})]}),r&&e.error&&ue("p",{className:"ri-measureLibraryError",role:"status",children:t.message(e.error)})]});return r?n?iA(R,n):null:et("div",{ref:a,className:"ri-measureTools",style:{top:e.top},children:[et("div",{className:"ri-measureToolbarRow",children:[ue("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:ue(yx,{size:16})}),ue("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:ue(tA,{size:16})}),ue("button",{type:"button",className:"ri-measureSelect","aria-expanded":l,onClick:()=>c(!l),children:t("savedMeasurements",{count:e.items.length})}),e.active&&et($a,{children:[_,C]}),w>0&&et($a,{children:[ue("button",{type:"button",className:"ri-measureButton",onClick:e.onUndo,disabled:e.disabled,title:t("undoMeasurementPoint"),children:ue(xx,{size:16})}),ue("button",{type:"button",className:"ri-measureButton",onClick:e.onClear,disabled:e.disabled,title:t("clearMeasurements"),children:ue(vx,{size:16})})]}),E]}),(e.active||l)&&R,(e.active||e.error)&&ue("div",{className:`ri-measureHint${e.error?" ri-measureHint--error":""}`,role:"status",children:e.error?t.message(e.error):y})]})}import{useCallback as aA,useEffect as Sx,useRef as Zl,useState as sA}from"react";import{useFrame as lA}from"@react-three/fiber";import{Fragment as uA,jsx as Cx}from"react/jsx-runtime";var cA=100;function ec({items:e,sceneRef:t,modelId:r,tilesetUrl:n,settings:o,legacyUnit:i,revision:a,onResults:l}){let[c,d]=sA([]),p=Zl(""),m=aA(()=>{let x=e.length&&t.current?_a(t.current):void 0,b=e.map(P=>Tl(P,t.current,r,n,x)),S=b.map(({measurement:P,points:y,status:M})=>tl(P,o,i,y,M)),w=JSON.stringify([b.map(({measurement:P,points:y,status:M})=>[P.id,P.tool,P.visible,M,y.map(_=>[_.position,_.normal,_.faceVertices])]),S]);p.current!==w&&(p.current=w,d(b),l(S))},[e,t,r,n,o,i,l]);Sx(()=>{m()},[m,a]);let s=Zl(0),f=Zl(null),u=Zl(m);u.current=m,Sx(()=>()=>{f.current&&clearTimeout(f.current)},[]),lA(()=>{if(!e.length)return;let x=s.current+cA-performance.now();x<=0?(s.current=performance.now(),m()):f.current??(f.current=setTimeout(()=>{f.current=null,s.current=performance.now(),u.current()},x))});let{factor:h,displayUnit:v}=el(o,i);return Cx(uA,{children:c.filter(({measurement:x,status:b})=>x.visible!==!1&&(b==="ready"||b==="approximate")).map(({measurement:x,points:b})=>Cx(Ai,{points:b,unit:v,scale:h,box:null,showDimensions:!1,tool:x.tool,areaClosed:x.tool==="area"},x.id))})}import{useRef as Bo,useState as dA,useCallback as Qr,useEffect as pA}from"react";import{jsx as br,jsxs as pp}from"react/jsx-runtime";var mA={up:{width:38,height:22},down:{width:38,height:22},left:{width:22,height:38},right:{width:22,height:38}},fA={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"},tc=({direction:e})=>{let t=mA[e],r=fA[e];return pp("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:[br("polyline",{points:r,stroke:"rgba(0, 0, 0, 0.9)",strokeWidth:"6",strokeLinecap:"round",strokeLinejoin:"round"}),br("polyline",{points:r,stroke:"#2095F2",strokeWidth:"4",strokeLinecap:"round",strokeLinejoin:"round"})]})},yn=16,gA={"bottom-left":{bottom:yn,left:yn,top:"auto",right:"auto",transform:"none"},"bottom-right":{bottom:yn,right:yn,top:"auto",left:"auto",transform:"none"},"top-left":{top:yn,left:yn,bottom:"auto",right:"auto",transform:"none"},"top-right":{top:yn,right:yn,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:yn,left:"50%",bottom:"auto",right:"auto",transform:"translateX(-50%)"}},bA=({controlsRef:e,enabled:t=!0,opacity:r=.9,moveSensitivity:n=.001,rotateSensitivity:o=.01,position:i="center-bottom"})=>{let a=re(),l=Bo(null),[c,d]=dA({x:0,y:0}),p=Bo(!1),m=Bo({x:0,y:0}),s=Bo(void 0),f=Bo(void 0),u=Bo(null),h=Bo(0),v=()=>e.current,x=(B,V,G)=>{let U=Math.hypot(B,V);if(U>G){let T=G/U;return{x:B*T,y:V*T}}return{x:B,y:V}},b=B=>{let G=Math.abs(B);return G<.12?0:Math.sign(B)*((G-.12)/(1-.12))},S=Qr(()=>{let B=()=>{let{x:V,y:G}=m.current,U=b(V),T=b(G);if(t&&(U!==0||T!==0)){let A=v();A&&A.rotate(-U*o,-T*o,!0)}s.current=requestAnimationFrame(B)};s.current=requestAnimationFrame(B)},[t,o]),w=Qr(()=>{s.current&&cancelAnimationFrame(s.current)},[]),P=Qr((B,V)=>{if(!l.current||!p.current)return;let G=l.current.getBoundingClientRect(),U=G.left+G.width/2,T=G.top+G.height/2,A=G.width/2-18,Z=B-U,ee=V-T,Y=x(Z,ee,A);d(Y),m.current={x:Y.x/A,y:Y.y/A}},[]),y=Qr(B=>{if(!t)return;B.preventDefault(),B.stopPropagation(),p.current=!0,S();let V="touches"in B?B.touches[0]:B;P(V.clientX,V.clientY)},[t,S,P]),M=Qr(B=>{if(!p.current)return;B.preventDefault();let V="touches"in B?B.touches[0]:B;P(V.clientX,V.clientY)},[P]),_=Qr(()=>{p.current=!1,d({x:0,y:0}),m.current={x:0,y:0},w()},[w]),C=n*10,E=Qr(B=>{t&&v()?.forward(B*C,!0)},[t,C]),R=Qr(B=>{t&&v()?.truck(B*C,0,!0)},[t,C]),O=Qr((B,V,G)=>{if(!t)return;f.current&&cancelAnimationFrame(f.current),u.current={control:B,amount:V,action:G},h.current=0,G(V);let U=T=>{if(!u.current)return;if(h.current===0){h.current=T,f.current=requestAnimationFrame(U);return}if(T-h.current>200){let{amount:Z,action:ee}=u.current;ee(Z),h.current=T}f.current=requestAnimationFrame(U)};f.current=requestAnimationFrame(U)},[t]),D=Qr(B=>{u.current?.control===B&&(f.current&&(cancelAnimationFrame(f.current),f.current=void 0),u.current=null,h.current=0)},[]);return pA(()=>(window.addEventListener("mousemove",M),window.addEventListener("mouseup",_),window.addEventListener("touchmove",M,{passive:!1}),window.addEventListener("touchend",_),window.addEventListener("touchcancel",_),()=>{window.removeEventListener("mousemove",M),window.removeEventListener("mouseup",_),window.removeEventListener("touchmove",M),window.removeEventListener("touchend",_),window.removeEventListener("touchcancel",_),w(),f.current&&cancelAnimationFrame(f.current)}),[M,_,w]),t?br("div",{className:"mc__wrapper",style:{opacity:r,...gA[i]},children:pp("div",{className:"mc__dpad",children:[br("button",{"aria-label":a("moveForward"),className:"mc__arrow mc__arrow--up",onMouseDown:()=>O("up",1,E),onMouseUp:()=>D("up"),onMouseLeave:()=>D("up"),onTouchStart:B=>{B.preventDefault(),O("up",1,E)},onTouchEnd:()=>D("up"),onTouchCancel:()=>D("up"),children:br(tc,{direction:"up"})}),pp("div",{className:"mc__middle-row",children:[br("button",{"aria-label":a("moveLeft"),className:"mc__arrow mc__arrow--left",onMouseDown:()=>O("left",-1,R),onMouseUp:()=>D("left"),onMouseLeave:()=>D("left"),onTouchStart:B=>{B.preventDefault(),O("left",-1,R)},onTouchEnd:()=>D("left"),onTouchCancel:()=>D("left"),children:br(tc,{direction:"left"})}),br("div",{ref:l,className:"mc__joystick",onMouseDown:y,onTouchStart:y,children:br("div",{className:"mc__knob",style:{transform:`translate(${c.x}px, ${c.y}px)`}})}),br("button",{"aria-label":a("moveRight"),className:"mc__arrow mc__arrow--right",onMouseDown:()=>O("right",1,R),onMouseUp:()=>D("right"),onMouseLeave:()=>D("right"),onTouchStart:B=>{B.preventDefault(),O("right",1,R)},onTouchEnd:()=>D("right"),onTouchCancel:()=>D("right"),children:br(tc,{direction:"right"})})]}),br("button",{"aria-label":a("moveBackward"),className:"mc__arrow mc__arrow--down",onMouseDown:()=>O("down",-1,E),onMouseUp:()=>D("down"),onMouseLeave:()=>D("down"),onTouchStart:B=>{B.preventDefault(),O("down",-1,E)},onTouchEnd:()=>D("down"),onTouchCancel:()=>D("down"),children:br(tc,{direction:"down"})})]})}):null},Mx=bA;import{useEffect as rc,useMemo as hA,useRef as Px,useState as kx}from"react";import{Check as vA,Link as yA,SlidersHorizontal as xA,X as wA}from"lucide-react";import{jsx as Oi,jsxs as mp}from"react/jsx-runtime";function Rx({product:e,options:t,onSelectionsChange:r,top:n=12}){let o=re(),i={"--ri-product-dock-top":`${n}px`},{adapter:a,urlParam:l,onConfigurationChange:c,defaultClosed:d}=t,p=hA(()=>{let y=l&&typeof window<"u"?new URLSearchParams(window.location.search).get(l):null;return y?Jg(y,e.definition):e.selections},[]),m=ph({product:e.definition,initialSelections:p,adapter:a}),{selections:s}=m.configuration,f=JSON.stringify(s),[u,h]=kx(()=>!d&&(typeof window>"u"||window.innerWidth>640)),[v,x]=kx(!1),b=Px(r);b.current=r,rc(()=>{b.current(s)},[f]);let S=Px(c);S.current=c,rc(()=>{S.current?.(m.configuration,m.checkoutUrl)},[m.configuration.key,m.checkoutUrl]);let w=()=>{let y=new URL(window.location.href);return y.searchParams.set(l,Qg(s)),y.href};rc(()=>{l&&window.history.replaceState(window.history.state,"",w())},[l,f]),rc(()=>{if(!v)return;let y=setTimeout(()=>x(!1),2e3);return()=>clearTimeout(y)},[v]);let P=!!l&&typeof window<"u"&&window.self===window.top;return u?mp("div",{className:"ri-productDock",style:i,children:[Oi("button",{type:"button",className:"ri-productDockClose",onClick:()=>h(!1),title:o("productHideOptions"),"aria-label":o("productHideOptions"),children:Oi(wA,{size:14,"aria-hidden":"true"})}),Oi(rd,{configurator:m,actions:P?mp("button",{type:"button",onClick:()=>{navigator.clipboard.writeText(w()).then(()=>x(!0)).catch(()=>{})},children:[v?Oi(vA,{size:13,"aria-hidden":"true"}):Oi(yA,{size:13,"aria-hidden":"true"}),o(v?"productLinkCopied":"productCopyLink")]}):void 0})]}):mp("button",{type:"button",className:"ri-productDockToggle",style:i,onClick:()=>h(!0),title:o("productShowOptions"),children:[Oi(xA,{size:14,"aria-hidden":"true"}),o("productOptions")]})}import{useMemo as CA}from"react";import{useEffect as SA}from"react";import{useThree as Ax}from"@react-three/fiber";var Ox=new WeakMap;function nc(e){let t=Ax(n=>n.get),r=Ax(n=>n.setEvents);SA(()=>{if(!e)return;let n=Ox.get(t);if(!n){let i=new Set;n=i,Ox.set(t,i);let a=t().events.filter;r({filter:(l,c)=>{let d=a?a(l,c):l;return i.size===0?d:d.filter(p=>{for(let m of i)if(!m(p))return!1;return!0})}})}n.add(e);let o=n;return()=>{o.delete(e)}},[e,t,r])}function fp({setAside:e,nodeRefs:t}){let r=CA(()=>{if(e.size===0)return null;let n={refs:null,bound:new Map};return o=>{let i=t.current??{};if(n.refs!==i){let l=new Map;for(let[c,d]of Object.entries(i))l.set(d,e.has(c));n={refs:i,bound:l}}let{bound:a}=n;for(let l=o.object;l;l=l.parent){let c=a.get(l);if(c!==void 0)return!c}return!0}},[e,t]);return nc(r),null}import{useEffect as Wa,useMemo as Ei,useRef as RA,useState as Bx}from"react";import{Edges as AA}from"@react-three/drei";import{useFrame as OA,useThree as gp}from"@react-three/fiber";import{DoubleSide as EA,Quaternion as DA,Vector3 as jo}from"three";import{Vector3 as oc,Plane as MA}from"three";var Ex={x:0,y:1,z:2},PA=e=>Math.min(Math.max(e,0),1);function kA(e,t){let r=1/0,n=-1/0;for(let o=0;o<8;o++){let i=new oc(...e.min);for(let l=0;l<3;l++)o&1<<l&&i.setComponent(l,e.max[l]);let a=i.dot(t);r=Math.min(r,a),n=Math.max(n,a)}return[r,n]}function Dx(e,t){if(!e.enabled||t.min.some((n,o)=>!Number.isFinite(n)||!Number.isFinite(t.max[o])||n>t.max[o]))return{cuts:[],intersection:!1};let r=(n,o,i,a,l)=>{let c=l?new oc(...l).normalize():new oc().setComponent(Ex[o],1),[d,p]=kA(t,c),m=d+(p-d)*PA(i),s=a?1:-1;return{id:n,direction:c,min:d,max:p,coordinate:m,plane:new MA(c.clone().multiplyScalar(s),-m*s)}};if(e.mode==="box"){let n=e.box??{min:[0,0,0],max:[1,1,1]};return{intersection:!!e.invertBox,cuts:["x","y","z"].flatMap((o,i)=>[r(`${o}-min`,o,n.min[i],!e.invertBox),r(`${o}-max`,o,n.max[i],!!e.invertBox)])}}return e.mode==="planes"?{intersection:!1,cuts:(e.planes??[]).filter(n=>n.enabled).map(n=>r(n.id,n.axis,n.position,n.flip,n.normal))}:{intersection:!1,cuts:[r("plane",e.axis,e.position,e.flip,e.normal)]}}function Tx(e,t,r){return e.length?t?e.some(n=>n.distanceToPoint(r)>=-1e-4):e.every(n=>n.distanceToPoint(r)>=-1e-4):!0}function ic(e,t,r){if(e.mode==="planes")return{planes:e.planes?.map(n=>n.id===t?{...n,position:r}:n)};if(e.mode==="box"){let n=e.box??{min:[0,0,0],max:[1,1,1]},o=[...n.min],i=[...n.max],a=Ex[t[0]];return t.endsWith("min")?o[a]=Math.max(0,Math.min(r,i[a]-.001)):i[a]=Math.min(1,Math.max(r,o[a]+.001)),{box:{min:o,max:i}}}return{position:r}}function _x(e,t,r,n){let o=r.clone().addScaledVector(n,-r.dot(n));if(o.lengthSq()<1e-8)return null;o.normalize();let i=e.direction.dot(o);if(Math.abs(i)<1e-8)return null;let a=t.clone().sub(e.origin).dot(o)/i;return Number.isFinite(a)?e.at(a,new oc).dot(n):null}import{DoubleSide as ac}from"three";function Lx(){let e=new Map;function t(r){let n=e.get(r);n&&(r.clippingPlanes===n.owned&&(r.clippingPlanes=n.planes,r.clipShadows=n.shadows,r.clipIntersection=n.intersection,r.side===ac&&(r.side=n.side),r.needsUpdate=!0),e.delete(r))}return{apply(r,n,o){let i=e.get(r);i&&r.clippingPlanes!==i.owned&&(e.delete(r),i=void 0),i||(i={planes:r.clippingPlanes,side:r.side,shadows:r.clipShadows,intersection:r.clipIntersection,owned:n},e.set(r,i)),r.side!==ac&&(i.side=r.side),!(r.clippingPlanes===n&&r.clipIntersection===o&&r.side===ac&&r.clipShadows)&&(i.owned=n,r.clippingPlanes=n,r.clipIntersection=o,r.clipShadows=!0,r.side=ac,r.needsUpdate=!0)},retain(r){for(let n of e.keys())r.has(n)||t(n)},restore(){for(let r of e.keys())t(r)}}}import{jsx as sc,jsxs as _A}from"react/jsx-runtime";function bp({section:e,box:t,modelRef:r,showHandle:n,onChange:o,onDraggingChange:i}){let a=gp(b=>b.gl),l=gp(b=>b.raycaster),c=gp(b=>b.invalidate),d=Ei(()=>Eg(e),[e]),{cuts:p,intersection:m}=Ei(()=>t?Dx(d,t):{cuts:[],intersection:!1},[d,t]),s=Ei(()=>p.map(b=>b.plane),[p]),f=s.length>0,u=Ei(()=>Lx(),[]);Wa(()=>{if(!f)return;let b=a.localClippingEnabled;return a.localClippingEnabled=!0,c(),()=>{u.restore(),a.localClippingEnabled=b,c()}},[f,a,u,c]),Wa(()=>{c()},[s,m,c]);let h=Ei(()=>new Set,[]);OA(()=>{f&&(h.clear(),r.current?.traverse(b=>{let S=b.material;if(S){if(!Array.isArray(S)){h.add(S),u.apply(S,s,m);return}for(let w of S)h.add(w),u.apply(w,s,m)}}),u.retain(h))});let v=Ei(()=>f?b=>{if(b.object.userData.riSectionHandle)return!0;let S=b.object;for(;S&&S!==r.current;)S=S.parent;return!S||Tx(s,m,b.point)}:null,[f,s,m,r]);nc(v),Wa(()=>{if(!f)return;let b=l,S=b.firstHitOnly;return b.firstHitOnly=!1,()=>{b.firstHitOnly=S}},[f,l]),Wa(()=>()=>i(!1),[i]);let x=p.find(b=>b.id===d.activePlaneId)??(d.mode==="planes"&&d.activePlaneId?null:p[0]);return!f||!n||!t||!x?null:sc(TA,{cut:x,box:t,onMove:b=>o(ic(d,x.id,b)),onDraggingChange:i},x.id)}function TA({cut:e,box:t,onMove:r,onDraggingChange:n}){let[o,i]=Bx(!1),[a,l]=Bx(!1),c=RA(null),d=new jo(...t.min).add(new jo(...t.max)).multiplyScalar(.5);d.addScaledVector(e.direction,e.coordinate-d.dot(e.direction));let p=new DA().setFromUnitVectors(new jo(0,0,1),e.direction),m=new jo(1,0,0).applyQuaternion(p),s=new jo(0,1,0).applyQuaternion(p),f=new jo(...t.max).sub(new jo(...t.min)),u=v=>Math.max(.01,Math.abs(v.x)*f.x+Math.abs(v.y)*f.y+Math.abs(v.z)*f.z)*1.08;Wa(()=>()=>n(!1),[n]);let h=v=>{c.current&&(v.target?.releasePointerCapture?.(v.pointerId),c.current=null,l(!1),n(!1))};return _A("mesh",{ref:v=>{v&&(ii(v),v.userData.riSectionHandle=!0)},position:d,quaternion:p,renderOrder:2,onPointerOver:v=>{v.stopPropagation(),i(!0)},onPointerOut:()=>i(!1),onPointerDown:v=>{v.stopPropagation(),v.target?.setPointerCapture?.(v.pointerId),c.current={point:v.point.clone(),view:v.ray.direction.clone(),at:v.point.dot(e.direction),cut:e.coordinate},l(!0),n(!0)},onPointerMove:v=>{let x=c.current;if(!x)return;v.stopPropagation();let b=_x(v.ray,x.point,x.view,e.direction);b!==null&&e.max>e.min&&r(Math.max(0,Math.min(1,(x.cut+b-x.at-e.min)/(e.max-e.min))))},onPointerUp:h,onPointerCancel:h,onClick:v=>v.stopPropagation(),children:[sc("planeGeometry",{args:[u(m),u(s)]}),sc("meshBasicMaterial",{color:"#22d3ee",transparent:!0,opacity:a?.22:o?.16:.08,side:EA,depthWrite:!1,toneMapped:!1}),sc(AA,{color:"#22d3ee",renderOrder:3})]})}import{jsx as lc,jsxs as jx}from"react/jsx-runtime";var hp=({colorPicker:e,onClose:t,itemMaterials:r,setItemMaterials:n,inline:o=!1})=>{let i=re();return jx("div",{className:`ri-popover${o?" ri-popover--inline":""}`,style:o?{padding:12}:{left:e.x,top:e.y,width:"min(225px, calc(100vw - 24px))",padding:12},onPointerDown:a=>a.stopPropagation(),children:[lc("p",{className:"ri-popoverLabel",children:i("color")}),lc(Pl,{color:r[e.objectId]?.hex??"#ffffff",onChange:a=>n(l=>({...l,[e.objectId]:{...l[e.objectId],hex:a}}))}),jx("div",{className:"ri-inlineRow",children:[lc("span",{className:"ri-colorCode",children:r[e.objectId]?.hex??"#ffffff"}),lc("button",{className:"ri-secondaryButton",onClick:t,children:i("done")})]})]})};import{jsx as Pt,jsxs as xn}from"react/jsx-runtime";var vp=({materialPopup:e,textureUrl:t,triggerFileUpload:r,clearTexture:n,canPlaceImage:o=!0,inline:i=!1,offset:a,rotationDegrees:l,onOffsetChange:c,onRotationChange:d,isPositioning:p=!1,onEndPositioning:m})=>{let s=re();return xn("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:[Pt("div",{className:"ri-popoverHeader",children:Pt("p",{className:"ri-popoverLabel",style:{marginBottom:0},children:s("material")})}),xn("div",{className:"ri-materialBody",children:[t?Pt("div",{className:"ri-previewFrame",children:Pt("img",{src:t,alt:s("texturePreview"),className:"ri-previewImage"})}):xn("div",{className:"ri-emptyState",children:[Pt("svg",{width:"24",height:"24",fill:"none",stroke:"currentColor",strokeWidth:1.5,viewBox:"0 0 24 24",children:Pt("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"})}),Pt("span",{style:{fontSize:12},children:s("noTextureApplied")})]}),o?Pt("button",{onClick:()=>r(e.objectId),className:"ri-uploadButton",children:s(t?"replaceImage":"uploadImage")}):Pt("p",{className:"ri-formatHint",children:s("noTextureCoordinates")}),t&&Pt("button",{onClick:()=>n(e.objectId),className:"ri-removeButton",children:s("removeTexture")}),o?Pt("p",{className:"ri-formatHint",children:"JPG \xB7 PNG \xB7 WebP"}):null,t&&(c||d)&&xn("div",{className:"ri-texturePosition",children:[Pt("p",{className:"ri-texturePositionLabel",children:s("texturePosition")}),xn("div",{className:"ri-texturePositionGrid",children:[xn("label",{className:"ri-texturePositionField",children:[Pt("span",{children:s("offsetX")}),Pt("input",{type:"number",step:.01,value:a?.[0]??0,onChange:f=>c?.(e.objectId,0,Number(f.target.value))})]}),xn("label",{className:"ri-texturePositionField",children:[Pt("span",{children:s("offsetY")}),Pt("input",{type:"number",step:.01,value:a?.[1]??0,onChange:f=>c?.(e.objectId,1,Number(f.target.value))})]})]}),xn("label",{className:"ri-texturePositionField ri-texturePositionField--full",children:[Pt("span",{children:s("rotation")}),xn("div",{className:"ri-texturePositionSliderRow",children:[Pt("input",{type:"range",min:0,max:360,step:1,value:l??0,onChange:f=>d?.(e.objectId,Number(f.target.value))}),Pt("input",{type:"number",min:0,max:360,step:1,value:Math.round(l??0),onChange:f=>d?.(e.objectId,Number(f.target.value))})]})]}),p?Pt("button",{type:"button",className:"ri-uploadButton",onClick:m,title:s("confirmTexturePosition"),children:s("donePositioning")}):Pt("p",{className:"ri-texturePositionHint",children:s("textureOffsetHint")})]})]})]})};import{Fragment as LA,useEffect as yp,useLayoutEffect as BA,useRef as xp,useState as wp}from"react";import{Fragment as Sp,jsx as zt,jsxs as Di}from"react/jsx-runtime";function Nx({entries:e}){return zt(Sp,{children:e.map(([t,r])=>{let n=r!==null&&typeof r=="object",o=n?Object.entries(r):[];return n&&o.length>0?Di("div",{className:"ri-left-panel__data-group",children:[zt("span",{className:"ri-left-panel__data-key",children:t}),zt("div",{className:"ri-left-panel__data-children",children:zt(Nx,{entries:o})})]},t):Di("div",{className:"ri-left-panel__data-row",children:[zt("span",{className:"ri-left-panel__data-key",children:t}),zt("span",{className:`ri-left-panel__data-value ri-left-panel__data-value--${typeof r}`,children:n?Array.isArray(r)?"[]":"{}":String(r)})]},t)})})}function jA({content:e}){let t=e!=null,[r,n]=wp(t),[o,i]=wp(t),a=xp(e);return t&&(a.current=e),yp(()=>{if(t){n(!0);return}if(r){i(!1);let l=setTimeout(()=>n(!1),300);return()=>clearTimeout(l)}},[t,r]),yp(()=>{if(r&&t){let l=requestAnimationFrame(()=>i(!0));return()=>cancelAnimationFrame(l)}},[r,t]),r?zt("div",{className:`ri-left-panel__action-extra${o?" ri-left-panel__action-extra--open":""}`,children:zt("div",{className:"ri-left-panel__action-extra-inner",children:e??a.current})}):null}function Cp({isOpen:e,selectedObject:t,currentAction:r,onClose:n,onAction:o,renderActionExtra:i,translateDefaultActions:a=!1}){let l=re(),c=xp(null),d=xp(()=>{});BA(()=>{if(!e)return;let u=c.current,h=document.activeElement;return d.current=()=>{h instanceof HTMLElement&&h!==document.body&&h.isConnected?h.focus({preventScroll:!0}):u?.closest(".ri-viewerLeft")?.querySelector(".ri-canvasArea")?.focus({preventScroll:!0})},()=>{u?.contains(document.activeElement)&&h instanceof HTMLElement&&h.isConnected&&h.focus({preventScroll:!0})}},[e]);let[p,m]=wp(t);yp(()=>{t&&m(t)},[t]);let s=t??p,f=s?Object.entries(s).filter(([u])=>u!=="actions"&&u!=="decals"):[];return zt("div",{ref:c,inert:!e,className:`ri-left-panel ${e?"ri-left-panel--open":"ri-left-panel--closed"}`,children:s&&Di(Sp,{children:[Di("div",{className:"ri-left-panel__header",children:[zt("p",{className:"ri-left-panel__title",children:s.label}),zt("button",{onClick:()=>{d.current(),n()},className:"ri-left-panel__close-btn","aria-label":l("closePanel"),children:"\u2715"})]}),f.length>0&&zt("div",{className:"ri-left-panel__data",children:zt(Nx,{entries:f})}),zt("hr",{className:"ri-left-panel__divider"}),s.actions&&s.actions.length>0&&Di(Sp,{children:[zt("div",{className:"ri-left-panel__actions-label",children:l("actions")}),zt("div",{className:"ri-left-panel__actions-list",children:s.actions.map((u,h)=>{let v=r?.action.id===u.id&&(r.binding===s||r.binding?.id===s.id||r.binding?.modelObjectId===s.modelObjectId||r.objectId===s.id||r.objectId===s.modelObjectId),x=i?.(u.id);return Di(LA,{children:[zt("button",{onClick:b=>o({objectId:s.modelObjectId||s.id||"",action:u,binding:s,screenX:b.clientX,screenY:b.clientY}),className:["ri-left-panel__action-btn",`ri-left-panel__action-btn--${u.id}`,v?"ri-left-panel__action-btn--active":""].filter(Boolean).join(" "),"data-action-id":u.id,"data-label":u.label,children:a?l.message(u.label):u.label}),zt(jA,{content:x})]},h)})})]})]})})}import{useMemo as IA,useState as zx}from"react";import{Boxes as zA,Focus as VA}from"lucide-react";import{useState as NA}from"react";import{jsx as wn,jsxs as Xa}from"react/jsx-runtime";function Ix({openButtonLabel:e,openButtonAriaLabel:t,eyebrow:r,title:n,searchValue:o,onSearchChange:i,searchPlaceholder:a,children:l,isOpen:c,onToggle:d,openButtonIcon:p,closeButtonIcon:m,closeButtonAriaLabel:s}){let f=re(),[u,h]=NA(!1),v=c!==void 0?c:u,x=b=>{c===void 0&&h(b),d?.(b)};return Xa("div",{className:`ri-sidepanel-wrap ${v?"ri-sidepanel-wrap--open":"ri-sidepanel-wrap--closed"}`,children:[!v&&Xa("button",{type:"button",className:"ri-sidepanel__open-btn",onClick:()=>x(!0),"aria-label":t,title:f("openPanel"),children:[p,e?wn("span",{children:e}):null]}),Xa("div",{className:`ri-sidepanel ${v?"ri-sidepanel--open":"ri-sidepanel--closed"}`,"aria-hidden":!v,children:[Xa("div",{className:"ri-sidepanel__header",children:[Xa("div",{className:"ri-sidepanel__header-top",children:[wn("span",{className:"ri-sidepanel__eyebrow",children:r}),wn("button",{type:"button",className:"ri-sidepanel__close-btn",onClick:()=>x(!1),"aria-label":s,title:f("close"),children:m??wn("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:wn("path",{d:"M1 1L11 11M11 1L1 11",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"})})})]}),wn("p",{className:"ri-sidepanel__title",children:n})]}),wn("div",{className:"ri-sidepanel__search-wrap",children:wn("input",{className:"ri-sidepanel__search",type:"text",placeholder:a,value:o,onChange:b=>i(b.target.value)})}),wn("div",{className:"ri-sidepanel__list",children:l})]})]})}import{jsx as Sn,jsxs as FA}from"react/jsx-runtime";function Mp({objectBindings:e,onAction:t,onFocus:r,onHover:n,isOpen:o,onToggle:i,isolatedKeys:a=null,onIsolate:l}){let c=re(),[d,p]=zx(null),[m,s]=zx(""),f=IA(()=>Object.entries(e).filter(([u,h])=>{let v=m.toLowerCase();return u.toLowerCase().includes(v)||(h.label??"").toLowerCase().includes(v)}),[e,m]);return Sn(Ix,{openButtonLabel:"",openButtonAriaLabel:c("openSceneObjectsPanel"),openButtonIcon:Sn(zA,{width:16,height:16,"aria-hidden":"true"}),eyebrow:c("sceneObjects"),title:c("visibleEntries",{count:f.length}),searchValue:m,onSearchChange:s,searchPlaceholder:c("searchNodesLabels"),isOpen:o,onToggle:i,closeButtonAriaLabel:c("closeSceneObjectsPanel"),children:f.map(([u,h])=>{let v=h.visible!==!1,x=d===u,b=a?.has(u)??!1;return FA("div",{onClick:()=>r(h),onMouseEnter:()=>{p(u),n?.(h)},onMouseLeave:()=>{p(null),n?.(null)},className:`ri-sidepanel__row${x?" ri-sidepanel__row--hovered":""}${a!==null&&!b?" ri-sidepanel__row--setAside":""}`,children:[Sn("button",{type:"button",className:`ri-sidepanel__label ri-sidepanel__labelButton${x?" ri-sidepanel__label--hovered":""}`,onFocus:()=>{p(u),n?.(h)},onBlur:()=>{p(null),n?.(null)},children:h.label??u}),l?Sn("button",{type:"button",onClick:w=>{w.stopPropagation(),l(h)},className:`ri-sidepanel__isolate-btn${b?" ri-sidepanel__isolate-btn--active":""}`,title:c(b?"showAll":"isolate"),"aria-label":c(b?"showAllObject":"isolateObject",{name:h.label??u}),"aria-pressed":b,children:Sn(VA,{width:14,height:14,"aria-hidden":"true"})}):null,Sn("button",{type:"button",onClick:w=>{w.stopPropagation(),t?.({objectId:u,action:{id:"toggle-visibility",label:"Toggle Visibility",type:"command"},binding:h})},className:"ri-sidepanel__vis-btn",title:c(v?"hide":"show"),"aria-label":c(v?"hideObject":"showObject",{name:h.label??u}),children:Sn("span",{className:`ri-sidepanel__checkbox${v?" ri-sidepanel__checkbox--checked":""}`,children:v&&Sn("svg",{width:"9",height:"9",viewBox:"0 0 10 10",fill:"none",children:Sn("path",{d:"M1.5 5L4 7.5L8.5 2.5",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})})})})]},u)})})}import{useEffect as Gx,useId as HA,useRef as Ux,useState as $x}from"react";function Vx(e,t){let r=[];for(let[n,o]of Object.entries(e))(t.bindings[n]??o).visible!==!1&&(t.setAside.has(n)||r.push({key:n,binding:o,label:o.label||n}));return r}function Fx(e,t,r){if(r===0)return null;switch(e){case"ArrowDown":case"ArrowRight":return Math.min(t+1,r-1);case"ArrowUp":case"ArrowLeft":return Math.max(t-1,0);case"Home":return 0;case"End":return r-1;default:return null}}function Hx(e,t,r){let n=r.toLocaleLowerCase();if(!n)return null;let o=[...n].every(l=>l===n[0]),i=n.length>1&&!o?t:t+1,a=o?[n,n[0]]:[n];for(let l of a)for(let c=0;c<e.length;c++){let d=((i+c)%e.length+e.length)%e.length;if(e[d].label.toLocaleLowerCase().startsWith(l))return d}return null}import{jsx as cc,jsxs as Wx}from"react/jsx-runtime";var GA=600;function Xx({objects:e,selectedKey:t,onHighlight:r,onSelect:n,onClearSelection:o}){let i=re(),a=HA(),[l,c]=$x(!1),[d,p]=$x(null),m=Ux({query:"",at:0}),s=d?e.findIndex(w=>w.key===d):-1,f=s>=0?e[s]:null;Gx(()=>{t&&e.some(w=>w.key===t)&&p(t)},[t,e]);let u=l?f?.binding??null:null,h=Ux(r);h.current=r,Gx(()=>{if(l)return h.current(u),()=>h.current(null)},[l,u]);let v=w=>{w!==null&&e[w]&&p(e[w].key)},x=w=>{let P=f?s:-1,y=Fx(w.key,Math.max(P,0),e.length);if(y!==null){w.preventDefault(),v(P<0&&w.key!=="End"?0:y);return}if(w.key==="Enter"||w.key===" "){if(!f)return;w.preventDefault(),n(f.binding);return}if(w.key==="Escape"){if(!t)return;w.preventDefault(),w.stopPropagation(),o();return}if(w.key.length===1&&w.key!==" "&&!w.ctrlKey&&!w.metaKey&&!w.altKey){let M=Date.now(),_=m.current;_.query=M-_.at>GA?w.key:_.query+w.key,_.at=M,w.preventDefault(),v(Hx(e,P,_.query))}};if(e.length===0)return null;let b=`${a}-option`,S=`${a}-hint`;return Wx("div",{className:`ri-objectNavigator${l?" ri-objectNavigator--focused":""}`,children:[cc("div",{role:"listbox",tabIndex:0,className:"ri-objectNavigator__list","aria-label":i("objectNavigator"),"aria-describedby":S,"aria-activedescendant":f?b:void 0,onFocus:()=>{c(!0),f||p(e[0].key)},onBlur:()=>c(!1),onKeyDown:x,children:f?Wx("div",{id:b,role:"option","aria-selected":f.key===t,"aria-setsize":e.length,"aria-posinset":s+1,className:`ri-objectNavigator__option${f.key===t?" ri-objectNavigator__option--selected":""}`,children:[cc("span",{className:"ri-objectNavigator__name",children:f.label}),cc("span",{className:"ri-objectNavigator__position","aria-hidden":"true",children:i("objectNavigatorPosition",{position:s+1,count:e.length})})]}):null}),cc("div",{id:S,className:"ri-objectNavigator__hint",children:i("objectNavigatorHint")})]})}import{RotateCcw as PE}from"lucide-react";import{useRef as pt,useEffect as Ti,useMemo as Pr,useCallback as uc,useSyncExternalStore as XA}from"react";import{useThree as qA,useFrame as KA}from"@react-three/fiber";import{Sphere as QA,PivotControls as JA}from"@react-three/drei";import{Vector3 as hr,Vector2 as YA,AdditiveBlending as Pp,TextureLoader as ZA,Matrix4 as eO,Quaternion as _i,Euler as dc}from"three";var qx="data:image/png;base64,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";var Kx="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAACXBIWXMAAC4gAAAuIAHVHB4bAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAIABJREFUeJzt3Xd4HOXVBfBzZ1eSe6djYqoNwloZDJgaJ0AgIZ2IAJINIcS00D5CCASCCaQBAULHAWIsyQYEhEAILQ6mmRI3ych0MGCae5VVdud+f0gQbFyk3Zm5U87veXgSZM3MAaSZszPzvq+AiBJD761IYVjxN+DK4RDZFnBbAXkb6jwk5ZNmW+cjouCIdQAiCobWj9kPcO8ApHQj3/IYnOw4GX73B4EGIyITLABECaD1Y74O6CMAum3mWxchp6Nlr9p5QeQiIjssAEQxp40VA5AteQPAwE5u8jbWtAyXA+rW+pmLiGw51gGIyGe5bmej8xd/ANgZPYpP9ysOEYUDCwBR3Kn+sMvbiHOcD0mIKERYAIhiTBUCYGgeW5Z2bEtEMcUCQBRnDWN6ACjKY8tuHdsSUUyxABDFWbo5/0/xhWxLRKHHAkBERJRALABEREQJxAJARESUQCwARERECcQCQERElEAsAERERAnEAkBERJRALABEREQJxAJARESUQCwARERECcQCQERElEAsAERERAnEAkBERJRALABEREQJxAJARESUQCwARERECcQCQERElEAsAERERAnEAkBERJRALABEREQJxAJARESUQCwARERECcQCQERElEAsAERERAmUtg5A9rSxohjZ4uMAORaCDFRKIPo2VP8NOH+VTPW71hmJqGu04fidoHIyRA6Dys4QbYFiDoC7kW65W0rrWq0zki2xDkC2dO6xg6Hp+6HYZyPf0gLgtyir+YMINMhsVDhtrOiFbMmqvDZOt/SW0rrVHkcin6lCUF91MQS/BlCy4e+SlwH3aMnULgg0HIUKHwEkmDZWDICbfnITF3+g/QTyOzRU3hxULiIqQH3VrRD8Fhu9+AOA7gvIE9pwfP/AclHosAAkWVvJ1QCGdu6b5VSdU3mSr3mIqCA6p/IkCMZ18tt3hzpX+hqIQo0FIKG0vnJ7CMZ2aSNxrtJXxw70KRIRFUAbju8PkT91cbOTdO6xg30JRKHHApBYcjSAVNe20QFo1Yt9iUNEhdHUbwAM6uJWDnKp7/sRh8KPBSC5hue3mZ6h9VWdfGxAREFo/53UM/La2JFSj+NQRLAAJJYW57lhEQR/9jQKERWm/XeyKK9tXeR7LqCIYwFIKpH5eW+rOErrq470LgwR5UvrKw+F4qgC9jDfszAUKSwASaV4ssAdXK1PjeZEUkSGOn4H/1LYTjDVmzQUNSwACSWZmmcBmVnAHkoxcPAp3iUioi4bOPgUoJBn+DJTRtQ+710gihIWgCRz3bOBAmb3U72cwwKJbGjD8f2hOr6gnQjO8yYNRRELQILJiNrnIagrYBf9OSyQyIg6l6Lrw/6+QO6RsuqnPctDkcMCkHSq5wFYU8AOfq5zTuAwIqIAdQzFPb2AXaxFLneBV3komlgAEq5jMZCrC9hFGk6uq7OPEVFhrkG+w/7aXSl7TX7PqzAUTSwABKxp+ROA/E8GHBZIFBitrzwUwLcK2MUCQK7yKg9FFwsAQQ6oWwvgwgJ3c43OGFfIJxIi2gy9tyIFyHWF7UXOl0x1AY/9KC5YAAgAIJmaKQCeKWAXu6N4bWdXISOifAwrOQ3Annlvr5iOsup7vAtEUcYCQP+jzjkAcvlvz2GBRH5pH/aHSwvYhYuUnC1SwNBfihUWAPqclE+aDeBvBeyCwwKJ/FL4sL87ZHj1DM/yUOSxANB65NcAVuS/PYcFhsrCRc0A3Dy2zHVsSyGgDccNQ2HD/lYhnfqNV3koHlgAaB2SqV4I1csL2AWHBYaIfG1aFsBHeWz6Xse2FAaayn+1PwBQjJfSiZ94F4jigAWAvizb83oAr+e9PYcFhs3jeWzzsOcpKC8FD/tTvIWe/W/yLhHFBQsAfYmMnNAGt+A5wjksMDyuAtCVT/NrkXau8SsMdZ4nw/4cOVt2vaHFo0gUIywAtEEyouYRAI8WsAsOCwwJydS8DnT67XGF6jgpnfS+n5mokwof9veklFX/y7tAFCcsALRxaZwFoDXv7TksMDQkU/N7iFwAoG0T37YMqkdLeW1NULlo4zwY9tcGwZmeBaLYYQGgjZLSmregKOTZIYcFhoiUVV8J1y0F9HoI5qF9EajFAF4E5CKIu7OU1/7dOCZ9ptBhf4IbOu7+EG2QWAegcNMXK/ugu7wOYOs8d5GFpsql/K5GL3MRxZk2HDcMmmpA/m/+L4SbHiojJi73MhfFC+8A0CbJqNqVECnkNiSHBRJ1VaHD/kQv5sWfNocFgDZv+M63A8h/BjEOCyTqNA9W+5uD11rv9CoPxRcLAG2WyHgXrp4DFDSHOIcFEm2GPjU6XfCwP5Fz5Ji6/Nf0oMRgAaBOkRG1z0NQV8Audkdx0ymeBSKKo/7bFTbsD3KPlFU/7VkeijUWAOo81fPQ/uZ4ntvjtxwWSLRh2nB8f4gUMl//WuRyF3gWiGKPBYA6TTK1CwBcXcAuOCyQaGMKXu0PV8pek9/zKg7FHwsAdc2alj8BKOAkw9UCidbnwWp/CwC5yqs8lAwsANQlckDdWgAXFrALDgskWl+hw/4g50umOv/Hc5RInAiI8qL1VU8DOKSAXXxTMjWPeZWHKKrah/3Jv/PfAaYjU3OQSEGjdCiBeAeA8qPOOQAKGWrEYYGUeB4M+3ORkrN58ad8sABQXqR80mwAfytgFxwWSFT4sL87ZHh1/pN0UaKxAFAB5NcAVuS9OYcFUoJ5MOxvFdKpQranhGMBoLxJpnohgCsK2EV/tLqXeJWHKFJUxqOQYX+ql0npxE88y0OJwwJAhUm3XA+gkCVHz+CwQEqa9mF/clr+O8Bb6DngRg8jUQKxAFBBpLSuFS7OK2AXHBZIyVPosD9HzpZdb2jxLhAlEYcBkie0vupfAL6Z9w7EOVzKJuU/FIooInRu1eFw8UQBu3hUMjWFrBZIBIB3AMgrkvs/AG15b6/upd6FIQoxVy8rYOu2jt81ooLxDgB5RudUXQPBuflujnR6W77UlB+dUdEX3Uu2QFYGQjAQLgZC3IFQDIRICRR9AQCCEgA9OjbrjfbS1tzx9yugcCHIQbES0CY4zhIolsDRJci6i5B2l6ClzxIZOaEp+H/K6NNZx26LVPrDvHcguEbKagp55Eb0ubR1AIoRTf8Wkq0CsEUeWwvaWncHwAKwAfpiZR+UYChSzhCoDgEwBMCOX/jfbsgCgAKKjmov/6v4na3663y/ANoxv4wLwHEA1wGKmqD1VcsAzIdgPlzMh8h8AO8CeBfp5jektK61gH/c+EoX7wF18916EXLpy72MQ8nGAkCekRETl2vDmIuhelt+OxA+ksJnnxKL9gZ0bwB7QFAKxTAAzucXZHv9AfSHYkR7WfhCrmxJVuur3gdkHqAzIdII15mHzF3zEj9jnZtzIHneeBW5WEZMXO5tIEoyFgDy1mvNd2BoyWkAyvPYupDhhJGkr44diJbc/nCcA6F6IIC9AfRY54IavUtmGsBOgO4E4NtQBSQHNFQt03q8AOh0uPI8cj1eTtyjBFdfRyqvAjAHrzXf4XUcSja+A0Ce04bjD4E6T3dxs5ckUzPKl0AhonOP2wpu6ggABwM4EMAwJPf3MAvBbCimQ/VpNGOqjKpdaR3Kb9pQ9TIU+3RpI3G/KmWTn/EpEiVUUk885DOtr5oI4ITOfjugh0umdqqPkUzovRUpDCsqB5zDoPgOgP3B0TcbkwNkDqD/hLgPY/jkWXF8ZJDHMMC7JFNzol95KLlYAMgXWj+mJ6AvolMLnchFkqn+g++hAqKNFb2QLfkOgB8AOAztz8up6z4C8ChEHkBr9ydl5IT8h5mGTMe7Mp15oa8BkAMkU73G91CUOCwA5BttOL4/1KkBsJFJS2QpgDMkU313kLn8oO+e2A0rc4cDbgUgPwDQyzpTzCwH9GHAqUNb98fiUAa0vuo4QG4EdMAGv0HwCHLpKr74R35hASBfqUJQX3k4HDkVigyAAYC8DXWnQpw/dywoFEl6b0UKQ7t9C9DjAXwHQE/rTAmxGIoHIKiRTM2z1mEKofVjtgT0fABfB7ATgKUQ1ENwC/as+XccH4FQeLAAEHWRzhm7HRy3CorTAHzFOk/CvQHBnVD5W5TLJJEFFgCiTmh/ma/716DuOLQ/2+cQ2nBpBeQJCCbhteYH5Ji6nHUgorBjASDaBG2sGIBst1MgeiYU21jnoU5QvAXRa9HWc2Li5hkg6gIWAKIN0PoxOwLuOYD8FHy2H1UrAL0LwFWSqV1gHYYobFgAiL5A6ytHAfILAN8HkLLOQ55ogUgtsu6fZa/aedZhiMKCBYAIgM4dWwbXvRhAhXUW8o0L4H4Al0imJnHTThOtjwWAEk3rx+wJ6G8A/Aj8fUiK9iLgur+WEZPftA5DZIUnPEoknTtmd7h6GXjhT7I2AHch7VwupZPetw5DFDSe+ChR2mcnlPGAnA4O5aN2rYDeipKSi2XYnauswxAFhQWAEkGfGp3GwMEnQfUKAFtY56FQ+ggil2H4zreLjHetwxD5jQWAYk/rKw8F5FoAw62zUBTITKicI+WTnrNOQuQnFgCKLZ0zdjvAvRGC71tnochRqN6FotbzpLRuqXUYIj+wAFDsqELQUDWm/VP/RlZaI+qchQDOl0zNJOsgRF5jAaBY0bkn7Aw3NwHtq6sReeVfSDuncbQAxQkLAMWCPjU6jQHbXQDIxQC6WeehWFoFwUUYXnMTl+mlOGABoMjT2ScOgZOtBnCQdZZQSfcGUr06/uoGON3bv+4UAVLc/v+1FWj5BGh6B+A1rbOmQp0TpHzSh9ZBiArBAkCRpg1jKqA6AUA/6yyBcoqBkm2A4i2A4i2gRYOAokFA8ZZAug+Q7oUu/XpnV0AWPQIseQJQjoDrhOWAnCaZ6rutgxDliwWAIklnVPRFuuQmCCqts/gu3RfosRPQbQdoyfZA98FA8daAON4fa/U8yHvXAW6z9/uOJa1GuvV0Ka1bbZ2EqKtYAChytL7qYEBqAR1sncV7AnTbDui5G7T7rkDPXds/1Qdp5WzIe9cGe8xoewPAcZKpmWUdhKgrWAAoUrRhzDio3gigyDqLZ9K9gV7Dob2GA73L2v/emLx/PbBihnWMKGkB8HPJ1NxuHYSos1gAKBJ0ekV39Ci+GSInWmfxRMnWQN/9oL3L22/vh+1XcVU9ZP6frVNEkFZjTespckDdWuskRJsTsrMO0ZdpY9UuyOIBRH0q3+ItgH6joH32Bbp/xTrNpuWaIPNOtU4RVbPgpo+WERPnWwch2hQWAAo1nVP5bYjUAOhrnSUvTkn7Rb//V4Eeu1in6RJ55SeA5qxjRNUiuDhGRtRMsw5CtDEsABRaHc/7b0IUl+3tPgTafzTQb38g1d06TdfxDoAXslD8XMprbrMOQrQhLAAUOh1z+V8K4FLrLF0iDtB3H+jAI4EeO1unKQxHAnhIr0dZ7TmcPZDChgWAQkXrx/QE3FpAvmedpdOcbsCAQ6ADj2h/zh8DMv/PwKp66xhxUoc+6bGy40ROsEChwQJAoaGNJ26NXPYhKPaxztIpqR7tF/1B3wBSPa3TeGf5S5APbrJOEUdPI93yQy4vTGHBAkChoI1jd0CbOxWC8L8p53QDBn0DOujI9nn242Tl7PaLv9tqnSSuXoU6h3MdAQoDFgAyp/VjdgR0KoAdrbNskqSBQYdDB307FJP1eKp1IWTRw8DSZ8BFgXz3LsQ9TMomv2MdhJKNBYBM6dwxu8PVfwPY1jrLJvXZG7rNccFPy5sPtxVoWwJkVwG51UB2NZBbBcmtaf9zzQJuS/v/z64AWhcCzQvs8ibT+3Ddw2TE5Detg1BysQCQGa2v2gvA4wAGWWfZqG6DodscD/QqtU6yLs21L+Pb/AGk5QOgdVHHX4vbL+oUBZ/Ccb4hwyc1WAehZGIBIBNaXzkKkMcQ1gl+nG7QrX4EDDzMn1X3uqp1IbDmDUjTm8Dad9s/sWvWOhUVbknHOwGzrYNQ8rAAUOD0laoMcvIfQAdYZ9mg3hnoticAxYY3JtqWAqsaIKtfAZreANqW22Uhvy2GpkZL+V2N1kEoWVgAKFBaXzUUwNMAtrLO8iXp3tCtjwf6H2hwcAWa3oasnNU+/r75A4MMZGghgEMkU/O6dRBKDhYACkzHoj5PI4wv/PUZAd3up0C6T7DHXfsuZMVLwPKX2l/cowSTD+CmDuEiQhSUyBQAnXvcVlDpiVzxUhkxkfdDI0bnHjsYbuoZQIYYR1mXUwzd+jhg4NcR2K9DdiWw7FnIsqfbX+Qj+oziLbjZr8ped39kHYW6RuvHbAnJ9UJr2xIZWReJN3FDXQD0xco+6I5fATIWwHYdX3YBNEDkFnTvd5fsekOLYUTqBJ1x3CAUpaYD2NU6yzq6fwU6+DSgJIgbEgqsngdZNg1YMZMv8NGmvIK2loOichFJMn3zzBKsXfYzqJwB6LAv/NFciNyGJR/cJl+bFtpf9tAWAJ1VuQdSzmOADt7Et70NwS+krObBwIJRl+i7J3bDiuxUCA6wzrKOgV+HblPVPrmPnzQLLH8RsvhRPtenzhNMQ/f+R/IDTnhpQ9X3obgawKZW/pqBNnxXRtZ8HFSurghlAdBXxw5EmzsXim06uclUiJ4rZbVzfQ1GXdK+qt+YGkCPt87yOSlqf8N/wCH+HsdtBpZMhSx5Amhb5u+xKK6moKymkqsIhos2VA6HyrUADu3kJq9jre4ro2pX+pkrH+EsAPVjJgD6sy5ulgXwVxQ7l8juk/g2VQhofdWVAM63zvG5ooHQHX7u71K9mm1/vv/pA5yQh7wwXjI1l1mHoI4Ppq3u5QB+BqCrtw5vlkzNGT7EKkjoCoA2nrg1stn3ABTnuYtlAC5DW4+bZeSENg+jURdofdXJAP5qneNzPYdBdzjTvzn8NQssndY+nz4/8ZN3FNCfSKb2LusgSaUzxhWhqOl0AJcC6J/nblZhTctWckDdWg+jFSwEU5ytp63tMOR/8Qfa/wNdh6KmV3RO5bc9SkVdoHOrDgdwi3WOz/XdF7rj+f5d/Fc3Qt66BPLRJF78yWsCyAStrzrYOkgSacPYw1DUNAvAdcj/4g8AvdG9eC+PYnkmfAXAkd082tNuEHlYG6r+2TH5DAVAG8fuABeT0fVbZP4YdAR0hzMAKfJ+3y2fQN67FvLun4Bmru5KvikGUKdzxm632e8kT2h91VBtqPon1H0SwJ6e7DQlQzzZj4fCVwDU44nXFUcBmKtzqq7R2Sf283TftA5998RuyLr3IwyL+0gKut3J0G0q4fmTLm2DfHof5M0LgZWcwp0CsRXEvU/fPLPEOkic6ewT++mcqmsAzO24dsRa+AoA9A0fdloEwblwsm/onKpT9N6KlA/HoFW5mwCMtI4BSUMHn+HPm/5Nb0LevARY+FD7inxEwRmFpmXXWIeII723IqVzqk6Bk30DgnMBeH/L0HVDt/Rz+ApAsfMIAL/Gvm4Bwa0YWjJX66uO9OkYiaT1ladD9STrHHCKoV85B+jrcQ9xWyEfTYK8fQXQwknayMzpOqfS/vcsRnR21WjsVjITglsBbOHTYRbgjbaZPu07b6EbBQAAOqfqmo4W5jP5JyR3tpRNfsf/Y8WXzjl+X4jzLAp7ebNwTkn7xb9Xqbf7bV4A+eAWTuRDYbEWKewve9bUWweJso7pyX8HyBj/D6Y/lfLaO30/TheFswDMGNcDRU2PAzgogMM1A3ot0q2/l9K61QEcL1a0fkxPQGcB8Orlzfw43aA7/hLosYuHO1Vg0b8gn97PqXspXATz0NpjHxk5ock6StRoY0UvZIsvAuRcAN0COOTtKKsZF8YJncL3CACAjJzQhHTLNwH5K+D7v7RugFyIXMkbWl95gur4UP47CS3VG2B+8S+GDvk/by/+udWQ+VdDPrmHF38KH8UeSK+50jpGlKiOd7S+8gTkSt4A5EL4f/FfDdWzwnrxB0J6B+CLdHblPnDwF0D2D+aIMhMq50j5pOeCOV506ZwxP4To/aYhJA3d4SygT7l3+1z7HuT964HWRd7tk8h7CuD7kql5yDpI2Onsyn0gcl1Aa5IogPuQdn4hpZPeD+B4eQt9AQA+m1O+agyAPwHYOpijyj/hps7k2twbpnPGbgdx6wEMNAshDnTw6UDffb3b5/LpkA/vBNxW7/ZJ5J9FaEMmrIvNWGs/T+X+AEgVgrnezYI6Z0flA2QkCsBnOp43nw/gVwCCGA/bBMUNKGq5gu8H/I/qeAcNbz0J4OumObY72cOhfgr55F5g0SMe7Y8oMI+hrOZbYb3NbEGnV3RHr5KzoPg1AJ+mAF3HEgCX4/WWG+WYusiMD45UAfiMNlbtgix+D6AioEN+COAilNVU85cM0IYxZ0D1RtMQW30fuuUPvdmXZiELbgeWT/dmf0SBk5MlU32HdYow0Pox3wHc6wEZEsDh2gC9BW2tv5GRdZFb/SuSBeAzWl95KCDXwaupGjdLXobIOVI26YVgjhc+OuvYbZFKzwPQ1yxEv1HQwafBkx/f3GrIe9cDa14rfF9EdlZAnVIpn5TYOam1vmovtM/ZH9S6CVMBOUcy1a8EdDzPRboAAIA+NTqNgYNPgurvEMwUtApoDdJFv5TSiZ8EcLxQ0fqqfwD4rlmAnkOhO14AiAdLDWRXdMzjv6DwfRHZu18yNT+yDhE0nXHcIBQ5lwByBoAgZnl9GyIXSll1XQDH8lXkC8BntLFiALLFlwb4Q7AGwNXok/6j7DixOYDjmdOGyuOhUmsWoGggdJfferOqX9uS9ot/S+I6HMWZytFSXv2AdYwgfL5Mr+C3UPQJ4JBNAK6K0zk/NgXgMzp3zO5w3WsBOSKgQ74P4BLJ1EwK6Hgm9NWxA9HqzgOwpUkAKYLufDHQfcfC99W6GPLuH4HWhYXviyhcPoG4e0jZ5FivS93+nF+vBbBzEIdDRIb1dVXsCsBnOn5A/gLAgytGZ8hTcOQcGT6pIZjjBUvrqyYCOMHs+Nv/DOjvwaO91oWQd34HtMX6/EhJJrhNympOtY7hB204bhg0dQ2AbwZ0yEgN6+uq2BYAANDGimJkS04DcDmCGQriAloLOL+QTHVsPl5qw/F7Q52XYTVz5MBDodt60D3alkHeuYIT/FDcuRB3XymbHLrFZ/L1hUe8pwPw4AWgzYrksL6uinUB+IzWV24POH8C9DgE88+8DILfYHjNTVEfNtgxCdOzAA40CdD9K9CdLy38pb/sCsg7vwdaOF8KJcLzKKs5OPrnn/EO6t88AyKXAegfwCHbILgBrS2/jeKwvq5KRAH4jM6tOgAu/oKg1qxXPIie/Y+VXW/wa3lj3+mcMWMgavN+g1Pc/tJfybaF7Se3tv22f3OsHt8RbZrIMVF+U11nVPRFUcn9AA4N6IiPQ9xzpGxKYsYEJ2rhGxleMx1lu+wH1Z8C8P/1b8H3sWZZZCfn0BnjekD0CrPjb31c4Rd/zUE+uJEXf0oexZ91xrge1jHyoU+NTqOo5CEEcfFXvAXIdyVTe2SSLv5AwgoAAIiMd6W89k6s1aEArgLg76TvgkqdXXWUr8fwS3rNhQB2MDl27wwwsPCZhuXjGmDVXA8CEUWNDkbx2v+zTpGXAdufAcCreb43ZjVUL0TP/ntKpvphn48VSol6BLAhAU0r/B/J1AR0G8sbHTP+vQWge+AHT/eG7vrHwsf7L/pn+/z+RMm1GpCdo/RScsd7R28B2MmvQyCmw/q6KnF3ANYnpTVvSabmGEAPA+DXlI6jtbGil0/79oeTuggWF38Auk1l4Rf/1a9APr3Pm0BE0dULohdYh+iSOcfvAv8u/rOgziGSqTkm6Rd/gAXgc5KpnYq2HnsBOAeA14PEHWS7DfF4n77RxrE7QORkk4P3zgD9Clyyu3Ux5P2bAXW9yUQUZYrT20dCRYSTGuzDXj8F5GSU7bJPXMf054MF4Atk5IQ2ydT8BW253SC4DYB34z/Vic5wnKz7GwSz3PK6nBLotmML24e2Qd6/Hshx9WaiDt2g+JV1iE5z1MtpdtsguAZtLUMlU32HyHh+KviCxL8DsCkeTivchj7pPlGYP7rjnYh5AIoCP/Y2VcCgbxS0D1nwV2DZsx4lIoqNNkCGSqb6Xesgm6OvndQbLa3LUPiaLlOhqbOl/K5GL3LFEe8AbIIMr35VMrVHAvJdAIX84jwWhYs/ACCHS2Fw8Ue37YCBBb4nueK/vPgTbVgRoBdZh+gMGXbnKgBP5r0DxVsQOUYyNYfx4r9pLACdIJnqh7GmpRQil6B9FcCuaIW6ZmPpu0LnnrAzFMeZHHubSkAKKPxtSyEf/s27QETxc6I2jrUZ1ttV4v4B6PIshv8b1hfhCZCCxALQSXJA3Vopq74C0GGATEZnfzgVZ0n55Jf9TeeRXPZcBLOU8rr6jgR67VnADhSyYAKf+xNtWhpt7jnWITpDyiY/A8G1nfx2BbQauexQKa/9Y5RnXg0a3wHIUyemFV4FkZ9GpYm2L7ZR8j6AnoEeWNLQ3f4IFBewyvDixyAfT/YuE1F8rYKb3kFGTFxuHWRzVCGorzoXgj9h4wsAzYA4Z0nZpBeCzBYXQayqFEsyvGa6KvZFQ9VBUFRBkEH7uPn3AEyFuJMitSZ3rtvpgAZ78QfaX/or5OLfuhjy6f3e5SGKt95IZU8B8CfrIJvTvpBRzTVaX3kvICcDOgoig6FYDKAR6kxGZtLzUV/wyBLvABD0zTNLsHbZu1BsE+iBnW7QoVcD6T5570LmX8Wpfom65iOkW3aU0jp/p0Gn0OM7AAQ0LRsT+MUfAAYdUdDFH8ue48WfqOu2RbbY5GVfChcWAAKAMwM/YqoHdFAB0yu4zZBP7vEuD1GiyNnWCcgeC0DCaX3lKABlgR934BFAKv/lEWThg0B2hYeJiBJlhDYcv7d1CLLFApB04vws8GM63dpv/+erdSGw+Anv8hAlksHvPoUKC0CC6Wsn9YZm1+SxAAAgAElEQVSqn8sgb9iA0UCqR96by8eTAc16l4coiRSV+tpJBS67SVHGApBkzW2VAII9AYgDHXhY/ts3vQmsnOVdHqLk6oWWtmOsQ5AdFoAkEw3+FmDffQsa988x/0ReMjgHUGiwACSUzj6+HMBegR934JH5b7x6XvtfROSV/bR+TCHzcFOEsQAklUjw44C77wj02CnvzWXhgx6GISIAgLo/to5ANlgAkkrk6KAPqQNG57/x6nnAmtc8y0JEHSw+DFAosAAkkNaP2Q/AzoEe1OkG9B2V9+ay5DEPwxDRF+ys9VWBPw4keywASaQa/C2/fvsDqe75bdvyMbCy3ts8RPQ/FucEMscCkDCqEAiCv/3f/5C8t5XFjwFc8IvIPyLHqnJxuKRhAUiaOZUHANgh0GMWbwn0yPOJQ241sPx5b/MQ0fp2QMOYfa1DULBYAJJG5DuBH7Pf/vlvu+x5wOWqpUS+U/fb1hEoWCwASSP4ZtCH1L75f7CQZU97mISINkqcwM8NZIsFIEF0RtU2AIYHetCSbYBug/PbtulNoHmBt3mIaCN0r45zBCUEC0CSFMm3gIBf9Om3X96byrJnPAxCRJshKMLh1iEoOCwAiaLB3/7vVZ7nhjlgxUxvwxDR5vAxQIKwACSEPjU6DeDQQA+a7g302DG/bVc1tI8AIKIgHaH3VqSsQ1AwWACSYtD2+wLoF+gxe5ch3ycOsvJlb7MQUWf0x25Fe1uHoGCwACSF4uDAD9krz/cNNQusnO1tGCLqJOcg6wQUDBaApFAcGOwBBci3AKx+Fcg1eRuHiDpHNOBzBVlhAUiAjik+81+JJx/dtm9/ByAPsnqux2GIqPOEdwASggUgCeYeNxTAFoEes+du+W+7igv/EBnaUhurdrEOQf5jAUgCTQd+S0977Jrfhq2L2lf/IyI7Od4FSAIWgCQQHBD4MfMtAKt4+5/InPI9gCRgAUgC1X0CPV5Rf6A4vycOsvZNj8MQUR5GWgcg/7EAxJw2VhQDGBroQbvnOfkPAKxhASAKgd11xrgi6xDkLxaAuNOS3QEUB3rM7l/Jb7vsCqB1obdZiCgfJUi3FPAmL0UBC0DcZaUs6ENqyXb5bbjmDW+DEFH+JBf4uYOCxQIQd6LB/xJ32yGvzaR5vrc5iKgAGuzS4RQ4FoC4EwRbAJxioHjL/LZd+763WYgofxL83UMKFgtA3Cn2DPR4JdsBkuePVfMCb7MQUf6UBSDuWABiTOvH9ASwbaAHzXP4H3KrgbYl3mYhogLo9vruid2sU5B/WADiTJ0hgR+zeFB+2zV/6G0OIiqUYIWb3ws9FAksALGWLWBAfn60KM8CwOF/RCGkgZ9DKDgsAHHmyJDAj5nvI4DWRd7mICIvsADEGAtAnKkMCfyYed4BED7/JwohlwUgxlgAYs3gl7eoX37b8Q4AUfiIsADEGAtArDl5zsmbJ3GAVI/8tm1b6m0WIiqcYIh1BPIPC0Cs6VaBHi7VE4Dkt212padRiMgDijxn9aIoYAGIt4GBHi3VO7/tNAu4Ld5mISIvBHsOoUCxAMSUzhjXA0D3QA+a7pXfdtnVANTTKETkiV6cDCi+WADiqntzngPyC5Dv8//cam9zEJF3Vri8CxBTLABx1WZw606K8tvObfY2BxF5J8XHAHHFAhBXKTf4OwCSzm87t83bHETkHVeDP5dQIFgA4iqH/oEfM98CoFlvcxCRh9wB1gnIHywAcSUa7AuAAAsAURwp+BJgTLEAxJU4JcEfM5XfdiwAROFlcS6hQLAAxJYWB37IfF/my67yNgcRechlAYgpFoC4chF8AWj5JK/NpPUjj4MQkYeCP5dQIFgA4kok+Na+9h2gbVnXttEcsGKmP3mIqHAW5xIKBAtAbBk8AlAXsugfXdtm8eMAlwImCi9XWQBiigUgtvKdladAS54Clr/Yue9d/Qrk0/v8zUNEhRGHjwBiKs9xWxR+Vq/WK2TBrdDWT4Etjtrw0EDNAosfg3x6f/sjACIKMeVMXTHFAhBfrWZHVrf94r50GtBvFLTbkPaFgrKrIGvfAVa8DLQtNYtHRF2gyqU6Y4oFIK5UWyBim6FtCbDoERinIKJCOA4LQEzxHYD4srsDQETxoS4LQEyxAMQVWzsReYLnkrhiAYgrVa6xS0SFE55L4ooFIK5U+ZYdERXOlcXWEcgfLABxJeAvLREVTnSRdQTyBwtAXDlp/tISUeGcLM8lMcUCEFctTbwDQESFW5XjuSSmOEQ7xrS+qhkA5/EmonytlkxNb+sQ5A/eAYi3T60DEFGkfWwdgPzDAhBngnesIxBRpL1tHYD8wwIQa8ICQET5U7xlHYH8wwIQZ6ps70SUP+E5JM5YAGKNdwCIqAC8AxBrLABx5vCXl4gK4Lg8h8QYC0CcrWpuBJC1jkFEkdSE17JvWocg/7AAxJgcULcWwGvWOYgoghRz5Ji6nHUM8g8LQPzNsg5ARBHkyEzrCOQvFoDY09nWCYgoglyeO+KOBSDuRHkHgIi6Ls27h3HHAhB3rb1mAGixjkFEkbIc81pesQ5B/mIBiDkZOaEJwH+tcxBRhCim8QXA+GMBSALVadYRiChCRJ6yjkD+YwFIAsE06whEFCn/sQ5A/mMBSII1rdPB9wCIqHMWoqy60ToE+Y8FIAHaJwTiYwAi6gSRf4pArWOQ/1gAEkP+YZ2AiCJA8aB1BApGenPfoLNP7Adky5GSLYII5DlVF8BCQGZJpnqNdRwzuew/kErfBECsoxBRaK3GmuZ/W4ewpDOqtkFah8Nx+lpnyY+2QeVjLP1gpnxt2ibXgtnoxUDnjN0N4v4OwPcAFHkd0UAzFPcjlbpUht+VyDWutaHqZSj2sc5BRKF1n2RqKqxDWNA5Yw/quOYdjHh8UFoByO1IN/9eSuuWbugbNvgIQOeMOQLizgDwI8Tj4g8A3SCohJubrXMqv20dxgRv7RHRpoj+3TqCBZ1TeSbEnQbgEMTj4g8AfQE9D9mSWTp3bNmGvuFLBUDnjtkdovcB6O17PBu9IVKn9WP2sw4SODc9GeDLPUS0QauRan3IOkTQtL7quxD5C4CUdRaffAWu+6jOOnbb9f/gy3cAXFwJoFcQqQx1A/RW1fGJeglSRkycD+A56xxEFEIi90pp3WrrGEHSGeOKAFyL+Hzq35htkUr9cf0vrnMB1PoxWwL6reAymSrHK2+Nsg4RONFq6whEFEa5u6wTBK6kaTSAnaxjBEOO1caKAV/8yvqfgPfbwNfiK6eHWEcIXBPuAbDWOgYRhYnOx/DJz1qnCFwOSfoQWIRc8TqPvte92KsOCjSONXG2so4QNBlVuxKQRL7oQ0QbIc4diZz8RzDQOkKw1r3mrVsAHCwLNIs5d7F1AhOO3mQdgYhCowWS/at1CCPJuuYplnzxb9ctANnsy0jSW+Kq060jWJDhNdMBzLDOQUShcLcMn/KpdQgTbqLOgzkAL33xC+sUANnr7o8AmRZkIkNvYNlHyXvm9RnVW6wjEFEIuAm+I9gvPRWCj61jBELwkGSqF37xS19+4c/BLwG0BpXJSA7inLG5aRJjral1CrDu7SAiShp9QUbU/tc6hRXZcWIzXLnAOkcAlgHuL9b/4pcKgAyvngHRnyC+JaAVIidL2aREz3ctB9SthUhymz8RAZAvjQ1PGimvrgbkd9Y5fLQEwPekbPI76//BBof8SVntZKh7MIDn/U4WsKkQ9wApq55oHSQUUs1/AZCoiT+I6DPaiLJd/mmdIgwkU30xVH8I4A3rLB7KQVGLtLOXZGo2+Lh7s7Mf6dwTdobmRgGyJaDF3mf0maIZqp8glZsuw+/+wDpO2OicqmsgONc6BxEFTPVYKa+9xzpGmKhC0FA1AsCeALaERHJ64DWA+wFSbc9ubBGgz8R9+kPaDJ0zdjuI+zaAEussRBQQxVt4o2WYHFOXs45CdpIz6x9tkJRP+hDQv1nnIKIg6WW8+BMLAAG53OUAmqxjEFEg5iKz62TrEGSPBYA65n/AzdY5iCgAqheJjHetY5A9FgBqV+z8EYKV1jGIyFcvIVP7iHUICgcWAAIAyO6TlsDF1dY5iMg3CnV+kchFf2iDWADof5pargbwvnUMIvKDTJHySc9Zp6DwYAGgz8kBdWuh+mvrHETkudVQ+aV1CAoXFgBaV6a2FvGbAZIo2QRXtA/5JfofFgBahwi0Y0EoPickioc3kGq51joEhQ8LAH2JDK+ZDqDaOgcReUDkXCmti+viblQAFgDaCDkfwDLrFERUCP2HlFX/yzoFhRMLAG2QZKoXQuQS6xxElLcWuHq+dQgKLxYA2rjXmm8FMMM6BhHlQXCljJj8pnUMCi8WANqojsVCTgGQtc5CRF3yOnqnf28dgsKNBYA2STI1swC9yjoHEXWaC+BnsuPEZusgFG4sALR5PQZcBsE86xhE1AmKmyVT86x1DAo/FgDaLNn1hhao/hQA1w8nCrf30K34IusQFA0sANQpkql9EcCN1jmIaBNUTpFhd66yjkHRwAJAndfW4yIAb1vHIKINUPxNyqsft45B0cECQJ0mIyc0Qd2fgdMEE4XNJ3Dc86xDULSwAFCXSPnkpwC53ToHEX2ByhlSNpkzd1KXsABQ17U1nw/IB9YxiAiA4F4pr37AOgZFDwsAdZmMrFsBuD8BHwUQWVsElTOtQ1A0sQBQXiRTOxXQG6xzECWayqmSqV5oHYOiiQWA8ten6AJAG61jECVS+1v/vPVPeWMBoLy1TzUqYwG0WWchSpgP+dY/FYoFgArSvlYAuOgIUXAUwMl8658KxQJAhVu64ApAXraOQZQIqjdLpuYx6xgUfSwAVDD52rQsJHsCgLXWWYhi7l0Utf7KOgTFAwsAeULKprwG4ELrHEQx5kKdsVJat9o6CMUDCwB5p6zmeiietI5BFEuKq6R80nPWMSg+WADIMyJQaHocAK5GRuQpbUTf9HjrFBQvLADkKRkxcT6AC6xzEMVIC5zU8e3Dbom8wwJA3iuruRVQLktK5I2LZfikBusQFD8sAOS59kcBqZ8CWG6dhSjinsPrLddah6B4YgEgX0j5pA8h+kvrHESRJVgJNz1GjqnLWUeheGIBIN9IWe1fATxqnYMoklTP6ninhsgXLADkL3V+BoBTlhJ1if5DMrV3WaegeGMBIF9J+aQPofoL6xxEEbIIjnuKdQiKPxYA8p2U194JxYPWOYgiQfUkGT7lU+sYFH8sABQQ5+fgowCizblDymv/aR2CkoEFgALR/igAXL+caOM+hJvm4zIKjFgHoGTRhqrHofiGdQ6iEPoml/mlIPEOAAUr644DwNXMiNZ1By/+FDQWAAqU7DX5PUAvsc5BFCIfQdzzrUNQ8rAAUPDKdr0ewPPWMYhCQfRkKZvMF2QpcCwAFDiR8S5yOg5Aq3UWIltaLWW1nC2TTLAAkAnZq3YeIFdZ5yAytARw+NY/mWEBIDs9+l0O4HXrGEQ29DzJVC+0TkHJxWGAZErnVH4DIo9b5yAK2NMoq/maCNQ6CCUX7wCQKSmvfQLAFOscRAFqgeRO5cWfrLEAkD0ndy44TTAlhl4uZVNes05BxAJA5joWPvm1dQ6iALyOdCtffqVQYAGgcCjb5TYI/msdg8hXoudKaR2Hv1IosABQKIiMdyE4B+BzUYorfYBj/ilMWAAoNGR4zXQoJlvnIPLBWo75p7BhAaBwKUr/AoKV1jGIPKX4g2Sq37WOQfRFLAAUKlI68ROo/NE6B5GH3kHfNF/8o9BhAaDw6dHvGijeso5B5AnBebLjxGbrGETrYwGg0JFdb2iB4FfWOYg88KyU1TxoHYJoQ1gAKJQkU3M/uGQwRZvCYZGl8GIBoBDTX4DDAimy5F4ZXjPdOgXRxrAAUGhJpvZFKP5hnYMoD61I68XWIYg2hQWAwq39XYA26xhEXaK4SUpr+CIrhRoLAIWaZGpeB/QO6xxEXbAcJc7vrEMQbQ4LAIVfuugyAGusYxB1iuIa2X3SEusYRJvDAkChJ6UTPwFwi3UOok5YDk3fYB2CqDNYACga2nJ/ArDaOgbRZlwlIyYutw5B1BksABQJMnLKYvAuAIXbEpQU89M/RQYLAEVHW+5KAKusYxBtkOrVMuxO/nxSZLAAUGTIyCmLocq7ABRGi9Gt5CbrEERdwQJA0eIWXw2+C0BhI3IVP/1T1LAAUKTIXn9bBL4LQOGyAk3urdYhiLqKBYCiJ5e9DkCrdQwiAIDiVhlVu9I6BlFXsQBQ5Mhed38EYIp1DiIAbRC90ToEUT5YACii5GpwpUCyplormdoF1jGI8sECQJEkmepXADxmnYMSLi3XWUcgyhcLAEWYXG2dgBLtUdmzpt46BFG+WAAosiRT/R8As6xzUFKxgFK0sQBQ1PEkTBYaOgooUWSxAFC0tfW4D8BH1jEocTjunyKPBYAiTUZOaAMw0ToHJcpqrNVa6xBEhWIBoOhLO7cByFnHoKTQGk78Q3HAAkCRJ6WT3odwSCAFRf5qnYDICywAFA+u8pksBUBfkEwNR55QLLAAUDxkdv0XoPOtY1DcCYsmxQYLAMWCyHgX4txhnYNibXnHqBOiWGABoPhIpW4HkLWOQTGlqJGRE5qsYxB5hQWAYkNKJ34C4AnrHBRTIjXWEYi8xAJA8SIcn00+ULyFsuqXrWMQeYkFgOKlteeDAFZZx6CYEdSIcPlpihcWAIqVjme0D1jnoJhRZ4p1BCKvsQBQ/DjgYwDykL4g5ZPesE5B5DUWAIqfPXeZCmCBdQyKCXFYKCmWWAAodkTGuwDuts5BsdCG1uw91iGI/MACQPGUAodskReelJFTFluHIPIDCwDFkuxZUw/gdescFHXCF0optlgAKL5U/2EdgSLNRTr1iHUIIr+wAFB8OakHrSNQpD3fMbskUSyxAFB8Dd/pJQg+to5BEcU7SBRzLAAUWx2jAR6yzkERpcqfHYo1FgCKOX6Ko7zMlRGT37QOQeQnFgCKt+4D/gPBSusYFDECvj9CsccCQLEmu97QApVHrXNQ1Li8c0SxxwJAScBPc9QVH2H45FnWIYj8xgJA8Se5xwHkrGNQZDzJpX8pCVgAKPakbPIyALOtc1BEqEy1jkAUBBYASgh90joBRYX8xzoBURBYACgZlAWAOkMbpXzSh9YpiILAAkDJUNT2PIA11jEo7BwWRUoMFgBKBCmtawXwrHUOCjl1+fyfEoMFgJJD9d/WESjUsmjGM9YhiILCAkDJkUrx9i5tyosyqpazRlJisABQcuw5aS4ALu9KG8Pb/5QoLACUGB2TuzxlnYPCSnj7nxKFBYCSRTDdOgKFUg7p5petQxAFiQWAEsZ9wToBhVKDlNattg5BFCQWAEqWJR/VA+CJntbHYkiJwwJAiSJfm5YFMNM6B4WMKgsAJQ4LACWQ8j0AWlcqzQJAicMCQAnk8GRPX7RQht/1tnUIoqCxAFDytGVfALjeO32Gt/8pmVgAKHFk5JTFAN6yzkEhIcICQInEAkBJxZM+deDQUEomFgBKqhetA1AouEi1zbIOQWSBBYCSSZw51hEoFN7mBECUVCwAlEyqDQBc6xhkrt46AJEVFgBKJMlUr4HiHescZEx1rnUEIissAJRcwk9/iedIg3UEIissAJRc7Y8BKMlUWAIpsVgAKLkc5ck/2VahrHq+dQgiKywAlFy5YhaAZGsQ4YyQlFwsAJRc5RPfA7DcOgaZ4SMgSjQWAEqsjk9/r1jnICPKFwAp2VgAKNmU7wEkVoovgVKysQBQwgnHgSdVNj3POgKRJRYASjaRN60jkIlFMmIi3/+gRGMBoGRLC5cFTiTlf3dKPBYASrY9dloAYK11DAocCwAlHgsAJZrIeBeCd61zUNDkbesERNZYAIhU+R5A0gjvABCxABDB4cUgaVyXpY8SjwWASPlpMHGK2vjfnBKPBYBI+GkwYZZJad1S6xBE1lgAiHIcEpYsnPuBCGABIAJG7PYBOBQwSVj4iMACQMShgEkjyiGARGABIPoMC0BSqLxnHYEoDNLWAYiCUlFRkZq/0h0GV7ZOOSpf/LNH/pvFln1lY5tSjDz3mrvFqCOOPuyLX3PVdVWcT4f0cV6rq6vLWWUjChLPeBR7Bx11VP+2tuILIfITKAZZ56FQWwjVW9dKrysbnqheYx2GyE8sABRr+x7xg4yoPAxgsHUWig4BXtEUvvnSow8ssM5C5BcWAIqtA771w6/ksngZwJbWWSiKZI6zyjnghRfqOEKEYokvAVJs5bJyC3jxp7xpudvbPds6BZFfWAAolkZ+4wd7AvpN6xwUdXoWeKeUYooFgGIpLTjKOgPFwjb7H/a9Pa1DEPmBBYDiyXWGWEegeMilUjtYZyDyAwsAxZRmrRNQPIjrtFlnIPIDCwDFkuvI69YZKB5S6SynDqZYYgGgWBJHHwTAT25UqMbpjz7IAkCxxAJAsdQxgctN1jko2kTkt9YZiPzCAkCxNSC19lcKPG2dg6JJBbe/+Pj991rnIPILCwDF1qOPPtrSo7XPkRC5CQBfCqTOahXgspf3LzvFOgiRnzjBBSXCfocfvSscHAfV/QBsCciXf/YdZ0sRh2sGxFku+4oCLV/+A1UACwUyHU6u9sXHHpwfdDSioLEAEHU4+MfjzoHKtdY5yD850V2m3zOBL/URgY8AiIiIEokFgIiIKIFYAIiIiBKIBYCIiCiBWACIiIgSiAWAiIgogVgAiIiIEogFgIiIKIFYAIiIiBKIBYCIiCiBOBUwJcb+R1TsklP3QKhu5Tj6pZ99KSo5yEkVfdsiGwUj29J0lai7ZP2vu64oHP0Emn725Sfq3rXIRhQ0FgCKvX0PP3qkiP4ZwCHWWSgCBI/nJHX2jMfqXreOQuQnFgCKtf0OP7pKRW8XoMQ6C0XKCkf1ey88+fenrYMQ+YUFgGJrn8N/dKgj7mMA0tZZKJKWuMiN+O8T//jAOgiRH/gSIMXS3nuPK3LEvRW8+FP+BjpIXWEdgsgvLAAUS6mBi44AsIt1Doo2BX584He/29s6B5EfWAAolhyRg60zUPQJUNLanB5hnYPIDywAFE+KgdYRKB4c0f7WGYj8wAJA8ST41DoCxYOjqUXWGYj8wAJAsSTQZ60zUCysbS1pmWMdgsgPLAAUS62Lt5iqwNvWOSjiFPfNfPjhJusYRH5gAaBYmjlzQpuonAXAtc5CUaUrVVKXWqcg8kvKOgCRXz5859U3B+88bDkgR4CTXlEXKNDiwDnupSfue8k6C5FfWAAo1ha8/dpLg3ce+l9A9gU4MoA6Q+bC0R+99PgDU62TEPmJn4ooEUaPHp1eUzToqyLuQY7K1ir6pcdfTio9HKn0/hb5KBhutvVuuO7K9b8uKq46+FhEnhncW56tq6vLWeQjChILAFGHg3887hyoXGudg/yTE91l+j0T+HIoEfgSIBERUSKxABARESUQCwAREVECsQAQERElEAsAERFRArEAEBERJRALABERUQKxABARESUQCwAREVECsQAQERElEKcCpkQ46Kij+re2dfsuoPs5IoM29D2SSu0KJ1UedDYKjra1PQro6g39mau6WFSmI9300EuPPvql9QKI4oYFgOJORh3xg1+q4iJA+liHoUhYAsgvX3ri/jutgxD5icsBU3yNH+/sVzxgCiDnAFJiHYcioweA72238+748O1Xn7YOQ+QXFgCKrf2KBlwMwZnWOSiaBPjq9jsPm/7h26+9Y52FyA98CZBiae/R3xkEwa+sc1CkCSCXW4cg8gsLAMVSUVHR99F+K5eoEPvu980fbm8dgsgPLAAUSyoy3DoDxYKIK8OsQxD5gQWA4qq7dQCKCeXPEsUTCwDFkkDft85AMSH6oXUEIj+wAFAsKdxHrTNQDAgWD+6TqreOQeQHFgCKpZeeeHAmBI9b56Cokxvq6upy1imI/MACQLGlmjoNwKfWOSiaVDA7W9x6tXUOIr+wAFBsvfxE3bvi6tcAvGadhSLnBU2lvjXz4YebrIMQ+YUFgGLtxX///dUBqbXlUP05gJcAuNaZKLRcBaYrcPIOfVMH//dfdZ9YByLyExcDokSpqKhIvbMyt6WTk40O7Srq02+848iYIHORv9xc20ltq1ZvdF5/N6Vrd+qTWsjn/ZQkLABE6znkx6f8UBX3W+cgz7S5zW0Dn3/ozlXWQYjChI8AiNbTrbjpcQAbXDOeIulJXvyJvowFgGg9T1RXr4Ho361zkDcUqLHOQBRGLABEG+C4Um2dgTyxpkdJ00PWIYjCiAWAaAOeLt1mKoAPrHNQoeS+J6qr11inIAojFgCiDRk/3hXRSdYxqDDqYKJ1BqKwYgEg2gjHwXUA+Okxul5+7u5bp1mHIAorFgCijZg2ZcJigdxhnYPyo8AV1hmIwowFgGgTnGz2KgCt1jmoixSNz+2xzSPWMYjCLGUdgCjM5r86a+WQPUcOBrC3dRbqPAHOeu/mP79inYMozHgHgGgzWpzcbwAst85BnaQy/Zm62+61jkEUdiwARJvx0pTbP4XgN9Y5qFNyksLPAah1EKKwYwEg6oSt3aU3QzHbOgdt1s3P3H0r/zsRdQILAFEn1NXV5VzHOR1cTji0FPg01drCOzVEncSXAIk66YPGGQuG7Ll3MSCHWGehL1FHncqnH7i93joIUVTwDgBRFzyz+7a/AfAf6xy0HsHVz9Tdwjn/ibqABYCoK8aPd7MqYwEsto5Cn5H/LnWXXmydgihqWACIuuiFuls/VMUYADnrLIQlKQfHNNbVcbImoi7iOwBEeXh/3sy3dthj5Cci+I51lgRbq6pHPXPvbQ3WQYiiiAWAKE/vz5s5c4fSvSGQ0dZZEiinKsc+V3fbE9ZBiKKKBYCoAO83znx6SOk+AwDsZ50lQVQU456tu22ydRCiKOM7AEQF2kqX/J8KuGpgMFQU5z5Tdxv/fRMVSKwDEMWEHHLMqZcq9FLrIDGWVcgpz9176wgWYhIAAAIFSURBVJ3WQYjigI8AiDzyXuOMaV/Zc+RSAEeA5dprTQL88Nl7ucgPkVdYAIg89H7jzJeH7DHydQiOBFBsnScmFqijRz17z4Rp1kGI4oSfUoh8cGDFaUMd5O6FSJl1lkhTTG1N5ypfmnL7p9ZRiOKGdwCIfPDBvBlLdtp3+ES0FfUBRwjkIyeQy58t3ebkD2+8ZrV1GKI44h0AIp8d9ONxFaK4DpBtrbNExFxx3FOfufuv062DEMUZ7wAQ+ez9xpnzhu21x225XFEKwChw+O3GNAnk90t16ZgZ91bPtw5DFHe8A0AUoAMqflaeEucGAAdZZwkRFch9cJzznrn75g+swxAlBQsAkYGDKsYdJJALIPi2dRZDLhT/gqOXPnvPhFnWYYiShgWAyNDBx5x6IKAXATgSyXk00ALI3a7KH56vu+V16zBEScUCQBQC+1ecul0R9Ecq+AmAjHUen8wURbWT1tppUyYstg5DlHQsAEQhc3DFqfvC0R9BcSiAckT3zkALIC+q4sk0nHum1d38lnUgIvofFgCiEDv0B2cMbC3KjRbo11WxNwRDAfSzzrURHyvwGkReSrn6n9XN+vzMhyc0WYciog1jASCKmAN+cOqWqXRud4Uz1IEOgEg/AL1VtLeo083fo7urAGc1xF3lqqxyRBYIcm80p7u9/lLtDSv9PTYReen/AbeNKKToOb16AAAAAElFTkSuQmCC";var Qx="data:image/png;base64,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";import{Fragment as cO,jsx as Ye,jsxs as cr}from"react/jsx-runtime";var kp=-100,Rp=100,iw=.03,tO=.03,rO=.03,Ap=.5,nO=qx,oO=Kx,iO=Qx,aO=Math.PI/4,Jx=.4,Li=64,Yx=iw*3,Op="#4d7dff",pc="#ffcc00",Zx=.02,ew=.012,tw=new hr(0,1,0),mc=32,rw="#ff9d3d",fc=4;function Ep(e){let t=new Float32Array((Li+1)*3);for(let r=0;r<=Li;r++){let n=r/Li*Math.PI*2,o=Math.cos(n)*Jx,i=Math.sin(n)*Jx,a=0,l=0,c=0;e==="x"?(l=o,c=i):e==="y"?(a=o,c=i):(a=o,l=i),t[r*3]=a,t[r*3+1]=l,t[r*3+2]=c}return t}function sO(e){let t=Math.abs(e.y)<.99?new hr(0,1,0):new hr(1,0,0),r=new hr().crossVectors(e,t).normalize(),n=new hr().crossVectors(e,r).normalize();return[r,n]}function nw(e,t,r=1e-5){return Math.abs(e[0]-t[0])<r&&Math.abs(e[1]-t[1])<r&&Math.abs(e[2]-t[2])<r}var No=null,qa=null,Tp=new Set;function Dp(e){No!==e&&(No=e,Tp.forEach(t=>t()))}function lO(e){return Tp.add(e),()=>Tp.delete(e)}function ow(){return No}function aw({light:e,position:t,rotation:r=[0,0,0],color:n,intensity:o,visible:i,onPositionChange:a,onRotationChange:l,target:c,onTransformChange:d,onDraggingChange:p}){let{activeTab:m,activeSubTab:s,setActiveTab:f,setActiveSubTab:u}=Fn(),{camera:h,gl:v,raycaster:x,invalidate:b,scene:S}=qA(),w=pt(null),P=pt(null),y=pt(null),M=pt(null),_=pt(null),C=pt(null),E=pt(null),R=pt(null),O=pt(null),D=pt(null),B=pt(null),V=pt(null),G=pt(null),U=Pr(()=>new eO,[]),T=Pr(()=>new _i,[]),A=Pr(()=>new hr(1,1,1),[]),Z=pt([0,0,0]),ee=pt([0,0,0]),Y=pt(!1),Q=pt(null),te=pt(null),q=pt(new hr),H=pt(null),N=pt(null),J=pt(p);Ti(()=>{J.current=p},[p]);let ne=Pr(()=>new hr(t[0],t[1],t[2]),[t]),Ne=Pr(()=>new dc(r[0],r[1],r[2]),[r]),K=Pr(()=>new Float32Array(6),[]),xe=Pr(()=>Ep("x"),[]),Pe=Pr(()=>Ep("y"),[]),ve=Pr(()=>Ep("z"),[]),mt=Pr(()=>new Float32Array((mc+1)*3),[]),ft=Pr(()=>new Float32Array(fc*2*3),[]),xt=e?.type==="point",oe=e?.type==="spot",Ae=e?.type==="directional",$e=xt?oO:oe?iO:nO,ie=xt?tO:oe?rO:iw,Ie=Pr(()=>new ZA().load($e),[$e]),ze=XA(lO,ow,ow),ge=!!e&&ze===e.id,ke=pt(new hr),Oe=pt(new dc),We=pt(new hr),Lt=c?.[0]??0,Bt=c?.[1]??0,yr=c?.[2]??0;Ti(()=>{Y.current||(ke.current.copy(ne),Oe.current.copy(Ne),We.current.set(Lt,Bt,yr),b())},[ne,Ne,Lt,Bt,yr,b]),Ti(()=>{e&&No===e.id&&!i&&Dp(null)},[e?.id,i]),Ti(()=>()=>{e&&No===e.id&&Dp(null),N.current!==null&&(cancelAnimationFrame(N.current),N.current=null),e&&Hl(S,e.id)},[e?.id,S]),Ti(()=>{if(!ge)return;let ye=G.current;return qa=ye,()=>{qa===ye&&(qa=null)}});let dr=uc(()=>{if(Y.current||!ge)return;let ye=ke.current,Se=new _i().setFromEuler(Oe.current);U.compose(ye,Se,A)},[U,A,ge]);KA(()=>{if(w.current&&w.current.position.copy(ke.current),dr(),y.current){y.current.lookAt(h.position);let ye=h,Se;ye.isOrthographicCamera?Se=ie/ye.zoom:Se=h.position.distanceTo(ke.current)*ie,y.current.scale.setScalar(Se)}if(O.current){let ye=h,Se;ye.isOrthographicCamera?Se=Yx/ye.zoom:Se=h.position.distanceTo(ke.current)*Yx,O.current.scale.setScalar(Se)}if(_.current){let ye=_.current.getAttribute("position"),Se=ye.array;Se[0]=ke.current.x,Se[1]=ke.current.y,Se[2]=ke.current.z,Se[3]=We.current.x,Se[4]=We.current.y,Se[5]=We.current.z,ye.needsUpdate=!0,_.current.computeBoundingSphere()}if(C.current){let ye=We.current,Se=ke.current.clone().sub(ye),Ve=Se.length();C.current.visible=Ve>Ap,Ve>1e-6&&(C.current.position.copy(ye).addScaledVector(Se,.5),C.current.scale.set(1,Ve,1),C.current.quaternion.setFromUnitVectors(tw,Se.normalize()))}if(M.current&&(M.current.visible=ke.current.distanceTo(We.current)>Ap),E.current&&R.current){let ye=We.current,Se=ye.clone().sub(ke.current),Ve=Se.length()>Ap;if(E.current.visible=Ve,R.current.visible=Ve,Ve){let _e=h,Qe=_e.isOrthographicCamera?ew/_e.zoom:h.position.distanceTo(ye)*ew;Se.normalize(),E.current.position.copy(ye).addScaledVector(Se,-Qe),E.current.quaternion.setFromUnitVectors(tw,Se),E.current.scale.setScalar(Qe),R.current.position.copy(ye),R.current.scale.setScalar(Qe*.45)}}if(oe&&D.current&&B.current&&V.current){let ye=ke.current,Se=We.current.clone().sub(ye),Ve=Se.length();if(Ve>1e-6){D.current.visible=!0;let _e=Se.normalize(),Qe=Ve,wt=e?.angle??Math.PI/6,Gt=Qe*Math.tan(wt),jt=ye.clone().add(_e.clone().multiplyScalar(Qe)),[ht,rr]=sO(_e),Vr=B.current.getAttribute("position"),Qt=Vr.array;for(let vt=0;vt<=mc;vt++){let gt=vt/mc*Math.PI*2,Vt=jt.x+(ht.x*Math.cos(gt)+rr.x*Math.sin(gt))*Gt,nr=jt.y+(ht.y*Math.cos(gt)+rr.y*Math.sin(gt))*Gt,Cn=jt.z+(ht.z*Math.cos(gt)+rr.z*Math.sin(gt))*Gt;Qt[vt*3]=Vt,Qt[vt*3+1]=nr,Qt[vt*3+2]=Cn}Vr.needsUpdate=!0,B.current.computeBoundingSphere();let Jt=V.current.getAttribute("position"),Nt=Jt.array;for(let vt=0;vt<fc;vt++){let gt=vt/fc*Math.PI*2,Vt=jt.x+(ht.x*Math.cos(gt)+rr.x*Math.sin(gt))*Gt,nr=jt.y+(ht.y*Math.cos(gt)+rr.y*Math.sin(gt))*Gt,Cn=jt.z+(ht.z*Math.cos(gt)+rr.z*Math.sin(gt))*Gt,Ut=vt*6;Nt[Ut]=ye.x,Nt[Ut+1]=ye.y,Nt[Ut+2]=ye.z,Nt[Ut+3]=Vt,Nt[Ut+4]=nr,Nt[Ut+5]=Cn}Jt.needsUpdate=!0,V.current.computeBoundingSphere()}else D.current.visible=!1}});let xr=uc(()=>{N.current!==null&&(cancelAnimationFrame(N.current),N.current=null),e&&Hl(S,e.id),Z.current=t,ee.current=[r[0],r[1],r[2]],q.current.copy(We.current),Y.current=!0,Q.current=null,te.current=null,H.current=null,J.current?.(!0)},[t,r,e?.id,S]),Or=uc((ye,Se)=>{let Ve=Se,_e=new hr(Z.current[0],Z.current[1],Z.current[2]),Qe=new hr,wt=new _i,Gt=new hr;Ve.decompose(Qe,wt,Gt);let jt=_e.clone().applyMatrix4(Ve),ht=[Math.min(Math.max(jt.x,kp),Rp),Math.min(Math.max(jt.y,kp),Rp),Math.min(Math.max(jt.z,kp),Rp)],rr=new _i().setFromEuler(new dc(ee.current[0],ee.current[1],ee.current[2],"XYZ")),Vr=new _i().copy(wt).multiply(rr),Qt=new dc().setFromQuaternion(Vr,"XYZ"),Jt=[Qt.x,Qt.y,Qt.z];if(oe||Ae){let vt=q.current.clone().applyMatrix4(Ve);We.current.copy(vt),H.current=vt.toArray()}ke.current.set(ht[0],ht[1],ht[2]),Oe.current.set(Jt[0],Jt[1],Jt[2]),Q.current=ht,te.current=Jt,e&&Xy(S,e.id,{position:ht,...H.current?{target:H.current}:{}});let Nt=new _i().setFromEuler(Oe.current);U.compose(ke.current,Nt,A),b()},[U,A,b,oe,Ae,e?.id,S]),kt=uc(()=>{Y.current=!1;let ye=Q.current,Se=te.current,Ve=H.current;Q.current=null,te.current=null,H.current=null;let _e=ye&&!nw(ye,Z.current),Qe=Se&&!nw(Se,ee.current);d?(_e||Qe)&&d({position:ye??Z.current,rotation:Se??ee.current,...Ve?{target:Ve}:{}}):(_e&&a&&a(ye),Qe&&l&&l(Se)),e&&Hl(S,e.id),_e||Qe?N.current=requestAnimationFrame(()=>{N.current=null,J.current?.(!1)}):J.current?.(!1)},[a,l,d,e?.id,S]);return Ti(()=>{let ye=_e=>{let Qe=v.domElement.getBoundingClientRect();return new YA((_e.clientX-Qe.left)/Qe.width*2-1,-((_e.clientY-Qe.top)/Qe.height)*2+1)},Se=_e=>!!_e.target.closest?.("button, input, textarea, .ri-annotationPopup, .ri-colorPicker, .ri-materialPicker"),Ve=_e=>{if(Se(_e)||e&&No===e.id)return;let Qe=ye(_e);if(x.setFromCamera(Qe,h),qa&&x.intersectObject(qa,!0).length>0)return;let wt=[];if(P.current&&wt.push(P.current),y.current&&wt.push(y.current),wt.length===0)return;if(x.intersectObjects(wt,!1).length>0){let jt=e?.id??null;No!==jt&&(Dp(jt),f?.("scene"),u?.("lighting")),_e.preventDefault(),_e.stopPropagation()}};return v.domElement.addEventListener("pointerdown",Ve),()=>{v.domElement.removeEventListener("pointerdown",Ve)}},[h,x,v,e,f,u]),m!=="scene"||s!=="lighting"||!e||!i||e.type==="none"||e.type==="hemisphere"?null:cr("group",{ref:ye=>{ye&&ii(ye)},children:[cr("group",{ref:w,children:[Ye("sprite",{ref:y,children:Ye("spriteMaterial",{map:Ie,transparent:!0,opacity:.9,blending:Pp,depthWrite:!1,rotation:oe?aO:0},$e)}),Ye(QA,{ref:P,args:[.25,16,16],children:Ye("meshBasicMaterial",{transparent:!0,opacity:.01})}),xt&&cr("group",{ref:O,children:[cr("lineLoop",{renderOrder:999,children:[Ye("bufferGeometry",{children:Ye("bufferAttribute",{attach:"attributes-position",args:[xe,3],count:Li+1})}),Ye("lineBasicMaterial",{color:Op,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),cr("lineLoop",{renderOrder:999,children:[Ye("bufferGeometry",{children:Ye("bufferAttribute",{attach:"attributes-position",args:[Pe,3],count:Li+1})}),Ye("lineBasicMaterial",{color:Op,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),cr("lineLoop",{renderOrder:999,children:[Ye("bufferGeometry",{children:Ye("bufferAttribute",{attach:"attributes-position",args:[ve,3],count:Li+1})}),Ye("lineBasicMaterial",{color:Op,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]})]})]}),!xt&&!oe&&cr(cO,{children:[cr("mesh",{ref:C,children:[Ye("cylinderGeometry",{args:[Zx,Zx,1,8,1,!0]}),Ye("meshBasicMaterial",{color:pc,transparent:!0,opacity:.05,blending:Pp,depthWrite:!1,depthTest:!1})]}),cr("mesh",{ref:E,renderOrder:999,children:[Ye("coneGeometry",{args:[.45,2,12]}),Ye("meshBasicMaterial",{color:pc,transparent:!0,opacity:.9,depthTest:!1,depthWrite:!1})]}),cr("mesh",{ref:R,renderOrder:999,children:[Ye("sphereGeometry",{args:[1,12,8]}),Ye("meshBasicMaterial",{color:pc,transparent:!0,opacity:.9,depthTest:!1,depthWrite:!1})]}),cr("line",{ref:M,children:[Ye("bufferGeometry",{ref:_,children:Ye("bufferAttribute",{attach:"attributes-position",args:[K,3],count:2})}),Ye("lineBasicMaterial",{color:pc,transparent:!0,opacity:.7,blending:Pp})]})]}),oe&&cr("group",{ref:D,children:[cr("lineLoop",{renderOrder:999,children:[Ye("bufferGeometry",{ref:B,children:Ye("bufferAttribute",{attach:"attributes-position",args:[mt,3],count:mc+1})}),Ye("lineBasicMaterial",{color:rw,transparent:!0,opacity:.85,depthTest:!1,depthWrite:!1})]}),cr("lineSegments",{renderOrder:999,children:[Ye("bufferGeometry",{ref:V,children:Ye("bufferAttribute",{attach:"attributes-position",args:[ft,3],count:fc*2})}),Ye("lineBasicMaterial",{color:rw,transparent:!0,opacity:.5,depthTest:!1,depthWrite:!1})]})]}),ge&&(a||d)&&Ye(JA,{ref:G,matrix:U,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableScaling:!0,disableRotations:xt,onDragStart:xr,onDrag:Or,onDragEnd:kt})]})}import{useCallback as Jr,useEffect as uO,useLayoutEffect as dO,useMemo as ur,useRef as kr}from"react";import{Html as pO,PivotControls as mO}from"@react-three/drei";import{useFrame as fO,useThree as _p}from"@react-three/fiber";import{Euler as sw,Matrix4 as Ka,Quaternion as Qa,Vector3 as vr}from"three";import{Maximize2 as gO}from"lucide-react";import{jsx as Ja,jsxs as hO}from"react/jsx-runtime";var bO=.01,Lp=.5;function Bp({node:e,space:t,moveEnabled:r,gizmoTool:n,scaleEnabled:o,onTransformChange:i,onDraggingChange:a,transform:l}){let c=_p(K=>K.invalidate),d=_p(K=>K.camera),p=_p(K=>K.size),m=ur(()=>So(e),[e]),s=ur(()=>new vr,[e]);l?.pivot?s.fromArray(l.pivot.point):s.copy(m);let f=ur(()=>{let K=il(e);if(!K)return[s.clone().add(new vr(Lp,Lp,Lp))];let xe=[];for(let Pe of[K.min.x,K.max.x])for(let ve of[K.min.y,K.max.y])for(let mt of[K.min.z,K.max.z])xe.push(new vr(Pe,ve,mt));return xe},[e,s]),u=ur(()=>new vr,[]),h=ur(()=>new vr,[]),v=kr(null),x=ur(()=>new Ka,[]),b=kr(!1),S=kr(new Ka),w=kr(new Ka),P=kr(null),y=kr([]),M=kr(null),_=kr(a);_.current=a;let C=ur(()=>new vr,[]),E=ur(()=>new Qa,[]),R=ur(()=>new vr,[]),O=ur(()=>new Qa,[]),D=ur(()=>new vr(1,1,1),[]),B=ur(()=>new Qa,[]),V=ur(()=>new vr,[]),G=ur(()=>new vr,[]),U=kr([0,0,0]),T=kr(new vr(1,1,1)),A=kr({point:[0,0,0],offset:[0,0,0]}),Z=Jr(()=>{b.current||(e.updateWorldMatrix(!0,!1),C.copy(s).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(E),O.copy(E),t==="world"&&O.identity(),x.compose(C,O,D))},[C,x,O,D,e,s,t,E]),ee=Jr(()=>{e.updateWorldMatrix(!0,!1);let K=1/0;for(let xe of f){u.copy(xe).applyMatrix4(e.matrixWorld);let Pe=u.distanceToSquared(d.position);Pe<K&&(K=Pe,h.copy(u))}v.current?.position.copy(h)},[d,h,f,e,u]);dO(()=>(Z(),ee(),()=>{let K=M.current!==null;K&&(cancelAnimationFrame(M.current),M.current=null),(b.current||K)&&(b.current=!1,_.current(!1));for(let xe of y.current)an(xe);y.current=[]}),[Z]),fO(()=>{Z(),ee()});let Y=Jr(()=>{M.current!==null&&(cancelAnimationFrame(M.current),M.current=null),e.updateWorldMatrix(!0,!0),y.current=[];for(let K of In(e))Ws(K)||(ai(K,K.matrixWorld),y.current.push(K));e.updateWorldMatrix(!0,!1),C.copy(s).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(E),e.getWorldScale(R),S.current.compose(C,E,R),w.current.copy(x),U.current=[e.rotation.x,e.rotation.y,e.rotation.z],T.current.copy(e.scale),A.current=l?.pivot??al(s.toArray(),U.current,e.scale.toArray(),e.rotation.order),P.current=null,b.current=!0,a(!0)},[C,x,e,a,s,E,R,l?.pivot]),Q=Jr((K,xe)=>{let Pe=S.current.clone().premultiply(xe),ve=w.current.clone().premultiply(xe);Pe.decompose(V,E,G);let mt=V.clone();ve.decompose(C,O,D),t==="world"&&O.identity(),x.compose(C,O,D),K.decompose(V,B,G);let ft=new sw().setFromQuaternion(B,e.rotation.order),[xt,oe,Ae]=U.current,$e=[xt+ft.x,oe+ft.y,Ae+ft.z],ie=new Qa().setFromEuler(new sw($e[0],$e[1],$e[2],e.rotation.order));e.scale.copy(T.current);let ze=(e.parent?.matrixWorld||new Ka).clone().invert(),ge=mt.clone().applyMatrix4(ze),ke=s.clone().multiply(e.scale).applyQuaternion(ie),Oe=ge.clone().sub(ke);e.position.copy(Oe),e.rotation.set($e[0],$e[1],$e[2],e.rotation.order),e.updateMatrixWorld(!0),c();let We=A.current,Lt=ge.clone().sub(new vr(...We.offset)),Bt=[Lt.x,Lt.y,Lt.z];P.current={position:Bt,rotation:$e,pivot:We}},[C,B,x,O,D,c,e,s,V,G,t,E]),te=Jr(()=>{b.current=!1;let K=P.current;if(P.current=null,K)i(K),M.current=requestAnimationFrame(()=>{M.current=null,a(!1)});else if(y.current.length>0){for(let xe of y.current)an(xe);e.updateMatrixWorld(!0),c(),a(!1)}else a(!1);y.current=[]},[c,e,a,i]),q=kr(null),H=Jr(K=>{let xe=K.clone().project(d);return{x:p.left+(xe.x*.5+.5)*p.width,y:p.top+(-xe.y*.5+.5)*p.height}},[d,p]),N=Jr((K,xe)=>{let Pe=Math.max(bO,Number.isFinite(K)?K:1);e.scale.copy(T.current).multiplyScalar(Pe);let mt=(e.parent?.matrixWorld||new Ka).clone().invert(),ft=xe.clone().applyMatrix4(mt),xt=new Qa().setFromEuler(e.rotation),oe=s.clone().multiply(e.scale).applyQuaternion(xt),Ae=ft.clone().sub(oe);e.position.set(Ae.x,Ae.y,Ae.z),e.updateMatrixWorld(!0),ee(),c(),P.current={position:ft.clone().sub(new vr(...A.current.offset)).toArray(),scale:e.scale.toArray(),pivot:A.current}},[c,e,s,ee]),J=Jr(K=>{if(!o)return;K.stopPropagation(),K.preventDefault(),K.currentTarget.setPointerCapture(K.pointerId),Y();let xe=C.clone(),Pe=H(xe),ve=Math.max(1,Math.hypot(K.clientX-Pe.x,K.clientY-Pe.y));q.current={pointerId:K.pointerId,centerScreen:Pe,startDistance:ve,pivotWorld:xe}},[Y,C,H,o]),ne=Jr(K=>{let xe=q.current;if(!xe||K.pointerId!==xe.pointerId)return;K.stopPropagation();let Pe=Math.hypot(K.clientX-xe.centerScreen.x,K.clientY-xe.centerScreen.y);N(Pe/xe.startDistance,xe.pivotWorld)},[N]),Ne=Jr(K=>{let xe=q.current;!xe||K.pointerId!==xe.pointerId||(K.stopPropagation(),K.currentTarget.hasPointerCapture(K.pointerId)&&K.currentTarget.releasePointerCapture(K.pointerId),q.current=null,te())},[te]);return uO(()=>{o||q.current&&(q.current=null,te())},[o,te]),hO("group",{children:[Ja(mO,{matrix:x,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#e5484d","#46a758","#3e8bff"],hoveredColor:"#35c0dc",opacity:.95,depthTest:!1,disableAxes:!r||n==="rotate",disableSliders:!r||n==="rotate",disableRotations:!r||n==="move",disableScaling:!0,onDragStart:Y,onDrag:(K,xe,Pe,ve)=>Q(xe,ve),onDragEnd:te}),o&&Ja("group",{ref:v,children:Ja(pO,{portal:void 0,zIndexRange:[10,0],style:{pointerEvents:"none",transition:"opacity 0.2s"},children:Ja("div",{onPointerDown:J,onPointerMove:ne,onPointerUp:Ne,onPointerCancel:Ne,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:Ja(gO,{size:13,color:"#ffffff"})})})})]})}import{useCallback as Yr,useEffect as yO,useLayoutEffect as uw,useMemo as Io,useRef as Rr}from"react";import{Html as xO,PivotControls as wO}from"@react-three/drei";import{useFrame as SO,useThree as Ip}from"@react-three/fiber";import{Matrix4 as Ya,Quaternion as CO,Vector3 as zo}from"three";import{Maximize2 as MO}from"lucide-react";import{Matrix4 as vO,Vector3 as lw}from"three";function jp(e){let t=new Set(e.map(({node:n})=>n)),r=new Set;return e.filter(({node:n})=>{if(r.has(n))return!1;r.add(n);for(let o=n.parent;o;o=o.parent)if(t.has(o))return!1;return!0})}function cw(e){return jp(e).map(({key:t,node:r,transform:n})=>{r.updateWorldMatrix(!0,!0);let o=n?.pivot?.point??So(r).toArray(),i=n?.pivot??al(o,[r.rotation.x,r.rotation.y,r.rotation.z],r.scale.toArray(),r.rotation.order,n?.shear);return{key:t,node:r,pivot:i,startWorld:r.matrixWorld.clone(),startMatrix:r.matrix.clone(),startMatrixAutoUpdate:r.matrixAutoUpdate,startPosition:r.position.clone(),startQuaternion:r.quaternion.clone(),startScale:r.scale.clone(),pivotWorld:new lw(...i.point).applyMatrix4(r.matrixWorld)}})}function Np(e,t,r=1){return e.map(n=>{let{node:o,pivot:i}=n;o.parent?.updateWorldMatrix(!0,!1);let a=(o.parent?.matrixWorld.clone()??new vO).invert(),l=a.clone().multiply(t).multiply(n.startWorld),{rotation:c,scale:d,shear:p}=xg(l,n.startScale.clone().multiplyScalar(r),n.startQuaternion),m=n.pivotWorld.clone().applyMatrix4(t).applyMatrix4(a);return o.position.setFromMatrixPosition(l),o.quaternion.copy(c),o.scale.copy(d),Xs(o,p),o.updateMatrixWorld(!0),{key:n.key,transform:{position:m.clone().sub(new lw(...i.offset)).toArray(),rotation:[o.rotation.x,o.rotation.y,o.rotation.z],scale:d.toArray(),pivot:i,shear:p}}})}import{jsx as Za,jsxs as kO}from"react/jsx-runtime";var PO=.01;function zp({entries:e,referenceNode:t,space:r,moveEnabled:n,gizmoTool:o,scaleEnabled:i,onTransformChange:a,onDraggingChange:l}){let c=Ip(H=>H.invalidate),d=Ip(H=>H.camera),p=Ip(H=>H.size),m=Rr(e);m.current=e;let s=Rr([]);(e.length!==s.current.length||e.some((H,N)=>H.key!==s.current[N].key||H.node!==s.current[N].node))&&(s.current=e);let f=s.current,u=Io(()=>jp(f).map(({node:H})=>H),[f]),h=t??e[e.length-1]?.node,v=Io(()=>new zo,[]),x=Io(()=>new CO,[]),b=Io(()=>new Ya,[]),S=Io(()=>new zo(1,1,1),[]),w=Io(()=>new zo,[]),P=Rr(null),y=Io(()=>u.flatMap(H=>{let N=il(H);if(!N)return[{node:H,point:So(H).addScalar(.5)}];let J=[];for(let ne of[N.min.x,N.max.x])for(let Ne of[N.min.y,N.max.y])for(let K of[N.min.z,N.max.z])J.push({node:H,point:new zo(ne,Ne,K)});return J}),[u]),M=Rr(!1),_=Rr(new Ya),C=Rr([]),E=Rr(null),R=Rr([]),O=Rr(null),D=Rr(null),B=Rr(l);B.current=l;let V=Rr(a);V.current=a;let G=Yr(()=>{if(!M.current){v.set(0,0,0);for(let H of u)H.updateWorldMatrix(!0,!1),v.add(So(H).applyMatrix4(H.matrixWorld));u.length&&v.divideScalar(u.length),x.identity(),r==="local"&&h&&(h.updateWorldMatrix(!0,!1),h.getWorldQuaternion(x)),b.compose(v,x,S)}},[v,b,x,u,h,r,S]),U=Yr(()=>{let H=1/0,N=new zo;for(let{node:J,point:ne}of y){J.updateWorldMatrix(!0,!1),N.copy(ne).applyMatrix4(J.matrixWorld);let Ne=N.distanceToSquared(d.position);Ne<H&&(H=Ne,w.copy(N))}P.current?.position.copy(w)},[d,y,w]),T=Yr(()=>{let H=D.current;D.current=null,H?.target.hasPointerCapture(H.pointerId)&&H.target.releasePointerCapture(H.pointerId)},[]);uw(()=>{G(),U()},[G,U]),uw(()=>()=>{T();let H=O.current!==null;if(H&&(cancelAnimationFrame(O.current),O.current=null),M.current)for(let N of C.current)N.node.matrixAutoUpdate=N.startMatrixAutoUpdate,N.node.matrix.copy(N.startMatrix),N.node.position.copy(N.startPosition),N.node.quaternion.copy(N.startQuaternion),N.node.scale.copy(N.startScale),N.node.updateMatrixWorld(!0);(M.current||H)&&(M.current=!1,E.current=null,B.current(!1),c());for(let N of R.current)an(N);R.current=[]},[f,c,T]),SO(()=>{G(),U()});let A=Yr(()=>{O.current!==null&&(cancelAnimationFrame(O.current),O.current=null),G(),C.current=cw(m.current),R.current=[];for(let{node:H}of C.current)for(let N of In(H))Ws(N)||(ai(N,N.matrixWorld),R.current.push(N));_.current.copy(b),E.current=null,M.current=!0,B.current(!0)},[b,G]),Z=Yr((H,N)=>{if(!M.current)return;_.current.clone().premultiply(N).decompose(v,x,new zo),r==="world"&&x.identity(),b.compose(v,x,S),E.current=Np(C.current,N),U(),c()},[v,b,x,c,r,U,S]),ee=Yr(()=>{if(!M.current)return;M.current=!1,T();let H=E.current;if(E.current=null,H?.length)O.current=requestAnimationFrame(()=>{O.current=null,B.current(!1)}),V.current(H);else{for(let N of R.current)an(N);c(),B.current(!1)}R.current=[]},[c,T]);yO(()=>{(!i&&D.current||!n&&M.current&&!D.current)&&ee()},[i,n,ee]);let Y=Yr(H=>{let N=H.clone().project(d);return{x:p.left+(N.x*.5+.5)*p.width,y:p.top+(-N.y*.5+.5)*p.height}},[d,p]),Q=Yr(H=>{if(!i)return;H.stopPropagation(),H.preventDefault(),H.currentTarget.setPointerCapture(H.pointerId),A();let N=Y(v);D.current={pointerId:H.pointerId,target:H.currentTarget,centerScreen:N,startDistance:Math.max(1,Math.hypot(H.clientX-N.x,H.clientY-N.y))}},[A,v,Y,i]),te=Yr(H=>{let N=D.current;if(!N||H.pointerId!==N.pointerId)return;H.stopPropagation();let J=Math.hypot(H.clientX-N.centerScreen.x,H.clientY-N.centerScreen.y),ne=Math.max(PO,J/N.startDistance),Ne=new zo().setFromMatrixPosition(_.current),K=new Ya().makeTranslation(...Ne.toArray()).multiply(new Ya().makeScale(ne,ne,ne)).multiply(new Ya().makeTranslation(...Ne.clone().negate().toArray()));E.current=Np(C.current,K,ne),U(),c()},[c,U]),q=Yr(H=>{H.pointerId===D.current?.pointerId&&(H.stopPropagation(),ee())},[ee]);return kO("group",{children:[Za(wO,{matrix:b,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#e5484d","#46a758","#3e8bff"],hoveredColor:"#35c0dc",opacity:.95,depthTest:!1,disableAxes:!n||o==="rotate",disableSliders:!n||o==="rotate",disableRotations:!n||o==="move",disableScaling:!0,onDragStart:A,onDrag:(H,N,J,ne)=>Z(N,ne),onDragEnd:ee}),i&&Za("group",{ref:P,children:Za(xO,{children:Za("div",{onPointerDown:Q,onPointerMove:te,onPointerUp:q,onPointerCancel:q,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:Za(MO,{size:13,color:"#ffffff"})})})})]})}import{Vector3 as RO}from"three";function AO(e){let t=e.object;if(!t.isSkinnedMesh||!e.face||!t.skeleton)return null;let r=t.geometry,n=r.getAttribute("skinIndex"),o=r.getAttribute("skinWeight"),i=r.getAttribute("position");if(!n||!o||!i)return null;let a=t.worldToLocal(e.point.clone()),l=[e.face.a,e.face.b,e.face.c],c=new RO,d=l[0],p=1/0;for(let f of l){c.fromBufferAttribute(i,f);let u=c.distanceToSquared(a);u<p&&(p=u,d=f)}let m=n.getComponent(d,0),s=o.getComponent(d,0);for(let f=1;f<4;f++){let u=o.getComponent(d,f);u>s&&(s=u,m=n.getComponent(d,f))}return t.skeleton.bones[m]??null}function dw(e){let t=AO(e)??e.object,r=jn(t);if(!r)return null;t.updateWorldMatrix(!0,!1);let n=t.worldToLocal(e.point.clone());return{anchorNodeName:r,anchorLocalPosition:[n.x,n.y,n.z]}}function pw(e,t,r){if(!e.anchorNodeName||!e.anchorLocalPosition)return!1;let n=Nn(t,e.anchorNodeName);return n?(n.updateWorldMatrix(!0,!1),r.set(...e.anchorLocalPosition).applyMatrix4(n.matrixWorld),!0):!1}import{useEffect as OO,useMemo as Vp,useRef as mw}from"react";import{useFrame as EO,useThree as DO}from"@react-three/fiber";import{Vector3 as Fp}from"three";function gc({annotation:e,enabled:t,controlsRef:r,offsetRef:n}){let o=DO(s=>s.scene),i=mw(null),a=mw(!1),l=Vp(()=>new Fp,[]),c=Vp(()=>new Fp,[]),d=Vp(()=>new Fp,[]),p=e?.anchorNodeName,m=e?.anchorLocalPosition;return OO(()=>{i.current=null,a.current=!1},[p,e?.id]),EO(()=>{let s=r.current,f=n.current;if(!t||!s||!f||!p||!m){a.current=!1;return}let u=i.current;if((!u||!u.parent)&&(u=Nn(o,p),i.current=u),!u){a.current=!1;return}u.updateWorldMatrix(!0,!1),l.set(m[0],m[1],m[2]).applyMatrix4(u.matrixWorld),!(a.current&&l.distanceToSquared(c)<1e-8)&&(c.copy(l),a.current=!0,d.copy(l).add(f),s.setLookAt(d.x,d.y,d.z,l.x,l.y,l.z,!0))}),null}import{useCallback as Zr,useEffect as Bi,useMemo as ji,useRef as Hp,useState as Jn}from"react";import{Box3 as TO,Raycaster as _O,Vector3 as Vo}from"three";var LO=[[0,0],[35,0],[-35,0],[0,30],[35,30],[-35,30],[70,0],[-70,0],[70,30],[-70,30],[0,60]];function BO(e,t,r,n){let o=[],i=!0;for(let s=e.parent;s;s=s.parent)if(!s.visible){i=!1;break}i&&e.traverseVisible(s=>{let f=s;f.isMesh&&!f.isSkinnedMesh&&o.push(s)});let a=Math.abs(r.y)>.99?new Vo(1,0,0):new Vo(0,1,0),l=new Vo().crossVectors(a,r).normalize(),c=n*.02,d=new _O,p={direction:r.clone(),clearance:-1};for(let[s,f]of LO){let u=r.clone().applyAxisAngle(a,s*Math.PI/180).applyAxisAngle(l,-f*Math.PI/180).normalize();d.set(t.clone().addScaledVector(u,c),u),d.far=n-c;let h=d.intersectObjects(o,!1)[0];if(!h)return t.clone().addScaledVector(u,n);h.distance>p.clearance&&(p={direction:u,clearance:h.distance})}let m=Math.max(c+p.clearance*.85,c*2);return t.clone().addScaledVector(p.direction,m)}function fw({sceneAnnotations:e,controlledAnnotationCategories:t,onAnnotationCategoriesChange:r,showAnnotationFilters:n,initialCategories:o,controlledActiveAnnotation:i,onActiveAnnotationChange:a,onAnnotationsChange:l,controlsRef:c,sceneRef:d,annotationWorldPositionsRef:p,tourCameraOffsetRef:m,initialCameraStateRef:s,engagement:f,engagementRef:u}){let[h,v]=Jn(!1),[x,b]=Jn(()=>e??[]);Bi(()=>{if(x.length>0){let oe=x.reduce((Ae,$e)=>Math.max(Ae,$e.id),0);M.current=oe}else M.current=0},[x]);let[S,w]=Jn(null),[P,y]=Jn({title:"",description:""}),M=Hp(0),[_,C]=Jn(null),[E,R]=Jn(-1),[O,D]=Jn(!1),B=Hp(null),[V,G]=Jn(()=>o),U=t===void 0?V:t,T=ji(()=>fg(x,U),[x,U]),A=ji(()=>[...new Set(x.map(mg))].sort(),[x]),Z=n&&A.some(Boolean),ee=oe=>{t===void 0&&G(oe),r?.(oe)},Y=ji(()=>[...T].sort((oe,Ae)=>oe.id-Ae.id),[T]),Q=ji(()=>JSON.stringify([U?.map(oe=>oe.trim()).sort()??null,Y]),[U,Y]),te=ji(()=>E<0||E>=Y.length?null:Y[E],[E,Y]),q=Zr(oe=>{if(i!==void 0){a?.(oe);return}C(oe?{annotation:oe}:null)},[i,a]),H=Hp(null),N=Zr(oe=>{let Ae=c.current,$e=d.current;if(!Ae)return;let ie=new Vo,Ie=p.current.get(oe.id);Ie?ie.copy(Ie):$e&&pw(oe,$e,ie)||ie.set(oe.worldPosition[0],oe.worldPosition[1],oe.worldPosition[2]),m.current=null;let ze=Ae.smoothTime;Ae.smoothTime=Gs(Ae,.6);let ge=oe.worldNormal;if(Vu(oe.cameraView))pa(Ae,oe.cameraView);else{if($e){let ke=new TO().setFromObject($e),Oe=new Vo;ke.getCenter(Oe);let We=new Vo;ke.getSize(We);let Lt=We.length()*.2,Bt;ge?Bt=new Vo(ge[0],ge[1],ge[2]):Bt=ie.clone().sub(Oe),Bt.lengthSq()<1e-6&&Bt.set(0,0,1),Bt.normalize();let yr=Math.max(Lt*.6,.3),dr=BO($e,ie,Bt,yr);Ae.setPosition(dr.x,dr.y,dr.z,!0),oe.anchorNodeName&&oe.anchorLocalPosition&&(m.current=dr.clone().sub(ie))}Ae.setTarget(ie.x,ie.y,ie.z,!0),H.current&&$s(Ae,H.current)}B.current&&clearTimeout(B.current),B.current=setTimeout(()=>{Ae.smoothTime=ze,B.current=null},800),q(oe)},[q]),J=Zr(()=>{Y.length!==0&&(c.current&&(H.current=Us(c.current)),f.startTour(Y.length),v(!0),R(0),N(Y[0]))},[Y,N,f]),ne=Zr(()=>{if(Y.length===0||E<0)return;D(!0);let oe=(E-1+Y.length)%Y.length;R(oe),N(Y[oe]),setTimeout(()=>D(!1),500)},[E,Y,N]),Ne=Zr(()=>{if(Y.length===0||E<0)return;if(E===Y.length-1){if(f.completeTour(),v(!1),R(-1),q(null),c.current&&s.current){let Ae=s.current;pa(c.current,{...H.current,...Ae}),H.current=null}return}D(!0);let oe=E+1;R(oe),N(Y[oe]),setTimeout(()=>D(!1),500)},[E,Y,N,q,f]),K=Zr(()=>{if(f.stopTour(),v(!1),R(-1),q(null),c.current&&s.current){let oe=s.current;pa(c.current,{...H.current,...oe}),H.current=null}},[q,f]);Bi(()=>{u.current.stopTour("annotations-changed"),H.current&&c.current&&(pa(c.current,{...H.current,...s.current??{}}),H.current=null),m.current=null,R(-1),v(!1)},[Q]),Bi(()=>()=>{B.current&&clearTimeout(B.current)},[]),Bi(()=>{te&&h&&H.current&&q(te)},[te,q,h]),Bi(()=>{if(e===void 0)return;let oe=e.map(Ae=>({...Ae,localPosition:Ae.localPosition??Ae.worldPosition}));b(oe)},[e]);let xe=Zr(()=>{if(i!==void 0){a?.(null);return}C(null)},[i,a]),Pe=i!==void 0?i:_?.annotation??null,ve=ji(()=>Pe?T.find(Ae=>Ae.id===Pe.id)??null:null,[Pe,T]);Bi(()=>{Pe&&!ve&&xe()},[Pe,ve,xe]);let mt=Zr(()=>{if(!S||!P.title.trim())return;M.current+=1;let Ae={id:M.current,worldPosition:S.worldPosition,localPosition:S.localPosition,worldNormal:S.worldNormal,anchorNodeName:S.anchor?.anchorNodeName,anchorLocalPosition:S.anchor?.anchorLocalPosition,title:P.title.trim(),description:P.description},$e=[...x,Ae];b($e),l?.($e),w(null)},[S,P,x,l]),ft=Zr(()=>w(null),[]),xt=Zr(oe=>{Vu(oe.cameraView)?N(oe):q(oe)},[q,N]);return{annotations:x,pendingAnnotation:S,setPendingAnnotation:w,annotationForm:P,setAnnotationForm:y,currentAnnotationIndex:E,isNavigating:O,localAnnotationCategories:V,selectedAnnotationCategories:U,visibleAnnotations:T,availableAnnotationCategories:A,annotationFiltersVisible:Z,changeAnnotationCategories:ee,sortedAnnotations:Y,currentAnnotation:te,setActiveAnnotation:q,focusAnnotation:N,startGuidedTour:J,goToPreviousAnnotation:ne,goToNextAnnotation:Ne,stopGuidedTour:K,closeViewingAnnotation:xe,activeAnnotation:Pe,activeViewingAnnotation:ve,isGuidedTourActive:h,handleAnnotationOk:mt,handleAnnotationCancel:ft,handleAnnotationMarkerClick:xt}}import{useCallback as bc,useEffect as gw,useMemo as jO,useRef as NO}from"react";import{Vector3 as IO}from"three";var bw=()=>`decal-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;function hw({currentObjectBindings:e,currentObjectBindingsRef:t,applyObjectBindings:r,nodeRefsMap:n,controlsRef:o,decalMove:i,decalDragging:a,setDecalDragging:l,setDecalError:c,setDecalControl:d,decalRequestRef:p,onTextureUpload:m,currentPanelObjectId:s,modelUrl:f}){let u=bc((y,M)=>{let _=t.current,C=_[y];if(!C)return;let E=M(C.decals??[]);r({..._,[y]:{...C,decals:E.length>0?E:void 0}})},[r,e]),h=jO(()=>{if(!a)return null;let{objectKey:y,decalId:M}=a,_=e[y],C=_?.decals?.find(E=>E.id===M);return C?{objectId:_.modelObjectId??y,decal:C,onCancel:()=>l(null),onCommit:E=>{u(y,R=>R.map(O=>O.id===M?{...O,...E}:O)),l(null)}}:null},[a,e,u]),v=i??h,x=bc((y,M)=>{p.current++;let _=t.current[y],C=n.current[_?.modelObjectId??y],E=Oh(C,o.current?.camera);if(!E)return c("Could not find a surface on this object for the decal."),!1;let R={...M,...E};return u(y,O=>[...O,R]),c(null),d(O=>O&&{...O,activeId:R.id}),l({objectKey:y,decalId:R.id}),!0},[u]),b=bc(y=>{let M=t.current[y],_=n.current[M?.modelObjectId??y]?.geometry;if(!_)return .2;_.boundingBox||_.computeBoundingBox();let C=_.boundingBox?.getSize(new IO),E=C?Math.max(C.x,C.y,C.z):0;return E>0&&Number.isFinite(E)?E/3:.2},[]),S=NO([]);gw(()=>()=>{for(let y of S.current)URL.revokeObjectURL(y)},[]);let w=bc(async(y,M,_)=>{let C=++p.current;l(null);let E;if(m){if(E=await m(_,y),C!==p.current)return}else E=URL.createObjectURL(_),S.current.push(E);x(M,{id:bw(),image:E,size:b(M)})},[b,m,x]);return gw(()=>{p.current++,c(null),l(null)},[s,f]),{editDecals:u,activeDecalMove:v,addCenteredDecal:x,decalSizeFor:b,startImageDecal:w,decalControlHandlers:(y,M)=>({onSelect:_=>{p.current++,c(null),l(null),d({...y,activeId:_})},onAddText:(_,C)=>x(M,{id:bw(),text:_,color:C,size:b(M)}),onAddImage:_=>{w(y.objectId,M,_)},onChange:(_,C)=>u(M,E=>E.map(R=>R.id===_?{...R,...C}:R)),onNudge:(_,C)=>{let E=t.current[M],R=E?.decals?.find(B=>B.id===_);if(!R)return;let O=n.current[E.modelObjectId??M],D=Dh(O,o.current?.camera,R,C);if(!D){c("No visible surface in that direction. Try another arrow or rotate the view.");return}c(null),l(null),u(M,B=>B.map(V=>V.id===_?{...V,...D}:V))},onMove:_=>{p.current++,e[M]?.decals?.find(E=>E.id===_)&&(c(null),l(E=>E?.objectKey===M&&E.decalId===_?null:{objectKey:M,decalId:_}))},onRemove:_=>{l(null),u(M,C=>C.filter(E=>E.id!==_)),d({...y,activeId:null})},onClose:()=>{p.current++,c(null),l(null),d(null)}})}}import{useEffect as zO,useRef as vw}from"react";function yw({canvasAreaElement:e,controlsRef:t,enabled:r}){let n=vw(new Set),o=vw(null);zO(()=>{let i=e;if(!i||!r)return;let a=new Set(["w","a","s","d"," ","c"]),l=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]),c=0,d=u=>u.code==="Space"?" ":u.key.toLowerCase(),p=()=>{n.current.clear(),c=0,o.current!==null&&(cancelAnimationFrame(o.current),o.current=null)},m=u=>{let h=t.current,v=n.current;if(!h||v.size===0){o.current=null,c=0;return}let x=c?Math.min((u-c)/1e3,.05):1/60;c=u;let b=Math.max(h.distance*.75,.01)*x;v.has("w")&&h.forward(b,!1),v.has("s")&&h.forward(-b,!1),v.has("a")&&h.truck(-b,0,!1),v.has("d")&&h.truck(b,0,!1),v.has(" ")&&h.truck(0,b,!1),v.has("c")&&h.truck(0,-b,!1),o.current=requestAnimationFrame(m)},s=u=>{if(u.target!==i){p();return}if(l.has(u.key)){let v=t.current;if(!v)return;u.preventDefault();let x=Math.PI/90,b=Math.max(v.distance*.05,.01);u.key==="ArrowUp"?u.shiftKey?v.forward(b,!0):v.rotate(0,-x,!0):u.key==="ArrowDown"?u.shiftKey?v.forward(-b,!0):v.rotate(0,x,!0):u.key==="ArrowLeft"?v.rotate(-x,0,!0):v.rotate(x,0,!0);return}let h=d(u);a.has(h)&&(u.preventDefault(),n.current.add(h),o.current===null&&(o.current=requestAnimationFrame(m)))},f=u=>{n.current.delete(d(u))};return i.addEventListener("keydown",s),i.addEventListener("keyup",f),i.addEventListener("blur",p),()=>{i.removeEventListener("keydown",s),i.removeEventListener("keyup",f),i.removeEventListener("blur",p),p()}},[e,t,r])}import{useCallback as Ni,useEffect as Gp,useRef as Ii}from"react";var xw=1,VO=4,FO=.0015,HO=.1,GO=8;function ww({moveZoomTarget:e,setMoveZoomTarget:t,currentObjectBindingsRef:r,materialRefsOut:n,rendererCaptureRef:o,canvasAreaRef:i,canvasAreaElement:a,applyBindingStyle:l}){let c=Ii(null),d=Ii(!1),p=Ii([0,0]),m=Ii([0,0]),s=Ii(1),f=Ii(null),u=Ni((w,P)=>{let y=e;if(!y)return;let M=r.current[y.objectKey]?.style?.material?.[y.textureKey],_=M?.path;if(!_)return;let C=M?.rotation??0,E=ci(y.textureKey),R=Mg(_,E),O=n.current[y.objectKey],D=Array.isArray(O)?O:O?[O]:[],B=sb[y.textureKey];for(let V of D){let G=V;B in G&&(G[B]=Pg(G.userData,y.textureKey,R,_,w,P,C))}o.current?.invalidate()},[e]),h=Ni(w=>{if(!e)return;w.currentTarget.setPointerCapture?.(w.pointerId),c.current={x:w.clientX,y:w.clientY},d.current=!1;let P=r.current[e.objectKey]?.style?.material?.[e.textureKey];if(p.current=P?.offset??[0,0],m.current=p.current,s.current=P?.scale??1,f.current===null){let y=()=>{o.current?.invalidate(),f.current=requestAnimationFrame(y)};f.current=requestAnimationFrame(y)}},[e]),v=Ni(w=>{if(!e||!c.current)return;let P=i.current,y=P?.clientWidth||1,M=P?.clientHeight||1,_=w.clientX-c.current.x,C=w.clientY-c.current.y;if(!d.current&&Math.hypot(_,C)<VO)return;d.current=!0;let E=-(_/y)*xw,R=C/M*xw,[O,D]=p.current,B=[O+E,D+R];m.current=B,u(B,s.current),l(e.objectKey,V=>({...V,material:{...V?.material,[e.textureKey]:{...V?.material?.[e.textureKey],path:r.current[e.objectKey]?.style?.material?.[e.textureKey]?.path,offset:B}}}))},[e,u,l]),x=Ni(w=>{if(!e)return;w.target?.releasePointerCapture?.(w.pointerId),f.current!==null&&(cancelAnimationFrame(f.current),f.current=null);let P=d.current,y=e;if(P){l(y.objectKey,M=>({...M,material:{...M?.material,[y.textureKey]:{...M?.material?.[y.textureKey],path:r.current[y.objectKey]?.style?.material?.[y.textureKey]?.path,offset:m.current}}})),c.current=null,d.current=!1;return}c.current=null,t(null)},[e,l]);Gp(()=>{if(!e)return f.current!==null&&(cancelAnimationFrame(f.current),f.current=null),()=>{f.current!==null&&(cancelAnimationFrame(f.current),f.current=null)}},[e]),Gp(()=>{let w=a;if(!(!w||!e))return w.addEventListener("pointermove",v),w.addEventListener("pointerup",x),w.addEventListener("pointercancel",x),()=>{w.removeEventListener("pointermove",v),w.removeEventListener("pointerup",x),w.removeEventListener("pointercancel",x)}},[a,e,v,x]);let b=Ni(w=>{if(!e)return;w.preventDefault();let P=e,y=Math.exp(-w.deltaY*FO),M=Math.min(GO,Math.max(HO,s.current*y));s.current=M,u(m.current,M),l(P.objectKey,_=>({..._,material:{..._?.material,[P.textureKey]:{..._?.material?.[P.textureKey],path:r.current[P.objectKey]?.style?.material?.[P.textureKey]?.path,scale:M}}}))},[e,u,l]);return Gp(()=>{let w=a;if(!(!w||!e))return w.addEventListener("wheel",b,{passive:!1}),()=>w.removeEventListener("wheel",b)},[a,e,b]),{beginMoveZoom:Ni(w=>{d.current=!1,c.current=null,t(w)},[t]),handleMoveZoomPointerDown:h}}import{useFrame as UO,useThree as $O}from"@react-three/fiber";var WO=.2;function Up({enabled:e,speed:t,controlsRef:r}){let n=$O(o=>o.invalidate);return UO((o,i)=>{!e||!r.current||(r.current.rotate(i*WO*t,0,!1),n())}),null}import{AlertTriangle as es,RotateCcw as XO,X as Sw}from"lucide-react";import{jsx as Tt,jsxs as Yn}from"react/jsx-runtime";function Cw({count:e,onDismiss:t}){let r=re();return Yn("div",{className:"ri-bindingsMismatchBanner",children:[Tt(es,{size:14,className:"ri-bindingsMismatchBanner__icon"}),Tt("span",{children:r(e===1?"bindingMismatchOne":"bindingMismatchMany",{count:e})}),Tt("button",{type:"button",className:"ri-bindingsMismatchBanner__dismiss",onClick:n=>{n.stopPropagation(),t()},"aria-label":r("dismiss"),children:Tt(Sw,{size:12})})]})}function Mw({triangles:e,offset:t,onDismiss:r}){let n=re();return Yn("div",{className:`ri-largeModelBanner ${t?"ri-largeModelBanner--offset":""}`,children:[Tt(es,{size:14,className:"ri-largeModelBanner__icon"}),Tt("span",{children:n("largeModelWarning",{millions:Math.round(e/1e6)})}),Tt("button",{type:"button",className:"ri-largeModelBanner__dismiss",onClick:o=>{o.stopPropagation(),r()},"aria-label":n("dismiss"),children:Tt(Sw,{size:12})})]})}function Pw({missing:e,total:t}){let r=re();return Yn("div",{className:"ri-uvCheckerBanner",role:"status",children:[Tt(es,{size:14,className:"ri-uvCheckerBanner__icon"}),Yn("span",{children:[e===t?"UV Checker: this model has no UV0 coordinates.":`UV Checker: ${e} of ${t} meshes have no UV0 coordinates.`," ",r("missingUVsAreShownInMagenta")]})]})}function kw({failure:e,source:t}){return Tt("div",{className:"ri-loadError",role:"alert",children:Yn("div",{className:"ri-loadError__card",children:[Yn("div",{className:"ri-loadError__header",children:[Tt(es,{size:16,"aria-hidden":"true"}),Tt("span",{className:"ri-loadError__title",children:e.title})]}),Tt("p",{className:"ri-loadError__detail",children:e.detail}),Tt("p",{className:"ri-loadError__source",children:t}),e.technical&&Tt("p",{className:"ri-loadError__technical",children:e.technical})]})})}function Rw({rebuilding:e,onReload:t}){let r=re();return Tt("div",{className:"ri-contextRecovery",role:"alert",children:Yn("div",{className:"ri-contextRecovery__card",children:[Tt(es,{size:24,"aria-hidden":"true"}),Tt("h2",{children:r(e?"contextRestoringTitle":"contextLostTitle")}),Tt("p",{children:r(e?"contextRestoringMessage":"contextLostMessage")}),Yn("button",{type:"button",onClick:t,disabled:e,children:[Tt(XO,{size:16,"aria-hidden":"true"}),r("reloadViewer")]})]})})}import{useCallback as hc}from"react";function Aw({applyBindingStyle:e,resolveObjectKey:t,onTextureUpload:r,fileInputRef:n,pendingObjectId:o,createdBlobUrls:i,texturePositioning:a,setMoveZoomTarget:l}){let c=hc((x,b)=>{let S=i.current[x];S&&URL.revokeObjectURL(S),b.startsWith("blob:")?i.current[x]=b:delete i.current[x],e(x,w=>({...w,material:{...w?.material,texture:{path:b}}}))},[e]),d=x=>{let b=x.target.files?.[0],S=o.current;if(!b||!S)return;let w=t(S);w&&(r?r(b,w).then(P=>c(w,P),P=>console.error("onTextureUpload failed:",P)):c(w,URL.createObjectURL(b)),x.target.value="")},p=x=>{o.current=x,n.current?.click()},m=x=>{let b=t(x);if(!b)return;e(b,w=>w?.material?.texture?{...w,material:{...w.material,texture:void 0}}:w);let S=i.current[b];S&&(URL.revokeObjectURL(S),delete i.current[b])},s=!!a,f=typeof a=="object"?a:void 0,u=hc((x,b,S)=>{if(f?.onOffsetChange){f.onOffsetChange(x,b,S);return}e(x,w=>{let P=w?.material?.texture;if(!P?.path)return w;let y=P.offset??[0,0],M=[y[0],y[1]];return M[b]=S,{...w,material:{...w?.material,texture:{...P,offset:M}}}})},[e,f]),h=hc((x,b)=>{if(f?.onRotationChange){f.onRotationChange(x,b);return}e(x,S=>{let w=S?.material?.texture;if(!w?.path)return S;let P=(b%360+360)%360;return{...S,material:{...S?.material,texture:{...w,rotation:P*Math.PI/180}}}})},[e,f]),v=hc(()=>{l(null),f?.onEndPositioning?.()},[f]);return{handleFileChange:d,triggerFileUpload:p,clearTexture:m,texturePositioningEnabled:s,texturePositioningOverrides:f,setMaterialTextureOffset:u,setMaterialTextureRotation:h,endMaterialTexturePositioning:v}}function Ow({materialPopup:e,resolveObjectKey:t,currentObjectBindings:r,nodeRefsMap:n,moveZoomTarget:o,texturePositioningEnabled:i,texturePositioningOverrides:a,setMaterialTextureOffset:l,setMaterialTextureRotation:c,endMaterialTexturePositioning:d}){let p=e?t(e.objectId):null,m=p?r[p]?.style?.material?.texture?.path:void 0,s=m?qs(m)??m:void 0,f=ab(p?n.current[p]:null),u=i?a?.offset??(p?r[p]?.style?.material?.texture?.offset:void 0):void 0,h=i?a?.rotationDegrees??(p?((r[p]?.style?.material?.texture?.rotation??0)*180/Math.PI%360+360)%360:0):0,v=i?a?.isPositioning??!!(p&&o?.objectKey===p&&o?.textureKey==="texture"):!1;return{materialTextureUrl:s,materialTargetTakesImage:f,materialTextureOffset:u,materialTextureRotationDegrees:h,isMaterialTexturePositioning:v,materialTextureOnOffsetChange:i?l:void 0,materialTextureOnRotationChange:i?c:void 0,materialTextureOnEndPositioning:i?d:void 0}}import{useId as Ew}from"react";import{Box as $p,Camera as qO,ChevronLeft as KO,ChevronRight as QO,Download as JO,FileImage as YO,Maximize as ZO,Minimize as eE,Orbit as tE,Play as Dw,Square as rE}from"lucide-react";import{Fragment as zi,jsx as be,jsxs as tt}from"react/jsx-runtime";function Tw({categories:e,selected:t,disabled:r,onChange:n}){let o=re();return tt("div",{className:"ri-annotationFilters",role:"group","aria-label":o("annotationCategories"),onPointerDown:i=>i.stopPropagation(),children:[be("span",{children:o("annotations")}),be("button",{type:"button","aria-pressed":t===null,disabled:r,onClick:()=>n(null),children:o("all")}),e.map(i=>be("button",{type:"button",disabled:r,"aria-pressed":t?.some(a=>a.trim()===i)??!1,onClick:()=>n(t===null?[i]:t.some(a=>a.trim()===i)?t.filter(a=>a.trim()!==i):[...t,i]),children:i||o("uncategorized")},i))]})}function _w({onCancel:e}){let t=re();return tt("div",{className:"ri-isolationPill",role:"status",onPointerDown:r=>r.stopPropagation(),children:[be("span",{className:"ri-isolationPill__label",children:t("decalDragHint")}),be("button",{type:"button",className:"ri-isolationPill__button",onClick:e,children:t("cancel")})]})}function Lw({label:e,onShowAll:t}){let r=re();return tt("div",{className:"ri-isolationPill",onPointerDown:n=>n.stopPropagation(),children:[be("span",{className:"ri-isolationPill__label",children:e}),be("button",{type:"button",className:"ri-isolationPill__button",onClick:t,children:r("showAll")})]})}function Bw({groups:e,activeVariants:t,onSelect:r}){let n=re();return be(zi,{children:e.map((o,i)=>tt("div",{className:"ri-variantPicker",role:"group","aria-label":o.name??n("materialVariants"),onPointerDown:a=>a.stopPropagation(),children:[o.name?be("span",{className:"ri-variantPicker__group","aria-hidden":"true",children:o.name}):null,o.variants.map(a=>{let l=t.includes(a.name);return tt("button",{type:"button",className:`ri-variantPicker__option ${l?"ri-variantPicker__option--active":""}`,"aria-pressed":l,onClick:()=>r(a.name),children:[a.swatch?be("span",{className:"ri-variantPicker__swatch",style:{background:a.swatch},"aria-hidden":"true"}):null,a.label]},a.name)})]},o.name??`group-${i}`))})}function jw({count:e,active:t,index:r,navigating:n,onStart:o,onPrevious:i,onNext:a,onStop:l}){let c=re();return t?tt(zi,{children:[tt("button",{className:"ri-tourButton",onClick:i,disabled:n||e===0||r<=0,title:c("previousAnnotation"),children:[be(KO,{size:16}),be("span",{children:c("previous")})]}),be("button",{className:"ri-tourButton ri-tourButton--stop",onClick:l,title:c("stopGuidedTour"),children:be(rE,{size:16})}),tt("button",{className:"ri-tourButton ri-tourButton--next",onClick:a,disabled:n||e===0,title:c("nextAnnotation"),children:[be("span",{children:c("next")}),be(QO,{size:16})]})]}):be("button",{className:"ri-navButtonSingle",onClick:o,disabled:e===0,title:c("startGuidedTour"),children:c("guidedTour")})}function Nw({fullscreen:e,disabled:t}){let r=re();return tt("div",{className:"mv-fullscreenWrapper",children:[e.error&&be("div",{className:"mv-fullscreenError",role:"alert",children:r.message(e.error)}),be("button",{type:"button",className:"mv-fullscreenButton",onClick:()=>{e.toggle()},disabled:e.pending||t,title:e.active?r("exitFullscreen"):r("enterFullscreen"),"aria-label":e.active?r("exitFullscreen"):r("enterFullscreen"),"aria-pressed":e.active,children:e.active?be(eE,{}):be(ZO,{})})]})}function Iw({open:e,current:t,disabled:r,onSelect:n,onToggle:o}){let i=re();return tt("div",{className:"mv-controllersWrapper",onPointerDown:a=>a.stopPropagation(),children:[e&&tt("div",{className:"mv-controllersMenu",children:[be("button",{type:"button",className:`mv-controllersMenuItem ${t==="orbit"?"mv-controllersMenuItem--active":""}`,onClick:()=>n("orbit"),children:i("orbitControl")}),be("button",{type:"button",className:`mv-controllersMenuItem ${t==="pointerLock"?"mv-controllersMenuItem--active":""}`,onClick:()=>n("pointerLock"),children:i("pointLock")})]}),be("button",{className:"mv-controllersButton",onClick:o,title:i("cameraController"),"aria-label":i("cameraControllerSettings"),disabled:r,children:be(tE,{size:15})})]})}function zw({menu:e,recording:t,hasScene:r,canCaptureImage:n,canRecord:o,hasCinematic:i,hasMultipleModels:a=!1}){let l=re(),c=Ew(),d=Ew(),{isDownloading:p,downloadMenuOpen:m,uvExportError:s,toggleDownloadMenu:f,handleDownloadMesh:u,handleDownloadSeparateMeshes:h,handleDownloadScreenshot:v,handleDownloadUvLayout:x,handleDownloadVideo:b,videoFormat:S,setVideoFormat:w,videoExportError:P}=e;return tt("div",{className:"mv-downloadWrapper",onPointerDown:y=>y.stopPropagation(),children:[m&&tt("div",{className:"mv-downloadMenu",children:[tt("button",{className:"mv-downloadMenuItem",onClick:u,disabled:p||t||!r,"aria-describedby":c,children:[be($p,{size:14}),l(a?"downloadCombinedGLB":"downloadGLB")]}),be("p",{className:"mv-downloadMenuDescription",id:c,children:l("downloadGLBDescription")}),e.openConfiguredAR&&tt("button",{type:"button",className:"mv-downloadMenuItem",onClick:e.openConfiguredAR,disabled:t||!r,"aria-haspopup":"dialog",children:[be($p,{size:14}),l("arConfiguredButton")]}),a&&tt(zi,{children:[tt("button",{className:"mv-downloadMenuItem",onClick:h,disabled:p||t||!r,"aria-describedby":d,children:[be($p,{size:14}),l("downloadSeparateGLBs")]}),be("p",{className:"mv-downloadMenuDescription",id:d,children:l("downloadSeparateGLBsDescription")})]}),be("div",{className:"mv-downloadMenuDivider"}),n&&tt(zi,{children:[tt("button",{className:"mv-downloadMenuItem",onClick:v,disabled:t||!r,children:[be(qO,{size:14}),l("downloadPNG")]}),be("div",{className:"mv-downloadMenuDivider"})]}),tt("button",{className:"mv-downloadMenuItem",onClick:x,disabled:t||!r,children:[be(YO,{size:14}),l("downloadUVLayout")]}),be("div",{className:"mv-downloadMenuDivider"}),tt("label",{className:"mv-downloadMenuItem",children:[l("videoFormat"),tt("select",{"aria-label":l("videoFormat"),value:S,onChange:y=>w(y.target.value),children:[be("option",{value:"auto",children:l("auto")}),be("option",{value:"webm",disabled:!fn("webm"),children:"WebM"}),be("option",{value:"mp4",disabled:!fn("mp4"),children:"MP4"}),be("option",{value:"gif",disabled:!fn("gif"),children:"GIF"})]})]}),tt("button",{className:"mv-downloadMenuItem",onClick:()=>{b("turntable")},disabled:t||!o||!fn(S),children:[be(Dw,{size:14}),l("recordTurntableVideo")]}),i&&tt("button",{className:"mv-downloadMenuItem",onClick:()=>{b("cinematic")},disabled:t||!o||!fn(S),children:[be(Dw,{size:14}),l("recordCinematicVideo")]}),!fn()&&!fn("gif")&&be("div",{className:"mv-downloadMenuNotice",role:"status",children:l("videoUnsupported")}),P&&be("div",{className:"mv-downloadMenuNotice",role:"alert",children:l.message(P)}),s&&be("div",{className:"mv-downloadMenuNotice",role:"status","aria-live":"polite",children:l.message(s)})]}),be("button",{className:"mv-downloadButton",onClick:f,disabled:p||t||!r,title:l("downloadOptions"),children:p?tt(zi,{children:[be("span",{className:"mv-downloadButton__spinner"}),l("exporting")]}):tt(zi,{children:[be(JO,{size:15}),l("download")]})})]})}function Vw({x:e,y:t,form:r,setForm:n,onOk:o,onCancel:i}){let a=re();return tt("div",{className:"ri-annotationPopup",style:{left:e,top:t},onPointerDown:l=>l.stopPropagation(),onClick:l=>l.stopPropagation(),children:[be("input",{autoFocus:!0,className:"ri-annotationInput",placeholder:a("annotationTitlePlaceholder"),value:r.title,onChange:l=>n(c=>({...c,title:l.target.value})),onKeyDown:l=>{l.key==="Enter"&&o(),l.key==="Escape"&&i()}}),be("textarea",{className:"ri-annotationTextarea",placeholder:a("description"),value:r.description,onChange:l=>n(c=>({...c,description:l.target.value})),onKeyDown:l=>{l.key==="Escape"&&i()},rows:5}),tt("div",{className:"ri-annotationActions",children:[be("button",{onClick:o,className:`ri-annotationOkBtn ${r.title.trim()?"":"disabled"}`,disabled:!r.title.trim(),children:a("ok")}),be("button",{onClick:i,className:"ri-annotationCancelBtn",children:a("cancel")}),be("div",{className:"ri-annotationIcons"})]})]})}import{useEffect as nE,useState as Fw}from"react";import{Fragment as vc,jsx as ot,jsxs as rt}from"react/jsx-runtime";function Hw({section:e,onChange:t}){let{isInsideEditor:r,tier:n}=Fn(),o=r&&!cl(n,"sectionPlanes"),[i,a]=Fw(""),l=e.mode??"plane",c=e.planes??[],d=c.find(u=>u.id===e.activePlaneId)??c[0],p=l==="planes"?d:e,m=u=>t(l==="planes"?{planes:c.map(h=>h.id===d?.id?{...h,...u}:h)}:u),s={x:0,y:1,z:2},f=()=>globalThis.crypto?.randomUUID?.()??`section-${Date.now()}-${Math.random().toString(36).slice(2)}`;return rt("div",{className:"ri-sectionControls",children:[o?ot(sh,{requiredTier:"starter",feature:"Multiple planes and section boxes"}):null,rt("label",{children:["Cut type",rt("select",{value:l,disabled:o,onChange:u=>{let h=u.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:[ot("option",{value:"plane",children:"Single plane"}),ot("option",{value:"planes",children:"Multiple planes"}),ot("option",{value:"box",children:"Section box"})]})]}),l==="planes"&&rt(vc,{children:[rt("label",{children:["Active plane",ot("select",{value:d?.id??"",onChange:u=>t({activePlaneId:u.target.value}),children:c.map(u=>rt("option",{value:u.id,children:[u.name,u.enabled?"":" (off)"]},u.id))})]}),rt("div",{className:"ri-sectionControls__actions",children:[ot("button",{type:"button",disabled:c.length>=6,onClick:()=>{let u=f();t({planes:[...c,{id:u,name:`Plane ${c.length+1}`,axis:"x",position:.5,flip:!1,enabled:!0}],activePlaneId:u})},children:"Add plane"}),ot("button",{type:"button",disabled:!d,onClick:()=>t({planes:c.filter(u=>u.id!==d?.id),activePlaneId:c.find(u=>u.id!==d?.id)?.id}),children:"Remove plane"})]}),d&&rt(vc,{children:[rt("label",{children:["Name",ot("input",{value:d.name,maxLength:200,onChange:u=>m({name:u.target.value.trim()||"Plane"})})]}),rt("label",{className:"ri-sectionControls__check",children:[ot("input",{type:"checkbox",checked:d.enabled,onChange:u=>m({enabled:u.target.checked})}),"Enable this plane"]})]})]}),l==="box"?rt(vc,{children:[rt("label",{children:["Draggable face",ot("select",{value:e.activePlaneId?.match(/^[xyz]-(min|max)$/)?e.activePlaneId:"x-min",onChange:u=>t({activePlaneId:u.target.value}),children:["x","y","z"].flatMap(u=>["min","max"].map(h=>rt("option",{value:`${u}-${h}`,children:[u.toUpperCase()," ",h]},`${u}-${h}`)))})]}),ot("div",{className:"ri-sectionControls__bounds",children:["x","y","z"].flatMap(u=>["min","max"].map(h=>{let v=(e.box??{min:[0,0,0],max:[1,1,1]})[h][s[u]];return rt("label",{children:[u.toUpperCase()," ",h,rt("output",{children:[Math.round(v*100),"%"]}),ot("input",{"aria-label":`${u.toUpperCase()} ${h}`,type:"range",min:"0",max:"1",step:".001",value:v,onChange:x=>t(ic(e,`${u}-${h}`,Number(x.target.value)))})]},u+h)}))}),rt("label",{className:"ri-sectionControls__check",children:[ot("input",{type:"checkbox",checked:!!e.invertBox,onChange:u=>t({invertBox:u.target.checked})}),"Keep outside box"]})]}):p&&rt(vc,{children:[rt("label",{children:["Orientation",rt("select",{value:p.normal?"custom":p.axis,onChange:u=>u.target.value==="custom"?m({normal:[1,1,0]}):m({axis:u.target.value,normal:void 0}),children:[ot("option",{value:"x",children:"X"}),ot("option",{value:"y",children:"Y"}),ot("option",{value:"z",children:"Z"}),ot("option",{value:"custom",children:"Angled plane"})]})]}),p.normal&&ot("div",{className:"ri-sectionControls__vector",children:[0,1,2].map(u=>rt("label",{children:["Normal ","XYZ"[u],ot(oE,{label:`Normal ${"XYZ"[u]}`,value:p.normal[u],onChange:h=>{let v=[...p.normal];v[u]=h,Math.hypot(...v)>1e-8&&m({normal:v})}})]},u))}),rt("label",{children:["Position",rt("output",{children:[Math.round(p.position*100),"%"]}),ot("input",{type:"range",min:"0",max:"1",step:".001","aria-label":"Section position",value:p.position,onChange:u=>m({position:Number(u.target.value)})})]}),rt("label",{className:"ri-sectionControls__check",children:[ot("input",{type:"checkbox",checked:p.flip,onChange:u=>m({flip:u.target.checked})}),"Keep the other side"]})]}),rt("details",{children:[rt("summary",{children:["Saved section presets (",e.presets?.length??0,")"]}),rt("form",{onSubmit:u=>{u.preventDefault();let h=i.trim();!h||(e.presets?.length??0)>=32||(t({presets:[...e.presets??[],{id:f(),name:h,settings:Fu(e)}]}),a(""))},children:[rt("label",{children:["Preset name",ot("input",{value:i,maxLength:200,onChange:u=>a(u.target.value)})]}),ot("button",{disabled:!i.trim()||(e.presets?.length??0)>=32,children:"Save current section"})]}),e.presets?.map(u=>rt("div",{className:"ri-sectionControls__actions",children:[ot("button",{type:"button",onClick:()=>t({...Fu(u.settings),normal:u.settings.normal,planes:u.settings.planes,activePlaneId:u.settings.activePlaneId,box:u.settings.box,invertBox:u.settings.invertBox,mode:u.settings.mode}),children:u.name}),ot("button",{type:"button","aria-label":`Delete preset ${u.name}`,onClick:()=>t({presets:e.presets?.filter(h=>h.id!==u.id)}),children:"Delete"})]},u.id))]}),ot("p",{children:"Visual cuts of the active asset. Multiple planes keep their common region. Presets are saved with your scene."})]})}function oE({label:e,value:t,onChange:r}){let[n,o]=Fw(String(t));return nE(()=>o(String(t)),[t]),ot("input",{type:"number",step:".1","aria-label":e,value:n,onChange:i=>{let a=i.target.value;o(a),a.trim()&&Number.isFinite(Number(a))&&r(Number(a))},onBlur:()=>o(String(t))})}import{useState as iE}from"react";import{Box as aE,ChevronDown as sE,Expand as lE,Grid3X3 as cE,Pause as uE,Play as dE,QrCode as pE,RectangleGoggles as mE,Slice as fE,Smartphone as Gw,Square as gE,X as bE}from"lucide-react";import{jsx as De,jsxs as en}from"react/jsx-runtime";function Uw({top:e,configuredHandoff:t=!1,xrStore:r,arSupported:n,vrSupported:o,quickLookSupported:i,mobileHandoffUrl:a,mobileHandoffOpen:l,onQuickLook:c,onOpenMobileHandoff:d}){let p=re();return en("div",{className:"ri-xrTools",style:{top:`${e}px`},children:[!n&&i&&en("button",{type:"button",className:"ri-xrButton",onClick:c,title:p("viewThisModelInARWithAppleQuickLook"),children:[De(aE,{size:16}),p("viewInAR")]}),(a||t&&!i)&&en("button",{type:"button",className:"ri-xrButton",onClick:d,title:p(t?"arConfiguredTitle":"openThisExperienceOnAPhoneForAR"),"aria-haspopup":"dialog","aria-expanded":l,children:[De(pE,{size:16}),De("span",{children:p(t?"arConfiguredButton":"openOnPhone")})]}),r&&n&&en("button",{type:"button",className:"ri-xrButton",onClick:()=>r.enterAR().catch(m=>{console.error("Failed to enter AR session:",m)}),title:p("viewThisModelInYourSpace"),children:[De(Gw,{size:16}),De("span",{children:p("enterAR")})]}),r&&o&&en("button",{type:"button",className:"ri-xrButton",onClick:()=>r.enterVR().catch(m=>{console.error("Failed to enter VR session:",m)}),title:p("viewThisModelInVR"),children:[De(mE,{size:16}),De("span",{children:p("enterVR")})]})]})}function $w({url:e,onClose:t}){let r=re();return De("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:n=>{n.target===n.currentTarget&&t()},children:en("section",{className:"ri-mobileHandoffDialog",role:"dialog","aria-modal":"true","aria-labelledby":"ri-mobileHandoffTitle",children:[De("button",{type:"button",className:"ri-mobileHandoffClose",onClick:t,"aria-label":r("closePhoneHandoff"),children:De(bE,{size:18})}),De(Gw,{size:22,"aria-hidden":"true"}),De("h2",{id:"ri-mobileHandoffTitle",children:r("viewInAR")}),De("p",{children:r("arScanCode")}),De("div",{className:"ri-mobileHandoffQr",children:De(hl,{value:e,size:208,level:"M",marginSize:4,title:r("qrCodeToOpenThisModelOnAPhone")})})]})})}function Ww({top:e,active:t,onToggle:r}){let n=re();return De("div",{className:"ri-uvCheckerTools",style:{top:`${e}px`},children:De("button",{type:"button",className:`ri-measureButton ${t?"ri-measureButton--active":""}`,onClick:r,title:n(t?"disableUVChecker":"enableUVChecker"),"aria-label":n(t?"disableUVChecker":"enableUVChecker"),"aria-pressed":t,children:De(cE,{size:16})})})}function Xw({top:e,open:t,factor:r,onToggleOpen:n,onFactorChange:o}){let i=re();return en("div",{className:"ri-explodeTools",style:{top:`${e}px`},children:[De("button",{type:"button",className:`ri-measureButton ${t||r>0?"ri-measureButton--active":""}`,onClick:n,title:i("explodedView"),"aria-pressed":t,children:De(lE,{size:16})}),t&&De("div",{className:"ri-explodeSlider",onPointerDown:a=>a.stopPropagation(),children:De("input",{type:"range",min:0,max:100,value:Math.round(r*100),onChange:a=>o(Number(a.target.value)/100),"aria-label":i("explodeAmount")})})]})}function qw({top:e,section:t,onChange:r}){let n=re(),[o,i]=iE(!1);return en("div",{className:"ri-sectionTools",style:{top:`${e}px`},children:[De("button",{type:"button",className:`ri-measureButton ${t.enabled?"ri-measureButton--active":""}`,onClick:()=>r({enabled:!t.enabled}),title:t.enabled?n("removeSectionCut"):n("sectionCut"),"aria-label":n("sectionCut"),"aria-pressed":t.enabled,children:De(fE,{size:16})}),t.enabled&&De("button",{type:"button",className:"ri-measureButton","aria-label":"Section settings",title:"Section settings","aria-expanded":o,onClick:()=>i(a=>!a),children:De(sE,{size:14})}),t.enabled&&o&&De("div",{className:"ri-sectionPanel",onPointerDown:a=>a.stopPropagation(),children:De(Hw,{section:t,onChange:r})})]})}function Kw({top:e,playing:t,disabled:r,onPlay:n,onPause:o,onStop:i}){let a=re();return en("div",{className:"ri-cinematicTools",style:{top:`${e}px`},children:[De("button",{type:"button",className:`ri-measureButton ${t?"ri-measureButton--active":""}`,disabled:r,onClick:t?o:n,title:a(t?"pauseCinematic":"playCinematic"),"aria-pressed":t,children:t?De(uE,{size:16}):De(dE,{size:16})}),t&&De("button",{type:"button",className:"ri-measureButton ri-measureButton--stop",onClick:i,title:a("stopCinematicAndResetCamera"),children:De(gE,{size:16})})]})}function Qw({progress:e,onCancel:t}){let r=re();return De("div",{className:"ri-recordingOverlay",onPointerDown:n=>n.stopPropagation(),children:en("div",{className:"ri-isolationPill",role:"status","aria-live":"polite",children:[De("span",{className:"ri-isolationPill__label",children:r("recordingVideo",{progress:e})}),De("button",{type:"button",className:"ri-isolationPill__button",onClick:t,children:r("cancel")})]})})}function Jw(e){let t={total:0,missing:0};return e.traverse(r=>{let n=r;!n.isMesh||!n.geometry||(t.total+=1,n.geometry.getAttribute("uv")||(t.missing+=1))}),t}import{useEffect as hE}from"react";function Yw({enabled:e,canvasAreaElement:t,fitAttemptedRef:r,fitInFlightRef:n,controlsRef:o,cameraFramingRef:i,nodeRefsMap:a,fitScene:l}){hE(()=>{if(!e)return;let c=t;if(!c)return;let d=null,p=new ResizeObserver(()=>{!r.current||n.current||(d&&clearTimeout(d),d=setTimeout(()=>{let m=o.current,s=i.current;if(s.kind==="view"&&m){if(Nh(m,s.target))return}else if(s.kind==="object"&&m){let f=a.current[s.key];if(f&&jh(m,f)){m.fitToBox(f,!0,fl).catch(()=>{});return}}l()},150))});return p.observe(c),()=>{p.disconnect(),d&&clearTimeout(d)}},[t,l,e])}import{Fragment as Xp,jsx as X,jsxs as Ar}from"react/jsx-runtime";var ME=vE(()=>import("./StreamingTilesModel-6Z7SIC2J.mjs"));function ts(e){let r=e.split(/[?#]/)[0].split("/");return(r[r.length-1]||e).replace(/\.[^./]+$/,"")||e}var kE=Object.freeze({}),RE=[],AE={};function OE(e){let t=Xh(uh(e)),r=t.props,n=Ml(r.activeModelId??Re(r.models?.find(v=>v.url===r.modelUrl)??{url:r.modelUrl}),r.tilesetUrl),o=se(n);o.current=n;let i=se(null),a=se(null),l=de(()=>{let v=a.current;v&&(i.current=v.snapshot())},[]),c=Pv(l),d=Av(e),[p,m]=he(null);Te(()=>()=>{p&&URL.revokeObjectURL(p)},[p]);let s=()=>{l();let v=o.current;a.current?.captureFrame().then(x=>{x&&(v===o.current?m(x):URL.revokeObjectURL(x))})};dn(()=>{i.current=null,m(null)},[n]);let f=se(null),u=Eb({loading:r.loading,reveal:r.reveal,rootRef:f,onPark:s}),{release:h}=c;return Te(()=>{u.live||h()},[u.live,h]),X(Sg,{labels:e.labels,children:Ar("div",{className:"ri-viewerSlot",ref:f,children:[t.error&&X("div",{className:"ri-configuredARError",role:"alert",children:t.error}),u.live?X(DE,{...r,contextRecovery:c,engagement:d,resumeRef:i,viewerHandleRef:a,offscreen:!u.visible,frame:p},c.generation):X(Db,{className:"ri-viewer",background:Ju(r.backgroundColor,r.sceneConfig),poster:p??r.poster,onReveal:u.awaitingReveal?u.reveal:void 0})]})})}var EE={};function DE({labels:e,contextRecovery:t,engagement:r,modelUrl:n,tilesetUrl:o,tilesErrorTarget:i=8,tilesCacheSize:a=800,onObjectCatalog:l,modelFormat:c,licenseKey:d,licenseValidationUrl:p,onLicenseStatusChange:m,hideLicenseCheckingOverlay:s=!1,objectBindings:f="auto",selectedObject:u,comparisonHighlights:h,multiSelectedKeys:v,selectedObjectRefs:x,selectedObjectOutlineColor:b,panelHoveredObject:S,onObjectBindingsChange:w,onObjectSelect:P,onObjectHover:y,onObjectDoubleClick:M,onDecalDoubleClick:_,onObjectContextMenu:C,decalMove:E,onObjectEditLeaseChange:R,onSelectionClear:O,onSceneLoaded:D,onModelLoaded:B,onAssetDiagnostics:V,onRuntimeStats:G,runtimeStatsIntervalMs:U,onLoadError:T,onProgress:A,onCameraControllerChange:Z,cameraControllerType:ee,onAction:Y,onHiddenObjectsChange:Q,onCameraChange:te,onViewerReady:q,onTextureUpload:H,onAnimationsReady:N,onSequencesReady:J,showSequenceControls:ne=!0,sequenceAutoPlay:Ne=!0,onModelAnimationsReady:K,onAnnotationsChange:xe,activeAnnotation:Pe,onActiveAnnotationChange:ve,camera:mt,cameraLimits:ft,backgroundColor:xt,shadows:oe=!0,showObjectBindingDataPanel:Ae=!0,customObjectBindingDataPanel:$e,customSceneObjectsPanel:ie,showSceneObjectsPanel:Ie=!0,showDownloadButton:ze=!0,downloadFilename:ge="model",showResetButton:ke=!0,showFullscreenButton:Oe=!1,showLoadingOverlay:We=!0,showMouseController:Lt=!1,mouseControllerPosition:Bt="center-bottom",mouseControllerOpacity:yr=1,moveSensitivity:dr=.08,zoomSensitivity:xr=1,sceneConfig:Or,onSceneConfigChange:kt,disableZoom:ye=!1,pageScroll:Se=!1,zoomOnSelected:Ve=!0,highlightOnHover:_e=!0,enableCameraControls:Qe=!0,onAutoFit:wt,refitOnResize:Gt=!0,renderMode:jt="demand",maxDpr:ht=2,preserveDrawingBuffer:rr=!1,webgpu:Vr=!1,performanceProfile:Qt="auto",dracoDecoderPath:Jt,ktx2TranscoderPath:Nt,meshopt:vt=!0,showMeasureTools:gt=!1,showUvCheckerButton:Vt=!1,showExplodeControls:nr=!1,showMaterialVariants:Cn=!0,showObjectNavigator:Ut=!0,showSectionTools:Zn=!1,isolation:eo,onIsolationChange:Mn,showIsolateControls:Fo=!1,cinematic:Er,measurementUnit:Pn="m",measurements:Vi,onMeasurementsChange:to,measurementSettings:ns,measurementModelId:Cc,onMeasurementSettingsChange:ro,enableXR:Ho=!1,usdzUrl:L,arScaleMode:j="normalized",mobileHandoffUrl:I,arHandoff:W,arLanding:F=!1,showAnnotationNavigation:ae=!0,showAnnotationOnHover:ce=!1,showAnnotationFilters:it=!0,annotationCategories:Xe,onAnnotationCategoriesChange:St,moveModeEnabled:qe=!1,scaleModeEnabled:je=!1,gizmoTool:Ft,showFloorGrid:we=!1,productOptions:Rt,objectTransformSpace:Yt="world",enableKeyboardNavigation:$t=!1,reducedMotion:Fi="user",showViewGizmo:or=!1,overlay:Wt,unsafe_sceneChildren:Go,autoRotate:i0,autoRotateSpeed:a0,onTexturePositioningChange:Mc,endTexturePositioningRef:os,texturePositioning:Qp,extraModelUrls:s0,onExtraModelError:Jp,onExtraModelLoaded:is,originalNodePoses:l0,models:Le,mergeModels:Pc,onMergeModelLoaded:Yp,onMergeModelError:Zp,poster:kc,resumeRef:em,viewerHandleRef:Rc,offscreen:c0,frame:Ac,onModelChange:tm,activeModelId:u0,onActiveModelChange:Oc}){let Xt=re(),me=u0??Re(Le?.find(g=>g.url===n)??{url:n}),rm=Le?.find(g=>Re(g)===me)?.visible!==!1,Dr=Ml(me,o),[_t]=he(()=>em.current?.model===Dr?em.current:null),kn=rh(Fi);Te(()=>()=>r.interrupt(),[r]);let nm=se(r);nm.current=r;let{autoBindings:Ec,controlled:om,currentBindings:Me,applyBindings:Tr,bindingsForModel:no,modelEdits:d0}=pv({modelUrl:n,activeModelId:me,tilesetUrl:o,models:Le,objectBindings:f,onChange:w,initialBindings:_t?.objectBindings,initialModelEdits:_t?.modelBindingEdits}),{isInsideEditor:wr,activeTab:p0,activeSubTab:m0,annotating:as,openMeasurementsPanel:f0,xrToolsTarget:im}=Fn(),g0=wr&&p0==="scene"&&m0==="lighting",Uo=Ah(d,p,m),[Dc,b0]=he(()=>_t?.lightEdits??{}),[ss,am]=he(_t?.variantEdit),[ls,sm]=he(_t?.sectionEdit),[cs,lm]=he(()=>_t?.measurementEdits??{}),Tc=JSON.stringify(Or?.measurements??null),cm=se(new Map);Te(()=>{let g=cm.current.get(Dr);cm.current.set(Dr,Tc),g!==void 0&&g!==Tc&&lm(k=>{let z={...k};return delete z[Dr],z})},[Dr,Tc]);let Ce=lt(()=>{let g=Cd(Or??Qs,Dc);return ss!==void 0&&(g={...g,model:Gu(g.model,ss)}),ls!==void 0&&(g={...g,section:{...fa,...g.section,...ls}}),cs[Dr]&&(g={...g,measurements:cs[Dr]}),g},[Or,Dc,ss,ls,cs,Dr]),$o=se(Ce);$o.current=Ce;let Hi=de(g=>{let k=$o.current,z={settings:{},items:[],...k.measurements,...g};kt?kt({...k,measurements:z}):lm($=>({...$,[Dr]:z}))},[Dr,kt]),um=de(g=>{to?to(g):Hi({items:g})},[to,Hi]),dm=de(g=>{ro?ro(g):Hi({settings:g})},[ro,Hi]),us=Vi??Ce.measurements?.items??RE,Gi=ns??Ce.measurements?.settings??AE,_c=Cc??ga(me),Ui=el(Gi,Pn),Lc=lt(()=>sn(Ce.model),[Ce.model]);Te(()=>{r.setActiveVariants(Lc)},[Lc,r]);let h0=Or?sn(Or.model).join(`
|
|
65
|
+
`):"";dn(()=>{am(void 0)},[h0,me,n]);let v0=JSON.stringify(Or?.section??null);dn(()=>{sm(void 0)},[v0,me,n]);let pm=de(g=>{if(kt){let k=$o.current;kt({...k,section:{...fa,...k.section,...g}});return}sm(k=>({...k,...g}))},[kt]),[mm,y0]=he(!1),fm=se([]),x0=de(g=>{let k=$o.current,z=sn(k.model),$=fm.current,fe=$.find(Ge=>Ge.variants.some(Ke=>Ke.name===g)),Be=z.find(Ge=>fe?fe.variants.some(Ke=>Ke.name===Ge):Ge===g)??null,Fe=z.includes(g)?z.filter(Ge=>Ge!==g):Ug(z,g,$);if(r.chooseVariant(Fe.includes(g)?g:null,Be,fe?.name??null),kt){kt({...k,model:Gu(k.model,Fe)});return}am(Fe)},[kt,r]),gm=de(g=>{if(kt){kt(Cd($o.current,g));return}b0(k=>{let z={...k};for(let[$,fe]of Object.entries(g))z[$]={...k[$],...fe};return z})},[kt]),[Bc,bm]=he(null),[jc,hm]=he(null),[vm,ym]=he(null),xm=se(0),[Nc,wm]=he(null),[Sm,Cm]=he(_t?.uvCheckerOverride??null),$i=Ce.model.renderer==="uv-checker",Ic=Vt?Sm??$i:$i,ir=lt(()=>{let g=Ic?"uv-checker":$i?"pbr":Ce.model.renderer;return g===Ce.model.renderer?Ce:{...Ce,model:{...Ce.model,renderer:g}}},[$i,Ce,Ic]);dn(()=>{Cm(null)},[me,n,Ce.model.renderer,Vt,o]);let zc=lt(()=>Ju(xt,Ce),[xt,Ce]),ds=lt(()=>({dracoDecoderPath:Jt,ktx2TranscoderPath:Nt,meshopt:vt}),[Jt,Nt,vt]),w0=lt(()=>gb(Qt),[Qt]),Ee=se(null),[Mm,S0]=he(()=>_t&&_t.cameraControllerType!=="pointerLock"?_t.cameraControllerType:"orbit"),[C0,Pm]=he(!1),oo=ee!==void 0?ee:Mm,ps=de(g=>{Pm(!1),g!==oo&&(S0(g),Z?.(g))},[oo,Z]),[Wi,km]=he(!1),Rm=se({dragging:!1,endedAt:-1/0}),Am=de(g=>{Rm.current={dragging:g,endedAt:g?-1/0:performance.now()},km(g)},[]),[Zt,Xi]=he(null),qi=!!(Qp||Mc||os),Om=se(Mc);Om.current=Mc,Te(()=>{Om.current?.(Zt)},[Zt]),Te(()=>{if(os)return os.current=()=>Xi(null),()=>{os.current=null}},[]),Te(()=>{Ee.current&&(Ee.current.dollySpeed=Math.max(xr,0))},[xr]),Te(()=>{Ee.current&&(Ee.current.enabled=Qe&&!Wi&&!mm&&!Zt)},[Qe,Wi,mm,Zt]);let Vc=se(null),Fc=se(new Map),Em=se(null),M0=se(null),Sr=se(null),Dm=se({});Te(()=>()=>{for(let g of Object.values(Dm.current))URL.revokeObjectURL(g)},[]);let It=se({}),Wo=se(Ca),[P0,k0]=he(0),Hc=de(()=>{k0(g=>g+1)},[]),Rn=se({}),ut=!!(Le&&Le.length>=1&&!o),ms=se(Le);ms.current=Le;let fs=se(new Map),{scenesByUrlRef:io,cameraHomesByUrlRef:_r,materialRefsByUrlRef:Tm,getMaterialRefsForUrl:R0}=cv(ut,Le),gs=se(null),_m=se(null),bs=Sv(Oe),Lr=se(null),[Gc,A0]=he(null),O0=de(g=>{Lr.current=g,A0(g)},[]);yw({canvasAreaElement:Gc,controlsRef:Ee,enabled:$t&&Qe&&!qe&&!je});let hs=se(null),[ao,vs]=he({}),[Lm,Uc]=he(null),[ys,$c]=he(null),[E0,D0]=he(null),[T0,_0]=he(null),[Br,Bm]=he(null),[L0,B0]=he({}),He=se(null),Wc=se(null),Xc=se(!1),jm=se(n);jm.current=n;let xs=se(null),qc=se(V);qc.current=V;let so=se(null),Kc=se(0),Nm=se(null),[j0,N0]=he(0),Fr=se(!1),Ki=se(!1),Qi=se(null),ws=se(!!mt);ws.current=!!mt;let jr=se(null),Ss=se(_t?.camera?{camera:_t.camera,home:_t.home}:null),[Cs,lo]=he(!!n),[An,co]=he(!n||!!wt||!!mt),[dt,Im]=he(!1),[Ji,zm]=he([]),[Yi,Qc]=he(!1),[uo,Jc]=he(null),[Vm,Xo]=he(!1),[I0,z0]=he(0),Yc=se(""),Fm=se(new Set),Hm=se(""),[Gm,Um]=he(!1),Zc=se(new Set),[$m,V0]=he(0),[eu,F0]=he(null),[H0,Wm]=he(!1),[tu,Xm]=he({total:0,missing:0}),[G0,qm]=he("loadingModel"),[U0,ru]=he(null),$0=Lb(U0),Hr=se({}),qo=de(()=>{let g=Ee.current;if(!g||jr.current)return;jr.current=bg(g,so.current??He.current);let k=Qi.current;k?.usesSlots&&(_r.current[k.url]=jr.current)},[_r]),[Ko,Km]=he(()=>_t?.explodeFactor??0),[W0,Qm]=he(!1);dn(()=>{Km(0),Qm(!1)},[me,n,o]);let Gr=lt(()=>{let g=Ce.cinematic,k=g?.enabled?{waypoints:g.waypoints,duration:g.duration,loop:g.loop,autoPlay:g.autoPlay}:null;return Er===void 0?k&&(k.waypoints?.length??0)>=2?k:null:Er===!1?null:Er===!0?k??{}:{...k??{},...Er}},[Er,Ce]),[Zi,qt]=he(!1),[Jm,On]=he(!1),nu=se(!1);Te(()=>{qt(!1),On(!1),nu.current=!1},[me,n,o]),Te(()=>{if(!(!Gr?.autoPlay||nu.current)&&dt&&An&&!Cs){if(nu.current=!0,kn)return;qt(!0),On(!1)}},[Gr,dt,An,Cs,kn]);let X0=de(()=>{qt(!1),On(!0)},[]),{captureVideo:ou,cancelVideo:iu,isRecording:Ym,recording:at,progress:q0,onProgress:Zm}=wv({rendererCaptureRef:Sr,controlsRef:Ee,cinematicConfig:Gr,ready:t.status==="ready"&&dt&&An&&!Cs,modelUrl:`${me}|${o??""}`,onCaptureStart:X0});Te(()=>{t.status==="lost"&&(r.interrupt(),iu(),qt(!1),Ee.current?.stop())},[t.status,iu,r]);let ar=lt(()=>Fh(()=>qt(!1)),[me,n]),au=lt(()=>({current:null}),[me,n]),[ef,tf]=he(()=>new Map),Ms=de((g,k)=>{tf(z=>z.get(g)===k?z:new Map(z).set(g,k))},[]),rf=se(N);rf.current=N;let nf=se(K);nf.current=K;let su=se(J);su.current=J;let of=de(g=>{au.current=g,rf.current?.(g),ut||Ms(me,g)},[au,ut,Ms,me]),K0=de((g,k)=>{Ms(g,k),nf.current?.(g,k)},[Ms]),Qo=lt(()=>{try{return Fs(Ce.sequences??[])}catch{return[]}},[Ce.sequences]),Jo=lt(()=>(ut&&Le?Le:[{url:n,id:me}]).flatMap(k=>{let z=Re(k),$=ef.get(z);return!$||k.visible===!1?[]:[{id:z,label:k.label||ts(k.url),controls:$,config:z===me?Ce.animations:(k.sceneConfig??Ce).animations}]}),[ut,Le,n,me,ef,Ce]),af=JSON.stringify(ut&&Le?Le.map(Re):[me]),lu=lt(()=>vl(Jo,Qo),[Jo,Qo]),[Q0,J0]=he(""),Ps=lu.find(g=>g.id===Q0),Y0=g=>{J0(g);let k=lu.find(z=>z.id===g);if(k)Pa(k,Jo,ar,!0);else{ar.stop();for(let $ of Jo)$.controls.stop(),$.config?.autoplayClip&&$.controls.play($.config.autoplayClip);let z=Qo.find($=>$.autoPlay);z&&ar.play(z.id)}};Te(()=>{let g=new Set(JSON.parse(af));tf(k=>[...k.keys()].every(z=>g.has(z))?k:new Map([...k].filter(([z])=>g.has(z))))},[af]);let{xrStore:Z0,xrRuntime:cu,xrResolving:eS,inARSession:uu,presenterRef:tS,arSupported:ks,checkingAR:rS,vrSupported:sf,quickLookSupported:Rs,resolvedMobileHandoffUrl:As,isMobileHandoffOpen:lf,arOverlay:nS,openMobileHandoff:oS,closeMobileHandoff:iS,openQuickLook:aS,handleARStateChange:sS}=xy({enableXR:Ho,usdzUrl:L,mobileHandoffUrl:I,configuredHandoff:!!W,engagement:r,animationControls:dt?X(rv,{sources:Jo,sequences:Qo,sequenceControls:ar}):null});Te(()=>(su.current?.(dt?ar:null),()=>su.current?.(null)),[ar,dt]),Te(()=>()=>ar.destroy(),[ar]),Te(()=>{kn&&ar.pause()},[ar,kn]);let Yo=Cb(Vr),cf=se(Yo);cf.current=Yo;let En=Yo==="webgpu",ea=En?null:Z0,uf=Zn||Ce.section?.enabled===!0;Te(()=>{if(!En)return;let g=[uf&&"the section cut",(qe||je)&&"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.`)},[En,uf,qe,je]);let{annotations:NE,pendingAnnotation:po,setPendingAnnotation:df,annotationForm:lS,setAnnotationForm:du,currentAnnotationIndex:cS,isNavigating:uS,localAnnotationCategories:dS,selectedAnnotationCategories:pS,visibleAnnotations:pf,availableAnnotationCategories:mS,annotationFiltersVisible:pu,changeAnnotationCategories:fS,sortedAnnotations:mu,currentAnnotation:mf,setActiveAnnotation:IE,focusAnnotation:zE,startGuidedTour:gS,goToPreviousAnnotation:bS,goToNextAnnotation:hS,stopGuidedTour:vS,closeViewingAnnotation:Os,activeAnnotation:VE,activeViewingAnnotation:Es,isGuidedTourActive:mo,handleAnnotationOk:yS,handleAnnotationCancel:xS,handleAnnotationMarkerClick:ff}=fw({sceneAnnotations:Or?.annotations,controlledAnnotationCategories:Xe,onAnnotationCategoriesChange:St,showAnnotationFilters:it,initialCategories:_t?.annotationCategories??null,controlledActiveAnnotation:Pe,onActiveAnnotationChange:ve,onAnnotationsChange:xe,controlsRef:Ee,sceneRef:He,annotationWorldPositionsRef:Fc,tourCameraOffsetRef:Vc,initialCameraStateRef:jr,engagement:r,engagementRef:nm}),wS=Ce.section??fa,gf=!F&&Cn&&dt&&Ji.length>0;fm.current=Ji;let bf=!F&&(ke||ze||Oe&&bs.supported||ae&&mu.length>0);Hr.current=Me,Te(()=>{if(!Zt)return;let g=Me[Zt.objectKey]?.style?.material?.[Zt.textureKey]?.path;(!qi||!g)&&Xi(null)},[Me,qi,Zt]);let fu=se({}),[Ds,SS]=he({});Te(()=>{let g={...Ds},k=!1,z=new Set;for(let[$,fe]of Object.entries(Me)){z.add($);let Be=fe.style?.material,Fe=fu.current[$]??{},Ge={};for(let At of ha){let er=Be?.[At]?.path;er&&(Ge[At]=er,er!==Fe[At]&&(g[$]!==At&&(k=!0),g[$]=At))}let Ke=g[$];if(Ke&&!Ge[Ke]){let At=ha.find(er=>!!Ge[er]);At?g[$]=At:delete g[$],k=!0}fu.current[$]=Ge}for(let $ of Object.keys(g))z.has($)||(delete g[$],delete fu.current[$],k=!0);k&&SS(g)},[Me]);let gu=lt(()=>Object.entries(Me).map(([g,k])=>JSON.stringify([g,k.modelObjectId,k.transform??null])).sort().join(""),[Me]),{measureMode:pr,measureModeRef:hf,measurePoints:bu,measurementTool:hu,areaClosed:vu,measurementError:CS,selectMeasurementTool:MS,undoMeasurementPoint:PS,finishMeasureArea:kS,snapMode:RS,setSnapMode:AS,snapPreview:vf,handleMeasurePointerMove:OS,clearSnapPreview:yf,showDimensions:yu,measureBox:Ts,modelBounds:xf,refreshBounds:wf,clearMeasurements:ES,toggleMeasureMode:DS,toggleDimensions:TS,handleMeasurePointerDown:_S,handleMeasureClick:LS,saveMeasurement:BS,canSaveMeasurement:jS,canCalibrate:NS,calibrate:IS,savedResults:zS,setSavedResults:Sf,exportMeasurementJson:VS,exportMeasurementCsv:FS,importMeasurements:HS}=by({canvasAreaRef:Lr,controlsRef:Ee,sceneRef:He,modelUrl:me,tilesetUrl:o,measurementModelId:_c,savedMeasurements:us,measurementSettings:Gi,measurementUnit:Pn,onMeasurementsChange:um,onMeasurementSettingsChange:dm,onCollectionChange:g=>{to?.(g.items),ro?.(g.settings),Hi(g)},modelRotation:Ce.model.rotation,bindingTransformSignature:gu,modelLoaded:dt,enabled:gt&&!at}),GS=de(()=>{if(!Le||Le.length<2)return null;let g=Le.map(k=>{let z=io.current[Re(k)];if(!z)return null;let $=Re(k)===me?Rn.current:Tm.current[Re(k)]?.current??{};return{scene:z,objectBindings:no(k),matRefs:$,label:k.label||ts(k.url)}}).filter(k=>k!==null);return g.length>0?g:null},[Le,me,n,no]),US=de(()=>{if(!Le||Le.length<2)return null;let g=Le.map(k=>{let z=io.current[Re(k)];return z?{scene:z,label:k.label||ts(k.url)}:null}).filter(k=>k!==null);return g.length>0?g:null},[Le]);Te(()=>{(Zi||pr||at||t.status!=="ready")&&ar.stop()},[ar,Zi,pr,at,t.status]);let xu=se(null),_s=se(Ce),$S=de(()=>{if(!dt)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?Le:void 0,k=g?g.filter(z=>z.visible!==!1).map(z=>{let $=Re(z),fe=io.current[$];if(!fe)throw new Error("Wait for every visible model to finish loading before preparing AR.");let Be=$===me?xu.current??no(z):ba(no(z),z.sceneConfig?.product).objectBindings;return{scene:fe,instanceId:$,objectBindings:Be,sceneConfig:$===me?_s.current:z.sceneConfig??_s.current,materialOverrides:$===me?Rn.current:Tm.current[$]?.current}}):He.current?[{scene:He.current,instanceId:me,sceneConfig:_s.current,objectBindings:xu.current??Me,materialOverrides:Rn.current}]:[];if(!k.length)throw new Error("Wait for a visible model to finish loading before preparing AR.");for(let z of k)ib(z.scene);return ov(k,F?Ps:void 0,me)},[dt,o,ut,Le,no,me,Me,F,Ps]),[WS,XS]=he(34),Cf=se(void 0),qS=iy({openConfiguredAR:Ho&&W?()=>Cf.current?.():void 0,sceneRef:He,materialRefs:Rn,rendererCaptureRef:Sr,objectBindings:Me,downloadFilename:ge,getAllLoadedModels:GS,getAllLoadedModelUvSources:US,captureVideo:ou}),Mf=lt(()=>Object.fromEntries(Object.entries(Me).filter(([,g])=>g.visible===!1).map(([g])=>[g,!0])),[Me]),Dn=lt(()=>{let g=new WeakMap,k=new Map,z=new Map;for(let[$,fe]of Object.entries(Me))g.set(fe,$),k.has(fe.id)||k.set(fe.id,$),z.has(fe.modelObjectId)||z.set(fe.modelObjectId,$);return{byReference:g,byId:k,byModelObjectId:z}},[Me]),Nr=de(g=>g?Dn.byReference.get(g)??Dn.byModelObjectId.get(g.modelObjectId)??Dn.byId.get(g.id)??null:null,[Dn]),wu=u!==void 0,fo=wu?u??null:T0,nt=Nr(fo);Te(()=>{r.setSelectedPart(nt)},[nt,r]);let go=nt?It.current[nt]??null:null,KS=nt?Ds[nt]:void 0,Pf=Nr(_e?S??ys??E0:null),QS=Pf?It.current[Pf]??null:null,Su=x??(v?v.map(g=>It.current[g]).filter(Boolean):null),Ls=lt(()=>{let g=Su??(go&&Me[nt??""]?.transform?.shear?[go]:null);if(!g?.length)return null;let k=new Set(g),z=Object.entries(It.current).filter(([,$])=>k.has($)).map(([$,fe])=>({key:$,node:fe,transform:Me[$]?.transform}));return z.length>1||z.some(({transform:$})=>$?.shear)?z:null},[Su,Me,go,nt]),kf=de(g=>{D0(g),y?.(g)},[y]),Rf=Ae&&fo!==null&&nt!==null,bo=(nt?Me[nt]:null)??fo,ta=bo&&(bo.modelObjectId||bo.id)||null,ra=ta?L0[ta]??null:null,[JS,Af]=he(""),Of=se(null);Te(()=>{let g=Of.current;if(g!==nt)if(Of.current=nt,nt){let k=bo?.label||fo?.label||nt;Af(Xt("objectSelected",{name:k}))}else g&&Af(Xt("selectionCleared"))},[nt,bo,fo,Xt]),Te(()=>{Q?.(Mf)},[Mf,Q]);let Zo=de((g,k)=>{if(oo==="pointerLock"){ps("orbit");return}g&&k?r.viewPart({objectId:g.id,objectKey:Nr(g)??(g.modelObjectId||g.id),label:g.label,source:k}):g||r.setSelectedPart(null),wu||_0(g),P?.(g)},[oo,ps,wu,P,Nr,r]),Ef=se(_t?.objectBindings?`${n}
|
|
66
|
+
${o??""}`:null),Bs=de((g,k)=>{if(!Ec)return;let z=`${n}
|
|
67
|
+
${o??""}`,$=Ef.current===z?Hr.current:kE;Ef.current=z;let fe=oh(g,k);for(let Be of Object.keys(fe))$[Be]&&(fe[Be]=$[Be]);Tr(fe)},[Ec,n,o,Tr]),{glowMemoryRef:Df,readObjectGlow:Tf,applyGlow:_f}=_v({nodeRefsMap:It,currentObjectBindingsRef:Hr,applyObjectBindings:Tr}),YS=de(g=>{let k=nt;if(!k||!g)return;let z=Hr.current[k];z&&Tr({...Hr.current,[k]:{...z,transform:{...z.transform,...g}}})},[Tr,nt]),ZS=de(g=>{let k=Hr.current,z={...k};for(let{key:$,transform:fe}of g){let Be=k[$];Be&&(z[$]={...Be,transform:{...Be.transform,...fe}})}Tr(z)},[Tr]),Tn=de((g,k)=>Me[g]?g:k?Nr(k):Dn.byId.get(g)??Dn.byModelObjectId.get(g)??null,[Me,Nr,Dn]),js=de((g,k)=>{let z=Tn(g),$=z?Me[z]:void 0;!z||!$||Tr({...Me,[z]:{...$,style:k($.style)}})},[Tn,Me,Tr]),Ur=de(()=>{if(Br){let g=ao[Br.objectId]?.hex;g!==void 0&&(js(Br.objectId,k=>({...k,material:{...k?.material,baseColor:g}})),vs(k=>({...k,[Br.objectId]:{}})))}Bm(null)},[Br,ao,js]),Cu=de(()=>{Zo(null),Uc(null),Ur()},[Zo,Ur]),eC=de((g,k,z,$,fe)=>{let Be=_m.current,Fe=Lr.current,Ge=Ee.current?.camera;if(!Be)return{objectId:g,x:24,y:24};let Ke=Be.getBoundingClientRect(),At=12,er=Ke.width-k-At,rn=Ke.height-z-At,aa=Math.max(At,(Ke.width-k)/2),sa=Math.max(At,(Ke.height-z)/2),la=Tn(g,$),$r=la?It.current[la]:null,fr=(nn,on)=>on<=At?At:Math.min(Math.max(nn,At),on);if(Fe&&Ge&&$r){let nn=Fe.getBoundingClientRect(),on=new Wp;new xE().setFromObject($r).getCenter(on),on.project(Ge);let Ln=(on.x+1)/2*nn.width+(nn.left-Ke.left),da=(1-on.y)/2*nn.height+(nn.top-Ke.top);return{objectId:g,x:fr(Ln+24,er),y:fr(da-z/2,rn)}}let ca=typeof fe?.screenX=="number"?fe.screenX-Ke.left:aa,ua=typeof fe?.screenY=="number"?fe.screenY-Ke.top:sa;return{objectId:g,x:fr(ca,er),y:fr(ua,rn)}},[Tn]),Ns=Lv({setCurrentAction:Uc,bindingKeyIndex:Dn,currentObjectBindings:Me,applyObjectBindings:Tr,resolveObjectKey:Tn,closeColorPicker:Ur,setColorPicker:Bm,setMaterialPopupsByObject:B0,setItemMaterials:vs,getPopoverPosition:eC,decalRequestRef:xm,setDecalError:ym,setDecalDragging:wm,setDecalControl:hm,resolvedSceneConfigRef:$o,applyLightPatches:gm,readObjectGlow:Tf,applyGlow:_f,glowMemoryRef:Df,setLightControl:bm,onAction:Y});Te(()=>{if(Br)return window.addEventListener("pointerdown",Ur),()=>window.removeEventListener("pointerdown",Ur)},[Br,Ur]),Te(()=>{if(!Es)return;let g=k=>{if(hs.current&&!hs.current.contains(k.target)){if(k.target.closest?.(".ri-annotationMarker"))return;Os()}};return document.addEventListener("mousedown",g),document.addEventListener("touchstart",g),()=>{document.removeEventListener("mousedown",g),document.removeEventListener("touchstart",g)}},[Es,Os]),Te(()=>{if(!po)return;let g=k=>{let z=k.target;if(z.closest?.(".ri-annotationPopup")||z.closest?.("button, input, textarea, .ri-measureTools, .ri-xrTools, .ri-buttonContainer"))return;let $=Lr.current;!$||!$.contains(z)||(df(null),du({title:"",description:""}))};return document.addEventListener("mousedown",g,!0),document.addEventListener("touchstart",g,!0),()=>{document.removeEventListener("mousedown",g,!0),document.removeEventListener("touchstart",g,!0)}},[po]);let{handleFileChange:tC,triggerFileUpload:Lf,clearTexture:Bf,texturePositioningEnabled:rC,texturePositioningOverrides:nC,setMaterialTextureOffset:oC,setMaterialTextureRotation:iC,endMaterialTexturePositioning:aC}=Aw({applyBindingStyle:js,resolveObjectKey:Tn,onTextureUpload:H,fileInputRef:Em,pendingObjectId:M0,createdBlobUrls:Dm,texturePositioning:Qp,setMoveZoomTarget:Xi}),Mu=se(q);Mu.current=q;let Cr=de(()=>{let g=Ee.current;!g||!Mu.current||Mu.current({objectBindings:Hr.current,homeCameraState:jr.current,captureImage:k=>Ym()?Promise.reject(new Error("Wait for video export to finish before capturing an image.")):xl(Sr.current,k),isLoadingTiles:()=>Xc.current,captureVideo:ou,invalidate:()=>Sr.current?.invalidate(),rendererBackend:cf.current??"webgl",raw:{controls:g,scene:He.current,nodes:It.current}})},[ou,Ym]),ei=de(async(g=!1)=>{let k=Ee.current,z=so.current??He.current;if(!k||!z)return!1;Wo.current=Ca;try{return await Ih(k,z,{flyIn:g,onStart:()=>co(!0),invalidate:()=>Sr.current?.invalidate()}),(so.current??He.current)!==z?!1:(Fr.current=!0,qo(),Cr(),!0)}catch($){return console.error("Fit scene error:",$),!1}},[qo,Cr]);Te(()=>{let g={url:me,usesSlots:ut},k=_h(Qi.current,g,(ms.current??[]).map(Ge=>Re(Ge)),io.current,_r.current,wr),z=Qi.current?_r.current[Qi.current.url]:void 0;if(k&&z&&!_r.current[me]&&(_r.current[me]=z),Qi.current=g,Fr.current=!1,Ki.current=!1,jr.current=ut?_r.current[me]??null:null,He.current=null,Wc.current=null,Xc.current=!1,xs.current=null,so.current=null,Im(!1),zm([]),Qc(!1),Jc(null),Xo(!1),Yc.current="",Fm.current=new Set,Zc.current=new Set,Xm({total:0,missing:0}),qm("loadingModel"),ru(null),_t?.model!==Ml(me,o)&&(Ss.current=null),!n){lo(!1),co(!0);return}if(ut&&fs.current.has(me)){lo(!1),co(!0);return}lo(!k),co(k||!!wt||ws.current);let $=!1,fe=null,Be=Ge=>{fe=setTimeout(Fe,Ge)},Fe=()=>{if($||Fr.current||Ki.current||ut&&fs.current.has(me))return;let Ge=so.current??He.current;if(!Ee.current||!Ge){Be(100);return}Kc.current=Lh(Ge,Ee.current,ft?.maxDistance)??Kc.current;let Ke=Ss.current;if(Ke){Ss.current=null,kv(Ee.current,Ke.camera),Fr.current=!0,Ke.home?(jr.current=Ke.home,ut&&(_r.current[me]=Ke.home)):qo(),Cr(),lo(!1),co(!0),Sr.current?.invalidate();return}if(dg(Ee.current)||k){Fr.current=!0,qo(),Cr(),lo(!1),co(!0),Sr.current?.invalidate();return}Ki.current=!0,(wt?wt():ws.current?Promise.resolve(!0):ei(!0)).then(er=>{$||(Fr.current=er!==!1,Fr.current?(qo(),Cr(),lo(!1)):$||Be(100))}).catch(()=>{Fr.current=!1,$||Be(100)}).finally(()=>{$||(Ki.current=!1)})};return Be(50),()=>{$=!0,fe&&clearTimeout(fe)}},[qo,_r,ft?.maxDistance,ei,me,wr,n,Cr,wt,_t,o,ut]),Yw({enabled:Gt,canvasAreaElement:Gc,fitAttemptedRef:Fr,fitInFlightRef:Ki,controlsRef:Ee,cameraFramingRef:Wo,nodeRefsMap:It,fitScene:ei});let Is=de(g=>{let k=Ee.current;if(!k)return;let z=g.cameraState;if(z?.position&&z?.target){let[Be,Fe,Ge]=z.position,Ke=new Wp(...z.target);k.setPosition(Be,Fe,Ge,!0),k.setTarget(Ke.x,Ke.y,Ke.z,!0),Wo.current={kind:"view",target:Ke};return}let $=Nr(g),fe=$?It.current[$]:null;!$||!fe||(k.fitToBox(fe,!0,fl).catch(()=>{}),Wo.current={kind:"object",key:$})},[Nr]);Te(()=>{nt||(Wo.current=Ca)},[nt]);let Pu=de((g,k="canvas")=>{if(hf.current)return;let z=Rm.current;z.dragging||performance.now()-z.endedAt<150||(qt(!1),Ur(),Uc(null),Zo(g,k),!(ye||!Ve)&&Is(g))},[Zo,Ur,Is,ye,Ve]),{beginMoveZoom:jf,handleMoveZoomPointerDown:sC}=ww({moveZoomTarget:Zt,setMoveZoomTarget:Xi,currentObjectBindingsRef:Hr,materialRefsOut:Rn,rendererCaptureRef:Sr,canvasAreaRef:Lr,canvasAreaElement:Gc,applyBindingStyle:js}),Nf=de(g=>{if(!qi)return!1;let k=Nr(g);if(!k)return!1;let z=Ds[k];return z?(jf({objectKey:k,textureKey:z}),!0):!1},[qi,Nr,Ds,jf]),ku=se(!1),{editDecals:HE,activeDecalMove:ti,addCenteredDecal:GE,decalSizeFor:lC,startImageDecal:UE,decalControlHandlers:cC}=hw({currentObjectBindings:Me,currentObjectBindingsRef:Hr,applyObjectBindings:Tr,nodeRefsMap:It,controlsRef:Ee,decalMove:E,decalDragging:Nc,setDecalDragging:wm,setDecalError:ym,setDecalControl:hm,decalRequestRef:xm,onTextureUpload:H,currentPanelObjectId:ta,modelUrl:me}),zs=Rt===!0?EE:Rt||null,ho=ir.product?JSON.stringify([me,ir.product.definition.id,ir.product.definition.revision]):null,[Ru,uC]=he(null),ri=lt(()=>ir.product&&zs&&Ru?.key===ho?{...ir.product,selections:Ru.selections}:ir.product,[ir.product,zs,Ru,ho]),dC=de(g=>{uC(ho?{key:ho,selections:g}:null)},[ho]),na=lt(()=>ba(Me,ri,sn(ir.model),Ji),[Me,ri,ir.model,Ji]);xu.current=na.objectBindings;let Ht=lt(()=>ri?{...ir,product:ri,model:{...ir.model,activeVariants:na.activeVariants}}:ir,[ir,ri,na.activeVariants]);_s.current=Ht;let If=lt(()=>Zb(na.objectBindings,Ht.styleRules),[na.objectBindings,Ht.styleRules]),[zf,Vf]=he(()=>_t?.isolation??null);dn(()=>{Vf(null)},[me,n]);let vo=eo!==void 0?eo:zf,Au=de(g=>{eo===void 0&&Vf(g),Mn?.(g)},[eo,Mn]),mr=lt(()=>th(If,vo),[If,vo]),pC=lt(()=>({bindings:mr.bindings,model:Ht.model,camera:Ht.camera,animations:Ht.animations}),[mr.bindings,Ht.model,Ht.camera,Ht.animations]),yo=qh({revision:JSON.stringify([Ko,F?Ps?.id:null]),enabled:Ho&&!!W,options:nl(W),baseUrl:I,autoPrepare:F&&!ks&&Rs&&dt,preparePhoneLink:!F,state:{version:1,objectBindings:Me,configuration:{modelUrl:n,modelFormat:c,tilesetUrl:o,activeModelId:me,models:Le?.map(g=>({...g,objectBindings:no(g),sceneConfig:Re(g)===me?Ht:g.sceneConfig})),mergeModels:Pc,sceneConfig:Ht,arScaleMode:j,isolation:vo,backgroundColor:xt,shadows:oe}},getSources:$S});Cf.current=yo.show;let tn=lt(()=>mr.setAside.size>0?eh(Me,vo):null,[mr,Me,vo]),mC=de(g=>{let k=Nr(g),z=k!==null&&tn?.size===1&&tn.has(k);Au(z?null:{...vo,target:g.id})},[Au,vo,tn]),{sourceOf:_n}=mr,fC=lt(()=>Ut?Vx(Me,mr):[],[Ut,Me,mr]),Ou=de(g=>{let k=_n(g);Pu(k)},[Pu,_n]),Eu=de(g=>kf(g&&_n(g)),[kf,_n]),Du=de((g,k)=>{let z=_n(g);return M?.({binding:z,...k})===!0?(ku.current=!0,!0):Nf(z)},[M,Nf,_n]),Tu=lt(()=>C?(g,k)=>C({binding:_n(g),...k}):void 0,[C,_n]),Ff=de(g=>{Zo(g,"panel"),!ye&&Is(g)},[Zo,Is,ye]);Te(()=>{Cr()},[Cr,Me,P0]);let Hf=se(0),Gf=de((g,k)=>{Hf.current=k.distance,Bh(k,Kc.current),te?.(vg(g,k)),Cr()},[Cr,te]),gC=de(g=>{Nm.current=new Set(g.map(k=>k.name)),N0(k=>k+1),Bs(g.map(k=>k.name)),l?.(g)},[Bs,l]),bC=de(g=>{so.current=g,Sr.current?.invalidate()},[]),ni=de(g=>{He.current=g,wf(g),Xm(Jw(g));let k=xb(g);F0(k>Ku?k:null),Wm(!1),ru(null),k>Ku&&qm("preparingLargeModel"),Im(!0),zm($g(g)),Qc(!1),Jc(null),Um(!1),o||(l&&l(ux(g)),Bs(ah(g),ih(g))),D?.(g),B?.(Yb(g)),Cr()},[Bs,Cr,B,l,D,wf,o]),hC=de(()=>so.current??He.current,[]),{background:_u}=Ce,vC=_u.enabled&&_u.type==="color"&&new wE(_u.color).getHSL({h:0,s:0,l:0}).l>.5?"#000000":"#ffffff",oa=dt?He.current:null,Uf=!!V;Te(()=>{if(!Uf)return;if(Yi){if(xs.current?.url!==n||xs.current.error!==uo)return;let k=uo&&typeof uo=="object"?va(uo):void 0;qc.current?.(vb({...k,name:k?.name??Xu(n),format:k?.format??c??qu(n).format}));return}if(!oa||He.current!==oa)return;let g=qu(n);qc.current?.(hb(oa,{scope:o?"resident-tiles":"asset",source:{...va(oa),format:o?"3d-tiles":c??g.format,name:g.entryPath??Xu(n)}}))},[Uf,oa,n,c,o,$m,Yi,uo]);let Lu=de(g=>{lo(!1),co(!0),Qc(!0),Jc(g),xs.current={url:jm.current,error:g},T?.(g)},[T]),{reportError:$f,clearError:Wf}=sv({enabled:ut,activeUrl:me,models:Le,errorsRef:fs,activeFailed:Yi,activeError:uo,onActiveError:Lu,onExtraError:Jp}),yC=de((g,k)=>{!ut||!ms.current?.some(z=>Re(z)===g)||(delete io.current[g],delete _r.current[g],$f(g,k))},[ut,$f,_r]),xC=de((g,k)=>{!ut||!ms.current?.some(z=>Re(z)===g)||(Wf(g),io.current[g]=k,g===me&&(gs.current!==g||He.current!==k)&&(gs.current=g,ni(k)),is?.(g,k))},[ut,me,n,ni,is,Wf]);Te(()=>{if(!ut||fs.current.has(me))return;let g=io.current[me];g&&(gs.current===me&&He.current===g||(gs.current=me,ni(g)))},[ut,me,n,dt,ni]);let Xf=de((g,k)=>{Zc.current.add(g),V0(z=>z+1),Yp?.(g,k)},[Yp]),qf=ut&&Le?Le.find(g=>Re(g)===me)?.mergeModels:Pc,Kf=lt(()=>new Set((qf??[]).map(g=>g.url)),[qf]),Qf=de(g=>{g.lengthComputable&&g.total>0&&ru(g.loaded/g.total*100),A?.(g)},[A]),wC=de((g,k,z,$)=>{if(!kt)return;let fe={...Ce,lighting:{...Ce.lighting,lights:Ce.lighting.lights.map(Be=>Be.id===g?{...Be,position:k,...z?{rotation:z}:{},...$?{target:$}:{}}:Be)}};kt(fe)},[Ce,kt]);Te(()=>{let g=He.current;if(!dt||!g){Xo(!1);return}if(Array.from(Kf).some(Fe=>!Zc.current.has(Fe))){Xo(!1);return}let z=Object.entries(Me).filter(([,Fe])=>!Fe.removed);if(z.length===0){Xo(!1);return}let $=o?Nm.current:(()=>{let Fe=Fm.current;for(let Ge of Object.keys(Bn(g).nodesById))Fe.add(Ge);return Fe})();if(!$||$.size===0){Xo(!1);return}let fe=z.map(([Fe,Ge])=>Ge.modelObjectId??Fe).filter(Fe=>!$.has(Fe));Xo(fe.length>0),z0(fe.length);let Be=fe.join(`
|
|
68
|
+
`);if(fe.length>0&&Be!==Yc.current){let Fe=fe.slice(0,10).map(Ke=>`"${Ke}"`).join(", "),Ge=fe.length>10?` and ${fe.length-10} more`:"";console.warn(`[react-immersive] ${fe.length} object binding(s) point at nodes this model doesn't have, so they can't be selected: ${Fe}${Ge}. Each binding's modelObjectId (or its key) must match a node name; log onObjectCatalog to see this model's names.`)}Yc.current=Be},[dt,Me,j0,o,Kf,$m]),Te(()=>{if(Y||wr)return;let g=[];for(let[z,$]of Object.entries(Me))for(let fe of $.actions??[])Yu.includes(fe.id)||g.push(`"${fe.id}" on "${$.label??z}"`);let k=g.join(`
|
|
69
|
+
`);if(g.length>0&&k!==Hm.current){let z=g.slice(0,10).join(", "),$=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: ${z}${$}. ModelViewer itself handles ${Yu.join(", ")}; handle other ids in onAction, or pass useViewerActions().handleAction to run their effects.`)}Hm.current=k},[Me,wr,Y]);let Bu=de(async()=>{if(Ee.current&&jr.current&&$s(Ee.current,jr.current),wt){await wt();return}let g=Ee.current;if(!g)return;let k=jr.current;try{if(k&&!ws.current&&Number.isFinite(k.azimuthAngle)&&Number.isFinite(k.polarAngle))g.rotateTo(k.azimuthAngle,k.polarAngle,!0),await ei();else if(k){Wo.current=Ca;let z=hg(k,g);await md(g,()=>g.setLookAt(z[0],z[1],z[2],k.target[0],k.target[1],k.target[2],!0))}else await ei()}catch(z){console.error("Reset camera error:",z)}},[wt,ei]),$E=de(()=>{On(!1),qt(!0)},[]),WE=de(()=>{qt(!1)},[]),SC=de(()=>{qt(!1),On(!0),setTimeout(()=>{Bu()},100)},[Bu]),CC=de((g,k)=>{Gf(g,k)},[Gf]),MC=de(g=>{if(hf.current)return;if(ku.current){ku.current=!1;return}if(g.target.closest("button, input, textarea, .ri-colorPicker, .ri-materialPicker, .ri-annotationPopup, .ri-annotationMarker, .ri-viewAnnotationPopup"))return;let z=Lr.current,$=Ee.current,fe=$?.camera,Be=He.current;if(!z||!$||!fe||!Be||!as&&!$.enabled)return;let Fe=z.getBoundingClientRect(),Ge=(g.clientX-Fe.left)/Fe.width*2-1,Ke=-((g.clientY-Fe.top)/Fe.height)*2+1,At=new SE;At.setFromCamera(new CE(Ge,Ke),fe);let er=At.intersectObject(Be,!0);if(er.length===0)return;if(!as&&_){let $r=er[0].point,fr=null;for(let[ca,ua]of Object.entries(Hr.current)){if(!ua.decals?.length)continue;let nn=It.current[ca];if(!nn)continue;let on=nn.worldToLocal($r.clone());for(let Ln of ua.decals){if(!Ln.position)continue;let da=on.distanceTo(new Wp(Ln.position[0],Ln.position[1],Ln.position[2]));da<=Ln.size/2&&(!fr||da<fr.distance)&&(fr={binding:ua,id:Ln.id,distance:da})}}if(fr){Xi(null),_(fr.binding,fr.id);return}}if(!as){let{x:$r,y:fr,z:ca}=er[0].point;$.setOrbitPoint($r,fr,ca);return}let rn=er[0],aa=rn.point,sa=Be.worldToLocal(rn.point.clone()),la=[0,0,1];if(rn.face){let $r=rn.face.normal.clone().transformDirection(rn.object.matrixWorld).normalize();la=[$r.x,$r.y,$r.z]}df({worldPosition:[aa.x,aa.y,aa.z],localPosition:[sa.x,sa.y,sa.z],worldNormal:la,anchor:dw(rn),screenX:g.clientX-Fe.left,screenY:g.clientY-Fe.top}),du({title:"",description:""})},[as,_]);if(Te(()=>{Rc.current={snapshot:()=>{let g=Ee.current,k=Ss.current;return{model:Dr,camera:Fr.current&&g?Us(g):k?.camera,home:jr.current??k?.home,lightEdits:Dc,variantEdit:ss,sectionEdit:ls,measurementEdits:cs,isolation:zf,objectBindings:om||ut?void 0:Me,modelBindingEdits:om?void 0:d0,explodeFactor:Ko,cameraControllerType:Mm,uvCheckerOverride:Sm,annotationCategories:dS}},captureFrame:()=>{let g=Sr.current;return!g||t.status!=="ready"||!dt||!An?Promise.resolve(null):Ob(g)}}}),Te(()=>()=>{Rc.current=null},[Rc]),Uo.status==="checking"){let g=Ac??kc;return g?X("div",{className:"ri-viewer ri-viewerPlaceholder",style:{background:zc},children:X(Qu,{src:g})}):X("div",{className:"ri-viewer ri-viewer--license-checking",children:!s&&X(pl,{title:Xt("verifyingLicense"),message:Xt("checkingYourLicenseKey")})})}if(Uo.status==="invalid")return X("div",{className:"ri-viewer ri-viewer--license-invalid",children:X(pl,{tone:"error",title:Xt("invalidLicense"),showKeySetup:Uo.isLocalDomain&&Uo.reason==="No license key provided",message:Uo.isLocalDomain?Uo.reason??Xt("licenseHasBeenRevokedOrHasExpired"):Xt("failedToLoadPleaseContactTheSiteAdministrator")})});let{materialTextureUrl:Jf,materialTargetTakesImage:Yf,materialTextureOffset:Zf,materialTextureRotationDegrees:eg,isMaterialTexturePositioning:tg,materialTextureOnOffsetChange:rg,materialTextureOnRotationChange:ng,materialTextureOnEndPositioning:og}=Ow({materialPopup:ra,resolveObjectKey:Tn,currentObjectBindings:Me,nodeRefsMap:It,moveZoomTarget:Zt,texturePositioningEnabled:rC,texturePositioningOverrides:nC,setMaterialTextureOffset:oC,setMaterialTextureRotation:iC,endMaterialTexturePositioning:aC}),PC=Lr.current?.offsetWidth??600,kC=Lr.current?.offsetHeight??400,RC=350,AC=290,OC=po?Math.min(po.screenX+12,PC-RC-8):0,EC=po?Math.min(po.screenY,kC-AC-8):0,DC=We&&!!n&&!Yi&&!dt,ig=Ho&&(ea&&(ks||sf)||Rs||!!W||!!As),oi=ig&&!wr&&!F,ia=gt&&!wr,ju=Zn&&!wr,ag=(oi?1:0)+(Vt?1:0),xo=g=>(wr?50:16)+g*42+(ia&&g>ag?Math.max(0,WS-34):0),Nu=ig&&!F?X(Uw,{configuredHandoff:!!W,top:xo(0),xrStore:ea,arSupported:ks,vrSupported:sf,quickLookSupported:Rs,mobileHandoffUrl:As,mobileHandoffOpen:W?yo.open:lf,onQuickLook:W?yo.show:aS,onOpenMobileHandoff:W?yo.show:oS}):null;return Ar("div",{className:"ri-viewer",ref:bs.rootRef,style:{background:zc},"data-reduced-motion":kn?"":void 0,children:[X("div",{className:"ri-visuallyHidden",role:"status","aria-atomic":"true",children:JS}),t.status!=="ready"&&X(Rw,{rebuilding:t.status==="rebuilding",onReload:t.reload}),Ar("div",{className:"ri-viewerLeft",ref:_m,inert:t.status!=="ready",children:[Ae&&($e?$e({isOpen:Rf,selectedObject:bo,currentAction:Lm,onClose:Cu,onAction:Ns}):X(Cp,{translateDefaultActions:Ec,isOpen:Rf,selectedObject:bo,currentAction:Lm,onClose:Cu,onAction:Ns,renderActionExtra:g=>{if(g==="change-color"&&Br)return X(hp,{inline:!0,colorPicker:Br,onClose:Ur,itemMaterials:ao,setItemMaterials:vs});if((g==="change-light-color"||g==="set-brightness")&&Bc?.kind===g&&Bc.objectId===ta)return X(Bv,{control:Bc,lights:Ce.lighting.lights,readObjectGlow:Tf,applyGlow:_f,glowMemoryRef:Df,applyLightPatches:gm,onControlChange:bm});if((g==="add-text"||g==="add-image")&&jc?.kind===g&&jc.objectId===ta){let k=jc,z=Tn(k.objectId);if(!z)return null;let $=g==="add-image";return X(Fv,{kind:g,decals:(Me[z]?.decals??[]).filter(fe=>!!fe.image===$),activeId:k.activeId,error:vm?Xt.message(vm):null,moving:Nc?.objectKey===z&&Nc.decalId===k.activeId,defaultSize:lC(z),...cC(k,z)})}return g==="change-material"&&ra?X(vp,{inline:!0,triggerFileUpload:Lf,materialPopup:ra,textureUrl:Jf,clearTexture:Bf,canPlaceImage:Yf,offset:Zf,rotationDegrees:eg,onOffsetChange:rg,onRotationChange:ng,isPositioning:tg,onEndPositioning:og}):null}})),Ar("div",{className:`ri-canvasArea ${pr?"ri-canvasArea--measuring":""} ${An?"":"ri-canvasArea--positioning"} ${qe||je?"ri-canvasArea--moveMode":""}`,ref:O0,tabIndex:$t?0:void 0,role:$t?"group":void 0,"aria-label":$t?Xt("cameraKeyboardHelp"):void 0,onDoubleClick:MC,onPointerDown:g=>{if($t&&Lr.current?.focus({preventScroll:!0}),Zt){sC(g);return}_S(g)},onClick:Zt?void 0:LS,onPointerMove:OS,onPointerLeave:yf,onWheel:yf,children:[dt&&!pr&&t.status==="ready"?X(Xx,{objects:fC,selectedKey:nt,onHighlight:$c,onSelect:g=>Pu(g,"keyboard"),onClearSelection:()=>{Cu(),O?.()}}):null,qi&&!o&&(Zt||KS)&&X("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:Zt?"rgba(37, 99, 235, 0.92)":"rgba(0, 0, 0, 0.6)",pointerEvents:"none",whiteSpace:"nowrap"},children:Xt(Zt?"texturePositioningHint":"texturePositioningStartHint")}),Vm&&!Gm&&X(Cw,{count:I0,onDismiss:()=>Um(!0)}),eu!==null&&!H0&&X(Mw,{triangles:eu,offset:Vm&&!Gm,onDismiss:()=>Wm(!0)}),Ht.model.renderer==="uv-checker"&&tu.missing>0&&X(Pw,{missing:tu.missing,total:tu.total}),X("input",{ref:Em,type:"file",accept:"image/png,image/jpeg,image/webp",className:"ri-hiddenInput",onChange:tC}),X(xi,{onError:t.fail,children:Yo&&!eS?Ar(Yd,{backend:Yo,onRendererCreated:t.onRendererCreated,suspended:t.status!=="ready",paused:c0&&!at,camera:mt,backgroundColor:xt,shadows:oe&&Ce.shadows.enabled,sceneConfig:Ht,selectedObjectRef:go,selectedObjectRefs:Su,selectedObjectOutlineColor:b,hoveredObjectRef:QS,highlightOnHover:_e,renderMode:jt,maxDpr:ht,reduceGpuLoad:w0,runtimeStats:G?{onStats:G,intervalMs:U,profile:Qt,streamingRef:Wc}:void 0,xrStore:ea,xrRuntime:cu,rendererCaptureRef:Sr,preserveDrawingBuffer:rr,children:[X(tp,{lightingConfig:Ce.lighting,shadowConfig:Ce.shadows,shadowsEnabled:oe,environmentRotation:Ce.environment.rotation,environmentConfig:Ce.environment,modelBounds:xf,objectBindings:Me,nodeRefs:It}),g0&&Ce.lighting.lights.map(g=>!g.visible||g.type==="none"||g.type==="hemisphere"||g.attachment?null:X("group",{rotation:[0,g.attachedToCamera?0:Ce.environment.rotation*Math.PI/180,0],children:X(aw,{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??Eo(Fa(g,oe&&Ce.shadows.enabled&&g.castShadow,xf),g.attachedToCamera?0:-Ce.environment.rotation):void 0,onTransformChange:({position:k,rotation:z,target:$})=>wC(g.id,k,z,$),onDraggingChange:km})},g.id)),X(fp,{setAside:mr.setAside,nodeRefs:It}),!En&&X(bp,{section:Ce.section??fa,box:Ts,modelRef:He,showHandle:Zn,onChange:pm,onDraggingChange:y0}),X(ep,{controlsRef:Ee,onCameraChange:CC,cameraLimits:ft,controllerType:oo,onPointerLockExit:()=>ps("orbit"),reducedMotion:kn,zoom:!ye,pageScroll:Se}),X(Up,{enabled:at||pr||ti||kn||oo==="pointerLock"?!1:i0??Ce.model.autoRotate??!1,speed:a0??Ce.model.autoRotateSpeed??1,controlsRef:Ee}),we&&!En&&!at&&X(Pb,{getTarget:hC,revision:`${me}:${dt}`,lineColor:vC}),or&&!at&&X(mv,{onUpdate:()=>{let g=Ee.current;if(g){g.camera.up.set(0,1,0);let k=Hf.current;k>0&&g.dollyTo(k,!1),g.update(0)}Sr.current?.invalidate()}}),(qe||je)&&!En&&!Ls&&go&&nt&&X(Bp,{node:go,space:Yt,moveEnabled:qe,gizmoTool:Ft,scaleEnabled:je,onTransformChange:YS,transform:Me[nt]?.transform,onDraggingChange:g=>{Am(g),fo&&R?.(fo,g)}},nt),(qe||je)&&!En&&Ls&&X(zp,{entries:Ls,referenceNode:go,space:Yt,moveEnabled:qe,gizmoTool:Ft,scaleEnabled:je,onTransformChange:ZS,onDraggingChange:g=>{Am(g);for(let k of Ls){let z=Me[k.key];z&&R?.(z,g)}}}),ti&&X(Yv,{target:ti,nodes:It,controls:Ee}),(()=>{let g=ut&&Le?Ar(Xp,{children:[Le.map(k=>X(cx,{entry:{...k,objectBindings:Re(k)===me?mr.bindings:no(k)},isActive:Re(k)===me,pulses:mr.pulses,decoderConfig:ds,itemMaterials:ao,sceneConfig:Ht,zoomOnSelected:Ve,highlightOnHover:_e,explodeFactor:Ko,suspendBindingTransforms:Wi,onLoadProgress:Qf,onAnimationsReady:of,onModelAnimationsReady:K0,onLoadError:yC,onModelLoaded:xC,selectedItem:nt,panelHoveredItem:S??ys,onItemClick:Ou,onItemDoubleClick:Du,onItemContextMenu:Tu,onItemHover:Eu,nodeRefsOut:It,onNodeRefsChange:Hc,materialRefsOut:Re(k)===me?Rn:R0(Re(k)),onMergeModelLoaded:Xf,onMergeModelError:Zp},Re(k))),X(Jl,{anchorSceneRef:He,annotations:rm?pf:[],sceneConfig:Ce,activeAnnotation:Es,popupRef:hs,canvasRootRef:Lr,worldPositionsRef:Fc,modelLoaded:dt,onAnnotationClick:ff,onCloseAnnotation:Os,hideCloseButton:mo,guidedTour:mo,showAnnotationOnHover:ce}),X(gc,{annotation:mf,enabled:mo&&!at,controlsRef:Ee,offsetRef:Vc}),at?X(yi,{controlsRef:Ee,sceneRef:He,config:at.config,playing:!0,resetOnPlay:!0,playOnce:!0,startAtPath:!0,onStarted:at.onStarted,onFinished:at.onFinished,onProgress:Zm},"video-export"):Gr&&X(yi,{controlsRef:Ee,sceneRef:He,config:Gr,playing:Zi&&!pr,resetOnPlay:Jm,onFinished:()=>{qt(!1),On(!1)},onUserInteract:()=>{qt(!1)}},"cinematic-preview"),gt&&Ar(Xp,{children:[X(ec,{items:us,sceneRef:He,modelId:_c,tilesetUrl:o,settings:Gi,legacyUnit:Pn,revision:gu,onResults:Sf}),X(Ai,{points:bu,unit:Ui.displayUnit,scale:Ui.factor,box:Ts,showDimensions:yu,tool:hu,areaClosed:vu,snapPreview:pr?vf:null})]})]}):X(qr,{onLoadError:Lu,children:Ar(Zw,{fallback:null,children:[o?X(ME,{diagnosticsRef:G?Wc:void 0,loadingRef:Xc,url:o,rotation:Ht.model.rotation,errorTarget:i,cacheSize:a,decoderConfig:ds,objectBindings:mr.bindings,itemMaterials:ao,sceneConfig:Ht,selectedItem:nt,panelHoveredItem:S??ys,highlightOnHover:_e,onItemClick:Ou,onItemHover:Eu,onItemDoubleClick:Du,onItemContextMenu:Tu,onObjectCatalog:gC,onTilesetBounds:bC,onModelLoaded:ni,onLoadError:Lu,nodeRefsOut:It,onNodeRefsChange:Hc,materialRefsOut:Rn,explodeFactor:Ko,suspendBindingTransforms:Wi}):X(Ha,{url:n,modelFormat:c,objectBindings:mr.bindings,selectedItem:nt,itemMaterials:ao,onItemClick:Ou,onItemDoubleClick:Du,onItemContextMenu:Tu,onItemHover:Eu,onModelLoaded:ni,onAnimationsReady:of,nodeRefsOut:It,onNodeRefsChange:Hc,materialRefsOut:Rn,panelHoveredItem:S??ys,sceneConfig:Ht,zoomOnSelected:Ve,highlightOnHover:_e,decoderConfig:ds,onLoadProgress:Qf,explodeFactor:Ko,suspendBindingTransforms:Wi,originalNodePoses:l0,mergeModels:Pc,onMergeModelLoaded:Xf,onMergeModelError:Zp,pulses:mr.pulses}),s0?.map(k=>X(ax,{url:k,decoderConfig:ds,onLoadError:Jp,onModelLoaded:is?z=>is(k,z):void 0},k)),X(Jl,{anchorSceneRef:He,annotations:rm?pf:[],sceneConfig:Ce,activeAnnotation:Es,popupRef:hs,canvasRootRef:Lr,worldPositionsRef:Fc,modelLoaded:dt,onAnnotationClick:ff,onCloseAnnotation:Os,hideCloseButton:mo,guidedTour:mo,showAnnotationOnHover:ce}),X(gc,{annotation:mf,enabled:mo&&!at,controlsRef:Ee,offsetRef:Vc}),at?X(yi,{controlsRef:Ee,sceneRef:He,config:at.config,playing:!0,resetOnPlay:!0,playOnce:!0,startAtPath:!0,onStarted:at.onStarted,onFinished:at.onFinished,onProgress:Zm},"video-export"):Gr&&X(yi,{controlsRef:Ee,sceneRef:He,config:Gr,playing:Zi&&!pr,resetOnPlay:Jm,onFinished:()=>{qt(!1),On(!1)},onUserInteract:()=>{qt(!1)}},"cinematic-preview"),gt&&Ar(Xp,{children:[X(ec,{items:us,sceneRef:He,modelId:_c,tilesetUrl:o,settings:Gi,legacyUnit:Pn,revision:gu,onResults:Sf}),X(Ai,{points:bu,unit:Ui.displayUnit,scale:Ui.factor,box:Ts,showDimensions:yu,tool:hu,areaClosed:vu,snapPreview:pr?vf:null})]})]})},o??n);return ea&&cu?X(cu.XRModelPresenter,{ref:tS,box:Ts,scaleMode:j,onARStateChange:sS,children:g}):g})(),X(Hh,{controller:ar,source:He,controls:Ee,animations:au,cameraEnabled:!uu,ready:dt&&An,sequences:Ce.sequences,autoPlay:Ne&&!kn,authoredRevision:pC}),h&&X(Vh,{source:He,highlights:h}),Go&&X(Zw,{fallback:null,children:Go})]}):null}),X(Qu,{src:Ac??kc,hidden:dt&&An}),Wt&&X("div",{className:"ri-overlay",children:Wt}),We&&n&&Yi&&X(kw,{failure:Tb(uo,o||n,o?void 0:c,e),source:o||n}),X(nh,{visible:DC,message:Xt(G0,{millions:Math.round((eu??0)/1e6)}),progress:$0??void 0,background:zc,seeThrough:!!(Ac??kc)}),wr?im&&Nu&&yE(Nu,im):Nu,F&&X(Yh,{xrStore:ea,arSupported:ks,checkingAR:rS,quickLookSupported:Rs,modelReady:dt,inARSession:uu,handoff:yo,animationControls:X(nv,{options:lu,sources:Jo,value:Ps?.id??"",onChange:Y0}),onQuickLook:()=>r.requestARLaunch("quick-look")}),nS,ne&&!F&&!wr&&!uu&&!at&&!pr&&Qo.length>0&&X(Cg,{controls:ar,sequences:Qo}),yo.open&&X(Kh,{handoff:yo,filename:ge,onQuickLook:()=>r.requestARLaunch("quick-look")}),!W&&lf&&As&&X($w,{url:As,onClose:iS}),Vt&&X(Ww,{top:xo(oi?1:0),active:Ic,onToggle:()=>Cm(g=>!(g??$i))}),gt&&X(dp,{top:xo(ag),active:pr,disabled:!!at,tool:hu,snap:RS,pointCount:bu.length,areaClosed:vu,error:CS,showDimensions:yu,onToggle:()=>{qt(!1),pr||f0?.(),DS()},onTool:MS,onSnap:AS,onUndo:PS,onClear:ES,onFinishArea:kS,onDimensions:TS,onHeight:XS,settings:Gi,displayUnit:Ui.displayUnit,onSettings:dm,items:us,results:zS,onItems:um,onSave:BS,canSave:jS,canCalibrate:NS,onCalibrate:IS,onExportJson:VS,onExportCsv:FS,onImport:HS,readOnly:Vi!==void 0&&!to,settingsReadOnly:ns!==void 0&&!ro}),nr&&X(Xw,{top:xo((oi?1:0)+(Vt?1:0)+(ia?1:0)),open:W0,factor:Ko,onToggleOpen:()=>Qm(g=>!g),onFactorChange:Km}),ju&&!En&&X(qw,{top:xo((oi?1:0)+(Vt?1:0)+(ia?1:0)+(nr?1:0)),section:wS,onChange:pm}),Gr&&X(Kw,{top:xo((oi?1:0)+(Vt?1:0)+(ia?1:0)+(nr?1:0)+(ju?1:0)),playing:Zi,disabled:!!at||pr,onPlay:()=>{On(!1),qt(!0)},onPause:()=>qt(!1),onStop:SC}),at&&X(Qw,{progress:q0,onCancel:iu}),!wr&&ut&&Le&&Le.length>1&&(tm||Oc)&&X("div",{className:"ri-modelSwitcher",style:{top:`${xo((oi?1:0)+(Vt?1:0)+(ia?1:0)+(nr?1:0)+(ju?1:0)+(Gr?1:0))}px`},role:"group","aria-label":"Switch model",children:Le.map(g=>X("button",{type:"button",className:`ri-modelSwitcherButton ${Re(g)===me?"ri-modelSwitcherButton--active":""}`,onClick:()=>Oc?Oc(Re(g)):tm?.(g.url),title:`Switch to ${g.label||ts(g.url)}`,"aria-pressed":Re(g)===me,children:g.label||ts(g.url)},Re(g)))}),(pu||gf||ti||Fo&&tn)&&Ar("div",{className:`ri-bottomStack ${bf?"ri-bottomStack--aboveButtons":""} ${pu?"ri-bottomStack--annotationFilters":""}`,children:[pu&&X(Tw,{categories:mS,selected:pS,disabled:!!at,onChange:fS}),ti&&X(_w,{onCancel:ti.onCancel}),Fo&&tn&&X(Lw,{label:tn.size===1?Xt("isolatedObject",{name:(()=>{let[g]=tn;return Me[g]?.label??g})()}):Xt("isolatedObjects",{count:tn.size}),onShowAll:()=>Au(null)}),gf&&X(Bw,{groups:Ji,activeVariants:Lc,onSelect:x0})]}),bf&&Ar("div",{className:"ri-buttonContainer",children:[X("div",{className:"ri-tourControls",children:ae&&mu.length>0&&X(jw,{count:mu.length,active:mo,index:cS,navigating:uS,onStart:gS,onPrevious:bS,onNext:hS,onStop:vS})}),Ar("div",{className:"mv-rightControls",children:[Oe&&bs.supported&&X(Nw,{fullscreen:bs,disabled:!!at}),ke&&X("button",{className:"mv-resetButton",onClick:Bu,disabled:!!at,title:Xt("resetCameraView"),children:X(PE,{})}),X(Iw,{open:C0,current:oo,disabled:!!at,onSelect:ps,onToggle:()=>Pm(g=>!g)}),ze&&X(zw,{menu:qS,recording:!!at,hasScene:!!He.current,canCaptureImage:rr||Yo==="webgpu",canRecord:dt&&An&&!Cs,hasCinematic:!!Gr,hasMultipleModels:!!(Le&&Le.length>=2)})]})]}),po&&X(Vw,{x:OC,y:EC,form:lS,setForm:du,onOk:yS,onCancel:xS})]}),$e&&Br&&X(hp,{colorPicker:Br,onClose:Ur,itemMaterials:ao,setItemMaterials:vs}),$e&&ra&&X(vp,{triggerFileUpload:Lf,materialPopup:ra,textureUrl:Jf,clearTexture:Bf,canPlaceImage:Yf,offset:Zf,rotationDegrees:eg,onOffsetChange:rg,onRotationChange:ng,isPositioning:tg,onEndPositioning:og})]}),zs&&ri&&ho?X(Rx,{product:ir.product,options:zs,onSelectionsChange:dC,top:Ie?56:12},ho):null,Ie&&X("div",{className:"ri-viewerRight",inert:t.status!=="ready",children:ie?ie({objectBindings:Me,onAction:Ns,onFocus:Ff,onHover:$c}):X(Mp,{objectBindings:Me,onAction:Ns,onFocus:Ff,onHover:$c,isolatedKeys:tn,onIsolate:Fo?mC:void 0})}),Lt&&X(Mx,{controlsRef:Ee,enabled:t.status==="ready",opacity:yr,moveSensitivity:dr,position:Bt})]})}import{useState as yc}from"react";import{ArrowRight as TE,ChevronRight as _E,Download as LE}from"lucide-react";import{jsx as ct,jsxs as bt}from"react/jsx-runtime";function xc(e){return e===void 0?"Not set":JSON.stringify(e)}var qp={changes:"Changes only",all:"All objects",added:"Added",removed:"Removed",modified:"Modified",unchanged:"Unchanged",ambiguous:"Unmatched"},e0={all:"All categories",identity:"Identity",appearance:"Appearance",transform:"Transform",visibility:"Visibility",data:"Data",behavior:"Behavior"};function t0({change:e}){return bt("div",{className:"ri-semanticPanel__change",children:[ct("code",{title:e.path,children:e.path}),bt("span",{children:[ct("del",{title:xc(e.before),children:xc(e.before)}),ct(TE,{size:11,"aria-hidden":"true"}),ct("ins",{title:xc(e.after),children:xc(e.after)})]})]})}function S4({report:e,selected:t,onSelect:r,onClear:n,matchBy:o,onMatchByChange:i,showOutlines:a,onShowOutlinesChange:l}){let[c,d]=yc(!0),[p,m]=yc(""),[s,f]=yc("changes"),[u,h]=yc("all"),v=e.objects.filter(b=>(s==="all"||(s==="changes"?b.status!=="unchanged":b.status===s))&&(u==="all"||b.changes.some(S=>S.category===u))&&`${b.label} ${b.identity}`.toLowerCase().includes(p.toLowerCase())),x=()=>{let b=URL.createObjectURL(new Blob([JSON.stringify(e,null,2)],{type:"application/json"})),S=document.createElement("a");S.href=b,S.download="configuration-comparison.json",S.click(),setTimeout(()=>URL.revokeObjectURL(b),1e3)};return bt("aside",{className:"ri-semanticPanel","aria-label":"Configuration comparison",onPointerDown:b=>b.stopPropagation(),children:[bt("button",{className:"ri-semanticPanel__heading",type:"button","aria-expanded":c,onClick:()=>d(!c),children:[ct(_E,{size:13,"aria-hidden":"true",className:c?"ri-semanticPanel__chevron--open":void 0}),"Changes",bt("span",{className:"ri-semanticPanel__counts",children:[bt("span",{"data-status":"added",title:`${e.counts.added} added`,children:["+",e.counts.added]}),bt("span",{"data-status":"removed",title:`${e.counts.removed} removed`,children:["\u2212",e.counts.removed]}),bt("span",{"data-status":"modified",title:`${e.counts.modified} modified`,children:["~",e.counts.modified]})]})]}),c&&bt("div",{className:"ri-semanticPanel__body",children:[i&&bt("details",{children:[ct("summary",{children:"Matching"}),bt("label",{children:["Match by",bt("select",{"aria-label":"Match objects by",value:typeof o=="object"?"metadata":o??"modelObjectId",onChange:b=>i(b.target.value==="metadata"?{metadataKey:"partId"}:b.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"&&bt("label",{children:["Key",ct("input",{"aria-label":"Comparison metadata key",value:o.metadataKey,onChange:b=>i({metadataKey:b.target.value})})]})]}),ct("input",{className:"ri-semanticPanel__search","aria-label":"Search comparison",placeholder:"Filter objects",value:p,onChange:b=>m(b.target.value)}),bt("div",{className:"ri-semanticPanel__filters",children:[ct("select",{"aria-label":"Filter comparison status",value:s,onChange:b=>f(b.target.value),children:Object.keys(qp).map(b=>ct("option",{value:b,children:qp[b]},b))}),ct("select",{"aria-label":"Filter change category",value:u,onChange:b=>h(b.target.value),children:Object.keys(e0).map(b=>ct("option",{value:b,children:e0[b]},b))})]}),bt("div",{className:"ri-semanticPanel__rows",children:[v.map(b=>bt("div",{className:"ri-semanticPanel__row","data-status":b.status,children:[bt("button",{type:"button","aria-pressed":t===b.id,onClick:()=>r(b),children:[ct("span",{children:b.label}),ct("small",{children:qp[b.status]})]}),t===b.id&&bt("div",{className:"ri-semanticPanel__details",children:[b.message&&ct("p",{children:b.message}),b.changes.map(S=>ct(t0,{change:S},S.path)),!b.changes.length&&!b.message&&ct("p",{children:b.status==="unchanged"?"No authored changes.":`Object ${b.status}.`})]})]},b.id)),!v.length&&ct("p",{className:"ri-semanticPanel__empty",children:"No matching objects."})]}),e.sceneChanges.length>0&&bt("details",{children:[bt("summary",{children:["Scene changes (",e.sceneChanges.length,")"]}),ct("div",{className:"ri-semanticPanel__details",children:e.sceneChanges.map(b=>ct(t0,{change:b},b.path))})]}),bt("div",{className:"ri-semanticPanel__footer",title:"Compares authored bindings and settings. Geometry changes inside model files are not detected.",children:[bt("label",{className:"ri-semanticPanel__outlineToggle",children:[ct("input",{type:"checkbox",checked:a,onChange:b=>l(b.target.checked)}),"Outlines"]}),t&&n&&ct("button",{type:"button",onClick:n,children:"Clear focus"}),bt("button",{type:"button",onClick:x,children:[ct(LE,{size:12,"aria-hidden":"true"}),"Report"]})]})]})]})}import{Vector3 as wc}from"three";var rs=1e-6;function R4(){let e=[null,null],t=0,r=!1,n=new wc,o=new wc,i=new wc,a=new wc,l=(d,p)=>{let m=e[d],s=e[p];if(!m||!s)return;m.controls.getPosition(n,!1),m.controls.getTarget(i,!1),s.controls.getPosition(o,!1),s.controls.getTarget(a,!1);let f=m.controls.camera.zoom,u=m.controls.camera.fov,h=typeof u=="number"&&typeof s.controls.camera.fov=="number"&&Math.abs(u-s.controls.camera.fov)>=rs;if(!(n.distanceToSquared(o)<rs&&i.distanceToSquared(a)<rs&&Math.abs(f-s.controls.camera.zoom)<rs&&!h)){r=!0;try{h&&(s.controls.camera.fov=u,s.controls.camera.updateProjectionMatrix?.()),Math.abs(f-s.controls.camera.zoom)>=rs&&s.controls.zoomTo(f,!1),s.controls.setLookAt(n.x,n.y,n.z,i.x,i.y,i.z,!1)}finally{r=!1}s.invalidate()}},c=d=>{r||(d===t?l(d,1-d):l(t,d))};return{attach(d,p,m){let s=e[d];if(s?.controls===p){s.invalidate=m;return}s?.detach();let f=()=>c(d),u=()=>{t=d},h=ug(p,u);p.addEventListener("update",f),p.addEventListener("controlstart",u),e[d]={controls:p,invalidate:m,detach:()=>{h(),p.removeEventListener("update",f),p.removeEventListener("controlstart",u)}},l(t,1-t)},setLeader(d){t=d},get leader(){return t},detach(){e.forEach(d=>d?.detach()),e[0]=e[1]=null}}}import{Fragment as BE,jsx as Kp,jsxs as o0}from"react/jsx-runtime";var Sc=.05,r0=.2,n0=e=>Math.min(Math.max(Number.isFinite(e)?e:.5,0),1);function E4({split:e,onSplitChange:t,labels:r,containerRef:n,beforeAction:o}){let i=re(),a=m=>{let s=n.current?.getBoundingClientRect();s&&s.width>0&&t(n0((m-s.left)/s.width))},l=m=>{m.preventDefault(),m.stopPropagation(),m.currentTarget.setPointerCapture(m.pointerId),m.currentTarget.focus(),a(m.clientX)},c=m=>{m.currentTarget.hasPointerCapture(m.pointerId)&&a(m.clientX)},d=m=>{let s={ArrowLeft:e-Sc,ArrowDown:e-Sc,ArrowRight:e+Sc,ArrowUp:e+Sc,PageDown:e-r0,PageUp:e+r0,Home:0,End:1}[m.key];s!==void 0&&(m.preventDefault(),m.stopPropagation(),t(n0(s)))},p=Math.round(e*100);return o0(BE,{children:[o0("span",{className:"ri-compare__label ri-compare__label--before",hidden:e<.08,children:[r[0],o]}),Kp("span",{className:"ri-compare__label ri-compare__label--after",hidden:e>.92,children:r[1]}),Kp("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:r[0],after:r[1],percent:p,rest:100-p}),onPointerDown:l,onPointerMove:c,onKeyDown:d,children:Kp("span",{className:"ri-compare__handle","aria-hidden":"true"})})]})}export{pl as a,TC as b,Iv as c,Zv as d,Ah as e,ph as f,rd as g,Dp as h,lO as i,ow as j,Oh as k,Dh as l,Hw as m,Lh as n,fl as o,OE as p,S4 as q,R4 as r,n0 as s,E4 as t,sD as u,HC as v};
|