Initial commit — BMP Website 2026

Vollständiges Redesign mit Gold-Formularen, BMP-Logo, multi-step Forms (Bewerbung, Kontakt, Sponsoring), Netlify-Deployment.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Sebastian Pachon Araque
2026-05-29 09:01:20 +02:00
commit fea7998835
8482 changed files with 1259493 additions and 0 deletions

233
node_modules/embla-carousel-auto-scroll/README.md generated vendored Normal file
View File

@@ -0,0 +1,233 @@
<br />
<div align="center">
<p align="center">
<a href="https://www.embla-carousel.com/"><img width="100" height="100" src="https://www.embla-carousel.com/embla-logo.svg" alt="Embla Carousel">
</a>
</p>
<p align="center">
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/npm/l/embla-carousel?color=%238ab4f8"></a>
<a href="https://www.npmjs.com/package/embla-carousel-auto-scroll"><img src="https://img.shields.io/npm/v/embla-carousel-auto-scroll.svg?color=%23c1a8e2"></a>
<a href="https://github.com/davidjerleke/embla-carousel/actions?query=workflow%3A%22Continuous+Integration%22"><img src="https://img.shields.io/github/actions/workflow/status/davidjerleke/embla-carousel/cd.yml?color=%238ab4f8"></a>
<a href="https://prettier.io"><img src="https://img.shields.io/badge/code_style-prettier-ff69b4.svg?color=%23c1a8e2"></a>
<a href="https://bundlephobia.com/result?p=embla-carousel-auto-scroll@latest"><img src="https://img.shields.io/bundlephobia/minzip/embla-carousel-auto-scroll?color=%238ab4f8&label=gzip%20size">
</a>
</p>
<strong>
<h2 align="center">Embla Carousel Auto Scroll</h2>
</strong>
<p align="center">
<strong>Embla Carousel</strong> is a bare bones carousel library with great fluid motion and awesome swipe precision. It's library agnostic, dependency free and 100% open source.
</p>
<br>
<p align="center">
<strong>
<code>&nbsp;<a href="https://www.embla-carousel.com/examples/predefined/">Examples</a>&nbsp;</code>
</strong>
</p>
<p align="center">
<strong>
<code>&nbsp;<a href="https://www.embla-carousel.com/examples/generator/">Generator</a>&nbsp;</code>
</strong>
</p>
<p align="center">
<strong>
<code>&nbsp;<a href="https://www.embla-carousel.com/get-started/#choose-installation-type">Installation</a>&nbsp;</code>
</strong>
</p>
</div>
<br>
<div align="center">
<strong>
<h2 align="center">Ready for</h2>
</strong>
<p align="center">
<a href="https://www.embla-carousel.com/get-started/module/">
<img src="https://www.embla-carousel.com/javascript-logo.svg" width="40" height="40" />
</a>
<a href="https://www.embla-carousel.com/get-started/module/">
<img src="https://www.embla-carousel.com/typescript-logo.svg" width="40" height="40" />
</a>
<a href="https://www.embla-carousel.com/get-started/react/">
<img src="https://www.embla-carousel.com/react-logo.svg" width="40" height="40" />
</a>
<a href="https://www.embla-carousel.com/get-started/vue/">
<img src="https://www.embla-carousel.com/vue-logo.svg" width="40" height="40" />
</a>
<a href="https://www.embla-carousel.com/get-started/svelte/">
<img src="https://www.embla-carousel.com/svelte-logo.svg" width="40" height="40" />
</a>
<a href="https://www.embla-carousel.com/get-started/solid/">
<img src="https://www.embla-carousel.com/solid-logo.svg" width="40" height="40" />
</a>
<a href="https://github.com/donaldxdonald/embla-carousel-angular">
<img src="https://www.embla-carousel.com/angular-logo.svg" width="40" height="40" />
</a>
</p>
</div>
<br>
<div align="center">
<strong>
<h2 align="center">Contributors</h2>
</strong>
<p align="center">
Thank you to all contributors for making <a href="https://www.embla-carousel.com/">Embla Carousel</a> awesome! <a href="https://github.com/davidjerleke/embla-carousel/blob/master/CONTRIBUTING.md">Contributions</a> are welcome.
</p>
<p align="center">
<a href="https://github.com/davidjerleke">
<img src="https://avatars2.githubusercontent.com/u/11529148?s=120&v=4" title="davidjerleke" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/Ronit-gurjar">
<img src="https://avatars2.githubusercontent.com/u/92150685?s=120&v=4" title="Ronit-gurjar" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/zaaakher">
<img src="https://avatars2.githubusercontent.com/u/46135573?s=120&v=4" title="zaaakher" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/xiel">
<img src="https://avatars2.githubusercontent.com/u/615522?s=120&v=4" title="xiel" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/javiergonzalezGenially">
<img src="https://avatars2.githubusercontent.com/u/78730098?s=120&v=4" title="javiergonzalezGenially" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/meirroth">
<img src="https://avatars2.githubusercontent.com/u/12494197?s=120&v=4" title="meirroth" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/hamidrezahanafi">
<img src="https://avatars2.githubusercontent.com/u/91487491?s=120&v=4" title="hamidrezahanafi" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/negezor">
<img src="https://avatars2.githubusercontent.com/u/9392723?s=120&v=4" title="negezor" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/th-km">
<img src="https://avatars2.githubusercontent.com/u/35410212?s=120&v=4" title="th-km" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/openscript">
<img src="https://avatars2.githubusercontent.com/u/1105080?s=120&v=4" title="openscript" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/nwidynski">
<img src="https://avatars2.githubusercontent.com/u/25958801?s=120&v=4" title="nwidynski" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/wopian">
<img src="https://avatars2.githubusercontent.com/u/3440094?s=120&v=4" title="wopian" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/horseeyephil">
<img src="https://avatars2.githubusercontent.com/u/32337092?s=120&v=4" title="horseeyephil" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/pipisasa">
<img src="https://avatars2.githubusercontent.com/u/54534600?s=120&v=4" title="pipisasa" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/ranno-lauri">
<img src="https://avatars2.githubusercontent.com/u/87007115?s=120&v=4" title="ranno-lauri" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/ruijdacd">
<img src="https://avatars2.githubusercontent.com/u/9107610?s=120&v=4" title="ruijdacd" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/rojadesign">
<img src="https://avatars2.githubusercontent.com/u/35687281?s=120&v=4" title="rojadesign" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/sadeghbarati">
<img src="https://avatars2.githubusercontent.com/u/17789047?s=120&v=4" title="sadeghbarati" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/S-Shingler">
<img src="https://avatars2.githubusercontent.com/u/48463809?s=120&v=4" title="S-Shingler" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/Yonom">
<img src="https://avatars2.githubusercontent.com/u/1394504?s=120&v=4" title="Yonom" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/smultar">
<img src="https://avatars2.githubusercontent.com/u/6223536?s=120&v=4" title="smultar" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/dev-suraj-kumar">
<img src="https://avatars2.githubusercontent.com/u/184739775?s=120&v=4" title="dev-suraj-kumar" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/Matoseb">
<img src="https://avatars2.githubusercontent.com/u/24431250?s=120&v=4" title="Matoseb" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/tlo-johnson">
<img src="https://avatars2.githubusercontent.com/u/8763144?s=120&v=4" title="tlo-johnson" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/yasuhiro-yamamoto">
<img src="https://avatars2.githubusercontent.com/u/25109330?s=120&v=4" title="yasuhiro-yamamoto" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/anzbert">
<img src="https://avatars2.githubusercontent.com/u/38823700?s=120&v=4" title="anzbert" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/sarussss">
<img src="https://avatars2.githubusercontent.com/u/15656996?s=120&v=4" title="sarussss" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/silllli">
<img src="https://avatars2.githubusercontent.com/u/9334305?s=120&v=4" title="silllli" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/nikrowell">
<img src="https://avatars2.githubusercontent.com/u/260039?s=120&v=4" title="nikrowell" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/mujahidfa">
<img src="https://avatars2.githubusercontent.com/u/17759705?s=120&v=4" title="mujahidfa" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/Mitch-At-Work">
<img src="https://avatars2.githubusercontent.com/u/99835933?s=120&v=4" title="Mitch-At-Work" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/romellem">
<img src="https://avatars2.githubusercontent.com/u/8504000?s=120&v=4" title="romellem" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/junlarsen">
<img src="https://avatars2.githubusercontent.com/u/42585241?s=120&v=4" title="junlarsen" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/LucasMariniFalbo">
<img src="https://avatars2.githubusercontent.com/u/9245477?s=120&v=4" title="LucasMariniFalbo" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/LiamMartens">
<img src="https://avatars2.githubusercontent.com/u/5265324?s=120&v=4" title="LiamMartens" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/S1r-Lanzelot">
<img src="https://avatars2.githubusercontent.com/u/4487160?s=120&v=4" title="S1r-Lanzelot" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/ishaqibrahimbot">
<img src="https://avatars2.githubusercontent.com/u/74908398?s=120&v=4" title="ishaqibrahimbot" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/fcasibu">
<img src="https://avatars2.githubusercontent.com/u/75290989?s=120&v=4" title="fcasibu" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/cundd">
<img src="https://avatars2.githubusercontent.com/u/743122?s=120&v=4" title="cundd" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/sedlukha">
<img src="https://avatars2.githubusercontent.com/u/14075940?s=120&v=4" title="sedlukha" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/allen-garvey">
<img src="https://avatars2.githubusercontent.com/u/9314727?s=120&v=4" title="allen-garvey" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/lesha1201">
<img src="https://avatars2.githubusercontent.com/u/10157660?s=120&v=4" title="lesha1201" width="50" height="50" style="max-width: 100%" />
</a><a href="https://github.com/SaizFerri">
<img src="https://avatars2.githubusercontent.com/u/19834971?s=120&v=4" title="SaizFerri" width="50" height="50" style="max-width: 100%" />
</a>
</p>
</div>
<br>
<div align="center">
<strong>
<h2 align="center">Special Thanks</h2>
</strong>
<p align="center">
<sup>
<a href="https://github.com/gunnarx2">gunnarx2</a> - React wrapper <a href="https://www.embla-carousel.com/get-started/react/">useEmblaCarousel</a>.
</sup>
<br>
<sup>
<a href="https://github.com/LiamMartens">LiamMartens</a> - Solid wrapper <a href="https://www.embla-carousel.com/get-started/solid/">createEmblaCarousel</a>.
</sup>
<br>
<sup>
<a href="https://github.com/donaldxdonald">donaldxdonald</a>, <a href="https://github.com/zip-fa">zip-fa</a>, <a href="https://github.com/JeanMeche">JeanMeche</a> - Angular wrapper <a href="https://github.com/donaldxdonald/embla-carousel-angular?tab=readme-ov-file#installation">EmblaCarouselDirective</a>.
</sup>
<br>
<sup>
<a href="https://github.com/xiel">xiel</a> - Plugin <a href="https://github.com/xiel/embla-carousel-wheel-gestures">Embla Carousel Wheel Gestures</a>.
</sup>
<br>
<sup>
<a href="https://github.com/zaaakher">zaaakher</a> - Contributing <a href="https://github.com/davidjerleke/embla-carousel/blob/master/CONTRIBUTING.md">guidelines</a>.
</sup>
<br>
<sup>
<a href="https://github.com/sarussss">sarussss</a> - Answering questions.
</sup>
</p>
</div>
<br>
<h2 align="center">Open Source</h2>
<p align="center">
Embla is <a href="https://github.com/davidjerleke/embla-carousel/blob/master/LICENSE">MIT licensed</a> 💖.<br><br>
<sup>Embla Carousel - Copyright © 2019-present.</sup><br />
<sup>Package created by David Jerleke.</sup>
</p>
<p align="center">
<strong>· · ·</strong>
</p>
<p align="center">
Thanks <a href="https://www.browserstack.com">BrowserStack</a>.
</p>
<p align="center">
<a href="https://www.browserstack.com">
<img src="https://www.embla-carousel.com/browserstack-logo.svg" width="45" height="45" />
</a>
</p>

