vue-insta-stories

Vue component for Instagram stories

Usage no npm install needed!

<script type="module">
  import vueInstaStories from 'https://cdn.skypack.dev/vue-insta-stories';
</script>

README

Simple usage

<template>
  <Stories :stories="items" />
</template>

<script>
import { Stories } from "vue-insta-stories";
export default {
  components: { Stories },
  data: () => ({
    items: [
      "https://picsum.photos/350/200/",
      "https://picsum.photos/400/201/",
      {
        url: "https://file-examples-com.github.io/5mb.mp4",
        type: "video",
      },
    ]
  })
};
</script>

Props

Property Type Default Description
stories [String/Object] required An array of image urls or array of story objects (more info below)
interval Number 2000 Story duration in milliseconds
isPaused Boolean false Toggle the playing state
loop Boolean false Loop through stories
currentIndex Number 0 Set the current story index
Events
storyStart Function(Number) - Callback when a story starts
storyEnd Function(Number) - Callback when a story ends
allStoriesEnd Function() - Callback when all stories in the array have ended

Story Object

Property Description
url The url of the resource, image or video.
type Optional. Type of the story. 'image' \| 'video'
duration Optional. Duration for which a story should persist.
template Optional. Renders story in a different template see more below.
seeMore Optional. Enable see more on story (true \| { label: 'See more!' }

Style

/** full screen on mobile & fixed size on desktop **/
.ig-stories {
  position: absolute;
  height: 100vh;
  height: -webkit-fill-available;
  width: 100vw;
  top: 0;
}

@media (min-width: 768px) {
  .ig-stories {
    position: relative;
    height: 730px;
    width: 420px;
  }
}

if you are using tailwind you can write

<Stories class="absolute top-0 h-100vh w-100vw md:(h-730px w-420px relative)" />

With header

<template>
  <Stories :stories="items">
    <template #header>
      <story-header />
    </template>
  </Stories>
</template>

<script>
import { Stories } from "vue-insta-stories";
export default {
  components: { Stories },
  data: () => ({
    items: [ "https://picsum.photos/350/200/"]
  })
};
</script>

With custom slot

<template>
  <Stories :stories="items">
    <template #pool="{story}">
        <pool-story :story="story" class="flex-grow"></pool-story>
    </template>
  </Stories>
</template>

<script>
import { Stories } from "vue-insta-stories";
export default {
  components: { Stories },
  data: () => ({
    items: [{ poolId: 23, template: "pool" }]
  })
};
</script>