✂️ Vtrim ✂️
Easily trim your medias with a fully customizable timeline.
- Mobile touch events support
📱 - Styled by default and fully customizable
🎨 -
Audio
🎵 and video🎞️ compatible
✨ Demo
📖 Table of contents
📥 Installation
npm install vtrim
You can then register Vtrim globally in your entry file with Vue.use()
or locally by importing the component where you need it:
// main.js
import Vtrim from 'vtrim';
Vue.use(Vtrim);
or
// myComponent.vue
import { Vtrim } from 'vtrim';
export default {
name: 'myComponent',
components: { Vtrim }
};
🚀 Getting started
<template>
<figure>
<video
@durationchange="event => mediaDuration = event.target.duration"
@loadedmetadata="event => mediaDuration = event.target.duration"
@timeupdate="event => currentTime = event.target.currentTime"
preload="metadata"
src="...">
<video>
<Vtrim
@trim-start="trim => trimStart = trim"
@trim-end="trim => trimEnd = trim"
:currentTime="currentTime"
:mediaDuration="mediaDuration">
</Vtrim>
<button
@click="saveTrim"
type="button">
Save
</button>
</figure>
</template>
<script>
import { Vtrim } from 'vtrim';
export default {
name: 'App',
components: { Vtrim },
data: () => ({
currentTime: 0,
mediaDuration: 0,
trimStart: 0,
trimEnd: 0,
}),
methods: {
async saveTrim() {
await api.saveTrim({ start: this.trimStart, end: this.trimEnd });
}
}
}
</script>
⚙️ Props
Name | Type | Default | Description |
---|---|---|---|
currentTime |
Number |
required | The current time of your media in seconds |
mediaDuration |
Number |
required | The total duration of your media in seconds |
color |
String |
'#1167f2' |
The brand color |
defaultTrim |
Object |
null |
Sets a default trim. Must be an object with the following properties: { start: Number, end: Number }
|
minTrimDuration |
Number |
1 |
Sets the minimum duration of your trimmed media in seconds. This prevents trim handles from going past each other |
formatTime |
Function |
(rawTime) => getTimeAsMM:SS(rawTime) |
Formats the trims times (MM:SS by default). Receives the raw time in seconds |
timePrecision |
Number |
2 |
Sets the number of decimals of the trim time |
restrictSeeking |
Boolean |
false |
Whether the seeking playhead is restricted within the trimmed media |
🚨 Events
Name | Payload | Type | Description |
---|---|---|---|
trim-strart |
trimStartTime |
Number |
Fired everytime the start trim handle is moved. Receives the raw start trim time in seconds |
trim-end |
trimEndTime |
Number |
Fired everytime the end trim handle is moved. Receives the raw end trim time in seconds |
seek |
seekTime |
Number |
Fired everytime the playhead is moved. Receives the raw seek time in seconds |
play-overflow |
currentTime |
Number |
Fired everytime the media is currently playing before trim start or after trim end. Receives the raw current time in seconds |
🧱 Slots
Name | Slot props | Description |
---|---|---|
progress |
{ currentRightPosition: Number } |
The progress bar of the original media. Receives the original media current end right position |
start-trim |
{} |
The start trim handle |
end-trim |
{} |
The end trim handle |
playhead |
{} |
The playhead |
start-time |
{ currentTime: Number, startTime: Number } |
The start trim time. Receives the current media time and the formatted trim start time |
end-time |
{ currentTime: Number, endTime: Number } |
The end trim time. Receives the current media time and the formatted trim end time |
timeline |
{ startLeftPosition: Number, endRightPosition: Number } |
The trimmed timeline. Receives the start left position and end right position in % relative to the progress bar. E.g: A media trimmed from its beginning to half its duration would receive: { startLeftPosition: 0, endRightPosition: 50 }
|
timeline-playing |
{ startLeftPosition: Number, currentRightPosition: Number } |
The playing timeline within the trimmed timeline. Receives the start left position and current end right position in % relative to the trimmed media duration. E.g: A media trimmed from 0s to 10s currently playing at 5s would receive: { startLeftPosition: 0, endRightPosition: 50 }
|