View File

@@ -0,0 +1,23 @@
import { OptionsType } from './Options';
import { CreatePluginType } from 'embla-carousel';
declare module 'embla-carousel' {
interface EmblaPluginsType {
autoScroll: AutoScrollType;
}
interface EmblaEventListType {
autoScrollPlay: 'autoScroll:play';
autoScrollStop: 'autoScroll:stop';
}
}
export type AutoScrollType = CreatePluginType<{
play: (delay?: number) => void;
stop: () => void;
reset: () => void;
isPlaying: () => boolean;
}, OptionsType>;
export type AutoScrollOptionsType = AutoScrollType['options'];
declare function AutoScroll(userOptions?: AutoScrollOptionsType): AutoScrollType;
declare namespace AutoScroll {
let globalOptions: AutoScrollOptionsType | undefined;
}
export default AutoScroll;

View File

@@ -0,0 +1,13 @@
import { CreateOptionsType } from 'embla-carousel';
export type RootNodeType = null | ((emblaRoot: HTMLElement) => HTMLElement | null);
export type OptionsType = CreateOptionsType<{
direction: 'forward' | 'backward';
speed: number;
startDelay: number;
playOnInit: boolean;
stopOnFocusIn: boolean;
stopOnInteraction: boolean;
stopOnMouseEnter: boolean;
rootNode: RootNodeType;
}>;
export declare const defaultOptions: OptionsType;

