@liveroom-tech/react-immersive 6.2.1 → 6.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +23 -0
  2. package/dist/AnimationsTab-IKAAKT3P.mjs +1 -0
  3. package/dist/AnnotationsTab-NEJIXCOM.mjs +1 -0
  4. package/dist/CinematicTab-TIQXCPFE.mjs +1 -0
  5. package/dist/ConfigureTab-NYRMOFW4.mjs +6 -0
  6. package/dist/RulesTab-2U4MFYOZ.mjs +1 -0
  7. package/dist/SequencesTab-JZEE5WAM.mjs +1 -0
  8. package/dist/SequencesTab-O7USMDFP.css +1 -0
  9. package/dist/{StreamingTilesModel-6Z7SIC2J.mjs → StreamingTilesModel-IM2DDWO5.mjs} +1 -1
  10. package/dist/binding-builder.css +1 -1
  11. package/dist/binding-builder.d.mts +3 -3
  12. package/dist/binding-builder.d.ts +3 -3
  13. package/dist/binding-builder.js +45 -45
  14. package/dist/binding-builder.mjs +1 -1
  15. package/dist/chunk-37QOMZW6.mjs +1 -0
  16. package/dist/{chunk-NMRTI3NQ.mjs → chunk-3GA7JFNH.mjs} +1 -1
  17. package/dist/chunk-3I7PPFUV.mjs +1 -0
  18. package/dist/chunk-3PLML3PO.mjs +1 -0
  19. package/dist/chunk-5C4H7SRF.mjs +1 -0
  20. package/dist/chunk-CHMFH4D4.mjs +1 -0
  21. package/dist/chunk-CUDL77ZY.mjs +1 -0
  22. package/dist/{chunk-UTVFRMYW.mjs → chunk-IEKGBS46.mjs} +2 -2
  23. package/dist/chunk-LU3BQ7WG.mjs +69 -0
  24. package/dist/chunk-QZNUWZG7.mjs +50 -0
  25. package/dist/{chunk-3OCHN3CA.mjs → chunk-SOAUR4DL.mjs} +1 -1
  26. package/dist/chunk-SXN3YYD3.mjs +1 -0
  27. package/dist/chunk-TI2YXAHW.mjs +3 -0
  28. package/dist/exportSceneMesh-MSQIMBFF.mjs +1 -0
  29. package/dist/hosted.css +1 -1
  30. package/dist/hosted.d.mts +5 -3
  31. package/dist/hosted.d.ts +5 -3
  32. package/dist/hosted.js +44 -44
  33. package/dist/hosted.mjs +1 -1
  34. package/dist/index.css +1 -1
  35. package/dist/index.d.mts +8 -4
  36. package/dist/index.d.ts +8 -4
  37. package/dist/index.js +42 -42
  38. package/dist/index.mjs +1 -1
  39. package/dist/{modelFileResolver-CVmON8hg.d.mts → modelFileResolver-An1aQ0D3.d.mts} +42 -29
  40. package/dist/{modelFileResolver-CVmON8hg.d.ts → modelFileResolver-An1aQ0D3.d.ts} +42 -29
  41. package/dist/{modelViewerProps-BBnZTFO-.d.ts → modelViewerProps-BnVflYRA.d.mts} +22 -3
  42. package/dist/{modelViewerProps-CIY4nsNY.d.mts → modelViewerProps-H_K454u_.d.ts} +22 -3
  43. package/dist/{publicProps-BARVwXu7.d.ts → publicProps-AdNUI06n.d.ts} +1 -1
  44. package/dist/{publicProps-n0Yvr_Km.d.mts → publicProps-BOQBJBA_.d.mts} +1 -1
  45. package/dist/simple-model-viewer.css +1 -1
  46. package/dist/simple-model-viewer.d.mts +6 -2
  47. package/dist/simple-model-viewer.d.ts +6 -2
  48. package/dist/simple-model-viewer.js +5 -5
  49. package/dist/simple-model-viewer.mjs +1 -1
  50. package/dist/utils.d.mts +4 -4
  51. package/dist/utils.d.ts +4 -4
  52. package/dist/utils.js +15 -15
  53. package/dist/utils.mjs +1 -1
  54. package/package.json +7 -5
  55. package/dist/AnimationsTab-NUJTEMZ5.mjs +0 -1
  56. package/dist/AnnotationsTab-OHRVWRKI.mjs +0 -1
  57. package/dist/CinematicTab-IJAY2BS6.mjs +0 -1
  58. package/dist/ConfigureTab-UQRRATCY.mjs +0 -6
  59. package/dist/RulesTab-YVBZGJZX.mjs +0 -1
  60. package/dist/SequencesTab-IC5LWQ6N.css +0 -1
  61. package/dist/SequencesTab-VZKEKAUG.mjs +0 -1
  62. package/dist/chunk-25WC5KDO.mjs +0 -50
  63. package/dist/chunk-7OVEHDDE.mjs +0 -1
  64. package/dist/chunk-AL6UIGWP.mjs +0 -1
  65. package/dist/chunk-KYXJG3TX.mjs +0 -1
  66. package/dist/chunk-LD7QWHB4.mjs +0 -3
  67. package/dist/chunk-RKDATTUM.mjs +0 -1
  68. package/dist/chunk-UAZ6I25Y.mjs +0 -1
  69. package/dist/chunk-UHRJ2RBF.mjs +0 -1
  70. package/dist/chunk-YKDDNX2D.mjs +0 -69
  71. package/dist/exportSceneMesh-YJFOLFHS.mjs +0 -1
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- "use client";import{c as ke}from"./chunk-7OVEHDDE.mjs";import"./chunk-MMO7KCYU.mjs";import{a as _e,b as Ne,c as xn}from"./chunk-F5QSXMME.mjs";import{b as yn,f as On,g as jn,q as dt,r as ut,s as He,t as pt,u as qe,v as kn}from"./chunk-YKDDNX2D.mjs";import"./chunk-KYXJG3TX.mjs";import"./chunk-FGAJ2UT7.mjs";import"./chunk-3OCHN3CA.mjs";import{v as at,w as ct}from"./chunk-UTVFRMYW.mjs";import{a as ot,b as st}from"./chunk-NMRTI3NQ.mjs";import"./chunk-37YITTIK.mjs";import"./chunk-2AJK643D.mjs";import"./chunk-RKDATTUM.mjs";import{$ as Wt,Aa as lt,D as re,Da as Ue,E as Ee,Ea as De,Fa as An,G as Dt,Ga as En,H as Ht,Ha as Tn,Ia as In,Ja as Ln,R as _t,T as Nt,V as qt,W as Ft,X as Kt,Y as Gt,Z as zt,_ as $t,aa as fn,ba as ge,ca as ye,da as Le,e as it,ia as gn,ja as mn,n as Ae,oa as bn,pa as hn,ra as Vn,va as Bn,w as Ce,wa as vn,x as Se,xa as Mn,y as kt,ya as Pn,z as Ut,za as Rn}from"./chunk-25WC5KDO.mjs";import{a as xt,b as At,e as Et,f as Tt,g as It}from"./chunk-LX3GXQNU.mjs";import{b as fe,c as Ie,d as Xt,e as Jt,f as Qt,g as Zt,h as en,i as tn,j as nn,k as rn,l as on,m as sn,n as an,o as cn,p as ln,q as dn,r as un,s as pn}from"./chunk-7JCFNZJM.mjs";import"./chunk-UHRJ2RBF.mjs";import{b as Cn,c as Sn}from"./chunk-CCBFMNAU.mjs";import{a as Z,b as ce,c as Te}from"./chunk-GV4ZRXL6.mjs";import"./chunk-7OWHW66D.mjs";import{e as wn}from"./chunk-KFLS7GI6.mjs";import{a as Lt}from"./chunk-UAZ6I25Y.mjs";import{c as Yt}from"./chunk-BNKTI3CY.mjs";import"./chunk-UCD76KQ6.mjs";import"./chunk-TUYVYSN5.mjs";import"./chunk-RXZ4Q7CY.mjs";import"./chunk-JR557W27.mjs";import{useCallback as Un,useEffect as Oe,useMemo as je,useRef as Fe,useState as me}from"react";import{jsx as ue,jsxs as ft}from"react/jsx-runtime";var Dn=Object.freeze({});function gt(e){return ue(ot,{labels:e.labels,children:ue(Hn,{...e})})}function Hn({before:e,after:t,layout:i="slider",split:s,onSplitChange:p,reveal:y="auto",semanticComparison:l=!1,showComparisonOutlines:x,onComparisonOutlinesChange:B,onComparisonChange:O,linkSections:v,...m}){let k=st(),[E,C]=me(y==="auto");Oe(()=>{y==="auto"&&C(!0)},[y]);let[h,b]=me(.5),[f,S]=me(!0),R=x??f,j=P=>{x===void 0&&S(P),B?.(P)},q=He(s??h),X=Un(P=>{let A=He(P);s===void 0&&b(A),p?.(A)},[s,p]),_=Fe([null,null]),[V,J]=me([null,null]),[N,a]=me(null),[r,c]=me(null),u=[{...m,...e},{...m,...t}];Oe(()=>a(null),[u[0].sceneConfig?.section,u[1].sceneConfig?.section]);let w=P=>{let A=u[P].objectBindings;return A&&typeof A=="object"?A:V[P]?.url===u[P].modelUrl?V[P].bindings:Dn},L=w(0),$=w(1),n=je(()=>l?Ue({objectBindings:L,sceneConfig:u[0].sceneConfig},{objectBindings:$,sceneConfig:u[1].sceneConfig},typeof l=="object"?l:{}):null,[l,L,$,u[0].sceneConfig,u[1].sceneConfig]),o=n?JSON.stringify(n):"",g=Fe(null);Oe(()=>{n&&g.current!==o&&(g.current=o,O?.(n))},[n,o,O]);let d=n?.objects.find(P=>P.id===r),M=je(()=>n?[De(n,"before",r),De(n,"after",r)]:null,[n,r]),I=je(()=>ut(),[]);Oe(()=>()=>I.detach(),[I]);let T=[e,t],D=je(()=>[0,1].map(P=>(A,W)=>{_.current[P]=A,J(G=>G[P]?.bindings===A.objectBindings&&G[P]?.url===W?G:G.map((z,we)=>we===P?{url:W,bindings:A.objectBindings}:z)),I.attach(P,A.raw.controls,A.invalidate)}),[I]),Y=T.map((P,A)=>{let{label:W,...G}=P,z={preset:"minimal",...m,...G,refitOnResize:G.refitOnResize??m.refitOnResize??!1},we=G.onViewerReady??m.onViewerReady;return{...z,...v??!!l?{sceneConfig:{...z.sceneConfig,section:N??u[1].sceneConfig?.section??Ce},onSceneConfigChange:ie=>{a(ie.section??Ce),(G.onSceneConfigChange??m.onSceneConfigChange)?.(ie)}}:{},...M?{comparisonHighlights:R?M[A]:void 0,selectedObject:A===0?d?.beforeKey?L[d.beforeKey]:null:d?.afterKey?$[d.afterKey]:null}:{},onObjectSelect:ie=>{if((G.onObjectSelect??m.onObjectSelect)?.(ie),n){let Ve=n.objects.find(Q=>(A===0?Q.beforeObjectId:Q.afterObjectId)===ie?.modelObjectId);c(Ve?.id??null)}},onViewerReady:ie=>{D[A](ie,z.modelUrl),we?.(ie)}}}),K=[e.label??k("compareBefore"),t.label??k("compareAfter")];(!Y[0].modelUrl||!Y[1].modelUrl)&&console.error("[react-immersive] CompareViewer needs a modelUrl, shared or on each side.");let ae=Fe(null),ne=n?ue(dt,{showOutlines:R,onShowOutlinesChange:j,report:n,selected:r,onSelect:P=>{c(P.id);let A=P.afterObjectId?1:0,W=_.current[A],G=A===1?P.afterObjectId:P.beforeObjectId,z=G?W?.raw.nodes[G]:null;W&&z&&(I.setLeader(A),W.raw.controls.fitToBox(z,!0),W.invalidate())},onClear:()=>c(null)}):null;if(!E)return ue(at,{className:"ri-compare",background:ct(m.backgroundColor,m.sceneConfig),poster:m.poster??t.poster??e.poster,onReveal:()=>C(!0)});let F=i==="side-by-side";return ft("div",{ref:ae,className:`ri-compare ${F?"ri-compare--sideBySide":"ri-compare--slider"}`,style:F?void 0:{"--ri-compare-split":`${q*100}%`},children:[Y.map((P,A)=>ft("div",{className:F?"ri-compare__pane":A===1?"ri-compare__layer ri-compare__layer--after":"ri-compare__layer",children:[ue(ke,{...P}),F?ue("span",{className:"ri-compare__label",children:K[A]}):null]},A)),ne,F?null:ue(pt,{split:q,onSplitChange:X,labels:[K[0],K[1]],containerRef:ae})]})}import{useCallback as Re,useRef as jt}from"react";import{useCallback as H,useMemo as mt,useState as _n}from"react";var bt={baseColor:"texture",metalness:"metalnessMap",roughness:"roughnessMap",emissive:"emissiveMap",alpha:"alphaMap",normal:"normalMap",bump:"bumpMap",ao:"aoMap",displacement:"displacementMap",clearcoat:"clearcoatMap",clearcoatRoughness:"clearcoatRoughnessMap",clearcoatNormal:"clearcoatNormalMap",anisotropy:"anisotropyMap",transmission:"transmissionMap",thickness:"thicknessMap",sheenColor:"sheenColorMap",sheenRoughness:"sheenRoughnessMap",specularIntensity:"specularIntensityMap",specularColor:"specularColorMap"};function wt(e){if(e)return Object.fromEntries(Object.entries(e).map(([t,i])=>[t,i&&typeof i=="object"?{...i}:i]))}function Nn(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t.visible===!1).map(([t])=>[t,!0]))}function Ke(e){let[t,i]=_n(e),s=H((a,r)=>{i(c=>r===void 0?fe(c,a):fe(c,a,r))},[]),p=H((a,r)=>s(a,Ie(r)),[s]),y=H((a,r)=>p(a,{baseColor:r}),[p]),l=H((a,r,c="baseColor")=>{let u=bt[c],w=typeof r=="string"?{path:r}:r;s(a,{style:{material:{[u]:w}}})},[s]),x=H((a,r="baseColor")=>{let c=bt[r];s(a,{style:{material:{[c]:void 0}}})},[s]),B=H((a,r)=>{i(c=>{let u=Z(c,a);if(!u)return c;let w=wt(c[u]?.style?.material),L=ce(c,r);if(L.length===0)return c;let $=c;for(let n of L){let o=c[n];o&&($===c&&($={...c}),$[n]={...o,style:{...o.style,material:wt(w)}})}return $})},[]),O=H(a=>s(a,{style:{material:void 0}}),[s]),v=H((a,r)=>s(a,{transform:r}),[s]),m=H(a=>s(a,{transform:void 0}),[s]),k=H((a,r)=>s(a,{metadata:r}),[s]),E=H((a,r)=>{i(c=>{let u=c;for(let w of ce(c,a)){let L=c[w],$=r(L.decals??[]);u===c&&(u={...c}),u[w]={...L,decals:$.length>0?$:void 0}}return u})},[]),C=H((a,r)=>{let c=r.id??`decal-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;return E(a,u=>[...u.filter(w=>w.id!==c),{...r,id:c}]),c},[E]),h=H((a,r,c)=>E(a,u=>u.map(w=>w.id===r?{...w,...c}:w)),[E]),b=H((a,r)=>E(a,c=>c.filter(u=>u.id!==r)),[E]),f=H(a=>Te(t,a),[t]),S=H(a=>ce(t,a).map(r=>t[r]?.id??r),[t]),R=H(a=>{let r=Z(t,a);return r?t[r]?.style?.material??null:null},[t]),j=H(a=>s(a,{visible:!1}),[s]),q=H(a=>s(a,{visible:!0}),[s]),X=H(a=>{i(r=>{let c=ce(r,a).reduce((u,w)=>{let L=r[w];return L&&u.push({ids:w,patch:{visible:L.visible===!1}}),u},[]);return fe(r,c)})},[i]),_=H(()=>{i(a=>fe(a,Object.keys(a),{visible:!0}))},[i]),V=mt(()=>Nn(t),[t]),J=mt(()=>Object.keys(V).map(a=>t[a]?.id??a),[V,t]),N=H(a=>{let r=Z(t,a);return r?t[r]?.visible===!1:!1},[t]);return{objectBindings:t,setObjectBindings:i,updateObjectBindings:s,setMaterial:p,setBaseColor:y,setTexture:l,clearTexture:x,copyMaterial:B,resetMaterial:O,getMaterial:R,setTransform:v,resetTransform:m,updateMetadata:k,addDecal:C,updateDecal:h,removeDecal:b,selectObjectBindings:f,selectObjectBindingIds:S,hiddenObjects:V,hiddenObjectIds:J,hideObject:j,showObject:q,toggleObjectVisibility:X,isObjectHidden:N,clearHiddenObjects:_}}import{useCallback as ee,useMemo as qn,useRef as Fn,useState as Kn}from"react";function Ge(e){let t=Fn(null),[i,s]=Kn(()=>{let f=typeof e=="function"?e():e;return t.current=f,f}),p=ee(f=>{s(S=>{let R=typeof f=="function"?f(S):f;return _e(S,R)})},[]),y=ee(()=>{let f=t.current;f&&s(f)},[]),l=ee((f,S)=>{p(R=>({lighting:{lights:R.lighting.lights.map(j=>j.id===f?{...j,...S}:j)}}))},[p]),x=ee(f=>{p(S=>S.lighting.lights.some(R=>R.id===f.id)?{}:{lighting:{lights:[...S.lighting.lights,Ne(f)]}})},[p]),B=ee(f=>{p(S=>({lighting:{lights:S.lighting.lights.filter(R=>R.id!==f)}}))},[p]),O=ee((f,S)=>l(f,{intensity:S}),[l]),v=ee((f,S)=>l(f,{color:S}),[l]),m=ee(f=>l(f,{visible:!0}),[l]),k=ee(f=>l(f,{visible:!1}),[l]),E=ee(f=>{p(S=>({lighting:{lights:S.lighting.lights.map(R=>R.id===f?{...R,visible:!R.visible}:R)}}))},[p]),C=ee((f,S)=>l(f,{attachment:S,attachedToCamera:!1}),[l]),h=ee(f=>l(f,{attachment:void 0}),[l]),b=qn(()=>({items:i.lighting.lights,get:f=>i.lighting.lights.find(S=>S.id===f),add:x,update:l,remove:B,setIntensity:O,setColor:v,show:m,hide:k,toggle:E,attach:C,detach:h}),[i.lighting.lights,x,l,B,O,v,m,k,E,C,h]);return{sceneConfig:i,setSceneConfig:s,updateSceneConfig:p,resetSceneConfig:y,lights:b}}import{useCallback as ze}from"react";function $e({bindings:e,scene:t,camera:i,animations:s,isolation:p,onAction:y}){let{objectBindings:l,updateObjectBindings:x,showObject:B,hideObject:O,toggleObjectVisibility:v}=e,m=t?.updateSceneConfig,k=i?.focusObject,E=i?.fitScene,C=i?.resetView,h=i?.setCameraTarget,b=i?.setCameraState,f=s?.play,S=s?.pause,R=s?.stop,j=s?.setSpeed,q=s?.seek,X=p?.handleIsolationChange,_=ze(N=>{let a=Z(l,N);return a?l[a]?.actions??[]:[]},[l]),V=ze(async N=>{for(let a of N.action.effects??[]){if("objectBindings"in a){x(a.target,a.objectBindings);continue}if("sceneConfig"in a){m?.(a.sceneConfig);continue}if("isolation"in a){X?.(a.isolation);continue}if("visibility"in a){a.visibility==="show"?B(a.target):a.visibility==="hide"?O(a.target):v(a.target);continue}if("camera"in a){let c=a.camera;c.type==="focus-object"?await k?.(c.objectId??N.objectId):c.type==="fit-scene"?await E?.():c.type==="reset"?await C?.():c.type==="set-target"?await h?.(c.target,c.transition??!0):await b?.(c.state,c.transition??!0);continue}let r=a.animation;if(r.type==="play"){let{type:c,clip:u,...w}=r;f?.(u,w)}else r.type==="pause"?S?.(r.clip):r.type==="stop"?R?.(r.clip):r.type==="set-speed"?j?.(r.speed,r.clip):q?.(r.time,r.clip)}await y?.(N)},[E,k,O,y,S,f,C,q,j,b,h,X,B,R,v,x,m]),J=ze(async(N,a)=>{let r=Z(l,N);if(!r)return null;let c=l[r],u=c?.actions?.find(L=>L.id===a);if(!c||!u)return null;let w={objectId:r,action:u,binding:c};return await V(w),w},[V,l]);return{getActionsForObject:_,handleAction:V,runAction:J}}import{useCallback as he,useRef as yt}from"react";function Gn(e){return typeof e=="function"?e:e?.handleViewerReady??null}function We(...e){let t=yt(null),i=yt(e);i.current=e;let s=he(B=>{t.current=B;let O=new Set;for(let v of i.current){let m=Gn(v);m&&!O.has(m)&&(O.add(m),m(B))}},[]),p=he(()=>t.current,[]),y=he(B=>{let O=t.current;return O?O.captureImage(B):Promise.reject(new Error("ModelViewer is not ready yet."))},[]),l=he(()=>{let B=t.current;return B?(B.invalidate(),!0):!1},[]),x=he(B=>{let O=t.current;return O?O.captureVideo(B):Promise.reject(new Error("ModelViewer is not ready yet."))},[]);return{handleViewerReady:s,getViewer:p,captureImage:y,captureVideo:x,invalidate:l}}import{useCallback as U,useEffect as zn,useRef as oe}from"react";import{Material as $n,PointLight as Wn,Vector3 as Yn}from"three";var Je=["emissiveIntensity","opacity","metalness","roughness","transmission","clearcoat","clearcoatRoughness","ior","thickness"],Be=1;function ve(e){return typeof e=="string"?[e]:e}function Me(e,t=0,i=1){return Math.min(i,Math.max(t,e))}function Ye(e,t){return e+Math.random()*(t-e)}function ht([e,t],i){return e+(t-e)*i}function Xe([e,t],i){return[e[0]+(t[0]-e[0])*i,e[1]+(t[1]-e[1])*i,e[2]+(t[2]-e[2])*i]}function Vt(e,t){let i=Me(e);switch(t){case"ease-in":return i*i;case"ease-out":return 1-(1-i)*(1-i);case"ease-in-out":return i<.5?2*i*i:1-Math.pow(-2*i+2,2)/2;default:return i}}function Xn(e){let t=e.material;return t?(Array.isArray(t)?t:[t]).filter(i=>i instanceof $n):[]}function Jn(e){let t={opacity:e.opacity,transparent:e.transparent};e.color&&(t.baseColor=`#${e.color.getHexString()}`),e.emissive&&(t.emissive=`#${e.emissive.getHexString()}`);for(let i of Je){let s=e[i];typeof s=="number"&&(t[i]=s)}return t}function Ct(e,t){t.baseColor!==void 0&&e.color&&e.color.set(t.baseColor),t.emissive!==void 0&&e.emissive&&e.emissive.set(t.emissive);for(let i of Je){let s=t[i];s!==void 0&&typeof e[i]=="number"&&(e[i]=s)}t.transparent!==void 0&&(e.transparent=t.transparent),e.needsUpdate=!0}function Qn(e){return{position:[e.position.x,e.position.y,e.position.z],rotation:[e.rotation.x,e.rotation.y,e.rotation.z],scale:[e.scale.x,e.scale.y,e.scale.z],visible:e.visible}}function Zn(e,t){if(t.position&&e.position.set(...t.position),t.rotation&&e.rotation.set(...t.rotation),t.scale!==void 0){let i=typeof t.scale=="number"?[t.scale,t.scale,t.scale]:t.scale;e.scale.set(...i)}t.visible!==void 0&&(e.visible=t.visible),e.updateMatrix(),e.updateMatrixWorld(!0)}function Qe(e={}){let t=oe(e);t.current=e;let i=oe(null),s=oe(null),p=oe(null),y=oe(new Map),l=oe(new Map),x=oe(new Map),B=oe(new Map),O=U(n=>{let o=i.current;if(!o)return null;let g=Z(o.objectBindings,n);return o.raw.nodes[n]??(g?o.raw.nodes[g]:null)??(o.raw.scene?it(o.raw.scene,n):null)??null},[]),v=U(n=>{let o=i.current;return o?typeof n=="object"&&!Array.isArray(n)?ce(o.objectBindings,n):ve(n).map(g=>Z(o.objectBindings,g)??g):typeof n=="string"?[n]:Array.isArray(n)?n:[]},[]),m=U(()=>{i.current?.invalidate()},[]),k=U((n,o)=>{let g=!1;for(let d of v(n)){let M=O(d);if(M)for(let I of Xn(M))x.current.has(I)||x.current.set(I,Jn(I)),Ct(I,o),g=!0}return g},[O,v]),E=U((n,o)=>{let g=k(n,o);return g&&m(),g},[m,k]),C=U((n,o)=>{let g=!1;for(let d of v(n)){let M=O(d);M&&(B.current.has(M)||B.current.set(M,Qn(M)),Zn(M,o),g=!0)}return g},[O,v]),h=U((n,o)=>{let g=C(n,o);return g&&m(),g},[m,C]),b=U(n=>{let o=O(n);if(!o)return null;o.updateWorldMatrix(!0,!1);let g=o.getWorldPosition(new Yn);return[g.x,g.y,g.z]},[O]),f=U(n=>{let o=l.current.get(n);return o?(o.light.removeFromParent(),o.light.dispose(),l.current.delete(n),m(),!0):!1},[m]),S=U(n=>{let o=O(n.target);if(!o)return!1;let g=l.current.get(n.id),d=g?.light??new Wn;return g&&g.target!==n.target&&d.removeFromParent(),d.name=`react-immersive-runtime-light:${n.id}`,d.color.set(n.color??"#ffffff"),d.intensity=n.intensity??1,d.distance=n.distance??0,d.decay=n.decay??2,d.castShadow=n.castShadow??!1,d.position.set(...n.offset??[0,0,0]),d.parent!==o&&o.add(d),l.current.set(n.id,{light:d,target:n.target}),m(),!0},[m,O]),R=U((n,o)=>{let g=l.current.get(n);if(!g)return!1;if(o.target&&o.target!==g.target){let d=O(o.target);if(!d)return!1;g.light.removeFromParent(),d.add(g.light),g.target=o.target}return o.color!==void 0&&g.light.color.set(o.color),o.intensity!==void 0&&(g.light.intensity=o.intensity),o.distance!==void 0&&(g.light.distance=o.distance),o.decay!==void 0&&(g.light.decay=o.decay),o.offset!==void 0&&g.light.position.set(...o.offset),o.castShadow!==void 0&&(g.light.castShadow=o.castShadow),m(),!0},[m,O]),j=U((n,o)=>{let g=d=>o[d%o.length]??0;for(let d of n.materials??[])v(d.targets).forEach((M,I)=>{let T=g(I),D={};for(let Y of Je){let K=d.values[Y];K&&(D[Y]=ht(K,T))}k(M,D)});for(let d of n.transforms??[])v(d.targets).forEach((M,I)=>{let T=g(I),D={};d.values.position&&(D.position=Xe(d.values.position,T)),d.values.rotation&&(D.rotation=Xe(d.values.rotation,T)),d.values.scale&&(D.scale=Xe(d.values.scale,T)),C(M,D)});for(let d of n.lights??[])ve(d.lights).forEach((M,I)=>{let T=l.current.get(M);T&&(T.light.intensity=ht(d.intensity,g(I)))})},[v,k,C]),q=oe(()=>{}),X=oe(()=>{});X.current=n=>{p.current=null;let o=!1;for(let[g,d]of y.current){d.startedAt===null&&(d.startedAt=n);let M=d.lastFrameAt??n;d.lastFrameAt=n;let I=d.override&&d.override.until>n?d.override.level:null;d.override&&I===null&&(d.override=null);let T=d.update(n,n-d.startedAt,Math.min(100,n-M),I);o=!0,T||(y.current.delete(g),d.onComplete?.())}o&&m(),y.current.size>0&&q.current()},q.current=()=>{p.current!==null||typeof requestAnimationFrame>"u"||(p.current=requestAnimationFrame(n=>X.current(n)))};let _=U(n=>(y.current.set(n.id,n),q.current(),n.id),[]),V=U((n,o={})=>{let g=o.id??`transition-${Be++}`,d=Math.max(1,o.duration??400),M=o.easing??"ease-in-out";return _({id:g,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(I,T,D,Y)=>{let K=Y??Vt(T/d,M);return j(n,[K]),T<d}})},[j,_]),J=U((n,o={})=>{let g=o.id??`pulse-${Be++}`,d=Math.max(1,o.duration??1e3),M=o.minLevel??0,I=o.maxLevel??1,T=o.repeat??1/0,D=o.synchronized??!0,Y=Math.max(1,...[...n.materials??[],...n.transforms??[]].map(K=>v(K.targets).length),...(n.lights??[]).map(K=>ve(K.lights).length));return _({id:g,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(K,ae,de,ne)=>{let F=ae/d,P=Array.from({length:D?1:Y},(A,W)=>{if(ne!==null)return ne;let G=F+(D?0:W/Y),z=.5-Math.cos(G%1*Math.PI*2)/2;return M+(I-M)*z});return j(n,P),T===1/0||F<T}})},[j,_,v]),N=U((n,o={})=>{let g=o.id??`timeline-${Be++}`,d=o.repeat??1,M=n.map(T=>({...T,duration:Math.max(1,T.duration),hold:Math.max(0,T.hold??0)})),I=Math.max(1,M.reduce((T,D)=>T+D.duration+D.hold,0));return _({id:g,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(T,D,Y,K)=>{if(M.length===0||d<=0)return!1;let ae=D/I;if(d!==1/0&&ae>=d){for(let F of M)j(F.channels,[1]);return!1}let de=D%I,ne=0;for(let F of M){let P=ne+F.duration,A=P+F.hold;if(de>=P){j(F.channels,[K??1]),ne=A;continue}if(de>=ne){let W=K??Vt((de-ne)/F.duration,F.easing??"ease-in-out");j(F.channels,[W]);break}}return!0}})},[j,_]),a=U((n,o={})=>{let g=o.id??`flicker-${Be++}`,d=o.synchronized??!0,M=o.minLevel??.15,I=o.maxLevel??1,T=o.interval??[45,160],D=typeof T=="number"?[T,T]:T,Y=[Math.max(1,Math.min(...D)),Math.max(1,Math.max(...D))],K=Me(o.response??.7,.01,1),ae=Me(o.blackoutChance??.08),de=Me(o.flashChance??.12),ne=o.flashLevel??1.15,F=Math.max(1,...[...n.materials??[],...n.transforms??[]].map(z=>v(z.targets).length),...(n.lights??[]).map(z=>ve(z.lights).length)),P=d?1:F,A=Array.from({length:P},()=>M),W=Array.from({length:P},()=>M),G=Array.from({length:P},()=>0);return _({id:g,startedAt:null,lastFrameAt:null,override:null,onComplete:o.onComplete,update:(z,we,ie,Ve)=>{for(let Q=0;Q<P;Q+=1){if(Ve!==null)W[Q]=Ve;else if(z>=G[Q]){let rt=Math.random();W[Q]=rt<ae?Ye(0,Math.min(.04,M)):rt<ae+de?ne:Ye(M,I),G[Q]=z+Ye(...Y)}let Rt=1-Math.pow(1-K,Math.max(1,ie)/16.67);A[Q]+=(W[Q]-A[Q])*Rt}return j(n,A),o.duration===void 0||we<o.duration}})},[j,_,v]),r=U((n,o,g)=>{let d=y.current.get(n);if(!d)return!1;let M=typeof performance>"u"?Date.now():performance.now();return d.override={level:o,until:M+Math.max(0,g)},q.current(),!0},[]),c=U(n=>y.current.delete(n),[]),u=U(()=>{y.current.clear(),p.current!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(p.current),p.current=null)},[]),w=U(()=>{for(let[n,o]of x.current)Ct(n,o);x.current.clear();for(let[n,o]of B.current)n.position.set(...o.position),n.rotation.set(...o.rotation),n.scale.set(...o.scale),n.visible=o.visible,n.updateMatrix(),n.updateMatrixWorld(!0);B.current.clear();for(let n of l.current.values())n.light.removeFromParent(),n.light.dispose();l.current.clear(),m()},[m]),L=U(()=>{u(),w()},[w,u]),$=U(n=>{s.current&&s.current!==n.raw.scene&&w(),i.current=n,s.current=n.raw.scene,t.current.onViewerReady?.(n)},[w]);return zn(()=>()=>{L(),i.current=null,s.current=null},[L]),{handleViewerReady:$,setMaterial:E,setTransform:h,getWorldPosition:b,addPointLight:S,updatePointLight:R,removePointLight:f,transition:V,timeline:N,pulse:J,flicker:a,overrideEffect:r,stopEffect:c,stopAllEffects:u,resetRuntime:L}}import{useCallback as er,useState as tr}from"react";function Ze(){let[e,t]=tr(null),i=er(s=>{t(s)},[t]);return{hoveredObjectBinding:e,handleHoveredObject:i}}import{useCallback as St,useState as nr}from"react";function et(e=null){let[t,i]=nr(e),s=St((y,l)=>i({...l,target:y}),[]),p=St(()=>i(null),[]);return{isolation:t,isolate:s,clearIsolation:p,handleIsolationChange:i}}import{useCallback as Pe,useState as le}from"react";function tt(){let[e,t]=le(!0),[i,s]=le(!1),[p,y]=le(null),[l,x]=le(null),[B,O]=le(0),[v,m]=le([]),[k,E]=le([]),[C,h]=le([]),b=Pe(j=>{x(j.bounds),O(j.objectCount),m(j.materialVariants),E(j.materialVariantGroups),y(null),t(!1),s(!0)},[]),f=Pe(j=>h(j),[]),S=Pe(j=>{y(j),x(null),O(0),m([]),E([]),h([]),t(!1),s(!1)},[]),R=Pe(()=>{t(!0),s(!1),y(null),x(null),O(0),m([]),E([]),h([])},[]);return{isLoading:e,isReady:i,error:p,bounds:l,objectCount:B,materialVariants:v,materialVariantGroups:k,objects:C,handleModelLoaded:b,handleObjectCatalog:f,handleLoadError:S,resetModelState:R}}import{useCallback as Ot,useState as rr}from"react";function nt(e=null){let[t,i]=rr(e),s=Ot(y=>{i(y)},[i]),p=Ot(()=>{i(null)},[]);return{selectedObjectBinding:t,setSelectedObjectBinding:i,handleObjectSelect:s,clearSelection:p}}var ir={};function or(e={}){let t=jt(e);t.current=e;let i=jt(e.bindings===void 0||e.bindings==="auto"),s=Ke(()=>{let V=t.current.bindings;return V===void 0||V==="auto"?ir:typeof V=="function"?V():V}),p=Ge(()=>{let V=t.current.sceneConfig;return V===void 0?Se:typeof V=="function"?V():V}),y=nt(),l=Ze(),x=Ae(e.camera),B=tt(),O=qe(),v=et(),m=Qe(),k=We(x,m),E=$e({bindings:s,scene:p,camera:x,animations:O,isolation:v,onAction:e.onAction}),{setObjectBindings:C}=s,{handleObjectCatalog:h}=B,b=Re(V=>{h(V),i.current&&C(J=>{let N=lt(V.map(a=>a.name));for(let a of Object.keys(N))J[a]&&(N[a]=J[a]);return N})},[h,C]),{handleObjectSelect:f}=y,S=Re(V=>{f(V),t.current.onObjectSelect?.(V)},[f]),{handleHoveredObject:R}=l,j=Re(V=>{R(V),t.current.onObjectHover?.(V)},[R]),{handleLoadError:q}=B,X=Re(V=>{q(V),t.current.onLoadError?.(V)},[q]),_=e.sceneConfig!==void 0||p.sceneConfig!==Se;return{props:{objectBindings:s.objectBindings,onObjectBindingsChange:C,selectedObject:y.selectedObjectBinding,onObjectSelect:S,onObjectHover:j,onCameraChange:x.handleCameraChange,onViewerReady:k.handleViewerReady,onModelLoaded:B.handleModelLoaded,onLoadError:X,onObjectCatalog:b,onAnimationsReady:O.handleAnimationsReady,onAction:E.handleAction,onSceneConfigChange:p.setSceneConfig,isolation:v.isolation,onIsolationChange:v.handleIsolationChange,..._?{sceneConfig:p.sceneConfig}:{}},bindings:s,selection:y,hover:l,camera:x,model:B,animations:O,actions:E,scene:p,isolation:v,effects:m,connection:k}}import{useMemo as sr}from"react";function ar(e,t){return sr(()=>{if(!t)return null;let i=e[t];return i||(Object.values(e).find(s=>s.id===t||s.modelObjectId===t)??null)},[e,t])}import{useMemo as cr}from"react";function lr(e){return cr(()=>Object.values(e).map(t=>t.modelObjectId),[e])}import{useCallback as te,useEffect as xe,useRef as se,useState as dr}from"react";function ur(e,t){if(!e.objectBindings&&(!!e.hidden?.length||!!e.selected)&&Object.keys(t).length===0)return null;let s={};if(e.objectBindings)s.bindings=e.objectBindings;else if(e.hidden){let p=new Set(e.hidden);s.bindings=Object.fromEntries(Object.entries(t).map(([y,l])=>[y,{...l,visible:!p.has(l.id)}]))}if(e.selected!==void 0){let p=e.objectBindings??t,y=e.selected?Z(p,e.selected):null;s.selected=y?p[y]:null}return s}function Bt(e){return JSON.stringify(e&&{modelUrl:e.modelUrl,activeModelId:e.activeModelId,tilesetUrl:e.tilesetUrl,mergeModels:e.mergeModels,models:e.models?.map(({id:t,url:i,mergeModels:s})=>({id:t,url:i,mergeModels:s}))})}function pr(e){let t=se(e);t.current=e;let i=e.paramKey??"view",s=`${i}Id`,[p,y]=dr(!1),l=se(null),x=se(null),B=se(null),O=se(null),v=se(null),m=se(null),k=se(null),E=se(null),C=se(!0),h=te(r=>{let c=r instanceof Error?r:new Error(String(r));t.current.onError?t.current.onError(c):k.current!==c.message&&console.warn("[react-immersive]",c.message),k.current=c.message},[]),b=te(()=>{v.current!==null&&clearTimeout(v.current),v.current=null},[]);xe(()=>(C.current=!0,()=>{C.current=!1,b()}),[b]);let f=te(()=>{let r=t.current,c=(r.mode??(r.configuration?"configuration":"view"))==="configuration";return{version:1,camera:r.cameraState??void 0,hidden:Object.values(r.objectBindings).filter(u=>u.visible===!1).map(u=>u.id),selected:r.selectedObjectBinding?.id??null,...c?{objectBindings:r.objectBindings,configuration:r.configuration}:{}}},[]),S=te(()=>ye(f(),typeof window>"u"?void 0:window.location.href),[f]),R=te(()=>Le(f(),typeof window>"u"?void 0:window.location.href),[f]),j=te((r,c,u=window.location.href)=>{let w=new URL(u),L=new URLSearchParams(w.hash.slice(1));if(L.delete(i),L.delete(s),L.set(c?s:i,r),w.hash=L.toString(),!c&&w.href.length>(t.current.maxUrlLength??65536))throw new Error("Viewer configuration is too large for an inline link. Save JSON instead, or configure storage for createShareUrl(). Uploaded images can make links large.");return w.href},[i,s]),q=te(()=>j(ge(S()),!1),[S,j]),X=te(async()=>{let r=window.location.href,c=t.current.storage,u=await R();if(!c)return j(ge(u),!1,r);let w=await c.save(u);if(typeof w!="string"||!w.trim()||w.length>2048)throw new Error("Viewer state storage returned an invalid id.");return j(w,!0,r)},[R,j]),_=te(()=>{if(b(),l.current||m.current)return;let r=q();window.history.replaceState(null,"",r),O.current=`inline:${new URL(r).hash}`},[b,q]),V=te(async()=>{let r=l.current;if(!r||x.current||!C.current)return!1;x.current=r,b();try{let c=t.current,u=r.state;if(u.configuration&&!r.configurationApplied){if(!c.onConfigurationChange)throw new Error("Restoring a full viewer configuration requires onConfigurationChange.");return r.configurationApplied=!0,c.onConfigurationChange(u.configuration),!1}if(u.configuration&&Bt(c.configuration)!==Bt(u.configuration)||c.isReady===!1)return!1;if(u.camera&&!r.cameraApplied){if(!await c.setCameraState(u.camera,!1)||l.current!==r||!C.current)return!1;r.cameraApplied=!0}c=t.current;let w=ur(u,c.objectBindings);return!w||l.current!==r?!1:(w.bindings&&c.onObjectBindingsChange(w.bindings),w.selected!==void 0&&c.setSelectedObjectBinding(w.selected),l.current=null,B.current=r.key,y(!0),!0)}catch(c){throw l.current===r&&(l.current=null),y(!1),c}finally{x.current=null,l.current&&l.current!==r&&C.current&&V().catch(h)}},[b,h]),J=te(async r=>{let c=ye(r,window.location.href);b(),E.current=null,m.current=null;let u=new URLSearchParams(window.location.hash.slice(1));return O.current=u.has(i)?`inline:${window.location.hash}`:u.has(s)?`stored:${s}:${u.get(s)}`:null,B.current=null,l.current={key:`manual:${ge(c)}`,origin:"manual",state:c,configurationApplied:!1,cameraApplied:!1},y(!1),V()},[V,b,i,s]),N=te(async()=>{let r=new URLSearchParams(window.location.hash.slice(1)),c=r.get(i),u=r.get(s),w=c!==null?`inline:${window.location.hash}`:u!==null?`stored:${s}:${u}`:null;if(!w)return E.current=null,m.current=null,l.current?.origin==="manual"?V():(l.current=null,B.current=null,y(!0),!1);if(w===O.current||w===B.current)return l.current?.origin==="manual"?V():!1;if(l.current?.key===w)return V();b(),y(!1),E.current=w,l.current=null;let L=c;if(c===null){let n=t.current.storage;if(!n)throw new Error("This shared link requires a viewer state storage adapter.");(!m.current||m.current.key!==w)&&(m.current={key:w,promise:n.load(u)});let o=m.current;try{L=await o.promise}finally{m.current===o&&(m.current=null)}if(E.current!==w||!C.current)return!1;let g=l.current;if(g?.key===w||B.current===w)return g?V():!1}let $;try{$=ye(L,window.location.href)}catch(n){throw n}return l.current={key:w,origin:"url",state:$,configurationApplied:!1,cameraApplied:!1},V()},[V,b,s,i]);xe(()=>{l.current&&V().catch(h)}),xe(()=>{let r=()=>{N().catch(h)};return window.addEventListener("hashchange",r),()=>window.removeEventListener("hashchange",r)},[N,h]);let a=null;if(e.autoSync!==!1&&p&&!l.current&&!m.current)try{a=ge(S())}catch{}return xe(()=>{if(e.autoSync===!1||!p||l.current||m.current){b();return}if(a===null){try{S()}catch(r){h(r)}return}return v.current=setTimeout(()=>{v.current=null;try{_()}catch(r){h(r)}},Math.max(0,e.debounceMs??400)),b},[a,e.autoSync,e.debounceMs,p,b,S,_,h]),{getState:S,getStateAsync:R,restoreState:J,getShareUrl:q,createShareUrl:X,syncUrl:_,restoreFromUrl:N}}import{useCallback as pe,useState as vt}from"react";var fr={};function Mt(){return`asset-${globalThis.crypto.randomUUID()}`}function gr(e){let[t,i]=vt(e),[s,p]=vt(()=>e[0]?re(e[0]):""),y=t.find(C=>re(C)===s)??t[0],l=y?re(y):"",x=pe(C=>{i(h=>h.map(b=>re(b)===l?{...b,objectBindings:C}:b))},[l]),B=pe(C=>{i(h=>h.map(b=>re(b)===l?{...b,sceneConfig:C}:b))},[l]),O=pe(C=>p(h=>{let b=t.find(f=>f.url===C);return b?re(b):h}),[t]),v=pe(C=>{let h={...C,id:C.id??Mt()};return i(b=>{if(b.some(f=>re(f)===h.id))throw new Error("Asset instance ID already exists.");return[...b,h]}),h.id},[]),m=pe(C=>{let h=t.find(j=>re(j)===C);if(!h)return null;let b=structuredClone(h);b.id=Mt(),b.sceneConfig?.measurements&&(b.sceneConfig.measurements.items=b.sceneConfig.measurements.items.map(j=>({...j,modelId:b.id}))),b.label=`${h.label??"Asset"} copy`;let[f,S,R]=h.transform?.position??[0,0,0];return b.transform={...b.transform,position:[f+1,S,R]},i(j=>[...j,b]),b.id},[t]),k=pe(C=>{i(h=>h.filter(b=>re(b)!==C))},[]),E=pe((C,h)=>{let b=Ee(h);i(f=>f.map(S=>re(S)===C?{...S,transform:b}:S))},[]);return{modelUrl:y?.url??"",models:t,activeModelId:l,onModelChange:O,onActiveModelChange:p,objectBindings:fr,onObjectBindingsChange:x,sceneConfig:y?.sceneConfig,onSceneConfigChange:B,addModel:v,duplicateModel:m,removeModel:k,updateModelTransform:E}}import{useCallback as be,useEffect as mr,useState as br,useSyncExternalStore as wr}from"react";var yr={sequenceId:null,time:0,duration:0,status:"stopped",previewing:!1,ready:!1,issues:[]},hr=()=>()=>{},Pt=()=>yr;function Vr(){let[e,t]=br(null),i=wr(e?.subscribe??hr,e?.getState??Pt,Pt);mr(()=>()=>e?.stop(),[e]);let s=be(p=>t(p),[]);return{controls:e,playback:i,handleSequencesReady:s,play:be(p=>e?.play(p)??!1,[e]),pause:be(()=>e?.pause(),[e]),stop:be(()=>e?.stop(),[e]),seek:be(p=>e?.seek(p)??!1,[e]),select:be(p=>e?.select(p)??!1,[e])}}export{hn as ACTION_CATALOG,kn as AssetDiagnosticsPanel,gt as CompareViewer,Lt as DEFAULT_MODEL_VIEWER_LABELS,Se as DEFAULT_SCENE_CONFIG,Ce as DEFAULT_SECTION_CONFIG,En as MATERIAL_BLENDING_MODES,An as MATERIAL_SIDES,fn as MAX_VIEWER_STATE_BYTES,_t as MEASUREMENT_UNITS,yn as MODEL_VIEWER_PRESETS,ke as ModelViewer,jn as ProductOptions,At as SEQUENCE_EASINGS,xt as SEQUENCE_OBJECT_PROPERTIES,vn as applyIsolation,pn as applyProductOptions,Sn as applyStyleRules,Rn as buildBindingsFromNodes,qt as calibrateMeasurements,Yt as chooseMaterialVariant,Tn as collectObjectHierarchy,Cn as colorScaleValue,Ue as compareViewerConfigurations,In as copyBindingStyle,gn as createARHandoffUrl,Pn as createDefaultBinding,on as decodeProductSelections,Jt as defaultProductSelections,xn as defineObjectBindings,rn as encodeProductSelections,Qt as evaluateProductConfiguration,bn as exportConfiguredUSDZ,Vn as findCatalogAction,tn as formatProductPrice,sn as generateProductSkus,Ht as groundAsset,Mn as inferType,wn as inspectAsset,Bn as isolatedBindingKeys,Ie as material,Kt as measurementResult,Nt as measurementScale,Ft as measurementValue,$t as measurementsToCsv,Ee as parseAssetTransform,Gt as parseMeasurements,un as parseProductConfiguration,Xt as parseProductDefinition,ln as parseSceneProduct,kt as parseSectionConfig,Wt as parseSelectionSets,Et as parseSequences,ye as parseViewerState,Ln as pasteBindingStyle,fe as patchBindings,_e as patchSceneConfig,Le as prepareViewerState,nn as productCheckoutUrl,an as productDefinitionWarnings,cn as productOptionStates,en as productPriceFromDefinition,mn as readARHandoffUrl,Zt as resolveProductSelections,Tt as sampleSequenceTrack,Ne as sceneLight,Ut as sectionSnapshot,ce as selectBindingKeys,Te as selectBindings,zt as serializeMeasurements,dn as serializeProductConfiguration,ge as serializeViewerState,Dt as snapAssetToGrid,It as upsertSequenceKeyframe,ar as useObjectBinding,lr as useObjectBindingIds,Ke as useObjectBindings,On as useProductConfigurator,Ge as useSceneConfig,pr as useShareableViewerState,or as useViewer,$e as useViewerActions,qe as useViewerAnimations,Ae as useViewerCamera,We as useViewerConnection,Qe as useViewerEffects,Ze as useViewerHover,et as useViewerIsolation,tt as useViewerModel,gr as useViewerModels,nt as useViewerSelection,Vr as useViewerSequences};
1
+ "use client";import{c as ke}from"./chunk-CHMFH4D4.mjs";import"./chunk-MMO7KCYU.mjs";import{a as _e,b as Ne,c as xn}from"./chunk-F5QSXMME.mjs";import{b as yn,f as On,g as jn,q as dt,r as ut,s as He,t as pt,u as qe,v as kn}from"./chunk-LU3BQ7WG.mjs";import"./chunk-CUDL77ZY.mjs";import"./chunk-FGAJ2UT7.mjs";import"./chunk-SOAUR4DL.mjs";import{v as at,w as ct}from"./chunk-IEKGBS46.mjs";import{a as it,b as st}from"./chunk-3GA7JFNH.mjs";import"./chunk-37YITTIK.mjs";import"./chunk-2AJK643D.mjs";import"./chunk-5C4H7SRF.mjs";import"./chunk-3PLML3PO.mjs";import{$ as zt,A as kt,Aa as Pn,B as Ut,Ba as Rn,Ca as lt,F as re,Fa as Ue,G as Ee,Ga as De,Ha as An,I as Dt,Ia as En,J as Ht,Ja as Tn,Ka as In,La as Ln,T as _t,V as Nt,X as qt,Y as Ft,Z as Kt,_ as Gt,aa as $t,ba as Wt,ca as fn,da as me,e as ot,ea as he,fa as Le,ka as gn,la as mn,p as Ae,qa as bn,ra as hn,ta as Vn,xa as Bn,y as Ce,ya as vn,z as Se,za as Mn}from"./chunk-QZNUWZG7.mjs";import{a as xt,b as At,e as Et,f as Tt,g as It}from"./chunk-LX3GXQNU.mjs";import{b as ge,c as Ie,d as Xt,e as Jt,f as Qt,g as Zt,h as en,i as tn,j as nn,k as rn,l as on,m as sn,n as an,o as cn,p as ln,q as dn,r as un,s as pn}from"./chunk-7JCFNZJM.mjs";import"./chunk-37QOMZW6.mjs";import{b as Cn,c as Sn}from"./chunk-CCBFMNAU.mjs";import{a as Z,b as ce,c as Te}from"./chunk-GV4ZRXL6.mjs";import"./chunk-7OWHW66D.mjs";import{e as wn}from"./chunk-KFLS7GI6.mjs";import{a as Lt}from"./chunk-3I7PPFUV.mjs";import{c as Yt}from"./chunk-BNKTI3CY.mjs";import"./chunk-UCD76KQ6.mjs";import"./chunk-TUYVYSN5.mjs";import"./chunk-RXZ4Q7CY.mjs";import"./chunk-JR557W27.mjs";import{useCallback as Un,useEffect as Oe,useMemo as je,useRef as Fe,useState as be}from"react";import{jsx as ue,jsxs as ft}from"react/jsx-runtime";var Dn=Object.freeze({});function gt(e){return ue(it,{labels:e.labels,children:ue(Hn,{...e})})}function Hn({before:e,after:t,layout:o="slider",split:s,onSplitChange:f,reveal:y="auto",semanticComparison:l=!1,showComparisonOutlines:x,onComparisonOutlinesChange:E,onComparisonChange:B,linkSections:h,...p}){let I=st(),[P,S]=be(y==="auto");Oe(()=>{y==="auto"&&S(!0)},[y]);let[V,b]=be(.5),[g,O]=be(!0),R=x??g,j=M=>{x===void 0&&O(M),E?.(M)},q=He(s??V),X=Un(M=>{let A=He(M);s===void 0&&b(A),f?.(A)},[s,f]),_=Fe([null,null]),[C,J]=be([null,null]),[N,a]=be(null),[r,c]=be(null),u=[{...p,...e},{...p,...t}];Oe(()=>a(null),[u[0].sceneConfig?.section,u[1].sceneConfig?.section]);let w=M=>{let A=u[M].objectBindings;return A&&typeof A=="object"?A:C[M]?.url===u[M].modelUrl?C[M].bindings:Dn},k=w(0),$=w(1),n=je(()=>l?Ue({objectBindings:k,sceneConfig:u[0].sceneConfig},{objectBindings:$,sceneConfig:u[1].sceneConfig},typeof l=="object"?l:{}):null,[l,k,$,u[0].sceneConfig,u[1].sceneConfig]),i=n?JSON.stringify(n):"",m=Fe(null);Oe(()=>{n&&m.current!==i&&(m.current=i,B?.(n))},[n,i,B]);let d=n?.objects.find(M=>M.id===r),v=je(()=>n?[De(n,"before",r),De(n,"after",r)]:null,[n,r]),L=je(()=>ut(),[]);Oe(()=>()=>L.detach(),[L]);let T=[e,t],D=je(()=>[0,1].map(M=>(A,W)=>{_.current[M]=A,J(G=>G[M]?.bindings===A.objectBindings&&G[M]?.url===W?G:G.map((z,ye)=>ye===M?{url:W,bindings:A.objectBindings}:z)),L.attach(M,A.raw.controls,A.invalidate)}),[L]),Y=T.map((M,A)=>{let{label:W,...G}=M,z={preset:"minimal",...p,...G,refitOnResize:G.refitOnResize??p.refitOnResize??!1},ye=G.onViewerReady??p.onViewerReady;return{...z,...h??!!l?{sceneConfig:{...z.sceneConfig,section:N??u[1].sceneConfig?.section??Ce},onSceneConfigChange:oe=>{a(oe.section??Ce),(G.onSceneConfigChange??p.onSceneConfigChange)?.(oe)}}:{},...v?{comparisonHighlights:R?v[A]:void 0,selectedObject:A===0?d?.beforeKey?k[d.beforeKey]:null:d?.afterKey?$[d.afterKey]:null}:{},onObjectSelect:oe=>{if((G.onObjectSelect??p.onObjectSelect)?.(oe),n){let Ve=n.objects.find(Q=>(A===0?Q.beforeObjectId:Q.afterObjectId)===oe?.modelObjectId);c(Ve?.id??null)}},onViewerReady:oe=>{D[A](oe,z.modelUrl),ye?.(oe)}}}),K=[e.label??I("compareBefore"),t.label??I("compareAfter")];(!Y[0].modelUrl||!Y[1].modelUrl)&&console.error("[react-immersive] CompareViewer needs a modelUrl, shared or on each side.");let ae=Fe(null),ne=n?ue(dt,{showOutlines:R,onShowOutlinesChange:j,report:n,selected:r,onSelect:M=>{c(M.id);let A=M.afterObjectId?1:0,W=_.current[A],G=A===1?M.afterObjectId:M.beforeObjectId,z=G?W?.raw.nodes[G]:null;W&&z&&(L.setLeader(A),W.raw.controls.fitToBox(z,!0),W.invalidate())},onClear:()=>c(null)}):null;if(!P)return ue(at,{className:"ri-compare",background:ct(p.backgroundColor,p.sceneConfig),poster:p.poster??t.poster??e.poster,onReveal:()=>S(!0)});let F=o==="side-by-side";return ft("div",{ref:ae,className:`ri-compare ${F?"ri-compare--sideBySide":"ri-compare--slider"}`,style:F?void 0:{"--ri-compare-split":`${q*100}%`},children:[Y.map((M,A)=>ft("div",{className:F?"ri-compare__pane":A===1?"ri-compare__layer ri-compare__layer--after":"ri-compare__layer",children:[ue(ke,{...M}),F?ue("span",{className:"ri-compare__label",children:K[A]}):null]},A)),ne,F?null:ue(pt,{split:q,onSplitChange:X,labels:[K[0],K[1]],containerRef:ae})]})}import{useCallback as Re,useRef as jt}from"react";import{useCallback as H,useMemo as mt,useState as _n}from"react";var bt={baseColor:"texture",metalness:"metalnessMap",roughness:"roughnessMap",emissive:"emissiveMap",alpha:"alphaMap",normal:"normalMap",bump:"bumpMap",ao:"aoMap",displacement:"displacementMap",clearcoat:"clearcoatMap",clearcoatRoughness:"clearcoatRoughnessMap",clearcoatNormal:"clearcoatNormalMap",anisotropy:"anisotropyMap",transmission:"transmissionMap",thickness:"thicknessMap",sheenColor:"sheenColorMap",sheenRoughness:"sheenRoughnessMap",specularIntensity:"specularIntensityMap",specularColor:"specularColorMap"};function wt(e){if(e)return Object.fromEntries(Object.entries(e).map(([t,o])=>[t,o&&typeof o=="object"?{...o}:o]))}function Nn(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t.visible===!1).map(([t])=>[t,!0]))}function Ke(e){let[t,o]=_n(e),s=H((a,r)=>{o(c=>r===void 0?ge(c,a):ge(c,a,r))},[]),f=H((a,r)=>s(a,Ie(r)),[s]),y=H((a,r)=>f(a,{baseColor:r}),[f]),l=H((a,r,c="baseColor")=>{let u=bt[c],w=typeof r=="string"?{path:r}:r;s(a,{style:{material:{[u]:w}}})},[s]),x=H((a,r="baseColor")=>{let c=bt[r];s(a,{style:{material:{[c]:void 0}}})},[s]),E=H((a,r)=>{o(c=>{let u=Z(c,a);if(!u)return c;let w=wt(c[u]?.style?.material),k=ce(c,r);if(k.length===0)return c;let $=c;for(let n of k){let i=c[n];i&&($===c&&($={...c}),$[n]={...i,style:{...i.style,material:wt(w)}})}return $})},[]),B=H(a=>s(a,{style:{material:void 0}}),[s]),h=H((a,r)=>s(a,{transform:r}),[s]),p=H(a=>s(a,{transform:void 0}),[s]),I=H((a,r)=>s(a,{metadata:r}),[s]),P=H((a,r)=>{o(c=>{let u=c;for(let w of ce(c,a)){let k=c[w],$=r(k.decals??[]);u===c&&(u={...c}),u[w]={...k,decals:$.length>0?$:void 0}}return u})},[]),S=H((a,r)=>{let c=r.id??`decal-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;return P(a,u=>[...u.filter(w=>w.id!==c),{...r,id:c}]),c},[P]),V=H((a,r,c)=>P(a,u=>u.map(w=>w.id===r?{...w,...c}:w)),[P]),b=H((a,r)=>P(a,c=>c.filter(u=>u.id!==r)),[P]),g=H(a=>Te(t,a),[t]),O=H(a=>ce(t,a).map(r=>t[r]?.id??r),[t]),R=H(a=>{let r=Z(t,a);return r?t[r]?.style?.material??null:null},[t]),j=H(a=>s(a,{visible:!1}),[s]),q=H(a=>s(a,{visible:!0}),[s]),X=H(a=>{o(r=>{let c=ce(r,a).reduce((u,w)=>{let k=r[w];return k&&u.push({ids:w,patch:{visible:k.visible===!1}}),u},[]);return ge(r,c)})},[o]),_=H(()=>{o(a=>ge(a,Object.keys(a),{visible:!0}))},[o]),C=mt(()=>Nn(t),[t]),J=mt(()=>Object.keys(C).map(a=>t[a]?.id??a),[C,t]),N=H(a=>{let r=Z(t,a);return r?t[r]?.visible===!1:!1},[t]);return{objectBindings:t,setObjectBindings:o,updateObjectBindings:s,setMaterial:f,setBaseColor:y,setTexture:l,clearTexture:x,copyMaterial:E,resetMaterial:B,getMaterial:R,setTransform:h,resetTransform:p,updateMetadata:I,addDecal:S,updateDecal:V,removeDecal:b,selectObjectBindings:g,selectObjectBindingIds:O,hiddenObjects:C,hiddenObjectIds:J,hideObject:j,showObject:q,toggleObjectVisibility:X,isObjectHidden:N,clearHiddenObjects:_}}import{useCallback as ee,useMemo as qn,useRef as Fn,useState as Kn}from"react";function Ge(e){let t=Fn(null),[o,s]=Kn(()=>{let g=typeof e=="function"?e():e;return t.current=g,g}),f=ee(g=>{s(O=>{let R=typeof g=="function"?g(O):g;return _e(O,R)})},[]),y=ee(()=>{let g=t.current;g&&s(g)},[]),l=ee((g,O)=>{f(R=>({lighting:{lights:R.lighting.lights.map(j=>j.id===g?{...j,...O}:j)}}))},[f]),x=ee(g=>{f(O=>O.lighting.lights.some(R=>R.id===g.id)?{}:{lighting:{lights:[...O.lighting.lights,Ne(g)]}})},[f]),E=ee(g=>{f(O=>({lighting:{lights:O.lighting.lights.filter(R=>R.id!==g)}}))},[f]),B=ee((g,O)=>l(g,{intensity:O}),[l]),h=ee((g,O)=>l(g,{color:O}),[l]),p=ee(g=>l(g,{visible:!0}),[l]),I=ee(g=>l(g,{visible:!1}),[l]),P=ee(g=>{f(O=>({lighting:{lights:O.lighting.lights.map(R=>R.id===g?{...R,visible:!R.visible}:R)}}))},[f]),S=ee((g,O)=>l(g,{attachment:O,attachedToCamera:!1}),[l]),V=ee(g=>l(g,{attachment:void 0}),[l]),b=qn(()=>({items:o.lighting.lights,get:g=>o.lighting.lights.find(O=>O.id===g),add:x,update:l,remove:E,setIntensity:B,setColor:h,show:p,hide:I,toggle:P,attach:S,detach:V}),[o.lighting.lights,x,l,E,B,h,p,I,P,S,V]);return{sceneConfig:o,setSceneConfig:s,updateSceneConfig:f,resetSceneConfig:y,lights:b}}import{useCallback as ze}from"react";function $e({bindings:e,scene:t,camera:o,animations:s,isolation:f,onAction:y}){let{objectBindings:l,updateObjectBindings:x,showObject:E,hideObject:B,toggleObjectVisibility:h}=e,p=t?.updateSceneConfig,I=o?.focusObject,P=o?.fitScene,S=o?.resetView,V=o?.setCameraTarget,b=o?.setCameraState,g=s?.play,O=s?.pause,R=s?.stop,j=s?.setSpeed,q=s?.seek,X=f?.handleIsolationChange,_=ze(N=>{let a=Z(l,N);return a?l[a]?.actions??[]:[]},[l]),C=ze(async N=>{for(let a of N.action.effects??[]){if("objectBindings"in a){x(a.target,a.objectBindings);continue}if("sceneConfig"in a){p?.(a.sceneConfig);continue}if("isolation"in a){X?.(a.isolation);continue}if("visibility"in a){a.visibility==="show"?E(a.target):a.visibility==="hide"?B(a.target):h(a.target);continue}if("camera"in a){let c=a.camera;c.type==="focus-object"?await I?.(c.objectId??N.objectId):c.type==="fit-scene"?await P?.():c.type==="reset"?await S?.():c.type==="set-target"?await V?.(c.target,c.transition??!0):await b?.(c.state,c.transition??!0);continue}let r=a.animation;if(r.type==="play"){let{type:c,clip:u,...w}=r;g?.(u,w)}else r.type==="pause"?O?.(r.clip):r.type==="stop"?R?.(r.clip):r.type==="set-speed"?j?.(r.speed,r.clip):q?.(r.time,r.clip)}await y?.(N)},[P,I,B,y,O,g,S,q,j,b,V,X,E,R,h,x,p]),J=ze(async(N,a)=>{let r=Z(l,N);if(!r)return null;let c=l[r],u=c?.actions?.find(k=>k.id===a);if(!c||!u)return null;let w={objectId:r,action:u,binding:c};return await C(w),w},[C,l]);return{getActionsForObject:_,handleAction:C,runAction:J}}import{useCallback as pe,useRef as yt}from"react";function Gn(e){return typeof e=="function"?e:e?.handleViewerReady??null}function We(...e){let t=yt(null),o=yt(e);o.current=e;let s=pe(h=>{t.current=h;let p=new Set;for(let I of o.current){let P=Gn(I);P&&!p.has(P)&&(p.add(P),P(h))}},[]),f=pe(()=>t.current,[]),y=pe(h=>t.current?.goToAnnotation(h)??Promise.resolve(!1),[]),l=pe(()=>t.current?.startAR()??Promise.resolve(!1),[]),x=pe(h=>{let p=t.current;return p?p.captureImage(h):Promise.reject(new Error("ModelViewer is not ready yet."))},[]),E=pe(()=>{let h=t.current;return h?(h.invalidate(),!0):!1},[]),B=pe(h=>{let p=t.current;return p?p.captureVideo(h):Promise.reject(new Error("ModelViewer is not ready yet."))},[]);return{handleViewerReady:s,getViewer:f,goToAnnotation:y,startAR:l,captureImage:x,captureVideo:B,invalidate:E}}import{useCallback as U,useEffect as zn,useRef as ie}from"react";import{Material as $n,PointLight as Wn,Vector3 as Yn}from"three";var Je=["emissiveIntensity","opacity","metalness","roughness","transmission","clearcoat","clearcoatRoughness","ior","thickness"],Be=1;function ve(e){return typeof e=="string"?[e]:e}function Me(e,t=0,o=1){return Math.min(o,Math.max(t,e))}function Ye(e,t){return e+Math.random()*(t-e)}function ht([e,t],o){return e+(t-e)*o}function Xe([e,t],o){return[e[0]+(t[0]-e[0])*o,e[1]+(t[1]-e[1])*o,e[2]+(t[2]-e[2])*o]}function Vt(e,t){let o=Me(e);switch(t){case"ease-in":return o*o;case"ease-out":return 1-(1-o)*(1-o);case"ease-in-out":return o<.5?2*o*o:1-Math.pow(-2*o+2,2)/2;default:return o}}function Xn(e){let t=e.material;return t?(Array.isArray(t)?t:[t]).filter(o=>o instanceof $n):[]}function Jn(e){let t={opacity:e.opacity,transparent:e.transparent};e.color&&(t.baseColor=`#${e.color.getHexString()}`),e.emissive&&(t.emissive=`#${e.emissive.getHexString()}`);for(let o of Je){let s=e[o];typeof s=="number"&&(t[o]=s)}return t}function Ct(e,t){t.baseColor!==void 0&&e.color&&e.color.set(t.baseColor),t.emissive!==void 0&&e.emissive&&e.emissive.set(t.emissive);for(let o of Je){let s=t[o];s!==void 0&&typeof e[o]=="number"&&(e[o]=s)}t.transparent!==void 0&&(e.transparent=t.transparent),e.needsUpdate=!0}function Qn(e){return{position:[e.position.x,e.position.y,e.position.z],rotation:[e.rotation.x,e.rotation.y,e.rotation.z],scale:[e.scale.x,e.scale.y,e.scale.z],visible:e.visible}}function Zn(e,t){if(t.position&&e.position.set(...t.position),t.rotation&&e.rotation.set(...t.rotation),t.scale!==void 0){let o=typeof t.scale=="number"?[t.scale,t.scale,t.scale]:t.scale;e.scale.set(...o)}t.visible!==void 0&&(e.visible=t.visible),e.updateMatrix(),e.updateMatrixWorld(!0)}function Qe(e={}){let t=ie(e);t.current=e;let o=ie(null),s=ie(null),f=ie(null),y=ie(new Map),l=ie(new Map),x=ie(new Map),E=ie(new Map),B=U(n=>{let i=o.current;if(!i)return null;let m=Z(i.objectBindings,n);return i.raw.nodes[n]??(m?i.raw.nodes[m]:null)??(i.raw.scene?ot(i.raw.scene,n):null)??null},[]),h=U(n=>{let i=o.current;return i?typeof n=="object"&&!Array.isArray(n)?ce(i.objectBindings,n):ve(n).map(m=>Z(i.objectBindings,m)??m):typeof n=="string"?[n]:Array.isArray(n)?n:[]},[]),p=U(()=>{o.current?.invalidate()},[]),I=U((n,i)=>{let m=!1;for(let d of h(n)){let v=B(d);if(v)for(let L of Xn(v))x.current.has(L)||x.current.set(L,Jn(L)),Ct(L,i),m=!0}return m},[B,h]),P=U((n,i)=>{let m=I(n,i);return m&&p(),m},[p,I]),S=U((n,i)=>{let m=!1;for(let d of h(n)){let v=B(d);v&&(E.current.has(v)||E.current.set(v,Qn(v)),Zn(v,i),m=!0)}return m},[B,h]),V=U((n,i)=>{let m=S(n,i);return m&&p(),m},[p,S]),b=U(n=>{let i=B(n);if(!i)return null;i.updateWorldMatrix(!0,!1);let m=i.getWorldPosition(new Yn);return[m.x,m.y,m.z]},[B]),g=U(n=>{let i=l.current.get(n);return i?(i.light.removeFromParent(),i.light.dispose(),l.current.delete(n),p(),!0):!1},[p]),O=U(n=>{let i=B(n.target);if(!i)return!1;let m=l.current.get(n.id),d=m?.light??new Wn;return m&&m.target!==n.target&&d.removeFromParent(),d.name=`react-immersive-runtime-light:${n.id}`,d.color.set(n.color??"#ffffff"),d.intensity=n.intensity??1,d.distance=n.distance??0,d.decay=n.decay??2,d.castShadow=n.castShadow??!1,d.position.set(...n.offset??[0,0,0]),d.parent!==i&&i.add(d),l.current.set(n.id,{light:d,target:n.target}),p(),!0},[p,B]),R=U((n,i)=>{let m=l.current.get(n);if(!m)return!1;if(i.target&&i.target!==m.target){let d=B(i.target);if(!d)return!1;m.light.removeFromParent(),d.add(m.light),m.target=i.target}return i.color!==void 0&&m.light.color.set(i.color),i.intensity!==void 0&&(m.light.intensity=i.intensity),i.distance!==void 0&&(m.light.distance=i.distance),i.decay!==void 0&&(m.light.decay=i.decay),i.offset!==void 0&&m.light.position.set(...i.offset),i.castShadow!==void 0&&(m.light.castShadow=i.castShadow),p(),!0},[p,B]),j=U((n,i)=>{let m=d=>i[d%i.length]??0;for(let d of n.materials??[])h(d.targets).forEach((v,L)=>{let T=m(L),D={};for(let Y of Je){let K=d.values[Y];K&&(D[Y]=ht(K,T))}I(v,D)});for(let d of n.transforms??[])h(d.targets).forEach((v,L)=>{let T=m(L),D={};d.values.position&&(D.position=Xe(d.values.position,T)),d.values.rotation&&(D.rotation=Xe(d.values.rotation,T)),d.values.scale&&(D.scale=Xe(d.values.scale,T)),S(v,D)});for(let d of n.lights??[])ve(d.lights).forEach((v,L)=>{let T=l.current.get(v);T&&(T.light.intensity=ht(d.intensity,m(L)))})},[h,I,S]),q=ie(()=>{}),X=ie(()=>{});X.current=n=>{f.current=null;let i=!1;for(let[m,d]of y.current){d.startedAt===null&&(d.startedAt=n);let v=d.lastFrameAt??n;d.lastFrameAt=n;let L=d.override&&d.override.until>n?d.override.level:null;d.override&&L===null&&(d.override=null);let T=d.update(n,n-d.startedAt,Math.min(100,n-v),L);i=!0,T||(y.current.delete(m),d.onComplete?.())}i&&p(),y.current.size>0&&q.current()},q.current=()=>{f.current!==null||typeof requestAnimationFrame>"u"||(f.current=requestAnimationFrame(n=>X.current(n)))};let _=U(n=>(y.current.set(n.id,n),q.current(),n.id),[]),C=U((n,i={})=>{let m=i.id??`transition-${Be++}`,d=Math.max(1,i.duration??400),v=i.easing??"ease-in-out";return _({id:m,startedAt:null,lastFrameAt:null,override:null,onComplete:i.onComplete,update:(L,T,D,Y)=>{let K=Y??Vt(T/d,v);return j(n,[K]),T<d}})},[j,_]),J=U((n,i={})=>{let m=i.id??`pulse-${Be++}`,d=Math.max(1,i.duration??1e3),v=i.minLevel??0,L=i.maxLevel??1,T=i.repeat??1/0,D=i.synchronized??!0,Y=Math.max(1,...[...n.materials??[],...n.transforms??[]].map(K=>h(K.targets).length),...(n.lights??[]).map(K=>ve(K.lights).length));return _({id:m,startedAt:null,lastFrameAt:null,override:null,onComplete:i.onComplete,update:(K,ae,de,ne)=>{let F=ae/d,M=Array.from({length:D?1:Y},(A,W)=>{if(ne!==null)return ne;let G=F+(D?0:W/Y),z=.5-Math.cos(G%1*Math.PI*2)/2;return v+(L-v)*z});return j(n,M),T===1/0||F<T}})},[j,_,h]),N=U((n,i={})=>{let m=i.id??`timeline-${Be++}`,d=i.repeat??1,v=n.map(T=>({...T,duration:Math.max(1,T.duration),hold:Math.max(0,T.hold??0)})),L=Math.max(1,v.reduce((T,D)=>T+D.duration+D.hold,0));return _({id:m,startedAt:null,lastFrameAt:null,override:null,onComplete:i.onComplete,update:(T,D,Y,K)=>{if(v.length===0||d<=0)return!1;let ae=D/L;if(d!==1/0&&ae>=d){for(let F of v)j(F.channels,[1]);return!1}let de=D%L,ne=0;for(let F of v){let M=ne+F.duration,A=M+F.hold;if(de>=M){j(F.channels,[K??1]),ne=A;continue}if(de>=ne){let W=K??Vt((de-ne)/F.duration,F.easing??"ease-in-out");j(F.channels,[W]);break}}return!0}})},[j,_]),a=U((n,i={})=>{let m=i.id??`flicker-${Be++}`,d=i.synchronized??!0,v=i.minLevel??.15,L=i.maxLevel??1,T=i.interval??[45,160],D=typeof T=="number"?[T,T]:T,Y=[Math.max(1,Math.min(...D)),Math.max(1,Math.max(...D))],K=Me(i.response??.7,.01,1),ae=Me(i.blackoutChance??.08),de=Me(i.flashChance??.12),ne=i.flashLevel??1.15,F=Math.max(1,...[...n.materials??[],...n.transforms??[]].map(z=>h(z.targets).length),...(n.lights??[]).map(z=>ve(z.lights).length)),M=d?1:F,A=Array.from({length:M},()=>v),W=Array.from({length:M},()=>v),G=Array.from({length:M},()=>0);return _({id:m,startedAt:null,lastFrameAt:null,override:null,onComplete:i.onComplete,update:(z,ye,oe,Ve)=>{for(let Q=0;Q<M;Q+=1){if(Ve!==null)W[Q]=Ve;else if(z>=G[Q]){let rt=Math.random();W[Q]=rt<ae?Ye(0,Math.min(.04,v)):rt<ae+de?ne:Ye(v,L),G[Q]=z+Ye(...Y)}let Rt=1-Math.pow(1-K,Math.max(1,oe)/16.67);A[Q]+=(W[Q]-A[Q])*Rt}return j(n,A),i.duration===void 0||ye<i.duration}})},[j,_,h]),r=U((n,i,m)=>{let d=y.current.get(n);if(!d)return!1;let v=typeof performance>"u"?Date.now():performance.now();return d.override={level:i,until:v+Math.max(0,m)},q.current(),!0},[]),c=U(n=>y.current.delete(n),[]),u=U(()=>{y.current.clear(),f.current!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(f.current),f.current=null)},[]),w=U(()=>{for(let[n,i]of x.current)Ct(n,i);x.current.clear();for(let[n,i]of E.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);E.current.clear();for(let n of l.current.values())n.light.removeFromParent(),n.light.dispose();l.current.clear(),p()},[p]),k=U(()=>{u(),w()},[w,u]),$=U(n=>{s.current&&s.current!==n.raw.scene&&w(),o.current=n,s.current=n.raw.scene,t.current.onViewerReady?.(n)},[w]);return zn(()=>()=>{k(),o.current=null,s.current=null},[k]),{handleViewerReady:$,setMaterial:P,setTransform:V,getWorldPosition:b,addPointLight:O,updatePointLight:R,removePointLight:g,transition:C,timeline:N,pulse:J,flicker:a,overrideEffect:r,stopEffect:c,stopAllEffects:u,resetRuntime:k}}import{useCallback as er,useState as tr}from"react";function Ze(){let[e,t]=tr(null),o=er(s=>{t(s)},[t]);return{hoveredObjectBinding:e,handleHoveredObject:o}}import{useCallback as St,useState as nr}from"react";function et(e=null){let[t,o]=nr(e),s=St((y,l)=>o({...l,target:y}),[]),f=St(()=>o(null),[]);return{isolation:t,isolate:s,clearIsolation:f,handleIsolationChange:o}}import{useCallback as Pe,useState as le}from"react";function tt(){let[e,t]=le(!0),[o,s]=le(!1),[f,y]=le(null),[l,x]=le(null),[E,B]=le(0),[h,p]=le([]),[I,P]=le([]),[S,V]=le([]),b=Pe(j=>{x(j.bounds),B(j.objectCount),p(j.materialVariants),P(j.materialVariantGroups),y(null),t(!1),s(!0)},[]),g=Pe(j=>V(j),[]),O=Pe(j=>{y(j),x(null),B(0),p([]),P([]),V([]),t(!1),s(!1)},[]),R=Pe(()=>{t(!0),s(!1),y(null),x(null),B(0),p([]),P([]),V([])},[]);return{isLoading:e,isReady:o,error:f,bounds:l,objectCount:E,materialVariants:h,materialVariantGroups:I,objects:S,handleModelLoaded:b,handleObjectCatalog:g,handleLoadError:O,resetModelState:R}}import{useCallback as Ot,useState as rr}from"react";function nt(e=null){let[t,o]=rr(e),s=Ot(y=>{o(y)},[o]),f=Ot(()=>{o(null)},[]);return{selectedObjectBinding:t,setSelectedObjectBinding:o,handleObjectSelect:s,clearSelection:f}}var or={};function ir(e={}){let t=jt(e);t.current=e;let o=jt(e.bindings===void 0||e.bindings==="auto"),s=Ke(()=>{let C=t.current.bindings;return C===void 0||C==="auto"?or:typeof C=="function"?C():C}),f=Ge(()=>{let C=t.current.sceneConfig;return C===void 0?Se:typeof C=="function"?C():C}),y=nt(),l=Ze(),x=Ae(e.camera),E=tt(),B=qe(),h=et(),p=Qe(),I=We(x,p),P=$e({bindings:s,scene:f,camera:x,animations:B,isolation:h,onAction:e.onAction}),{setObjectBindings:S}=s,{handleObjectCatalog:V}=E,b=Re(C=>{V(C),o.current&&S(J=>{let N=lt(C.map(a=>a.name));for(let a of Object.keys(N))J[a]&&(N[a]=J[a]);return N})},[V,S]),{handleObjectSelect:g}=y,O=Re(C=>{g(C),t.current.onObjectSelect?.(C)},[g]),{handleHoveredObject:R}=l,j=Re(C=>{R(C),t.current.onObjectHover?.(C)},[R]),{handleLoadError:q}=E,X=Re(C=>{q(C),t.current.onLoadError?.(C)},[q]),_=e.sceneConfig!==void 0||f.sceneConfig!==Se;return{props:{objectBindings:s.objectBindings,onObjectBindingsChange:S,selectedObject:y.selectedObjectBinding,onObjectSelect:O,onObjectHover:j,onCameraChange:x.handleCameraChange,onViewerReady:I.handleViewerReady,onModelLoaded:E.handleModelLoaded,onLoadError:X,onObjectCatalog:b,onAnimationsReady:B.handleAnimationsReady,onAction:P.handleAction,onSceneConfigChange:f.setSceneConfig,isolation:h.isolation,onIsolationChange:h.handleIsolationChange,..._?{sceneConfig:f.sceneConfig}:{}},bindings:s,selection:y,hover:l,camera:x,model:E,animations:B,actions:P,scene:f,isolation:h,effects:p,connection:I}}import{useMemo as sr}from"react";function ar(e,t){return sr(()=>{if(!t)return null;let o=e[t];return o||(Object.values(e).find(s=>s.id===t||s.modelObjectId===t)??null)},[e,t])}import{useMemo as cr}from"react";function lr(e){return cr(()=>Object.values(e).map(t=>t.modelObjectId),[e])}import{useCallback as te,useEffect as xe,useRef as se,useState as dr}from"react";function ur(e,t){if(!e.objectBindings&&(!!e.hidden?.length||!!e.selected)&&Object.keys(t).length===0)return null;let s={};if(e.objectBindings)s.bindings=e.objectBindings;else if(e.hidden){let f=new Set(e.hidden);s.bindings=Object.fromEntries(Object.entries(t).map(([y,l])=>[y,{...l,visible:!f.has(l.id)}]))}if(e.selected!==void 0){let f=e.objectBindings??t,y=e.selected?Z(f,e.selected):null;s.selected=y?f[y]:null}return s}function Bt(e){return JSON.stringify(e&&{modelUrl:e.modelUrl,activeModelId:e.activeModelId,tilesetUrl:e.tilesetUrl,mergeModels:e.mergeModels,models:e.models?.map(({id:t,url:o,mergeModels:s})=>({id:t,url:o,mergeModels:s}))})}function pr(e){let t=se(e);t.current=e;let o=e.paramKey??"view",s=`${o}Id`,[f,y]=dr(!1),l=se(null),x=se(null),E=se(null),B=se(null),h=se(null),p=se(null),I=se(null),P=se(null),S=se(!0),V=te(r=>{let c=r instanceof Error?r:new Error(String(r));t.current.onError?t.current.onError(c):I.current!==c.message&&console.warn("[react-immersive]",c.message),I.current=c.message},[]),b=te(()=>{h.current!==null&&clearTimeout(h.current),h.current=null},[]);xe(()=>(S.current=!0,()=>{S.current=!1,b()}),[b]);let g=te(()=>{let r=t.current,c=(r.mode??(r.configuration?"configuration":"view"))==="configuration";return{version:1,camera:r.cameraState??void 0,hidden:Object.values(r.objectBindings).filter(u=>u.visible===!1).map(u=>u.id),selected:r.selectedObjectBinding?.id??null,...c?{objectBindings:r.objectBindings,configuration:r.configuration}:{}}},[]),O=te(()=>he(g(),typeof window>"u"?void 0:window.location.href),[g]),R=te(()=>Le(g(),typeof window>"u"?void 0:window.location.href),[g]),j=te((r,c,u=window.location.href)=>{let w=new URL(u),k=new URLSearchParams(w.hash.slice(1));if(k.delete(o),k.delete(s),k.set(c?s:o,r),w.hash=k.toString(),!c&&w.href.length>(t.current.maxUrlLength??65536))throw new Error("Viewer configuration is too large for an inline link. Save JSON instead, or configure storage for createShareUrl(). Uploaded images can make links large.");return w.href},[o,s]),q=te(()=>j(me(O()),!1),[O,j]),X=te(async()=>{let r=window.location.href,c=t.current.storage,u=await R();if(!c)return j(me(u),!1,r);let w=await c.save(u);if(typeof w!="string"||!w.trim()||w.length>2048)throw new Error("Viewer state storage returned an invalid id.");return j(w,!0,r)},[R,j]),_=te(()=>{if(b(),l.current||p.current)return;let r=q();window.history.replaceState(null,"",r),B.current=`inline:${new URL(r).hash}`},[b,q]),C=te(async()=>{let r=l.current;if(!r||x.current||!S.current)return!1;x.current=r,b();try{let c=t.current,u=r.state;if(u.configuration&&!r.configurationApplied){if(!c.onConfigurationChange)throw new Error("Restoring a full viewer configuration requires onConfigurationChange.");return r.configurationApplied=!0,c.onConfigurationChange(u.configuration),!1}if(u.configuration&&Bt(c.configuration)!==Bt(u.configuration)||c.isReady===!1)return!1;if(u.camera&&!r.cameraApplied){if(!await c.setCameraState(u.camera,!1)||l.current!==r||!S.current)return!1;r.cameraApplied=!0}c=t.current;let w=ur(u,c.objectBindings);return!w||l.current!==r?!1:(w.bindings&&c.onObjectBindingsChange(w.bindings),w.selected!==void 0&&c.setSelectedObjectBinding(w.selected),l.current=null,E.current=r.key,y(!0),!0)}catch(c){throw l.current===r&&(l.current=null),y(!1),c}finally{x.current=null,l.current&&l.current!==r&&S.current&&C().catch(V)}},[b,V]),J=te(async r=>{let c=he(r,window.location.href);b(),P.current=null,p.current=null;let u=new URLSearchParams(window.location.hash.slice(1));return B.current=u.has(o)?`inline:${window.location.hash}`:u.has(s)?`stored:${s}:${u.get(s)}`:null,E.current=null,l.current={key:`manual:${me(c)}`,origin:"manual",state:c,configurationApplied:!1,cameraApplied:!1},y(!1),C()},[C,b,o,s]),N=te(async()=>{let r=new URLSearchParams(window.location.hash.slice(1)),c=r.get(o),u=r.get(s),w=c!==null?`inline:${window.location.hash}`:u!==null?`stored:${s}:${u}`:null;if(!w)return P.current=null,p.current=null,l.current?.origin==="manual"?C():(l.current=null,E.current=null,y(!0),!1);if(w===B.current||w===E.current)return l.current?.origin==="manual"?C():!1;if(l.current?.key===w)return C();b(),y(!1),P.current=w,l.current=null;let k=c;if(c===null){let n=t.current.storage;if(!n)throw new Error("This shared link requires a viewer state storage adapter.");(!p.current||p.current.key!==w)&&(p.current={key:w,promise:n.load(u)});let i=p.current;try{k=await i.promise}finally{p.current===i&&(p.current=null)}if(P.current!==w||!S.current)return!1;let m=l.current;if(m?.key===w||E.current===w)return m?C():!1}let $;try{$=he(k,window.location.href)}catch(n){throw n}return l.current={key:w,origin:"url",state:$,configurationApplied:!1,cameraApplied:!1},C()},[C,b,s,o]);xe(()=>{l.current&&C().catch(V)}),xe(()=>{let r=()=>{N().catch(V)};return window.addEventListener("hashchange",r),()=>window.removeEventListener("hashchange",r)},[N,V]);let a=null;if(e.autoSync!==!1&&f&&!l.current&&!p.current)try{a=me(O())}catch{}return xe(()=>{if(e.autoSync===!1||!f||l.current||p.current){b();return}if(a===null){try{O()}catch(r){V(r)}return}return h.current=setTimeout(()=>{h.current=null;try{_()}catch(r){V(r)}},Math.max(0,e.debounceMs??400)),b},[a,e.autoSync,e.debounceMs,f,b,O,_,V]),{getState:O,getStateAsync:R,restoreState:J,getShareUrl:q,createShareUrl:X,syncUrl:_,restoreFromUrl:N}}import{useCallback as fe,useState as vt}from"react";var fr={};function Mt(){return`asset-${globalThis.crypto.randomUUID()}`}function gr(e){let[t,o]=vt(e),[s,f]=vt(()=>e[0]?re(e[0]):""),y=t.find(S=>re(S)===s)??t[0],l=y?re(y):"",x=fe(S=>{o(V=>V.map(b=>re(b)===l?{...b,objectBindings:S}:b))},[l]),E=fe(S=>{o(V=>V.map(b=>re(b)===l?{...b,sceneConfig:S}:b))},[l]),B=fe(S=>f(V=>{let b=t.find(g=>g.url===S);return b?re(b):V}),[t]),h=fe(S=>{let V={...S,id:S.id??Mt()};return o(b=>{if(b.some(g=>re(g)===V.id))throw new Error("Asset instance ID already exists.");return[...b,V]}),V.id},[]),p=fe(S=>{let V=t.find(j=>re(j)===S);if(!V)return null;let b=structuredClone(V);b.id=Mt(),b.sceneConfig?.measurements&&(b.sceneConfig.measurements.items=b.sceneConfig.measurements.items.map(j=>({...j,modelId:b.id}))),b.label=`${V.label??"Asset"} copy`;let[g,O,R]=V.transform?.position??[0,0,0];return b.transform={...b.transform,position:[g+1,O,R]},o(j=>[...j,b]),b.id},[t]),I=fe(S=>{o(V=>V.filter(b=>re(b)!==S))},[]),P=fe((S,V)=>{let b=Ee(V);o(g=>g.map(O=>re(O)===S?{...O,transform:b}:O))},[]);return{modelUrl:y?.url??"",models:t,activeModelId:l,onModelChange:B,onActiveModelChange:f,objectBindings:fr,onObjectBindingsChange:x,sceneConfig:y?.sceneConfig,onSceneConfigChange:E,addModel:h,duplicateModel:p,removeModel:I,updateModelTransform:P}}import{useCallback as we,useEffect as mr,useState as br,useSyncExternalStore as wr}from"react";var yr={sequenceId:null,time:0,duration:0,status:"stopped",previewing:!1,ready:!1,issues:[]},hr=()=>()=>{},Pt=()=>yr;function Vr(){let[e,t]=br(null),o=wr(e?.subscribe??hr,e?.getState??Pt,Pt);mr(()=>()=>e?.stop(),[e]);let s=we(f=>t(f),[]);return{controls:e,playback:o,handleSequencesReady:s,play:we(f=>e?.play(f)??!1,[e]),pause:we(()=>e?.pause(),[e]),stop:we(()=>e?.stop(),[e]),seek:we(f=>e?.seek(f)??!1,[e]),select:we(f=>e?.select(f)??!1,[e])}}export{hn as ACTION_CATALOG,kn as AssetDiagnosticsPanel,gt as CompareViewer,Lt as DEFAULT_MODEL_VIEWER_LABELS,Se as DEFAULT_SCENE_CONFIG,Ce as DEFAULT_SECTION_CONFIG,En as MATERIAL_BLENDING_MODES,An as MATERIAL_SIDES,fn as MAX_VIEWER_STATE_BYTES,_t as MEASUREMENT_UNITS,yn as MODEL_VIEWER_PRESETS,ke as ModelViewer,jn as ProductOptions,At as SEQUENCE_EASINGS,xt as SEQUENCE_OBJECT_PROPERTIES,vn as applyIsolation,pn as applyProductOptions,Sn as applyStyleRules,Rn as buildBindingsFromNodes,qt as calibrateMeasurements,Yt as chooseMaterialVariant,Tn as collectObjectHierarchy,Cn as colorScaleValue,Ue as compareViewerConfigurations,In as copyBindingStyle,gn as createARHandoffUrl,Pn as createDefaultBinding,on as decodeProductSelections,Jt as defaultProductSelections,xn as defineObjectBindings,rn as encodeProductSelections,Qt as evaluateProductConfiguration,bn as exportConfiguredUSDZ,Vn as findCatalogAction,tn as formatProductPrice,sn as generateProductSkus,Ht as groundAsset,Mn as inferType,wn as inspectAsset,Bn as isolatedBindingKeys,Ie as material,Kt as measurementResult,Nt as measurementScale,Ft as measurementValue,$t as measurementsToCsv,Ee as parseAssetTransform,Gt as parseMeasurements,un as parseProductConfiguration,Xt as parseProductDefinition,ln as parseSceneProduct,kt as parseSectionConfig,Wt as parseSelectionSets,Et as parseSequences,he as parseViewerState,Ln as pasteBindingStyle,ge as patchBindings,_e as patchSceneConfig,Le as prepareViewerState,nn as productCheckoutUrl,an as productDefinitionWarnings,cn as productOptionStates,en as productPriceFromDefinition,mn as readARHandoffUrl,Zt as resolveProductSelections,Tt as sampleSequenceTrack,Ne as sceneLight,Ut as sectionSnapshot,ce as selectBindingKeys,Te as selectBindings,zt as serializeMeasurements,dn as serializeProductConfiguration,me as serializeViewerState,Dt as snapAssetToGrid,It as upsertSequenceKeyframe,ar as useObjectBinding,lr as useObjectBindingIds,Ke as useObjectBindings,On as useProductConfigurator,Ge as useSceneConfig,pr as useShareableViewerState,ir as useViewer,$e as useViewerActions,qe as useViewerAnimations,Ae as useViewerCamera,We as useViewerConnection,Qe as useViewerEffects,Ze as useViewerHover,et as useViewerIsolation,tt as useViewerModel,gr as useViewerModels,nt as useViewerSelection,Vr as useViewerSequences};
@@ -343,6 +343,42 @@ type ProductCommerceAdapter = {
343
343
  requestQuote?: (configuration: ProductConfiguration, context: ProductCheckoutContext) => ProductCommerceResult | Promise<ProductCommerceResult>;
344
344
  };
345
345
 
346
+ type CameraLimits = {
347
+ /** Closest the camera can get to its target, in scene units. Default 0. */
348
+ minDistance?: number;
349
+ /** Farthest the camera can get from its target, in scene units. Default Infinity. */
350
+ maxDistance?: number;
351
+ /**
352
+ * Lowest vertical angle, in degrees: 0 looks straight down from above, 90 is
353
+ * level with the target, 180 looks straight up from below. Default 0.
354
+ */
355
+ minPolarAngle?: number;
356
+ /** Highest vertical angle, in degrees (see minPolarAngle). Default 180. */
357
+ maxPolarAngle?: number;
358
+ /**
359
+ * Leftmost horizontal angle, in degrees around the vertical axis: 0 views
360
+ * the target from the front (+Z), 90 from its right (+X), -90 from its
361
+ * left. Default -Infinity (no limit).
362
+ */
363
+ minAzimuthAngle?: number;
364
+ /** Rightmost horizontal angle, in degrees (see minAzimuthAngle). Default Infinity. */
365
+ maxAzimuthAngle?: number;
366
+ /** An axis-aligned world-space box the camera's target can pan within. */
367
+ panBoundary?: [min: [number, number, number], max: [number, number, number]];
368
+ /** Keeps the camera itself, not just its target, inside panBoundary. Default false. */
369
+ boundaryEnclosesCamera?: boolean;
370
+ /** How strongly panning slows near panBoundary, 0–1. Default 0. */
371
+ boundaryFriction?: number;
372
+ insideModel?: boolean;
373
+ aroundModel?: boolean;
374
+ floorOutline?: FloorOutline;
375
+ };
376
+ type FloorOutline = {
377
+ points: [number, number][];
378
+ floor: number;
379
+ ceiling: number;
380
+ };
381
+
346
382
  declare const LIGHT_TYPES: readonly ["none", "directional", "point", "spot", "hemisphere"];
347
383
  type SceneLightType = (typeof LIGHT_TYPES)[number];
348
384
  type SceneLightAttachment = {
@@ -399,6 +435,8 @@ type SceneModelConfig = {
399
435
  type SceneCameraConfig = {
400
436
  fieldOfView: number;
401
437
  showAdvancedSettings: boolean;
438
+ /** Orbit limits (degrees for angles); unset fields have no limit. */
439
+ limits?: CameraLimits;
402
440
  };
403
441
  type SceneShadowConfig = {
404
442
  enabled: boolean;
@@ -1280,6 +1318,9 @@ type ViewerModelInfo = {
1280
1318
 
1281
1319
  /** Built-in viewer text. Override only the keys your application needs. */
1282
1320
  declare const DEFAULT_MODEL_VIEWER_LABELS: {
1321
+ readonly modelViewer: "3D model viewer";
1322
+ readonly openSceneSettingsPanel: "Open scene settings panel";
1323
+ readonly closeSceneSettingsPanel: "Close scene settings panel";
1283
1324
  readonly verifyingLicense: "Verifying License";
1284
1325
  readonly checkingYourLicenseKey: "Checking your license key...";
1285
1326
  readonly createDevelopmentKey: "Create a free development key";
@@ -1684,34 +1725,6 @@ type ViewerLoading = "lazy" | "eager";
1684
1725
  */
1685
1726
  type ViewerReveal = "auto" | "interaction";
1686
1727
 
1687
- type CameraLimits = {
1688
- /** Closest the camera can get to its target, in scene units. Default 0. */
1689
- minDistance?: number;
1690
- /** Farthest the camera can get from its target, in scene units. Default Infinity. */
1691
- maxDistance?: number;
1692
- /**
1693
- * Lowest vertical angle, in degrees: 0 looks straight down from above, 90 is
1694
- * level with the target, 180 looks straight up from below. Default 0.
1695
- */
1696
- minPolarAngle?: number;
1697
- /** Highest vertical angle, in degrees (see minPolarAngle). Default 180. */
1698
- maxPolarAngle?: number;
1699
- /**
1700
- * Leftmost horizontal angle, in degrees around the vertical axis: 0 views
1701
- * the target from the front (+Z), 90 from its right (+X), -90 from its
1702
- * left. Default -Infinity (no limit).
1703
- */
1704
- minAzimuthAngle?: number;
1705
- /** Rightmost horizontal angle, in degrees (see minAzimuthAngle). Default Infinity. */
1706
- maxAzimuthAngle?: number;
1707
- /** An axis-aligned world-space box the camera's target can pan within. */
1708
- panBoundary?: [min: [number, number, number], max: [number, number, number]];
1709
- /** Keeps the camera itself, not just its target, inside panBoundary. Default false. */
1710
- boundaryEnclosesCamera?: boolean;
1711
- /** How strongly panning slows near panBoundary, 0–1. Default 0. */
1712
- boundaryFriction?: number;
1713
- };
1714
-
1715
1728
  /**
1716
1729
  * Whether the viewer cuts motion that starts on its own: `"user"` follows the
1717
1730
  * visitor's `prefers-reduced-motion` setting, `"always"` and `"never"` override
@@ -1721,4 +1734,4 @@ type ReducedMotionSetting = "user" | "always" | "never";
1721
1734
 
1722
1735
  type ModelFormat = "glb" | "gltf" | "obj" | "fbx" | "usdz" | "stl" | "ply";
1723
1736
 
1724
- export { type ObjectBindingTextureSlot as $, type AnimationAction as A, type BindingEdit as B, type CameraAction as C, DEFAULT_MODEL_VIEWER_LABELS as D, type EnvironmentPreset as E, type ModelFormat as F, type GlitchModeName as G, type ModelViewerLabelKey as H, type IsolatedObjectBindings as I, type ModelViewerLabels as J, type KernelSizeName as K, type ObjectActionEvent as L, MATERIAL_BLENDING_MODES as M, type ObjectBinding as N, type ObjectActionEffect as O, type ObjectBindingAction as P, type ObjectBindingCameraState as Q, type ObjectBindingDecal as R, type ObjectBindingMaterial as S, type ObjectBindingMaterialBlendingMode as T, type ObjectBindingMaterialSide as U, type ObjectBindingPatch as V, type ObjectBindingSelector as W, type ObjectBindingStatus as X, type ObjectBindingStyle as Y, type ObjectBindingTarget as Z, type ObjectBindingTextureChannel as _, type AnimationActionEffect as a, type SceneStyleRule as a$, type ObjectBindingTransform as a0, type ObjectBindingType as a1, type ObjectBindingsActionEffect as a2, type ObjectPointerEvent as a3, type ObjectSurfacePoint as a4, type ProductAppearance as a5, type ProductAvailability as a6, type ProductCheckoutContext as a7, type ProductCheckoutLink as a8, type ProductCommerceAdapter as a9, type SceneCameraConfig as aA, type SceneCinematicConfig as aB, type SceneCinematicWaypoint as aC, type SceneConfig as aD, type SceneConfigActionEffect as aE, type SceneConfigPatch as aF, type SceneEnvironmentConfig as aG, type SceneGroundShadowConfig as aH, type SceneLight as aI, type SceneLightAttachment as aJ, type SceneLightType as aK, type SceneLightingConfig as aL, type SceneModelConfig as aM, type SceneModelRenderer as aN, type ScenePostProcessingConfig as aO, type SceneProductConfig as aP, type SceneSectionAxis as aQ, type SceneSectionConfig as aR, type SceneSectionPlane as aS, type SceneSectionPreset as aT, type SceneSectionSettings as aU, type SceneSelectionSet as aV, type SceneSequence as aW, type SceneShadowConfig as aX, type SceneStyleColorScale as aY, type SceneStyleCondition as aZ, type SceneStylePulse as a_, type ProductCommerceContext as aa, type ProductCommerceResult as ab, type ProductConfiguration as ac, type ProductConfigurationIssue as ad, type ProductDefinition as ae, type ProductDefinitionWarning as af, type ProductGroupDisplay as ag, type ProductOption as ah, type ProductOptionGroup as ai, type ProductOptionRef as aj, type ProductOptionRule as ak, type ProductOptionState as al, type ProductPrice as am, type ProductPricing as an, type ProductSelections as ao, type ProductSku as ap, type RampTypeName as aq, type ReducedMotionSetting as ar, type SavedMeasurement as as, type SceneAnimationClipConfig as at, type SceneAnimationConfig as au, type SceneAnnotationCameraView as av, type SceneAnnotationImage as aw, type SceneAnnotationLink as ax, type SceneAnnotationMarker as ay, type SceneBackgroundConfig as az, type AnimationClipInfo as b, type SceneWireframeConfig as b0, type SequenceCameraView as b1, type SequenceControls as b2, type SequenceEasing as b3, type SequenceKeyframe as b4, type SequenceObjectProperty as b5, type SequencePlaybackState as b6, type SequenceTarget as b7, type SequenceTrack as b8, type SequenceValue as b9, type SequenceVector3 as ba, type StyledObjectBindings as bb, type StyledObjectPulse as bc, type ViewerAnimationsProps as bd, type ViewerCameraConfig as be, type ViewerCameraState as bf, type ViewerIsolation as bg, type ViewerLoading as bh, type ViewerModelBounds as bi, type ViewerModelInfo as bj, type ViewerReveal as bk, type VisibilityActionEffect as bl, applyIsolation as bm, applyStyleRules as bn, chooseMaterialVariant as bo, colorScaleValue as bp, isolatedBindingKeys as bq, material as br, parseSelectionSets as bs, patchBindings as bt, patchSceneConfig as bu, selectBindingKeys as bv, selectBindings as bw, useViewerAnimations as bx, type AnimationClipState as c, type AnimationClipStatus as d, type AnimationControls as e, type AnimationLoopMode as f, type AnimationPlayOptions as g, type AnimationPlaybackState as h, type CameraActionEffect as i, type CameraLimits as j, DEFAULT_SCENE_CONFIG as k, DEFAULT_SECTION_CONFIG as l, type DeepPartial as m, type IsolationActionEffect as n, MATERIAL_SIDES as o, type MaterialVariantGroup as p, type MaterialVariantOption as q, type MeasurementAnchor as r, type MeasurementCollection as s, type MeasurementPoint as t, type MeasurementPosition as u, type MeasurementResult as v, type MeasurementSettings as w, type MeasurementStatus as x, type MeasurementTool as y, type MeasurementUnit as z };
1737
+ export { type ObjectBindingTextureChannel as $, type AnimationAction as A, type BindingEdit as B, type CameraAction as C, DEFAULT_MODEL_VIEWER_LABELS as D, type EnvironmentPreset as E, type FloorOutline as F, type GlitchModeName as G, type ModelFormat as H, type IsolatedObjectBindings as I, type ModelViewerLabelKey as J, type KernelSizeName as K, type ModelViewerLabels as L, MATERIAL_BLENDING_MODES as M, type ObjectActionEvent as N, type ObjectActionEffect as O, type ObjectBinding as P, type ObjectBindingAction as Q, type ObjectBindingCameraState as R, type ObjectBindingDecal as S, type ObjectBindingMaterial as T, type ObjectBindingMaterialBlendingMode as U, type ObjectBindingMaterialSide as V, type ObjectBindingPatch as W, type ObjectBindingSelector as X, type ObjectBindingStatus as Y, type ObjectBindingStyle as Z, type ObjectBindingTarget as _, type AnimationActionEffect as a, type SceneStylePulse as a$, type ObjectBindingTextureSlot as a0, type ObjectBindingTransform as a1, type ObjectBindingType as a2, type ObjectBindingsActionEffect as a3, type ObjectPointerEvent as a4, type ObjectSurfacePoint as a5, type ProductAppearance as a6, type ProductAvailability as a7, type ProductCheckoutContext as a8, type ProductCheckoutLink as a9, type SceneBackgroundConfig as aA, type SceneCameraConfig as aB, type SceneCinematicConfig as aC, type SceneCinematicWaypoint as aD, type SceneConfig as aE, type SceneConfigActionEffect as aF, type SceneConfigPatch as aG, type SceneEnvironmentConfig as aH, type SceneGroundShadowConfig as aI, type SceneLight as aJ, type SceneLightAttachment as aK, type SceneLightType as aL, type SceneLightingConfig as aM, type SceneModelConfig as aN, type SceneModelRenderer as aO, type ScenePostProcessingConfig as aP, type SceneProductConfig as aQ, type SceneSectionAxis as aR, type SceneSectionConfig as aS, type SceneSectionPlane as aT, type SceneSectionPreset as aU, type SceneSectionSettings as aV, type SceneSelectionSet as aW, type SceneSequence as aX, type SceneShadowConfig as aY, type SceneStyleColorScale as aZ, type SceneStyleCondition as a_, type ProductCommerceAdapter as aa, type ProductCommerceContext as ab, type ProductCommerceResult as ac, type ProductConfiguration as ad, type ProductConfigurationIssue as ae, type ProductDefinition as af, type ProductDefinitionWarning as ag, type ProductGroupDisplay as ah, type ProductOption as ai, type ProductOptionGroup as aj, type ProductOptionRef as ak, type ProductOptionRule as al, type ProductOptionState as am, type ProductPrice as an, type ProductPricing as ao, type ProductSelections as ap, type ProductSku as aq, type RampTypeName as ar, type ReducedMotionSetting as as, type SavedMeasurement as at, type SceneAnimationClipConfig as au, type SceneAnimationConfig as av, type SceneAnnotationCameraView as aw, type SceneAnnotationImage as ax, type SceneAnnotationLink as ay, type SceneAnnotationMarker as az, type AnimationClipInfo as b, type SceneStyleRule as b0, type SceneWireframeConfig as b1, type SequenceCameraView as b2, type SequenceControls as b3, type SequenceEasing as b4, type SequenceKeyframe as b5, type SequenceObjectProperty as b6, type SequencePlaybackState as b7, type SequenceTarget as b8, type SequenceTrack as b9, type SequenceValue as ba, type SequenceVector3 as bb, type StyledObjectBindings as bc, type StyledObjectPulse as bd, type ViewerAnimationsProps as be, type ViewerCameraConfig as bf, type ViewerCameraState as bg, type ViewerIsolation as bh, type ViewerLoading as bi, type ViewerModelBounds as bj, type ViewerModelInfo as bk, type ViewerReveal as bl, type VisibilityActionEffect as bm, applyIsolation as bn, applyStyleRules as bo, chooseMaterialVariant as bp, colorScaleValue as bq, isolatedBindingKeys as br, material as bs, parseSelectionSets as bt, patchBindings as bu, patchSceneConfig as bv, selectBindingKeys as bw, selectBindings as bx, useViewerAnimations as by, type AnimationClipState as c, type AnimationClipStatus as d, type AnimationControls as e, type AnimationLoopMode as f, type AnimationPlayOptions as g, type AnimationPlaybackState as h, type CameraActionEffect as i, type CameraLimits as j, DEFAULT_SCENE_CONFIG as k, DEFAULT_SECTION_CONFIG as l, type DeepPartial as m, type IsolationActionEffect as n, MATERIAL_SIDES as o, type MaterialVariantGroup as p, type MaterialVariantOption as q, type MeasurementAnchor as r, type MeasurementCollection as s, type MeasurementPoint as t, type MeasurementPosition as u, type MeasurementResult as v, type MeasurementSettings as w, type MeasurementStatus as x, type MeasurementTool as y, type MeasurementUnit as z };
@@ -343,6 +343,42 @@ type ProductCommerceAdapter = {
343
343
  requestQuote?: (configuration: ProductConfiguration, context: ProductCheckoutContext) => ProductCommerceResult | Promise<ProductCommerceResult>;
344
344
  };
345
345
 
346
+ type CameraLimits = {
347
+ /** Closest the camera can get to its target, in scene units. Default 0. */
348
+ minDistance?: number;
349
+ /** Farthest the camera can get from its target, in scene units. Default Infinity. */
350
+ maxDistance?: number;
351
+ /**
352
+ * Lowest vertical angle, in degrees: 0 looks straight down from above, 90 is
353
+ * level with the target, 180 looks straight up from below. Default 0.
354
+ */
355
+ minPolarAngle?: number;
356
+ /** Highest vertical angle, in degrees (see minPolarAngle). Default 180. */
357
+ maxPolarAngle?: number;
358
+ /**
359
+ * Leftmost horizontal angle, in degrees around the vertical axis: 0 views
360
+ * the target from the front (+Z), 90 from its right (+X), -90 from its
361
+ * left. Default -Infinity (no limit).
362
+ */
363
+ minAzimuthAngle?: number;
364
+ /** Rightmost horizontal angle, in degrees (see minAzimuthAngle). Default Infinity. */
365
+ maxAzimuthAngle?: number;
366
+ /** An axis-aligned world-space box the camera's target can pan within. */
367
+ panBoundary?: [min: [number, number, number], max: [number, number, number]];
368
+ /** Keeps the camera itself, not just its target, inside panBoundary. Default false. */
369
+ boundaryEnclosesCamera?: boolean;
370
+ /** How strongly panning slows near panBoundary, 0–1. Default 0. */
371
+ boundaryFriction?: number;
372
+ insideModel?: boolean;
373
+ aroundModel?: boolean;
374
+ floorOutline?: FloorOutline;
375
+ };
376
+ type FloorOutline = {
377
+ points: [number, number][];
378
+ floor: number;
379
+ ceiling: number;
380
+ };
381
+
346
382
  declare const LIGHT_TYPES: readonly ["none", "directional", "point", "spot", "hemisphere"];
347
383
  type SceneLightType = (typeof LIGHT_TYPES)[number];
348
384
  type SceneLightAttachment = {
@@ -399,6 +435,8 @@ type SceneModelConfig = {
399
435
  type SceneCameraConfig = {
400
436
  fieldOfView: number;
401
437
  showAdvancedSettings: boolean;
438
+ /** Orbit limits (degrees for angles); unset fields have no limit. */
439
+ limits?: CameraLimits;
402
440
  };
403
441
  type SceneShadowConfig = {
404
442
  enabled: boolean;
@@ -1280,6 +1318,9 @@ type ViewerModelInfo = {
1280
1318
 
1281
1319
  /** Built-in viewer text. Override only the keys your application needs. */
1282
1320
  declare const DEFAULT_MODEL_VIEWER_LABELS: {
1321
+ readonly modelViewer: "3D model viewer";
1322
+ readonly openSceneSettingsPanel: "Open scene settings panel";
1323
+ readonly closeSceneSettingsPanel: "Close scene settings panel";
1283
1324
  readonly verifyingLicense: "Verifying License";
1284
1325
  readonly checkingYourLicenseKey: "Checking your license key...";
1285
1326
  readonly createDevelopmentKey: "Create a free development key";
@@ -1684,34 +1725,6 @@ type ViewerLoading = "lazy" | "eager";
1684
1725
  */
1685
1726
  type ViewerReveal = "auto" | "interaction";
1686
1727
 
1687
- type CameraLimits = {
1688
- /** Closest the camera can get to its target, in scene units. Default 0. */
1689
- minDistance?: number;
1690
- /** Farthest the camera can get from its target, in scene units. Default Infinity. */
1691
- maxDistance?: number;
1692
- /**
1693
- * Lowest vertical angle, in degrees: 0 looks straight down from above, 90 is
1694
- * level with the target, 180 looks straight up from below. Default 0.
1695
- */
1696
- minPolarAngle?: number;
1697
- /** Highest vertical angle, in degrees (see minPolarAngle). Default 180. */
1698
- maxPolarAngle?: number;
1699
- /**
1700
- * Leftmost horizontal angle, in degrees around the vertical axis: 0 views
1701
- * the target from the front (+Z), 90 from its right (+X), -90 from its
1702
- * left. Default -Infinity (no limit).
1703
- */
1704
- minAzimuthAngle?: number;
1705
- /** Rightmost horizontal angle, in degrees (see minAzimuthAngle). Default Infinity. */
1706
- maxAzimuthAngle?: number;
1707
- /** An axis-aligned world-space box the camera's target can pan within. */
1708
- panBoundary?: [min: [number, number, number], max: [number, number, number]];
1709
- /** Keeps the camera itself, not just its target, inside panBoundary. Default false. */
1710
- boundaryEnclosesCamera?: boolean;
1711
- /** How strongly panning slows near panBoundary, 0–1. Default 0. */
1712
- boundaryFriction?: number;
1713
- };
1714
-
1715
1728
  /**
1716
1729
  * Whether the viewer cuts motion that starts on its own: `"user"` follows the
1717
1730
  * visitor's `prefers-reduced-motion` setting, `"always"` and `"never"` override
@@ -1721,4 +1734,4 @@ type ReducedMotionSetting = "user" | "always" | "never";
1721
1734
 
1722
1735
  type ModelFormat = "glb" | "gltf" | "obj" | "fbx" | "usdz" | "stl" | "ply";
1723
1736
 
1724
- export { type ObjectBindingTextureSlot as $, type AnimationAction as A, type BindingEdit as B, type CameraAction as C, DEFAULT_MODEL_VIEWER_LABELS as D, type EnvironmentPreset as E, type ModelFormat as F, type GlitchModeName as G, type ModelViewerLabelKey as H, type IsolatedObjectBindings as I, type ModelViewerLabels as J, type KernelSizeName as K, type ObjectActionEvent as L, MATERIAL_BLENDING_MODES as M, type ObjectBinding as N, type ObjectActionEffect as O, type ObjectBindingAction as P, type ObjectBindingCameraState as Q, type ObjectBindingDecal as R, type ObjectBindingMaterial as S, type ObjectBindingMaterialBlendingMode as T, type ObjectBindingMaterialSide as U, type ObjectBindingPatch as V, type ObjectBindingSelector as W, type ObjectBindingStatus as X, type ObjectBindingStyle as Y, type ObjectBindingTarget as Z, type ObjectBindingTextureChannel as _, type AnimationActionEffect as a, type SceneStyleRule as a$, type ObjectBindingTransform as a0, type ObjectBindingType as a1, type ObjectBindingsActionEffect as a2, type ObjectPointerEvent as a3, type ObjectSurfacePoint as a4, type ProductAppearance as a5, type ProductAvailability as a6, type ProductCheckoutContext as a7, type ProductCheckoutLink as a8, type ProductCommerceAdapter as a9, type SceneCameraConfig as aA, type SceneCinematicConfig as aB, type SceneCinematicWaypoint as aC, type SceneConfig as aD, type SceneConfigActionEffect as aE, type SceneConfigPatch as aF, type SceneEnvironmentConfig as aG, type SceneGroundShadowConfig as aH, type SceneLight as aI, type SceneLightAttachment as aJ, type SceneLightType as aK, type SceneLightingConfig as aL, type SceneModelConfig as aM, type SceneModelRenderer as aN, type ScenePostProcessingConfig as aO, type SceneProductConfig as aP, type SceneSectionAxis as aQ, type SceneSectionConfig as aR, type SceneSectionPlane as aS, type SceneSectionPreset as aT, type SceneSectionSettings as aU, type SceneSelectionSet as aV, type SceneSequence as aW, type SceneShadowConfig as aX, type SceneStyleColorScale as aY, type SceneStyleCondition as aZ, type SceneStylePulse as a_, type ProductCommerceContext as aa, type ProductCommerceResult as ab, type ProductConfiguration as ac, type ProductConfigurationIssue as ad, type ProductDefinition as ae, type ProductDefinitionWarning as af, type ProductGroupDisplay as ag, type ProductOption as ah, type ProductOptionGroup as ai, type ProductOptionRef as aj, type ProductOptionRule as ak, type ProductOptionState as al, type ProductPrice as am, type ProductPricing as an, type ProductSelections as ao, type ProductSku as ap, type RampTypeName as aq, type ReducedMotionSetting as ar, type SavedMeasurement as as, type SceneAnimationClipConfig as at, type SceneAnimationConfig as au, type SceneAnnotationCameraView as av, type SceneAnnotationImage as aw, type SceneAnnotationLink as ax, type SceneAnnotationMarker as ay, type SceneBackgroundConfig as az, type AnimationClipInfo as b, type SceneWireframeConfig as b0, type SequenceCameraView as b1, type SequenceControls as b2, type SequenceEasing as b3, type SequenceKeyframe as b4, type SequenceObjectProperty as b5, type SequencePlaybackState as b6, type SequenceTarget as b7, type SequenceTrack as b8, type SequenceValue as b9, type SequenceVector3 as ba, type StyledObjectBindings as bb, type StyledObjectPulse as bc, type ViewerAnimationsProps as bd, type ViewerCameraConfig as be, type ViewerCameraState as bf, type ViewerIsolation as bg, type ViewerLoading as bh, type ViewerModelBounds as bi, type ViewerModelInfo as bj, type ViewerReveal as bk, type VisibilityActionEffect as bl, applyIsolation as bm, applyStyleRules as bn, chooseMaterialVariant as bo, colorScaleValue as bp, isolatedBindingKeys as bq, material as br, parseSelectionSets as bs, patchBindings as bt, patchSceneConfig as bu, selectBindingKeys as bv, selectBindings as bw, useViewerAnimations as bx, type AnimationClipState as c, type AnimationClipStatus as d, type AnimationControls as e, type AnimationLoopMode as f, type AnimationPlayOptions as g, type AnimationPlaybackState as h, type CameraActionEffect as i, type CameraLimits as j, DEFAULT_SCENE_CONFIG as k, DEFAULT_SECTION_CONFIG as l, type DeepPartial as m, type IsolationActionEffect as n, MATERIAL_SIDES as o, type MaterialVariantGroup as p, type MaterialVariantOption as q, type MeasurementAnchor as r, type MeasurementCollection as s, type MeasurementPoint as t, type MeasurementPosition as u, type MeasurementResult as v, type MeasurementSettings as w, type MeasurementStatus as x, type MeasurementTool as y, type MeasurementUnit as z };
1737
+ export { type ObjectBindingTextureChannel as $, type AnimationAction as A, type BindingEdit as B, type CameraAction as C, DEFAULT_MODEL_VIEWER_LABELS as D, type EnvironmentPreset as E, type FloorOutline as F, type GlitchModeName as G, type ModelFormat as H, type IsolatedObjectBindings as I, type ModelViewerLabelKey as J, type KernelSizeName as K, type ModelViewerLabels as L, MATERIAL_BLENDING_MODES as M, type ObjectActionEvent as N, type ObjectActionEffect as O, type ObjectBinding as P, type ObjectBindingAction as Q, type ObjectBindingCameraState as R, type ObjectBindingDecal as S, type ObjectBindingMaterial as T, type ObjectBindingMaterialBlendingMode as U, type ObjectBindingMaterialSide as V, type ObjectBindingPatch as W, type ObjectBindingSelector as X, type ObjectBindingStatus as Y, type ObjectBindingStyle as Z, type ObjectBindingTarget as _, type AnimationActionEffect as a, type SceneStylePulse as a$, type ObjectBindingTextureSlot as a0, type ObjectBindingTransform as a1, type ObjectBindingType as a2, type ObjectBindingsActionEffect as a3, type ObjectPointerEvent as a4, type ObjectSurfacePoint as a5, type ProductAppearance as a6, type ProductAvailability as a7, type ProductCheckoutContext as a8, type ProductCheckoutLink as a9, type SceneBackgroundConfig as aA, type SceneCameraConfig as aB, type SceneCinematicConfig as aC, type SceneCinematicWaypoint as aD, type SceneConfig as aE, type SceneConfigActionEffect as aF, type SceneConfigPatch as aG, type SceneEnvironmentConfig as aH, type SceneGroundShadowConfig as aI, type SceneLight as aJ, type SceneLightAttachment as aK, type SceneLightType as aL, type SceneLightingConfig as aM, type SceneModelConfig as aN, type SceneModelRenderer as aO, type ScenePostProcessingConfig as aP, type SceneProductConfig as aQ, type SceneSectionAxis as aR, type SceneSectionConfig as aS, type SceneSectionPlane as aT, type SceneSectionPreset as aU, type SceneSectionSettings as aV, type SceneSelectionSet as aW, type SceneSequence as aX, type SceneShadowConfig as aY, type SceneStyleColorScale as aZ, type SceneStyleCondition as a_, type ProductCommerceAdapter as aa, type ProductCommerceContext as ab, type ProductCommerceResult as ac, type ProductConfiguration as ad, type ProductConfigurationIssue as ae, type ProductDefinition as af, type ProductDefinitionWarning as ag, type ProductGroupDisplay as ah, type ProductOption as ai, type ProductOptionGroup as aj, type ProductOptionRef as ak, type ProductOptionRule as al, type ProductOptionState as am, type ProductPrice as an, type ProductPricing as ao, type ProductSelections as ap, type ProductSku as aq, type RampTypeName as ar, type ReducedMotionSetting as as, type SavedMeasurement as at, type SceneAnimationClipConfig as au, type SceneAnimationConfig as av, type SceneAnnotationCameraView as aw, type SceneAnnotationImage as ax, type SceneAnnotationLink as ay, type SceneAnnotationMarker as az, type AnimationClipInfo as b, type SceneStyleRule as b0, type SceneWireframeConfig as b1, type SequenceCameraView as b2, type SequenceControls as b3, type SequenceEasing as b4, type SequenceKeyframe as b5, type SequenceObjectProperty as b6, type SequencePlaybackState as b7, type SequenceTarget as b8, type SequenceTrack as b9, type SequenceValue as ba, type SequenceVector3 as bb, type StyledObjectBindings as bc, type StyledObjectPulse as bd, type ViewerAnimationsProps as be, type ViewerCameraConfig as bf, type ViewerCameraState as bg, type ViewerIsolation as bh, type ViewerLoading as bi, type ViewerModelBounds as bj, type ViewerModelInfo as bk, type ViewerReveal as bl, type VisibilityActionEffect as bm, applyIsolation as bn, applyStyleRules as bo, chooseMaterialVariant as bp, colorScaleValue as bq, isolatedBindingKeys as br, material as bs, parseSelectionSets as bt, patchBindings as bu, patchSceneConfig as bv, selectBindingKeys as bw, selectBindings as bx, useViewerAnimations as by, type AnimationClipState as c, type AnimationClipStatus as d, type AnimationControls as e, type AnimationLoopMode as f, type AnimationPlayOptions as g, type AnimationPlaybackState as h, type CameraActionEffect as i, type CameraLimits as j, DEFAULT_SCENE_CONFIG as k, DEFAULT_SECTION_CONFIG as l, type DeepPartial as m, type IsolationActionEffect as n, MATERIAL_SIDES as o, type MaterialVariantGroup as p, type MaterialVariantOption as q, type MeasurementAnchor as r, type MeasurementCollection as s, type MeasurementPoint as t, type MeasurementPosition as u, type MeasurementResult as v, type MeasurementSettings as w, type MeasurementStatus as x, type MeasurementTool as y, type MeasurementUnit as z };
@@ -1,4 +1,4 @@
1
- import { a9 as ProductCommerceAdapter, ac as ProductConfiguration, N as ObjectBinding, aD as SceneConfig, bf as ViewerCameraState, bi as ViewerModelBounds, ar as ReducedMotionSetting, j as CameraLimits, R as ObjectBindingDecal, a4 as ObjectSurfacePoint, J as ModelViewerLabels, bh as ViewerLoading, bk as ViewerReveal, F as ModelFormat, a3 as ObjectPointerEvent, bj as ViewerModelInfo, L as ObjectActionEvent, e as AnimationControls, ay as SceneAnnotationMarker, be as ViewerCameraConfig, bg as ViewerIsolation, as as SavedMeasurement, w as MeasurementSettings, b2 as SequenceControls } from './modelFileResolver-CVmON8hg.js';
1
+ import { aa as ProductCommerceAdapter, ad as ProductConfiguration, P as ObjectBinding, aE as SceneConfig, bg as ViewerCameraState, bj as ViewerModelBounds, as as ReducedMotionSetting, j as CameraLimits, S as ObjectBindingDecal, a5 as ObjectSurfacePoint, L as ModelViewerLabels, bi as ViewerLoading, bl as ViewerReveal, H as ModelFormat, a4 as ObjectPointerEvent, bk as ViewerModelInfo, N as ObjectActionEvent, e as AnimationControls, az as SceneAnnotationMarker, bf as ViewerCameraConfig, bh as ViewerIsolation, at as SavedMeasurement, w as MeasurementSettings, b3 as SequenceControls } from './modelFileResolver-An1aQ0D3.mjs';
2
2
  import { Object3D, Material } from 'three';
3
3
  import { ReactNode } from 'react';
4
4
  import { CameraControls } from '@react-three/drei';
@@ -586,6 +586,19 @@ type UseViewerCameraOptions = {
586
586
  /** Initial named views, read once. Use setCameraPresets to load later edits. */
587
587
  presets?: Record<string, ViewerCameraPreset>;
588
588
  };
589
+ /** Finite, nonnegative padding for focusObject's automatic fit, in scene units. */
590
+ type FocusObjectOptions = {
591
+ /** Padding in scene units on every side of the fitted object. Default 0.5. */
592
+ padding?: number;
593
+ /** Per-side scene-unit padding; overrides `padding` for this side. */
594
+ paddingTop?: number;
595
+ /** Bottom padding; overrides `padding`. */
596
+ paddingBottom?: number;
597
+ /** Left padding; overrides `padding`. */
598
+ paddingLeft?: number;
599
+ /** Right padding; overrides `padding`. */
600
+ paddingRight?: number;
601
+ };
589
602
  type HomeCameraState = {
590
603
  position: [number, number, number];
591
604
  target: [number, number, number];
@@ -593,6 +606,10 @@ type HomeCameraState = {
593
606
  type ViewerReadyState = {
594
607
  objectBindings: Record<string, ObjectBinding>;
595
608
  homeCameraState: HomeCameraState | null;
609
+ /** Fly to a visible annotation and open its card. False for an unknown/filtered ID or disconnected camera. */
610
+ goToAnnotation: (annotationId: number) => Promise<boolean>;
611
+ /** Start WebXR AR or open its platform handoff. Call from a user gesture; launch errors reject. */
612
+ startAR: () => Promise<boolean>;
596
613
  captureImage: (options?: CaptureImageOptions) => Promise<string>;
597
614
  /** Whether a streamed model is still fetching tiles for the current view. */
598
615
  isLoadingTiles: () => boolean;
@@ -630,8 +647,9 @@ type ViewerCameraProps = {
630
647
  /**
631
648
  * Moves to the binding's `cameraState` when it has a position and target,
632
649
  * as selecting the object in the viewer does; otherwise frames the object.
650
+ * Padding applies only when framing, and must be finite and nonnegative.
633
651
  */
634
- focusObject: (objectId: string) => Promise<boolean>;
652
+ focusObject: (objectId: string, options?: FocusObjectOptions) => Promise<boolean>;
635
653
  fitScene: () => Promise<boolean>;
636
654
  setCameraTarget: (target: [number, number, number], enableTransition?: boolean) => Promise<boolean>;
637
655
  setCameraState: (state: ViewerCameraState, enableTransition?: boolean) => Promise<boolean>;
@@ -783,6 +801,7 @@ type ModelViewerProps = GroupedModelViewerProps & {
783
801
  activeAnnotation?: AnnotationMarker | null;
784
802
  onActiveAnnotationChange?: (annotation: AnnotationMarker | null) => void;
785
803
  camera?: ViewerCameraConfig;
804
+ /** Replaces sceneConfig.camera.limits when given. One kind of limit applies at a time. */
786
805
  cameraLimits?: CameraLimits;
787
806
  backgroundColor?: string;
788
807
  shadows?: boolean;
@@ -946,4 +965,4 @@ type ModelViewerModelEntry = {
946
965
  sceneConfig?: SceneConfig;
947
966
  };
948
967
 
949
- export { type TexturePositioningControls as $, type ARExportOptions as A, type ModelMergeSource as B, type CameraControllerType as C, type DecalMoveTarget as D, type ModelViewerControlsOptions as E, type ModelViewerDecoderOptions as F, type GroupedModelViewerProps as G, type HomeCameraState as H, type InspectAssetOptions as I, type ModelViewerModelEntry as J, type ModelViewerPerfOptions as K, type LicenseResult as L, MAX_VIEWER_STATE_BYTES as M, type ModelViewerPreset as N, type ModelViewerProps as O, type ModelViewerTilesOptions as P, type ModelViewerToolsOptions as Q, type ModelViewerUiOptions as R, type ModelViewerXrOptions as S, type MouseControllerPosition as T, type ObjectTransformSpace as U, type PerformanceProfile as V, type RendererBackend as W, type SceneComposition as X, type SemanticComparisonOptions as Y, type ShareableViewerState as Z, type StreamingDiagnostics as _, type ARHandoffOptions as a, type UseViewerCameraOptions as a0, type ViewerCameraPreset as a1, type ViewerCameraProps as a2, type ViewerConfiguration as a3, type ViewerEngagementEvent as a4, type ViewerObjectInfo as a5, type ViewerProductOptions as a6, type ViewerReadyState as a7, type ViewerRuntimeStats as a8, type ViewerStateStorage as a9, type XRScaleMode as aa, compareViewerConfigurations as ab, groundAsset as ac, parseAssetTransform as ad, parseViewerState as ae, prepareViewerState as af, serializeViewerState as ag, snapAssetToGrid as ah, useViewerCamera as ai, type ARHandoffRequest as b, type ARHandoffStatus as c, type ARSnapshot as d, type ARSnapshotSource as e, type AnnotationMarker as f, type AssetDiagnosticIssue as g, type AssetDiagnosticsReport as h, type AssetDiagnosticsSource as i, type AssetTextureDiagnostic as j, type AssetTransform as k, type CaptureImageOptions as l, type CaptureVideoOptions as m, type CinematicConfig as n, type CinematicWaypoint as o, type ComparisonCategory as p, type ComparisonChange as q, type ComparisonHighlight as r, type ComparisonObject as s, type ComparisonStatus as t, type ConfigurationComparisonInput as u, type ConfigurationComparisonReport as v, type CustomObjectBindingDataPanelProps as w, type CustomSceneObjectsPanelProps as x, type LicenseStatus as y, MODEL_VIEWER_PRESETS as z };
968
+ export { type StreamingDiagnostics as $, type ARExportOptions as A, type ModelMergeSource as B, type CameraControllerType as C, type DecalMoveTarget as D, type ModelViewerControlsOptions as E, type FocusObjectOptions as F, type GroupedModelViewerProps as G, type HomeCameraState as H, type InspectAssetOptions as I, type ModelViewerDecoderOptions as J, type ModelViewerModelEntry as K, type LicenseResult as L, MAX_VIEWER_STATE_BYTES as M, type ModelViewerPerfOptions as N, type ModelViewerPreset as O, type ModelViewerProps as P, type ModelViewerTilesOptions as Q, type ModelViewerToolsOptions as R, type ModelViewerUiOptions as S, type ModelViewerXrOptions as T, type MouseControllerPosition as U, type ObjectTransformSpace as V, type PerformanceProfile as W, type RendererBackend as X, type SceneComposition as Y, type SemanticComparisonOptions as Z, type ShareableViewerState as _, type ARHandoffOptions as a, type TexturePositioningControls as a0, type UseViewerCameraOptions as a1, type ViewerCameraPreset as a2, type ViewerCameraProps as a3, type ViewerConfiguration as a4, type ViewerEngagementEvent as a5, type ViewerObjectInfo as a6, type ViewerProductOptions as a7, type ViewerReadyState as a8, type ViewerRuntimeStats as a9, type ViewerStateStorage as aa, type XRScaleMode as ab, compareViewerConfigurations as ac, groundAsset as ad, parseAssetTransform as ae, parseViewerState as af, prepareViewerState as ag, serializeViewerState as ah, snapAssetToGrid as ai, useViewerCamera as aj, type ARHandoffRequest as b, type ARHandoffStatus as c, type ARSnapshot as d, type ARSnapshotSource as e, type AnnotationMarker as f, type AssetDiagnosticIssue as g, type AssetDiagnosticsReport as h, type AssetDiagnosticsSource as i, type AssetTextureDiagnostic as j, type AssetTransform as k, type CaptureImageOptions as l, type CaptureVideoOptions as m, type CinematicConfig as n, type CinematicWaypoint as o, type ComparisonCategory as p, type ComparisonChange as q, type ComparisonHighlight as r, type ComparisonObject as s, type ComparisonStatus as t, type ConfigurationComparisonInput as u, type ConfigurationComparisonReport as v, type CustomObjectBindingDataPanelProps as w, type CustomSceneObjectsPanelProps as x, type LicenseStatus as y, MODEL_VIEWER_PRESETS as z };
@@ -1,4 +1,4 @@
1
- import { a9 as ProductCommerceAdapter, ac as ProductConfiguration, N as ObjectBinding, aD as SceneConfig, bf as ViewerCameraState, bi as ViewerModelBounds, ar as ReducedMotionSetting, j as CameraLimits, R as ObjectBindingDecal, a4 as ObjectSurfacePoint, J as ModelViewerLabels, bh as ViewerLoading, bk as ViewerReveal, F as ModelFormat, a3 as ObjectPointerEvent, bj as ViewerModelInfo, L as ObjectActionEvent, e as AnimationControls, ay as SceneAnnotationMarker, be as ViewerCameraConfig, bg as ViewerIsolation, as as SavedMeasurement, w as MeasurementSettings, b2 as SequenceControls } from './modelFileResolver-CVmON8hg.mjs';
1
+ import { aa as ProductCommerceAdapter, ad as ProductConfiguration, P as ObjectBinding, aE as SceneConfig, bg as ViewerCameraState, bj as ViewerModelBounds, as as ReducedMotionSetting, j as CameraLimits, S as ObjectBindingDecal, a5 as ObjectSurfacePoint, L as ModelViewerLabels, bi as ViewerLoading, bl as ViewerReveal, H as ModelFormat, a4 as ObjectPointerEvent, bk as ViewerModelInfo, N as ObjectActionEvent, e as AnimationControls, az as SceneAnnotationMarker, bf as ViewerCameraConfig, bh as ViewerIsolation, at as SavedMeasurement, w as MeasurementSettings, b3 as SequenceControls } from './modelFileResolver-An1aQ0D3.js';
2
2
  import { Object3D, Material } from 'three';
3
3
  import { ReactNode } from 'react';
4
4
  import { CameraControls } from '@react-three/drei';
@@ -586,6 +586,19 @@ type UseViewerCameraOptions = {
586
586
  /** Initial named views, read once. Use setCameraPresets to load later edits. */
587
587
  presets?: Record<string, ViewerCameraPreset>;
588
588
  };
589
+ /** Finite, nonnegative padding for focusObject's automatic fit, in scene units. */
590
+ type FocusObjectOptions = {
591
+ /** Padding in scene units on every side of the fitted object. Default 0.5. */
592
+ padding?: number;
593
+ /** Per-side scene-unit padding; overrides `padding` for this side. */
594
+ paddingTop?: number;
595
+ /** Bottom padding; overrides `padding`. */
596
+ paddingBottom?: number;
597
+ /** Left padding; overrides `padding`. */
598
+ paddingLeft?: number;
599
+ /** Right padding; overrides `padding`. */
600
+ paddingRight?: number;
601
+ };
589
602
  type HomeCameraState = {
590
603
  position: [number, number, number];
591
604
  target: [number, number, number];
@@ -593,6 +606,10 @@ type HomeCameraState = {
593
606
  type ViewerReadyState = {
594
607
  objectBindings: Record<string, ObjectBinding>;
595
608
  homeCameraState: HomeCameraState | null;
609
+ /** Fly to a visible annotation and open its card. False for an unknown/filtered ID or disconnected camera. */
610
+ goToAnnotation: (annotationId: number) => Promise<boolean>;
611
+ /** Start WebXR AR or open its platform handoff. Call from a user gesture; launch errors reject. */
612
+ startAR: () => Promise<boolean>;
596
613
  captureImage: (options?: CaptureImageOptions) => Promise<string>;
597
614
  /** Whether a streamed model is still fetching tiles for the current view. */
598
615
  isLoadingTiles: () => boolean;
@@ -630,8 +647,9 @@ type ViewerCameraProps = {
630
647
  /**
631
648
  * Moves to the binding's `cameraState` when it has a position and target,
632
649
  * as selecting the object in the viewer does; otherwise frames the object.
650
+ * Padding applies only when framing, and must be finite and nonnegative.
633
651
  */
634
- focusObject: (objectId: string) => Promise<boolean>;
652
+ focusObject: (objectId: string, options?: FocusObjectOptions) => Promise<boolean>;
635
653
  fitScene: () => Promise<boolean>;
636
654
  setCameraTarget: (target: [number, number, number], enableTransition?: boolean) => Promise<boolean>;
637
655
  setCameraState: (state: ViewerCameraState, enableTransition?: boolean) => Promise<boolean>;
@@ -783,6 +801,7 @@ type ModelViewerProps = GroupedModelViewerProps & {
783
801
  activeAnnotation?: AnnotationMarker | null;
784
802
  onActiveAnnotationChange?: (annotation: AnnotationMarker | null) => void;
785
803
  camera?: ViewerCameraConfig;
804
+ /** Replaces sceneConfig.camera.limits when given. One kind of limit applies at a time. */
786
805
  cameraLimits?: CameraLimits;
787
806
  backgroundColor?: string;
788
807
  shadows?: boolean;
@@ -946,4 +965,4 @@ type ModelViewerModelEntry = {
946
965
  sceneConfig?: SceneConfig;
947
966
  };
948
967
 
949
- export { type TexturePositioningControls as $, type ARExportOptions as A, type ModelMergeSource as B, type CameraControllerType as C, type DecalMoveTarget as D, type ModelViewerControlsOptions as E, type ModelViewerDecoderOptions as F, type GroupedModelViewerProps as G, type HomeCameraState as H, type InspectAssetOptions as I, type ModelViewerModelEntry as J, type ModelViewerPerfOptions as K, type LicenseResult as L, MAX_VIEWER_STATE_BYTES as M, type ModelViewerPreset as N, type ModelViewerProps as O, type ModelViewerTilesOptions as P, type ModelViewerToolsOptions as Q, type ModelViewerUiOptions as R, type ModelViewerXrOptions as S, type MouseControllerPosition as T, type ObjectTransformSpace as U, type PerformanceProfile as V, type RendererBackend as W, type SceneComposition as X, type SemanticComparisonOptions as Y, type ShareableViewerState as Z, type StreamingDiagnostics as _, type ARHandoffOptions as a, type UseViewerCameraOptions as a0, type ViewerCameraPreset as a1, type ViewerCameraProps as a2, type ViewerConfiguration as a3, type ViewerEngagementEvent as a4, type ViewerObjectInfo as a5, type ViewerProductOptions as a6, type ViewerReadyState as a7, type ViewerRuntimeStats as a8, type ViewerStateStorage as a9, type XRScaleMode as aa, compareViewerConfigurations as ab, groundAsset as ac, parseAssetTransform as ad, parseViewerState as ae, prepareViewerState as af, serializeViewerState as ag, snapAssetToGrid as ah, useViewerCamera as ai, type ARHandoffRequest as b, type ARHandoffStatus as c, type ARSnapshot as d, type ARSnapshotSource as e, type AnnotationMarker as f, type AssetDiagnosticIssue as g, type AssetDiagnosticsReport as h, type AssetDiagnosticsSource as i, type AssetTextureDiagnostic as j, type AssetTransform as k, type CaptureImageOptions as l, type CaptureVideoOptions as m, type CinematicConfig as n, type CinematicWaypoint as o, type ComparisonCategory as p, type ComparisonChange as q, type ComparisonHighlight as r, type ComparisonObject as s, type ComparisonStatus as t, type ConfigurationComparisonInput as u, type ConfigurationComparisonReport as v, type CustomObjectBindingDataPanelProps as w, type CustomSceneObjectsPanelProps as x, type LicenseStatus as y, MODEL_VIEWER_PRESETS as z };
968
+ export { type StreamingDiagnostics as $, type ARExportOptions as A, type ModelMergeSource as B, type CameraControllerType as C, type DecalMoveTarget as D, type ModelViewerControlsOptions as E, type FocusObjectOptions as F, type GroupedModelViewerProps as G, type HomeCameraState as H, type InspectAssetOptions as I, type ModelViewerDecoderOptions as J, type ModelViewerModelEntry as K, type LicenseResult as L, MAX_VIEWER_STATE_BYTES as M, type ModelViewerPerfOptions as N, type ModelViewerPreset as O, type ModelViewerProps as P, type ModelViewerTilesOptions as Q, type ModelViewerToolsOptions as R, type ModelViewerUiOptions as S, type ModelViewerXrOptions as T, type MouseControllerPosition as U, type ObjectTransformSpace as V, type PerformanceProfile as W, type RendererBackend as X, type SceneComposition as Y, type SemanticComparisonOptions as Z, type ShareableViewerState as _, type ARHandoffOptions as a, type TexturePositioningControls as a0, type UseViewerCameraOptions as a1, type ViewerCameraPreset as a2, type ViewerCameraProps as a3, type ViewerConfiguration as a4, type ViewerEngagementEvent as a5, type ViewerObjectInfo as a6, type ViewerProductOptions as a7, type ViewerReadyState as a8, type ViewerRuntimeStats as a9, type ViewerStateStorage as aa, type XRScaleMode as ab, compareViewerConfigurations as ac, groundAsset as ad, parseAssetTransform as ae, parseViewerState as af, prepareViewerState as ag, serializeViewerState as ah, snapAssetToGrid as ai, useViewerCamera as aj, type ARHandoffRequest as b, type ARHandoffStatus as c, type ARSnapshot as d, type ARSnapshotSource as e, type AnnotationMarker as f, type AssetDiagnosticIssue as g, type AssetDiagnosticsReport as h, type AssetDiagnosticsSource as i, type AssetTextureDiagnostic as j, type AssetTransform as k, type CaptureImageOptions as l, type CaptureVideoOptions as m, type CinematicConfig as n, type CinematicWaypoint as o, type ComparisonCategory as p, type ComparisonChange as q, type ComparisonHighlight as r, type ComparisonObject as s, type ComparisonStatus as t, type ConfigurationComparisonInput as u, type ConfigurationComparisonReport as v, type CustomObjectBindingDataPanelProps as w, type CustomSceneObjectsPanelProps as x, type LicenseStatus as y, MODEL_VIEWER_PRESETS as z };
@@ -1,4 +1,4 @@
1
- import { L as LicenseResult, a as ARHandoffOptions } from './modelViewerProps-BBnZTFO-.js';
1
+ import { L as LicenseResult, a as ARHandoffOptions } from './modelViewerProps-H_K454u_.js';
2
2
 
3
3
  /** Props of `BindingBuilder`. */
4
4
  type BindingBuilderProps = {
@@ -1,4 +1,4 @@
1
- import { L as LicenseResult, a as ARHandoffOptions } from './modelViewerProps-CIY4nsNY.mjs';
1
+ import { L as LicenseResult, a as ARHandoffOptions } from './modelViewerProps-BnVflYRA.mjs';
2
2
 
3
3
  /** Props of `BindingBuilder`. */
4
4
  type BindingBuilderProps = {