@liveroom-tech/react-immersive 4.3.0 → 4.3.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/hosted.mjs CHANGED
@@ -1 +1 @@
1
- "use client";import{n as e,q as r}from"./chunk-GYB4BOVW.mjs";import"./chunk-K7DMBJBJ.mjs";import"./chunk-JR557W27.mjs";import{jsx as d}from"react/jsx-runtime";function o(i){return d(e,{...i})}export{r as HostedBindingBuilder,o as HostedModelViewer};
1
+ "use client";import{n as e,q as r}from"./chunk-IUALYWYG.mjs";import"./chunk-K7DMBJBJ.mjs";import"./chunk-JR557W27.mjs";import{jsx as t}from"react/jsx-runtime";function o(i){return t(e,{...i})}export{r as ProjectBindingBuilder,o as ProjectModelViewer};
package/dist/index.d.mts CHANGED
@@ -11,7 +11,7 @@ import '@react-three/drei';
11
11
  import '@react-three/xr';
12
12
  import '@react-three/fiber';
13
13
 
14
- declare function ModelViewer(props: ModelViewerProps): react_jsx_runtime.JSX.Element;
14
+ declare function PublicModelViewer(props: ModelViewerProps): react_jsx_runtime.JSX.Element;
15
15
 
16
16
  declare function BindingBuilder(props: BindingBuilderProps): react_jsx_runtime.JSX.Element;
17
17
 
@@ -332,4 +332,4 @@ type ShareableViewerStateProps = {
332
332
  };
333
333
  declare function useShareableViewerState({ cameraState, setCameraState, objectBindings, onObjectBindingsChange, selectedObjectBinding, setSelectedObjectBinding, paramKey, debounceMs, autoSync, }: UseShareableViewerStateOptions): ShareableViewerStateProps;
334
334
 
335
- export { BindingBuilder, BindingBuilderProps, BindingEdit, CaptureImageOptions, type HiddenObjectsState, ModelFormat, ModelViewer, ModelViewerProps, ObjectActionEvent, ObjectBinding, ObjectBindingAction, ObjectBindingMaterial, ObjectBindingPatch, ObjectBindingTarget, ObjectBindingTextureChannel, ObjectBindingTextureSlot, ObjectBindingTransform, type ObjectBindingsController, type RuntimeMaterialPatch, type RuntimeMaterialRanges, type RuntimePointLightOptions, type RuntimePointLightPatch, type RuntimeTransformPatch, type RuntimeTransformRanges, SceneConfig, type SceneConfigController, SceneConfigPatch, type SceneConfigUpdate, SceneLight, SceneLightAttachment, type SceneLightInput, type SceneLightPatch, type SceneLightsController, SimpleModelViewer, type SimpleModelViewerProps, type UseViewerEffectsOptions, type ViewerActionAnimationController, type ViewerActionBindingsController, type ViewerActionCameraController, type ViewerActionSceneController, type ViewerActionsOptions, type ViewerActionsProps, ViewerAnimationsProps, ViewerCameraProps, ViewerCameraState, type ViewerConnectionController, type ViewerEffectChannels, type ViewerEffectEasing, type ViewerEffectRange, type ViewerEffectTarget, type ViewerEffectsController, type ViewerFlickerOptions, type ViewerLightEffectChannel, type ViewerMaterialEffectChannel, type ViewerModelBounds, type ViewerModelProps, type ViewerPulseOptions, type ViewerReadyConsumer, type ViewerReadyHandler, ViewerReadyState, type ViewerSelectionProps, type ViewerTimelineOptions, type ViewerTimelineStep, type ViewerTransformEffectChannel, type ViewerTransitionOptions, type ViewerVector3, useObjectBinding, useObjectBindingIds, useObjectBindings, useSceneConfig, useShareableViewerState, useViewerActions, useViewerConnection, useViewerEffects, useViewerHover, useViewerModel, useViewerSelection };
335
+ export { BindingBuilder, BindingBuilderProps, BindingEdit, CaptureImageOptions, type HiddenObjectsState, ModelFormat, PublicModelViewer as ModelViewer, ModelViewerProps, ObjectActionEvent, ObjectBinding, ObjectBindingAction, ObjectBindingMaterial, ObjectBindingPatch, ObjectBindingTarget, ObjectBindingTextureChannel, ObjectBindingTextureSlot, ObjectBindingTransform, type ObjectBindingsController, type RuntimeMaterialPatch, type RuntimeMaterialRanges, type RuntimePointLightOptions, type RuntimePointLightPatch, type RuntimeTransformPatch, type RuntimeTransformRanges, SceneConfig, type SceneConfigController, SceneConfigPatch, type SceneConfigUpdate, SceneLight, SceneLightAttachment, type SceneLightInput, type SceneLightPatch, type SceneLightsController, SimpleModelViewer, type SimpleModelViewerProps, type UseViewerEffectsOptions, type ViewerActionAnimationController, type ViewerActionBindingsController, type ViewerActionCameraController, type ViewerActionSceneController, type ViewerActionsOptions, type ViewerActionsProps, ViewerAnimationsProps, ViewerCameraProps, ViewerCameraState, type ViewerConnectionController, type ViewerEffectChannels, type ViewerEffectEasing, type ViewerEffectRange, type ViewerEffectTarget, type ViewerEffectsController, type ViewerFlickerOptions, type ViewerLightEffectChannel, type ViewerMaterialEffectChannel, type ViewerModelBounds, type ViewerModelProps, type ViewerPulseOptions, type ViewerReadyConsumer, type ViewerReadyHandler, ViewerReadyState, type ViewerSelectionProps, type ViewerTimelineOptions, type ViewerTimelineStep, type ViewerTransformEffectChannel, type ViewerTransitionOptions, type ViewerVector3, useObjectBinding, useObjectBindingIds, useObjectBindings, useSceneConfig, useShareableViewerState, useViewerActions, useViewerConnection, useViewerEffects, useViewerHover, useViewerModel, useViewerSelection };
package/dist/index.d.ts CHANGED
@@ -11,7 +11,7 @@ import '@react-three/drei';
11
11
  import '@react-three/xr';
12
12
  import '@react-three/fiber';
13
13
 
14
- declare function ModelViewer(props: ModelViewerProps): react_jsx_runtime.JSX.Element;
14
+ declare function PublicModelViewer(props: ModelViewerProps): react_jsx_runtime.JSX.Element;
15
15
 
16
16
  declare function BindingBuilder(props: BindingBuilderProps): react_jsx_runtime.JSX.Element;
17
17
 
@@ -332,4 +332,4 @@ type ShareableViewerStateProps = {
332
332
  };
333
333
  declare function useShareableViewerState({ cameraState, setCameraState, objectBindings, onObjectBindingsChange, selectedObjectBinding, setSelectedObjectBinding, paramKey, debounceMs, autoSync, }: UseShareableViewerStateOptions): ShareableViewerStateProps;
334
334
 