View File

@@ -0,0 +1,3 @@
import { EmblaCarouselType } from 'embla-carousel/components/EmblaCarousel';
import { RootNodeType } from './Options';
export declare function getAutoScrollRootNode(emblaApi: EmblaCarouselType, rootNode: RootNodeType): HTMLElement;

View File

@@ -0,0 +1,219 @@
'use strict';
const defaultOptions = {
direction: 'forward',
speed: 2,
startDelay: 1000,
active: true,
breakpoints: {},
playOnInit: true,
stopOnFocusIn: true,
stopOnInteraction: true,
stopOnMouseEnter: false,
rootNode: null
};
function getAutoScrollRootNode(emblaApi, rootNode) {
const emblaRootNode = emblaApi.rootNode();
return rootNode && rootNode(emblaRootNode) || emblaRootNode;
}
function AutoScroll(userOptions = {}) {
let options;
let emblaApi;
let destroyed;
let startDelay;
let timerId = 0;
let autoScrollActive = false;
let mouseIsOver = false;
let defaultScrollBehaviour;
function init(emblaApiInstance, optionsHandler) {
emblaApi = emblaApiInstance;
const {
mergeOptions,
optionsAtMedia
} = optionsHandler;
const optionsBase = mergeOptions(defaultOptions, AutoScroll.globalOptions);
const allOptions = mergeOptions(optionsBase, userOptions);
options = optionsAtMedia(allOptions);
if (emblaApi.scrollSnapList().length <= 1) return;
startDelay = options.startDelay;
destroyed = false;
defaultScrollBehaviour = emblaApi.internalEngine().scrollBody;
const {
eventStore
} = emblaApi.internalEngine();
const isDraggable = !!emblaApi.internalEngine().options.watchDrag;
const root = getAutoScrollRootNode(emblaApi, options.rootNode);
if (isDraggable) {
emblaApi.on('pointerDown', pointerDown);
}
if (isDraggable && !options.stopOnInteraction) {
emblaApi.on('pointerUp', pointerUp);
}
if (options.stopOnMouseEnter) {
eventStore.add(root, 'mouseenter', mouseEnter);
}
if (options.stopOnMouseEnter && !options.stopOnInteraction) {
eventStore.add(root, 'mouseleave', mouseLeave);
}
if (options.stopOnFocusIn) {
emblaApi.on('slideFocusStart', stopAutoScroll);
}
if (options.stopOnFocusIn && !options.stopOnInteraction) {
eventStore.add(emblaApi.containerNode(), 'focusout', startAutoScroll);
}
if (options.playOnInit) startAutoScroll();
}
function destroy() {
emblaApi.off('pointerDown', pointerDown).off('pointerUp', pointerUp).off('slideFocusStart', stopAutoScroll).off('settle', settle);
stopAutoScroll();
destroyed = true;
autoScrollActive = false;
}
function startAutoScroll() {
if (destroyed) return;
if (autoScrollActive) return;
emblaApi.emit('autoScroll:play');
const engine = emblaApi.internalEngine();
const {
ownerWindow
} = engine;
timerId = ownerWindow.setTimeout(() => {
engine.scrollBody = createAutoScrollBehaviour(engine);
engine.animation.start();
}, startDelay);
autoScrollActive = true;
}
function stopAutoScroll() {
if (destroyed) return;
if (!autoScrollActive) return;
emblaApi.emit('autoScroll:stop');
const engine = emblaApi.internalEngine();
const {
ownerWindow
} = engine;
engine.scrollBody = defaultScrollBehaviour;
ownerWindow.clearTimeout(timerId);
timerId = 0;
autoScrollActive = false;
}
function createAutoScrollBehaviour(engine) {
const {
location,
previousLocation,
offsetLocation,
target,
scrollTarget,
index,
indexPrevious,
limit: {
reachedMin,
reachedMax,
constrain
},
options: {
loop
}
} = engine;
const directionSign = options.direction === 'forward' ? -1 : 1;
const noop = () => self;
let bodyVelocity = 0;
let scrollDirection = 0;
let rawLocation = location.get();
let rawLocationPrevious = 0;
let hasSettled = false;
function seek() {
let directionDiff = 0;
previousLocation.set(location);
bodyVelocity = directionSign * options.speed;
rawLocation += bodyVelocity;
location.add(bodyVelocity);
target.set(location);
directionDiff = rawLocation - rawLocationPrevious;
scrollDirection = Math.sign(directionDiff);
rawLocationPrevious = rawLocation;
const currentIndex = scrollTarget.byDistance(0, false).index;
if (index.get() !== currentIndex) {
indexPrevious.set(index.get());
index.set(currentIndex);
emblaApi.emit('select');
}
const reachedEnd = options.direction === 'forward' ? reachedMin(offsetLocation.get()) : reachedMax(offsetLocation.get());
if (!loop && reachedEnd) {
hasSettled = true;
const constrainedLocation = constrain(location.get());
location.set(constrainedLocation);
target.set(location);
stopAutoScroll();
}
return self;
}
const self = {
direction: () => scrollDirection,
duration: () => -1,
velocity: () => bodyVelocity,
settled: () => hasSettled,
seek,
useBaseFriction: noop,
useBaseDuration: noop,
useFriction: noop,
useDuration: noop
};
return self;
}
function pointerDown() {
if (!mouseIsOver) stopAutoScroll();
}
function pointerUp() {
if (!mouseIsOver) startAutoScrollOnSettle();
}
function mouseEnter() {
mouseIsOver = true;
stopAutoScroll();
}
function mouseLeave() {
mouseIsOver = false;
startAutoScroll();
}
function settle() {
emblaApi.off('settle', settle);
startAutoScroll();
}
function startAutoScrollOnSettle() {
emblaApi.on('settle', settle);
}
function play(startDelayOverride) {
if (typeof startDelayOverride !== 'undefined') {
startDelay = startDelayOverride;
}
startAutoScroll();
}
function stop() {
if (autoScrollActive) stopAutoScroll();
}
function reset() {
if (autoScrollActive) {
stopAutoScroll();
startAutoScrollOnSettle();
}
}
function isPlaying() {
return autoScrollActive;
}
const self = {
name: 'autoScroll',
options: userOptions,
init,
destroy,
play,
stop,
reset,
isPlaying
};
return self;
}
AutoScroll.globalOptions = undefined;
module.exports = AutoScroll;
//# sourceMappingURL=embla-carousel-auto-scroll.cjs.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
export { AutoScrollType, AutoScrollOptionsType } from './components/AutoScroll';
export { default } from './components/AutoScroll';

