@liveroom-tech/react-immersive 6.0.1 → 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.
- package/README.md +26 -2
- package/dist/AnimationsTab-NUJTEMZ5.mjs +1 -0
- package/dist/AnnotationsTab-OHRVWRKI.mjs +1 -0
- package/dist/CinematicTab-IJAY2BS6.mjs +1 -0
- package/dist/ConfigureTab-UQRRATCY.mjs +6 -0
- package/dist/RulesTab-YVBZGJZX.mjs +1 -0
- package/dist/SequencesTab-IC5LWQ6N.css +1 -0
- package/dist/SequencesTab-RPJAG26Z.mjs +1 -0
- package/dist/binding-builder.css +1 -1
- package/dist/binding-builder.d.mts +3 -3
- package/dist/binding-builder.d.ts +3 -3
- package/dist/binding-builder.js +76 -23
- package/dist/binding-builder.mjs +1 -1
- package/dist/chunk-2DV2UCQH.mjs +1 -0
- package/dist/chunk-37YITTIK.mjs +1 -0
- package/dist/chunk-5FLX45O5.mjs +2 -0
- package/dist/chunk-6CTCV2Q5.mjs +1 -0
- package/dist/chunk-7JCFNZJM.mjs +1 -0
- package/dist/chunk-7OWHW66D.mjs +1 -0
- package/dist/chunk-AL6UIGWP.mjs +1 -0
- package/dist/chunk-BNKTI3CY.mjs +1 -0
- package/dist/chunk-CCBFMNAU.mjs +1 -0
- package/dist/chunk-E24EFHB5.mjs +1 -0
- package/dist/chunk-EV6THDXD.mjs +1 -0
- package/dist/chunk-F5QSXMME.mjs +1 -0
- package/dist/chunk-FGAJ2UT7.mjs +1 -0
- package/dist/chunk-FXV4CLAK.mjs +1 -0
- package/dist/chunk-GV4ZRXL6.mjs +1 -0
- package/dist/chunk-KHN55ZM7.mjs +3 -0
- package/dist/chunk-LX3GXQNU.mjs +1 -0
- package/dist/chunk-OPZJDP7T.mjs +1 -0
- package/dist/chunk-OREKYGO3.mjs +83 -0
- package/dist/chunk-PBVBZYOG.mjs +47 -0
- package/dist/chunk-T6AYLPCC.mjs +1 -0
- package/dist/hosted.css +1 -1
- package/dist/hosted.d.mts +22 -6
- package/dist/hosted.d.ts +22 -6
- package/dist/hosted.js +75 -22
- package/dist/hosted.mjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.mts +66 -6
- package/dist/index.d.ts +66 -6
- package/dist/index.js +69 -21
- package/dist/index.mjs +1 -1
- package/dist/{modelFileResolver-Co7j1tdQ.d.mts → modelFileResolver-BEW_95id.d.mts} +52 -7
- package/dist/{modelFileResolver-Co7j1tdQ.d.ts → modelFileResolver-BEW_95id.d.ts} +52 -7
- package/dist/{modelViewerProps-BibuMND7.d.ts → modelViewerProps-C7saa0i2.d.mts} +173 -3
- package/dist/{modelViewerProps-Ce4-wb57.d.mts → modelViewerProps-CbK_4uZj.d.ts} +173 -3
- package/dist/{publicProps-BaJHCDa_.d.mts → publicProps-NKTiohZO.d.mts} +1 -1
- package/dist/{publicProps-CP18d_mt.d.ts → publicProps-z7cJhUH8.d.ts} +1 -1
- package/dist/simple-model-viewer.css +1 -1
- package/dist/simple-model-viewer.d.mts +25 -3
- package/dist/simple-model-viewer.d.ts +25 -3
- package/dist/simple-model-viewer.js +49 -3
- package/dist/simple-model-viewer.mjs +1 -1
- package/dist/utils.d.mts +47 -4
- package/dist/utils.d.ts +47 -4
- package/dist/utils.js +2 -2
- package/dist/utils.mjs +1 -1
- package/package.json +5 -1
- package/dist/chunk-2JFUMJUP.mjs +0 -1
- package/dist/chunk-4JMJALRO.mjs +0 -2
- package/dist/chunk-OTSCPJWF.mjs +0 -1
- package/dist/chunk-P2JZ5Z7I.mjs +0 -1
- package/dist/chunk-UGPR4EPP.mjs +0 -81
- package/dist/chunk-V7WZUWJ5.mjs +0 -1
- package/dist/chunk-VQGYZOMX.mjs +0 -3
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{c as he}from"./chunk-2JFUMJUP.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-UGPR4EPP.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: "
|
|
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: "
|
|
178
|
+
readonly measurementName: "Name";
|
|
179
179
|
readonly measurementNamePlaceholder: "e.g. Door width";
|
|
180
|
-
readonly saveMeasurement: "Save
|
|
181
|
-
readonly knownMeasurementDistance: "Known
|
|
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: "
|
|
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
|
|
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: "
|
|
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: "
|
|
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: "
|
|
178
|
+
readonly measurementName: "Name";
|
|
179
179
|
readonly measurementNamePlaceholder: "e.g. Door width";
|
|
180
|
-
readonly saveMeasurement: "Save
|
|
181
|
-
readonly knownMeasurementDistance: "Known
|
|
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: "
|
|
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
|
|
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: "
|
|
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-
|
|
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" | "
|
|
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
|
|
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 };
|