From 6a4ccddfc26aa7b9497c792e0add0e00958392d9 Mon Sep 17 00:00:00 2001 From: SanJin-hx Date: Tue, 15 Dec 2020 16:09:29 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=F0=9F=9A=A7:=20tiny=20swiper=20navigatio?= =?UTF-8?q?n=20module?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/tiny-swiper/demo/navigation.html | 105 +++++++++++++++++ .../tiny-swiper/src/modules/navigation.ts | 110 ++++++++++++++++++ 2 files changed, 215 insertions(+) create mode 100644 packages/tiny-swiper/demo/navigation.html create mode 100644 packages/tiny-swiper/src/modules/navigation.ts diff --git a/packages/tiny-swiper/demo/navigation.html b/packages/tiny-swiper/demo/navigation.html new file mode 100644 index 0000000..3576938 --- /dev/null +++ b/packages/tiny-swiper/demo/navigation.html @@ -0,0 +1,105 @@ + + + + + + + Demo + + + + + + + +
+ +
+ +
1
+
2
+
3
+
4
+
+ +
+ + +
+ + + + diff --git a/packages/tiny-swiper/src/modules/navigation.ts b/packages/tiny-swiper/src/modules/navigation.ts new file mode 100644 index 0000000..61406c2 --- /dev/null +++ b/packages/tiny-swiper/src/modules/navigation.ts @@ -0,0 +1,110 @@ +import { + attachListener, + detachListener +} from '../core/render/dom' +import { SwiperInstance } from '../core/index' +import { Options } from '../core/options' + +export type SwiperPluginNavigationOptions = Options & { + navigation: { + $nextEl: HTMLElement | string + $prevEl: HTMLElement | string + hideOnClick: boolean + disabledClass: string + hiddenClass: string + lockClass: string + } +} + +export type SwiperPluginNavigationInstance = { + $nextEl: HTMLElement + $prevEl: HTMLElement +} +export default function SwiperPluginNavigation( + instance: SwiperInstance & { + navigation: SwiperPluginNavigationInstance + }, + options: SwiperPluginNavigationOptions +) { + const navigation = { + $nextEl: null, + $prevEl: null + } as unknown as SwiperPluginNavigationInstance + + const nextClickHandler = (e: PointerEvent) => { + const el = e.target as HTMLElement; + if (checkIsDisable(el)) { + return + } + const { + index + } = instance.state + const { + $list + } = instance.env.element + + if ( index < $list.length - 1 ) { + instance.slideTo(index + 1); + } + }; + + const prevClickHandler = (e: PointerEvent) => { + const el = e.target as HTMLElement; + if (checkIsDisable(el)) { + return + } + const { + index + } = instance.state + const { + $list + } = instance.env.element + + if ( index > 0 ) { + instance.slideTo(index - 1); + } + + }; + + const checkIsDisable = (e: HTMLElement) => { + if (e.className.split(' ').includes(options.navigation.disabledClass)) { + return true + } + return false + } + + instance.on('before-init', () => { + if ( options.navigation ) { + options.navigation = Object.assign({ + hideOnClick: false, + disabledClass: 'swiper-button-disabled', + hiddenClass: 'swiper-button-hidden', + lockClass: 'swiper-button-lock' + }, options.navigation) + } + }) + + instance.on('after-init', () => { + if ( !options.navigation ) return + + navigation.$nextEl = (typeof options.navigation.$nextEl === 'string') + ? document.body.querySelector(options.navigation.$nextEl) as HTMLElement + : options.navigation.$nextEl + navigation.$prevEl = (typeof options.navigation.$prevEl === 'string') + ? document.body.querySelector(options.navigation.$prevEl) as HTMLElement + : options.navigation.$prevEl + + attachListener(navigation.$nextEl, 'click', nextClickHandler) + attachListener(navigation.$prevEl, 'click', prevClickHandler) + }) + + instance.on('after-destroy', () => { + if ( !options.navigation ) return + + delete navigation.$nextEl; + delete navigation.$prevEl; + + detachListener(navigation.$nextEl, 'click', nextClickHandler) + detachListener(navigation.$prevEl, 'click', nextClickHandler) + }) +} From 23e83254c295830996bd355627be42f543440edb Mon Sep 17 00:00:00 2001 From: SanJin-hx Date: Wed, 16 Dec 2020 10:50:02 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=F0=9F=9A=A7:=20tiny=20swiper=20navigatio?= =?UTF-8?q?n=20module=20demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tiny-swiper/src/modules/navigation.ts | 6 +-- .../version-2.0.0-alpha/demo.md | 41 +++++++++++++++++++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/packages/tiny-swiper/src/modules/navigation.ts b/packages/tiny-swiper/src/modules/navigation.ts index 61406c2..42c5d92 100644 --- a/packages/tiny-swiper/src/modules/navigation.ts +++ b/packages/tiny-swiper/src/modules/navigation.ts @@ -56,9 +56,6 @@ export default function SwiperPluginNavigation( const { index } = instance.state - const { - $list - } = instance.env.element if ( index > 0 ) { instance.slideTo(index - 1); @@ -67,7 +64,8 @@ export default function SwiperPluginNavigation( }; const checkIsDisable = (e: HTMLElement) => { - if (e.className.split(' ').includes(options.navigation.disabledClass)) { + if (e.className.split(' ').includes(options.navigation.disabledClass) + || e.className.split(' ').includes(options.navigation.lockClass)) { return true } return false diff --git a/packages/website/versioned_docs/version-2.0.0-alpha/demo.md b/packages/website/versioned_docs/version-2.0.0-alpha/demo.md index 2d21d98..285de13 100644 --- a/packages/website/versioned_docs/version-2.0.0-alpha/demo.md +++ b/packages/website/versioned_docs/version-2.0.0-alpha/demo.md @@ -298,6 +298,47 @@ You need to implement CSS code yourself. +### Navigation + +You need to implement CSS code yourself. + + +
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+ ### Keyboard Control Using `up` `right` `down` `left` keys to control swiper instance. From 6fbaf2cceae66c4987e0d00199e797785b3b6ce9 Mon Sep 17 00:00:00 2001 From: SanJin-hx Date: Wed, 16 Dec 2020 12:10:53 +0800 Subject: [PATCH 03/11] Add(feat): yarn --- packages/website/yarn.lock | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/website/yarn.lock b/packages/website/yarn.lock index 24f00f0..21bb5c3 100644 --- a/packages/website/yarn.lock +++ b/packages/website/yarn.lock @@ -11001,11 +11001,6 @@ tiny-invariant@^1.0.2: resolved "https://registry.npm.taobao.org/tiny-invariant/download/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" integrity sha1-Y0xfjv3CdxS384bDXmdgmR0jCHU= -tiny-swiper@^2.0.0-alpha.0: - version "2.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/tiny-swiper/-/tiny-swiper-2.0.0-alpha.0.tgz#1083ff968d43edbcc73b9815bb3f5d05a0d30a65" - integrity sha512-bLN3KPxIga00RrTj5uj/3xP/YbdfKQsjnGnZToSo1kn6RLfSQBzuQJa8HhWKZk9uuSOD1q6B1dah0ecSOxtBOQ== - tiny-warning@^1.0.0, tiny-warning@^1.0.3: version "1.0.3" resolved "https://registry.npm.taobao.org/tiny-warning/download/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" From 6dad0bc7276072525d1a78b870cc16d1d1a6b8d5 Mon Sep 17 00:00:00 2001 From: SanJin-hx Date: Wed, 16 Dec 2020 13:15:35 +0800 Subject: [PATCH 04/11] Add(fixed): rollup navigation add --- packages/tiny-swiper/lib/modules/navigation.min.js | 1 + packages/tiny-swiper/rollup.config.js | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100644 packages/tiny-swiper/lib/modules/navigation.min.js diff --git a/packages/tiny-swiper/lib/modules/navigation.min.js b/packages/tiny-swiper/lib/modules/navigation.min.js new file mode 100644 index 0000000..71a63da --- /dev/null +++ b/packages/tiny-swiper/lib/modules/navigation.min.js @@ -0,0 +1 @@ +!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(n="undefined"!=typeof globalThis?globalThis:n||self).SwiperPluginNavigation=e()}(this,function(){"use strict";function a(n,e,t,i){n.addEventListener(e,t,i)}function s(n,e,t){n.removeEventListener(e,t)}return function(e,t){function n(n){n=n.target,o(n)||(n=e.state.index) Date: Wed, 16 Dec 2020 17:00:38 +0800 Subject: [PATCH 05/11] Add(fixed): navigation module build bug fix --- packages/tiny-swiper/src/index.esm.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/tiny-swiper/src/index.esm.ts b/packages/tiny-swiper/src/index.esm.ts index 205a407..81cab3a 100644 --- a/packages/tiny-swiper/src/index.esm.ts +++ b/packages/tiny-swiper/src/index.esm.ts @@ -2,6 +2,7 @@ import SwiperPluginLazyload from './modules/lazyload' import SwiperPluginPagination from './modules/pagination' import SwiperPluginKeyboardControl from './modules/keyboardControl' import SwiperPluginMousewheel from './modules/mousewheel' +import SwiperPluginNavigation from './modules/navigation' export { Swiper, @@ -18,5 +19,6 @@ export { SwiperPluginLazyload, SwiperPluginPagination, SwiperPluginKeyboardControl, - SwiperPluginMousewheel + SwiperPluginMousewheel, + SwiperPluginNavigation } From c5c073fb23a19ee3f5451a1d0cf423670a2908c3 Mon Sep 17 00:00:00 2001 From: SanJin-hx Date: Wed, 16 Dec 2020 17:16:21 +0800 Subject: [PATCH 06/11] Add(fixed): navigation module build bug fix --- packages/tiny-swiper/lib/index.esm.js | 71 ++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/packages/tiny-swiper/lib/index.esm.js b/packages/tiny-swiper/lib/index.esm.js index 47278da..6b96ce4 100644 --- a/packages/tiny-swiper/lib/index.esm.js +++ b/packages/tiny-swiper/lib/index.esm.js @@ -354,6 +354,75 @@ function SwiperPluginMousewheel(instance, options) { }); } +function SwiperPluginNavigation(instance, options) { + var navigation = { + $nextEl: null, + $prevEl: null + }; + + var nextClickHandler = function nextClickHandler(e) { + var el = e.target; + + if (checkIsDisable(el)) { + return; + } + + var index = instance.state.index; + var $list = instance.env.element.$list; + + if (index < $list.length - 1) { + instance.slideTo(index + 1); + } + }; + + var prevClickHandler = function prevClickHandler(e) { + var el = e.target; + + if (checkIsDisable(el)) { + return; + } + + var index = instance.state.index; + + if (index > 0) { + instance.slideTo(index - 1); + } + }; + + var checkIsDisable = function checkIsDisable(e) { + if (e.className.split(' ').includes(options.navigation.disabledClass) || e.className.split(' ').includes(options.navigation.lockClass)) { + return true; + } + + return false; + }; + + instance.on('before-init', function () { + if (options.navigation) { + options.navigation = Object.assign({ + hideOnClick: false, + disabledClass: 'swiper-button-disabled', + hiddenClass: 'swiper-button-hidden', + lockClass: 'swiper-button-lock' + }, options.navigation); + } + }); + instance.on('after-init', function () { + if (!options.navigation) return; + navigation.$nextEl = typeof options.navigation.$nextEl === 'string' ? document.body.querySelector(options.navigation.$nextEl) : options.navigation.$nextEl; + navigation.$prevEl = typeof options.navigation.$prevEl === 'string' ? document.body.querySelector(options.navigation.$prevEl) : options.navigation.$prevEl; + attachListener(navigation.$nextEl, 'click', nextClickHandler); + attachListener(navigation.$prevEl, 'click', prevClickHandler); + }); + instance.on('after-destroy', function () { + if (!options.navigation) return; + delete navigation.$nextEl; + delete navigation.$prevEl; + detachListener(navigation.$nextEl, 'click', nextClickHandler); + detachListener(navigation.$prevEl, 'click', nextClickHandler); + }); +} + function translate(state, env, options, duration) { var $wrapper = env.element.$wrapper; var wrapperStyle = { @@ -1140,4 +1209,4 @@ Swiper.use = function (plugins) { }; export default Swiper; -export { LIFE_CYCLES, SwiperPluginKeyboardControl, SwiperPluginLazyload, SwiperPluginMousewheel, SwiperPluginPagination }; +export { LIFE_CYCLES, SwiperPluginKeyboardControl, SwiperPluginLazyload, SwiperPluginMousewheel, SwiperPluginNavigation, SwiperPluginPagination }; From cb25c7a156c3cc7c9b1cb26d1782ce359e957807 Mon Sep 17 00:00:00 2001 From: SanJin-hx Date: Wed, 16 Dec 2020 17:46:39 +0800 Subject: [PATCH 07/11] Add(fixed): navigation module build bug fix --- .../website/versioned_docs/version-2.0.0-alpha/demo.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/website/versioned_docs/version-2.0.0-alpha/demo.md b/packages/website/versioned_docs/version-2.0.0-alpha/demo.md index 682a015..7984c7d 100644 --- a/packages/website/versioned_docs/version-2.0.0-alpha/demo.md +++ b/packages/website/versioned_docs/version-2.0.0-alpha/demo.md @@ -5,7 +5,8 @@ title: Demos import { SwiperPluginPagination, SwiperPluginLazyload, - SwiperPluginKeyboardControl + SwiperPluginKeyboardControl, + SwiperPluginNavigation } from 'tiny-swiper/lib/index.esm' import Demo from '../../src/components/Demo' @@ -334,8 +335,8 @@ You need to implement CSS code yourself. -
-
+ + From 4680324f4529451b4d15515086cac5c45b44a238 Mon Sep 17 00:00:00 2001 From: SanJin-hx Date: Wed, 16 Dec 2020 18:25:00 +0800 Subject: [PATCH 08/11] Add(feat): navigation API and demo --- .../versioned_docs/version-2.0.0-alpha/api.md | 48 +++++++++++++++++++ .../version-2.0.0-alpha/demo.md | 20 ++++---- 2 files changed, 60 insertions(+), 8 deletions(-) diff --git a/packages/website/versioned_docs/version-2.0.0-alpha/api.md b/packages/website/versioned_docs/version-2.0.0-alpha/api.md index b677504..a8c3ea0 100644 --- a/packages/website/versioned_docs/version-2.0.0-alpha/api.md +++ b/packages/website/versioned_docs/version-2.0.0-alpha/api.md @@ -312,3 +312,51 @@ const swiper = new Swiper( | invert | boolean | false | Invert the direction of scroll wheel on the mouse | | sensitivity | number | 1 | The threshold value of scroll distance | | interval | number | 400 | Time to suspend slide between two swip actions | + +### Navigation + +Control Tiny-Swiper with Navigation Button. + +- Global name on `window`: `SwiperPluginNavigation`. +- Configuration name: `navigation`. + +#### Usage + +```javascript +import SwiperPluginNavigation from 'tiny-swiper/lib/modules/navigation.min.js' + +const swiper = new Swiper( + swiperContainerElement, + { + // SwiperPluginMousewheel configuration. + navigation: { + $nextEl: 'className | HTMLElement', + $prevEl: 'className | HTMLElement', + hideOnClick: false, + disabledClass: 'swiper-button-disabled', + hiddenClass: 'swiper-button-hidden', + lockClass: 'swiper-button-lock' + }, + + // Add SwiperPluginMousewheel plugin. + plugins: [ SwiperPluginNavigation ] + } +) +``` + +**Notice**: SwiperPluginNavigation was completely stripped from core module since `v2.x`. + +#### Navigation Parameters + +| Parameter | Type | default | Description | +|---|---|---|---| +| navigation | object/boolean | undefined | Object with navigation parameters. | + +| Parameter | Type | default | Description | +|---|---|---|---| +| $nextEl | string / HTMLElement | null | String with CSS selector or HTML element of the element that will work like "next" button after click on it | +| $prevEl | string / HTMLElement | null | String with CSS selector or HTML element of the element that will work like "prev" button after click on it | +| hideOnClick | boolean | false | Toggle navigation buttons visibility after click on Slider's container | +| disabledClass | string | 'swiper-button-disabled' | CSS class name added to navigation button when it becomes disabled | +| hiddenClass | string | 'swiper-button-hidden' | CSS class name added to navigation button when it becomes hidden | +| lockClass | string | 'swiper-button-lock' | CSS class name added to navigation button when it is disabled | diff --git a/packages/website/versioned_docs/version-2.0.0-alpha/demo.md b/packages/website/versioned_docs/version-2.0.0-alpha/demo.md index 7984c7d..e253616 100644 --- a/packages/website/versioned_docs/version-2.0.0-alpha/demo.md +++ b/packages/website/versioned_docs/version-2.0.0-alpha/demo.md @@ -317,26 +317,30 @@ You need to implement CSS code yourself. SwiperPluginNavigation ] }}> -
+
- + < img src="https://user-images.githubusercontent.com/10026019/102327273-74284900-3fc0-11eb-913a-69661b73ab5d.png"/>
- + < img src="https://user-images.githubusercontent.com/10026019/102327264-712d5880-3fc0-11eb-8f07-7d58264938c1.png"/>
- + < img src="https://user-images.githubusercontent.com/10026019/102327267-72f71c00-3fc0-11eb-8550-8845f38935a4.png"/>
- + < img src="https://user-images.githubusercontent.com/10026019/102327260-6f639500-3fc0-11eb-85fa-cfaa45ce054c.png"/>
- + < img src="https://user-images.githubusercontent.com/10026019/102327267-72f71c00-3fc0-11eb-8550-8845f38935a4.png"/>
- - + +
From c1c290245b14996f7ca163f301f4a52a1fa35b32 Mon Sep 17 00:00:00 2001 From: SanJin-hx Date: Thu, 17 Dec 2020 10:07:10 +0800 Subject: [PATCH 09/11] Add(fix): navigation API, demo and Module code fix --- packages/tiny-swiper/demo/navigation.html | 42 +++++----- packages/tiny-swiper/lib/index.esm.js | 54 ++++++------- .../tiny-swiper/lib/modules/navigation.min.js | 2 +- .../tiny-swiper/src/modules/navigation.ts | 79 ++++++++++--------- .../website/src/components/Demo/index.scss | 23 ++++++ .../versioned_docs/version-2.0.0-alpha/api.md | 12 +-- .../version-2.0.0-alpha/demo.md | 14 ++-- 7 files changed, 123 insertions(+), 103 deletions(-) diff --git a/packages/tiny-swiper/demo/navigation.html b/packages/tiny-swiper/demo/navigation.html index 3576938..d56bdcd 100644 --- a/packages/tiny-swiper/demo/navigation.html +++ b/packages/tiny-swiper/demo/navigation.html @@ -1,11 +1,11 @@ - - - - Demo - + @@ -77,27 +77,27 @@
- -
- -
1
-
2
-
3
-
4
-
- -
- - + +
+ +
1
+
2
+
3
+
4
+
+ +
+ +
diff --git a/packages/tiny-swiper/lib/index.esm.js b/packages/tiny-swiper/lib/index.esm.js index 6b96ce4..5ccc1dc 100644 --- a/packages/tiny-swiper/lib/index.esm.js +++ b/packages/tiny-swiper/lib/index.esm.js @@ -356,41 +356,41 @@ function SwiperPluginMousewheel(instance, options) { function SwiperPluginNavigation(instance, options) { var navigation = { - $nextEl: null, - $prevEl: null + nextEl: null, + prevEl: null }; var nextClickHandler = function nextClickHandler(e) { - var el = e.target; - - if (checkIsDisable(el)) { - return; - } - - var index = instance.state.index; - var $list = instance.env.element.$list; - - if (index < $list.length - 1) { - instance.slideTo(index + 1); - } + clickHandler(e.target, 'next'); }; var prevClickHandler = function prevClickHandler(e) { - var el = e.target; + clickHandler(e.target, 'prev'); + }; - if (checkIsDisable(el)) { + var clickHandler = function clickHandler(e, type) { + if (checkIsDisable(e)) { return; } var index = instance.state.index; + var $list = instance.env.element.$list; - if (index > 0) { - instance.slideTo(index - 1); + if (type === 'next') { + if (index < $list.length - 1) { + instance.slideTo(index + 1); + } + } + + if (type === 'prev') { + if (index > 0) { + instance.slideTo(index - 1); + } } }; var checkIsDisable = function checkIsDisable(e) { - if (e.className.split(' ').includes(options.navigation.disabledClass) || e.className.split(' ').includes(options.navigation.lockClass)) { + if (e.classList.contains(options.navigation.disabledClass) || e.classList.contains(options.navigation.lockClass)) { return true; } @@ -409,17 +409,17 @@ function SwiperPluginNavigation(instance, options) { }); instance.on('after-init', function () { if (!options.navigation) return; - navigation.$nextEl = typeof options.navigation.$nextEl === 'string' ? document.body.querySelector(options.navigation.$nextEl) : options.navigation.$nextEl; - navigation.$prevEl = typeof options.navigation.$prevEl === 'string' ? document.body.querySelector(options.navigation.$prevEl) : options.navigation.$prevEl; - attachListener(navigation.$nextEl, 'click', nextClickHandler); - attachListener(navigation.$prevEl, 'click', prevClickHandler); + navigation.nextEl = typeof options.navigation.nextEl === 'string' ? document.body.querySelector(options.navigation.nextEl) : options.navigation.nextEl; + navigation.prevEl = typeof options.navigation.prevEl === 'string' ? document.body.querySelector(options.navigation.prevEl) : options.navigation.prevEl; + attachListener(navigation.nextEl, 'click', nextClickHandler); + attachListener(navigation.prevEl, 'click', prevClickHandler); }); instance.on('after-destroy', function () { if (!options.navigation) return; - delete navigation.$nextEl; - delete navigation.$prevEl; - detachListener(navigation.$nextEl, 'click', nextClickHandler); - detachListener(navigation.$prevEl, 'click', nextClickHandler); + delete navigation.nextEl; + delete navigation.prevEl; + detachListener(navigation.nextEl, 'click', nextClickHandler); + detachListener(navigation.prevEl, 'click', nextClickHandler); }); } diff --git a/packages/tiny-swiper/lib/modules/navigation.min.js b/packages/tiny-swiper/lib/modules/navigation.min.js index 71a63da..b524768 100644 --- a/packages/tiny-swiper/lib/modules/navigation.min.js +++ b/packages/tiny-swiper/lib/modules/navigation.min.js @@ -1 +1 @@ -!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(n="undefined"!=typeof globalThis?globalThis:n||self).SwiperPluginNavigation=e()}(this,function(){"use strict";function a(n,e,t,i){n.addEventListener(e,t,i)}function s(n,e,t){n.removeEventListener(e,t)}return function(e,t){function n(n){n=n.target,o(n)||(n=e.state.index) { - const el = e.target as HTMLElement; - if (checkIsDisable(el)) { + clickHandler(e.target as HTMLElement, 'next'); + }; + + const prevClickHandler = (e: PointerEvent) => { + clickHandler(e.target as HTMLElement, 'prev'); + + }; + + const clickHandler = (e: HTMLElement, type: 'next' | 'prev') => { + if (checkIsDisable(e)) { return } const { @@ -43,29 +51,22 @@ export default function SwiperPluginNavigation( $list } = instance.env.element - if ( index < $list.length - 1 ) { - instance.slideTo(index + 1); + if (type === 'next') { + if (index < $list.length - 1) { + instance.slideTo(index + 1); + } } - }; - const prevClickHandler = (e: PointerEvent) => { - const el = e.target as HTMLElement; - if (checkIsDisable(el)) { - return + if (type === 'prev') { + if (index > 0) { + instance.slideTo(index - 1); + } } - const { - index - } = instance.state - - if ( index > 0 ) { - instance.slideTo(index - 1); - } - - }; + } const checkIsDisable = (e: HTMLElement) => { - if (e.className.split(' ').includes(options.navigation.disabledClass) - || e.className.split(' ').includes(options.navigation.lockClass)) { + if (e.classList.contains(options.navigation.disabledClass) + || e.classList.contains(options.navigation.lockClass)) { return true } return false @@ -85,24 +86,24 @@ export default function SwiperPluginNavigation( instance.on('after-init', () => { if ( !options.navigation ) return - navigation.$nextEl = (typeof options.navigation.$nextEl === 'string') - ? document.body.querySelector(options.navigation.$nextEl) as HTMLElement - : options.navigation.$nextEl - navigation.$prevEl = (typeof options.navigation.$prevEl === 'string') - ? document.body.querySelector(options.navigation.$prevEl) as HTMLElement - : options.navigation.$prevEl + navigation.nextEl = (typeof options.navigation.nextEl === 'string') + ? document.body.querySelector(options.navigation.nextEl) as HTMLElement + : options.navigation.nextEl + navigation.prevEl = (typeof options.navigation.prevEl === 'string') + ? document.body.querySelector(options.navigation.prevEl) as HTMLElement + : options.navigation.prevEl - attachListener(navigation.$nextEl, 'click', nextClickHandler) - attachListener(navigation.$prevEl, 'click', prevClickHandler) + attachListener(navigation.nextEl, 'click', nextClickHandler) + attachListener(navigation.prevEl, 'click', prevClickHandler) }) instance.on('after-destroy', () => { if ( !options.navigation ) return - delete navigation.$nextEl; - delete navigation.$prevEl; + delete navigation.nextEl; + delete navigation.prevEl; - detachListener(navigation.$nextEl, 'click', nextClickHandler) - detachListener(navigation.$prevEl, 'click', nextClickHandler) + detachListener(navigation.nextEl, 'click', nextClickHandler) + detachListener(navigation.prevEl, 'click', nextClickHandler) }) } diff --git a/packages/website/src/components/Demo/index.scss b/packages/website/src/components/Demo/index.scss index 637aa9f..6cbaefe 100644 --- a/packages/website/src/components/Demo/index.scss +++ b/packages/website/src/components/Demo/index.scss @@ -81,6 +81,29 @@ } } + /* plugin pagination */ + .swiper-navigation { + position: relative; + button { + position: absolute; + top: 50%; + padding: 5px 20px; + background: #ff0074; + border: 0; + border-radius: 4px; + color: #fff; + font-weight: 700; + + &:nth-child(2) { + left: 20px; + } + + &:nth-child(3) { + right: 20px; + } + } + } + /* image lazyload */ .swiper-lazy { display: block; diff --git a/packages/website/versioned_docs/version-2.0.0-alpha/api.md b/packages/website/versioned_docs/version-2.0.0-alpha/api.md index a8c3ea0..4bffae6 100644 --- a/packages/website/versioned_docs/version-2.0.0-alpha/api.md +++ b/packages/website/versioned_docs/version-2.0.0-alpha/api.md @@ -328,17 +328,17 @@ import SwiperPluginNavigation from 'tiny-swiper/lib/modules/navigation.min.js' const swiper = new Swiper( swiperContainerElement, { - // SwiperPluginMousewheel configuration. + // SwiperPluginNavigation configuration. navigation: { - $nextEl: 'className | HTMLElement', - $prevEl: 'className | HTMLElement', + nextEl: 'className | HTMLElement', + prevEl: 'className | HTMLElement', hideOnClick: false, disabledClass: 'swiper-button-disabled', hiddenClass: 'swiper-button-hidden', lockClass: 'swiper-button-lock' }, - // Add SwiperPluginMousewheel plugin. + // Add SwiperPluginNavigation plugin. plugins: [ SwiperPluginNavigation ] } ) @@ -354,8 +354,8 @@ const swiper = new Swiper( | Parameter | Type | default | Description | |---|---|---|---| -| $nextEl | string / HTMLElement | null | String with CSS selector or HTML element of the element that will work like "next" button after click on it | -| $prevEl | string / HTMLElement | null | String with CSS selector or HTML element of the element that will work like "prev" button after click on it | +| nextEl | string / HTMLElement | null | String with CSS selector or HTML element of the element that will work like "next" button after click on it | +| prevEl | string / HTMLElement | null | String with CSS selector or HTML element of the element that will work like "prev" button after click on it | | hideOnClick | boolean | false | Toggle navigation buttons visibility after click on Slider's container | | disabledClass | string | 'swiper-button-disabled' | CSS class name added to navigation button when it becomes disabled | | hiddenClass | string | 'swiper-button-hidden' | CSS class name added to navigation button when it becomes hidden | diff --git a/packages/website/versioned_docs/version-2.0.0-alpha/demo.md b/packages/website/versioned_docs/version-2.0.0-alpha/demo.md index e253616..1ad79ba 100644 --- a/packages/website/versioned_docs/version-2.0.0-alpha/demo.md +++ b/packages/website/versioned_docs/version-2.0.0-alpha/demo.md @@ -306,8 +306,8 @@ You need to implement CSS code yourself. -
+
< img src="https://user-images.githubusercontent.com/10026019/102327273-74284900-3fc0-11eb-913a-69661b73ab5d.png"/> @@ -335,12 +335,8 @@ You need to implement CSS code yourself. < img src="https://user-images.githubusercontent.com/10026019/102327267-72f71c00-3fc0-11eb-8550-8845f38935a4.png"/>
- - + +
From 4fc474b3c1e63d7d6261950ae5f8c63140ea5133 Mon Sep 17 00:00:00 2001 From: SanJin-hx Date: Thu, 17 Dec 2020 14:19:32 +0800 Subject: [PATCH 10/11] Add(fix): navigation Module code fix --- packages/tiny-swiper/src/modules/navigation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tiny-swiper/src/modules/navigation.ts b/packages/tiny-swiper/src/modules/navigation.ts index 9c91475..c224787 100644 --- a/packages/tiny-swiper/src/modules/navigation.ts +++ b/packages/tiny-swiper/src/modules/navigation.ts @@ -104,6 +104,6 @@ export default function SwiperPluginNavigation ( delete navigation.prevEl; detachListener(navigation.nextEl, 'click', nextClickHandler) - detachListener(navigation.prevEl, 'click', nextClickHandler) + detachListener(navigation.prevEl, 'click', prevClickHandler) }) } From a5ac62250b7b26fe183fa3be8aac4b3231ff18cb Mon Sep 17 00:00:00 2001 From: SanJin-hx Date: Fri, 18 Dec 2020 10:03:51 +0800 Subject: [PATCH 11/11] Add(feat): navigation Module function add --- packages/tiny-swiper/demo/navigation.html | 11 +- packages/tiny-swiper/lib/index.esm.js | 68 ++++++++- packages/tiny-swiper/lib/index.esm.js.map | 2 +- .../tiny-swiper/lib/modules/navigation.js | 140 ++++++++++++++++++ .../tiny-swiper/lib/modules/navigation.js.map | 1 + .../tiny-swiper/lib/modules/navigation.min.js | 2 +- .../tiny-swiper/src/modules/navigation.ts | 90 ++++++++--- .../website/src/components/Demo/index.scss | 6 +- .../versioned_docs/version-2.0.0-alpha/api.md | 6 - .../version-2.0.0-alpha/demo.md | 6 +- 10 files changed, 287 insertions(+), 45 deletions(-) create mode 100644 packages/tiny-swiper/lib/modules/navigation.js create mode 100644 packages/tiny-swiper/lib/modules/navigation.js.map diff --git a/packages/tiny-swiper/demo/navigation.html b/packages/tiny-swiper/demo/navigation.html index d56bdcd..29e6059 100644 --- a/packages/tiny-swiper/demo/navigation.html +++ b/packages/tiny-swiper/demo/navigation.html @@ -69,11 +69,16 @@ .prevEl { left: 20px; } + + .swiper-button-disabled { + opacity: 0.5; + cursor: not-allowed; + } - - + +
@@ -87,7 +92,7 @@
- +
diff --git a/packages/tiny-swiper/lib/index.esm.js b/packages/tiny-swiper/lib/index.esm.js index 5ccc1dc..9ad6958 100644 --- a/packages/tiny-swiper/lib/index.esm.js +++ b/packages/tiny-swiper/lib/index.esm.js @@ -369,41 +369,94 @@ function SwiperPluginNavigation(instance, options) { }; var clickHandler = function clickHandler(e, type) { - if (checkIsDisable(e)) { + if (checkIsDisable(e) && !instance.options.loop) { return; } var index = instance.state.index; var $list = instance.env.element.$list; + var currentIdx = index; if (type === 'next') { if (index < $list.length - 1) { instance.slideTo(index + 1); } + + if (currentIdx > $list.length) { + currentIdx = index; + } + + currentIdx++; } if (type === 'prev') { if (index > 0) { instance.slideTo(index - 1); } + + if (currentIdx < -1) { + currentIdx = index; + } + + currentIdx--; + } + + console.log(instance.options.loop, currentIdx, type); + checkSwiperDisabledClass(currentIdx, $list.length - 1, type); + }; + + var checkSwiperDisabledClass = function checkSwiperDisabledClass(index, last, type) { + var target = type === 'prev' ? -1 : last + 1; + var slideToNum = type === 'prev' ? last : 0; + + if (navigation.nextEl.classList.contains(options.navigation.disabledClass) && type === 'prev') { + navigation.nextEl.classList.remove(options.navigation.disabledClass); + } + + if (navigation.prevEl.classList.contains(options.navigation.disabledClass) && type === 'next') { + navigation.prevEl.classList.remove(options.navigation.disabledClass); + } + + if (instance.options.loop) { + if (index === target) { + instance.slideTo(slideToNum); + } + } else { + if (instance.state.index === 0) { + navigation.prevEl.classList.add(options.navigation.disabledClass); + } + + if (instance.state.index === last) { + navigation.nextEl.classList.add(options.navigation.disabledClass); + } } }; var checkIsDisable = function checkIsDisable(e) { - if (e.classList.contains(options.navigation.disabledClass) || e.classList.contains(options.navigation.lockClass)) { + if (e.classList.contains(options.navigation.disabledClass)) { return true; } return false; }; + var checkButtonDefaultStatus = function checkButtonDefaultStatus() { + var index = instance.state.index; + var $list = instance.env.element.$list; + + if (index === 0 && !instance.options.loop) { + navigation.prevEl.classList.add(options.navigation.disabledClass); + } + + if ($list.length === 1 && !instance.options.loop) { + navigation.nextEl.classList.add(options.navigation.disabledClass); + } + }; + instance.on('before-init', function () { if (options.navigation) { options.navigation = Object.assign({ - hideOnClick: false, - disabledClass: 'swiper-button-disabled', - hiddenClass: 'swiper-button-hidden', - lockClass: 'swiper-button-lock' + disabledClass: 'swiper-button-disabled' }, options.navigation); } }); @@ -411,6 +464,7 @@ function SwiperPluginNavigation(instance, options) { if (!options.navigation) return; navigation.nextEl = typeof options.navigation.nextEl === 'string' ? document.body.querySelector(options.navigation.nextEl) : options.navigation.nextEl; navigation.prevEl = typeof options.navigation.prevEl === 'string' ? document.body.querySelector(options.navigation.prevEl) : options.navigation.prevEl; + checkButtonDefaultStatus(); attachListener(navigation.nextEl, 'click', nextClickHandler); attachListener(navigation.prevEl, 'click', prevClickHandler); }); @@ -419,7 +473,7 @@ function SwiperPluginNavigation(instance, options) { delete navigation.nextEl; delete navigation.prevEl; detachListener(navigation.nextEl, 'click', nextClickHandler); - detachListener(navigation.prevEl, 'click', nextClickHandler); + detachListener(navigation.prevEl, 'click', prevClickHandler); }); } diff --git a/packages/tiny-swiper/lib/index.esm.js.map b/packages/tiny-swiper/lib/index.esm.js.map index e4f4a97..e3d8cd7 100644 --- a/packages/tiny-swiper/lib/index.esm.js.map +++ b/packages/tiny-swiper/lib/index.esm.js.map @@ -1 +1 @@ -{"version":3,"file":"index.esm.js","sources":["../src/core/render/dom.ts","../src/modules/lazyload.ts","../src/modules/pagination.ts","../src/modules/keyboardControl.ts","../src/modules/mousewheel.ts","../src/core/render/layout.ts","../src/core/options.ts","../src/core/eventHub.ts","../src/core/state/trace.ts","../src/core/state/index.ts","../src/core/render/nextTick.ts","../src/core/render/animation.ts","../src/core/sensor/actions.ts","../src/core/sensor/index.ts","../src/core/env/measure.ts","../src/core/env/limitation.ts","../src/core/env/index.ts","../src/core/render/index.ts","../src/core/state/operations.ts","../src/core/env/element.ts","../src/core/index.ts"],"sourcesContent":["export function addClass (\n el: HTMLElement,\n list: Array | string = []\n): void {\n if (!Array.isArray(list)) list = [list]\n\n list.forEach(clz => (!el.classList.contains(clz) && el.classList.add(clz)))\n}\n\nexport function removeClass (\n el: HTMLElement,\n list: Array | string = []\n): void {\n if (!Array.isArray(list)) list = [list]\n\n list.forEach(clz => (el.classList.contains(clz) && el.classList.remove(clz)))\n}\n\nexport function attachListener (\n el: HTMLElement | Document | Window,\n evtName: string,\n handler: EventListenerOrEventListenerObject,\n opts?: boolean | AddEventListenerOptions\n): void {\n el.addEventListener(evtName, handler, opts)\n}\n\nexport function detachListener (\n el: HTMLElement | Document | Window,\n evtName: string,\n handler: EventListenerOrEventListenerObject\n): void {\n el.removeEventListener(evtName, handler)\n}\n\nexport function removeAttr (\n el: HTMLElement,\n attr: string\n): void {\n el.removeAttribute(attr)\n}\n\nexport function setAttr (\n el: HTMLElement,\n attr: string,\n value = ''\n): HTMLElement {\n el.setAttribute(attr, value)\n return el\n}\n\nexport function setStyle (\n el: HTMLElement,\n style: {[key: string]: string},\n forceRender?: boolean\n): HTMLElement {\n Object.keys(style).forEach(prop => {\n // TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'.\n el.style[prop as any] = style[prop]\n })\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n forceRender && getComputedStyle(el)\n\n return el\n}\n\nexport function getTranslate (\n el: HTMLElement,\n isHorizontal: boolean\n): number {\n const matrix = getComputedStyle(el).transform.replace(/[a-z]|\\(|\\)|\\s/g, '').split(',').map(parseFloat)\n let arr: Array = []\n\n if (matrix.length === 16) {\n arr = matrix.slice(12, 14)\n } else if (matrix.length === 6) {\n arr = matrix.slice(4, 6)\n }\n return (>arr)[isHorizontal ? 0 : 1] || 0\n}\n","import {\n addClass,\n removeClass\n} from '../core/render/dom'\nimport { SwiperInstance } from '../core/index'\nimport { Options } from '../core/options'\nimport { State } from '../core/state/index'\n\nexport type SwiperPluginLazyloadOptions = {\n loadPrevNext: false\n loadPrevNextAmount: 1\n loadOnTransitionStart: false\n elementClass: 'swiper-lazy'\n loadingClass: 'swiper-lazy-loading'\n loadedClass: 'swiper-lazy-loaded'\n preloaderClass: 'swiper-lazy-preloader'\n}\n\nexport type SwiperPluginLazyloadHTMLElement = HTMLImageElement & {\n isLoaded: boolean\n}\n\n/**\n * TinySwiper plugin for image lazy loading.\n *\n * @param {SwiperInstance} instance\n * @param {Options}\n */\nexport default function SwiperPluginLazyload (\n instance: SwiperInstance & {\n lazyload: {\n load (index: number): void\n loadRange (\n index: number,\n range: number\n ): void\n }\n },\n options: Options\n) {\n if (!options.lazyload) return\n\n const lazyloadOptions = options.lazyload\n const lazyload = {\n load (index: number): void {\n const $slide = instance.env.element.$list[index]\n\n if (!$slide) return\n\n const $imgs = [].slice.call($slide.getElementsByClassName(lazyloadOptions.elementClass))\n const $preloaders: HTMLElement[] = [].slice.call($slide.getElementsByClassName(lazyloadOptions.preloaderClass))\n\n function handleLoaded ($img: SwiperPluginLazyloadHTMLElement) {\n $img.removeAttribute('data-src')\n addClass($img, [lazyloadOptions.loadedClass])\n removeClass($img, [lazyloadOptions.loadingClass])\n $img.onload = null\n $img.onerror = null\n $img.isLoaded = true\n\n if ($imgs.every((item: SwiperPluginLazyloadHTMLElement) => item.isLoaded)) {\n $preloaders.forEach(($preloader: HTMLElement) => {\n $preloader.parentElement!.removeChild($preloader)\n })\n }\n }\n\n $imgs.forEach(($img: SwiperPluginLazyloadHTMLElement) => {\n if (!$img.hasAttribute('data-src')) return\n\n const src = $img.getAttribute('data-src')\n\n addClass($img, [lazyloadOptions.loadingClass])\n removeClass($img, [lazyloadOptions.loadedClass])\n $img.src = src as string\n $img.onload = () => handleLoaded($img)\n $img.onerror = () => handleLoaded($img)\n })\n },\n\n loadRange (\n index: number,\n range: number\n ): void {\n lazyload.load(index)\n\n if (lazyloadOptions.loadPrevNext && range >= 1) {\n for (let i = 1; i <= range; i++) {\n lazyload.load(index + i)\n lazyload.load(index - i)\n }\n }\n }\n }\n\n instance.on('before-init', () => {\n options.lazyload = {\n loadPrevNext: false,\n loadPrevNextAmount: 1,\n loadOnTransitionStart: false,\n elementClass: 'swiper-lazy',\n loadingClass: 'swiper-lazy-loading',\n loadedClass: 'swiper-lazy-loaded',\n preloaderClass: 'swiper-lazy-preloader',\n ...options.lazyload\n }\n })\n\n if (lazyloadOptions.loadOnTransitionStart) {\n instance.on('before-slide', (\n oldIndex: number,\n state: State,\n newIndex: number\n ) => {\n lazyload.loadRange(newIndex, lazyloadOptions.loadPrevNextAmount)\n })\n } else {\n instance.on('after-slide', (\n index: number\n ) => {\n lazyload.loadRange(index, lazyloadOptions.loadPrevNextAmount)\n })\n }\n\n instance.on('after-destroy', () => {\n if (!instance.lazyload) return\n\n delete instance.lazyload\n })\n}\n","import {\n addClass,\n removeClass\n} from '../core/render/dom'\nimport { SwiperInstance } from '../core/index'\nimport { Options } from '../core/options'\n\nexport type SwiperPluginPaginationOptions = Options & {\n pagination: {\n el: string\n clickable: false\n bulletClass: 'swiper-pagination-bullet'\n bulletActiveClass: 'swiper-pagination-bullet-active'\n }\n}\n\nexport type SwiperPluginPaginationInstance = {\n $pageList: HTMLElement[]\n $pagination: HTMLElement | null\n}\n\nexport default function SwiperPluginPagination (\n instance: SwiperInstance & {\n pagination: SwiperPluginPaginationInstance\n },\n options: SwiperPluginPaginationOptions\n) {\n const pagination = {\n $pageList: [],\n $pagination: null\n } as unknown as SwiperPluginPaginationInstance\n\n instance.on('before-init', () => {\n if (options.pagination) {\n options.pagination = Object.assign({\n clickable: false,\n bulletClass: 'swiper-pagination-bullet',\n bulletActiveClass: 'swiper-pagination-bullet-active'\n }, options.pagination)\n }\n })\n\n instance.on('after-init', () => {\n if (!options.pagination) return\n\n const {\n bulletClass,\n bulletActiveClass\n } = options.pagination\n const {\n element\n } = instance.env\n const {\n $list\n } = element\n\n const $pagination = (typeof options.pagination.el === 'string'\n ? document.body.querySelector(options.pagination.el)\n : options.pagination.el) as HTMLElement\n const $pageList: Array = []\n const $group = document.createDocumentFragment()\n const dotCount = $list.length - Math.ceil(options.slidesPerView) + 1\n\n options.excludeElements.push($pagination as HTMLElement)\n\n pagination.$pagination = $pagination\n pagination.$pageList = $pageList\n\n for (let index = 0; index < dotCount; index++) {\n const $page = document.createElement('div')\n\n addClass(\n $page,\n index === instance.state.index ? [bulletClass, bulletActiveClass] : bulletClass\n )\n $pageList.push($page)\n $group.appendChild($page)\n }\n\n $pagination.appendChild($group)\n\n if (options.pagination.clickable) {\n $pagination.addEventListener('click', (e: Event) => {\n instance.slideTo($pageList.indexOf(e.target as HTMLElement))\n e.stopPropagation()\n })\n }\n })\n\n instance.on('after-destroy', () => {\n if (!options.pagination) return\n\n pagination.$pagination!.innerHTML = ''\n pagination.$pageList = []\n pagination.$pagination = null\n })\n\n instance.on('after-slide', (\n currentIndex: number\n ) => {\n const { bulletActiveClass } = options.pagination\n\n pagination.$pageList && pagination.$pageList.forEach(($page, index) => {\n if (index === currentIndex) {\n addClass($page, bulletActiveClass)\n } else {\n removeClass($page, bulletActiveClass)\n }\n })\n })\n}\n","import {\n attachListener,\n detachListener\n} from '../core/render/dom'\nimport { SwiperInstance } from '../core/index'\nimport { Options } from '../core/options'\n\nexport type SwiperPluginKeyboardControlOptions = {\n enabled: boolean\n onlyInViewport: boolean\n}\n\nconst DIRECTION = {\n up: 'ArrowUp',\n right: 'ArrowRight',\n down: 'ArrowDown',\n left: 'ArrowLeft'\n}\n\nfunction isVisible (el: HTMLElement): boolean {\n if (!el) return false\n\n const style = getComputedStyle(el)\n const visible = style.visibility !== 'hidden' && style.display !== 'none'\n\n if (!visible) return false\n\n return el.parentElement && el.parentElement.nodeType === 1\n ? isVisible(el.parentElement)\n : true\n}\n\nfunction isElementInView (el: HTMLElement): boolean {\n const visibility = isVisible(el)\n const boundary = el.getBoundingClientRect()\n const isInView = (boundary.top >= 0 && boundary.bottom <= window.innerHeight)\n && (boundary.left >= 0 && boundary.right <= window.innerWidth)\n\n return isInView && visibility\n}\n\n/**\n * TinySwiper plugin for keyboard control.\n *\n * @param {SwiperInstance} instance\n * @param {Options}\n */\nexport default function SwiperPluginKeyboardControl (\n instance: SwiperInstance & {\n keyboard: {\n onKeyDown (e: Event): void\n enable (): void\n disable (): void\n }\n },\n options: Options\n): void {\n if (!options.keyboard) return\n\n const keyboardOptions = options.keyboard\n const keyboard = {\n enable (): void {\n keyboardOptions.enabled = true\n },\n disable (): void {\n keyboardOptions.enabled = false\n },\n onKeyDown (e: KeyboardEvent): void {\n const { key } = e\n\n if ((keyboardOptions.onlyInViewport && !isElementInView(instance.env.element.$el))\n || !keyboardOptions.enabled) return\n\n if (options.isHorizontal) {\n if (key === DIRECTION.left) {\n instance.slideTo(instance.state.index - 1)\n } else if (key === DIRECTION.right) {\n instance.slideTo(instance.state.index + 1)\n }\n } else {\n if (key === DIRECTION.down) {\n instance.slideTo(instance.state.index - 1)\n } else if (key === DIRECTION.up) {\n instance.slideTo(instance.state.index + 1)\n }\n }\n }\n }\n\n instance.on('before-init', () => {\n options.keyboard = {\n enabled: true,\n onlyInViewport: true,\n ...options.keyboard\n }\n\n instance.keyboard = keyboard\n\n attachListener(window, 'keydown', keyboard.onKeyDown as EventListener)\n })\n\n instance.on('after-destroy', () => {\n if (!keyboard) return\n\n detachListener(window, 'keydown', keyboard.onKeyDown as EventListener)\n\n delete instance.keyboard\n })\n}\n","import {\n attachListener,\n detachListener\n} from '../core/render/dom'\nimport { SwiperInstance } from '../core/index'\nimport { Options } from '../core/options'\n\nexport type SwiperPluginMousewheelOptions = Options & {\n mousewheel: {\n invert: false\n sensitivity: 1\n interval: 400\n }\n}\n\nexport type SwiperPluginMousewheelInstance = {\n $el: HTMLElement\n}\n\nexport default function SwiperPluginMousewheel (\n instance: SwiperInstance & {\n mousewheel: SwiperPluginMousewheelInstance\n },\n options: SwiperPluginMousewheelOptions\n) {\n const mousewheel = {\n $el: null\n } as unknown as SwiperPluginMousewheelInstance\n const wheelStatus = {\n wheeling: false,\n wheelDelta: 0,\n wheelingTimer: 0\n }\n const initWheelStatus = () => {\n wheelStatus.wheeling = false\n wheelStatus.wheelDelta = 0\n wheelStatus.wheelingTimer = 0\n }\n const handler = (e: WheelEvent) => {\n const delta = options.isHorizontal ? e.deltaX : e.deltaY\n const {\n index\n } = instance.state\n\n if ((Math.abs(delta) - Math.abs(wheelStatus.wheelDelta) > 0 || !wheelStatus.wheeling)\n && Math.abs(delta) >= options.mousewheel.sensitivity) {\n instance.slideTo(delta > 0 ? index - 1 : index + 1)\n }\n wheelStatus.wheelDelta = delta\n clearTimeout(wheelStatus.wheelingTimer)\n wheelStatus.wheeling = true\n wheelStatus.wheelingTimer = setTimeout(() => {\n initWheelStatus()\n }, options.mousewheel.interval) as unknown as number\n e.preventDefault()\n e.stopPropagation()\n }\n\n instance.on('before-init', () => {\n if (options.mousewheel) {\n options.mousewheel = Object.assign({\n invert: false,\n sensitivity: 1,\n interval: 400\n }, options.mousewheel)\n }\n })\n\n instance.on('after-init', () => {\n if (!options.mousewheel) return\n\n const {\n element\n } = instance.env\n const {\n $el\n } = element\n\n mousewheel.$el = $el\n\n attachListener($el, 'wheel', handler)\n })\n\n instance.on('after-destroy', () => {\n if (!options.mousewheel) return\n\n delete mousewheel.$el\n detachListener(mousewheel.$el, 'wheel', handler)\n })\n}\n","import { State } from '../state/index'\nimport { Env } from '../env/index'\nimport { setStyle } from './dom'\nimport { Options } from '../options'\n\nexport function translate (\n state: State,\n env: Env,\n options: Options,\n duration: number\n): void {\n const {\n $wrapper\n } = env.element\n const wrapperStyle = {\n transition: state.isStart\n ? 'none'\n : `transform ease ${duration}ms`,\n transform: options.isHorizontal\n ? `translate3d(${state.transforms}px, 0, 0)`\n : `translate3d(0, ${state.transforms}px, 0)`\n }\n\n setStyle($wrapper, wrapperStyle)\n}\n","import { SwiperPlugin } from './index'\nimport { translate } from './render/layout'\nimport { State } from './state/index'\nimport { Env } from './env/index'\nimport { SwiperPluginLazyloadOptions } from '../modules/lazyload'\nimport { SwiperPluginPaginationOptions } from '../modules/pagination'\nimport { SwiperPluginKeyboardControlOptions } from '../modules/keyboardControl'\n\nexport type Direction = 'horizontal' | 'vertical'\nexport type Injections = {\n translate: (\n state: State,\n env: Env,\n options: Options,\n duration: number\n ) => void\n}\n\nexport type Options = {\n direction: Direction\n touchRatio: number\n touchAngle: number\n longSwipesRatio: number\n initialSlide: number\n loop: boolean\n freeMode: boolean\n mousewheel: boolean\n passiveListeners: boolean\n resistance: boolean\n resistanceRatio: number\n speed: number\n longSwipesMs: number\n spaceBetween: number\n slidesPerView: number\n centeredSlides: boolean\n slidePrevClass: string\n slideNextClass: string\n slideActiveClass: string\n slideClass: string\n wrapperClass: string\n touchStartPreventDefault: boolean\n touchStartForcePreventDefault: boolean\n touchMoveStopPropagation: boolean\n excludeElements: Array\n isHorizontal: boolean\n plugins?: Array\n injections: Injections\n\n // Plugins\n lazyload?: SwiperPluginLazyloadOptions\n keyboard?: SwiperPluginKeyboardControlOptions\n pagination?: SwiperPluginPaginationOptions\n}\n\nexport type UserOptions = Partial\n\nconst defaultOptions: UserOptions = {\n // `isHorizontal` is computed value\n direction: 'horizontal',\n touchRatio: 1,\n touchAngle: 45,\n longSwipesRatio: 0.5,\n initialSlide: 0,\n loop: false,\n freeMode: false,\n mousewheel: false,\n passiveListeners: true,\n resistance: true,\n resistanceRatio: 0.85,\n speed: 300,\n longSwipesMs: 300,\n spaceBetween: 0,\n slidesPerView: 1,\n centeredSlides: false,\n slidePrevClass: 'swiper-slide-prev',\n slideNextClass: 'swiper-slide-next',\n slideActiveClass: 'swiper-slide-active',\n slideClass: 'swiper-slide',\n wrapperClass: 'swiper-wrapper',\n touchStartPreventDefault: true,\n touchStartForcePreventDefault: false,\n touchMoveStopPropagation: false,\n excludeElements: [],\n injections: {\n translate\n }\n}\n\nexport function optionFormatter (userOptions?: UserOptions): Options {\n const options = {\n ...defaultOptions,\n ...userOptions\n }\n\n return {\n ...options,\n isHorizontal: options.direction === 'horizontal'\n }\n}\n","export type EventHub = {\n // eslint-disable-next-line @typescript-eslint/ban-types\n on (evtName: string, cb: Function): void\n off (evtName: string, cb: Function): void\n emit (evtName: string, ...data: Array): void\n clear (): void\n}\n\nexport const LIFE_CYCLES = {\n BEFORE_INIT: 'before-init',\n AFTER_INIT: 'after-init',\n BEFORE_SLIDE: 'before-slide',\n SCROLL: 'scroll',\n AFTER_SLIDE: 'after-slide',\n BEFORE_DESTROY: 'before-destroy',\n AFTER_DESTROY: 'after-destroy'\n}\n\nexport function EventHub (): EventHub {\n let hub: {\n [key: string]: Array\n } = {}\n\n function on (evtName: string, cb: Function): void {\n if (!hub[evtName]) {\n hub[evtName] = [cb]\n } else {\n hub[evtName].push(cb)\n }\n }\n\n function off (evtName: string, cb: Function): void {\n if (hub[evtName]) {\n const index = hub[evtName].indexOf(cb)\n\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n index > -1 && hub[evtName].splice(index, 1)\n }\n }\n\n function emit (evtName: string, ...data: Array): void {\n if (hub[evtName]) {\n hub[evtName].forEach(cb => cb(...data))\n }\n }\n\n function clear (): void {\n hub = {}\n }\n\n return {\n on,\n off,\n emit,\n clear\n }\n}\n","const delta = 180 / Math.PI\n\nexport type TraceLogs = Array\n\nexport type Offset = {\n /**\n * offset x\n */\n x: number\n\n /**\n * offset y\n */\n y: number\n}\n\nexport type Position = {\n /**\n * postion in the x-axis\n */\n x: number\n\n /**\n * postion in the y-axis\n */\n y: number\n}\n\nexport type Trace = {\n /**\n * timestamp of current postion\n */\n time: number\n} & Position\n\nexport type Tracker = {\n push (postion: Position): void\n vector (): Vector\n clear (): void\n getLogs (): TraceLogs\n getDuration (): number\n getOffset (): Offset\n}\n\nexport type Vector = {\n /**\n * offset in the x-axis\n */\n x: number\n\n /**\n * offset in the y-axis\n */\n y: number\n\n /**\n * velocity in the x-axis\n */\n velocityX: number\n\n /**\n * velocity in the y-axis\n */\n velocityY: number\n\n /**\n * direction angle\n */\n angle: number\n}\n\nexport function Vector (\n logs: TraceLogs,\n index: number\n): Vector {\n const trace = logs[index]\n const formerTrace = logs[index - 1]\n const diff = {\n x: trace.x - formerTrace.x,\n y: trace.y - formerTrace.y\n }\n const duration = trace.time - formerTrace.time\n const velocityX = diff.x / duration\n const velocityY = diff.y / duration\n const angle = Math.atan2(Math.abs(diff.y), Math.abs(diff.x)) * delta\n\n return {\n ...diff,\n angle,\n velocityX,\n velocityY\n }\n}\n\nexport function Tracker (): Tracker {\n let logs: TraceLogs = []\n\n function push (position: Position): void {\n logs.push({\n time: Date.now(),\n ...position\n })\n }\n\n function vector (): Vector {\n return Vector(logs, logs.length - 1)\n }\n\n function clear () {\n logs = []\n }\n\n function getLogs () {\n return logs\n }\n\n function getDuration (): number {\n const first = logs[0]\n const last = logs[logs.length - 1]\n\n return first ? last.time - first.time : 0\n }\n\n function getOffset (): Offset {\n const first = logs[0]\n const last = logs[logs.length - 1]\n\n return first ? {\n x: last.x - first.x,\n y: last.y - first.y\n } : {\n x: 0,\n y: 0\n }\n }\n\n return {\n getDuration,\n getOffset,\n getLogs,\n vector,\n clear,\n push\n }\n}\n","import { Tracker } from './trace'\n\nexport interface State {\n tracker: Tracker\n index: number\n startTransform: number\n isStart: boolean\n isScrolling: boolean\n isTouching: boolean\n transforms: number\n progress: number\n}\n\nexport function State (): State {\n const state: State = {\n tracker: Tracker(),\n index: 0,\n startTransform: 0,\n isStart: false,\n isScrolling: false,\n isTouching: false,\n transforms: 0,\n progress: 0\n }\n\n return state\n}\n","function now () {\n return performance ? performance.now() : Date.now()\n}\n\nexport type Tick = {\n run (cb: (interval: DOMHighResTimeStamp) => void): void\n stop (): void\n}\n\nexport function Tick (): Tick {\n const nextFrame = requestAnimationFrame || webkitRequestAnimationFrame || setTimeout\n const cancelNextFrame = cancelAnimationFrame || webkitCancelAnimationFrame || clearTimeout\n\n let startTime: number | undefined\n let id: number\n\n function run (cb: (interval: DOMHighResTimeStamp) => void): void {\n // eslint-disable-next-line no-void\n startTime = startTime === void 0\n ? now()\n : startTime\n\n // Why do not use callback argument:\n // https://stackoverflow.com/questions/50895206/exact-time-of-display-requestanimationframe-usage-and-timeline\n id = nextFrame(() => {\n const timeStamp = now()\n const interval = timeStamp - startTime\n\n startTime = timeStamp\n cb(interval)\n })\n }\n\n function stop (): void {\n startTime = undefined\n cancelNextFrame(id)\n }\n\n return {\n run,\n stop\n }\n}\n","import { Tick } from './nextTick'\n\nexport type Animation = {\n run (task: (interval: DOMHighResTimeStamp) => void): void\n stop (): void\n}\n\nexport function Animation (): Animation {\n const tick = Tick()\n\n function run (task: (interval: DOMHighResTimeStamp) => void): void {\n tick.run((interval: DOMHighResTimeStamp) => {\n run(task)\n task(interval)\n })\n }\n\n function stop (): void {\n tick.stop()\n }\n\n return {\n run,\n stop\n }\n}\n","import { Position } from '../state/trace'\nimport { Options } from '../options'\nimport { Env } from '../env/index'\nimport { State } from '../state/index'\nimport { Operations } from '../state/operations'\nimport { Animation } from '../render/animation'\n\nexport type Actions = {\n preheat (\n originPosition: Position,\n originTransform: number\n ): void\n move (position: Position): void\n stop (): void\n}\n\nexport function Actions (\n options: Options,\n env: Env,\n state: State,\n operations: Operations\n) {\n const {\n initLayout,\n initStatus,\n render,\n scrollPixel,\n slideTo,\n getOffsetSteps\n } = operations\n const animation = Animation()\n\n function preheat (\n originPosition: Position,\n originTransform: number\n ): void {\n const { tracker } = state\n\n animation.stop()\n tracker.clear()\n tracker.push(originPosition)\n initLayout(originTransform)\n initStatus(originTransform)\n state.isStart = true\n\n render()\n }\n\n function move (position: Position): void {\n const {\n tracker\n } = state\n const {\n touchRatio,\n touchAngle,\n isHorizontal\n } = options\n\n if (!state.isStart || state.isScrolling) return\n\n tracker.push(position)\n\n const vector = tracker.vector()\n const displacement = tracker.getOffset()\n\n // Ignore this move action if there is no displacement of screen touch point.\n // In case of minimal mouse move event. (Moving mouse extreme slowly will get the zero offset.)\n if (!displacement.x && !displacement.y) return\n\n if ((isHorizontal && (vector.angle < touchAngle))\n || (!isHorizontal && (90 - vector.angle) < touchAngle)\n || state.isTouching\n ) {\n const offset = vector[isHorizontal ? 'x' : 'y'] * touchRatio\n\n state.isTouching = true\n scrollPixel(offset)\n render()\n } else {\n state.isScrolling = true\n tracker.clear()\n }\n }\n\n function stop (): void {\n const {\n index,\n tracker\n } = state\n const {\n measure\n } = env\n\n state.isStart = false\n\n if (!options.freeMode || tracker.getLogs().length < 2) {\n const duration = tracker.getDuration()\n const trans = tracker.getOffset()[options.isHorizontal ? 'x' : 'y']\n const jump = Math.ceil(Math.abs(trans) / measure.boxSize)\n const longSwipeIndex = getOffsetSteps(trans)\n\n if (duration > options.longSwipesMs) {\n slideTo(index + longSwipeIndex * (trans > 0 ? -1 : 1))\n } else {\n // short swipe\n slideTo(trans > 0 ? index - jump : index + jump)\n }\n\n tracker.clear()\n initStatus()\n } else {\n const vector = tracker.vector()\n\n let velocity = vector[options.isHorizontal ? 'velocityX' : 'velocityY']\n\n animation.run((duration: number) => {\n const offset = velocity * duration\n\n velocity *= 0.98\n\n if (Math.abs(offset) < 0.004) {\n animation.stop()\n tracker.clear()\n initStatus()\n } else {\n scrollPixel(offset)\n render(0)\n }\n })\n }\n }\n\n return {\n preheat,\n move,\n stop\n }\n}\n","import { State } from '../state/index'\nimport { Env } from '../env/index'\nimport { attachListener, detachListener, getTranslate } from '../render/dom'\nimport { Options } from '../options'\nimport { Position } from '../state/trace'\nimport { Actions } from './actions'\nimport { Operations } from '../state/operations'\n\nexport type Sensor = {\n attach: () => void\n detach: () => void\n}\n\n// Only support single finger touch event.\nexport function Sensor (\n env: Env,\n state: State,\n options: Options,\n operations: Operations\n): Sensor {\n const {\n touchable\n } = env\n const formEls = [\n 'INPUT',\n 'SELECT',\n 'OPTION',\n 'TEXTAREA',\n 'BUTTON',\n 'VIDEO'\n ]\n const actions = Actions(options, env, state, operations)\n const {\n preheat,\n move,\n stop\n } = actions\n\n function getPosition (e: Event): Position {\n const touch = touchable ? (e).changedTouches[0] : e\n\n return {\n x: touch.pageX,\n y: touch.pageY\n }\n }\n\n function onTouchStart (e: Event): void {\n for (let i = 0; i < options.excludeElements.length; i++) {\n if (options.excludeElements[i].contains(e.target as Node)) return\n }\n\n const {\n $wrapper\n } = env.element\n const shouldPreventDefault = (options.touchStartPreventDefault && formEls.indexOf((e.target).nodeName) === -1)\n || options.touchStartForcePreventDefault\n\n if (shouldPreventDefault && !options.passiveListeners) e.preventDefault()\n\n preheat(\n getPosition(e),\n getTranslate($wrapper, options.isHorizontal)\n )\n }\n\n function onTouchMove (e: Event): void {\n if (options.touchMoveStopPropagation) e.stopPropagation()\n\n move(getPosition(e))\n state.isTouching && e.preventDefault()\n }\n\n function onTouchEnd (): void {\n stop()\n }\n\n function attach (): void {\n const {\n $el\n } = env.element\n\n if (touchable) {\n attachListener($el, 'touchstart', onTouchStart, {\n passive: options.passiveListeners,\n capture: false\n })\n attachListener($el, 'touchmove', onTouchMove)\n attachListener($el, 'touchend', onTouchEnd)\n attachListener($el, 'touchcancel', onTouchEnd)\n } else {\n attachListener($el, 'mousedown', onTouchStart)\n attachListener(document, 'mousemove', onTouchMove)\n attachListener(document, 'mouseup', onTouchEnd)\n }\n }\n\n function detach (): void {\n const {\n $el\n } = env.element\n\n detachListener($el, 'touchstart', onTouchStart)\n detachListener($el, 'touchmove', onTouchMove)\n detachListener($el, 'touchend', onTouchEnd)\n detachListener($el, 'touchcancel', onTouchEnd)\n detachListener($el, 'mousedown', onTouchStart)\n detachListener(document, 'mousemove', onTouchMove)\n detachListener(document, 'mouseup', onTouchEnd)\n }\n\n return {\n attach,\n detach\n }\n}\n","import { Options } from '../options'\nimport { Element } from './element'\n\nexport type Measure = {\n boxSize: number\n viewSize: number\n slideSize: number\n}\n\nexport function Measure (\n options: Options,\n element: Element\n): Measure {\n const {\n $el\n } = element\n const viewSize = options.isHorizontal ? $el.offsetWidth : $el.offsetHeight\n const slideSize = (viewSize - (Math.ceil(options.slidesPerView - 1)) * options.spaceBetween) / options.slidesPerView\n const boxSize = slideSize + options.spaceBetween\n\n return {\n boxSize,\n viewSize,\n slideSize\n }\n}\n","import { Options } from '../options'\nimport { Element } from './element'\nimport { Measure } from './measure'\n\nexport type Limitation = {\n min: number\n max: number\n base: number\n expand: number\n buffer: number\n minIndex: number\n maxIndex: number\n}\n\nexport function getExpand (\n options: Options\n): number {\n if (options.loop) {\n // return options.slidesPerView >= element.$list.length\n // ? options.slidesPerView - element.$list.length + 1\n // : 1\n return Math.ceil(options.slidesPerView)\n }\n return 0\n}\n\nexport function Limitation (\n element: Element,\n measure: Measure,\n options: Options\n): Limitation {\n const {\n $list\n } = element\n const {\n viewSize,\n slideSize,\n boxSize\n } = measure\n const expand = getExpand(options)\n const buffer = expand * boxSize\n const base = -buffer + (options.centeredSlides\n ? (viewSize - slideSize) / 2\n : 0)\n // [min, max] usually equal to [-x, 0]\n const max = base\n const min = options.spaceBetween + (options.loop ? slideSize : viewSize) + base - boxSize * $list.length\n const minIndex = 0\n const maxIndex = $list.length - ((options.centeredSlides || options.loop)\n ? 1\n : Math.ceil(options.slidesPerView))\n\n const limitation = {\n max,\n min,\n base,\n expand,\n buffer,\n minIndex,\n maxIndex\n }\n\n return limitation\n}\n","import { Options } from '../options'\nimport { Element } from './element'\nimport { Measure } from './measure'\nimport { Limitation } from './limitation'\n\ndeclare global {\n interface Window {\n DocumentTouch: any\n }\n const DocumentTouch: any\n}\n\nexport type Env = {\n touchable: boolean\n element: Element\n measure: Measure\n limitation: Limitation\n update (element: Element): void\n}\n\nexport function Env (\n elem: Element,\n options: Options\n): Env {\n const env = {}\n\n function update (element: Element): void {\n const measure = Measure(\n options,\n element\n )\n const limitation = Limitation(\n element,\n measure,\n options\n )\n const touchable = Boolean(\n 'ontouchstart' in window\n || navigator.maxTouchPoints > 0\n || navigator.msMaxTouchPoints > 0\n || window.DocumentTouch && document instanceof DocumentTouch\n )\n\n Object.assign(env, {\n touchable,\n element,\n measure,\n limitation\n })\n }\n\n env.update = update\n\n update(elem)\n\n return env\n}\n","import { Options } from '../options'\nimport {\n removeClass, addClass, setStyle, setAttr, attachListener, detachListener\n} from './dom'\nimport { State } from '../state/index'\nimport { Env } from '../env/index'\n\nconst shallowTag = 'data-shallow-slider'\nconst sliderTag = 'data-slider'\n\nexport type Renderer = {\n init (): void\n render (\n state: State,\n duration?: number,\n cb?: Function,\n force?: boolean\n ): void\n destroy (): void\n updateSize (): void\n}\n\nexport function Renderer (\n env: Env,\n options: Options\n): Renderer {\n function updateItem (state: State): void {\n const {\n $wrapper\n } = env.element\n const {\n index\n } = state\n\n $wrapper.querySelectorAll(`[${sliderTag}]`).forEach($slide => {\n // eslint-disable-next-line no-bitwise\n const tagNumber = ~~$slide.getAttribute(sliderTag)\n\n removeClass($slide, [\n options.slidePrevClass,\n options.slideNextClass,\n options.slideActiveClass\n ])\n\n if (tagNumber === index) {\n addClass($slide, options.slideActiveClass)\n }\n if (tagNumber === index - 1) {\n addClass($slide, options.slidePrevClass)\n }\n if (tagNumber === index + 1) {\n addClass($slide, options.slideNextClass)\n }\n })\n }\n\n function render (\n state: State,\n duration?: number,\n cb?: Function,\n force?: false\n ) {\n const {\n $wrapper\n } = env.element\n const timing = duration === undefined ? options.speed : duration\n\n options.injections.translate(state, env, options, timing)\n\n // Update slide style only if scroll action is end.\n if (!state.isStart) updateItem(state)\n\n force && getComputedStyle($wrapper).transform\n cb && setTimeout(cb, timing)\n }\n\n function appendExpandList (): void {\n if (!options.loop) return\n\n const {\n element,\n limitation\n } = env\n const {\n $list,\n $wrapper\n } = element\n const {\n expand\n } = limitation\n const $leftExpandList = $list.slice(-expand)\n .map($slide => $slide.cloneNode(true))\n const $rightExpandList = $list.slice(0, expand)\n .map($slide => $slide.cloneNode(true))\n\n $leftExpandList.forEach(($shadowSlide, index) => {\n $wrapper.appendChild(setAttr($rightExpandList[index], shallowTag))\n $wrapper.insertBefore(setAttr($leftExpandList[index], shallowTag), $list[0])\n })\n }\n\n function destroyExpandList (): void {\n env.element.$wrapper\n .querySelectorAll(`[${shallowTag}]`)\n .forEach(item => env.element.$wrapper.removeChild(item))\n }\n\n function updateDom (): void {\n env.element.$list.forEach((el, index) => setAttr(el, sliderTag, index))\n\n destroyExpandList()\n appendExpandList()\n }\n\n function updateSize (): void {\n const {\n element,\n measure\n } = env\n const {\n $wrapper\n } = element\n const wrapperStyle = {\n display: 'flex',\n willChange: 'transform',\n flexDirection: options.isHorizontal ? 'row' : 'column'\n }\n const itemStyle = {\n [options.isHorizontal ? 'width' : 'height']: `${measure.slideSize}px`,\n [options.isHorizontal ? 'margin-right' : 'margin-bottom']: `${options.spaceBetween}px`\n }\n\n setStyle($wrapper, wrapperStyle)\n $wrapper.querySelectorAll(`[${sliderTag}]`)\n .forEach($slide => setStyle($slide, itemStyle))\n }\n\n function init (): void {\n updateDom()\n updateSize()\n }\n\n function destroy (): void {\n const {\n $list,\n $wrapper\n } = env.element\n const arr = ['display', 'will-change', 'flex-direction']\n const itemProp = options.isHorizontal ? 'margin-right' : 'margin-bottom'\n\n arr.forEach((propertyName: string) => {\n $wrapper.style.removeProperty(propertyName)\n })\n $list.forEach($slide => $slide.style.removeProperty(itemProp))\n destroyExpandList()\n }\n\n return {\n init,\n render,\n destroy,\n updateSize\n }\n}\n","import { State } from './index'\nimport { Limitation } from '../env/limitation'\nimport { EventHub, LIFE_CYCLES } from '../eventHub'\nimport { Renderer } from '../render/index'\nimport { Options } from '../options'\nimport { Env } from '../env/index'\n\nexport interface Operations {\n update (): void\n render (duration?: number): void\n transform (trans: number): void\n slideTo (\n targetIndex: number,\n duration?: number\n ): void\n scrollPixel (px: number): void\n initStatus (startTransform?: number): void\n initLayout (originTransform: number): void\n getOffsetSteps (offset: number): number\n}\n\nexport function isExceedingLimits (\n velocity: number,\n transform: number,\n options: Options,\n limitation: Limitation\n): boolean {\n return velocity > 0 && transform > (limitation.max)\n || velocity < 0 && transform < (limitation.min)\n}\n\n/**\n * Get transform exceed value\n * Return zero if is not reached border.\n *\n * @param transform\n * @param options\n * @param limitation\n */\nexport function getExcess (\n transform: number,\n options: Options,\n limitation: Limitation\n): number {\n const exceedLeft = transform - limitation.max\n const exceedRight = transform - limitation.min\n\n return exceedLeft > 0\n ? exceedLeft\n : exceedRight < 0\n ? exceedRight\n : 0\n}\n\nexport function Operations (\n env: Env,\n state: State,\n options: Options,\n renderer: Renderer,\n eventHub: EventHub\n): Operations {\n function getOffsetSteps (offset: number): number {\n const {\n measure\n } = env\n return Math.ceil(Math.abs(offset) / measure.boxSize - options.longSwipesRatio)\n }\n\n function render (\n duration?: number,\n cb?: Function,\n force?: boolean\n ): void {\n renderer.render(\n state,\n duration,\n cb,\n force\n )\n }\n\n function transform (trans: number): void {\n const {\n min,\n max\n } = env.limitation\n const transRange = max - min + (options.loop ? env.measure.boxSize : 0)\n const len = transRange + 1\n\n let progress\n\n state.transforms = trans\n\n if (options.loop) {\n progress = (max - trans) % len / transRange\n\n state.progress = progress < 0\n ? 1 + progress\n : progress > 1\n ? progress - 1\n : progress\n } else {\n progress = (max - trans) / transRange\n\n state.progress = progress < 0\n ? 0\n : progress > 1\n ? 1\n : progress\n }\n\n eventHub.emit(LIFE_CYCLES.SCROLL, {\n ...state\n })\n }\n\n function slideTo (\n targetIndex: number,\n duration?: number\n ): void {\n const {\n measure,\n limitation\n } = env\n const len = limitation.maxIndex - limitation.minIndex + 1\n const computedIndex = options.loop\n ? (targetIndex % len + len) % len\n : targetIndex > limitation.maxIndex\n ? limitation.maxIndex\n : targetIndex < limitation.minIndex\n ? limitation.minIndex\n : targetIndex\n const offset = -computedIndex * measure.boxSize + limitation.base\n\n // Slide over a cycle.\n if (state.index === computedIndex\n && getOffsetSteps(offset - state.transforms) !== 0\n && options.loop\n ) {\n const excess = getExcess(state.transforms, options, limitation)\n\n transform(excess > 0\n ? limitation.min - measure.boxSize + excess\n : limitation.max + measure.boxSize + excess)\n\n // Set initial offset for rebounding animation.\n render(0, undefined, true)\n }\n\n eventHub.emit(LIFE_CYCLES.BEFORE_SLIDE,\n state.index,\n state,\n computedIndex)\n state.index = computedIndex\n transform(offset)\n render(duration, () => {\n eventHub.emit(LIFE_CYCLES.AFTER_SLIDE,\n computedIndex,\n state)\n })\n }\n\n function scrollPixel (px: number): void {\n const {\n transforms\n } = state\n const {\n measure,\n limitation\n } = env\n const ratio = Number(px.toExponential().split('e')[1])\n const expand = ratio <= 0 ? Math.pow(10, -(ratio - 1)) : 1\n\n let newTransform = transforms\n\n // For optimizing, do not calculate `px` if options.loop === true\n if (options.resistance && !options.loop) {\n if (px > 0 && transforms >= limitation.max) {\n px -= (px * expand) ** options.resistanceRatio / expand\n } else if (px < 0 && transforms <= limitation.min) {\n px += ((-px * expand) ** options.resistanceRatio) / expand\n }\n }\n\n newTransform += px\n\n if (options.loop) {\n const vector = state.tracker.vector()\n const velocity = options.isHorizontal ? vector.velocityX : vector.velocityY\n const excess = getExcess(transforms, options, limitation)\n\n if (excess && isExceedingLimits(\n velocity,\n transforms,\n options,\n limitation\n )) {\n newTransform = excess > 0\n ? limitation.min - measure.boxSize + excess\n : limitation.max + measure.boxSize + excess\n }\n }\n\n transform(newTransform)\n }\n\n function initStatus (startTransform = 0): void {\n state.startTransform = startTransform\n state.isStart = false\n state.isScrolling = false\n state.isTouching = false\n }\n\n function initLayout (originTransform: number): void {\n transform(originTransform)\n }\n\n function update (): void {\n slideTo(state.index, 0)\n renderer.updateSize()\n }\n\n return {\n update,\n render,\n transform,\n slideTo,\n scrollPixel,\n initStatus,\n initLayout,\n getOffsetSteps\n }\n}\n","import { Options } from '../options'\n\nexport type Element = {\n $el: HTMLElement\n $list: Array\n $wrapper: HTMLElement\n}\n\nexport function Element (\n el: HTMLElement | string,\n options: Options\n): Element {\n const $el = (typeof el === 'string' ? document.body.querySelector(el) : el)\n const $wrapper = $el!.querySelector(`.${options.wrapperClass}`)\n const $list = [].slice.call($el!.getElementsByClassName(options.slideClass))\n\n return {\n $el,\n $wrapper,\n $list\n }\n}\n","import { UserOptions, optionFormatter, Options } from './options'\nimport { EventHub, LIFE_CYCLES } from './eventHub'\nimport { State } from './state/index'\nimport { Sensor } from './sensor/index'\nimport { Env } from './env/index'\nimport { Renderer } from './render/index'\nimport { Operations } from './state/operations'\nimport { Element } from './env/element'\n\nexport type SwiperInstance = {\n on: (evtName: string, cb: Function) => void\n off: (evtName: string, cb: Function) => void\n update: () => void\n destroy: () => void\n slideTo: (index: number, duration?: number) => void\n options: Options\n env: Env\n state: State\n updateSize: () => void\n}\nexport type SwiperPlugin = (instance: SwiperInstance, options: Options) => void\n\nexport type Swiper = {\n (el: HTMLElement | string, userOptions?: UserOptions): SwiperInstance\n use: (plugins: Array) => void\n plugins: Array\n}\n\nconst Swiper: Swiper = function (\n el: HTMLElement | string,\n userOptions: UserOptions\n): SwiperInstance {\n const options = optionFormatter(userOptions)\n const eventHub = EventHub()\n const element = Element(\n el,\n options\n )\n const env = Env(element, options)\n const state = State()\n const {\n on,\n off,\n emit\n } = eventHub\n const instance = {\n on,\n off,\n env,\n state,\n options\n } as SwiperInstance\n\n (options.plugins || Swiper.plugins || [])\n .forEach((plugin: SwiperPlugin) => plugin(\n instance,\n options\n ))\n\n emit(LIFE_CYCLES.BEFORE_INIT, instance)\n\n // Initialize internal module\n const renderer = Renderer(\n env,\n options\n )\n const operations = Operations(\n env,\n state,\n options,\n renderer,\n eventHub\n )\n const sensor = Sensor(\n env,\n state,\n options,\n operations\n )\n\n function destroy (): void {\n emit(LIFE_CYCLES.BEFORE_DESTROY, instance)\n sensor.detach()\n renderer.destroy()\n eventHub.clear()\n emit(LIFE_CYCLES.AFTER_DESTROY, instance)\n }\n\n function updateSize (): void {\n env.update(Element(\n el,\n options\n ))\n operations.update()\n }\n\n function update (): void {\n renderer.destroy()\n env.update(Element(\n el,\n options\n ))\n renderer.init()\n operations.update()\n }\n\n const {\n slideTo\n } = operations\n\n Object.assign(instance, {\n update,\n destroy,\n slideTo,\n updateSize\n })\n\n renderer.init()\n sensor.attach()\n slideTo(\n options.initialSlide,\n 0\n )\n emit(LIFE_CYCLES.AFTER_INIT, instance)\n\n return instance\n}\n\nSwiper.use = (plugins: Array): void => {\n Swiper.plugins = plugins\n}\n\nexport default Swiper\n"],"names":["addClass","el","list","Array","isArray","forEach","clz","classList","contains","add","removeClass","remove","attachListener","evtName","handler","opts","addEventListener","detachListener","removeEventListener","setAttr","attr","value","setAttribute","setStyle","style","forceRender","Object","keys","prop","getComputedStyle","getTranslate","isHorizontal","matrix","transform","replace","split","map","parseFloat","arr","length","slice","SwiperPluginLazyload","instance","options","lazyload","lazyloadOptions","load","index","$slide","env","element","$list","$imgs","call","getElementsByClassName","elementClass","$preloaders","preloaderClass","handleLoaded","$img","removeAttribute","loadedClass","loadingClass","onload","onerror","isLoaded","every","item","$preloader","parentElement","removeChild","hasAttribute","src","getAttribute","loadRange","range","loadPrevNext","i","on","loadPrevNextAmount","loadOnTransitionStart","oldIndex","state","newIndex","SwiperPluginPagination","pagination","$pageList","$pagination","assign","clickable","bulletClass","bulletActiveClass","document","body","querySelector","$group","createDocumentFragment","dotCount","Math","ceil","slidesPerView","excludeElements","push","$page","createElement","appendChild","e","slideTo","indexOf","target","stopPropagation","innerHTML","currentIndex","DIRECTION","up","right","down","left","isVisible","visible","visibility","display","nodeType","isElementInView","boundary","getBoundingClientRect","isInView","top","bottom","window","innerHeight","innerWidth","SwiperPluginKeyboardControl","keyboard","keyboardOptions","enable","enabled","disable","onKeyDown","key","onlyInViewport","$el","SwiperPluginMousewheel","mousewheel","wheelStatus","wheeling","wheelDelta","wheelingTimer","initWheelStatus","delta","deltaX","deltaY","abs","sensitivity","clearTimeout","setTimeout","interval","preventDefault","invert","translate","duration","$wrapper","wrapperStyle","transition","isStart","transforms","defaultOptions","direction","touchRatio","touchAngle","longSwipesRatio","initialSlide","loop","freeMode","passiveListeners","resistance","resistanceRatio","speed","longSwipesMs","spaceBetween","centeredSlides","slidePrevClass","slideNextClass","slideActiveClass","slideClass","wrapperClass","touchStartPreventDefault","touchStartForcePreventDefault","touchMoveStopPropagation","injections","optionFormatter","userOptions","LIFE_CYCLES","BEFORE_INIT","AFTER_INIT","BEFORE_SLIDE","SCROLL","AFTER_SLIDE","BEFORE_DESTROY","AFTER_DESTROY","EventHub","hub","cb","off","splice","emit","data","clear","PI","Vector","logs","trace","formerTrace","diff","x","y","time","velocityX","velocityY","angle","atan2","Tracker","position","Date","now","vector","getLogs","getDuration","first","last","getOffset","State","tracker","startTransform","isScrolling","isTouching","progress","performance","Tick","nextFrame","requestAnimationFrame","webkitRequestAnimationFrame","cancelNextFrame","cancelAnimationFrame","webkitCancelAnimationFrame","startTime","id","run","timeStamp","stop","undefined","Animation","tick","task","Actions","operations","initLayout","initStatus","render","scrollPixel","getOffsetSteps","animation","preheat","originPosition","originTransform","move","displacement","offset","measure","trans","jump","boxSize","longSwipeIndex","velocity","Sensor","touchable","formEls","actions","getPosition","touch","changedTouches","pageX","pageY","onTouchStart","shouldPreventDefault","nodeName","onTouchMove","onTouchEnd","attach","passive","capture","detach","Measure","viewSize","offsetWidth","offsetHeight","slideSize","getExpand","Limitation","expand","buffer","base","max","min","minIndex","maxIndex","limitation","Env","elem","update","Boolean","navigator","maxTouchPoints","msMaxTouchPoints","DocumentTouch","shallowTag","sliderTag","Renderer","updateItem","querySelectorAll","tagNumber","force","timing","appendExpandList","$leftExpandList","cloneNode","$rightExpandList","$shadowSlide","insertBefore","destroyExpandList","updateDom","updateSize","willChange","flexDirection","itemStyle","init","destroy","itemProp","propertyName","removeProperty","isExceedingLimits","getExcess","exceedLeft","exceedRight","Operations","renderer","eventHub","transRange","len","targetIndex","computedIndex","excess","px","ratio","Number","toExponential","pow","newTransform","Element","Swiper","plugins","plugin","sensor","use"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.esm.js","sources":["../src/core/render/dom.ts","../src/modules/lazyload.ts","../src/modules/pagination.ts","../src/modules/keyboardControl.ts","../src/modules/mousewheel.ts","../src/modules/navigation.ts","../src/core/render/layout.ts","../src/core/options.ts","../src/core/eventHub.ts","../src/core/state/trace.ts","../src/core/state/index.ts","../src/core/render/nextTick.ts","../src/core/render/animation.ts","../src/core/sensor/actions.ts","../src/core/sensor/index.ts","../src/core/env/measure.ts","../src/core/env/limitation.ts","../src/core/env/index.ts","../src/core/render/index.ts","../src/core/state/operations.ts","../src/core/env/element.ts","../src/core/index.ts"],"sourcesContent":["export function addClass (\n el: HTMLElement,\n list: Array | string = []\n): void {\n if (!Array.isArray(list)) list = [list]\n\n list.forEach(clz => (!el.classList.contains(clz) && el.classList.add(clz)))\n}\n\nexport function removeClass (\n el: HTMLElement,\n list: Array | string = []\n): void {\n if (!Array.isArray(list)) list = [list]\n\n list.forEach(clz => (el.classList.contains(clz) && el.classList.remove(clz)))\n}\n\nexport function attachListener (\n el: HTMLElement | Document | Window,\n evtName: string,\n handler: EventListenerOrEventListenerObject,\n opts?: boolean | AddEventListenerOptions\n): void {\n el.addEventListener(evtName, handler, opts)\n}\n\nexport function detachListener (\n el: HTMLElement | Document | Window,\n evtName: string,\n handler: EventListenerOrEventListenerObject\n): void {\n el.removeEventListener(evtName, handler)\n}\n\nexport function removeAttr (\n el: HTMLElement,\n attr: string\n): void {\n el.removeAttribute(attr)\n}\n\nexport function setAttr (\n el: HTMLElement,\n attr: string,\n value = ''\n): HTMLElement {\n el.setAttribute(attr, value)\n return el\n}\n\nexport function setStyle (\n el: HTMLElement,\n style: {[key: string]: string},\n forceRender?: boolean\n): HTMLElement {\n Object.keys(style).forEach(prop => {\n // TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'.\n el.style[prop as any] = style[prop]\n })\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n forceRender && getComputedStyle(el)\n\n return el\n}\n\nexport function getTranslate (\n el: HTMLElement,\n isHorizontal: boolean\n): number {\n const matrix = getComputedStyle(el).transform.replace(/[a-z]|\\(|\\)|\\s/g, '').split(',').map(parseFloat)\n let arr: Array = []\n\n if (matrix.length === 16) {\n arr = matrix.slice(12, 14)\n } else if (matrix.length === 6) {\n arr = matrix.slice(4, 6)\n }\n return (>arr)[isHorizontal ? 0 : 1] || 0\n}\n","import {\n addClass,\n removeClass\n} from '../core/render/dom'\nimport { SwiperInstance } from '../core/index'\nimport { Options } from '../core/options'\nimport { State } from '../core/state/index'\n\nexport type SwiperPluginLazyloadOptions = {\n loadPrevNext: false\n loadPrevNextAmount: 1\n loadOnTransitionStart: false\n elementClass: 'swiper-lazy'\n loadingClass: 'swiper-lazy-loading'\n loadedClass: 'swiper-lazy-loaded'\n preloaderClass: 'swiper-lazy-preloader'\n}\n\nexport type SwiperPluginLazyloadHTMLElement = HTMLImageElement & {\n isLoaded: boolean\n}\n\n/**\n * TinySwiper plugin for image lazy loading.\n *\n * @param {SwiperInstance} instance\n * @param {Options}\n */\nexport default function SwiperPluginLazyload (\n instance: SwiperInstance & {\n lazyload: {\n load (index: number): void\n loadRange (\n index: number,\n range: number\n ): void\n }\n },\n options: Options\n) {\n if (!options.lazyload) return\n\n const lazyloadOptions = options.lazyload\n const lazyload = {\n load (index: number): void {\n const $slide = instance.env.element.$list[index]\n\n if (!$slide) return\n\n const $imgs = [].slice.call($slide.getElementsByClassName(lazyloadOptions.elementClass))\n const $preloaders: HTMLElement[] = [].slice.call($slide.getElementsByClassName(lazyloadOptions.preloaderClass))\n\n function handleLoaded ($img: SwiperPluginLazyloadHTMLElement) {\n $img.removeAttribute('data-src')\n addClass($img, [lazyloadOptions.loadedClass])\n removeClass($img, [lazyloadOptions.loadingClass])\n $img.onload = null\n $img.onerror = null\n $img.isLoaded = true\n\n if ($imgs.every((item: SwiperPluginLazyloadHTMLElement) => item.isLoaded)) {\n $preloaders.forEach(($preloader: HTMLElement) => {\n $preloader.parentElement!.removeChild($preloader)\n })\n }\n }\n\n $imgs.forEach(($img: SwiperPluginLazyloadHTMLElement) => {\n if (!$img.hasAttribute('data-src')) return\n\n const src = $img.getAttribute('data-src')\n\n addClass($img, [lazyloadOptions.loadingClass])\n removeClass($img, [lazyloadOptions.loadedClass])\n $img.src = src as string\n $img.onload = () => handleLoaded($img)\n $img.onerror = () => handleLoaded($img)\n })\n },\n\n loadRange (\n index: number,\n range: number\n ): void {\n lazyload.load(index)\n\n if (lazyloadOptions.loadPrevNext && range >= 1) {\n for (let i = 1; i <= range; i++) {\n lazyload.load(index + i)\n lazyload.load(index - i)\n }\n }\n }\n }\n\n instance.on('before-init', () => {\n options.lazyload = {\n loadPrevNext: false,\n loadPrevNextAmount: 1,\n loadOnTransitionStart: false,\n elementClass: 'swiper-lazy',\n loadingClass: 'swiper-lazy-loading',\n loadedClass: 'swiper-lazy-loaded',\n preloaderClass: 'swiper-lazy-preloader',\n ...options.lazyload\n }\n })\n\n if (lazyloadOptions.loadOnTransitionStart) {\n instance.on('before-slide', (\n oldIndex: number,\n state: State,\n newIndex: number\n ) => {\n lazyload.loadRange(newIndex, lazyloadOptions.loadPrevNextAmount)\n })\n } else {\n instance.on('after-slide', (\n index: number\n ) => {\n lazyload.loadRange(index, lazyloadOptions.loadPrevNextAmount)\n })\n }\n\n instance.on('after-destroy', () => {\n if (!instance.lazyload) return\n\n delete instance.lazyload\n })\n}\n","import {\n addClass,\n removeClass\n} from '../core/render/dom'\nimport { SwiperInstance } from '../core/index'\nimport { Options } from '../core/options'\n\nexport type SwiperPluginPaginationOptions = Options & {\n pagination: {\n el: string\n clickable: false\n bulletClass: 'swiper-pagination-bullet'\n bulletActiveClass: 'swiper-pagination-bullet-active'\n }\n}\n\nexport type SwiperPluginPaginationInstance = {\n $pageList: HTMLElement[]\n $pagination: HTMLElement | null\n}\n\nexport default function SwiperPluginPagination (\n instance: SwiperInstance & {\n pagination: SwiperPluginPaginationInstance\n },\n options: SwiperPluginPaginationOptions\n) {\n const pagination = {\n $pageList: [],\n $pagination: null\n } as unknown as SwiperPluginPaginationInstance\n\n instance.on('before-init', () => {\n if (options.pagination) {\n options.pagination = Object.assign({\n clickable: false,\n bulletClass: 'swiper-pagination-bullet',\n bulletActiveClass: 'swiper-pagination-bullet-active'\n }, options.pagination)\n }\n })\n\n instance.on('after-init', () => {\n if (!options.pagination) return\n\n const {\n bulletClass,\n bulletActiveClass\n } = options.pagination\n const {\n element\n } = instance.env\n const {\n $list\n } = element\n\n const $pagination = (typeof options.pagination.el === 'string'\n ? document.body.querySelector(options.pagination.el)\n : options.pagination.el) as HTMLElement\n const $pageList: Array = []\n const $group = document.createDocumentFragment()\n const dotCount = $list.length - Math.ceil(options.slidesPerView) + 1\n\n options.excludeElements.push($pagination as HTMLElement)\n\n pagination.$pagination = $pagination\n pagination.$pageList = $pageList\n\n for (let index = 0; index < dotCount; index++) {\n const $page = document.createElement('div')\n\n addClass(\n $page,\n index === instance.state.index ? [bulletClass, bulletActiveClass] : bulletClass\n )\n $pageList.push($page)\n $group.appendChild($page)\n }\n\n $pagination.appendChild($group)\n\n if (options.pagination.clickable) {\n $pagination.addEventListener('click', (e: Event) => {\n instance.slideTo($pageList.indexOf(e.target as HTMLElement))\n e.stopPropagation()\n })\n }\n })\n\n instance.on('after-destroy', () => {\n if (!options.pagination) return\n\n pagination.$pagination!.innerHTML = ''\n pagination.$pageList = []\n pagination.$pagination = null\n })\n\n instance.on('after-slide', (\n currentIndex: number\n ) => {\n const { bulletActiveClass } = options.pagination\n\n pagination.$pageList && pagination.$pageList.forEach(($page, index) => {\n if (index === currentIndex) {\n addClass($page, bulletActiveClass)\n } else {\n removeClass($page, bulletActiveClass)\n }\n })\n })\n}\n","import {\n attachListener,\n detachListener\n} from '../core/render/dom'\nimport { SwiperInstance } from '../core/index'\nimport { Options } from '../core/options'\n\nexport type SwiperPluginKeyboardControlOptions = {\n enabled: boolean\n onlyInViewport: boolean\n}\n\nconst DIRECTION = {\n up: 'ArrowUp',\n right: 'ArrowRight',\n down: 'ArrowDown',\n left: 'ArrowLeft'\n}\n\nfunction isVisible (el: HTMLElement): boolean {\n if (!el) return false\n\n const style = getComputedStyle(el)\n const visible = style.visibility !== 'hidden' && style.display !== 'none'\n\n if (!visible) return false\n\n return el.parentElement && el.parentElement.nodeType === 1\n ? isVisible(el.parentElement)\n : true\n}\n\nfunction isElementInView (el: HTMLElement): boolean {\n const visibility = isVisible(el)\n const boundary = el.getBoundingClientRect()\n const isInView = (boundary.top >= 0 && boundary.bottom <= window.innerHeight)\n && (boundary.left >= 0 && boundary.right <= window.innerWidth)\n\n return isInView && visibility\n}\n\n/**\n * TinySwiper plugin for keyboard control.\n *\n * @param {SwiperInstance} instance\n * @param {Options}\n */\nexport default function SwiperPluginKeyboardControl (\n instance: SwiperInstance & {\n keyboard: {\n onKeyDown (e: Event): void\n enable (): void\n disable (): void\n }\n },\n options: Options\n): void {\n if (!options.keyboard) return\n\n const keyboardOptions = options.keyboard\n const keyboard = {\n enable (): void {\n keyboardOptions.enabled = true\n },\n disable (): void {\n keyboardOptions.enabled = false\n },\n onKeyDown (e: KeyboardEvent): void {\n const { key } = e\n\n if ((keyboardOptions.onlyInViewport && !isElementInView(instance.env.element.$el))\n || !keyboardOptions.enabled) return\n\n if (options.isHorizontal) {\n if (key === DIRECTION.left) {\n instance.slideTo(instance.state.index - 1)\n } else if (key === DIRECTION.right) {\n instance.slideTo(instance.state.index + 1)\n }\n } else {\n if (key === DIRECTION.down) {\n instance.slideTo(instance.state.index - 1)\n } else if (key === DIRECTION.up) {\n instance.slideTo(instance.state.index + 1)\n }\n }\n }\n }\n\n instance.on('before-init', () => {\n options.keyboard = {\n enabled: true,\n onlyInViewport: true,\n ...options.keyboard\n }\n\n instance.keyboard = keyboard\n\n attachListener(window, 'keydown', keyboard.onKeyDown as EventListener)\n })\n\n instance.on('after-destroy', () => {\n if (!keyboard) return\n\n detachListener(window, 'keydown', keyboard.onKeyDown as EventListener)\n\n delete instance.keyboard\n })\n}\n","import {\n attachListener,\n detachListener\n} from '../core/render/dom'\nimport { SwiperInstance } from '../core/index'\nimport { Options } from '../core/options'\n\nexport type SwiperPluginMousewheelOptions = Options & {\n mousewheel: {\n invert: false\n sensitivity: 1\n interval: 400\n }\n}\n\nexport type SwiperPluginMousewheelInstance = {\n $el: HTMLElement\n}\n\nexport default function SwiperPluginMousewheel (\n instance: SwiperInstance & {\n mousewheel: SwiperPluginMousewheelInstance\n },\n options: SwiperPluginMousewheelOptions\n) {\n const mousewheel = {\n $el: null\n } as unknown as SwiperPluginMousewheelInstance\n const wheelStatus = {\n wheeling: false,\n wheelDelta: 0,\n wheelingTimer: 0\n }\n const initWheelStatus = () => {\n wheelStatus.wheeling = false\n wheelStatus.wheelDelta = 0\n wheelStatus.wheelingTimer = 0\n }\n const handler = (e: WheelEvent) => {\n const delta = options.isHorizontal ? e.deltaX : e.deltaY\n const {\n index\n } = instance.state\n\n if ((Math.abs(delta) - Math.abs(wheelStatus.wheelDelta) > 0 || !wheelStatus.wheeling)\n && Math.abs(delta) >= options.mousewheel.sensitivity) {\n instance.slideTo(delta > 0 ? index - 1 : index + 1)\n }\n wheelStatus.wheelDelta = delta\n clearTimeout(wheelStatus.wheelingTimer)\n wheelStatus.wheeling = true\n wheelStatus.wheelingTimer = setTimeout(() => {\n initWheelStatus()\n }, options.mousewheel.interval) as unknown as number\n e.preventDefault()\n e.stopPropagation()\n }\n\n instance.on('before-init', () => {\n if (options.mousewheel) {\n options.mousewheel = Object.assign({\n invert: false,\n sensitivity: 1,\n interval: 400\n }, options.mousewheel)\n }\n })\n\n instance.on('after-init', () => {\n if (!options.mousewheel) return\n\n const {\n element\n } = instance.env\n const {\n $el\n } = element\n\n mousewheel.$el = $el\n\n attachListener($el, 'wheel', handler)\n })\n\n instance.on('after-destroy', () => {\n if (!options.mousewheel) return\n\n delete mousewheel.$el\n detachListener(mousewheel.$el, 'wheel', handler)\n })\n}\n","import {\n attachListener,\n detachListener\n} from '../core/render/dom'\nimport {SwiperInstance} from '../core/index'\nimport {Options} from '../core/options'\n\nexport type SwiperPluginNavigationOptions = Options & {\n navigation: {\n nextEl: HTMLElement | string\n prevEl: HTMLElement | string\n disabledClass: string\n }\n}\n\nexport type SwiperPluginNavigationInstance = {\n nextEl: HTMLElement\n prevEl: HTMLElement\n}\nexport default function SwiperPluginNavigation(\n instance: SwiperInstance & {\n navigation: SwiperPluginNavigationInstance\n },\n options: SwiperPluginNavigationOptions\n) {\n const navigation = {\n nextEl: null,\n prevEl: null\n } as unknown as SwiperPluginNavigationInstance\n\n const nextClickHandler = (e: PointerEvent) => {\n clickHandler(e.target as HTMLElement, 'next');\n };\n\n const prevClickHandler = (e: PointerEvent) => {\n clickHandler(e.target as HTMLElement, 'prev');\n\n };\n\n const clickHandler = (e: HTMLElement, type: 'next' | 'prev') => {\n if (checkIsDisable(e) && !instance.options.loop) {\n return\n }\n const {\n index\n } = instance.state\n const {\n $list\n } = instance.env.element\n let currentIdx = index;\n\n if (type === 'next') {\n if (index < $list.length - 1) {\n instance.slideTo(index + 1);\n }\n if (currentIdx > $list.length) {\n currentIdx = index;\n }\n currentIdx++;\n }\n\n if (type === 'prev') {\n if (index > 0) {\n instance.slideTo(index - 1);\n }\n if (currentIdx < -1) {\n currentIdx = index;\n }\n currentIdx--;\n }\n console.log(instance.options.loop, currentIdx, type)\n checkSwiperDisabledClass(currentIdx, $list.length - 1, type);\n }\n\n const checkSwiperDisabledClass = (\n index: number, last: number, type: string) => {\n const target = type === 'prev' ? -1 : last + 1;\n const slideToNum = type === 'prev' ? last : 0;\n if (navigation.nextEl.classList.contains(options.navigation.disabledClass)\n && type === 'prev') {\n navigation.nextEl.classList.remove(options.navigation.disabledClass);\n }\n\n if (navigation.prevEl.classList.contains(options.navigation.disabledClass)\n && type === 'next') {\n navigation.prevEl.classList.remove(options.navigation.disabledClass);\n }\n if (instance.options.loop) {\n if (index === target) {\n instance.slideTo(slideToNum);\n }\n } else {\n if (instance.state.index === 0) {\n navigation.prevEl.classList.add(options.navigation.disabledClass);\n }\n if (instance.state.index === last) {\n navigation.nextEl.classList.add(options.navigation.disabledClass);\n }\n }\n }\n\n const checkIsDisable = (e: HTMLElement) => {\n if (e.classList.contains(options.navigation.disabledClass)) {\n return true\n }\n return false\n }\n\n const checkButtonDefaultStatus = () => {\n const {\n index\n } = instance.state\n const {\n $list\n } = instance.env.element\n if (index === 0 && !instance.options.loop) {\n navigation.prevEl.classList.add(options.navigation.disabledClass);\n }\n if ($list.length === 1 && !instance.options.loop) {\n navigation.nextEl.classList.add(options.navigation.disabledClass);\n }\n }\n\n instance.on('before-init', () => {\n if (options.navigation) {\n options.navigation = Object.assign({\n disabledClass: 'swiper-button-disabled'\n }, options.navigation)\n }\n })\n\n instance.on('after-init', () => {\n if (!options.navigation) return\n\n navigation.nextEl = (typeof options.navigation.nextEl === 'string')\n ? document.body.querySelector(options.navigation.nextEl) as HTMLElement\n : options.navigation.nextEl\n navigation.prevEl = (typeof options.navigation.prevEl === 'string')\n ? document.body.querySelector(options.navigation.prevEl) as HTMLElement\n : options.navigation.prevEl\n checkButtonDefaultStatus();\n attachListener(navigation.nextEl, 'click', nextClickHandler)\n attachListener(navigation.prevEl, 'click', prevClickHandler)\n })\n\n instance.on('after-destroy', () => {\n if (!options.navigation) return\n\n delete navigation.nextEl;\n delete navigation.prevEl;\n\n detachListener(navigation.nextEl, 'click', nextClickHandler)\n detachListener(navigation.prevEl, 'click', prevClickHandler)\n })\n}\n","import { State } from '../state/index'\nimport { Env } from '../env/index'\nimport { setStyle } from './dom'\nimport { Options } from '../options'\n\nexport function translate (\n state: State,\n env: Env,\n options: Options,\n duration: number\n): void {\n const {\n $wrapper\n } = env.element\n const wrapperStyle = {\n transition: state.isStart\n ? 'none'\n : `transform ease ${duration}ms`,\n transform: options.isHorizontal\n ? `translate3d(${state.transforms}px, 0, 0)`\n : `translate3d(0, ${state.transforms}px, 0)`\n }\n\n setStyle($wrapper, wrapperStyle)\n}\n","import { SwiperPlugin } from './index'\nimport { translate } from './render/layout'\nimport { State } from './state/index'\nimport { Env } from './env/index'\nimport { SwiperPluginLazyloadOptions } from '../modules/lazyload'\nimport { SwiperPluginPaginationOptions } from '../modules/pagination'\nimport { SwiperPluginKeyboardControlOptions } from '../modules/keyboardControl'\n\nexport type Direction = 'horizontal' | 'vertical'\nexport type Injections = {\n translate: (\n state: State,\n env: Env,\n options: Options,\n duration: number\n ) => void\n}\n\nexport type Options = {\n direction: Direction\n touchRatio: number\n touchAngle: number\n longSwipesRatio: number\n initialSlide: number\n loop: boolean\n freeMode: boolean\n mousewheel: boolean\n passiveListeners: boolean\n resistance: boolean\n resistanceRatio: number\n speed: number\n longSwipesMs: number\n spaceBetween: number\n slidesPerView: number\n centeredSlides: boolean\n slidePrevClass: string\n slideNextClass: string\n slideActiveClass: string\n slideClass: string\n wrapperClass: string\n touchStartPreventDefault: boolean\n touchStartForcePreventDefault: boolean\n touchMoveStopPropagation: boolean\n excludeElements: Array\n isHorizontal: boolean\n plugins?: Array\n injections: Injections\n\n // Plugins\n lazyload?: SwiperPluginLazyloadOptions\n keyboard?: SwiperPluginKeyboardControlOptions\n pagination?: SwiperPluginPaginationOptions\n}\n\nexport type UserOptions = Partial\n\nconst defaultOptions: UserOptions = {\n // `isHorizontal` is computed value\n direction: 'horizontal',\n touchRatio: 1,\n touchAngle: 45,\n longSwipesRatio: 0.5,\n initialSlide: 0,\n loop: false,\n freeMode: false,\n mousewheel: false,\n passiveListeners: true,\n resistance: true,\n resistanceRatio: 0.85,\n speed: 300,\n longSwipesMs: 300,\n spaceBetween: 0,\n slidesPerView: 1,\n centeredSlides: false,\n slidePrevClass: 'swiper-slide-prev',\n slideNextClass: 'swiper-slide-next',\n slideActiveClass: 'swiper-slide-active',\n slideClass: 'swiper-slide',\n wrapperClass: 'swiper-wrapper',\n touchStartPreventDefault: true,\n touchStartForcePreventDefault: false,\n touchMoveStopPropagation: false,\n excludeElements: [],\n injections: {\n translate\n }\n}\n\nexport function optionFormatter (userOptions?: UserOptions): Options {\n const options = {\n ...defaultOptions,\n ...userOptions\n }\n\n return {\n ...options,\n isHorizontal: options.direction === 'horizontal'\n }\n}\n","export type EventHub = {\n // eslint-disable-next-line @typescript-eslint/ban-types\n on (evtName: string, cb: Function): void\n off (evtName: string, cb: Function): void\n emit (evtName: string, ...data: Array): void\n clear (): void\n}\n\nexport const LIFE_CYCLES = {\n BEFORE_INIT: 'before-init',\n AFTER_INIT: 'after-init',\n BEFORE_SLIDE: 'before-slide',\n SCROLL: 'scroll',\n AFTER_SLIDE: 'after-slide',\n BEFORE_DESTROY: 'before-destroy',\n AFTER_DESTROY: 'after-destroy'\n}\n\nexport function EventHub (): EventHub {\n let hub: {\n [key: string]: Array\n } = {}\n\n function on (evtName: string, cb: Function): void {\n if (!hub[evtName]) {\n hub[evtName] = [cb]\n } else {\n hub[evtName].push(cb)\n }\n }\n\n function off (evtName: string, cb: Function): void {\n if (hub[evtName]) {\n const index = hub[evtName].indexOf(cb)\n\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n index > -1 && hub[evtName].splice(index, 1)\n }\n }\n\n function emit (evtName: string, ...data: Array): void {\n if (hub[evtName]) {\n hub[evtName].forEach(cb => cb(...data))\n }\n }\n\n function clear (): void {\n hub = {}\n }\n\n return {\n on,\n off,\n emit,\n clear\n }\n}\n","const delta = 180 / Math.PI\n\nexport type TraceLogs = Array\n\nexport type Offset = {\n /**\n * offset x\n */\n x: number\n\n /**\n * offset y\n */\n y: number\n}\n\nexport type Position = {\n /**\n * postion in the x-axis\n */\n x: number\n\n /**\n * postion in the y-axis\n */\n y: number\n}\n\nexport type Trace = {\n /**\n * timestamp of current postion\n */\n time: number\n} & Position\n\nexport type Tracker = {\n push (postion: Position): void\n vector (): Vector\n clear (): void\n getLogs (): TraceLogs\n getDuration (): number\n getOffset (): Offset\n}\n\nexport type Vector = {\n /**\n * offset in the x-axis\n */\n x: number\n\n /**\n * offset in the y-axis\n */\n y: number\n\n /**\n * velocity in the x-axis\n */\n velocityX: number\n\n /**\n * velocity in the y-axis\n */\n velocityY: number\n\n /**\n * direction angle\n */\n angle: number\n}\n\nexport function Vector (\n logs: TraceLogs,\n index: number\n): Vector {\n const trace = logs[index]\n const formerTrace = logs[index - 1]\n const diff = {\n x: trace.x - formerTrace.x,\n y: trace.y - formerTrace.y\n }\n const duration = trace.time - formerTrace.time\n const velocityX = diff.x / duration\n const velocityY = diff.y / duration\n const angle = Math.atan2(Math.abs(diff.y), Math.abs(diff.x)) * delta\n\n return {\n ...diff,\n angle,\n velocityX,\n velocityY\n }\n}\n\nexport function Tracker (): Tracker {\n let logs: TraceLogs = []\n\n function push (position: Position): void {\n logs.push({\n time: Date.now(),\n ...position\n })\n }\n\n function vector (): Vector {\n return Vector(logs, logs.length - 1)\n }\n\n function clear () {\n logs = []\n }\n\n function getLogs () {\n return logs\n }\n\n function getDuration (): number {\n const first = logs[0]\n const last = logs[logs.length - 1]\n\n return first ? last.time - first.time : 0\n }\n\n function getOffset (): Offset {\n const first = logs[0]\n const last = logs[logs.length - 1]\n\n return first ? {\n x: last.x - first.x,\n y: last.y - first.y\n } : {\n x: 0,\n y: 0\n }\n }\n\n return {\n getDuration,\n getOffset,\n getLogs,\n vector,\n clear,\n push\n }\n}\n","import { Tracker } from './trace'\n\nexport interface State {\n tracker: Tracker\n index: number\n startTransform: number\n isStart: boolean\n isScrolling: boolean\n isTouching: boolean\n transforms: number\n progress: number\n}\n\nexport function State (): State {\n const state: State = {\n tracker: Tracker(),\n index: 0,\n startTransform: 0,\n isStart: false,\n isScrolling: false,\n isTouching: false,\n transforms: 0,\n progress: 0\n }\n\n return state\n}\n","function now () {\n return performance ? performance.now() : Date.now()\n}\n\nexport type Tick = {\n run (cb: (interval: DOMHighResTimeStamp) => void): void\n stop (): void\n}\n\nexport function Tick (): Tick {\n const nextFrame = requestAnimationFrame || webkitRequestAnimationFrame || setTimeout\n const cancelNextFrame = cancelAnimationFrame || webkitCancelAnimationFrame || clearTimeout\n\n let startTime: number | undefined\n let id: number\n\n function run (cb: (interval: DOMHighResTimeStamp) => void): void {\n // eslint-disable-next-line no-void\n startTime = startTime === void 0\n ? now()\n : startTime\n\n // Why do not use callback argument:\n // https://stackoverflow.com/questions/50895206/exact-time-of-display-requestanimationframe-usage-and-timeline\n id = nextFrame(() => {\n const timeStamp = now()\n const interval = timeStamp - startTime\n\n startTime = timeStamp\n cb(interval)\n })\n }\n\n function stop (): void {\n startTime = undefined\n cancelNextFrame(id)\n }\n\n return {\n run,\n stop\n }\n}\n","import { Tick } from './nextTick'\n\nexport type Animation = {\n run (task: (interval: DOMHighResTimeStamp) => void): void\n stop (): void\n}\n\nexport function Animation (): Animation {\n const tick = Tick()\n\n function run (task: (interval: DOMHighResTimeStamp) => void): void {\n tick.run((interval: DOMHighResTimeStamp) => {\n run(task)\n task(interval)\n })\n }\n\n function stop (): void {\n tick.stop()\n }\n\n return {\n run,\n stop\n }\n}\n","import { Position } from '../state/trace'\nimport { Options } from '../options'\nimport { Env } from '../env/index'\nimport { State } from '../state/index'\nimport { Operations } from '../state/operations'\nimport { Animation } from '../render/animation'\n\nexport type Actions = {\n preheat (\n originPosition: Position,\n originTransform: number\n ): void\n move (position: Position): void\n stop (): void\n}\n\nexport function Actions (\n options: Options,\n env: Env,\n state: State,\n operations: Operations\n) {\n const {\n initLayout,\n initStatus,\n render,\n scrollPixel,\n slideTo,\n getOffsetSteps\n } = operations\n const animation = Animation()\n\n function preheat (\n originPosition: Position,\n originTransform: number\n ): void {\n const { tracker } = state\n\n animation.stop()\n tracker.clear()\n tracker.push(originPosition)\n initLayout(originTransform)\n initStatus(originTransform)\n state.isStart = true\n\n render()\n }\n\n function move (position: Position): void {\n const {\n tracker\n } = state\n const {\n touchRatio,\n touchAngle,\n isHorizontal\n } = options\n\n if (!state.isStart || state.isScrolling) return\n\n tracker.push(position)\n\n const vector = tracker.vector()\n const displacement = tracker.getOffset()\n\n // Ignore this move action if there is no displacement of screen touch point.\n // In case of minimal mouse move event. (Moving mouse extreme slowly will get the zero offset.)\n if (!displacement.x && !displacement.y) return\n\n if ((isHorizontal && (vector.angle < touchAngle))\n || (!isHorizontal && (90 - vector.angle) < touchAngle)\n || state.isTouching\n ) {\n const offset = vector[isHorizontal ? 'x' : 'y'] * touchRatio\n\n state.isTouching = true\n scrollPixel(offset)\n render()\n } else {\n state.isScrolling = true\n tracker.clear()\n }\n }\n\n function stop (): void {\n const {\n index,\n tracker\n } = state\n const {\n measure\n } = env\n\n state.isStart = false\n\n if (!options.freeMode || tracker.getLogs().length < 2) {\n const duration = tracker.getDuration()\n const trans = tracker.getOffset()[options.isHorizontal ? 'x' : 'y']\n const jump = Math.ceil(Math.abs(trans) / measure.boxSize)\n const longSwipeIndex = getOffsetSteps(trans)\n\n if (duration > options.longSwipesMs) {\n slideTo(index + longSwipeIndex * (trans > 0 ? -1 : 1))\n } else {\n // short swipe\n slideTo(trans > 0 ? index - jump : index + jump)\n }\n\n tracker.clear()\n initStatus()\n } else {\n const vector = tracker.vector()\n\n let velocity = vector[options.isHorizontal ? 'velocityX' : 'velocityY']\n\n animation.run((duration: number) => {\n const offset = velocity * duration\n\n velocity *= 0.98\n\n if (Math.abs(offset) < 0.004) {\n animation.stop()\n tracker.clear()\n initStatus()\n } else {\n scrollPixel(offset)\n render(0)\n }\n })\n }\n }\n\n return {\n preheat,\n move,\n stop\n }\n}\n","import { State } from '../state/index'\nimport { Env } from '../env/index'\nimport { attachListener, detachListener, getTranslate } from '../render/dom'\nimport { Options } from '../options'\nimport { Position } from '../state/trace'\nimport { Actions } from './actions'\nimport { Operations } from '../state/operations'\n\nexport type Sensor = {\n attach: () => void\n detach: () => void\n}\n\n// Only support single finger touch event.\nexport function Sensor (\n env: Env,\n state: State,\n options: Options,\n operations: Operations\n): Sensor {\n const {\n touchable\n } = env\n const formEls = [\n 'INPUT',\n 'SELECT',\n 'OPTION',\n 'TEXTAREA',\n 'BUTTON',\n 'VIDEO'\n ]\n const actions = Actions(options, env, state, operations)\n const {\n preheat,\n move,\n stop\n } = actions\n\n function getPosition (e: Event): Position {\n const touch = touchable ? (e).changedTouches[0] : e\n\n return {\n x: touch.pageX,\n y: touch.pageY\n }\n }\n\n function onTouchStart (e: Event): void {\n for (let i = 0; i < options.excludeElements.length; i++) {\n if (options.excludeElements[i].contains(e.target as Node)) return\n }\n\n const {\n $wrapper\n } = env.element\n const shouldPreventDefault = (options.touchStartPreventDefault && formEls.indexOf((e.target).nodeName) === -1)\n || options.touchStartForcePreventDefault\n\n if (shouldPreventDefault && !options.passiveListeners) e.preventDefault()\n\n preheat(\n getPosition(e),\n getTranslate($wrapper, options.isHorizontal)\n )\n }\n\n function onTouchMove (e: Event): void {\n if (options.touchMoveStopPropagation) e.stopPropagation()\n\n move(getPosition(e))\n state.isTouching && e.preventDefault()\n }\n\n function onTouchEnd (): void {\n stop()\n }\n\n function attach (): void {\n const {\n $el\n } = env.element\n\n if (touchable) {\n attachListener($el, 'touchstart', onTouchStart, {\n passive: options.passiveListeners,\n capture: false\n })\n attachListener($el, 'touchmove', onTouchMove)\n attachListener($el, 'touchend', onTouchEnd)\n attachListener($el, 'touchcancel', onTouchEnd)\n } else {\n attachListener($el, 'mousedown', onTouchStart)\n attachListener(document, 'mousemove', onTouchMove)\n attachListener(document, 'mouseup', onTouchEnd)\n }\n }\n\n function detach (): void {\n const {\n $el\n } = env.element\n\n detachListener($el, 'touchstart', onTouchStart)\n detachListener($el, 'touchmove', onTouchMove)\n detachListener($el, 'touchend', onTouchEnd)\n detachListener($el, 'touchcancel', onTouchEnd)\n detachListener($el, 'mousedown', onTouchStart)\n detachListener(document, 'mousemove', onTouchMove)\n detachListener(document, 'mouseup', onTouchEnd)\n }\n\n return {\n attach,\n detach\n }\n}\n","import { Options } from '../options'\nimport { Element } from './element'\n\nexport type Measure = {\n boxSize: number\n viewSize: number\n slideSize: number\n}\n\nexport function Measure (\n options: Options,\n element: Element\n): Measure {\n const {\n $el\n } = element\n const viewSize = options.isHorizontal ? $el.offsetWidth : $el.offsetHeight\n const slideSize = (viewSize - (Math.ceil(options.slidesPerView - 1)) * options.spaceBetween) / options.slidesPerView\n const boxSize = slideSize + options.spaceBetween\n\n return {\n boxSize,\n viewSize,\n slideSize\n }\n}\n","import { Options } from '../options'\nimport { Element } from './element'\nimport { Measure } from './measure'\n\nexport type Limitation = {\n min: number\n max: number\n base: number\n expand: number\n buffer: number\n minIndex: number\n maxIndex: number\n}\n\nexport function getExpand (\n options: Options\n): number {\n if (options.loop) {\n // return options.slidesPerView >= element.$list.length\n // ? options.slidesPerView - element.$list.length + 1\n // : 1\n return Math.ceil(options.slidesPerView)\n }\n return 0\n}\n\nexport function Limitation (\n element: Element,\n measure: Measure,\n options: Options\n): Limitation {\n const {\n $list\n } = element\n const {\n viewSize,\n slideSize,\n boxSize\n } = measure\n const expand = getExpand(options)\n const buffer = expand * boxSize\n const base = -buffer + (options.centeredSlides\n ? (viewSize - slideSize) / 2\n : 0)\n // [min, max] usually equal to [-x, 0]\n const max = base\n const min = options.spaceBetween + (options.loop ? slideSize : viewSize) + base - boxSize * $list.length\n const minIndex = 0\n const maxIndex = $list.length - ((options.centeredSlides || options.loop)\n ? 1\n : Math.ceil(options.slidesPerView))\n\n const limitation = {\n max,\n min,\n base,\n expand,\n buffer,\n minIndex,\n maxIndex\n }\n\n return limitation\n}\n","import { Options } from '../options'\nimport { Element } from './element'\nimport { Measure } from './measure'\nimport { Limitation } from './limitation'\n\ndeclare global {\n interface Window {\n DocumentTouch: any\n }\n const DocumentTouch: any\n}\n\nexport type Env = {\n touchable: boolean\n element: Element\n measure: Measure\n limitation: Limitation\n update (element: Element): void\n}\n\nexport function Env (\n elem: Element,\n options: Options\n): Env {\n const env = {}\n\n function update (element: Element): void {\n const measure = Measure(\n options,\n element\n )\n const limitation = Limitation(\n element,\n measure,\n options\n )\n const touchable = Boolean(\n 'ontouchstart' in window\n || navigator.maxTouchPoints > 0\n || navigator.msMaxTouchPoints > 0\n || window.DocumentTouch && document instanceof DocumentTouch\n )\n\n Object.assign(env, {\n touchable,\n element,\n measure,\n limitation\n })\n }\n\n env.update = update\n\n update(elem)\n\n return env\n}\n","import { Options } from '../options'\nimport {\n removeClass, addClass, setStyle, setAttr, attachListener, detachListener\n} from './dom'\nimport { State } from '../state/index'\nimport { Env } from '../env/index'\n\nconst shallowTag = 'data-shallow-slider'\nconst sliderTag = 'data-slider'\n\nexport type Renderer = {\n init (): void\n render (\n state: State,\n duration?: number,\n cb?: Function,\n force?: boolean\n ): void\n destroy (): void\n updateSize (): void\n}\n\nexport function Renderer (\n env: Env,\n options: Options\n): Renderer {\n function updateItem (state: State): void {\n const {\n $wrapper\n } = env.element\n const {\n index\n } = state\n\n $wrapper.querySelectorAll(`[${sliderTag}]`).forEach($slide => {\n // eslint-disable-next-line no-bitwise\n const tagNumber = ~~$slide.getAttribute(sliderTag)\n\n removeClass($slide, [\n options.slidePrevClass,\n options.slideNextClass,\n options.slideActiveClass\n ])\n\n if (tagNumber === index) {\n addClass($slide, options.slideActiveClass)\n }\n if (tagNumber === index - 1) {\n addClass($slide, options.slidePrevClass)\n }\n if (tagNumber === index + 1) {\n addClass($slide, options.slideNextClass)\n }\n })\n }\n\n function render (\n state: State,\n duration?: number,\n cb?: Function,\n force?: false\n ) {\n const {\n $wrapper\n } = env.element\n const timing = duration === undefined ? options.speed : duration\n\n options.injections.translate(state, env, options, timing)\n\n // Update slide style only if scroll action is end.\n if (!state.isStart) updateItem(state)\n\n force && getComputedStyle($wrapper).transform\n cb && setTimeout(cb, timing)\n }\n\n function appendExpandList (): void {\n if (!options.loop) return\n\n const {\n element,\n limitation\n } = env\n const {\n $list,\n $wrapper\n } = element\n const {\n expand\n } = limitation\n const $leftExpandList = $list.slice(-expand)\n .map($slide => $slide.cloneNode(true))\n const $rightExpandList = $list.slice(0, expand)\n .map($slide => $slide.cloneNode(true))\n\n $leftExpandList.forEach(($shadowSlide, index) => {\n $wrapper.appendChild(setAttr($rightExpandList[index], shallowTag))\n $wrapper.insertBefore(setAttr($leftExpandList[index], shallowTag), $list[0])\n })\n }\n\n function destroyExpandList (): void {\n env.element.$wrapper\n .querySelectorAll(`[${shallowTag}]`)\n .forEach(item => env.element.$wrapper.removeChild(item))\n }\n\n function updateDom (): void {\n env.element.$list.forEach((el, index) => setAttr(el, sliderTag, index))\n\n destroyExpandList()\n appendExpandList()\n }\n\n function updateSize (): void {\n const {\n element,\n measure\n } = env\n const {\n $wrapper\n } = element\n const wrapperStyle = {\n display: 'flex',\n willChange: 'transform',\n flexDirection: options.isHorizontal ? 'row' : 'column'\n }\n const itemStyle = {\n [options.isHorizontal ? 'width' : 'height']: `${measure.slideSize}px`,\n [options.isHorizontal ? 'margin-right' : 'margin-bottom']: `${options.spaceBetween}px`\n }\n\n setStyle($wrapper, wrapperStyle)\n $wrapper.querySelectorAll(`[${sliderTag}]`)\n .forEach($slide => setStyle($slide, itemStyle))\n }\n\n function init (): void {\n updateDom()\n updateSize()\n }\n\n function destroy (): void {\n const {\n $list,\n $wrapper\n } = env.element\n const arr = ['display', 'will-change', 'flex-direction']\n const itemProp = options.isHorizontal ? 'margin-right' : 'margin-bottom'\n\n arr.forEach((propertyName: string) => {\n $wrapper.style.removeProperty(propertyName)\n })\n $list.forEach($slide => $slide.style.removeProperty(itemProp))\n destroyExpandList()\n }\n\n return {\n init,\n render,\n destroy,\n updateSize\n }\n}\n","import { State } from './index'\nimport { Limitation } from '../env/limitation'\nimport { EventHub, LIFE_CYCLES } from '../eventHub'\nimport { Renderer } from '../render/index'\nimport { Options } from '../options'\nimport { Env } from '../env/index'\n\nexport interface Operations {\n update (): void\n render (duration?: number): void\n transform (trans: number): void\n slideTo (\n targetIndex: number,\n duration?: number\n ): void\n scrollPixel (px: number): void\n initStatus (startTransform?: number): void\n initLayout (originTransform: number): void\n getOffsetSteps (offset: number): number\n}\n\nexport function isExceedingLimits (\n velocity: number,\n transform: number,\n options: Options,\n limitation: Limitation\n): boolean {\n return velocity > 0 && transform > (limitation.max)\n || velocity < 0 && transform < (limitation.min)\n}\n\n/**\n * Get transform exceed value\n * Return zero if is not reached border.\n *\n * @param transform\n * @param options\n * @param limitation\n */\nexport function getExcess (\n transform: number,\n options: Options,\n limitation: Limitation\n): number {\n const exceedLeft = transform - limitation.max\n const exceedRight = transform - limitation.min\n\n return exceedLeft > 0\n ? exceedLeft\n : exceedRight < 0\n ? exceedRight\n : 0\n}\n\nexport function Operations (\n env: Env,\n state: State,\n options: Options,\n renderer: Renderer,\n eventHub: EventHub\n): Operations {\n function getOffsetSteps (offset: number): number {\n const {\n measure\n } = env\n return Math.ceil(Math.abs(offset) / measure.boxSize - options.longSwipesRatio)\n }\n\n function render (\n duration?: number,\n cb?: Function,\n force?: boolean\n ): void {\n renderer.render(\n state,\n duration,\n cb,\n force\n )\n }\n\n function transform (trans: number): void {\n const {\n min,\n max\n } = env.limitation\n const transRange = max - min + (options.loop ? env.measure.boxSize : 0)\n const len = transRange + 1\n\n let progress\n\n state.transforms = trans\n\n if (options.loop) {\n progress = (max - trans) % len / transRange\n\n state.progress = progress < 0\n ? 1 + progress\n : progress > 1\n ? progress - 1\n : progress\n } else {\n progress = (max - trans) / transRange\n\n state.progress = progress < 0\n ? 0\n : progress > 1\n ? 1\n : progress\n }\n\n eventHub.emit(LIFE_CYCLES.SCROLL, {\n ...state\n })\n }\n\n function slideTo (\n targetIndex: number,\n duration?: number\n ): void {\n const {\n measure,\n limitation\n } = env\n const len = limitation.maxIndex - limitation.minIndex + 1\n const computedIndex = options.loop\n ? (targetIndex % len + len) % len\n : targetIndex > limitation.maxIndex\n ? limitation.maxIndex\n : targetIndex < limitation.minIndex\n ? limitation.minIndex\n : targetIndex\n const offset = -computedIndex * measure.boxSize + limitation.base\n\n // Slide over a cycle.\n if (state.index === computedIndex\n && getOffsetSteps(offset - state.transforms) !== 0\n && options.loop\n ) {\n const excess = getExcess(state.transforms, options, limitation)\n\n transform(excess > 0\n ? limitation.min - measure.boxSize + excess\n : limitation.max + measure.boxSize + excess)\n\n // Set initial offset for rebounding animation.\n render(0, undefined, true)\n }\n\n eventHub.emit(LIFE_CYCLES.BEFORE_SLIDE,\n state.index,\n state,\n computedIndex)\n state.index = computedIndex\n transform(offset)\n render(duration, () => {\n eventHub.emit(LIFE_CYCLES.AFTER_SLIDE,\n computedIndex,\n state)\n })\n }\n\n function scrollPixel (px: number): void {\n const {\n transforms\n } = state\n const {\n measure,\n limitation\n } = env\n const ratio = Number(px.toExponential().split('e')[1])\n const expand = ratio <= 0 ? Math.pow(10, -(ratio - 1)) : 1\n\n let newTransform = transforms\n\n // For optimizing, do not calculate `px` if options.loop === true\n if (options.resistance && !options.loop) {\n if (px > 0 && transforms >= limitation.max) {\n px -= (px * expand) ** options.resistanceRatio / expand\n } else if (px < 0 && transforms <= limitation.min) {\n px += ((-px * expand) ** options.resistanceRatio) / expand\n }\n }\n\n newTransform += px\n\n if (options.loop) {\n const vector = state.tracker.vector()\n const velocity = options.isHorizontal ? vector.velocityX : vector.velocityY\n const excess = getExcess(transforms, options, limitation)\n\n if (excess && isExceedingLimits(\n velocity,\n transforms,\n options,\n limitation\n )) {\n newTransform = excess > 0\n ? limitation.min - measure.boxSize + excess\n : limitation.max + measure.boxSize + excess\n }\n }\n\n transform(newTransform)\n }\n\n function initStatus (startTransform = 0): void {\n state.startTransform = startTransform\n state.isStart = false\n state.isScrolling = false\n state.isTouching = false\n }\n\n function initLayout (originTransform: number): void {\n transform(originTransform)\n }\n\n function update (): void {\n slideTo(state.index, 0)\n renderer.updateSize()\n }\n\n return {\n update,\n render,\n transform,\n slideTo,\n scrollPixel,\n initStatus,\n initLayout,\n getOffsetSteps\n }\n}\n","import { Options } from '../options'\n\nexport type Element = {\n $el: HTMLElement\n $list: Array\n $wrapper: HTMLElement\n}\n\nexport function Element (\n el: HTMLElement | string,\n options: Options\n): Element {\n const $el = (typeof el === 'string' ? document.body.querySelector(el) : el)\n const $wrapper = $el!.querySelector(`.${options.wrapperClass}`)\n const $list = [].slice.call($el!.getElementsByClassName(options.slideClass))\n\n return {\n $el,\n $wrapper,\n $list\n }\n}\n","import { UserOptions, optionFormatter, Options } from './options'\nimport { EventHub, LIFE_CYCLES } from './eventHub'\nimport { State } from './state/index'\nimport { Sensor } from './sensor/index'\nimport { Env } from './env/index'\nimport { Renderer } from './render/index'\nimport { Operations } from './state/operations'\nimport { Element } from './env/element'\n\nexport type SwiperInstance = {\n on: (evtName: string, cb: Function) => void\n off: (evtName: string, cb: Function) => void\n update: () => void\n destroy: () => void\n slideTo: (index: number, duration?: number) => void\n options: Options\n env: Env\n state: State\n updateSize: () => void\n}\nexport type SwiperPlugin = (instance: SwiperInstance, options: Options) => void\n\nexport type Swiper = {\n (el: HTMLElement | string, userOptions?: UserOptions): SwiperInstance\n use: (plugins: Array) => void\n plugins: Array\n}\n\nconst Swiper: Swiper = function (\n el: HTMLElement | string,\n userOptions: UserOptions\n): SwiperInstance {\n const options = optionFormatter(userOptions)\n const eventHub = EventHub()\n const element = Element(\n el,\n options\n )\n const env = Env(element, options)\n const state = State()\n const {\n on,\n off,\n emit\n } = eventHub\n const instance = {\n on,\n off,\n env,\n state,\n options\n } as SwiperInstance\n\n (options.plugins || Swiper.plugins || [])\n .forEach((plugin: SwiperPlugin) => plugin(\n instance,\n options\n ))\n\n emit(LIFE_CYCLES.BEFORE_INIT, instance)\n\n // Initialize internal module\n const renderer = Renderer(\n env,\n options\n )\n const operations = Operations(\n env,\n state,\n options,\n renderer,\n eventHub\n )\n const sensor = Sensor(\n env,\n state,\n options,\n operations\n )\n\n function destroy (): void {\n emit(LIFE_CYCLES.BEFORE_DESTROY, instance)\n sensor.detach()\n renderer.destroy()\n eventHub.clear()\n emit(LIFE_CYCLES.AFTER_DESTROY, instance)\n }\n\n function updateSize (): void {\n env.update(Element(\n el,\n options\n ))\n operations.update()\n }\n\n function update (): void {\n renderer.destroy()\n env.update(Element(\n el,\n options\n ))\n renderer.init()\n operations.update()\n }\n\n const {\n slideTo\n } = operations\n\n Object.assign(instance, {\n update,\n destroy,\n slideTo,\n updateSize\n })\n\n renderer.init()\n sensor.attach()\n slideTo(\n options.initialSlide,\n 0\n )\n emit(LIFE_CYCLES.AFTER_INIT, instance)\n\n return instance\n}\n\nSwiper.use = (plugins: Array): void => {\n Swiper.plugins = plugins\n}\n\nexport default Swiper\n"],"names":["addClass","el","list","Array","isArray","forEach","clz","classList","contains","add","removeClass","remove","attachListener","evtName","handler","opts","addEventListener","detachListener","removeEventListener","setAttr","attr","value","setAttribute","setStyle","style","forceRender","Object","keys","prop","getComputedStyle","getTranslate","isHorizontal","matrix","transform","replace","split","map","parseFloat","arr","length","slice","SwiperPluginLazyload","instance","options","lazyload","lazyloadOptions","load","index","$slide","env","element","$list","$imgs","call","getElementsByClassName","elementClass","$preloaders","preloaderClass","handleLoaded","$img","removeAttribute","loadedClass","loadingClass","onload","onerror","isLoaded","every","item","$preloader","parentElement","removeChild","hasAttribute","src","getAttribute","loadRange","range","loadPrevNext","i","on","loadPrevNextAmount","loadOnTransitionStart","oldIndex","state","newIndex","SwiperPluginPagination","pagination","$pageList","$pagination","assign","clickable","bulletClass","bulletActiveClass","document","body","querySelector","$group","createDocumentFragment","dotCount","Math","ceil","slidesPerView","excludeElements","push","$page","createElement","appendChild","e","slideTo","indexOf","target","stopPropagation","innerHTML","currentIndex","DIRECTION","up","right","down","left","isVisible","visible","visibility","display","nodeType","isElementInView","boundary","getBoundingClientRect","isInView","top","bottom","window","innerHeight","innerWidth","SwiperPluginKeyboardControl","keyboard","keyboardOptions","enable","enabled","disable","onKeyDown","key","onlyInViewport","$el","SwiperPluginMousewheel","mousewheel","wheelStatus","wheeling","wheelDelta","wheelingTimer","initWheelStatus","delta","deltaX","deltaY","abs","sensitivity","clearTimeout","setTimeout","interval","preventDefault","invert","SwiperPluginNavigation","navigation","nextEl","prevEl","nextClickHandler","clickHandler","prevClickHandler","type","checkIsDisable","loop","currentIdx","console","log","checkSwiperDisabledClass","last","slideToNum","disabledClass","checkButtonDefaultStatus","translate","duration","$wrapper","wrapperStyle","transition","isStart","transforms","defaultOptions","direction","touchRatio","touchAngle","longSwipesRatio","initialSlide","freeMode","passiveListeners","resistance","resistanceRatio","speed","longSwipesMs","spaceBetween","centeredSlides","slidePrevClass","slideNextClass","slideActiveClass","slideClass","wrapperClass","touchStartPreventDefault","touchStartForcePreventDefault","touchMoveStopPropagation","injections","optionFormatter","userOptions","LIFE_CYCLES","BEFORE_INIT","AFTER_INIT","BEFORE_SLIDE","SCROLL","AFTER_SLIDE","BEFORE_DESTROY","AFTER_DESTROY","EventHub","hub","cb","off","splice","emit","data","clear","PI","Vector","logs","trace","formerTrace","diff","x","y","time","velocityX","velocityY","angle","atan2","Tracker","position","Date","now","vector","getLogs","getDuration","first","getOffset","State","tracker","startTransform","isScrolling","isTouching","progress","performance","Tick","nextFrame","requestAnimationFrame","webkitRequestAnimationFrame","cancelNextFrame","cancelAnimationFrame","webkitCancelAnimationFrame","startTime","id","run","timeStamp","stop","undefined","Animation","tick","task","Actions","operations","initLayout","initStatus","render","scrollPixel","getOffsetSteps","animation","preheat","originPosition","originTransform","move","displacement","offset","measure","trans","jump","boxSize","longSwipeIndex","velocity","Sensor","touchable","formEls","actions","getPosition","touch","changedTouches","pageX","pageY","onTouchStart","shouldPreventDefault","nodeName","onTouchMove","onTouchEnd","attach","passive","capture","detach","Measure","viewSize","offsetWidth","offsetHeight","slideSize","getExpand","Limitation","expand","buffer","base","max","min","minIndex","maxIndex","limitation","Env","elem","update","Boolean","navigator","maxTouchPoints","msMaxTouchPoints","DocumentTouch","shallowTag","sliderTag","Renderer","updateItem","querySelectorAll","tagNumber","force","timing","appendExpandList","$leftExpandList","cloneNode","$rightExpandList","$shadowSlide","insertBefore","destroyExpandList","updateDom","updateSize","willChange","flexDirection","itemStyle","init","destroy","itemProp","propertyName","removeProperty","isExceedingLimits","getExcess","exceedLeft","exceedRight","Operations","renderer","eventHub","transRange","len","targetIndex","computedIndex","excess","px","ratio","Number","toExponential","pow","newTransform","Element","Swiper","plugins","plugin","sensor","use"],"mappings":";;;;;;;;;;;;;;;;;;SAAgBA,SACZC,IACAC;MAAAA;AAAAA,IAAAA,OAA+B;;;AAE/B,MAAI,CAACC,KAAK,CAACC,OAAN,CAAcF,IAAd,CAAL,EAA0BA,IAAI,GAAG,CAACA,IAAD,CAAP;AAE1BA,EAAAA,IAAI,CAACG,OAAL,CAAa,UAAAC,GAAG;AAAA,WAAK,CAACL,EAAE,CAACM,SAAH,CAAaC,QAAb,CAAsBF,GAAtB,CAAD,IAA+BL,EAAE,CAACM,SAAH,CAAaE,GAAb,CAAiBH,GAAjB,CAApC;AAAA,GAAhB;AACH;SAEeI,YACZT,IACAC;MAAAA;AAAAA,IAAAA,OAA+B;;;AAE/B,MAAI,CAACC,KAAK,CAACC,OAAN,CAAcF,IAAd,CAAL,EAA0BA,IAAI,GAAG,CAACA,IAAD,CAAP;AAE1BA,EAAAA,IAAI,CAACG,OAAL,CAAa,UAAAC,GAAG;AAAA,WAAKL,EAAE,CAACM,SAAH,CAAaC,QAAb,CAAsBF,GAAtB,KAA8BL,EAAE,CAACM,SAAH,CAAaI,MAAb,CAAoBL,GAApB,CAAnC;AAAA,GAAhB;AACH;SAEeM,eACZX,IACAY,SACAC,SACAC;AAEAd,EAAAA,EAAE,CAACe,gBAAH,CAAoBH,OAApB,EAA6BC,OAA7B,EAAsCC,IAAtC;AACH;SAEeE,eACZhB,IACAY,SACAC;AAEAb,EAAAA,EAAE,CAACiB,mBAAH,CAAuBL,OAAvB,EAAgCC,OAAhC;AACH;SASeK,QACZlB,IACAmB,MACAC;MAAAA;AAAAA,IAAAA,QAAQ;;;AAERpB,EAAAA,EAAE,CAACqB,YAAH,CAAgBF,IAAhB,EAAsBC,KAAtB;AACA,SAAOpB,EAAP;AACH;SAEesB,SACZtB,IACAuB,OACAC;AAEAC,EAAAA,MAAM,CAACC,IAAP,CAAYH,KAAZ,EAAmBnB,OAAnB,CAA2B,UAAAuB,IAAI;AAC3B;AACA3B,IAAAA,EAAE,CAACuB,KAAH,CAASI,IAAT,IAAwBJ,KAAK,CAACI,IAAD,CAA7B;AACH,GAHD;;AAKAH,EAAAA,WAAW,IAAII,gBAAgB,CAAC5B,EAAD,CAA/B;AAEA,SAAOA,EAAP;AACH;SAEe6B,aACZ7B,IACA8B;AAEA,MAAMC,MAAM,GAAGH,gBAAgB,CAAC5B,EAAD,CAAhB,CAAqBgC,SAArB,CAA+BC,OAA/B,CAAuC,iBAAvC,EAA0D,EAA1D,EAA8DC,KAA9D,CAAoE,GAApE,EAAyEC,GAAzE,CAA6EC,UAA7E,CAAf;AACA,MAAIC,GAAG,GAAkB,EAAzB;;AAEA,MAAIN,MAAM,CAACO,MAAP,KAAkB,EAAtB,EAA0B;AACtBD,IAAAA,GAAG,GAAGN,MAAM,CAACQ,KAAP,CAAa,EAAb,EAAiB,EAAjB,CAAN;AACH,GAFD,MAEO,IAAIR,MAAM,CAACO,MAAP,KAAkB,CAAtB,EAAyB;AAC5BD,IAAAA,GAAG,GAAGN,MAAM,CAACQ,KAAP,CAAa,CAAb,EAAgB,CAAhB,CAAN;AACH;;AACD,SAAuBF,GAAI,CAACP,YAAY,GAAG,CAAH,GAAO,CAApB,CAAJ,IAA8B,CAArD;AACH;;ACzDD;;;;;;;SAMwBU,qBACpBC,UASAC;AAEA,MAAI,CAACA,OAAO,CAACC,QAAb,EAAuB;AAEvB,MAAMC,eAAe,GAAgCF,OAAO,CAACC,QAA7D;AACA,MAAMA,QAAQ,GAAG;AACbE,IAAAA,IADa,gBACPC,KADO;AAET,UAAMC,MAAM,GAAGN,QAAQ,CAACO,GAAT,CAAaC,OAAb,CAAqBC,KAArB,CAA2BJ,KAA3B,CAAf;AAEA,UAAI,CAACC,MAAL,EAAa;AAEb,UAAMI,KAAK,GAAG,GAAGZ,KAAH,CAASa,IAAT,CAAcL,MAAM,CAACM,sBAAP,CAA8BT,eAAe,CAACU,YAA9C,CAAd,CAAd;AACA,UAAMC,WAAW,GAAkB,GAAGhB,KAAH,CAASa,IAAT,CAAcL,MAAM,CAACM,sBAAP,CAA8BT,eAAe,CAACY,cAA9C,CAAd,CAAnC;;AAEA,eAASC,YAAT,CAAuBC,IAAvB;AACIA,QAAAA,IAAI,CAACC,eAAL,CAAqB,UAArB;AACA5D,QAAAA,QAAQ,CAAC2D,IAAD,EAAO,CAACd,eAAe,CAACgB,WAAjB,CAAP,CAAR;AACAnD,QAAAA,WAAW,CAACiD,IAAD,EAAO,CAACd,eAAe,CAACiB,YAAjB,CAAP,CAAX;AACAH,QAAAA,IAAI,CAACI,MAAL,GAAc,IAAd;AACAJ,QAAAA,IAAI,CAACK,OAAL,GAAe,IAAf;AACAL,QAAAA,IAAI,CAACM,QAAL,GAAgB,IAAhB;;AAEA,YAAIb,KAAK,CAACc,KAAN,CAAY,UAACC,IAAD;AAAA,iBAA2CA,IAAI,CAACF,QAAhD;AAAA,SAAZ,CAAJ,EAA2E;AACvET,UAAAA,WAAW,CAACnD,OAAZ,CAAoB,UAAC+D,UAAD;AAChBA,YAAAA,UAAU,CAACC,aAAX,CAA0BC,WAA1B,CAAsCF,UAAtC;AACH,WAFD;AAGH;AACJ;;AAEDhB,MAAAA,KAAK,CAAC/C,OAAN,CAAc,UAACsD,IAAD;AACV,YAAI,CAACA,IAAI,CAACY,YAAL,CAAkB,UAAlB,CAAL,EAAoC;AAEpC,YAAMC,GAAG,GAAGb,IAAI,CAACc,YAAL,CAAkB,UAAlB,CAAZ;AAEAzE,QAAAA,QAAQ,CAAC2D,IAAD,EAAO,CAACd,eAAe,CAACiB,YAAjB,CAAP,CAAR;AACApD,QAAAA,WAAW,CAACiD,IAAD,EAAO,CAACd,eAAe,CAACgB,WAAjB,CAAP,CAAX;AACAF,QAAAA,IAAI,CAACa,GAAL,GAAWA,GAAX;;AACAb,QAAAA,IAAI,CAACI,MAAL,GAAc;AAAA,iBAAML,YAAY,CAACC,IAAD,CAAlB;AAAA,SAAd;;AACAA,QAAAA,IAAI,CAACK,OAAL,GAAe;AAAA,iBAAMN,YAAY,CAACC,IAAD,CAAlB;AAAA,SAAf;AACH,OAVD;AAWH,KAnCY;AAqCbe,IAAAA,SArCa,qBAsCT3B,KAtCS,EAuCT4B,KAvCS;AAyCT/B,MAAAA,QAAQ,CAACE,IAAT,CAAcC,KAAd;;AAEA,UAAIF,eAAe,CAAC+B,YAAhB,IAAgCD,KAAK,IAAI,CAA7C,EAAgD;AAC5C,aAAK,IAAIE,CAAC,GAAG,CAAb,EAAgBA,CAAC,IAAIF,KAArB,EAA4BE,CAAC,EAA7B,EAAiC;AAC7BjC,UAAAA,QAAQ,CAACE,IAAT,CAAcC,KAAK,GAAG8B,CAAtB;AACAjC,UAAAA,QAAQ,CAACE,IAAT,CAAcC,KAAK,GAAG8B,CAAtB;AACH;AACJ;AACJ;AAjDY,GAAjB;AAoDAnC,EAAAA,QAAQ,CAACoC,EAAT,CAAY,aAAZ,EAA2B;AACvBnC,IAAAA,OAAO,CAACC,QAAR;AACIgC,MAAAA,YAAY,EAAE,KADlB;AAEIG,MAAAA,kBAAkB,EAAE,CAFxB;AAGIC,MAAAA,qBAAqB,EAAE,KAH3B;AAIIzB,MAAAA,YAAY,EAAE,aAJlB;AAKIO,MAAAA,YAAY,EAAE,qBALlB;AAMID,MAAAA,WAAW,EAAE,oBANjB;AAOIJ,MAAAA,cAAc,EAAE;AAPpB,OAQOd,OAAO,CAACC,QARf;AAUH,GAXD;;AAaA,MAAIC,eAAe,CAACmC,qBAApB,EAA2C;AACvCtC,IAAAA,QAAQ,CAACoC,EAAT,CAAY,cAAZ,EAA4B,UACxBG,QADwB,EAExBC,KAFwB,EAGxBC,QAHwB;AAKxBvC,MAAAA,QAAQ,CAAC8B,SAAT,CAAmBS,QAAnB,EAA6BtC,eAAe,CAACkC,kBAA7C;AACH,KAND;AAOH,GARD,MAQO;AACHrC,IAAAA,QAAQ,CAACoC,EAAT,CAAY,aAAZ,EAA2B,UACvB/B,KADuB;AAGvBH,MAAAA,QAAQ,CAAC8B,SAAT,CAAmB3B,KAAnB,EAA0BF,eAAe,CAACkC,kBAA1C;AACH,KAJD;AAKH;;AAEDrC,EAAAA,QAAQ,CAACoC,EAAT,CAAY,eAAZ,EAA6B;AACzB,QAAI,CAACpC,QAAQ,CAACE,QAAd,EAAwB;AAExB,WAAOF,QAAQ,CAACE,QAAhB;AACH,GAJD;AAKH;;SC5GuBwC,uBACpB1C,UAGAC;AAEA,MAAM0C,UAAU,GAAG;AACfC,IAAAA,SAAS,EAAE,EADI;AAEfC,IAAAA,WAAW,EAAE;AAFE,GAAnB;AAKA7C,EAAAA,QAAQ,CAACoC,EAAT,CAAY,aAAZ,EAA2B;AACvB,QAAInC,OAAO,CAAC0C,UAAZ,EAAwB;AACpB1C,MAAAA,OAAO,CAAC0C,UAAR,GAAqB3D,MAAM,CAAC8D,MAAP,CAAc;AAC/BC,QAAAA,SAAS,EAAE,KADoB;AAE/BC,QAAAA,WAAW,EAAE,0BAFkB;AAG/BC,QAAAA,iBAAiB,EAAE;AAHY,OAAd,EAIlBhD,OAAO,CAAC0C,UAJU,CAArB;AAKH;AACJ,GARD;AAUA3C,EAAAA,QAAQ,CAACoC,EAAT,CAAY,YAAZ,EAA0B;AACtB,QAAI,CAACnC,OAAO,CAAC0C,UAAb,EAAyB;8BAKrB1C,OAAO,CAAC0C;QAFRK,kCAAAA;QACAC,wCAAAA;QAGAzC,UACAR,QAAQ,CAACO,IADTC;QAGAC,QACAD,QADAC;AAGJ,QAAMoC,WAAW,GAAI,OAAO5C,OAAO,CAAC0C,UAAR,CAAmBpF,EAA1B,KAAiC,QAAjC,GACf2F,QAAQ,CAACC,IAAT,CAAcC,aAAd,CAA4BnD,OAAO,CAAC0C,UAAR,CAAmBpF,EAA/C,CADe,GAEf0C,OAAO,CAAC0C,UAAR,CAAmBpF,EAFzB;AAGA,QAAMqF,SAAS,GAAuB,EAAtC;AACA,QAAMS,MAAM,GAAGH,QAAQ,CAACI,sBAAT,EAAf;AACA,QAAMC,QAAQ,GAAG9C,KAAK,CAACZ,MAAN,GAAe2D,IAAI,CAACC,IAAL,CAAUxD,OAAO,CAACyD,aAAlB,CAAf,GAAkD,CAAnE;AAEAzD,IAAAA,OAAO,CAAC0D,eAAR,CAAwBC,IAAxB,CAA6Bf,WAA7B;AAEAF,IAAAA,UAAU,CAACE,WAAX,GAAyBA,WAAzB;AACAF,IAAAA,UAAU,CAACC,SAAX,GAAuBA,SAAvB;;AAEA,SAAK,IAAIvC,KAAK,GAAG,CAAjB,EAAoBA,KAAK,GAAGkD,QAA5B,EAAsClD,KAAK,EAA3C,EAA+C;AAC3C,UAAMwD,KAAK,GAAGX,QAAQ,CAACY,aAAT,CAAuB,KAAvB,CAAd;AAEAxG,MAAAA,QAAQ,CACJuG,KADI,EAEJxD,KAAK,KAAKL,QAAQ,CAACwC,KAAT,CAAenC,KAAzB,GAAiC,CAAC2C,WAAD,EAAcC,iBAAd,CAAjC,GAAoED,WAFhE,CAAR;AAIAJ,MAAAA,SAAS,CAACgB,IAAV,CAAeC,KAAf;AACAR,MAAAA,MAAM,CAACU,WAAP,CAAmBF,KAAnB;AACH;;AAEDhB,IAAAA,WAAW,CAACkB,WAAZ,CAAwBV,MAAxB;;AAEA,QAAIpD,OAAO,CAAC0C,UAAR,CAAmBI,SAAvB,EAAkC;AAC9BF,MAAAA,WAAW,CAACvE,gBAAZ,CAA6B,OAA7B,EAAsC,UAAC0F,CAAD;AAClChE,QAAAA,QAAQ,CAACiE,OAAT,CAAiBrB,SAAS,CAACsB,OAAV,CAAkBF,CAAC,CAACG,MAApB,CAAjB;AACAH,QAAAA,CAAC,CAACI,eAAF;AACH,OAHD;AAIH;AACJ,GA7CD;AA+CApE,EAAAA,QAAQ,CAACoC,EAAT,CAAY,eAAZ,EAA6B;AACzB,QAAI,CAACnC,OAAO,CAAC0C,UAAb,EAAyB;AAEzBA,IAAAA,UAAU,CAACE,WAAX,CAAwBwB,SAAxB,GAAoC,EAApC;AACA1B,IAAAA,UAAU,CAACC,SAAX,GAAuB,EAAvB;AACAD,IAAAA,UAAU,CAACE,WAAX,GAAyB,IAAzB;AACH,GAND;AAQA7C,EAAAA,QAAQ,CAACoC,EAAT,CAAY,aAAZ,EAA2B,UACvBkC,YADuB;QAGfrB,oBAAsBhD,OAAO,CAAC0C,WAA9BM;AAERN,IAAAA,UAAU,CAACC,SAAX,IAAwBD,UAAU,CAACC,SAAX,CAAqBjF,OAArB,CAA6B,UAACkG,KAAD,EAAQxD,KAAR;AACjD,UAAIA,KAAK,KAAKiE,YAAd,EAA4B;AACxBhH,QAAAA,QAAQ,CAACuG,KAAD,EAAQZ,iBAAR,CAAR;AACH,OAFD,MAEO;AACHjF,QAAAA,WAAW,CAAC6F,KAAD,EAAQZ,iBAAR,CAAX;AACH;AACJ,KANuB,CAAxB;AAOH,GAZD;AAaH;;AClGD,IAAMsB,SAAS,GAAG;AACdC,EAAAA,EAAE,EAAE,SADU;AAEdC,EAAAA,KAAK,EAAE,YAFO;AAGdC,EAAAA,IAAI,EAAE,WAHQ;AAIdC,EAAAA,IAAI,EAAE;AAJQ,CAAlB;;AAOA,SAASC,SAAT,CAAoBrH,EAApB;AACI,MAAI,CAACA,EAAL,EAAS,OAAO,KAAP;AAET,MAAMuB,KAAK,GAAGK,gBAAgB,CAAC5B,EAAD,CAA9B;AACA,MAAMsH,OAAO,GAAG/F,KAAK,CAACgG,UAAN,KAAqB,QAArB,IAAiChG,KAAK,CAACiG,OAAN,KAAkB,MAAnE;AAEA,MAAI,CAACF,OAAL,EAAc,OAAO,KAAP;AAEd,SAAOtH,EAAE,CAACoE,aAAH,IAAoBpE,EAAE,CAACoE,aAAH,CAAiBqD,QAAjB,KAA8B,CAAlD,GACDJ,SAAS,CAACrH,EAAE,CAACoE,aAAJ,CADR,GAED,IAFN;AAGH;;AAED,SAASsD,eAAT,CAA0B1H,EAA1B;AACI,MAAMuH,UAAU,GAAGF,SAAS,CAACrH,EAAD,CAA5B;AACA,MAAM2H,QAAQ,GAAG3H,EAAE,CAAC4H,qBAAH,EAAjB;AACA,MAAMC,QAAQ,GAAIF,QAAQ,CAACG,GAAT,IAAgB,CAAhB,IAAqBH,QAAQ,CAACI,MAAT,IAAmBC,MAAM,CAACC,WAAhD,IACTN,QAAQ,CAACP,IAAT,IAAiB,CAAjB,IAAsBO,QAAQ,CAACT,KAAT,IAAkBc,MAAM,CAACE,UADvD;AAGA,SAAOL,QAAQ,IAAIN,UAAnB;AACH;AAED;;;;;;;;SAMwBY,4BACpB1F,UAOAC;AAEA,MAAI,CAACA,OAAO,CAAC0F,QAAb,EAAuB;AAEvB,MAAMC,eAAe,GAAuC3F,OAAO,CAAC0F,QAApE;AACA,MAAMA,QAAQ,GAAG;AACbE,IAAAA,MADa;AAETD,MAAAA,eAAe,CAACE,OAAhB,GAA0B,IAA1B;AACH,KAHY;AAIbC,IAAAA,OAJa;AAKTH,MAAAA,eAAe,CAACE,OAAhB,GAA0B,KAA1B;AACH,KANY;AAObE,IAAAA,SAPa,qBAOFhC,CAPE;UAQDiC,MAAQjC,EAARiC;AAER,UAAKL,eAAe,CAACM,cAAhB,IAAkC,CAACjB,eAAe,CAACjF,QAAQ,CAACO,GAAT,CAAaC,OAAb,CAAqB2F,GAAtB,CAAnD,IACG,CAACP,eAAe,CAACE,OADxB,EACiC;;AAEjC,UAAI7F,OAAO,CAACZ,YAAZ,EAA0B;AACtB,YAAI4G,GAAG,KAAK1B,SAAS,CAACI,IAAtB,EAA4B;AACxB3E,UAAAA,QAAQ,CAACiE,OAAT,CAAiBjE,QAAQ,CAACwC,KAAT,CAAenC,KAAf,GAAuB,CAAxC;AACH,SAFD,MAEO,IAAI4F,GAAG,KAAK1B,SAAS,CAACE,KAAtB,EAA6B;AAChCzE,UAAAA,QAAQ,CAACiE,OAAT,CAAiBjE,QAAQ,CAACwC,KAAT,CAAenC,KAAf,GAAuB,CAAxC;AACH;AACJ,OAND,MAMO;AACH,YAAI4F,GAAG,KAAK1B,SAAS,CAACG,IAAtB,EAA4B;AACxB1E,UAAAA,QAAQ,CAACiE,OAAT,CAAiBjE,QAAQ,CAACwC,KAAT,CAAenC,KAAf,GAAuB,CAAxC;AACH,SAFD,MAEO,IAAI4F,GAAG,KAAK1B,SAAS,CAACC,EAAtB,EAA0B;AAC7BxE,UAAAA,QAAQ,CAACiE,OAAT,CAAiBjE,QAAQ,CAACwC,KAAT,CAAenC,KAAf,GAAuB,CAAxC;AACH;AACJ;AACJ;AA1BY,GAAjB;AA6BAL,EAAAA,QAAQ,CAACoC,EAAT,CAAY,aAAZ,EAA2B;AACvBnC,IAAAA,OAAO,CAAC0F,QAAR;AACIG,MAAAA,OAAO,EAAE,IADb;AAEII,MAAAA,cAAc,EAAE;AAFpB,OAGOjG,OAAO,CAAC0F,QAHf;AAMA3F,IAAAA,QAAQ,CAAC2F,QAAT,GAAoBA,QAApB;AAEAzH,IAAAA,cAAc,CAACqH,MAAD,EAAS,SAAT,EAAoBI,QAAQ,CAACK,SAA7B,CAAd;AACH,GAVD;AAYAhG,EAAAA,QAAQ,CAACoC,EAAT,CAAY,eAAZ,EAA6B;AACzB,QAAI,CAACuD,QAAL,EAAe;AAEfpH,IAAAA,cAAc,CAACgH,MAAD,EAAS,SAAT,EAAoBI,QAAQ,CAACK,SAA7B,CAAd;AAEA,WAAOhG,QAAQ,CAAC2F,QAAhB;AACH,GAND;AAOH;;SCzFuBS,uBACpBpG,UAGAC;AAEA,MAAMoG,UAAU,GAAG;AACfF,IAAAA,GAAG,EAAE;AADU,GAAnB;AAGA,MAAMG,WAAW,GAAG;AAChBC,IAAAA,QAAQ,EAAE,KADM;AAEhBC,IAAAA,UAAU,EAAE,CAFI;AAGhBC,IAAAA,aAAa,EAAE;AAHC,GAApB;;AAKA,MAAMC,eAAe,GAAG,SAAlBA,eAAkB;AACpBJ,IAAAA,WAAW,CAACC,QAAZ,GAAuB,KAAvB;AACAD,IAAAA,WAAW,CAACE,UAAZ,GAAyB,CAAzB;AACAF,IAAAA,WAAW,CAACG,aAAZ,GAA4B,CAA5B;AACH,GAJD;;AAKA,MAAMrI,OAAO,GAAG,SAAVA,OAAU,CAAC4F,CAAD;AACZ,QAAM2C,KAAK,GAAG1G,OAAO,CAACZ,YAAR,GAAuB2E,CAAC,CAAC4C,MAAzB,GAAkC5C,CAAC,CAAC6C,MAAlD;QAEIxG,QACAL,QAAQ,CAACwC,MADTnC;;AAGJ,QAAI,CAACmD,IAAI,CAACsD,GAAL,CAASH,KAAT,IAAkBnD,IAAI,CAACsD,GAAL,CAASR,WAAW,CAACE,UAArB,CAAlB,GAAqD,CAArD,IAA0D,CAACF,WAAW,CAACC,QAAxE,KACG/C,IAAI,CAACsD,GAAL,CAASH,KAAT,KAAmB1G,OAAO,CAACoG,UAAR,CAAmBU,WAD7C,EAC0D;AACtD/G,MAAAA,QAAQ,CAACiE,OAAT,CAAiB0C,KAAK,GAAG,CAAR,GAAYtG,KAAK,GAAG,CAApB,GAAwBA,KAAK,GAAG,CAAjD;AACH;;AACDiG,IAAAA,WAAW,CAACE,UAAZ,GAAyBG,KAAzB;AACAK,IAAAA,YAAY,CAACV,WAAW,CAACG,aAAb,CAAZ;AACAH,IAAAA,WAAW,CAACC,QAAZ,GAAuB,IAAvB;AACAD,IAAAA,WAAW,CAACG,aAAZ,GAA4BQ,UAAU,CAAC;AACnCP,MAAAA,eAAe;AAClB,KAFqC,EAEnCzG,OAAO,CAACoG,UAAR,CAAmBa,QAFgB,CAAtC;AAGAlD,IAAAA,CAAC,CAACmD,cAAF;AACAnD,IAAAA,CAAC,CAACI,eAAF;AACH,GAlBD;;AAoBApE,EAAAA,QAAQ,CAACoC,EAAT,CAAY,aAAZ,EAA2B;AACvB,QAAInC,OAAO,CAACoG,UAAZ,EAAwB;AACpBpG,MAAAA,OAAO,CAACoG,UAAR,GAAqBrH,MAAM,CAAC8D,MAAP,CAAc;AAC/BsE,QAAAA,MAAM,EAAE,KADuB;AAE/BL,QAAAA,WAAW,EAAE,CAFkB;AAG/BG,QAAAA,QAAQ,EAAE;AAHqB,OAAd,EAIlBjH,OAAO,CAACoG,UAJU,CAArB;AAKH;AACJ,GARD;AAUArG,EAAAA,QAAQ,CAACoC,EAAT,CAAY,YAAZ,EAA0B;AACtB,QAAI,CAACnC,OAAO,CAACoG,UAAb,EAAyB;QAGrB7F,UACAR,QAAQ,CAACO,IADTC;QAGA2F,MACA3F,QADA2F;AAGJE,IAAAA,UAAU,CAACF,GAAX,GAAiBA,GAAjB;AAEAjI,IAAAA,cAAc,CAACiI,GAAD,EAAM,OAAN,EAA8B/H,OAA9B,CAAd;AACH,GAbD;AAeA4B,EAAAA,QAAQ,CAACoC,EAAT,CAAY,eAAZ,EAA6B;AACzB,QAAI,CAACnC,OAAO,CAACoG,UAAb,EAAyB;AAEzB,WAAOA,UAAU,CAACF,GAAlB;AACA5H,IAAAA,cAAc,CAAC8H,UAAU,CAACF,GAAZ,EAAiB,OAAjB,EAAyC/H,OAAzC,CAAd;AACH,GALD;AAMH;;SCtEuBiJ,uBACpBrH,UAGAC;AAEA,MAAMqH,UAAU,GAAG;AACfC,IAAAA,MAAM,EAAE,IADO;AAEfC,IAAAA,MAAM,EAAE;AAFO,GAAnB;;AAKA,MAAMC,gBAAgB,GAAG,SAAnBA,gBAAmB,CAACzD,CAAD;AACrB0D,IAAAA,YAAY,CAAC1D,CAAC,CAACG,MAAH,EAA0B,MAA1B,CAAZ;AACH,GAFD;;AAIA,MAAMwD,gBAAgB,GAAG,SAAnBA,gBAAmB,CAAC3D,CAAD;AACrB0D,IAAAA,YAAY,CAAC1D,CAAC,CAACG,MAAH,EAA0B,MAA1B,CAAZ;AAEH,GAHD;;AAKA,MAAMuD,YAAY,GAAG,SAAfA,YAAe,CAAC1D,CAAD,EAAiB4D,IAAjB;AACjB,QAAIC,cAAc,CAAC7D,CAAD,CAAd,IAAqB,CAAChE,QAAQ,CAACC,OAAT,CAAiB6H,IAA3C,EAAiD;AAC7C;AACH;;QAEGzH,QACAL,QAAQ,CAACwC,MADTnC;QAGAI,QACAT,QAAQ,CAACO,GAAT,CAAaC,QADbC;AAEJ,QAAIsH,UAAU,GAAG1H,KAAjB;;AAEA,QAAIuH,IAAI,KAAK,MAAb,EAAqB;AACjB,UAAIvH,KAAK,GAAGI,KAAK,CAACZ,MAAN,GAAe,CAA3B,EAA8B;AAC1BG,QAAAA,QAAQ,CAACiE,OAAT,CAAiB5D,KAAK,GAAG,CAAzB;AACH;;AACD,UAAI0H,UAAU,GAAGtH,KAAK,CAACZ,MAAvB,EAA+B;AAC3BkI,QAAAA,UAAU,GAAG1H,KAAb;AACH;;AACD0H,MAAAA,UAAU;AACb;;AAED,QAAIH,IAAI,KAAK,MAAb,EAAqB;AACjB,UAAIvH,KAAK,GAAG,CAAZ,EAAe;AACXL,QAAAA,QAAQ,CAACiE,OAAT,CAAiB5D,KAAK,GAAG,CAAzB;AACH;;AACD,UAAI0H,UAAU,GAAG,CAAC,CAAlB,EAAqB;AACjBA,QAAAA,UAAU,GAAG1H,KAAb;AACH;;AACD0H,MAAAA,UAAU;AACb;;AACDC,IAAAA,OAAO,CAACC,GAAR,CAAYjI,QAAQ,CAACC,OAAT,CAAiB6H,IAA7B,EAAmCC,UAAnC,EAA+CH,IAA/C;AACAM,IAAAA,wBAAwB,CAACH,UAAD,EAAatH,KAAK,CAACZ,MAAN,GAAe,CAA5B,EAA+B+H,IAA/B,CAAxB;AACH,GAjCD;;AAmCA,MAAMM,wBAAwB,GAAG,SAA3BA,wBAA2B,CAC7B7H,KAD6B,EACd8H,IADc,EACAP,IADA;AAE7B,QAAMzD,MAAM,GAAGyD,IAAI,KAAK,MAAT,GAAkB,CAAC,CAAnB,GAAuBO,IAAI,GAAG,CAA7C;AACA,QAAMC,UAAU,GAAGR,IAAI,KAAK,MAAT,GAAkBO,IAAlB,GAAyB,CAA5C;;AACA,QAAIb,UAAU,CAACC,MAAX,CAAkB1J,SAAlB,CAA4BC,QAA5B,CAAqCmC,OAAO,CAACqH,UAAR,CAAmBe,aAAxD,KACGT,IAAI,KAAK,MADhB,EACwB;AACpBN,MAAAA,UAAU,CAACC,MAAX,CAAkB1J,SAAlB,CAA4BI,MAA5B,CAAmCgC,OAAO,CAACqH,UAAR,CAAmBe,aAAtD;AACH;;AAED,QAAIf,UAAU,CAACE,MAAX,CAAkB3J,SAAlB,CAA4BC,QAA5B,CAAqCmC,OAAO,CAACqH,UAAR,CAAmBe,aAAxD,KACGT,IAAI,KAAK,MADhB,EACwB;AACpBN,MAAAA,UAAU,CAACE,MAAX,CAAkB3J,SAAlB,CAA4BI,MAA5B,CAAmCgC,OAAO,CAACqH,UAAR,CAAmBe,aAAtD;AACH;;AACD,QAAIrI,QAAQ,CAACC,OAAT,CAAiB6H,IAArB,EAA2B;AACvB,UAAIzH,KAAK,KAAK8D,MAAd,EAAsB;AAClBnE,QAAAA,QAAQ,CAACiE,OAAT,CAAiBmE,UAAjB;AACH;AACJ,KAJD,MAIO;AACH,UAAIpI,QAAQ,CAACwC,KAAT,CAAenC,KAAf,KAAyB,CAA7B,EAAgC;AAC5BiH,QAAAA,UAAU,CAACE,MAAX,CAAkB3J,SAAlB,CAA4BE,GAA5B,CAAgCkC,OAAO,CAACqH,UAAR,CAAmBe,aAAnD;AACH;;AACD,UAAIrI,QAAQ,CAACwC,KAAT,CAAenC,KAAf,KAAyB8H,IAA7B,EAAmC;AAC/Bb,QAAAA,UAAU,CAACC,MAAX,CAAkB1J,SAAlB,CAA4BE,GAA5B,CAAgCkC,OAAO,CAACqH,UAAR,CAAmBe,aAAnD;AACH;AACJ;AACJ,GAzBD;;AA2BA,MAAMR,cAAc,GAAG,SAAjBA,cAAiB,CAAC7D,CAAD;AACnB,QAAIA,CAAC,CAACnG,SAAF,CAAYC,QAAZ,CAAqBmC,OAAO,CAACqH,UAAR,CAAmBe,aAAxC,CAAJ,EAA4D;AACxD,aAAO,IAAP;AACH;;AACD,WAAO,KAAP;AACH,GALD;;AAOA,MAAMC,wBAAwB,GAAG,SAA3BA,wBAA2B;QAEzBjI,QACAL,QAAQ,CAACwC,MADTnC;QAGAI,QACAT,QAAQ,CAACO,GAAT,CAAaC,QADbC;;AAEJ,QAAIJ,KAAK,KAAK,CAAV,IAAe,CAACL,QAAQ,CAACC,OAAT,CAAiB6H,IAArC,EAA2C;AACvCR,MAAAA,UAAU,CAACE,MAAX,CAAkB3J,SAAlB,CAA4BE,GAA5B,CAAgCkC,OAAO,CAACqH,UAAR,CAAmBe,aAAnD;AACH;;AACD,QAAI5H,KAAK,CAACZ,MAAN,KAAiB,CAAjB,IAAsB,CAACG,QAAQ,CAACC,OAAT,CAAiB6H,IAA5C,EAAkD;AAC9CR,MAAAA,UAAU,CAACC,MAAX,CAAkB1J,SAAlB,CAA4BE,GAA5B,CAAgCkC,OAAO,CAACqH,UAAR,CAAmBe,aAAnD;AACH;AACJ,GAbD;;AAeArI,EAAAA,QAAQ,CAACoC,EAAT,CAAY,aAAZ,EAA2B;AACvB,QAAInC,OAAO,CAACqH,UAAZ,EAAwB;AACpBrH,MAAAA,OAAO,CAACqH,UAAR,GAAqBtI,MAAM,CAAC8D,MAAP,CAAc;AAC/BuF,QAAAA,aAAa,EAAE;AADgB,OAAd,EAElBpI,OAAO,CAACqH,UAFU,CAArB;AAGH;AACJ,GAND;AAQAtH,EAAAA,QAAQ,CAACoC,EAAT,CAAY,YAAZ,EAA0B;AACtB,QAAI,CAACnC,OAAO,CAACqH,UAAb,EAAyB;AAEzBA,IAAAA,UAAU,CAACC,MAAX,GAAqB,OAAOtH,OAAO,CAACqH,UAAR,CAAmBC,MAA1B,KAAqC,QAAtC,GACdrE,QAAQ,CAACC,IAAT,CAAcC,aAAd,CAA4BnD,OAAO,CAACqH,UAAR,CAAmBC,MAA/C,CADc,GAEdtH,OAAO,CAACqH,UAAR,CAAmBC,MAFzB;AAGAD,IAAAA,UAAU,CAACE,MAAX,GAAqB,OAAOvH,OAAO,CAACqH,UAAR,CAAmBE,MAA1B,KAAqC,QAAtC,GACdtE,QAAQ,CAACC,IAAT,CAAcC,aAAd,CAA4BnD,OAAO,CAACqH,UAAR,CAAmBE,MAA/C,CADc,GAEdvH,OAAO,CAACqH,UAAR,CAAmBE,MAFzB;AAGAc,IAAAA,wBAAwB;AACxBpK,IAAAA,cAAc,CAACoJ,UAAU,CAACC,MAAZ,EAAoB,OAApB,EAA4CE,gBAA5C,CAAd;AACAvJ,IAAAA,cAAc,CAACoJ,UAAU,CAACE,MAAZ,EAAoB,OAApB,EAA4CG,gBAA5C,CAAd;AACH,GAZD;AAcA3H,EAAAA,QAAQ,CAACoC,EAAT,CAAY,eAAZ,EAA6B;AACzB,QAAI,CAACnC,OAAO,CAACqH,UAAb,EAAyB;AAEzB,WAAOA,UAAU,CAACC,MAAlB;AACA,WAAOD,UAAU,CAACE,MAAlB;AAEAjJ,IAAAA,cAAc,CAAC+I,UAAU,CAACC,MAAZ,EAAoB,OAApB,EAA4CE,gBAA5C,CAAd;AACAlJ,IAAAA,cAAc,CAAC+I,UAAU,CAACE,MAAZ,EAAoB,OAApB,EAA4CG,gBAA5C,CAAd;AACH,GARD;AASH;;SCrJeY,UACZ/F,OACAjC,KACAN,SACAuI;MAGIC,WACAlI,GAAG,CAACC,QADJiI;AAEJ,MAAMC,YAAY,GAAG;AACjBC,IAAAA,UAAU,EAAEnG,KAAK,CAACoG,OAAN,GACN,MADM,uBAEYJ,QAFZ,OADK;AAIjBjJ,IAAAA,SAAS,EAAEU,OAAO,CAACZ,YAAR,oBACUmD,KAAK,CAACqG,UADhB,qCAEarG,KAAK,CAACqG,UAFnB;AAJM,GAArB;AASAhK,EAAAA,QAAQ,CAAC4J,QAAD,EAAWC,YAAX,CAAR;AACH;;ACgCD,IAAMI,cAAc,GAAgB;AAChC;AACAC,EAAAA,SAAS,EAAE,YAFqB;AAGhCC,EAAAA,UAAU,EAAE,CAHoB;AAIhCC,EAAAA,UAAU,EAAE,EAJoB;AAKhCC,EAAAA,eAAe,EAAE,GALe;AAMhCC,EAAAA,YAAY,EAAE,CANkB;AAOhCrB,EAAAA,IAAI,EAAE,KAP0B;AAQhCsB,EAAAA,QAAQ,EAAE,KARsB;AAShC/C,EAAAA,UAAU,EAAE,KAToB;AAUhCgD,EAAAA,gBAAgB,EAAE,IAVc;AAWhCC,EAAAA,UAAU,EAAE,IAXoB;AAYhCC,EAAAA,eAAe,EAAE,IAZe;AAahCC,EAAAA,KAAK,EAAE,GAbyB;AAchCC,EAAAA,YAAY,EAAE,GAdkB;AAehCC,EAAAA,YAAY,EAAE,CAfkB;AAgBhChG,EAAAA,aAAa,EAAE,CAhBiB;AAiBhCiG,EAAAA,cAAc,EAAE,KAjBgB;AAkBhCC,EAAAA,cAAc,EAAE,mBAlBgB;AAmBhCC,EAAAA,cAAc,EAAE,mBAnBgB;AAoBhCC,EAAAA,gBAAgB,EAAE,qBApBc;AAqBhCC,EAAAA,UAAU,EAAE,cArBoB;AAsBhCC,EAAAA,YAAY,EAAE,gBAtBkB;AAuBhCC,EAAAA,wBAAwB,EAAE,IAvBM;AAwBhCC,EAAAA,6BAA6B,EAAE,KAxBC;AAyBhCC,EAAAA,wBAAwB,EAAE,KAzBM;AA0BhCxG,EAAAA,eAAe,EAAE,EA1Be;AA2BhCyG,EAAAA,UAAU,EAAE;AACR7B,IAAAA,SAAS,EAATA;AADQ;AA3BoB,CAApC;SAgCgB8B,gBAAiBC;AAC7B,MAAMrK,OAAO,gBACN6I,cADM,EAENwB,WAFM,CAAb;;AAKA,sBACOrK,OADP;AAEIZ,IAAAA,YAAY,EAAEY,OAAO,CAAC8I,SAAR,KAAsB;AAFxC;AAIH;;IC1FYwB,WAAW,GAAG;AACvBC,EAAAA,WAAW,EAAE,aADU;AAEvBC,EAAAA,UAAU,EAAE,YAFW;AAGvBC,EAAAA,YAAY,EAAE,cAHS;AAIvBC,EAAAA,MAAM,EAAE,QAJe;AAKvBC,EAAAA,WAAW,EAAE,aALU;AAMvBC,EAAAA,cAAc,EAAE,gBANO;AAOvBC,EAAAA,aAAa,EAAE;AAPQ;SAUXC;AACZ,MAAIC,GAAG,GAEH,EAFJ;;AAIA,WAAS5I,EAAT,CAAajE,OAAb,EAA8B8M,EAA9B;AACI,QAAI,CAACD,GAAG,CAAC7M,OAAD,CAAR,EAAmB;AACf6M,MAAAA,GAAG,CAAC7M,OAAD,CAAH,GAAe,CAAC8M,EAAD,CAAf;AACH,KAFD,MAEO;AACHD,MAAAA,GAAG,CAAC7M,OAAD,CAAH,CAAayF,IAAb,CAAkBqH,EAAlB;AACH;AACJ;;AAED,WAASC,GAAT,CAAc/M,OAAd,EAA+B8M,EAA/B;AACI,QAAID,GAAG,CAAC7M,OAAD,CAAP,EAAkB;AACd,UAAMkC,KAAK,GAAG2K,GAAG,CAAC7M,OAAD,CAAH,CAAa+F,OAAb,CAAqB+G,EAArB,CAAd,CADc;;AAId5K,MAAAA,KAAK,GAAG,CAAC,CAAT,IAAc2K,GAAG,CAAC7M,OAAD,CAAH,CAAagN,MAAb,CAAoB9K,KAApB,EAA2B,CAA3B,CAAd;AACH;AACJ;;AAED,WAAS+K,IAAT,CAAejN,OAAf;sCAAmCkN;AAAAA,MAAAA;;;AAC/B,QAAIL,GAAG,CAAC7M,OAAD,CAAP,EAAkB;AACd6M,MAAAA,GAAG,CAAC7M,OAAD,CAAH,CAAaR,OAAb,CAAqB,UAAAsN,EAAE;AAAA,eAAIA,EAAE,MAAF,SAAMI,IAAN,CAAJ;AAAA,OAAvB;AACH;AACJ;;AAED,WAASC,KAAT;AACIN,IAAAA,GAAG,GAAG,EAAN;AACH;;AAED,SAAO;AACH5I,IAAAA,EAAE,EAAFA,EADG;AAEH8I,IAAAA,GAAG,EAAHA,GAFG;AAGHE,IAAAA,IAAI,EAAJA,IAHG;AAIHE,IAAAA,KAAK,EAALA;AAJG,GAAP;AAMH;;ACxDD,IAAM3E,KAAK,GAAG,MAAMnD,IAAI,CAAC+H,EAAzB;SAuEgBC,OACZC,MACApL;AAEA,MAAMqL,KAAK,GAAGD,IAAI,CAACpL,KAAD,CAAlB;AACA,MAAMsL,WAAW,GAAGF,IAAI,CAACpL,KAAK,GAAG,CAAT,CAAxB;AACA,MAAMuL,IAAI,GAAG;AACTC,IAAAA,CAAC,EAAEH,KAAK,CAACG,CAAN,GAAUF,WAAW,CAACE,CADhB;AAETC,IAAAA,CAAC,EAAEJ,KAAK,CAACI,CAAN,GAAUH,WAAW,CAACG;AAFhB,GAAb;AAIA,MAAMtD,QAAQ,GAAGkD,KAAK,CAACK,IAAN,GAAaJ,WAAW,CAACI,IAA1C;AACA,MAAMC,SAAS,GAAGJ,IAAI,CAACC,CAAL,GAASrD,QAA3B;AACA,MAAMyD,SAAS,GAAGL,IAAI,CAACE,CAAL,GAAStD,QAA3B;AACA,MAAM0D,KAAK,GAAG1I,IAAI,CAAC2I,KAAL,CAAW3I,IAAI,CAACsD,GAAL,CAAS8E,IAAI,CAACE,CAAd,CAAX,EAA6BtI,IAAI,CAACsD,GAAL,CAAS8E,IAAI,CAACC,CAAd,CAA7B,IAAiDlF,KAA/D;AAEA,sBACOiF,IADP;AAEIM,IAAAA,KAAK,EAALA,KAFJ;AAGIF,IAAAA,SAAS,EAATA,SAHJ;AAIIC,IAAAA,SAAS,EAATA;AAJJ;AAMH;SAEeG;AACZ,MAAIX,IAAI,GAAc,EAAtB;;AAEA,WAAS7H,IAAT,CAAeyI,QAAf;AACIZ,IAAAA,IAAI,CAAC7H,IAAL;AACImI,MAAAA,IAAI,EAAEO,IAAI,CAACC,GAAL;AADV,OAEOF,QAFP;AAIH;;AAED,WAASG,MAAT;AACI,WAAOhB,MAAM,CAACC,IAAD,EAAOA,IAAI,CAAC5L,MAAL,GAAc,CAArB,CAAb;AACH;;AAED,WAASyL,KAAT;AACIG,IAAAA,IAAI,GAAG,EAAP;AACH;;AAED,WAASgB,OAAT;AACI,WAAOhB,IAAP;AACH;;AAED,WAASiB,WAAT;AACI,QAAMC,KAAK,GAAGlB,IAAI,CAAC,CAAD,CAAlB;AACA,QAAMtD,IAAI,GAAGsD,IAAI,CAACA,IAAI,CAAC5L,MAAL,GAAc,CAAf,CAAjB;AAEA,WAAO8M,KAAK,GAAGxE,IAAI,CAAC4D,IAAL,GAAYY,KAAK,CAACZ,IAArB,GAA4B,CAAxC;AACH;;AAED,WAASa,SAAT;AACI,QAAMD,KAAK,GAAGlB,IAAI,CAAC,CAAD,CAAlB;AACA,QAAMtD,IAAI,GAAGsD,IAAI,CAACA,IAAI,CAAC5L,MAAL,GAAc,CAAf,CAAjB;AAEA,WAAO8M,KAAK,GAAG;AACXd,MAAAA,CAAC,EAAE1D,IAAI,CAAC0D,CAAL,GAASc,KAAK,CAACd,CADP;AAEXC,MAAAA,CAAC,EAAE3D,IAAI,CAAC2D,CAAL,GAASa,KAAK,CAACb;AAFP,KAAH,GAGR;AACAD,MAAAA,CAAC,EAAE,CADH;AAEAC,MAAAA,CAAC,EAAE;AAFH,KAHJ;AAOH;;AAED,SAAO;AACHY,IAAAA,WAAW,EAAXA,WADG;AAEHE,IAAAA,SAAS,EAATA,SAFG;AAGHH,IAAAA,OAAO,EAAPA,OAHG;AAIHD,IAAAA,MAAM,EAANA,MAJG;AAKHlB,IAAAA,KAAK,EAALA,KALG;AAMH1H,IAAAA,IAAI,EAAJA;AANG,GAAP;AAQH;;SCnIeiJ;AACZ,MAAMrK,KAAK,GAAU;AACjBsK,IAAAA,OAAO,EAAEV,OAAO,EADC;AAEjB/L,IAAAA,KAAK,EAAE,CAFU;AAGjB0M,IAAAA,cAAc,EAAE,CAHC;AAIjBnE,IAAAA,OAAO,EAAE,KAJQ;AAKjBoE,IAAAA,WAAW,EAAE,KALI;AAMjBC,IAAAA,UAAU,EAAE,KANK;AAOjBpE,IAAAA,UAAU,EAAE,CAPK;AAQjBqE,IAAAA,QAAQ,EAAE;AARO,GAArB;AAWA,SAAO1K,KAAP;AACH;;AC1BD,SAAS+J,GAAT;AACI,SAAOY,WAAW,GAAGA,WAAW,CAACZ,GAAZ,EAAH,GAAuBD,IAAI,CAACC,GAAL,EAAzC;AACH;;SAOea;AACZ,MAAMC,SAAS,GAAGC,qBAAqB,IAAIC,2BAAzB,IAAwDtG,UAA1E;AACA,MAAMuG,eAAe,GAAGC,oBAAoB,IAAIC,0BAAxB,IAAsD1G,YAA9E;AAEA,MAAI2G,SAAJ;AACA,MAAIC,EAAJ;;AAEA,WAASC,GAAT,CAAc5C,EAAd;AACI;AACA0C,IAAAA,SAAS,GAAGA,SAAS,KAAK,KAAK,CAAnB,GACNpB,GAAG,EADG,GAENoB,SAFN;AAKA;;AACAC,IAAAA,EAAE,GAAGP,SAAS,CAAC;AACX,UAAMS,SAAS,GAAGvB,GAAG,EAArB;AACA,UAAMrF,QAAQ,GAAG4G,SAAS,GAAWH,SAArC;AAEAA,MAAAA,SAAS,GAAGG,SAAZ;AACA7C,MAAAA,EAAE,CAAC/D,QAAD,CAAF;AACH,KANa,CAAd;AAOH;;AAED,WAAS6G,IAAT;AACIJ,IAAAA,SAAS,GAAGK,SAAZ;AACAR,IAAAA,eAAe,CAACI,EAAD,CAAf;AACH;;AAED,SAAO;AACHC,IAAAA,GAAG,EAAHA,GADG;AAEHE,IAAAA,IAAI,EAAJA;AAFG,GAAP;AAIH;;SCnCeE;AACZ,MAAMC,IAAI,GAAGd,IAAI,EAAjB;;AAEA,WAASS,GAAT,CAAcM,IAAd;AACID,IAAAA,IAAI,CAACL,GAAL,CAAS,UAAC3G,QAAD;AACL2G,MAAAA,GAAG,CAACM,IAAD,CAAH;AACAA,MAAAA,IAAI,CAACjH,QAAD,CAAJ;AACH,KAHD;AAIH;;AAED,WAAS6G,IAAT;AACIG,IAAAA,IAAI,CAACH,IAAL;AACH;;AAED,SAAO;AACHF,IAAAA,GAAG,EAAHA,GADG;AAEHE,IAAAA,IAAI,EAAJA;AAFG,GAAP;AAIH;;SCTeK,QACZnO,SACAM,KACAiC,OACA6L;MAGIC,aAMAD,WANAC;MACAC,aAKAF,WALAE;MACAC,SAIAH,WAJAG;MACAC,cAGAJ,WAHAI;MACAxK,UAEAoK,WAFApK;MACAyK,iBACAL,WADAK;AAEJ,MAAMC,SAAS,GAAGV,SAAS,EAA3B;;AAEA,WAASW,OAAT,CACIC,cADJ,EAEIC,eAFJ;QAIYhC,UAAYtK,MAAZsK;AAER6B,IAAAA,SAAS,CAACZ,IAAV;AACAjB,IAAAA,OAAO,CAACxB,KAAR;AACAwB,IAAAA,OAAO,CAAClJ,IAAR,CAAaiL,cAAb;AACAP,IAAAA,UAAU,CAACQ,eAAD,CAAV;AACAP,IAAAA,UAAU,CAACO,eAAD,CAAV;AACAtM,IAAAA,KAAK,CAACoG,OAAN,GAAgB,IAAhB;AAEA4F,IAAAA,MAAM;AACT;;AAED,WAASO,IAAT,CAAe1C,QAAf;QAEQS,UACAtK,MADAsK;QAGA9D,aAGA/I,QAHA+I;QACAC,aAEAhJ,QAFAgJ;QACA5J,eACAY,QADAZ;AAGJ,QAAI,CAACmD,KAAK,CAACoG,OAAP,IAAkBpG,KAAK,CAACwK,WAA5B,EAAyC;AAEzCF,IAAAA,OAAO,CAAClJ,IAAR,CAAayI,QAAb;AAEA,QAAMG,MAAM,GAAGM,OAAO,CAACN,MAAR,EAAf;AACA,QAAMwC,YAAY,GAAGlC,OAAO,CAACF,SAAR,EAArB;AAGA;;AACA,QAAI,CAACoC,YAAY,CAACnD,CAAd,IAAmB,CAACmD,YAAY,CAAClD,CAArC,EAAwC;;AAExC,QAAKzM,YAAY,IAAKmN,MAAM,CAACN,KAAP,GAAejD,UAAjC,IACI,CAAC5J,YAAD,IAAkB,KAAKmN,MAAM,CAACN,KAAb,GAAsBjD,UAD3C,IAEGzG,KAAK,CAACyK,UAFb,EAGE;AACE,UAAMgC,MAAM,GAAGzC,MAAM,CAACnN,YAAY,GAAG,GAAH,GAAS,GAAtB,CAAN,GAAmC2J,UAAlD;AAEAxG,MAAAA,KAAK,CAACyK,UAAN,GAAmB,IAAnB;AACAwB,MAAAA,WAAW,CAACQ,MAAD,CAAX;AACAT,MAAAA,MAAM;AACT,KATD,MASO;AACHhM,MAAAA,KAAK,CAACwK,WAAN,GAAoB,IAApB;AACAF,MAAAA,OAAO,CAACxB,KAAR;AACH;AACJ;;AAED,WAASyC,IAAT;QAEQ1N,QAEAmC,MAFAnC;QACAyM,UACAtK,MADAsK;QAGAoC,UACA3O,IADA2O;AAGJ1M,IAAAA,KAAK,CAACoG,OAAN,GAAgB,KAAhB;;AAEA,QAAI,CAAC3I,OAAO,CAACmJ,QAAT,IAAqB0D,OAAO,CAACL,OAAR,GAAkB5M,MAAlB,GAA2B,CAApD,EAAuD;AACnD,UAAM2I,QAAQ,GAAGsE,OAAO,CAACJ,WAAR,EAAjB;AACA,UAAMyC,KAAK,GAAGrC,OAAO,CAACF,SAAR,GAAoB3M,OAAO,CAACZ,YAAR,GAAuB,GAAvB,GAA6B,GAAjD,CAAd;AACA,UAAM+P,IAAI,GAAG5L,IAAI,CAACC,IAAL,CAAUD,IAAI,CAACsD,GAAL,CAASqI,KAAT,IAAkBD,OAAO,CAACG,OAApC,CAAb;AACA,UAAMC,cAAc,GAAGZ,cAAc,CAACS,KAAD,CAArC;;AAEA,UAAI3G,QAAQ,GAAGvI,OAAO,CAACwJ,YAAvB,EAAqC;AACjCxF,QAAAA,OAAO,CAAC5D,KAAK,GAAGiP,cAAc,IAAIH,KAAK,GAAG,CAAR,GAAY,CAAC,CAAb,GAAiB,CAArB,CAAvB,CAAP;AACH,OAFD,MAEO;AACH;AACAlL,QAAAA,OAAO,CAACkL,KAAK,GAAG,CAAR,GAAY9O,KAAK,GAAG+O,IAApB,GAA2B/O,KAAK,GAAG+O,IAApC,CAAP;AACH;;AAEDtC,MAAAA,OAAO,CAACxB,KAAR;AACAiD,MAAAA,UAAU;AACb,KAfD,MAeO;AACH,UAAM/B,MAAM,GAAGM,OAAO,CAACN,MAAR,EAAf;AAEA,UAAI+C,QAAQ,GAAG/C,MAAM,CAACvM,OAAO,CAACZ,YAAR,GAAuB,WAAvB,GAAqC,WAAtC,CAArB;AAEAsP,MAAAA,SAAS,CAACd,GAAV,CAAc,UAACrF,QAAD;AACV,YAAMyG,MAAM,GAAGM,QAAQ,GAAG/G,QAA1B;AAEA+G,QAAAA,QAAQ,IAAI,IAAZ;;AAEA,YAAI/L,IAAI,CAACsD,GAAL,CAASmI,MAAT,IAAmB,KAAvB,EAA8B;AAC1BN,UAAAA,SAAS,CAACZ,IAAV;AACAjB,UAAAA,OAAO,CAACxB,KAAR;AACAiD,UAAAA,UAAU;AACb,SAJD,MAIO;AACHE,UAAAA,WAAW,CAACQ,MAAD,CAAX;AACAT,UAAAA,MAAM,CAAC,CAAD,CAAN;AACH;AACJ,OAbD;AAcH;AACJ;;AAED,SAAO;AACHI,IAAAA,OAAO,EAAPA,OADG;AAEHG,IAAAA,IAAI,EAAJA,IAFG;AAGHhB,IAAAA,IAAI,EAAJA;AAHG,GAAP;AAKH;;SC3HeyB,OACZjP,KACAiC,OACAvC,SACAoO;MAGIoB,YACAlP,IADAkP;AAEJ,MAAMC,OAAO,GAAG,CACZ,OADY,EAEZ,QAFY,EAGZ,QAHY,EAIZ,UAJY,EAKZ,QALY,EAMZ,OANY,CAAhB;AAQA,MAAMC,OAAO,GAAGvB,OAAO,CAACnO,OAAD,EAAUM,GAAV,EAAeiC,KAAf,EAAsB6L,UAAtB,CAAvB;MAEIO,UAGAe,QAHAf;MACAG,OAEAY,QAFAZ;MACAhB,OACA4B,QADA5B;;AAGJ,WAAS6B,WAAT,CAAsB5L,CAAtB;AACI,QAAM6L,KAAK,GAAGJ,SAAS,GAAgBzL,CAAE,CAAC8L,cAAH,CAAkB,CAAlB,CAAhB,GAAmD9L,CAA1E;AAEA,WAAO;AACH6H,MAAAA,CAAC,EAAEgE,KAAK,CAACE,KADN;AAEHjE,MAAAA,CAAC,EAAE+D,KAAK,CAACG;AAFN,KAAP;AAIH;;AAED,WAASC,YAAT,CAAuBjM,CAAvB;AACI,SAAK,IAAI7B,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGlC,OAAO,CAAC0D,eAAR,CAAwB9D,MAA5C,EAAoDsC,CAAC,EAArD,EAAyD;AACrD,UAAIlC,OAAO,CAAC0D,eAAR,CAAwBxB,CAAxB,EAA2BrE,QAA3B,CAAoCkG,CAAC,CAACG,MAAtC,CAAJ,EAA2D;AAC9D;;QAGGsE,WACAlI,GAAG,CAACC,QADJiI;AAEJ,QAAMyH,oBAAoB,GAAIjQ,OAAO,CAACgK,wBAAR,IAAoCyF,OAAO,CAACxL,OAAR,CAA8BF,CAAC,CAACG,MAAF,CAAUgM,QAAxC,MAAsD,CAAC,CAA5F,IACtBlQ,OAAO,CAACiK,6BADf;AAGA,QAAIgG,oBAAoB,IAAI,CAACjQ,OAAO,CAACoJ,gBAArC,EAAuDrF,CAAC,CAACmD,cAAF;AAEvDyH,IAAAA,OAAO,CACHgB,WAAW,CAAC5L,CAAD,CADR,EAEH5E,YAAY,CAACqJ,QAAD,EAAWxI,OAAO,CAACZ,YAAnB,CAFT,CAAP;AAIH;;AAED,WAAS+Q,WAAT,CAAsBpM,CAAtB;AACI,QAAI/D,OAAO,CAACkK,wBAAZ,EAAsCnG,CAAC,CAACI,eAAF;AAEtC2K,IAAAA,IAAI,CAACa,WAAW,CAAC5L,CAAD,CAAZ,CAAJ;AACAxB,IAAAA,KAAK,CAACyK,UAAN,IAAoBjJ,CAAC,CAACmD,cAAF,EAApB;AACH;;AAED,WAASkJ,UAAT;AACItC,IAAAA,IAAI;AACP;;AAED,WAASuC,MAAT;QAEQnK,MACA5F,GAAG,CAACC,QADJ2F;;AAGJ,QAAIsJ,SAAJ,EAAe;AACXvR,MAAAA,cAAc,CAACiI,GAAD,EAAM,YAAN,EAAoB8J,YAApB,EAAkC;AAC5CM,QAAAA,OAAO,EAAEtQ,OAAO,CAACoJ,gBAD2B;AAE5CmH,QAAAA,OAAO,EAAE;AAFmC,OAAlC,CAAd;AAIAtS,MAAAA,cAAc,CAACiI,GAAD,EAAM,WAAN,EAAmBiK,WAAnB,CAAd;AACAlS,MAAAA,cAAc,CAACiI,GAAD,EAAM,UAAN,EAAkBkK,UAAlB,CAAd;AACAnS,MAAAA,cAAc,CAACiI,GAAD,EAAM,aAAN,EAAqBkK,UAArB,CAAd;AACH,KARD,MAQO;AACHnS,MAAAA,cAAc,CAACiI,GAAD,EAAM,WAAN,EAAmB8J,YAAnB,CAAd;AACA/R,MAAAA,cAAc,CAACgF,QAAD,EAAW,WAAX,EAAwBkN,WAAxB,CAAd;AACAlS,MAAAA,cAAc,CAACgF,QAAD,EAAW,SAAX,EAAsBmN,UAAtB,CAAd;AACH;AACJ;;AAED,WAASI,MAAT;QAEQtK,MACA5F,GAAG,CAACC,QADJ2F;AAGJ5H,IAAAA,cAAc,CAAC4H,GAAD,EAAM,YAAN,EAAoB8J,YAApB,CAAd;AACA1R,IAAAA,cAAc,CAAC4H,GAAD,EAAM,WAAN,EAAmBiK,WAAnB,CAAd;AACA7R,IAAAA,cAAc,CAAC4H,GAAD,EAAM,UAAN,EAAkBkK,UAAlB,CAAd;AACA9R,IAAAA,cAAc,CAAC4H,GAAD,EAAM,aAAN,EAAqBkK,UAArB,CAAd;AACA9R,IAAAA,cAAc,CAAC4H,GAAD,EAAM,WAAN,EAAmB8J,YAAnB,CAAd;AACA1R,IAAAA,cAAc,CAAC2E,QAAD,EAAW,WAAX,EAAwBkN,WAAxB,CAAd;AACA7R,IAAAA,cAAc,CAAC2E,QAAD,EAAW,SAAX,EAAsBmN,UAAtB,CAAd;AACH;;AAED,SAAO;AACHC,IAAAA,MAAM,EAANA,MADG;AAEHG,IAAAA,MAAM,EAANA;AAFG,GAAP;AAIH;;SC1GeC,QACZzQ,SACAO;MAGI2F,MACA3F,QADA2F;AAEJ,MAAMwK,QAAQ,GAAG1Q,OAAO,CAACZ,YAAR,GAAuB8G,GAAG,CAACyK,WAA3B,GAAyCzK,GAAG,CAAC0K,YAA9D;AACA,MAAMC,SAAS,GAAG,CAACH,QAAQ,GAAInN,IAAI,CAACC,IAAL,CAAUxD,OAAO,CAACyD,aAAR,GAAwB,CAAlC,CAAD,GAAyCzD,OAAO,CAACyJ,YAA7D,IAA6EzJ,OAAO,CAACyD,aAAvG;AACA,MAAM2L,OAAO,GAAGyB,SAAS,GAAG7Q,OAAO,CAACyJ,YAApC;AAEA,SAAO;AACH2F,IAAAA,OAAO,EAAPA,OADG;AAEHsB,IAAAA,QAAQ,EAARA,QAFG;AAGHG,IAAAA,SAAS,EAATA;AAHG,GAAP;AAKH;;SCXeC,UACZ9Q;AAEA,MAAIA,OAAO,CAAC6H,IAAZ,EAAkB;AACd;AACA;AACA;AACA,WAAOtE,IAAI,CAACC,IAAL,CAAUxD,OAAO,CAACyD,aAAlB,CAAP;AACH;;AACD,SAAO,CAAP;AACH;SAEesN,WACZxQ,SACA0O,SACAjP;MAGIQ,QACAD,QADAC;MAGAkQ,WAGAzB,QAHAyB;MACAG,YAEA5B,QAFA4B;MACAzB,UACAH,QADAG;AAEJ,MAAM4B,MAAM,GAAGF,SAAS,CAAC9Q,OAAD,CAAxB;AACA,MAAMiR,MAAM,GAAGD,MAAM,GAAG5B,OAAxB;AACA,MAAM8B,IAAI,GAAG,CAACD,MAAD,IAAWjR,OAAO,CAAC0J,cAAR,GAClB,CAACgH,QAAQ,GAAGG,SAAZ,IAAyB,CADP,GAElB,CAFO,CAAb;;AAIA,MAAMM,GAAG,GAAGD,IAAZ;AACA,MAAME,GAAG,GAAGpR,OAAO,CAACyJ,YAAR,IAAwBzJ,OAAO,CAAC6H,IAAR,GAAegJ,SAAf,GAA2BH,QAAnD,IAA+DQ,IAA/D,GAAsE9B,OAAO,GAAG5O,KAAK,CAACZ,MAAlG;AACA,MAAMyR,QAAQ,GAAG,CAAjB;AACA,MAAMC,QAAQ,GAAG9Q,KAAK,CAACZ,MAAN,IAAiBI,OAAO,CAAC0J,cAAR,IAA0B1J,OAAO,CAAC6H,IAAnC,GAC3B,CAD2B,GAE3BtE,IAAI,CAACC,IAAL,CAAUxD,OAAO,CAACyD,aAAlB,CAFW,CAAjB;AAIA,MAAM8N,UAAU,GAAG;AACfJ,IAAAA,GAAG,EAAHA,GADe;AAEfC,IAAAA,GAAG,EAAHA,GAFe;AAGfF,IAAAA,IAAI,EAAJA,IAHe;AAIfF,IAAAA,MAAM,EAANA,MAJe;AAKfC,IAAAA,MAAM,EAANA,MALe;AAMfI,IAAAA,QAAQ,EAARA,QANe;AAOfC,IAAAA,QAAQ,EAARA;AAPe,GAAnB;AAUA,SAAOC,UAAP;AACH;;SC3CeC,IACZC,MACAzR;AAEA,MAAMM,GAAG,GAAQ,EAAjB;;AAEA,WAASoR,MAAT,CAAiBnR,OAAjB;AACI,QAAM0O,OAAO,GAAGwB,OAAO,CACnBzQ,OADmB,EAEnBO,OAFmB,CAAvB;AAIA,QAAMgR,UAAU,GAAGR,UAAU,CACzBxQ,OADyB,EAEzB0O,OAFyB,EAGzBjP,OAHyB,CAA7B;AAKA,QAAMwP,SAAS,GAAGmC,OAAO,CACrB,kBAAkBrM,MAAlB,IACGsM,SAAS,CAACC,cAAV,GAA2B,CAD9B,IAEGD,SAAS,CAACE,gBAAV,GAA6B,CAFhC,IAGGxM,MAAM,CAACyM,aAAP,IAAwB9O,QAAQ,YAAY8O,aAJ1B,CAAzB;AAOAhT,IAAAA,MAAM,CAAC8D,MAAP,CAAcvC,GAAd,EAAmB;AACfkP,MAAAA,SAAS,EAATA,SADe;AAEfjP,MAAAA,OAAO,EAAPA,OAFe;AAGf0O,MAAAA,OAAO,EAAPA,OAHe;AAIfsC,MAAAA,UAAU,EAAVA;AAJe,KAAnB;AAMH;;AAEDjR,EAAAA,GAAG,CAACoR,MAAJ,GAAaA,MAAb;AAEAA,EAAAA,MAAM,CAACD,IAAD,CAAN;AAEA,SAAOnR,GAAP;AACH;;ACjDD,IAAM0R,UAAU,GAAG,qBAAnB;AACA,IAAMC,SAAS,GAAG,aAAlB;SAcgBC,SACZ5R,KACAN;AAEA,WAASmS,UAAT,CAAqB5P,KAArB;QAEQiG,WACAlI,GAAG,CAACC,QADJiI;QAGApI,QACAmC,MADAnC;AAGJoI,IAAAA,QAAQ,CAAC4J,gBAAT,OAA8BH,SAA9B,QAA4CvU,OAA5C,CAAoD,UAAA2C,MAAM;AACtD;AACA,UAAMgS,SAAS,GAAG,CAAC,CAAShS,MAAM,CAACyB,YAAP,CAAoBmQ,SAApB,CAA5B;AAEAlU,MAAAA,WAAW,CAAcsC,MAAd,EAAsB,CAC7BL,OAAO,CAAC2J,cADqB,EAE7B3J,OAAO,CAAC4J,cAFqB,EAG7B5J,OAAO,CAAC6J,gBAHqB,CAAtB,CAAX;;AAMA,UAAIwI,SAAS,KAAKjS,KAAlB,EAAyB;AACrB/C,QAAAA,QAAQ,CAAcgD,MAAd,EAAsBL,OAAO,CAAC6J,gBAA9B,CAAR;AACH;;AACD,UAAIwI,SAAS,KAAKjS,KAAK,GAAG,CAA1B,EAA6B;AACzB/C,QAAAA,QAAQ,CAAcgD,MAAd,EAAsBL,OAAO,CAAC2J,cAA9B,CAAR;AACH;;AACD,UAAI0I,SAAS,KAAKjS,KAAK,GAAG,CAA1B,EAA6B;AACzB/C,QAAAA,QAAQ,CAAcgD,MAAd,EAAsBL,OAAO,CAAC4J,cAA9B,CAAR;AACH;AACJ,KAnBD;AAoBH;;AAED,WAAS2E,MAAT,CACIhM,KADJ,EAEIgG,QAFJ,EAGIyC,EAHJ,EAIIsH,KAJJ;QAOQ9J,WACAlI,GAAG,CAACC,QADJiI;AAEJ,QAAM+J,MAAM,GAAGhK,QAAQ,KAAKwF,SAAb,GAAyB/N,OAAO,CAACuJ,KAAjC,GAAyChB,QAAxD;AAEAvI,IAAAA,OAAO,CAACmK,UAAR,CAAmB7B,SAAnB,CAA6B/F,KAA7B,EAAoCjC,GAApC,EAAyCN,OAAzC,EAAkDuS,MAAlD;;AAGA,QAAI,CAAChQ,KAAK,CAACoG,OAAX,EAAoBwJ,UAAU,CAAC5P,KAAD,CAAV;AAEpB+P,IAAAA,KAAK,IAAIpT,gBAAgB,CAACsJ,QAAD,CAAhB,CAA2BlJ,SAApC;AACA0L,IAAAA,EAAE,IAAIhE,UAAU,CAACgE,EAAD,EAAKuH,MAAL,CAAhB;AACH;;AAED,WAASC,gBAAT;AACI,QAAI,CAACxS,OAAO,CAAC6H,IAAb,EAAmB;QAGftH,UAEAD,IAFAC;QACAgR,aACAjR,IADAiR;QAGA/Q,QAEAD,QAFAC;QACAgI,WACAjI,QADAiI;QAGAwI,SACAO,WADAP;AAEJ,QAAMyB,eAAe,GAAGjS,KAAK,CAACX,KAAN,CAAY,CAACmR,MAAb,EACnBvR,GADmB,CACf,UAAAY,MAAM;AAAA,aAAiBA,MAAM,CAACqS,SAAP,CAAiB,IAAjB,CAAjB;AAAA,KADS,CAAxB;AAEA,QAAMC,gBAAgB,GAAGnS,KAAK,CAACX,KAAN,CAAY,CAAZ,EAAemR,MAAf,EACpBvR,GADoB,CAChB,UAAAY,MAAM;AAAA,aAAiBA,MAAM,CAACqS,SAAP,CAAiB,IAAjB,CAAjB;AAAA,KADU,CAAzB;AAGAD,IAAAA,eAAe,CAAC/U,OAAhB,CAAwB,UAACkV,YAAD,EAAexS,KAAf;AACpBoI,MAAAA,QAAQ,CAAC1E,WAAT,CAAqBtF,OAAO,CAACmU,gBAAgB,CAACvS,KAAD,CAAjB,EAA0B4R,UAA1B,CAA5B;AACAxJ,MAAAA,QAAQ,CAACqK,YAAT,CAAsBrU,OAAO,CAACiU,eAAe,CAACrS,KAAD,CAAhB,EAAyB4R,UAAzB,CAA7B,EAAmExR,KAAK,CAAC,CAAD,CAAxE;AACH,KAHD;AAIH;;AAED,WAASsS,iBAAT;AACIxS,IAAAA,GAAG,CAACC,OAAJ,CAAYiI,QAAZ,CACK4J,gBADL,OAC0BJ,UAD1B,QAEKtU,OAFL,CAEa,UAAA8D,IAAI;AAAA,aAAIlB,GAAG,CAACC,OAAJ,CAAYiI,QAAZ,CAAqB7G,WAArB,CAAiCH,IAAjC,CAAJ;AAAA,KAFjB;AAGH;;AAED,WAASuR,SAAT;AACIzS,IAAAA,GAAG,CAACC,OAAJ,CAAYC,KAAZ,CAAkB9C,OAAlB,CAA0B,UAACJ,EAAD,EAAK8C,KAAL;AAAA,aAAe5B,OAAO,CAAClB,EAAD,EAAK2U,SAAL,EAAqB7R,KAArB,CAAtB;AAAA,KAA1B;AAEA0S,IAAAA,iBAAiB;AACjBN,IAAAA,gBAAgB;AACnB;;AAED,WAASQ,UAAT;;;QAEQzS,UAEAD,IAFAC;QACA0O,UACA3O,IADA2O;QAGAzG,WACAjI,QADAiI;AAEJ,QAAMC,YAAY,GAAG;AACjB3D,MAAAA,OAAO,EAAE,MADQ;AAEjBmO,MAAAA,UAAU,EAAE,WAFK;AAGjBC,MAAAA,aAAa,EAAElT,OAAO,CAACZ,YAAR,GAAuB,KAAvB,GAA+B;AAH7B,KAArB;AAKA,QAAM+T,SAAS,gCACVnT,OAAO,CAACZ,YAAR,GAAuB,OAAvB,GAAiC,QADvB,IACqC6P,OAAO,CAAC4B,SAD7C,oBAEV7Q,OAAO,CAACZ,YAAR,GAAuB,cAAvB,GAAwC,eAF9B,IAEmDY,OAAO,CAACyJ,YAF3D,oBAAf;AAKA7K,IAAAA,QAAQ,CAAC4J,QAAD,EAAWC,YAAX,CAAR;AACAD,IAAAA,QAAQ,CAAC4J,gBAAT,OAA8BH,SAA9B,QACKvU,OADL,CACa,UAAA2C,MAAM;AAAA,aAAIzB,QAAQ,CAAcyB,MAAd,EAAsB8S,SAAtB,CAAZ;AAAA,KADnB;AAEH;;AAED,WAASC,IAAT;AACIL,IAAAA,SAAS;AACTC,IAAAA,UAAU;AACb;;AAED,WAASK,OAAT;uBAIQ/S,GAAG,CAACC;QAFJC,qBAAAA;QACAgI,wBAAAA;AAEJ,QAAM7I,GAAG,GAAG,CAAC,SAAD,EAAY,aAAZ,EAA2B,gBAA3B,CAAZ;AACA,QAAM2T,QAAQ,GAAGtT,OAAO,CAACZ,YAAR,GAAuB,cAAvB,GAAwC,eAAzD;AAEAO,IAAAA,GAAG,CAACjC,OAAJ,CAAY,UAAC6V,YAAD;AACR/K,MAAAA,QAAQ,CAAC3J,KAAT,CAAe2U,cAAf,CAA8BD,YAA9B;AACH,KAFD;AAGA/S,IAAAA,KAAK,CAAC9C,OAAN,CAAc,UAAA2C,MAAM;AAAA,aAAIA,MAAM,CAACxB,KAAP,CAAa2U,cAAb,CAA4BF,QAA5B,CAAJ;AAAA,KAApB;AACAR,IAAAA,iBAAiB;AACpB;;AAED,SAAO;AACHM,IAAAA,IAAI,EAAJA,IADG;AAEH7E,IAAAA,MAAM,EAANA,MAFG;AAGH8E,IAAAA,OAAO,EAAPA,OAHG;AAIHL,IAAAA,UAAU,EAAVA;AAJG,GAAP;AAMH;;SC9IeS,kBACZnE,UACAhQ,WACAU,SACAuR;AAEA,SAAOjC,QAAQ,GAAG,CAAX,IAAgBhQ,SAAS,GAAIiS,UAAU,CAACJ,GAAxC,IACA7B,QAAQ,GAAG,CAAX,IAAgBhQ,SAAS,GAAIiS,UAAU,CAACH,GAD/C;AAEH;AAED;;;;;;;;;SAQgBsC,UACZpU,WACAU,SACAuR;AAEA,MAAMoC,UAAU,GAAGrU,SAAS,GAAGiS,UAAU,CAACJ,GAA1C;AACA,MAAMyC,WAAW,GAAGtU,SAAS,GAAGiS,UAAU,CAACH,GAA3C;AAEA,SAAOuC,UAAU,GAAG,CAAb,GACDA,UADC,GAEDC,WAAW,GAAG,CAAd,GACIA,WADJ,GAEI,CAJV;AAKH;SAEeC,WACZvT,KACAiC,OACAvC,SACA8T,UACAC;AAEA,WAAStF,cAAT,CAAyBO,MAAzB;QAEQC,UACA3O,IADA2O;AAEJ,WAAO1L,IAAI,CAACC,IAAL,CAAUD,IAAI,CAACsD,GAAL,CAASmI,MAAT,IAAmBC,OAAO,CAACG,OAA3B,GAAqCpP,OAAO,CAACiJ,eAAvD,CAAP;AACH;;AAED,WAASsF,MAAT,CACIhG,QADJ,EAEIyC,EAFJ,EAGIsH,KAHJ;AAKIwB,IAAAA,QAAQ,CAACvF,MAAT,CACIhM,KADJ,EAEIgG,QAFJ,EAGIyC,EAHJ,EAIIsH,KAJJ;AAMH;;AAED,WAAShT,SAAT,CAAoB4P,KAApB;0BAIQ5O,GAAG,CAACiR;QAFJH,sBAAAA;QACAD,sBAAAA;AAEJ,QAAM6C,UAAU,GAAG7C,GAAG,GAAGC,GAAN,IAAapR,OAAO,CAAC6H,IAAR,GAAevH,GAAG,CAAC2O,OAAJ,CAAYG,OAA3B,GAAqC,CAAlD,CAAnB;AACA,QAAM6E,GAAG,GAAGD,UAAU,GAAG,CAAzB;AAEA,QAAI/G,QAAJ;AAEA1K,IAAAA,KAAK,CAACqG,UAAN,GAAmBsG,KAAnB;;AAEA,QAAIlP,OAAO,CAAC6H,IAAZ,EAAkB;AACdoF,MAAAA,QAAQ,GAAG,CAACkE,GAAG,GAAGjC,KAAP,IAAgB+E,GAAhB,GAAsBD,UAAjC;AAEAzR,MAAAA,KAAK,CAAC0K,QAAN,GAAiBA,QAAQ,GAAG,CAAX,GACX,IAAIA,QADO,GAEXA,QAAQ,GAAG,CAAX,GACIA,QAAQ,GAAG,CADf,GAEIA,QAJV;AAKH,KARD,MAQO;AACHA,MAAAA,QAAQ,GAAG,CAACkE,GAAG,GAAGjC,KAAP,IAAgB8E,UAA3B;AAEAzR,MAAAA,KAAK,CAAC0K,QAAN,GAAiBA,QAAQ,GAAG,CAAX,GACX,CADW,GAEXA,QAAQ,GAAG,CAAX,GACI,CADJ,GAEIA,QAJV;AAKH;;AAED8G,IAAAA,QAAQ,CAAC5I,IAAT,CAAcb,WAAW,CAACI,MAA1B,eACOnI,KADP;AAGH;;AAED,WAASyB,OAAT,CACIkQ,WADJ,EAEI3L,QAFJ;QAKQ0G,UAEA3O,IAFA2O;QACAsC,aACAjR,IADAiR;AAEJ,QAAM0C,GAAG,GAAG1C,UAAU,CAACD,QAAX,GAAsBC,UAAU,CAACF,QAAjC,GAA4C,CAAxD;AACA,QAAM8C,aAAa,GAAGnU,OAAO,CAAC6H,IAAR,GAChB,CAACqM,WAAW,GAAGD,GAAd,GAAoBA,GAArB,IAA4BA,GADZ,GAEhBC,WAAW,GAAG3C,UAAU,CAACD,QAAzB,GACIC,UAAU,CAACD,QADf,GAEI4C,WAAW,GAAG3C,UAAU,CAACF,QAAzB,GACIE,UAAU,CAACF,QADf,GAEI6C,WANd;AAOA,QAAMlF,MAAM,GAAG,CAACmF,aAAD,GAAiBlF,OAAO,CAACG,OAAzB,GAAmCmC,UAAU,CAACL,IAA7D;;AAGA,QAAI3O,KAAK,CAACnC,KAAN,KAAgB+T,aAAhB,IACG1F,cAAc,CAACO,MAAM,GAAGzM,KAAK,CAACqG,UAAhB,CAAd,KAA8C,CADjD,IAEG5I,OAAO,CAAC6H,IAFf,EAGE;AACE,UAAMuM,MAAM,GAAGV,SAAS,CAACnR,KAAK,CAACqG,UAAP,EAAmB5I,OAAnB,EAA4BuR,UAA5B,CAAxB;AAEAjS,MAAAA,SAAS,CAAC8U,MAAM,GAAG,CAAT,GACJ7C,UAAU,CAACH,GAAX,GAAiBnC,OAAO,CAACG,OAAzB,GAAmCgF,MAD/B,GAEJ7C,UAAU,CAACJ,GAAX,GAAiBlC,OAAO,CAACG,OAAzB,GAAmCgF,MAFhC,CAAT,CAHF;;AAQE7F,MAAAA,MAAM,CAAC,CAAD,EAAIR,SAAJ,EAAe,IAAf,CAAN;AACH;;AAEDgG,IAAAA,QAAQ,CAAC5I,IAAT,CAAcb,WAAW,CAACG,YAA1B,EACIlI,KAAK,CAACnC,KADV,EAEImC,KAFJ,EAGI4R,aAHJ;AAIA5R,IAAAA,KAAK,CAACnC,KAAN,GAAc+T,aAAd;AACA7U,IAAAA,SAAS,CAAC0P,MAAD,CAAT;AACAT,IAAAA,MAAM,CAAChG,QAAD,EAAW;AACbwL,MAAAA,QAAQ,CAAC5I,IAAT,CAAcb,WAAW,CAACK,WAA1B,EACIwJ,aADJ,EAEI5R,KAFJ;AAGH,KAJK,CAAN;AAKH;;AAED,WAASiM,WAAT,CAAsB6F,EAAtB;QAEQzL,aACArG,MADAqG;QAGAqG,UAEA3O,IAFA2O;QACAsC,aACAjR,IADAiR;AAEJ,QAAM+C,KAAK,GAAGC,MAAM,CAACF,EAAE,CAACG,aAAH,GAAmBhV,KAAnB,CAAyB,GAAzB,EAA8B,CAA9B,CAAD,CAApB;AACA,QAAMwR,MAAM,GAAGsD,KAAK,IAAI,CAAT,GAAa/Q,IAAI,CAACkR,GAAL,CAAS,EAAT,EAAa,EAAEH,KAAK,GAAG,CAAV,CAAb,CAAb,GAA0C,CAAzD;AAEA,QAAII,YAAY,GAAG9L,UAAnB;;AAGA,QAAI5I,OAAO,CAACqJ,UAAR,IAAsB,CAACrJ,OAAO,CAAC6H,IAAnC,EAAyC;AACrC,UAAIwM,EAAE,GAAG,CAAL,IAAUzL,UAAU,IAAI2I,UAAU,CAACJ,GAAvC,EAA4C;AACxCkD,QAAAA,EAAE,IAAI,SAACA,EAAE,GAAGrD,MAAN,EAAiBhR,OAAO,CAACsJ,eAAzB,IAA2C0H,MAAjD;AACH,OAFD,MAEO,IAAIqD,EAAE,GAAG,CAAL,IAAUzL,UAAU,IAAI2I,UAAU,CAACH,GAAvC,EAA4C;AAC/CiD,QAAAA,EAAE,IAAI,SAAE,CAACA,EAAD,GAAMrD,MAAR,EAAmBhR,OAAO,CAACsJ,eAA3B,IAA8C0H,MAApD;AACH;AACJ;;AAED0D,IAAAA,YAAY,IAAIL,EAAhB;;AAEA,QAAIrU,OAAO,CAAC6H,IAAZ,EAAkB;AACd,UAAM0E,MAAM,GAAGhK,KAAK,CAACsK,OAAN,CAAcN,MAAd,EAAf;AACA,UAAM+C,QAAQ,GAAGtP,OAAO,CAACZ,YAAR,GAAuBmN,MAAM,CAACR,SAA9B,GAA0CQ,MAAM,CAACP,SAAlE;AACA,UAAMoI,MAAM,GAAGV,SAAS,CAAC9K,UAAD,EAAa5I,OAAb,EAAsBuR,UAAtB,CAAxB;;AAEA,UAAI6C,MAAM,IAAIX,iBAAiB,CAC3BnE,QAD2B,EAE3B1G,UAF2B,EAG3B5I,OAH2B,EAI3BuR,UAJ2B,CAA/B,EAKG;AACCmD,QAAAA,YAAY,GAAGN,MAAM,GAAG,CAAT,GACT7C,UAAU,CAACH,GAAX,GAAiBnC,OAAO,CAACG,OAAzB,GAAmCgF,MAD1B,GAET7C,UAAU,CAACJ,GAAX,GAAiBlC,OAAO,CAACG,OAAzB,GAAmCgF,MAFzC;AAGH;AACJ;;AAED9U,IAAAA,SAAS,CAACoV,YAAD,CAAT;AACH;;AAED,WAASpG,UAAT,CAAqBxB,cAArB;QAAqBA;AAAAA,MAAAA,iBAAiB;;;AAClCvK,IAAAA,KAAK,CAACuK,cAAN,GAAuBA,cAAvB;AACAvK,IAAAA,KAAK,CAACoG,OAAN,GAAgB,KAAhB;AACApG,IAAAA,KAAK,CAACwK,WAAN,GAAoB,KAApB;AACAxK,IAAAA,KAAK,CAACyK,UAAN,GAAmB,KAAnB;AACH;;AAED,WAASqB,UAAT,CAAqBQ,eAArB;AACIvP,IAAAA,SAAS,CAACuP,eAAD,CAAT;AACH;;AAED,WAAS6C,MAAT;AACI1N,IAAAA,OAAO,CAACzB,KAAK,CAACnC,KAAP,EAAc,CAAd,CAAP;AACA0T,IAAAA,QAAQ,CAACd,UAAT;AACH;;AAED,SAAO;AACHtB,IAAAA,MAAM,EAANA,MADG;AAEHnD,IAAAA,MAAM,EAANA,MAFG;AAGHjP,IAAAA,SAAS,EAATA,SAHG;AAIH0E,IAAAA,OAAO,EAAPA,OAJG;AAKHwK,IAAAA,WAAW,EAAXA,WALG;AAMHF,IAAAA,UAAU,EAAVA,UANG;AAOHD,IAAAA,UAAU,EAAVA,UAPG;AAQHI,IAAAA,cAAc,EAAdA;AARG,GAAP;AAUH;;SChOekG,QACZrX,IACA0C;AAEA,MAAMkG,GAAG,GAAiB,OAAO5I,EAAP,KAAc,QAAd,GAAyB2F,QAAQ,CAACC,IAAT,CAAcC,aAAd,CAA4B7F,EAA5B,CAAzB,GAA2DA,EAArF;AACA,MAAMkL,QAAQ,GAAgBtC,GAAI,CAAC/C,aAAL,OAAuBnD,OAAO,CAAC+J,YAA/B,CAA9B;AACA,MAAMvJ,KAAK,GAAG,GAAGX,KAAH,CAASa,IAAT,CAAcwF,GAAI,CAACvF,sBAAL,CAA4BX,OAAO,CAAC8J,UAApC,CAAd,CAAd;AAEA,SAAO;AACH5D,IAAAA,GAAG,EAAHA,GADG;AAEHsC,IAAAA,QAAQ,EAARA,QAFG;AAGHhI,IAAAA,KAAK,EAALA;AAHG,GAAP;AAKH;;ICOKoU,MAAM,GAAoB,SAA1BA,MAA0B,CAC5BtX,EAD4B,EAE5B+M,WAF4B;AAI5B,MAAMrK,OAAO,GAAGoK,eAAe,CAACC,WAAD,CAA/B;AACA,MAAM0J,QAAQ,GAAGjJ,QAAQ,EAAzB;AACA,MAAMvK,OAAO,GAAGoU,OAAO,CACnBrX,EADmB,EAEnB0C,OAFmB,CAAvB;AAIA,MAAMM,GAAG,GAAGkR,GAAG,CAACjR,OAAD,EAAUP,OAAV,CAAf;AACA,MAAMuC,KAAK,GAAGqK,KAAK,EAAnB;MAEIzK,KAGA4R,SAHA5R;MACA8I,MAEA8I,SAFA9I;MACAE,OACA4I,SADA5I;AAEJ,MAAMpL,QAAQ,GAAG;AACboC,IAAAA,EAAE,EAAFA,EADa;AAEb8I,IAAAA,GAAG,EAAHA,GAFa;AAGb3K,IAAAA,GAAG,EAAHA,GAHa;AAIbiC,IAAAA,KAAK,EAALA,KAJa;AAKbvC,IAAAA,OAAO,EAAPA;AALa,GAAjB;AAQA,GAACA,OAAO,CAAC6U,OAAR,IAAmBD,MAAM,CAACC,OAA1B,IAAqC,EAAtC,EACKnX,OADL,CACa,UAACoX,MAAD;AAAA,WAA0BA,MAAM,CACrC/U,QADqC,EAErCC,OAFqC,CAAhC;AAAA,GADb;AAMAmL,EAAAA,IAAI,CAACb,WAAW,CAACC,WAAb,EAA0BxK,QAA1B,CAAJ;;AAGA,MAAM+T,QAAQ,GAAG5B,QAAQ,CACrB5R,GADqB,EAErBN,OAFqB,CAAzB;AAIA,MAAMoO,UAAU,GAAGyF,UAAU,CACzBvT,GADyB,EAEzBiC,KAFyB,EAGzBvC,OAHyB,EAIzB8T,QAJyB,EAKzBC,QALyB,CAA7B;AAOA,MAAMgB,MAAM,GAAGxF,MAAM,CACjBjP,GADiB,EAEjBiC,KAFiB,EAGjBvC,OAHiB,EAIjBoO,UAJiB,CAArB;;AAOA,WAASiF,OAAT;AACIlI,IAAAA,IAAI,CAACb,WAAW,CAACM,cAAb,EAA6B7K,QAA7B,CAAJ;AACAgV,IAAAA,MAAM,CAACvE,MAAP;AACAsD,IAAAA,QAAQ,CAACT,OAAT;AACAU,IAAAA,QAAQ,CAAC1I,KAAT;AACAF,IAAAA,IAAI,CAACb,WAAW,CAACO,aAAb,EAA4B9K,QAA5B,CAAJ;AACH;;AAED,WAASiT,UAAT;AACI1S,IAAAA,GAAG,CAACoR,MAAJ,CAAWiD,OAAO,CACdrX,EADc,EAEd0C,OAFc,CAAlB;AAIAoO,IAAAA,UAAU,CAACsD,MAAX;AACH;;AAED,WAASA,MAAT;AACIoC,IAAAA,QAAQ,CAACT,OAAT;AACA/S,IAAAA,GAAG,CAACoR,MAAJ,CAAWiD,OAAO,CACdrX,EADc,EAEd0C,OAFc,CAAlB;AAIA8T,IAAAA,QAAQ,CAACV,IAAT;AACAhF,IAAAA,UAAU,CAACsD,MAAX;AACH;;MAGG1N,UACAoK,WADApK;AAGJjF,EAAAA,MAAM,CAAC8D,MAAP,CAAc9C,QAAd,EAAwB;AACpB2R,IAAAA,MAAM,EAANA,MADoB;AAEpB2B,IAAAA,OAAO,EAAPA,OAFoB;AAGpBrP,IAAAA,OAAO,EAAPA,OAHoB;AAIpBgP,IAAAA,UAAU,EAAVA;AAJoB,GAAxB;AAOAc,EAAAA,QAAQ,CAACV,IAAT;AACA2B,EAAAA,MAAM,CAAC1E,MAAP;AACArM,EAAAA,OAAO,CACHhE,OAAO,CAACkJ,YADL,EAEH,CAFG,CAAP;AAIAiC,EAAAA,IAAI,CAACb,WAAW,CAACE,UAAb,EAAyBzK,QAAzB,CAAJ;AAEA,SAAOA,QAAP;AACH;;AAED6U,MAAM,CAACI,GAAP,GAAa,UAACH,OAAD;AACTD,EAAAA,MAAM,CAACC,OAAP,GAAiBA,OAAjB;AACH,CAFD;;;;;"} \ No newline at end of file diff --git a/packages/tiny-swiper/lib/modules/navigation.js b/packages/tiny-swiper/lib/modules/navigation.js new file mode 100644 index 0000000..844780e --- /dev/null +++ b/packages/tiny-swiper/lib/modules/navigation.js @@ -0,0 +1,140 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SwiperPluginNavigation = factory()); +}(this, (function () { 'use strict'; + + function attachListener(el, evtName, handler, opts) { + el.addEventListener(evtName, handler, opts); + } + function detachListener(el, evtName, handler) { + el.removeEventListener(evtName, handler); + } + + function SwiperPluginNavigation(instance, options) { + var navigation = { + nextEl: null, + prevEl: null + }; + + var nextClickHandler = function nextClickHandler(e) { + clickHandler(e.target, 'next'); + }; + + var prevClickHandler = function prevClickHandler(e) { + clickHandler(e.target, 'prev'); + }; + + var clickHandler = function clickHandler(e, type) { + if (checkIsDisable(e) && !instance.options.loop) { + return; + } + + var index = instance.state.index; + var $list = instance.env.element.$list; + var currentIdx = index; + + if (type === 'next') { + if (index < $list.length - 1) { + instance.slideTo(index + 1); + } + + if (currentIdx > $list.length) { + currentIdx = index; + } + + currentIdx++; + } + + if (type === 'prev') { + if (index > 0) { + instance.slideTo(index - 1); + } + + if (currentIdx < -1) { + currentIdx = index; + } + + currentIdx--; + } + + console.log(instance.options.loop, currentIdx, type); + checkSwiperDisabledClass(currentIdx, $list.length - 1, type); + }; + + var checkSwiperDisabledClass = function checkSwiperDisabledClass(index, last, type) { + var target = type === 'prev' ? -1 : last + 1; + var slideToNum = type === 'prev' ? last : 0; + + if (navigation.nextEl.classList.contains(options.navigation.disabledClass) && type === 'prev') { + navigation.nextEl.classList.remove(options.navigation.disabledClass); + } + + if (navigation.prevEl.classList.contains(options.navigation.disabledClass) && type === 'next') { + navigation.prevEl.classList.remove(options.navigation.disabledClass); + } + + if (instance.options.loop) { + if (index === target) { + instance.slideTo(slideToNum); + } + } else { + if (instance.state.index === 0) { + navigation.prevEl.classList.add(options.navigation.disabledClass); + } + + if (instance.state.index === last) { + navigation.nextEl.classList.add(options.navigation.disabledClass); + } + } + }; + + var checkIsDisable = function checkIsDisable(e) { + if (e.classList.contains(options.navigation.disabledClass)) { + return true; + } + + return false; + }; + + var checkButtonDefaultStatus = function checkButtonDefaultStatus() { + var index = instance.state.index; + var $list = instance.env.element.$list; + + if (index === 0 && !instance.options.loop) { + navigation.prevEl.classList.add(options.navigation.disabledClass); + } + + if ($list.length === 1 && !instance.options.loop) { + navigation.nextEl.classList.add(options.navigation.disabledClass); + } + }; + + instance.on('before-init', function () { + if (options.navigation) { + options.navigation = Object.assign({ + disabledClass: 'swiper-button-disabled' + }, options.navigation); + } + }); + instance.on('after-init', function () { + if (!options.navigation) return; + navigation.nextEl = typeof options.navigation.nextEl === 'string' ? document.body.querySelector(options.navigation.nextEl) : options.navigation.nextEl; + navigation.prevEl = typeof options.navigation.prevEl === 'string' ? document.body.querySelector(options.navigation.prevEl) : options.navigation.prevEl; + checkButtonDefaultStatus(); + attachListener(navigation.nextEl, 'click', nextClickHandler); + attachListener(navigation.prevEl, 'click', prevClickHandler); + }); + instance.on('after-destroy', function () { + if (!options.navigation) return; + delete navigation.nextEl; + delete navigation.prevEl; + detachListener(navigation.nextEl, 'click', nextClickHandler); + detachListener(navigation.prevEl, 'click', prevClickHandler); + }); + } + + return SwiperPluginNavigation; + +}))); +//# sourceMappingURL=navigation.js.map diff --git a/packages/tiny-swiper/lib/modules/navigation.js.map b/packages/tiny-swiper/lib/modules/navigation.js.map new file mode 100644 index 0000000..c2a0148 --- /dev/null +++ b/packages/tiny-swiper/lib/modules/navigation.js.map @@ -0,0 +1 @@ +{"version":3,"file":"navigation.js","sources":["../../src/core/render/dom.ts","../../src/modules/navigation.ts"],"sourcesContent":["export function addClass (\n el: HTMLElement,\n list: Array | string = []\n): void {\n if (!Array.isArray(list)) list = [list]\n\n list.forEach(clz => (!el.classList.contains(clz) && el.classList.add(clz)))\n}\n\nexport function removeClass (\n el: HTMLElement,\n list: Array | string = []\n): void {\n if (!Array.isArray(list)) list = [list]\n\n list.forEach(clz => (el.classList.contains(clz) && el.classList.remove(clz)))\n}\n\nexport function attachListener (\n el: HTMLElement | Document | Window,\n evtName: string,\n handler: EventListenerOrEventListenerObject,\n opts?: boolean | AddEventListenerOptions\n): void {\n el.addEventListener(evtName, handler, opts)\n}\n\nexport function detachListener (\n el: HTMLElement | Document | Window,\n evtName: string,\n handler: EventListenerOrEventListenerObject\n): void {\n el.removeEventListener(evtName, handler)\n}\n\nexport function removeAttr (\n el: HTMLElement,\n attr: string\n): void {\n el.removeAttribute(attr)\n}\n\nexport function setAttr (\n el: HTMLElement,\n attr: string,\n value = ''\n): HTMLElement {\n el.setAttribute(attr, value)\n return el\n}\n\nexport function setStyle (\n el: HTMLElement,\n style: {[key: string]: string},\n forceRender?: boolean\n): HTMLElement {\n Object.keys(style).forEach(prop => {\n // TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'.\n el.style[prop as any] = style[prop]\n })\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n forceRender && getComputedStyle(el)\n\n return el\n}\n\nexport function getTranslate (\n el: HTMLElement,\n isHorizontal: boolean\n): number {\n const matrix = getComputedStyle(el).transform.replace(/[a-z]|\\(|\\)|\\s/g, '').split(',').map(parseFloat)\n let arr: Array = []\n\n if (matrix.length === 16) {\n arr = matrix.slice(12, 14)\n } else if (matrix.length === 6) {\n arr = matrix.slice(4, 6)\n }\n return (>arr)[isHorizontal ? 0 : 1] || 0\n}\n","import {\n attachListener,\n detachListener\n} from '../core/render/dom'\nimport {SwiperInstance} from '../core/index'\nimport {Options} from '../core/options'\n\nexport type SwiperPluginNavigationOptions = Options & {\n navigation: {\n nextEl: HTMLElement | string\n prevEl: HTMLElement | string\n disabledClass: string\n }\n}\n\nexport type SwiperPluginNavigationInstance = {\n nextEl: HTMLElement\n prevEl: HTMLElement\n}\nexport default function SwiperPluginNavigation(\n instance: SwiperInstance & {\n navigation: SwiperPluginNavigationInstance\n },\n options: SwiperPluginNavigationOptions\n) {\n const navigation = {\n nextEl: null,\n prevEl: null\n } as unknown as SwiperPluginNavigationInstance\n\n const nextClickHandler = (e: PointerEvent) => {\n clickHandler(e.target as HTMLElement, 'next');\n };\n\n const prevClickHandler = (e: PointerEvent) => {\n clickHandler(e.target as HTMLElement, 'prev');\n\n };\n\n const clickHandler = (e: HTMLElement, type: 'next' | 'prev') => {\n if (checkIsDisable(e) && !instance.options.loop) {\n return\n }\n const {\n index\n } = instance.state\n const {\n $list\n } = instance.env.element\n let currentIdx = index;\n\n if (type === 'next') {\n if (index < $list.length - 1) {\n instance.slideTo(index + 1);\n }\n if (currentIdx > $list.length) {\n currentIdx = index;\n }\n currentIdx++;\n }\n\n if (type === 'prev') {\n if (index > 0) {\n instance.slideTo(index - 1);\n }\n if (currentIdx < -1) {\n currentIdx = index;\n }\n currentIdx--;\n }\n console.log(instance.options.loop, currentIdx, type)\n checkSwiperDisabledClass(currentIdx, $list.length - 1, type);\n }\n\n const checkSwiperDisabledClass = (\n index: number, last: number, type: string) => {\n const target = type === 'prev' ? -1 : last + 1;\n const slideToNum = type === 'prev' ? last : 0;\n if (navigation.nextEl.classList.contains(options.navigation.disabledClass)\n && type === 'prev') {\n navigation.nextEl.classList.remove(options.navigation.disabledClass);\n }\n\n if (navigation.prevEl.classList.contains(options.navigation.disabledClass)\n && type === 'next') {\n navigation.prevEl.classList.remove(options.navigation.disabledClass);\n }\n if (instance.options.loop) {\n if (index === target) {\n instance.slideTo(slideToNum);\n }\n } else {\n if (instance.state.index === 0) {\n navigation.prevEl.classList.add(options.navigation.disabledClass);\n }\n if (instance.state.index === last) {\n navigation.nextEl.classList.add(options.navigation.disabledClass);\n }\n }\n }\n\n const checkIsDisable = (e: HTMLElement) => {\n if (e.classList.contains(options.navigation.disabledClass)) {\n return true\n }\n return false\n }\n\n const checkButtonDefaultStatus = () => {\n const {\n index\n } = instance.state\n const {\n $list\n } = instance.env.element\n if (index === 0 && !instance.options.loop) {\n navigation.prevEl.classList.add(options.navigation.disabledClass);\n }\n if ($list.length === 1 && !instance.options.loop) {\n navigation.nextEl.classList.add(options.navigation.disabledClass);\n }\n }\n\n instance.on('before-init', () => {\n if (options.navigation) {\n options.navigation = Object.assign({\n disabledClass: 'swiper-button-disabled'\n }, options.navigation)\n }\n })\n\n instance.on('after-init', () => {\n if (!options.navigation) return\n\n navigation.nextEl = (typeof options.navigation.nextEl === 'string')\n ? document.body.querySelector(options.navigation.nextEl) as HTMLElement\n : options.navigation.nextEl\n navigation.prevEl = (typeof options.navigation.prevEl === 'string')\n ? document.body.querySelector(options.navigation.prevEl) as HTMLElement\n : options.navigation.prevEl\n checkButtonDefaultStatus();\n attachListener(navigation.nextEl, 'click', nextClickHandler)\n attachListener(navigation.prevEl, 'click', prevClickHandler)\n })\n\n instance.on('after-destroy', () => {\n if (!options.navigation) return\n\n delete navigation.nextEl;\n delete navigation.prevEl;\n\n detachListener(navigation.nextEl, 'click', nextClickHandler)\n detachListener(navigation.prevEl, 'click', prevClickHandler)\n })\n}\n"],"names":["attachListener","el","evtName","handler","opts","addEventListener","detachListener","removeEventListener","SwiperPluginNavigation","instance","options","navigation","nextEl","prevEl","nextClickHandler","e","clickHandler","target","prevClickHandler","type","checkIsDisable","loop","index","state","$list","env","element","currentIdx","length","slideTo","console","log","checkSwiperDisabledClass","last","slideToNum","classList","contains","disabledClass","remove","add","checkButtonDefaultStatus","on","Object","assign","document","body","querySelector"],"mappings":"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"} \ No newline at end of file diff --git a/packages/tiny-swiper/lib/modules/navigation.min.js b/packages/tiny-swiper/lib/modules/navigation.min.js index b524768..f51ef3f 100644 --- a/packages/tiny-swiper/lib/modules/navigation.min.js +++ b/packages/tiny-swiper/lib/modules/navigation.min.js @@ -1 +1 @@ -!function(n,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(n="undefined"!=typeof globalThis?globalThis:n||self).SwiperPluginNavigation=e()}(this,function(){"use strict";function s(n,e,t,i){n.addEventListener(e,t,i)}function r(n,e,t){n.removeEventListener(e,t)}return function(i,e){function n(n){l(n.target,"next")}function t(n){l(n.target,"prev")}var o={nextEl:null,prevEl:null},l=function(n,e){var t;a(n)||(t=i.state.index,n=i.env.element.$list,"next"===e&&ti.length&&(n=t),n++),"prev"===e&&(0 { - if (checkIsDisable(e)) { + if (checkIsDisable(e) && !instance.options.loop) { return } const { @@ -50,41 +47,90 @@ export default function SwiperPluginNavigation ( const { $list } = instance.env.element + let currentIdx = index; if (type === 'next') { if (index < $list.length - 1) { instance.slideTo(index + 1); } + if (currentIdx > $list.length) { + currentIdx = index; + } + currentIdx++; } if (type === 'prev') { if (index > 0) { instance.slideTo(index - 1); } + if (currentIdx < -1) { + currentIdx = index; + } + currentIdx--; + } + // console.log(instance.options.loop, currentIdx, type) + checkSwiperDisabledClass(currentIdx, $list.length - 1, type); + } + + const checkSwiperDisabledClass = ( + index: number, last: number, type: string) => { + const target = type === 'prev' ? -1 : last + 1; + const slideToNum = type === 'prev' ? last : 0; + if (navigation.nextEl.classList.contains(options.navigation.disabledClass) + && type === 'prev') { + navigation.nextEl.classList.remove(options.navigation.disabledClass); + } + + if (navigation.prevEl.classList.contains(options.navigation.disabledClass) + && type === 'next') { + navigation.prevEl.classList.remove(options.navigation.disabledClass); + } + if (instance.options.loop) { + if (index === target) { + instance.slideTo(slideToNum); + } + } else { + if (instance.state.index === 0) { + navigation.prevEl.classList.add(options.navigation.disabledClass); + } + if (instance.state.index === last) { + navigation.nextEl.classList.add(options.navigation.disabledClass); + } } } const checkIsDisable = (e: HTMLElement) => { - if (e.classList.contains(options.navigation.disabledClass) - || e.classList.contains(options.navigation.lockClass)) { + if (e.classList.contains(options.navigation.disabledClass)) { return true } return false } + const checkButtonDefaultStatus = () => { + const { + index + } = instance.state + const { + $list + } = instance.env.element + if (index === 0 ) { + navigation.prevEl.classList.add(options.navigation.disabledClass); + } + if ($list.length === 1) { + navigation.nextEl.classList.add(options.navigation.disabledClass); + } + } + instance.on('before-init', () => { - if ( options.navigation ) { + if (options.navigation) { options.navigation = Object.assign({ - hideOnClick: false, - disabledClass: 'swiper-button-disabled', - hiddenClass: 'swiper-button-hidden', - lockClass: 'swiper-button-lock' + disabledClass: 'swiper-button-disabled' }, options.navigation) } }) instance.on('after-init', () => { - if ( !options.navigation ) return + if (!options.navigation) return navigation.nextEl = (typeof options.navigation.nextEl === 'string') ? document.body.querySelector(options.navigation.nextEl) as HTMLElement @@ -92,18 +138,20 @@ export default function SwiperPluginNavigation ( navigation.prevEl = (typeof options.navigation.prevEl === 'string') ? document.body.querySelector(options.navigation.prevEl) as HTMLElement : options.navigation.prevEl - - attachListener(navigation.nextEl, 'click', nextClickHandler) - attachListener(navigation.prevEl, 'click', prevClickHandler) + if (!instance.options.loop) { + checkButtonDefaultStatus(); + } + attachListener(navigation.nextEl, 'click', nextClickHandler) + attachListener(navigation.prevEl, 'click', prevClickHandler) }) instance.on('after-destroy', () => { - if ( !options.navigation ) return + if (!options.navigation) return delete navigation.nextEl; delete navigation.prevEl; - detachListener(navigation.nextEl, 'click', nextClickHandler) - detachListener(navigation.prevEl, 'click', prevClickHandler) + detachListener(navigation.nextEl, 'click', nextClickHandler) + detachListener(navigation.prevEl, 'click', prevClickHandler) }) } diff --git a/packages/website/src/components/Demo/index.scss b/packages/website/src/components/Demo/index.scss index 6cbaefe..21bae21 100644 --- a/packages/website/src/components/Demo/index.scss +++ b/packages/website/src/components/Demo/index.scss @@ -93,7 +93,11 @@ border-radius: 4px; color: #fff; font-weight: 700; - + z-index: 3; + &.swiper-button-disabled { + opacity: 0.5; + cursor: not-allowed; + } &:nth-child(2) { left: 20px; } diff --git a/packages/website/versioned_docs/version-2.0.0-alpha/api.md b/packages/website/versioned_docs/version-2.0.0-alpha/api.md index 4bffae6..1774924 100644 --- a/packages/website/versioned_docs/version-2.0.0-alpha/api.md +++ b/packages/website/versioned_docs/version-2.0.0-alpha/api.md @@ -332,10 +332,7 @@ const swiper = new Swiper( navigation: { nextEl: 'className | HTMLElement', prevEl: 'className | HTMLElement', - hideOnClick: false, disabledClass: 'swiper-button-disabled', - hiddenClass: 'swiper-button-hidden', - lockClass: 'swiper-button-lock' }, // Add SwiperPluginNavigation plugin. @@ -356,7 +353,4 @@ const swiper = new Swiper( |---|---|---|---| | nextEl | string / HTMLElement | null | String with CSS selector or HTML element of the element that will work like "next" button after click on it | | prevEl | string / HTMLElement | null | String with CSS selector or HTML element of the element that will work like "prev" button after click on it | -| hideOnClick | boolean | false | Toggle navigation buttons visibility after click on Slider's container | | disabledClass | string | 'swiper-button-disabled' | CSS class name added to navigation button when it becomes disabled | -| hiddenClass | string | 'swiper-button-hidden' | CSS class name added to navigation button when it becomes hidden | -| lockClass | string | 'swiper-button-lock' | CSS class name added to navigation button when it is disabled | diff --git a/packages/website/versioned_docs/version-2.0.0-alpha/demo.md b/packages/website/versioned_docs/version-2.0.0-alpha/demo.md index 1ad79ba..e435363 100644 --- a/packages/website/versioned_docs/version-2.0.0-alpha/demo.md +++ b/packages/website/versioned_docs/version-2.0.0-alpha/demo.md @@ -308,16 +308,12 @@ You need to implement CSS code yourself. navigation: { nextEl: '.swiper-plugin-navigation-nextEl', prevEl: '.swiper-plugin-navigation-prevEl', - hideOnClick: false, - disabledClass: 'swiper-button-disabled', - hiddenClass: 'swiper-button-hidden', - lockClass: 'swiper-button-lock' }, plugins: [ SwiperPluginNavigation ] }}> -
+
< img src="https://user-images.githubusercontent.com/10026019/102327273-74284900-3fc0-11eb-913a-69661b73ab5d.png"/>