// 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 (
);
}
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;