958aac65b760ba03f347a021db12764f8b9da3b7
by adding a svelte property (not sure if this is really the way to go!) we can make the runtime build version in svelte kit make work too. Without this, things end badly when running the build version: ``` 0|itis-tng | TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".svelte" for /home/oetiker/checkouts/itis-tng-svelte-tailwind/node_modules/svelte-carousel/src/components/Carousel/Carousel.svelte 0|itis-tng | at new NodeError (node:internal/errors:387:5) 0|itis-tng | at Object.getFileProtocolModuleFormat [as file:] (node:internal/modules/esm/get_format:76:11) 0|itis-tng | at defaultGetFormat (node:internal/modules/esm/get_format:118:38) 0|itis-tng | at defaultLoad (node:internal/modules/esm/load:81:20) 0|itis-tng | at nextLoad (node:internal/modules/esm/loader:165:28) 0|itis-tng | at ESMLoader.load (node:internal/modules/esm/loader:608:26) 0|itis-tng | at ESMLoader.moduleProvider (node:internal/modules/esm/loader:464:22) 0|itis-tng | at new ModuleJob (node:internal/modules/esm/module_job:63:26) 0|itis-tng | at ESMLoader.#createModuleJob (node:internal/modules/esm/loader:483:17) 0|itis-tng | at ESMLoader.getModuleJob (node:internal/modules/esm/loader:441:34) ```
svelte-carousel
The awesome carousel component for Svelte 3
Demo
Installation
yarn add svelte-carousel
npm install svelte-carousel
Import component
<script>
import Carousel from 'svelte-carousel'
// ...
</script>
SvelteKit support
There are several things to keep in mind when svelte-carousel is used with SvelteKit. This is because svelte-carousel is a client-side library and depends on document and window. See more in SvelteKit FAQ.
- Install
svelte-carouselas a dev dependency. Why as a dev dependency?
yarn add svelte-carousel -D
npm install svelte-carousel -D
- Extend
kitinsvelte.config.jsto include theviteproperty
const config = {
// existing props
kit: {
// existing props
vite: {
optimizeDeps: {
include: ['lodash.get', 'lodash.isequal', 'lodash.clonedeep']
}
// plugins: []
}
}
}
- Import and use it:
<script>
import Carousel from 'svelte-carousel';
import { browser } from '$app/env';
let carousel; // for calling methods of the carousel instance
const handleNextClick = () => {
carousel.goToNext()
}
</script>
{#if browser}
<Carousel
bind:this={carousel}
>
<div>1</div>
<div>2</div>
<div>3</div>
</Carousel>
{/if}
<button on:click={handleNextClick}>Next</button>
Vite support
- Extend
optimizeDeps.includeinvite.config.js
export default defineConfig({
optimizeDeps: {
include: ['lodash.get', 'lodash.isequal', 'lodash.clonedeep']
}
})
- Import and use it:
<script>
import Carousel from 'svelte-carousel'
let carousel; // for calling methods of the carousel instance
const handleNextClick = () => {
carousel.goToNext()
}
</script>
<Carousel
bind:this={carousel}
>
<div>1</div>
<div>2</div>
<div>3</div>
</Carousel>
<button on:click={handleNextClick}>Next</button>
Props
| Prop | Type | Default | Description |
|---|---|---|---|
arrows |
boolean |
true |
Enables next/prev arrows |
infinite |
boolean |
true |
Infinite looping |
initialPageIndex |
number |
0 |
Page to start on |
duration |
number |
500 |
Transition duration (ms) |
autoplay |
boolean |
false |
Enables autoplay of pages |
autoplayDuration |
number |
3000 |
Autoplay change interval (ms) |
autoplayDirection |
string |
'next' |
Autoplay change direction (next or prev) |
pauseOnFocus |
boolean |
false |
Pauses autoplay on focus (for touchable devices - tap the carousel to toggle the autoplay, for non-touchable devices - hover over the carousel to pause the autoplay) |
autoplayProgressVisible |
boolean |
false |
Shows autoplay duration progress indicator |
dots |
boolean |
true |
Current page indicator dots |
timingFunction |
string |
'ease-in-out' |
CSS animation timing function |
swiping |
boolean |
true |
Enables swiping |
particlesToShow |
number |
1 |
Number of elements to show |
particlesToScroll |
number |
1 |
Number of elements to scroll |
Events
pageChange
It is dispatched on page change
| Payload field | Type | Description |
|---|---|---|
event.detail |
number |
Current page index |
<Carousel
on:pageChange={
event => console.log(`Current page index: ${event.detail}`)
}
>
<!-- -->
</Carousel>
Slots
prev and next
They are used for customizing prev and next buttons.
Slot props:
| Prop | Type | Description |
|---|---|---|
showPrevPage |
function |
Call it to switch to the previos page |
showNextPage |
function |
Call it to switch to the next page |
<Carousel
let:showPrevPage
let:showNextPage
>
<div slot="prev">
<!-- -->
</div>
<div slot="next">
<!-- -->
</div>
<!-- -->
</Carousel>
dots
This slot is used for customizing how dots look like.
Slot props:
| Prop | Type | Description |
|---|---|---|
currentPageIndex |
number |
Represents current page index (start from 0) |
pagesCount |
number |
Total pages amount |
showPage |
function |
Takes index as page to be shown |
<Carousel
let:currentPageIndex
let:pagesCount
let:showPage
>
<div slot="dots">
<!-- -->
</div>
<!-- -->
</Carousel>
Default slot
This slot takes content for the carousel.
Slot props:
| Prop | Type | Description |
|---|---|---|
loaded |
number[] |
Contains indexes of pages to be loaded. Can be used for lazy loading |
currentPageIndex |
number |
Represents current page index (start from 0) |
<Carousel
let:loaded
>
<div>
<!-- -->
</div>
<!-- -->
</Carousel>
Methods
goTo
Navigates to a page by index. (pageIndex, options) => Promise<void>.
Arguments:
| Argument | Type | Default | Description |
|---|---|---|---|
pageIndex |
number |
Page number | |
options.animated |
boolean |
true |
Should it be animated or not |
<script>
// ...
let carousel;
function goToStartPage() {
carousel.goTo(0, { animated: false })
}
</script>
<Carousel
bind:this={carousel}
>
<!-- -->
</Carousel>
<button class="button" on:click={goToStartPage}>Go</button>
goToPrev
Navigates to the previous page. (options) => Promise<void>.
Arguments:
| Argument | Type | Default | Description |
|---|---|---|---|
options.animated |
boolean |
true |
Should it be animated or not |
<script>
// ...
let carousel;
function goToPrevPage() {
carousel.goToPrev({ animated: false })
}
</script>
<Carousel
bind:this={carousel}
>
<!-- -->
</Carousel>
<button class="button" on:click={goToPrevPage}>Go</button>
goToNext
Navigates to the next page. (options) => Promise<void>.
Arguments:
| Argument | Type | Default | Description |
|---|---|---|---|
options.animated |
boolean |
true |
Should it be animated or not |
<script>
// ...
let carousel;
function goToNextPage() {
carousel.goToNext({ animated: false })
}
</script>
<Carousel
bind:this={carousel}
>
<!-- -->
</Carousel>
<button class="button" on:click={goToNextPage}>Go</button>
Description
Languages
JavaScript
63.6%
Svelte
35.4%
CSS
1%
