@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 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
@@ -0,0 +1,3 @@
1
+ # React headless carousel
2
+
3
+ A react headless carousel component
@@ -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,2 @@
1
+ export { Carousel } from "./Carousel.js";
2
+ //# sourceMappingURL=index.js.map
@@ -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,2 @@
1
+ import "@testing-library/jest-dom";
2
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=maybe.js.map
@@ -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
+ }