Skip to content

Getting Started ​

Installation ​

sh
npm install @wattanx/hooper-vue3
sh
yarn add @wattanx/hooper-vue3
sh
pnpm add @wattanx/hooper-vue3

Basic Usage ​

Import the Hooper and Slide components and use them in your template:

vue
<script setup lang="ts">
import { Hooper, Slide } from "@wattanx/hooper-vue3";
</script>

<template>
  <Hooper>
    <Slide>Slide 1</Slide>
    <Slide>Slide 2</Slide>
    <Slide>Slide 3</Slide>
  </Hooper>
</template>

Configuration ​

You can configure the carousel using individual props:

vue
<template>
  <Hooper :items-to-show="3" :center-mode="true" :infinite-scroll="true">
    <Slide>Slide 1</Slide>
    <Slide>Slide 2</Slide>
    <Slide>Slide 3</Slide>
  </Hooper>
</template>

Or use the settings object for cleaner code:

vue
<script setup lang="ts">
import { Hooper, Slide } from "@wattanx/hooper-vue3";

const settings = {
  itemsToShow: 3,
  centerMode: true,
  infiniteScroll: true,
};
</script>

<template>
  <Hooper :settings="settings">
    <Slide>Slide 1</Slide>
    <Slide>Slide 2</Slide>
    <Slide>Slide 3</Slide>
  </Hooper>
</template>

Dynamic Content ​

When rendering slides from a data array using v-for, make sure to provide a unique key:

vue
<script setup lang="ts">
import { ref } from "vue";
import { Hooper, Slide } from "@wattanx/hooper-vue3";

const slides = ref([
  { id: 1, content: "Slide 1" },
  { id: 2, content: "Slide 2" },
  { id: 3, content: "Slide 3" },
]);
</script>

<template>
  <Hooper>
    <Slide v-for="slide in slides" :key="slide.id">
      {{ slide.content }}
    </Slide>
  </Hooper>
</template>

Responsive Design ​

Use the breakpoints property within settings to define custom settings for different screen sizes:

vue
<script setup lang="ts">
import { Hooper, Slide } from "@wattanx/hooper-vue3";

const settings = {
  itemsToShow: 1,
  breakpoints: {
    768: {
      itemsToShow: 2,
    },
    1024: {
      itemsToShow: 3,
    },
  },
};
</script>

<template>
  <Hooper :settings="settings">
    <Slide>Slide 1</Slide>
    <Slide>Slide 2</Slide>
    <Slide>Slide 3</Slide>
    <Slide>Slide 4</Slide>
  </Hooper>
</template>

The breakpoints use a mobile-first approach. Settings cascade from smaller to larger breakpoints.

RTL Support ​

The carousel automatically adapts to the document direction. You can also force RTL mode using the rtl prop:

vue
<template>
  <Hooper :rtl="true">
    <Slide>Slide 1</Slide>
    <Slide>Slide 2</Slide>
    <Slide>Slide 3</Slide>
  </Hooper>
</template>

When rtl is set to null (default), the carousel will automatically detect the direction from the document.

Grouped Carousels ​

Multiple carousels can be synchronized by assigning them the same group name:

vue
<script setup lang="ts">
import { Hooper, Slide } from "@wattanx/hooper-vue3";
</script>

<template>
  <Hooper group="main">
    <Slide>Slide 1</Slide>
    <Slide>Slide 2</Slide>
    <Slide>Slide 3</Slide>
  </Hooper>

  <Hooper group="main" :items-to-show="3">
    <Slide>Slide 1</Slide>
    <Slide>Slide 2</Slide>
    <Slide>Slide 3</Slide>
  </Hooper>
</template>

When one carousel slides, all grouped instances move to the same index position.

Addons ​

The library provides three built-in addon components:

Add previous/next navigation buttons:

vue
<script setup lang="ts">
import { Hooper, Slide, Navigation } from "@wattanx/hooper-vue3";
</script>

<template>
  <Hooper>
    <Slide>Slide 1</Slide>
    <Slide>Slide 2</Slide>
    <Slide>Slide 3</Slide>

    <template #hooper-addons>
      <Navigation />
    </template>
  </Hooper>
</template>

Pagination ​

Add slide indicators (dots or fraction):

vue
<script setup lang="ts">
import { Hooper, Slide, Pagination } from "@wattanx/hooper-vue3";
</script>

<template>
  <!-- Dot indicators (default) -->
  <Hooper>
    <Slide>Slide 1</Slide>
    <Slide>Slide 2</Slide>
    <Slide>Slide 3</Slide>

    <template #hooper-addons>
      <Pagination />
    </template>
  </Hooper>

  <!-- Fraction display (e.g., "1/3") -->
  <Hooper>
    <Slide>Slide 1</Slide>
    <Slide>Slide 2</Slide>
    <Slide>Slide 3</Slide>

    <template #hooper-addons>
      <Pagination mode="fraction" />
    </template>
  </Hooper>
</template>

Progress ​

Add a progress bar:

vue
<script setup lang="ts">
import { Hooper, Slide, Progress } from "@wattanx/hooper-vue3";
</script>

<template>
  <Hooper>
    <Slide>Slide 1</Slide>
    <Slide>Slide 2</Slide>
    <Slide>Slide 3</Slide>

    <template #hooper-addons>
      <Progress />
    </template>
  </Hooper>
</template>

Combining Addons ​

You can use multiple addons together:

vue
<script setup lang="ts">
import {
  Hooper,
  Slide,
  Navigation,
  Pagination,
  Progress,
} from "@wattanx/hooper-vue3";
</script>

<template>
  <Hooper>
    <Slide>Slide 1</Slide>
    <Slide>Slide 2</Slide>
    <Slide>Slide 3</Slide>

    <template #hooper-addons>
      <Navigation />
      <Pagination />
      <Progress />
    </template>
  </Hooper>
</template>