View File

@@ -0,0 +1,55 @@
{
"name": "embla-carousel-auto-scroll",
"version": "8.6.0",
"author": "David Jerleke",
"description": "An auto scroll plugin for Embla Carousel",
"repository": {
"type": "git",
"url": "git+https://github.com/davidjerleke/embla-carousel"
},
"bugs": {
"url": "https://github.com/davidjerleke/embla-carousel/issues"
},
"homepage": "https://www.embla-carousel.com",
"license": "MIT",
"keywords": [
"slider",
"carousel",
"slideshow",
"gallery",
"lightweight",
"touch",
"javascript",
"typescript",
"react",
"vue",
"svelte",
"solid"
],
"types": "index.d.ts",
"sideEffects": false,
"files": [
"embla-carousel-auto-scroll*",
"components/**/*",
"index.d.ts"
],
"devDependencies": {
"@types/jest": "^29.5.6",
"@typescript-eslint/eslint-plugin": "^6.9.0",
"@typescript-eslint/parser": "^6.9.0",
"eslint": "^8.52.0",
"eslint-config-prettier": "^9.0.0",
"eslint-plugin-prettier": "^4.0.0",
"jest": "^29.5.0",
"jest-environment-jsdom": "^29.5.0",
"prettier": "2.8.8",
"rollup": "^4.22.4",
"ts-jest": "^29.1.1",
"typescript": "^5.2.2"
},
"peerDependencies": {
"embla-carousel": "8.6.0"
},
"main": "embla-carousel-auto-scroll.cjs.js",
"type": "commonjs"
}

