UNPKG

3.5 kBJavaScriptView Raw
1import { template as _$template } from "solid-js/web";
2import { setAttribute as _$setAttribute } from "solid-js/web";
3import { effect as _$effect } from "solid-js/web";
4import { insert as _$insert } from "solid-js/web";
5import { mergeProps as _$mergeProps } from "solid-js/web";
6import { createComponent as _$createComponent } from "solid-js/web";
7import { memo as _$memo } from "solid-js/web";
8
9const _tmpl$ = /*#__PURE__*/_$template(`<div class="swiper-zoom-container"></div>`, 2);
10
11import { createEffect, createSignal, onCleanup, splitProps } from 'solid-js';
12import { Dynamic } from 'solid-js/web';
13import { SwiperSlideContext } from './context.js';
14import { uniqueClasses } from '../components-shared/utils.js';
15
16const SwiperSlide = props => {
17 const [local, rest] = splitProps(props, ['children', 'class', 'ref', 'swiper', 'tag', 'virtualIndex', 'zoom']);
18 const [slideClasses, setSlideClasses] = createSignal('swiper-slide');
19 let ref = null;
20
21 function updateClasses(_s, el, classNames) {
22 if (el === ref) {
23 setSlideClasses(classNames);
24 }
25 }
26
27 createEffect(() => {
28 if (!ref || !local.swiper) {
29 return;
30 }
31
32 if (local.swiper.destroyed) {
33 if (slideClasses() !== 'swiper-slide') {
34 setSlideClasses('swiper-slide');
35 }
36
37 return;
38 }
39
40 local.swiper.on('_slideClass', updateClasses); // eslint-disable-next-line
41
42 onCleanup(() => {
43 if (!local.swiper) return;
44 local.swiper.off('_slideClass', updateClasses);
45 });
46 });
47 createEffect(() => {
48 if (local.swiper && ref && !local.swiper.destroyed) {
49 setSlideClasses(local.swiper.getSlideClasses(ref));
50 }
51 });
52
53 const slideData = () => ({
54 isActive: slideClasses().indexOf('swiper-slide-active') >= 0 || slideClasses().indexOf('swiper-slide-duplicate-active') >= 0,
55 isVisible: slideClasses().indexOf('swiper-slide-visible') >= 0,
56 isDuplicate: slideClasses().indexOf('swiper-slide-duplicate') >= 0,
57 isPrev: slideClasses().indexOf('swiper-slide-prev') >= 0 || slideClasses().indexOf('swiper-slide-duplicate-prev') >= 0,
58 isNext: slideClasses().indexOf('swiper-slide-next') >= 0 || slideClasses().indexOf('swiper-slide-duplicate-next') >= 0
59 });
60
61 const renderChildren = () => {
62 return typeof local.children === 'function' ? local.children(slideData()) : local.children;
63 };
64 /* eslint-disable react/react-in-jsx-scope */
65
66 /* eslint-disable react/no-unknown-property */
67
68
69 return _$createComponent(Dynamic, _$mergeProps({
70 get component() {
71 return local.tag || 'div';
72 },
73
74 ref: el => {
75 ref = el;
76
77 if (typeof local.ref === 'function') {
78 local.ref(el);
79 } else {
80 local.ref = el;
81 }
82 },
83
84 get ["class"]() {
85 return uniqueClasses(`${slideClasses()}${local.class ? ` ${local.class}` : ''}`);
86 },
87
88 get ["data-swiper-slide-index"]() {
89 return local.virtualIndex;
90 }
91
92 }, rest, {
93 get children() {
94 return _$createComponent(SwiperSlideContext.Provider, {
95 get value() {
96 return slideData();
97 },
98
99 get children() {
100 return _$memo(() => !!local.zoom, true)() ? (() => {
101 const _el$ = _tmpl$.cloneNode(true);
102
103 _$insert(_el$, renderChildren);
104
105 _$effect(() => _$setAttribute(_el$, "data-swiper-zoom", typeof local.zoom === 'number' ? local.zoom : undefined));
106
107 return _el$;
108 })() : renderChildren();
109 }
110
111 });
112 }
113
114 }));
115};
116
117export { SwiperSlide };
\No newline at end of file