npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

vue3-agile

v0.2.0

Published

A carousel component for Vue.js 3

Downloads

125

Readme

vue3-agile

This is a fork of vue-agile by Łukasz Florczak. Since he abandoned his project in February of 2023 I decided to publish my own version with some improvements (SSR Support and Vue3 only)

A carousel component for Vue.js inspired by Slick. Powerful, responsive, touch-friendly, with Nuxt.js SSR support, without a jQuery dependency.

Demo & examples


If you like the component remember to star it ⭐️.


Installation

npm install vue3-agile

or

yarn add vue3-agile

Styles

The component is delivered without styles for the appearance of the navigation elements (like dots color and shape, arrows position, etc.). I think most people use their own styles and default styles are completely redundant. If you want, feel free to use styles from CodePen demos.

Importing

Global

// main.js
import { createApp } from 'vue'
import App from './App.vue'
import VueAgile from 'vue3-agile'

createApp(App)
  .use(VueAgile)

Component

<template>
  <Agile>
    ...
  </Agile>
</template>

<script setup>
import { Agile } from 'vue3-agile'
<script>

Usage

<template>
  <Agile>
    <div class="slide">
      <h3>slide 1</h3>
    </div>

    ...

    <div class="slide">
      <h3>slide n</h3>
    </div>
  </Agile>
</template>

Every first-level child of <agile> is a new slide. You also can group them inside <template v-slot:default>...</template> tags.

Options / Props

| Parameter | Type | Default | Description | | --- | :---: | :---: | --- | | asNavFor | array | [] | Set the carousel to be the navigation of other carousels | | autoplay | boolean | false | Enable autoplay | | autoplaySpeed | integer (ms) | 3000 | Autoplay interval in milliseconds | | centerMode | boolean | false | Enable centered view when slidesToShow > 1 | | changeDelay | integer (ms) | 0 | Insert a delay when switching slides. Useful for fade: true | | dots | boolean | true | Enable dot indicators/pagination | | fade | boolean | false | Enable fade effect | | infinite | boolean | true | Infinite loop sliding | | initialSlide | integer | 0 | Index of slide to start on | | mobileFirst | boolean | true | Enable mobile first calculation for responsive settings | | navButtons | boolean | true | Enable prev/next navigation buttons | | options | object | null | All settings as one object | | pauseOnDotsHover | boolean | false | Pause autoplay when a dot is hovered | | pauseOnHover | boolean | true | Pause autoplay when a slide is hovered | | responsive | object | null | Object containing breakpoints and settings objects | | rtl | boolean | false | Enable right-to-left mode | | slidesToShow | integer | 1 | Number of slides to show | | speed | integer (ms) | 300 | Slide animation speed in milliseconds | | swipeDistance | integer (px) | 50 | Distance to swipe the next slide | | throttleDelay | integer (ms) | 500 | Throttle delay for actions | | timing | string | ease | Transition timing function (linear/ease/ease-in/ease-out/ease-in-out) | | unagile | boolean | false | Disable Agile carousel |

Example

<agile :dots="false" :infinite="false" :autoplay-speed="5000">...</agile>

Important! If you use props inline, convert props names from camelCase to kebab-case.

Methods

| Name | Description | | --- | --- | | getCurrentBreakpoint() | Returns current breakpoint (can returns 0 in mobile first for the smallest breakpoint and null for desktop first for the largest) | | getCurrentSettings() | Returns settings object for current breakpoint – useful for debugging | | getCurrentSlide() | Returns index of current slide | | getInitialSettings() | Returns full settings object with all options – useful for debugging | | goTo() | Navigates to a slide by index | | goToNext() | Navigates to next slide | | goToPrev() | Navigate to previous slide | | reload() | Reload carousel & slides settings, classes and inline styles |

Example

<agile ref="carousel">...</agile>

<button @click="$refs.carousel.goToNext()">My custom button</button>

Events

| Name | Value | Description | | --- | --- | --- | | after-change | { currentSlide } | Fires after slide change | | before-change | { currentSlide, nextSlide } | Fires before slide change | | breakpoint | { breakpoint } | Fires after breakpoint change |

