@daformat/react-headless-carousel 1.0.0
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/LICENSE +21 -0
- package/README.md +3 -0
- package/dist/Carousel.js +943 -0
- package/dist/Carousel.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/test/setup.js +2 -0
- package/dist/test/setup.js.map +1 -0
- package/dist/utils/maybe.js +2 -0
- package/dist/utils/maybe.js.map +1 -0
- package/package.json +53 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Mathieu Jouhet
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
package/dist/Carousel.js
ADDED
|
@@ -0,0 +1,943 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cloneElement, createContext, forwardRef, isValidElement, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState, } from "react";
|
|
3
|
+
/**
|
|
4
|
+
* Use a fixed frame duration so that we can accurately predict snapping and
|
|
5
|
+
* other momentum-based calculations. This is an acceptable tradeoff, since
|
|
6
|
+
* requestAnimationFrame frame duration is variable. Using a dynamic frame
|
|
7
|
+
* duration compounds into missed snap points if the actual frame duration is
|
|
8
|
+
* different from the one we use for calculations ahead of the animation
|
|
9
|
+
* (velocity and deceleration factor adjustments to account for snapping).
|
|
10
|
+
*/
|
|
11
|
+
const FRAME_DURATION = 16;
|
|
12
|
+
const RUBBER_BAND_BOUNCE_COEFFICIENT = 40;
|
|
13
|
+
const CSS_VARS = Object.freeze({
|
|
14
|
+
fadeSize: "--carousel-fade-size",
|
|
15
|
+
fadeOffsetBackwards: "--carousel-fade-offset-backwards",
|
|
16
|
+
fadeOffsetForwards: "--carousel-fade-offset-forwards",
|
|
17
|
+
overscrollTranslateX: "--carousel-overscroll-translate-x",
|
|
18
|
+
remainingBackwards: "--carousel-remaining-backwards",
|
|
19
|
+
remainingForwards: "--carousel-remaining-forwards",
|
|
20
|
+
});
|
|
21
|
+
const CarouselContext = createContext({
|
|
22
|
+
setRef: () => { },
|
|
23
|
+
setScrollsBackwards: () => { },
|
|
24
|
+
setScrollsForwards: () => { },
|
|
25
|
+
scrollsBackwards: false,
|
|
26
|
+
scrollsForwards: false,
|
|
27
|
+
setRemainingForwards: () => { },
|
|
28
|
+
setRemainingBackwards: () => { },
|
|
29
|
+
setScrollStateRef: () => { },
|
|
30
|
+
handleScrollToNext: () => { },
|
|
31
|
+
handleScrollToPrev: () => { },
|
|
32
|
+
scrollIntoView: () => { },
|
|
33
|
+
rootRef: { current: null },
|
|
34
|
+
clearAnimation: () => { },
|
|
35
|
+
});
|
|
36
|
+
const useCarouselContext = () => {
|
|
37
|
+
const context = useContext(CarouselContext);
|
|
38
|
+
if (!context) {
|
|
39
|
+
throw new Error("useCarouselContext must be used within Carousel.Root");
|
|
40
|
+
}
|
|
41
|
+
return context;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Default boundary offset accounts for the content fade size
|
|
45
|
+
*/
|
|
46
|
+
const defaultBoundaryOffset = (container) => {
|
|
47
|
+
const viewport = container.querySelector("[data-carousel-viewport]");
|
|
48
|
+
if (viewport) {
|
|
49
|
+
const computedStyle = getComputedStyle(viewport);
|
|
50
|
+
const maskSize = computedStyle.getPropertyValue(CSS_VARS.fadeSize);
|
|
51
|
+
const temp = document.createElement("div");
|
|
52
|
+
temp.style.position = "absolute";
|
|
53
|
+
temp.style.visibility = "hidden";
|
|
54
|
+
temp.style.setProperty(CSS_VARS.fadeSize, maskSize);
|
|
55
|
+
temp.style.width = `var(${CSS_VARS.fadeSize})`;
|
|
56
|
+
document.body.appendChild(temp);
|
|
57
|
+
const computed = getComputedStyle(temp);
|
|
58
|
+
const fadeSize = parseFloat(computed.getPropertyValue("width"));
|
|
59
|
+
temp.remove();
|
|
60
|
+
return { x: fadeSize, y: 0 };
|
|
61
|
+
}
|
|
62
|
+
return { x: 0, y: 0 };
|
|
63
|
+
};
|
|
64
|
+
const CarouselRoot = forwardRef(({ boundaryOffset = defaultBoundaryOffset, children, ...props }, forwardedRef) => {
|
|
65
|
+
const [ref, setRef] = useState({
|
|
66
|
+
current: null,
|
|
67
|
+
});
|
|
68
|
+
const [scrollsBackwards, setScrollsBackwards] = useState(false);
|
|
69
|
+
const [scrollsForwards, setScrollsForwards] = useState(false);
|
|
70
|
+
const [remainingForwards, setRemainingForwards] = useState(0);
|
|
71
|
+
const [remainingBackwards, setRemainingBackwards] = useState(0);
|
|
72
|
+
const [scrollStateRef, setScrollStateRef] = useState(undefined);
|
|
73
|
+
const rootRef = useRef(null);
|
|
74
|
+
/**
|
|
75
|
+
* Clears the current animation and resets animation styling
|
|
76
|
+
*/
|
|
77
|
+
const clearAnimation = useCallback(() => {
|
|
78
|
+
const state = scrollStateRef?.current;
|
|
79
|
+
if (!state) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const animationId = state.animationId;
|
|
83
|
+
if (animationId) {
|
|
84
|
+
cancelAnimationFrame(animationId);
|
|
85
|
+
}
|
|
86
|
+
state.animationId = null;
|
|
87
|
+
state.velocityX = 0;
|
|
88
|
+
const container = ref.current;
|
|
89
|
+
if (!container) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
container.style.removeProperty(CSS_VARS.overscrollTranslateX);
|
|
93
|
+
const allItems = container.querySelectorAll(":scope [data-carousel-content] > *");
|
|
94
|
+
allItems.forEach((item) => {
|
|
95
|
+
if (item instanceof HTMLElement) {
|
|
96
|
+
item.style.translate = "";
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}, [ref, scrollStateRef]);
|
|
100
|
+
/**
|
|
101
|
+
* Scroll the whole page (the container client width)
|
|
102
|
+
*/
|
|
103
|
+
const handleScrollPage = useCallback((direction, container, items) => {
|
|
104
|
+
const currentScroll = container.scrollLeft;
|
|
105
|
+
const offset = rootRef.current
|
|
106
|
+
? getBoundaryOffset(boundaryOffset, rootRef.current).x
|
|
107
|
+
: 0;
|
|
108
|
+
let delta = (container.clientWidth - offset * 2) *
|
|
109
|
+
(direction === "forwards" ? 1 : -1);
|
|
110
|
+
// If multiple items, we can be more precise and scroll so the next / prev
|
|
111
|
+
// item that is not fully visible becomes fully visible after page scroll.
|
|
112
|
+
if (items.length > 1) {
|
|
113
|
+
if (direction === "forwards") {
|
|
114
|
+
const nextItem = items.find((item) => item.offsetLeft + item.offsetWidth >
|
|
115
|
+
currentScroll + container.offsetWidth - offset);
|
|
116
|
+
if (nextItem &&
|
|
117
|
+
nextItem.offsetWidth < container.offsetWidth - offset * 2) {
|
|
118
|
+
delta = nextItem.offsetLeft - container.scrollLeft - offset;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
const prevItem = items
|
|
123
|
+
.filter((item) => item.offsetLeft < currentScroll + offset)
|
|
124
|
+
.reverse()[0];
|
|
125
|
+
if (prevItem &&
|
|
126
|
+
prevItem.offsetWidth < container.offsetWidth - offset * 2) {
|
|
127
|
+
delta =
|
|
128
|
+
container.scrollLeft -
|
|
129
|
+
prevItem.offsetLeft -
|
|
130
|
+
container.offsetWidth -
|
|
131
|
+
offset;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const scrollPosition = currentScroll + delta;
|
|
136
|
+
const maxScroll = container.scrollWidth - container.clientWidth;
|
|
137
|
+
const nextScrollPosition = Math.max(0, Math.min(scrollPosition, maxScroll));
|
|
138
|
+
container.scrollTo({ left: nextScrollPosition, behavior: "smooth" });
|
|
139
|
+
}, [boundaryOffset]);
|
|
140
|
+
/**
|
|
141
|
+
* Snaps the desired scroll according to the selected snapping qnd returns
|
|
142
|
+
* the snapped scroll position
|
|
143
|
+
*/
|
|
144
|
+
const snapScroll = useCallback((targetScroll, container) => {
|
|
145
|
+
const currentScroll = container.scrollLeft;
|
|
146
|
+
container.style.scrollSnapType =
|
|
147
|
+
scrollStateRef?.current?.scrollSnapType ?? "";
|
|
148
|
+
container.scrollTo({ left: targetScroll, behavior: "instant" });
|
|
149
|
+
const snappedScrollPosition = container.scrollLeft;
|
|
150
|
+
container.scrollTo({ left: currentScroll, behavior: "instant" });
|
|
151
|
+
return snappedScrollPosition;
|
|
152
|
+
}, [scrollStateRef]);
|
|
153
|
+
/**
|
|
154
|
+
* Scroll to the target scroll or to the closest snapped position
|
|
155
|
+
*/
|
|
156
|
+
const snappedScrollTo = useCallback((targetScroll, container, behavior = "smooth") => {
|
|
157
|
+
const snappedScroll = snapScroll(targetScroll, container);
|
|
158
|
+
// request animation frame to prevent Safari from being Safari
|
|
159
|
+
requestAnimationFrame(() => {
|
|
160
|
+
container.scrollTo({
|
|
161
|
+
left: snappedScroll,
|
|
162
|
+
behavior,
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
}, [snapScroll]);
|
|
166
|
+
/**
|
|
167
|
+
* Custom scrollIntoViewNearest to prevent ancestors scrolling when doing
|
|
168
|
+
* native element.scrollIntoView()
|
|
169
|
+
*/
|
|
170
|
+
const scrollIntoViewNearest = useCallback((target, container) => {
|
|
171
|
+
const offset = rootRef.current
|
|
172
|
+
? getBoundaryOffset(boundaryOffset, rootRef.current).x
|
|
173
|
+
: 0;
|
|
174
|
+
const getIsBeforeAfter = () => {
|
|
175
|
+
const isBefore = target.offsetLeft < container.scrollLeft + offset;
|
|
176
|
+
const isAfter = target.offsetLeft + target.offsetWidth >
|
|
177
|
+
container.scrollLeft + container.offsetWidth - offset;
|
|
178
|
+
return { isBefore, isAfter };
|
|
179
|
+
};
|
|
180
|
+
let { isBefore, isAfter } = getIsBeforeAfter();
|
|
181
|
+
// Default when the target is larger than the container
|
|
182
|
+
if (isBefore && isAfter) {
|
|
183
|
+
const scrollPosition = target.offsetLeft - offset;
|
|
184
|
+
container.scrollTo({
|
|
185
|
+
left: scrollPosition <= offset ? 0 : scrollPosition,
|
|
186
|
+
behavior: "smooth",
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
else if (isBefore || isAfter) {
|
|
190
|
+
const currentScroll = container.scrollLeft;
|
|
191
|
+
let scrollPosition = isBefore
|
|
192
|
+
? target.offsetLeft - offset
|
|
193
|
+
: target.offsetLeft -
|
|
194
|
+
container.offsetWidth +
|
|
195
|
+
target.offsetWidth +
|
|
196
|
+
offset;
|
|
197
|
+
let iterations = 0;
|
|
198
|
+
const maxIterations = 20;
|
|
199
|
+
// Adjust scroll position to account for snapping, if the target is
|
|
200
|
+
// still before or after, we increment / decrement the scroll position
|
|
201
|
+
container.style.scrollSnapType =
|
|
202
|
+
scrollStateRef?.current?.scrollSnapType ?? "";
|
|
203
|
+
while (scrollPosition > 0 &&
|
|
204
|
+
scrollPosition < container.scrollWidth - container.offsetWidth &&
|
|
205
|
+
(isBefore || isAfter) &&
|
|
206
|
+
iterations < maxIterations) {
|
|
207
|
+
container.scrollTo({
|
|
208
|
+
left: scrollPosition <= offset ? 0 : scrollPosition,
|
|
209
|
+
behavior: "instant",
|
|
210
|
+
});
|
|
211
|
+
const newState = getIsBeforeAfter();
|
|
212
|
+
isBefore = newState.isBefore;
|
|
213
|
+
isAfter = newState.isAfter;
|
|
214
|
+
if (isBefore) {
|
|
215
|
+
scrollPosition -= target.offsetWidth / 2;
|
|
216
|
+
}
|
|
217
|
+
else if (isAfter) {
|
|
218
|
+
scrollPosition += target.offsetWidth / 2;
|
|
219
|
+
}
|
|
220
|
+
iterations++;
|
|
221
|
+
}
|
|
222
|
+
container.scrollTo({ left: currentScroll, behavior: "instant" });
|
|
223
|
+
snappedScrollTo(scrollPosition <= offset ? 0 : scrollPosition, container);
|
|
224
|
+
}
|
|
225
|
+
}, [boundaryOffset, scrollStateRef, snappedScrollTo]);
|
|
226
|
+
/**
|
|
227
|
+
* Custom scrollIntoView to prevent ancestors scrolling when doing native
|
|
228
|
+
* element.scrollIntoView()
|
|
229
|
+
*/
|
|
230
|
+
const scrollIntoView = useCallback((target, container, direction) => {
|
|
231
|
+
clearAnimation();
|
|
232
|
+
const [_, inline] = getScrollSnapAlign(getComputedStyle(target));
|
|
233
|
+
if (direction === "nearest") {
|
|
234
|
+
scrollIntoViewNearest(target, container);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
const offset = rootRef.current
|
|
238
|
+
? getBoundaryOffset(boundaryOffset, rootRef.current).x
|
|
239
|
+
: 0;
|
|
240
|
+
let scrollPosition = direction === "forwards"
|
|
241
|
+
? target.offsetLeft - offset
|
|
242
|
+
: target.offsetLeft -
|
|
243
|
+
container.offsetWidth +
|
|
244
|
+
target.offsetWidth +
|
|
245
|
+
offset;
|
|
246
|
+
if (inline === "center") {
|
|
247
|
+
scrollPosition =
|
|
248
|
+
target.offsetLeft -
|
|
249
|
+
(container.offsetWidth - target.offsetWidth) / 2;
|
|
250
|
+
}
|
|
251
|
+
snappedScrollTo(scrollPosition, container);
|
|
252
|
+
}, [boundaryOffset, clearAnimation, scrollIntoViewNearest, snappedScrollTo]);
|
|
253
|
+
/**
|
|
254
|
+
* Scrolls the container to the next slide until hitting the end of the container
|
|
255
|
+
*/
|
|
256
|
+
const handleScrollToNext = useCallback(() => {
|
|
257
|
+
clearAnimation();
|
|
258
|
+
const container = ref?.current;
|
|
259
|
+
const root = rootRef?.current;
|
|
260
|
+
if (root && container && container.scrollLeft < container.scrollWidth) {
|
|
261
|
+
container.style.scrollSnapType =
|
|
262
|
+
scrollStateRef?.current?.scrollSnapType ?? "";
|
|
263
|
+
const items = Array.from(container.querySelectorAll(":scope [data-carousel-content] > *"));
|
|
264
|
+
if (items.length === 1) {
|
|
265
|
+
handleScrollPage("forwards", container, items);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
const currentScroll = container.scrollLeft;
|
|
269
|
+
const containerOffsetWidth = container.offsetWidth;
|
|
270
|
+
const { x: boundaryOffsetX } = getBoundaryOffset(boundaryOffset, root);
|
|
271
|
+
const isNextItem = (item) => {
|
|
272
|
+
return (item.offsetLeft + item.offsetWidth >
|
|
273
|
+
Math.ceil(currentScroll + containerOffsetWidth - boundaryOffsetX));
|
|
274
|
+
};
|
|
275
|
+
const nextItem = items.find(isNextItem) ?? items[items.length - 1];
|
|
276
|
+
if (nextItem) {
|
|
277
|
+
if (nextItem.offsetWidth >=
|
|
278
|
+
container.offsetWidth - boundaryOffsetX * 2) {
|
|
279
|
+
handleScrollPage("forwards", container, items);
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
scrollIntoView(nextItem, container, "forwards");
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}, [
|
|
287
|
+
boundaryOffset,
|
|
288
|
+
clearAnimation,
|
|
289
|
+
handleScrollPage,
|
|
290
|
+
ref,
|
|
291
|
+
scrollIntoView,
|
|
292
|
+
scrollStateRef,
|
|
293
|
+
]);
|
|
294
|
+
/**
|
|
295
|
+
* Scrolls the container to the previous slide until hitting the start of the container
|
|
296
|
+
*/
|
|
297
|
+
const handleScrollToPrev = useCallback(() => {
|
|
298
|
+
clearAnimation();
|
|
299
|
+
const container = ref?.current;
|
|
300
|
+
const root = rootRef?.current;
|
|
301
|
+
if (root && container && container.scrollLeft > 0) {
|
|
302
|
+
container.style.scrollSnapType =
|
|
303
|
+
scrollStateRef?.current?.scrollSnapType ?? "";
|
|
304
|
+
const items = Array.from(container.querySelectorAll(":scope [data-carousel-content] > *"));
|
|
305
|
+
if (items.length === 1) {
|
|
306
|
+
handleScrollPage("backwards", container, items);
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
const currentScroll = container.scrollLeft;
|
|
310
|
+
const { x: boundaryOffsetX } = getBoundaryOffset(boundaryOffset, root);
|
|
311
|
+
const isPrevItem = (item) => {
|
|
312
|
+
return currentScroll > item.offsetLeft - boundaryOffsetX;
|
|
313
|
+
};
|
|
314
|
+
const prevItems = items.filter(isPrevItem);
|
|
315
|
+
const prevItem = prevItems[prevItems.length - 1] ?? items[0];
|
|
316
|
+
if (prevItem) {
|
|
317
|
+
if (prevItem.offsetWidth >=
|
|
318
|
+
container.offsetWidth - boundaryOffsetX * 2) {
|
|
319
|
+
handleScrollPage("backwards", container, items);
|
|
320
|
+
}
|
|
321
|
+
else {
|
|
322
|
+
scrollIntoView(prevItem, container, "backwards");
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}, [
|
|
327
|
+
boundaryOffset,
|
|
328
|
+
clearAnimation,
|
|
329
|
+
handleScrollPage,
|
|
330
|
+
ref,
|
|
331
|
+
scrollIntoView,
|
|
332
|
+
scrollStateRef,
|
|
333
|
+
]);
|
|
334
|
+
const carouselContext = useMemo(() => {
|
|
335
|
+
return {
|
|
336
|
+
ref,
|
|
337
|
+
setRef,
|
|
338
|
+
scrollsBackwards,
|
|
339
|
+
scrollsForwards,
|
|
340
|
+
setScrollsBackwards,
|
|
341
|
+
setScrollsForwards,
|
|
342
|
+
remainingForwards,
|
|
343
|
+
remainingBackwards,
|
|
344
|
+
setRemainingForwards,
|
|
345
|
+
setRemainingBackwards,
|
|
346
|
+
scrollStateRef,
|
|
347
|
+
setScrollStateRef,
|
|
348
|
+
handleScrollToNext,
|
|
349
|
+
handleScrollToPrev,
|
|
350
|
+
scrollIntoView,
|
|
351
|
+
clearAnimation,
|
|
352
|
+
boundaryOffset,
|
|
353
|
+
rootRef,
|
|
354
|
+
};
|
|
355
|
+
}, [
|
|
356
|
+
ref,
|
|
357
|
+
scrollsBackwards,
|
|
358
|
+
scrollsForwards,
|
|
359
|
+
remainingForwards,
|
|
360
|
+
remainingBackwards,
|
|
361
|
+
scrollStateRef,
|
|
362
|
+
handleScrollToNext,
|
|
363
|
+
handleScrollToPrev,
|
|
364
|
+
scrollIntoView,
|
|
365
|
+
clearAnimation,
|
|
366
|
+
boundaryOffset,
|
|
367
|
+
]);
|
|
368
|
+
useEffect(() => {
|
|
369
|
+
return clearAnimation;
|
|
370
|
+
}, [clearAnimation]);
|
|
371
|
+
return (_jsx(CarouselContext.Provider, { value: carouselContext, children: _jsx("div", { ref: combineRefs(rootRef, forwardedRef), ...props, children: children }) }));
|
|
372
|
+
});
|
|
373
|
+
CarouselRoot.displayName = "Carousel.Root";
|
|
374
|
+
const CarouselViewport = forwardRef(({ children, onPointerDown, onPointerMove, onPointerUp, onClickCapture, onWheel, contentFade = true, contentFadeSize = "clamp(16px, 10vw, 64px)", scrollSnapType, style, className, ...props }, forwardedRef) => {
|
|
375
|
+
const { setRef, setScrollsBackwards, setScrollsForwards, scrollsForwards, scrollsBackwards, scrollIntoView, setRemainingForwards, setRemainingBackwards, setScrollStateRef, clearAnimation, rootRef, } = useContext(CarouselContext);
|
|
376
|
+
const containerRef = useRef(null);
|
|
377
|
+
const scrollStateRef = useRef({
|
|
378
|
+
isDragging: false,
|
|
379
|
+
isDispatchingClick: false,
|
|
380
|
+
startX: 0,
|
|
381
|
+
scrollLeft: 0,
|
|
382
|
+
lastX: 0,
|
|
383
|
+
lastTime: 0,
|
|
384
|
+
velocityX: 0,
|
|
385
|
+
animationId: null,
|
|
386
|
+
initialTarget: null,
|
|
387
|
+
initialPointerPosition: null,
|
|
388
|
+
mouseDirection: 0,
|
|
389
|
+
scrollSnapType: scrollSnapType ?? "",
|
|
390
|
+
});
|
|
391
|
+
// Keep the ref in sync with the prop on every render so event handlers
|
|
392
|
+
// always see the current value without needing a layout effect.
|
|
393
|
+
scrollStateRef.current.scrollSnapType = scrollSnapType ?? "";
|
|
394
|
+
/**
|
|
395
|
+
* Register our refs; Layout effect to make sure we render the arrows
|
|
396
|
+
* or the content-fade in the initial frame
|
|
397
|
+
*/
|
|
398
|
+
useLayoutEffect(() => {
|
|
399
|
+
setRef(containerRef);
|
|
400
|
+
setScrollStateRef(scrollStateRef);
|
|
401
|
+
}, [setRef, setScrollStateRef]);
|
|
402
|
+
/**
|
|
403
|
+
* Determine whether the container can scroll forwards or backwards based on
|
|
404
|
+
* its current scroll position, offset width, and scroll width. Updates
|
|
405
|
+
* relevant state and CSS variables.
|
|
406
|
+
*/
|
|
407
|
+
const updateScrollState = useCallback(() => {
|
|
408
|
+
const container = containerRef.current;
|
|
409
|
+
const root = rootRef.current;
|
|
410
|
+
if (container && root) {
|
|
411
|
+
const translateX = Math.ceil(parseFloat(container.style.getPropertyValue(CSS_VARS.overscrollTranslateX) ??
|
|
412
|
+
"0"));
|
|
413
|
+
const containerScrollWidth = (container.scrollWidth ?? 0) - (translateX > 0 ? translateX : 0);
|
|
414
|
+
const containerOffsetWidth = container.offsetWidth ?? 0;
|
|
415
|
+
const containerScrollLeft = container.scrollLeft ?? 0;
|
|
416
|
+
if (!container || containerScrollWidth <= containerOffsetWidth) {
|
|
417
|
+
setScrollsBackwards(false);
|
|
418
|
+
setScrollsForwards(false);
|
|
419
|
+
}
|
|
420
|
+
else if (containerScrollLeft <= 0) {
|
|
421
|
+
setScrollsBackwards(false);
|
|
422
|
+
setScrollsForwards(true);
|
|
423
|
+
}
|
|
424
|
+
else if (Math.ceil(containerScrollLeft) <
|
|
425
|
+
containerScrollWidth - containerOffsetWidth - 1) {
|
|
426
|
+
setScrollsBackwards(true);
|
|
427
|
+
setScrollsForwards(true);
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
setScrollsBackwards(true);
|
|
431
|
+
setScrollsForwards(false);
|
|
432
|
+
}
|
|
433
|
+
const remainingBackwards = containerScrollLeft;
|
|
434
|
+
const remainingForwards = containerScrollWidth - containerScrollLeft - containerOffsetWidth;
|
|
435
|
+
setRemainingForwards(remainingForwards);
|
|
436
|
+
setRemainingBackwards(remainingBackwards);
|
|
437
|
+
root.style.setProperty(CSS_VARS.remainingForwards, `${remainingForwards}px`);
|
|
438
|
+
root.style.setProperty(CSS_VARS.remainingBackwards, `${remainingBackwards}px`);
|
|
439
|
+
}
|
|
440
|
+
}, [
|
|
441
|
+
rootRef,
|
|
442
|
+
setRemainingBackwards,
|
|
443
|
+
setRemainingForwards,
|
|
444
|
+
setScrollsBackwards,
|
|
445
|
+
setScrollsForwards,
|
|
446
|
+
]);
|
|
447
|
+
/**
|
|
448
|
+
* Prevent native scroll when dragging, reset velocity when not dragging to
|
|
449
|
+
* avoid cumulating momentum.
|
|
450
|
+
*/
|
|
451
|
+
const handlePreventScroll = useCallback((event) => {
|
|
452
|
+
if (scrollStateRef.current.isDragging) {
|
|
453
|
+
event.preventDefault();
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
scrollStateRef.current.velocityX = 0;
|
|
457
|
+
}
|
|
458
|
+
}, []);
|
|
459
|
+
/**
|
|
460
|
+
* Set up observers and scrolling event listeners to update the scroll state
|
|
461
|
+
* and prevent native scroll when dragging.
|
|
462
|
+
*/
|
|
463
|
+
useLayoutEffect(() => {
|
|
464
|
+
const container = containerRef.current;
|
|
465
|
+
if (container) {
|
|
466
|
+
const resizeObserver = new ResizeObserver(updateScrollState);
|
|
467
|
+
const mutationObserver = new MutationObserver(updateScrollState);
|
|
468
|
+
resizeObserver.observe(container);
|
|
469
|
+
mutationObserver.observe(container, {
|
|
470
|
+
attributes: true,
|
|
471
|
+
childList: true,
|
|
472
|
+
subtree: true,
|
|
473
|
+
});
|
|
474
|
+
container.addEventListener("scroll", updateScrollState);
|
|
475
|
+
container.addEventListener("wheel", handlePreventScroll, {
|
|
476
|
+
passive: false,
|
|
477
|
+
});
|
|
478
|
+
updateScrollState();
|
|
479
|
+
return () => {
|
|
480
|
+
resizeObserver.disconnect();
|
|
481
|
+
mutationObserver.disconnect();
|
|
482
|
+
container.removeEventListener("scroll", updateScrollState);
|
|
483
|
+
container.removeEventListener("wheel", handlePreventScroll);
|
|
484
|
+
};
|
|
485
|
+
}
|
|
486
|
+
return;
|
|
487
|
+
}, [handlePreventScroll, updateScrollState]);
|
|
488
|
+
/**
|
|
489
|
+
* Initialize dragging.
|
|
490
|
+
*/
|
|
491
|
+
const handlePointerDown = useCallback((event) => {
|
|
492
|
+
if (event.pointerType !== "mouse" || event.button !== 0) {
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
496
|
+
const state = scrollStateRef.current;
|
|
497
|
+
if (state.animationId !== null) {
|
|
498
|
+
cancelAnimationFrame(state.animationId);
|
|
499
|
+
state.animationId = null;
|
|
500
|
+
}
|
|
501
|
+
const container = containerRef.current;
|
|
502
|
+
if (!container) {
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
// set to hidden to prevent momentum scrolling from the wheel when dragging
|
|
506
|
+
container.style.overflowX = "hidden";
|
|
507
|
+
state.isDragging = true;
|
|
508
|
+
state.startX = event.clientX;
|
|
509
|
+
state.lastX = event.clientX;
|
|
510
|
+
state.scrollLeft = container.scrollLeft ?? 0;
|
|
511
|
+
state.lastTime = Date.now();
|
|
512
|
+
state.velocityX = 0;
|
|
513
|
+
state.initialTarget = event.target;
|
|
514
|
+
state.initialPointerPosition = { x: event.clientX, y: event.clientY };
|
|
515
|
+
event.preventDefault();
|
|
516
|
+
event.stopPropagation();
|
|
517
|
+
onPointerDown?.(event);
|
|
518
|
+
}, [onPointerDown]);
|
|
519
|
+
/**
|
|
520
|
+
* Prevent velocity from exceeding a given threshold.
|
|
521
|
+
*/
|
|
522
|
+
const clampVelocity = useCallback((maxAbsoluteVelocity) => {
|
|
523
|
+
const state = scrollStateRef.current;
|
|
524
|
+
if (Math.abs(state.velocityX) > maxAbsoluteVelocity) {
|
|
525
|
+
state.velocityX = Math.sign(state.velocityX) * maxAbsoluteVelocity;
|
|
526
|
+
}
|
|
527
|
+
}, []);
|
|
528
|
+
/**
|
|
529
|
+
* Calculate rubber banding effect, translate carousel items, and update
|
|
530
|
+
* velocity accordingly.
|
|
531
|
+
*/
|
|
532
|
+
const applyRubberBanding = useCallback((container, scrollDelta) => {
|
|
533
|
+
const state = scrollStateRef.current;
|
|
534
|
+
const items = container.querySelectorAll(":scope [data-carousel-content] > *");
|
|
535
|
+
const maxDistance = container.offsetWidth / 3;
|
|
536
|
+
const maxScrollLeft = container.scrollWidth - container.offsetWidth;
|
|
537
|
+
const targetScrollLeft = state.scrollLeft + scrollDelta;
|
|
538
|
+
const overscroll = targetScrollLeft < 0
|
|
539
|
+
? Math.abs(targetScrollLeft)
|
|
540
|
+
: targetScrollLeft > maxScrollLeft
|
|
541
|
+
? targetScrollLeft - maxScrollLeft
|
|
542
|
+
: 0;
|
|
543
|
+
const sign = Math.sign(scrollDelta);
|
|
544
|
+
const easedDistance = iOSRubberBand(overscroll, 0, maxDistance);
|
|
545
|
+
container.style.setProperty(CSS_VARS.overscrollTranslateX, `${-sign * easedDistance}px`);
|
|
546
|
+
items.forEach((item) => {
|
|
547
|
+
// we have to translate the items instead of the content because
|
|
548
|
+
// Safari scrolls the viewport if the content is translated
|
|
549
|
+
if (item instanceof HTMLElement) {
|
|
550
|
+
item.style.translate = `var(${CSS_VARS.overscrollTranslateX}) 0`;
|
|
551
|
+
}
|
|
552
|
+
});
|
|
553
|
+
state.velocityX =
|
|
554
|
+
-sign *
|
|
555
|
+
Math.max(easedDistance / RUBBER_BAND_BOUNCE_COEFFICIENT, Math.abs(state.velocityX));
|
|
556
|
+
}, []);
|
|
557
|
+
/**
|
|
558
|
+
* Update scroll position and velocity on pointer move.
|
|
559
|
+
*/
|
|
560
|
+
const handlePointerMove = useCallback((event) => {
|
|
561
|
+
const container = containerRef.current;
|
|
562
|
+
const state = scrollStateRef.current;
|
|
563
|
+
const maxAbsoluteVelocity = 15;
|
|
564
|
+
if (!state.isDragging || !container || event.pointerType !== "mouse") {
|
|
565
|
+
onPointerMove?.(event);
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
container.style.scrollSnapType = "none";
|
|
569
|
+
const currentTime = Date.now();
|
|
570
|
+
const deltaTime = currentTime - state.lastTime;
|
|
571
|
+
const deltaX = event.clientX - state.lastX;
|
|
572
|
+
if (deltaTime > 0) {
|
|
573
|
+
state.velocityX = deltaX / deltaTime; // (pixels per millisecond)
|
|
574
|
+
clampVelocity(maxAbsoluteVelocity);
|
|
575
|
+
}
|
|
576
|
+
const scrollDelta = state.startX - event.clientX;
|
|
577
|
+
const direction = Math.sign(state.startX - event.clientX);
|
|
578
|
+
if (direction !== state.mouseDirection) {
|
|
579
|
+
state.mouseDirection = direction;
|
|
580
|
+
}
|
|
581
|
+
container.scrollLeft = state.scrollLeft + scrollDelta;
|
|
582
|
+
state.lastX = event.clientX;
|
|
583
|
+
state.lastTime = currentTime;
|
|
584
|
+
if (container.scrollLeft <= 1 ||
|
|
585
|
+
container.scrollLeft >=
|
|
586
|
+
container.scrollWidth - container.offsetWidth - 1) {
|
|
587
|
+
applyRubberBanding(container, scrollDelta);
|
|
588
|
+
clampVelocity(maxAbsoluteVelocity);
|
|
589
|
+
}
|
|
590
|
+
onPointerMove?.(event);
|
|
591
|
+
}, [applyRubberBanding, clampVelocity, onPointerMove]);
|
|
592
|
+
/**
|
|
593
|
+
* Updates velocity for proper snapping and returns the adjusted deceleration
|
|
594
|
+
* factor. Ensures the animation lands on the snap point and is visually
|
|
595
|
+
* perceptible.
|
|
596
|
+
*/
|
|
597
|
+
const applyMomentumSnapping = useCallback((container, initialScroll, tFinalScroll, decelerationFactor, minVelocity) => {
|
|
598
|
+
const state = scrollStateRef.current;
|
|
599
|
+
// Find where the browser would snap to at tFinalScroll
|
|
600
|
+
container.style.scrollSnapType = state.scrollSnapType;
|
|
601
|
+
container.scrollLeft = tFinalScroll;
|
|
602
|
+
const snappedScroll = container.scrollLeft;
|
|
603
|
+
container.style.scrollSnapType = "none";
|
|
604
|
+
container.scrollLeft = initialScroll;
|
|
605
|
+
const { finalScroll, iterations } = getFinalScroll(initialScroll, state.velocityX, decelerationFactor, minVelocity);
|
|
606
|
+
// update velocity to ensure momentum snaps to the correct position and
|
|
607
|
+
// the animation is not too fast
|
|
608
|
+
const minIterations = 10;
|
|
609
|
+
const gap = snappedScroll - finalScroll;
|
|
610
|
+
if (!isFinite(iterations) ||
|
|
611
|
+
iterations < minIterations ||
|
|
612
|
+
Math.abs(gap) > 0.5) {
|
|
613
|
+
const displacement = snappedScroll - initialScroll;
|
|
614
|
+
state.velocityX =
|
|
615
|
+
(-displacement * (1 - decelerationFactor)) /
|
|
616
|
+
(FRAME_DURATION *
|
|
617
|
+
(1 - Math.pow(decelerationFactor, minIterations)));
|
|
618
|
+
}
|
|
619
|
+
return findDecelerationFactor(initialScroll, snappedScroll, state.velocityX);
|
|
620
|
+
}, []);
|
|
621
|
+
/**
|
|
622
|
+
* Returns the deceleration factor for the momentum animation, accounting for
|
|
623
|
+
* snapping if needed.
|
|
624
|
+
*/
|
|
625
|
+
const computeMomentumDecelerationFactor = useCallback((container, minVelocity) => {
|
|
626
|
+
const minVelocityForSnapping = 0;
|
|
627
|
+
const state = scrollStateRef.current;
|
|
628
|
+
const isRubberBanding = container.scrollLeft <= 1 ||
|
|
629
|
+
container.scrollLeft >=
|
|
630
|
+
container.scrollWidth - container.offsetWidth - 1;
|
|
631
|
+
const rubberBandingFactor = isRubberBanding
|
|
632
|
+
? (state.velocityX * 25) / container.scrollWidth
|
|
633
|
+
: 0;
|
|
634
|
+
const friction = 0.05 + Math.abs(rubberBandingFactor);
|
|
635
|
+
const decelerationFactor = 1 - friction;
|
|
636
|
+
const initialScroll = container.scrollLeft;
|
|
637
|
+
const { finalScroll } = getFinalScroll(initialScroll, state.velocityX, decelerationFactor, minVelocity);
|
|
638
|
+
if (!isRubberBanding &&
|
|
639
|
+
finalScroll < container.scrollWidth - container.offsetWidth &&
|
|
640
|
+
finalScroll > 0 &&
|
|
641
|
+
Math.abs(state.velocityX) >= minVelocityForSnapping &&
|
|
642
|
+
state.scrollSnapType) {
|
|
643
|
+
return applyMomentumSnapping(container, initialScroll, finalScroll, decelerationFactor, minVelocity);
|
|
644
|
+
}
|
|
645
|
+
return decelerationFactor;
|
|
646
|
+
}, [applyMomentumSnapping]);
|
|
647
|
+
/**
|
|
648
|
+
* Start the momentum animation if needed.
|
|
649
|
+
*/
|
|
650
|
+
const startMomentumAnimation = useCallback(() => {
|
|
651
|
+
const container = containerRef.current;
|
|
652
|
+
if (!container) {
|
|
653
|
+
return;
|
|
654
|
+
}
|
|
655
|
+
const state = scrollStateRef.current;
|
|
656
|
+
const minVelocity = 0.00001;
|
|
657
|
+
const decelerationFactor = computeMomentumDecelerationFactor(container, minVelocity);
|
|
658
|
+
const animate = () => {
|
|
659
|
+
const container2 = containerRef.current;
|
|
660
|
+
if (!container2) {
|
|
661
|
+
return;
|
|
662
|
+
}
|
|
663
|
+
container2.style.scrollSnapType = "none";
|
|
664
|
+
container2.scrollLeft -= state.velocityX * FRAME_DURATION;
|
|
665
|
+
state.scrollLeft = container2.scrollLeft;
|
|
666
|
+
state.velocityX *= decelerationFactor;
|
|
667
|
+
const newScrollLeft = container2.scrollLeft;
|
|
668
|
+
const scrollWidth = container2.scrollWidth;
|
|
669
|
+
const offsetWidth = container2.offsetWidth;
|
|
670
|
+
const remainingForwards = scrollWidth - offsetWidth - newScrollLeft;
|
|
671
|
+
const remainingBackwards = newScrollLeft;
|
|
672
|
+
// Overscroll rubber band bounce-back
|
|
673
|
+
if (Math.abs(state.velocityX) > minVelocity &&
|
|
674
|
+
(remainingForwards <= 1 || remainingBackwards < 1)) {
|
|
675
|
+
const content = container2.querySelector("[data-carousel-content]");
|
|
676
|
+
if (content instanceof HTMLElement) {
|
|
677
|
+
const items = content.querySelectorAll(":scope > *");
|
|
678
|
+
// we have to translate the items instead of the content because
|
|
679
|
+
// Safari scrolls the viewport if the content is translated
|
|
680
|
+
const theoreticalTranslate = state.velocityX * RUBBER_BAND_BOUNCE_COEFFICIENT;
|
|
681
|
+
const clampedTranslate = Math.sign(theoreticalTranslate) *
|
|
682
|
+
Math.min(Math.abs(theoreticalTranslate), container2.offsetWidth / 2);
|
|
683
|
+
container2.style.setProperty(CSS_VARS.overscrollTranslateX, `${clampedTranslate}px`);
|
|
684
|
+
items.forEach((item) => {
|
|
685
|
+
if (item instanceof HTMLElement) {
|
|
686
|
+
item.style.translate = `var(${CSS_VARS.overscrollTranslateX}) 0`;
|
|
687
|
+
}
|
|
688
|
+
});
|
|
689
|
+
state.velocityX *= decelerationFactor;
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
if (Math.abs(state.velocityX) > minVelocity) {
|
|
693
|
+
state.animationId = requestAnimationFrame(animate);
|
|
694
|
+
}
|
|
695
|
+
else {
|
|
696
|
+
clearAnimation();
|
|
697
|
+
}
|
|
698
|
+
};
|
|
699
|
+
state.animationId = requestAnimationFrame(animate);
|
|
700
|
+
}, [clearAnimation, computeMomentumDecelerationFactor]);
|
|
701
|
+
/**
|
|
702
|
+
* Trigger momentum animation when dragging stops, dispatch click if needed.
|
|
703
|
+
*/
|
|
704
|
+
const handlePointerUp = useCallback((event) => {
|
|
705
|
+
if (event.pointerType !== "mouse") {
|
|
706
|
+
return;
|
|
707
|
+
}
|
|
708
|
+
const container = containerRef.current;
|
|
709
|
+
if ("pointerId" in event) {
|
|
710
|
+
container?.releasePointerCapture(event.pointerId);
|
|
711
|
+
}
|
|
712
|
+
const state = scrollStateRef.current;
|
|
713
|
+
if (!state.isDragging || !container) {
|
|
714
|
+
return;
|
|
715
|
+
}
|
|
716
|
+
container.style.overflowX = "";
|
|
717
|
+
// dispatch click if needed (we prevented it on pointer down)
|
|
718
|
+
if (state.initialPointerPosition &&
|
|
719
|
+
Math.hypot(state.initialPointerPosition.x - event.clientX, state.initialPointerPosition.y - event.clientY) < 3) {
|
|
720
|
+
state.isDispatchingClick = true;
|
|
721
|
+
state.initialTarget?.dispatchEvent(new MouseEvent("click", { bubbles: true, cancelable: true }));
|
|
722
|
+
state.isDispatchingClick = false;
|
|
723
|
+
}
|
|
724
|
+
state.initialTarget = null;
|
|
725
|
+
state.initialPointerPosition = null;
|
|
726
|
+
state.isDragging = false;
|
|
727
|
+
startMomentumAnimation();
|
|
728
|
+
if (event instanceof PointerEvent) {
|
|
729
|
+
return;
|
|
730
|
+
}
|
|
731
|
+
onPointerUp?.(event);
|
|
732
|
+
}, [onPointerUp, startMomentumAnimation]);
|
|
733
|
+
useEffect(() => {
|
|
734
|
+
document.addEventListener("pointerup", handlePointerUp);
|
|
735
|
+
return () => {
|
|
736
|
+
document.removeEventListener("pointerup", handlePointerUp);
|
|
737
|
+
};
|
|
738
|
+
}, [handlePointerUp]);
|
|
739
|
+
const lastTabScrollLeft = useRef(null);
|
|
740
|
+
/**
|
|
741
|
+
* Scroll to the focused element into view if it's not already visible
|
|
742
|
+
*/
|
|
743
|
+
const handleFocus = useCallback((event) => {
|
|
744
|
+
const container = containerRef.current;
|
|
745
|
+
const { target } = event;
|
|
746
|
+
if (container &&
|
|
747
|
+
target instanceof HTMLElement &&
|
|
748
|
+
target !== event.currentTarget) {
|
|
749
|
+
if (lastTabScrollLeft.current !== null) {
|
|
750
|
+
container.scrollLeft = lastTabScrollLeft.current;
|
|
751
|
+
}
|
|
752
|
+
scrollIntoView(target, container, "nearest");
|
|
753
|
+
lastTabScrollLeft.current = null;
|
|
754
|
+
}
|
|
755
|
+
}, [scrollIntoView]);
|
|
756
|
+
useEffect(() => {
|
|
757
|
+
const container = containerRef.current;
|
|
758
|
+
if (!container) {
|
|
759
|
+
return;
|
|
760
|
+
}
|
|
761
|
+
const handleKeyDown = (event) => {
|
|
762
|
+
if (event.key === "Tab") {
|
|
763
|
+
if (event.target instanceof HTMLElement &&
|
|
764
|
+
container.contains(event.target)) {
|
|
765
|
+
lastTabScrollLeft.current = container.scrollLeft;
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
};
|
|
769
|
+
container.addEventListener("focus", handleFocus, { capture: true });
|
|
770
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
771
|
+
return () => {
|
|
772
|
+
container.removeEventListener("focus", handleFocus, { capture: true });
|
|
773
|
+
document.removeEventListener("keydown", handleKeyDown);
|
|
774
|
+
};
|
|
775
|
+
}, [handleFocus]);
|
|
776
|
+
return (_jsx("div", { ref: combineRefs(containerRef, forwardedRef), ...props, onPointerDownCapture: handlePointerDown, onPointerMove: handlePointerMove, onPointerUp: handlePointerUp, onClickCapture: (event) => {
|
|
777
|
+
// detail === 0 means the click was synthesized by the keyboard (Enter/Space),
|
|
778
|
+
// not by a pointer device — let it through unconditionally
|
|
779
|
+
if (!scrollStateRef.current.isDispatchingClick &&
|
|
780
|
+
event.detail !== 0) {
|
|
781
|
+
event.preventDefault();
|
|
782
|
+
event.stopPropagation();
|
|
783
|
+
}
|
|
784
|
+
onClickCapture?.(event);
|
|
785
|
+
}, onWheel: (event) => {
|
|
786
|
+
event.currentTarget.style.scrollSnapType =
|
|
787
|
+
scrollStateRef.current.scrollSnapType;
|
|
788
|
+
onWheel?.(event);
|
|
789
|
+
}, "data-carousel-viewport": "", "data-can-scroll": scrollsForwards && scrollsBackwards
|
|
790
|
+
? "both"
|
|
791
|
+
: scrollsForwards
|
|
792
|
+
? "forwards"
|
|
793
|
+
: scrollsBackwards
|
|
794
|
+
? "backwards"
|
|
795
|
+
: "none", className: className, style: {
|
|
796
|
+
...(contentFade
|
|
797
|
+
? {
|
|
798
|
+
[CSS_VARS.fadeSize]: typeof contentFadeSize === "number"
|
|
799
|
+
? `${contentFadeSize}px`
|
|
800
|
+
: contentFadeSize,
|
|
801
|
+
[CSS_VARS.fadeOffsetBackwards]: `min(var(${CSS_VARS.remainingBackwards}, 0px), 0px)`,
|
|
802
|
+
[CSS_VARS.fadeOffsetForwards]: `min(var(${CSS_VARS.remainingForwards}, 0px), 0px)`,
|
|
803
|
+
maskImage: `linear-gradient(
|
|
804
|
+
to right,
|
|
805
|
+
transparent var(${CSS_VARS.fadeOffsetBackwards}),
|
|
806
|
+
#000 calc(min(var(${CSS_VARS.remainingBackwards}, 0px), var(${CSS_VARS.fadeSize})) + var(${CSS_VARS.fadeOffsetBackwards})),
|
|
807
|
+
#000 calc(100% - min(var(${CSS_VARS.remainingForwards}, 0px), var(${CSS_VARS.fadeSize})) - var(${CSS_VARS.fadeOffsetForwards})),
|
|
808
|
+
transparent calc(100% - var(${CSS_VARS.fadeOffsetForwards}))
|
|
809
|
+
)`,
|
|
810
|
+
maskSize: "100% 100%",
|
|
811
|
+
}
|
|
812
|
+
: {}),
|
|
813
|
+
position: "relative",
|
|
814
|
+
overflow: "scroll",
|
|
815
|
+
msOverflowStyle: "none",
|
|
816
|
+
overscrollBehaviorX: "contain",
|
|
817
|
+
scrollbarColor: "transparent transparent",
|
|
818
|
+
scrollbarWidth: "none",
|
|
819
|
+
scrollSnapType,
|
|
820
|
+
...style,
|
|
821
|
+
}, children: children }));
|
|
822
|
+
});
|
|
823
|
+
CarouselViewport.displayName = "Carousel.Viewport";
|
|
824
|
+
const CarouselContent = forwardRef(({ children, ...props }, ref) => {
|
|
825
|
+
return (_jsx("div", { ref: ref, ...props, style: { width: "fit-content", ...props.style }, "data-carousel-content": "", children: children }));
|
|
826
|
+
});
|
|
827
|
+
CarouselContent.displayName = "Carousel.Content";
|
|
828
|
+
const CarouselItem = forwardRef(({ children, asChild, ...props }, ref) => {
|
|
829
|
+
if (asChild && isValidElement(children)) {
|
|
830
|
+
const child = children;
|
|
831
|
+
const childRef = children.ref;
|
|
832
|
+
return cloneElement(child, {
|
|
833
|
+
...props,
|
|
834
|
+
ref: childRef ? combineRefs(childRef, ref) : ref,
|
|
835
|
+
"data-carousel-item": "",
|
|
836
|
+
});
|
|
837
|
+
}
|
|
838
|
+
return (_jsx("div", { ref: ref, ...props, "data-carousel-item": "", children: children }));
|
|
839
|
+
});
|
|
840
|
+
CarouselItem.displayName = "Carousel.Item";
|
|
841
|
+
const CarouselNextPage = forwardRef(({ children, onClick, disabled, ...props }, ref) => {
|
|
842
|
+
const { scrollsForwards, handleScrollToNext } = useContext(CarouselContext);
|
|
843
|
+
return (_jsx("button", { ref: ref, ...props, onClick: (event) => {
|
|
844
|
+
handleScrollToNext();
|
|
845
|
+
onClick?.(event);
|
|
846
|
+
}, disabled: disabled ?? !scrollsForwards, children: children }));
|
|
847
|
+
});
|
|
848
|
+
CarouselNextPage.displayName = "Carousel.NextPage";
|
|
849
|
+
const CarouselPrevPage = forwardRef(({ children, onClick, disabled, ...props }, ref) => {
|
|
850
|
+
const { scrollsBackwards, handleScrollToPrev } = useContext(CarouselContext);
|
|
851
|
+
return (_jsx("button", { ref: ref, ...props, onClick: (event) => {
|
|
852
|
+
handleScrollToPrev();
|
|
853
|
+
onClick?.(event);
|
|
854
|
+
}, disabled: disabled ?? !scrollsBackwards, children: children }));
|
|
855
|
+
});
|
|
856
|
+
CarouselPrevPage.displayName = "Carousel.PrevPage";
|
|
857
|
+
/**
|
|
858
|
+
* Returns the computed boundary offset (used for adjusting prev / next scroll)
|
|
859
|
+
*/
|
|
860
|
+
const getBoundaryOffset = (boundaryOffset, root) => {
|
|
861
|
+
return typeof boundaryOffset === "function"
|
|
862
|
+
? boundaryOffset(root)
|
|
863
|
+
: (boundaryOffset ?? { x: 0, y: 0 });
|
|
864
|
+
};
|
|
865
|
+
/**
|
|
866
|
+
* Returns the normalized scroll-snap-align given a computed style.
|
|
867
|
+
*/
|
|
868
|
+
const getScrollSnapAlign = (computedStyle) => {
|
|
869
|
+
if (computedStyle) {
|
|
870
|
+
const scrollSnapAlign = computedStyle
|
|
871
|
+
.getPropertyValue("scroll-snap-align")
|
|
872
|
+
.split(" ");
|
|
873
|
+
const [block, inline] = scrollSnapAlign;
|
|
874
|
+
if (block && inline) {
|
|
875
|
+
return [block, inline];
|
|
876
|
+
}
|
|
877
|
+
else if (block) {
|
|
878
|
+
return [block, block];
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
return [];
|
|
882
|
+
};
|
|
883
|
+
/**
|
|
884
|
+
* Returns the deceleration factor needed to travel from initialScroll to
|
|
885
|
+
* targetScroll given an initial velocity.
|
|
886
|
+
*/
|
|
887
|
+
const findDecelerationFactor = (initialScroll, targetScroll, velocity) => {
|
|
888
|
+
const totalDisplacement = targetScroll - initialScroll;
|
|
889
|
+
const factor = 1 + (velocity * FRAME_DURATION) / totalDisplacement;
|
|
890
|
+
if (!isFinite(factor) || factor <= 0 || factor >= 1) {
|
|
891
|
+
return 0.95;
|
|
892
|
+
}
|
|
893
|
+
return factor;
|
|
894
|
+
};
|
|
895
|
+
/**
|
|
896
|
+
* Returns the final scroll position and the number of iterations required to
|
|
897
|
+
* reach it, based on the given parameters.
|
|
898
|
+
*/
|
|
899
|
+
const getFinalScroll = (initialScroll, velocity, decelerationFactor, minVelocity = 0.05) => {
|
|
900
|
+
if (decelerationFactor >= 1) {
|
|
901
|
+
return { finalScroll: initialScroll, iterations: 0 };
|
|
902
|
+
}
|
|
903
|
+
// Number of frames until velocity drops below minVelocity
|
|
904
|
+
const iterations = Math.ceil(Math.log(minVelocity / Math.abs(velocity)) / Math.log(decelerationFactor));
|
|
905
|
+
const finalScroll = initialScroll -
|
|
906
|
+
(velocity *
|
|
907
|
+
FRAME_DURATION *
|
|
908
|
+
(1 - Math.pow(decelerationFactor, iterations))) /
|
|
909
|
+
(1 - decelerationFactor);
|
|
910
|
+
return { finalScroll, iterations };
|
|
911
|
+
};
|
|
912
|
+
/**
|
|
913
|
+
* Combines the given refs into a single ref
|
|
914
|
+
*/
|
|
915
|
+
const combineRefs = (...refs) => {
|
|
916
|
+
return (node) => {
|
|
917
|
+
refs.forEach((ref) => {
|
|
918
|
+
if (typeof ref === "function") {
|
|
919
|
+
ref(node);
|
|
920
|
+
}
|
|
921
|
+
else if (ref != null) {
|
|
922
|
+
ref.current = node;
|
|
923
|
+
}
|
|
924
|
+
});
|
|
925
|
+
};
|
|
926
|
+
};
|
|
927
|
+
const iOSRubberBand = (translation, ratio, dimension = 1) => {
|
|
928
|
+
const constant = 0.55;
|
|
929
|
+
const easedValue = (1 - 1 / ((translation * constant) / dimension + 1)) * dimension;
|
|
930
|
+
return easedValue * (1 - ratio);
|
|
931
|
+
};
|
|
932
|
+
export const Carousel = {
|
|
933
|
+
Root: CarouselRoot,
|
|
934
|
+
Viewport: CarouselViewport,
|
|
935
|
+
Content: CarouselContent,
|
|
936
|
+
Item: CarouselItem,
|
|
937
|
+
PrevPage: CarouselPrevPage,
|
|
938
|
+
NextPage: CarouselNextPage,
|
|
939
|
+
useCarouselContext,
|
|
940
|
+
defaultBoundaryOffset,
|
|
941
|
+
CSS_VARS,
|
|
942
|
+
};
|
|
943
|
+
//# sourceMappingURL=Carousel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Carousel.js","sourceRoot":"","sources":["../src/Carousel.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maybe.js","sourceRoot":"","sources":["../../src/utils/maybe.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@daformat/react-headless-carousel",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"description": "A react headless carousel component, with no dependencies, supporting drag to scroll, inertia, rubber-banding, snapping and more",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"carousel",
|
|
8
|
+
"react",
|
|
9
|
+
"headless",
|
|
10
|
+
"carousel-component",
|
|
11
|
+
"react-component"
|
|
12
|
+
],
|
|
13
|
+
"homepage": "https://github.com/daformat/react-headless-carousel",
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/daformat/react-headless-carousel/issues"
|
|
16
|
+
},
|
|
17
|
+
"author": "Mathieu Jouhet",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/daformat/react-headless-carousel.git"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"build": "tsc",
|
|
24
|
+
"ci": "pnpm build && pnpm format:check && pnpm test",
|
|
25
|
+
"format": "prettier --write .",
|
|
26
|
+
"format:check": "prettier --check .",
|
|
27
|
+
"local-release": "changeset version && changeset publish",
|
|
28
|
+
"prepublishOnly": "npm run ci",
|
|
29
|
+
"test": "vitest run"
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"dist"
|
|
33
|
+
],
|
|
34
|
+
"type": "module",
|
|
35
|
+
"main": "dist/index.js",
|
|
36
|
+
"packageManager": "pnpm@10.4.0+sha512.6b849d0787d97f8f4e1f03a9b8ff8f038e79e153d6f11ae539ae7c435ff9e796df6a862c991502695c7f9e8fac8aeafc1ac5a8dab47e36148d183832d886dd52",
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"react": ">=18"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@changesets/cli": "^2.30.0",
|
|
42
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
43
|
+
"@testing-library/react": "^16.3.2",
|
|
44
|
+
"@types/react": "^18.3.1",
|
|
45
|
+
"@vitejs/plugin-react": "^6.0.1",
|
|
46
|
+
"jsdom": "^29.0.1",
|
|
47
|
+
"prettier": "^3.8.1",
|
|
48
|
+
"react": "^18.3.1",
|
|
49
|
+
"react-dom": "^18.3.1",
|
|
50
|
+
"typescript": "^6.0.2",
|
|
51
|
+
"vitest": "^4.1.1"
|
|
52
|
+
}
|
|
53
|
+
}
|