@liveroom-tech/react-immersive 5.0.0 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- "use client";import{b as De,d as Ne}from"./chunk-SEESCGUS.mjs";import{a as ze}from"./chunk-MMO7KCYU.mjs";import{a as ee,b as we,c as re,d as ye,e as Ve,f as Ce,g as gt}from"./chunk-WFEYRUZC.mjs";import{b as at,j as he,r as _e,s as Oe}from"./chunk-7EW6JZ46.mjs";import"./chunk-XTLSAYAQ.mjs";import{a as ct,c as lt,g as N,o as le,r as Ue,t as dt,u as ut,v as ft,w as Fe,y as mt,z as pt}from"./chunk-BGYK4Y2Y.mjs";import"./chunk-JR557W27.mjs";import{jsx as bt}from"react/jsx-runtime";function We(e){return ze("model-viewer","ModelViewer"),bt(_e,{...Ne(e,De)})}import{useCallback as pe,useRef as Ze}from"react";import{useCallback as k,useMemo as $e,useState as ht}from"react";var Ke={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 Ge(e){if(e)return Object.fromEntries(Object.entries(e).map(([t,r])=>[t,r&&typeof r=="object"?{...r}:r]))}function wt(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t.visible===!1).map(([t])=>[t,!0]))}function je(e){let[t,r]=ht(e),s=k((o,u)=>{r(a=>u===void 0?re(a,o):re(a,o,u))},[]),d=k((o,u)=>s(o,ye(u)),[s]),b=k((o,u)=>d(o,{baseColor:u}),[d]),g=k((o,u,a="baseColor")=>{let m=Ke[a],O=typeof u=="string"?{path:u}:u;s(o,{style:{material:{[m]:O}}})},[s]),p=k((o,u="baseColor")=>{let a=Ke[u];s(o,{style:{material:{[a]:void 0}}})},[s]),j=k((o,u)=>{r(a=>{let m=N(a,o);if(!m)return a;let O=Ge(a[m]?.style?.material),L=ee(a,u);if(L.length===0)return a;let U=a;for(let $ of L){let W=a[$];W&&(U===a&&(U={...a}),U[$]={...W,style:{...W.style,material:Ge(O)}})}return U})},[]),V=k(o=>s(o,{style:{material:void 0}}),[s]),y=k((o,u)=>s(o,{transform:u}),[s]),h=k(o=>s(o,{transform:void 0}),[s]),x=k((o,u)=>s(o,{metadata:u}),[s]),A=k(o=>we(t,o),[t]),v=k(o=>ee(t,o).map(u=>t[u]?.id??u),[t]),I=k(o=>{let u=N(t,o);return u?t[u]?.style?.material??null:null},[t]),E=k(o=>s(o,{visible:!1}),[s]),f=k(o=>s(o,{visible:!0}),[s]),C=k(o=>{r(u=>{let a=ee(u,o).reduce((m,O)=>{let L=u[O];return L&&m.push({ids:O,patch:{visible:L.visible===!1}}),m},[]);return re(u,a)})},[r]),M=k(()=>{r(o=>re(o,Object.keys(o),{visible:!0}))},[r]),B=$e(()=>wt(t),[t]),D=$e(()=>Object.keys(B).map(o=>t[o]?.id??o),[B,t]),H=k(o=>{let u=N(t,o);return u?t[u]?.visible===!1:!1},[t]);return{objectBindings:t,setObjectBindings:r,updateObjectBindings:s,setMaterial:d,setBaseColor:b,setTexture:g,clearTexture:p,copyMaterial:j,resetMaterial:V,getMaterial:I,setTransform:y,resetTransform:h,updateMetadata:x,selectObjectBindings:A,selectObjectBindingIds:v,hiddenObjects:B,hiddenObjectIds:D,hideObject:E,showObject:f,toggleObjectVisibility:C,isObjectHidden:H,clearHiddenObjects:M}}import{useCallback as z,useMemo as yt,useRef as Vt,useState as Ct}from"react";function Se(e){let t=Vt(null),[r,s]=Ct(()=>{let f=typeof e=="function"?e():e;return t.current=f,f}),d=z(f=>{s(C=>{let M=typeof f=="function"?f(C):f;return Ve(C,M)})},[]),b=z(()=>{let f=t.current;f&&s(f)},[]),g=z((f,C)=>{d(M=>({lighting:{lights:M.lighting.lights.map(B=>B.id===f?{...B,...C}:B)}}))},[d]),p=z(f=>{d(C=>C.lighting.lights.some(M=>M.id===f.id)?{}:{lighting:{lights:[...C.lighting.lights,Ce(f)]}})},[d]),j=z(f=>{d(C=>({lighting:{lights:C.lighting.lights.filter(M=>M.id!==f)}}))},[d]),V=z((f,C)=>g(f,{intensity:C}),[g]),y=z((f,C)=>g(f,{color:C}),[g]),h=z(f=>g(f,{visible:!0}),[g]),x=z(f=>g(f,{visible:!1}),[g]),A=z(f=>{d(C=>({lighting:{lights:C.lighting.lights.map(M=>M.id===f?{...M,visible:!M.visible}:M)}}))},[d]),v=z((f,C)=>g(f,{attachment:C,attachedToCamera:!1}),[g]),I=z(f=>g(f,{attachment:void 0}),[g]),E=yt(()=>({items:r.lighting.lights,get:f=>r.lighting.lights.find(C=>C.id===f),add:p,update:g,remove:j,setIntensity:V,setColor:y,show:h,hide:x,toggle:A,attach:v,detach:I}),[r.lighting.lights,p,g,j,V,y,h,x,A,v,I]);return{sceneConfig:r,setSceneConfig:s,updateSceneConfig:d,resetSceneConfig:b,lights:E}}import{useCallback as Be}from"react";function ve({bindings:e,scene:t,camera:r,animations:s,onAction:d}){let{objectBindings:b,updateObjectBindings:g,showObject:p,hideObject:j,toggleObjectVisibility:V}=e,y=t?.updateSceneConfig,h=r?.focusObject,x=r?.fitScene,A=r?.resetView,v=r?.setCameraTarget,I=r?.setCameraState,E=s?.play,f=s?.pause,C=s?.stop,M=s?.setSpeed,B=s?.seek,D=Be(u=>{let a=N(b,u);return a?b[a]?.actions??[]:[]},[b]),H=Be(async u=>{for(let a of u.action.effects??[]){if("objectBindings"in a){g(a.target,a.objectBindings);continue}if("sceneConfig"in a){y?.(a.sceneConfig);continue}if("visibility"in a){a.visibility==="show"?p(a.target):a.visibility==="hide"?j(a.target):V(a.target);continue}if("camera"in a){let O=a.camera;O.type==="focus-object"?await h?.(O.objectId??u.objectId):O.type==="fit-scene"?await x?.():O.type==="reset"?await A?.():O.type==="set-target"?await v?.(O.target,O.transition??!0):await I?.(O.state,O.transition??!0);continue}let m=a.animation;m.type==="play"?E?.(m.clip):m.type==="pause"?f?.():m.type==="stop"?C?.():m.type==="set-speed"?M?.(m.speed):B?.(m.time)}await d?.(u)},[x,h,j,d,f,E,A,B,M,I,v,p,C,V,g,y]),o=Be(async(u,a)=>{let m=N(b,u);if(!m)return null;let O=b[m],L=O?.actions?.find($=>$.id===a);if(!O||!L)return null;let U={objectId:m,action:L,binding:O};return await H(U),U},[H,b]);return{getActionsForObject:D,handleAction:H,runAction:o}}import{useCallback as de,useRef as Je}from"react";function Ot(e){return typeof e=="function"?e:e?.handleViewerReady??null}function Me(...e){let t=Je(null),r=Je(e);r.current=e;let s=de(p=>{t.current=p;let j=new Set;for(let V of r.current){let y=Ot(V);y&&!j.has(y)&&(j.add(y),y(p))}},[]),d=de(()=>t.current,[]),b=de(p=>{let j=t.current;return j?j.captureImage(p):Promise.reject(new Error("ModelViewer is not ready yet."))},[]),g=de(()=>{let p=t.current;return p?(p.invalidate(),!0):!1},[]);return{handleViewerReady:s,getViewer:d,captureImage:b,invalidate:g}}import{useCallback as R,useEffect as jt,useRef as G}from"react";import{Material as St,PointLight as Bt,Vector3 as vt}from"three";var Ae=["emissiveIntensity","opacity","metalness","roughness","transmission","clearcoat","clearcoatRoughness","ior","thickness"],ue=1;function fe(e){return typeof e=="string"?[e]:e}function ge(e,t=0,r=1){return Math.min(r,Math.max(t,e))}function Re(e,t){return e+Math.random()*(t-e)}function Xe([e,t],r){return e+(t-e)*r}function xe([e,t],r){return[e[0]+(t[0]-e[0])*r,e[1]+(t[1]-e[1])*r,e[2]+(t[2]-e[2])*r]}function qe(e,t){let r=ge(e);switch(t){case"ease-in":return r*r;case"ease-out":return 1-(1-r)*(1-r);case"ease-in-out":return r<.5?2*r*r:1-Math.pow(-2*r+2,2)/2;default:return r}}function Mt(e){let t=e.material;return t?(Array.isArray(t)?t:[t]).filter(r=>r instanceof St):[]}function Rt(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 r of Ae){let s=e[r];typeof s=="number"&&(t[r]=s)}return t}function Ye(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 r of Ae){let s=t[r];s!==void 0&&typeof e[r]=="number"&&(e[r]=s)}t.transparent!==void 0&&(e.transparent=t.transparent),e.needsUpdate=!0}function xt(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 At(e,t){if(t.position&&e.position.set(...t.position),t.rotation&&e.rotation.set(...t.rotation),t.scale!==void 0){let r=typeof t.scale=="number"?[t.scale,t.scale,t.scale]:t.scale;e.scale.set(...r)}t.visible!==void 0&&(e.visible=t.visible),e.updateMatrix(),e.updateMatrixWorld(!0)}function Pe(e={}){let t=G(e);t.current=e;let r=G(null),s=G(null),d=G(null),b=G(new Map),g=G(new Map),p=G(new Map),j=G(new Map),V=R(n=>{let i=r.current;if(!i)return null;let l=N(i.objectBindings,n);return i.raw.nodes[n]??(l?i.raw.nodes[l]:null)??(i.raw.scene?Ue(i.raw.scene,n):null)??null},[]),y=R(n=>{let i=r.current;return i?typeof n=="object"&&!Array.isArray(n)?ee(i.objectBindings,n):fe(n).map(l=>N(i.objectBindings,l)??l):typeof n=="string"?[n]:Array.isArray(n)?n:[]},[]),h=R(()=>{r.current?.invalidate()},[]),x=R((n,i)=>{let l=!1;for(let c of y(n)){let w=V(c);if(w)for(let P of Mt(w))p.current.has(P)||p.current.set(P,Rt(P)),Ye(P,i),l=!0}return l},[V,y]),A=R((n,i)=>{let l=x(n,i);return l&&h(),l},[h,x]),v=R((n,i)=>{let l=!1;for(let c of y(n)){let w=V(c);w&&(j.current.has(w)||j.current.set(w,xt(w)),At(w,i),l=!0)}return l},[V,y]),I=R((n,i)=>{let l=v(n,i);return l&&h(),l},[h,v]),E=R(n=>{let i=V(n);if(!i)return null;i.updateWorldMatrix(!0,!1);let l=i.getWorldPosition(new vt);return[l.x,l.y,l.z]},[V]),f=R(n=>{let i=g.current.get(n);return i?(i.light.removeFromParent(),i.light.dispose(),g.current.delete(n),h(),!0):!1},[h]),C=R(n=>{let i=V(n.target);if(!i)return!1;let l=g.current.get(n.id),c=l?.light??new Bt;return l&&l.target!==n.target&&c.removeFromParent(),c.name=`react-immersive-runtime-light:${n.id}`,c.color.set(n.color??"#ffffff"),c.intensity=n.intensity??1,c.distance=n.distance??0,c.decay=n.decay??2,c.castShadow=n.castShadow??!1,c.position.set(...n.offset??[0,0,0]),c.parent!==i&&i.add(c),g.current.set(n.id,{light:c,target:n.target}),h(),!0},[h,V]),M=R((n,i)=>{let l=g.current.get(n);if(!l)return!1;if(i.target&&i.target!==l.target){let c=V(i.target);if(!c)return!1;l.light.removeFromParent(),c.add(l.light),l.target=i.target}return i.color!==void 0&&l.light.color.set(i.color),i.intensity!==void 0&&(l.light.intensity=i.intensity),i.distance!==void 0&&(l.light.distance=i.distance),i.decay!==void 0&&(l.light.decay=i.decay),i.offset!==void 0&&l.light.position.set(...i.offset),i.castShadow!==void 0&&(l.light.castShadow=i.castShadow),h(),!0},[h,V]),B=R((n,i)=>{let l=c=>i[c%i.length]??0;for(let c of n.materials??[])y(c.targets).forEach((w,P)=>{let S=l(P),T={};for(let K of Ae){let F=c.values[K];F&&(T[K]=Xe(F,S))}x(w,T)});for(let c of n.transforms??[])y(c.targets).forEach((w,P)=>{let S=l(P),T={};c.values.position&&(T.position=xe(c.values.position,S)),c.values.rotation&&(T.rotation=xe(c.values.rotation,S)),c.values.scale&&(T.scale=xe(c.values.scale,S)),v(w,T)});for(let c of n.lights??[])fe(c.lights).forEach((w,P)=>{let S=g.current.get(w);S&&(S.light.intensity=Xe(c.intensity,l(P)))})},[y,x,v]),D=G(()=>{}),H=G(()=>{});H.current=n=>{d.current=null;let i=!1;for(let[l,c]of b.current){c.startedAt===null&&(c.startedAt=n);let w=c.lastFrameAt??n;c.lastFrameAt=n;let P=c.override&&c.override.until>n?c.override.level:null;c.override&&P===null&&(c.override=null);let S=c.update(n,n-c.startedAt,Math.min(100,n-w),P);i=!0,S||(b.current.delete(l),c.onComplete?.())}i&&h(),b.current.size>0&&D.current()},D.current=()=>{d.current!==null||typeof requestAnimationFrame>"u"||(d.current=requestAnimationFrame(n=>H.current(n)))};let o=R(n=>(b.current.set(n.id,n),D.current(),n.id),[]),u=R((n,i={})=>{let l=i.id??`transition-${ue++}`,c=Math.max(1,i.duration??400),w=i.easing??"ease-in-out";return o({id:l,startedAt:null,lastFrameAt:null,override:null,onComplete:i.onComplete,update:(P,S,T,K)=>{let F=K??qe(S/c,w);return B(n,[F]),S<c}})},[B,o]),a=R((n,i={})=>{let l=i.id??`pulse-${ue++}`,c=Math.max(1,i.duration??1e3),w=i.minLevel??0,P=i.maxLevel??1,S=i.repeat??1/0,T=i.synchronized??!0,K=Math.max(1,...[...n.materials??[],...n.transforms??[]].map(F=>y(F.targets).length),...(n.lights??[]).map(F=>fe(F.lights).length));return o({id:l,startedAt:null,lastFrameAt:null,override:null,onComplete:i.onComplete,update:(F,te,ne,J)=>{let _=te/c,X=Array.from({length:T?1:K},(ie,Z)=>{if(J!==null)return J;let ce=_+(T?0:Z/K),Y=.5-Math.cos(ce%1*Math.PI*2)/2;return w+(P-w)*Y});return B(n,X),S===1/0||_<S}})},[B,o,y]),m=R((n,i={})=>{let l=i.id??`timeline-${ue++}`,c=i.repeat??1,w=n.map(S=>({...S,duration:Math.max(1,S.duration),hold:Math.max(0,S.hold??0)})),P=Math.max(1,w.reduce((S,T)=>S+T.duration+T.hold,0));return o({id:l,startedAt:null,lastFrameAt:null,override:null,onComplete:i.onComplete,update:(S,T,K,F)=>{if(w.length===0||c<=0)return!1;let te=T/P;if(c!==1/0&&te>=c){for(let _ of w)B(_.channels,[1]);return!1}let ne=T%P,J=0;for(let _ of w){let X=J+_.duration,ie=X+_.hold;if(ne>=X){B(_.channels,[F??1]),J=ie;continue}if(ne>=J){let Z=F??qe((ne-J)/_.duration,_.easing??"ease-in-out");B(_.channels,[Z]);break}}return!0}})},[B,o]),O=R((n,i={})=>{let l=i.id??`flicker-${ue++}`,c=i.synchronized??!0,w=i.minLevel??.15,P=i.maxLevel??1,S=i.interval??[45,160],T=typeof S=="number"?[S,S]:S,K=[Math.max(1,Math.min(...T)),Math.max(1,Math.max(...T))],F=ge(i.response??.7,.01,1),te=ge(i.blackoutChance??.08),ne=ge(i.flashChance??.12),J=i.flashLevel??1.15,_=Math.max(1,...[...n.materials??[],...n.transforms??[]].map(Y=>y(Y.targets).length),...(n.lights??[]).map(Y=>fe(Y.lights).length)),X=c?1:_,ie=Array.from({length:X},()=>w),Z=Array.from({length:X},()=>w),ce=Array.from({length:X},()=>0);return o({id:l,startedAt:null,lastFrameAt:null,override:null,onComplete:i.onComplete,update:(Y,rt,ot,ke)=>{for(let q=0;q<X;q+=1){if(ke!==null)Z[q]=ke;else if(Y>=ce[q]){let He=Math.random();Z[q]=He<te?Re(0,Math.min(.04,w)):He<te+ne?J:Re(w,P),ce[q]=Y+Re(...K)}let st=1-Math.pow(1-F,Math.max(1,ot)/16.67);ie[q]+=(Z[q]-ie[q])*st}return B(n,ie),i.duration===void 0||rt<i.duration}})},[B,o,y]),L=R((n,i,l)=>{let c=b.current.get(n);if(!c)return!1;let w=typeof performance>"u"?Date.now():performance.now();return c.override={level:i,until:w+Math.max(0,l)},D.current(),!0},[]),U=R(n=>b.current.delete(n),[]),$=R(()=>{b.current.clear(),d.current!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(d.current),d.current=null)},[]),W=R(()=>{for(let[n,i]of p.current)Ye(n,i);p.current.clear();for(let[n,i]of j.current)n.position.set(...i.position),n.rotation.set(...i.rotation),n.scale.set(...i.scale),n.visible=i.visible,n.updateMatrix(),n.updateMatrixWorld(!0);j.current.clear();for(let n of g.current.values())n.light.removeFromParent(),n.light.dispose();g.current.clear(),h()},[h]),be=R(()=>{$(),W()},[W,$]),it=R(n=>{s.current&&s.current!==n.raw.scene&&W(),r.current=n,s.current=n.raw.scene,t.current.onViewerReady?.(n)},[W]);return jt(()=>()=>{be(),r.current=null,s.current=null},[be]),{handleViewerReady:it,setMaterial:A,setTransform:I,getWorldPosition:E,addPointLight:C,updatePointLight:M,removePointLight:f,transition:u,timeline:m,pulse:a,flicker:O,overrideEffect:L,stopEffect:U,stopAllEffects:$,resetRuntime:be}}import{useCallback as Pt,useState as Et}from"react";function Ee(){let[e,t]=Et(null),r=Pt(s=>{t(s)},[t]);return{hoveredObjectBinding:e,handleHoveredObject:r}}import{useCallback as me,useState as oe}from"react";function Te(){let[e,t]=oe(!0),[r,s]=oe(!1),[d,b]=oe(null),[g,p]=oe(null),[j,V]=oe(0),[y,h]=oe([]),x=me(E=>{p(E.bounds),V(E.objectCount),b(null),t(!1),s(!0)},[]),A=me(E=>h(E),[]),v=me(E=>{b(E),p(null),V(0),h([]),t(!1),s(!1)},[]),I=me(()=>{t(!0),s(!1),b(null),p(null),V(0),h([])},[]);return{isLoading:e,isReady:r,error:d,bounds:g,objectCount:j,objects:y,handleModelLoaded:x,handleObjectCatalog:A,handleLoadError:v,resetModelState:I}}import{useCallback as Qe,useState as Tt}from"react";function Le(e=null){let[t,r]=Tt(e),s=Qe(b=>{r(b)},[r]),d=Qe(()=>{r(null)},[]);return{selectedObjectBinding:t,setSelectedObjectBinding:r,handleObjectSelect:s,clearSelection:d}}var Lt={};function It(e={}){let t=Ze(e);t.current=e;let r=Ze(e.bindings===void 0||e.bindings==="auto"),s=je(()=>{let o=t.current.bindings;return o===void 0||o==="auto"?Lt:typeof o=="function"?o():o}),d=Se(()=>{let o=t.current.sceneConfig;return o===void 0?le:typeof o=="function"?o():o}),b=Le(),g=Ee(),p=he(e.camera),j=Te(),V=Oe(),y=Pe(),h=Me(p,y),x=ve({bindings:s,scene:d,camera:p,animations:V,onAction:e.onAction}),{setObjectBindings:A}=s,{handleObjectCatalog:v}=j,I=pe(o=>{v(o),r.current&&A(u=>{let a=Fe(o.map(m=>m.name));for(let m of Object.keys(a))u[m]&&(a[m]=u[m]);return a})},[v,A]),{handleObjectSelect:E}=b,f=pe(o=>{E(o),t.current.onObjectSelect?.(o)},[E]),{handleHoveredObject:C}=g,M=pe(o=>{C(o),t.current.onObjectHover?.(o)},[C]),{handleLoadError:B}=j,D=pe(o=>{B(o),t.current.onLoadError?.(o)},[B]),H=e.sceneConfig!==void 0||d.sceneConfig!==le;return{props:{objectBindings:s.objectBindings,onObjectBindingsChange:A,selectedObject:b.selectedObjectBinding,onObjectSelect:f,onObjectHover:M,onCameraChange:p.handleCameraChange,onViewerReady:h.handleViewerReady,onModelLoaded:j.handleModelLoaded,onLoadError:D,onObjectCatalog:I,onAnimationsReady:V.handleAnimationsReady,onAction:x.handleAction,onSceneConfigChange:d.setSceneConfig,...H?{sceneConfig:d.sceneConfig}:{}},bindings:s,selection:b,hover:g,camera:p,model:j,animations:V,actions:x,scene:d,effects:y,connection:h}}import{useMemo as kt}from"react";function Ht(e,t){return kt(()=>{if(!t)return null;let r=e[t];return r||(Object.values(e).find(s=>s.id===t||s.modelObjectId===t)??null)},[e,t])}import{useMemo as Ut}from"react";function Ft(e){return Ut(()=>Object.values(e).map(t=>t.modelObjectId),[e])}import{useCallback as se,useEffect as Ie,useRef as Q,useState as _t}from"react";function nt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ae(e){return typeof e=="number"&&Number.isFinite(e)}function et(e){return Array.isArray(e)&&e.length===3&&e.every(ae)}function Dt(e){return!nt(e)||!et(e.position)||!et(e.target)||e.fov!==null&&!ae(e.fov)||!ae(e.zoom)||e.zoom<=0||e.azimuthAngle!==void 0&&!ae(e.azimuthAngle)||e.polarAngle!==void 0&&!ae(e.polarAngle)?null:{position:e.position,target:e.target,fov:e.fov,zoom:e.zoom,azimuthAngle:e.azimuthAngle,polarAngle:e.polarAngle}}function Nt(e){if(!nt(e))return null;let t;if(e.camera!==void 0){let d=Dt(e.camera);if(!d)return null;t=d}let r;if(e.hidden!==void 0){if(!Array.isArray(e.hidden)||!e.hidden.every(d=>typeof d=="string"))return null;r=e.hidden}let s;if(e.selected===null||typeof e.selected=="string")s=e.selected;else if(e.selected!==void 0)return null;return{camera:t,hidden:r,selected:s}}function tt(e,t,r){let s=Object.values(t).filter(d=>d.visible===!1).map(d=>d.id);return{camera:e??void 0,hidden:s,selected:r?.id??null}}function zt({cameraState:e,setCameraState:t,objectBindings:r,onObjectBindingsChange:s,selectedObjectBinding:d,setSelectedObjectBinding:b,paramKey:g="view",debounceMs:p=400,autoSync:j=!0}){let V=Q(null),y=Q(null),h=Q(null),x=Q(null),A=Q(null),v=se(()=>{A.current!==null&&(window.clearTimeout(A.current),A.current=null),h.current=null,x.current=null},[]),I=se(()=>{let a=tt(e,r,d);return`${g}=${encodeURIComponent(JSON.stringify(a))}`},[e,r,d,g]),E=se(()=>{let a=new URL(window.location.href);return a.hash=I(),a.toString()},[I]),f=se(a=>{let m=new URL(window.location.href);m.hash=a,window.history.replaceState(null,"",m.toString()),y.current=a,V.current=new URLSearchParams(m.hash.slice(1)).get(g)},[g]),C=se(()=>{v(),f(I())},[I,v,f]),M=Q({cameraState:e,objectBindings:r,selectedObjectBinding:d});M.current={cameraState:e,objectBindings:r,selectedObjectBinding:d};let[B,D]=_t(!1);Ie(()=>{if(!j||!B){v();return}let a=M.current,m=tt(a.cameraState,a.objectBindings,a.selectedObjectBinding),O=`${g}=${encodeURIComponent(JSON.stringify(m))}`;if(O===y.current){v();return}O===h.current&&p===x.current||(v(),h.current=O,x.current=p,A.current=window.setTimeout(()=>{A.current=null,h.current=null,x.current=null,f(O)},Math.max(0,p)))},[j,e,v,p,r,g,B,d,f]),Ie(()=>v,[v]);let H=Q(null),o=Q(null),u=se(async()=>{D(!0);let a=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash,m=new URLSearchParams(a).get(g);if(!m)return H.current=null,!1;if(m===V.current||m===H.current||m===o.current)return!1;let O;try{O=JSON.parse(m)}catch{return!1}let L=Nt(O);if(!L)return!1;o.current=m;try{if(L.camera&&await t(L.camera,!1),L.hidden){let U=new Set(L.hidden);s(Object.fromEntries(Object.entries(r).map(([$,W])=>[$,{...W,visible:!U.has(W.id)}])))}if(L.selected!==void 0){let U=L.selected?N(r,L.selected):null;b(U?r[U]:null)}return H.current=m,!0}finally{o.current===m&&(o.current=null)}},[r,s,g,t,b]);return Ie(()=>{let a=()=>{u().catch(()=>{})};return window.addEventListener("hashchange",a),()=>{window.removeEventListener("hashchange",a)}},[u]),{getShareUrl:E,syncUrl:C,restoreFromUrl:u}}export{ct as ACTION_CATALOG,le as DEFAULT_SCENE_CONFIG,pt as MATERIAL_BLENDING_MODES,mt as MATERIAL_SIDES,at as MODEL_VIEWER_PRESETS,We as ModelViewer,ft as buildBindingsFromNodes,ut as createDefaultBinding,gt as defineObjectBindings,lt as findCatalogAction,dt as inferType,ye as material,re as patchBindings,Ve as patchSceneConfig,Ce as sceneLight,ee as selectBindingKeys,we as selectBindings,Ht as useObjectBinding,Ft as useObjectBindingIds,je as useObjectBindings,Se as useSceneConfig,zt as useShareableViewerState,It as useViewer,ve as useViewerActions,Oe as useViewerAnimations,he as useViewerCamera,Me as useViewerConnection,Pe as useViewerEffects,Ee as useViewerHover,Te as useViewerModel,Le as useViewerSelection};
1
+ "use client";import{b as De,d as Ne}from"./chunk-SEESCGUS.mjs";import{a as ze}from"./chunk-MMO7KCYU.mjs";import{a as ee,b as we,c as re,d as ye,e as Ve,f as Ce,g as gt}from"./chunk-WFEYRUZC.mjs";import{b as at,j as he,r as _e,s as Oe}from"./chunk-AH5NAZWX.mjs";import"./chunk-XTLSAYAQ.mjs";import{a as ct,c as lt,g as N,o as le,r as Ue,t as dt,u as ut,v as ft,w as Fe,y as mt,z as pt}from"./chunk-BGYK4Y2Y.mjs";import"./chunk-JR557W27.mjs";import{jsx as bt}from"react/jsx-runtime";function We(e){return ze("model-viewer","ModelViewer"),bt(_e,{...Ne(e,De)})}import{useCallback as pe,useRef as Ze}from"react";import{useCallback as k,useMemo as $e,useState as ht}from"react";var Ke={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 Ge(e){if(e)return Object.fromEntries(Object.entries(e).map(([t,r])=>[t,r&&typeof r=="object"?{...r}:r]))}function wt(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t.visible===!1).map(([t])=>[t,!0]))}function je(e){let[t,r]=ht(e),s=k((o,u)=>{r(a=>u===void 0?re(a,o):re(a,o,u))},[]),d=k((o,u)=>s(o,ye(u)),[s]),b=k((o,u)=>d(o,{baseColor:u}),[d]),g=k((o,u,a="baseColor")=>{let m=Ke[a],O=typeof u=="string"?{path:u}:u;s(o,{style:{material:{[m]:O}}})},[s]),p=k((o,u="baseColor")=>{let a=Ke[u];s(o,{style:{material:{[a]:void 0}}})},[s]),j=k((o,u)=>{r(a=>{let m=N(a,o);if(!m)return a;let O=Ge(a[m]?.style?.material),L=ee(a,u);if(L.length===0)return a;let U=a;for(let $ of L){let W=a[$];W&&(U===a&&(U={...a}),U[$]={...W,style:{...W.style,material:Ge(O)}})}return U})},[]),V=k(o=>s(o,{style:{material:void 0}}),[s]),y=k((o,u)=>s(o,{transform:u}),[s]),h=k(o=>s(o,{transform:void 0}),[s]),x=k((o,u)=>s(o,{metadata:u}),[s]),A=k(o=>we(t,o),[t]),v=k(o=>ee(t,o).map(u=>t[u]?.id??u),[t]),I=k(o=>{let u=N(t,o);return u?t[u]?.style?.material??null:null},[t]),E=k(o=>s(o,{visible:!1}),[s]),f=k(o=>s(o,{visible:!0}),[s]),C=k(o=>{r(u=>{let a=ee(u,o).reduce((m,O)=>{let L=u[O];return L&&m.push({ids:O,patch:{visible:L.visible===!1}}),m},[]);return re(u,a)})},[r]),M=k(()=>{r(o=>re(o,Object.keys(o),{visible:!0}))},[r]),B=$e(()=>wt(t),[t]),D=$e(()=>Object.keys(B).map(o=>t[o]?.id??o),[B,t]),H=k(o=>{let u=N(t,o);return u?t[u]?.visible===!1:!1},[t]);return{objectBindings:t,setObjectBindings:r,updateObjectBindings:s,setMaterial:d,setBaseColor:b,setTexture:g,clearTexture:p,copyMaterial:j,resetMaterial:V,getMaterial:I,setTransform:y,resetTransform:h,updateMetadata:x,selectObjectBindings:A,selectObjectBindingIds:v,hiddenObjects:B,hiddenObjectIds:D,hideObject:E,showObject:f,toggleObjectVisibility:C,isObjectHidden:H,clearHiddenObjects:M}}import{useCallback as z,useMemo as yt,useRef as Vt,useState as Ct}from"react";function Se(e){let t=Vt(null),[r,s]=Ct(()=>{let f=typeof e=="function"?e():e;return t.current=f,f}),d=z(f=>{s(C=>{let M=typeof f=="function"?f(C):f;return Ve(C,M)})},[]),b=z(()=>{let f=t.current;f&&s(f)},[]),g=z((f,C)=>{d(M=>({lighting:{lights:M.lighting.lights.map(B=>B.id===f?{...B,...C}:B)}}))},[d]),p=z(f=>{d(C=>C.lighting.lights.some(M=>M.id===f.id)?{}:{lighting:{lights:[...C.lighting.lights,Ce(f)]}})},[d]),j=z(f=>{d(C=>({lighting:{lights:C.lighting.lights.filter(M=>M.id!==f)}}))},[d]),V=z((f,C)=>g(f,{intensity:C}),[g]),y=z((f,C)=>g(f,{color:C}),[g]),h=z(f=>g(f,{visible:!0}),[g]),x=z(f=>g(f,{visible:!1}),[g]),A=z(f=>{d(C=>({lighting:{lights:C.lighting.lights.map(M=>M.id===f?{...M,visible:!M.visible}:M)}}))},[d]),v=z((f,C)=>g(f,{attachment:C,attachedToCamera:!1}),[g]),I=z(f=>g(f,{attachment:void 0}),[g]),E=yt(()=>({items:r.lighting.lights,get:f=>r.lighting.lights.find(C=>C.id===f),add:p,update:g,remove:j,setIntensity:V,setColor:y,show:h,hide:x,toggle:A,attach:v,detach:I}),[r.lighting.lights,p,g,j,V,y,h,x,A,v,I]);return{sceneConfig:r,setSceneConfig:s,updateSceneConfig:d,resetSceneConfig:b,lights:E}}import{useCallback as Be}from"react";function ve({bindings:e,scene:t,camera:r,animations:s,onAction:d}){let{objectBindings:b,updateObjectBindings:g,showObject:p,hideObject:j,toggleObjectVisibility:V}=e,y=t?.updateSceneConfig,h=r?.focusObject,x=r?.fitScene,A=r?.resetView,v=r?.setCameraTarget,I=r?.setCameraState,E=s?.play,f=s?.pause,C=s?.stop,M=s?.setSpeed,B=s?.seek,D=Be(u=>{let a=N(b,u);return a?b[a]?.actions??[]:[]},[b]),H=Be(async u=>{for(let a of u.action.effects??[]){if("objectBindings"in a){g(a.target,a.objectBindings);continue}if("sceneConfig"in a){y?.(a.sceneConfig);continue}if("visibility"in a){a.visibility==="show"?p(a.target):a.visibility==="hide"?j(a.target):V(a.target);continue}if("camera"in a){let O=a.camera;O.type==="focus-object"?await h?.(O.objectId??u.objectId):O.type==="fit-scene"?await x?.():O.type==="reset"?await A?.():O.type==="set-target"?await v?.(O.target,O.transition??!0):await I?.(O.state,O.transition??!0);continue}let m=a.animation;m.type==="play"?E?.(m.clip):m.type==="pause"?f?.():m.type==="stop"?C?.():m.type==="set-speed"?M?.(m.speed):B?.(m.time)}await d?.(u)},[x,h,j,d,f,E,A,B,M,I,v,p,C,V,g,y]),o=Be(async(u,a)=>{let m=N(b,u);if(!m)return null;let O=b[m],L=O?.actions?.find($=>$.id===a);if(!O||!L)return null;let U={objectId:m,action:L,binding:O};return await H(U),U},[H,b]);return{getActionsForObject:D,handleAction:H,runAction:o}}import{useCallback as de,useRef as Je}from"react";function Ot(e){return typeof e=="function"?e:e?.handleViewerReady??null}function Me(...e){let t=Je(null),r=Je(e);r.current=e;let s=de(p=>{t.current=p;let j=new Set;for(let V of r.current){let y=Ot(V);y&&!j.has(y)&&(j.add(y),y(p))}},[]),d=de(()=>t.current,[]),b=de(p=>{let j=t.current;return j?j.captureImage(p):Promise.reject(new Error("ModelViewer is not ready yet."))},[]),g=de(()=>{let p=t.current;return p?(p.invalidate(),!0):!1},[]);return{handleViewerReady:s,getViewer:d,captureImage:b,invalidate:g}}import{useCallback as R,useEffect as jt,useRef as G}from"react";import{Material as St,PointLight as Bt,Vector3 as vt}from"three";var Ae=["emissiveIntensity","opacity","metalness","roughness","transmission","clearcoat","clearcoatRoughness","ior","thickness"],ue=1;function fe(e){return typeof e=="string"?[e]:e}function ge(e,t=0,r=1){return Math.min(r,Math.max(t,e))}function Re(e,t){return e+Math.random()*(t-e)}function Xe([e,t],r){return e+(t-e)*r}function xe([e,t],r){return[e[0]+(t[0]-e[0])*r,e[1]+(t[1]-e[1])*r,e[2]+(t[2]-e[2])*r]}function qe(e,t){let r=ge(e);switch(t){case"ease-in":return r*r;case"ease-out":return 1-(1-r)*(1-r);case"ease-in-out":return r<.5?2*r*r:1-Math.pow(-2*r+2,2)/2;default:return r}}function Mt(e){let t=e.material;return t?(Array.isArray(t)?t:[t]).filter(r=>r instanceof St):[]}function Rt(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 r of Ae){let s=e[r];typeof s=="number"&&(t[r]=s)}return t}function Ye(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 r of Ae){let s=t[r];s!==void 0&&typeof e[r]=="number"&&(e[r]=s)}t.transparent!==void 0&&(e.transparent=t.transparent),e.needsUpdate=!0}function xt(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 At(e,t){if(t.position&&e.position.set(...t.position),t.rotation&&e.rotation.set(...t.rotation),t.scale!==void 0){let r=typeof t.scale=="number"?[t.scale,t.scale,t.scale]:t.scale;e.scale.set(...r)}t.visible!==void 0&&(e.visible=t.visible),e.updateMatrix(),e.updateMatrixWorld(!0)}function Pe(e={}){let t=G(e);t.current=e;let r=G(null),s=G(null),d=G(null),b=G(new Map),g=G(new Map),p=G(new Map),j=G(new Map),V=R(n=>{let i=r.current;if(!i)return null;let l=N(i.objectBindings,n);return i.raw.nodes[n]??(l?i.raw.nodes[l]:null)??(i.raw.scene?Ue(i.raw.scene,n):null)??null},[]),y=R(n=>{let i=r.current;return i?typeof n=="object"&&!Array.isArray(n)?ee(i.objectBindings,n):fe(n).map(l=>N(i.objectBindings,l)??l):typeof n=="string"?[n]:Array.isArray(n)?n:[]},[]),h=R(()=>{r.current?.invalidate()},[]),x=R((n,i)=>{let l=!1;for(let c of y(n)){let w=V(c);if(w)for(let P of Mt(w))p.current.has(P)||p.current.set(P,Rt(P)),Ye(P,i),l=!0}return l},[V,y]),A=R((n,i)=>{let l=x(n,i);return l&&h(),l},[h,x]),v=R((n,i)=>{let l=!1;for(let c of y(n)){let w=V(c);w&&(j.current.has(w)||j.current.set(w,xt(w)),At(w,i),l=!0)}return l},[V,y]),I=R((n,i)=>{let l=v(n,i);return l&&h(),l},[h,v]),E=R(n=>{let i=V(n);if(!i)return null;i.updateWorldMatrix(!0,!1);let l=i.getWorldPosition(new vt);return[l.x,l.y,l.z]},[V]),f=R(n=>{let i=g.current.get(n);return i?(i.light.removeFromParent(),i.light.dispose(),g.current.delete(n),h(),!0):!1},[h]),C=R(n=>{let i=V(n.target);if(!i)return!1;let l=g.current.get(n.id),c=l?.light??new Bt;return l&&l.target!==n.target&&c.removeFromParent(),c.name=`react-immersive-runtime-light:${n.id}`,c.color.set(n.color??"#ffffff"),c.intensity=n.intensity??1,c.distance=n.distance??0,c.decay=n.decay??2,c.castShadow=n.castShadow??!1,c.position.set(...n.offset??[0,0,0]),c.parent!==i&&i.add(c),g.current.set(n.id,{light:c,target:n.target}),h(),!0},[h,V]),M=R((n,i)=>{let l=g.current.get(n);if(!l)return!1;if(i.target&&i.target!==l.target){let c=V(i.target);if(!c)return!1;l.light.removeFromParent(),c.add(l.light),l.target=i.target}return i.color!==void 0&&l.light.color.set(i.color),i.intensity!==void 0&&(l.light.intensity=i.intensity),i.distance!==void 0&&(l.light.distance=i.distance),i.decay!==void 0&&(l.light.decay=i.decay),i.offset!==void 0&&l.light.position.set(...i.offset),i.castShadow!==void 0&&(l.light.castShadow=i.castShadow),h(),!0},[h,V]),B=R((n,i)=>{let l=c=>i[c%i.length]??0;for(let c of n.materials??[])y(c.targets).forEach((w,P)=>{let S=l(P),T={};for(let K of Ae){let F=c.values[K];F&&(T[K]=Xe(F,S))}x(w,T)});for(let c of n.transforms??[])y(c.targets).forEach((w,P)=>{let S=l(P),T={};c.values.position&&(T.position=xe(c.values.position,S)),c.values.rotation&&(T.rotation=xe(c.values.rotation,S)),c.values.scale&&(T.scale=xe(c.values.scale,S)),v(w,T)});for(let c of n.lights??[])fe(c.lights).forEach((w,P)=>{let S=g.current.get(w);S&&(S.light.intensity=Xe(c.intensity,l(P)))})},[y,x,v]),D=G(()=>{}),H=G(()=>{});H.current=n=>{d.current=null;let i=!1;for(let[l,c]of b.current){c.startedAt===null&&(c.startedAt=n);let w=c.lastFrameAt??n;c.lastFrameAt=n;let P=c.override&&c.override.until>n?c.override.level:null;c.override&&P===null&&(c.override=null);let S=c.update(n,n-c.startedAt,Math.min(100,n-w),P);i=!0,S||(b.current.delete(l),c.onComplete?.())}i&&h(),b.current.size>0&&D.current()},D.current=()=>{d.current!==null||typeof requestAnimationFrame>"u"||(d.current=requestAnimationFrame(n=>H.current(n)))};let o=R(n=>(b.current.set(n.id,n),D.current(),n.id),[]),u=R((n,i={})=>{let l=i.id??`transition-${ue++}`,c=Math.max(1,i.duration??400),w=i.easing??"ease-in-out";return o({id:l,startedAt:null,lastFrameAt:null,override:null,onComplete:i.onComplete,update:(P,S,T,K)=>{let F=K??qe(S/c,w);return B(n,[F]),S<c}})},[B,o]),a=R((n,i={})=>{let l=i.id??`pulse-${ue++}`,c=Math.max(1,i.duration??1e3),w=i.minLevel??0,P=i.maxLevel??1,S=i.repeat??1/0,T=i.synchronized??!0,K=Math.max(1,...[...n.materials??[],...n.transforms??[]].map(F=>y(F.targets).length),...(n.lights??[]).map(F=>fe(F.lights).length));return o({id:l,startedAt:null,lastFrameAt:null,override:null,onComplete:i.onComplete,update:(F,te,ne,J)=>{let _=te/c,X=Array.from({length:T?1:K},(ie,Z)=>{if(J!==null)return J;let ce=_+(T?0:Z/K),Y=.5-Math.cos(ce%1*Math.PI*2)/2;return w+(P-w)*Y});return B(n,X),S===1/0||_<S}})},[B,o,y]),m=R((n,i={})=>{let l=i.id??`timeline-${ue++}`,c=i.repeat??1,w=n.map(S=>({...S,duration:Math.max(1,S.duration),hold:Math.max(0,S.hold??0)})),P=Math.max(1,w.reduce((S,T)=>S+T.duration+T.hold,0));return o({id:l,startedAt:null,lastFrameAt:null,override:null,onComplete:i.onComplete,update:(S,T,K,F)=>{if(w.length===0||c<=0)return!1;let te=T/P;if(c!==1/0&&te>=c){for(let _ of w)B(_.channels,[1]);return!1}let ne=T%P,J=0;for(let _ of w){let X=J+_.duration,ie=X+_.hold;if(ne>=X){B(_.channels,[F??1]),J=ie;continue}if(ne>=J){let Z=F??qe((ne-J)/_.duration,_.easing??"ease-in-out");B(_.channels,[Z]);break}}return!0}})},[B,o]),O=R((n,i={})=>{let l=i.id??`flicker-${ue++}`,c=i.synchronized??!0,w=i.minLevel??.15,P=i.maxLevel??1,S=i.interval??[45,160],T=typeof S=="number"?[S,S]:S,K=[Math.max(1,Math.min(...T)),Math.max(1,Math.max(...T))],F=ge(i.response??.7,.01,1),te=ge(i.blackoutChance??.08),ne=ge(i.flashChance??.12),J=i.flashLevel??1.15,_=Math.max(1,...[...n.materials??[],...n.transforms??[]].map(Y=>y(Y.targets).length),...(n.lights??[]).map(Y=>fe(Y.lights).length)),X=c?1:_,ie=Array.from({length:X},()=>w),Z=Array.from({length:X},()=>w),ce=Array.from({length:X},()=>0);return o({id:l,startedAt:null,lastFrameAt:null,override:null,onComplete:i.onComplete,update:(Y,rt,ot,ke)=>{for(let q=0;q<X;q+=1){if(ke!==null)Z[q]=ke;else if(Y>=ce[q]){let He=Math.random();Z[q]=He<te?Re(0,Math.min(.04,w)):He<te+ne?J:Re(w,P),ce[q]=Y+Re(...K)}let st=1-Math.pow(1-F,Math.max(1,ot)/16.67);ie[q]+=(Z[q]-ie[q])*st}return B(n,ie),i.duration===void 0||rt<i.duration}})},[B,o,y]),L=R((n,i,l)=>{let c=b.current.get(n);if(!c)return!1;let w=typeof performance>"u"?Date.now():performance.now();return c.override={level:i,until:w+Math.max(0,l)},D.current(),!0},[]),U=R(n=>b.current.delete(n),[]),$=R(()=>{b.current.clear(),d.current!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(d.current),d.current=null)},[]),W=R(()=>{for(let[n,i]of p.current)Ye(n,i);p.current.clear();for(let[n,i]of j.current)n.position.set(...i.position),n.rotation.set(...i.rotation),n.scale.set(...i.scale),n.visible=i.visible,n.updateMatrix(),n.updateMatrixWorld(!0);j.current.clear();for(let n of g.current.values())n.light.removeFromParent(),n.light.dispose();g.current.clear(),h()},[h]),be=R(()=>{$(),W()},[W,$]),it=R(n=>{s.current&&s.current!==n.raw.scene&&W(),r.current=n,s.current=n.raw.scene,t.current.onViewerReady?.(n)},[W]);return jt(()=>()=>{be(),r.current=null,s.current=null},[be]),{handleViewerReady:it,setMaterial:A,setTransform:I,getWorldPosition:E,addPointLight:C,updatePointLight:M,removePointLight:f,transition:u,timeline:m,pulse:a,flicker:O,overrideEffect:L,stopEffect:U,stopAllEffects:$,resetRuntime:be}}import{useCallback as Pt,useState as Et}from"react";function Ee(){let[e,t]=Et(null),r=Pt(s=>{t(s)},[t]);return{hoveredObjectBinding:e,handleHoveredObject:r}}import{useCallback as me,useState as oe}from"react";function Te(){let[e,t]=oe(!0),[r,s]=oe(!1),[d,b]=oe(null),[g,p]=oe(null),[j,V]=oe(0),[y,h]=oe([]),x=me(E=>{p(E.bounds),V(E.objectCount),b(null),t(!1),s(!0)},[]),A=me(E=>h(E),[]),v=me(E=>{b(E),p(null),V(0),h([]),t(!1),s(!1)},[]),I=me(()=>{t(!0),s(!1),b(null),p(null),V(0),h([])},[]);return{isLoading:e,isReady:r,error:d,bounds:g,objectCount:j,objects:y,handleModelLoaded:x,handleObjectCatalog:A,handleLoadError:v,resetModelState:I}}import{useCallback as Qe,useState as Tt}from"react";function Le(e=null){let[t,r]=Tt(e),s=Qe(b=>{r(b)},[r]),d=Qe(()=>{r(null)},[]);return{selectedObjectBinding:t,setSelectedObjectBinding:r,handleObjectSelect:s,clearSelection:d}}var Lt={};function It(e={}){let t=Ze(e);t.current=e;let r=Ze(e.bindings===void 0||e.bindings==="auto"),s=je(()=>{let o=t.current.bindings;return o===void 0||o==="auto"?Lt:typeof o=="function"?o():o}),d=Se(()=>{let o=t.current.sceneConfig;return o===void 0?le:typeof o=="function"?o():o}),b=Le(),g=Ee(),p=he(e.camera),j=Te(),V=Oe(),y=Pe(),h=Me(p,y),x=ve({bindings:s,scene:d,camera:p,animations:V,onAction:e.onAction}),{setObjectBindings:A}=s,{handleObjectCatalog:v}=j,I=pe(o=>{v(o),r.current&&A(u=>{let a=Fe(o.map(m=>m.name));for(let m of Object.keys(a))u[m]&&(a[m]=u[m]);return a})},[v,A]),{handleObjectSelect:E}=b,f=pe(o=>{E(o),t.current.onObjectSelect?.(o)},[E]),{handleHoveredObject:C}=g,M=pe(o=>{C(o),t.current.onObjectHover?.(o)},[C]),{handleLoadError:B}=j,D=pe(o=>{B(o),t.current.onLoadError?.(o)},[B]),H=e.sceneConfig!==void 0||d.sceneConfig!==le;return{props:{objectBindings:s.objectBindings,onObjectBindingsChange:A,selectedObject:b.selectedObjectBinding,onObjectSelect:f,onObjectHover:M,onCameraChange:p.handleCameraChange,onViewerReady:h.handleViewerReady,onModelLoaded:j.handleModelLoaded,onLoadError:D,onObjectCatalog:I,onAnimationsReady:V.handleAnimationsReady,onAction:x.handleAction,onSceneConfigChange:d.setSceneConfig,...H?{sceneConfig:d.sceneConfig}:{}},bindings:s,selection:b,hover:g,camera:p,model:j,animations:V,actions:x,scene:d,effects:y,connection:h}}import{useMemo as kt}from"react";function Ht(e,t){return kt(()=>{if(!t)return null;let r=e[t];return r||(Object.values(e).find(s=>s.id===t||s.modelObjectId===t)??null)},[e,t])}import{useMemo as Ut}from"react";function Ft(e){return Ut(()=>Object.values(e).map(t=>t.modelObjectId),[e])}import{useCallback as se,useEffect as Ie,useRef as Q,useState as _t}from"react";function nt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ae(e){return typeof e=="number"&&Number.isFinite(e)}function et(e){return Array.isArray(e)&&e.length===3&&e.every(ae)}function Dt(e){return!nt(e)||!et(e.position)||!et(e.target)||e.fov!==null&&!ae(e.fov)||!ae(e.zoom)||e.zoom<=0||e.azimuthAngle!==void 0&&!ae(e.azimuthAngle)||e.polarAngle!==void 0&&!ae(e.polarAngle)?null:{position:e.position,target:e.target,fov:e.fov,zoom:e.zoom,azimuthAngle:e.azimuthAngle,polarAngle:e.polarAngle}}function Nt(e){if(!nt(e))return null;let t;if(e.camera!==void 0){let d=Dt(e.camera);if(!d)return null;t=d}let r;if(e.hidden!==void 0){if(!Array.isArray(e.hidden)||!e.hidden.every(d=>typeof d=="string"))return null;r=e.hidden}let s;if(e.selected===null||typeof e.selected=="string")s=e.selected;else if(e.selected!==void 0)return null;return{camera:t,hidden:r,selected:s}}function tt(e,t,r){let s=Object.values(t).filter(d=>d.visible===!1).map(d=>d.id);return{camera:e??void 0,hidden:s,selected:r?.id??null}}function zt({cameraState:e,setCameraState:t,objectBindings:r,onObjectBindingsChange:s,selectedObjectBinding:d,setSelectedObjectBinding:b,paramKey:g="view",debounceMs:p=400,autoSync:j=!0}){let V=Q(null),y=Q(null),h=Q(null),x=Q(null),A=Q(null),v=se(()=>{A.current!==null&&(window.clearTimeout(A.current),A.current=null),h.current=null,x.current=null},[]),I=se(()=>{let a=tt(e,r,d);return`${g}=${encodeURIComponent(JSON.stringify(a))}`},[e,r,d,g]),E=se(()=>{let a=new URL(window.location.href);return a.hash=I(),a.toString()},[I]),f=se(a=>{let m=new URL(window.location.href);m.hash=a,window.history.replaceState(null,"",m.toString()),y.current=a,V.current=new URLSearchParams(m.hash.slice(1)).get(g)},[g]),C=se(()=>{v(),f(I())},[I,v,f]),M=Q({cameraState:e,objectBindings:r,selectedObjectBinding:d});M.current={cameraState:e,objectBindings:r,selectedObjectBinding:d};let[B,D]=_t(!1);Ie(()=>{if(!j||!B){v();return}let a=M.current,m=tt(a.cameraState,a.objectBindings,a.selectedObjectBinding),O=`${g}=${encodeURIComponent(JSON.stringify(m))}`;if(O===y.current){v();return}O===h.current&&p===x.current||(v(),h.current=O,x.current=p,A.current=window.setTimeout(()=>{A.current=null,h.current=null,x.current=null,f(O)},Math.max(0,p)))},[j,e,v,p,r,g,B,d,f]),Ie(()=>v,[v]);let H=Q(null),o=Q(null),u=se(async()=>{D(!0);let a=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash,m=new URLSearchParams(a).get(g);if(!m)return H.current=null,!1;if(m===V.current||m===H.current||m===o.current)return!1;let O;try{O=JSON.parse(m)}catch{return!1}let L=Nt(O);if(!L)return!1;o.current=m;try{if(L.camera&&await t(L.camera,!1),L.hidden){let U=new Set(L.hidden);s(Object.fromEntries(Object.entries(r).map(([$,W])=>[$,{...W,visible:!U.has(W.id)}])))}if(L.selected!==void 0){let U=L.selected?N(r,L.selected):null;b(U?r[U]:null)}return H.current=m,!0}finally{o.current===m&&(o.current=null)}},[r,s,g,t,b]);return Ie(()=>{let a=()=>{u().catch(()=>{})};return window.addEventListener("hashchange",a),()=>{window.removeEventListener("hashchange",a)}},[u]),{getShareUrl:E,syncUrl:C,restoreFromUrl:u}}export{ct as ACTION_CATALOG,le as DEFAULT_SCENE_CONFIG,pt as MATERIAL_BLENDING_MODES,mt as MATERIAL_SIDES,at as MODEL_VIEWER_PRESETS,We as ModelViewer,ft as buildBindingsFromNodes,ut as createDefaultBinding,gt as defineObjectBindings,lt as findCatalogAction,dt as inferType,ye as material,re as patchBindings,Ve as patchSceneConfig,Ce as sceneLight,ee as selectBindingKeys,we as selectBindings,Ht as useObjectBinding,Ft as useObjectBindingIds,je as useObjectBindings,Se as useSceneConfig,zt as useShareableViewerState,It as useViewer,ve as useViewerActions,Oe as useViewerAnimations,he as useViewerCamera,Me as useViewerConnection,Pe as useViewerEffects,Ee as useViewerHover,Te as useViewerModel,Le as useViewerSelection};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liveroom-tech/react-immersive",
3
- "version": "5.0.0",
3
+ "version": "5.0.1",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",