Example

<Agile @after-change="showCurrentSlide($event)">...</Agile>
showCurrentSlide(event)
{
  console.log(event)
  // Shows for example: { currentSlide: 1 }
}

Responsive

To customize responsiveness, I recommend defining your desired breakpoints and passing settings object with your modification options inside options.

Example

<Agile :options="myOptions">...</Agile>
data()
{
  return {
    myOptions: {
      navButtons: false,
      responsive: [
        {
          breakpoint: 600,
          settings: {
            dots: false
          }
        },

        {
          breakpoint: 900,
          settings: {
            navButtons: true,
            dots: true,
            infinite: false
          }
        }
      ]
    }
  }
}

How does it work? Mobile first mode is used by default. It means, that navButtons: false option will be used on screens from 0 to 600 px width (+ all default carousel options). On screens from 600 to 900 px dots: false will be added to options from breakpoint before. And on screens over 900 px width navButtons and dots options will be overwritten and infinite: false will be added.

Custom arrows / nav buttons

The component uses slots for custom navigation buttons. It means you can put inside whatever you want – any HTML with text, image, icon etc.

Example

<Agile>
... <!-- slides -->

<template slot="prevButton">prev</template>
<template slot="nextButton">next</template>
</Agile>

Caption

To display a static caption or such like within the gallery, you can use the caption slot.

Example

<Agile @after-change="e => currentSlide = e.currentSlide">
  ... <!-- slides -->

  <template slot="caption">{{ captions[currentSlide] }}</template>
</Agile>

<script setup>
  import { ref } from 'vue';

  const currentSlide = ref(0);
  const captions = [
    'This is slide 1',
    'This is the second slide',
    'This is a third and final slide',
  ];
</script>

asNavFor

This option is useful for example for creating a photo gallery with two related slider – one big with only one slide in view and second for navigation with thumbnails.

Example

<agile ref="main" :fade="true">...</agile>

<agile ref="thumbnails" :as-nav-for="[$refs.main]" :slides-to-show="4" autoplay>...</agile>

Important! If you want to use the autoplay mode use it only in one of the related carousels.

v-if & v-show

If you have slides being dynamically loaded, use v-if to show the carousel after the slides are ready. Using v-if is also recommended in other situations if you want to hide/show the slideshow.

It is also possible to use v-show, but you have to use the reload() method.

Example

<button @click="isActive = !isActive">Toggle carousel</button>

<agile v-if="isActive">...</agile>

Nuxt.js && SSR Support

The component uses browser specific attributes (like window and document). However, you can try to render the first view on server side.

Example

// plugins/vue3-agile.js

import Vue from 'vue'
import VueAgile from 'vue3-agile'

Vue.use(VueAgile)
// nuxt.config.js

export default {
  plugins: ['~/plugins/vue3-agile'],

  build: {
    transpile: ['vue3-agile']
  }
}

To use component without SSR use the client-only component:

<ClientOnly placeholder="Loading...">
  <agile>...</agile>
</ClientOnly>

Important! Component rendered on server side has additional CSS class: agile--ssr, so you can use it to add some additional styles or manipulations. For example, I have limited options for setting the first appearance of the slides. By default, the server renders the view and styles, where only the first slide is visible.

.agile--ssr .agile__slides > * {
  overflow: hidden;
  width: 0
}

.agile--ssr .agile__slides > *:first-child {
  width: 100%
}

At this stage slides don't have agile__slide class yet, so I use > * instead of this.

If you would like to connect this with params slidesToShow or initialSlide you have to add some custom styles with nth-child param.

Example for :slidesToShow="2"

.agile--ssr
  .agile__slides
    > *:nth-child(1),
    > *:nth-child(2)
      width: 50%

Example for :initialSlide="1"

(Slides index starts at 0)

.agile--ssr
  .agile__slides
    > *:nth-child(1)
      width: 0

    > *:nth-child(2)
      width: 100%

FAQ

1. Using component with dynamic content

If content changes, you have to use reload or in some cases, you can use key property: <agile :key="mySlides.length">...</agile> (it'll rebuild the carousel after each change of mySlides length).