diff --git a/package-lock.json b/package-lock.json index 8db1dbda..d17a161b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "@muenchen/muc-patternlab-vue", "version": "0.1.0", "license": "MIT", + "dependencies": { + "@splidejs/vue-splide": "github:joris-gallot/vue-splide" + }, "devDependencies": { "@muenchen/prettier-codeformat": "1.0.2", "@rushstack/eslint-patch": "1.10.4", @@ -2211,6 +2214,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@splidejs/splide": { + "version": "4.1.4", + "integrity": "sha512-5I30evTJcAJQXt6vJ26g2xEkG+l1nXcpEw4xpKh0/FWQ8ozmAeTbtniVtVmz2sH1Es3vgfC4SS8B2X4o5JMptA==", + "license": "MIT" + }, + "node_modules/@splidejs/vue-splide": { + "version": "0.6.12", + "resolved": "git+ssh://git@github.com/joris-gallot/vue-splide.git#6f0199b1a3b09f943db07c7a2dedc9b6e4a917d0", + "license": "MIT", + "dependencies": { + "@splidejs/splide": "^4.1.3" + } + }, "node_modules/@storybook/addon-a11y": { "version": "8.4.7", "integrity": "sha512-GpUvXp6n25U1ZSv+hmDC+05BEqxWdlWjQTb/GaboRXZQeMBlze6zckpVb66spjmmtQAIISo0eZxX1+mGcVR7lA==", diff --git a/package.json b/package.json index 4d88fd2d..064bf56e 100644 --- a/package.json +++ b/package.json @@ -76,5 +76,8 @@ "vite-plugin-dts": "4.4.0", "vitest": "2.1.8", "vue-tsc": "2.2.0" + }, + "dependencies": { + "@splidejs/vue-splide": "github:joris-gallot/vue-splide" } } diff --git a/src/components/Slider/MucSlider.stories.ts b/src/components/Slider/MucSlider.stories.ts new file mode 100644 index 00000000..7f0fb4c0 --- /dev/null +++ b/src/components/Slider/MucSlider.stories.ts @@ -0,0 +1,39 @@ +import MucCard from "../Card/MucCard.vue"; +import MucSlider from "./MucSlider.vue"; +import MucSliderItem from "./MucSliderItem.vue"; + +export default { + components: { MucSliderItem, MucSlider }, + component: MucSlider, + title: "MucSlider", + tags: ["autodocs"], + parameters: { + docs: { + description: { + component: `A wrapping layout to show elements in a carousel and slide them, for example [MucCards](/docs/muccard--docs). + +🔗 Patternlab-Docs (https://patternlab.muenchen.space/?p=components-slider-quote) +`, + }, + }, + }, +}; + +export const Template = () => ({ + components: { MucCard, MucSlider, MucSliderItem }, + template: ` + + + + + + + + `, +}); diff --git a/src/components/Slider/MucSlider.vue b/src/components/Slider/MucSlider.vue new file mode 100644 index 00000000..13b6954f --- /dev/null +++ b/src/components/Slider/MucSlider.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/src/components/Slider/MucSliderItem.vue b/src/components/Slider/MucSliderItem.vue new file mode 100644 index 00000000..f0b776ba --- /dev/null +++ b/src/components/Slider/MucSliderItem.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/components/Slider/MucSliderOptions.ts b/src/components/Slider/MucSliderOptions.ts new file mode 100644 index 00000000..584262f0 --- /dev/null +++ b/src/components/Slider/MucSliderOptions.ts @@ -0,0 +1,33 @@ +import type { Options } from "@splidejs/splide"; + +export const mucSliderOptions: Options = { + autoplay: false, + keyboard: true, + slideFocus: true, + lazyLoad: false, + arrows: false, + perMove: 1, + gap: "0", + type: "slide", + perPage: 1, + pagination: false, + speed: 350, + drag: true, + swipe: true, + swipeThreshold: 50, + mediaQuery: "min", + breakpoints: { + 1: { + perPage: 1, + gap: "1.5rem", + }, + 768: { + perPage: 1, + gap: "1.5rem", + }, + 1200: { + perPage: 1, + gap: "2rem", + }, + }, +}; diff --git a/src/components/Slider/index.ts b/src/components/Slider/index.ts new file mode 100644 index 00000000..069f94d4 --- /dev/null +++ b/src/components/Slider/index.ts @@ -0,0 +1,4 @@ +import MucSlider from "./MucSlider.vue"; +import MucSliderItem from "./MucSliderItem.vue"; + +export { MucSlider, MucSliderItem }; diff --git a/src/components/index.ts b/src/components/index.ts index d155a510..9a5c9da5 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -21,6 +21,7 @@ import { MucIcon } from "./Icon"; import { MucIntro } from "./Intro"; import { MucLink } from "./Link"; import { MucPercentageSpinner } from "./PercentageSpinner"; +import { MucSlider, MucSliderItem } from "./Slider"; import { MucStepper } from "./Stepper"; export { @@ -48,4 +49,6 @@ export { MucPercentageSpinner, MucStepper, MucCalendar, + MucSlider, + MucSliderItem, };