@liveroom-tech/react-immersive 6.0.2 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +24 -0
  2. package/dist/AnimationsTab-NUJTEMZ5.mjs +1 -0
  3. package/dist/AnnotationsTab-OHRVWRKI.mjs +1 -0
  4. package/dist/CinematicTab-IJAY2BS6.mjs +1 -0
  5. package/dist/ConfigureTab-UQRRATCY.mjs +6 -0
  6. package/dist/RulesTab-YVBZGJZX.mjs +1 -0
  7. package/dist/SequencesTab-IC5LWQ6N.css +1 -0
  8. package/dist/SequencesTab-RPJAG26Z.mjs +1 -0
  9. package/dist/binding-builder.css +1 -1
  10. package/dist/binding-builder.d.mts +3 -3
  11. package/dist/binding-builder.d.ts +3 -3
  12. package/dist/binding-builder.js +76 -23
  13. package/dist/binding-builder.mjs +1 -1
  14. package/dist/chunk-2DV2UCQH.mjs +1 -0
  15. package/dist/chunk-37YITTIK.mjs +1 -0
  16. package/dist/chunk-5FLX45O5.mjs +2 -0
  17. package/dist/chunk-6CTCV2Q5.mjs +1 -0
  18. package/dist/chunk-7JCFNZJM.mjs +1 -0
  19. package/dist/chunk-7OWHW66D.mjs +1 -0
  20. package/dist/chunk-AL6UIGWP.mjs +1 -0
  21. package/dist/chunk-BNKTI3CY.mjs +1 -0
  22. package/dist/chunk-CCBFMNAU.mjs +1 -0
  23. package/dist/chunk-E24EFHB5.mjs +1 -0
  24. package/dist/chunk-EV6THDXD.mjs +1 -0
  25. package/dist/chunk-F5QSXMME.mjs +1 -0
  26. package/dist/chunk-FGAJ2UT7.mjs +1 -0
  27. package/dist/chunk-FXV4CLAK.mjs +1 -0
  28. package/dist/chunk-GV4ZRXL6.mjs +1 -0
  29. package/dist/chunk-KHN55ZM7.mjs +3 -0
  30. package/dist/chunk-LX3GXQNU.mjs +1 -0
  31. package/dist/chunk-OPZJDP7T.mjs +1 -0
  32. package/dist/chunk-OREKYGO3.mjs +83 -0
  33. package/dist/chunk-PBVBZYOG.mjs +47 -0
  34. package/dist/chunk-T6AYLPCC.mjs +1 -0
  35. package/dist/hosted.css +1 -1
  36. package/dist/hosted.d.mts +22 -6
  37. package/dist/hosted.d.ts +22 -6
  38. package/dist/hosted.js +75 -22
  39. package/dist/hosted.mjs +1 -1
  40. package/dist/index.css +1 -1
  41. package/dist/index.d.mts +66 -6
  42. package/dist/index.d.ts +66 -6
  43. package/dist/index.js +69 -21
  44. package/dist/index.mjs +1 -1
  45. package/dist/{modelFileResolver-Co7j1tdQ.d.mts → modelFileResolver-BEW_95id.d.mts} +52 -7
  46. package/dist/{modelFileResolver-Co7j1tdQ.d.ts → modelFileResolver-BEW_95id.d.ts} +52 -7
  47. package/dist/{modelViewerProps-BibuMND7.d.ts → modelViewerProps-C7saa0i2.d.mts} +173 -3
  48. package/dist/{modelViewerProps-Ce4-wb57.d.mts → modelViewerProps-CbK_4uZj.d.ts} +173 -3
  49. package/dist/{publicProps-BaJHCDa_.d.mts → publicProps-NKTiohZO.d.mts} +1 -1
  50. package/dist/{publicProps-CP18d_mt.d.ts → publicProps-z7cJhUH8.d.ts} +1 -1
  51. package/dist/simple-model-viewer.css +1 -1
  52. package/dist/simple-model-viewer.d.mts +25 -3
  53. package/dist/simple-model-viewer.d.ts +25 -3
  54. package/dist/simple-model-viewer.js +49 -3
  55. package/dist/simple-model-viewer.mjs +1 -1
  56. package/dist/utils.d.mts +47 -4
  57. package/dist/utils.d.ts +47 -4
  58. package/dist/utils.js +2 -2
  59. package/dist/utils.mjs +1 -1
  60. package/package.json +5 -1
  61. package/dist/chunk-33SUWPXC.mjs +0 -3
  62. package/dist/chunk-4JMJALRO.mjs +0 -2
  63. package/dist/chunk-EIBW7ZJE.mjs +0 -81
  64. package/dist/chunk-KFTJMFYF.mjs +0 -1
  65. package/dist/chunk-OTSCPJWF.mjs +0 -1
  66. package/dist/chunk-P2JZ5Z7I.mjs +0 -1
  67. package/dist/chunk-V7WZUWJ5.mjs +0 -1
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- "use client";import{c as he}from"./chunk-KFTJMFYF.mjs";import"./chunk-MMO7KCYU.mjs";import{a as pe,b as He,c as _e,d as Ne,e as gn}from"./chunk-P2JZ5Z7I.mjs";import{I as ut,J as gt,K as De,L as ft,M as qe,N as yn,c as Ee,g as lt,i as en}from"./chunk-EIBW7ZJE.mjs";import{a as st,b as at,y as ct}from"./chunk-OTSCPJWF.mjs";import{Aa as Qt,Ba as tn,Da as nn,Ha as le,Ia as Le,K as Se,Ka as on,L as Oe,La as sn,M as kt,Ma as an,N as Ut,Na as cn,Oa as ln,Pa as dn,Qa as un,R as re,Ra as dt,S as Te,U as Dt,Ua as ke,V as Ht,Va as Ue,Wa as fn,Xa as pn,Ya as mn,Za as bn,_a as wn,da as _t,e as ot,f as At,fa as Nt,g as Pt,ha as qt,ia as Ft,j as Et,ja as Kt,k as Tt,ka as Gt,l as It,la as $t,m as ee,ma as zt,na as Wt,oa as Yt,pa as fe,qa as ye,ra as Ie,wa as Xt,xa as Jt}from"./chunk-4JMJALRO.mjs";import{L as rn,j as Lt,q as Zt}from"./chunk-V7WZUWJ5.mjs";import"./chunk-JR557W27.mjs";import{useCallback as hn,useEffect as je,useMemo as Be,useRef as Fe,useState as me}from"react";import{jsx as ie,jsxs as Ke}from"react/jsx-runtime";var Vn=Object.freeze({});function pt(e){return ie(st,{labels:e.labels,children:ie(Cn,{...e})})}function Cn({before:e,after:t,layout:i="slider",split:s,onSplitChange:g,reveal:y="auto",semanticComparison:l=!1,showComparisonOutlines:A,onComparisonOutlinesChange:B,onComparisonChange:O,linkSections:v,...m}){let k=at(),[E,C]=me(y==="auto");je(()=>{y==="auto"&&C(!0)},[y]);let[h,b]=me(.5),[f,S]=me(!0),x=A??f,j=R=>{A===void 0&&S(R),B?.(R)},q=De(s??h),X=hn(R=>{let P=De(R);s===void 0&&b(P),g?.(P)},[s,g]),_=Fe([null,null]),[V,J]=me([null,null]),[N,a]=me(null),[r,c]=me(null),u=[{...m,...e},{...m,...t}];je(()=>a(null),[u[0].sceneConfig?.section,u[1].sceneConfig?.section]);let w=R=>{let P=u[R].objectBindings;return P&&typeof P=="object"?P:V[R]?.url===u[R].modelUrl?V[R].bindings:Vn},L=w(0),$=w(1),n=Be(()=>l?ke({objectBindings:L,sceneConfig:u[0].sceneConfig},{objectBindings:$,sceneConfig:u[1].sceneConfig},typeof l=="object"?l:{}):null,[l,L,$,u[0].sceneConfig,u[1].sceneConfig]),o=n?JSON.stringify(n):"",p=Fe(null);je(()=>{n&&p.current!==o&&(p.current=o,O?.(n))},[n,o,O]);let d=n?.objects.find(R=>R.id===r),M=Be(()=>n?[Ue(n,"before",r),Ue(n,"after",r)]:null,[n,r]),I=Be(()=>gt(),[]);je(()=>()=>I.detach(),[I]);let T=[e,t],D=Be(()=>[0,1].map(R=>(P,W)=>{_.current[R]=P,J(K=>K[R]?.bindings===P.objectBindings&&K[R]?.url===W?K:K.map((G,we)=>we===R?{url:W,bindings:P.objectBindings}:G)),I.attach(R,P.raw.controls,P.invalidate)}),[I]),z=T.map((R,P)=>{let{label:W,...K}=R,G={preset:"minimal",...m,...K},we=K.onViewerReady??m.onViewerReady;return{...G,...v??!!l?{sceneConfig:{...G.sceneConfig,section:N??u[1].sceneConfig?.section??Se},onSceneConfigChange:oe=>{a(oe.section??Se),(K.onSceneConfigChange??m.onSceneConfigChange)?.(oe)}}:{},...M?{comparisonHighlights:x?M[P]:void 0,selectedObject:P===0?d?.beforeKey?L[d.beforeKey]:null:d?.afterKey?$[d.afterKey]:null}:{},onObjectSelect:oe=>{if((K.onObjectSelect??m.onObjectSelect)?.(oe),n){let Ce=n.objects.find(Z=>(P===0?Z.beforeObjectId:Z.afterObjectId)===oe?.modelObjectId);c(Ce?.id??null)}},onViewerReady:oe=>{D[P](oe,G.modelUrl),we?.(oe)}}}),F=[e.label??k("compareBefore"),t.label??k("compareAfter")];(!z[0].modelUrl||!z[1].modelUrl)&&console.error("[react-immersive] CompareViewer needs a modelUrl, shared or on each side.");let ce=Fe(null),Q=n?ie(ut,{showOutlines:x,onShowOutlinesChange:j,report:n,selected:r,onSelect:R=>{c(R.id);let P=R.afterObjectId?1:0,W=_.current[P],K=P===1?R.afterObjectId:R.beforeObjectId,G=K?W?.raw.nodes[K]:null;W&&G&&(I.setLeader(P),W.raw.controls.fitToBox(G,!0),W.invalidate())},onClear:()=>c(null)}):null;if(!E)return ie(ct,{className:"ri-compare",background:lt(m.backgroundColor,m.sceneConfig),poster:m.poster??t.poster??e.poster,onReveal:()=>C(!0)});if(i==="side-by-side")return Ke("div",{className:"ri-compare ri-compare--sideBySide",children:[z.map((R,P)=>Ke("div",{className:"ri-compare__pane",children:[ie(he,{...R}),ie("span",{className:"ri-compare__label",children:F[P]})]},P)),Q]});let Y=`${q*100}%`;return Ke("div",{ref:ce,className:"ri-compare ri-compare--slider",style:{"--ri-compare-split":Y},children:[ie("div",{className:"ri-compare__layer",children:ie(he,{...z[0]})}),ie("div",{className:"ri-compare__layer ri-compare__layer--after",children:ie(he,{...z[1]})}),Q,ie(ft,{split:q,onSplitChange:X,labels:[F[0],F[1]],containerRef:ce})]})}import{useCallback as Ae,useRef as jt}from"react";import{useCallback as H,useMemo as mt,useState as Sn}from"react";var bt={baseColor:"texture",metalness:"metalnessMap",roughness:"roughnessMap",emissive:"emissiveMap",alpha:"alphaMap",normal:"normalMap",bump:"bumpMap",ao:"aoMap",displacement:"displacementMap",clearcoat:"clearcoatMap",clearcoatRoughness:"clearcoatRoughnessMap",clearcoatNormal:"clearcoatNormalMap",anisotropy:"anisotropyMap",transmission:"transmissionMap",thickness:"thicknessMap",sheenColor:"sheenColorMap",sheenRoughness:"sheenRoughnessMap",specularIntensity:"specularIntensityMap",specularColor:"specularColorMap"};function wt(e){if(e)return Object.fromEntries(Object.entries(e).map(([t,i])=>[t,i&&typeof i=="object"?{...i}:i]))}function On(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t.visible===!1).map(([t])=>[t,!0]))}function Ge(e){let[t,i]=Sn(e),s=H((a,r)=>{i(c=>r===void 0?pe(c,a):pe(c,a,r))},[]),g=H((a,r)=>s(a,He(r)),[s]),y=H((a,r)=>g(a,{baseColor:r}),[g]),l=H((a,r,c="baseColor")=>{let u=bt[c],w=typeof r=="string"?{path:r}:r;s(a,{style:{material:{[u]:w}}})},[s]),A=H((a,r="baseColor")=>{let c=bt[r];s(a,{style:{material:{[c]:void 0}}})},[s]),B=H((a,r)=>{i(c=>{let u=ee(c,a);if(!u)return c;let w=wt(c[u]?.style?.material),L=le(c,r);if(L.length===0)return c;let $=c;for(let n of L){let o=c[n];o&&($===c&&($={...c}),$[n]={...o,style:{...o.style,material:wt(w)}})}return $})},[]),O=H(a=>s(a,{style:{material:void 0}}),[s]),v=H((a,r)=>s(a,{transform:r}),[s]),m=H(a=>s(a,{transform:void 0}),[s]),k=H((a,r)=>s(a,{metadata:r}),[s]),E=H((a,r)=>{i(c=>{let u=c;for(let w of le(c,a)){let L=c[w],$=r(L.decals??[]);u===c&&(u={...c}),u[w]={...L,decals:$.length>0?$:void 0}}return u})},[]),C=H((a,r)=>{let c=r.id??`decal-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;return E(a,u=>[...u.filter(w=>w.id!==c),{...r,id:c}]),c},[E]),h=H((a,r,c)=>E(a,u=>u.map(w=>w.id===r?{...w,...c}:w)),[E]),b=H((a,r)=>E(a,c=>c.filter(u=>u.id!==r)),[E]),f=H(a=>Le(t,a),[t]),S=H(a=>le(t,a).map(r=>t[r]?.id??r),[t]),x=H(a=>{let r=ee(t,a);return r?t[r]?.style?.material??null:null},[t]),j=H(a=>s(a,{visible:!1}),[s]),q=H(a=>s(a,{visible:!0}),[s]),X=H(a=>{i(r=>{let c=le(r,a).reduce((u,w)=>{let L=r[w];return L&&u.push({ids:w,patch:{visible:L.visible===!1}}),u},[]);return pe(r,c)})},[i]),_=H(()=>{i(a=>pe(a,Object.keys(a),{visible:!0}))},[i]),V=mt(()=>On(t),[t]),J=mt(()=>Object.keys(V).map(a=>t[a]?.id??a),[V,t]),N=H(a=>{let r=ee(t,a);return r?t[r]?.visible===!1:!1},[t]);return{objectBindings:t,setObjectBindings:i,updateObjectBindings:s,setMaterial:g,setBaseColor:y,setTexture:l,clearTexture:A,copyMaterial:B,resetMaterial:O,getMaterial:x,setTransform:v,resetTransform:m,updateMetadata:k,addDecal:C,updateDecal:h,removeDecal:b,selectObjectBindings:f,selectObjectBindingIds:S,hiddenObjects:V,hiddenObjectIds:J,hideObject:j,showObject:q,toggleObjectVisibility:X,isObjectHidden:N,clearHiddenObjects:_}}import{useCallback as te,useMemo as jn,useRef as Bn,useState as vn}from"react";function $e(e){let t=Bn(null),[i,s]=vn(()=>{let f=typeof e=="function"?e():e;return t.current=f,f}),g=te(f=>{s(S=>{let x=typeof f=="function"?f(S):f;return _e(S,x)})},[]),y=te(()=>{let f=t.current;f&&s(f)},[]),l=te((f,S)=>{g(x=>({lighting:{lights:x.lighting.lights.map(j=>j.id===f?{...j,...S}:j)}}))},[g]),A=te(f=>{g(S=>S.lighting.lights.some(x=>x.id===f.id)?{}:{lighting:{lights:[...S.lighting.lights,Ne(f)]}})},[g]),B=te(f=>{g(S=>({lighting:{lights:S.lighting.lights.filter(x=>x.id!==f)}}))},[g]),O=te((f,S)=>l(f,{intensity:S}),[l]),v=te((f,S)=>l(f,{color:S}),[l]),m=te(f=>l(f,{visible:!0}),[l]),k=te(f=>l(f,{visible:!1}),[l]),E=te(f=>{g(S=>({lighting:{lights:S.lighting.lights.map(x=>x.id===f?{...x,visible:!x.visible}:x)}}))},[g]),C=te((f,S)=>l(f,{attachment:S,attachedToCamera:!1}),[l]),h=te(f=>l(f,{attachment:void 0}),[l]),b=jn(()=>({items:i.lighting.lights,get:f=>i.lighting.lights.find(S=>S.id===f),add:A,update:l,remove:B,setIntensity:O,setColor:v,show:m,hide:k,toggle:E,attach:C,detach:h}),[i.lighting.lights,A,l,B,O,v,m,k,E,C,h]);return{sceneConfig:i,setSceneConfig:s,updateSceneConfig:g,resetSceneConfig:y,lights:b}}import{useCallback as ze}from"react";function We({bindings:e,scene:t,camera:i,animations:s,isolation:g,onAction:y}){let{objectBindings:l,updateObjectBindings:A,showObject:B,hideObject:O,toggleObjectVisibility:v}=e,m=t?.updateSceneConfig,k=i?.focusObject,E=i?.fitScene,C=i?.resetView,h=i?.setCameraTarget,b=i?.setCameraState,f=s?.play,S=s?.pause,x=s?.stop,j=s?.setSpeed,q=s?.seek,X=g?.handleIsolationChange,_=ze(N=>{let a=ee(l,N);return a?l[a]?.actions??[]:[]},[l]),V=ze(async N=>{for(let a of N.action.effects??[]){if("objectBindings"in a){A(a.target,a.objectBindings);continue}if("sceneConfig"in a){m?.(a.sceneConfig);continue}if("isolation"in a){X?.(a.isolation);continue}if("visibility"in a){a.visibility==="show"?B(a.target):a.visibility==="hide"?O(a.target):v(a.target);continue}if("camera"in a){let c=a.camera;c.type==="focus-object"?await k?.(c.objectId??N.objectId):c.type==="fit-scene"?await E?.():c.type==="reset"?await C?.():c.type==="set-target"?await h?.(c.target,c.transition??!0):await b?.(c.state,c.transition??!0);continue}let r=a.animation;if(r.type==="play"){let{type:c,clip:u,...w}=r;f?.(u,w)}else r.type==="pause"?S?.(r.clip):r.type==="stop"?x?.(r.clip):r.type==="set-speed"?j?.(r.speed,r.clip):q?.(r.time,r.clip)}await y?.(N)},[E,k,O,y,S,f,C,q,j,b,h,X,B,x,v,A,m]),J=ze(async(N,a)=>{let r=ee(l,N);if(!r)return null;let c=l[r],u=c?.actions?.find(L=>L.id===a);if(!c||!u)return null;let w={objectId:r,action:u,binding:c};return await V(w),w},[V,l]);return{getActionsForObject:_,handleAction:V,runAction:J}}import{useCallback as Ve,useRef as yt}from"react";function Mn(e){return typeof e=="function"?e:e?.handleViewerReady??null}function Ye(...e){let t=yt(null),i=yt(e);i.current=e;let s=Ve(B=>{t.current=B;let O=new Set;for(let v of i.current){let m=Mn(v);m&&!O.has(m)&&(O.add(m),m(B))}},[]),g=Ve(()=>t.current,[]),y=Ve(B=>{let O=t.current;return O?O.captureImage(B):Promise.reject(new Error("ModelViewer is not ready yet."))},[]),l=Ve(()=>{let B=t.current;return B?(B.invalidate(),!0):!1},[]),A=Ve(B=>{let O=t.current;return O?O.captureVideo(B):Promise.reject(new Error("ModelViewer is not ready yet."))},[]);return{handleViewerReady:s,getViewer:g,captureImage:y,captureVideo:A,invalidate:l}}import{useCallback as U,useEffect as Rn,useRef as se}from"react";import{Material as xn,PointLight as An,Vector3 as Pn}from"three";var Qe=["emissiveIntensity","opacity","metalness","roughness","transmission","clearcoat","clearcoatRoughness","ior","thickness"],ve=1;function Me(e){return typeof e=="string"?[e]:e}function Re(e,t=0,i=1){return Math.min(i,Math.max(t,e))}function Xe(e,t){return e+Math.random()*(t-e)}function ht([e,t],i){return e+(t-e)*i}function Je([e,t],i){return[e[0]+(t[0]-e[0])*i,e[1]+(t[1]-e[1])*i,e[2]+(t[2]-e[2])*i]}function Vt(e,t){let i=Re(e);switch(t){case"ease-in":return i*i;case"ease-out":return 1-(1-i)*(1-i);case"ease-in-out":return i<.5?2*i*i:1-Math.pow(-2*i+2,2)/2;default:return i}}function En(e){let t=e.material;return t?(Array.isArray(t)?t:[t]).filter(i=>i instanceof xn):[]}function Tn(e){let t={opacity:e.opacity,transparent:e.transparent};e.color&&(t.baseColor=`#${e.color.getHexString()}`),e.emissive&&(t.emissive=`#${e.emissive.getHexString()}`);for(let i of Qe){let s=e[i];typeof s=="number"&&(t[i]=s)}return t}function Ct(e,t){t.baseColor!==void 0&&e.color&&e.color.set(t.baseColor),t.emissive!==void 0&&e.emissive&&e.emissive.set(t.emissive);for(let i of Qe){let s=t[i];s!==void 0&&typeof e[i]=="number"&&(e[i]=s)}t.transparent!==void 0&&(e.transparent=t.transparent),e.needsUpdate=!0}function In(e){return{position:[e.position.x,e.position.y,e.position.z],rotation:[e.rotation.x,e.rotation.y,e.rotation.z],scale:[e.scale.x,e.scale.y,e.scale.z],visible:e.visible}}function Ln(e,t){if(t.position&&e.position.set(...t.position),t.rotation&&e.rotation.set(...t.rotation),t.scale!==void 0){let i=typeof t.scale=="number"?[t.scale,t.scale,t.scale]:t.scale;e.scale.set(...i)}t.visible!==void 0&&(e.visible=t.visible),e.updateMatrix(),e.updateMatrixWorld(!0)}function Ze(e={}){let t=se(e);t.current=e;let i=se(null),s=se(null),g=se(null),y=se(new Map),l=se(new Map),A=se(new Map),B=se(new Map),O=U(n=>{let o=i.current;if(!o)return null;let p=ee(o.objectBindings,n);return o.raw.nodes[n]??(p?o.raw.nodes[p]:null)??(o.raw.scene?ot(o.raw.scene,n):null)??null},[]),v=U(n=>{let o=i.current;return o?typeof n=="object"&&!Array.isArray(n)?le(o.objectBindings,n):Me(n).map(p=>ee(o.objectBindings,p)??p):typeof n=="string"?[n]:Array.isArray(n)?n:[]},[]),m=U(()=>{i.current?.invalidate()},[]),k=U((n,o)=>{let p=!1;for(let d of v(n)){let M=O(d);if(M)for(let I of En(M))A.current.has(I)||A.current.set(I,Tn(I)),Ct(I,o),p=!0}return p},[O,v]),E=U((n,o)=>{let p=k(n,o);return p&&m(),p},[m,k]),C=U((n,o)=>{let p=!1;for(let d of v(n)){let M=O(d);M&&(B.current.has(M)||B.current.set(M,In(M)),Ln(M,o),p=!0)}return p},[O,v]),h=U((n,o)=>{let p=C(n,o);return p&&m(),p},[m,C]),b=U(n=>{let o=O(n);if(!o)return null;o.updateWorldMatrix(!0,!1);let p=o.getWorldPosition(new Pn);return[p.x,p.y,p.z]},[O]),f=U(n=>{let o=l.current.get(n);return o?(o.light.removeFromParent(),o.light.dispose(),l.current.delete(n),m(),!0):!1},[m]),S=U(n=>{let o=O(n.target);if(!o)return!1;let p=l.current.get(n.id),d=p?.light??new An;return p&&p.target!==n.target&&d.removeFromParent(),d.name=`react-immersive-runtime-light:${n.id}`,d.color.set(n.color??"#ffffff"),d.intensity=n.intensity??1,d.distance=n.distance??0,d.decay=n.decay??2,d.castShadow=n.castShadow??!1,d.position.set(...n.offset??[0,0,0]),d.parent!==o&&o.add(d),l.current.set(n.id,{light:d,target:n.target}),m(),!0},[m,O]),x=U((n,o)=>{let p=l.current.get(n);if(!p)return!1;if(o.target&&o.target!==p.target){let d=O(o.target);if(!d)return!1;p.light.removeFromParent(),d.add(p.light),p.target=o.target}return o.color!==void 0&&p.light.color.set(o.color),o.intensity!==void 0&&(p.light.intensity=o.intensity),o.distance!==void 0&&(p.light.distance=o.distance),o.decay!==void 0&&(p.light.decay=o.decay),o.offset!==void 0&&p.light.position.set(...o.offset),o.castShadow!==void 0&&(p.light.castShadow=o.castShadow),m(),!0},[m,O]),j=U((n,o)=>{let p=d=>o[d%o.length]??0;for(let d of n.materials??[])v(d.targets).forEach((M,I)=>{let T=p(I),D={};for(let z of Qe){let F=d.values[z];F&&(D[z]=ht(F,T))}k(M,D)});for(let d of n.transforms??[])v(d.targets).forEach((M,I)=>{let T=p(I),D={};d.values.position&&(D.position=Je(d.values.position,T)),d.values.rotation&&(D.rotation=Je(d.values.rotation,T)),d.values.scale&&(D.scale=Je(d.values.scale,T)),C(M,D)});for(let d of n.lights??[])Me(d.lights).forEach((M,I)=>{let T=l.current.get(M);T&&(T.light.intensity=ht(d.intensity,p(I)))})},[v,k,C]),q=se(()=>{}),X=se(()=>{});X.current=n=>{g.current=null;let o=!1;for(let[p,d]of y.current){d.startedAt===null&&(d.startedAt=n);let M=d.lastFrameAt??n;d.lastFrameAt=n;let I=d.override&&d.override.until>n?d.override.level:null;d.override&&I===null&&(d.override=null);let T=d.update(n,n-d.startedAt,Math.min(100,n-M),I);o=!0,T||(y.current.delete(p),d.onComplete?.())}o&&m(),y.current.size>0&&q.current()},q.current=()=>{g.current!==null||typeof requestAnimationFrame>"u"||(g.current=requestAnimationFrame(n=>X.current(n)))};let _=U(n=>(y.current.set(n.id,n),q.current(),n.id),[]),V=U((n,o={})=>{let p=o.id??`transition-${ve++}`,d=Math.max(1,o.duration??400),M=o.easing??"ease-in-out";return _({id:p,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(I,T,D,z)=>{let F=z??Vt(T/d,M);return j(n,[F]),T<d}})},[j,_]),J=U((n,o={})=>{let p=o.id??`pulse-${ve++}`,d=Math.max(1,o.duration??1e3),M=o.minLevel??0,I=o.maxLevel??1,T=o.repeat??1/0,D=o.synchronized??!0,z=Math.max(1,...[...n.materials??[],...n.transforms??[]].map(F=>v(F.targets).length),...(n.lights??[]).map(F=>Me(F.lights).length));return _({id:p,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(F,ce,ue,Q)=>{let Y=ce/d,R=Array.from({length:D?1:z},(P,W)=>{if(Q!==null)return Q;let K=Y+(D?0:W/z),G=.5-Math.cos(K%1*Math.PI*2)/2;return M+(I-M)*G});return j(n,R),T===1/0||Y<T}})},[j,_,v]),N=U((n,o={})=>{let p=o.id??`timeline-${ve++}`,d=o.repeat??1,M=n.map(T=>({...T,duration:Math.max(1,T.duration),hold:Math.max(0,T.hold??0)})),I=Math.max(1,M.reduce((T,D)=>T+D.duration+D.hold,0));return _({id:p,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(T,D,z,F)=>{if(M.length===0||d<=0)return!1;let ce=D/I;if(d!==1/0&&ce>=d){for(let Y of M)j(Y.channels,[1]);return!1}let ue=D%I,Q=0;for(let Y of M){let R=Q+Y.duration,P=R+Y.hold;if(ue>=R){j(Y.channels,[F??1]),Q=P;continue}if(ue>=Q){let W=F??Vt((ue-Q)/Y.duration,Y.easing??"ease-in-out");j(Y.channels,[W]);break}}return!0}})},[j,_]),a=U((n,o={})=>{let p=o.id??`flicker-${ve++}`,d=o.synchronized??!0,M=o.minLevel??.15,I=o.maxLevel??1,T=o.interval??[45,160],D=typeof T=="number"?[T,T]:T,z=[Math.max(1,Math.min(...D)),Math.max(1,Math.max(...D))],F=Re(o.response??.7,.01,1),ce=Re(o.blackoutChance??.08),ue=Re(o.flashChance??.12),Q=o.flashLevel??1.15,Y=Math.max(1,...[...n.materials??[],...n.transforms??[]].map(G=>v(G.targets).length),...(n.lights??[]).map(G=>Me(G.lights).length)),R=d?1:Y,P=Array.from({length:R},()=>M),W=Array.from({length:R},()=>M),K=Array.from({length:R},()=>0);return _({id:p,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(G,we,oe,Ce)=>{for(let Z=0;Z<R;Z+=1){if(Ce!==null)W[Z]=Ce;else if(G>=K[Z]){let it=Math.random();W[Z]=it<ce?Xe(0,Math.min(.04,M)):it<ce+ue?Q:Xe(M,I),K[Z]=G+Xe(...z)}let xt=1-Math.pow(1-F,Math.max(1,oe)/16.67);P[Z]+=(W[Z]-P[Z])*xt}return j(n,P),o.duration===void 0||we<o.duration}})},[j,_,v]),r=U((n,o,p)=>{let d=y.current.get(n);if(!d)return!1;let M=typeof performance>"u"?Date.now():performance.now();return d.override={level:o,until:M+Math.max(0,p)},q.current(),!0},[]),c=U(n=>y.current.delete(n),[]),u=U(()=>{y.current.clear(),g.current!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(g.current),g.current=null)},[]),w=U(()=>{for(let[n,o]of A.current)Ct(n,o);A.current.clear();for(let[n,o]of B.current)n.position.set(...o.position),n.rotation.set(...o.rotation),n.scale.set(...o.scale),n.visible=o.visible,n.updateMatrix(),n.updateMatrixWorld(!0);B.current.clear();for(let n of l.current.values())n.light.removeFromParent(),n.light.dispose();l.current.clear(),m()},[m]),L=U(()=>{u(),w()},[w,u]),$=U(n=>{s.current&&s.current!==n.raw.scene&&w(),i.current=n,s.current=n.raw.scene,t.current.onViewerReady?.(n)},[w]);return Rn(()=>()=>{L(),i.current=null,s.current=null},[L]),{handleViewerReady:$,setMaterial:E,setTransform:h,getWorldPosition:b,addPointLight:S,updatePointLight:x,removePointLight:f,transition:V,timeline:N,pulse:J,flicker:a,overrideEffect:r,stopEffect:c,stopAllEffects:u,resetRuntime:L}}import{useCallback as kn,useState as Un}from"react";function et(){let[e,t]=Un(null),i=kn(s=>{t(s)},[t]);return{hoveredObjectBinding:e,handleHoveredObject:i}}import{useCallback as St,useState as Dn}from"react";function tt(e=null){let[t,i]=Dn(e),s=St((y,l)=>i({...l,target:y}),[]),g=St(()=>i(null),[]);return{isolation:t,isolate:s,clearIsolation:g,handleIsolationChange:i}}import{useCallback as xe,useState as de}from"react";function nt(){let[e,t]=de(!0),[i,s]=de(!1),[g,y]=de(null),[l,A]=de(null),[B,O]=de(0),[v,m]=de([]),[k,E]=de([]),[C,h]=de([]),b=xe(j=>{A(j.bounds),O(j.objectCount),m(j.materialVariants),E(j.materialVariantGroups),y(null),t(!1),s(!0)},[]),f=xe(j=>h(j),[]),S=xe(j=>{y(j),A(null),O(0),m([]),E([]),h([]),t(!1),s(!1)},[]),x=xe(()=>{t(!0),s(!1),y(null),A(null),O(0),m([]),E([]),h([])},[]);return{isLoading:e,isReady:i,error:g,bounds:l,objectCount:B,materialVariants:v,materialVariantGroups:k,objects:C,handleModelLoaded:b,handleObjectCatalog:f,handleLoadError:S,resetModelState:x}}import{useCallback as Ot,useState as Hn}from"react";function rt(e=null){let[t,i]=Hn(e),s=Ot(y=>{i(y)},[i]),g=Ot(()=>{i(null)},[]);return{selectedObjectBinding:t,setSelectedObjectBinding:i,handleObjectSelect:s,clearSelection:g}}var _n={};function Nn(e={}){let t=jt(e);t.current=e;let i=jt(e.bindings===void 0||e.bindings==="auto"),s=Ge(()=>{let V=t.current.bindings;return V===void 0||V==="auto"?_n:typeof V=="function"?V():V}),g=$e(()=>{let V=t.current.sceneConfig;return V===void 0?Oe:typeof V=="function"?V():V}),y=rt(),l=et(),A=Ee(e.camera),B=nt(),O=qe(),v=tt(),m=Ze(),k=Ye(A,m),E=We({bindings:s,scene:g,camera:A,animations:O,isolation:v,onAction:e.onAction}),{setObjectBindings:C}=s,{handleObjectCatalog:h}=B,b=Ae(V=>{h(V),i.current&&C(J=>{let N=dt(V.map(a=>a.name));for(let a of Object.keys(N))J[a]&&(N[a]=J[a]);return N})},[h,C]),{handleObjectSelect:f}=y,S=Ae(V=>{f(V),t.current.onObjectSelect?.(V)},[f]),{handleHoveredObject:x}=l,j=Ae(V=>{x(V),t.current.onObjectHover?.(V)},[x]),{handleLoadError:q}=B,X=Ae(V=>{q(V),t.current.onLoadError?.(V)},[q]),_=e.sceneConfig!==void 0||g.sceneConfig!==Oe;return{props:{objectBindings:s.objectBindings,onObjectBindingsChange:C,selectedObject:y.selectedObjectBinding,onObjectSelect:S,onObjectHover:j,onCameraChange:A.handleCameraChange,onViewerReady:k.handleViewerReady,onModelLoaded:B.handleModelLoaded,onLoadError:X,onObjectCatalog:b,onAnimationsReady:O.handleAnimationsReady,onAction:E.handleAction,onSceneConfigChange:g.setSceneConfig,isolation:v.isolation,onIsolationChange:v.handleIsolationChange,..._?{sceneConfig:g.sceneConfig}:{}},bindings:s,selection:y,hover:l,camera:A,model:B,animations:O,actions:E,scene:g,isolation:v,effects:m,connection:k}}import{useMemo as qn}from"react";function Fn(e,t){return qn(()=>{if(!t)return null;let i=e[t];return i||(Object.values(e).find(s=>s.id===t||s.modelObjectId===t)??null)},[e,t])}import{useMemo as Kn}from"react";function Gn(e){return Kn(()=>Object.values(e).map(t=>t.modelObjectId),[e])}import{useCallback as ne,useEffect as Pe,useRef as ae,useState as $n}from"react";function zn(e,t){if(!e.objectBindings&&(!!e.hidden?.length||!!e.selected)&&Object.keys(t).length===0)return null;let s={};if(e.objectBindings)s.bindings=e.objectBindings;else if(e.hidden){let g=new Set(e.hidden);s.bindings=Object.fromEntries(Object.entries(t).map(([y,l])=>[y,{...l,visible:!g.has(l.id)}]))}if(e.selected!==void 0){let g=e.objectBindings??t,y=e.selected?ee(g,e.selected):null;s.selected=y?g[y]:null}return s}function Bt(e){return JSON.stringify(e&&{modelUrl:e.modelUrl,activeModelId:e.activeModelId,tilesetUrl:e.tilesetUrl,mergeModels:e.mergeModels,models:e.models?.map(({id:t,url:i,mergeModels:s})=>({id:t,url:i,mergeModels:s}))})}function Wn(e){let t=ae(e);t.current=e;let i=e.paramKey??"view",s=`${i}Id`,[g,y]=$n(!1),l=ae(null),A=ae(null),B=ae(null),O=ae(null),v=ae(null),m=ae(null),k=ae(null),E=ae(null),C=ae(!0),h=ne(r=>{let c=r instanceof Error?r:new Error(String(r));t.current.onError?t.current.onError(c):k.current!==c.message&&console.warn("[react-immersive]",c.message),k.current=c.message},[]),b=ne(()=>{v.current!==null&&clearTimeout(v.current),v.current=null},[]);Pe(()=>(C.current=!0,()=>{C.current=!1,b()}),[b]);let f=ne(()=>{let r=t.current,c=(r.mode??(r.configuration?"configuration":"view"))==="configuration";return{version:1,camera:r.cameraState??void 0,hidden:Object.values(r.objectBindings).filter(u=>u.visible===!1).map(u=>u.id),selected:r.selectedObjectBinding?.id??null,...c?{objectBindings:r.objectBindings,configuration:r.configuration}:{}}},[]),S=ne(()=>ye(f(),typeof window>"u"?void 0:window.location.href),[f]),x=ne(()=>Ie(f(),typeof window>"u"?void 0:window.location.href),[f]),j=ne((r,c,u=window.location.href)=>{let w=new URL(u),L=new URLSearchParams(w.hash.slice(1));if(L.delete(i),L.delete(s),L.set(c?s:i,r),w.hash=L.toString(),!c&&w.href.length>(t.current.maxUrlLength??65536))throw new Error("Viewer configuration is too large for an inline link. Save JSON instead, or configure storage for createShareUrl(). Uploaded images can make links large.");return w.href},[i,s]),q=ne(()=>j(fe(S()),!1),[S,j]),X=ne(async()=>{let r=window.location.href,c=t.current.storage,u=await x();if(!c)return j(fe(u),!1,r);let w=await c.save(u);if(typeof w!="string"||!w.trim()||w.length>2048)throw new Error("Viewer state storage returned an invalid id.");return j(w,!0,r)},[x,j]),_=ne(()=>{if(b(),l.current||m.current)return;let r=q();window.history.replaceState(null,"",r),O.current=`inline:${new URL(r).hash}`},[b,q]),V=ne(async()=>{let r=l.current;if(!r||A.current||!C.current)return!1;A.current=r,b();try{let c=t.current,u=r.state;if(u.configuration&&!r.configurationApplied){if(!c.onConfigurationChange)throw new Error("Restoring a full viewer configuration requires onConfigurationChange.");return r.configurationApplied=!0,c.onConfigurationChange(u.configuration),!1}if(u.configuration&&Bt(c.configuration)!==Bt(u.configuration)||c.isReady===!1)return!1;if(u.camera&&!r.cameraApplied){if(!await c.setCameraState(u.camera,!1)||l.current!==r||!C.current)return!1;r.cameraApplied=!0}c=t.current;let w=zn(u,c.objectBindings);return!w||l.current!==r?!1:(w.bindings&&c.onObjectBindingsChange(w.bindings),w.selected!==void 0&&c.setSelectedObjectBinding(w.selected),l.current=null,B.current=r.key,y(!0),!0)}catch(c){throw l.current===r&&(l.current=null),y(!1),c}finally{A.current=null,l.current&&l.current!==r&&C.current&&V().catch(h)}},[b,h]),J=ne(async r=>{let c=ye(r,window.location.href);b(),E.current=null,m.current=null;let u=new URLSearchParams(window.location.hash.slice(1));return O.current=u.has(i)?`inline:${window.location.hash}`:u.has(s)?`stored:${s}:${u.get(s)}`:null,B.current=null,l.current={key:`manual:${fe(c)}`,origin:"manual",state:c,configurationApplied:!1,cameraApplied:!1},y(!1),V()},[V,b,i,s]),N=ne(async()=>{let r=new URLSearchParams(window.location.hash.slice(1)),c=r.get(i),u=r.get(s),w=c!==null?`inline:${window.location.hash}`:u!==null?`stored:${s}:${u}`:null;if(!w)return E.current=null,m.current=null,l.current?.origin==="manual"?V():(l.current=null,B.current=null,y(!0),!1);if(w===O.current||w===B.current)return l.current?.origin==="manual"?V():!1;if(l.current?.key===w)return V();b(),y(!1),E.current=w,l.current=null;let L=c;if(c===null){let n=t.current.storage;if(!n)throw new Error("This shared link requires a viewer state storage adapter.");(!m.current||m.current.key!==w)&&(m.current={key:w,promise:n.load(u)});let o=m.current;try{L=await o.promise}finally{m.current===o&&(m.current=null)}if(E.current!==w||!C.current)return!1;let p=l.current;if(p?.key===w||B.current===w)return p?V():!1}let $;try{$=ye(L,window.location.href)}catch(n){throw n}return l.current={key:w,origin:"url",state:$,configurationApplied:!1,cameraApplied:!1},V()},[V,b,s,i]);Pe(()=>{l.current&&V().catch(h)}),Pe(()=>{let r=()=>{N().catch(h)};return window.addEventListener("hashchange",r),()=>window.removeEventListener("hashchange",r)},[N,h]);let a=null;if(e.autoSync!==!1&&g&&!l.current&&!m.current)try{a=fe(S())}catch{}return Pe(()=>{if(e.autoSync===!1||!g||l.current||m.current){b();return}if(a===null){try{S()}catch(r){h(r)}return}return v.current=setTimeout(()=>{v.current=null;try{_()}catch(r){h(r)}},Math.max(0,e.debounceMs??400)),b},[a,e.autoSync,e.debounceMs,g,b,S,_,h]),{getState:S,getStateAsync:x,restoreState:J,getShareUrl:q,createShareUrl:X,syncUrl:_,restoreFromUrl:N}}import{useCallback as ge,useState as vt}from"react";var Yn={};function Mt(){return`asset-${globalThis.crypto.randomUUID()}`}function Xn(e){let[t,i]=vt(e),[s,g]=vt(()=>e[0]?re(e[0]):""),y=t.find(C=>re(C)===s)??t[0],l=y?re(y):"",A=ge(C=>{i(h=>h.map(b=>re(b)===l?{...b,objectBindings:C}:b))},[l]),B=ge(C=>{i(h=>h.map(b=>re(b)===l?{...b,sceneConfig:C}:b))},[l]),O=ge(C=>g(h=>{let b=t.find(f=>f.url===C);return b?re(b):h}),[t]),v=ge(C=>{let h={...C,id:C.id??Mt()};return i(b=>{if(b.some(f=>re(f)===h.id))throw new Error("Asset instance ID already exists.");return[...b,h]}),h.id},[]),m=ge(C=>{let h=t.find(j=>re(j)===C);if(!h)return null;let b=structuredClone(h);b.id=Mt(),b.sceneConfig?.measurements&&(b.sceneConfig.measurements.items=b.sceneConfig.measurements.items.map(j=>({...j,modelId:b.id}))),b.label=`${h.label??"Asset"} copy`;let[f,S,x]=h.transform?.position??[0,0,0];return b.transform={...b.transform,position:[f+1,S,x]},i(j=>[...j,b]),b.id},[t]),k=ge(C=>{i(h=>h.filter(b=>re(b)!==C))},[]),E=ge((C,h)=>{let b=Te(h);i(f=>f.map(S=>re(S)===C?{...S,transform:b}:S))},[]);return{modelUrl:y?.url??"",models:t,activeModelId:l,onModelChange:O,onActiveModelChange:g,objectBindings:Yn,onObjectBindingsChange:A,sceneConfig:y?.sceneConfig,onSceneConfigChange:B,addModel:v,duplicateModel:m,removeModel:k,updateModelTransform:E}}import{useCallback as be,useEffect as Jn,useState as Qn,useSyncExternalStore as Zn}from"react";var er={sequenceId:null,time:0,duration:0,status:"stopped",previewing:!1,ready:!1,issues:[]},tr=()=>()=>{},Rt=()=>er;function nr(){let[e,t]=Qn(null),i=Zn(e?.subscribe??tr,e?.getState??Rt,Rt);Jn(()=>()=>e?.stop(),[e]);let s=be(g=>t(g),[]);return{controls:e,playback:i,handleSequencesReady:s,play:be(g=>e?.play(g)??!1,[e]),pause:be(()=>e?.pause(),[e]),stop:be(()=>e?.stop(),[e]),seek:be(g=>e?.seek(g)??!1,[e]),select:be(g=>e?.select(g)??!1,[e])}}export{tn as ACTION_CATALOG,yn as AssetDiagnosticsPanel,pt as CompareViewer,Lt as DEFAULT_MODEL_VIEWER_LABELS,Oe as DEFAULT_SCENE_CONFIG,Se as DEFAULT_SECTION_CONFIG,pn as MATERIAL_BLENDING_MODES,fn as MATERIAL_SIDES,Yt as MAX_VIEWER_STATE_BYTES,_t as MEASUREMENT_UNITS,en as MODEL_VIEWER_PRESETS,he as ModelViewer,Pt as SEQUENCE_EASINGS,At as SEQUENCE_OBJECT_PROPERTIES,cn as applyIsolation,sn as applyStyleRules,un as buildBindingsFromNodes,qt as calibrateMeasurements,rn as chooseMaterialVariant,mn as collectObjectHierarchy,on as colorScaleValue,ke as compareViewerConfigurations,bn as copyBindingStyle,Xt as createARHandoffUrl,dn as createDefaultBinding,gn as defineObjectBindings,Qt as exportConfiguredUSDZ,nn as findCatalogAction,Ht as groundAsset,ln as inferType,Zt as inspectAsset,an as isolatedBindingKeys,He as material,Kt as measurementResult,Nt as measurementScale,Ft as measurementValue,zt as measurementsToCsv,Te as parseAssetTransform,Gt as parseMeasurements,kt as parseSectionConfig,Wt as parseSelectionSets,Et as parseSequences,ye as parseViewerState,wn as pasteBindingStyle,pe as patchBindings,_e as patchSceneConfig,Ie as prepareViewerState,Jt as readARHandoffUrl,Tt as sampleSequenceTrack,Ne as sceneLight,Ut as sectionSnapshot,le as selectBindingKeys,Le as selectBindings,$t as serializeMeasurements,fe as serializeViewerState,Dt as snapAssetToGrid,It as upsertSequenceKeyframe,Fn as useObjectBinding,Gn as useObjectBindingIds,Ge as useObjectBindings,$e as useSceneConfig,Wn as useShareableViewerState,Nn as useViewer,We as useViewerActions,qe as useViewerAnimations,Ee as useViewerCamera,Ye as useViewerConnection,Ze as useViewerEffects,et as useViewerHover,tt as useViewerIsolation,nt as useViewerModel,Xn as useViewerModels,rt as useViewerSelection,nr as useViewerSequences};
1
+ "use client";import{c as he}from"./chunk-2DV2UCQH.mjs";import"./chunk-MMO7KCYU.mjs";import{a as _e,b as Ne,c as xn}from"./chunk-F5QSXMME.mjs";import{A as ft,B as qe,C as kn,a as Ee,c as lt,e as yn,m as On,n as jn,x as ut,y as pt,z as He}from"./chunk-OREKYGO3.mjs";import"./chunk-7OWHW66D.mjs";import"./chunk-OPZJDP7T.mjs";import"./chunk-FGAJ2UT7.mjs";import{A as ct}from"./chunk-PBVBZYOG.mjs";import{a as st,b as at}from"./chunk-T6AYLPCC.mjs";import"./chunk-37YITTIK.mjs";import{$ as qt,Aa as vn,Ba as Mn,C as Se,Ca as Pn,D as Oe,Da as Rn,E as kt,Ea as dt,F as Ut,Ha as Ue,Ia as De,J as re,Ja as An,K as Te,Ka as En,La as Tn,M as Dt,Ma as In,N as Ht,Na as Ln,X as _t,Z as Nt,aa as Ft,ba as Kt,ca as Gt,da as $t,e as ot,ea as zt,fa as Wt,ga as fn,ha as ge,ia as ye,ja as ke,oa as gn,pa as mn,sa as bn,ta as hn,va as Vn,za as Bn}from"./chunk-5FLX45O5.mjs";import{b as Cn,c as Sn}from"./chunk-CCBFMNAU.mjs";import{a as xt,b as At,e as Et,f as Tt,g as It}from"./chunk-LX3GXQNU.mjs";import{b as fe,c as Le,d as Xt,e as Jt,f as Qt,g as Zt,h as en,i as tn,j as nn,k as rn,l as on,m as sn,n as an,o as cn,p as ln,q as dn,r as un,s as pn}from"./chunk-7JCFNZJM.mjs";import{a as ee,b as le,c as Ie}from"./chunk-GV4ZRXL6.mjs";import{n as wn}from"./chunk-EV6THDXD.mjs";import{a as Lt}from"./chunk-6CTCV2Q5.mjs";import{c as Yt}from"./chunk-BNKTI3CY.mjs";import"./chunk-JR557W27.mjs";import{useCallback as Un,useEffect as je,useMemo as Be,useRef as Fe,useState as me}from"react";import{jsx as ie,jsxs as Ke}from"react/jsx-runtime";var Dn=Object.freeze({});function gt(e){return ie(st,{labels:e.labels,children:ie(Hn,{...e})})}function Hn({before:e,after:t,layout:i="slider",split:s,onSplitChange:p,reveal:y="auto",semanticComparison:l=!1,showComparisonOutlines:x,onComparisonOutlinesChange:B,onComparisonChange:O,linkSections:v,...m}){let k=at(),[E,C]=me(y==="auto");je(()=>{y==="auto"&&C(!0)},[y]);let[h,b]=me(.5),[f,S]=me(!0),R=x??f,j=P=>{x===void 0&&S(P),B?.(P)},q=He(s??h),X=Un(P=>{let A=He(P);s===void 0&&b(A),p?.(A)},[s,p]),_=Fe([null,null]),[V,J]=me([null,null]),[N,a]=me(null),[r,c]=me(null),u=[{...m,...e},{...m,...t}];je(()=>a(null),[u[0].sceneConfig?.section,u[1].sceneConfig?.section]);let w=P=>{let A=u[P].objectBindings;return A&&typeof A=="object"?A:V[P]?.url===u[P].modelUrl?V[P].bindings:Dn},L=w(0),$=w(1),n=Be(()=>l?Ue({objectBindings:L,sceneConfig:u[0].sceneConfig},{objectBindings:$,sceneConfig:u[1].sceneConfig},typeof l=="object"?l:{}):null,[l,L,$,u[0].sceneConfig,u[1].sceneConfig]),o=n?JSON.stringify(n):"",g=Fe(null);je(()=>{n&&g.current!==o&&(g.current=o,O?.(n))},[n,o,O]);let d=n?.objects.find(P=>P.id===r),M=Be(()=>n?[De(n,"before",r),De(n,"after",r)]:null,[n,r]),I=Be(()=>pt(),[]);je(()=>()=>I.detach(),[I]);let T=[e,t],D=Be(()=>[0,1].map(P=>(A,W)=>{_.current[P]=A,J(K=>K[P]?.bindings===A.objectBindings&&K[P]?.url===W?K:K.map((G,we)=>we===P?{url:W,bindings:A.objectBindings}:G)),I.attach(P,A.raw.controls,A.invalidate)}),[I]),z=T.map((P,A)=>{let{label:W,...K}=P,G={preset:"minimal",...m,...K},we=K.onViewerReady??m.onViewerReady;return{...G,...v??!!l?{sceneConfig:{...G.sceneConfig,section:N??u[1].sceneConfig?.section??Se},onSceneConfigChange:oe=>{a(oe.section??Se),(K.onSceneConfigChange??m.onSceneConfigChange)?.(oe)}}:{},...M?{comparisonHighlights:R?M[A]:void 0,selectedObject:A===0?d?.beforeKey?L[d.beforeKey]:null:d?.afterKey?$[d.afterKey]:null}:{},onObjectSelect:oe=>{if((K.onObjectSelect??m.onObjectSelect)?.(oe),n){let Ce=n.objects.find(Z=>(A===0?Z.beforeObjectId:Z.afterObjectId)===oe?.modelObjectId);c(Ce?.id??null)}},onViewerReady:oe=>{D[A](oe,G.modelUrl),we?.(oe)}}}),F=[e.label??k("compareBefore"),t.label??k("compareAfter")];(!z[0].modelUrl||!z[1].modelUrl)&&console.error("[react-immersive] CompareViewer needs a modelUrl, shared or on each side.");let ce=Fe(null),Q=n?ie(ut,{showOutlines:R,onShowOutlinesChange:j,report:n,selected:r,onSelect:P=>{c(P.id);let A=P.afterObjectId?1:0,W=_.current[A],K=A===1?P.afterObjectId:P.beforeObjectId,G=K?W?.raw.nodes[K]:null;W&&G&&(I.setLeader(A),W.raw.controls.fitToBox(G,!0),W.invalidate())},onClear:()=>c(null)}):null;if(!E)return ie(ct,{className:"ri-compare",background:lt(m.backgroundColor,m.sceneConfig),poster:m.poster??t.poster??e.poster,onReveal:()=>C(!0)});if(i==="side-by-side")return Ke("div",{className:"ri-compare ri-compare--sideBySide",children:[z.map((P,A)=>Ke("div",{className:"ri-compare__pane",children:[ie(he,{...P}),ie("span",{className:"ri-compare__label",children:F[A]})]},A)),Q]});let Y=`${q*100}%`;return Ke("div",{ref:ce,className:"ri-compare ri-compare--slider",style:{"--ri-compare-split":Y},children:[ie("div",{className:"ri-compare__layer",children:ie(he,{...z[0]})}),ie("div",{className:"ri-compare__layer ri-compare__layer--after",children:ie(he,{...z[1]})}),Q,ie(ft,{split:q,onSplitChange:X,labels:[F[0],F[1]],containerRef:ce})]})}import{useCallback as xe,useRef as jt}from"react";import{useCallback as H,useMemo as mt,useState as _n}from"react";var bt={baseColor:"texture",metalness:"metalnessMap",roughness:"roughnessMap",emissive:"emissiveMap",alpha:"alphaMap",normal:"normalMap",bump:"bumpMap",ao:"aoMap",displacement:"displacementMap",clearcoat:"clearcoatMap",clearcoatRoughness:"clearcoatRoughnessMap",clearcoatNormal:"clearcoatNormalMap",anisotropy:"anisotropyMap",transmission:"transmissionMap",thickness:"thicknessMap",sheenColor:"sheenColorMap",sheenRoughness:"sheenRoughnessMap",specularIntensity:"specularIntensityMap",specularColor:"specularColorMap"};function wt(e){if(e)return Object.fromEntries(Object.entries(e).map(([t,i])=>[t,i&&typeof i=="object"?{...i}:i]))}function Nn(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t.visible===!1).map(([t])=>[t,!0]))}function Ge(e){let[t,i]=_n(e),s=H((a,r)=>{i(c=>r===void 0?fe(c,a):fe(c,a,r))},[]),p=H((a,r)=>s(a,Le(r)),[s]),y=H((a,r)=>p(a,{baseColor:r}),[p]),l=H((a,r,c="baseColor")=>{let u=bt[c],w=typeof r=="string"?{path:r}:r;s(a,{style:{material:{[u]:w}}})},[s]),x=H((a,r="baseColor")=>{let c=bt[r];s(a,{style:{material:{[c]:void 0}}})},[s]),B=H((a,r)=>{i(c=>{let u=ee(c,a);if(!u)return c;let w=wt(c[u]?.style?.material),L=le(c,r);if(L.length===0)return c;let $=c;for(let n of L){let o=c[n];o&&($===c&&($={...c}),$[n]={...o,style:{...o.style,material:wt(w)}})}return $})},[]),O=H(a=>s(a,{style:{material:void 0}}),[s]),v=H((a,r)=>s(a,{transform:r}),[s]),m=H(a=>s(a,{transform:void 0}),[s]),k=H((a,r)=>s(a,{metadata:r}),[s]),E=H((a,r)=>{i(c=>{let u=c;for(let w of le(c,a)){let L=c[w],$=r(L.decals??[]);u===c&&(u={...c}),u[w]={...L,decals:$.length>0?$:void 0}}return u})},[]),C=H((a,r)=>{let c=r.id??`decal-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;return E(a,u=>[...u.filter(w=>w.id!==c),{...r,id:c}]),c},[E]),h=H((a,r,c)=>E(a,u=>u.map(w=>w.id===r?{...w,...c}:w)),[E]),b=H((a,r)=>E(a,c=>c.filter(u=>u.id!==r)),[E]),f=H(a=>Ie(t,a),[t]),S=H(a=>le(t,a).map(r=>t[r]?.id??r),[t]),R=H(a=>{let r=ee(t,a);return r?t[r]?.style?.material??null:null},[t]),j=H(a=>s(a,{visible:!1}),[s]),q=H(a=>s(a,{visible:!0}),[s]),X=H(a=>{i(r=>{let c=le(r,a).reduce((u,w)=>{let L=r[w];return L&&u.push({ids:w,patch:{visible:L.visible===!1}}),u},[]);return fe(r,c)})},[i]),_=H(()=>{i(a=>fe(a,Object.keys(a),{visible:!0}))},[i]),V=mt(()=>Nn(t),[t]),J=mt(()=>Object.keys(V).map(a=>t[a]?.id??a),[V,t]),N=H(a=>{let r=ee(t,a);return r?t[r]?.visible===!1:!1},[t]);return{objectBindings:t,setObjectBindings:i,updateObjectBindings:s,setMaterial:p,setBaseColor:y,setTexture:l,clearTexture:x,copyMaterial:B,resetMaterial:O,getMaterial:R,setTransform:v,resetTransform:m,updateMetadata:k,addDecal:C,updateDecal:h,removeDecal:b,selectObjectBindings:f,selectObjectBindingIds:S,hiddenObjects:V,hiddenObjectIds:J,hideObject:j,showObject:q,toggleObjectVisibility:X,isObjectHidden:N,clearHiddenObjects:_}}import{useCallback as te,useMemo as qn,useRef as Fn,useState as Kn}from"react";function $e(e){let t=Fn(null),[i,s]=Kn(()=>{let f=typeof e=="function"?e():e;return t.current=f,f}),p=te(f=>{s(S=>{let R=typeof f=="function"?f(S):f;return _e(S,R)})},[]),y=te(()=>{let f=t.current;f&&s(f)},[]),l=te((f,S)=>{p(R=>({lighting:{lights:R.lighting.lights.map(j=>j.id===f?{...j,...S}:j)}}))},[p]),x=te(f=>{p(S=>S.lighting.lights.some(R=>R.id===f.id)?{}:{lighting:{lights:[...S.lighting.lights,Ne(f)]}})},[p]),B=te(f=>{p(S=>({lighting:{lights:S.lighting.lights.filter(R=>R.id!==f)}}))},[p]),O=te((f,S)=>l(f,{intensity:S}),[l]),v=te((f,S)=>l(f,{color:S}),[l]),m=te(f=>l(f,{visible:!0}),[l]),k=te(f=>l(f,{visible:!1}),[l]),E=te(f=>{p(S=>({lighting:{lights:S.lighting.lights.map(R=>R.id===f?{...R,visible:!R.visible}:R)}}))},[p]),C=te((f,S)=>l(f,{attachment:S,attachedToCamera:!1}),[l]),h=te(f=>l(f,{attachment:void 0}),[l]),b=qn(()=>({items:i.lighting.lights,get:f=>i.lighting.lights.find(S=>S.id===f),add:x,update:l,remove:B,setIntensity:O,setColor:v,show:m,hide:k,toggle:E,attach:C,detach:h}),[i.lighting.lights,x,l,B,O,v,m,k,E,C,h]);return{sceneConfig:i,setSceneConfig:s,updateSceneConfig:p,resetSceneConfig:y,lights:b}}import{useCallback as ze}from"react";function We({bindings:e,scene:t,camera:i,animations:s,isolation:p,onAction:y}){let{objectBindings:l,updateObjectBindings:x,showObject:B,hideObject:O,toggleObjectVisibility:v}=e,m=t?.updateSceneConfig,k=i?.focusObject,E=i?.fitScene,C=i?.resetView,h=i?.setCameraTarget,b=i?.setCameraState,f=s?.play,S=s?.pause,R=s?.stop,j=s?.setSpeed,q=s?.seek,X=p?.handleIsolationChange,_=ze(N=>{let a=ee(l,N);return a?l[a]?.actions??[]:[]},[l]),V=ze(async N=>{for(let a of N.action.effects??[]){if("objectBindings"in a){x(a.target,a.objectBindings);continue}if("sceneConfig"in a){m?.(a.sceneConfig);continue}if("isolation"in a){X?.(a.isolation);continue}if("visibility"in a){a.visibility==="show"?B(a.target):a.visibility==="hide"?O(a.target):v(a.target);continue}if("camera"in a){let c=a.camera;c.type==="focus-object"?await k?.(c.objectId??N.objectId):c.type==="fit-scene"?await E?.():c.type==="reset"?await C?.():c.type==="set-target"?await h?.(c.target,c.transition??!0):await b?.(c.state,c.transition??!0);continue}let r=a.animation;if(r.type==="play"){let{type:c,clip:u,...w}=r;f?.(u,w)}else r.type==="pause"?S?.(r.clip):r.type==="stop"?R?.(r.clip):r.type==="set-speed"?j?.(r.speed,r.clip):q?.(r.time,r.clip)}await y?.(N)},[E,k,O,y,S,f,C,q,j,b,h,X,B,R,v,x,m]),J=ze(async(N,a)=>{let r=ee(l,N);if(!r)return null;let c=l[r],u=c?.actions?.find(L=>L.id===a);if(!c||!u)return null;let w={objectId:r,action:u,binding:c};return await V(w),w},[V,l]);return{getActionsForObject:_,handleAction:V,runAction:J}}import{useCallback as Ve,useRef as yt}from"react";function Gn(e){return typeof e=="function"?e:e?.handleViewerReady??null}function Ye(...e){let t=yt(null),i=yt(e);i.current=e;let s=Ve(B=>{t.current=B;let O=new Set;for(let v of i.current){let m=Gn(v);m&&!O.has(m)&&(O.add(m),m(B))}},[]),p=Ve(()=>t.current,[]),y=Ve(B=>{let O=t.current;return O?O.captureImage(B):Promise.reject(new Error("ModelViewer is not ready yet."))},[]),l=Ve(()=>{let B=t.current;return B?(B.invalidate(),!0):!1},[]),x=Ve(B=>{let O=t.current;return O?O.captureVideo(B):Promise.reject(new Error("ModelViewer is not ready yet."))},[]);return{handleViewerReady:s,getViewer:p,captureImage:y,captureVideo:x,invalidate:l}}import{useCallback as U,useEffect as $n,useRef as se}from"react";import{Material as zn,PointLight as Wn,Vector3 as Yn}from"three";var Qe=["emissiveIntensity","opacity","metalness","roughness","transmission","clearcoat","clearcoatRoughness","ior","thickness"],ve=1;function Me(e){return typeof e=="string"?[e]:e}function Pe(e,t=0,i=1){return Math.min(i,Math.max(t,e))}function Xe(e,t){return e+Math.random()*(t-e)}function ht([e,t],i){return e+(t-e)*i}function Je([e,t],i){return[e[0]+(t[0]-e[0])*i,e[1]+(t[1]-e[1])*i,e[2]+(t[2]-e[2])*i]}function Vt(e,t){let i=Pe(e);switch(t){case"ease-in":return i*i;case"ease-out":return 1-(1-i)*(1-i);case"ease-in-out":return i<.5?2*i*i:1-Math.pow(-2*i+2,2)/2;default:return i}}function Xn(e){let t=e.material;return t?(Array.isArray(t)?t:[t]).filter(i=>i instanceof zn):[]}function Jn(e){let t={opacity:e.opacity,transparent:e.transparent};e.color&&(t.baseColor=`#${e.color.getHexString()}`),e.emissive&&(t.emissive=`#${e.emissive.getHexString()}`);for(let i of Qe){let s=e[i];typeof s=="number"&&(t[i]=s)}return t}function Ct(e,t){t.baseColor!==void 0&&e.color&&e.color.set(t.baseColor),t.emissive!==void 0&&e.emissive&&e.emissive.set(t.emissive);for(let i of Qe){let s=t[i];s!==void 0&&typeof e[i]=="number"&&(e[i]=s)}t.transparent!==void 0&&(e.transparent=t.transparent),e.needsUpdate=!0}function Qn(e){return{position:[e.position.x,e.position.y,e.position.z],rotation:[e.rotation.x,e.rotation.y,e.rotation.z],scale:[e.scale.x,e.scale.y,e.scale.z],visible:e.visible}}function Zn(e,t){if(t.position&&e.position.set(...t.position),t.rotation&&e.rotation.set(...t.rotation),t.scale!==void 0){let i=typeof t.scale=="number"?[t.scale,t.scale,t.scale]:t.scale;e.scale.set(...i)}t.visible!==void 0&&(e.visible=t.visible),e.updateMatrix(),e.updateMatrixWorld(!0)}function Ze(e={}){let t=se(e);t.current=e;let i=se(null),s=se(null),p=se(null),y=se(new Map),l=se(new Map),x=se(new Map),B=se(new Map),O=U(n=>{let o=i.current;if(!o)return null;let g=ee(o.objectBindings,n);return o.raw.nodes[n]??(g?o.raw.nodes[g]:null)??(o.raw.scene?ot(o.raw.scene,n):null)??null},[]),v=U(n=>{let o=i.current;return o?typeof n=="object"&&!Array.isArray(n)?le(o.objectBindings,n):Me(n).map(g=>ee(o.objectBindings,g)??g):typeof n=="string"?[n]:Array.isArray(n)?n:[]},[]),m=U(()=>{i.current?.invalidate()},[]),k=U((n,o)=>{let g=!1;for(let d of v(n)){let M=O(d);if(M)for(let I of Xn(M))x.current.has(I)||x.current.set(I,Jn(I)),Ct(I,o),g=!0}return g},[O,v]),E=U((n,o)=>{let g=k(n,o);return g&&m(),g},[m,k]),C=U((n,o)=>{let g=!1;for(let d of v(n)){let M=O(d);M&&(B.current.has(M)||B.current.set(M,Qn(M)),Zn(M,o),g=!0)}return g},[O,v]),h=U((n,o)=>{let g=C(n,o);return g&&m(),g},[m,C]),b=U(n=>{let o=O(n);if(!o)return null;o.updateWorldMatrix(!0,!1);let g=o.getWorldPosition(new Yn);return[g.x,g.y,g.z]},[O]),f=U(n=>{let o=l.current.get(n);return o?(o.light.removeFromParent(),o.light.dispose(),l.current.delete(n),m(),!0):!1},[m]),S=U(n=>{let o=O(n.target);if(!o)return!1;let g=l.current.get(n.id),d=g?.light??new Wn;return g&&g.target!==n.target&&d.removeFromParent(),d.name=`react-immersive-runtime-light:${n.id}`,d.color.set(n.color??"#ffffff"),d.intensity=n.intensity??1,d.distance=n.distance??0,d.decay=n.decay??2,d.castShadow=n.castShadow??!1,d.position.set(...n.offset??[0,0,0]),d.parent!==o&&o.add(d),l.current.set(n.id,{light:d,target:n.target}),m(),!0},[m,O]),R=U((n,o)=>{let g=l.current.get(n);if(!g)return!1;if(o.target&&o.target!==g.target){let d=O(o.target);if(!d)return!1;g.light.removeFromParent(),d.add(g.light),g.target=o.target}return o.color!==void 0&&g.light.color.set(o.color),o.intensity!==void 0&&(g.light.intensity=o.intensity),o.distance!==void 0&&(g.light.distance=o.distance),o.decay!==void 0&&(g.light.decay=o.decay),o.offset!==void 0&&g.light.position.set(...o.offset),o.castShadow!==void 0&&(g.light.castShadow=o.castShadow),m(),!0},[m,O]),j=U((n,o)=>{let g=d=>o[d%o.length]??0;for(let d of n.materials??[])v(d.targets).forEach((M,I)=>{let T=g(I),D={};for(let z of Qe){let F=d.values[z];F&&(D[z]=ht(F,T))}k(M,D)});for(let d of n.transforms??[])v(d.targets).forEach((M,I)=>{let T=g(I),D={};d.values.position&&(D.position=Je(d.values.position,T)),d.values.rotation&&(D.rotation=Je(d.values.rotation,T)),d.values.scale&&(D.scale=Je(d.values.scale,T)),C(M,D)});for(let d of n.lights??[])Me(d.lights).forEach((M,I)=>{let T=l.current.get(M);T&&(T.light.intensity=ht(d.intensity,g(I)))})},[v,k,C]),q=se(()=>{}),X=se(()=>{});X.current=n=>{p.current=null;let o=!1;for(let[g,d]of y.current){d.startedAt===null&&(d.startedAt=n);let M=d.lastFrameAt??n;d.lastFrameAt=n;let I=d.override&&d.override.until>n?d.override.level:null;d.override&&I===null&&(d.override=null);let T=d.update(n,n-d.startedAt,Math.min(100,n-M),I);o=!0,T||(y.current.delete(g),d.onComplete?.())}o&&m(),y.current.size>0&&q.current()},q.current=()=>{p.current!==null||typeof requestAnimationFrame>"u"||(p.current=requestAnimationFrame(n=>X.current(n)))};let _=U(n=>(y.current.set(n.id,n),q.current(),n.id),[]),V=U((n,o={})=>{let g=o.id??`transition-${ve++}`,d=Math.max(1,o.duration??400),M=o.easing??"ease-in-out";return _({id:g,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(I,T,D,z)=>{let F=z??Vt(T/d,M);return j(n,[F]),T<d}})},[j,_]),J=U((n,o={})=>{let g=o.id??`pulse-${ve++}`,d=Math.max(1,o.duration??1e3),M=o.minLevel??0,I=o.maxLevel??1,T=o.repeat??1/0,D=o.synchronized??!0,z=Math.max(1,...[...n.materials??[],...n.transforms??[]].map(F=>v(F.targets).length),...(n.lights??[]).map(F=>Me(F.lights).length));return _({id:g,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(F,ce,ue,Q)=>{let Y=ce/d,P=Array.from({length:D?1:z},(A,W)=>{if(Q!==null)return Q;let K=Y+(D?0:W/z),G=.5-Math.cos(K%1*Math.PI*2)/2;return M+(I-M)*G});return j(n,P),T===1/0||Y<T}})},[j,_,v]),N=U((n,o={})=>{let g=o.id??`timeline-${ve++}`,d=o.repeat??1,M=n.map(T=>({...T,duration:Math.max(1,T.duration),hold:Math.max(0,T.hold??0)})),I=Math.max(1,M.reduce((T,D)=>T+D.duration+D.hold,0));return _({id:g,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(T,D,z,F)=>{if(M.length===0||d<=0)return!1;let ce=D/I;if(d!==1/0&&ce>=d){for(let Y of M)j(Y.channels,[1]);return!1}let ue=D%I,Q=0;for(let Y of M){let P=Q+Y.duration,A=P+Y.hold;if(ue>=P){j(Y.channels,[F??1]),Q=A;continue}if(ue>=Q){let W=F??Vt((ue-Q)/Y.duration,Y.easing??"ease-in-out");j(Y.channels,[W]);break}}return!0}})},[j,_]),a=U((n,o={})=>{let g=o.id??`flicker-${ve++}`,d=o.synchronized??!0,M=o.minLevel??.15,I=o.maxLevel??1,T=o.interval??[45,160],D=typeof T=="number"?[T,T]:T,z=[Math.max(1,Math.min(...D)),Math.max(1,Math.max(...D))],F=Pe(o.response??.7,.01,1),ce=Pe(o.blackoutChance??.08),ue=Pe(o.flashChance??.12),Q=o.flashLevel??1.15,Y=Math.max(1,...[...n.materials??[],...n.transforms??[]].map(G=>v(G.targets).length),...(n.lights??[]).map(G=>Me(G.lights).length)),P=d?1:Y,A=Array.from({length:P},()=>M),W=Array.from({length:P},()=>M),K=Array.from({length:P},()=>0);return _({id:g,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(G,we,oe,Ce)=>{for(let Z=0;Z<P;Z+=1){if(Ce!==null)W[Z]=Ce;else if(G>=K[Z]){let it=Math.random();W[Z]=it<ce?Xe(0,Math.min(.04,M)):it<ce+ue?Q:Xe(M,I),K[Z]=G+Xe(...z)}let Rt=1-Math.pow(1-F,Math.max(1,oe)/16.67);A[Z]+=(W[Z]-A[Z])*Rt}return j(n,A),o.duration===void 0||we<o.duration}})},[j,_,v]),r=U((n,o,g)=>{let d=y.current.get(n);if(!d)return!1;let M=typeof performance>"u"?Date.now():performance.now();return d.override={level:o,until:M+Math.max(0,g)},q.current(),!0},[]),c=U(n=>y.current.delete(n),[]),u=U(()=>{y.current.clear(),p.current!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(p.current),p.current=null)},[]),w=U(()=>{for(let[n,o]of x.current)Ct(n,o);x.current.clear();for(let[n,o]of B.current)n.position.set(...o.position),n.rotation.set(...o.rotation),n.scale.set(...o.scale),n.visible=o.visible,n.updateMatrix(),n.updateMatrixWorld(!0);B.current.clear();for(let n of l.current.values())n.light.removeFromParent(),n.light.dispose();l.current.clear(),m()},[m]),L=U(()=>{u(),w()},[w,u]),$=U(n=>{s.current&&s.current!==n.raw.scene&&w(),i.current=n,s.current=n.raw.scene,t.current.onViewerReady?.(n)},[w]);return $n(()=>()=>{L(),i.current=null,s.current=null},[L]),{handleViewerReady:$,setMaterial:E,setTransform:h,getWorldPosition:b,addPointLight:S,updatePointLight:R,removePointLight:f,transition:V,timeline:N,pulse:J,flicker:a,overrideEffect:r,stopEffect:c,stopAllEffects:u,resetRuntime:L}}import{useCallback as er,useState as tr}from"react";function et(){let[e,t]=tr(null),i=er(s=>{t(s)},[t]);return{hoveredObjectBinding:e,handleHoveredObject:i}}import{useCallback as St,useState as nr}from"react";function tt(e=null){let[t,i]=nr(e),s=St((y,l)=>i({...l,target:y}),[]),p=St(()=>i(null),[]);return{isolation:t,isolate:s,clearIsolation:p,handleIsolationChange:i}}import{useCallback as Re,useState as de}from"react";function nt(){let[e,t]=de(!0),[i,s]=de(!1),[p,y]=de(null),[l,x]=de(null),[B,O]=de(0),[v,m]=de([]),[k,E]=de([]),[C,h]=de([]),b=Re(j=>{x(j.bounds),O(j.objectCount),m(j.materialVariants),E(j.materialVariantGroups),y(null),t(!1),s(!0)},[]),f=Re(j=>h(j),[]),S=Re(j=>{y(j),x(null),O(0),m([]),E([]),h([]),t(!1),s(!1)},[]),R=Re(()=>{t(!0),s(!1),y(null),x(null),O(0),m([]),E([]),h([])},[]);return{isLoading:e,isReady:i,error:p,bounds:l,objectCount:B,materialVariants:v,materialVariantGroups:k,objects:C,handleModelLoaded:b,handleObjectCatalog:f,handleLoadError:S,resetModelState:R}}import{useCallback as Ot,useState as rr}from"react";function rt(e=null){let[t,i]=rr(e),s=Ot(y=>{i(y)},[i]),p=Ot(()=>{i(null)},[]);return{selectedObjectBinding:t,setSelectedObjectBinding:i,handleObjectSelect:s,clearSelection:p}}var ir={};function or(e={}){let t=jt(e);t.current=e;let i=jt(e.bindings===void 0||e.bindings==="auto"),s=Ge(()=>{let V=t.current.bindings;return V===void 0||V==="auto"?ir:typeof V=="function"?V():V}),p=$e(()=>{let V=t.current.sceneConfig;return V===void 0?Oe:typeof V=="function"?V():V}),y=rt(),l=et(),x=Ee(e.camera),B=nt(),O=qe(),v=tt(),m=Ze(),k=Ye(x,m),E=We({bindings:s,scene:p,camera:x,animations:O,isolation:v,onAction:e.onAction}),{setObjectBindings:C}=s,{handleObjectCatalog:h}=B,b=xe(V=>{h(V),i.current&&C(J=>{let N=dt(V.map(a=>a.name));for(let a of Object.keys(N))J[a]&&(N[a]=J[a]);return N})},[h,C]),{handleObjectSelect:f}=y,S=xe(V=>{f(V),t.current.onObjectSelect?.(V)},[f]),{handleHoveredObject:R}=l,j=xe(V=>{R(V),t.current.onObjectHover?.(V)},[R]),{handleLoadError:q}=B,X=xe(V=>{q(V),t.current.onLoadError?.(V)},[q]),_=e.sceneConfig!==void 0||p.sceneConfig!==Oe;return{props:{objectBindings:s.objectBindings,onObjectBindingsChange:C,selectedObject:y.selectedObjectBinding,onObjectSelect:S,onObjectHover:j,onCameraChange:x.handleCameraChange,onViewerReady:k.handleViewerReady,onModelLoaded:B.handleModelLoaded,onLoadError:X,onObjectCatalog:b,onAnimationsReady:O.handleAnimationsReady,onAction:E.handleAction,onSceneConfigChange:p.setSceneConfig,isolation:v.isolation,onIsolationChange:v.handleIsolationChange,..._?{sceneConfig:p.sceneConfig}:{}},bindings:s,selection:y,hover:l,camera:x,model:B,animations:O,actions:E,scene:p,isolation:v,effects:m,connection:k}}import{useMemo as sr}from"react";function ar(e,t){return sr(()=>{if(!t)return null;let i=e[t];return i||(Object.values(e).find(s=>s.id===t||s.modelObjectId===t)??null)},[e,t])}import{useMemo as cr}from"react";function lr(e){return cr(()=>Object.values(e).map(t=>t.modelObjectId),[e])}import{useCallback as ne,useEffect as Ae,useRef as ae,useState as dr}from"react";function ur(e,t){if(!e.objectBindings&&(!!e.hidden?.length||!!e.selected)&&Object.keys(t).length===0)return null;let s={};if(e.objectBindings)s.bindings=e.objectBindings;else if(e.hidden){let p=new Set(e.hidden);s.bindings=Object.fromEntries(Object.entries(t).map(([y,l])=>[y,{...l,visible:!p.has(l.id)}]))}if(e.selected!==void 0){let p=e.objectBindings??t,y=e.selected?ee(p,e.selected):null;s.selected=y?p[y]:null}return s}function Bt(e){return JSON.stringify(e&&{modelUrl:e.modelUrl,activeModelId:e.activeModelId,tilesetUrl:e.tilesetUrl,mergeModels:e.mergeModels,models:e.models?.map(({id:t,url:i,mergeModels:s})=>({id:t,url:i,mergeModels:s}))})}function pr(e){let t=ae(e);t.current=e;let i=e.paramKey??"view",s=`${i}Id`,[p,y]=dr(!1),l=ae(null),x=ae(null),B=ae(null),O=ae(null),v=ae(null),m=ae(null),k=ae(null),E=ae(null),C=ae(!0),h=ne(r=>{let c=r instanceof Error?r:new Error(String(r));t.current.onError?t.current.onError(c):k.current!==c.message&&console.warn("[react-immersive]",c.message),k.current=c.message},[]),b=ne(()=>{v.current!==null&&clearTimeout(v.current),v.current=null},[]);Ae(()=>(C.current=!0,()=>{C.current=!1,b()}),[b]);let f=ne(()=>{let r=t.current,c=(r.mode??(r.configuration?"configuration":"view"))==="configuration";return{version:1,camera:r.cameraState??void 0,hidden:Object.values(r.objectBindings).filter(u=>u.visible===!1).map(u=>u.id),selected:r.selectedObjectBinding?.id??null,...c?{objectBindings:r.objectBindings,configuration:r.configuration}:{}}},[]),S=ne(()=>ye(f(),typeof window>"u"?void 0:window.location.href),[f]),R=ne(()=>ke(f(),typeof window>"u"?void 0:window.location.href),[f]),j=ne((r,c,u=window.location.href)=>{let w=new URL(u),L=new URLSearchParams(w.hash.slice(1));if(L.delete(i),L.delete(s),L.set(c?s:i,r),w.hash=L.toString(),!c&&w.href.length>(t.current.maxUrlLength??65536))throw new Error("Viewer configuration is too large for an inline link. Save JSON instead, or configure storage for createShareUrl(). Uploaded images can make links large.");return w.href},[i,s]),q=ne(()=>j(ge(S()),!1),[S,j]),X=ne(async()=>{let r=window.location.href,c=t.current.storage,u=await R();if(!c)return j(ge(u),!1,r);let w=await c.save(u);if(typeof w!="string"||!w.trim()||w.length>2048)throw new Error("Viewer state storage returned an invalid id.");return j(w,!0,r)},[R,j]),_=ne(()=>{if(b(),l.current||m.current)return;let r=q();window.history.replaceState(null,"",r),O.current=`inline:${new URL(r).hash}`},[b,q]),V=ne(async()=>{let r=l.current;if(!r||x.current||!C.current)return!1;x.current=r,b();try{let c=t.current,u=r.state;if(u.configuration&&!r.configurationApplied){if(!c.onConfigurationChange)throw new Error("Restoring a full viewer configuration requires onConfigurationChange.");return r.configurationApplied=!0,c.onConfigurationChange(u.configuration),!1}if(u.configuration&&Bt(c.configuration)!==Bt(u.configuration)||c.isReady===!1)return!1;if(u.camera&&!r.cameraApplied){if(!await c.setCameraState(u.camera,!1)||l.current!==r||!C.current)return!1;r.cameraApplied=!0}c=t.current;let w=ur(u,c.objectBindings);return!w||l.current!==r?!1:(w.bindings&&c.onObjectBindingsChange(w.bindings),w.selected!==void 0&&c.setSelectedObjectBinding(w.selected),l.current=null,B.current=r.key,y(!0),!0)}catch(c){throw l.current===r&&(l.current=null),y(!1),c}finally{x.current=null,l.current&&l.current!==r&&C.current&&V().catch(h)}},[b,h]),J=ne(async r=>{let c=ye(r,window.location.href);b(),E.current=null,m.current=null;let u=new URLSearchParams(window.location.hash.slice(1));return O.current=u.has(i)?`inline:${window.location.hash}`:u.has(s)?`stored:${s}:${u.get(s)}`:null,B.current=null,l.current={key:`manual:${ge(c)}`,origin:"manual",state:c,configurationApplied:!1,cameraApplied:!1},y(!1),V()},[V,b,i,s]),N=ne(async()=>{let r=new URLSearchParams(window.location.hash.slice(1)),c=r.get(i),u=r.get(s),w=c!==null?`inline:${window.location.hash}`:u!==null?`stored:${s}:${u}`:null;if(!w)return E.current=null,m.current=null,l.current?.origin==="manual"?V():(l.current=null,B.current=null,y(!0),!1);if(w===O.current||w===B.current)return l.current?.origin==="manual"?V():!1;if(l.current?.key===w)return V();b(),y(!1),E.current=w,l.current=null;let L=c;if(c===null){let n=t.current.storage;if(!n)throw new Error("This shared link requires a viewer state storage adapter.");(!m.current||m.current.key!==w)&&(m.current={key:w,promise:n.load(u)});let o=m.current;try{L=await o.promise}finally{m.current===o&&(m.current=null)}if(E.current!==w||!C.current)return!1;let g=l.current;if(g?.key===w||B.current===w)return g?V():!1}let $;try{$=ye(L,window.location.href)}catch(n){throw n}return l.current={key:w,origin:"url",state:$,configurationApplied:!1,cameraApplied:!1},V()},[V,b,s,i]);Ae(()=>{l.current&&V().catch(h)}),Ae(()=>{let r=()=>{N().catch(h)};return window.addEventListener("hashchange",r),()=>window.removeEventListener("hashchange",r)},[N,h]);let a=null;if(e.autoSync!==!1&&p&&!l.current&&!m.current)try{a=ge(S())}catch{}return Ae(()=>{if(e.autoSync===!1||!p||l.current||m.current){b();return}if(a===null){try{S()}catch(r){h(r)}return}return v.current=setTimeout(()=>{v.current=null;try{_()}catch(r){h(r)}},Math.max(0,e.debounceMs??400)),b},[a,e.autoSync,e.debounceMs,p,b,S,_,h]),{getState:S,getStateAsync:R,restoreState:J,getShareUrl:q,createShareUrl:X,syncUrl:_,restoreFromUrl:N}}import{useCallback as pe,useState as vt}from"react";var fr={};function Mt(){return`asset-${globalThis.crypto.randomUUID()}`}function gr(e){let[t,i]=vt(e),[s,p]=vt(()=>e[0]?re(e[0]):""),y=t.find(C=>re(C)===s)??t[0],l=y?re(y):"",x=pe(C=>{i(h=>h.map(b=>re(b)===l?{...b,objectBindings:C}:b))},[l]),B=pe(C=>{i(h=>h.map(b=>re(b)===l?{...b,sceneConfig:C}:b))},[l]),O=pe(C=>p(h=>{let b=t.find(f=>f.url===C);return b?re(b):h}),[t]),v=pe(C=>{let h={...C,id:C.id??Mt()};return i(b=>{if(b.some(f=>re(f)===h.id))throw new Error("Asset instance ID already exists.");return[...b,h]}),h.id},[]),m=pe(C=>{let h=t.find(j=>re(j)===C);if(!h)return null;let b=structuredClone(h);b.id=Mt(),b.sceneConfig?.measurements&&(b.sceneConfig.measurements.items=b.sceneConfig.measurements.items.map(j=>({...j,modelId:b.id}))),b.label=`${h.label??"Asset"} copy`;let[f,S,R]=h.transform?.position??[0,0,0];return b.transform={...b.transform,position:[f+1,S,R]},i(j=>[...j,b]),b.id},[t]),k=pe(C=>{i(h=>h.filter(b=>re(b)!==C))},[]),E=pe((C,h)=>{let b=Te(h);i(f=>f.map(S=>re(S)===C?{...S,transform:b}:S))},[]);return{modelUrl:y?.url??"",models:t,activeModelId:l,onModelChange:O,onActiveModelChange:p,objectBindings:fr,onObjectBindingsChange:x,sceneConfig:y?.sceneConfig,onSceneConfigChange:B,addModel:v,duplicateModel:m,removeModel:k,updateModelTransform:E}}import{useCallback as be,useEffect as mr,useState as br,useSyncExternalStore as wr}from"react";var yr={sequenceId:null,time:0,duration:0,status:"stopped",previewing:!1,ready:!1,issues:[]},hr=()=>()=>{},Pt=()=>yr;function Vr(){let[e,t]=br(null),i=wr(e?.subscribe??hr,e?.getState??Pt,Pt);mr(()=>()=>e?.stop(),[e]);let s=be(p=>t(p),[]);return{controls:e,playback:i,handleSequencesReady:s,play:be(p=>e?.play(p)??!1,[e]),pause:be(()=>e?.pause(),[e]),stop:be(()=>e?.stop(),[e]),seek:be(p=>e?.seek(p)??!1,[e]),select:be(p=>e?.select(p)??!1,[e])}}export{hn as ACTION_CATALOG,kn as AssetDiagnosticsPanel,gt as CompareViewer,Lt as DEFAULT_MODEL_VIEWER_LABELS,Oe as DEFAULT_SCENE_CONFIG,Se as DEFAULT_SECTION_CONFIG,En as MATERIAL_BLENDING_MODES,An as MATERIAL_SIDES,fn as MAX_VIEWER_STATE_BYTES,_t as MEASUREMENT_UNITS,yn as MODEL_VIEWER_PRESETS,he as ModelViewer,jn as ProductOptions,At as SEQUENCE_EASINGS,xt as SEQUENCE_OBJECT_PROPERTIES,vn as applyIsolation,pn as applyProductOptions,Sn as applyStyleRules,Rn as buildBindingsFromNodes,qt as calibrateMeasurements,Yt as chooseMaterialVariant,Tn as collectObjectHierarchy,Cn as colorScaleValue,Ue as compareViewerConfigurations,In as copyBindingStyle,gn as createARHandoffUrl,Pn as createDefaultBinding,on as decodeProductSelections,Jt as defaultProductSelections,xn as defineObjectBindings,rn as encodeProductSelections,Qt as evaluateProductConfiguration,bn as exportConfiguredUSDZ,Vn as findCatalogAction,tn as formatProductPrice,sn as generateProductSkus,Ht as groundAsset,Mn as inferType,wn as inspectAsset,Bn as isolatedBindingKeys,Le as material,Kt as measurementResult,Nt as measurementScale,Ft as measurementValue,zt as measurementsToCsv,Te as parseAssetTransform,Gt as parseMeasurements,un as parseProductConfiguration,Xt as parseProductDefinition,ln as parseSceneProduct,kt as parseSectionConfig,Wt as parseSelectionSets,Et as parseSequences,ye as parseViewerState,Ln as pasteBindingStyle,fe as patchBindings,_e as patchSceneConfig,ke as prepareViewerState,nn as productCheckoutUrl,an as productDefinitionWarnings,cn as productOptionStates,en as productPriceFromDefinition,mn as readARHandoffUrl,Zt as resolveProductSelections,Tt as sampleSequenceTrack,Ne as sceneLight,Ut as sectionSnapshot,le as selectBindingKeys,Ie as selectBindings,$t as serializeMeasurements,dn as serializeProductConfiguration,ge as serializeViewerState,Dt as snapAssetToGrid,It as upsertSequenceKeyframe,ar as useObjectBinding,lr as useObjectBindingIds,Ge as useObjectBindings,On as useProductConfigurator,$e as useSceneConfig,pr as useShareableViewerState,or as useViewer,We as useViewerActions,qe as useViewerAnimations,Ee as useViewerCamera,Ye as useViewerConnection,Ze as useViewerEffects,et as useViewerHover,tt as useViewerIsolation,nt as useViewerModel,gr as useViewerModels,rt as useViewerSelection,Vr as useViewerSequences};
@@ -127,7 +127,7 @@ declare const DEFAULT_MODEL_VIEWER_LABELS: {
127
127
  readonly enterFullscreen: "Enter fullscreen";
128
128
  readonly resetCameraView: "Reset camera view";
129
129
  readonly orbitControl: "Orbit Control";
130
- readonly pointLock: "Point Lock";
130
+ readonly pointLock: "Pointer lock";
131
131
  readonly cameraController: "Camera controller";
132
132
  readonly cameraControllerSettings: "Camera controller settings";
133
133
  readonly downloadGLB: "Download GLB";
@@ -175,10 +175,10 @@ declare const DEFAULT_MODEL_VIEWER_LABELS: {
175
175
  readonly measurementFiles: "Import / export";
176
176
  readonly measurementSourceUnit: "Model units";
177
177
  readonly measurementDisplayUnit: "Display units";
178
- readonly measurementName: "Measurement name";
178
+ readonly measurementName: "Name";
179
179
  readonly measurementNamePlaceholder: "e.g. Door width";
180
- readonly saveMeasurement: "Save measurement";
181
- readonly knownMeasurementDistance: "Known distance";
180
+ readonly saveMeasurement: "Save";
181
+ readonly knownMeasurementDistance: "Known length";
182
182
  readonly calibrationUnit: "Calibration unit";
183
183
  readonly calibrateMeasurement: "Calibrate";
184
184
  readonly measurementCalibrationHint: "Pick two distance points, enter their known length, then calibrate.";
@@ -200,7 +200,7 @@ declare const DEFAULT_MODEL_VIEWER_LABELS: {
200
200
  readonly measurementInvalid: "Invalid measurement";
201
201
  readonly measurementWaiting: "Waiting for model";
202
202
  readonly openSceneObjectsPanel: "Open scene objects panel";
203
- readonly sceneObjects: "SCENE OBJECTS";
203
+ readonly sceneObjects: "Scene Objects";
204
204
  readonly searchNodesLabels: "Search nodes, labels";
205
205
  readonly closeSceneObjectsPanel: "Close scene objects panel";
206
206
  readonly objectNavigator: "Objects in the 3D view";
@@ -224,13 +224,13 @@ declare const DEFAULT_MODEL_VIEWER_LABELS: {
224
224
  readonly text: "Text";
225
225
  readonly yourText: "Your text";
226
226
  readonly textToAdd: "Text to add";
227
- readonly textColour: "Text colour";
227
+ readonly textColour: "Text color";
228
228
  readonly addText: "Add text";
229
229
  readonly image: "Image";
230
230
  readonly chooseImage: "Choose image";
231
231
  readonly imageToAdd: "Image to add";
232
232
  readonly added: "Added";
233
- readonly colour: "Colour";
233
+ readonly colour: "Color";
234
234
  readonly size: "Size";
235
235
  readonly turn: "Turn";
236
236
  readonly rotation: "Rotation";
@@ -243,9 +243,54 @@ declare const DEFAULT_MODEL_VIEWER_LABELS: {
243
243
  readonly moveLeft: "Move left";
244
244
  readonly moveRight: "Move right";
245
245
  readonly moveBackward: "Move backward";
246
+ readonly productOptions: "Options";
247
+ readonly productOptionsFor: "{product} options";
248
+ readonly productReset: "Reset";
249
+ readonly productOptional: "optional";
250
+ readonly productNone: "None";
251
+ readonly productAlsoChanges: "Also changes: {changes}";
252
+ readonly productUnavailable: "Currently unavailable.";
253
+ readonly productQuantity: "Quantity";
254
+ readonly productCheckingPrice: "Checking price and availability…";
255
+ readonly productTotal: "Total";
256
+ readonly productAddToCart: "Add to cart";
257
+ readonly productAddingToCart: "Adding…";
258
+ readonly productRequestQuote: "Request quote";
259
+ readonly productRequestingQuote: "Requesting…";
260
+ readonly productRefresh: "Refresh";
261
+ readonly productBuy: "Buy now";
262
+ readonly productCopyLink: "Copy link";
263
+ readonly productLinkCopied: "Link copied";
264
+ readonly productShowOptions: "Show options";
265
+ readonly productHideOptions: "Hide options";
266
+ readonly productIssues: "Configuration issues";
267
+ readonly productRequestDone: "Request completed.";
268
+ readonly productSaved: "Saved: {id}";
246
269
  readonly sceneSettings: "Scene Settings";
247
270
  readonly background: "Background";
248
271
  readonly backgroundColor: "Background Color";
272
+ readonly showEnvironmentAsBackground: "Show as background";
273
+ readonly backgroundBlur: "Background Blur";
274
+ readonly environmentPreset: "Preset";
275
+ readonly environmentIntensity: "Intensity";
276
+ readonly toneMapping: "Tone Mapping";
277
+ readonly toneMappingAces: "ACES Filmic";
278
+ readonly toneMappingAgx: "AgX";
279
+ readonly toneMappingNeutral: "Neutral";
280
+ readonly toneMappingNone: "None";
281
+ readonly ground: "Ground";
282
+ readonly groundShadow: "Ground Shadow";
283
+ readonly groundShadowOpacity: "Shadow Opacity";
284
+ readonly floorGrid: "Floor Grid";
285
+ readonly display: "Display";
286
+ readonly wireframe: "Wireframe";
287
+ readonly autoRotateSpeed: "Rotation Speed";
288
+ readonly fieldOfView: "Field of View";
289
+ readonly modelInfo: "Model";
290
+ readonly modelInfoObjects: "Objects";
291
+ readonly modelInfoTriangles: "Triangles";
292
+ readonly modelInfoMaterials: "Materials";
293
+ readonly resetSettings: "Reset Settings";
249
294
  readonly environment: "Environment";
250
295
  readonly autoRotate: "Auto Rotate";
251
296
  readonly lighting: "Lighting";
@@ -127,7 +127,7 @@ declare const DEFAULT_MODEL_VIEWER_LABELS: {
127
127
  readonly enterFullscreen: "Enter fullscreen";
128
128
  readonly resetCameraView: "Reset camera view";
129
129
  readonly orbitControl: "Orbit Control";
130
- readonly pointLock: "Point Lock";
130
+ readonly pointLock: "Pointer lock";
131
131
  readonly cameraController: "Camera controller";
132
132
  readonly cameraControllerSettings: "Camera controller settings";
133
133
  readonly downloadGLB: "Download GLB";
@@ -175,10 +175,10 @@ declare const DEFAULT_MODEL_VIEWER_LABELS: {
175
175
  readonly measurementFiles: "Import / export";
176
176
  readonly measurementSourceUnit: "Model units";
177
177
  readonly measurementDisplayUnit: "Display units";
178
- readonly measurementName: "Measurement name";
178
+ readonly measurementName: "Name";
179
179
  readonly measurementNamePlaceholder: "e.g. Door width";
180
- readonly saveMeasurement: "Save measurement";
181
- readonly knownMeasurementDistance: "Known distance";
180
+ readonly saveMeasurement: "Save";
181
+ readonly knownMeasurementDistance: "Known length";
182
182
  readonly calibrationUnit: "Calibration unit";
183
183
  readonly calibrateMeasurement: "Calibrate";
184
184
  readonly measurementCalibrationHint: "Pick two distance points, enter their known length, then calibrate.";
@@ -200,7 +200,7 @@ declare const DEFAULT_MODEL_VIEWER_LABELS: {
200
200
  readonly measurementInvalid: "Invalid measurement";
201
201
  readonly measurementWaiting: "Waiting for model";
202
202
  readonly openSceneObjectsPanel: "Open scene objects panel";
203
- readonly sceneObjects: "SCENE OBJECTS";
203
+ readonly sceneObjects: "Scene Objects";
204
204
  readonly searchNodesLabels: "Search nodes, labels";
205
205
  readonly closeSceneObjectsPanel: "Close scene objects panel";
206
206
  readonly objectNavigator: "Objects in the 3D view";
@@ -224,13 +224,13 @@ declare const DEFAULT_MODEL_VIEWER_LABELS: {
224
224
  readonly text: "Text";
225
225
  readonly yourText: "Your text";
226
226
  readonly textToAdd: "Text to add";
227
- readonly textColour: "Text colour";
227
+ readonly textColour: "Text color";
228
228
  readonly addText: "Add text";
229
229
  readonly image: "Image";
230
230
  readonly chooseImage: "Choose image";
231
231
  readonly imageToAdd: "Image to add";
232
232
  readonly added: "Added";
233
- readonly colour: "Colour";
233
+ readonly colour: "Color";
234
234
  readonly size: "Size";
235
235
  readonly turn: "Turn";
236
236
  readonly rotation: "Rotation";
@@ -243,9 +243,54 @@ declare const DEFAULT_MODEL_VIEWER_LABELS: {
243
243
  readonly moveLeft: "Move left";
244
244
  readonly moveRight: "Move right";
245
245
  readonly moveBackward: "Move backward";
246
+ readonly productOptions: "Options";
247
+ readonly productOptionsFor: "{product} options";
248
+ readonly productReset: "Reset";
249
+ readonly productOptional: "optional";
250
+ readonly productNone: "None";
251
+ readonly productAlsoChanges: "Also changes: {changes}";
252
+ readonly productUnavailable: "Currently unavailable.";
253
+ readonly productQuantity: "Quantity";
254
+ readonly productCheckingPrice: "Checking price and availability…";
255
+ readonly productTotal: "Total";
256
+ readonly productAddToCart: "Add to cart";
257
+ readonly productAddingToCart: "Adding…";
258
+ readonly productRequestQuote: "Request quote";
259
+ readonly productRequestingQuote: "Requesting…";
260
+ readonly productRefresh: "Refresh";
261
+ readonly productBuy: "Buy now";
262
+ readonly productCopyLink: "Copy link";
263
+ readonly productLinkCopied: "Link copied";
264
+ readonly productShowOptions: "Show options";
265
+ readonly productHideOptions: "Hide options";
266
+ readonly productIssues: "Configuration issues";
267
+ readonly productRequestDone: "Request completed.";
268
+ readonly productSaved: "Saved: {id}";
246
269
  readonly sceneSettings: "Scene Settings";
247
270
  readonly background: "Background";
248
271
  readonly backgroundColor: "Background Color";
272
+ readonly showEnvironmentAsBackground: "Show as background";
273
+ readonly backgroundBlur: "Background Blur";
274
+ readonly environmentPreset: "Preset";
275
+ readonly environmentIntensity: "Intensity";
276
+ readonly toneMapping: "Tone Mapping";
277
+ readonly toneMappingAces: "ACES Filmic";
278
+ readonly toneMappingAgx: "AgX";
279
+ readonly toneMappingNeutral: "Neutral";
280
+ readonly toneMappingNone: "None";
281
+ readonly ground: "Ground";
282
+ readonly groundShadow: "Ground Shadow";
283
+ readonly groundShadowOpacity: "Shadow Opacity";
284
+ readonly floorGrid: "Floor Grid";
285
+ readonly display: "Display";
286
+ readonly wireframe: "Wireframe";
287
+ readonly autoRotateSpeed: "Rotation Speed";
288
+ readonly fieldOfView: "Field of View";
289
+ readonly modelInfo: "Model";
290
+ readonly modelInfoObjects: "Objects";
291
+ readonly modelInfoTriangles: "Triangles";
292
+ readonly modelInfoMaterials: "Materials";
293
+ readonly resetSettings: "Reset Settings";
249
294
  readonly environment: "Environment";
250
295
  readonly autoRotate: "Auto Rotate";
251
296
  readonly lighting: "Lighting";
@@ -1,5 +1,5 @@
1
1
  import { Object3D, Material } from 'three';
2
- import { e as ViewerModelBounds, R as ReducedMotionSetting, d as ModelViewerLabels, V as ViewerLoading, g as ViewerReveal, b as ModelFormat, f as ViewerModelInfo } from './modelFileResolver-Co7j1tdQ.js';
2
+ import { e as ViewerModelBounds, R as ReducedMotionSetting, d as ModelViewerLabels, V as ViewerLoading, g as ViewerReveal, b as ModelFormat, f as ViewerModelInfo } from './modelFileResolver-BEW_95id.mjs';
3
3
  import { ReactNode } from 'react';
4
4
  import { CameraControls } from '@react-three/drei';
5
5
 
@@ -199,6 +199,155 @@ type SceneSelectionSet = {
199
199
  /** Validate saved selections from scene JSON, shared state, or browser storage. */
200
200
  declare function parseSelectionSets(input: unknown): SceneSelectionSet[];
201
201
 
202
+ type ProductSelections = Record<string, string | null>;
203
+ type ProductOptionRef = {
204
+ groupId: string;
205
+ optionId: string;
206
+ };
207
+ type ProductAppearance = {
208
+ target: ObjectBindingTarget;
209
+ material?: ObjectBindingMaterial;
210
+ visible?: boolean;
211
+ };
212
+ type ProductOption = {
213
+ id: string;
214
+ label: string;
215
+ sku?: string;
216
+ /** Shown under the label. */
217
+ description?: string;
218
+ /** A hex color, shown as this option's swatch. */
219
+ swatch?: string;
220
+ /** Added to the price, in the currency's smallest unit. Can be negative. */
221
+ priceDeltaMinor?: number;
222
+ appearance?: ProductAppearance[];
223
+ variants?: string[];
224
+ };
225
+ /** Single-choice group. Optional groups may have no selected option. */
226
+ type ProductOptionGroup = {
227
+ id: string;
228
+ label: string;
229
+ required?: boolean;
230
+ defaultOptionId?: string;
231
+ display?: ProductGroupDisplay;
232
+ options: ProductOption[];
233
+ };
234
+ type ProductGroupDisplay = "list" | "chips" | "swatches";
235
+ /** A price worked out from the definition, for products without a pricing service. */
236
+ type ProductPricing = {
237
+ currency: string;
238
+ basePriceMinor: number;
239
+ };
240
+ /**
241
+ * A link to buy this configuration, with no code. The URL can use {sku},
242
+ * {quantity}, {productId}, {revision} and {selections}.
243
+ */
244
+ type ProductCheckoutLink = {
245
+ urlTemplate: string;
246
+ label?: string;
247
+ };
248
+ type ProductOptionRule = {
249
+ id: string;
250
+ when: ProductOptionRef;
251
+ requires?: ProductOptionRef[];
252
+ excludes?: ProductOptionRef[];
253
+ message?: string;
254
+ };
255
+ /** Exact combination-to-SKU mapping, including null for unselected optional groups. */
256
+ type ProductSku = {
257
+ sku: string;
258
+ selections: ProductSelections;
259
+ };
260
+ type ProductDefinition = {
261
+ id: string;
262
+ label: string;
263
+ revision: string;
264
+ groups: ProductOptionGroup[];
265
+ pricing?: ProductPricing;
266
+ checkout?: ProductCheckoutLink;
267
+ rules?: ProductOptionRule[];
268
+ skus?: ProductSku[];
269
+ };
270
+ type SceneProductConfig = {
271
+ definition: ProductDefinition;
272
+ selections: ProductSelections;
273
+ };
274
+ type ProductConfigurationIssue = {
275
+ code: "required" | "unknown-group" | "unknown-option" | "requires" | "excludes" | "sku";
276
+ message: string;
277
+ groupIds: string[];
278
+ ruleId?: string;
279
+ };
280
+ type ProductConfiguration = {
281
+ version: 1;
282
+ productId: string;
283
+ revision: string;
284
+ /** Canonical JSON identity of product, revision, quantity, and sorted selections. */
285
+ key: string;
286
+ quantity: number;
287
+ selections: ProductSelections;
288
+ sku: string | null;
289
+ items: Array<{
290
+ groupId: string;
291
+ optionId: string;
292
+ label: string;
293
+ sku?: string;
294
+ }>;
295
+ valid: boolean;
296
+ issues: ProductConfigurationIssue[];
297
+ };
298
+ type ProductOptionState = {
299
+ groupId: string;
300
+ optionId: string;
301
+ selected: boolean;
302
+ available: boolean;
303
+ reasons: string[];
304
+ /** For a choice blocked by a rule: the other choices that would have to change to allow it. */
305
+ fix?: ProductOptionRef[];
306
+ };
307
+ /** Something in a definition that won't work as its author expects. */
308
+ type ProductDefinitionWarning = {
309
+ code: "missing-sku" | "no-objects" | "missing-variant" | "invalid-default" | "unreachable" | "nothing-changes";
310
+ message: string;
311
+ groupId?: string;
312
+ optionId?: string;
313
+ };
314
+ type ProductAvailability = {
315
+ available: boolean;
316
+ message?: string;
317
+ options?: Array<ProductOptionRef & {
318
+ available: boolean;
319
+ reason?: string;
320
+ }>;
321
+ };
322
+ /** Display-only price supplied by the host's pricing service. */
323
+ type ProductPrice = {
324
+ amountMinor: number;
325
+ currency: string;
326
+ expiresAt?: string;
327
+ label?: string;
328
+ };
329
+ type ProductCommerceResult = {
330
+ id?: string;
331
+ message?: string;
332
+ };
333
+ type ProductCommerceContext = {
334
+ signal: AbortSignal;
335
+ };
336
+ type ProductCheckoutContext = ProductCommerceContext & {
337
+ idempotencyKey: string;
338
+ price: ProductPrice | null;
339
+ };
340
+ /** Implement these methods in your application; validate/reprice again on your server. */
341
+ type ProductCommerceAdapter = {
342
+ /** Stable backend/pricing-context identity; change when provider, currency, or customer context changes. */
343
+ key: string;
344
+ resolveSku?: (configuration: ProductConfiguration, context: ProductCommerceContext) => string | null | Promise<string | null>;
345
+ getAvailability?: (configuration: ProductConfiguration, context: ProductCommerceContext) => ProductAvailability | Promise<ProductAvailability>;
346
+ getPrice?: (configuration: ProductConfiguration, context: ProductCommerceContext) => ProductPrice | Promise<ProductPrice>;
347
+ addToCart?: (configuration: ProductConfiguration, context: ProductCheckoutContext) => ProductCommerceResult | Promise<ProductCommerceResult>;
348
+ requestQuote?: (configuration: ProductConfiguration, context: ProductCheckoutContext) => ProductCommerceResult | Promise<ProductCommerceResult>;
349
+ };
350
+
202
351
  declare const LIGHT_TYPES: readonly ["none", "directional", "point", "spot", "hemisphere"];
203
352
  type SceneLightType = (typeof LIGHT_TYPES)[number];
204
353
  type SceneLightAttachment = {
@@ -676,6 +825,8 @@ type SceneConfig = {
676
825
  measurements?: MeasurementCollection;
677
826
  /** Named object selections scoped to this model's stable object ids. */
678
827
  selectionSets?: SceneSelectionSet[];
828
+ /** Product choices, constraints, appearance overrides, and selected options for this model. */
829
+ product?: SceneProductConfig;
679
830
  /** Authored timed camera, object, appearance and clip tracks. Model-local IDs. */
680
831
  sequences?: SceneSequence[];
681
832
  };
@@ -892,7 +1043,7 @@ type IsolationActionEffect = {
892
1043
  type ObjectActionEffect = IsolationActionEffect | ObjectBindingsActionEffect | SceneConfigActionEffect | VisibilityActionEffect | CameraActionEffect | AnimationActionEffect;
893
1044
 
894
1045
  type ObjectBindingAction = {
895
- id: "change-color" | "apply-texture" | "toggle-visibility" | string;
1046
+ id: "change-color" | "change-material" | "toggle-visibility" | string;
896
1047
  label: string;
897
1048
  type: "command";
898
1049
  effects?: ObjectActionEffect[];
@@ -1075,6 +1226,16 @@ type ObjectPointerEvent = {
1075
1226
  surface?: ObjectSurfacePoint;
1076
1227
  };
1077
1228
 
1229
+ type ViewerProductOptions = {
1230
+ /** Connects your own pricing, stock, cart and quote services. */
1231
+ adapter?: ProductCommerceAdapter;
1232
+ /** Keep the choices in this URL parameter, so a link reopens the same configuration. */
1233
+ urlParam?: string;
1234
+ /** Start with the panel closed. On small screens it always starts closed. */
1235
+ defaultClosed?: boolean;
1236
+ onConfigurationChange?: (configuration: ProductConfiguration, checkoutUrl: string | null) => void;
1237
+ };
1238
+
1078
1239
  type ComparisonCategory = "identity" | "appearance" | "transform" | "visibility" | "data" | "behavior" | "scene";
1079
1240
  type ComparisonStatus = "added" | "removed" | "modified" | "unchanged" | "ambiguous";
1080
1241
  type ConfigurationComparisonInput = {
@@ -1610,6 +1771,8 @@ type CaptureImageOptions = {
1610
1771
  width?: number;
1611
1772
  height?: number;
1612
1773
  transparent?: boolean;
1774
+ type?: "image/png" | "image/jpeg";
1775
+ quality?: number;
1613
1776
  };
1614
1777
 
1615
1778
  type CaptureVideoOptions = {
@@ -1664,6 +1827,8 @@ type ViewerReadyState = {
1664
1827
  objectBindings: Record<string, ObjectBinding>;
1665
1828
  homeCameraState: HomeCameraState | null;
1666
1829
  captureImage: (options?: CaptureImageOptions) => Promise<string>;
1830
+ /** Whether a streamed model is still fetching tiles for the current view. */
1831
+ isLoadingTiles: () => boolean;
1667
1832
  /** Records one cinematic pass or turntable revolution as a video Blob. */
1668
1833
  captureVideo: (options?: CaptureVideoOptions) => Promise<Blob>;
1669
1834
  invalidate: () => void;
@@ -1888,6 +2053,11 @@ type ModelViewerProps = GroupedModelViewerProps & {
1888
2053
  onIsolationChange?: (isolation: ViewerIsolation | null) => void;
1889
2054
  showIsolateControls?: boolean;
1890
2055
  showSectionTools?: boolean;
2056
+ /**
2057
+ * Lets visitors choose from `sceneConfig.product`, in a panel over the model.
2058
+ * `true` uses the defaults; an object connects services, links and callbacks.
2059
+ */
2060
+ productOptions?: boolean | ViewerProductOptions;
1891
2061
  showMaterialVariants?: boolean;
1892
2062
  showObjectNavigator?: boolean;
1893
2063
  cinematic?: boolean | CinematicConfig;
@@ -1985,4 +2155,4 @@ type ModelViewerModelEntry = {
1985
2155
  sceneConfig?: SceneConfig;
1986
2156
  };
1987
2157
 
1988
- export { MAX_VIEWER_STATE_BYTES as $, type ARExportOptions as A, type BindingEdit as B, type CameraAction as C, type CinematicWaypoint as D, type ComparisonCategory as E, type ComparisonChange as F, type ComparisonHighlight as G, type ComparisonObject as H, type ComparisonStatus as I, type ConfigurationComparisonInput as J, type ConfigurationComparisonReport as K, type CustomObjectBindingDataPanelProps as L, type CustomSceneObjectsPanelProps as M, DEFAULT_SCENE_CONFIG as N, DEFAULT_SECTION_CONFIG as O, type DecalMoveTarget as P, type DeepPartial as Q, type EnvironmentPreset as R, type GlitchModeName as S, type GroupedModelViewerProps as T, type HomeCameraState as U, type InspectAssetOptions as V, type IsolatedObjectBindings as W, type IsolationActionEffect as X, type KernelSizeName as Y, MATERIAL_BLENDING_MODES as Z, MATERIAL_SIDES as _, type ARHandoffOptions as a, type SceneGroundShadowConfig as a$, MODEL_VIEWER_PRESETS as a0, type MeasurementAnchor as a1, type MeasurementCollection as a2, type MeasurementPoint as a3, type MeasurementPosition as a4, type MeasurementResult as a5, type MeasurementSettings as a6, type MeasurementStatus as a7, type MeasurementTool as a8, type MeasurementUnit as a9, type ObjectBindingTextureChannel as aA, type ObjectBindingTextureSlot as aB, type ObjectBindingTransform as aC, type ObjectBindingType as aD, type ObjectBindingsActionEffect as aE, type ObjectPointerEvent as aF, type ObjectSurfacePoint as aG, type ObjectTransformSpace as aH, type PerformanceProfile as aI, type RampTypeName as aJ, type RendererBackend as aK, type SavedMeasurement as aL, type SceneAnimationClipConfig as aM, type SceneAnimationConfig as aN, type SceneAnnotationCameraView as aO, type SceneAnnotationImage as aP, type SceneAnnotationLink as aQ, type SceneAnnotationMarker as aR, type SceneBackgroundConfig as aS, type SceneCameraConfig as aT, type SceneCinematicConfig as aU, type SceneCinematicWaypoint as aV, type SceneComposition as aW, type SceneConfig as aX, type SceneConfigActionEffect as aY, type SceneConfigPatch as aZ, type SceneEnvironmentConfig as a_, type ModelMergeSource as aa, type ModelViewerControlsOptions as ab, type ModelViewerDecoderOptions as ac, type ModelViewerModelEntry as ad, type ModelViewerPerfOptions as ae, type ModelViewerPreset as af, type ModelViewerProps as ag, type ModelViewerTilesOptions as ah, type ModelViewerToolsOptions as ai, type ModelViewerUiOptions as aj, type ModelViewerXrOptions as ak, type MouseControllerPosition as al, type ObjectActionEffect as am, type ObjectActionEvent as an, type ObjectBinding as ao, type ObjectBindingAction as ap, type ObjectBindingCameraState as aq, type ObjectBindingDecal as ar, type ObjectBindingMaterial as as, type ObjectBindingMaterialBlendingMode as at, type ObjectBindingMaterialSide as au, type ObjectBindingPatch as av, type ObjectBindingSelector as aw, type ObjectBindingStatus as ax, type ObjectBindingStyle as ay, type ObjectBindingTarget as az, type ARHandoffRequest as b, prepareViewerState as b$, type SceneLight as b0, type SceneLightAttachment as b1, type SceneLightType as b2, type SceneLightingConfig as b3, type SceneModelConfig as b4, type SceneModelRenderer as b5, type ScenePostProcessingConfig as b6, type SceneSectionAxis as b7, type SceneSectionConfig as b8, type SceneSectionPlane as b9, type UseViewerCameraOptions as bA, type ViewerAnimationsProps as bB, type ViewerCameraConfig as bC, type ViewerCameraPreset as bD, type ViewerCameraProps as bE, type ViewerCameraState as bF, type ViewerConfiguration as bG, type ViewerEngagementEvent as bH, type ViewerIsolation as bI, type ViewerObjectInfo as bJ, type ViewerReadyState as bK, type ViewerRuntimeStats as bL, type ViewerStateStorage as bM, type VisibilityActionEffect as bN, type XRScaleMode as bO, applyIsolation as bP, applyStyleRules as bQ, colorScaleValue as bR, compareViewerConfigurations as bS, groundAsset as bT, isolatedBindingKeys as bU, material as bV, parseAssetTransform as bW, parseSelectionSets as bX, parseViewerState as bY, patchBindings as bZ, patchSceneConfig as b_, type SceneSectionPreset as ba, type SceneSectionSettings as bb, type SceneSelectionSet as bc, type SceneSequence as bd, type SceneShadowConfig as be, type SceneStyleColorScale as bf, type SceneStyleCondition as bg, type SceneStylePulse as bh, type SceneStyleRule as bi, type SceneWireframeConfig as bj, type SemanticComparisonOptions as bk, type SequenceCameraView as bl, type SequenceControls as bm, type SequenceEasing as bn, type SequenceKeyframe as bo, type SequenceObjectProperty as bp, type SequencePlaybackState as bq, type SequenceTarget as br, type SequenceTrack as bs, type SequenceValue as bt, type SequenceVector3 as bu, type ShareableViewerState as bv, type StreamingDiagnostics as bw, type StyledObjectBindings as bx, type StyledObjectPulse as by, type TexturePositioningControls as bz, type ARHandoffStatus as c, selectBindingKeys as c0, selectBindings as c1, serializeViewerState as c2, snapAssetToGrid as c3, useViewerAnimations as c4, useViewerCamera as c5, type ARSnapshot as d, type ARSnapshotSource as e, type AnimationAction as f, type AnimationActionEffect as g, type AnimationClipInfo as h, type AnimationClipState as i, type AnimationClipStatus as j, type AnimationControls as k, type AnimationLoopMode as l, type AnimationPlayOptions as m, type AnimationPlaybackState as n, type AnnotationMarker as o, type AssetDiagnosticIssue as p, type AssetDiagnosticsReport as q, type AssetDiagnosticsSource as r, type AssetTextureDiagnostic as s, type AssetTransform as t, type CameraActionEffect as u, type CameraControllerType as v, type CameraLimits as w, type CaptureImageOptions as x, type CaptureVideoOptions as y, type CinematicConfig as z };
2158
+ export { MAX_VIEWER_STATE_BYTES as $, type ARExportOptions as A, type BindingEdit as B, type CameraAction as C, type CinematicWaypoint as D, type ComparisonCategory as E, type ComparisonChange as F, type ComparisonHighlight as G, type ComparisonObject as H, type ComparisonStatus as I, type ConfigurationComparisonInput as J, type ConfigurationComparisonReport as K, type CustomObjectBindingDataPanelProps as L, type CustomSceneObjectsPanelProps as M, DEFAULT_SCENE_CONFIG as N, DEFAULT_SECTION_CONFIG as O, type DecalMoveTarget as P, type DeepPartial as Q, type EnvironmentPreset as R, type GlitchModeName as S, type GroupedModelViewerProps as T, type HomeCameraState as U, type InspectAssetOptions as V, type IsolatedObjectBindings as W, type IsolationActionEffect as X, type KernelSizeName as Y, MATERIAL_BLENDING_MODES as Z, MATERIAL_SIDES as _, type ARHandoffOptions as a, type ProductPricing as a$, MODEL_VIEWER_PRESETS as a0, type MeasurementAnchor as a1, type MeasurementCollection as a2, type MeasurementPoint as a3, type MeasurementPosition as a4, type MeasurementResult as a5, type MeasurementSettings as a6, type MeasurementStatus as a7, type MeasurementTool as a8, type MeasurementUnit as a9, type ObjectBindingTextureChannel as aA, type ObjectBindingTextureSlot as aB, type ObjectBindingTransform as aC, type ObjectBindingType as aD, type ObjectBindingsActionEffect as aE, type ObjectPointerEvent as aF, type ObjectSurfacePoint as aG, type ObjectTransformSpace as aH, type PerformanceProfile as aI, type ProductAppearance as aJ, type ProductAvailability as aK, type ProductCheckoutContext as aL, type ProductCheckoutLink as aM, type ProductCommerceAdapter as aN, type ProductCommerceContext as aO, type ProductCommerceResult as aP, type ProductConfiguration as aQ, type ProductConfigurationIssue as aR, type ProductDefinition as aS, type ProductDefinitionWarning as aT, type ProductGroupDisplay as aU, type ProductOption as aV, type ProductOptionGroup as aW, type ProductOptionRef as aX, type ProductOptionRule as aY, type ProductOptionState as aZ, type ProductPrice as a_, type ModelMergeSource as aa, type ModelViewerControlsOptions as ab, type ModelViewerDecoderOptions as ac, type ModelViewerModelEntry as ad, type ModelViewerPerfOptions as ae, type ModelViewerPreset as af, type ModelViewerProps as ag, type ModelViewerTilesOptions as ah, type ModelViewerToolsOptions as ai, type ModelViewerUiOptions as aj, type ModelViewerXrOptions as ak, type MouseControllerPosition as al, type ObjectActionEffect as am, type ObjectActionEvent as an, type ObjectBinding as ao, type ObjectBindingAction as ap, type ObjectBindingCameraState as aq, type ObjectBindingDecal as ar, type ObjectBindingMaterial as as, type ObjectBindingMaterialBlendingMode as at, type ObjectBindingMaterialSide as au, type ObjectBindingPatch as av, type ObjectBindingSelector as aw, type ObjectBindingStatus as ax, type ObjectBindingStyle as ay, type ObjectBindingTarget as az, type ARHandoffRequest as b, type ViewerCameraState as b$, type ProductSelections as b0, type ProductSku as b1, type RampTypeName as b2, type RendererBackend as b3, type SavedMeasurement as b4, type SceneAnimationClipConfig as b5, type SceneAnimationConfig as b6, type SceneAnnotationCameraView as b7, type SceneAnnotationImage as b8, type SceneAnnotationLink as b9, type SceneShadowConfig as bA, type SceneStyleColorScale as bB, type SceneStyleCondition as bC, type SceneStylePulse as bD, type SceneStyleRule as bE, type SceneWireframeConfig as bF, type SemanticComparisonOptions as bG, type SequenceCameraView as bH, type SequenceControls as bI, type SequenceEasing as bJ, type SequenceKeyframe as bK, type SequenceObjectProperty as bL, type SequencePlaybackState as bM, type SequenceTarget as bN, type SequenceTrack as bO, type SequenceValue as bP, type SequenceVector3 as bQ, type ShareableViewerState as bR, type StreamingDiagnostics as bS, type StyledObjectBindings as bT, type StyledObjectPulse as bU, type TexturePositioningControls as bV, type UseViewerCameraOptions as bW, type ViewerAnimationsProps as bX, type ViewerCameraConfig as bY, type ViewerCameraPreset as bZ, type ViewerCameraProps as b_, type SceneAnnotationMarker as ba, type SceneBackgroundConfig as bb, type SceneCameraConfig as bc, type SceneCinematicConfig as bd, type SceneCinematicWaypoint as be, type SceneComposition as bf, type SceneConfig as bg, type SceneConfigActionEffect as bh, type SceneConfigPatch as bi, type SceneEnvironmentConfig as bj, type SceneGroundShadowConfig as bk, type SceneLight as bl, type SceneLightAttachment as bm, type SceneLightType as bn, type SceneLightingConfig as bo, type SceneModelConfig as bp, type SceneModelRenderer as bq, type ScenePostProcessingConfig as br, type SceneProductConfig as bs, type SceneSectionAxis as bt, type SceneSectionConfig as bu, type SceneSectionPlane as bv, type SceneSectionPreset as bw, type SceneSectionSettings as bx, type SceneSelectionSet as by, type SceneSequence as bz, type ARHandoffStatus as c, type ViewerConfiguration as c0, type ViewerEngagementEvent as c1, type ViewerIsolation as c2, type ViewerObjectInfo as c3, type ViewerProductOptions as c4, type ViewerReadyState as c5, type ViewerRuntimeStats as c6, type ViewerStateStorage as c7, type VisibilityActionEffect as c8, type XRScaleMode as c9, applyIsolation as ca, applyStyleRules as cb, colorScaleValue as cc, compareViewerConfigurations as cd, groundAsset as ce, isolatedBindingKeys as cf, material as cg, parseAssetTransform as ch, parseSelectionSets as ci, parseViewerState as cj, patchBindings as ck, patchSceneConfig as cl, prepareViewerState as cm, selectBindingKeys as cn, selectBindings as co, serializeViewerState as cp, snapAssetToGrid as cq, useViewerAnimations as cr, useViewerCamera as cs, type ARSnapshot as d, type ARSnapshotSource as e, type AnimationAction as f, type AnimationActionEffect as g, type AnimationClipInfo as h, type AnimationClipState as i, type AnimationClipStatus as j, type AnimationControls as k, type AnimationLoopMode as l, type AnimationPlayOptions as m, type AnimationPlaybackState as n, type AnnotationMarker as o, type AssetDiagnosticIssue as p, type AssetDiagnosticsReport as q, type AssetDiagnosticsSource as r, type AssetTextureDiagnostic as s, type AssetTransform as t, type CameraActionEffect as u, type CameraControllerType as v, type CameraLimits as w, type CaptureImageOptions as x, type CaptureVideoOptions as y, type CinematicConfig as z };