View File

@@ -0,0 +1,23 @@
import { OptionsType } from './Options';
import { CreatePluginType } from 'embla-carousel';
declare module 'embla-carousel' {
interface EmblaPluginsType {
autoScroll: AutoScrollType;
}
interface EmblaEventListType {
autoScrollPlay: 'autoScroll:play';
autoScrollStop: 'autoScroll:stop';
}
}
export type AutoScrollType = CreatePluginType<{
play: (delay?: number) => void;
stop: () => void;
reset: () => void;
isPlaying: () => boolean;
}, OptionsType>;
export type AutoScrollOptionsType = AutoScrollType['options'];
declare function AutoScroll(userOptions?: AutoScrollOptionsType): AutoScrollType;
declare namespace AutoScroll {
let globalOptions: AutoScrollOptionsType | undefined;
}
export default AutoScroll;

View File

@@ -0,0 +1,13 @@
import { CreateOptionsType } from 'embla-carousel';
export type RootNodeType = null | ((emblaRoot: HTMLElement) => HTMLElement | null);
export type OptionsType = CreateOptionsType<{
direction: 'forward' | 'backward';
speed: number;
startDelay: number;
playOnInit: boolean;
stopOnFocusIn: boolean;
stopOnInteraction: boolean;
stopOnMouseEnter: boolean;
rootNode: RootNodeType;
}>;
export declare const defaultOptions: OptionsType;

View File

@@ -0,0 +1,3 @@
import { EmblaCarouselType } from 'embla-carousel/components/EmblaCarousel';
import { RootNodeType } from './Options';
export declare function getAutoScrollRootNode(emblaApi: EmblaCarouselType, rootNode: RootNodeType): HTMLElement;

View File

