3v324v23's picture
upload
bc18ad5
import { IProgressFrame } from "@designcombo/types";
import { calculateFrames } from "../../utils/frames";
import { BaseSequence, SequenceItemOptions } from "../base-sequence";
export default function ProgressFrame({
item,
options
}: {
item: IProgressFrame;
options: SequenceItemOptions;
}) {
const { fps, frame } = options;
const { details } = item;
const playbackRate = item.playbackRate || 1;
const { from, durationInFrames } = calculateFrames(
{
from: item.display.from / playbackRate,
to: item.display.to / playbackRate
},
fps
);
let progress;
if (details.inverted) {
const relativeFrame = Math.max((frame || 0) - from, 0);
progress = 100 - Math.min((relativeFrame / durationInFrames) * 100, 100);
} else {
const relativeFrame = Math.max((frame || 0) - from, 0);
progress = Math.min((relativeFrame / durationInFrames) * 100, 100);
}
const width = details.width || 100;
const height = details.height || 100;
const minSide = Math.min(width, height);
const maskSize = minSide * 0.1;
const children = (
<>
<div
style={{
position: "relative",
width: "100%",
height: "100%",
backgroundColor: "transparent",
scale: `${details.flipX ? -1 : 1} ${details.flipY ? -1 : 1}`
}}
>
<div
style={{
position: "absolute",
inset: 0,
clipPath: `polygon(0 0, 100% 0, 100% ${maskSize}px, ${maskSize}px ${maskSize}px, ${maskSize}px 100%, 0 100%)`
}}
>
<div
style={{
position: "absolute",
inset: 0,
backgroundColor:
details.backgroundColors[0] || "rgba(128, 128, 128,0.5)",
width: "100%",
height: "100%"
}}
/>
<div
style={{
position: "absolute",
inset: 0,
backgroundColor:
details.backgroundColors[1] || "rgba(128, 128, 128,1)",
width: `${progress}%`,
height: `${progress}%`
}}
/>
</div>
</div>
</>
);
return BaseSequence({ item, options, children });
}