mirror of https://github.com/mifi/lossless-cut
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
import React from 'react';
 | 
						|
import { motion, AnimatePresence } from 'framer-motion';
 | 
						|
import { FaTrashAlt } from 'react-icons/fa';
 | 
						|
 | 
						|
import { mySpring } from './animations';
 | 
						|
 | 
						|
const { formatDuration } = require('./util');
 | 
						|
 | 
						|
 | 
						|
const TimelineSeg = ({
 | 
						|
  duration, cutStart, cutEnd, isActive, segNum,
 | 
						|
  onSegClick, color, invertCutSegments, zoomed,
 | 
						|
}) => {
 | 
						|
  const cutSectionWidth = `${((cutEnd - cutStart) / duration) * 100}%`;
 | 
						|
 | 
						|
  const strongColor = color.lighten(0.5).string();
 | 
						|
  const strongBgColor = color.lighten(0.5).alpha(0.5).string();
 | 
						|
  const startTimePos = `${(cutStart / duration) * 100}%`;
 | 
						|
  const markerBorder = `2px solid ${isActive ? strongColor : 'transparent'}`;
 | 
						|
  const backgroundColor = isActive ? strongBgColor : color.alpha(0.5).string();
 | 
						|
  const markerBorderRadius = 5;
 | 
						|
 | 
						|
  const wrapperStyle = {
 | 
						|
    position: 'absolute',
 | 
						|
    top: 0,
 | 
						|
    bottom: 0,
 | 
						|
    left: startTimePos,
 | 
						|
    width: cutSectionWidth,
 | 
						|
    display: 'flex',
 | 
						|
    alignItems: 'center',
 | 
						|
    justifyContent: 'space-between',
 | 
						|
    background: backgroundColor,
 | 
						|
    originX: 0,
 | 
						|
    boxSizing: 'border-box',
 | 
						|
 | 
						|
    borderLeft: markerBorder,
 | 
						|
    borderTopLeftRadius: markerBorderRadius,
 | 
						|
    borderBottomLeftRadius: markerBorderRadius,
 | 
						|
 | 
						|
    borderRight: markerBorder,
 | 
						|
    borderTopRightRadius: markerBorderRadius,
 | 
						|
    borderBottomRightRadius: markerBorderRadius,
 | 
						|
  };
 | 
						|
 | 
						|
  const onThisSegClick = () => onSegClick(segNum);
 | 
						|
 | 
						|
  return (
 | 
						|
    <motion.div
 | 
						|
      style={wrapperStyle}
 | 
						|
      layoutTransition={mySpring}
 | 
						|
      initial={{ opacity: 0, scaleX: 0 }}
 | 
						|
      animate={{ opacity: 1, scaleX: 1 }}
 | 
						|
      exit={{ opacity: 0, scaleX: 0 }}
 | 
						|
      role="button"
 | 
						|
      onClick={onThisSegClick}
 | 
						|
      title={cutEnd > cutStart ? formatDuration({ seconds: cutEnd - cutStart }) : undefined}
 | 
						|
    >
 | 
						|
      <div style={{ alignSelf: 'flex-start', flexShrink: 1, fontSize: 10, minWidth: 0, overflow: 'hidden' }}>{segNum + 1}</div>
 | 
						|
 | 
						|
      <AnimatePresence>
 | 
						|
        {invertCutSegments && (
 | 
						|
          <motion.div
 | 
						|
            initial={{ scale: 0 }}
 | 
						|
            animate={{ scale: 1 }}
 | 
						|
            exit={{ scale: 0 }}
 | 
						|
            style={{ width: 16, height: 16, flexShrink: 1 }}
 | 
						|
          >
 | 
						|
            <FaTrashAlt
 | 
						|
              style={{ width: '100%', color: strongColor }}
 | 
						|
              size={16}
 | 
						|
            />
 | 
						|
          </motion.div>
 | 
						|
        )}
 | 
						|
      </AnimatePresence>
 | 
						|
 | 
						|
      <div style={{ flexGrow: 1 }} />
 | 
						|
    </motion.div>
 | 
						|
  );
 | 
						|
};
 | 
						|
 | 
						|
export default TimelineSeg;
 |