@@ -0,0 +1 @@
!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t="undefined"!=typeof globalThis?globalThis:t||self).EmblaCarouselAutoScroll=n()}(this,(function(){"use strict";const t={direction:"forward",speed:2,startDelay:1e3,active:!0,breakpoints:{},playOnInit:!0,stopOnFocusIn:!0,stopOnInteraction:!0,stopOnMouseEnter:!1,rootNode:null};function n(o={}){let e,i,r,s,c,a=0,u=!1,l=!1;function f(){if(r)return;if(u)return;i.emit("autoScroll:play");const t=i.internalEngine(),{ownerWindow:n}=t;a=n.setTimeout((()=>{t.scrollBody=function(t){const{location:n,previousLocation:o,offsetLocation:r,target:s,scrollTarget:c,index:a,indexPrevious:u,limit:{reachedMin:l,reachedMax:f,constrain:p},options:{loop:g}}=t,y="forward"===e.direction?-1:1,m=()=>v;let O=0,w=0,E=n.get(),I=0,b=!1;function h(){let t=0;o.set(n),O=y*e.speed,E+=O,n.add(O),s.set(n),t=E-I,w=Math.sign(t),I=E;const m=c.byDistance(0,!1).index;a.get()!==m&&(u.set(a.get()),a.set(m),i.emit("select"));const h="forward"===e.direction?l(r.get()):f(r.get());if(!g&&h){b=!0;const t=p(n.get());n.set(t),s.set(n),d()}return v}const v={direction:()=>w,duration:()=>-1,velocity:()=>O,settled:()=>b,seek:h,useBaseFriction:m,useBaseDuration:m,useFriction:m,useDuration:m};return v}(t),t.animation.start()}),s),u=!0}function d(){if(r)return;if(!u)return;i.emit("autoScroll:stop");const t=i.internalEngine(),{ownerWindow:n}=t;t.scrollBody=c,n.clearTimeout(a),a=0,u=!1}function p(){l||d()}function g(){l||w()}function y(){l=!0,d()}function m(){l=!1,f()}function O(){i.off("settle",O),f()}function w(){i.on("settle",O)}return{name:"autoScroll",options:o,init:function(a,u){i=a;const{mergeOptions:l,optionsAtMedia:O}=u,w=l(t,n.globalOptions),E=l(w,o);if(e=O(E),i.scrollSnapList().length<=1)return;s=e.startDelay,r=!1,c=i.internalEngine().scrollBody;const{eventStore:I}=i.internalEngine(),b=!!i.internalEngine().options.watchDrag,h=function(t,n){const o=t.rootNode();return n&&n(o)||o}(i,e.rootNode);b&&i.on("pointerDown",p),b&&!e.stopOnInteraction&&i.on("pointerUp",g),e.stopOnMouseEnter&&I.add(h,"mouseenter",y),e.stopOnMouseEnter&&!e.stopOnInteraction&&I.add(h,"mouseleave",m),e.stopOnFocusIn&&i.on("slideFocusStart",d),e.stopOnFocusIn&&!e.stopOnInteraction&&I.add(i.containerNode(),"focusout",f),e.playOnInit&&f()},destroy:function(){i.off("pointerDown",p).off("pointerUp",g).off("slideFocusStart",d).off("settle",O),d(),r=!0,u=!1},play:function(t){void 0!==t&&(s=t),f()},stop:function(){u&&d()},reset:function(){u&&(d(),w())},isPlaying:function(){return u}}}return n.globalOptions=void 0,n}));

View File

@@ -0,0 +1,23 @@
import { OptionsType } from './Options.js';
import { CreatePluginType } from 'embla-carousel';
declare module 'embla-carousel' {
interface EmblaPluginsType {
autoScroll: AutoScrollType;
}
interface EmblaEventListType {
autoScrollPlay: 'autoScroll:play';
autoScrollStop: 'autoScroll:stop';
}
}
export type AutoScrollType = CreatePluginType<{
play: (delay?: number) => void;
stop: () => void;
reset: () => void;
isPlaying: () => boolean;
}, OptionsType>;
export type AutoScrollOptionsType = AutoScrollType['options'];
declare function AutoScroll(userOptions?: AutoScrollOptionsType): AutoScrollType;
declare namespace AutoScroll {
let globalOptions: AutoScrollOptionsType | undefined;
}
export default AutoScroll;

View File

@@ -0,0 +1,13 @@
import { CreateOptionsType } from 'embla-carousel';
export type RootNodeType = null | ((emblaRoot: HTMLElement) => HTMLElement | null);
export type OptionsType = CreateOptionsType<{
direction: 'forward' | 'backward';
speed: number;
startDelay: number;
playOnInit: boolean;
stopOnFocusIn: boolean;
stopOnInteraction: boolean;
stopOnMouseEnter: boolean;
rootNode: RootNodeType;
}>;
export declare const defaultOptions: OptionsType;

View File

@@ -0,0 +1,3 @@
import { EmblaCarouselType } from 'embla-carousel/components/EmblaCarousel';
import { RootNodeType } from './Options.js';
export declare function getAutoScrollRootNode(emblaApi: EmblaCarouselType, rootNode: RootNodeType): HTMLElement;

View File