335
- export { BindingBuilder, BindingBuilderProps, BindingEdit, CaptureImageOptions, type HiddenObjectsState, ModelFormat, ModelViewer, ModelViewerProps, ObjectActionEvent, ObjectBinding, ObjectBindingAction, ObjectBindingMaterial, ObjectBindingPatch, ObjectBindingTarget, ObjectBindingTextureChannel, ObjectBindingTextureSlot, ObjectBindingTransform, type ObjectBindingsController, type RuntimeMaterialPatch, type RuntimeMaterialRanges, type RuntimePointLightOptions, type RuntimePointLightPatch, type RuntimeTransformPatch, type RuntimeTransformRanges, SceneConfig, type SceneConfigController, SceneConfigPatch, type SceneConfigUpdate, SceneLight, SceneLightAttachment, type SceneLightInput, type SceneLightPatch, type SceneLightsController, SimpleModelViewer, type SimpleModelViewerProps, type UseViewerEffectsOptions, type ViewerActionAnimationController, type ViewerActionBindingsController, type ViewerActionCameraController, type ViewerActionSceneController, type ViewerActionsOptions, type ViewerActionsProps, ViewerAnimationsProps, ViewerCameraProps, ViewerCameraState, type ViewerConnectionController, type ViewerEffectChannels, type ViewerEffectEasing, type ViewerEffectRange, type ViewerEffectTarget, type ViewerEffectsController, type ViewerFlickerOptions, type ViewerLightEffectChannel, type ViewerMaterialEffectChannel, type ViewerModelBounds, type ViewerModelProps, type ViewerPulseOptions, type ViewerReadyConsumer, type ViewerReadyHandler, ViewerReadyState, type ViewerSelectionProps, type ViewerTimelineOptions, type ViewerTimelineStep, type ViewerTransformEffectChannel, type ViewerTransitionOptions, type ViewerVector3, useObjectBinding, useObjectBindingIds, useObjectBindings, useSceneConfig, useShareableViewerState, useViewerActions, useViewerConnection, useViewerEffects, useViewerHover, useViewerModel, useViewerSelection };
335
+ export { BindingBuilder, BindingBuilderProps, BindingEdit, CaptureImageOptions, type HiddenObjectsState, ModelFormat, PublicModelViewer as ModelViewer, ModelViewerProps, ObjectActionEvent, ObjectBinding, ObjectBindingAction, ObjectBindingMaterial, ObjectBindingPatch, ObjectBindingTarget, ObjectBindingTextureChannel, ObjectBindingTextureSlot, ObjectBindingTransform, type ObjectBindingsController, type RuntimeMaterialPatch, type RuntimeMaterialRanges, type RuntimePointLightOptions, type RuntimePointLightPatch, type RuntimeTransformPatch, type RuntimeTransformRanges, SceneConfig, type SceneConfigController, SceneConfigPatch, type SceneConfigUpdate, SceneLight, SceneLightAttachment, type SceneLightInput, type SceneLightPatch, type SceneLightsController, SimpleModelViewer, type SimpleModelViewerProps, type UseViewerEffectsOptions, type ViewerActionAnimationController, type ViewerActionBindingsController, type ViewerActionCameraController, type ViewerActionSceneController, type ViewerActionsOptions, type ViewerActionsProps, ViewerAnimationsProps, ViewerCameraProps, ViewerCameraState, type ViewerConnectionController, type ViewerEffectChannels, type ViewerEffectEasing, type ViewerEffectRange, type ViewerEffectTarget, type ViewerEffectsController, type ViewerFlickerOptions, type ViewerLightEffectChannel, type ViewerMaterialEffectChannel, type ViewerModelBounds, type ViewerModelProps, type ViewerPulseOptions, type ViewerReadyConsumer, type ViewerReadyHandler, ViewerReadyState, type ViewerSelectionProps, type ViewerTimelineOptions, type ViewerTimelineStep, type ViewerTransformEffectChannel, type ViewerTransitionOptions, type ViewerVector3, useObjectBinding, useObjectBindingIds, useObjectBindings, useSceneConfig, useShareableViewerState, useViewerActions, useViewerConnection, useViewerEffects, useViewerHover, useViewerModel, useViewerSelection };
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- "use client";import{a as he,b as Ne,c as Ce,d as ze,e as ln,f as He}from"./chunk-7X37KAPE.mjs";import{a as nt,b as rt,c as it,d as ot,e as at,f as st,g as lt,h as ct,i as dt,j as pt,k as ut,l as gt,m as ft,n as mt,o as rn,p as on,q as bt}from"./chunk-GYB4BOVW.mjs";import{h as nn,i as ee,j as an,k as sn}from"./chunk-K7DMBJBJ.mjs";import"./chunk-JR557W27.mjs";var ht={licenseKey:!0,dracoDecoderPath:!0,ktx2TranscoderPath:!0,meshopt:!0},vt={licenseValidationUrl:!0,onObjectEditLeaseChange:!0};function wt(e,t){let n={};for(let r of Object.keys(t))r in e&&(n[r]=e[r]);return n}function yt(e,t){let n={...e};for(let r of Object.keys(t))delete n[r];return n}import{jsx as cn}from"react/jsx-runtime";function xt(e){return cn(mt,{...yt(e,vt)})}import{jsx as dn}from"react/jsx-runtime";function Ct(e){return dn(bt,{...wt(e,ht)})}import{useRef as ge,useState as K,useCallback as J,useEffect as te,useMemo as Re,Component as pn,Suspense as Fe}from"react";import{CameraControls as un,Environment as gn}from"@react-three/drei";import{useFrame as Rt,useThree as Se}from"@react-three/fiber";import{Canvas as fn}from"@react-three/fiber";import{Box3 as mn,MeshStandardMaterial as bn,PerspectiveCamera as hn,Vector3 as vn}from"three";import{SkeletonUtils as wn}from"three-stdlib";import{X as Xe,Check as Bt,Settings as yn,ChevronDown as xn,Boxes as Cn,Trash2 as Sn,Upload as Ke,AlertTriangle as Vn}from"lucide-react";import{Fragment as jt,jsx as s,jsxs as E}from"react/jsx-runtime";var St={color:"#93c5fd",intensity:.05},Mn=["apartment","city","dawn","forest","lobby","night","park","studio","sunset","warehouse"];function On(e){return!!(e&&"isMesh"in e&&e.isMesh)}function Vt(e,t){Array.isArray(e)?e.forEach(t):t(e)}function jn(e,t){if(!t)return;let n=t.camera;if(!(n instanceof hn))return;let r=new mn().setFromObject(e).getSize(new vn).length();!Number.isFinite(r)||r<=0||(n.near=r/100,n.far=r*100,n.updateProjectionMatrix(),t.maxDistance=r*10)}var $e=class extends pn{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n){this.props.onLoadError?.(n)}render(){return this.state.hasError?null:this.props.children}};function Rn({url:e,format:t,dracoDecoderPath:n,ktx2TranscoderPath:r,meshopt:a,hiddenKeys:v,selectedKey:f,panelHoveredKey:S,nodeRefsOut:w,onMeshesReady:j,onModelLoaded:M,onLoadProgress:R,onMeshClick:A,highlightOnHover:y}){let{scene:B}=dt(e,{dracoDecoderPath:n,ktx2TranscoderPath:r,meshopt:a},t,R),T=Se(l=>l.invalidate),{setCanvasCursor:F,restoreCanvasCursor:u}=gt(),[V,_]=K(null),x=Re(()=>wn.clone(B),[B]),I=Re(()=>{let l={};return x.traverse(b=>{if(!On(b))return;let k=b.name||b.uuid;l[k]={key:k,label:b.name||b.type,ref:b}}),l},[x]),H=Re(()=>{let l={};for(let[b,{ref:k}]of Object.entries(I)){let U=(Array.isArray(k.material)?k.material:[k.material]).map(D=>{let i=(pt(D)??new bn).clone();return i.userData.baseColor=i.color.clone(),i.userData.baseMap=i.map,i.userData.baseEmissive=i.emissive.clone(),i.userData.baseEmissiveMap=i.emissiveMap,i.userData.baseEmissiveIntensity=i.emissiveIntensity,i});l[b]=Array.isArray(k.material)?U:U[0]}return l},[I]);te(()=>()=>{Object.values(H).forEach(l=>Vt(l,b=>b.dispose()))},[H]);let c=ge(null);te(()=>{c.current!==e&&(c.current=e,x.updateWorldMatrix(!0,!0),ut(x),j(I),M(x))},[e,x,I,j,M]),te(()=>{let l=new AbortController;return ot(x,l.signal),()=>{l.abort(),at(x)}},[x]);let m=Re(()=>!rt(x),[x]);te(()=>{for(let[l,{ref:b}]of Object.entries(I))w.current[l]=b},[I,w]),te(()=>{!y&&V!==null&&(_(null),u())},[y,V,u]),te(()=>{for(let[l,{ref:b}]of Object.entries(I)){b.visible=!v.has(l);let k=H[l];if(!k)continue;b.material=k;let q=y&&V===l,U=y&&S===l;Vt(k,D=>{if(D.color.copy(D.userData.baseColor),D.map=D.userData.baseMap??null,D.emissive.copy(D.userData.baseEmissive),D.emissiveMap=D.userData.baseEmissiveMap??null,D.emissiveIntensity=D.userData.baseEmissiveIntensity,U||q){let de=!!D.userData.baseEmissiveMap;D.emissive.set(St.color),D.emissiveIntensity=de?D.userData.baseEmissiveIntensity:St.intensity}D.needsUpdate=!0})}T()},[I,H,V,f,S,y,v,T]);let p=l=>{let b=l;for(;b;){let k=b.name||b.uuid;if(I[k])return k;b=b.parent}return null},C=m?{onClick:l=>{let b=p(l.object);b&&(l.stopPropagation(),A(b))},...y?{onPointerOver:l=>{let b=p(l.object);b&&(l.stopPropagation(),F("pointer"),_(b))},onPointerOut:l=>{l.stopPropagation(),u(),_(null)}}:{}}:{};return s("primitive",{object:x,...C})}function Bn({scene:e,controlsRef:t,refitOnResize:n,onInitialFitComplete:r}){let a=ge(!1),v=Se(w=>w.invalidate),f=Se(w=>w.size),S=ge(null);return te(()=>{a.current=!1,v()},[v,e]),Rt(()=>{if(!a.current){if(!e||!t.current){v();return}a.current=!0,jn(e,t.current),t.current.fitToBox(e,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{}).finally(r)}}),te(()=>{if(!(!n||!a.current||!e||!t.current))return S.current&&clearTimeout(S.current),S.current=setTimeout(()=>{t.current?.fitToBox(e,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{}),v()},150),()=>{S.current&&clearTimeout(S.current)}},[f.width,f.height,n]),null}function _n({exposure:e}){let t=Se(r=>r.gl),n=Se(r=>r.invalidate);return te(()=>{t.toneMappingExposure=e,n()},[t,e,n]),null}function kn({enabled:e,controlsRef:t}){let n=Se(r=>r.invalidate);return Rt((r,a)=>{!e||!t.current||(t.current.rotate(a*.2,0,!1),n())}),null}function Be(e){return Array.from(e.types).includes("Files")}function Mt({label:e,checked:t,onChange:n}){return E("div",{className:"env-row",children:[s("span",{className:"env-row__label",children:e}),s("div",{className:"env-row__value",children:s("button",{className:"env-checkbox-btn",onClick:()=>n(!t),children:s("span",{className:`env-checkbox${t?" env-checkbox--checked":""}`,children:t&&s(Bt,{size:9,strokeWidth:2,color:"white"})})})})]})}function Ue({label:e,value:t,onChange:n}){return E("div",{className:"env-row",children:[s("span",{className:"env-row__label",children:e}),s("div",{className:"env-row__value",children:E("div",{className:"env-color-swatch",style:{background:t},children:[s("span",{className:"env-color-swatch__hex",children:t}),s("input",{type:"color",className:"env-color-swatch__input",value:t,onChange:r=>n(r.target.value)})]})})]})}function We({label:e,value:t,min:n,max:r,step:a,onChange:v}){return E("div",{className:"env-row",children:[s("span",{className:"env-row__label",children:e}),E("div",{className:"env-row__value env-row__value--slider",children:[s("input",{type:"range",className:"env-slider",min:n,max:r,step:a,value:t,onChange:f=>v(Number(f.target.value))}),s("span",{className:"env-slider__value",children:t.toFixed(2)})]})]})}function En({label:e,value:t,options:n,onChange:r}){return E("div",{className:"env-row",children:[s("span",{className:"env-row__label",children:e}),s("div",{className:"env-row__value",children:s("select",{className:"env-select",value:t,onChange:a=>r(a.target.value),children:n.map(a=>s("option",{value:a,children:a},a))})})]})}function Ot({title:e,children:t}){let[n,r]=K(!1);return E("div",{className:"env-section",children:[E("button",{className:"env-section__header",onClick:()=>r(a=>!a),children:[s(xn,{size:12,strokeWidth:2,className:`env-section__chevron${n?" env-section__chevron--collapsed":""}`}),s("span",{children:e})]}),!n&&s("div",{className:"env-section__body",children:t})]})}function Pn({isOpen:e,onToggle:t,settings:n,onChange:r}){return E("div",{className:`left-panel-wrapper ${e?"left-panel-wrapper--open":"left-panel-wrapper--closed"}`,children:[!e&&s("button",{className:"side-panel__open-btn side-panel__open-btn--left",onClick:()=>t(!0),children:s(yn,{size:20,strokeWidth:1.8})}),E("div",{className:`side-panel side-panel--left ${e?"side-panel--open-left":"side-panel--closed-left"}`,"aria-hidden":!e,children:[s("div",{className:"side-panel__header",children:E("div",{className:"side-panel__header-top",children:[s("span",{className:"side-panel__eyebrow",children:"Scene Settings"}),s("button",{className:"side-panel__close-btn",onClick:()=>t(!1),title:"Close",children:s(Xe,{size:12,strokeWidth:1.6})})]})}),E("div",{className:"env-controls",children:[E(Ot,{title:"Background",children:[s(Mt,{label:"Background",checked:n.backgroundEnabled,onChange:a=>r("backgroundEnabled",a)}),s(Ue,{label:"Background Color",value:n.backgroundColor,onChange:a=>r("backgroundColor",a)}),s(En,{label:"Environment",value:n.envPreset,options:Mn,onChange:a=>r("envPreset",a)}),s(Mt,{label:"Auto Rotate",checked:n.autoRotate,onChange:a=>r("autoRotate",a)})]}),E(Ot,{title:"Lighting",children:[s(We,{label:"Exposure",value:n.exposure,min:0,max:2,step:.05,onChange:a=>r("exposure",a)}),s(We,{label:"Ambient Light Intensity",value:n.ambientIntensity,min:0,max:3,step:.05,onChange:a=>r("ambientIntensity",a)}),s(Ue,{label:"Ambient Light Color",value:n.ambientColor,onChange:a=>r("ambientColor",a)}),s(We,{label:"Direct Light Intensity",value:n.directionalIntensity,min:0,max:5,step:.05,onChange:a=>r("directionalIntensity",a)}),s(Ue,{label:"Direct Light Color",value:n.directionalColor,onChange:a=>r("directionalColor",a)})]})]})]})]})}function Tn({meshKeys:e,hiddenKeys:t,selectedKey:n,isOpen:r,onToggle:a,onFocus:v,onHover:f,onToggleVisibility:S}){let[w,j]=K(""),[M,R]=K(null),A=Object.values(e).filter(y=>y.label.toLowerCase().includes(w.toLowerCase()));return E("div",{className:`right-panel-wrapper ${r?"right-panel-wrapper--open":"right-panel-wrapper--closed"}`,children:[!r&&s("button",{className:"side-panel__open-btn",onClick:()=>a(!0),children:s(Cn,{size:20,strokeWidth:1.8})}),E("div",{className:`side-panel ${r?"side-panel--open":"side-panel--closed"}`,"aria-hidden":!r,children:[E("div",{className:"side-panel__header",children:[E("div",{className:"side-panel__header-top",children:[s("span",{className:"side-panel__eyebrow",children:"SCENE OBJECTS"}),s("button",{className:"side-panel__close-btn",onClick:()=>a(!1),title:"Close",children:s(Xe,{size:12,strokeWidth:1.6})})]}),E("p",{className:"side-panel__title",children:[A.length," objects"]})]}),s("div",{className:"side-panel__search-wrap",children:s("input",{className:"side-panel__search",type:"text",placeholder:"Search objects",value:w,onChange:y=>j(y.target.value)})}),s("div",{className:"side-panel__list",children:A.map(({key:y,label:B})=>{let T=!t.has(y),F=n===y,u=M===y;return E("div",{onClick:()=>v(y),onMouseEnter:()=>{R(y),f(y)},onMouseLeave:()=>{R(null),f(null)},className:["side-panel__row",u?"side-panel__row--hovered":"",F?"side-panel__row--selected":""].filter(Boolean).join(" "),children:[s("span",{className:`side-panel__label${u||F?" side-panel__label--hovered":""}`,children:B}),s("button",{className:"side-panel__vis-btn",title:T?"Hide":"Show",onClick:V=>{V.stopPropagation(),S(y)},children:s("span",{className:`side-panel__checkbox${T?" side-panel__checkbox--checked":""}`,children:T&&s(Bt,{size:9,strokeWidth:5,color:"white"})})})]},y)})})]})]})}function _t({modelUrl:e,modelFormat:t,dracoDecoderPath:n,ktx2TranscoderPath:r,meshopt:a=!0,backgroundColor:v="#1a1a1a",showSceneObjectsPanel:f=!0,showSceneSettingsPanel:S=!0,enableModelUpload:w=!1,zoomOnSelected:j=!1,highlightOnHover:M=!1,showLoadingOverlay:R=!0,refitOnResize:A=!0,backgroundEnabled:y=!1,autoRotate:B=!1,envPreset:T="city",exposure:F=1,ambientIntensity:u=.6,ambientColor:V="#ffffff",directionalIntensity:_=1.2,directionalColor:x="#ffffff",onModelLoaded:I,onLoadError:H}){let c=ge(null),m=ge({}),p=ge(null),C=ge(null),l=ge(0),[b,k]=K(null),[q,U]=K(null),[D,de]=K(!1),[i,o]=K({}),[g,d]=K(new Set),[O,L]=K(null),[P,N]=K(null),[Y,G]=K(null),[pe,se]=K(null),[re,W]=K(!1),[Q,le]=K(!1),[ce,me]=K(!1),[oe,ve]=K(null),[Ae,be]=K(!1),[ie,Le]=K(()=>typeof window>"u"?!0:window.innerWidth>900),[je,Kt]=K(()=>typeof window>"u"?!0:window.innerWidth>900),[Z,Ie]=K({backgroundEnabled:y,backgroundColor:v,autoRotate:B,envPreset:T,exposure:F,ambientIntensity:u,ambientColor:V,directionalIntensity:_,directionalColor:x}),ue=w?Y:e,we=J(()=>{k(null),U(null),de(!1),o({}),d(new Set),L(null),N(null),W(!1),me(!1),ve(null)},[]),ye=J(()=>{C.current?.cleanup(),C.current=null},[]),Ut=J(()=>{ye(),G(null),se(null),we(),Ie({backgroundEnabled:y,backgroundColor:v,autoRotate:B,envPreset:T,exposure:F,ambientIntensity:u,ambientColor:V,directionalIntensity:_,directionalColor:x})},[V,u,B,v,y,x,_,T,F,we,ye]),et=J(async h=>{le(!0);try{let $=await ct(h);ye(),C.current=$,G($.url),se($.name),we()}catch($){W(!0),H?.($)}finally{le(!1)}},[H,we,ye]),De=J(h=>{let $=h?.[0];$&&et($)},[et]);te(()=>()=>{ye()},[ye]);let Wt=J((h,$)=>{Ie(xe=>({...xe,[h]:$}))},[]);te(()=>{Ie(h=>({...h,backgroundColor:v}))},[v]),te(()=>{we()},[ue,we]);let $t=J(h=>{o(h),d(new Set),L(null)},[]),Xt=J(h=>{k(h),W(!1);let $=it(h);U($>nt?$:null),de(!1),ve(null),I?.(h)},[I]),Gt=J(h=>{W(!0),ve(null),H?.(h)},[H]),qt=J(h=>{h.lengthComputable&&h.total>0&&ve(h.loaded/h.total*100)},[]),tt=J(h=>{if(L(h),!j)return;let $=m.current[h];!$||!c.current||c.current.fitToBox($,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[j]),Jt=J(h=>{d($=>{let xe=new Set($);return xe.has(h)?xe.delete(h):xe.add(h),xe})},[]),Yt=J(h=>{!w||!Be(h.dataTransfer)||(h.preventDefault(),h.stopPropagation(),l.current+=1,be(!0))},[w]),Qt=J(h=>{!w||!Be(h.dataTransfer)||(h.preventDefault(),h.stopPropagation(),h.dataTransfer.dropEffect="copy",be(!0))},[w]),Zt=J(h=>{!w||!Be(h.dataTransfer)||(h.preventDefault(),h.stopPropagation(),l.current=Math.max(0,l.current-1),l.current===0&&be(!1))},[w]),en=J(h=>{!w||!Be(h.dataTransfer)||(h.preventDefault(),h.stopPropagation(),l.current=0,be(!1),De(h.dataTransfer.files))},[w,De]),tn=R&&(Q||!!(ue&&!re&&(!b||!ce)));return E("div",{className:"smv-root",style:{background:Z.backgroundColor},onDragEnter:Yt,onDragOver:Qt,onDragLeave:Zt,onDrop:en,children:[S&&ue&&s(Pn,{isOpen:je,onToggle:Kt,settings:Z,onChange:Wt}),E("div",{className:"smv-canvasArea",children:[q!==null&&!D&&E("div",{className:"smv-largeModelBanner",children:[s(Vn,{size:14,className:"smv-largeModelBanner__icon"}),E("span",{children:["Very large model detected (",Math.round(q/1e6),"M triangles) \u2014 it may render and move slowly on this device, and click/hover selection on the model is disabled. Use the scene objects panel to select parts."]}),s("button",{type:"button",className:"smv-largeModelBanner__dismiss",onClick:()=>de(!0),"aria-label":"Dismiss",children:s(Xe,{size:12})})]}),w?E(jt,{children:[s("input",{ref:p,type:"file",accept:lt,className:"smv-upload-input",onChange:h=>{De(h.target.files),h.currentTarget.value=""}}),ue?s("div",{className:"smv-upload-toolbar",children:E(jt,{children:[s("span",{className:"smv-upload-toolbar__name",children:pe??"Uploaded model"}),E("button",{type:"button",className:"smv-upload-toolbar__button smv-upload-toolbar__button--ghost",onClick:Ut,children:[s(Sn,{size:14}),"Clear"]})]})}):null]}):null,ue?s(fn,{dpr:[1,2],frameloop:"demand",resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:{background:Z.backgroundColor},camera:{position:[0,0,5],fov:45,near:.1,far:1e3},children:E(Fe,{fallback:null,children:[s("ambientLight",{intensity:Z.ambientIntensity,color:Z.ambientColor}),s("directionalLight",{position:[-4,5,7],intensity:Z.directionalIntensity,color:Z.directionalColor,castShadow:!0}),s("directionalLight",{position:[-5,5,5],intensity:.5}),s(Fe,{fallback:null,children:s(gn,{preset:Z.envPreset,background:Z.backgroundEnabled})}),s(_n,{exposure:Z.exposure}),s(kn,{enabled:Z.autoRotate,controlsRef:c}),s($e,{onLoadError:Gt,children:s(Fe,{fallback:null,children:s(Rn,{url:ue,format:Y?void 0:t,dracoDecoderPath:n,ktx2TranscoderPath:r,meshopt:a,hiddenKeys:g,selectedKey:O,panelHoveredKey:P,nodeRefsOut:m,onMeshesReady:$t,onModelLoaded:Xt,onLoadProgress:qt,onMeshClick:tt,highlightOnHover:M})})},ue),s(Bn,{scene:b,controlsRef:c,refitOnResize:A,onInitialFitComplete:()=>me(!0)}),s(un,{ref:c,makeDefault:!0,smoothTime:.3})]})}):s("div",{className:"smv-upload-empty-state",style:{background:Z.backgroundColor},children:E("div",{className:"smv-upload-empty-state__card",children:[s("div",{className:"smv-upload-empty-state__icon",children:s(Ke,{size:24})}),E("p",{className:"smv-upload-empty-state__body",children:["Drag and drop ",s("code",{children:".glb"}),", ",s("code",{children:".gltf"}),","," ",s("code",{children:".obj"}),", ",s("code",{children:".fbx"}),", ",s("code",{children:".usdz"}),", or"," ",s("code",{children:".zip"})," here"]}),E("button",{type:"button",className:"smv-upload-empty-state__button",onClick:()=>p.current?.click(),children:[s(Ke,{size:15}),"Choose model"]})]})}),s(ft,{visible:tn,message:"Loading model...",progress:Q?void 0:oe??void 0}),w&&Ae?s("div",{className:"smv-upload-drop-overlay",children:E("div",{className:"smv-upload-drop-overlay__card",children:[s(Ke,{size:20}),s("span",{children:"Release to load your model"})]})}):null]}),f&&ue&&s(Tn,{meshKeys:i,hiddenKeys:g,selectedKey:O,isOpen:ie,onToggle:Le,onFocus:tt,onHover:N,onToggleVisibility:Jt})]})}import{useCallback as kt,useState as An}from"react";function Ln(e=null){let[t,n]=An(e),r=kt(v=>{n(v)},[n]),a=kt(()=>{n(null)},[]);return{selectedObjectBinding:t,setSelectedObjectBinding:n,handleObjectSelect:r,clearSelection:a}}import{useMemo as In}from"react";function Dn(e,t){return In(()=>{if(!t)return null;let n=e[t];return n||(Object.values(e).find(r=>r.id===t||r.modelObjectId===t)??null)},[e,t])}import{useMemo as Nn}from"react";function zn(e){return Nn(()=>Object.values(e).map(t=>t.modelObjectId),[e])}import{useCallback as X,useMemo as Et,useState as Hn}from"react";var Pt={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 Tt(e){if(e)return Object.fromEntries(Object.entries(e).map(([t,n])=>[t,n&&typeof n=="object"?{...n}:n]))}function Fn(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t.visible===!1).map(([t])=>[t,!0]))}function Kn(e){let[t,n]=Hn(e),r=X((c,m)=>{n(p=>m===void 0?Ce(p,c):Ce(p,c,m))},[]),a=X((c,m)=>r(c,ze(m)),[r]),v=X((c,m)=>a(c,{baseColor:m}),[a]),f=X((c,m,p="baseColor")=>{let C=Pt[p],l=typeof m=="string"?{path:m}:m;r(c,{style:{material:{[C]:l}}})},[r]),S=X((c,m="baseColor")=>{let p=Pt[m];r(c,{style:{material:{[p]:void 0}}})},[r]),w=X((c,m)=>{n(p=>{let C=ee(p,c);if(!C)return p;let l=Tt(p[C]?.style?.material),b=he(p,m);if(b.length===0)return p;let k=p;for(let q of b){let U=p[q];U&&(k===p&&(k={...p}),k[q]={...U,style:{...U.style,material:Tt(l)}})}return k})},[]),j=X(c=>r(c,{style:{material:void 0}}),[r]),M=X((c,m)=>r(c,{transform:m}),[r]),R=X(c=>r(c,{transform:void 0}),[r]),A=X((c,m)=>r(c,{metadata:m}),[r]),y=X(c=>Ne(t,c),[t]),B=X(c=>he(t,c).map(m=>t[m]?.id??m),[t]),T=X(c=>{let m=ee(t,c);return m?t[m]?.style?.material??null:null},[t]),F=X(c=>r(c,{visible:!1}),[r]),u=X(c=>r(c,{visible:!0}),[r]),V=X(c=>{n(m=>{let p=he(m,c).reduce((C,l)=>{let b=m[l];return b&&C.push({ids:l,patch:{visible:b.visible===!1}}),C},[]);return Ce(m,p)})},[n]),_=X(()=>{n(c=>Ce(c,Object.keys(c),{visible:!0}))},[n]),x=Et(()=>Fn(t),[t]),I=Et(()=>Object.keys(x).map(c=>t[c]?.id??c),[x,t]),H=X(c=>{let m=ee(t,c);return m?t[m]?.visible===!1:!1},[t]);return{objectBindings:t,setObjectBindings:n,updateObjectBindings:r,setMaterial:a,setBaseColor:v,setTexture:f,clearTexture:S,copyMaterial:w,resetMaterial:j,getMaterial:T,setTransform:M,resetTransform:R,updateMetadata:A,selectObjectBindings:y,selectObjectBindingIds:B,hiddenObjects:x,hiddenObjectIds:I,hideObject:F,showObject:u,toggleObjectVisibility:V,isObjectHidden:H,clearHiddenObjects:_}}import{useCallback as ne,useMemo as Un,useRef as Wn,useState as $n}from"react";var Xn={type:"point",color:"#ffffff",intensity:1,position:[0,0,0],distance:0,decay:2,attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0};function Gn(e){let t=Wn(null),[n,r]=$n(()=>{let u=typeof e=="function"?e():e;return t.current=u,u}),a=ne(u=>{r(V=>{let _=typeof u=="function"?u(V):u;return He(V,_)})},[]),v=ne(()=>{let u=t.current;u&&r(u)},[]),f=ne((u,V)=>{a(_=>({lighting:{lights:_.lighting.lights.map(x=>x.id===u?{...x,...V}:x)}}))},[a]),S=ne(u=>{a(V=>V.lighting.lights.some(_=>_.id===u.id)?{}:{lighting:{lights:[...V.lighting.lights,{...Xn,...u}]}})},[a]),w=ne(u=>{a(V=>({lighting:{lights:V.lighting.lights.filter(_=>_.id!==u)}}))},[a]),j=ne((u,V)=>f(u,{intensity:V}),[f]),M=ne((u,V)=>f(u,{color:V}),[f]),R=ne(u=>f(u,{visible:!0}),[f]),A=ne(u=>f(u,{visible:!1}),[f]),y=ne(u=>{a(V=>({lighting:{lights:V.lighting.lights.map(_=>_.id===u?{..._,visible:!_.visible}:_)}}))},[a]),B=ne((u,V)=>f(u,{attachment:V,attachedToCamera:!1}),[f]),T=ne(u=>f(u,{attachment:void 0}),[f]),F=Un(()=>({items:n.lighting.lights,get:u=>n.lighting.lights.find(V=>V.id===u),add:S,update:f,remove:w,setIntensity:j,setColor:M,show:R,hide:A,toggle:y,attach:B,detach:T}),[n.lighting.lights,S,f,w,j,M,R,A,y,B,T]);return{sceneConfig:n,setSceneConfig:r,updateSceneConfig:a,resetSceneConfig:v,lights:F}}import{useCallback as qn,useState as Jn}from"react";function Yn(){let[e,t]=Jn(null),n=qn(r=>{t(r)},[t]);return{hoveredObjectBinding:e,handleHoveredObject:n}}import{useCallback as Ge,useState as Me}from"react";import{Box3 as Qn,Vector3 as At}from"three";function _e(e){return[e.x,e.y,e.z]}function Zn(){let[e,t]=Me(!0),[n,r]=Me(!1),[a,v]=Me(null),[f,S]=Me(null),[w,j]=Me(0),M=Ge(y=>{let B=new Qn().setFromObject(y),T=B.min.clone(),F=B.max.clone(),u=new At,V=new At,_=0;y.traverse(x=>{"isMesh"in x&&x.isMesh&&(_+=1)}),B.getCenter(u),B.getSize(V),S({min:_e(T),max:_e(F),center:_e(u),size:_e(V)}),j(_),v(null),t(!1),r(!0)},[]),R=Ge(y=>{v(y),S(null),j(0),t(!1),r(!1)},[]),A=Ge(()=>{t(!0),r(!1),v(null),S(null),j(0)},[]);return{isLoading:e,isReady:n,error:a,bounds:f,objectCount:w,handleModelLoaded:M,handleLoadError:R,resetModelState:A}}import{useCallback as qe}from"react";function er({bindings:e,scene:t,camera:n,animations:r,onAction:a}){let{objectBindings:v,updateObjectBindings:f,showObject:S,hideObject:w,toggleObjectVisibility:j}=e,M=t?.updateSceneConfig,R=n?.focusObject,A=n?.fitScene,y=n?.resetView,B=n?.setCameraTarget,T=n?.setCameraState,F=r?.play,u=r?.pause,V=r?.stop,_=r?.setSpeed,x=r?.seek,I=qe(m=>{let p=ee(v,m);return p?v[p]?.actions??[]:[]},[v]),H=qe(async m=>{for(let p of m.action.effects??[]){if("objectBindings"in p){f(p.target,p.objectBindings);continue}if("sceneConfig"in p){M?.(p.sceneConfig);continue}if("visibility"in p){p.visibility==="show"?S(p.target):p.visibility==="hide"?w(p.target):j(p.target);continue}if("camera"in p){let l=p.camera;l.type==="focus-object"?await R?.(l.objectId??m.objectId):l.type==="fit-scene"?await A?.():l.type==="reset"?await y?.():l.type==="set-target"?await B?.(l.target,l.transition??!0):await T?.(l.state,l.transition??!0);continue}let C=p.animation;C.type==="play"?F?.(C.clip):C.type==="pause"?u?.():C.type==="stop"?V?.():C.type==="set-speed"?_?.(C.speed):x?.(C.time)}await a?.(m)},[A,R,w,a,u,F,y,x,_,T,B,S,V,j,f,M]),c=qe(async(m,p)=>{let C=ee(v,m);if(!C)return null;let l=v[C],b=l?.actions?.find(q=>q.id===p);if(!l||!b)return null;let k={objectId:C,action:b,binding:l};return await H(k),k},[H,v]);return{getActionsForObject:I,handleAction:H,runAction:c}}import{useCallback as ke,useRef as Lt}from"react";function tr(e){return typeof e=="function"?e:e?.handleViewerReady??null}function nr(...e){let t=Lt(null),n=Lt(e);n.current=e;let r=ke(S=>{t.current=S;let w=new Set;for(let j of n.current){let M=tr(j);M&&!w.has(M)&&(w.add(M),M(S))}},[]),a=ke(()=>t.current,[]),v=ke(S=>{let w=t.current;return w?w.captureImage(S):Promise.reject(new Error("ModelViewer is not ready yet."))},[]),f=ke(()=>{let S=t.current;return S?(S.invalidate(),!0):!1},[]);return{handleViewerReady:r,getViewer:a,captureImage:v,invalidate:f}}import{useCallback as z,useEffect as rr,useRef as ae}from"react";import{Material as ir,PointLight as or,Vector3 as ar}from"three";var Qe=["emissiveIntensity","opacity","metalness","roughness","transmission","clearcoat","clearcoatRoughness","ior","thickness"],Ee=1;function Pe(e){return typeof e=="string"?[e]:e}function Te(e,t=0,n=1){return Math.min(n,Math.max(t,e))}function Je(e,t){return e+Math.random()*(t-e)}function It([e,t],n){return e+(t-e)*n}function Ye([e,t],n){return[e[0]+(t[0]-e[0])*n,e[1]+(t[1]-e[1])*n,e[2]+(t[2]-e[2])*n]}function Dt(e,t){let n=Te(e);switch(t){case"ease-in":return n*n;case"ease-out":return 1-(1-n)*(1-n);case"ease-in-out":return n<.5?2*n*n:1-Math.pow(-2*n+2,2)/2;default:return n}}function sr(e){let t=e.material;return t?(Array.isArray(t)?t:[t]).filter(n=>n instanceof ir):[]}function lr(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 n of Qe){let r=e[n];typeof r=="number"&&(t[n]=r)}return t}function Nt(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 n of Qe){let r=t[n];r!==void 0&&typeof e[n]=="number"&&(e[n]=r)}t.transparent!==void 0&&(e.transparent=t.transparent),e.needsUpdate=!0}function cr(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 dr(e,t){if(t.position&&e.position.set(...t.position),t.rotation&&e.rotation.set(...t.rotation),t.scale!==void 0){let n=typeof t.scale=="number"?[t.scale,t.scale,t.scale]:t.scale;e.scale.set(...n)}t.visible!==void 0&&(e.visible=t.visible),e.updateMatrix(),e.updateMatrixWorld(!0)}function pr(e={}){let t=ae(e);t.current=e;let n=ae(null),r=ae(null),a=ae(null),v=ae(new Map),f=ae(new Map),S=ae(new Map),w=ae(new Map),j=z(i=>{let o=n.current;if(!o)return null;let g=ee(o.objectBindings,i);return o.nodeRefs[i]??(g?o.nodeRefs[g]:null)??(o.scene?st(o.scene,i):null)??null},[]),M=z(i=>{let o=n.current;return o?typeof i=="object"&&!Array.isArray(i)?he(o.objectBindings,i):Pe(i).map(g=>ee(o.objectBindings,g)??g):typeof i=="string"?[i]:Array.isArray(i)?i:[]},[]),R=z(()=>{n.current?.invalidate()},[]),A=z((i,o)=>{let g=!1;for(let d of M(i)){let O=j(d);if(O)for(let L of sr(O))S.current.has(L)||S.current.set(L,lr(L)),Nt(L,o),g=!0}return g},[j,M]),y=z((i,o)=>{let g=A(i,o);return g&&R(),g},[R,A]),B=z((i,o)=>{let g=!1;for(let d of M(i)){let O=j(d);O&&(w.current.has(O)||w.current.set(O,cr(O)),dr(O,o),g=!0)}return g},[j,M]),T=z((i,o)=>{let g=B(i,o);return g&&R(),g},[R,B]),F=z(i=>{let o=j(i);if(!o)return null;o.updateWorldMatrix(!0,!1);let g=o.getWorldPosition(new ar);return[g.x,g.y,g.z]},[j]),u=z(i=>{let o=f.current.get(i);return o?(o.light.removeFromParent(),o.light.dispose(),f.current.delete(i),R(),!0):!1},[R]),V=z(i=>{let o=j(i.target);if(!o)return!1;let g=f.current.get(i.id),d=g?.light??new or;return g&&g.target!==i.target&&d.removeFromParent(),d.name=`react-immersive-runtime-light:${i.id}`,d.color.set(i.color??"#ffffff"),d.intensity=i.intensity??1,d.distance=i.distance??0,d.decay=i.decay??2,d.castShadow=i.castShadow??!1,d.position.set(...i.offset??[0,0,0]),d.parent!==o&&o.add(d),f.current.set(i.id,{light:d,target:i.target}),R(),!0},[R,j]),_=z((i,o)=>{let g=f.current.get(i);if(!g)return!1;if(o.target&&o.target!==g.target){let d=j(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),R(),!0},[R,j]),x=z((i,o)=>{let g=d=>o[d%o.length]??0;for(let d of i.materials??[])M(d.targets).forEach((O,L)=>{let P=g(L),N={};for(let Y of Qe){let G=d.values[Y];G&&(N[Y]=It(G,P))}A(O,N)});for(let d of i.transforms??[])M(d.targets).forEach((O,L)=>{let P=g(L),N={};d.values.position&&(N.position=Ye(d.values.position,P)),d.values.rotation&&(N.rotation=Ye(d.values.rotation,P)),d.values.scale&&(N.scale=Ye(d.values.scale,P)),B(O,N)});for(let d of i.lights??[])Pe(d.lights).forEach((O,L)=>{let P=f.current.get(O);P&&(P.light.intensity=It(d.intensity,g(L)))})},[M,A,B]),I=ae(()=>{}),H=ae(()=>{});H.current=i=>{a.current=null;let o=!1;for(let[g,d]of v.current){d.startedAt===null&&(d.startedAt=i);let O=d.lastFrameAt??i;d.lastFrameAt=i;let L=d.override&&d.override.until>i?d.override.level:null;d.override&&L===null&&(d.override=null);let P=d.update(i,i-d.startedAt,Math.min(100,i-O),L);o=!0,P||(v.current.delete(g),d.onComplete?.())}o&&R(),v.current.size>0&&I.current()},I.current=()=>{a.current!==null||typeof requestAnimationFrame>"u"||(a.current=requestAnimationFrame(i=>H.current(i)))};let c=z(i=>(v.current.set(i.id,i),I.current(),i.id),[]),m=z((i,o={})=>{let g=o.id??`transition-${Ee++}`,d=Math.max(1,o.duration??400),O=o.easing??"ease-in-out";return c({id:g,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(L,P,N,Y)=>{let G=Y??Dt(P/d,O);return x(i,[G]),P<d}})},[x,c]),p=z((i,o={})=>{let g=o.id??`pulse-${Ee++}`,d=Math.max(1,o.duration??1e3),O=o.minLevel??0,L=o.maxLevel??1,P=o.repeat??1/0,N=o.synchronized??!0,Y=Math.max(1,...[...i.materials??[],...i.transforms??[]].map(G=>M(G.targets).length),...(i.lights??[]).map(G=>Pe(G.lights).length));return c({id:g,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(G,pe,se,re)=>{let W=pe/d,Q=Array.from({length:N?1:Y},(le,ce)=>{if(re!==null)return re;let me=W+(N?0:ce/Y),oe=.5-Math.cos(me%1*Math.PI*2)/2;return O+(L-O)*oe});return x(i,Q),P===1/0||W<P}})},[x,c,M]),C=z((i,o={})=>{let g=o.id??`timeline-${Ee++}`,d=o.repeat??1,O=i.map(P=>({...P,duration:Math.max(1,P.duration),hold:Math.max(0,P.hold??0)})),L=Math.max(1,O.reduce((P,N)=>P+N.duration+N.hold,0));return c({id:g,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(P,N,Y,G)=>{if(O.length===0||d<=0)return!1;let pe=N/L;if(d!==1/0&&pe>=d){for(let W of O)x(W.channels,[1]);return!1}let se=N%L,re=0;for(let W of O){let Q=re+W.duration,le=Q+W.hold;if(se>=Q){x(W.channels,[G??1]),re=le;continue}if(se>=re){let ce=G??Dt((se-re)/W.duration,W.easing??"ease-in-out");x(W.channels,[ce]);break}}return!0}})},[x,c]),l=z((i,o={})=>{let g=o.id??`flicker-${Ee++}`,d=o.synchronized??!0,O=o.minLevel??.15,L=o.maxLevel??1,P=o.interval??[45,160],N=typeof P=="number"?[P,P]:P,Y=[Math.max(1,Math.min(...N)),Math.max(1,Math.max(...N))],G=Te(o.response??.7,.01,1),pe=Te(o.blackoutChance??.08),se=Te(o.flashChance??.12),re=o.flashLevel??1.15,W=Math.max(1,...[...i.materials??[],...i.transforms??[]].map(oe=>M(oe.targets).length),...(i.lights??[]).map(oe=>Pe(oe.lights).length)),Q=d?1:W,le=Array.from({length:Q},()=>O),ce=Array.from({length:Q},()=>O),me=Array.from({length:Q},()=>0);return c({id:g,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(oe,ve,Ae,be)=>{for(let ie=0;ie<Q;ie+=1){if(be!==null)ce[ie]=be;else if(oe>=me[ie]){let je=Math.random();ce[ie]=je<pe?Je(0,Math.min(.04,O)):je<pe+se?re:Je(O,L),me[ie]=oe+Je(...Y)}let Le=1-Math.pow(1-G,Math.max(1,Ae)/16.67);le[ie]+=(ce[ie]-le[ie])*Le}return x(i,le),o.duration===void 0||ve<o.duration}})},[x,c,M]),b=z((i,o,g)=>{let d=v.current.get(i);if(!d)return!1;let O=typeof performance>"u"?Date.now():performance.now();return d.override={level:o,until:O+Math.max(0,g)},I.current(),!0},[]),k=z(i=>v.current.delete(i),[]),q=z(()=>{v.current.clear(),a.current!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(a.current),a.current=null)},[]),U=z(()=>{for(let[i,o]of S.current)Nt(i,o);S.current.clear();for(let[i,o]of w.current)i.position.set(...o.position),i.rotation.set(...o.rotation),i.scale.set(...o.scale),i.visible=o.visible,i.updateMatrix(),i.updateMatrixWorld(!0);w.current.clear();for(let i of f.current.values())i.light.removeFromParent(),i.light.dispose();f.current.clear(),R()},[R]),D=z(()=>{q(),U()},[U,q]),de=z(i=>{r.current&&r.current!==i.scene&&U(),n.current=i,r.current=i.scene,t.current.onViewerReady?.(i)},[U]);return rr(()=>()=>{D(),n.current=null,r.current=null},[D]),{handleViewerReady:de,setMaterial:y,setTransform:T,getWorldPosition:F,addPointLight:V,updatePointLight:_,removePointLight:u,transition:m,timeline:C,pulse:p,flicker:l,overrideEffect:b,stopEffect:k,stopAllEffects:q,resetRuntime:D}}import{useCallback as Ve,useEffect as Ze,useRef as fe,useState as ur}from"react";function Ft(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Oe(e){return typeof e=="number"&&Number.isFinite(e)}function zt(e){return Array.isArray(e)&&e.length===3&&e.every(Oe)}function gr(e){return!Ft(e)||!zt(e.position)||!zt(e.target)||e.fov!==null&&!Oe(e.fov)||!Oe(e.zoom)||e.zoom<=0||e.azimuthAngle!==void 0&&!Oe(e.azimuthAngle)||e.polarAngle!==void 0&&!Oe(e.polarAngle)?null:{position:e.position,target:e.target,fov:e.fov,zoom:e.zoom,azimuthAngle:e.azimuthAngle,polarAngle:e.polarAngle}}function fr(e){if(!Ft(e))return null;let t;if(e.camera!==void 0){let a=gr(e.camera);if(!a)return null;t=a}let n;if(e.hidden!==void 0){if(!Array.isArray(e.hidden)||!e.hidden.every(a=>typeof a=="string"))return null;n=e.hidden}let r;if(e.selected===null||typeof e.selected=="string")r=e.selected;else if(e.selected!==void 0)return null;return{camera:t,hidden:n,selected:r}}function Ht(e,t,n){let r=Object.values(t).filter(a=>a.visible===!1).map(a=>a.id);return{camera:e??void 0,hidden:r,selected:n?.id??null}}function mr({cameraState:e,setCameraState:t,objectBindings:n,onObjectBindingsChange:r,selectedObjectBinding:a,setSelectedObjectBinding:v,paramKey:f="view",debounceMs:S=400,autoSync:w=!0}){let j=fe(null),M=fe(null),R=fe(null),A=fe(null),y=fe(null),B=Ve(()=>{y.current!==null&&(window.clearTimeout(y.current),y.current=null),R.current=null,A.current=null},[]),T=Ve(()=>{let p=Ht(e,n,a);return`${f}=${encodeURIComponent(JSON.stringify(p))}`},[e,n,a,f]),F=Ve(()=>{let p=new URL(window.location.href);return p.hash=T(),p.toString()},[T]),u=Ve(p=>{let C=new URL(window.location.href);C.hash=p,window.history.replaceState(null,"",C.toString()),M.current=p,j.current=new URLSearchParams(C.hash.slice(1)).get(f)},[f]),V=Ve(()=>{B(),u(T())},[T,B,u]),_=fe({cameraState:e,objectBindings:n,selectedObjectBinding:a});_.current={cameraState:e,objectBindings:n,selectedObjectBinding:a};let[x,I]=ur(!1);Ze(()=>{if(!w||!x){B();return}let p=_.current,C=Ht(p.cameraState,p.objectBindings,p.selectedObjectBinding),l=`${f}=${encodeURIComponent(JSON.stringify(C))}`;if(l===M.current){B();return}l===R.current&&S===A.current||(B(),R.current=l,A.current=S,y.current=window.setTimeout(()=>{y.current=null,R.current=null,A.current=null,u(l)},Math.max(0,S)))},[w,e,B,S,n,f,x,a,u]),Ze(()=>B,[B]);let H=fe(null),c=fe(null),m=Ve(async()=>{I(!0);let p=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash,C=new URLSearchParams(p).get(f);if(!C)return H.current=null,!1;if(C===j.current||C===H.current||C===c.current)return!1;let l;try{l=JSON.parse(C)}catch{return!1}let b=fr(l);if(!b)return!1;c.current=C;try{if(b.camera&&await t(b.camera,!1),b.hidden){let k=new Set(b.hidden);r(Object.fromEntries(Object.entries(n).map(([q,U])=>[q,{...U,visible:!k.has(U.id)}])))}if(b.selected!==void 0){let k=b.selected?ee(n,b.selected):null;v(k?n[k]:null)}return H.current=C,!0}finally{c.current===C&&(c.current=null)}},[n,r,f,t,v]);return Ze(()=>{let p=()=>{m().catch(()=>{})};return window.addEventListener("hashchange",p),()=>{window.removeEventListener("hashchange",p)}},[m]),{getShareUrl:F,syncUrl:V,restoreFromUrl:m}}export{Ct as BindingBuilder,nn as DEFAULT_SCENE_CONFIG,sn as MATERIAL_BLENDING_MODES,an as MATERIAL_SIDES,xt as ModelViewer,_t as SimpleModelViewer,ln as defineObjectBindings,ze as material,Ce as patchBindings,He as patchSceneConfig,he as selectBindingKeys,Ne as selectBindings,Dn as useObjectBinding,zn as useObjectBindingIds,Kn as useObjectBindings,Gn as useSceneConfig,mr as useShareableViewerState,er as useViewerActions,on as useViewerAnimations,rn as useViewerCamera,nr as useViewerConnection,pr as useViewerEffects,Yn as useViewerHover,Zn as useViewerModel,Ln as useViewerSelection};
1
+ "use client";import{a as he,b as De,c as Ce,d as ze,e as ln,f as Fe}from"./chunk-7X37KAPE.mjs";import{a as nt,b as rt,c as it,d as ot,e as at,f as st,g as lt,h as ct,i as dt,j as pt,k as ut,l as gt,m as ft,n as mt,o as rn,p as on,q as bt}from"./chunk-IUALYWYG.mjs";import{h as nn,i as ee,j as an,k as sn}from"./chunk-K7DMBJBJ.mjs";import"./chunk-JR557W27.mjs";var ht={licenseKey:!0,dracoDecoderPath:!0,ktx2TranscoderPath:!0,meshopt:!0},vt={licenseValidationUrl:!0,onObjectEditLeaseChange:!0};function wt(e,t){let n={};for(let r of Object.keys(t))r in e&&(n[r]=e[r]);return n}function yt(e,t){let n={...e};for(let r of Object.keys(t))delete n[r];return n}import{jsx as cn}from"react/jsx-runtime";function xt(e){return cn(mt,{...yt(e,vt)})}import{jsx as dn}from"react/jsx-runtime";function Ct(e){return dn(bt,{...wt(e,ht)})}import{useRef as ge,useState as K,useCallback as q,useEffect as te,useMemo as Re,Component as pn,Suspense as He}from"react";import{CameraControls as un,Environment as gn}from"@react-three/drei";import{useFrame as Rt,useThree as Se}from"@react-three/fiber";import{Canvas as fn}from"@react-three/fiber";import{Box3 as mn,MeshStandardMaterial as bn,PerspectiveCamera as hn,Vector3 as vn}from"three";import{SkeletonUtils as wn}from"three-stdlib";import{X as Xe,Check as Bt,Settings as yn,ChevronDown as xn,Boxes as Cn,Trash2 as Sn,Upload as Ke,AlertTriangle as Vn}from"lucide-react";import{Fragment as jt,jsx as s,jsxs as P}from"react/jsx-runtime";var St={color:"#93c5fd",intensity:.05},Mn=["apartment","city","dawn","forest","lobby","night","park","studio","sunset","warehouse"];function On(e){return!!(e&&"isMesh"in e&&e.isMesh)}function Vt(e,t){Array.isArray(e)?e.forEach(t):t(e)}function jn(e,t){if(!t)return;let n=t.camera;if(!(n instanceof hn))return;let r=new mn().setFromObject(e).getSize(new vn).length();!Number.isFinite(r)||r<=0||(n.near=r/100,n.far=r*100,n.updateProjectionMatrix(),t.maxDistance=r*10)}var $e=class extends pn{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n){this.props.onLoadError?.(n)}render(){return this.state.hasError?null:this.props.children}};function Rn({url:e,format:t,dracoDecoderPath:n,ktx2TranscoderPath:r,meshopt:a,hiddenKeys:v,selectedKey:f,panelHoveredKey:S,nodeRefsOut:w,onMeshesReady:j,onModelLoaded:M,onLoadProgress:R,onMeshClick:A,highlightOnHover:y}){let{scene:B}=dt(e,{dracoDecoderPath:n,ktx2TranscoderPath:r,meshopt:a},t,R),T=Se(l=>l.invalidate),{setCanvasCursor:H,restoreCanvasCursor:u}=gt(),[V,_]=K(null),x=Re(()=>wn.clone(B),[B]),I=Re(()=>{let l={};return x.traverse(b=>{if(!On(b))return;let k=b.name||b.uuid;l[k]={key:k,label:b.name||b.type,ref:b}}),l},[x]),F=Re(()=>{let l={};for(let[b,{ref:k}]of Object.entries(I)){let U=(Array.isArray(k.material)?k.material:[k.material]).map(N=>{let i=(pt(N)??new bn).clone();return i.userData.baseColor=i.color.clone(),i.userData.baseMap=i.map,i.userData.baseEmissive=i.emissive.clone(),i.userData.baseEmissiveMap=i.emissiveMap,i.userData.baseEmissiveIntensity=i.emissiveIntensity,i});l[b]=Array.isArray(k.material)?U:U[0]}return l},[I]);te(()=>()=>{Object.values(F).forEach(l=>Vt(l,b=>b.dispose()))},[F]);let c=ge(null);te(()=>{c.current!==e&&(c.current=e,x.updateWorldMatrix(!0,!0),ut(x),j(I),M(x))},[e,x,I,j,M]),te(()=>{let l=new AbortController;return ot(x,l.signal),()=>{l.abort(),at(x)}},[x]);let m=Re(()=>!rt(x),[x]);te(()=>{for(let[l,{ref:b}]of Object.entries(I))w.current[l]=b},[I,w]),te(()=>{!y&&V!==null&&(_(null),u())},[y,V,u]),te(()=>{for(let[l,{ref:b}]of Object.entries(I)){b.visible=!v.has(l);let k=F[l];if(!k)continue;b.material=k;let J=y&&V===l,U=y&&S===l;Vt(k,N=>{if(N.color.copy(N.userData.baseColor),N.map=N.userData.baseMap??null,N.emissive.copy(N.userData.baseEmissive),N.emissiveMap=N.userData.baseEmissiveMap??null,N.emissiveIntensity=N.userData.baseEmissiveIntensity,U||J){let de=!!N.userData.baseEmissiveMap;N.emissive.set(St.color),N.emissiveIntensity=de?N.userData.baseEmissiveIntensity:St.intensity}N.needsUpdate=!0})}T()},[I,F,V,f,S,y,v,T]);let p=l=>{let b=l;for(;b;){let k=b.name||b.uuid;if(I[k])return k;b=b.parent}return null},C=m?{onClick:l=>{let b=p(l.object);b&&(l.stopPropagation(),A(b))},...y?{onPointerOver:l=>{let b=p(l.object);b&&(l.stopPropagation(),H("pointer"),_(b))},onPointerOut:l=>{l.stopPropagation(),u(),_(null)}}:{}}:{};return s("primitive",{object:x,...C})}function Bn({scene:e,controlsRef:t,refitOnResize:n,onInitialFitComplete:r}){let a=ge(!1),v=Se(w=>w.invalidate),f=Se(w=>w.size),S=ge(null);return te(()=>{a.current=!1,v()},[v,e]),Rt(()=>{if(!a.current){if(!e||!t.current){v();return}a.current=!0,jn(e,t.current),t.current.fitToBox(e,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{}).finally(r)}}),te(()=>{if(!(!n||!a.current||!e||!t.current))return S.current&&clearTimeout(S.current),S.current=setTimeout(()=>{t.current?.fitToBox(e,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{}),v()},150),()=>{S.current&&clearTimeout(S.current)}},[f.width,f.height,n]),null}function _n({exposure:e}){let t=Se(r=>r.gl),n=Se(r=>r.invalidate);return te(()=>{t.toneMappingExposure=e,n()},[t,e,n]),null}function kn({enabled:e,controlsRef:t}){let n=Se(r=>r.invalidate);return Rt((r,a)=>{!e||!t.current||(t.current.rotate(a*.2,0,!1),n())}),null}function Be(e){return Array.from(e.types).includes("Files")}function Mt({label:e,checked:t,onChange:n}){return P("div",{className:"env-row",children:[s("span",{className:"env-row__label",children:e}),s("div",{className:"env-row__value",children:s("button",{className:"env-checkbox-btn",onClick:()=>n(!t),children:s("span",{className:`env-checkbox${t?" env-checkbox--checked":""}`,children:t&&s(Bt,{size:9,strokeWidth:2,color:"white"})})})})]})}function Ue({label:e,value:t,onChange:n}){return P("div",{className:"env-row",children:[s("span",{className:"env-row__label",children:e}),s("div",{className:"env-row__value",children:P("div",{className:"env-color-swatch",style:{background:t},children:[s("span",{className:"env-color-swatch__hex",children:t}),s("input",{type:"color",className:"env-color-swatch__input",value:t,onChange:r=>n(r.target.value)})]})})]})}function We({label:e,value:t,min:n,max:r,step:a,onChange:v}){return P("div",{className:"env-row",children:[s("span",{className:"env-row__label",children:e}),P("div",{className:"env-row__value env-row__value--slider",children:[s("input",{type:"range",className:"env-slider",min:n,max:r,step:a,value:t,onChange:f=>v(Number(f.target.value))}),s("span",{className:"env-slider__value",children:t.toFixed(2)})]})]})}function Pn({label:e,value:t,options:n,onChange:r}){return P("div",{className:"env-row",children:[s("span",{className:"env-row__label",children:e}),s("div",{className:"env-row__value",children:s("select",{className:"env-select",value:t,onChange:a=>r(a.target.value),children:n.map(a=>s("option",{value:a,children:a},a))})})]})}function Ot({title:e,children:t}){let[n,r]=K(!1);return P("div",{className:"env-section",children:[P("button",{className:"env-section__header",onClick:()=>r(a=>!a),children:[s(xn,{size:12,strokeWidth:2,className:`env-section__chevron${n?" env-section__chevron--collapsed":""}`}),s("span",{children:e})]}),!n&&s("div",{className:"env-section__body",children:t})]})}function En({isOpen:e,onToggle:t,settings:n,onChange:r}){return P("div",{className:`left-panel-wrapper ${e?"left-panel-wrapper--open":"left-panel-wrapper--closed"}`,children:[!e&&s("button",{className:"side-panel__open-btn side-panel__open-btn--left",onClick:()=>t(!0),children:s(yn,{size:20,strokeWidth:1.8})}),P("div",{className:`side-panel side-panel--left ${e?"side-panel--open-left":"side-panel--closed-left"}`,"aria-hidden":!e,children:[s("div",{className:"side-panel__header",children:P("div",{className:"side-panel__header-top",children:[s("span",{className:"side-panel__eyebrow",children:"Scene Settings"}),s("button",{className:"side-panel__close-btn",onClick:()=>t(!1),title:"Close",children:s(Xe,{size:12,strokeWidth:1.6})})]})}),P("div",{className:"env-controls",children:[P(Ot,{title:"Background",children:[s(Mt,{label:"Background",checked:n.backgroundEnabled,onChange:a=>r("backgroundEnabled",a)}),s(Ue,{label:"Background Color",value:n.backgroundColor,onChange:a=>r("backgroundColor",a)}),s(Pn,{label:"Environment",value:n.envPreset,options:Mn,onChange:a=>r("envPreset",a)}),s(Mt,{label:"Auto Rotate",checked:n.autoRotate,onChange:a=>r("autoRotate",a)})]}),P(Ot,{title:"Lighting",children:[s(We,{label:"Exposure",value:n.exposure,min:0,max:2,step:.05,onChange:a=>r("exposure",a)}),s(We,{label:"Ambient Light Intensity",value:n.ambientIntensity,min:0,max:3,step:.05,onChange:a=>r("ambientIntensity",a)}),s(Ue,{label:"Ambient Light Color",value:n.ambientColor,onChange:a=>r("ambientColor",a)}),s(We,{label:"Direct Light Intensity",value:n.directionalIntensity,min:0,max:5,step:.05,onChange:a=>r("directionalIntensity",a)}),s(Ue,{label:"Direct Light Color",value:n.directionalColor,onChange:a=>r("directionalColor",a)})]})]})]})]})}function Tn({meshKeys:e,hiddenKeys:t,selectedKey:n,isOpen:r,onToggle:a,onFocus:v,onHover:f,onToggleVisibility:S}){let[w,j]=K(""),[M,R]=K(null),A=Object.values(e).filter(y=>y.label.toLowerCase().includes(w.toLowerCase()));return P("div",{className:`right-panel-wrapper ${r?"right-panel-wrapper--open":"right-panel-wrapper--closed"}`,children:[!r&&s("button",{className:"side-panel__open-btn",onClick:()=>a(!0),children:s(Cn,{size:20,strokeWidth:1.8})}),P("div",{className:`side-panel ${r?"side-panel--open":"side-panel--closed"}`,"aria-hidden":!r,children:[P("div",{className:"side-panel__header",children:[P("div",{className:"side-panel__header-top",children:[s("span",{className:"side-panel__eyebrow",children:"SCENE OBJECTS"}),s("button",{className:"side-panel__close-btn",onClick:()=>a(!1),title:"Close",children:s(Xe,{size:12,strokeWidth:1.6})})]}),P("p",{className:"side-panel__title",children:[A.length," objects"]})]}),s("div",{className:"side-panel__search-wrap",children:s("input",{className:"side-panel__search",type:"text",placeholder:"Search objects",value:w,onChange:y=>j(y.target.value)})}),s("div",{className:"side-panel__list",children:A.map(({key:y,label:B})=>{let T=!t.has(y),H=n===y,u=M===y;return P("div",{onClick:()=>v(y),onMouseEnter:()=>{R(y),f(y)},onMouseLeave:()=>{R(null),f(null)},className:["side-panel__row",u?"side-panel__row--hovered":"",H?"side-panel__row--selected":""].filter(Boolean).join(" "),children:[s("span",{className:`side-panel__label${u||H?" side-panel__label--hovered":""}`,children:B}),s("button",{className:"side-panel__vis-btn",title:T?"Hide":"Show",onClick:V=>{V.stopPropagation(),S(y)},children:s("span",{className:`side-panel__checkbox${T?" side-panel__checkbox--checked":""}`,children:T&&s(Bt,{size:9,strokeWidth:5,color:"white"})})})]},y)})})]})]})}function _t({modelUrl:e,modelFormat:t,dracoDecoderPath:n,ktx2TranscoderPath:r,meshopt:a=!0,backgroundColor:v="#1a1a1a",showSceneObjectsPanel:f=!0,showSceneSettingsPanel:S=!0,enableModelUpload:w=!1,zoomOnSelected:j=!1,highlightOnHover:M=!1,showLoadingOverlay:R=!0,refitOnResize:A=!0,backgroundEnabled:y=!1,autoRotate:B=!1,envPreset:T="city",exposure:H=1,ambientIntensity:u=.6,ambientColor:V="#ffffff",directionalIntensity:_=1.2,directionalColor:x="#ffffff",onModelLoaded:I,onLoadError:F}){let c=ge(null),m=ge({}),p=ge(null),C=ge(null),l=ge(0),[b,k]=K(null),[J,U]=K(null),[N,de]=K(!1),[i,o]=K({}),[g,d]=K(new Set),[O,L]=K(null),[E,D]=K(null),[Y,G]=K(null),[pe,se]=K(null),[re,W]=K(!1),[Q,le]=K(!1),[ce,me]=K(!1),[oe,ve]=K(null),[Ae,be]=K(!1),[ie,Le]=K(()=>typeof window>"u"?!0:window.innerWidth>900),[je,Kt]=K(()=>typeof window>"u"?!0:window.innerWidth>900),[Z,Ie]=K({backgroundEnabled:y,backgroundColor:v,autoRotate:B,envPreset:T,exposure:H,ambientIntensity:u,ambientColor:V,directionalIntensity:_,directionalColor:x}),ue=w?Y:e,we=q(()=>{k(null),U(null),de(!1),o({}),d(new Set),L(null),D(null),W(!1),me(!1),ve(null)},[]),ye=q(()=>{C.current?.cleanup(),C.current=null},[]),Ut=q(()=>{ye(),G(null),se(null),we(),Ie({backgroundEnabled:y,backgroundColor:v,autoRotate:B,envPreset:T,exposure:H,ambientIntensity:u,ambientColor:V,directionalIntensity:_,directionalColor:x})},[V,u,B,v,y,x,_,T,H,we,ye]),et=q(async h=>{le(!0);try{let $=await ct(h);ye(),C.current=$,G($.url),se($.name),we()}catch($){W(!0),F?.($)}finally{le(!1)}},[F,we,ye]),Ne=q(h=>{let $=h?.[0];$&&et($)},[et]);te(()=>()=>{ye()},[ye]);let Wt=q((h,$)=>{Ie(xe=>({...xe,[h]:$}))},[]);te(()=>{Ie(h=>({...h,backgroundColor:v}))},[v]),te(()=>{we()},[ue,we]);let $t=q(h=>{o(h),d(new Set),L(null)},[]),Xt=q(h=>{k(h),W(!1);let $=it(h);U($>nt?$:null),de(!1),ve(null),I?.(h)},[I]),Gt=q(h=>{W(!0),ve(null),F?.(h)},[F]),Jt=q(h=>{h.lengthComputable&&h.total>0&&ve(h.loaded/h.total*100)},[]),tt=q(h=>{if(L(h),!j)return;let $=m.current[h];!$||!c.current||c.current.fitToBox($,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[j]),qt=q(h=>{d($=>{let xe=new Set($);return xe.has(h)?xe.delete(h):xe.add(h),xe})},[]),Yt=q(h=>{!w||!Be(h.dataTransfer)||(h.preventDefault(),h.stopPropagation(),l.current+=1,be(!0))},[w]),Qt=q(h=>{!w||!Be(h.dataTransfer)||(h.preventDefault(),h.stopPropagation(),h.dataTransfer.dropEffect="copy",be(!0))},[w]),Zt=q(h=>{!w||!Be(h.dataTransfer)||(h.preventDefault(),h.stopPropagation(),l.current=Math.max(0,l.current-1),l.current===0&&be(!1))},[w]),en=q(h=>{!w||!Be(h.dataTransfer)||(h.preventDefault(),h.stopPropagation(),l.current=0,be(!1),Ne(h.dataTransfer.files))},[w,Ne]),tn=R&&(Q||!!(ue&&!re&&(!b||!ce)));return P("div",{className:"smv-root",style:{background:Z.backgroundColor},onDragEnter:Yt,onDragOver:Qt,onDragLeave:Zt,onDrop:en,children:[S&&ue&&s(En,{isOpen:je,onToggle:Kt,settings:Z,onChange:Wt}),P("div",{className:"smv-canvasArea",children:[J!==null&&!N&&P("div",{className:"smv-largeModelBanner",children:[s(Vn,{size:14,className:"smv-largeModelBanner__icon"}),P("span",{children:["Very large model detected (",Math.round(J/1e6),"M triangles) \u2014 it may render and move slowly on this device, and click/hover selection on the model is disabled. Use the scene objects panel to select parts."]}),s("button",{type:"button",className:"smv-largeModelBanner__dismiss",onClick:()=>de(!0),"aria-label":"Dismiss",children:s(Xe,{size:12})})]}),w?P(jt,{children:[s("input",{ref:p,type:"file",accept:lt,className:"smv-upload-input",onChange:h=>{Ne(h.target.files),h.currentTarget.value=""}}),ue?s("div",{className:"smv-upload-toolbar",children:P(jt,{children:[s("span",{className:"smv-upload-toolbar__name",children:pe??"Uploaded model"}),P("button",{type:"button",className:"smv-upload-toolbar__button smv-upload-toolbar__button--ghost",onClick:Ut,children:[s(Sn,{size:14}),"Clear"]})]})}):null]}):null,ue?s(fn,{dpr:[1,2],frameloop:"demand",resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:{background:Z.backgroundColor},camera:{position:[0,0,5],fov:45,near:.1,far:1e3},children:P(He,{fallback:null,children:[s("ambientLight",{intensity:Z.ambientIntensity,color:Z.ambientColor}),s("directionalLight",{position:[-4,5,7],intensity:Z.directionalIntensity,color:Z.directionalColor,castShadow:!0}),s("directionalLight",{position:[-5,5,5],intensity:.5}),s(He,{fallback:null,children:s(gn,{preset:Z.envPreset,background:Z.backgroundEnabled})}),s(_n,{exposure:Z.exposure}),s(kn,{enabled:Z.autoRotate,controlsRef:c}),s($e,{onLoadError:Gt,children:s(He,{fallback:null,children:s(Rn,{url:ue,format:Y?void 0:t,dracoDecoderPath:n,ktx2TranscoderPath:r,meshopt:a,hiddenKeys:g,selectedKey:O,panelHoveredKey:E,nodeRefsOut:m,onMeshesReady:$t,onModelLoaded:Xt,onLoadProgress:Jt,onMeshClick:tt,highlightOnHover:M})})},ue),s(Bn,{scene:b,controlsRef:c,refitOnResize:A,onInitialFitComplete:()=>me(!0)}),s(un,{ref:c,makeDefault:!0,smoothTime:.3})]})}):s("div",{className:"smv-upload-empty-state",style:{background:Z.backgroundColor},children:P("div",{className:"smv-upload-empty-state__card",children:[s("div",{className:"smv-upload-empty-state__icon",children:s(Ke,{size:24})}),P("p",{className:"smv-upload-empty-state__body",children:["Drag and drop ",s("code",{children:".glb"}),", ",s("code",{children:".gltf"}),","," ",s("code",{children:".obj"}),", ",s("code",{children:".fbx"}),", ",s("code",{children:".usdz"}),", or"," ",s("code",{children:".zip"})," here"]}),P("button",{type:"button",className:"smv-upload-empty-state__button",onClick:()=>p.current?.click(),children:[s(Ke,{size:15}),"Choose model"]})]})}),s(ft,{visible:tn,message:"Loading model...",progress:Q?void 0:oe??void 0}),w&&Ae?s("div",{className:"smv-upload-drop-overlay",children:P("div",{className:"smv-upload-drop-overlay__card",children:[s(Ke,{size:20}),s("span",{children:"Release to load your model"})]})}):null]}),f&&ue&&s(Tn,{meshKeys:i,hiddenKeys:g,selectedKey:O,isOpen:ie,onToggle:Le,onFocus:tt,onHover:D,onToggleVisibility:qt})]})}import{useCallback as kt,useState as An}from"react";function Ln(e=null){let[t,n]=An(e),r=kt(v=>{n(v)},[n]),a=kt(()=>{n(null)},[]);return{selectedObjectBinding:t,setSelectedObjectBinding:n,handleObjectSelect:r,clearSelection:a}}import{useMemo as In}from"react";function Nn(e,t){return In(()=>{if(!t)return null;let n=e[t];return n||(Object.values(e).find(r=>r.id===t||r.modelObjectId===t)??null)},[e,t])}import{useMemo as Dn}from"react";function zn(e){return Dn(()=>Object.values(e).map(t=>t.modelObjectId),[e])}import{useCallback as X,useMemo as Pt,useState as Fn}from"react";var Et={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 Tt(e){if(e)return Object.fromEntries(Object.entries(e).map(([t,n])=>[t,n&&typeof n=="object"?{...n}:n]))}function Hn(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t.visible===!1).map(([t])=>[t,!0]))}function Kn(e){let[t,n]=Fn(e),r=X((c,m)=>{n(p=>m===void 0?Ce(p,c):Ce(p,c,m))},[]),a=X((c,m)=>r(c,ze(m)),[r]),v=X((c,m)=>a(c,{baseColor:m}),[a]),f=X((c,m,p="baseColor")=>{let C=Et[p],l=typeof m=="string"?{path:m}:m;r(c,{style:{material:{[C]:l}}})},[r]),S=X((c,m="baseColor")=>{let p=Et[m];r(c,{style:{material:{[p]:void 0}}})},[r]),w=X((c,m)=>{n(p=>{let C=ee(p,c);if(!C)return p;let l=Tt(p[C]?.style?.material),b=he(p,m);if(b.length===0)return p;let k=p;for(let J of b){let U=p[J];U&&(k===p&&(k={...p}),k[J]={...U,style:{...U.style,material:Tt(l)}})}return k})},[]),j=X(c=>r(c,{style:{material:void 0}}),[r]),M=X((c,m)=>r(c,{transform:m}),[r]),R=X(c=>r(c,{transform:void 0}),[r]),A=X((c,m)=>r(c,{metadata:m}),[r]),y=X(c=>De(t,c),[t]),B=X(c=>he(t,c).map(m=>t[m]?.id??m),[t]),T=X(c=>{let m=ee(t,c);return m?t[m]?.style?.material??null:null},[t]),H=X(c=>r(c,{visible:!1}),[r]),u=X(c=>r(c,{visible:!0}),[r]),V=X(c=>{n(m=>{let p=he(m,c).reduce((C,l)=>{let b=m[l];return b&&C.push({ids:l,patch:{visible:b.visible===!1}}),C},[]);return Ce(m,p)})},[n]),_=X(()=>{n(c=>Ce(c,Object.keys(c),{visible:!0}))},[n]),x=Pt(()=>Hn(t),[t]),I=Pt(()=>Object.keys(x).map(c=>t[c]?.id??c),[x,t]),F=X(c=>{let m=ee(t,c);return m?t[m]?.visible===!1:!1},[t]);return{objectBindings:t,setObjectBindings:n,updateObjectBindings:r,setMaterial:a,setBaseColor:v,setTexture:f,clearTexture:S,copyMaterial:w,resetMaterial:j,getMaterial:T,setTransform:M,resetTransform:R,updateMetadata:A,selectObjectBindings:y,selectObjectBindingIds:B,hiddenObjects:x,hiddenObjectIds:I,hideObject:H,showObject:u,toggleObjectVisibility:V,isObjectHidden:F,clearHiddenObjects:_}}import{useCallback as ne,useMemo as Un,useRef as Wn,useState as $n}from"react";var Xn={type:"point",color:"#ffffff",intensity:1,position:[0,0,0],distance:0,decay:2,attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0};function Gn(e){let t=Wn(null),[n,r]=$n(()=>{let u=typeof e=="function"?e():e;return t.current=u,u}),a=ne(u=>{r(V=>{let _=typeof u=="function"?u(V):u;return Fe(V,_)})},[]),v=ne(()=>{let u=t.current;u&&r(u)},[]),f=ne((u,V)=>{a(_=>({lighting:{lights:_.lighting.lights.map(x=>x.id===u?{...x,...V}:x)}}))},[a]),S=ne(u=>{a(V=>V.lighting.lights.some(_=>_.id===u.id)?{}:{lighting:{lights:[...V.lighting.lights,{...Xn,...u}]}})},[a]),w=ne(u=>{a(V=>({lighting:{lights:V.lighting.lights.filter(_=>_.id!==u)}}))},[a]),j=ne((u,V)=>f(u,{intensity:V}),[f]),M=ne((u,V)=>f(u,{color:V}),[f]),R=ne(u=>f(u,{visible:!0}),[f]),A=ne(u=>f(u,{visible:!1}),[f]),y=ne(u=>{a(V=>({lighting:{lights:V.lighting.lights.map(_=>_.id===u?{..._,visible:!_.visible}:_)}}))},[a]),B=ne((u,V)=>f(u,{attachment:V,attachedToCamera:!1}),[f]),T=ne(u=>f(u,{attachment:void 0}),[f]),H=Un(()=>({items:n.lighting.lights,get:u=>n.lighting.lights.find(V=>V.id===u),add:S,update:f,remove:w,setIntensity:j,setColor:M,show:R,hide:A,toggle:y,attach:B,detach:T}),[n.lighting.lights,S,f,w,j,M,R,A,y,B,T]);return{sceneConfig:n,setSceneConfig:r,updateSceneConfig:a,resetSceneConfig:v,lights:H}}import{useCallback as Jn,useState as qn}from"react";function Yn(){let[e,t]=qn(null),n=Jn(r=>{t(r)},[t]);return{hoveredObjectBinding:e,handleHoveredObject:n}}import{useCallback as Ge,useState as Me}from"react";import{Box3 as Qn,Vector3 as At}from"three";function _e(e){return[e.x,e.y,e.z]}function Zn(){let[e,t]=Me(!0),[n,r]=Me(!1),[a,v]=Me(null),[f,S]=Me(null),[w,j]=Me(0),M=Ge(y=>{let B=new Qn().setFromObject(y),T=B.min.clone(),H=B.max.clone(),u=new At,V=new At,_=0;y.traverse(x=>{"isMesh"in x&&x.isMesh&&(_+=1)}),B.getCenter(u),B.getSize(V),S({min:_e(T),max:_e(H),center:_e(u),size:_e(V)}),j(_),v(null),t(!1),r(!0)},[]),R=Ge(y=>{v(y),S(null),j(0),t(!1),r(!1)},[]),A=Ge(()=>{t(!0),r(!1),v(null),S(null),j(0)},[]);return{isLoading:e,isReady:n,error:a,bounds:f,objectCount:w,handleModelLoaded:M,handleLoadError:R,resetModelState:A}}import{useCallback as Je}from"react";function er({bindings:e,scene:t,camera:n,animations:r,onAction:a}){let{objectBindings:v,updateObjectBindings:f,showObject:S,hideObject:w,toggleObjectVisibility:j}=e,M=t?.updateSceneConfig,R=n?.focusObject,A=n?.fitScene,y=n?.resetView,B=n?.setCameraTarget,T=n?.setCameraState,H=r?.play,u=r?.pause,V=r?.stop,_=r?.setSpeed,x=r?.seek,I=Je(m=>{let p=ee(v,m);return p?v[p]?.actions??[]:[]},[v]),F=Je(async m=>{for(let p of m.action.effects??[]){if("objectBindings"in p){f(p.target,p.objectBindings);continue}if("sceneConfig"in p){M?.(p.sceneConfig);continue}if("visibility"in p){p.visibility==="show"?S(p.target):p.visibility==="hide"?w(p.target):j(p.target);continue}if("camera"in p){let l=p.camera;l.type==="focus-object"?await R?.(l.objectId??m.objectId):l.type==="fit-scene"?await A?.():l.type==="reset"?await y?.():l.type==="set-target"?await B?.(l.target,l.transition??!0):await T?.(l.state,l.transition??!0);continue}let C=p.animation;C.type==="play"?H?.(C.clip):C.type==="pause"?u?.():C.type==="stop"?V?.():C.type==="set-speed"?_?.(C.speed):x?.(C.time)}await a?.(m)},[A,R,w,a,u,H,y,x,_,T,B,S,V,j,f,M]),c=Je(async(m,p)=>{let C=ee(v,m);if(!C)return null;let l=v[C],b=l?.actions?.find(J=>J.id===p);if(!l||!b)return null;let k={objectId:C,action:b,binding:l};return await F(k),k},[F,v]);return{getActionsForObject:I,handleAction:F,runAction:c}}import{useCallback as ke,useRef as Lt}from"react";function tr(e){return typeof e=="function"?e:e?.handleViewerReady??null}function nr(...e){let t=Lt(null),n=Lt(e);n.current=e;let r=ke(S=>{t.current=S;let w=new Set;for(let j of n.current){let M=tr(j);M&&!w.has(M)&&(w.add(M),M(S))}},[]),a=ke(()=>t.current,[]),v=ke(S=>{let w=t.current;return w?w.captureImage(S):Promise.reject(new Error("ModelViewer is not ready yet."))},[]),f=ke(()=>{let S=t.current;return S?(S.invalidate(),!0):!1},[]);return{handleViewerReady:r,getViewer:a,captureImage:v,invalidate:f}}import{useCallback as z,useEffect as rr,useRef as ae}from"react";import{Material as ir,PointLight as or,Vector3 as ar}from"three";var Qe=["emissiveIntensity","opacity","metalness","roughness","transmission","clearcoat","clearcoatRoughness","ior","thickness"],Pe=1;function Ee(e){return typeof e=="string"?[e]:e}function Te(e,t=0,n=1){return Math.min(n,Math.max(t,e))}function qe(e,t){return e+Math.random()*(t-e)}function It([e,t],n){return e+(t-e)*n}function Ye([e,t],n){return[e[0]+(t[0]-e[0])*n,e[1]+(t[1]-e[1])*n,e[2]+(t[2]-e[2])*n]}function Nt(e,t){let n=Te(e);switch(t){case"ease-in":return n*n;case"ease-out":return 1-(1-n)*(1-n);case"ease-in-out":return n<.5?2*n*n:1-Math.pow(-2*n+2,2)/2;default:return n}}function sr(e){let t=e.material;return t?(Array.isArray(t)?t:[t]).filter(n=>n instanceof ir):[]}function lr(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 n of Qe){let r=e[n];typeof r=="number"&&(t[n]=r)}return t}function Dt(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 n of Qe){let r=t[n];r!==void 0&&typeof e[n]=="number"&&(e[n]=r)}t.transparent!==void 0&&(e.transparent=t.transparent),e.needsUpdate=!0}function cr(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 dr(e,t){if(t.position&&e.position.set(...t.position),t.rotation&&e.rotation.set(...t.rotation),t.scale!==void 0){let n=typeof t.scale=="number"?[t.scale,t.scale,t.scale]:t.scale;e.scale.set(...n)}t.visible!==void 0&&(e.visible=t.visible),e.updateMatrix(),e.updateMatrixWorld(!0)}function pr(e={}){let t=ae(e);t.current=e;let n=ae(null),r=ae(null),a=ae(null),v=ae(new Map),f=ae(new Map),S=ae(new Map),w=ae(new Map),j=z(i=>{let o=n.current;if(!o)return null;let g=ee(o.objectBindings,i);return o.nodeRefs[i]??(g?o.nodeRefs[g]:null)??(o.scene?st(o.scene,i):null)??null},[]),M=z(i=>{let o=n.current;return o?typeof i=="object"&&!Array.isArray(i)?he(o.objectBindings,i):Ee(i).map(g=>ee(o.objectBindings,g)??g):typeof i=="string"?[i]:Array.isArray(i)?i:[]},[]),R=z(()=>{n.current?.invalidate()},[]),A=z((i,o)=>{let g=!1;for(let d of M(i)){let O=j(d);if(O)for(let L of sr(O))S.current.has(L)||S.current.set(L,lr(L)),Dt(L,o),g=!0}return g},[j,M]),y=z((i,o)=>{let g=A(i,o);return g&&R(),g},[R,A]),B=z((i,o)=>{let g=!1;for(let d of M(i)){let O=j(d);O&&(w.current.has(O)||w.current.set(O,cr(O)),dr(O,o),g=!0)}return g},[j,M]),T=z((i,o)=>{let g=B(i,o);return g&&R(),g},[R,B]),H=z(i=>{let o=j(i);if(!o)return null;o.updateWorldMatrix(!0,!1);let g=o.getWorldPosition(new ar);return[g.x,g.y,g.z]},[j]),u=z(i=>{let o=f.current.get(i);return o?(o.light.removeFromParent(),o.light.dispose(),f.current.delete(i),R(),!0):!1},[R]),V=z(i=>{let o=j(i.target);if(!o)return!1;let g=f.current.get(i.id),d=g?.light??new or;return g&&g.target!==i.target&&d.removeFromParent(),d.name=`react-immersive-runtime-light:${i.id}`,d.color.set(i.color??"#ffffff"),d.intensity=i.intensity??1,d.distance=i.distance??0,d.decay=i.decay??2,d.castShadow=i.castShadow??!1,d.position.set(...i.offset??[0,0,0]),d.parent!==o&&o.add(d),f.current.set(i.id,{light:d,target:i.target}),R(),!0},[R,j]),_=z((i,o)=>{let g=f.current.get(i);if(!g)return!1;if(o.target&&o.target!==g.target){let d=j(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),R(),!0},[R,j]),x=z((i,o)=>{let g=d=>o[d%o.length]??0;for(let d of i.materials??[])M(d.targets).forEach((O,L)=>{let E=g(L),D={};for(let Y of Qe){let G=d.values[Y];G&&(D[Y]=It(G,E))}A(O,D)});for(let d of i.transforms??[])M(d.targets).forEach((O,L)=>{let E=g(L),D={};d.values.position&&(D.position=Ye(d.values.position,E)),d.values.rotation&&(D.rotation=Ye(d.values.rotation,E)),d.values.scale&&(D.scale=Ye(d.values.scale,E)),B(O,D)});for(let d of i.lights??[])Ee(d.lights).forEach((O,L)=>{let E=f.current.get(O);E&&(E.light.intensity=It(d.intensity,g(L)))})},[M,A,B]),I=ae(()=>{}),F=ae(()=>{});F.current=i=>{a.current=null;let o=!1;for(let[g,d]of v.current){d.startedAt===null&&(d.startedAt=i);let O=d.lastFrameAt??i;d.lastFrameAt=i;let L=d.override&&d.override.until>i?d.override.level:null;d.override&&L===null&&(d.override=null);let E=d.update(i,i-d.startedAt,Math.min(100,i-O),L);o=!0,E||(v.current.delete(g),d.onComplete?.())}o&&R(),v.current.size>0&&I.current()},I.current=()=>{a.current!==null||typeof requestAnimationFrame>"u"||(a.current=requestAnimationFrame(i=>F.current(i)))};let c=z(i=>(v.current.set(i.id,i),I.current(),i.id),[]),m=z((i,o={})=>{let g=o.id??`transition-${Pe++}`,d=Math.max(1,o.duration??400),O=o.easing??"ease-in-out";return c({id:g,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(L,E,D,Y)=>{let G=Y??Nt(E/d,O);return x(i,[G]),E<d}})},[x,c]),p=z((i,o={})=>{let g=o.id??`pulse-${Pe++}`,d=Math.max(1,o.duration??1e3),O=o.minLevel??0,L=o.maxLevel??1,E=o.repeat??1/0,D=o.synchronized??!0,Y=Math.max(1,...[...i.materials??[],...i.transforms??[]].map(G=>M(G.targets).length),...(i.lights??[]).map(G=>Ee(G.lights).length));return c({id:g,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(G,pe,se,re)=>{let W=pe/d,Q=Array.from({length:D?1:Y},(le,ce)=>{if(re!==null)return re;let me=W+(D?0:ce/Y),oe=.5-Math.cos(me%1*Math.PI*2)/2;return O+(L-O)*oe});return x(i,Q),E===1/0||W<E}})},[x,c,M]),C=z((i,o={})=>{let g=o.id??`timeline-${Pe++}`,d=o.repeat??1,O=i.map(E=>({...E,duration:Math.max(1,E.duration),hold:Math.max(0,E.hold??0)})),L=Math.max(1,O.reduce((E,D)=>E+D.duration+D.hold,0));return c({id:g,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(E,D,Y,G)=>{if(O.length===0||d<=0)return!1;let pe=D/L;if(d!==1/0&&pe>=d){for(let W of O)x(W.channels,[1]);return!1}let se=D%L,re=0;for(let W of O){let Q=re+W.duration,le=Q+W.hold;if(se>=Q){x(W.channels,[G??1]),re=le;continue}if(se>=re){let ce=G??Nt((se-re)/W.duration,W.easing??"ease-in-out");x(W.channels,[ce]);break}}return!0}})},[x,c]),l=z((i,o={})=>{let g=o.id??`flicker-${Pe++}`,d=o.synchronized??!0,O=o.minLevel??.15,L=o.maxLevel??1,E=o.interval??[45,160],D=typeof E=="number"?[E,E]:E,Y=[Math.max(1,Math.min(...D)),Math.max(1,Math.max(...D))],G=Te(o.response??.7,.01,1),pe=Te(o.blackoutChance??.08),se=Te(o.flashChance??.12),re=o.flashLevel??1.15,W=Math.max(1,...[...i.materials??[],...i.transforms??[]].map(oe=>M(oe.targets).length),...(i.lights??[]).map(oe=>Ee(oe.lights).length)),Q=d?1:W,le=Array.from({length:Q},()=>O),ce=Array.from({length:Q},()=>O),me=Array.from({length:Q},()=>0);return c({id:g,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(oe,ve,Ae,be)=>{for(let ie=0;ie<Q;ie+=1){if(be!==null)ce[ie]=be;else if(oe>=me[ie]){let je=Math.random();ce[ie]=je<pe?qe(0,Math.min(.04,O)):je<pe+se?re:qe(O,L),me[ie]=oe+qe(...Y)}let Le=1-Math.pow(1-G,Math.max(1,Ae)/16.67);le[ie]+=(ce[ie]-le[ie])*Le}return x(i,le),o.duration===void 0||ve<o.duration}})},[x,c,M]),b=z((i,o,g)=>{let d=v.current.get(i);if(!d)return!1;let O=typeof performance>"u"?Date.now():performance.now();return d.override={level:o,until:O+Math.max(0,g)},I.current(),!0},[]),k=z(i=>v.current.delete(i),[]),J=z(()=>{v.current.clear(),a.current!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(a.current),a.current=null)},[]),U=z(()=>{for(let[i,o]of S.current)Dt(i,o);S.current.clear();for(let[i,o]of w.current)i.position.set(...o.position),i.rotation.set(...o.rotation),i.scale.set(...o.scale),i.visible=o.visible,i.updateMatrix(),i.updateMatrixWorld(!0);w.current.clear();for(let i of f.current.values())i.light.removeFromParent(),i.light.dispose();f.current.clear(),R()},[R]),N=z(()=>{J(),U()},[U,J]),de=z(i=>{r.current&&r.current!==i.scene&&U(),n.current=i,r.current=i.scene,t.current.onViewerReady?.(i)},[U]);return rr(()=>()=>{N(),n.current=null,r.current=null},[N]),{handleViewerReady:de,setMaterial:y,setTransform:T,getWorldPosition:H,addPointLight:V,updatePointLight:_,removePointLight:u,transition:m,timeline:C,pulse:p,flicker:l,overrideEffect:b,stopEffect:k,stopAllEffects:J,resetRuntime:N}}import{useCallback as Ve,useEffect as Ze,useRef as fe,useState as ur}from"react";function Ht(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Oe(e){return typeof e=="number"&&Number.isFinite(e)}function zt(e){return Array.isArray(e)&&e.length===3&&e.every(Oe)}function gr(e){return!Ht(e)||!zt(e.position)||!zt(e.target)||e.fov!==null&&!Oe(e.fov)||!Oe(e.zoom)||e.zoom<=0||e.azimuthAngle!==void 0&&!Oe(e.azimuthAngle)||e.polarAngle!==void 0&&!Oe(e.polarAngle)?null:{position:e.position,target:e.target,fov:e.fov,zoom:e.zoom,azimuthAngle:e.azimuthAngle,polarAngle:e.polarAngle}}function fr(e){if(!Ht(e))return null;let t;if(e.camera!==void 0){let a=gr(e.camera);if(!a)return null;t=a}let n;if(e.hidden!==void 0){if(!Array.isArray(e.hidden)||!e.hidden.every(a=>typeof a=="string"))return null;n=e.hidden}let r;if(e.selected===null||typeof e.selected=="string")r=e.selected;else if(e.selected!==void 0)return null;return{camera:t,hidden:n,selected:r}}function Ft(e,t,n){let r=Object.values(t).filter(a=>a.visible===!1).map(a=>a.id);return{camera:e??void 0,hidden:r,selected:n?.id??null}}function mr({cameraState:e,setCameraState:t,objectBindings:n,onObjectBindingsChange:r,selectedObjectBinding:a,setSelectedObjectBinding:v,paramKey:f="view",debounceMs:S=400,autoSync:w=!0}){let j=fe(null),M=fe(null),R=fe(null),A=fe(null),y=fe(null),B=Ve(()=>{y.current!==null&&(window.clearTimeout(y.current),y.current=null),R.current=null,A.current=null},[]),T=Ve(()=>{let p=Ft(e,n,a);return`${f}=${encodeURIComponent(JSON.stringify(p))}`},[e,n,a,f]),H=Ve(()=>{let p=new URL(window.location.href);return p.hash=T(),p.toString()},[T]),u=Ve(p=>{let C=new URL(window.location.href);C.hash=p,window.history.replaceState(null,"",C.toString()),M.current=p,j.current=new URLSearchParams(C.hash.slice(1)).get(f)},[f]),V=Ve(()=>{B(),u(T())},[T,B,u]),_=fe({cameraState:e,objectBindings:n,selectedObjectBinding:a});_.current={cameraState:e,objectBindings:n,selectedObjectBinding:a};let[x,I]=ur(!1);Ze(()=>{if(!w||!x){B();return}let p=_.current,C=Ft(p.cameraState,p.objectBindings,p.selectedObjectBinding),l=`${f}=${encodeURIComponent(JSON.stringify(C))}`;if(l===M.current){B();return}l===R.current&&S===A.current||(B(),R.current=l,A.current=S,y.current=window.setTimeout(()=>{y.current=null,R.current=null,A.current=null,u(l)},Math.max(0,S)))},[w,e,B,S,n,f,x,a,u]),Ze(()=>B,[B]);let F=fe(null),c=fe(null),m=Ve(async()=>{I(!0);let p=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash,C=new URLSearchParams(p).get(f);if(!C)return F.current=null,!1;if(C===j.current||C===F.current||C===c.current)return!1;let l;try{l=JSON.parse(C)}catch{return!1}let b=fr(l);if(!b)return!1;c.current=C;try{if(b.camera&&await t(b.camera,!1),b.hidden){let k=new Set(b.hidden);r(Object.fromEntries(Object.entries(n).map(([J,U])=>[J,{...U,visible:!k.has(U.id)}])))}if(b.selected!==void 0){let k=b.selected?ee(n,b.selected):null;v(k?n[k]:null)}return F.current=C,!0}finally{c.current===C&&(c.current=null)}},[n,r,f,t,v]);return Ze(()=>{let p=()=>{m().catch(()=>{})};return window.addEventListener("hashchange",p),()=>{window.removeEventListener("hashchange",p)}},[m]),{getShareUrl:H,syncUrl:V,restoreFromUrl:m}}export{Ct as BindingBuilder,nn as DEFAULT_SCENE_CONFIG,sn as MATERIAL_BLENDING_MODES,an as MATERIAL_SIDES,xt as ModelViewer,_t as SimpleModelViewer,ln as defineObjectBindings,ze as material,Ce as patchBindings,Fe as patchSceneConfig,he as selectBindingKeys,De as selectBindings,Nn as useObjectBinding,zn as useObjectBindingIds,Kn as useObjectBindings,Gn as useSceneConfig,mr as useShareableViewerState,er as useViewerActions,on as useViewerAnimations,rn as useViewerCamera,nr as useViewerConnection,pr as useViewerEffects,Yn as useViewerHover,Zn as useViewerModel,Ln as useViewerSelection};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liveroom-tech/react-immersive",
3
- "version": "4.3.0",
3
+ "version": "4.3.1",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",
File without changes