// screens-editor.jsx — Editor (timeline) function _fmtTimecode(ms) { const s = Math.floor(ms / 1000); const f = Math.floor((ms % 1000) / (1000 / 30)); return String(Math.floor(s / 3600)).padStart(2, '0') + ':' + String(Math.floor((s % 3600) / 60)).padStart(2, '0') + ':' + String(s % 60).padStart(2, '0') + ':' + String(f).padStart(2, '0'); } function Editor() { const { ASSETS } = window.ZAMPP_DATA; const [playing, setPlaying] = React.useState(false); const [currentMs, setCurrentMs] = React.useState(0); React.useEffect(() => { if (!playing) return; const i = setInterval(() => setCurrentMs(t => t + 100), 100); return () => clearInterval(i); }, [playing]); return (
New sequence PREVIEW
{!playing && ( )}
{_fmtTimecode(currentMs)}
{/* IN DEVELOPMENT overlay */}
In Development
Non-linear Editor
Timeline editing, multi-track audio mixing,
GPU-accelerated export, and color grading
are coming in a future release.
); } function InspGroup({ title, children }) { return (
{title}
{children}
); } function InspRow({ label, value }) { return (
{label} {value}
); } function EditorTimeline({ currentMs, total = 60, clips = [] }) { const playheadPct = total > 0 ? ((currentMs / 1000) / total) * 100 : 0; return (
Timeline
{Array.from({ length: 13 }).map((_, i) => (
{i % 2 === 0 && {`00:${String(i * 5).padStart(2, '0')}`}}
))}
{clips.length === 0 && (
Drop assets from the bin to build a sequence.
)}
); } window.Editor = Editor;