@liveroom-tech/react-immersive 5.0.0 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/binding-builder.js +11 -11
- package/dist/binding-builder.mjs +1 -1
- package/dist/{chunk-NVY7N7CU.mjs → chunk-3GX7DOGS.mjs} +1 -1
- package/dist/{chunk-7EW6JZ46.mjs → chunk-AH5NAZWX.mjs} +7 -7
- package/dist/hosted.js +10 -10
- package/dist/hosted.mjs +1 -1
- package/dist/index.js +9 -9
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{a as zn,c as sn,d as Ko,e as Qo,f as ea,g as ln,h as jn,i as oa,j as aa,k as ia,l as tt,m as la,n as da,o as ba,p as ca,q as pa,r as ua,s as ma}from"./chunk-7EW6JZ46.mjs";import{F as ra,f as $o,h as Ln,m as na}from"./chunk-XTLSAYAQ.mjs";import{a as On,b as an,c as rn,e as En,f as _o,h as Wo,i as Yo,j as qo,k as Jo,l as Xo,m as Zo,n as Lt,o as Ot,r as ta,s as sa,v as dn,x as Dn,y as ga,z as fa}from"./chunk-BGYK4Y2Y.mjs";import{useCallback as Q,useEffect as $e,useMemo as uo,useRef as oe,useState as $}from"react";import{Redo2 as Ii,Undo2 as Hi,Upload as Gi,ListRestart as Vi,History as Ui,X as $i,AlertTriangle as ed}from"lucide-react";var is="react-immersive:binding-builder";var wt="session",st="model",Ct="textures",Et="current";var rt=null;function cn(){return rt||(rt=new Promise((o,n)=>{if(typeof indexedDB>"u"){n(new Error("IndexedDB is not available in this environment."));return}let i=indexedDB.open(is,2);i.onupgradeneeded=()=>{let r=i.result;r.objectStoreNames.contains(wt)||r.createObjectStore(wt),r.objectStoreNames.contains(st)||r.createObjectStore(st),r.objectStoreNames.contains(Ct)||r.createObjectStore(Ct)},i.onsuccess=()=>{let r=i.result;r.onversionchange=()=>{r.close(),rt=null},o(r)},i.onerror=()=>n(i.error??new Error("Failed to open IndexedDB."))}),rt.catch(()=>{rt=null}),rt)}function pn(o){return new Promise((n,i)=>{o.oncomplete=()=>n(),o.onerror=()=>i(o.error??new Error("IndexedDB transaction failed.")),o.onabort=()=>i(o.error??new Error("IndexedDB transaction aborted."))})}function Fn(o){return new Promise((n,i)=>{o.onsuccess=()=>n(o.result),o.onerror=()=>i(o.error??new Error("IndexedDB request failed."))})}function bn(o){return o!==null&&typeof o=="object"&&!Array.isArray(o)}function rs(o){if(!bn(o)||o.version!==1)return!1;let n=o.model;return typeof o.savedAt=="number"&&bn(o.bindings)&&bn(o.sceneConfig)&&bn(n)&&typeof n.name=="string"&&(n.kind==="file"&&typeof n.key=="string"||n.kind==="url"&&typeof n.url=="string")}async function ha(o,n){let i=await cn(),r={...o,version:1,savedAt:Date.now()},e=i.transaction([wt,st],"readwrite"),t=pn(e);if(e.objectStore(wt).put(r,Et),r.model.kind==="file"&&n){let u={key:r.model.key,blob:n,name:n.name,type:n.type,lastModified:n.lastModified};e.objectStore(st).put(u,Et)}else r.model.kind==="url"&&e.objectStore(st).delete(Et);return await t,r}async function xa(){let n=(await cn()).transaction([wt,st],"readonly"),i=pn(n),[r,e]=await Promise.all([Fn(n.objectStore(wt).get(Et)),Fn(n.objectStore(st).get(Et))]);return await i,rs(r)?r.model.kind==="url"?{session:r,file:null}:!e||e.key!==r.model.key?null:{session:r,file:new File([e.blob],e.name,{type:e.type,lastModified:e.lastModified})}:null}async function va(o,n){let r=(await cn()).transaction(Ct,"readwrite"),e=pn(r),t={blob:n,name:n.name,type:n.type,savedAt:Date.now()};r.objectStore(Ct).put(t,o),await e}async function un(o){let i=(await cn()).transaction(Ct,"readonly"),r=pn(i),e=await Fn(i.objectStore(Ct).get(o));return await r,e?new File([e.blob],e.name,{type:e.type,lastModified:e.savedAt}):null}import{useState as nl,useEffect as ol}from"react";import{useState as fs}from"react";import{ChevronDown as hs,ChevronLeft as xs,ChevronRight as vs,RotateCcw as ys}from"lucide-react";import{HexColorInput as ws,HexColorPicker as Cs}from"react-colorful";import{useLayoutEffect as wa,useRef as In,useState as Hn}from"react";import{createPortal as ls}from"react-dom";import{ChevronDown as ds,Info as bs}from"lucide-react";import{HexColorInput as cs,HexColorPicker as ps}from"react-colorful";function St(o){let n=o.replace("#","").match(/.{2}/g).map(r=>parseInt(r,16)/255).map(r=>r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4));return .2126*n[0]+.7152*n[1]+.0722*n[2]>.179?"#000":"#fff"}import{useEffect as ss}from"react";function ya(o,n,i){ss(()=>{if(!i)return;let r=Array.isArray(o)?o:[o],e=t=>{let u=t.target;r.some(m=>m.current?.contains(u))||n()};return document.addEventListener("pointerdown",e,!0),()=>{document.removeEventListener("pointerdown",e,!0)}},[o,n,i])}import{jsx as K,jsxs as Se}from"react/jsx-runtime";function Gn({anchorRef:o,onClose:n,children:i}){let r=In(null),[e,t]=Hn(null);return ya([r,o],n,!0),wa(()=>{let u=o.current;if(!u)return;let p=u.getBoundingClientRect(),m=222,h=8,k=Math.min(Math.max(p.right-m,h),window.innerWidth-m-h),d=Math.min(p.bottom+6,window.innerHeight-200);t({top:d,left:k})},[o]),e?ls(K("div",{ref:r,className:"se-colorPickerPopover",style:{position:"fixed",top:e.top,left:e.left},children:i}),document.body):null}function us(o){return o.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").replace(/\s+/g," ").trim().replace(/\b\w/g,n=>n.toUpperCase())}function lt({title:o,children:n}){return Se("section",{className:"se-section",children:[K("h3",{className:"se-sectionTitle",children:o}),K("div",{className:"se-sectionBody",children:n})]})}function W({title:o,open:n,onToggle:i,trailing:r,children:e,disabled:t,tooltip:u}){let p=u?`${u}`:o;return Se("section",{className:"se-panel",children:[Se("button",{type:"button",className:"se-panelHeader",onClick:i,"aria-expanded":n,title:p,children:[Se("span",{className:"se-panelHeaderMain",children:[K(ds,{size:16,className:`se-panelChevron ${n?"se-panelChevron--open":""}`}),K("span",{className:"se-panelTitle",children:o}),u?K("span",{className:"se-panelHelp",title:p,"aria-label":p,role:"img",onClick:m=>m.stopPropagation(),children:K(bs,{size:13})}):null]}),r?K("span",{className:"se-panelTrailing",onClick:m=>m.stopPropagation(),children:r}):null]}),n?K("div",{className:"se-panelBody",style:t?{opacity:.45,pointerEvents:"none"}:void 0,children:e}):null]})}function q({checked:o,onChange:n,label:i}){return Se("label",{className:"se-switch","aria-label":i,children:[K("input",{type:"checkbox",checked:o,onChange:r=>n(r.target.checked)}),K("span",{className:"se-switchTrack",children:K("span",{className:"se-switchThumb"})})]})}function f({label:o,value:n,min:i,max:r,step:e,formatValue:t,onChange:u,disabled:p=!1}){return Se("label",{className:`se-field ${p?"se-field--disabled":""}`,children:[Se("span",{className:"se-fieldLabel",children:[o,K("span",{className:"se-fieldValue",children:t?t(n):n})]}),K("input",{className:"se-slider",type:"range",min:i,max:r,step:e,value:n,onChange:m=>u(Number(m.target.value)),disabled:p})]})}function J({label:o,checked:n,onChange:i}){return Se("label",{className:"se-field se-fieldInline",children:[K("span",{className:"se-fieldLabel",children:o}),K("input",{type:"checkbox",className:"se-checkbox",checked:n,onChange:r=>i(r.target.checked)})]})}function Be({label:o,value:n,options:i,onChange:r}){return Se("label",{className:"se-field se-fieldInline",children:[K("span",{className:"se-fieldLabel",children:o}),K("select",{className:"se-select",value:n,onChange:e=>r(e.target.value),children:i.map(e=>K("option",{value:e,children:us(e)},e))})]})}function Le({label:o,value:n,onChange:i}){let[r,e]=Hn(!1),t=In(null);return Se("div",{className:"se-field",children:[Se("div",{className:"se-fieldInline",children:[K("span",{className:"se-fieldLabel",children:o}),K("span",{ref:t,style:{display:"inline-flex"},children:K(cs,{prefixed:!0,className:"se-swatch",onClick:()=>e(u=>!u),style:{background:n,color:St(n)},color:n,onChange:i})})]}),r?K(Gn,{anchorRef:t,onClose:()=>e(!1),children:K(ps,{color:n,onChange:i})}):null]})}function Ca({value:o,min:n,max:i,step:r,onChange:e}){let[t,u]=Hn(String(o)),p=In(!1);return wa(()=>{p.current||u(String(o))},[o]),K("input",{type:"number",className:"se-numberInput",min:n,max:i,step:r,value:t,onFocus:()=>{p.current=!0},onChange:m=>{let h=m.target.value;u(h),h!==""&&h!=="-"&&!Number.isNaN(Number(h))&&e(Number(h))},onBlur:()=>{p.current=!1,u(String(o))}})}function nt({label:o,value:n,min:i,max:r,step:e,onChange:t}){return Se("div",{className:"se-field",children:[K("span",{className:"se-fieldLabel",children:o}),K("div",{className:"se-vectorRow",children:["X","Y","Z"].map((p,m)=>Se("label",{className:"se-vectorAxis",children:[K("span",{children:p}),K(Ca,{value:n[m],min:i,max:r,step:e,onChange:h=>{let k=[...n];k[m]=h,t(k)}})]},p))})]})}function dt({label:o,value:n,min:i,max:r,step:e,onChange:t}){return Se("div",{className:"se-field",children:[K("span",{className:"se-fieldLabel",children:o}),K("div",{className:"se-vectorRow",children:["X","Y"].map((p,m)=>Se("label",{className:"se-vectorAxis",children:[K("span",{children:p}),K(Ca,{value:n[m],min:i,max:r,step:e,onChange:h=>{let k=[...n];k[m]=h,t(k)}})]},p))})]})}var Sa={free:0,starter:1,growth:2};function ka(o){return o==="starter"||o==="growth"||o==="scale"?o==="scale"?"growth":o:"free"}function Ye(o,n){return Sa[o]>=Sa[n]}var Na={free:"Free",starter:"Starter",growth:"Growth"};import{Lock as ms}from"lucide-react";import{jsx as gs,jsxs as Pa}from"react/jsx-runtime";function Pe({requiredTier:o,feature:n}){return Pa("div",{className:"bb-tierLock",children:[gs(ms,{size:16}),Pa("p",{className:"bb-tierLockMessage",children:[n," requires the ",Na[o]," plan or higher."]})]})}import{Fragment as Vn,jsx as R,jsxs as ce}from"react/jsx-runtime";var Ss=["lit","unlit","normals"],ks=["color","image","environment"];function Ta(o){let n=o%360;return n<0?n+360:n}function jt({title:o,open:n,onToggle:i,children:r,trailing:e}){return ce("section",{className:"se-panel",children:[ce("button",{type:"button",className:"se-panelHeader",onClick:i,"aria-expanded":n,children:[ce("span",{className:"se-panelHeaderMain",children:[R(hs,{size:16,className:`se-panelChevron ${n?"se-panelChevron--open":""}`}),R("span",{className:"se-panelTitle",children:o})]}),e?R("span",{className:"se-panelTrailing",onClick:t=>t.stopPropagation(),children:e}):null]}),n?R("div",{className:"se-panelBody",children:r}):null]})}function Un({config:o,onChange:n}){let{model:i,camera:r,wireframe:e,background:t,environment:u}=o,{tier:p}=tt(),m=Ye(p,"starter"),[h,k]=fs({general:!0,camera:!0,autoRotate:!1,wireframe:!1,background:!1}),d=l=>k(S=>({...S,[l]:!S[l]})),g=l=>n({...o,model:l}),M=l=>n({...o,camera:l}),B=l=>n({...o,wireframe:l}),N=l=>n({...o,background:l}),O=l=>n({...o,environment:l}),T=l=>{O({...u,source:"preset",preset:l})};return ce("div",{className:"se-generalContent",children:[ce(jt,{title:"General",open:h.general,onToggle:()=>d("general"),children:[ce("div",{className:"se-field",children:[ce("div",{className:"se-fieldLabel",children:[R("span",{children:"Straighten model"}),R("button",{type:"button",className:"se-iconButton",onClick:()=>g({...i,rotation:[0,0,0]}),"aria-label":"Reset model rotation",children:R(ys,{size:16})})]}),R("div",{className:"se-axisStepperGrid",children:["X","Y","Z"].map((l,S)=>ce("div",{className:"se-axisStepper",children:[R("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let P=[...i.rotation];P[S]=Ta(P[S]-90),g({...i,rotation:P})},"aria-label":`Rotate ${l} axis backward`,children:R(xs,{size:16})}),R("span",{className:"se-axisStepperLabel",children:l}),R("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let P=[...i.rotation];P[S]=Ta(P[S]+90),g({...i,rotation:P})},"aria-label":`Rotate ${l} axis forward`,children:R(vs,{size:16})})]},l))})]}),R(nt,{label:"Rotation",value:i.rotation,min:0,max:360,step:1,onChange:l=>g({...i,rotation:l})}),ce("div",{className:"se-field",children:[R("span",{className:"se-fieldLabel",children:"Renderer"}),R("div",{className:"se-segmentedControl se-segmentedControl--renderer",children:qo.map(l=>R("button",{type:"button",className:`se-segmentedOption ${i.renderer===l?"se-segmentedOption--active":""}`,onClick:()=>g({...i,renderer:l}),children:l==="uv-checker"?"UV CHECKER":l.toUpperCase()},l))})]}),R(Be,{label:"Shading",value:i.shading,options:Ss,onChange:l=>g({...i,shading:l})})]}),R(jt,{title:"Camera",open:h.camera,onToggle:()=>d("camera"),children:R(f,{label:"Field Of View",value:r.fieldOfView,min:20,max:100,step:.1,formatValue:l=>`${l.toFixed(3)}\xB0`,onChange:l=>M({...r,fieldOfView:l})})}),R(jt,{title:"Auto Rotate",open:h.autoRotate,onToggle:()=>d("autoRotate"),trailing:ce("label",{className:"se-switch","aria-label":"Toggle auto rotate",children:[R("input",{type:"checkbox",checked:i.autoRotate??!1,onChange:l=>g({...i,autoRotate:l.target.checked})}),R("span",{className:"se-switchTrack",children:R("span",{className:"se-switchThumb"})})]}),children:i.autoRotate?R(f,{label:"Rotation Speed",value:i.autoRotateSpeed??1,min:.1,max:3,step:.1,formatValue:l=>`${l.toFixed(1)}x`,onChange:l=>g({...i,autoRotateSpeed:l})}):R("div",{className:"se-placeholder",children:"Enable auto rotate to adjust its speed."})}),R(jt,{title:"Wireframe",open:h.wireframe,onToggle:()=>d("wireframe"),trailing:ce("label",{className:"se-switch","aria-label":"Toggle wireframe preview",children:[R("input",{type:"checkbox",checked:m&&e.enabled,disabled:!m,onChange:l=>B({...e,enabled:l.target.checked})}),R("span",{className:"se-switchTrack",children:R("span",{className:"se-switchThumb"})})]}),children:m?ce(Vn,{children:[R(f,{label:"Opacity",value:e.opacity,min:0,max:1,step:.01,onChange:l=>B({...e,opacity:l})}),R(Le,{label:"Wire color",value:e.color,onChange:l=>B({...e,color:l})})]}):R(Pe,{requiredTier:"starter",feature:"Wireframe preview"})}),R(jt,{title:"Background",open:h.background,onToggle:()=>d("background"),trailing:ce("label",{className:"se-switch","aria-label":"Toggle scene background",children:[R("input",{type:"checkbox",checked:t.enabled,onChange:l=>N({...t,enabled:l.target.checked})}),R("span",{className:"se-switchTrack",children:R("span",{className:"se-switchThumb"})})]}),children:t.enabled?ce(Vn,{children:[ce("div",{className:"se-field",children:[R("span",{className:"se-fieldLabel",children:"Background type"}),R("div",{className:"se-segmentedControl",children:ks.map(l=>R("button",{type:"button",className:`se-segmentedOption ${t.type===l?"se-segmentedOption--active":""}`,onClick:()=>N({...t,type:l}),children:l},l))})]}),t.type==="environment"?m?ce(Vn,{children:[ce("div",{className:"se-field",children:[R("span",{className:"se-fieldLabel",children:"Environment source"}),ce("div",{className:"se-segmentedControl",children:[R("button",{type:"button",className:`se-segmentedOption ${u.source==="preset"?"se-segmentedOption--active":""}`,onClick:()=>O({...u,source:"preset"}),children:"PRESET"}),R("button",{type:"button",className:`se-segmentedOption ${u.source==="custom"?"se-segmentedOption--active":""}`,onClick:()=>O({...u,source:"custom"}),children:"CUSTOM"})]})]}),u.source==="preset"?R(Be,{label:"Environment preset",value:u.preset,options:Jo,onChange:T}):ce("label",{className:"se-field",children:[R("span",{className:"se-fieldLabel",children:"Custom environment URL"}),R("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/environment.hdr",value:u.customEnvironmentUrl,onChange:l=>O({...u,customEnvironmentUrl:l.target.value})}),R("span",{className:"bb-note",children:"Enter a HDR, EXR, JPG, JPEG, PNG, or WEBP URL."}),u.customEnvironmentUrl.trim()&&!Wo(u.customEnvironmentUrl)?R("span",{className:"bb-note",style:{color:"#fca5a5"},children:"Invalid image/HDRI URL."}):null]}),R(f,{label:"Environment intensity",value:u.intensity,min:0,max:3,step:.05,onChange:l=>O({...u,intensity:l})})]}):R(Pe,{requiredTier:"starter",feature:"Environment backgrounds"}):null,t.type==="image"?ce("label",{className:"se-field",children:[R("span",{className:"se-fieldLabel",children:"Background image URL"}),R("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/background.jpg",value:t.imageUrl,onChange:l=>N({...t,imageUrl:l.target.value})})]}):null,t.type==="color"?ce("div",{className:"se-field",children:[R("span",{className:"se-fieldLabel",children:"Background color"}),R("div",{className:"se-inlineColorPicker",children:R(Cs,{color:t.color,onChange:l=>N({...t,color:l})})}),R("div",{className:"se-fieldInline",children:R(ws,{prefixed:!0,className:"se-swatch",style:{background:t.color,color:St(t.color)},color:t.color,onChange:l=>N({...t,color:l})})})]}):null]}):R("div",{className:"se-placeholder",children:"Background rendering is disabled for this scene preset."})})]})}import{useState as Ps}from"react";import{jsx as A,jsxs as Dt}from"react/jsx-runtime";function Ba({pp:o,set:n,open:i,toggle:r}){let{ssao:e}=o;return Dt(W,{title:"SSAO",tooltip:"Adds soft contact shadows in corners, creases, and tight spaces.",open:i.ssao,onToggle:()=>r("ssao"),disabled:!e.enabled,trailing:A(q,{checked:e.enabled,onChange:t=>n("ssao",{...e,enabled:t}),label:"Toggle SSAO"}),children:[A(f,{label:"Samples",value:e.samples,min:1,max:64,step:1,onChange:t=>n("ssao",{...e,samples:t})}),A(f,{label:"Rings",value:e.rings,min:1,max:12,step:1,onChange:t=>n("ssao",{...e,rings:t})}),A(f,{label:"Intensity",value:e.intensity,min:0,max:20,step:.5,onChange:t=>n("ssao",{...e,intensity:t})}),A(f,{label:"Radius",value:e.radius,min:.01,max:1,step:.01,onChange:t=>n("ssao",{...e,radius:t})}),A(f,{label:"Bias",value:e.bias,min:0,max:.1,step:.001,onChange:t=>n("ssao",{...e,bias:t})}),A(f,{label:"Luminance Influence",value:e.luminanceInfluence,min:0,max:1,step:.01,onChange:t=>n("ssao",{...e,luminanceInfluence:t})}),A(f,{label:"Fade",value:e.fade,min:0,max:.1,step:.001,onChange:t=>n("ssao",{...e,fade:t})}),A(f,{label:"Min Radius Scale",value:e.minRadiusScale,min:0,max:1,step:.01,onChange:t=>n("ssao",{...e,minRadiusScale:t})}),A(f,{label:"World Distance Threshold",value:e.worldDistanceThreshold,min:0,max:100,step:.1,onChange:t=>n("ssao",{...e,worldDistanceThreshold:t})}),A(f,{label:"World Distance Falloff",value:e.worldDistanceFalloff,min:0,max:20,step:.1,onChange:t=>n("ssao",{...e,worldDistanceFalloff:t})}),A(f,{label:"World Proximity Threshold",value:e.worldProximityThreshold,min:0,max:100,step:.1,onChange:t=>n("ssao",{...e,worldProximityThreshold:t})}),A(f,{label:"World Proximity Falloff",value:e.worldProximityFalloff,min:0,max:20,step:.1,onChange:t=>n("ssao",{...e,worldProximityFalloff:t})})]})}function Ra({pp:o,set:n,open:i,toggle:r}){let{autofocus:e}=o;return Dt(W,{title:"Auto focus",tooltip:"Keeps the focus plane tracking a subject so the image stays sharp where you want it.",open:i.autofocus,onToggle:()=>r("autofocus"),disabled:!e.enabled,trailing:A(q,{checked:e.enabled,onChange:t=>n("autofocus",{...e,enabled:t}),label:"Toggle Autofocus"}),children:[A(f,{label:"Focus Distance",value:e.focusDistance,min:0,max:50,step:.1,onChange:t=>n("autofocus",{...e,focusDistance:t})}),A(f,{label:"Focus Range",value:e.focusRange,min:.1,max:50,step:.1,onChange:t=>n("autofocus",{...e,focusRange:t})}),A(f,{label:"Focal Length",value:e.focalLength,min:0,max:1,step:.01,onChange:t=>n("autofocus",{...e,focalLength:t})}),A(f,{label:"Bokeh Scale",value:e.bokehScale,min:0,max:20,step:.1,onChange:t=>n("autofocus",{...e,bokehScale:t})}),A(nt,{label:"Target",value:e.target,min:-100,max:100,step:.1,onChange:t=>n("autofocus",{...e,target:t})}),A(J,{label:"Mouse Follow",checked:e.mouse,onChange:t=>n("autofocus",{...e,mouse:t})}),A(J,{label:"Manual Update",checked:e.manual,onChange:t=>n("autofocus",{...e,manual:t})}),A(f,{label:"Debug",value:e.debug,min:0,max:1,step:.01,onChange:t=>n("autofocus",{...e,debug:t})}),A(f,{label:"Smooth Time",value:e.smoothTime,min:0,max:2,step:.01,onChange:t=>n("autofocus",{...e,smoothTime:t})})]})}function Aa({pp:o,set:n,open:i,toggle:r}){let{godRays:e}=o;return Dt(W,{title:"God Rays",tooltip:"Creates light shafts that streak outward from a bright sun or light source.",open:i.godRays,onToggle:()=>r("godRays"),disabled:!e.enabled,trailing:A(q,{checked:e.enabled,onChange:t=>n("godRays",{...e,enabled:t}),label:"Toggle GodRays"}),children:[A(nt,{label:"Sun Position",value:e.sunPosition,min:-100,max:100,step:.1,onChange:t=>n("godRays",{...e,sunPosition:t})}),A(f,{label:"Samples",value:e.samples,min:1,max:128,step:1,onChange:t=>n("godRays",{...e,samples:t})}),A(f,{label:"Density",value:e.density,min:0,max:2,step:.01,onChange:t=>n("godRays",{...e,density:t})}),A(f,{label:"Decay",value:e.decay,min:0,max:1,step:.01,onChange:t=>n("godRays",{...e,decay:t})}),A(f,{label:"Weight",value:e.weight,min:0,max:2,step:.01,onChange:t=>n("godRays",{...e,weight:t})}),A(f,{label:"Exposure",value:e.exposure,min:0,max:2,step:.01,onChange:t=>n("godRays",{...e,exposure:t})}),A(f,{label:"Clamp Max",value:e.clampMax,min:0,max:2,step:.01,onChange:t=>n("godRays",{...e,clampMax:t})}),A(J,{label:"Blur",checked:e.blur,onChange:t=>n("godRays",{...e,blur:t})}),A(Be,{label:"Kernel Size",value:e.kernelSize,options:Lt,onChange:t=>n("godRays",{...e,kernelSize:t})})]})}function Ma({pp:o,set:n,open:i,toggle:r}){let{lensflare:e}=o;return Dt(W,{title:"Lens Flare",tooltip:"Adds camera flare artifacts and glow from a bright light source.",open:i.lensflare,onToggle:()=>r("lensflare"),disabled:!e.enabled,trailing:A(q,{checked:e.enabled,onChange:t=>n("lensflare",{...e,enabled:t}),label:"Toggle Lensflare"}),children:[A(nt,{label:"Lens Position",value:e.lensPosition,min:-100,max:100,step:.1,onChange:t=>n("lensflare",{...e,lensPosition:t})}),A(f,{label:"Smooth Time",value:e.smoothTime,min:0,max:1,step:.01,onChange:t=>n("lensflare",{...e,smoothTime:t})}),A(f,{label:"Glare Size",value:e.glareSize,min:0,max:1,step:.01,onChange:t=>n("lensflare",{...e,glareSize:t})}),A(f,{label:"Flare Size",value:e.flareSize,min:0,max:.1,step:.001,onChange:t=>n("lensflare",{...e,flareSize:t})}),A(f,{label:"Flare Speed",value:e.flareSpeed,min:0,max:.2,step:.001,onChange:t=>n("lensflare",{...e,flareSpeed:t})}),A(f,{label:"Flare Shape",value:e.flareShape,min:0,max:.2,step:.001,onChange:t=>n("lensflare",{...e,flareShape:t})}),A(J,{label:"Animated",checked:e.animated,onChange:t=>n("lensflare",{...e,animated:t})}),A(J,{label:"Anamorphic",checked:e.anamorphic,onChange:t=>n("lensflare",{...e,anamorphic:t})}),A(Le,{label:"Color Gain",value:e.colorGain,onChange:t=>n("lensflare",{...e,colorGain:t})}),A(f,{label:"Halo Scale",value:e.haloScale,min:0,max:2,step:.01,onChange:t=>n("lensflare",{...e,haloScale:t})}),A(J,{label:"Secondary Ghosts",checked:e.secondaryGhosts,onChange:t=>n("lensflare",{...e,secondaryGhosts:t})}),A(J,{label:"Additional Streaks",checked:e.aditionalStreaks,onChange:t=>n("lensflare",{...e,aditionalStreaks:t})}),A(f,{label:"Ghost Scale",value:e.ghostScale,min:0,max:1,step:.01,onChange:t=>n("lensflare",{...e,ghostScale:t})}),A(f,{label:"Opacity",value:e.opacity,min:0,max:1,step:.01,onChange:t=>n("lensflare",{...e,opacity:t})}),A(J,{label:"Star Burst",checked:e.starBurst,onChange:t=>n("lensflare",{...e,starBurst:t})})]})}function za({pp:o,set:n,open:i,toggle:r}){let{depthOfField:e}=o;return Dt(W,{title:"Depth Of Field",tooltip:"Blurs areas that sit away from the focal plane for a camera-like look.",open:i.depthOfField,onToggle:()=>r("depthOfField"),disabled:!e.enabled,trailing:A(q,{checked:e.enabled,onChange:t=>n("depthOfField",{...e,enabled:t}),label:"Toggle DepthOfField"}),children:[A(f,{label:"Focus Distance",value:e.focusDistance,min:0,max:50,step:.1,onChange:t=>n("depthOfField",{...e,focusDistance:t})}),A(f,{label:"Focus Range",value:e.focusRange,min:.1,max:50,step:.1,onChange:t=>n("depthOfField",{...e,focusRange:t})}),A(f,{label:"Focal Length",value:e.focalLength,min:0,max:1,step:.01,onChange:t=>n("depthOfField",{...e,focalLength:t})}),A(f,{label:"Bokeh Scale",value:e.bokehScale,min:0,max:20,step:.1,onChange:t=>n("depthOfField",{...e,bokehScale:t})})]})}import{jsx as _,jsxs as kt}from"react/jsx-runtime";var Ns=["linear","reinhard","aces"];function La({pp:o,set:n,open:i,toggle:r}){let{colorAverage:e}=o;return _(W,{title:"Color Average",tooltip:"Blends the frame toward a single average color for a washed-out stylized look.",open:i.colorAverage,onToggle:()=>r("colorAverage"),disabled:!e.enabled,trailing:_(q,{checked:e.enabled,onChange:t=>n("colorAverage",{...e,enabled:t}),label:"Toggle ColorAverage"}),children:_("div",{className:"se-placeholder",children:"Averages the frame color using the docs default blend mode."})})}function Oa({pp:o,set:n,open:i,toggle:r}){let{brightnessContrast:e}=o;return kt(W,{title:"Brightness Contrast",tooltip:"Raises or lowers overall brightness and contrast across the scene.",open:i.brightnessContrast,onToggle:()=>r("brightnessContrast"),disabled:!e.enabled,trailing:_(q,{checked:e.enabled,onChange:t=>n("brightnessContrast",{...e,enabled:t}),label:"Toggle BrightnessContrast"}),children:[_(f,{label:"Brightness",value:e.brightness,min:-1,max:1,step:.01,onChange:t=>n("brightnessContrast",{...e,brightness:t})}),_(f,{label:"Contrast",value:e.contrast,min:-1,max:1,step:.01,onChange:t=>n("brightnessContrast",{...e,contrast:t})})]})}function Ea({pp:o,set:n,open:i,toggle:r}){let{hueSaturation:e}=o;return kt(W,{title:"Hue Saturation",tooltip:"Shifts the hue and saturation to tint the whole image.",open:i.hueSaturation,onToggle:()=>r("hueSaturation"),disabled:!e.enabled,trailing:_(q,{checked:e.enabled,onChange:t=>n("hueSaturation",{...e,enabled:t}),label:"Toggle HueSaturation"}),children:[_(f,{label:"Hue",value:e.hue,min:-Math.PI,max:Math.PI,step:.01,formatValue:t=>`${t.toFixed(2)} rad`,onChange:t=>n("hueSaturation",{...e,hue:t})}),_(f,{label:"Saturation",value:e.saturation,min:-1,max:1,step:.01,onChange:t=>n("hueSaturation",{...e,saturation:t})})]})}function ja({pp:o,set:n,open:i,toggle:r}){let{vignette:e}=o;return kt(W,{title:"Vignette",tooltip:"Darkens the edges of the screen so the center feels more focused.",open:i.vignette,onToggle:()=>r("vignette"),disabled:!e.enabled,trailing:_(q,{checked:e.enabled,onChange:t=>n("vignette",{...e,enabled:t}),label:"Toggle Vignette"}),children:[_(f,{label:"Offset",value:e.offset,min:0,max:1,step:.01,onChange:t=>n("vignette",{...e,offset:t})}),_(f,{label:"Darkness",value:e.darkness,min:0,max:1,step:.01,onChange:t=>n("vignette",{...e,darkness:t})}),_(J,{label:"Eskil",checked:e.eskil,onChange:t=>n("vignette",{...e,eskil:t})})]})}function Da({pp:o,set:n,open:i,toggle:r}){let{bloom:e}=o;return kt(W,{title:"Bloom",tooltip:"Makes bright areas glow and bleed softly into nearby pixels.",open:i.bloom,onToggle:()=>r("bloom"),disabled:!e.enabled,trailing:_(q,{checked:e.enabled,onChange:t=>n("bloom",{...e,enabled:t}),label:"Toggle Bloom"}),children:[_(f,{label:"Threshold",value:e.luminanceThreshold,min:0,max:1,step:.01,onChange:t=>n("bloom",{...e,luminanceThreshold:t})}),_(f,{label:"Smoothing",value:e.luminanceSmoothing,min:0,max:1,step:.01,onChange:t=>n("bloom",{...e,luminanceSmoothing:t})}),_(f,{label:"Intensity",value:e.intensity,min:0,max:3,step:.05,onChange:t=>n("bloom",{...e,intensity:t})}),_(J,{label:"Mipmap Blur",checked:e.mipmapBlur,onChange:t=>n("bloom",{...e,mipmapBlur:t})}),_(f,{label:"Radius",value:e.radius,min:0,max:1,step:.01,onChange:t=>n("bloom",{...e,radius:t})}),_(f,{label:"Levels",value:e.levels,min:1,max:16,step:1,onChange:t=>n("bloom",{...e,levels:t})})]})}function Fa({pp:o,set:n,open:i,toggle:r}){let{toneMapping:e}=o;return kt(W,{title:"Tone Mapping",tooltip:"Remaps HDR lighting to screen output and controls exposure style.",open:i.toneMapping,onToggle:()=>r("toneMapping"),disabled:!e.enabled,trailing:_(q,{checked:e.enabled,onChange:t=>n("toneMapping",{...e,enabled:t}),label:"Toggle ToneMapping"}),children:[kt("div",{className:"se-field",children:[_("span",{className:"se-fieldLabel",children:"Mode"}),_("div",{className:"se-segmentedControl",children:Ns.map(t=>_("button",{type:"button",className:`se-segmentedOption ${e.mode===t?"se-segmentedOption--active":""}`,onClick:()=>n("toneMapping",{...e,mode:t}),children:t==="aces"?"Filmic":t.charAt(0).toUpperCase()+t.slice(1)},t))})]}),_(f,{label:"Resolution",value:e.resolution,min:64,max:4096,step:64,onChange:t=>n("toneMapping",{...e,resolution:t})}),_(f,{label:"White Point",value:e.whitePoint,min:0,max:16,step:.01,onChange:t=>n("toneMapping",{...e,whitePoint:t})}),_(f,{label:"Middle Grey",value:e.middleGrey,min:0,max:1,step:.01,onChange:t=>n("toneMapping",{...e,middleGrey:t})}),_(f,{label:"Min Luminance",value:e.minLuminance,min:0,max:1,step:.01,onChange:t=>n("toneMapping",{...e,minLuminance:t})}),_(f,{label:"Average Luminance",value:e.averageLuminance,min:0,max:4,step:.01,onChange:t=>n("toneMapping",{...e,averageLuminance:t})}),_(f,{label:"Adaptation Rate",value:e.adaptationRate,min:0,max:10,step:.01,onChange:t=>n("toneMapping",{...e,adaptationRate:t})}),_(f,{label:"Exposure",value:e.exposure,min:0,max:3,step:.01,onChange:t=>n("toneMapping",{...e,exposure:t})})]})}function Ia({pp:o,set:n,open:i,toggle:r}){let{sepia:e}=o;return _(W,{title:"Sepia",tooltip:"Adds a warm vintage brown tint to the entire image.",open:i.sepia,onToggle:()=>r("sepia"),disabled:!e.enabled,trailing:_(q,{checked:e.enabled,onChange:t=>n("sepia",{...e,enabled:t}),label:"Toggle Sepia"}),children:_(f,{label:"Intensity",value:e.intensity,min:0,max:1,step:.01,onChange:t=>n("sepia",{...e,intensity:t})})})}import{jsx as F,jsxs as Nt}from"react/jsx-runtime";function Ha({pp:o,set:n,open:i,toggle:r}){let{dotScreen:e}=o;return Nt(W,{title:"Dot Screen",tooltip:"Overlays a halftone dot pattern for a printed or retro look.",open:i.dotScreen,onToggle:()=>r("dotScreen"),disabled:!e.enabled,trailing:F(q,{checked:e.enabled,onChange:t=>n("dotScreen",{...e,enabled:t}),label:"Toggle DotScreen"}),children:[F(f,{label:"Angle",value:e.angle,min:0,max:Math.PI*2,step:.01,formatValue:t=>`${t.toFixed(2)} rad`,onChange:t=>n("dotScreen",{...e,angle:t})}),F(f,{label:"Scale",value:e.scale,min:.1,max:10,step:.05,onChange:t=>n("dotScreen",{...e,scale:t})})]})}function Ga({pp:o,set:n,open:i,toggle:r}){let{glitch:e}=o;return Nt(W,{title:"Glitch",tooltip:"Introduces digital distortion, tearing, and scan noise.",open:i.glitch,onToggle:()=>r("glitch"),disabled:!e.enabled,trailing:F(q,{checked:e.enabled,onChange:t=>n("glitch",{...e,enabled:t}),label:"Toggle Glitch"}),children:[F(Be,{label:"Mode",value:e.mode,options:Xo,onChange:t=>n("glitch",{...e,mode:t})}),F(dt,{label:"Delay",value:e.delay,min:0,max:10,step:.01,onChange:t=>n("glitch",{...e,delay:t})}),F(dt,{label:"Duration",value:e.duration,min:0,max:5,step:.01,onChange:t=>n("glitch",{...e,duration:t})}),F(dt,{label:"Strength",value:e.strength,min:0,max:2,step:.01,onChange:t=>n("glitch",{...e,strength:t})}),F(dt,{label:"Chromatic Aberration Offset",value:e.chromaticAberrationOffset,min:0,max:.02,step:1e-4,onChange:t=>n("glitch",{...e,chromaticAberrationOffset:t})}),F(f,{label:"Columns",value:e.columns,min:0,max:.5,step:.001,onChange:t=>n("glitch",{...e,columns:t})}),F(f,{label:"Ratio",value:e.ratio,min:0,max:1,step:.01,onChange:t=>n("glitch",{...e,ratio:t})})]})}function Va({pp:o,set:n,open:i,toggle:r}){let{grid:e}=o;return Nt(W,{title:"Grid",tooltip:"Adds a visual grid overlay that feels retro or debug-like.",open:i.grid,onToggle:()=>r("grid"),disabled:!e.enabled,trailing:F(q,{checked:e.enabled,onChange:t=>n("grid",{...e,enabled:t}),label:"Toggle Grid"}),children:[F(f,{label:"Scale",value:e.scale,min:.1,max:10,step:.05,onChange:t=>n("grid",{...e,scale:t})}),F(f,{label:"Line Width",value:e.lineWidth,min:0,max:1,step:.01,onChange:t=>n("grid",{...e,lineWidth:t})})]})}function Ua({pp:o,set:n,open:i,toggle:r}){let{chromaticAberration:e}=o;return Nt(W,{title:"Chromatic Aberration",tooltip:"Separates color channels slightly to mimic lens fringing.",open:i.chromaticAberration,onToggle:()=>r("chromaticAberration"),disabled:!e.enabled,trailing:F(q,{checked:e.enabled,onChange:t=>n("chromaticAberration",{...e,enabled:t}),label:"Toggle ChromaticAberration"}),children:[F(f,{label:"Offset X",value:e.offsetX,min:0,max:.02,step:1e-4,onChange:t=>n("chromaticAberration",{...e,offsetX:t})}),F(f,{label:"Offset Y",value:e.offsetY,min:0,max:.02,step:1e-4,onChange:t=>n("chromaticAberration",{...e,offsetY:t})}),F(J,{label:"Radial Modulation",checked:e.radialModulation,onChange:t=>n("chromaticAberration",{...e,radialModulation:t})}),F(f,{label:"Modulation Offset",value:e.modulationOffset,min:0,max:1,step:.01,onChange:t=>n("chromaticAberration",{...e,modulationOffset:t})})]})}function $a({pp:o,set:n,open:i,toggle:r}){let{noise:e}=o;return Nt(W,{title:"Noise",tooltip:"Adds film grain or static noise to the rendered image.",open:i.noise,onToggle:()=>r("noise"),disabled:!e.enabled,trailing:F(q,{checked:e.enabled,onChange:t=>n("noise",{...e,enabled:t}),label:"Toggle Noise"}),children:[F(f,{label:"Amount",value:e.opacity,min:0,max:1,step:.01,onChange:t=>n("noise",{...e,opacity:t})}),F(J,{label:"Premultiply",checked:e.premultiply,onChange:t=>n("noise",{...e,premultiply:t})})]})}function _a({pp:o,set:n,open:i,toggle:r}){let{scanline:e}=o;return F(W,{title:"Scan Line",tooltip:"Draws horizontal CRT-style scan lines over the frame.",open:i.scanline,onToggle:()=>r("scanline"),disabled:!e.enabled,trailing:F(q,{checked:e.enabled,onChange:t=>n("scanline",{...e,enabled:t}),label:"Toggle Scanline"}),children:F(f,{label:"Density",value:e.density,min:0,max:10,step:.25,onChange:t=>n("scanline",{...e,density:t})})})}function Ka({pp:o,set:n,open:i,toggle:r}){let{pixelation:e}=o;return F(W,{title:"Pixelation",tooltip:"Reduces detail into larger pixels for a blocky stylized effect.",open:i.pixelation,onToggle:()=>r("pixelation"),disabled:!e.enabled,trailing:F(q,{checked:e.enabled,onChange:t=>n("pixelation",{...e,enabled:t}),label:"Toggle Pixelation"}),children:F(f,{label:"Granularity",value:e.granularity,min:0,max:20,step:1,onChange:t=>n("pixelation",{...e,granularity:t})})})}function Wa({pp:o,set:n,open:i,toggle:r}){let{ramp:e}=o;return Nt(W,{title:"Ramp",tooltip:"Adds a screen-space color gradient, or masks effects earlier in the stack.",open:i.ramp,onToggle:()=>r("ramp"),disabled:!e.enabled,trailing:F(q,{checked:e.enabled,onChange:t=>n("ramp",{...e,enabled:t}),label:"Toggle Ramp"}),children:[F(Be,{label:"Ramp Type",value:e.rampType,options:Zo,onChange:t=>n("ramp",{...e,rampType:t})}),F(dt,{label:"Ramp Start",value:e.rampStart,min:0,max:1,step:.01,onChange:t=>n("ramp",{...e,rampStart:t})}),F(dt,{label:"Ramp End",value:e.rampEnd,min:0,max:1,step:.01,onChange:t=>n("ramp",{...e,rampEnd:t})}),F(Le,{label:"Start Color",value:e.startColor,onChange:t=>n("ramp",{...e,startColor:t})}),F(Le,{label:"End Color",value:e.endColor,onChange:t=>n("ramp",{...e,endColor:t})}),!e.rampMask&&F(f,{label:"Gradient Opacity",value:e.opacity??.5,min:0,max:1,step:.01,onChange:t=>n("ramp",{...e,opacity:t})}),F(f,{label:"Bias",value:e.rampBias,min:0,max:1,step:.01,onChange:t=>n("ramp",{...e,rampBias:t})}),F(f,{label:"Gain",value:e.rampGain,min:0,max:1,step:.01,onChange:t=>n("ramp",{...e,rampGain:t})}),F(J,{label:"Mask Earlier Effects",checked:e.rampMask,onChange:t=>n("ramp",{...e,rampMask:t})}),F(J,{label:"Invert",checked:e.rampInvert,onChange:t=>n("ramp",{...e,rampInvert:t})})]})}import{jsx as ae,jsxs as Xa}from"react/jsx-runtime";function Ya({pp:o,set:n,open:i,toggle:r}){let{outline:e}=o;return Xa(W,{title:"Outline",tooltip:"Draws a visible edge around the selected object binding.",open:i.outline,onToggle:()=>r("outline"),disabled:!e.enabled,trailing:ae(q,{checked:e.enabled,onChange:t=>n("outline",{...e,enabled:t}),label:"Toggle Outline"}),children:[ae("div",{className:"se-placeholder",children:"Outlines the currently selected object binding in the model editor."}),ae(f,{label:"Selection Layer",value:e.selectionLayer,min:0,max:20,step:1,onChange:t=>n("outline",{...e,selectionLayer:t})}),ae(f,{label:"Edge Strength",value:e.edgeStrength,min:0,max:10,step:.1,onChange:t=>n("outline",{...e,edgeStrength:t})}),ae(f,{label:"Pulse Speed",value:e.pulseSpeed,min:0,max:10,step:.1,onChange:t=>n("outline",{...e,pulseSpeed:t})}),ae(Le,{label:"Visible Edge Color",value:e.visibleEdgeColor,onChange:t=>n("outline",{...e,visibleEdgeColor:t})}),ae(Le,{label:"Hidden Edge Color",value:e.hiddenEdgeColor,onChange:t=>n("outline",{...e,hiddenEdgeColor:t})}),ae(Be,{label:"Kernel Size",value:e.kernelSize,options:Lt,onChange:t=>n("outline",{...e,kernelSize:t})}),ae(J,{label:"Blur",checked:e.blur,onChange:t=>n("outline",{...e,blur:t})}),ae(J,{label:"X-Ray",checked:e.xRay,onChange:t=>n("outline",{...e,xRay:t})})]})}function qa({pp:o,set:n,open:i,toggle:r}){let{selectiveBloom:e}=o;return Xa(W,{title:"Selective Bloom",tooltip:"Applies bloom only to objects assigned to the selected layer.",open:i.selectiveBloom,onToggle:()=>r("selectiveBloom"),disabled:!e.enabled,trailing:ae(q,{checked:e.enabled,onChange:t=>n("selectiveBloom",{...e,enabled:t}),label:"Toggle SelectiveBloom"}),children:[ae("div",{className:"se-placeholder",children:"Applies bloom to the currently selected object binding."}),ae(f,{label:"Selection Layer",value:e.selectionLayer,min:0,max:20,step:1,onChange:t=>n("selectiveBloom",{...e,selectionLayer:t})}),ae(f,{label:"Intensity",value:e.intensity,min:0,max:5,step:.05,onChange:t=>n("selectiveBloom",{...e,intensity:t})}),ae(f,{label:"Threshold",value:e.luminanceThreshold,min:0,max:1,step:.01,onChange:t=>n("selectiveBloom",{...e,luminanceThreshold:t})}),ae(f,{label:"Smoothing",value:e.luminanceSmoothing,min:0,max:1,step:.01,onChange:t=>n("selectiveBloom",{...e,luminanceSmoothing:t})}),ae(Be,{label:"Kernel Size",value:e.kernelSize,options:Lt,onChange:t=>n("selectiveBloom",{...e,kernelSize:t})}),ae(J,{label:"Mipmap Blur",checked:e.mipmapBlur,onChange:t=>n("selectiveBloom",{...e,mipmapBlur:t})}),ae(J,{label:"Inverted",checked:e.inverted,onChange:t=>n("selectiveBloom",{...e,inverted:t})}),ae(J,{label:"Ignore Background",checked:e.ignoreBackground,onChange:t=>n("selectiveBloom",{...e,ignoreBackground:t})})]})}function Ja({pp:o,set:n,open:i,toggle:r}){let{smaa:e}=o;return ae(W,{title:"SMAA",tooltip:"Reduces jagged edges with subpixel anti-aliasing.",open:i.smaa,onToggle:()=>r("smaa"),trailing:ae(q,{checked:e.enabled,onChange:t=>n("smaa",{...e,enabled:t}),label:"Toggle SMAA"}),children:ae("div",{className:"se-placeholder",children:"Subpixel Morphological Anti-Aliasing smooths jagged edges in post-process."})})}import{jsx as ie,jsxs as Ts}from"react/jsx-runtime";function $n({config:o,onChange:n}){let[i,r]=Ps({autofocus:!1,colorAverage:!1,dotScreen:!1,glitch:!1,godRays:!1,grid:!1,lensflare:!1,outline:!1,selectiveBloom:!1,ramp:!1,ssao:!1,brightnessContrast:!1,hueSaturation:!1,depthOfField:!1,chromaticAberration:!1,vignette:!1,bloom:!1,toneMapping:!1,noise:!1,sepia:!1,scanline:!1,pixelation:!1,smaa:!1}),e=m=>r(h=>({...h,[m]:!h[m]})),t=o.postProcessing,p={pp:t,set:(m,h)=>n({...o,postProcessing:{...t,[m]:h}}),open:i,toggle:e};return Ts("div",{className:"se-generalContent",children:[ie(Ba,{...p}),ie(Ra,{...p}),ie(La,{...p}),ie(Ha,{...p}),ie(Ga,{...p}),ie(Aa,{...p}),ie(Va,{...p}),ie(Ma,{...p}),ie(Ya,{...p}),ie(qa,{...p}),ie(Oa,{...p}),ie(Ea,{...p}),ie(za,{...p}),ie(Ua,{...p}),ie(ja,{...p}),ie(Da,{...p}),ie(Fa,{...p}),ie($a,{...p}),ie(Ia,{...p}),ie(_a,{...p}),ie(Ka,{...p}),ie(Wa,{...p}),ie(Ja,{...p})]})}import{useState as Za,useSyncExternalStore as Bs}from"react";import{Eye as Rs,EyeOff as As,Plus as Ms,Trash2 as zs}from"lucide-react";import{Fragment as Qa,jsx as j,jsxs as Re}from"react/jsx-runtime";var Ls=["512","1024","2048","4096"],ei={none:"None",directional:"Direction",point:"Point",spot:"Spot",hemisphere:"Hemi"};function Os({index:o,light:n,selected:i,onSelect:r,onToggleVisible:e}){return Re("div",{className:`se-lightRow ${i?"se-lightRow--active":""}`,onClick:r,children:[Re("span",{className:"se-lightRowLabel",children:[o+1,": ",ei[n.type]]}),j("button",{type:"button",className:"se-iconButton","aria-label":n.visible?"Hide light":"Show light",onClick:t=>{t.stopPropagation(),e()},children:n.visible?j(Rs,{size:14}):j(As,{size:14})})]})}function Es(){return{id:crypto.randomUUID(),type:"directional",color:"#ffffff",intensity:1,position:[5,10,5],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0}}function _n({config:o,onChange:n}){let[i,r]=Za({lights:!0,shadows:!1,groundShadows:!1,environment:!1,envShadow:!1}),e=Bs(da,ba),[t,u]=Za(o.lighting.lights[0]?.id??null),p=e??t,m=a=>{u(a),la(a)},h=a=>r(L=>({...L,[a]:!L[a]})),{tier:k}=tt(),d=Ye(k,"starter"),{lighting:g,shadows:M,groundShadows:B,environment:N}=o,O=a=>n({...o,lighting:a}),T=a=>n({...o,shadows:a}),l=a=>n({...o,groundShadows:a}),S=a=>n({...o,environment:a}),P=(a,L)=>{O({...g,lights:g.lights.map(z=>z.id===a?{...z,...L}:z)})},v=g.lights.find(a=>a.id===p)??null,D=()=>{let a=Es();O({...g,lights:[...g.lights,a]}),m(a.id)},b=()=>{if(!v)return;let a=g.lights.filter(L=>L.id!==v.id);O({...g,lights:a}),m(a[0]?.id??null)};return Re("div",{className:"se-generalContent",children:[Re(W,{title:"Lights",open:i.lights,onToggle:()=>h("lights"),children:[j("div",{className:"se-lightList",children:g.lights.map((a,L)=>j(Os,{index:L,light:a,selected:a.id===p,onSelect:()=>m(a.id),onToggleVisible:()=>P(a.id,{visible:!a.visible})},a.id))}),Re("div",{className:"se-lightActions",children:[j("button",{type:"button",className:"se-iconButton",onClick:D,title:"Add light",children:j(Ms,{size:14})}),v&&g.lights.length>1&&j("button",{type:"button",className:"se-iconButton",onClick:b,title:"Remove selected light",children:j(zs,{size:14})})]}),v?Re("div",{className:"se-lightProps",children:[Re("div",{className:"se-field",children:[j("span",{className:"se-fieldLabel",children:"Type"}),j("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:Yo.map(a=>j("button",{type:"button",className:`se-segmentedOption ${v.type===a?"se-segmentedOption--active":""}`,onClick:()=>P(v.id,{type:a}),children:ei[a]},a))})]}),j(Le,{label:"Color",value:v.color,onChange:a=>P(v.id,{color:a})}),j(f,{label:"Intensity",value:v.intensity,min:0,max:10,step:.1,onChange:a=>P(v.id,{intensity:a})}),v.type!=="hemisphere"&&v.type!=="none"&&j(nt,{label:"Position",value:v.position,min:-100,max:100,step:.05,onChange:a=>P(v.id,{position:a})}),v.type==="spot"&&Re(Qa,{children:[j(f,{label:"Angle",value:v.angle??Math.PI/6,min:0,max:Math.PI/2,step:.01,formatValue:a=>`${Math.round(a*180/Math.PI)}\xB0`,onChange:a=>P(v.id,{angle:a})}),j(f,{label:"Penumbra",value:v.penumbra??.2,min:0,max:1,step:.01,onChange:a=>P(v.id,{penumbra:a})}),j(f,{label:"Distance",value:v.distance??0,min:0,max:100,step:.5,onChange:a=>P(v.id,{distance:a})}),j(f,{label:"Decay",value:v.decay??2,min:0,max:4,step:.1,onChange:a=>P(v.id,{decay:a})})]}),j(J,{label:"Attached to camera",checked:v.attachedToCamera,onChange:a=>P(v.id,{attachedToCamera:a})}),j(J,{label:"Cast shadows",checked:v.castShadow,onChange:a=>P(v.id,{castShadow:a})}),j(f,{label:"Shadow bias",value:v.shadowBias,min:-.01,max:.01,step:1e-4,onChange:a=>P(v.id,{shadowBias:a})})]}):null]}),Re(W,{title:"Shadows",open:i.shadows,onToggle:()=>h("shadows"),disabled:!M.enabled,trailing:j(q,{checked:M.enabled,onChange:a=>T({...M,enabled:a}),label:"Toggle shadows"}),children:[j(Be,{label:"Map size",value:String(M.mapSize),options:Ls,onChange:a=>T({...M,mapSize:Number(a)})}),j(f,{label:"Bias",value:M.bias,min:-.01,max:.01,step:1e-4,onChange:a=>T({...M,bias:a})}),j(f,{label:"Normal bias",value:M.normalBias,min:0,max:.2,step:.01,onChange:a=>T({...M,normalBias:a})}),j(f,{label:"Radius (softness)",value:M.radius,min:0,max:20,step:.5,onChange:a=>T({...M,radius:a})})]}),Re(W,{title:"Ground Shadows",open:i.groundShadows,onToggle:()=>h("groundShadows"),disabled:!B.enabled,trailing:j(q,{checked:B.enabled,onChange:a=>l({...B,enabled:a}),label:"Toggle ground shadows"}),children:[Re("div",{className:"se-field",children:[j("span",{className:"se-fieldLabel",children:"Mode"}),j("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:["shadowCatcher"].map(a=>j("button",{type:"button",className:`se-segmentedOption ${B.mode===a?"se-segmentedOption--active":""}`,onClick:()=>l({...B,mode:a}),children:a==="shadowCatcher"?"Shadow Catcher":"Baked AO"},a))})]}),B.mode==="bakedAO"&&j("div",{className:"se-placeholder",children:"Requires pre-baked AO textures \u2014 not yet available."}),j(f,{label:"Intensity",value:B.intensity,min:0,max:1,step:.01,onChange:a=>l({...B,intensity:a})}),j(f,{label:"Border fade",value:B.borderFade,min:0,max:10,step:.1,onChange:a=>l({...B,borderFade:a})}),j(f,{label:"Height",value:B.height,min:-5,max:5,step:.1,onChange:a=>l({...B,height:a})}),j(f,{label:"Size",value:B.size,min:1,max:50,step:.5,onChange:a=>l({...B,size:a})})]}),j(W,{title:"Environment",open:i.environment,onToggle:()=>h("environment"),children:d?Re(Qa,{children:[j(f,{label:"Orientation",value:N.rotation,min:0,max:360,step:1,formatValue:a=>`${a}\xB0`,onChange:a=>S({...N,rotation:a})}),j(f,{label:"Brightness",value:N.intensity,min:0,max:3,step:.05,onChange:a=>S({...N,intensity:a})}),Re(W,{title:"Shadow",open:i.envShadow,onToggle:()=>h("envShadow"),trailing:j(q,{checked:N.shadowLight.enabled,onChange:a=>S({...N,shadowLight:{...N.shadowLight,enabled:a}}),label:"Toggle environment shadow light"}),disabled:!N.shadowLight.enabled,children:[j(f,{label:"Light intensity",value:N.shadowLight.intensity,min:0,max:20,step:.1,onChange:a=>S({...N,shadowLight:{...N.shadowLight,intensity:a}})}),j(f,{label:"Shadow bias",value:N.shadowLight.bias,min:-.01,max:.01,step:1e-4,onChange:a=>S({...N,shadowLight:{...N.shadowLight,bias:a}})})]})]}):j(Pe,{requiredTier:"starter",feature:"Environment lighting"})})]})}import{useMemo as js,useState as Ds}from"react";import{ChevronDown as Fs,Pause as Is,Play as Hs,Square as Gs,Trash2 as Vs}from"lucide-react";import{jsx as Y,jsxs as re}from"react/jsx-runtime";function Us(o){if(!Number.isFinite(o)||o<=0)return"Unknown duration";let n=Math.round(o*10)/10;if(n<60)return`${n.toFixed(1)}s`;let i=Math.floor(n/60),r=(n%60).toFixed(1).padStart(4,"0");return`${i}:${r}`}function ti(o){let n=Number.isFinite(o)&&o>0?o:0;if(n<60)return`${n.toFixed(1)}s`;let i=Math.floor(n/60),r=(n%60).toFixed(1).padStart(4,"0");return`${i}:${r}`}function $s(o){return Number.isFinite(o)?Math.min(3,Math.max(.1,Number(o.toFixed(2)))):1}function Kn({config:o,onChange:n,clipDetails:i,currentClip:r,isPlaying:e,time:t,play:u,pause:p,stop:m,setSpeed:h,seek:k}){let[d,g]=Ds(!1),M=js(()=>new Map(i.map(a=>[a.sourceName,a.duration])),[i]),B=o.animations.clips.filter(a=>!a.hidden),N=o.animations.clips.filter(a=>a.hidden),O=(a,L=o.animations.autoplayClip)=>{n({...o,animations:{clips:a(o.animations.clips),autoplayClip:L}})},T=(a,L)=>{O(z=>z.map(de=>de.sourceName===a?L(de):de))},l=(a,L)=>{T(a,z=>({...z,loopMode:L}))},S=(a,L)=>{let z=$s(L);T(a,de=>({...de,speed:z})),r===a&&h(z)},P=(a,L)=>{T(a,z=>({...z,displayName:L}))},v=a=>{let L=o.animations.autoplayClip===a?null:a;n({...o,animations:{...o.animations,autoplayClip:L}})},D=a=>{O(L=>L.map(z=>z.sourceName===a?{...z,hidden:!0}:z),o.animations.autoplayClip===a?null:o.animations.autoplayClip),r===a&&m()},b=a=>{O(L=>L.map(z=>z.sourceName===a?{...z,hidden:!1}:z))};return o.animations.clips.length===0?Y(lt,{title:"Animations",children:Y("div",{className:"se-helperCard",children:"Upload a model with embedded animations to manage playback, naming, autoplay, and per-clip speed here."})}):re(lt,{title:"Animations",children:[B.length===0&&Y("div",{className:"se-helperCard",children:Y("span",{children:"Preview clips directly in the viewer, choose one optional autoplay animation, and use soft delete to hide clips without modifying the GLB."})}),B.length===0?Y("div",{className:"se-placeholder",children:"All animations are currently removed. Restore a clip below to make it available again."}):Y("div",{className:"se-animationList",children:B.map(a=>{let L=r===a.sourceName,z=M.get(a.sourceName)??0;return re("article",{className:`se-animationCard ${L?"se-animationCard--active":""}`,children:[re("div",{className:"se-animationHeader",children:[re("div",{className:"se-animationHeading",children:[re("div",{className:"se-animationTitleRow",children:[Y("span",{className:"se-animationStatus",children:L?e?"Playing":"Paused":"Ready"}),o.animations.autoplayClip===a.sourceName?Y("span",{className:"se-animationBadge",children:"Autoplay"}):null]}),Y("div",{className:"se-animationSource",children:a.sourceName})]}),Y("button",{type:"button",className:"se-animationDangerButton",onClick:()=>D(a.sourceName),title:"Remove animation",children:Y(Vs,{size:16})})]}),re("div",{className:"se-field",children:[Y("span",{className:"se-fieldLabel",children:"Display name"}),Y("input",{className:"se-textInput",value:a.displayName,onChange:ye=>P(a.sourceName,ye.target.value),placeholder:"Animation name"})]}),re("div",{className:"se-animationMeta",children:[Y("span",{children:Us(z)}),Y("span",{children:a.loopMode==="once"?"Play once":"Looping"}),re("span",{children:[a.speed.toFixed(2),"x"]})]}),re("div",{className:"se-animationButtonRow",children:[(()=>{let ye=L&&e;return Y("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:()=>ye?p():u(a.sourceName),"aria-label":ye?"Pause":"Play",title:ye?"Pause":"Play",children:ye?Y(Is,{size:16}):Y(Hs,{size:16})})})(),Y("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:m,disabled:!L,"aria-label":"Stop",title:"Stop",children:Y(Gs,{size:16})})]}),re("div",{className:"se-animationSeekRow",children:[Y("input",{className:"se-slider se-animationSeek",type:"range",min:0,max:Math.max(z,.001),step:.01,value:L?Math.min(t,z):0,disabled:!L||z<=0,onChange:ye=>k(Number(ye.target.value)),"aria-label":"Seek"}),re("span",{className:"se-animationSeekTime",children:[ti(L?Math.min(t,z):0)," / ",ti(z)]})]}),re("div",{className:"se-animationGrid",children:[re("label",{className:"se-field",children:[Y("span",{className:"se-fieldLabel",children:"Loop mode"}),re("select",{className:"se-select",value:a.loopMode,onChange:ye=>l(a.sourceName,ye.target.value),children:[Y("option",{value:"repeat",children:"Loop"}),Y("option",{value:"once",children:"Play Once"})]})]}),re("label",{className:"se-field",children:[re("span",{className:"se-fieldLabel",children:["Speed",re("span",{className:"se-fieldValue",children:[a.speed.toFixed(2),"x"]})]}),re("div",{className:"se-animationSpeedRow",children:[Y("input",{className:"se-slider",type:"range",min:.1,max:3,step:.1,value:a.speed,onChange:ye=>S(a.sourceName,Number(ye.target.value))}),Y("input",{className:"se-numberInput se-animationSpeedInput",type:"number",min:.1,max:3,step:.1,value:a.speed,onChange:ye=>S(a.sourceName,Number(ye.target.value))})]})]})]}),Y("button",{type:"button",className:`se-animationAutoplayButton ${o.animations.autoplayClip===a.sourceName?"se-animationAutoplayButton--active":""}`,onClick:()=>v(a.sourceName),children:o.animations.autoplayClip===a.sourceName?"Disable autoplay":"Set as autoplay"})]},a.sourceName)})}),N.length>0?re("section",{className:"se-removedAnimations",children:[Y("button",{type:"button",className:"se-panelHeader",onClick:()=>g(a=>!a),children:re("span",{className:"se-panelHeaderMain",children:[Y(Fs,{size:16,className:`se-panelChevron ${d?"se-panelChevron--open":""}`}),re("span",{className:"se-panelTitle",children:["Removed Animations (",N.length,")"]})]})}),d?Y("div",{className:"se-removedAnimationList",children:N.map(a=>re("div",{className:"se-removedAnimationRow",children:[re("div",{children:[Y("div",{className:"se-removedAnimationName",children:a.displayName||a.sourceName}),Y("div",{className:"se-animationSource",children:a.sourceName})]}),Y("button",{type:"button",className:"se-animationButton",onClick:()=>b(a.sourceName),children:"Restore"})]},a.sourceName))}):null]}):null]})}import{useState as ni}from"react";import{Pencil as _s,Trash2 as Ks}from"lucide-react";import{jsx as xe,jsxs as Oe}from"react/jsx-runtime";function Wn({config:o,onChange:n}){let[i,r]=ni(null),[e,t]=ni({title:"",description:""}),u=o.annotations,p=d=>{r(d),t({title:d.title,description:d.description||""})},m=()=>{if(!i||!e.title.trim())return;let d=u.map(g=>g.id===i.id?{...g,title:e.title.trim(),description:e.description||""}:g);n({...o,annotations:d}),r(null),t({title:"",description:""})},h=d=>{if(window.confirm("Delete this annotation?")){let M=u.filter(B=>B.id!==d).map((B,N)=>({...B,id:N+1}));n({...o,annotations:M}),r(null),t({title:"",description:""})}},k=()=>{r(null),t({title:"",description:""})};return Oe(lt,{title:"Annotations",children:[o.annotations.length===0?xe("div",{className:"bb-emptyAnnotations",children:"No annotations yet. Double-click on the model to add one."}):xe("div",{className:"bb-annotationsList",children:o.annotations.map(d=>Oe("div",{className:"bb-annotationCard",children:[Oe("div",{className:"bb-annotationHeader",children:[Oe("div",{className:"bb-annotationBadge",children:["#",d.id]}),Oe("div",{className:"bb-annotationActions",children:[xe("button",{className:"bb-annotationAction bb-annotationAction--edit",onClick:()=>p(d),title:"Edit annotation",children:xe(_s,{size:16})}),xe("button",{className:"bb-annotationAction bb-annotationAction--delete",onClick:()=>h(d.id),title:"Delete annotation",children:xe(Ks,{size:16})})]})]}),xe("div",{className:"bb-annotationTitle",children:d.title}),d.description&&xe("div",{className:"bb-annotationDescription",children:d.description}),Oe("div",{className:"bb-annotationPosition",children:["Position: [",d.worldPosition[0].toFixed(2),","," ",d.worldPosition[1].toFixed(2),","," ",d.worldPosition[2].toFixed(2),"]"]})]},d.id))}),i&&xe("div",{className:"bb-editAnnotationOverlay",onClick:k,children:Oe("div",{className:"bb-editAnnotationPopup",onClick:d=>d.stopPropagation(),children:[Oe("div",{className:"bb-editAnnotationHeader",children:[xe("h3",{className:"bb-editAnnotationTitle",children:"Edit Annotation"}),xe("button",{className:"bb-editAnnotationClose",onClick:k,children:"\xD7"})]}),Oe("div",{className:"bb-editAnnotationBody",children:[Oe("div",{className:"bb-field",children:[xe("label",{className:"bb-label",children:"Title"}),xe("input",{className:"bb-input",value:e.title,onChange:d=>t({...e,title:d.target.value}),placeholder:"Enter annotation title"})]}),Oe("div",{className:"bb-field",children:[xe("label",{className:"bb-label",children:"Description"}),xe("textarea",{className:"bb-textarea",value:e.description,onChange:d=>t({...e,description:d.target.value}),placeholder:"Enter annotation description",rows:3})]}),Oe("div",{className:"bb-editAnnotationActions",children:[xe("button",{className:"bb-button",onClick:k,children:"Cancel"}),xe("button",{className:"bb-button bb-button--primary",onClick:m,disabled:!e.title.trim(),children:"Save"}),xe("button",{className:"bb-button bb-button--danger",onClick:()=>h(i.id),children:"Delete"})]})]})]})})]})}import{useState as Ws,useCallback as bt}from"react";import{ArrowDown as Ys,ArrowUp as qs,MapPin as Js,Plus as Xs,Trash2 as Zs,Settings as Qs}from"lucide-react";import{Fragment as tl,jsx as X,jsxs as ue}from"react/jsx-runtime";var el={enabled:!0,waypoints:[],loop:!0,autoPlay:!1},ct=3.5;function Yn({config:o,onChange:n,cameraState:i,onPreviewWaypoint:r}){let e=o.cinematic??el,{waypoints:t}=e,u=bt((T,l)=>{if(T.length<2)return 0;let S=0;for(let P=0;P<T.length-1;P++){let v=T[P].segmentDuration??ct;S+=v}return l&&T.length>1&&(S+=T[T.length-1].segmentDuration??ct),Math.max(S,0)},[]),p=bt(T=>{n({...o,cinematic:{...e,...T}})},[o,e,n]),m=bt(()=>{if(!i)return;let T={position:[...i.position],target:[...i.target],...i.azimuthAngle!=null?{azimuthAngle:i.azimuthAngle}:{},...i.polarAngle!=null?{polarAngle:i.polarAngle}:{},segmentDuration:ct},l=[...t,T],S=u(l,e.loop);p({waypoints:l,duration:S})},[i,t,e.loop,u,p]),h=bt(T=>{let l=t.filter((P,v)=>v!==T),S=u(l,e.loop);p({waypoints:l,duration:S})},[t,e.loop,u,p]),k=bt((T,l)=>{let S=T+l;if(S<0||S>=t.length)return;let P=[...t];[P[T],P[S]]=[P[S],P[T]];let v=u(P,e.loop);p({waypoints:P,duration:v})},[t,e.loop,u,p]),d=bt((T,l)=>{let S=t.map((v,D)=>D===T?{...v,...l}:v),P=u(S,e.loop);p({waypoints:S,duration:P})},[t,e.loop,u,p]),[g,M]=Ws(!1),B=t.some(T=>T.segmentDuration!==void 0),N=bt(T=>T>=t.length-1?ct:t[T]?.segmentDuration??ct,[t]),O=t.length>=2;return ue(lt,{title:"Cinematic Camera",children:[X("p",{className:"se-cinematicHint",children:"Frame the model in the viewer, then capture it as a waypoint. The camera glides through the waypoints in order \u2014 enable and press play in the viewer to preview."}),ue("button",{type:"button",className:"bb-button bb-button--primary se-cinematicAdd",onClick:m,disabled:!i,title:"Capture the current camera view as a waypoint",children:[X(Xs,{size:15}),"Add waypoint from current view"]}),ue("div",{className:"se-customizeToggle",children:[ue("label",{className:"se-toggleLabel",children:[X("input",{type:"checkbox",checked:g,onChange:T=>M(T.target.checked)}),X(Qs,{size:14}),X("span",{children:"Customize durations between waypoints"})]}),g&&ue("span",{className:"se-toggleHint",children:["Set duration for each segment between waypoints: 1\u21922, 2\u21923, etc. Default: ",ct,"s"]})]}),t.length===0?X("div",{className:"bb-emptyAnnotations",children:"No waypoints yet. Position the camera and add your first one."}):ue(tl,{children:[X("div",{className:"se-waypointList",children:t.map((T,l)=>{let S=N(l),P=l===t.length-1,v=T.segmentDuration!==void 0&&T.segmentDuration!==ct;return ue("div",{children:[ue("div",{className:"se-waypointCard",children:[X("div",{className:"se-waypointBadge",children:l+1}),ue("div",{className:"se-waypointBody",children:[ue("div",{className:"se-waypointCoords",children:["pos [",T.position.map(D=>D.toFixed(1)).join(", "),"]"]}),ue("div",{className:"se-waypointCoords",children:["look [",T.target.map(D=>D.toFixed(1)).join(", "),"]"]}),g&&!P&&ue("div",{className:`se-customBadge ${v?"se-customBadge--custom":"se-customBadge--default"}`,children:[S.toFixed(1),"s",!v&&" (default)"]})]}),ue("div",{className:"se-waypointActions",children:[X("button",{className:"se-waypointAction",onClick:()=>r?.(T),title:"Fly camera to this waypoint",disabled:!r,children:X(Js,{size:15})}),X("button",{className:"se-waypointAction",onClick:()=>k(l,-1),title:"Move up",disabled:l===0,children:X(qs,{size:15})}),X("button",{className:"se-waypointAction",onClick:()=>k(l,1),title:"Move down",disabled:P,children:X(Ys,{size:15})}),X("button",{className:"se-waypointAction se-waypointAction--delete",onClick:()=>h(l),title:"Delete waypoint",children:X(Zs,{size:15})})]})]}),g&&!P&&ue("div",{className:"se-segmentBetween",children:[ue("div",{className:"se-segmentLabel",children:[l+1," \u2192 ",l+2,!T.segmentDuration&&" (default)"]}),ue("div",{className:"se-segmentControls",children:[X("span",{className:"se-durationLabel",children:"Duration:"}),X("input",{type:"range",className:"se-segmentSlider",min:1,max:20,step:.5,value:S,onChange:D=>{let b=parseFloat(D.target.value);d(l,{segmentDuration:b})}}),ue("span",{className:"se-segmentValue",children:[S.toFixed(1),"s"]}),ue("div",{className:"se-presetButtons",children:[[2,4,6,8].map(D=>ue("button",{className:"se-presetButton",onClick:()=>d(l,{segmentDuration:D}),children:[D,"s"]},`preset-${l}-${D}`)),X("button",{className:"se-presetButton se-presetButton--default",onClick:()=>{let D=t.map((a,L)=>{if(L===l){let{segmentDuration:z,...de}=a;return de}return a}),b=u(D,e.loop);p({waypoints:D,duration:b})},children:"Reset"})]})]})]})]},`waypoint-wrapper-${l}`)})}),ue("div",{className:"se-totalDuration",children:[X("span",{className:"se-totalLabel",children:"Total duration:"}),X("span",{className:"se-totalValue",children:O?(e.duration??u(t,e.loop)).toFixed(1)+"s":"-"}),!O&&X("span",{className:"se-totalHint",children:"(need at least 2 waypoints)"})]})]}),X(J,{label:"Enable cinematic camera",checked:e.enabled,onChange:T=>p({enabled:T})}),X(J,{label:"Loop",checked:e.loop,onChange:T=>{let l=T,S=u(t,l);p({loop:l,duration:S})}}),X(J,{label:"Auto-play on load",checked:e.autoPlay,onChange:T=>p({autoPlay:T})}),!g&&O&&X(f,{label:"Duration",value:e.duration??u(t,e.loop),min:4,max:120,step:1,formatValue:T=>`${T}s`,onChange:T=>p({duration:T})})]})}import{Box as al,Clapperboard as il,MessageSquareText as rl,Sparkles as sl,Spotlight as ll,Video as dl}from"lucide-react";import{jsx as ve,jsxs as cl}from"react/jsx-runtime";var bl=[{label:"General",icon:ve(al,{})},{label:"Lighting",icon:ve(ll,{})},{label:"Animations",icon:ve(il,{})},{label:"Post Processing",icon:ve(sl,{})},{label:"Annotations",icon:ve(rl,{})},{label:"Cinematic",icon:ve(dl,{})}],oi={currentClip:null,isPlaying:!1,time:0,duration:0,play:()=>{},pause:()=>{},stop:()=>{},setSpeed:()=>{},seek:()=>{}};function qn({config:o,onChange:n,activeSubTab:i,onActiveSubTabChange:r,cameraState:e=null,onPreviewWaypoint:t,animationClipDetails:u=[],animationPlayback:p=oi}){let[m,h]=nl("General"),k=i??m,d=p??oi,{tier:g}=tt(),M=Ye(g,"starter"),B=Ye(g,"growth");ol(()=>{i!==void 0&&h(i)},[i]);let N=O=>{i===void 0&&h(O),r?.(O)};return cl("div",{className:"se-tabContent",children:[ve("div",{className:"se-subTabRow",children:bl.map(O=>ve("button",{type:"button",title:O.label,className:`se-subTab ${k===O.label?"se-subTab--active":""}`,onClick:()=>N(O.label),children:O.icon},O.label))}),k==="General"&&ve(Un,{config:o,onChange:n}),k==="Lighting"&&ve(_n,{config:o,onChange:n}),k==="Animations"&&(M?ve(Kn,{config:o,onChange:n,clipDetails:u,currentClip:d.currentClip,isPlaying:d.isPlaying,time:d.time,duration:d.duration,play:d.play,pause:d.pause,stop:d.stop,setSpeed:d.setSpeed,seek:d.seek}):ve(Pe,{requiredTier:"starter",feature:"Animation configuration"})),k==="Post Processing"&&(B?ve($n,{config:o,onChange:n}):ve(Pe,{requiredTier:"growth",feature:"Post-processing effects"})),k==="Annotations"&&(M?ve(Wn,{config:o,onChange:n}):ve(Pe,{requiredTier:"starter",feature:"Annotations"})),k==="Cinematic"&&(M?ve(Yn,{config:o,onChange:n,cameraState:e,onPreviewWaypoint:t}):ve(Pe,{requiredTier:"starter",feature:"Cinematic camera"}))]})}import{ChevronDown as ai,Info as ii}from"lucide-react";import{jsx as ke,jsxs as pt}from"react/jsx-runtime";function ri({title:o,trailing:n,children:i,disabled:r,open:e,onToggle:t,tooltip:u}){let p=u?`${u}`:o;return pt("div",{className:"bb-materialPanel",children:[pt("button",{type:"button",className:"bb-materialPanelHeader",onClick:t,"aria-expanded":e,title:p,children:[pt("div",{className:"bb-materialPanelTitleWrap",children:[ke(ai,{size:14,className:`bb-materialPanelChevron ${e?"bb-materialPanelChevron--open":""}`}),ke("span",{className:"bb-materialPanelTitle",children:o}),u?ke("span",{className:"bb-materialPanelHelp",title:p,"aria-label":p,role:"img",onClick:m=>m.stopPropagation(),children:ke(ii,{size:12})}):null]}),n?ke("div",{onClick:m=>m.stopPropagation(),children:n}):null]}),e?ke("div",{className:"bb-materialPanelBody",style:r?{opacity:.45,pointerEvents:"none"}:void 0,children:i}):null]})}function Te({title:o,open:n,onToggle:i,trailing:r,children:e,tooltip:t}){let u=t?`${o}: ${t}`:o;return pt("div",{className:"bb-section",children:[pt("button",{type:"button",className:"bb-sectionHeaderButton",onClick:i,"aria-expanded":n,title:u,children:[pt("span",{className:"bb-sectionHeaderMain",children:[ke(ai,{size:15,className:`bb-sectionChevron ${n?"bb-sectionChevron--open":""}`}),ke("h2",{className:"bb-sectionTitle",children:o}),t?ke("span",{className:"bb-sectionHelp",title:u,"aria-label":u,role:"img",onClick:p=>p.stopPropagation(),children:ke(ii,{size:13})}):null]}),r?ke("span",{onClick:p=>p.stopPropagation(),children:r}):null]}),n?ke("div",{className:"bb-sectionBody",children:e}):null]})}function si({checked:o,onChange:n,label:i}){return pt("label",{className:"se-switch","aria-label":i,children:[ke("input",{type:"checkbox",checked:o,onChange:r=>n(r.target.checked)}),ke("span",{className:"se-switchTrack",children:ke("span",{className:"se-switchThumb"})})]})}import{useState as bi}from"react";import{Trash2 as vl}from"lucide-react";import{jsx as Jn}from"react/jsx-runtime";function Ae({panelKey:o,title:n,tooltip:i,toggleLabel:r,controls:e,children:t,requiredTier:u}){let{openMaterialPanels:p,materialPanelEnabled:m,onToggleMaterialPanel:h,onSetMaterialPanelState:k}=e,d=u?.locked??!1;return Jn(ri,{title:n,tooltip:i,disabled:d||!m[o],open:p[o],onToggle:()=>h(o),trailing:Jn(si,{checked:!d&&m[o],onChange:d?()=>{}:g=>k(o,g),label:r??`Toggle ${n}`}),children:d&&u?Jn(Pe,{requiredTier:u.tier,feature:n}):t})}import{useRef as li,useState as pl}from"react";import{HexColorInput as ul,HexColorPicker as ml}from"react-colorful";import{FileUp as gl,Minus as fl,Plus as hl}from"lucide-react";import{jsx as Z,jsxs as Ue}from"react/jsx-runtime";function me({label:o,value:n,placeholder:i,onChange:r}){let e=li(null);return Ue("div",{className:"bb-field bb-field--full",children:[Z("label",{className:"bb-label",children:o}),Ue("div",{className:"bb-fileField",children:[Z("input",{className:"bb-input bb-fileField-input",placeholder:i,value:n,onChange:t=>{let u=t.target.value;!u&&n&&jn(n),r(u)}}),Z("button",{type:"button",className:"bb-fileFieldButton",onClick:()=>e.current?.click(),"aria-label":`Select file for ${o}`,title:`Select file for ${o}`,children:Z(gl,{size:20})}),Z("input",{ref:e,type:"file",accept:"image/png,image/jpeg,image/webp,image/avif",className:"bb-hiddenInput",onChange:t=>{let u=t.target.files?.[0];if(!u)return;let p=Qo(u);n&&n!==p&&jn(n),ln(p,URL.createObjectURL(u)),r(p),t.target.value=""}})]})]})}function ut({label:o,value:n,fallback:i="#ffffff",onChange:r}){let[e,t]=pl(!1),u=n||i,p=li(null);return Ue("div",{className:"bb-field",children:[Z("span",{className:"bb-label",children:o}),Z("div",{className:"se-fieldInline",children:Z("span",{ref:p,style:{display:"inline-flex"},children:Z(ul,{prefixed:!0,className:"se-swatch",onClick:()=>t(m=>!m),style:{background:u,color:St(u)},color:u,onChange:r})})}),e?Z(Gn,{anchorRef:p,onClose:()=>t(!1),children:Z(ml,{color:u,onChange:r})}):null]})}function Ft({label:o,checked:n,onChange:i}){return Ue("label",{className:"bb-checkbox",children:[Z("input",{type:"checkbox",checked:n,onChange:r=>i(r.target.checked)}),o]})}function di({label:o,value:n,min:i,max:r,step:e,placeholder:t,disabled:u,onChange:p}){return Ue("div",{className:"bb-field",children:[Z("label",{className:"bb-label",children:o}),Z("input",{className:"bb-input",type:"number",min:i,max:r,step:e,placeholder:t,disabled:u,value:n??"",onChange:m=>p(m.target.value===""?void 0:Number(m.target.value))})]})}function xl(o,n){let i=n<1?Math.ceil(-Math.log10(n)):0,r=10**Math.max(i,0);return Math.round(o*r)/r}function Xn({label:o,value:n,min:i,max:r,step:e=.01,disabled:t,onChange:u}){let p=n??0,m=k=>{let d=k;return i!==void 0&&(d=Math.max(i,d)),r!==void 0&&(d=Math.min(r,d)),d},h=k=>{u(m(xl(p+k*e,e)))};return Ue("div",{className:"bb-field",children:[Z("label",{className:"bb-label",children:o}),Ue("div",{className:"bb-numberStepper",children:[Z("button",{type:"button",className:"bb-numberStepper-btn",disabled:t,onClick:()=>h(-1),"aria-label":`Decrease ${o}`,title:`Decrease ${o}`,children:Z(fl,{size:12})}),Z("input",{className:"bb-input bb-numberStepper-input",type:"number",min:i,max:r,step:e,disabled:t,value:p,onChange:k=>{k.target.value!==""&&u(m(Number(k.target.value)))}}),Z("button",{type:"button",className:"bb-numberStepper-btn",disabled:t,onClick:()=>h(1),"aria-label":`Increase ${o}`,title:`Increase ${o}`,children:Z(hl,{size:12})})]})]})}function Pt({label:o,value:n,options:i,onChange:r}){return Ue("div",{className:"bb-field",children:[Z("label",{className:"bb-label",children:o}),Z("select",{className:"bb-select",value:n,onChange:e=>r(e.target.value),children:i.map(e=>Z("option",{value:e,children:e},e))})]})}function te({label:o,value:n,min:i,max:r,step:e,onChange:t}){return Ue("div",{className:"bb-field bb-field--full",children:[Z("label",{className:"bb-label",children:o}),Ue("div",{className:"bb-sliderField",children:[Z("input",{className:`bb-slider ${n===void 0?"bb-slider--unset":""}`,type:"range",min:i,max:r,step:e,value:n??i,onChange:p=>t(Number(p.target.value))}),Z("input",{className:"bb-input bb-input--compact",type:"number",min:i,max:r,step:e,value:n??"",onChange:p=>t(p.target.value===""?void 0:Number(p.target.value))})]})]})}import{Fragment as Zn,jsx as w,jsxs as se}from"react/jsx-runtime";function ci({selectedItem:o,selectedMaterial:n,pbrWorkflow:i,onPbrWorkflowChange:r,openMaterialPanels:e,materialPanelEnabled:t,onToggleMaterialPanel:u,onSetMaterialPanelState:p,updateSelectedMaterial:m,setSelectedTexturePath:h,isTexturePositioningEnabled:k,onConfirmTexturePosition:d}){let g={openMaterialPanels:e,materialPanelEnabled:t,onToggleMaterialPanel:u,onSetMaterialPanelState:p},{tier:M}=tt(),B=Ye(M,"starter"),N={tier:"starter",locked:!B},[O,T]=bi("roughness"),[l,S]=bi("factor"),P=(b,a)=>{m(o,L=>{if(!L?.texture?.path)return L??{};let z=L.texture.offset??[0,0],de=[z[0],z[1]];return de[b]=a,{...L,texture:{...L.texture,offset:de}}})},v=b=>{m(o,a=>{if(!a?.texture?.path)return a??{};let L=(b%360+360)%360;return{...a,texture:{...a.texture,rotation:L*Math.PI/180}}})},D=()=>{h(o,"texture","")};return se(Zn,{children:[w(Ae,{panelKey:"pbr",title:"PBR Maps",tooltip:"Controls the base color and workflow used for physically based shading.",controls:g,children:B?se("div",{className:"bb-grid",children:[w(Pt,{label:"Workflow",value:i,options:["metalness","specular"],onChange:r}),w("div",{className:"bb-field bb-field--full",children:w("p",{className:"bb-note",style:{margin:0},children:i==="metalness"?"Metalness workflow maps directly to the underlying physical material.":"Specular workflow exposes the same physical material with non-metal specular controls; it does not switch to a separate spec/gloss shader."})}),w(me,{label:i==="specular"?"Albedo texture path":"Base color texture path",placeholder:"materials/oak-wood.jpg",value:n?.texture?.path??"",onChange:b=>h(o,"texture",b)}),n?.texture?.path?se("div",{className:"bb-field bb-field--full",children:[se("div",{className:"bb-fieldLabel",style:{display:"flex",alignItems:"center",justifyContent:"space-between"},children:[w("span",{className:"bb-label",children:"Texture position"}),se("button",{type:"button",className:"bb-button bb-button--ghost",onClick:D,title:"Remove the base color texture and its position offset",children:[w(vl,{size:14,style:{marginRight:4,verticalAlign:"-2px"}}),"Remove texture"]})]}),se("div",{className:"bb-grid",style:{marginTop:6},children:[w(Xn,{label:"Offset X",value:n?.texture?.offset?.[0]??0,step:.01,onChange:b=>P(0,b)}),w(Xn,{label:"Offset Y",value:n?.texture?.offset?.[1]??0,step:.01,onChange:b=>P(1,b)})]}),w(te,{label:"Rotation",value:((n?.texture?.rotation??0)*180/Math.PI%360+360)%360,min:0,max:360,step:1,onChange:b=>v(b??0)}),k?w("button",{type:"button",className:"bb-button bb-button--primary",style:{marginTop:8},onClick:d,title:"Confirm this texture position and exit positioning mode",children:"Done positioning"}):w("p",{className:"bb-note",style:{margin:"6px 0 0"},children:"Double-click the object in the preview to drag its texture directly (scroll to zoom), or edit its offset numerically once positioning."})]}):null,w(ut,{label:i==="specular"?"Albedo color":"Base color",value:n?.baseColor??"#ffffff",onChange:b=>m(o,a=>({...a,baseColor:b}))}),i==="metalness"?se(Zn,{children:[w(te,{label:"Metalness",value:n?.metalness,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,metalness:b}))}),w(me,{label:"Metalness map path",placeholder:"materials/body-metalness.jpg",value:n?.metalnessMap?.path??"",onChange:b=>h(o,"metalnessMap",b)})]}):se(Zn,{children:[w(te,{label:"Specular intensity",value:n?.specularIntensity,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,specularIntensity:b}))}),w(ut,{label:"Specular color",value:n?.specularColor??"#ffffff",onChange:b=>m(o,a=>({...a,specularColor:b}))}),w(me,{label:"Specular intensity map path",placeholder:"materials/body-specular-intensity.jpg",value:n?.specularIntensityMap?.path??"",onChange:b=>h(o,"specularIntensityMap",b)}),w(me,{label:"Specular color map path",placeholder:"materials/body-specular-color.jpg",value:n?.specularColorMap?.path??"",onChange:b=>h(o,"specularColorMap",b)})]}),w(te,{label:"Specular F0 / reflectivity",value:n?.reflectivity,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,reflectivity:b}))})]}):se("div",{className:"bb-grid",children:[w(ut,{label:"Base color",value:n?.baseColor??"#ffffff",onChange:b=>m(o,a=>({...a,baseColor:b}))}),w(te,{label:"Metalness",value:n?.metalness,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,metalness:b}))}),w("div",{className:"bb-field bb-field--full",children:w(Pe,{requiredTier:"starter",feature:"Texture maps, the specular workflow, and reflectivity"})})]})}),w(Ae,{panelKey:"roughness",requiredTier:N,title:"Roughness / Glossiness",tooltip:"Adjusts how matte or shiny the surface appears.",toggleLabel:"Toggle Roughness and Glossiness",controls:g,children:se("div",{className:"bb-grid",children:[w(Pt,{label:"Mode",value:O,options:["roughness","glossiness"],onChange:T}),w("div",{className:"bb-field bb-field--full",children:w("p",{className:"bb-note",style:{margin:0},children:O==="roughness"?"Roughness: 0 is glossy, 1 is matte.":"Glossiness is the inverse of roughness (glossiness = 1 \u2212 roughness)"})}),O==="roughness"?w(te,{label:"Roughness",value:n?.roughness,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,roughness:b}))}):w(te,{label:"Glossiness",value:n?.roughness===void 0?void 0:1-n.roughness,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,roughness:b===void 0?void 0:1-b}))}),w(me,{label:O==="glossiness"?"Glossiness map path (applied as roughness)":"Roughness map path",placeholder:"materials/body-roughness.jpg",value:n?.roughnessMap?.path??"",onChange:b=>h(o,"roughnessMap",b)})]})}),w(Ae,{panelKey:"emission",requiredTier:N,title:"Emission",tooltip:"Makes the material self-illuminated with emissive color and intensity.",controls:g,children:se("div",{className:"bb-grid",children:[w(ut,{label:"Emissive color",value:n?.emissive??"#000000",fallback:"#000000",onChange:b=>m(o,a=>({...a,emissive:b}))}),w(te,{label:"Emissive intensity",value:n?.emissiveIntensity,min:0,max:10,step:.1,onChange:b=>m(o,a=>({...a,emissiveIntensity:b}))}),w(me,{label:"Emissive map path",placeholder:"materials/body-emissive.jpg",value:n?.emissiveMap?.path??"",onChange:b=>h(o,"emissiveMap",b)})]})}),w(Ae,{panelKey:"opacity",requiredTier:N,title:"Opacity",tooltip:"Controls transparency, alpha testing, and blending behavior.",controls:g,children:se("div",{className:"bb-grid",children:[w(te,{label:"Opacity",value:n?.opacity,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,opacity:b}))}),w(te,{label:"Alpha test",value:n?.alphaTest,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,alphaTest:b}))}),w(me,{label:"Alpha map path",placeholder:"materials/body-alpha.png",value:n?.alphaMap?.path??"",onChange:b=>h(o,"alphaMap",b)}),w(Pt,{label:"Blending mode",value:n?.blendingMode??"normal",options:fa,onChange:b=>m(o,a=>({...a,blendingMode:b}))}),se("div",{className:"bb-field",children:[w("label",{className:"bb-label",children:"Alpha hash"}),w("div",{className:"bb-checkboxRow",children:w(Ft,{label:"Use alpha hash",checked:n?.alphaHash??!1,onChange:b=>m(o,a=>({...a,alphaHash:b}))})})]}),se("div",{className:"bb-field",children:[w("label",{className:"bb-label",children:"Dithering"}),w("div",{className:"bb-checkboxRow",children:w(Ft,{label:"Use dithering",checked:n?.dithering??!1,onChange:b=>m(o,a=>({...a,dithering:b}))})})]})]})}),se(Ae,{panelKey:"normalBump",requiredTier:N,title:"Normal & Bump",tooltip:"Adds surface detail without changing the actual mesh shape.",toggleLabel:"Toggle Normal and Bump",controls:g,children:[se("div",{className:"bb-grid",children:[w(me,{label:"Normal map path",placeholder:"materials/body-normal.jpg",value:n?.normalMap?.path??"",onChange:b=>h(o,"normalMap",b)}),w(te,{label:"Normal scale",value:n?.normalScale,min:0,max:5,step:.01,onChange:b=>m(o,a=>({...a,normalScale:b}))}),w(me,{label:"Bump map path",placeholder:"materials/body-bump.jpg",value:n?.bumpMap?.path??"",onChange:b=>h(o,"bumpMap",b)}),w(te,{label:"Bump scale",value:n?.bumpScale,min:0,max:5,step:.01,onChange:b=>m(o,a=>({...a,bumpScale:b}))})]}),w("div",{className:"bb-checkboxRow",style:{marginTop:12},children:w(Ft,{label:"Flip normal Y",checked:n?.flipNormalY??!1,onChange:b=>m(o,a=>({...a,flipNormalY:b}))})})]}),w(Ae,{panelKey:"displacement",requiredTier:N,title:"Displacement",tooltip:"Offsets geometry using a texture to create real surface height.",controls:g,children:se("div",{className:"bb-grid",children:[w(me,{label:"Displacement map path",placeholder:"materials/body-displacement.jpg",value:n?.displacementMap?.path??"",onChange:b=>h(o,"displacementMap",b)}),w(te,{label:"Displacement scale",value:n?.displacementScale,min:-5,max:5,step:.01,onChange:b=>m(o,a=>({...a,displacementScale:b}))}),w(te,{label:"Displacement bias",value:n?.displacementBias,min:-5,max:5,step:.01,onChange:b=>m(o,a=>({...a,displacementBias:b}))})]})}),w(Ae,{panelKey:"ao",requiredTier:N,title:"Ambient Occlusion",tooltip:"Darkens creases and contact areas to add depth.",controls:g,children:se("div",{className:"bb-grid",children:[w(me,{label:"AO map path",placeholder:"materials/body-ao.jpg",value:n?.aoMap?.path??"",onChange:b=>h(o,"aoMap",b)}),w(te,{label:"AO intensity",value:n?.aoMapIntensity,min:0,max:5,step:.01,onChange:b=>m(o,a=>({...a,aoMapIntensity:b}))})]})}),se(Ae,{panelKey:"clearcoat",requiredTier:N,title:"Clearcoat",tooltip:"Adds a glossy protective layer on top of the base material.",controls:g,children:[se("div",{className:"bb-grid",children:[w(me,{label:"Clearcoat map path",placeholder:"materials/body-clearcoat.jpg",value:n?.clearcoatMap?.path??"",onChange:b=>h(o,"clearcoatMap",b)}),w(te,{label:"Clearcoat",value:n?.clearcoat,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,clearcoat:b}))}),w(me,{label:"Clearcoat roughness map path",placeholder:"materials/body-clearcoat-roughness.jpg",value:n?.clearcoatRoughnessMap?.path??"",onChange:b=>h(o,"clearcoatRoughnessMap",b)}),w(te,{label:"Clearcoat roughness",value:n?.clearcoatRoughness,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,clearcoatRoughness:b}))}),w(me,{label:"Clearcoat normal map path",placeholder:"materials/body-clearcoat-normal.jpg",value:n?.clearcoatNormalMap?.path??"",onChange:b=>h(o,"clearcoatNormalMap",b)}),w(te,{label:"Clearcoat normal scale",value:n?.clearcoatNormalScale,min:0,max:5,step:.01,onChange:b=>m(o,a=>({...a,clearcoatNormalScale:b}))})]}),w("div",{className:"bb-checkboxRow",style:{marginTop:12},children:w(Ft,{label:"Flip clearcoat normal Y",checked:n?.flipClearcoatNormalY??!1,onChange:b=>m(o,a=>({...a,flipClearcoatNormalY:b}))})})]}),w(Ae,{panelKey:"sheen",requiredTier:N,title:"Sheen",tooltip:"Adds a soft fabric-like sheen on grazing angles.",controls:g,children:se("div",{className:"bb-grid",children:[w(te,{label:"Sheen",value:n?.sheen,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,sheen:b}))}),w(ut,{label:"Sheen color",value:n?.sheenColor??"#ffffff",onChange:b=>m(o,a=>({...a,sheenColor:b}))}),w(me,{label:"Sheen color map path",placeholder:"materials/body-sheen-color.jpg",value:n?.sheenColorMap?.path??"",onChange:b=>h(o,"sheenColorMap",b)}),w(te,{label:"Sheen roughness",value:n?.sheenRoughness,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,sheenRoughness:b}))}),w(me,{label:"Sheen roughness map path",placeholder:"materials/body-sheen-roughness.jpg",value:n?.sheenRoughnessMap?.path??"",onChange:b=>h(o,"sheenRoughnessMap",b)})]})}),w(Ae,{panelKey:"anisotropy",requiredTier:N,title:"Anisotropy",tooltip:"Stretches reflections in one direction for brushed or fiber-like surfaces.",controls:g,children:se("div",{className:"bb-grid",children:[w(te,{label:"Intensity",value:n?.anisotropy,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,anisotropy:b}))}),w(Pt,{label:"Tilt direction",value:l,options:["factor","texture"],onChange:S}),l==="factor"?w(te,{label:"Rotation (rad)",value:n?.anisotropyRotation,min:0,max:6.28,step:.01,onChange:b=>m(o,a=>({...a,anisotropyRotation:b}))}):w(me,{label:"Anisotropy map path",placeholder:"materials/body-anisotropy.jpg",value:n?.anisotropyMap?.path??"",onChange:b=>h(o,"anisotropyMap",b)})]})}),w(Ae,{panelKey:"transmission",requiredTier:N,title:"Transmission & Volume",tooltip:"Controls glass-like transmission and how light travels through volume.",toggleLabel:"Toggle Transmission and Volume",controls:g,children:se("div",{className:"bb-grid",children:[w(te,{label:"Transmission",value:n?.transmission,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,transmission:b}))}),w(me,{label:"Transmission map path",placeholder:"materials/body-transmission.jpg",value:n?.transmissionMap?.path??"",onChange:b=>h(o,"transmissionMap",b)}),w(te,{label:"Thickness",value:n?.thickness,min:0,max:5,step:.01,onChange:b=>m(o,a=>({...a,thickness:b}))}),w(me,{label:"Thickness map path",placeholder:"materials/body-thickness.jpg",value:n?.thicknessMap?.path??"",onChange:b=>h(o,"thicknessMap",b)}),w(ut,{label:"Volume tint",value:n?.attenuationColor??"#ffffff",onChange:b=>m(o,a=>({...a,attenuationColor:b}))}),w(di,{label:"Attenuation distance",value:n?.attenuationDistance,min:0,step:.01,placeholder:"Infinity when unset",onChange:b=>m(o,a=>({...a,attenuationDistance:b}))})]})}),w(Ae,{panelKey:"faces",requiredTier:N,title:"Faces Rendering",tooltip:"Chooses which side of the mesh renders and how backfaces are handled.",controls:g,children:w("div",{className:"bb-grid",children:w(Pt,{label:"Side",value:n?.side??"front",options:ga,onChange:b=>m(o,a=>({...a,side:b}))})})})]})}var pi=[{id:"wood",label:"Wood",swatch:"#8b5a2b",material:{baseColor:"#8b5a2b",metalness:0,roughness:.75,reflectivity:.04}},{id:"brushed-metal",label:"Brushed Metal",swatch:"linear-gradient(135deg, #cfcfcf, #8a8a8a)",material:{baseColor:"#c8c8c8",metalness:1,roughness:.35}},{id:"chrome",label:"Polished Chrome",swatch:"linear-gradient(135deg, #ffffff, #9aa0a6)",material:{baseColor:"#e8e8e8",metalness:1,roughness:.05}},{id:"gold",label:"Gold",swatch:"linear-gradient(135deg, #ffe9a8, #c89b2c)",material:{baseColor:"#e6b325",metalness:1,roughness:.2}},{id:"copper",label:"Copper",swatch:"linear-gradient(135deg, #e3a576, #8a4a26)",material:{baseColor:"#b87333",metalness:1,roughness:.3}},{id:"glass",label:"Glass",swatch:"linear-gradient(135deg, rgba(255,255,255,0.9), rgba(180,210,230,0.4))",material:{baseColor:"#ffffff",metalness:0,roughness:.02,reflectivity:.5,opacity:1,transmission:1,thickness:.5,attenuationColor:"#ffffff",attenuationDistance:1}},{id:"frosted-glass",label:"Frosted Glass",swatch:"linear-gradient(135deg, rgba(255,255,255,0.85), rgba(210,225,235,0.6))",material:{baseColor:"#ffffff",metalness:0,roughness:.4,reflectivity:.3,opacity:1,transmission:.9,thickness:.5}},{id:"plastic-glossy",label:"Glossy Plastic",swatch:"#dadada",material:{baseColor:"#dadada",metalness:0,roughness:.25,reflectivity:.5,clearcoat:.3,clearcoatRoughness:.1}},{id:"plastic-matte",label:"Matte Plastic",swatch:"#9a9a9a",material:{baseColor:"#9a9a9a",metalness:0,roughness:.85,reflectivity:.04}},{id:"rubber",label:"Rubber",swatch:"#1a1a1a",material:{baseColor:"#1a1a1a",metalness:0,roughness:.9,reflectivity:.02}},{id:"fabric",label:"Fabric",swatch:"#9c8a6b",material:{baseColor:"#9c8a6b",metalness:0,roughness:.95,sheen:.4,sheenColor:"#ffffff",sheenRoughness:.6}},{id:"ceramic",label:"Ceramic",swatch:"#f5f5f0",material:{baseColor:"#f5f5f0",metalness:0,roughness:.15,clearcoat:.6,clearcoatRoughness:.1}},{id:"concrete",label:"Concrete",swatch:"#9b9b93",material:{baseColor:"#9b9b93",metalness:0,roughness:.95,reflectivity:.03}}];import{jsx as Qn,jsxs as yl}from"react/jsx-runtime";function ui({disabled:o,onApply:n}){return Qn("div",{className:"bb-presetGallery",children:pi.map(i=>yl("button",{type:"button",className:"bb-presetSwatch",disabled:o,title:`Apply ${i.label} preset`,onClick:()=>n(i.material),children:[Qn("span",{className:"bb-presetSwatchColor",style:{background:i.swatch}}),Qn("span",{className:"bb-presetSwatchLabel",children:i.label})]},i.id))})}import{useEffect as wl,useRef as Cl,useState as Sl}from"react";import{ChevronDown as kl,Download as Nl,FileCode2 as Pl,FileJson as Tl}from"lucide-react";import{jsx as mn,jsxs as It}from"react/jsx-runtime";function eo({disabled:o,exporting:n,onExportJson:i,onExportTs:r}){let[e,t]=Sl(!1),u=Cl(null);return wl(()=>{if(!e)return;let p=m=>{u.current?.contains(m.target)||t(!1)};return window.addEventListener("pointerdown",p),()=>window.removeEventListener("pointerdown",p)},[e]),It("div",{className:"bb-exportMenuWrapper",ref:u,children:[It("button",{type:"button",className:"bb-button bb-button--ghost",disabled:o||n,onClick:()=>t(p=>!p),title:"Export",children:[mn(Nl,{size:14}),n?"Exporting\u2026":"Export",mn(kl,{size:12})]}),e&&It("div",{className:"bb-exportMenu",children:[It("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{t(!1),i()},children:[mn(Tl,{size:14}),"JSON"]}),It("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{t(!1),r()},children:[mn(Pl,{size:14}),"TypeScript"]})]})]})}import{jsx as mt,jsxs as to}from"react/jsx-runtime";function mi({selectedItem:o,selectedBinding:n,open:i,onToggle:r,updateBinding:e,idError:t}){return mt(Te,{title:"Identity",open:i,onToggle:r,children:to("div",{className:"bb-grid",children:[to("div",{className:"bb-field bb-field--full",children:[mt("label",{className:"bb-label",children:"Model Node ID"}),mt("span",{className:"bb-note",children:"This is the exact mesh name from the imported model and stays locked."}),mt("input",{className:"bb-input bb-readonly",value:n.modelObjectId,readOnly:!0})]}),to("div",{className:"bb-field bb-field--full",children:[mt("label",{className:"bb-label",children:"ID"}),mt("input",{className:`bb-input ${t?"bb-input--error":""}`,value:n.id,onChange:u=>e(o,p=>({...p,id:u.target.value}))}),t?mt("span",{className:"bb-status bb-status--error",children:t}):null]})]})})}import{useEffect as Bl,useState as hi}from"react";var gi=["other","body","light","wheel","glass","interior","floor","wall","door","furniture","decor","electronics","seat","table","chair","window","sofa","bed","engine","headlight"],fi=["normal","hidden","selected","disabled"];import{jsx as Ce,jsxs as He}from"react/jsx-runtime";function xi({selectedItem:o,selectedBinding:n,open:i,onToggle:r,updateBinding:e}){let[t,u]=hi(n.group??""),[p,m]=hi(n.tags?.join(", ")??"");Bl(()=>{u(n.group??""),m(n.tags?.join(", ")??"")},[o,n.group,n.tags]);let h=()=>{e(o,d=>({...d,group:t.trim()||void 0}))},k=()=>{let d=[...new Set(p.split(",").map(g=>g.trim()).filter(Boolean))];e(o,g=>({...g,tags:d.length>0?d:void 0}))};return He(Te,{title:"Basics",open:i,onToggle:r,children:[He("div",{className:"bb-grid",children:[He("div",{className:"bb-field",children:[Ce("label",{className:"bb-label",children:"Label"}),Ce("input",{className:"bb-input",value:n.label??"",onChange:d=>e(o,g=>({...g,label:d.target.value}))})]}),He("div",{className:"bb-field",children:[Ce("label",{className:"bb-label",children:"Type"}),Ce("input",{className:"bb-input",list:"binding-type-suggestions",value:n.type??"other",onChange:d=>e(o,g=>({...g,type:d.target.value}))}),Ce("datalist",{id:"binding-type-suggestions",children:gi.map(d=>Ce("option",{value:d},d))})]}),He("div",{className:"bb-field",children:[Ce("label",{className:"bb-label",children:"Status"}),Ce("select",{className:"bb-select",value:n.status??"normal",onChange:d=>e(o,g=>({...g,status:d.target.value})),children:fi.map(d=>Ce("option",{value:d,children:d},d))})]}),He("div",{className:"bb-field",children:[Ce("label",{className:"bb-label",children:"Group"}),Ce("input",{className:"bb-input",placeholder:"paint",value:t,onChange:d=>u(d.target.value),onBlur:h,onKeyDown:d=>{d.key==="Enter"&&d.currentTarget.blur()}})]}),He("div",{className:"bb-field",children:[Ce("label",{className:"bb-label",children:"Tags"}),Ce("input",{className:"bb-input",placeholder:"exterior, configurable",value:p,onChange:d=>m(d.target.value),onBlur:k,onKeyDown:d=>{d.key==="Enter"&&d.currentTarget.blur()}})]})]}),He("div",{className:"bb-checkboxRow",style:{marginTop:12},children:[He("label",{className:"bb-checkbox",children:[Ce("input",{type:"checkbox",checked:n.selectable??!1,onChange:d=>e(o,g=>({...g,selectable:d.target.checked}))}),"selectable"]}),He("label",{className:"bb-checkbox",children:[Ce("input",{type:"checkbox",checked:n.hoverable??!1,onChange:d=>e(o,g=>({...g,hoverable:d.target.checked}))}),"hoverable"]}),He("label",{className:"bb-checkbox",children:[Ce("input",{type:"checkbox",checked:n.visible??!1,onChange:d=>e(o,g=>({...g,visible:d.target.checked}))}),"visible"]})]})]})}import{useEffect as Rl,useState as Al}from"react";import{Fragment as zl,jsx as ge,jsxs as Ee}from"react/jsx-runtime";var vi=On.filter(o=>o.handling==="viewer"),Ml=On.filter(o=>o.handling==="host");function yi({selectedItem:o,selectedBinding:n,open:i,onToggle:r,updateBinding:e}){let[t,u]=Al(new Set);Rl(()=>{u(new Set)},[o]);let p=n.actions??[],m=(d,g)=>e(o,M=>({...M,actions:(M.actions??[]).map((B,N)=>N===d?g(B):B)})),h=d=>{e(o,g=>({...g,actions:(g.actions??[]).filter((M,B)=>B!==d)})),u(g=>{let M=new Set;return g.forEach(B=>{B<d?M.add(B):B>d&&M.add(B-1)}),M})},k=(d,g)=>u(M=>{let B=new Set(M);return g?B.add(d):B.delete(d),B});return Ee(Te,{title:"Actions",open:i,onToggle:r,children:[ge("div",{className:"bb-actionList",children:p.map((d,g)=>{let M=rn(d.id),B=t.has(g)||!M,N=d.id.trim(),O=M?null:_o(d.id),T=N.length>0&&p.some((l,S)=>S!==g&&l.id.trim()===N);return Ee("div",{className:"bb-actionCard",children:[Ee("div",{className:"bb-actionCardHeader",children:[Ee("div",{className:"bb-actionCardTitle",children:["Action ",g+1]}),ge("div",{className:"bb-actionCardMeta",children:d.type})]}),Ee("div",{className:"bb-actionGrid",children:[Ee("div",{className:"bb-field",children:[ge("label",{className:"bb-label",children:"Action ID"}),Ee("select",{className:"bb-select",value:B?an:d.id,onChange:l=>{let S=l.target.value;if(S===an){k(g,!0);return}k(g,!1);let P=rn(S);m(g,v=>({...v,id:S,label:P&&En(v.label)?P.label:v.label}))},children:[ge("optgroup",{label:"Handled by the viewer",children:vi.map(l=>ge("option",{value:l.id,children:l.id},l.id))}),ge("optgroup",{label:"Handled by your app",children:Ml.map(l=>ge("option",{value:l.id,children:l.id},l.id))}),ge("option",{value:an,children:"Custom\u2026"})]})]}),B?Ee("div",{className:"bb-field",children:[ge("label",{className:"bb-label",children:"Custom action ID"}),ge("input",{className:"bb-input",value:d.id,placeholder:"open-datasheet",onChange:l=>{k(g,!0),m(g,S=>({...S,id:l.target.value}))}})]}):null,Ee("div",{className:"bb-field",children:[ge("label",{className:"bb-label",children:"Label"}),ge("input",{className:"bb-input",value:d.label,onChange:l=>m(g,S=>({...S,label:l.target.value}))})]}),M?ge("span",{className:"bb-note",children:M.description}):N.length===0?ge("span",{className:"bb-note",style:{color:"#fca5a5"},children:"An action ID is required, the button renders but can never be identified in onAction."}):Ee("span",{className:"bb-note",style:{color:"#fcd34d"},children:["Unrecognised ID, the viewer has no built-in behavior for it. Add declarative effects and execute them with useViewerActions, or handle it in onAction.",O?Ee(zl,{children:[" Did you mean ",ge("button",{type:"button",className:"bb-linkButton",onClick:()=>{k(g,!1);let l=rn(O);m(g,S=>({...S,id:O,label:l&&En(S.label)?l.label:S.label}))},children:O}),"?"]}):null]}),d.effects?.length?Ee("span",{className:"bb-note",children:[d.effects.length," declarative effect",d.effects.length===1?"":"s",", execute with useViewerActions."]}):null,T?ge("span",{className:"bb-note",style:{color:"#fcd34d"},children:"Another action on this binding uses the same ID, they will render as two identical buttons."}):null]}),ge("div",{className:"bb-actionFooter",children:ge("button",{type:"button",className:"bb-button bb-button--ghost bb-actionRemove",onClick:()=>h(g),children:"Remove Action"})})]},g)})}),ge("div",{style:{marginTop:10},children:ge("button",{type:"button",className:"bb-button",onClick:()=>{let d=vi.find(g=>!p.some(M=>M.id===g.id));e(o,g=>({...g,actions:[...g.actions??[],{id:d?.id??"",label:d?.label??"New Action",type:"command"}]})),d||k(p.length,!0)},children:"Add Action"})})]})}import{MapPin as Ll,Trash2 as Ol}from"lucide-react";import{Fragment as El,jsx as je,jsxs as Me}from"react/jsx-runtime";function wi({selectedBinding:o,open:n,onToggle:i,cameraState:r,formattedCameraState:e,savedCameraPosition:t,onSaveCameraPosition:u,onGoToSavedCamera:p,onClearSavedCamera:m,onResetView:h,onFitScene:k}){return Me(Te,{title:"Camera Position",open:n,onToggle:i,children:[Me("div",{className:"se-waypointCard bb-cameraWaypoint",children:[je("span",{className:"bb-cameraLiveBadge",children:"LIVE"}),Me("div",{className:"se-waypointBody",children:[je("div",{className:"bb-cameraWaypointLabel",children:"Current view"}),r?Me(El,{children:[Me("div",{className:"se-waypointCoords",children:["pos ",e?.position]}),Me("div",{className:"se-waypointCoords",children:["look ",e?.target]})]}):je("div",{className:"se-waypointCoords",children:"Move the camera to see live position"})]})]}),Me("div",{className:"bb-cameraControls bb-cameraControls--centered",children:[je("button",{type:"button",className:"bb-button bb-button--primary",onClick:u,disabled:!r,children:"Save"}),je("button",{type:"button",className:"bb-button bb-button--ghost",onClick:h,children:"Reset View"}),je("button",{type:"button",className:"bb-button bb-button--ghost",onClick:k,children:"Fit Scene"})]}),t?.position&&t?.target&&Me("div",{className:"se-waypointCard bb-cameraWaypoint",children:[je("span",{className:"bb-cameraSavedBadge",children:"SAVED"}),Me("div",{className:"se-waypointBody",children:[Me("div",{className:"bb-cameraWaypointLabel",children:["For ",o.label]}),Me("div",{className:"se-waypointCoords",children:["pos [",t.position.map(d=>d.toFixed(1)).join(", "),"]"]}),Me("div",{className:"se-waypointCoords",children:["look [",t.target.map(d=>d.toFixed(1)).join(", "),"]"]})]}),Me("div",{className:"se-waypointActions",children:[je("button",{className:"se-waypointAction",onClick:p,title:"Fly camera to the saved position",children:je(Ll,{size:15})}),je("button",{className:"se-waypointAction se-waypointAction--delete",onClick:m,title:"Delete saved position",children:je(Ol,{size:15})})]})]}),je("span",{className:"bb-note",children:'Tip: Position the camera how you want, then click "Save" to store this position for the selected object. The camera position updates in real-time as you navigate.'})]})}import{useLayoutEffect as jl,useRef as Dl,useState as Fl}from"react";import{Move3d as Il,RotateCcw as Hl}from"lucide-react";import{jsx as ne,jsxs as Ge}from"react/jsx-runtime";var Ci=["X","Y","Z"];var Gl=.1;function no(o){let n=o%360;return n<0?n+360:n}function Si(o){return no(o*180/Math.PI)}function ki(o){return o*Math.PI/180}function Vl(o,n,i){let r=[...o],e=Si(o[n]);return r[n]=ki(no(e+i)),r}function Ni({value:o,min:n=-1/0,max:i=1/0,step:r=.1,disabled:e=!1,onChange:t,formatValue:u=h=>Number(h.toFixed(3)),ariaLabel:p,className:m}){let h=u(o),[k,d]=Fl(String(h)),g=Dl(!1);return jl(()=>{g.current||d(String(h))},[h]),ne("input",{type:"number",className:m,step:r,min:n===-1/0?void 0:n,max:i===1/0?void 0:i,value:k,disabled:e,"aria-label":p,onFocus:()=>{g.current=!0},onChange:M=>{let B=M.target.value;if(d(B),B===""||B==="-")return;let N=Number(B);if(Number.isFinite(N)){let O=Math.max(n,Math.min(i,N));t(O)}},onBlur:()=>{g.current=!1,d(String(u(o)))}})}function Ul({value:o,min:n=-1/0,max:i=1/0,step:r=.1,disabled:e=!1,onChange:t,formatValue:u=m=>Number(m.toFixed(3)),label:p}){return ne("div",{className:"bb-transformAxesGrid",children:Ci.map((m,h)=>Ge("div",{className:"bb-transformAxis",children:[ne("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:m}),ne("div",{className:"bb-transformAxisControl",children:ne(Ni,{className:"se-numberInput bb-transformNumberInput",step:r,min:n,max:i,value:o[h],disabled:e,formatValue:u,ariaLabel:`${m} ${p?.toLowerCase()||""}`,onChange:k=>{let d=[...o];d[h]=k,t(d)}})})]},m))})}function Pi({selectedItem:o,selectedBinding:n,open:i,onToggle:r,updateBinding:e,moveModeEnabled:t,onToggleMoveMode:u,transformSpace:p,onTransformSpaceChange:m,originalTransform:h}){let k=n.transform?.rotation??h?.rotation??[0,0,0],d=n.transform?.position??h?.position??[0,0,0],g=(l,S)=>{let P=l.transform?.rotation??h?.rotation??[0,0,0],v=l.transform?.position??h?.position??[0,0,0],D=l.transform?.scale??h?.scale??[1,1,1],b=h?.pivotLocal??[0,0,0],a=pa(v,P,S,D,b,h?.rotationOrder??"XYZ");return{...l,transform:{...l.transform,position:a,rotation:S}}},M=(l,S)=>{o&&e(o,P=>{let v=P.transform?.rotation??h?.rotation??[0,0,0],D=Vl(v,l,S);return g(P,D)})},B=(l,S)=>{o&&e(o,P=>{let D=[...P.transform?.rotation??h?.rotation??[0,0,0]];return D[l]=ki(no(S)),g(P,D)})},N=(l,S)=>{o&&e(o,P=>{let D=[...P.transform?.position??h?.position??[0,0,0]];return D[l]=S,{...P,transform:{...P.transform,position:D}}})},O=(l,S)=>{o&&N(l,d[l]+S)},T=()=>{!o||!h||e(o,l=>{let S={...l.transform};return delete S.position,delete S.rotation,{...l,transform:Object.keys(S).length>0?S:void 0}})};return Ge(Te,{title:"Move & Rotate",open:i,onToggle:r,tooltip:"Enable the transform gizmo to move or rotate the selected mesh on any axis. Rotation uses the object's visible center while exported position and rotation remain local GLTF transforms.",children:[Ge("div",{className:"se-field",children:[Ge("div",{className:"se-fieldLabel",children:[Ge("span",{children:[ne(Il,{size:14,style:{marginRight:6,verticalAlign:"-2px"}}),"Transform gizmo"]}),Ge("label",{className:"se-switch","aria-label":"Toggle move mode",children:[ne("input",{type:"checkbox",checked:t,onChange:l=>u(l.target.checked)}),ne("span",{className:"se-switchTrack",children:ne("span",{className:"se-switchThumb"})})]})]}),ne("span",{className:"bb-note",children:"Select a mesh \xB7 drag the colored arrows or planes to move"})]}),Ge("div",{className:"se-field",style:{marginTop:10},children:[ne("div",{className:"se-fieldLabel",children:ne("span",{children:"Axis space"})}),ne("div",{className:"se-segmentedControl",children:["world","local"].map(l=>ne("button",{type:"button",className:`se-segmentedOption ${p===l?"se-segmentedOption--active":""}`,onClick:()=>m(l),children:l},l))})]}),Ge("div",{className:"se-field",style:{marginTop:10},children:[ne("div",{className:"se-fieldLabel",children:ne("span",{children:"Rotation (degrees)"})}),ne("div",{className:"bb-transformAxesGrid",children:Ci.map((l,S)=>{let P=Math.round(Si(k[S]));return Ge("div",{className:"bb-transformAxis",children:[ne("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:l}),ne("div",{className:"bb-transformAxisControl",children:ne(Ni,{className:"se-numberInput bb-transformNumberInput",step:1,min:0,max:359,value:P,disabled:!o,formatValue:v=>Math.round(v),ariaLabel:`${l} rotation in degrees`,onChange:v=>B(S,v)})})]},l)})})]}),Ge("div",{className:"se-field",style:{marginTop:10},children:[ne("div",{className:"se-fieldLabel",children:ne("span",{children:"Position"})}),ne(Ul,{value:d,min:-1/0,max:1/0,step:Gl,disabled:!o,label:"position",onChange:l=>{o&&e(o,S=>({...S,transform:{...S.transform,position:l}}))}})]}),Ge("button",{type:"button",className:"bb-button bb-button--ghost",style:{marginTop:10,display:"inline-flex",alignItems:"center",gap:6},disabled:!o||!h,onClick:T,title:"Restore this node's position and rotation to what they were in the original model",children:[ne(Hl,{size:14}),"Restore original position & rotation"]})]})}import{memo as $l,useMemo as Ti,useState as _l}from"react";import{Fragment as Wl,jsx as gt,jsxs as ot}from"react/jsx-runtime";var Bi=$l(Kl);function Kl({bindings:o,selectedItem:n,onSelect:i,onHover:r,isOpen:e=!0,onToggle:t}){let[u,p]=_l(""),m=Ti(()=>Object.keys(o),[o]),h=Ti(()=>{let k=u.trim().toLowerCase();return k?m.filter(d=>{let g=o[d];return d.toLowerCase().includes(k)||g.label?.toLowerCase().includes(k)||(g.type??"other").toLowerCase().includes(k)}):m},[o,m,u]);return ot("aside",{className:`bb-sidebar bb-sidebar--right ${e?"":"bb-sidebar--collapsed"}`,children:[ot("div",{className:"bb-header bb-header--sidebar",children:[!e&>("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>t?.(!0),"aria-label":"Open scene nodes sidebar",title:"Open scene nodes",children:"\u2190"}),e&&ot(Wl,{children:[ot("div",{children:[gt("div",{className:"bb-sectionKicker",children:"Scene Nodes"}),ot("div",{className:"bb-sectionHeading",children:[h.length," visible entries"]})]}),gt("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>t?.(!1),"aria-label":"Close scene nodes sidebar",title:"Close scene nodes",children:"\u2192"})]})]}),e&&ot("section",{className:"bb-nodeList",children:[gt("div",{className:"bb-search",children:gt("input",{className:"bb-input",placeholder:"Search nodes, labels, or types",value:u,onChange:k=>p(k.target.value)})}),gt("div",{className:"bb-nodeItems",children:h.map(k=>{let d=o[k];return ot("button",{type:"button",className:`bb-nodeButton ${k===n?"bb-nodeButton--active":""}`,onClick:()=>i(k),onMouseEnter:()=>r?.(k),onMouseLeave:()=>r?.(null),children:[gt("span",{className:"bb-nodeName",children:k}),ot("span",{className:"bb-nodeMeta",children:[d.type??"other",d.label===sa(k)?"":d.label||"\xB7 Untitled"]})]},k)})})]})]})}import{jsx as gn,jsxs as Ri}from"react/jsx-runtime";function oo({title:o,label:n,open:i,onToggle:r,draft:e,error:t,example:u,onDraftChange:p,onCommit:m}){return gn(Te,{title:o,open:i,onToggle:r,children:Ri("div",{className:"bb-field",children:[gn("label",{className:"bb-label",children:n}),gn("textarea",{className:"bb-textarea",value:e,onChange:h=>p(h.target.value),onBlur:m}),t?gn("span",{className:"bb-status bb-status--error",children:t}):Ri("span",{className:"bb-note",children:["Use a JSON object like ",u,"."]})]})})}function Ai(o,n){let i=new Map(o.animations.clips.map(t=>[t.sourceName,t])),r=n.map(({sourceName:t})=>i.get(t)??{sourceName:t,displayName:t,hidden:!1,loopMode:"repeat",speed:1}),e=o.animations.autoplayClip&&r.some(t=>t.sourceName===o.animations.autoplayClip&&!t.hidden)?o.animations.autoplayClip:null;return{clips:r,autoplayClip:e}}import{useCallback as Ht,useReducer as Yl,useRef as ql}from"react";var Jl=100;function Xl(o,n){switch(n.type){case"set":{let i=typeof n.updater=="function"?n.updater(o.present):n.updater;if(i===o.present)return o;let r=n.track?o.edits+1:o.edits;return n.coalesce?{...o,present:i,future:[],edits:r}:{past:[...o.past,o.present].slice(-Jl),present:i,future:[],edits:r}}case"undo":{if(o.past.length===0)return o;let i=o.past[o.past.length-1];return{past:o.past.slice(0,-1),present:i,future:[o.present,...o.future],edits:o.edits+1}}case"redo":{if(o.future.length===0)return o;let[i,...r]=o.future;return{past:[...o.past,o.present],present:i,future:r,edits:o.edits+1}}case"reset":return{past:[],present:n.value,future:[],edits:n.track?o.edits+1:0}}}function ao(o,n=600){let[i,r]=Yl(Xl,{past:[],present:o,future:[],edits:0}),e=ql(0),t=Ht(k=>{let d=Date.now(),g=d-e.current<n;e.current=d,r({type:"set",updater:k,coalesce:g,track:!0})},[n]),u=Ht(k=>{let d=Date.now()-e.current<n;r({type:"set",updater:k,coalesce:d,track:!1})},[n]),p=Ht(()=>{e.current=0,r({type:"undo"})},[]),m=Ht(()=>{e.current=0,r({type:"redo"})},[]),h=Ht((k,d)=>{e.current=0,r({type:"reset",value:k,track:d?.asEdit??!1})},[]);return{value:i.present,setValue:t,setValueUntracked:u,undo:p,redo:m,reset:h,canUndo:i.past.length>0,canRedo:i.future.length>0,edits:i.edits}}import{strToU8 as Zl}from"fflate";function Mi(o){return JSON.stringify(o,null,2)}function zi(o){return['import { defineObjectBindings } from "@liveroom-tech/react-immersive/utils";',"",`export const objectBindings = defineObjectBindings(${JSON.stringify(o,null,2)});`,""].join(`
|
|
1
|
+
import{a as zn,c as sn,d as Ko,e as Qo,f as ea,g as ln,h as jn,i as oa,j as aa,k as ia,l as tt,m as la,n as da,o as ba,p as ca,q as pa,r as ua,s as ma}from"./chunk-AH5NAZWX.mjs";import{F as ra,f as $o,h as Ln,m as na}from"./chunk-XTLSAYAQ.mjs";import{a as On,b as an,c as rn,e as En,f as _o,h as Wo,i as Yo,j as qo,k as Jo,l as Xo,m as Zo,n as Lt,o as Ot,r as ta,s as sa,v as dn,x as Dn,y as ga,z as fa}from"./chunk-BGYK4Y2Y.mjs";import{useCallback as Q,useEffect as $e,useMemo as uo,useRef as oe,useState as $}from"react";import{Redo2 as Ii,Undo2 as Hi,Upload as Gi,ListRestart as Vi,History as Ui,X as $i,AlertTriangle as ed}from"lucide-react";var is="react-immersive:binding-builder";var wt="session",st="model",Ct="textures",Et="current";var rt=null;function cn(){return rt||(rt=new Promise((o,n)=>{if(typeof indexedDB>"u"){n(new Error("IndexedDB is not available in this environment."));return}let i=indexedDB.open(is,2);i.onupgradeneeded=()=>{let r=i.result;r.objectStoreNames.contains(wt)||r.createObjectStore(wt),r.objectStoreNames.contains(st)||r.createObjectStore(st),r.objectStoreNames.contains(Ct)||r.createObjectStore(Ct)},i.onsuccess=()=>{let r=i.result;r.onversionchange=()=>{r.close(),rt=null},o(r)},i.onerror=()=>n(i.error??new Error("Failed to open IndexedDB."))}),rt.catch(()=>{rt=null}),rt)}function pn(o){return new Promise((n,i)=>{o.oncomplete=()=>n(),o.onerror=()=>i(o.error??new Error("IndexedDB transaction failed.")),o.onabort=()=>i(o.error??new Error("IndexedDB transaction aborted."))})}function Fn(o){return new Promise((n,i)=>{o.onsuccess=()=>n(o.result),o.onerror=()=>i(o.error??new Error("IndexedDB request failed."))})}function bn(o){return o!==null&&typeof o=="object"&&!Array.isArray(o)}function rs(o){if(!bn(o)||o.version!==1)return!1;let n=o.model;return typeof o.savedAt=="number"&&bn(o.bindings)&&bn(o.sceneConfig)&&bn(n)&&typeof n.name=="string"&&(n.kind==="file"&&typeof n.key=="string"||n.kind==="url"&&typeof n.url=="string")}async function ha(o,n){let i=await cn(),r={...o,version:1,savedAt:Date.now()},e=i.transaction([wt,st],"readwrite"),t=pn(e);if(e.objectStore(wt).put(r,Et),r.model.kind==="file"&&n){let u={key:r.model.key,blob:n,name:n.name,type:n.type,lastModified:n.lastModified};e.objectStore(st).put(u,Et)}else r.model.kind==="url"&&e.objectStore(st).delete(Et);return await t,r}async function xa(){let n=(await cn()).transaction([wt,st],"readonly"),i=pn(n),[r,e]=await Promise.all([Fn(n.objectStore(wt).get(Et)),Fn(n.objectStore(st).get(Et))]);return await i,rs(r)?r.model.kind==="url"?{session:r,file:null}:!e||e.key!==r.model.key?null:{session:r,file:new File([e.blob],e.name,{type:e.type,lastModified:e.lastModified})}:null}async function va(o,n){let r=(await cn()).transaction(Ct,"readwrite"),e=pn(r),t={blob:n,name:n.name,type:n.type,savedAt:Date.now()};r.objectStore(Ct).put(t,o),await e}async function un(o){let i=(await cn()).transaction(Ct,"readonly"),r=pn(i),e=await Fn(i.objectStore(Ct).get(o));return await r,e?new File([e.blob],e.name,{type:e.type,lastModified:e.savedAt}):null}import{useState as nl,useEffect as ol}from"react";import{useState as fs}from"react";import{ChevronDown as hs,ChevronLeft as xs,ChevronRight as vs,RotateCcw as ys}from"lucide-react";import{HexColorInput as ws,HexColorPicker as Cs}from"react-colorful";import{useLayoutEffect as wa,useRef as In,useState as Hn}from"react";import{createPortal as ls}from"react-dom";import{ChevronDown as ds,Info as bs}from"lucide-react";import{HexColorInput as cs,HexColorPicker as ps}from"react-colorful";function St(o){let n=o.replace("#","").match(/.{2}/g).map(r=>parseInt(r,16)/255).map(r=>r<=.03928?r/12.92:Math.pow((r+.055)/1.055,2.4));return .2126*n[0]+.7152*n[1]+.0722*n[2]>.179?"#000":"#fff"}import{useEffect as ss}from"react";function ya(o,n,i){ss(()=>{if(!i)return;let r=Array.isArray(o)?o:[o],e=t=>{let u=t.target;r.some(m=>m.current?.contains(u))||n()};return document.addEventListener("pointerdown",e,!0),()=>{document.removeEventListener("pointerdown",e,!0)}},[o,n,i])}import{jsx as K,jsxs as Se}from"react/jsx-runtime";function Gn({anchorRef:o,onClose:n,children:i}){let r=In(null),[e,t]=Hn(null);return ya([r,o],n,!0),wa(()=>{let u=o.current;if(!u)return;let p=u.getBoundingClientRect(),m=222,h=8,k=Math.min(Math.max(p.right-m,h),window.innerWidth-m-h),d=Math.min(p.bottom+6,window.innerHeight-200);t({top:d,left:k})},[o]),e?ls(K("div",{ref:r,className:"se-colorPickerPopover",style:{position:"fixed",top:e.top,left:e.left},children:i}),document.body):null}function us(o){return o.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").replace(/\s+/g," ").trim().replace(/\b\w/g,n=>n.toUpperCase())}function lt({title:o,children:n}){return Se("section",{className:"se-section",children:[K("h3",{className:"se-sectionTitle",children:o}),K("div",{className:"se-sectionBody",children:n})]})}function W({title:o,open:n,onToggle:i,trailing:r,children:e,disabled:t,tooltip:u}){let p=u?`${u}`:o;return Se("section",{className:"se-panel",children:[Se("button",{type:"button",className:"se-panelHeader",onClick:i,"aria-expanded":n,title:p,children:[Se("span",{className:"se-panelHeaderMain",children:[K(ds,{size:16,className:`se-panelChevron ${n?"se-panelChevron--open":""}`}),K("span",{className:"se-panelTitle",children:o}),u?K("span",{className:"se-panelHelp",title:p,"aria-label":p,role:"img",onClick:m=>m.stopPropagation(),children:K(bs,{size:13})}):null]}),r?K("span",{className:"se-panelTrailing",onClick:m=>m.stopPropagation(),children:r}):null]}),n?K("div",{className:"se-panelBody",style:t?{opacity:.45,pointerEvents:"none"}:void 0,children:e}):null]})}function q({checked:o,onChange:n,label:i}){return Se("label",{className:"se-switch","aria-label":i,children:[K("input",{type:"checkbox",checked:o,onChange:r=>n(r.target.checked)}),K("span",{className:"se-switchTrack",children:K("span",{className:"se-switchThumb"})})]})}function f({label:o,value:n,min:i,max:r,step:e,formatValue:t,onChange:u,disabled:p=!1}){return Se("label",{className:`se-field ${p?"se-field--disabled":""}`,children:[Se("span",{className:"se-fieldLabel",children:[o,K("span",{className:"se-fieldValue",children:t?t(n):n})]}),K("input",{className:"se-slider",type:"range",min:i,max:r,step:e,value:n,onChange:m=>u(Number(m.target.value)),disabled:p})]})}function J({label:o,checked:n,onChange:i}){return Se("label",{className:"se-field se-fieldInline",children:[K("span",{className:"se-fieldLabel",children:o}),K("input",{type:"checkbox",className:"se-checkbox",checked:n,onChange:r=>i(r.target.checked)})]})}function Be({label:o,value:n,options:i,onChange:r}){return Se("label",{className:"se-field se-fieldInline",children:[K("span",{className:"se-fieldLabel",children:o}),K("select",{className:"se-select",value:n,onChange:e=>r(e.target.value),children:i.map(e=>K("option",{value:e,children:us(e)},e))})]})}function Le({label:o,value:n,onChange:i}){let[r,e]=Hn(!1),t=In(null);return Se("div",{className:"se-field",children:[Se("div",{className:"se-fieldInline",children:[K("span",{className:"se-fieldLabel",children:o}),K("span",{ref:t,style:{display:"inline-flex"},children:K(cs,{prefixed:!0,className:"se-swatch",onClick:()=>e(u=>!u),style:{background:n,color:St(n)},color:n,onChange:i})})]}),r?K(Gn,{anchorRef:t,onClose:()=>e(!1),children:K(ps,{color:n,onChange:i})}):null]})}function Ca({value:o,min:n,max:i,step:r,onChange:e}){let[t,u]=Hn(String(o)),p=In(!1);return wa(()=>{p.current||u(String(o))},[o]),K("input",{type:"number",className:"se-numberInput",min:n,max:i,step:r,value:t,onFocus:()=>{p.current=!0},onChange:m=>{let h=m.target.value;u(h),h!==""&&h!=="-"&&!Number.isNaN(Number(h))&&e(Number(h))},onBlur:()=>{p.current=!1,u(String(o))}})}function nt({label:o,value:n,min:i,max:r,step:e,onChange:t}){return Se("div",{className:"se-field",children:[K("span",{className:"se-fieldLabel",children:o}),K("div",{className:"se-vectorRow",children:["X","Y","Z"].map((p,m)=>Se("label",{className:"se-vectorAxis",children:[K("span",{children:p}),K(Ca,{value:n[m],min:i,max:r,step:e,onChange:h=>{let k=[...n];k[m]=h,t(k)}})]},p))})]})}function dt({label:o,value:n,min:i,max:r,step:e,onChange:t}){return Se("div",{className:"se-field",children:[K("span",{className:"se-fieldLabel",children:o}),K("div",{className:"se-vectorRow",children:["X","Y"].map((p,m)=>Se("label",{className:"se-vectorAxis",children:[K("span",{children:p}),K(Ca,{value:n[m],min:i,max:r,step:e,onChange:h=>{let k=[...n];k[m]=h,t(k)}})]},p))})]})}var Sa={free:0,starter:1,growth:2};function ka(o){return o==="starter"||o==="growth"||o==="scale"?o==="scale"?"growth":o:"free"}function Ye(o,n){return Sa[o]>=Sa[n]}var Na={free:"Free",starter:"Starter",growth:"Growth"};import{Lock as ms}from"lucide-react";import{jsx as gs,jsxs as Pa}from"react/jsx-runtime";function Pe({requiredTier:o,feature:n}){return Pa("div",{className:"bb-tierLock",children:[gs(ms,{size:16}),Pa("p",{className:"bb-tierLockMessage",children:[n," requires the ",Na[o]," plan or higher."]})]})}import{Fragment as Vn,jsx as R,jsxs as ce}from"react/jsx-runtime";var Ss=["lit","unlit","normals"],ks=["color","image","environment"];function Ta(o){let n=o%360;return n<0?n+360:n}function jt({title:o,open:n,onToggle:i,children:r,trailing:e}){return ce("section",{className:"se-panel",children:[ce("button",{type:"button",className:"se-panelHeader",onClick:i,"aria-expanded":n,children:[ce("span",{className:"se-panelHeaderMain",children:[R(hs,{size:16,className:`se-panelChevron ${n?"se-panelChevron--open":""}`}),R("span",{className:"se-panelTitle",children:o})]}),e?R("span",{className:"se-panelTrailing",onClick:t=>t.stopPropagation(),children:e}):null]}),n?R("div",{className:"se-panelBody",children:r}):null]})}function Un({config:o,onChange:n}){let{model:i,camera:r,wireframe:e,background:t,environment:u}=o,{tier:p}=tt(),m=Ye(p,"starter"),[h,k]=fs({general:!0,camera:!0,autoRotate:!1,wireframe:!1,background:!1}),d=l=>k(S=>({...S,[l]:!S[l]})),g=l=>n({...o,model:l}),M=l=>n({...o,camera:l}),B=l=>n({...o,wireframe:l}),N=l=>n({...o,background:l}),O=l=>n({...o,environment:l}),T=l=>{O({...u,source:"preset",preset:l})};return ce("div",{className:"se-generalContent",children:[ce(jt,{title:"General",open:h.general,onToggle:()=>d("general"),children:[ce("div",{className:"se-field",children:[ce("div",{className:"se-fieldLabel",children:[R("span",{children:"Straighten model"}),R("button",{type:"button",className:"se-iconButton",onClick:()=>g({...i,rotation:[0,0,0]}),"aria-label":"Reset model rotation",children:R(ys,{size:16})})]}),R("div",{className:"se-axisStepperGrid",children:["X","Y","Z"].map((l,S)=>ce("div",{className:"se-axisStepper",children:[R("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let P=[...i.rotation];P[S]=Ta(P[S]-90),g({...i,rotation:P})},"aria-label":`Rotate ${l} axis backward`,children:R(xs,{size:16})}),R("span",{className:"se-axisStepperLabel",children:l}),R("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let P=[...i.rotation];P[S]=Ta(P[S]+90),g({...i,rotation:P})},"aria-label":`Rotate ${l} axis forward`,children:R(vs,{size:16})})]},l))})]}),R(nt,{label:"Rotation",value:i.rotation,min:0,max:360,step:1,onChange:l=>g({...i,rotation:l})}),ce("div",{className:"se-field",children:[R("span",{className:"se-fieldLabel",children:"Renderer"}),R("div",{className:"se-segmentedControl se-segmentedControl--renderer",children:qo.map(l=>R("button",{type:"button",className:`se-segmentedOption ${i.renderer===l?"se-segmentedOption--active":""}`,onClick:()=>g({...i,renderer:l}),children:l==="uv-checker"?"UV CHECKER":l.toUpperCase()},l))})]}),R(Be,{label:"Shading",value:i.shading,options:Ss,onChange:l=>g({...i,shading:l})})]}),R(jt,{title:"Camera",open:h.camera,onToggle:()=>d("camera"),children:R(f,{label:"Field Of View",value:r.fieldOfView,min:20,max:100,step:.1,formatValue:l=>`${l.toFixed(3)}\xB0`,onChange:l=>M({...r,fieldOfView:l})})}),R(jt,{title:"Auto Rotate",open:h.autoRotate,onToggle:()=>d("autoRotate"),trailing:ce("label",{className:"se-switch","aria-label":"Toggle auto rotate",children:[R("input",{type:"checkbox",checked:i.autoRotate??!1,onChange:l=>g({...i,autoRotate:l.target.checked})}),R("span",{className:"se-switchTrack",children:R("span",{className:"se-switchThumb"})})]}),children:i.autoRotate?R(f,{label:"Rotation Speed",value:i.autoRotateSpeed??1,min:.1,max:3,step:.1,formatValue:l=>`${l.toFixed(1)}x`,onChange:l=>g({...i,autoRotateSpeed:l})}):R("div",{className:"se-placeholder",children:"Enable auto rotate to adjust its speed."})}),R(jt,{title:"Wireframe",open:h.wireframe,onToggle:()=>d("wireframe"),trailing:ce("label",{className:"se-switch","aria-label":"Toggle wireframe preview",children:[R("input",{type:"checkbox",checked:m&&e.enabled,disabled:!m,onChange:l=>B({...e,enabled:l.target.checked})}),R("span",{className:"se-switchTrack",children:R("span",{className:"se-switchThumb"})})]}),children:m?ce(Vn,{children:[R(f,{label:"Opacity",value:e.opacity,min:0,max:1,step:.01,onChange:l=>B({...e,opacity:l})}),R(Le,{label:"Wire color",value:e.color,onChange:l=>B({...e,color:l})})]}):R(Pe,{requiredTier:"starter",feature:"Wireframe preview"})}),R(jt,{title:"Background",open:h.background,onToggle:()=>d("background"),trailing:ce("label",{className:"se-switch","aria-label":"Toggle scene background",children:[R("input",{type:"checkbox",checked:t.enabled,onChange:l=>N({...t,enabled:l.target.checked})}),R("span",{className:"se-switchTrack",children:R("span",{className:"se-switchThumb"})})]}),children:t.enabled?ce(Vn,{children:[ce("div",{className:"se-field",children:[R("span",{className:"se-fieldLabel",children:"Background type"}),R("div",{className:"se-segmentedControl",children:ks.map(l=>R("button",{type:"button",className:`se-segmentedOption ${t.type===l?"se-segmentedOption--active":""}`,onClick:()=>N({...t,type:l}),children:l},l))})]}),t.type==="environment"?m?ce(Vn,{children:[ce("div",{className:"se-field",children:[R("span",{className:"se-fieldLabel",children:"Environment source"}),ce("div",{className:"se-segmentedControl",children:[R("button",{type:"button",className:`se-segmentedOption ${u.source==="preset"?"se-segmentedOption--active":""}`,onClick:()=>O({...u,source:"preset"}),children:"PRESET"}),R("button",{type:"button",className:`se-segmentedOption ${u.source==="custom"?"se-segmentedOption--active":""}`,onClick:()=>O({...u,source:"custom"}),children:"CUSTOM"})]})]}),u.source==="preset"?R(Be,{label:"Environment preset",value:u.preset,options:Jo,onChange:T}):ce("label",{className:"se-field",children:[R("span",{className:"se-fieldLabel",children:"Custom environment URL"}),R("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/environment.hdr",value:u.customEnvironmentUrl,onChange:l=>O({...u,customEnvironmentUrl:l.target.value})}),R("span",{className:"bb-note",children:"Enter a HDR, EXR, JPG, JPEG, PNG, or WEBP URL."}),u.customEnvironmentUrl.trim()&&!Wo(u.customEnvironmentUrl)?R("span",{className:"bb-note",style:{color:"#fca5a5"},children:"Invalid image/HDRI URL."}):null]}),R(f,{label:"Environment intensity",value:u.intensity,min:0,max:3,step:.05,onChange:l=>O({...u,intensity:l})})]}):R(Pe,{requiredTier:"starter",feature:"Environment backgrounds"}):null,t.type==="image"?ce("label",{className:"se-field",children:[R("span",{className:"se-fieldLabel",children:"Background image URL"}),R("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/background.jpg",value:t.imageUrl,onChange:l=>N({...t,imageUrl:l.target.value})})]}):null,t.type==="color"?ce("div",{className:"se-field",children:[R("span",{className:"se-fieldLabel",children:"Background color"}),R("div",{className:"se-inlineColorPicker",children:R(Cs,{color:t.color,onChange:l=>N({...t,color:l})})}),R("div",{className:"se-fieldInline",children:R(ws,{prefixed:!0,className:"se-swatch",style:{background:t.color,color:St(t.color)},color:t.color,onChange:l=>N({...t,color:l})})})]}):null]}):R("div",{className:"se-placeholder",children:"Background rendering is disabled for this scene preset."})})]})}import{useState as Ps}from"react";import{jsx as A,jsxs as Dt}from"react/jsx-runtime";function Ba({pp:o,set:n,open:i,toggle:r}){let{ssao:e}=o;return Dt(W,{title:"SSAO",tooltip:"Adds soft contact shadows in corners, creases, and tight spaces.",open:i.ssao,onToggle:()=>r("ssao"),disabled:!e.enabled,trailing:A(q,{checked:e.enabled,onChange:t=>n("ssao",{...e,enabled:t}),label:"Toggle SSAO"}),children:[A(f,{label:"Samples",value:e.samples,min:1,max:64,step:1,onChange:t=>n("ssao",{...e,samples:t})}),A(f,{label:"Rings",value:e.rings,min:1,max:12,step:1,onChange:t=>n("ssao",{...e,rings:t})}),A(f,{label:"Intensity",value:e.intensity,min:0,max:20,step:.5,onChange:t=>n("ssao",{...e,intensity:t})}),A(f,{label:"Radius",value:e.radius,min:.01,max:1,step:.01,onChange:t=>n("ssao",{...e,radius:t})}),A(f,{label:"Bias",value:e.bias,min:0,max:.1,step:.001,onChange:t=>n("ssao",{...e,bias:t})}),A(f,{label:"Luminance Influence",value:e.luminanceInfluence,min:0,max:1,step:.01,onChange:t=>n("ssao",{...e,luminanceInfluence:t})}),A(f,{label:"Fade",value:e.fade,min:0,max:.1,step:.001,onChange:t=>n("ssao",{...e,fade:t})}),A(f,{label:"Min Radius Scale",value:e.minRadiusScale,min:0,max:1,step:.01,onChange:t=>n("ssao",{...e,minRadiusScale:t})}),A(f,{label:"World Distance Threshold",value:e.worldDistanceThreshold,min:0,max:100,step:.1,onChange:t=>n("ssao",{...e,worldDistanceThreshold:t})}),A(f,{label:"World Distance Falloff",value:e.worldDistanceFalloff,min:0,max:20,step:.1,onChange:t=>n("ssao",{...e,worldDistanceFalloff:t})}),A(f,{label:"World Proximity Threshold",value:e.worldProximityThreshold,min:0,max:100,step:.1,onChange:t=>n("ssao",{...e,worldProximityThreshold:t})}),A(f,{label:"World Proximity Falloff",value:e.worldProximityFalloff,min:0,max:20,step:.1,onChange:t=>n("ssao",{...e,worldProximityFalloff:t})})]})}function Ra({pp:o,set:n,open:i,toggle:r}){let{autofocus:e}=o;return Dt(W,{title:"Auto focus",tooltip:"Keeps the focus plane tracking a subject so the image stays sharp where you want it.",open:i.autofocus,onToggle:()=>r("autofocus"),disabled:!e.enabled,trailing:A(q,{checked:e.enabled,onChange:t=>n("autofocus",{...e,enabled:t}),label:"Toggle Autofocus"}),children:[A(f,{label:"Focus Distance",value:e.focusDistance,min:0,max:50,step:.1,onChange:t=>n("autofocus",{...e,focusDistance:t})}),A(f,{label:"Focus Range",value:e.focusRange,min:.1,max:50,step:.1,onChange:t=>n("autofocus",{...e,focusRange:t})}),A(f,{label:"Focal Length",value:e.focalLength,min:0,max:1,step:.01,onChange:t=>n("autofocus",{...e,focalLength:t})}),A(f,{label:"Bokeh Scale",value:e.bokehScale,min:0,max:20,step:.1,onChange:t=>n("autofocus",{...e,bokehScale:t})}),A(nt,{label:"Target",value:e.target,min:-100,max:100,step:.1,onChange:t=>n("autofocus",{...e,target:t})}),A(J,{label:"Mouse Follow",checked:e.mouse,onChange:t=>n("autofocus",{...e,mouse:t})}),A(J,{label:"Manual Update",checked:e.manual,onChange:t=>n("autofocus",{...e,manual:t})}),A(f,{label:"Debug",value:e.debug,min:0,max:1,step:.01,onChange:t=>n("autofocus",{...e,debug:t})}),A(f,{label:"Smooth Time",value:e.smoothTime,min:0,max:2,step:.01,onChange:t=>n("autofocus",{...e,smoothTime:t})})]})}function Aa({pp:o,set:n,open:i,toggle:r}){let{godRays:e}=o;return Dt(W,{title:"God Rays",tooltip:"Creates light shafts that streak outward from a bright sun or light source.",open:i.godRays,onToggle:()=>r("godRays"),disabled:!e.enabled,trailing:A(q,{checked:e.enabled,onChange:t=>n("godRays",{...e,enabled:t}),label:"Toggle GodRays"}),children:[A(nt,{label:"Sun Position",value:e.sunPosition,min:-100,max:100,step:.1,onChange:t=>n("godRays",{...e,sunPosition:t})}),A(f,{label:"Samples",value:e.samples,min:1,max:128,step:1,onChange:t=>n("godRays",{...e,samples:t})}),A(f,{label:"Density",value:e.density,min:0,max:2,step:.01,onChange:t=>n("godRays",{...e,density:t})}),A(f,{label:"Decay",value:e.decay,min:0,max:1,step:.01,onChange:t=>n("godRays",{...e,decay:t})}),A(f,{label:"Weight",value:e.weight,min:0,max:2,step:.01,onChange:t=>n("godRays",{...e,weight:t})}),A(f,{label:"Exposure",value:e.exposure,min:0,max:2,step:.01,onChange:t=>n("godRays",{...e,exposure:t})}),A(f,{label:"Clamp Max",value:e.clampMax,min:0,max:2,step:.01,onChange:t=>n("godRays",{...e,clampMax:t})}),A(J,{label:"Blur",checked:e.blur,onChange:t=>n("godRays",{...e,blur:t})}),A(Be,{label:"Kernel Size",value:e.kernelSize,options:Lt,onChange:t=>n("godRays",{...e,kernelSize:t})})]})}function Ma({pp:o,set:n,open:i,toggle:r}){let{lensflare:e}=o;return Dt(W,{title:"Lens Flare",tooltip:"Adds camera flare artifacts and glow from a bright light source.",open:i.lensflare,onToggle:()=>r("lensflare"),disabled:!e.enabled,trailing:A(q,{checked:e.enabled,onChange:t=>n("lensflare",{...e,enabled:t}),label:"Toggle Lensflare"}),children:[A(nt,{label:"Lens Position",value:e.lensPosition,min:-100,max:100,step:.1,onChange:t=>n("lensflare",{...e,lensPosition:t})}),A(f,{label:"Smooth Time",value:e.smoothTime,min:0,max:1,step:.01,onChange:t=>n("lensflare",{...e,smoothTime:t})}),A(f,{label:"Glare Size",value:e.glareSize,min:0,max:1,step:.01,onChange:t=>n("lensflare",{...e,glareSize:t})}),A(f,{label:"Flare Size",value:e.flareSize,min:0,max:.1,step:.001,onChange:t=>n("lensflare",{...e,flareSize:t})}),A(f,{label:"Flare Speed",value:e.flareSpeed,min:0,max:.2,step:.001,onChange:t=>n("lensflare",{...e,flareSpeed:t})}),A(f,{label:"Flare Shape",value:e.flareShape,min:0,max:.2,step:.001,onChange:t=>n("lensflare",{...e,flareShape:t})}),A(J,{label:"Animated",checked:e.animated,onChange:t=>n("lensflare",{...e,animated:t})}),A(J,{label:"Anamorphic",checked:e.anamorphic,onChange:t=>n("lensflare",{...e,anamorphic:t})}),A(Le,{label:"Color Gain",value:e.colorGain,onChange:t=>n("lensflare",{...e,colorGain:t})}),A(f,{label:"Halo Scale",value:e.haloScale,min:0,max:2,step:.01,onChange:t=>n("lensflare",{...e,haloScale:t})}),A(J,{label:"Secondary Ghosts",checked:e.secondaryGhosts,onChange:t=>n("lensflare",{...e,secondaryGhosts:t})}),A(J,{label:"Additional Streaks",checked:e.aditionalStreaks,onChange:t=>n("lensflare",{...e,aditionalStreaks:t})}),A(f,{label:"Ghost Scale",value:e.ghostScale,min:0,max:1,step:.01,onChange:t=>n("lensflare",{...e,ghostScale:t})}),A(f,{label:"Opacity",value:e.opacity,min:0,max:1,step:.01,onChange:t=>n("lensflare",{...e,opacity:t})}),A(J,{label:"Star Burst",checked:e.starBurst,onChange:t=>n("lensflare",{...e,starBurst:t})})]})}function za({pp:o,set:n,open:i,toggle:r}){let{depthOfField:e}=o;return Dt(W,{title:"Depth Of Field",tooltip:"Blurs areas that sit away from the focal plane for a camera-like look.",open:i.depthOfField,onToggle:()=>r("depthOfField"),disabled:!e.enabled,trailing:A(q,{checked:e.enabled,onChange:t=>n("depthOfField",{...e,enabled:t}),label:"Toggle DepthOfField"}),children:[A(f,{label:"Focus Distance",value:e.focusDistance,min:0,max:50,step:.1,onChange:t=>n("depthOfField",{...e,focusDistance:t})}),A(f,{label:"Focus Range",value:e.focusRange,min:.1,max:50,step:.1,onChange:t=>n("depthOfField",{...e,focusRange:t})}),A(f,{label:"Focal Length",value:e.focalLength,min:0,max:1,step:.01,onChange:t=>n("depthOfField",{...e,focalLength:t})}),A(f,{label:"Bokeh Scale",value:e.bokehScale,min:0,max:20,step:.1,onChange:t=>n("depthOfField",{...e,bokehScale:t})})]})}import{jsx as _,jsxs as kt}from"react/jsx-runtime";var Ns=["linear","reinhard","aces"];function La({pp:o,set:n,open:i,toggle:r}){let{colorAverage:e}=o;return _(W,{title:"Color Average",tooltip:"Blends the frame toward a single average color for a washed-out stylized look.",open:i.colorAverage,onToggle:()=>r("colorAverage"),disabled:!e.enabled,trailing:_(q,{checked:e.enabled,onChange:t=>n("colorAverage",{...e,enabled:t}),label:"Toggle ColorAverage"}),children:_("div",{className:"se-placeholder",children:"Averages the frame color using the docs default blend mode."})})}function Oa({pp:o,set:n,open:i,toggle:r}){let{brightnessContrast:e}=o;return kt(W,{title:"Brightness Contrast",tooltip:"Raises or lowers overall brightness and contrast across the scene.",open:i.brightnessContrast,onToggle:()=>r("brightnessContrast"),disabled:!e.enabled,trailing:_(q,{checked:e.enabled,onChange:t=>n("brightnessContrast",{...e,enabled:t}),label:"Toggle BrightnessContrast"}),children:[_(f,{label:"Brightness",value:e.brightness,min:-1,max:1,step:.01,onChange:t=>n("brightnessContrast",{...e,brightness:t})}),_(f,{label:"Contrast",value:e.contrast,min:-1,max:1,step:.01,onChange:t=>n("brightnessContrast",{...e,contrast:t})})]})}function Ea({pp:o,set:n,open:i,toggle:r}){let{hueSaturation:e}=o;return kt(W,{title:"Hue Saturation",tooltip:"Shifts the hue and saturation to tint the whole image.",open:i.hueSaturation,onToggle:()=>r("hueSaturation"),disabled:!e.enabled,trailing:_(q,{checked:e.enabled,onChange:t=>n("hueSaturation",{...e,enabled:t}),label:"Toggle HueSaturation"}),children:[_(f,{label:"Hue",value:e.hue,min:-Math.PI,max:Math.PI,step:.01,formatValue:t=>`${t.toFixed(2)} rad`,onChange:t=>n("hueSaturation",{...e,hue:t})}),_(f,{label:"Saturation",value:e.saturation,min:-1,max:1,step:.01,onChange:t=>n("hueSaturation",{...e,saturation:t})})]})}function ja({pp:o,set:n,open:i,toggle:r}){let{vignette:e}=o;return kt(W,{title:"Vignette",tooltip:"Darkens the edges of the screen so the center feels more focused.",open:i.vignette,onToggle:()=>r("vignette"),disabled:!e.enabled,trailing:_(q,{checked:e.enabled,onChange:t=>n("vignette",{...e,enabled:t}),label:"Toggle Vignette"}),children:[_(f,{label:"Offset",value:e.offset,min:0,max:1,step:.01,onChange:t=>n("vignette",{...e,offset:t})}),_(f,{label:"Darkness",value:e.darkness,min:0,max:1,step:.01,onChange:t=>n("vignette",{...e,darkness:t})}),_(J,{label:"Eskil",checked:e.eskil,onChange:t=>n("vignette",{...e,eskil:t})})]})}function Da({pp:o,set:n,open:i,toggle:r}){let{bloom:e}=o;return kt(W,{title:"Bloom",tooltip:"Makes bright areas glow and bleed softly into nearby pixels.",open:i.bloom,onToggle:()=>r("bloom"),disabled:!e.enabled,trailing:_(q,{checked:e.enabled,onChange:t=>n("bloom",{...e,enabled:t}),label:"Toggle Bloom"}),children:[_(f,{label:"Threshold",value:e.luminanceThreshold,min:0,max:1,step:.01,onChange:t=>n("bloom",{...e,luminanceThreshold:t})}),_(f,{label:"Smoothing",value:e.luminanceSmoothing,min:0,max:1,step:.01,onChange:t=>n("bloom",{...e,luminanceSmoothing:t})}),_(f,{label:"Intensity",value:e.intensity,min:0,max:3,step:.05,onChange:t=>n("bloom",{...e,intensity:t})}),_(J,{label:"Mipmap Blur",checked:e.mipmapBlur,onChange:t=>n("bloom",{...e,mipmapBlur:t})}),_(f,{label:"Radius",value:e.radius,min:0,max:1,step:.01,onChange:t=>n("bloom",{...e,radius:t})}),_(f,{label:"Levels",value:e.levels,min:1,max:16,step:1,onChange:t=>n("bloom",{...e,levels:t})})]})}function Fa({pp:o,set:n,open:i,toggle:r}){let{toneMapping:e}=o;return kt(W,{title:"Tone Mapping",tooltip:"Remaps HDR lighting to screen output and controls exposure style.",open:i.toneMapping,onToggle:()=>r("toneMapping"),disabled:!e.enabled,trailing:_(q,{checked:e.enabled,onChange:t=>n("toneMapping",{...e,enabled:t}),label:"Toggle ToneMapping"}),children:[kt("div",{className:"se-field",children:[_("span",{className:"se-fieldLabel",children:"Mode"}),_("div",{className:"se-segmentedControl",children:Ns.map(t=>_("button",{type:"button",className:`se-segmentedOption ${e.mode===t?"se-segmentedOption--active":""}`,onClick:()=>n("toneMapping",{...e,mode:t}),children:t==="aces"?"Filmic":t.charAt(0).toUpperCase()+t.slice(1)},t))})]}),_(f,{label:"Resolution",value:e.resolution,min:64,max:4096,step:64,onChange:t=>n("toneMapping",{...e,resolution:t})}),_(f,{label:"White Point",value:e.whitePoint,min:0,max:16,step:.01,onChange:t=>n("toneMapping",{...e,whitePoint:t})}),_(f,{label:"Middle Grey",value:e.middleGrey,min:0,max:1,step:.01,onChange:t=>n("toneMapping",{...e,middleGrey:t})}),_(f,{label:"Min Luminance",value:e.minLuminance,min:0,max:1,step:.01,onChange:t=>n("toneMapping",{...e,minLuminance:t})}),_(f,{label:"Average Luminance",value:e.averageLuminance,min:0,max:4,step:.01,onChange:t=>n("toneMapping",{...e,averageLuminance:t})}),_(f,{label:"Adaptation Rate",value:e.adaptationRate,min:0,max:10,step:.01,onChange:t=>n("toneMapping",{...e,adaptationRate:t})}),_(f,{label:"Exposure",value:e.exposure,min:0,max:3,step:.01,onChange:t=>n("toneMapping",{...e,exposure:t})})]})}function Ia({pp:o,set:n,open:i,toggle:r}){let{sepia:e}=o;return _(W,{title:"Sepia",tooltip:"Adds a warm vintage brown tint to the entire image.",open:i.sepia,onToggle:()=>r("sepia"),disabled:!e.enabled,trailing:_(q,{checked:e.enabled,onChange:t=>n("sepia",{...e,enabled:t}),label:"Toggle Sepia"}),children:_(f,{label:"Intensity",value:e.intensity,min:0,max:1,step:.01,onChange:t=>n("sepia",{...e,intensity:t})})})}import{jsx as F,jsxs as Nt}from"react/jsx-runtime";function Ha({pp:o,set:n,open:i,toggle:r}){let{dotScreen:e}=o;return Nt(W,{title:"Dot Screen",tooltip:"Overlays a halftone dot pattern for a printed or retro look.",open:i.dotScreen,onToggle:()=>r("dotScreen"),disabled:!e.enabled,trailing:F(q,{checked:e.enabled,onChange:t=>n("dotScreen",{...e,enabled:t}),label:"Toggle DotScreen"}),children:[F(f,{label:"Angle",value:e.angle,min:0,max:Math.PI*2,step:.01,formatValue:t=>`${t.toFixed(2)} rad`,onChange:t=>n("dotScreen",{...e,angle:t})}),F(f,{label:"Scale",value:e.scale,min:.1,max:10,step:.05,onChange:t=>n("dotScreen",{...e,scale:t})})]})}function Ga({pp:o,set:n,open:i,toggle:r}){let{glitch:e}=o;return Nt(W,{title:"Glitch",tooltip:"Introduces digital distortion, tearing, and scan noise.",open:i.glitch,onToggle:()=>r("glitch"),disabled:!e.enabled,trailing:F(q,{checked:e.enabled,onChange:t=>n("glitch",{...e,enabled:t}),label:"Toggle Glitch"}),children:[F(Be,{label:"Mode",value:e.mode,options:Xo,onChange:t=>n("glitch",{...e,mode:t})}),F(dt,{label:"Delay",value:e.delay,min:0,max:10,step:.01,onChange:t=>n("glitch",{...e,delay:t})}),F(dt,{label:"Duration",value:e.duration,min:0,max:5,step:.01,onChange:t=>n("glitch",{...e,duration:t})}),F(dt,{label:"Strength",value:e.strength,min:0,max:2,step:.01,onChange:t=>n("glitch",{...e,strength:t})}),F(dt,{label:"Chromatic Aberration Offset",value:e.chromaticAberrationOffset,min:0,max:.02,step:1e-4,onChange:t=>n("glitch",{...e,chromaticAberrationOffset:t})}),F(f,{label:"Columns",value:e.columns,min:0,max:.5,step:.001,onChange:t=>n("glitch",{...e,columns:t})}),F(f,{label:"Ratio",value:e.ratio,min:0,max:1,step:.01,onChange:t=>n("glitch",{...e,ratio:t})})]})}function Va({pp:o,set:n,open:i,toggle:r}){let{grid:e}=o;return Nt(W,{title:"Grid",tooltip:"Adds a visual grid overlay that feels retro or debug-like.",open:i.grid,onToggle:()=>r("grid"),disabled:!e.enabled,trailing:F(q,{checked:e.enabled,onChange:t=>n("grid",{...e,enabled:t}),label:"Toggle Grid"}),children:[F(f,{label:"Scale",value:e.scale,min:.1,max:10,step:.05,onChange:t=>n("grid",{...e,scale:t})}),F(f,{label:"Line Width",value:e.lineWidth,min:0,max:1,step:.01,onChange:t=>n("grid",{...e,lineWidth:t})})]})}function Ua({pp:o,set:n,open:i,toggle:r}){let{chromaticAberration:e}=o;return Nt(W,{title:"Chromatic Aberration",tooltip:"Separates color channels slightly to mimic lens fringing.",open:i.chromaticAberration,onToggle:()=>r("chromaticAberration"),disabled:!e.enabled,trailing:F(q,{checked:e.enabled,onChange:t=>n("chromaticAberration",{...e,enabled:t}),label:"Toggle ChromaticAberration"}),children:[F(f,{label:"Offset X",value:e.offsetX,min:0,max:.02,step:1e-4,onChange:t=>n("chromaticAberration",{...e,offsetX:t})}),F(f,{label:"Offset Y",value:e.offsetY,min:0,max:.02,step:1e-4,onChange:t=>n("chromaticAberration",{...e,offsetY:t})}),F(J,{label:"Radial Modulation",checked:e.radialModulation,onChange:t=>n("chromaticAberration",{...e,radialModulation:t})}),F(f,{label:"Modulation Offset",value:e.modulationOffset,min:0,max:1,step:.01,onChange:t=>n("chromaticAberration",{...e,modulationOffset:t})})]})}function $a({pp:o,set:n,open:i,toggle:r}){let{noise:e}=o;return Nt(W,{title:"Noise",tooltip:"Adds film grain or static noise to the rendered image.",open:i.noise,onToggle:()=>r("noise"),disabled:!e.enabled,trailing:F(q,{checked:e.enabled,onChange:t=>n("noise",{...e,enabled:t}),label:"Toggle Noise"}),children:[F(f,{label:"Amount",value:e.opacity,min:0,max:1,step:.01,onChange:t=>n("noise",{...e,opacity:t})}),F(J,{label:"Premultiply",checked:e.premultiply,onChange:t=>n("noise",{...e,premultiply:t})})]})}function _a({pp:o,set:n,open:i,toggle:r}){let{scanline:e}=o;return F(W,{title:"Scan Line",tooltip:"Draws horizontal CRT-style scan lines over the frame.",open:i.scanline,onToggle:()=>r("scanline"),disabled:!e.enabled,trailing:F(q,{checked:e.enabled,onChange:t=>n("scanline",{...e,enabled:t}),label:"Toggle Scanline"}),children:F(f,{label:"Density",value:e.density,min:0,max:10,step:.25,onChange:t=>n("scanline",{...e,density:t})})})}function Ka({pp:o,set:n,open:i,toggle:r}){let{pixelation:e}=o;return F(W,{title:"Pixelation",tooltip:"Reduces detail into larger pixels for a blocky stylized effect.",open:i.pixelation,onToggle:()=>r("pixelation"),disabled:!e.enabled,trailing:F(q,{checked:e.enabled,onChange:t=>n("pixelation",{...e,enabled:t}),label:"Toggle Pixelation"}),children:F(f,{label:"Granularity",value:e.granularity,min:0,max:20,step:1,onChange:t=>n("pixelation",{...e,granularity:t})})})}function Wa({pp:o,set:n,open:i,toggle:r}){let{ramp:e}=o;return Nt(W,{title:"Ramp",tooltip:"Adds a screen-space color gradient, or masks effects earlier in the stack.",open:i.ramp,onToggle:()=>r("ramp"),disabled:!e.enabled,trailing:F(q,{checked:e.enabled,onChange:t=>n("ramp",{...e,enabled:t}),label:"Toggle Ramp"}),children:[F(Be,{label:"Ramp Type",value:e.rampType,options:Zo,onChange:t=>n("ramp",{...e,rampType:t})}),F(dt,{label:"Ramp Start",value:e.rampStart,min:0,max:1,step:.01,onChange:t=>n("ramp",{...e,rampStart:t})}),F(dt,{label:"Ramp End",value:e.rampEnd,min:0,max:1,step:.01,onChange:t=>n("ramp",{...e,rampEnd:t})}),F(Le,{label:"Start Color",value:e.startColor,onChange:t=>n("ramp",{...e,startColor:t})}),F(Le,{label:"End Color",value:e.endColor,onChange:t=>n("ramp",{...e,endColor:t})}),!e.rampMask&&F(f,{label:"Gradient Opacity",value:e.opacity??.5,min:0,max:1,step:.01,onChange:t=>n("ramp",{...e,opacity:t})}),F(f,{label:"Bias",value:e.rampBias,min:0,max:1,step:.01,onChange:t=>n("ramp",{...e,rampBias:t})}),F(f,{label:"Gain",value:e.rampGain,min:0,max:1,step:.01,onChange:t=>n("ramp",{...e,rampGain:t})}),F(J,{label:"Mask Earlier Effects",checked:e.rampMask,onChange:t=>n("ramp",{...e,rampMask:t})}),F(J,{label:"Invert",checked:e.rampInvert,onChange:t=>n("ramp",{...e,rampInvert:t})})]})}import{jsx as ae,jsxs as Xa}from"react/jsx-runtime";function Ya({pp:o,set:n,open:i,toggle:r}){let{outline:e}=o;return Xa(W,{title:"Outline",tooltip:"Draws a visible edge around the selected object binding.",open:i.outline,onToggle:()=>r("outline"),disabled:!e.enabled,trailing:ae(q,{checked:e.enabled,onChange:t=>n("outline",{...e,enabled:t}),label:"Toggle Outline"}),children:[ae("div",{className:"se-placeholder",children:"Outlines the currently selected object binding in the model editor."}),ae(f,{label:"Selection Layer",value:e.selectionLayer,min:0,max:20,step:1,onChange:t=>n("outline",{...e,selectionLayer:t})}),ae(f,{label:"Edge Strength",value:e.edgeStrength,min:0,max:10,step:.1,onChange:t=>n("outline",{...e,edgeStrength:t})}),ae(f,{label:"Pulse Speed",value:e.pulseSpeed,min:0,max:10,step:.1,onChange:t=>n("outline",{...e,pulseSpeed:t})}),ae(Le,{label:"Visible Edge Color",value:e.visibleEdgeColor,onChange:t=>n("outline",{...e,visibleEdgeColor:t})}),ae(Le,{label:"Hidden Edge Color",value:e.hiddenEdgeColor,onChange:t=>n("outline",{...e,hiddenEdgeColor:t})}),ae(Be,{label:"Kernel Size",value:e.kernelSize,options:Lt,onChange:t=>n("outline",{...e,kernelSize:t})}),ae(J,{label:"Blur",checked:e.blur,onChange:t=>n("outline",{...e,blur:t})}),ae(J,{label:"X-Ray",checked:e.xRay,onChange:t=>n("outline",{...e,xRay:t})})]})}function qa({pp:o,set:n,open:i,toggle:r}){let{selectiveBloom:e}=o;return Xa(W,{title:"Selective Bloom",tooltip:"Applies bloom only to objects assigned to the selected layer.",open:i.selectiveBloom,onToggle:()=>r("selectiveBloom"),disabled:!e.enabled,trailing:ae(q,{checked:e.enabled,onChange:t=>n("selectiveBloom",{...e,enabled:t}),label:"Toggle SelectiveBloom"}),children:[ae("div",{className:"se-placeholder",children:"Applies bloom to the currently selected object binding."}),ae(f,{label:"Selection Layer",value:e.selectionLayer,min:0,max:20,step:1,onChange:t=>n("selectiveBloom",{...e,selectionLayer:t})}),ae(f,{label:"Intensity",value:e.intensity,min:0,max:5,step:.05,onChange:t=>n("selectiveBloom",{...e,intensity:t})}),ae(f,{label:"Threshold",value:e.luminanceThreshold,min:0,max:1,step:.01,onChange:t=>n("selectiveBloom",{...e,luminanceThreshold:t})}),ae(f,{label:"Smoothing",value:e.luminanceSmoothing,min:0,max:1,step:.01,onChange:t=>n("selectiveBloom",{...e,luminanceSmoothing:t})}),ae(Be,{label:"Kernel Size",value:e.kernelSize,options:Lt,onChange:t=>n("selectiveBloom",{...e,kernelSize:t})}),ae(J,{label:"Mipmap Blur",checked:e.mipmapBlur,onChange:t=>n("selectiveBloom",{...e,mipmapBlur:t})}),ae(J,{label:"Inverted",checked:e.inverted,onChange:t=>n("selectiveBloom",{...e,inverted:t})}),ae(J,{label:"Ignore Background",checked:e.ignoreBackground,onChange:t=>n("selectiveBloom",{...e,ignoreBackground:t})})]})}function Ja({pp:o,set:n,open:i,toggle:r}){let{smaa:e}=o;return ae(W,{title:"SMAA",tooltip:"Reduces jagged edges with subpixel anti-aliasing.",open:i.smaa,onToggle:()=>r("smaa"),trailing:ae(q,{checked:e.enabled,onChange:t=>n("smaa",{...e,enabled:t}),label:"Toggle SMAA"}),children:ae("div",{className:"se-placeholder",children:"Subpixel Morphological Anti-Aliasing smooths jagged edges in post-process."})})}import{jsx as ie,jsxs as Ts}from"react/jsx-runtime";function $n({config:o,onChange:n}){let[i,r]=Ps({autofocus:!1,colorAverage:!1,dotScreen:!1,glitch:!1,godRays:!1,grid:!1,lensflare:!1,outline:!1,selectiveBloom:!1,ramp:!1,ssao:!1,brightnessContrast:!1,hueSaturation:!1,depthOfField:!1,chromaticAberration:!1,vignette:!1,bloom:!1,toneMapping:!1,noise:!1,sepia:!1,scanline:!1,pixelation:!1,smaa:!1}),e=m=>r(h=>({...h,[m]:!h[m]})),t=o.postProcessing,p={pp:t,set:(m,h)=>n({...o,postProcessing:{...t,[m]:h}}),open:i,toggle:e};return Ts("div",{className:"se-generalContent",children:[ie(Ba,{...p}),ie(Ra,{...p}),ie(La,{...p}),ie(Ha,{...p}),ie(Ga,{...p}),ie(Aa,{...p}),ie(Va,{...p}),ie(Ma,{...p}),ie(Ya,{...p}),ie(qa,{...p}),ie(Oa,{...p}),ie(Ea,{...p}),ie(za,{...p}),ie(Ua,{...p}),ie(ja,{...p}),ie(Da,{...p}),ie(Fa,{...p}),ie($a,{...p}),ie(Ia,{...p}),ie(_a,{...p}),ie(Ka,{...p}),ie(Wa,{...p}),ie(Ja,{...p})]})}import{useState as Za,useSyncExternalStore as Bs}from"react";import{Eye as Rs,EyeOff as As,Plus as Ms,Trash2 as zs}from"lucide-react";import{Fragment as Qa,jsx as j,jsxs as Re}from"react/jsx-runtime";var Ls=["512","1024","2048","4096"],ei={none:"None",directional:"Direction",point:"Point",spot:"Spot",hemisphere:"Hemi"};function Os({index:o,light:n,selected:i,onSelect:r,onToggleVisible:e}){return Re("div",{className:`se-lightRow ${i?"se-lightRow--active":""}`,onClick:r,children:[Re("span",{className:"se-lightRowLabel",children:[o+1,": ",ei[n.type]]}),j("button",{type:"button",className:"se-iconButton","aria-label":n.visible?"Hide light":"Show light",onClick:t=>{t.stopPropagation(),e()},children:n.visible?j(Rs,{size:14}):j(As,{size:14})})]})}function Es(){return{id:crypto.randomUUID(),type:"directional",color:"#ffffff",intensity:1,position:[5,10,5],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0}}function _n({config:o,onChange:n}){let[i,r]=Za({lights:!0,shadows:!1,groundShadows:!1,environment:!1,envShadow:!1}),e=Bs(da,ba),[t,u]=Za(o.lighting.lights[0]?.id??null),p=e??t,m=a=>{u(a),la(a)},h=a=>r(L=>({...L,[a]:!L[a]})),{tier:k}=tt(),d=Ye(k,"starter"),{lighting:g,shadows:M,groundShadows:B,environment:N}=o,O=a=>n({...o,lighting:a}),T=a=>n({...o,shadows:a}),l=a=>n({...o,groundShadows:a}),S=a=>n({...o,environment:a}),P=(a,L)=>{O({...g,lights:g.lights.map(z=>z.id===a?{...z,...L}:z)})},v=g.lights.find(a=>a.id===p)??null,D=()=>{let a=Es();O({...g,lights:[...g.lights,a]}),m(a.id)},b=()=>{if(!v)return;let a=g.lights.filter(L=>L.id!==v.id);O({...g,lights:a}),m(a[0]?.id??null)};return Re("div",{className:"se-generalContent",children:[Re(W,{title:"Lights",open:i.lights,onToggle:()=>h("lights"),children:[j("div",{className:"se-lightList",children:g.lights.map((a,L)=>j(Os,{index:L,light:a,selected:a.id===p,onSelect:()=>m(a.id),onToggleVisible:()=>P(a.id,{visible:!a.visible})},a.id))}),Re("div",{className:"se-lightActions",children:[j("button",{type:"button",className:"se-iconButton",onClick:D,title:"Add light",children:j(Ms,{size:14})}),v&&g.lights.length>1&&j("button",{type:"button",className:"se-iconButton",onClick:b,title:"Remove selected light",children:j(zs,{size:14})})]}),v?Re("div",{className:"se-lightProps",children:[Re("div",{className:"se-field",children:[j("span",{className:"se-fieldLabel",children:"Type"}),j("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:Yo.map(a=>j("button",{type:"button",className:`se-segmentedOption ${v.type===a?"se-segmentedOption--active":""}`,onClick:()=>P(v.id,{type:a}),children:ei[a]},a))})]}),j(Le,{label:"Color",value:v.color,onChange:a=>P(v.id,{color:a})}),j(f,{label:"Intensity",value:v.intensity,min:0,max:10,step:.1,onChange:a=>P(v.id,{intensity:a})}),v.type!=="hemisphere"&&v.type!=="none"&&j(nt,{label:"Position",value:v.position,min:-100,max:100,step:.05,onChange:a=>P(v.id,{position:a})}),v.type==="spot"&&Re(Qa,{children:[j(f,{label:"Angle",value:v.angle??Math.PI/6,min:0,max:Math.PI/2,step:.01,formatValue:a=>`${Math.round(a*180/Math.PI)}\xB0`,onChange:a=>P(v.id,{angle:a})}),j(f,{label:"Penumbra",value:v.penumbra??.2,min:0,max:1,step:.01,onChange:a=>P(v.id,{penumbra:a})}),j(f,{label:"Distance",value:v.distance??0,min:0,max:100,step:.5,onChange:a=>P(v.id,{distance:a})}),j(f,{label:"Decay",value:v.decay??2,min:0,max:4,step:.1,onChange:a=>P(v.id,{decay:a})})]}),j(J,{label:"Attached to camera",checked:v.attachedToCamera,onChange:a=>P(v.id,{attachedToCamera:a})}),j(J,{label:"Cast shadows",checked:v.castShadow,onChange:a=>P(v.id,{castShadow:a})}),j(f,{label:"Shadow bias",value:v.shadowBias,min:-.01,max:.01,step:1e-4,onChange:a=>P(v.id,{shadowBias:a})})]}):null]}),Re(W,{title:"Shadows",open:i.shadows,onToggle:()=>h("shadows"),disabled:!M.enabled,trailing:j(q,{checked:M.enabled,onChange:a=>T({...M,enabled:a}),label:"Toggle shadows"}),children:[j(Be,{label:"Map size",value:String(M.mapSize),options:Ls,onChange:a=>T({...M,mapSize:Number(a)})}),j(f,{label:"Bias",value:M.bias,min:-.01,max:.01,step:1e-4,onChange:a=>T({...M,bias:a})}),j(f,{label:"Normal bias",value:M.normalBias,min:0,max:.2,step:.01,onChange:a=>T({...M,normalBias:a})}),j(f,{label:"Radius (softness)",value:M.radius,min:0,max:20,step:.5,onChange:a=>T({...M,radius:a})})]}),Re(W,{title:"Ground Shadows",open:i.groundShadows,onToggle:()=>h("groundShadows"),disabled:!B.enabled,trailing:j(q,{checked:B.enabled,onChange:a=>l({...B,enabled:a}),label:"Toggle ground shadows"}),children:[Re("div",{className:"se-field",children:[j("span",{className:"se-fieldLabel",children:"Mode"}),j("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:["shadowCatcher"].map(a=>j("button",{type:"button",className:`se-segmentedOption ${B.mode===a?"se-segmentedOption--active":""}`,onClick:()=>l({...B,mode:a}),children:a==="shadowCatcher"?"Shadow Catcher":"Baked AO"},a))})]}),B.mode==="bakedAO"&&j("div",{className:"se-placeholder",children:"Requires pre-baked AO textures \u2014 not yet available."}),j(f,{label:"Intensity",value:B.intensity,min:0,max:1,step:.01,onChange:a=>l({...B,intensity:a})}),j(f,{label:"Border fade",value:B.borderFade,min:0,max:10,step:.1,onChange:a=>l({...B,borderFade:a})}),j(f,{label:"Height",value:B.height,min:-5,max:5,step:.1,onChange:a=>l({...B,height:a})}),j(f,{label:"Size",value:B.size,min:1,max:50,step:.5,onChange:a=>l({...B,size:a})})]}),j(W,{title:"Environment",open:i.environment,onToggle:()=>h("environment"),children:d?Re(Qa,{children:[j(f,{label:"Orientation",value:N.rotation,min:0,max:360,step:1,formatValue:a=>`${a}\xB0`,onChange:a=>S({...N,rotation:a})}),j(f,{label:"Brightness",value:N.intensity,min:0,max:3,step:.05,onChange:a=>S({...N,intensity:a})}),Re(W,{title:"Shadow",open:i.envShadow,onToggle:()=>h("envShadow"),trailing:j(q,{checked:N.shadowLight.enabled,onChange:a=>S({...N,shadowLight:{...N.shadowLight,enabled:a}}),label:"Toggle environment shadow light"}),disabled:!N.shadowLight.enabled,children:[j(f,{label:"Light intensity",value:N.shadowLight.intensity,min:0,max:20,step:.1,onChange:a=>S({...N,shadowLight:{...N.shadowLight,intensity:a}})}),j(f,{label:"Shadow bias",value:N.shadowLight.bias,min:-.01,max:.01,step:1e-4,onChange:a=>S({...N,shadowLight:{...N.shadowLight,bias:a}})})]})]}):j(Pe,{requiredTier:"starter",feature:"Environment lighting"})})]})}import{useMemo as js,useState as Ds}from"react";import{ChevronDown as Fs,Pause as Is,Play as Hs,Square as Gs,Trash2 as Vs}from"lucide-react";import{jsx as Y,jsxs as re}from"react/jsx-runtime";function Us(o){if(!Number.isFinite(o)||o<=0)return"Unknown duration";let n=Math.round(o*10)/10;if(n<60)return`${n.toFixed(1)}s`;let i=Math.floor(n/60),r=(n%60).toFixed(1).padStart(4,"0");return`${i}:${r}`}function ti(o){let n=Number.isFinite(o)&&o>0?o:0;if(n<60)return`${n.toFixed(1)}s`;let i=Math.floor(n/60),r=(n%60).toFixed(1).padStart(4,"0");return`${i}:${r}`}function $s(o){return Number.isFinite(o)?Math.min(3,Math.max(.1,Number(o.toFixed(2)))):1}function Kn({config:o,onChange:n,clipDetails:i,currentClip:r,isPlaying:e,time:t,play:u,pause:p,stop:m,setSpeed:h,seek:k}){let[d,g]=Ds(!1),M=js(()=>new Map(i.map(a=>[a.sourceName,a.duration])),[i]),B=o.animations.clips.filter(a=>!a.hidden),N=o.animations.clips.filter(a=>a.hidden),O=(a,L=o.animations.autoplayClip)=>{n({...o,animations:{clips:a(o.animations.clips),autoplayClip:L}})},T=(a,L)=>{O(z=>z.map(de=>de.sourceName===a?L(de):de))},l=(a,L)=>{T(a,z=>({...z,loopMode:L}))},S=(a,L)=>{let z=$s(L);T(a,de=>({...de,speed:z})),r===a&&h(z)},P=(a,L)=>{T(a,z=>({...z,displayName:L}))},v=a=>{let L=o.animations.autoplayClip===a?null:a;n({...o,animations:{...o.animations,autoplayClip:L}})},D=a=>{O(L=>L.map(z=>z.sourceName===a?{...z,hidden:!0}:z),o.animations.autoplayClip===a?null:o.animations.autoplayClip),r===a&&m()},b=a=>{O(L=>L.map(z=>z.sourceName===a?{...z,hidden:!1}:z))};return o.animations.clips.length===0?Y(lt,{title:"Animations",children:Y("div",{className:"se-helperCard",children:"Upload a model with embedded animations to manage playback, naming, autoplay, and per-clip speed here."})}):re(lt,{title:"Animations",children:[B.length===0&&Y("div",{className:"se-helperCard",children:Y("span",{children:"Preview clips directly in the viewer, choose one optional autoplay animation, and use soft delete to hide clips without modifying the GLB."})}),B.length===0?Y("div",{className:"se-placeholder",children:"All animations are currently removed. Restore a clip below to make it available again."}):Y("div",{className:"se-animationList",children:B.map(a=>{let L=r===a.sourceName,z=M.get(a.sourceName)??0;return re("article",{className:`se-animationCard ${L?"se-animationCard--active":""}`,children:[re("div",{className:"se-animationHeader",children:[re("div",{className:"se-animationHeading",children:[re("div",{className:"se-animationTitleRow",children:[Y("span",{className:"se-animationStatus",children:L?e?"Playing":"Paused":"Ready"}),o.animations.autoplayClip===a.sourceName?Y("span",{className:"se-animationBadge",children:"Autoplay"}):null]}),Y("div",{className:"se-animationSource",children:a.sourceName})]}),Y("button",{type:"button",className:"se-animationDangerButton",onClick:()=>D(a.sourceName),title:"Remove animation",children:Y(Vs,{size:16})})]}),re("div",{className:"se-field",children:[Y("span",{className:"se-fieldLabel",children:"Display name"}),Y("input",{className:"se-textInput",value:a.displayName,onChange:ye=>P(a.sourceName,ye.target.value),placeholder:"Animation name"})]}),re("div",{className:"se-animationMeta",children:[Y("span",{children:Us(z)}),Y("span",{children:a.loopMode==="once"?"Play once":"Looping"}),re("span",{children:[a.speed.toFixed(2),"x"]})]}),re("div",{className:"se-animationButtonRow",children:[(()=>{let ye=L&&e;return Y("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:()=>ye?p():u(a.sourceName),"aria-label":ye?"Pause":"Play",title:ye?"Pause":"Play",children:ye?Y(Is,{size:16}):Y(Hs,{size:16})})})(),Y("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:m,disabled:!L,"aria-label":"Stop",title:"Stop",children:Y(Gs,{size:16})})]}),re("div",{className:"se-animationSeekRow",children:[Y("input",{className:"se-slider se-animationSeek",type:"range",min:0,max:Math.max(z,.001),step:.01,value:L?Math.min(t,z):0,disabled:!L||z<=0,onChange:ye=>k(Number(ye.target.value)),"aria-label":"Seek"}),re("span",{className:"se-animationSeekTime",children:[ti(L?Math.min(t,z):0)," / ",ti(z)]})]}),re("div",{className:"se-animationGrid",children:[re("label",{className:"se-field",children:[Y("span",{className:"se-fieldLabel",children:"Loop mode"}),re("select",{className:"se-select",value:a.loopMode,onChange:ye=>l(a.sourceName,ye.target.value),children:[Y("option",{value:"repeat",children:"Loop"}),Y("option",{value:"once",children:"Play Once"})]})]}),re("label",{className:"se-field",children:[re("span",{className:"se-fieldLabel",children:["Speed",re("span",{className:"se-fieldValue",children:[a.speed.toFixed(2),"x"]})]}),re("div",{className:"se-animationSpeedRow",children:[Y("input",{className:"se-slider",type:"range",min:.1,max:3,step:.1,value:a.speed,onChange:ye=>S(a.sourceName,Number(ye.target.value))}),Y("input",{className:"se-numberInput se-animationSpeedInput",type:"number",min:.1,max:3,step:.1,value:a.speed,onChange:ye=>S(a.sourceName,Number(ye.target.value))})]})]})]}),Y("button",{type:"button",className:`se-animationAutoplayButton ${o.animations.autoplayClip===a.sourceName?"se-animationAutoplayButton--active":""}`,onClick:()=>v(a.sourceName),children:o.animations.autoplayClip===a.sourceName?"Disable autoplay":"Set as autoplay"})]},a.sourceName)})}),N.length>0?re("section",{className:"se-removedAnimations",children:[Y("button",{type:"button",className:"se-panelHeader",onClick:()=>g(a=>!a),children:re("span",{className:"se-panelHeaderMain",children:[Y(Fs,{size:16,className:`se-panelChevron ${d?"se-panelChevron--open":""}`}),re("span",{className:"se-panelTitle",children:["Removed Animations (",N.length,")"]})]})}),d?Y("div",{className:"se-removedAnimationList",children:N.map(a=>re("div",{className:"se-removedAnimationRow",children:[re("div",{children:[Y("div",{className:"se-removedAnimationName",children:a.displayName||a.sourceName}),Y("div",{className:"se-animationSource",children:a.sourceName})]}),Y("button",{type:"button",className:"se-animationButton",onClick:()=>b(a.sourceName),children:"Restore"})]},a.sourceName))}):null]}):null]})}import{useState as ni}from"react";import{Pencil as _s,Trash2 as Ks}from"lucide-react";import{jsx as xe,jsxs as Oe}from"react/jsx-runtime";function Wn({config:o,onChange:n}){let[i,r]=ni(null),[e,t]=ni({title:"",description:""}),u=o.annotations,p=d=>{r(d),t({title:d.title,description:d.description||""})},m=()=>{if(!i||!e.title.trim())return;let d=u.map(g=>g.id===i.id?{...g,title:e.title.trim(),description:e.description||""}:g);n({...o,annotations:d}),r(null),t({title:"",description:""})},h=d=>{if(window.confirm("Delete this annotation?")){let M=u.filter(B=>B.id!==d).map((B,N)=>({...B,id:N+1}));n({...o,annotations:M}),r(null),t({title:"",description:""})}},k=()=>{r(null),t({title:"",description:""})};return Oe(lt,{title:"Annotations",children:[o.annotations.length===0?xe("div",{className:"bb-emptyAnnotations",children:"No annotations yet. Double-click on the model to add one."}):xe("div",{className:"bb-annotationsList",children:o.annotations.map(d=>Oe("div",{className:"bb-annotationCard",children:[Oe("div",{className:"bb-annotationHeader",children:[Oe("div",{className:"bb-annotationBadge",children:["#",d.id]}),Oe("div",{className:"bb-annotationActions",children:[xe("button",{className:"bb-annotationAction bb-annotationAction--edit",onClick:()=>p(d),title:"Edit annotation",children:xe(_s,{size:16})}),xe("button",{className:"bb-annotationAction bb-annotationAction--delete",onClick:()=>h(d.id),title:"Delete annotation",children:xe(Ks,{size:16})})]})]}),xe("div",{className:"bb-annotationTitle",children:d.title}),d.description&&xe("div",{className:"bb-annotationDescription",children:d.description}),Oe("div",{className:"bb-annotationPosition",children:["Position: [",d.worldPosition[0].toFixed(2),","," ",d.worldPosition[1].toFixed(2),","," ",d.worldPosition[2].toFixed(2),"]"]})]},d.id))}),i&&xe("div",{className:"bb-editAnnotationOverlay",onClick:k,children:Oe("div",{className:"bb-editAnnotationPopup",onClick:d=>d.stopPropagation(),children:[Oe("div",{className:"bb-editAnnotationHeader",children:[xe("h3",{className:"bb-editAnnotationTitle",children:"Edit Annotation"}),xe("button",{className:"bb-editAnnotationClose",onClick:k,children:"\xD7"})]}),Oe("div",{className:"bb-editAnnotationBody",children:[Oe("div",{className:"bb-field",children:[xe("label",{className:"bb-label",children:"Title"}),xe("input",{className:"bb-input",value:e.title,onChange:d=>t({...e,title:d.target.value}),placeholder:"Enter annotation title"})]}),Oe("div",{className:"bb-field",children:[xe("label",{className:"bb-label",children:"Description"}),xe("textarea",{className:"bb-textarea",value:e.description,onChange:d=>t({...e,description:d.target.value}),placeholder:"Enter annotation description",rows:3})]}),Oe("div",{className:"bb-editAnnotationActions",children:[xe("button",{className:"bb-button",onClick:k,children:"Cancel"}),xe("button",{className:"bb-button bb-button--primary",onClick:m,disabled:!e.title.trim(),children:"Save"}),xe("button",{className:"bb-button bb-button--danger",onClick:()=>h(i.id),children:"Delete"})]})]})]})})]})}import{useState as Ws,useCallback as bt}from"react";import{ArrowDown as Ys,ArrowUp as qs,MapPin as Js,Plus as Xs,Trash2 as Zs,Settings as Qs}from"lucide-react";import{Fragment as tl,jsx as X,jsxs as ue}from"react/jsx-runtime";var el={enabled:!0,waypoints:[],loop:!0,autoPlay:!1},ct=3.5;function Yn({config:o,onChange:n,cameraState:i,onPreviewWaypoint:r}){let e=o.cinematic??el,{waypoints:t}=e,u=bt((T,l)=>{if(T.length<2)return 0;let S=0;for(let P=0;P<T.length-1;P++){let v=T[P].segmentDuration??ct;S+=v}return l&&T.length>1&&(S+=T[T.length-1].segmentDuration??ct),Math.max(S,0)},[]),p=bt(T=>{n({...o,cinematic:{...e,...T}})},[o,e,n]),m=bt(()=>{if(!i)return;let T={position:[...i.position],target:[...i.target],...i.azimuthAngle!=null?{azimuthAngle:i.azimuthAngle}:{},...i.polarAngle!=null?{polarAngle:i.polarAngle}:{},segmentDuration:ct},l=[...t,T],S=u(l,e.loop);p({waypoints:l,duration:S})},[i,t,e.loop,u,p]),h=bt(T=>{let l=t.filter((P,v)=>v!==T),S=u(l,e.loop);p({waypoints:l,duration:S})},[t,e.loop,u,p]),k=bt((T,l)=>{let S=T+l;if(S<0||S>=t.length)return;let P=[...t];[P[T],P[S]]=[P[S],P[T]];let v=u(P,e.loop);p({waypoints:P,duration:v})},[t,e.loop,u,p]),d=bt((T,l)=>{let S=t.map((v,D)=>D===T?{...v,...l}:v),P=u(S,e.loop);p({waypoints:S,duration:P})},[t,e.loop,u,p]),[g,M]=Ws(!1),B=t.some(T=>T.segmentDuration!==void 0),N=bt(T=>T>=t.length-1?ct:t[T]?.segmentDuration??ct,[t]),O=t.length>=2;return ue(lt,{title:"Cinematic Camera",children:[X("p",{className:"se-cinematicHint",children:"Frame the model in the viewer, then capture it as a waypoint. The camera glides through the waypoints in order \u2014 enable and press play in the viewer to preview."}),ue("button",{type:"button",className:"bb-button bb-button--primary se-cinematicAdd",onClick:m,disabled:!i,title:"Capture the current camera view as a waypoint",children:[X(Xs,{size:15}),"Add waypoint from current view"]}),ue("div",{className:"se-customizeToggle",children:[ue("label",{className:"se-toggleLabel",children:[X("input",{type:"checkbox",checked:g,onChange:T=>M(T.target.checked)}),X(Qs,{size:14}),X("span",{children:"Customize durations between waypoints"})]}),g&&ue("span",{className:"se-toggleHint",children:["Set duration for each segment between waypoints: 1\u21922, 2\u21923, etc. Default: ",ct,"s"]})]}),t.length===0?X("div",{className:"bb-emptyAnnotations",children:"No waypoints yet. Position the camera and add your first one."}):ue(tl,{children:[X("div",{className:"se-waypointList",children:t.map((T,l)=>{let S=N(l),P=l===t.length-1,v=T.segmentDuration!==void 0&&T.segmentDuration!==ct;return ue("div",{children:[ue("div",{className:"se-waypointCard",children:[X("div",{className:"se-waypointBadge",children:l+1}),ue("div",{className:"se-waypointBody",children:[ue("div",{className:"se-waypointCoords",children:["pos [",T.position.map(D=>D.toFixed(1)).join(", "),"]"]}),ue("div",{className:"se-waypointCoords",children:["look [",T.target.map(D=>D.toFixed(1)).join(", "),"]"]}),g&&!P&&ue("div",{className:`se-customBadge ${v?"se-customBadge--custom":"se-customBadge--default"}`,children:[S.toFixed(1),"s",!v&&" (default)"]})]}),ue("div",{className:"se-waypointActions",children:[X("button",{className:"se-waypointAction",onClick:()=>r?.(T),title:"Fly camera to this waypoint",disabled:!r,children:X(Js,{size:15})}),X("button",{className:"se-waypointAction",onClick:()=>k(l,-1),title:"Move up",disabled:l===0,children:X(qs,{size:15})}),X("button",{className:"se-waypointAction",onClick:()=>k(l,1),title:"Move down",disabled:P,children:X(Ys,{size:15})}),X("button",{className:"se-waypointAction se-waypointAction--delete",onClick:()=>h(l),title:"Delete waypoint",children:X(Zs,{size:15})})]})]}),g&&!P&&ue("div",{className:"se-segmentBetween",children:[ue("div",{className:"se-segmentLabel",children:[l+1," \u2192 ",l+2,!T.segmentDuration&&" (default)"]}),ue("div",{className:"se-segmentControls",children:[X("span",{className:"se-durationLabel",children:"Duration:"}),X("input",{type:"range",className:"se-segmentSlider",min:1,max:20,step:.5,value:S,onChange:D=>{let b=parseFloat(D.target.value);d(l,{segmentDuration:b})}}),ue("span",{className:"se-segmentValue",children:[S.toFixed(1),"s"]}),ue("div",{className:"se-presetButtons",children:[[2,4,6,8].map(D=>ue("button",{className:"se-presetButton",onClick:()=>d(l,{segmentDuration:D}),children:[D,"s"]},`preset-${l}-${D}`)),X("button",{className:"se-presetButton se-presetButton--default",onClick:()=>{let D=t.map((a,L)=>{if(L===l){let{segmentDuration:z,...de}=a;return de}return a}),b=u(D,e.loop);p({waypoints:D,duration:b})},children:"Reset"})]})]})]})]},`waypoint-wrapper-${l}`)})}),ue("div",{className:"se-totalDuration",children:[X("span",{className:"se-totalLabel",children:"Total duration:"}),X("span",{className:"se-totalValue",children:O?(e.duration??u(t,e.loop)).toFixed(1)+"s":"-"}),!O&&X("span",{className:"se-totalHint",children:"(need at least 2 waypoints)"})]})]}),X(J,{label:"Enable cinematic camera",checked:e.enabled,onChange:T=>p({enabled:T})}),X(J,{label:"Loop",checked:e.loop,onChange:T=>{let l=T,S=u(t,l);p({loop:l,duration:S})}}),X(J,{label:"Auto-play on load",checked:e.autoPlay,onChange:T=>p({autoPlay:T})}),!g&&O&&X(f,{label:"Duration",value:e.duration??u(t,e.loop),min:4,max:120,step:1,formatValue:T=>`${T}s`,onChange:T=>p({duration:T})})]})}import{Box as al,Clapperboard as il,MessageSquareText as rl,Sparkles as sl,Spotlight as ll,Video as dl}from"lucide-react";import{jsx as ve,jsxs as cl}from"react/jsx-runtime";var bl=[{label:"General",icon:ve(al,{})},{label:"Lighting",icon:ve(ll,{})},{label:"Animations",icon:ve(il,{})},{label:"Post Processing",icon:ve(sl,{})},{label:"Annotations",icon:ve(rl,{})},{label:"Cinematic",icon:ve(dl,{})}],oi={currentClip:null,isPlaying:!1,time:0,duration:0,play:()=>{},pause:()=>{},stop:()=>{},setSpeed:()=>{},seek:()=>{}};function qn({config:o,onChange:n,activeSubTab:i,onActiveSubTabChange:r,cameraState:e=null,onPreviewWaypoint:t,animationClipDetails:u=[],animationPlayback:p=oi}){let[m,h]=nl("General"),k=i??m,d=p??oi,{tier:g}=tt(),M=Ye(g,"starter"),B=Ye(g,"growth");ol(()=>{i!==void 0&&h(i)},[i]);let N=O=>{i===void 0&&h(O),r?.(O)};return cl("div",{className:"se-tabContent",children:[ve("div",{className:"se-subTabRow",children:bl.map(O=>ve("button",{type:"button",title:O.label,className:`se-subTab ${k===O.label?"se-subTab--active":""}`,onClick:()=>N(O.label),children:O.icon},O.label))}),k==="General"&&ve(Un,{config:o,onChange:n}),k==="Lighting"&&ve(_n,{config:o,onChange:n}),k==="Animations"&&(M?ve(Kn,{config:o,onChange:n,clipDetails:u,currentClip:d.currentClip,isPlaying:d.isPlaying,time:d.time,duration:d.duration,play:d.play,pause:d.pause,stop:d.stop,setSpeed:d.setSpeed,seek:d.seek}):ve(Pe,{requiredTier:"starter",feature:"Animation configuration"})),k==="Post Processing"&&(B?ve($n,{config:o,onChange:n}):ve(Pe,{requiredTier:"growth",feature:"Post-processing effects"})),k==="Annotations"&&(M?ve(Wn,{config:o,onChange:n}):ve(Pe,{requiredTier:"starter",feature:"Annotations"})),k==="Cinematic"&&(M?ve(Yn,{config:o,onChange:n,cameraState:e,onPreviewWaypoint:t}):ve(Pe,{requiredTier:"starter",feature:"Cinematic camera"}))]})}import{ChevronDown as ai,Info as ii}from"lucide-react";import{jsx as ke,jsxs as pt}from"react/jsx-runtime";function ri({title:o,trailing:n,children:i,disabled:r,open:e,onToggle:t,tooltip:u}){let p=u?`${u}`:o;return pt("div",{className:"bb-materialPanel",children:[pt("button",{type:"button",className:"bb-materialPanelHeader",onClick:t,"aria-expanded":e,title:p,children:[pt("div",{className:"bb-materialPanelTitleWrap",children:[ke(ai,{size:14,className:`bb-materialPanelChevron ${e?"bb-materialPanelChevron--open":""}`}),ke("span",{className:"bb-materialPanelTitle",children:o}),u?ke("span",{className:"bb-materialPanelHelp",title:p,"aria-label":p,role:"img",onClick:m=>m.stopPropagation(),children:ke(ii,{size:12})}):null]}),n?ke("div",{onClick:m=>m.stopPropagation(),children:n}):null]}),e?ke("div",{className:"bb-materialPanelBody",style:r?{opacity:.45,pointerEvents:"none"}:void 0,children:i}):null]})}function Te({title:o,open:n,onToggle:i,trailing:r,children:e,tooltip:t}){let u=t?`${o}: ${t}`:o;return pt("div",{className:"bb-section",children:[pt("button",{type:"button",className:"bb-sectionHeaderButton",onClick:i,"aria-expanded":n,title:u,children:[pt("span",{className:"bb-sectionHeaderMain",children:[ke(ai,{size:15,className:`bb-sectionChevron ${n?"bb-sectionChevron--open":""}`}),ke("h2",{className:"bb-sectionTitle",children:o}),t?ke("span",{className:"bb-sectionHelp",title:u,"aria-label":u,role:"img",onClick:p=>p.stopPropagation(),children:ke(ii,{size:13})}):null]}),r?ke("span",{onClick:p=>p.stopPropagation(),children:r}):null]}),n?ke("div",{className:"bb-sectionBody",children:e}):null]})}function si({checked:o,onChange:n,label:i}){return pt("label",{className:"se-switch","aria-label":i,children:[ke("input",{type:"checkbox",checked:o,onChange:r=>n(r.target.checked)}),ke("span",{className:"se-switchTrack",children:ke("span",{className:"se-switchThumb"})})]})}import{useState as bi}from"react";import{Trash2 as vl}from"lucide-react";import{jsx as Jn}from"react/jsx-runtime";function Ae({panelKey:o,title:n,tooltip:i,toggleLabel:r,controls:e,children:t,requiredTier:u}){let{openMaterialPanels:p,materialPanelEnabled:m,onToggleMaterialPanel:h,onSetMaterialPanelState:k}=e,d=u?.locked??!1;return Jn(ri,{title:n,tooltip:i,disabled:d||!m[o],open:p[o],onToggle:()=>h(o),trailing:Jn(si,{checked:!d&&m[o],onChange:d?()=>{}:g=>k(o,g),label:r??`Toggle ${n}`}),children:d&&u?Jn(Pe,{requiredTier:u.tier,feature:n}):t})}import{useRef as li,useState as pl}from"react";import{HexColorInput as ul,HexColorPicker as ml}from"react-colorful";import{FileUp as gl,Minus as fl,Plus as hl}from"lucide-react";import{jsx as Z,jsxs as Ue}from"react/jsx-runtime";function me({label:o,value:n,placeholder:i,onChange:r}){let e=li(null);return Ue("div",{className:"bb-field bb-field--full",children:[Z("label",{className:"bb-label",children:o}),Ue("div",{className:"bb-fileField",children:[Z("input",{className:"bb-input bb-fileField-input",placeholder:i,value:n,onChange:t=>{let u=t.target.value;!u&&n&&jn(n),r(u)}}),Z("button",{type:"button",className:"bb-fileFieldButton",onClick:()=>e.current?.click(),"aria-label":`Select file for ${o}`,title:`Select file for ${o}`,children:Z(gl,{size:20})}),Z("input",{ref:e,type:"file",accept:"image/png,image/jpeg,image/webp,image/avif",className:"bb-hiddenInput",onChange:t=>{let u=t.target.files?.[0];if(!u)return;let p=Qo(u);n&&n!==p&&jn(n),ln(p,URL.createObjectURL(u)),r(p),t.target.value=""}})]})]})}function ut({label:o,value:n,fallback:i="#ffffff",onChange:r}){let[e,t]=pl(!1),u=n||i,p=li(null);return Ue("div",{className:"bb-field",children:[Z("span",{className:"bb-label",children:o}),Z("div",{className:"se-fieldInline",children:Z("span",{ref:p,style:{display:"inline-flex"},children:Z(ul,{prefixed:!0,className:"se-swatch",onClick:()=>t(m=>!m),style:{background:u,color:St(u)},color:u,onChange:r})})}),e?Z(Gn,{anchorRef:p,onClose:()=>t(!1),children:Z(ml,{color:u,onChange:r})}):null]})}function Ft({label:o,checked:n,onChange:i}){return Ue("label",{className:"bb-checkbox",children:[Z("input",{type:"checkbox",checked:n,onChange:r=>i(r.target.checked)}),o]})}function di({label:o,value:n,min:i,max:r,step:e,placeholder:t,disabled:u,onChange:p}){return Ue("div",{className:"bb-field",children:[Z("label",{className:"bb-label",children:o}),Z("input",{className:"bb-input",type:"number",min:i,max:r,step:e,placeholder:t,disabled:u,value:n??"",onChange:m=>p(m.target.value===""?void 0:Number(m.target.value))})]})}function xl(o,n){let i=n<1?Math.ceil(-Math.log10(n)):0,r=10**Math.max(i,0);return Math.round(o*r)/r}function Xn({label:o,value:n,min:i,max:r,step:e=.01,disabled:t,onChange:u}){let p=n??0,m=k=>{let d=k;return i!==void 0&&(d=Math.max(i,d)),r!==void 0&&(d=Math.min(r,d)),d},h=k=>{u(m(xl(p+k*e,e)))};return Ue("div",{className:"bb-field",children:[Z("label",{className:"bb-label",children:o}),Ue("div",{className:"bb-numberStepper",children:[Z("button",{type:"button",className:"bb-numberStepper-btn",disabled:t,onClick:()=>h(-1),"aria-label":`Decrease ${o}`,title:`Decrease ${o}`,children:Z(fl,{size:12})}),Z("input",{className:"bb-input bb-numberStepper-input",type:"number",min:i,max:r,step:e,disabled:t,value:p,onChange:k=>{k.target.value!==""&&u(m(Number(k.target.value)))}}),Z("button",{type:"button",className:"bb-numberStepper-btn",disabled:t,onClick:()=>h(1),"aria-label":`Increase ${o}`,title:`Increase ${o}`,children:Z(hl,{size:12})})]})]})}function Pt({label:o,value:n,options:i,onChange:r}){return Ue("div",{className:"bb-field",children:[Z("label",{className:"bb-label",children:o}),Z("select",{className:"bb-select",value:n,onChange:e=>r(e.target.value),children:i.map(e=>Z("option",{value:e,children:e},e))})]})}function te({label:o,value:n,min:i,max:r,step:e,onChange:t}){return Ue("div",{className:"bb-field bb-field--full",children:[Z("label",{className:"bb-label",children:o}),Ue("div",{className:"bb-sliderField",children:[Z("input",{className:`bb-slider ${n===void 0?"bb-slider--unset":""}`,type:"range",min:i,max:r,step:e,value:n??i,onChange:p=>t(Number(p.target.value))}),Z("input",{className:"bb-input bb-input--compact",type:"number",min:i,max:r,step:e,value:n??"",onChange:p=>t(p.target.value===""?void 0:Number(p.target.value))})]})]})}import{Fragment as Zn,jsx as w,jsxs as se}from"react/jsx-runtime";function ci({selectedItem:o,selectedMaterial:n,pbrWorkflow:i,onPbrWorkflowChange:r,openMaterialPanels:e,materialPanelEnabled:t,onToggleMaterialPanel:u,onSetMaterialPanelState:p,updateSelectedMaterial:m,setSelectedTexturePath:h,isTexturePositioningEnabled:k,onConfirmTexturePosition:d}){let g={openMaterialPanels:e,materialPanelEnabled:t,onToggleMaterialPanel:u,onSetMaterialPanelState:p},{tier:M}=tt(),B=Ye(M,"starter"),N={tier:"starter",locked:!B},[O,T]=bi("roughness"),[l,S]=bi("factor"),P=(b,a)=>{m(o,L=>{if(!L?.texture?.path)return L??{};let z=L.texture.offset??[0,0],de=[z[0],z[1]];return de[b]=a,{...L,texture:{...L.texture,offset:de}}})},v=b=>{m(o,a=>{if(!a?.texture?.path)return a??{};let L=(b%360+360)%360;return{...a,texture:{...a.texture,rotation:L*Math.PI/180}}})},D=()=>{h(o,"texture","")};return se(Zn,{children:[w(Ae,{panelKey:"pbr",title:"PBR Maps",tooltip:"Controls the base color and workflow used for physically based shading.",controls:g,children:B?se("div",{className:"bb-grid",children:[w(Pt,{label:"Workflow",value:i,options:["metalness","specular"],onChange:r}),w("div",{className:"bb-field bb-field--full",children:w("p",{className:"bb-note",style:{margin:0},children:i==="metalness"?"Metalness workflow maps directly to the underlying physical material.":"Specular workflow exposes the same physical material with non-metal specular controls; it does not switch to a separate spec/gloss shader."})}),w(me,{label:i==="specular"?"Albedo texture path":"Base color texture path",placeholder:"materials/oak-wood.jpg",value:n?.texture?.path??"",onChange:b=>h(o,"texture",b)}),n?.texture?.path?se("div",{className:"bb-field bb-field--full",children:[se("div",{className:"bb-fieldLabel",style:{display:"flex",alignItems:"center",justifyContent:"space-between"},children:[w("span",{className:"bb-label",children:"Texture position"}),se("button",{type:"button",className:"bb-button bb-button--ghost",onClick:D,title:"Remove the base color texture and its position offset",children:[w(vl,{size:14,style:{marginRight:4,verticalAlign:"-2px"}}),"Remove texture"]})]}),se("div",{className:"bb-grid",style:{marginTop:6},children:[w(Xn,{label:"Offset X",value:n?.texture?.offset?.[0]??0,step:.01,onChange:b=>P(0,b)}),w(Xn,{label:"Offset Y",value:n?.texture?.offset?.[1]??0,step:.01,onChange:b=>P(1,b)})]}),w(te,{label:"Rotation",value:((n?.texture?.rotation??0)*180/Math.PI%360+360)%360,min:0,max:360,step:1,onChange:b=>v(b??0)}),k?w("button",{type:"button",className:"bb-button bb-button--primary",style:{marginTop:8},onClick:d,title:"Confirm this texture position and exit positioning mode",children:"Done positioning"}):w("p",{className:"bb-note",style:{margin:"6px 0 0"},children:"Double-click the object in the preview to drag its texture directly (scroll to zoom), or edit its offset numerically once positioning."})]}):null,w(ut,{label:i==="specular"?"Albedo color":"Base color",value:n?.baseColor??"#ffffff",onChange:b=>m(o,a=>({...a,baseColor:b}))}),i==="metalness"?se(Zn,{children:[w(te,{label:"Metalness",value:n?.metalness,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,metalness:b}))}),w(me,{label:"Metalness map path",placeholder:"materials/body-metalness.jpg",value:n?.metalnessMap?.path??"",onChange:b=>h(o,"metalnessMap",b)})]}):se(Zn,{children:[w(te,{label:"Specular intensity",value:n?.specularIntensity,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,specularIntensity:b}))}),w(ut,{label:"Specular color",value:n?.specularColor??"#ffffff",onChange:b=>m(o,a=>({...a,specularColor:b}))}),w(me,{label:"Specular intensity map path",placeholder:"materials/body-specular-intensity.jpg",value:n?.specularIntensityMap?.path??"",onChange:b=>h(o,"specularIntensityMap",b)}),w(me,{label:"Specular color map path",placeholder:"materials/body-specular-color.jpg",value:n?.specularColorMap?.path??"",onChange:b=>h(o,"specularColorMap",b)})]}),w(te,{label:"Specular F0 / reflectivity",value:n?.reflectivity,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,reflectivity:b}))})]}):se("div",{className:"bb-grid",children:[w(ut,{label:"Base color",value:n?.baseColor??"#ffffff",onChange:b=>m(o,a=>({...a,baseColor:b}))}),w(te,{label:"Metalness",value:n?.metalness,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,metalness:b}))}),w("div",{className:"bb-field bb-field--full",children:w(Pe,{requiredTier:"starter",feature:"Texture maps, the specular workflow, and reflectivity"})})]})}),w(Ae,{panelKey:"roughness",requiredTier:N,title:"Roughness / Glossiness",tooltip:"Adjusts how matte or shiny the surface appears.",toggleLabel:"Toggle Roughness and Glossiness",controls:g,children:se("div",{className:"bb-grid",children:[w(Pt,{label:"Mode",value:O,options:["roughness","glossiness"],onChange:T}),w("div",{className:"bb-field bb-field--full",children:w("p",{className:"bb-note",style:{margin:0},children:O==="roughness"?"Roughness: 0 is glossy, 1 is matte.":"Glossiness is the inverse of roughness (glossiness = 1 \u2212 roughness)"})}),O==="roughness"?w(te,{label:"Roughness",value:n?.roughness,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,roughness:b}))}):w(te,{label:"Glossiness",value:n?.roughness===void 0?void 0:1-n.roughness,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,roughness:b===void 0?void 0:1-b}))}),w(me,{label:O==="glossiness"?"Glossiness map path (applied as roughness)":"Roughness map path",placeholder:"materials/body-roughness.jpg",value:n?.roughnessMap?.path??"",onChange:b=>h(o,"roughnessMap",b)})]})}),w(Ae,{panelKey:"emission",requiredTier:N,title:"Emission",tooltip:"Makes the material self-illuminated with emissive color and intensity.",controls:g,children:se("div",{className:"bb-grid",children:[w(ut,{label:"Emissive color",value:n?.emissive??"#000000",fallback:"#000000",onChange:b=>m(o,a=>({...a,emissive:b}))}),w(te,{label:"Emissive intensity",value:n?.emissiveIntensity,min:0,max:10,step:.1,onChange:b=>m(o,a=>({...a,emissiveIntensity:b}))}),w(me,{label:"Emissive map path",placeholder:"materials/body-emissive.jpg",value:n?.emissiveMap?.path??"",onChange:b=>h(o,"emissiveMap",b)})]})}),w(Ae,{panelKey:"opacity",requiredTier:N,title:"Opacity",tooltip:"Controls transparency, alpha testing, and blending behavior.",controls:g,children:se("div",{className:"bb-grid",children:[w(te,{label:"Opacity",value:n?.opacity,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,opacity:b}))}),w(te,{label:"Alpha test",value:n?.alphaTest,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,alphaTest:b}))}),w(me,{label:"Alpha map path",placeholder:"materials/body-alpha.png",value:n?.alphaMap?.path??"",onChange:b=>h(o,"alphaMap",b)}),w(Pt,{label:"Blending mode",value:n?.blendingMode??"normal",options:fa,onChange:b=>m(o,a=>({...a,blendingMode:b}))}),se("div",{className:"bb-field",children:[w("label",{className:"bb-label",children:"Alpha hash"}),w("div",{className:"bb-checkboxRow",children:w(Ft,{label:"Use alpha hash",checked:n?.alphaHash??!1,onChange:b=>m(o,a=>({...a,alphaHash:b}))})})]}),se("div",{className:"bb-field",children:[w("label",{className:"bb-label",children:"Dithering"}),w("div",{className:"bb-checkboxRow",children:w(Ft,{label:"Use dithering",checked:n?.dithering??!1,onChange:b=>m(o,a=>({...a,dithering:b}))})})]})]})}),se(Ae,{panelKey:"normalBump",requiredTier:N,title:"Normal & Bump",tooltip:"Adds surface detail without changing the actual mesh shape.",toggleLabel:"Toggle Normal and Bump",controls:g,children:[se("div",{className:"bb-grid",children:[w(me,{label:"Normal map path",placeholder:"materials/body-normal.jpg",value:n?.normalMap?.path??"",onChange:b=>h(o,"normalMap",b)}),w(te,{label:"Normal scale",value:n?.normalScale,min:0,max:5,step:.01,onChange:b=>m(o,a=>({...a,normalScale:b}))}),w(me,{label:"Bump map path",placeholder:"materials/body-bump.jpg",value:n?.bumpMap?.path??"",onChange:b=>h(o,"bumpMap",b)}),w(te,{label:"Bump scale",value:n?.bumpScale,min:0,max:5,step:.01,onChange:b=>m(o,a=>({...a,bumpScale:b}))})]}),w("div",{className:"bb-checkboxRow",style:{marginTop:12},children:w(Ft,{label:"Flip normal Y",checked:n?.flipNormalY??!1,onChange:b=>m(o,a=>({...a,flipNormalY:b}))})})]}),w(Ae,{panelKey:"displacement",requiredTier:N,title:"Displacement",tooltip:"Offsets geometry using a texture to create real surface height.",controls:g,children:se("div",{className:"bb-grid",children:[w(me,{label:"Displacement map path",placeholder:"materials/body-displacement.jpg",value:n?.displacementMap?.path??"",onChange:b=>h(o,"displacementMap",b)}),w(te,{label:"Displacement scale",value:n?.displacementScale,min:-5,max:5,step:.01,onChange:b=>m(o,a=>({...a,displacementScale:b}))}),w(te,{label:"Displacement bias",value:n?.displacementBias,min:-5,max:5,step:.01,onChange:b=>m(o,a=>({...a,displacementBias:b}))})]})}),w(Ae,{panelKey:"ao",requiredTier:N,title:"Ambient Occlusion",tooltip:"Darkens creases and contact areas to add depth.",controls:g,children:se("div",{className:"bb-grid",children:[w(me,{label:"AO map path",placeholder:"materials/body-ao.jpg",value:n?.aoMap?.path??"",onChange:b=>h(o,"aoMap",b)}),w(te,{label:"AO intensity",value:n?.aoMapIntensity,min:0,max:5,step:.01,onChange:b=>m(o,a=>({...a,aoMapIntensity:b}))})]})}),se(Ae,{panelKey:"clearcoat",requiredTier:N,title:"Clearcoat",tooltip:"Adds a glossy protective layer on top of the base material.",controls:g,children:[se("div",{className:"bb-grid",children:[w(me,{label:"Clearcoat map path",placeholder:"materials/body-clearcoat.jpg",value:n?.clearcoatMap?.path??"",onChange:b=>h(o,"clearcoatMap",b)}),w(te,{label:"Clearcoat",value:n?.clearcoat,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,clearcoat:b}))}),w(me,{label:"Clearcoat roughness map path",placeholder:"materials/body-clearcoat-roughness.jpg",value:n?.clearcoatRoughnessMap?.path??"",onChange:b=>h(o,"clearcoatRoughnessMap",b)}),w(te,{label:"Clearcoat roughness",value:n?.clearcoatRoughness,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,clearcoatRoughness:b}))}),w(me,{label:"Clearcoat normal map path",placeholder:"materials/body-clearcoat-normal.jpg",value:n?.clearcoatNormalMap?.path??"",onChange:b=>h(o,"clearcoatNormalMap",b)}),w(te,{label:"Clearcoat normal scale",value:n?.clearcoatNormalScale,min:0,max:5,step:.01,onChange:b=>m(o,a=>({...a,clearcoatNormalScale:b}))})]}),w("div",{className:"bb-checkboxRow",style:{marginTop:12},children:w(Ft,{label:"Flip clearcoat normal Y",checked:n?.flipClearcoatNormalY??!1,onChange:b=>m(o,a=>({...a,flipClearcoatNormalY:b}))})})]}),w(Ae,{panelKey:"sheen",requiredTier:N,title:"Sheen",tooltip:"Adds a soft fabric-like sheen on grazing angles.",controls:g,children:se("div",{className:"bb-grid",children:[w(te,{label:"Sheen",value:n?.sheen,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,sheen:b}))}),w(ut,{label:"Sheen color",value:n?.sheenColor??"#ffffff",onChange:b=>m(o,a=>({...a,sheenColor:b}))}),w(me,{label:"Sheen color map path",placeholder:"materials/body-sheen-color.jpg",value:n?.sheenColorMap?.path??"",onChange:b=>h(o,"sheenColorMap",b)}),w(te,{label:"Sheen roughness",value:n?.sheenRoughness,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,sheenRoughness:b}))}),w(me,{label:"Sheen roughness map path",placeholder:"materials/body-sheen-roughness.jpg",value:n?.sheenRoughnessMap?.path??"",onChange:b=>h(o,"sheenRoughnessMap",b)})]})}),w(Ae,{panelKey:"anisotropy",requiredTier:N,title:"Anisotropy",tooltip:"Stretches reflections in one direction for brushed or fiber-like surfaces.",controls:g,children:se("div",{className:"bb-grid",children:[w(te,{label:"Intensity",value:n?.anisotropy,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,anisotropy:b}))}),w(Pt,{label:"Tilt direction",value:l,options:["factor","texture"],onChange:S}),l==="factor"?w(te,{label:"Rotation (rad)",value:n?.anisotropyRotation,min:0,max:6.28,step:.01,onChange:b=>m(o,a=>({...a,anisotropyRotation:b}))}):w(me,{label:"Anisotropy map path",placeholder:"materials/body-anisotropy.jpg",value:n?.anisotropyMap?.path??"",onChange:b=>h(o,"anisotropyMap",b)})]})}),w(Ae,{panelKey:"transmission",requiredTier:N,title:"Transmission & Volume",tooltip:"Controls glass-like transmission and how light travels through volume.",toggleLabel:"Toggle Transmission and Volume",controls:g,children:se("div",{className:"bb-grid",children:[w(te,{label:"Transmission",value:n?.transmission,min:0,max:1,step:.01,onChange:b=>m(o,a=>({...a,transmission:b}))}),w(me,{label:"Transmission map path",placeholder:"materials/body-transmission.jpg",value:n?.transmissionMap?.path??"",onChange:b=>h(o,"transmissionMap",b)}),w(te,{label:"Thickness",value:n?.thickness,min:0,max:5,step:.01,onChange:b=>m(o,a=>({...a,thickness:b}))}),w(me,{label:"Thickness map path",placeholder:"materials/body-thickness.jpg",value:n?.thicknessMap?.path??"",onChange:b=>h(o,"thicknessMap",b)}),w(ut,{label:"Volume tint",value:n?.attenuationColor??"#ffffff",onChange:b=>m(o,a=>({...a,attenuationColor:b}))}),w(di,{label:"Attenuation distance",value:n?.attenuationDistance,min:0,step:.01,placeholder:"Infinity when unset",onChange:b=>m(o,a=>({...a,attenuationDistance:b}))})]})}),w(Ae,{panelKey:"faces",requiredTier:N,title:"Faces Rendering",tooltip:"Chooses which side of the mesh renders and how backfaces are handled.",controls:g,children:w("div",{className:"bb-grid",children:w(Pt,{label:"Side",value:n?.side??"front",options:ga,onChange:b=>m(o,a=>({...a,side:b}))})})})]})}var pi=[{id:"wood",label:"Wood",swatch:"#8b5a2b",material:{baseColor:"#8b5a2b",metalness:0,roughness:.75,reflectivity:.04}},{id:"brushed-metal",label:"Brushed Metal",swatch:"linear-gradient(135deg, #cfcfcf, #8a8a8a)",material:{baseColor:"#c8c8c8",metalness:1,roughness:.35}},{id:"chrome",label:"Polished Chrome",swatch:"linear-gradient(135deg, #ffffff, #9aa0a6)",material:{baseColor:"#e8e8e8",metalness:1,roughness:.05}},{id:"gold",label:"Gold",swatch:"linear-gradient(135deg, #ffe9a8, #c89b2c)",material:{baseColor:"#e6b325",metalness:1,roughness:.2}},{id:"copper",label:"Copper",swatch:"linear-gradient(135deg, #e3a576, #8a4a26)",material:{baseColor:"#b87333",metalness:1,roughness:.3}},{id:"glass",label:"Glass",swatch:"linear-gradient(135deg, rgba(255,255,255,0.9), rgba(180,210,230,0.4))",material:{baseColor:"#ffffff",metalness:0,roughness:.02,reflectivity:.5,opacity:1,transmission:1,thickness:.5,attenuationColor:"#ffffff",attenuationDistance:1}},{id:"frosted-glass",label:"Frosted Glass",swatch:"linear-gradient(135deg, rgba(255,255,255,0.85), rgba(210,225,235,0.6))",material:{baseColor:"#ffffff",metalness:0,roughness:.4,reflectivity:.3,opacity:1,transmission:.9,thickness:.5}},{id:"plastic-glossy",label:"Glossy Plastic",swatch:"#dadada",material:{baseColor:"#dadada",metalness:0,roughness:.25,reflectivity:.5,clearcoat:.3,clearcoatRoughness:.1}},{id:"plastic-matte",label:"Matte Plastic",swatch:"#9a9a9a",material:{baseColor:"#9a9a9a",metalness:0,roughness:.85,reflectivity:.04}},{id:"rubber",label:"Rubber",swatch:"#1a1a1a",material:{baseColor:"#1a1a1a",metalness:0,roughness:.9,reflectivity:.02}},{id:"fabric",label:"Fabric",swatch:"#9c8a6b",material:{baseColor:"#9c8a6b",metalness:0,roughness:.95,sheen:.4,sheenColor:"#ffffff",sheenRoughness:.6}},{id:"ceramic",label:"Ceramic",swatch:"#f5f5f0",material:{baseColor:"#f5f5f0",metalness:0,roughness:.15,clearcoat:.6,clearcoatRoughness:.1}},{id:"concrete",label:"Concrete",swatch:"#9b9b93",material:{baseColor:"#9b9b93",metalness:0,roughness:.95,reflectivity:.03}}];import{jsx as Qn,jsxs as yl}from"react/jsx-runtime";function ui({disabled:o,onApply:n}){return Qn("div",{className:"bb-presetGallery",children:pi.map(i=>yl("button",{type:"button",className:"bb-presetSwatch",disabled:o,title:`Apply ${i.label} preset`,onClick:()=>n(i.material),children:[Qn("span",{className:"bb-presetSwatchColor",style:{background:i.swatch}}),Qn("span",{className:"bb-presetSwatchLabel",children:i.label})]},i.id))})}import{useEffect as wl,useRef as Cl,useState as Sl}from"react";import{ChevronDown as kl,Download as Nl,FileCode2 as Pl,FileJson as Tl}from"lucide-react";import{jsx as mn,jsxs as It}from"react/jsx-runtime";function eo({disabled:o,exporting:n,onExportJson:i,onExportTs:r}){let[e,t]=Sl(!1),u=Cl(null);return wl(()=>{if(!e)return;let p=m=>{u.current?.contains(m.target)||t(!1)};return window.addEventListener("pointerdown",p),()=>window.removeEventListener("pointerdown",p)},[e]),It("div",{className:"bb-exportMenuWrapper",ref:u,children:[It("button",{type:"button",className:"bb-button bb-button--ghost",disabled:o||n,onClick:()=>t(p=>!p),title:"Export",children:[mn(Nl,{size:14}),n?"Exporting\u2026":"Export",mn(kl,{size:12})]}),e&&It("div",{className:"bb-exportMenu",children:[It("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{t(!1),i()},children:[mn(Tl,{size:14}),"JSON"]}),It("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{t(!1),r()},children:[mn(Pl,{size:14}),"TypeScript"]})]})]})}import{jsx as mt,jsxs as to}from"react/jsx-runtime";function mi({selectedItem:o,selectedBinding:n,open:i,onToggle:r,updateBinding:e,idError:t}){return mt(Te,{title:"Identity",open:i,onToggle:r,children:to("div",{className:"bb-grid",children:[to("div",{className:"bb-field bb-field--full",children:[mt("label",{className:"bb-label",children:"Model Node ID"}),mt("span",{className:"bb-note",children:"This is the exact mesh name from the imported model and stays locked."}),mt("input",{className:"bb-input bb-readonly",value:n.modelObjectId,readOnly:!0})]}),to("div",{className:"bb-field bb-field--full",children:[mt("label",{className:"bb-label",children:"ID"}),mt("input",{className:`bb-input ${t?"bb-input--error":""}`,value:n.id,onChange:u=>e(o,p=>({...p,id:u.target.value}))}),t?mt("span",{className:"bb-status bb-status--error",children:t}):null]})]})})}import{useEffect as Bl,useState as hi}from"react";var gi=["other","body","light","wheel","glass","interior","floor","wall","door","furniture","decor","electronics","seat","table","chair","window","sofa","bed","engine","headlight"],fi=["normal","hidden","selected","disabled"];import{jsx as Ce,jsxs as He}from"react/jsx-runtime";function xi({selectedItem:o,selectedBinding:n,open:i,onToggle:r,updateBinding:e}){let[t,u]=hi(n.group??""),[p,m]=hi(n.tags?.join(", ")??"");Bl(()=>{u(n.group??""),m(n.tags?.join(", ")??"")},[o,n.group,n.tags]);let h=()=>{e(o,d=>({...d,group:t.trim()||void 0}))},k=()=>{let d=[...new Set(p.split(",").map(g=>g.trim()).filter(Boolean))];e(o,g=>({...g,tags:d.length>0?d:void 0}))};return He(Te,{title:"Basics",open:i,onToggle:r,children:[He("div",{className:"bb-grid",children:[He("div",{className:"bb-field",children:[Ce("label",{className:"bb-label",children:"Label"}),Ce("input",{className:"bb-input",value:n.label??"",onChange:d=>e(o,g=>({...g,label:d.target.value}))})]}),He("div",{className:"bb-field",children:[Ce("label",{className:"bb-label",children:"Type"}),Ce("input",{className:"bb-input",list:"binding-type-suggestions",value:n.type??"other",onChange:d=>e(o,g=>({...g,type:d.target.value}))}),Ce("datalist",{id:"binding-type-suggestions",children:gi.map(d=>Ce("option",{value:d},d))})]}),He("div",{className:"bb-field",children:[Ce("label",{className:"bb-label",children:"Status"}),Ce("select",{className:"bb-select",value:n.status??"normal",onChange:d=>e(o,g=>({...g,status:d.target.value})),children:fi.map(d=>Ce("option",{value:d,children:d},d))})]}),He("div",{className:"bb-field",children:[Ce("label",{className:"bb-label",children:"Group"}),Ce("input",{className:"bb-input",placeholder:"paint",value:t,onChange:d=>u(d.target.value),onBlur:h,onKeyDown:d=>{d.key==="Enter"&&d.currentTarget.blur()}})]}),He("div",{className:"bb-field",children:[Ce("label",{className:"bb-label",children:"Tags"}),Ce("input",{className:"bb-input",placeholder:"exterior, configurable",value:p,onChange:d=>m(d.target.value),onBlur:k,onKeyDown:d=>{d.key==="Enter"&&d.currentTarget.blur()}})]})]}),He("div",{className:"bb-checkboxRow",style:{marginTop:12},children:[He("label",{className:"bb-checkbox",children:[Ce("input",{type:"checkbox",checked:n.selectable??!1,onChange:d=>e(o,g=>({...g,selectable:d.target.checked}))}),"selectable"]}),He("label",{className:"bb-checkbox",children:[Ce("input",{type:"checkbox",checked:n.hoverable??!1,onChange:d=>e(o,g=>({...g,hoverable:d.target.checked}))}),"hoverable"]}),He("label",{className:"bb-checkbox",children:[Ce("input",{type:"checkbox",checked:n.visible??!1,onChange:d=>e(o,g=>({...g,visible:d.target.checked}))}),"visible"]})]})]})}import{useEffect as Rl,useState as Al}from"react";import{Fragment as zl,jsx as ge,jsxs as Ee}from"react/jsx-runtime";var vi=On.filter(o=>o.handling==="viewer"),Ml=On.filter(o=>o.handling==="host");function yi({selectedItem:o,selectedBinding:n,open:i,onToggle:r,updateBinding:e}){let[t,u]=Al(new Set);Rl(()=>{u(new Set)},[o]);let p=n.actions??[],m=(d,g)=>e(o,M=>({...M,actions:(M.actions??[]).map((B,N)=>N===d?g(B):B)})),h=d=>{e(o,g=>({...g,actions:(g.actions??[]).filter((M,B)=>B!==d)})),u(g=>{let M=new Set;return g.forEach(B=>{B<d?M.add(B):B>d&&M.add(B-1)}),M})},k=(d,g)=>u(M=>{let B=new Set(M);return g?B.add(d):B.delete(d),B});return Ee(Te,{title:"Actions",open:i,onToggle:r,children:[ge("div",{className:"bb-actionList",children:p.map((d,g)=>{let M=rn(d.id),B=t.has(g)||!M,N=d.id.trim(),O=M?null:_o(d.id),T=N.length>0&&p.some((l,S)=>S!==g&&l.id.trim()===N);return Ee("div",{className:"bb-actionCard",children:[Ee("div",{className:"bb-actionCardHeader",children:[Ee("div",{className:"bb-actionCardTitle",children:["Action ",g+1]}),ge("div",{className:"bb-actionCardMeta",children:d.type})]}),Ee("div",{className:"bb-actionGrid",children:[Ee("div",{className:"bb-field",children:[ge("label",{className:"bb-label",children:"Action ID"}),Ee("select",{className:"bb-select",value:B?an:d.id,onChange:l=>{let S=l.target.value;if(S===an){k(g,!0);return}k(g,!1);let P=rn(S);m(g,v=>({...v,id:S,label:P&&En(v.label)?P.label:v.label}))},children:[ge("optgroup",{label:"Handled by the viewer",children:vi.map(l=>ge("option",{value:l.id,children:l.id},l.id))}),ge("optgroup",{label:"Handled by your app",children:Ml.map(l=>ge("option",{value:l.id,children:l.id},l.id))}),ge("option",{value:an,children:"Custom\u2026"})]})]}),B?Ee("div",{className:"bb-field",children:[ge("label",{className:"bb-label",children:"Custom action ID"}),ge("input",{className:"bb-input",value:d.id,placeholder:"open-datasheet",onChange:l=>{k(g,!0),m(g,S=>({...S,id:l.target.value}))}})]}):null,Ee("div",{className:"bb-field",children:[ge("label",{className:"bb-label",children:"Label"}),ge("input",{className:"bb-input",value:d.label,onChange:l=>m(g,S=>({...S,label:l.target.value}))})]}),M?ge("span",{className:"bb-note",children:M.description}):N.length===0?ge("span",{className:"bb-note",style:{color:"#fca5a5"},children:"An action ID is required, the button renders but can never be identified in onAction."}):Ee("span",{className:"bb-note",style:{color:"#fcd34d"},children:["Unrecognised ID, the viewer has no built-in behavior for it. Add declarative effects and execute them with useViewerActions, or handle it in onAction.",O?Ee(zl,{children:[" Did you mean ",ge("button",{type:"button",className:"bb-linkButton",onClick:()=>{k(g,!1);let l=rn(O);m(g,S=>({...S,id:O,label:l&&En(S.label)?l.label:S.label}))},children:O}),"?"]}):null]}),d.effects?.length?Ee("span",{className:"bb-note",children:[d.effects.length," declarative effect",d.effects.length===1?"":"s",", execute with useViewerActions."]}):null,T?ge("span",{className:"bb-note",style:{color:"#fcd34d"},children:"Another action on this binding uses the same ID, they will render as two identical buttons."}):null]}),ge("div",{className:"bb-actionFooter",children:ge("button",{type:"button",className:"bb-button bb-button--ghost bb-actionRemove",onClick:()=>h(g),children:"Remove Action"})})]},g)})}),ge("div",{style:{marginTop:10},children:ge("button",{type:"button",className:"bb-button",onClick:()=>{let d=vi.find(g=>!p.some(M=>M.id===g.id));e(o,g=>({...g,actions:[...g.actions??[],{id:d?.id??"",label:d?.label??"New Action",type:"command"}]})),d||k(p.length,!0)},children:"Add Action"})})]})}import{MapPin as Ll,Trash2 as Ol}from"lucide-react";import{Fragment as El,jsx as je,jsxs as Me}from"react/jsx-runtime";function wi({selectedBinding:o,open:n,onToggle:i,cameraState:r,formattedCameraState:e,savedCameraPosition:t,onSaveCameraPosition:u,onGoToSavedCamera:p,onClearSavedCamera:m,onResetView:h,onFitScene:k}){return Me(Te,{title:"Camera Position",open:n,onToggle:i,children:[Me("div",{className:"se-waypointCard bb-cameraWaypoint",children:[je("span",{className:"bb-cameraLiveBadge",children:"LIVE"}),Me("div",{className:"se-waypointBody",children:[je("div",{className:"bb-cameraWaypointLabel",children:"Current view"}),r?Me(El,{children:[Me("div",{className:"se-waypointCoords",children:["pos ",e?.position]}),Me("div",{className:"se-waypointCoords",children:["look ",e?.target]})]}):je("div",{className:"se-waypointCoords",children:"Move the camera to see live position"})]})]}),Me("div",{className:"bb-cameraControls bb-cameraControls--centered",children:[je("button",{type:"button",className:"bb-button bb-button--primary",onClick:u,disabled:!r,children:"Save"}),je("button",{type:"button",className:"bb-button bb-button--ghost",onClick:h,children:"Reset View"}),je("button",{type:"button",className:"bb-button bb-button--ghost",onClick:k,children:"Fit Scene"})]}),t?.position&&t?.target&&Me("div",{className:"se-waypointCard bb-cameraWaypoint",children:[je("span",{className:"bb-cameraSavedBadge",children:"SAVED"}),Me("div",{className:"se-waypointBody",children:[Me("div",{className:"bb-cameraWaypointLabel",children:["For ",o.label]}),Me("div",{className:"se-waypointCoords",children:["pos [",t.position.map(d=>d.toFixed(1)).join(", "),"]"]}),Me("div",{className:"se-waypointCoords",children:["look [",t.target.map(d=>d.toFixed(1)).join(", "),"]"]})]}),Me("div",{className:"se-waypointActions",children:[je("button",{className:"se-waypointAction",onClick:p,title:"Fly camera to the saved position",children:je(Ll,{size:15})}),je("button",{className:"se-waypointAction se-waypointAction--delete",onClick:m,title:"Delete saved position",children:je(Ol,{size:15})})]})]}),je("span",{className:"bb-note",children:'Tip: Position the camera how you want, then click "Save" to store this position for the selected object. The camera position updates in real-time as you navigate.'})]})}import{useLayoutEffect as jl,useRef as Dl,useState as Fl}from"react";import{Move3d as Il,RotateCcw as Hl}from"lucide-react";import{jsx as ne,jsxs as Ge}from"react/jsx-runtime";var Ci=["X","Y","Z"];var Gl=.1;function no(o){let n=o%360;return n<0?n+360:n}function Si(o){return no(o*180/Math.PI)}function ki(o){return o*Math.PI/180}function Vl(o,n,i){let r=[...o],e=Si(o[n]);return r[n]=ki(no(e+i)),r}function Ni({value:o,min:n=-1/0,max:i=1/0,step:r=.1,disabled:e=!1,onChange:t,formatValue:u=h=>Number(h.toFixed(3)),ariaLabel:p,className:m}){let h=u(o),[k,d]=Fl(String(h)),g=Dl(!1);return jl(()=>{g.current||d(String(h))},[h]),ne("input",{type:"number",className:m,step:r,min:n===-1/0?void 0:n,max:i===1/0?void 0:i,value:k,disabled:e,"aria-label":p,onFocus:()=>{g.current=!0},onChange:M=>{let B=M.target.value;if(d(B),B===""||B==="-")return;let N=Number(B);if(Number.isFinite(N)){let O=Math.max(n,Math.min(i,N));t(O)}},onBlur:()=>{g.current=!1,d(String(u(o)))}})}function Ul({value:o,min:n=-1/0,max:i=1/0,step:r=.1,disabled:e=!1,onChange:t,formatValue:u=m=>Number(m.toFixed(3)),label:p}){return ne("div",{className:"bb-transformAxesGrid",children:Ci.map((m,h)=>Ge("div",{className:"bb-transformAxis",children:[ne("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:m}),ne("div",{className:"bb-transformAxisControl",children:ne(Ni,{className:"se-numberInput bb-transformNumberInput",step:r,min:n,max:i,value:o[h],disabled:e,formatValue:u,ariaLabel:`${m} ${p?.toLowerCase()||""}`,onChange:k=>{let d=[...o];d[h]=k,t(d)}})})]},m))})}function Pi({selectedItem:o,selectedBinding:n,open:i,onToggle:r,updateBinding:e,moveModeEnabled:t,onToggleMoveMode:u,transformSpace:p,onTransformSpaceChange:m,originalTransform:h}){let k=n.transform?.rotation??h?.rotation??[0,0,0],d=n.transform?.position??h?.position??[0,0,0],g=(l,S)=>{let P=l.transform?.rotation??h?.rotation??[0,0,0],v=l.transform?.position??h?.position??[0,0,0],D=l.transform?.scale??h?.scale??[1,1,1],b=h?.pivotLocal??[0,0,0],a=pa(v,P,S,D,b,h?.rotationOrder??"XYZ");return{...l,transform:{...l.transform,position:a,rotation:S}}},M=(l,S)=>{o&&e(o,P=>{let v=P.transform?.rotation??h?.rotation??[0,0,0],D=Vl(v,l,S);return g(P,D)})},B=(l,S)=>{o&&e(o,P=>{let D=[...P.transform?.rotation??h?.rotation??[0,0,0]];return D[l]=ki(no(S)),g(P,D)})},N=(l,S)=>{o&&e(o,P=>{let D=[...P.transform?.position??h?.position??[0,0,0]];return D[l]=S,{...P,transform:{...P.transform,position:D}}})},O=(l,S)=>{o&&N(l,d[l]+S)},T=()=>{!o||!h||e(o,l=>{let S={...l.transform};return delete S.position,delete S.rotation,{...l,transform:Object.keys(S).length>0?S:void 0}})};return Ge(Te,{title:"Move & Rotate",open:i,onToggle:r,tooltip:"Enable the transform gizmo to move or rotate the selected mesh on any axis. Rotation uses the object's visible center while exported position and rotation remain local GLTF transforms.",children:[Ge("div",{className:"se-field",children:[Ge("div",{className:"se-fieldLabel",children:[Ge("span",{children:[ne(Il,{size:14,style:{marginRight:6,verticalAlign:"-2px"}}),"Transform gizmo"]}),Ge("label",{className:"se-switch","aria-label":"Toggle move mode",children:[ne("input",{type:"checkbox",checked:t,onChange:l=>u(l.target.checked)}),ne("span",{className:"se-switchTrack",children:ne("span",{className:"se-switchThumb"})})]})]}),ne("span",{className:"bb-note",children:"Select a mesh \xB7 drag the colored arrows or planes to move"})]}),Ge("div",{className:"se-field",style:{marginTop:10},children:[ne("div",{className:"se-fieldLabel",children:ne("span",{children:"Axis space"})}),ne("div",{className:"se-segmentedControl",children:["world","local"].map(l=>ne("button",{type:"button",className:`se-segmentedOption ${p===l?"se-segmentedOption--active":""}`,onClick:()=>m(l),children:l},l))})]}),Ge("div",{className:"se-field",style:{marginTop:10},children:[ne("div",{className:"se-fieldLabel",children:ne("span",{children:"Rotation (degrees)"})}),ne("div",{className:"bb-transformAxesGrid",children:Ci.map((l,S)=>{let P=Math.round(Si(k[S]));return Ge("div",{className:"bb-transformAxis",children:[ne("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:l}),ne("div",{className:"bb-transformAxisControl",children:ne(Ni,{className:"se-numberInput bb-transformNumberInput",step:1,min:0,max:359,value:P,disabled:!o,formatValue:v=>Math.round(v),ariaLabel:`${l} rotation in degrees`,onChange:v=>B(S,v)})})]},l)})})]}),Ge("div",{className:"se-field",style:{marginTop:10},children:[ne("div",{className:"se-fieldLabel",children:ne("span",{children:"Position"})}),ne(Ul,{value:d,min:-1/0,max:1/0,step:Gl,disabled:!o,label:"position",onChange:l=>{o&&e(o,S=>({...S,transform:{...S.transform,position:l}}))}})]}),Ge("button",{type:"button",className:"bb-button bb-button--ghost",style:{marginTop:10,display:"inline-flex",alignItems:"center",gap:6},disabled:!o||!h,onClick:T,title:"Restore this node's position and rotation to what they were in the original model",children:[ne(Hl,{size:14}),"Restore original position & rotation"]})]})}import{memo as $l,useMemo as Ti,useState as _l}from"react";import{Fragment as Wl,jsx as gt,jsxs as ot}from"react/jsx-runtime";var Bi=$l(Kl);function Kl({bindings:o,selectedItem:n,onSelect:i,onHover:r,isOpen:e=!0,onToggle:t}){let[u,p]=_l(""),m=Ti(()=>Object.keys(o),[o]),h=Ti(()=>{let k=u.trim().toLowerCase();return k?m.filter(d=>{let g=o[d];return d.toLowerCase().includes(k)||g.label?.toLowerCase().includes(k)||(g.type??"other").toLowerCase().includes(k)}):m},[o,m,u]);return ot("aside",{className:`bb-sidebar bb-sidebar--right ${e?"":"bb-sidebar--collapsed"}`,children:[ot("div",{className:"bb-header bb-header--sidebar",children:[!e&>("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>t?.(!0),"aria-label":"Open scene nodes sidebar",title:"Open scene nodes",children:"\u2190"}),e&&ot(Wl,{children:[ot("div",{children:[gt("div",{className:"bb-sectionKicker",children:"Scene Nodes"}),ot("div",{className:"bb-sectionHeading",children:[h.length," visible entries"]})]}),gt("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>t?.(!1),"aria-label":"Close scene nodes sidebar",title:"Close scene nodes",children:"\u2192"})]})]}),e&&ot("section",{className:"bb-nodeList",children:[gt("div",{className:"bb-search",children:gt("input",{className:"bb-input",placeholder:"Search nodes, labels, or types",value:u,onChange:k=>p(k.target.value)})}),gt("div",{className:"bb-nodeItems",children:h.map(k=>{let d=o[k];return ot("button",{type:"button",className:`bb-nodeButton ${k===n?"bb-nodeButton--active":""}`,onClick:()=>i(k),onMouseEnter:()=>r?.(k),onMouseLeave:()=>r?.(null),children:[gt("span",{className:"bb-nodeName",children:k}),ot("span",{className:"bb-nodeMeta",children:[d.type??"other",d.label===sa(k)?"":d.label||"\xB7 Untitled"]})]},k)})})]})]})}import{jsx as gn,jsxs as Ri}from"react/jsx-runtime";function oo({title:o,label:n,open:i,onToggle:r,draft:e,error:t,example:u,onDraftChange:p,onCommit:m}){return gn(Te,{title:o,open:i,onToggle:r,children:Ri("div",{className:"bb-field",children:[gn("label",{className:"bb-label",children:n}),gn("textarea",{className:"bb-textarea",value:e,onChange:h=>p(h.target.value),onBlur:m}),t?gn("span",{className:"bb-status bb-status--error",children:t}):Ri("span",{className:"bb-note",children:["Use a JSON object like ",u,"."]})]})})}function Ai(o,n){let i=new Map(o.animations.clips.map(t=>[t.sourceName,t])),r=n.map(({sourceName:t})=>i.get(t)??{sourceName:t,displayName:t,hidden:!1,loopMode:"repeat",speed:1}),e=o.animations.autoplayClip&&r.some(t=>t.sourceName===o.animations.autoplayClip&&!t.hidden)?o.animations.autoplayClip:null;return{clips:r,autoplayClip:e}}import{useCallback as Ht,useReducer as Yl,useRef as ql}from"react";var Jl=100;function Xl(o,n){switch(n.type){case"set":{let i=typeof n.updater=="function"?n.updater(o.present):n.updater;if(i===o.present)return o;let r=n.track?o.edits+1:o.edits;return n.coalesce?{...o,present:i,future:[],edits:r}:{past:[...o.past,o.present].slice(-Jl),present:i,future:[],edits:r}}case"undo":{if(o.past.length===0)return o;let i=o.past[o.past.length-1];return{past:o.past.slice(0,-1),present:i,future:[o.present,...o.future],edits:o.edits+1}}case"redo":{if(o.future.length===0)return o;let[i,...r]=o.future;return{past:[...o.past,o.present],present:i,future:r,edits:o.edits+1}}case"reset":return{past:[],present:n.value,future:[],edits:n.track?o.edits+1:0}}}function ao(o,n=600){let[i,r]=Yl(Xl,{past:[],present:o,future:[],edits:0}),e=ql(0),t=Ht(k=>{let d=Date.now(),g=d-e.current<n;e.current=d,r({type:"set",updater:k,coalesce:g,track:!0})},[n]),u=Ht(k=>{let d=Date.now()-e.current<n;r({type:"set",updater:k,coalesce:d,track:!1})},[n]),p=Ht(()=>{e.current=0,r({type:"undo"})},[]),m=Ht(()=>{e.current=0,r({type:"redo"})},[]),h=Ht((k,d)=>{e.current=0,r({type:"reset",value:k,track:d?.asEdit??!1})},[]);return{value:i.present,setValue:t,setValueUntracked:u,undo:p,redo:m,reset:h,canUndo:i.past.length>0,canRedo:i.future.length>0,edits:i.edits}}import{strToU8 as Zl}from"fflate";function Mi(o){return JSON.stringify(o,null,2)}function zi(o){return['import { defineObjectBindings } from "@liveroom-tech/react-immersive/utils";',"",`export const objectBindings = defineObjectBindings(${JSON.stringify(o,null,2)});`,""].join(`
|
|
2
2
|
`)}function Li(o){return JSON.stringify(o,null,2)}function Oi(o){return['import type { SceneConfig } from "@liveroom-tech/react-immersive/utils";',"",`export const sceneConfig: SceneConfig = ${JSON.stringify(o,null,2)};`,""].join(`
|
|
3
3
|
`)}function Gt(o,n,i){sn(new Blob([n],{type:i}),o)}function io(o){return JSON.stringify(o??{},null,2)}function ro(o){return`[${o[0].toFixed(3)}, ${o[1].toFixed(3)}, ${o[2].toFixed(3)}]`}function Ql(o){let n=o.style?.material;return n?Object.values(n).filter(i=>!!i&&typeof i=="object"&&typeof i.path=="string"&&i.path.trim().length>0).map(i=>i.path):[]}async function Ei(o){let n=new Set;for(let e of Object.values(o))for(let t of Ql(e))n.add(t);let i=[],r=[];return await Promise.all(Array.from(n).map(async e=>{let t=ea(e);if(t)try{let u=await fetch(t);if(!u.ok)throw new Error(String(u.status));i.push({path:e,blob:await u.blob()});return}catch{r.push(e);return}try{let u=await un(e);u&&i.push({path:e,blob:u})}catch{}})),{assets:i,failedPaths:r}}async function so(o,n,i,r,e){if(e.length===0){Gt(o,n,i);return}let t={[o]:Zl(n)};for(let p of e)t[p.path]=new Uint8Array(await p.blob.arrayBuffer());let u=await Ko(t);sn(new Blob([u],{type:"application/zip"}),r)}var lo={pbr:["texture","baseColor","metalness","metalnessMap","specularIntensity","specularIntensityMap","specularColor","specularColorMap","reflectivity"],roughness:["roughness","roughnessMap"],emission:["emissive","emissiveIntensity","emissiveMap"],opacity:["opacity","alphaMap","alphaTest","alphaHash","dithering","blendingMode"],normalBump:["normalMap","normalScale","flipNormalY","bumpMap","bumpScale"],displacement:["displacementMap","displacementScale","displacementBias"],ao:["aoMap","aoMapIntensity"],clearcoat:["clearcoat","clearcoatMap","clearcoatRoughness","clearcoatRoughnessMap","clearcoatNormalMap","clearcoatNormalScale","flipClearcoatNormalY"],sheen:["sheen","sheenColor","sheenColorMap","sheenRoughness","sheenRoughnessMap"],anisotropy:["anisotropy","anisotropyRotation","anisotropyMap"],transmission:["transmission","transmissionMap","thickness","thicknessMap","attenuationColor","attenuationDistance"],faces:["side"]},ji=Object.keys(lo);function Di(o){if(o==null)return!1;if(typeof o=="string")return o.trim().length>0;if(typeof o=="number")return Number.isFinite(o);if(typeof o=="boolean")return o;if(typeof o=="object"&&"path"in o){let n=o.path;return typeof n=="string"&&n.trim().length>0}return!1}function bo(o){if(o)return Object.values(o).some(Di)?o:void 0}function De(o,n){return o?lo[n].some(i=>Di(o[i])):!1}function co(o){return{pbr:De(o,"pbr"),roughness:De(o,"roughness"),emission:De(o,"emission"),opacity:De(o,"opacity"),normalBump:De(o,"normalBump"),displacement:De(o,"displacement"),ao:De(o,"ao"),clearcoat:De(o,"clearcoat"),sheen:De(o,"sheen"),anisotropy:De(o,"anisotropy"),transmission:De(o,"transmission"),faces:De(o,"faces")}}function po(o,n){if(n)return{...o,style:{...o.style,material:n}};if(!o.style)return o;let{material:i,...r}=o.style;return{...o,style:Object.keys(r).length>0?r:void 0}}function Fi(o,n){if(!o)return;let i={...o};for(let r of lo[n])delete i[r];return i}import{Fragment as Tt,jsx as y,jsxs as I}from"react/jsx-runtime";var _i="/room.glb",td=500;function nd(){return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}function Ki(o){return`Couldn't reload ${o} from your last session. It's still saved in this browser.`}function od(o){let n=new Date(o);return n.toDateString()===new Date().toDateString()?`today at ${n.toLocaleTimeString([],{hour:"numeric",minute:"2-digit"})}`:n.toLocaleString([],{dateStyle:"medium",timeStyle:"short"})}function fn(o){return o!==null&&typeof o=="object"&&!Array.isArray(o)}function mo(o,n){if(!fn(o)||!fn(n))return n??o;let i={...o};for(let[r,e]of Object.entries(n)){let t=i[r];i[r]=fn(t)&&fn(e)?mo(t,e):e}return i}function ad({licenseKey:o,licenseValidationUrl:n,dracoDecoderPath:i,ktx2TranscoderPath:r,meshopt:e,project:t,onProjectChange:u,projectChangeDebounceMs:p=350,onModelUpload:m,onTextureUpload:h,onEditLeaseChange:k,allowModelChange:d=!0}){let g=oe(null),M=oe(null),B=oe(null),[N,O]=$(t?.model.url??null),[T,l]=$(t?.model.name??""),[S,P]=$(t?.model??null),[v,D]=$(null),b=ao(t?.objectBindings??{}),a=b.value,L=b.setValue,[z,de]=$(!1),[ye,at]=$(null),[go,fo]=$(!1),[ho,H]=$("Load the demo model or upload a GLB, GLTF, OBJ, FBX, or USDZ model to generate bindings."),[Vt,V]=$("default"),[Wi,xo]=$(!1),[vo,Ut]=$("{}"),[yo,$t]=$("{}"),[Yi,_t]=$(null),[qi,Kt]=$(null),[Ji,Bt]=$(!1),[ft,Xi]=$(!1),[Zi,Qi]=$(!1),[qe,er]=$({identity:!0,basics:!0,material:!1,actions:!1,camera:!1,transform:!1,metrics:!1,metadata:!1}),[tr,nr]=$({pbr:!1,roughness:!1,emission:!1,opacity:!1,normalBump:!1,displacement:!1,ao:!1,clearcoat:!1,sheen:!1,anisotropy:!1,transmission:!1,faces:!1}),Je=s=>er(c=>({...c,[s]:!c[s]})),or=s=>nr(c=>({...c,[s]:!c[s]})),[_e,hn]=$("object"),[Wt,wo]=$("General"),[ar,ir]=$("metalness"),[rr,xn]=$(co()),Co=oe(null),[So,sr]=$(!1),[vn,lr]=$(!0),[ko,dr]=$(!0),[br,No]=$(!1),[Rt,Po]=$(null),[Yt,yn]=$(null),[wn,To]=$(!1),[Bo,cr]=$("world"),Cn=oe({}),we=ao(t?.sceneConfig??Ot),Ne=we.value,qt=we.setValue,At=we.setValueUntracked,[Ro,Sn]=$("orbit"),fe=Ro==="pointerLock",[Ao,pr]=$(null),Mo=oe(null),ur=Ao?.objectKey===v&&Ao?.textureKey==="texture",[mr,Jt]=$(null),[gr,kn]=$(null),Mt=oa(o,n),zo=ka(Mt.tier),fr=uo(()=>({isInsideEditor:!0,activeTab:_e,activeSubTab:Wt,tier:zo,setActiveTab:hn,setActiveSubTab:wo}),[_e,Wt,zo]),Fe=oe(null),ht=oe(0),Ke=oe(0),Lo=oe(t?`${t.id}:${t.revision}`:null),Oo=oe(null),Eo=oe(!1),xt=oe(!1),Xt=oe(t?{modelUrl:t.model.url,bindings:t.objectBindings,sceneConfig:t.sceneConfig}:null),Zt=oe(void 0),it=oe(0),he=oe(null),ze=oe(t?{requestId:0,modelName:t.model.name??"model",modelUrl:t.model.url,storedBindings:t.objectBindings,streaming:!!t.model.tilesetUrl}:null),Xe=oe(null),Qt=oe(null),Ze=oe(null),Nn=oe(!1),vt=oe(null),{cameraState:le,resetView:jo,focusObject:Do,fitScene:Fo,setCameraState:en,handleCameraChange:hr,handleViewerReady:xr}=aa(),vr=Q(s=>{fe||en({position:s.position,target:s.target,fov:le?.fov??null,zoom:le?.zoom??1,azimuthAngle:s.azimuthAngle,polarAngle:s.polarAngle},!0)},[fe,en,le]),tn=ma(),pe=v?a[v]??null:null,Pn=pe?.style?.material,Qe=pe?.cameraState,yr=le?{position:ro(le.position),target:ro(le.target)}:null,wr=Q(s=>{qt(c=>{let x=c.annotations.map(E=>E.id).join(","),C=s.map(E=>E.id).join(",");return x===C?c:{...c,annotations:s}})},[]),Cr=Q(s=>{Jt(s?{annotation:s}:null)},[]);$e(()=>{if(!pe){Ut("{}"),$t("{}"),_t(null),Kt(null);return}Ut(io(pe.metrics)),$t(io(pe.metadata)),_t(null),Kt(null)},[pe]),$e(()=>{let s=co(Pn);if(Co.current!==v){Co.current=v,xn(s);return}xn(c=>{let x=!1,C={...c};for(let E of ji)s[E]&&!c[E]&&(C[E]=!0,x=!0);return x?C:c})},[v,Pn]),$e(()=>()=>{Fe.current?.cleanup(),he.current&&clearTimeout(he.current)},[]);let zt=Q((s,c)=>{let x=dn(s);if(c){let C=new Map(Object.values(c).map(E=>[E.modelObjectId,E]));for(let E of s){let U=C.get(E);U&&(x[E]=U)}}return x},[]);$e(()=>{if(!t)return;let s=`${t.id}:${t.revision}`;if(Lo.current===s)return;Lo.current=s;let c=N!==t.model.url||S?.tilesetUrl!==t.model.tilesetUrl||S?.assetVersion!==t.model.assetVersion,x=a!==t.objectBindings,C=Ne!==t.sceneConfig;(c||x||C)&&(xt.current=!0),P(t.model),l(t.model.name??"model");let E=t.objectBindings;if(x){let U=Oo.current;E=U?zt(U,t.objectBindings):t.objectBindings,b.reset(E)}if(C&&we.reset(t.sceneConfig),c){let U=++Ke.current;ze.current={requestId:U,modelName:t.model.name??"model",modelUrl:t.model.url,storedBindings:t.objectBindings,streaming:!!t.model.tilesetUrl},vt.current=null,D(null),de(!0),O(t.model.url)}Xt.current={modelUrl:t.model.url,bindings:E,sceneConfig:t.sceneConfig}},[a,zt,t,N,Ne,S,b,we]);let Tn=oe(u);Tn.current=u,$e(()=>{if(!t||!Tn.current||!N)return;if(!Eo.current){Eo.current=!0;return}let s=Xt.current;if(N===t.model.url&&a===t.objectBindings&&Ne===t.sceneConfig||s!==null&&N===s.modelUrl&&a===s.bindings&&Ne===s.sceneConfig){xt.current=!1;return}if(ze.current)return;if(xt.current){xt.current=!1;return}let c=window.setTimeout(()=>{Tn.current?.({projectId:t.id,baseRevision:t.revision,model:{...S??t.model,url:N,name:T||t.model.name},objectBindings:a,sceneConfig:Ne},"local")},p);return()=>window.clearTimeout(c)},[a,T,N,t,p,S,Ne]),$e(()=>{let s=c=>{if(c.key.toLowerCase()!=="z"||!(c.metaKey||c.ctrlKey))return;let x=c.target,C=x?.tagName;if(C==="INPUT"||C==="TEXTAREA"||x?.isContentEditable)return;c.preventDefault();let E=_e==="scene"?we:b;c.shiftKey?E.redo():E.undo()};return window.addEventListener("keydown",s),()=>window.removeEventListener("keydown",s)},[_e,b,we]);let et=!t&&d,nn=b.edits>0||we.edits>0,Sr=Q(async(s,c)=>{if(h)return h(s,c);let x=URL.createObjectURL(s);if(et)try{await va(x,s)}catch(C){console.warn("[BindingBuilder] Could not store texture file for autosave:",C)}return x},[h,et]),Io=Q(async s=>(await Promise.all(Object.entries(s).map(async([c,x])=>{let C=x.style?.material;if(C)for(let E of na){let ee=C[E]?.path;if(ee)try{let G=await un(ee);if(!G){console.warn(`[BindingBuilder] No stored texture found for "${c}"'s ${E} ("${ee}"). If this is meant to be an uploaded file rather than a hosted URL, it was uploaded before texture autosave existed (or this browser's storage was cleared) \u2014 re-upload it once so it's stored for future restores.`);continue}let be=URL.createObjectURL(G);ln(ee,be)}catch(G){console.warn(`[BindingBuilder] Could not rehydrate "${c}"'s ${E}:`,G)}}})),s),[]);$e(()=>{if(!et||!nn||!N)return;let s=Xe.current;if(!s)return;let c=()=>{if(Ze.current===c&&(Ze.current=null),ze.current)return;let{model:C,file:E}=s,U=C.kind==="file"&&Qt.current!==C.key?E:void 0;ha({model:C,bindings:a,sceneConfig:Ne},U).then(()=>{Qt.current=C.kind==="file"?C.key:null,Nn.current=!1}).catch(ee=>{console.warn("[BindingBuilder] Autosave failed:",ee),!Nn.current&&(Nn.current=!0,H("Couldn't autosave this session \u2014 the browser refused to store it, possibly for lack of space. Export your work to keep it."),V("error"))})};Ze.current=c;let x=window.setTimeout(c,td);return()=>window.clearTimeout(x)},[et,nn,N,a,Ne]),$e(()=>{if(!et)return;let s=()=>Ze.current?.(),c=()=>{document.visibilityState==="hidden"&&s()};return window.addEventListener("pagehide",s),document.addEventListener("visibilitychange",c),()=>{window.removeEventListener("pagehide",s),document.removeEventListener("visibilitychange",c),s()}},[et]),$e(()=>{if(!et||!N||!nn)return;let s=c=>{Ze.current?.(),c.preventDefault(),c.returnValue=""};return window.addEventListener("beforeunload",s),()=>window.removeEventListener("beforeunload",s)},[et,N,nn]),$e(()=>{if(z||Vt==="default"||Vt==="success")return;xo(!0);let s=window.setTimeout(()=>xo(!1),4e3);return()=>window.clearTimeout(s)},[ho,Vt,z]);let Ve=uo(()=>Object.keys(a),[a]),kr=uo(()=>!v||!pe?null:pe.id.trim()?Object.entries(a).some(([x,C])=>x!==v&&C.id===pe.id)?"Another binding already uses this ID.":null:"ID is required.",[a,v,pe]),We=(s,c)=>{L(x=>({...x,[s]:c(x[s])}))},Bn=(s,c)=>{We(s,x=>{let C=bo(c(x.style?.material));return po(x,C)})},Nr=(s,c,x)=>{Bn(s,C=>({...C,[c]:x?{path:x}:void 0}))},Pr=(s,c)=>{xn(x=>({...x,[s]:c})),!c&&v&&We(v,x=>{let C=bo(Fi(x.style?.material,s));return po(x,C)})},Rn=Q((s,c,x)=>{let C=Dn(s),E=dn(C);if(x){let ee=new Map(Object.values(x).map(G=>[G.modelObjectId,G]));for(let G of C){let be=ee.get(G);be&&(E[G]=be)}}s.updateMatrixWorld(!0);let U={};for(let ee of C){let G=ta(s,ee);if(!G){U[ee]={position:[0,0,0],rotation:[0,0,0],scale:[1,1,1],pivotLocal:[0,0,0],rotationOrder:"XYZ"};continue}let be=ca(G);U[ee]={position:[G.position.x,G.position.y,G.position.z],rotation:[G.rotation.x,G.rotation.y,G.rotation.z],scale:[G.scale.x,G.scale.y,G.scale.z],pivotLocal:[be.x,be.y,be.z],rotationOrder:G.rotation.order}}Cn.current=U,b.reset(E),D(C[0]??null),x||At(ee=>({...ee,annotations:[]})),H(`Generated ${C.length} bindings from ${c}.`),V("success"),it.current=100,at(100),he.current&&clearTimeout(he.current),he.current=setTimeout(()=>{he.current=null,de(!1),at(null)},400)},[b,At]),An=(s,c,x,C)=>{Ze.current?.();let E=++Ke.current;de(!0),at(null),it.current=0,he.current&&(clearTimeout(he.current),he.current=null),Zt.current=x;let U=x?x/1048576:0;H(U>=100?`Reading ${c} (${Math.round(U)}MB \u2014 large file, this can take a while)...`:`Reading ${c} and generating starter bindings...`),V("default"),l(c),P(C??{url:s,name:c}),Jt(null);let ee=vt.current;if(s===N&&ee?.url===s){ze.current=null,Rn(ee.scene,c);return}ze.current={requestId:E,modelName:c,modelUrl:s,streaming:!!C?.tilesetUrl},O(s),b.reset({}),D(null)},Tr=Q(s=>{let c=ze.current;if(!(!c||c.requestId!==Ke.current)){if(ze.current=null,vt.current={url:c.modelUrl,scene:s},c.streaming){H(`Streaming ${c.modelName}.`),V("success"),de(!1);return}c.storedBindings&&(xt.current=!0),Rn(s,c.modelName,c.storedBindings),c.restoring&&H(`Restored your last session with ${c.modelName}.`)}},[Rn]),Br=Q(s=>{let c=s.map(C=>C.name);if(c.length===0)return;Oo.current=c,xt.current=!0;let x=zt(c,t?.objectBindings);if(b.reset(x),t){let C=Xt.current;Xt.current={modelUrl:C?.modelUrl??t.model.url,bindings:x,sceneConfig:C?.sceneConfig??t.sceneConfig}}D(C=>C??c[0]??null),H(`Streaming ${c.length} bindable objects.`),V("success"),de(!1)},[zt,b,t]),Rr=Q(s=>{let c=ze.current;!c||c.requestId!==Ke.current||(ze.current=null,console.error(s),c.restoring?(Xe.current=null,O(null),H(Ki(c.modelName))):H(`Could not read ${c.modelName}. Make sure the file is a valid GLB, GLTF, OBJ, FBX, or USDZ asset.`),V("error"),he.current&&(clearTimeout(he.current),he.current=null),it.current=0,de(!1),at(null))},[]),Ar=Q(s=>{let c=null;if(s.lengthComputable&&s.total>0)c=s.loaded/s.total*100;else{let C=Zt.current;C&&C>0&&(c=s.loaded/C*100)}if(c===null)return;let x=Math.min(90,Math.floor(c/10)*10);x>it.current&&(it.current=x,at(x)),c>=99.5&&H(C=>C.startsWith("Finalizing")?C:"Finalizing model \u2014 parsing geometry and textures (large files can take a moment here)...")},[]),Mr=Q(s=>{tn.handleAnimationsReady(s);let c=s.clipDetails??s.clips.map(x=>({sourceName:x,duration:0}));At(x=>({...x,animations:Ai(x,c)}))},[tn,At]),id=async()=>{Fe.current?.cleanup(),Fe.current=null,Xe.current={model:{kind:"url",url:_i,name:"room.glb"}},await An(_i,"room.glb")},Ho=async s=>{if(!d)return;if(m){try{de(!0),H(`Uploading ${s.name}...`),V("default");let x=await m(s);Xe.current={model:{kind:"url",url:x.url,name:x.name??s.name}},await An(x.url,x.name??s.name,s.size,x)}catch(x){de(!1),H(x instanceof Error?x.message:`Could not upload ${s.name}.`),V("error")}return}let c;try{c=await Ln(s)}catch(x){H(x instanceof Error?x.message:"Could not read model file. Upload a .glb, .gltf, .obj, .fbx, .usdz, or .zip asset."),V("error");return}Fe.current?.cleanup(),Fe.current=c,Xe.current={model:{kind:"file",key:nd(),name:c.name},file:s},await An(c.url,c.name,s.size,{url:c.url,name:c.name})},zr=async s=>{let c=s.target.files?.[0];c&&(await Ho(c),s.target.value="")},Lr=()=>{Ze.current?.(),Fe.current?.cleanup(),Fe.current=null,vt.current=null,ze.current=null,Xe.current=null,Cn.current={},ht.current=0,Bt(!1),he.current&&(clearTimeout(he.current),he.current=null),it.current=0,at(null),Zt.current=void 0,O(null),l(""),P(null),D(null),Jt(null),b.reset({}),Ut("{}"),$t("{}"),_t(null),Kt(null),kn(null),To(!1),At(s=>({...s,animations:Ot.animations,annotations:[]})),H("Load the demo model or upload a GLB, GLTF, OBJ, FBX, or USDZ model to generate bindings."),V("default")},Or=()=>{g.current?.click()},Er=()=>{M.current?.click()},Go=async s=>{fo(!0);try{let{assets:c,failedPaths:x}=await Ei(a);s==="json"?await so("objectBindings.json",Mi(a),"application/json","objectBindings.zip",c):await so("objectBindings.ts",zi(a),"text/typescript","objectBindings-ts.zip",c),x.length>0?(H(`Exported, but ${x.length} uploaded image${x.length===1?"":"s"} couldn't be bundled: ${x.join(", ")}.`),V("error")):c.length>0&&(H(`Exported with ${c.length} uploaded image${c.length===1?"":"s"} bundled into the zip.`),V("success"))}catch(c){let x=c instanceof Error?c.message:"Unknown export error.";H(`Failed to export bindings: ${x}`),V("error")}finally{fo(!1)}},jr=async s=>{if(!Ve.length){H("Load a model before importing bindings."),V("error");return}let c;try{c=JSON.parse(await s.text())}catch{H(`${s.name} is not valid JSON.`),V("error");return}if(c===null||typeof c!="object"||Array.isArray(c)){H("Expected a JSON object mapping object IDs to bindings."),V("error");return}let x=new Map;for(let be of Object.values(c))if(be!==null&&typeof be=="object"&&typeof be.id=="string"&&typeof be.type=="string"&&typeof be.modelObjectId=="string"){let Ie=be;x.set(Ie.modelObjectId,Ie)}if(x.size===0){H(`${s.name} doesn't look like an exported bindings file.`),V("error");return}let C={...a},E={},U=0;for(let be of Object.keys(C)){let Ie=x.get(be);Ie&&(C[be]=Ie,E[be]=Ie,U++)}if(U===0){H(`None of the object IDs in ${s.name} match this model \u2014 nothing imported.`),V("error");return}let ee=await Io(E);Object.assign(C,ee),L(C);let G=x.size-U;H(G>0?`Imported ${U} binding${U===1?"":"s"} from ${s.name} (${G} skipped \u2014 not in this model).`:`Imported ${U} binding${U===1?"":"s"} from ${s.name}.`),V("success")},Dr=async s=>{let c=s.target.files?.[0];c&&(await jr(c),s.target.value="")},Fr=()=>{B.current?.click()},Ir=async s=>{let c;try{c=JSON.parse(await s.text())}catch{H(`${s.name} is not valid JSON.`),V("error");return}if(c===null||typeof c!="object"||Array.isArray(c)){H("Expected a JSON object with scene config sections."),V("error");return}let x=["model","camera","lighting","wireframe","shadows","environment","background","groundShadows","postProcessing","animations","annotations","cinematic"],C=c,E=x.filter(U=>C[U]!==void 0);if(E.length===0){H(`${s.name} doesn't look like an exported scene config file.`),V("error");return}qt(U=>{let ee={...U};for(let G of E)ee[G]=mo(U[G],C[G]);return ee}),H(`Imported ${E.length} section${E.length===1?"":"s"} from ${s.name}.`),V("success")},Hr=async s=>{let c=s.target.files?.[0];c&&(await Ir(c),s.target.value="")},Gr=s=>{s.preventDefault(),s.stopPropagation(),!(z||N)&&(ht.current+=1,Bt(!0))},Vr=s=>{s.preventDefault(),s.stopPropagation(),!(z||N)&&(s.dataTransfer.dropEffect="copy",Bt(!0))},Ur=s=>{s.preventDefault(),s.stopPropagation(),!(z||N)&&(ht.current=Math.max(0,ht.current-1),ht.current===0&&Bt(!1))},$r=async s=>{if(s.preventDefault(),s.stopPropagation(),ht.current=0,Bt(!1),z||N)return;let c=s.dataTransfer.files?.[0];c&&await Ho(c)},Vo=(s,c,x)=>{if(!v)return;let C;try{C=JSON.parse(c)}catch{x("Invalid JSON");return}if(C===null||typeof C!="object"||Array.isArray(C)){x("Expected a JSON object");return}if(s==="metrics"&&Object.values(C).some(U=>typeof U!="number"||!Number.isFinite(U))){x("Metrics values must be numbers");return}We(v,E=>({...E,[s]:C})),x(null)},_r=Q(s=>{if(fe){Sn("orbit");return}if(!s){D(null);return}let c=Object.entries(a).find(([x,C])=>C===s||x===s.modelObjectId||C.modelObjectId===s.modelObjectId)?.[0]??null;D(c)},[fe,a]),Kr=Q(async s=>{if(fe){Sn("orbit");return}D(s),kn(null),await Do(s)},[fe,Do]),Wr=Q(s=>{kn(s?a[s]??null:null)},[a]),Yr=Q(s=>Qi(!s),[]),qr=Q(()=>{if(fe){H("Camera positions aren't available while Pointer Lock is the active camera controller."),V("error");return}if(!v||!le)return;let s={position:le.position,target:le.target,...le.fov!=null?{fov:le.fov}:{},zoom:le.zoom};We(v,c=>({...c,cameraState:s}))},[fe,v,le]),Jr=Q(()=>{if(fe){H("Camera positions aren't available while Pointer Lock is the active camera controller."),V("error");return}!Qe?.position||!Qe?.target||en({position:Qe.position,target:Qe.target,fov:Qe.fov??le?.fov??null,zoom:Qe.zoom??le?.zoom??1},!0)},[fe,Qe,en,le]),Xr=Q(()=>{fe||v&&We(v,s=>({...s,cameraState:void 0}))},[fe,v]),Zr=Q(async()=>{if(fe){H("Reset View isn't available while Pointer Lock is the active camera controller."),V("error");return}await jo()},[fe,jo]),Qr=Q(async()=>{if(fe){H("Fit Scene isn't available while Pointer Lock is the active camera controller."),V("error");return}await Fo()},[fe,Fo]),es=Q(()=>{H("Texture position saved."),V("success"),Mo.current?.()},[]),Uo=Q(s=>{Po(s),No(!0)},[]),yt=Q(()=>{No(!1),Po(null)},[]),ts=Q(()=>{if(Rt==="bindings"){if(!Ve.length){yt();return}let s=dn(Ve);b.reset(s,{asEdit:!0}),D(Ve[0]??null),H("Object bindings reset to default values."),V("success")}else Rt==="scene"&&(we.reset(Ot,{asEdit:!0}),H("Scene config reset to default values."),V("success"));yt()},[Rt,Ve,b,we,yt]),Mn=Q(()=>{yn(null)},[]),ns=async()=>{let s;try{s=await xa()}catch(c){console.warn("[BindingBuilder] Could not read the saved session:",c),H("Couldn't read the saved session from this browser."),V("error");return}if(!s){H("No saved session in this browser yet \u2014 one is saved as soon as you edit a model."),V("error");return}yn(s)},os=async()=>{let s=Yt;if(yn(null),!s)return;let{session:c,file:x}=s,{model:C}=c;Ze.current=null;let E=mo(Ot,c.sceneConfig),U=Ke.current,ee=await Io(c.bindings);if(Ke.current!==U)return;let G;if(C.kind==="file"){if(!x)return;let Ie=Ke.current,on;try{on=await Ln(x)}catch(as){console.warn("[BindingBuilder] Could not read the saved model:",as),H(Ki(C.name)),V("error");return}if(Ke.current!==Ie){on.cleanup();return}Fe.current?.cleanup(),Fe.current=on,G=on.url}else{G=C.url;let Ie=vt.current;if(G===N&&Ie?.url===G&&!ze.current){Xe.current={model:C},Qt.current=null,b.reset(zt(Dn(Ie.scene),ee)),we.reset(E),H(`Restored your last session with ${C.name}.`),V("success");return}Fe.current?.cleanup(),Fe.current=null}Xe.current={model:C,file:x??void 0},Qt.current=C.kind==="file"?C.key:null;let be=++Ke.current;de(!0),at(null),it.current=0,he.current&&(clearTimeout(he.current),he.current=null),Zt.current=x?.size,H(`Restoring your last session with ${C.name}...`),V("default"),l(C.name),P({url:G,name:C.name}),Jt(null),D(null),vt.current=null,b.reset({}),we.reset(E),ze.current={requestId:be,modelName:C.name,modelUrl:G,storedBindings:ee,restoring:!0},O(G)};return Mt.status==="checking"?y("div",{className:"bb-root bb-root--licenseChecking",children:y(zn,{title:"Verifying License",message:"Checking your license key..."})}):Mt.status==="invalid"?y("div",{className:"bb-root bb-root--licenseInvalid",children:y(zn,{tone:"error",title:"Invalid License",message:Mt.isLocalDomain?Mt.reason??"License has been revoked or has expired":"Failed to load. Please contact the site administrator."})}):I(ia.Provider,{value:fr,children:[I("div",{className:"bb-root",children:[y("input",{ref:g,type:"file",accept:$o,className:"bb-hiddenInput",onChange:zr,disabled:z}),y("input",{ref:M,type:"file",accept:".json,application/json",className:"bb-hiddenInput",onChange:Dr,disabled:z}),y("input",{ref:B,type:"file",accept:".json,application/json",className:"bb-hiddenInput",onChange:Hr,disabled:z}),I("aside",{className:`bb-sidebar bb-sidebar--left ${ft?"bb-sidebar--collapsed":""}`,children:[I("div",{className:"bb-header bb-header--sidebar",children:[!ft&&y("h1",{className:"bb-title",children:"Binding Builder"}),y("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>Xi(s=>!s),"aria-label":ft?"Open editor sidebar":"Collapse editor sidebar",title:ft?"Open editor":"Collapse editor",children:ft?"\u2192":"\u2190"})]}),!ft&&I(Tt,{children:[I("div",{className:"bb-tabRow",children:[y("button",{type:"button",className:`bb-tab ${_e==="object"?"bb-tab--active":""}`,onClick:()=>hn("object"),children:"Object"}),y("button",{type:"button",className:`bb-tab ${_e==="scene"?"bb-tab--active":""}`,onClick:()=>hn("scene"),children:"Scene"})]}),y("section",{className:"bb-editor",children:_e==="scene"?y(Tt,{children:N?y(qn,{config:Ne,onChange:qt,activeSubTab:Wt,onActiveSubTabChange:wo,cameraState:Wt==="Cinematic"&&le?{position:le.position,target:le.target,azimuthAngle:le.azimuthAngle,polarAngle:le.polarAngle}:null,onPreviewWaypoint:vr,animationClipDetails:tn.clipDetails,animationPlayback:tn}):y("div",{className:"bb-emptyEditor",children:"Upload a model to edit its scene settings."})}):!pe||!v?y("div",{className:"bb-emptyEditor",children:"Select a generated node binding to edit its values."}):I(Tt,{children:[y("div",{className:"bb-editorHeader",children:I("div",{children:[y("div",{className:"bb-sectionKicker",children:"Editing Binding"}),y("h2",{className:"bb-editorTitle",children:pe.label||v}),I("div",{className:"bb-editorMeta",children:[y("span",{children:pe.type}),y("span",{children:pe.modelObjectId})]})]})}),y(mi,{selectedItem:v,selectedBinding:pe,open:qe.identity,onToggle:()=>Je("identity"),updateBinding:We,idError:kr}),y(xi,{selectedItem:v,selectedBinding:pe,open:qe.basics,onToggle:()=>Je("basics"),updateBinding:We}),I(Te,{title:"Material",open:qe.material,onToggle:()=>Je("material"),tooltip:"Edit the selected object's base material, textures, and surface properties.",children:[y(ui,{disabled:!v,onApply:s=>v&&Bn(v,c=>({...c,...s}))}),y(ci,{selectedItem:v,selectedMaterial:Pn,pbrWorkflow:ar,onPbrWorkflowChange:ir,openMaterialPanels:tr,materialPanelEnabled:rr,onToggleMaterialPanel:or,onSetMaterialPanelState:Pr,updateSelectedMaterial:Bn,setSelectedTexturePath:Nr,isTexturePositioningEnabled:ur,onConfirmTexturePosition:es})]}),y(yi,{selectedItem:v,selectedBinding:pe,open:qe.actions,onToggle:()=>Je("actions"),updateBinding:We}),y(wi,{selectedBinding:pe,open:qe.camera,onToggle:()=>Je("camera"),cameraState:le,formattedCameraState:yr,savedCameraPosition:Qe,onSaveCameraPosition:qr,onGoToSavedCamera:Jr,onClearSavedCamera:Xr,onResetView:Zr,onFitScene:Qr}),y(Pi,{selectedItem:v,selectedBinding:pe,open:qe.transform,onToggle:()=>Je("transform"),updateBinding:We,moveModeEnabled:wn,onToggleMoveMode:To,transformSpace:Bo,onTransformSpaceChange:cr,originalTransform:Cn.current[v]??null}),y(oo,{title:"Metrics",label:"Metrics JSON",open:qe.metrics,onToggle:()=>Je("metrics"),draft:vo,error:Yi,example:'{"area": 42}',onDraftChange:Ut,onCommit:()=>Vo("metrics",vo,_t)}),y(oo,{title:"Metadata",label:"Metadata JSON",open:qe.metadata,onToggle:()=>Je("metadata"),draft:yo,error:qi,example:'{"room": "kitchen"}',onDraftChange:$t,onCommit:()=>Vo("metadata",yo,Kt)})]})}),_e==="object"&&I("div",{className:"bb-toolbar",children:[I("div",{className:"bb-toolbarGroup",children:[y("button",{type:"button",className:"bb-iconButton",disabled:!b.canUndo,onClick:b.undo,title:"Undo (Cmd/Ctrl+Z)",children:y(Hi,{size:16})}),y("button",{type:"button",className:"bb-iconButton",disabled:!Ve.length,onClick:()=>Uo("bindings"),title:"Reset object bindings to default",children:y(Vi,{size:16})}),y("button",{type:"button",className:"bb-iconButton",disabled:!b.canRedo,onClick:b.redo,title:"Redo (Cmd/Ctrl+Shift+Z)",children:y(Ii,{size:16})})]}),y("div",{className:"bb-toolbarDivider"}),I("button",{type:"button",className:"bb-button bb-button--ghost",disabled:!Ve.length||z,onClick:Er,title:"Re-apply a previously exported objectBindings.json onto this model",children:[y(Gi,{size:14}),"Import"]}),y("div",{className:"bb-toolbarDivider"}),y(eo,{disabled:!Ve.length||go,exporting:go,onExportJson:()=>Go("json"),onExportTs:()=>Go("ts")})]}),_e==="scene"&&I("div",{className:"bb-toolbar",children:[I("div",{className:"bb-toolbarGroup",children:[y("button",{type:"button",className:"bb-iconButton",disabled:!we.canUndo,onClick:we.undo,title:"Undo (Cmd/Ctrl+Z)",children:y(Hi,{size:16})}),y("button",{type:"button",className:"bb-iconButton",onClick:()=>Uo("scene"),title:"Reset scene config to default",children:y(Vi,{size:16})}),y("button",{type:"button",className:"bb-iconButton",disabled:!we.canRedo,onClick:we.redo,title:"Redo (Cmd/Ctrl+Shift+Z)",children:y(Ii,{size:16})})]}),y("div",{className:"bb-toolbarDivider"}),I("button",{type:"button",className:"bb-button bb-button--ghost",disabled:!Ve.length||z,onClick:Fr,title:"Re-apply a previously exported sceneConfig.json",children:[y(Gi,{size:14}),"Import"]}),y("div",{className:"bb-toolbarDivider"}),y(eo,{disabled:!Ve.length||z,onExportJson:()=>Gt("sceneConfig.json",Li(Ne),"application/json"),onExportTs:()=>Gt("sceneConfig.ts",Oi(Ne),"text/typescript")})]})]})]}),I("main",{className:"bb-previewShell",children:[I("div",{className:"bb-previewHeader",children:[I("div",{className:"bb-previewToggles",children:[I("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[y("input",{type:"checkbox",checked:So,onChange:s=>sr(s.target.checked)}),"Zoom on selected"]}),I("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[y("input",{type:"checkbox",checked:vn,onChange:s=>lr(s.target.checked)}),"Highlight on hover"]}),I("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[y("input",{type:"checkbox",checked:ko,onChange:s=>dr(s.target.checked)}),"Camera controller"]})]}),I("div",{className:"bb-previewControlsColumn",children:[I("div",{className:"bb-previewControls",children:[y("div",{className:"bb-previewMeta",children:y("span",{children:v?`Focused: ${v}`:"Select a node to inspect it"})}),d&&!t&&y("button",{type:"button",className:"bb-restoreSessionButton",disabled:z,onClick:ns,title:"Restore your last session \u2014 the model, its object bindings, and scene settings saved in this browser","aria-label":"Restore last session",children:y(Ui,{size:14})}),N&&d&&!t&&y("button",{type:"button",className:"bb-button bb-button--ghost bb-removeModelButton",onClick:Lr,children:"Remove model"})]}),N&&y("div",{className:"bb-moveHint",children:fe?y(Tt,{children:"Click the preview to look around \xB7 Esc to release"}):wn?y(Tt,{children:"Select a mesh \xB7 drag the colored arrows, planes, or rings"}):I(Tt,{children:[y("kbd",{children:"W"}),y("kbd",{children:"A"}),y("kbd",{children:"S"}),y("kbd",{children:"D"})," move \xB7 ",y("kbd",{children:"Space"}),"/",y("kbd",{children:"C"})," up \xB7 down \xB7 drag to look"]})})]})]}),I("div",{className:"bb-preview",children:[y(ra,{visible:z||Wi,message:ho,tone:Vt,progress:ye??void 0}),N?y(ua,{modelUrl:N,tilesetUrl:S?.tilesetUrl,objectBindings:a,selectedObject:pe,onObjectSelect:_r,onObjectBindingsChange:L,onTextureUpload:Sr,onObjectEditLeaseChange:(s,c)=>k?.(s.modelObjectId||s.id,c),showObjectBindingDataPanel:!1,showSceneObjectsPanel:!1,onCameraChange:hr,onViewerReady:xr,onAnnotationsChange:wr,activeAnnotation:mr?.annotation??null,onActiveAnnotationChange:Cr,onAnimationsReady:Mr,onSceneLoaded:Tr,onLoadError:Rr,onObjectCatalog:S?.tilesetUrl?Br:void 0,onProgress:Ar,onCameraControllerChange:Sn,cameraControllerType:Ro,onTexturePositioningChange:pr,endTexturePositioningRef:Mo,licenseKey:o,licenseValidationUrl:n,dracoDecoderPath:i,ktx2TranscoderPath:r,meshopt:e,sceneConfig:Ne,onSceneConfigChange:qt,preserveDrawingBuffer:!0,disableZoom:!1,zoomOnSelected:So,highlightOnHover:vn,enableCameraControls:ko,moveModeEnabled:wn,objectTransformSpace:Bo,enableKeyboardNavigation:!0,showViewGizmo:!0,panelHoveredObject:vn?gr:null,showLoadingOverlay:!1,autoRotate:fe?!1:Ne.model.autoRotate??!1,autoRotateSpeed:Ne.model.autoRotateSpeed??1}):y("div",{className:`bb-previewPlaceholder ${Ji?"bb-previewPlaceholder--dragActive":""}`,onDragEnter:Gr,onDragOver:Vr,onDragLeave:Ur,onDrop:$r,children:I("div",{children:[y("div",{children:"Upload a GLB, GLTF, OBJ, FBX, or USDZ model, or drag a supported model/ZIP bundle here to generate editable object bindings."}),d?y("button",{type:"button",className:"bb-previewPlaceholderButton",onClick:Or,disabled:z,children:"Upload"}):null]})})]})]}),y(Bi,{bindings:a,selectedItem:v,onSelect:Kr,onHover:Wr,isOpen:!Zi,onToggle:Yr})]}),br&&y("div",{className:"bb-reset-overlay",onClick:yt,children:I("div",{className:"bb-reset-dialog",onClick:s=>s.stopPropagation(),children:[I("div",{className:"bb-reset-header",children:[I("h3",{className:"bb-reset-title",children:[y(ed,{size:20,className:"bb-icon-warning"}),"Confirm Reset"]}),y("button",{className:"bb-reset-close",onClick:yt,children:y($i,{size:20})})]}),I("div",{className:"bb-reset-body",children:[I("p",{className:"bb-reset-message",children:["Are you sure you want to reset"," ",y("strong",{children:Rt==="bindings"?"Object Bindings":"Scene Config"}),"?"]}),y("p",{className:"bb-reset-details",children:Rt==="bindings"?"This will remove all your custom changes to object properties, groups, tags, transforms, materials, actions, camera positions, metrics, and metadata.":"This will restore all scene settings (camera, lighting, environment, background, animations, annotations, etc.) to their default values."}),y("p",{className:"bb-reset-warning",children:"This action cannot be undone!"})]}),I("div",{className:"bb-reset-footer",children:[y("button",{className:"bb-reset-btn",onClick:yt,children:"Cancel"}),y("button",{className:"bb-reset-btn-danger",onClick:ts,children:"Reset"})]})]})}),Yt&&y("div",{className:"bb-reset-overlay",onClick:Mn,children:I("div",{className:"bb-reset-dialog",onClick:s=>s.stopPropagation(),children:[I("div",{className:"bb-reset-header",children:[I("h3",{className:"bb-reset-title",children:[y(Ui,{size:20,className:"bb-icon-restore"}),"Restore Last Session"]}),y("button",{className:"bb-reset-close",onClick:Mn,children:y($i,{size:20})})]}),I("div",{className:"bb-reset-body",children:[I("p",{className:"bb-reset-message",children:["Restore ",y("strong",{children:Yt.session.model.name}),", saved ",od(Yt.session.savedAt),"?"]}),y("p",{className:"bb-reset-details",children:"This reloads that model with its object bindings and scene settings, replacing what's in the editor now."})]}),I("div",{className:"bb-reset-footer",children:[y("button",{className:"bb-reset-btn",onClick:Mn,children:"Cancel"}),y("button",{className:"bb-reset-btn-restore",onClick:os,children:"Restore"})]})]})})]})}export{ad as a};
|