@@ -0,0 +1,217 @@
const defaultOptions = {
direction: 'forward',
speed: 2,
startDelay: 1000,
active: true,
breakpoints: {},
playOnInit: true,
stopOnFocusIn: true,
stopOnInteraction: true,
stopOnMouseEnter: false,
rootNode: null
};
function getAutoScrollRootNode(emblaApi, rootNode) {
const emblaRootNode = emblaApi.rootNode();
return rootNode && rootNode(emblaRootNode) || emblaRootNode;
}
function AutoScroll(userOptions = {}) {
let options;
let emblaApi;
let destroyed;
let startDelay;
let timerId = 0;
let autoScrollActive = false;
let mouseIsOver = false;
let defaultScrollBehaviour;
function init(emblaApiInstance, optionsHandler) {
emblaApi = emblaApiInstance;
const {
mergeOptions,
optionsAtMedia
} = optionsHandler;
const optionsBase = mergeOptions(defaultOptions, AutoScroll.globalOptions);
const allOptions = mergeOptions(optionsBase, userOptions);
options = optionsAtMedia(allOptions);
if (emblaApi.scrollSnapList().length <= 1) return;
startDelay = options.startDelay;
destroyed = false;
defaultScrollBehaviour = emblaApi.internalEngine().scrollBody;
const {
eventStore
} = emblaApi.internalEngine();
const isDraggable = !!emblaApi.internalEngine().options.watchDrag;
const root = getAutoScrollRootNode(emblaApi, options.rootNode);
if (isDraggable) {
emblaApi.on('pointerDown', pointerDown);
}
if (isDraggable && !options.stopOnInteraction) {
emblaApi.on('pointerUp', pointerUp);
}
if (options.stopOnMouseEnter) {
eventStore.add(root, 'mouseenter', mouseEnter);
}
if (options.stopOnMouseEnter && !options.stopOnInteraction) {
eventStore.add(root, 'mouseleave', mouseLeave);
}
if (options.stopOnFocusIn) {
emblaApi.on('slideFocusStart', stopAutoScroll);
}
if (options.stopOnFocusIn && !options.stopOnInteraction) {
eventStore.add(emblaApi.containerNode(), 'focusout', startAutoScroll);
}
if (options.playOnInit) startAutoScroll();
}
function destroy() {
emblaApi.off('pointerDown', pointerDown).off('pointerUp', pointerUp).off('slideFocusStart', stopAutoScroll).off('settle', settle);
stopAutoScroll();
destroyed = true;
autoScrollActive = false;
}
function startAutoScroll() {
if (destroyed) return;
if (autoScrollActive) return;
emblaApi.emit('autoScroll:play');
const engine = emblaApi.internalEngine();
const {
ownerWindow
} = engine;
timerId = ownerWindow.setTimeout(() => {
engine.scrollBody = createAutoScrollBehaviour(engine);
engine.animation.start();
}, startDelay);
autoScrollActive = true;
}
function stopAutoScroll() {
if (destroyed) return;
if (!autoScrollActive) return;
emblaApi.emit('autoScroll:stop');
const engine = emblaApi.internalEngine();
const {
ownerWindow
} = engine;
engine.scrollBody = defaultScrollBehaviour;
ownerWindow.clearTimeout(timerId);
timerId = 0;
autoScrollActive = false;
}
function createAutoScrollBehaviour(engine) {
const {
location,
previousLocation,
offsetLocation,
target,
scrollTarget,
index,
indexPrevious,
limit: {
reachedMin,
reachedMax,
constrain
},
options: {
loop
}
} = engine;
const directionSign = options.direction === 'forward' ? -1 : 1;
const noop = () => self;
let bodyVelocity = 0;
let scrollDirection = 0;
let rawLocation = location.get();
let rawLocationPrevious = 0;
let hasSettled = false;
function seek() {
let directionDiff = 0;
previousLocation.set(location);
bodyVelocity = directionSign * options.speed;
rawLocation += bodyVelocity;
location.add(bodyVelocity);
target.set(location);
directionDiff = rawLocation - rawLocationPrevious;
scrollDirection = Math.sign(directionDiff);
rawLocationPrevious = rawLocation;
const currentIndex = scrollTarget.byDistance(0, false).index;
if (index.get() !== currentIndex) {
indexPrevious.set(index.get());
index.set(currentIndex);
emblaApi.emit('select');
}
const reachedEnd = options.direction === 'forward' ? reachedMin(offsetLocation.get()) : reachedMax(offsetLocation.get());
if (!loop && reachedEnd) {
hasSettled = true;
const constrainedLocation = constrain(location.get());
location.set(constrainedLocation);
target.set(location);
stopAutoScroll();
}
return self;
}
const self = {
direction: () => scrollDirection,
duration: () => -1,
velocity: () => bodyVelocity,
settled: () => hasSettled,
seek,
useBaseFriction: noop,
useBaseDuration: noop,
useFriction: noop,
useDuration: noop
};
return self;
}
function pointerDown() {
if (!mouseIsOver) stopAutoScroll();
}
function pointerUp() {
if (!mouseIsOver) startAutoScrollOnSettle();
}
function mouseEnter() {
mouseIsOver = true;
stopAutoScroll();
}
function mouseLeave() {
mouseIsOver = false;
startAutoScroll();
}
function settle() {
emblaApi.off('settle', settle);
startAutoScroll();
}
function startAutoScrollOnSettle() {
emblaApi.on('settle', settle);
}
function play(startDelayOverride) {
if (typeof startDelayOverride !== 'undefined') {
startDelay = startDelayOverride;
}
startAutoScroll();
}
function stop() {
if (autoScrollActive) stopAutoScroll();
}
function reset() {
if (autoScrollActive) {
stopAutoScroll();
startAutoScrollOnSettle();
}
}
function isPlaying() {
return autoScrollActive;
}
const self = {
name: 'autoScroll',
options: userOptions,
init,
destroy,
play,
stop,
reset,
isPlaying
};
return self;
}
AutoScroll.globalOptions = undefined;
export { AutoScroll as default };
//# sourceMappingURL=embla-carousel-auto-scroll.esm.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,2 @@
export { AutoScrollType, AutoScrollOptionsType } from './components/AutoScroll.js';
export { default } from './components/AutoScroll.js';

