@liveroom-tech/react-immersive 6.1.1 → 6.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{SequencesTab-LWGOVQ6Y.mjs → SequencesTab-66VBWTO5.mjs} +1 -1
- package/dist/binding-builder.css +1 -1
- package/dist/binding-builder.d.mts +3 -3
- package/dist/binding-builder.d.ts +3 -3
- package/dist/binding-builder.js +75 -27
- package/dist/binding-builder.mjs +1 -1
- package/dist/{chunk-KNCABWVN.mjs → chunk-4RYMXBK6.mjs} +2 -2
- package/dist/chunk-5P7ETEAN.mjs +50 -0
- package/dist/{chunk-EV6THDXD.mjs → chunk-6Q6YZ7O5.mjs} +1 -1
- package/dist/{chunk-MLT4JQAY.mjs → chunk-B75URXOE.mjs} +1 -1
- package/dist/chunk-EC542N4J.mjs +1 -0
- package/dist/{chunk-5PJ5MLKE.mjs → chunk-JK7GRGRG.mjs} +1 -1
- package/dist/{chunk-DEFZEXTA.mjs → chunk-LKKH4PO7.mjs} +1 -1
- package/dist/chunk-U3BQMOC3.mjs +83 -0
- package/dist/{chunk-Z2VQGUC2.mjs → chunk-VMYNX63T.mjs} +2 -2
- package/dist/hosted.css +1 -1
- package/dist/hosted.d.mts +3 -3
- package/dist/hosted.d.ts +3 -3
- package/dist/hosted.js +74 -26
- package/dist/hosted.mjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +72 -24
- package/dist/index.mjs +1 -1
- package/dist/{modelFileResolver-B8ADn9Nl.d.mts → modelFileResolver-B2B3F3d1.d.mts} +7 -0
- package/dist/{modelFileResolver-B8ADn9Nl.d.ts → modelFileResolver-B2B3F3d1.d.ts} +7 -0
- package/dist/{modelViewerProps-BE4D56Ti.d.ts → modelViewerProps-Bo48RDq6.d.ts} +4 -2
- package/dist/{modelViewerProps-DBwh-fmu.d.mts → modelViewerProps-DkvYb1GH.d.mts} +4 -2
- package/dist/{publicProps-3LNTAskZ.d.ts → publicProps-DJSccx3b.d.ts} +1 -1
- package/dist/{publicProps-Clr1nSE6.d.mts → publicProps-DN0-8tBm.d.mts} +1 -1
- package/dist/simple-model-viewer.d.mts +2 -2
- package/dist/simple-model-viewer.d.ts +2 -2
- package/dist/simple-model-viewer.js +1 -1
- package/dist/simple-model-viewer.mjs +1 -1
- package/dist/utils.d.mts +4 -4
- package/dist/utils.d.ts +4 -4
- package/dist/utils.js +50 -2
- package/dist/utils.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-5FLX45O5.mjs +0 -2
- package/dist/chunk-644OGSQJ.mjs +0 -83
- package/dist/chunk-OPDRK3GS.mjs +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{e as ce}from"./chunk-AL6UIGWP.mjs";import{a as re,b as ne}from"./chunk-MLT4JQAY.mjs";import{e as U,f as se,h as oe,i as le}from"./chunk-FGAJ2UT7.mjs";import"./chunk-DEFZEXTA.mjs";import{a as ee,b as te,c as $,d as ae,e as L,g as ie}from"./chunk-LX3GXQNU.mjs";import"./chunk-OPDRK3GS.mjs";import"./chunk-JR557W27.mjs";import{useEffect as be,useMemo as Te,useRef as we,useState as S}from"react";import{Copy as je,DiamondPlus as Ie,Plus as _,ScanLine as Ee,Trash2 as G}from"lucide-react";import{useEffect as de,useState as pe}from"react";import{Fragment as ue,jsx as g,jsxs as T}from"react/jsx-runtime";function j({label:p,value:o,onChange:r,min:l,max:u,step:f=.1,disabled:q=!1}){let[y,d]=pe(String(Number(o.toFixed(5))));return de(()=>d(String(Number(o.toFixed(5)))),[o]),T("label",{className:"sq-field",children:[g("span",{children:p}),g("input",{type:"number","aria-label":p,value:y,step:f,min:l,max:u,disabled:q,onChange:m=>d(m.target.value),onBlur:()=>{let m=y.trim()?Number(y):NaN;Number.isFinite(m)&&(l===void 0||m>=l)&&(u===void 0||m<=u)&&m!==o&&r(m),d(String(Number(o.toFixed(5))))},onKeyDown:m=>{m.stopPropagation(),m.key==="Enter"&&m.currentTarget.blur(),m.key==="Escape"&&(m.preventDefault(),d(String(o)))}})]})}function X({label:p,value:o,onChange:r}){let[l,u]=pe(o);return de(()=>u(o),[o]),T("label",{className:"sq-field",children:[g("span",{children:p}),g("input",{"aria-label":p,value:l,maxLength:256,onChange:f=>u(f.target.value),onBlur:()=>{l.trim()&&l.trim()!==o?r(l.trim()):u(o)},onKeyDown:f=>{f.stopPropagation(),f.key==="Enter"&&f.currentTarget.blur()}})]})}function H({label:p,value:o,onChange:r,degrees:l=!1}){return T("fieldset",{className:"sq-vector",children:[T("legend",{children:[p,l?" (\xB0)":""]}),g("div",{children:o.map((u,f)=>g(j,{label:["X","Y","Z"][f],value:l?u*180/Math.PI:u,onChange:q=>r(o.map((y,d)=>f===d?l?q*Math.PI/180:q:y))},f))})]})}function me({target:p,value:o,onChange:r}){if(p.kind==="camera"){let l=o;return T(ue,{children:[g(H,{label:"Camera position",value:l.position,onChange:u=>r({...l,position:u})}),g(H,{label:"Camera target",value:l.target,onChange:u=>r({...l,target:u})}),T(ue,{children:[l.fov!==null&&g(j,{label:"FOV (\xB0)",min:1,max:179,value:l.fov,onChange:u=>r({...l,fov:u})}),g(j,{label:"Zoom",min:.001,value:l.zoom,onChange:u=>r({...l,zoom:u})})]})]})}return Array.isArray(o)?g(H,{label:p.kind==="object"?p.property[0].toUpperCase()+p.property.slice(1):"Value",value:o,degrees:p.kind==="object"&&p.property==="rotation",onChange:r}):typeof o=="boolean"?T("label",{className:"sq-check",children:[g("input",{type:"checkbox",checked:o,onChange:l=>r(l.target.checked)}),"Visible"]}):typeof o=="string"?T("label",{className:"sq-field sq-color",children:[g("span",{children:"Color"}),g("input",{type:"color","aria-label":"Keyframe color",value:o,onChange:l=>r(l.target.value)}),g("code",{children:o})]}):g(j,{label:p.kind==="clip"?"Clip time (s)":"Value",min:0,max:p.kind==="object"&&p.property!=="emissiveIntensity"?1:void 0,step:.01,value:o,onChange:r})}import{Fragment as fe,jsx as t,jsxs as s}from"react/jsx-runtime";var I=()=>crypto.randomUUID(),ge={position:"Position",rotation:"Rotation",scale:"Scale",visible:"Visibility",baseColor:"Color",emissive:"Emissive color",opacity:"Opacity",roughness:"Roughness",metalness:"Metalness",emissiveIntensity:"Emissive intensity"},Pe={linear:"Linear","ease-in":"Ease in","ease-out":"Ease out","ease-in-out":"Ease in / out",step:"Hold / step"};function Ae({config:p,onChange:o,controls:r,bindings:l,clipDetails:u}){let{tier:f}=oe(),q=re(r),y=Te(()=>{try{return{sequences:L(p.sequences??[]),error:""}}catch(e){return{sequences:[],error:e instanceof Error?e.message:"Invalid sequence data."}}},[p.sequences]),d=y.sequences,[Q,m]=S(null),[qe,N]=S(null),[ke,x]=S(null),[w,he]=S("object"),[ve,ye]=S(""),[V,xe]=S("position"),[Y,Se]=S(""),[Z,P]=S(""),[D,K]=S(null),A=we(null),i=d.find(e=>e.id===Q)??d[0],c=i?.tracks.find(e=>e.id===qe)??i?.tracks[0],h=c?.keyframes.find(e=>e.id===ke)??c?.keyframes[0],B=Object.values(l).filter((e,a,k)=>!e.removed&&k.findIndex(n=>n.modelObjectId===e.modelObjectId)===a),M=B.find(e=>e.modelObjectId===ve)??B[0],R=u.some(e=>e.sourceName===Y)?Y:u[0]?.sourceName;be(()=>{i&&r&&q.sequenceId!==i.id&&r.select(i.id)},[r,i?.id,q]),be(()=>()=>r?.stop(),[r]);let O=e=>{try{let a=L(e);o({...p,sequences:a}),P("")}catch(a){P(a instanceof Error?a.message:"Invalid sequence.")}},E=e=>O(d.map(a=>a.id===e.id?e:a)),z=e=>{i&&E({...i,tracks:i.tracks.map(a=>a.id===e.id?e:a)})},C=(e,a)=>{if(!i||!ae(a.value,e.target)){P("Use a valid value; scale components must be nonzero.");return}z(ie(e,{...a,time:Math.max(0,Math.min(i.duration,a.time))})),N(e.id),x(a.id),r?.pause(),r?.seek(a.time)},J=()=>{if(d.length>=64)return;let e={id:I(),name:`Sequence ${d.length+1}`,duration:5,loop:!1,autoPlay:!1,tracks:[]};O([...d,e]),m(e.id),N(null),x(null)},v=w==="camera"?{kind:"camera"}:w==="clip"?R?{kind:"clip",clip:R}:null:M?{kind:"object",objectId:M.modelObjectId,property:V}:null,F=!!v&&i?.tracks.some(e=>$(e.target)===$(v)),Ne=()=>{if(!i||!v||F)return;let e=r?.capture(v);if(e==null){P("That target is not ready. Wait for the model, or choose another object/clip.");return}let a=v.kind==="clip"?Math.min(i.duration,u.find(n=>n.sourceName===v.clip)?.duration??i.duration):structuredClone(e),k={id:I(),name:v.kind==="camera"?"Camera":v.kind==="clip"?v.clip:`${M?.label||M?.modelObjectId} \xB7 ${ge[V]}`,target:v,keyframes:[{id:I(),time:0,value:e,easing:V==="visible"&&w==="object"?"step":"ease-in-out"},{id:I(),time:i.duration,value:a}]};E({...i,tracks:[...i.tracks,k]}),N(k.id),x(k.keyframes[1].id),r?.seek(i.duration)},Ce=()=>{if(!c||!i||c.keyframes.length>=2048)return;let e=r?.capture(c.target);if(e==null){P("The selected target is unavailable.");return}let a={id:I(),time:Math.min(q.time,i.duration),value:e,easing:"ease-in-out"};C(c,a)};return s("section",{className:"sq-editor","aria-label":"Visual sequence authoring",children:[y.error&&t("p",{role:"alert",className:"sq-error",children:y.error}),U(f,"sequences",d.length)?null:t(le,{requiredTier:se("sequences",d.length),feature:"More sequences"}),i?s(fe,{children:[s("div",{className:"sq-toolbar",children:[t("select",{className:"se-select sq-toolbarPicker","aria-label":"Authored sequence",value:i.id,onChange:e=>{m(e.target.value),N(null),x(null),r?.select(e.target.value)},children:d.map(e=>t("option",{value:e.id,children:e.name},e.id))}),t("button",{type:"button",className:"se-iconButton",title:"Add sequence","aria-label":"Add sequence",disabled:d.length>=64||!U(f,"sequences",d.length),onClick:J,children:t(_,{size:14})}),t("button",{type:"button",className:"se-iconButton",title:"Duplicate sequence","aria-label":"Duplicate sequence",disabled:d.length>=64,onClick:()=>{let e={...structuredClone(i),id:I(),name:`${i.name} copy`.slice(0,256),autoPlay:!1};O([...d,e]),m(e.id)},children:t(je,{size:13})}),t("button",{type:"button",className:"se-iconButton",title:"Delete sequence","aria-label":"Delete sequence",onClick:()=>{r?.stop(),O(d.filter(e=>e.id!==i.id)),m(null)},children:t(G,{size:13})}),t("span",{className:"sq-toolbarDivider"}),t(X,{label:"Name",value:i.name,onChange:e=>E({...i,name:e})}),t(j,{label:"Duration",min:.1,max:3600,value:i.duration,onChange:e=>E({...i,duration:e,tracks:i.tracks.map(a=>({...a,keyframes:a.keyframes.map(k=>({...k,time:k.time/i.duration*e}))}))})}),s("label",{className:"sq-check",children:[t("input",{type:"checkbox",checked:i.loop,onChange:e=>E({...i,loop:e.target.checked})}),"Loop"]}),s("label",{className:"sq-check",children:[t("input",{type:"checkbox",checked:i.autoPlay,onChange:e=>O(d.map(a=>({...a,autoPlay:a.id===i.id?e.target.checked:!1})))}),"Autoplay"]})]}),s("div",{className:"sq-body",children:[s("div",{className:"sq-main",children:[t(ne,{controls:r,duration:i.duration,hasTracks:i.tracks.some(e=>!e.muted&&e.keyframes.length>0)}),s("div",{className:"sq-timeline","aria-label":"Sequence timeline",title:"Drag keys to retime. Arrow keys move 0.1s; Shift moves 0.01s. A key at the same time is replaced.",children:[s("div",{className:"sq-ruler",children:[t("span",{className:"sq-rulerTitle",children:"Tracks"}),t("div",{className:"sq-rulerScale",children:[0,.25,.5,.75,1].map(e=>s("span",{children:[(i.duration*e).toFixed(1),"s"]},e))})]}),!i.tracks.length&&t("p",{className:"sq-hint",children:"Add a track to create its start and end keyframes."}),i.tracks.map(e=>s("div",{className:`sq-track ${c?.id===e.id?"sq-track--active":""}`,children:[s("div",{className:"sq-trackLabel",children:[t("button",{type:"button",title:e.name,onClick:()=>{N(e.id),x(e.keyframes[0]?.id??null)},children:e.name}),s("label",{title:"Mute track",children:[t("input",{"aria-label":`Mute ${e.name}`,type:"checkbox",checked:!!e.muted,onChange:a=>z({...e,muted:a.target.checked})}),"Mute"]})]}),s("div",{className:"sq-lane",role:"group","aria-label":`${e.name} keyframes`,onDoubleClick:a=>{if(a.target!==a.currentTarget)return;let k=a.currentTarget.getBoundingClientRect(),n=Math.round(Math.max(0,Math.min(1,(a.clientX-k.left)/k.width))*i.duration*100)/100,b=r?.capture(e.target);b!=null&&C(e,{id:I(),time:n,value:b})},children:[t("span",{className:"sq-playhead",style:{left:`${q.time/i.duration*100}%`}}),e.keyframes.map(a=>{let k=D?.frameId===a.id&&D.trackId===e.id?D.time:a.time;return t("button",{type:"button",className:`sq-key ${h?.id===a.id&&c?.id===e.id?"sq-key--active":""}`,style:{left:`${k/i.duration*100}%`},"aria-label":`${e.name} keyframe at ${k.toFixed(2)} seconds`,"aria-pressed":h?.id===a.id&&c?.id===e.id,onClick:n=>{n.detail===0&&(N(e.id),x(a.id),r?.pause(),r?.seek(a.time))},onPointerDown:n=>{if(n.button!==0)return;n.preventDefault(),n.stopPropagation(),n.currentTarget.focus(),n.currentTarget.setPointerCapture(n.pointerId);let b=n.currentTarget.parentElement.getBoundingClientRect();A.current={track:e,frame:a,left:b.left,width:b.width,time:a.time},N(e.id),x(a.id),r?.pause(),r?.seek(a.time)},onPointerMove:n=>{let b=A.current;if(!b||b.frame.id!==a.id||b.track.id!==e.id)return;let W=n.shiftKey?.01:.1;b.time=Math.min(i.duration,Math.max(0,Math.round((n.clientX-b.left)/b.width*i.duration/W)*W)),K({trackId:e.id,frameId:a.id,time:b.time}),r?.seek(b.time)},onPointerUp:()=>{let n=A.current;n&&(n.time!==n.frame.time&&C(n.track,{...n.frame,time:n.time}),A.current=null,K(null))},onPointerCancel:()=>{A.current=null,K(null),r?.seek(a.time)},onKeyDown:n=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(n.key))return;n.preventDefault(),n.stopPropagation();let b=n.key==="Home"?0:n.key==="End"?i.duration:a.time+(n.key==="ArrowLeft"?-1:1)*(n.shiftKey?.01:.1);C(e,{...a,time:b})}},a.id)})]})]},e.id))]})]}),s("aside",{className:"sq-side",children:[s(ce,{title:"Add track",children:[s("label",{className:"sq-field",children:[t("span",{children:"Type"}),s("select",{"aria-label":"Track type",value:w,onChange:e=>he(e.target.value),children:[t("option",{value:"object",children:"Object"}),t("option",{value:"camera",children:"Camera"}),t("option",{value:"clip",children:"Animation clip"})]})]}),w==="object"&&s("label",{className:"sq-field",children:[t("span",{children:"Property"}),t("select",{"aria-label":"Track property",value:V,onChange:e=>xe(e.target.value),children:ee.map(e=>t("option",{value:e,children:ge[e]},e))})]}),w==="object"&&s("label",{className:"sq-field",children:[t("span",{children:"Object"}),t("select",{"aria-label":"Track object",value:M?.modelObjectId??"",onChange:e=>ye(e.target.value),children:B.map(e=>t("option",{value:e.modelObjectId,children:e.label||e.modelObjectId},e.modelObjectId))})]}),w==="clip"&&s("label",{className:"sq-field",children:[t("span",{children:"Clip"}),t("select",{"aria-label":"Track animation clip",value:R??"",onChange:e=>Se(e.target.value),children:u.map(e=>t("option",{value:e.sourceName,children:e.sourceName},e.sourceName))}),!u.length&&t("small",{children:"This model has no animation clips."})]}),t("div",{className:"rui-actions",children:s("button",{type:"button",className:"bb-button",onClick:Ne,disabled:!v||!q.ready||F||i.tracks.length>=128,children:[t(_,{size:13,"aria-hidden":"true"}),"Add track"]})}),F&&t("p",{className:"rui-note",children:"That property already has a track."})]}),c&&s("section",{className:"sq-inspector","aria-label":"Selected track and keyframe",children:[s("div",{className:"rui-groupHeader",children:[t("span",{children:"Selected track"}),t("button",{type:"button",className:"se-iconButton",title:"Delete track","aria-label":"Delete track",onClick:()=>{E({...i,tracks:i.tracks.filter(e=>e.id!==c.id)}),N(null),x(null)},children:t(G,{size:13})})]}),t(X,{label:"Name",value:c.name,onChange:e=>z({...c,name:e})}),t("div",{className:"rui-actions",children:s("button",{type:"button",className:"bb-button",disabled:!q.ready||c.keyframes.length>=2048,onClick:Ce,children:[t(Ie,{size:13,"aria-hidden":"true"}),"Add keyframe at playhead"]})}),h&&s(fe,{children:[s("div",{className:"rui-groupHeader",children:[t("span",{children:"Keyframe"}),t("button",{type:"button",className:"se-iconButton",title:"Delete keyframe","aria-label":"Delete keyframe",onClick:()=>{z({...c,keyframes:c.keyframes.filter(e=>e.id!==h.id)}),x(null)},children:t(G,{size:14})})]}),t(j,{label:"Time",min:0,max:i.duration,value:h.time,step:.01,onChange:e=>C(c,{...h,time:e})}),s("label",{className:"sq-field",children:[t("span",{children:"Easing"}),t("select",{"aria-label":"Keyframe easing",value:c.target.kind==="object"&&c.target.property==="visible"?"step":h.easing??"ease-in-out",disabled:c.target.kind==="object"&&c.target.property==="visible",onChange:e=>C(c,{...h,easing:e.target.value}),children:te.map(e=>t("option",{value:e,children:Pe[e]},e))})]}),t(me,{target:c.target,value:h.value,onChange:e=>C(c,{...h,value:e})}),t("div",{className:"rui-actions",children:s("button",{type:"button",className:"bb-button",disabled:!q.ready,onClick:()=>{let e=r?.capture(c.target);e!=null&&C(c,{...h,value:e})},children:[t(Ee,{size:13,"aria-hidden":"true"}),"Capture current value"]})})]})]})]})]})]}):s("div",{className:"sq-empty",children:[t("p",{children:"Add a sequence, then add tracks and capture keyframes on the timeline."}),s("button",{type:"button",className:"bb-button bb-button--primary",onClick:J,children:[t(_,{size:13,"aria-hidden":"true"}),"Create sequence"]})]}),(Z||q.issues.length>0)&&t("div",{role:"status",className:"sq-error",children:Z||q.issues.join(" ")})]})}export{Ae as default};
|
|
1
|
+
import{e as ce}from"./chunk-AL6UIGWP.mjs";import{a as re,b as ne}from"./chunk-B75URXOE.mjs";import{e as U,f as se,h as oe,i as le}from"./chunk-FGAJ2UT7.mjs";import"./chunk-LKKH4PO7.mjs";import{a as ee,b as te,c as $,d as ae,e as L,g as ie}from"./chunk-LX3GXQNU.mjs";import"./chunk-EC542N4J.mjs";import"./chunk-JR557W27.mjs";import{useEffect as be,useMemo as Te,useRef as we,useState as S}from"react";import{Copy as je,DiamondPlus as Ie,Plus as _,ScanLine as Ee,Trash2 as G}from"lucide-react";import{useEffect as de,useState as pe}from"react";import{Fragment as ue,jsx as g,jsxs as T}from"react/jsx-runtime";function j({label:p,value:o,onChange:r,min:l,max:u,step:f=.1,disabled:q=!1}){let[y,d]=pe(String(Number(o.toFixed(5))));return de(()=>d(String(Number(o.toFixed(5)))),[o]),T("label",{className:"sq-field",children:[g("span",{children:p}),g("input",{type:"number","aria-label":p,value:y,step:f,min:l,max:u,disabled:q,onChange:m=>d(m.target.value),onBlur:()=>{let m=y.trim()?Number(y):NaN;Number.isFinite(m)&&(l===void 0||m>=l)&&(u===void 0||m<=u)&&m!==o&&r(m),d(String(Number(o.toFixed(5))))},onKeyDown:m=>{m.stopPropagation(),m.key==="Enter"&&m.currentTarget.blur(),m.key==="Escape"&&(m.preventDefault(),d(String(o)))}})]})}function X({label:p,value:o,onChange:r}){let[l,u]=pe(o);return de(()=>u(o),[o]),T("label",{className:"sq-field",children:[g("span",{children:p}),g("input",{"aria-label":p,value:l,maxLength:256,onChange:f=>u(f.target.value),onBlur:()=>{l.trim()&&l.trim()!==o?r(l.trim()):u(o)},onKeyDown:f=>{f.stopPropagation(),f.key==="Enter"&&f.currentTarget.blur()}})]})}function H({label:p,value:o,onChange:r,degrees:l=!1}){return T("fieldset",{className:"sq-vector",children:[T("legend",{children:[p,l?" (\xB0)":""]}),g("div",{children:o.map((u,f)=>g(j,{label:["X","Y","Z"][f],value:l?u*180/Math.PI:u,onChange:q=>r(o.map((y,d)=>f===d?l?q*Math.PI/180:q:y))},f))})]})}function me({target:p,value:o,onChange:r}){if(p.kind==="camera"){let l=o;return T(ue,{children:[g(H,{label:"Camera position",value:l.position,onChange:u=>r({...l,position:u})}),g(H,{label:"Camera target",value:l.target,onChange:u=>r({...l,target:u})}),T(ue,{children:[l.fov!==null&&g(j,{label:"FOV (\xB0)",min:1,max:179,value:l.fov,onChange:u=>r({...l,fov:u})}),g(j,{label:"Zoom",min:.001,value:l.zoom,onChange:u=>r({...l,zoom:u})})]})]})}return Array.isArray(o)?g(H,{label:p.kind==="object"?p.property[0].toUpperCase()+p.property.slice(1):"Value",value:o,degrees:p.kind==="object"&&p.property==="rotation",onChange:r}):typeof o=="boolean"?T("label",{className:"sq-check",children:[g("input",{type:"checkbox",checked:o,onChange:l=>r(l.target.checked)}),"Visible"]}):typeof o=="string"?T("label",{className:"sq-field sq-color",children:[g("span",{children:"Color"}),g("input",{type:"color","aria-label":"Keyframe color",value:o,onChange:l=>r(l.target.value)}),g("code",{children:o})]}):g(j,{label:p.kind==="clip"?"Clip time (s)":"Value",min:0,max:p.kind==="object"&&p.property!=="emissiveIntensity"?1:void 0,step:.01,value:o,onChange:r})}import{Fragment as fe,jsx as t,jsxs as s}from"react/jsx-runtime";var I=()=>crypto.randomUUID(),ge={position:"Position",rotation:"Rotation",scale:"Scale",visible:"Visibility",baseColor:"Color",emissive:"Emissive color",opacity:"Opacity",roughness:"Roughness",metalness:"Metalness",emissiveIntensity:"Emissive intensity"},Pe={linear:"Linear","ease-in":"Ease in","ease-out":"Ease out","ease-in-out":"Ease in / out",step:"Hold / step"};function Ae({config:p,onChange:o,controls:r,bindings:l,clipDetails:u}){let{tier:f}=oe(),q=re(r),y=Te(()=>{try{return{sequences:L(p.sequences??[]),error:""}}catch(e){return{sequences:[],error:e instanceof Error?e.message:"Invalid sequence data."}}},[p.sequences]),d=y.sequences,[Q,m]=S(null),[qe,N]=S(null),[ke,x]=S(null),[w,he]=S("object"),[ve,ye]=S(""),[V,xe]=S("position"),[Y,Se]=S(""),[Z,P]=S(""),[D,K]=S(null),A=we(null),i=d.find(e=>e.id===Q)??d[0],c=i?.tracks.find(e=>e.id===qe)??i?.tracks[0],h=c?.keyframes.find(e=>e.id===ke)??c?.keyframes[0],B=Object.values(l).filter((e,a,k)=>!e.removed&&k.findIndex(n=>n.modelObjectId===e.modelObjectId)===a),M=B.find(e=>e.modelObjectId===ve)??B[0],R=u.some(e=>e.sourceName===Y)?Y:u[0]?.sourceName;be(()=>{i&&r&&q.sequenceId!==i.id&&r.select(i.id)},[r,i?.id,q]),be(()=>()=>r?.stop(),[r]);let O=e=>{try{let a=L(e);o({...p,sequences:a}),P("")}catch(a){P(a instanceof Error?a.message:"Invalid sequence.")}},E=e=>O(d.map(a=>a.id===e.id?e:a)),z=e=>{i&&E({...i,tracks:i.tracks.map(a=>a.id===e.id?e:a)})},C=(e,a)=>{if(!i||!ae(a.value,e.target)){P("Use a valid value; scale components must be nonzero.");return}z(ie(e,{...a,time:Math.max(0,Math.min(i.duration,a.time))})),N(e.id),x(a.id),r?.pause(),r?.seek(a.time)},J=()=>{if(d.length>=64)return;let e={id:I(),name:`Sequence ${d.length+1}`,duration:5,loop:!1,autoPlay:!1,tracks:[]};O([...d,e]),m(e.id),N(null),x(null)},v=w==="camera"?{kind:"camera"}:w==="clip"?R?{kind:"clip",clip:R}:null:M?{kind:"object",objectId:M.modelObjectId,property:V}:null,F=!!v&&i?.tracks.some(e=>$(e.target)===$(v)),Ne=()=>{if(!i||!v||F)return;let e=r?.capture(v);if(e==null){P("That target is not ready. Wait for the model, or choose another object/clip.");return}let a=v.kind==="clip"?Math.min(i.duration,u.find(n=>n.sourceName===v.clip)?.duration??i.duration):structuredClone(e),k={id:I(),name:v.kind==="camera"?"Camera":v.kind==="clip"?v.clip:`${M?.label||M?.modelObjectId} \xB7 ${ge[V]}`,target:v,keyframes:[{id:I(),time:0,value:e,easing:V==="visible"&&w==="object"?"step":"ease-in-out"},{id:I(),time:i.duration,value:a}]};E({...i,tracks:[...i.tracks,k]}),N(k.id),x(k.keyframes[1].id),r?.seek(i.duration)},Ce=()=>{if(!c||!i||c.keyframes.length>=2048)return;let e=r?.capture(c.target);if(e==null){P("The selected target is unavailable.");return}let a={id:I(),time:Math.min(q.time,i.duration),value:e,easing:"ease-in-out"};C(c,a)};return s("section",{className:"sq-editor","aria-label":"Visual sequence authoring",children:[y.error&&t("p",{role:"alert",className:"sq-error",children:y.error}),U(f,"sequences",d.length)?null:t(le,{requiredTier:se("sequences",d.length),feature:"More sequences"}),i?s(fe,{children:[s("div",{className:"sq-toolbar",children:[t("select",{className:"se-select sq-toolbarPicker","aria-label":"Authored sequence",value:i.id,onChange:e=>{m(e.target.value),N(null),x(null),r?.select(e.target.value)},children:d.map(e=>t("option",{value:e.id,children:e.name},e.id))}),t("button",{type:"button",className:"se-iconButton",title:"Add sequence","aria-label":"Add sequence",disabled:d.length>=64||!U(f,"sequences",d.length),onClick:J,children:t(_,{size:14})}),t("button",{type:"button",className:"se-iconButton",title:"Duplicate sequence","aria-label":"Duplicate sequence",disabled:d.length>=64,onClick:()=>{let e={...structuredClone(i),id:I(),name:`${i.name} copy`.slice(0,256),autoPlay:!1};O([...d,e]),m(e.id)},children:t(je,{size:13})}),t("button",{type:"button",className:"se-iconButton",title:"Delete sequence","aria-label":"Delete sequence",onClick:()=>{r?.stop(),O(d.filter(e=>e.id!==i.id)),m(null)},children:t(G,{size:13})}),t("span",{className:"sq-toolbarDivider"}),t(X,{label:"Name",value:i.name,onChange:e=>E({...i,name:e})}),t(j,{label:"Duration",min:.1,max:3600,value:i.duration,onChange:e=>E({...i,duration:e,tracks:i.tracks.map(a=>({...a,keyframes:a.keyframes.map(k=>({...k,time:k.time/i.duration*e}))}))})}),s("label",{className:"sq-check",children:[t("input",{type:"checkbox",checked:i.loop,onChange:e=>E({...i,loop:e.target.checked})}),"Loop"]}),s("label",{className:"sq-check",children:[t("input",{type:"checkbox",checked:i.autoPlay,onChange:e=>O(d.map(a=>({...a,autoPlay:a.id===i.id?e.target.checked:!1})))}),"Autoplay"]})]}),s("div",{className:"sq-body",children:[s("div",{className:"sq-main",children:[t(ne,{controls:r,duration:i.duration,hasTracks:i.tracks.some(e=>!e.muted&&e.keyframes.length>0)}),s("div",{className:"sq-timeline","aria-label":"Sequence timeline",title:"Drag keys to retime. Arrow keys move 0.1s; Shift moves 0.01s. A key at the same time is replaced.",children:[s("div",{className:"sq-ruler",children:[t("span",{className:"sq-rulerTitle",children:"Tracks"}),t("div",{className:"sq-rulerScale",children:[0,.25,.5,.75,1].map(e=>s("span",{children:[(i.duration*e).toFixed(1),"s"]},e))})]}),!i.tracks.length&&t("p",{className:"sq-hint",children:"Add a track to create its start and end keyframes."}),i.tracks.map(e=>s("div",{className:`sq-track ${c?.id===e.id?"sq-track--active":""}`,children:[s("div",{className:"sq-trackLabel",children:[t("button",{type:"button",title:e.name,onClick:()=>{N(e.id),x(e.keyframes[0]?.id??null)},children:e.name}),s("label",{title:"Mute track",children:[t("input",{"aria-label":`Mute ${e.name}`,type:"checkbox",checked:!!e.muted,onChange:a=>z({...e,muted:a.target.checked})}),"Mute"]})]}),s("div",{className:"sq-lane",role:"group","aria-label":`${e.name} keyframes`,onDoubleClick:a=>{if(a.target!==a.currentTarget)return;let k=a.currentTarget.getBoundingClientRect(),n=Math.round(Math.max(0,Math.min(1,(a.clientX-k.left)/k.width))*i.duration*100)/100,b=r?.capture(e.target);b!=null&&C(e,{id:I(),time:n,value:b})},children:[t("span",{className:"sq-playhead",style:{left:`${q.time/i.duration*100}%`}}),e.keyframes.map(a=>{let k=D?.frameId===a.id&&D.trackId===e.id?D.time:a.time;return t("button",{type:"button",className:`sq-key ${h?.id===a.id&&c?.id===e.id?"sq-key--active":""}`,style:{left:`${k/i.duration*100}%`},"aria-label":`${e.name} keyframe at ${k.toFixed(2)} seconds`,"aria-pressed":h?.id===a.id&&c?.id===e.id,onClick:n=>{n.detail===0&&(N(e.id),x(a.id),r?.pause(),r?.seek(a.time))},onPointerDown:n=>{if(n.button!==0)return;n.preventDefault(),n.stopPropagation(),n.currentTarget.focus(),n.currentTarget.setPointerCapture(n.pointerId);let b=n.currentTarget.parentElement.getBoundingClientRect();A.current={track:e,frame:a,left:b.left,width:b.width,time:a.time},N(e.id),x(a.id),r?.pause(),r?.seek(a.time)},onPointerMove:n=>{let b=A.current;if(!b||b.frame.id!==a.id||b.track.id!==e.id)return;let W=n.shiftKey?.01:.1;b.time=Math.min(i.duration,Math.max(0,Math.round((n.clientX-b.left)/b.width*i.duration/W)*W)),K({trackId:e.id,frameId:a.id,time:b.time}),r?.seek(b.time)},onPointerUp:()=>{let n=A.current;n&&(n.time!==n.frame.time&&C(n.track,{...n.frame,time:n.time}),A.current=null,K(null))},onPointerCancel:()=>{A.current=null,K(null),r?.seek(a.time)},onKeyDown:n=>{if(!["ArrowLeft","ArrowRight","Home","End"].includes(n.key))return;n.preventDefault(),n.stopPropagation();let b=n.key==="Home"?0:n.key==="End"?i.duration:a.time+(n.key==="ArrowLeft"?-1:1)*(n.shiftKey?.01:.1);C(e,{...a,time:b})}},a.id)})]})]},e.id))]})]}),s("aside",{className:"sq-side",children:[s(ce,{title:"Add track",children:[s("label",{className:"sq-field",children:[t("span",{children:"Type"}),s("select",{"aria-label":"Track type",value:w,onChange:e=>he(e.target.value),children:[t("option",{value:"object",children:"Object"}),t("option",{value:"camera",children:"Camera"}),t("option",{value:"clip",children:"Animation clip"})]})]}),w==="object"&&s("label",{className:"sq-field",children:[t("span",{children:"Property"}),t("select",{"aria-label":"Track property",value:V,onChange:e=>xe(e.target.value),children:ee.map(e=>t("option",{value:e,children:ge[e]},e))})]}),w==="object"&&s("label",{className:"sq-field",children:[t("span",{children:"Object"}),t("select",{"aria-label":"Track object",value:M?.modelObjectId??"",onChange:e=>ye(e.target.value),children:B.map(e=>t("option",{value:e.modelObjectId,children:e.label||e.modelObjectId},e.modelObjectId))})]}),w==="clip"&&s("label",{className:"sq-field",children:[t("span",{children:"Clip"}),t("select",{"aria-label":"Track animation clip",value:R??"",onChange:e=>Se(e.target.value),children:u.map(e=>t("option",{value:e.sourceName,children:e.sourceName},e.sourceName))}),!u.length&&t("small",{children:"This model has no animation clips."})]}),t("div",{className:"rui-actions",children:s("button",{type:"button",className:"bb-button",onClick:Ne,disabled:!v||!q.ready||F||i.tracks.length>=128,children:[t(_,{size:13,"aria-hidden":"true"}),"Add track"]})}),F&&t("p",{className:"rui-note",children:"That property already has a track."})]}),c&&s("section",{className:"sq-inspector","aria-label":"Selected track and keyframe",children:[s("div",{className:"rui-groupHeader",children:[t("span",{children:"Selected track"}),t("button",{type:"button",className:"se-iconButton",title:"Delete track","aria-label":"Delete track",onClick:()=>{E({...i,tracks:i.tracks.filter(e=>e.id!==c.id)}),N(null),x(null)},children:t(G,{size:13})})]}),t(X,{label:"Name",value:c.name,onChange:e=>z({...c,name:e})}),t("div",{className:"rui-actions",children:s("button",{type:"button",className:"bb-button",disabled:!q.ready||c.keyframes.length>=2048,onClick:Ce,children:[t(Ie,{size:13,"aria-hidden":"true"}),"Add keyframe at playhead"]})}),h&&s(fe,{children:[s("div",{className:"rui-groupHeader",children:[t("span",{children:"Keyframe"}),t("button",{type:"button",className:"se-iconButton",title:"Delete keyframe","aria-label":"Delete keyframe",onClick:()=>{z({...c,keyframes:c.keyframes.filter(e=>e.id!==h.id)}),x(null)},children:t(G,{size:14})})]}),t(j,{label:"Time",min:0,max:i.duration,value:h.time,step:.01,onChange:e=>C(c,{...h,time:e})}),s("label",{className:"sq-field",children:[t("span",{children:"Easing"}),t("select",{"aria-label":"Keyframe easing",value:c.target.kind==="object"&&c.target.property==="visible"?"step":h.easing??"ease-in-out",disabled:c.target.kind==="object"&&c.target.property==="visible",onChange:e=>C(c,{...h,easing:e.target.value}),children:te.map(e=>t("option",{value:e,children:Pe[e]},e))})]}),t(me,{target:c.target,value:h.value,onChange:e=>C(c,{...h,value:e})}),t("div",{className:"rui-actions",children:s("button",{type:"button",className:"bb-button",disabled:!q.ready,onClick:()=>{let e=r?.capture(c.target);e!=null&&C(c,{...h,value:e})},children:[t(Ee,{size:13,"aria-hidden":"true"}),"Capture current value"]})})]})]})]})]})]}):s("div",{className:"sq-empty",children:[t("p",{children:"Add a sequence, then add tracks and capture keyframes on the timeline."}),s("button",{type:"button",className:"bb-button bb-button--primary",onClick:J,children:[t(_,{size:13,"aria-hidden":"true"}),"Create sequence"]})]}),(Z||q.issues.length>0)&&t("div",{role:"status",className:"sq-error",children:Z||q.issues.join(" ")})]})}export{Ae as default};
|