Slidy Slidy

slidy/svelte

configurable, reusable and accessible SvelteJS carousel component.

What is slidy-svelte?

@slidy/svelte - configurable, reusable and accessible SvelteJS carousel component built on top of @slidy/core.

Getting started

The components are available via npm:

npm i @slidy/core @slidy/svelte

The easiest way to get started is to use <Slidy /> component:

<script>
	import { Slidy } from "@slidy/svelte";

	const slides = [
		{
			id: 1,
			width: 800,
			height: 1200,
			src: "static/img/some-image.webp",
		},
	];
</script>

<Slidy {slides} />

All props are optional, the only property required to get started is slides - an array of items, usually it is an array of image related data.

Core Component

Core is a wrapper component for [@slidy/core][core-package] available via named import. It is best to use to build up the custom component for specific needs or when just the basic functionality is needed.

<script>
	import { Core } from "@slidy/svelte";
</script>

<Core>
	<!-- your carousel items passed via slot -->
</Core>

Core Component API

PropertyDefaultTypeDescription
animationundefinedAnimationFuncCustom slide animation.
axis"x"`“x”“y”`
clamp0numberClamps sliding index as {clamp} - {index} + {clamp}
className""stringPasses the class to the node.
duration450numberSlide transitions duration value.
easingundefined(t: number => number)Inertion scroll easing behaviour.
gravity1.2numberScroll inertia value.
indent0numberCustom scroll indent value, calculates as gap * indent.
index0numberThe index of the initial slide.
loopfalsebooleanMakes the slideshow continious.
position0numberThe current position value of the carousel.
sensity5numberDefines the sliding sensity as the number of pixels required to drag.
snapundefined`“start”“center”
tag"ol"stringThe HTML tag name to render.

For TypeScript users there is the SlidyCoreOptions interface available via named import.

Slidy Component

<Slidy /> component uses <Core /> internally and provides more features expected from carousel.

Slidy Component API

The <Slidy /> component interface extends the <Core />. There are a list of additional options available:

PropertyDefaultTypeDescription
arrowstruebooleanRenders the arrow button controls for accessible slide navigation.
backgroundfalsebooleanSets background-image instead of <img /> elements to display slides.
classNamesSlidyStylesSlidyStylesDefaultThe class names object used over the component.
getImgSrcitem => item.srcfunctionThe slide’s src attribute getter.
getThumbSrcitem => item.srcfunctionThe thumbnail’s src attribute getter.
navigationfalsebooleanRenders the navigation controls for pagination-like slide navigation.
progressfalsebooleanRenders the progress bar.
slides[]Slides[]An array of objects with image metadata.
thumbnailfalsebooleanRenders the thumbnail navigation panel.

By default component works with images. Image object should contain width and height attributes to prevent layout shifts and alt for accessibility.

Styling

Extending/Overriding classes

To extend default component styles use classNames property. Default classes are available via object, that can be extended or overridden:

<script>
	import { Slidy, classNames } from "@slidy/svelte";
</script>

<Slidy
	classNames={{
		root: `${classNames.root} custom-class`,
		...classNames
	}}
/>

The classNames consist of { target: className } pairs:

TargetDefault classDescription
arrowslidy-arrowArrow controls.
counterslidy-counterSlide progress counter.
imgslidy-imgSlide image node.
navslidy-navSlide navigation panel.
nav-itemslidy-nav-itemNavigtion panel item.
overlayslidy-overlaySlides overlay node.
progressslidy-progressSlide progress bar.
rootslidyComponent’s root node.
slideslidy-slideSlide item node.
slidesslidy-slidesSlides list node.
thumbnailslidy-thumbnailThumbnail item.
thumbnailslidy-thumbnailsThumbnails bar.

The classNames object is available via context using classNames key.

Custom Properties API

For easier style customization Slidy provides a set of predefined custom properties to inherit:

List of available public custom properties:

PropertyDefaultTypeDescription
--slidy-arrow-bg#4e4e4ebf<color>The arrow control background color.
--slidy-arrow-bg-hover#4e4e4e54<color>The arrow control hover background color.
--slidy-arrow-icon-colorcurrentColor<color>The arrow control icon fill color.
--slidy-arrow-size24px<length>The arrow controls size.
--slidy-counter-bg#4e4e4ebf<color>The counter’s background color.
--slidy-focus-ring-color#c9c9c9e6<color>Focus ring color for all focusable elements.
--slidy-height100%<length>The height of the component’s node.
--slidy-nav-item-colorwhite<color>The navigation elements color.
--slidy-nav-item-radius50%<length>The navigation elements border radius.
--slidy-nav-item-size16px<length>The navigation elements size.
--slidy-progress-thumb-color#c44f61<color>The progress bar active track color.
--slidy-progress-track-color#96969680<color>The progress bar track color.
--slidy-progress-track-size5px<length>The progress bar height.
--slidy-slide-aspect-ratiounset<int/int>Defines the slide aspect-ratio.
--slidy-slide-bg-colordarkgray<color>The placeholder background color for loading images.
--slidy-slide-gap1rem<length>The gap between items in carousel.
--slidy-slide-height100%<length>The carousel items height.
--slidy-slide-object-fitcover-The carousel items (images) resize behaviour.
--slidy-slide-radius1rem<length>The slide’s border radius value.
--slidy-slide-widthauto<length>The carousel items width.
--slidy-thumbnail-radius0.5rem<length>The thumbnail border-radius value.
--slidy-thumbnail-size50px<length>The thumbnail panel size.
--slidy-width100%<length>The width of the component’s node.

There are two options:

Custom style props

Svelte supports passing down custom properties to component via [--style-props][svelte-custom-props]:

<Slidy --slidy-slide-gap="1rem" />

Bear in mind that this way Svelte wraps the component in extra <div /> with display: contents.

Inherited custom properties

More optimal way is to use cascade. All supported custom properties starts with --slidy-. For example, to recolor navigation controls, let the component inherit a --slidy-nav-item-color custom property from any parent:

<div class="parent">
	<Slidy />
</div>

<style>
	.parent {
		--slidy-navigation-color: red;
	}
</style>

Or just pass a class with a set of custom properties:

<script>
	import { Slidy, classNames } from "@slidy/svelte";
</script>

<Slidy
	classNames={{
		root: `${classNames.root} .some-class`,
		...classNames
	}}
/>

<style>
	.some-class {
		--slidy-navigation-color: red;
		--slidy-nav-item-size: 1rem;
	}
</style>

Events

The component forwards custom events:

NameDescriptionEvent detail
destroyComponent is destroyed.node
indexThe current slide index changes.{ index: number, position: number }
keysThe key pressed on focus.event.code
mountComponent is mounted to the DOM.{ childs, options }
moveNavigation occurs.{ index: number, position: number }
resizeComponent’s dimentions changes.{ node, options }
updateComponent’s props changes.options

Recipes

External controls

It is possible to control the navigation of the Slidy instance from the parent component via binding.

There are two variables available to control the component externally: index and position. Declare the variables to hold the values and bind them to the instance for the carousel control.

<script>
	import { Slidy } from "svelte-slidy";

	let index = 0;
	let position = 0;
</script>

<button on:click={() => (index += 1)}> Next slide </button>

<button on:click={() => (position += 50)}> Move </button>

<Slidy bind:index bind:position />

Possible issues