solid-slider 1.3.19 → 1.3.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +152 -5
- package/dist/adaptiveHeight/index.common.js +2 -2
- package/dist/adaptiveHeight/index.common.js.map +1 -1
- package/dist/adaptiveHeight/index.module.js +2 -2
- package/dist/adaptiveHeight/index.module.js.map +1 -1
- package/dist/adaptiveWidth/index.common.js +2 -2
- package/dist/adaptiveWidth/index.common.js.map +1 -1
- package/dist/adaptiveWidth/index.module.js +2 -2
- package/dist/adaptiveWidth/index.module.js.map +1 -1
- package/dist/autoplay/autoplay.d.ts +7 -7
- package/dist/autoplay/autoplay.jsx +7 -7
- package/dist/autoplay/index.common.js +14 -24
- package/dist/autoplay/index.common.js.map +1 -1
- package/dist/autoplay/index.module.js +14 -24
- package/dist/autoplay/index.module.js.map +1 -1
- package/dist/index/components.d.ts +74 -9
- package/dist/index/components.jsx +156 -9
- package/dist/index/index.common.js +291 -230
- package/dist/index/index.common.js.map +1 -1
- package/dist/index/index.module.js +292 -233
- package/dist/index/index.module.js.map +1 -1
- package/dist/index/primitive.d.ts +11 -11
- package/dist/index/{primitive.js → primitive.jsx} +18 -16
- package/dist/slider.css +21 -0
- package/package.json +11 -11
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { on, createContext, useContext, createSignal, createEffect, } from "solid-js";
|
|
1
|
+
import { on, createContext, useContext, createSignal, createEffect, Show, createMemo, Index, onMount, } from "solid-js";
|
|
2
2
|
import { access } from "@solid-primitives/utils";
|
|
3
3
|
import { isServer } from "solid-js/web";
|
|
4
4
|
import { createSlider } from "./primitive";
|
|
@@ -11,8 +11,8 @@ export const SliderContext = createContext(createSignal(null));
|
|
|
11
11
|
/**
|
|
12
12
|
* A helpful and simple Provider to wrap your Slider if controls such as SliderButton are used.
|
|
13
13
|
*
|
|
14
|
-
* @param props
|
|
15
|
-
* @param props
|
|
14
|
+
* @param props.options - Accepts all KeenSlider options.
|
|
15
|
+
* @param props.plugins - A list of Solid Slider or Keen slider plugins.
|
|
16
16
|
*/
|
|
17
17
|
export const SliderProvider = (props) => (<SliderContext.Provider value={createSignal(null)}>
|
|
18
18
|
{props.children}
|
|
@@ -20,8 +20,8 @@ export const SliderProvider = (props) => (<SliderContext.Provider value={createS
|
|
|
20
20
|
/**
|
|
21
21
|
* Main Slider component for specifying the Slider on the page.
|
|
22
22
|
*
|
|
23
|
-
* @param props
|
|
24
|
-
* @param props
|
|
23
|
+
* @param props.options - Accepts all KeenSlider options.
|
|
24
|
+
* @param props.plugins - A list of Solid Slider or Keen slider plugins.
|
|
25
25
|
*/
|
|
26
26
|
export const Slider = (props) => {
|
|
27
27
|
if (isServer)
|
|
@@ -38,10 +38,10 @@ export const Slider = (props) => {
|
|
|
38
38
|
/**
|
|
39
39
|
* Provides a helpful button with next/prev to pair with your slider.
|
|
40
40
|
*
|
|
41
|
-
* @param props
|
|
42
|
-
* @param props
|
|
43
|
-
* @param props
|
|
44
|
-
* @param props
|
|
41
|
+
* @param props.next - Specify if this should be a next button.
|
|
42
|
+
* @param props.prev - Specify if this should be a prev button.
|
|
43
|
+
* @param props.class - Class to override the button.
|
|
44
|
+
* @param props.classList - List of classes to override the button.
|
|
45
45
|
*/
|
|
46
46
|
export const SliderButton = (props) => {
|
|
47
47
|
const context = useContext(SliderContext);
|
|
@@ -55,3 +55,150 @@ export const SliderButton = (props) => {
|
|
|
55
55
|
{props.children}
|
|
56
56
|
</button>);
|
|
57
57
|
};
|
|
58
|
+
/**
|
|
59
|
+
* Navigation dots component for the slider.
|
|
60
|
+
* Displays a dot for each slide and highlights the current slide.
|
|
61
|
+
*
|
|
62
|
+
* @param props.class - Class to override the dots container.
|
|
63
|
+
* @param props.classList - List of classes to override the dots container.
|
|
64
|
+
* @param props.dotClass - Class to override individual dots.
|
|
65
|
+
* @param props.dotClassList - List of classes to override individual dots.
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```tsx
|
|
69
|
+
* <SliderProvider>
|
|
70
|
+
* <Slider>
|
|
71
|
+
* <div class="keen-slider__slide">Slide 1</div>
|
|
72
|
+
* <div class="keen-slider__slide">Slide 2</div>
|
|
73
|
+
* </Slider>
|
|
74
|
+
* <SliderDots />
|
|
75
|
+
* </SliderProvider>
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export const SliderDots = (props) => {
|
|
79
|
+
const context = useContext(SliderContext);
|
|
80
|
+
const [slideCount, setSlideCount] = createSignal(0);
|
|
81
|
+
const handleDotClick = (idx) => {
|
|
82
|
+
if (context == null)
|
|
83
|
+
return;
|
|
84
|
+
const [helpers] = context;
|
|
85
|
+
helpers()?.moveTo(idx);
|
|
86
|
+
};
|
|
87
|
+
// Update slide count when slider is created/updated
|
|
88
|
+
createEffect(() => {
|
|
89
|
+
if (!context)
|
|
90
|
+
return;
|
|
91
|
+
const [helpers] = context;
|
|
92
|
+
const sliderInstance = helpers()?.slider();
|
|
93
|
+
if (sliderInstance) {
|
|
94
|
+
const updateCount = () => {
|
|
95
|
+
const details = helpers()?.details();
|
|
96
|
+
setSlideCount(details?.slides?.length || 0);
|
|
97
|
+
};
|
|
98
|
+
// Set initial count
|
|
99
|
+
updateCount();
|
|
100
|
+
// Listen for slider changes
|
|
101
|
+
sliderInstance.on("created", updateCount);
|
|
102
|
+
sliderInstance.on("updated", updateCount);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
const slides = createMemo(() => Array.from({ length: slideCount() }, (_, i) => i));
|
|
106
|
+
return (<Show when={context != null}>
|
|
107
|
+
<div class={props.class || "keen-slider-dots"} classList={props.classList}>
|
|
108
|
+
<Index each={slides()}>
|
|
109
|
+
{(idx) => {
|
|
110
|
+
const [helpers] = context;
|
|
111
|
+
const isActive = () => helpers()?.current() === idx();
|
|
112
|
+
return (<button class={props.dotClass || "keen-slider-dot"} classList={{
|
|
113
|
+
...props.dotClassList,
|
|
114
|
+
active: isActive(),
|
|
115
|
+
}} onClick={() => handleDotClick(idx())} aria-label={`Go to slide ${idx() + 1}`}/>);
|
|
116
|
+
}}
|
|
117
|
+
</Index>
|
|
118
|
+
</div>
|
|
119
|
+
</Show>);
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Thumbnail navigation component for the slider.
|
|
123
|
+
* A second Slider that synchronizes with the main slider.
|
|
124
|
+
* User provides thumbnail slides as children.
|
|
125
|
+
*
|
|
126
|
+
* @param props.options - Options for the thumbnail slider.
|
|
127
|
+
* @param props.plugins - Plugins for the thumbnail slider.
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```tsx
|
|
131
|
+
* <SliderProvider>
|
|
132
|
+
* <Slider options={{ loop: true }}>
|
|
133
|
+
* <div class="keen-slider__slide">
|
|
134
|
+
* <img src="slide1.jpg" alt="Slide 1" />
|
|
135
|
+
* </div>
|
|
136
|
+
* <div class="keen-slider__slide">
|
|
137
|
+
* <img src="slide2.jpg" alt="Slide 2" />
|
|
138
|
+
* </div>
|
|
139
|
+
* </Slider>
|
|
140
|
+
* <SliderThumbnails options={{ slides: { perView: 4, spacing: 10 } }}>
|
|
141
|
+
* <div class="keen-slider__slide">
|
|
142
|
+
* <img src="thumb1.jpg" alt="Thumbnail 1" />
|
|
143
|
+
* </div>
|
|
144
|
+
* <div class="keen-slider__slide">
|
|
145
|
+
* <img src="thumb2.jpg" alt="Thumbnail 2" />
|
|
146
|
+
* </div>
|
|
147
|
+
* </SliderThumbnails>
|
|
148
|
+
* </SliderProvider>
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
export const SliderThumbnails = (props) => {
|
|
152
|
+
if (isServer)
|
|
153
|
+
return <div>{props.children}</div>;
|
|
154
|
+
const mainContext = useContext(SliderContext);
|
|
155
|
+
if (!mainContext) {
|
|
156
|
+
console.warn("SliderThumbnails must be used within a SliderProvider");
|
|
157
|
+
return <div>{props.children}</div>;
|
|
158
|
+
}
|
|
159
|
+
const [mainHelpers] = mainContext;
|
|
160
|
+
// Create thumbnail slider with user options
|
|
161
|
+
const [thumbSlider, thumbHelpers] = createSlider(props.options || {}, ...(props.plugins || []));
|
|
162
|
+
// Update on children change (same as main Slider)
|
|
163
|
+
createEffect(on(() => access(props.children), () => queueMicrotask(() => thumbHelpers.update()), { defer: true }));
|
|
164
|
+
// Sync thumbnail slider with main slider
|
|
165
|
+
onMount(() => {
|
|
166
|
+
// Wait for next tick to ensure both sliders are mounted
|
|
167
|
+
queueMicrotask(() => {
|
|
168
|
+
const mainSliderInstance = mainHelpers()?.slider();
|
|
169
|
+
const thumbSliderInstance = thumbHelpers.slider();
|
|
170
|
+
if (mainSliderInstance && thumbSliderInstance) {
|
|
171
|
+
// Function to update active thumbnail
|
|
172
|
+
const activeClassName = props.activeClass || "active";
|
|
173
|
+
const updateActiveThumbnail = () => {
|
|
174
|
+
const mainCurrent = mainHelpers()?.current();
|
|
175
|
+
if (mainCurrent !== undefined) {
|
|
176
|
+
// Remove active class from all thumbnails
|
|
177
|
+
thumbSliderInstance.slides.forEach((slide) => {
|
|
178
|
+
slide.classList.remove(activeClassName);
|
|
179
|
+
});
|
|
180
|
+
// Add active class to current thumbnail
|
|
181
|
+
if (thumbSliderInstance.slides[mainCurrent]) {
|
|
182
|
+
thumbSliderInstance.slides[mainCurrent].classList.add(activeClassName);
|
|
183
|
+
}
|
|
184
|
+
// Move thumbnail slider to show active thumbnail
|
|
185
|
+
thumbHelpers.moveTo(mainCurrent);
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
// Listen to main slider changes
|
|
189
|
+
mainSliderInstance.on("slideChanged", updateActiveThumbnail);
|
|
190
|
+
// Set initial active state
|
|
191
|
+
updateActiveThumbnail();
|
|
192
|
+
// Add click handlers to thumbnails
|
|
193
|
+
thumbSliderInstance.slides.forEach((slide, idx) => {
|
|
194
|
+
slide.addEventListener("click", () => {
|
|
195
|
+
mainHelpers()?.moveTo(idx);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
});
|
|
201
|
+
// Prevent tree-shaking
|
|
202
|
+
thumbSlider;
|
|
203
|
+
return <div use:thumbSlider>{props.children}</div>;
|
|
204
|
+
};
|