View File

@@ -0,0 +1,55 @@
{
"name": "embla-carousel-auto-scroll",
"version": "8.6.0",
"author": "David Jerleke",
"description": "An auto scroll plugin for Embla Carousel",
"repository": {
"type": "git",
"url": "git+https://github.com/davidjerleke/embla-carousel"
},
"bugs": {
"url": "https://github.com/davidjerleke/embla-carousel/issues"
},
"homepage": "https://www.embla-carousel.com",
"license": "MIT",
"keywords": [
"slider",
"carousel",
"slideshow",
"gallery",
"lightweight",
"touch",
"javascript",
"typescript",
"react",
"vue",
"svelte",
"solid"
],
"types": "index.d.ts",
"sideEffects": false,
"files": [
"embla-carousel-auto-scroll*",
"components/**/*",
"index.d.ts"
],
"devDependencies": {
"@types/jest": "^29.5.6",
"@typescript-eslint/eslint-plugin": "^6.9.0",
"@typescript-eslint/parser": "^6.9.0",
"eslint": "^8.52.0",
"eslint-config-prettier": "^9.0.0",
"eslint-plugin-prettier": "^4.0.0",
"jest": "^29.5.0",
"jest-environment-jsdom": "^29.5.0",
"prettier": "2.8.8",
"rollup": "^4.22.4",
"ts-jest": "^29.1.1",
"typescript": "^5.2.2"
},
"peerDependencies": {
"embla-carousel": "8.6.0"
},
"module": "embla-carousel-auto-scroll.esm.js",
"type": "module"
}

2
node_modules/embla-carousel-auto-scroll/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,2 @@
export { AutoScrollType, AutoScrollOptionsType } from './components/AutoScroll';
export { default } from './components/AutoScroll';

77
node_modules/embla-carousel-auto-scroll/package.json generated vendored Normal file
View File

@@ -0,0 +1,77 @@
{
"name": "embla-carousel-auto-scroll",
"version": "8.6.0",
"author": "David Jerleke",
"description": "An auto scroll plugin for Embla Carousel",
"repository": {
"type": "git",
"url": "git+https://github.com/davidjerleke/embla-carousel"
},
"bugs": {
"url": "https://github.com/davidjerleke/embla-carousel/issues"
},
"homepage": "https://www.embla-carousel.com",
"license": "MIT",
"keywords": [
"slider",
"carousel",
"slideshow",
"gallery",
"lightweight",
"touch",
"javascript",
"typescript",
"react",
"vue",
"svelte",
"solid"
],
"main": "embla-carousel-auto-scroll.umd.js",
"unpkg": "embla-carousel-auto-scroll.umd.js",
"module": "./esm/embla-carousel-auto-scroll.esm.js",
"types": "index.d.ts",
"sideEffects": false,
"files": [
"embla-carousel-auto-scroll*",
"components/**/*",
"index.d.ts",
"esm/**/*",
"cjs/**/*"
],
"scripts": {
"test": "echo \"Info: no tests specified\" && exit 0",
"build": "rollup --bundleConfigAsCjs -c",
"start": "rollup --bundleConfigAsCjs -c --watch --environment BUILD:development",
"eslint:report": "eslint \"src/**/*.{js,tsx,ts}\""
},
"devDependencies": {
"@types/jest": "^29.5.6",
"@typescript-eslint/eslint-plugin": "^6.9.0",
"@typescript-eslint/parser": "^6.9.0",
"eslint": "^8.52.0",
"eslint-config-prettier": "^9.0.0",
"eslint-plugin-prettier": "^4.0.0",
"jest": "^29.5.0",
"jest-environment-jsdom": "^29.5.0",
"prettier": "2.8.8",
"rollup": "^4.22.4",
"ts-jest": "^29.1.1",
"typescript": "^5.2.2"
},
"peerDependencies": {
"embla-carousel": "8.6.0"
},
"exports": {
"./package.json": "./package.json",
".": {
"import": {
"types": "./esm/index.d.ts",
"default": "./esm/embla-carousel-auto-scroll.esm.js"
},
"require": {
"types": "./cjs/index.d.ts",
"default": "./cjs/embla-carousel-auto-scroll.cjs.js"
}
}
}
}