Create a responsive Slideshow
Diego Muralles avatar
Written by Diego Muralles
Updated over a week ago

Let’s add an npm package to quickly create a responsive slideshow. Click on Add dependency in your file structure, or open your package.json file to add it under dependencies.

Add the package by leandrowd and press CMD+S to save your file and compile your new dependencies

Returned to the Code Editor dashboard and click on New Section to create a Section Element.

Add the following basic structure to our Slideshow to get us started.

import React from 'react'
import "react-responsive-carousel/lib/styles/carousel.min.css";
import { Carousel } from 'react-responsive-carousel';
import { useSize, Image } from 'vev';

// Define a set of stock URLs to use when no images are supplied
const imageUrls = [

export default function MyResponsiveCarousel(props: Props) {
// Get width and height of the container, resizes carousel
// when in the editor.
const { width, height } = useSize(props.hostRef);

return (
<div className="fill">
<Carousel width={width} height={height} dynamicHeight={true}>
{, i) => <div style={{height : height}}>
<Image src={imageUrls[i]} />
<p className="legend">Legend {i+1}</p>

Hit ⌘+S or CTRL+S to save your code. Your Element preview should now show a functioning Slideshow.

Let’s customize this Slideshow by using some of Vev’s best features.

Customizing the Slideshow

To make the Slideshow more re-usable in other projects or by your team members, we’ll do a few quick improvements:

  • Add an Image field to your form, so users can upload or add images from their library.

  • Make the Caption text and size styles editable in the Elements Style Panel

  • Make the Slideshow arrows editable from the Elements Icons.

Adding the Image Field

To let you add/remove images to the Slideshow from its form, we need to add a field to the Elements form.tsx. Since we want to be able to add multiple images, we need to wrap the ImageField in an ArrayField like so:

<ArrayField name="images">
<ImageField name="img" />

Did this answer your question?