Skip to content

Set viewport example

Jan 1, 1970 00:00
00:00:10
00:00:20
00:00:30
00:00:40
00:00:50

Code

vue
<script setup lang="ts">
  import { computed, ref } from 'vue';

  const timeline = ref(null);

  const items = [
    { group: '1', type: 'range', cssVariables: { '--item-background': 'var(--color-2)' }, start: 100000, end: 450000 },
    { group: '2', type: 'range', cssVariables: { '--item-background': 'var(--color-4)' }, start: 450000, end: 600000 },
    { group: '3', type: 'range', start: 600000, end: 800000 },
  ];

  const initialViewportRange = ref({ start: 400000, end: 700000 });
  const viewport = ref({ start: 400000, end: 700000 });
  const maxRange = ref({ start: 0, end: 800000 });

  const viewportSize = computed(() => viewport.value.end - viewport.value.start);

</script>

<template>
  <Timeline
    ref="timeline"
    :items="items"
    :groups="[{id: '1'}, {id: '2'}, {id: '3'}]"
    :viewportMin="maxRange.start"
    :viewportMax="maxRange.end"
    :initialViewportStart="initialViewportRange.start"
    :initialViewportEnd="initialViewportRange.end"
    @changeViewport="viewport = $event"
  />

  <div class="controls">
    <button @click="viewport.start > maxRange.start && timeline.setViewport(viewport.start - viewportSize * 0.2, viewport.end - viewportSize * 0.2)">
      Move left
    </button>
    <button @click="viewport.end < maxRange.end && timeline.setViewport(viewport.start + viewportSize * 0.2, viewport.end + viewportSize * 0.2)">
      Move right
    </button>
    <button @click="timeline.setViewport(viewport.start - viewportSize * 0.2, viewport.end + viewportSize * 0.2)">
      Zoom out
    </button>
    <button @click="timeline.setViewport(viewport.start + viewportSize * 0.2, viewport.end - viewportSize * 0.2)">
      Zoom in
    </button>
    <button @click="timeline.setViewport(initialViewportRange.start, initialViewportRange.end)">
      Reset viewport
    </button>
    <button @click="timeline.setViewport(maxRange.start, maxRange.end)">
      Set viewport to max range
    </button>
  </div>
</template>

<style lang="scss" scoped>
  .controls {
    display: flex;
    gap: .5rem;
    flex-wrap: wrap;
  }

  button {
    border: 1px solid color-mix(in srgb, currentcolor, transparent 80%);
    border-radius: 4px;
    cursor: pointer;
    padding: 0.1rem 0.4rem;

    &:hover {
      background-color: color-mix(in srgb, currentcolor, transparent 95%);
    }
  }
</style>