@yoursurprise/slider 0.0.21 → 1.0.1

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,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2023 YourSurprise
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ 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, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # React slider (alpha)
1
+ # React slider
2
2
 
3
3
  This package contains a basic modern slider. The purpose of this slider is to provide a simple React component
4
4
  which can be controlled in a userfriendly way on mobile, tablet and desktop.
@@ -12,18 +12,15 @@ This slider has the following features:
12
12
  - Buttons to navigate on devices with a mouse
13
13
  - Support for multiple variable width slides
14
14
 
15
- Before using this slider, please consider the following:
16
- - This project is still being set up, this is an alpha version
17
- - The slider only contains styling to make it functional
18
- - There is no configuration of most aforementioned features (yet)
19
-
20
- Todos:
15
+ Todos (help appreciated):
21
16
  - ~~Add a demo page~~
22
17
  - Add more configuration
23
18
  - Add end-to-end tests
24
19
  - ~~Set up proper workflows in GitHub~~
25
20
  - ~~Set the GitHub repository to public~~
26
21
  - Support more browsers
22
+ - Improve accessibility
23
+ - Reduce amount of required tooling
27
24
 
28
25
  All browsers with [IntersectionObserver](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API) will be supported, as of right now, only the latest versions of browsers are supported.
29
26
 
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import './Button.scss';
3
+ interface Props {
4
+ onClick: () => void;
5
+ isHidden: boolean;
6
+ }
7
+ export declare const NextButton: React.FC<Props>;
8
+ export {};
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import './Button.scss';
3
+ interface Props {
4
+ onClick: () => void;
5
+ isHidden: boolean;
6
+ }
7
+ export declare const PreviousButton: React.FC<Props>;
8
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ export declare enum Visibility {
2
+ FULL = 0,
3
+ PARTIAL = 1,
4
+ NONE = 2
5
+ }
6
+ export declare enum NavigationDirection {
7
+ PREV = 0,
8
+ NEXT = 1
9
+ }
10
+ interface UseSlider {
11
+ getLeftPositionToScrollTo: (direction: NavigationDirection, slideOffsetLeft: number, wrapperOffsetLeft: number, wrapperWidth: number, slideWidth: number) => number;
12
+ getVisibilityByIntersectionRatio: (intersectionRatio: number) => Visibility;
13
+ getFirstVisibleSlideIndex: () => number;
14
+ getLastVisibleSlideIndex: () => number;
15
+ addVisibleSlide: (index: number) => void;
16
+ addPartiallyVisibleSlide: (index: number) => void;
17
+ sortSlides: () => void;
18
+ removeVisibleSlide: (index: number) => void;
19
+ removePartiallyVisibleSlide: (index: number) => void;
20
+ }
21
+ export declare const useSlider: () => UseSlider;
22
+ export {};
package/dist/index.css CHANGED
@@ -1,6 +1,3 @@
1
- .slider {
2
- position: relative;
3
- }
4
1
  .slider__button {
5
2
  position: absolute;
6
3
  top: 0;
@@ -19,6 +16,9 @@
19
16
  box-shadow: inset 0 0 0 1px rgba(32, 32, 32, 0.1);
20
17
  transition: box-shadow 0.2s ease-in-out;
21
18
  }
19
+ .slider__button__icon {
20
+ fill: #554c44;
21
+ }
22
22
  .slider__button:hover {
23
23
  box-shadow: inset 0 0 0 1px rgba(32, 32, 32, 0.2);
24
24
  }
@@ -36,6 +36,9 @@
36
36
  .slider__button--prev {
37
37
  left: 5px;
38
38
  }
39
+ .slider {
40
+ position: relative;
41
+ }
39
42
  .slider__wrapper {
40
43
  overscroll-behavior-x: contain;
41
44
  -ms-overflow-style: none;
@@ -1 +1 @@
1
- {"version":3,"sources":["Slider.scss"],"names":[],"mappings":"AAAA;EACE,kBAAkB;AACpB;AACA;EACE,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,YAAY;EACZ,WAAW;EACX,cAAc;EACd,kBAAkB;EAClB,uBAAuB;EACvB,mBAAmB;EACnB,uBAAuB;EACvB,eAAe;EACf,aAAa;EACb,YAAY;EACZ,aAAa;EACb,iDAAiD;EACjD,uCAAuC;AACzC;AACA;EACE,iDAAiD;AACnD;AACA;EACE;IACE,aAAa;EACf;AACF;AACA;EACE,aAAa;AACf;AACA;EACE,UAAU;AACZ;AACA;EACE,SAAS;AACX;AACA;EACE,8BAA8B;EAC9B,wBAAwB;EACxB,qBAAqB;EACrB,aAAa;EACb,mBAAmB;EACnB,gBAAgB;EAChB,6BAA6B;AAC/B;AACA;EACE,aAAa;AACf;AACA;EACE;IACE,yBAAyB;EAC3B;AACF;AACA;EACE,uBAAuB;AACzB;AACA;EACE,YAAY;AACd;AACA;EACE,gBAAgB;EAChB,iBAAiB;AACnB;AACA;EACE,wBAAwB;AAC1B","file":"index.css","sourcesContent":[".slider {\n position: relative;\n}\n.slider__button {\n position: absolute;\n top: 0;\n bottom: 0;\n height: 48px;\n width: 48px;\n margin: auto 0;\n border-radius: 50%;\n background-color: white;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n display: none;\n border: none;\n outline: none;\n box-shadow: inset 0 0 0 1px rgba(32, 32, 32, 0.1);\n transition: box-shadow 0.2s ease-in-out;\n}\n.slider__button:hover {\n box-shadow: inset 0 0 0 1px rgba(32, 32, 32, 0.2);\n}\n@media (hover: hover) {\n .slider__button {\n display: flex;\n }\n}\n.slider__button--hidden {\n display: none;\n}\n.slider__button--next {\n right: 5px;\n}\n.slider__button--prev {\n left: 5px;\n}\n.slider__wrapper {\n overscroll-behavior-x: contain;\n -ms-overflow-style: none;\n scrollbar-width: none;\n display: flex;\n flex-direction: row;\n overflow-x: auto;\n scroll-snap-type: x proximity;\n}\n.slider__wrapper::-webkit-scrollbar {\n display: none;\n}\n@media (hover: hover) {\n .slider__wrapper {\n scroll-snap-type: initial;\n }\n}\n.slider__wrapper:not(.is-dragging) {\n scroll-behavior: smooth;\n}\n.slider__wrapper.is-scrollable {\n cursor: move;\n}\n.slider__wrapper.is-dragging {\n cursor: grabbing;\n user-select: none;\n}\n.slider__wrapper__slide {\n scroll-snap-align: start;\n}"]}
1
+ {"version":3,"sources":["Button.scss","Slider.scss"],"names":[],"mappings":"AAAA;EACE,kBAAkB;EAClB,MAAM;EACN,SAAS;EACT,YAAY;EACZ,WAAW;EACX,cAAc;EACd,kBAAkB;EAClB,uBAAuB;EACvB,mBAAmB;EACnB,uBAAuB;EACvB,eAAe;EACf,aAAa;EACb,YAAY;EACZ,aAAa;EACb,iDAAiD;EACjD,uCAAuC;AACzC;AACA;EACE,aAAa;AACf;AACA;EACE,iDAAiD;AACnD;AACA;EACE;IACE,aAAa;EACf;AACF;AACA;EACE,aAAa;AACf;AACA;EACE,UAAU;AACZ;AACA;EACE,SAAS;AACX;ACrCA;EACE,kBAAkB;AACpB;AACA;EACE,8BAA8B;EAC9B,wBAAwB;EACxB,qBAAqB;EACrB,aAAa;EACb,mBAAmB;EACnB,gBAAgB;EAChB,6BAA6B;AAC/B;AACA;EACE,aAAa;AACf;AACA;EACE;IACE,yBAAyB;EAC3B;AACF;AACA;EACE,uBAAuB;AACzB;AACA;EACE,YAAY;AACd;AACA;EACE,gBAAgB;EAChB,iBAAiB;AACnB;AACA;EACE,wBAAwB;AAC1B","file":"index.css","sourcesContent":[".slider__button {\n position: absolute;\n top: 0;\n bottom: 0;\n height: 48px;\n width: 48px;\n margin: auto 0;\n border-radius: 50%;\n background-color: white;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n display: none;\n border: none;\n outline: none;\n box-shadow: inset 0 0 0 1px rgba(32, 32, 32, 0.1);\n transition: box-shadow 0.2s ease-in-out;\n}\n.slider__button__icon {\n fill: #554c44;\n}\n.slider__button:hover {\n box-shadow: inset 0 0 0 1px rgba(32, 32, 32, 0.2);\n}\n@media (hover: hover) {\n .slider__button {\n display: flex;\n }\n}\n.slider__button--hidden {\n display: none;\n}\n.slider__button--next {\n right: 5px;\n}\n.slider__button--prev {\n left: 5px;\n}",".slider {\n position: relative;\n}\n.slider__wrapper {\n overscroll-behavior-x: contain;\n -ms-overflow-style: none;\n scrollbar-width: none;\n display: flex;\n flex-direction: row;\n overflow-x: auto;\n scroll-snap-type: x proximity;\n}\n.slider__wrapper::-webkit-scrollbar {\n display: none;\n}\n@media (hover: hover) {\n .slider__wrapper {\n scroll-snap-type: initial;\n }\n}\n.slider__wrapper:not(.is-dragging) {\n scroll-behavior: smooth;\n}\n.slider__wrapper.is-scrollable {\n cursor: move;\n}\n.slider__wrapper.is-dragging {\n cursor: grabbing;\n user-select: none;\n}\n.slider__wrapper__slide {\n scroll-snap-align: start;\n}"]}
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { useRef, useState, useEffect, useCallback, Children } from 'react';
3
3
 
4
4
  var classnamesExports = {};
@@ -66,22 +66,82 @@ var classnames = {
66
66
 
67
67
  var classNames = classnamesExports;
68
68
 
69
- var Visbility;
70
- (function (Visbility) {
71
- Visbility[Visbility["FULL"] = 0] = "FULL";
72
- Visbility[Visbility["PARTIAL"] = 1] = "PARTIAL";
73
- Visbility[Visbility["NONE"] = 2] = "NONE";
74
- })(Visbility || (Visbility = {}));
69
+ const NextButton = ({ onClick, isHidden }) => {
70
+ return (jsx("button", { "aria-label": "Next slide", type: "button", onClick: onClick, "aria-hidden": isHidden, className: classNames([
71
+ 'slider__button',
72
+ 'slider__button--next',
73
+ { 'slider__button--hidden': isHidden },
74
+ ]), children: jsx("svg", { className: "slider__button__icon", xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 256 256", children: jsx("path", { d: "M96,216a8.5,8.5,0,0,1-5.7-2.3,8.1,8.1,0,0,1,0-11.4L164.7,128,90.3,53.7a8.1,8.1,0,0,1,11.4-11.4l80,80a8.1,8.1,0,0,1,0,11.4l-80,80A8.5,8.5,0,0,1,96,216Z" }) }) }));
75
+ };
76
+
77
+ const PreviousButton = ({ onClick, isHidden }) => {
78
+ return (jsx("button", { "aria-label": "Previous slide", type: "button", onClick: onClick, "aria-hidden": isHidden, className: classNames([
79
+ 'slider__button',
80
+ 'slider__button--prev',
81
+ { 'slider__button--hidden': isHidden },
82
+ ]), children: jsx("svg", { className: "slider__button__icon", xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 256 256", children: jsx("path", { d: "M160,216a8.5,8.5,0,0,1-5.7-2.3l-80-80a8.1,8.1,0,0,1,0-11.4l80-80a8.1,8.1,0,0,1,11.4,11.4L91.3,128l74.4,74.3a8.1,8.1,0,0,1,0,11.4A8.5,8.5,0,0,1,160,216Z" }) }) }));
83
+ };
84
+
85
+ var Visibility;
86
+ (function (Visibility) {
87
+ Visibility[Visibility["FULL"] = 0] = "FULL";
88
+ Visibility[Visibility["PARTIAL"] = 1] = "PARTIAL";
89
+ Visibility[Visibility["NONE"] = 2] = "NONE";
90
+ })(Visibility || (Visibility = {}));
75
91
  var NavigationDirection;
76
92
  (function (NavigationDirection) {
77
93
  NavigationDirection[NavigationDirection["PREV"] = 0] = "PREV";
78
94
  NavigationDirection[NavigationDirection["NEXT"] = 1] = "NEXT";
79
95
  })(NavigationDirection || (NavigationDirection = {}));
96
+ const useSlider = () => {
97
+ const visibleSlideIndices = useRef([]);
98
+ const partiallyVisibleSlideIndices = useRef([]);
99
+ const getFirstVisibleSlideIndex = () => visibleSlideIndices.current[0] ?? partiallyVisibleSlideIndices.current[0] ?? -1;
100
+ const getLastVisibleSlideIndex = () => visibleSlideIndices.current[visibleSlideIndices.current.length - 1]
101
+ ?? partiallyVisibleSlideIndices.current[partiallyVisibleSlideIndices.current.length - 1] ?? -1;
102
+ const addVisibleSlide = (index) => visibleSlideIndices.current.push(index);
103
+ const addPartiallyVisibleSlide = (index) => partiallyVisibleSlideIndices.current.push(index);
104
+ const removePartiallyVisibleSlide = (index) => partiallyVisibleSlideIndices.current = partiallyVisibleSlideIndices.current.filter((slideIndex) => slideIndex !== index);
105
+ const removeVisibleSlide = (index) => visibleSlideIndices.current = visibleSlideIndices.current.filter((slideIndex) => slideIndex !== index);
106
+ const sortSlides = () => {
107
+ visibleSlideIndices.current = [...new Set(visibleSlideIndices.current)].sort((a, b) => a - b);
108
+ partiallyVisibleSlideIndices.current = [...new Set(partiallyVisibleSlideIndices.current)].sort((a, b) => a - b);
109
+ };
110
+ const getLeftPositionToScrollTo = (direction, slideOffsetLeft, wrapperOffsetLeft, wrapperWidth, slideWidth) => {
111
+ let scrollLeft = 0;
112
+ if (direction === NavigationDirection.PREV) {
113
+ scrollLeft = slideOffsetLeft - wrapperOffsetLeft - wrapperWidth + slideWidth;
114
+ }
115
+ else {
116
+ scrollLeft = slideOffsetLeft - wrapperOffsetLeft;
117
+ }
118
+ return scrollLeft;
119
+ };
120
+ const getVisibilityByIntersectionRatio = (intersectionRatio) => {
121
+ if (intersectionRatio >= 0.9) {
122
+ return Visibility.FULL;
123
+ }
124
+ if (intersectionRatio >= 0.5) {
125
+ return Visibility.PARTIAL;
126
+ }
127
+ return Visibility.NONE;
128
+ };
129
+ return {
130
+ addVisibleSlide,
131
+ addPartiallyVisibleSlide,
132
+ removePartiallyVisibleSlide,
133
+ removeVisibleSlide,
134
+ sortSlides,
135
+ getFirstVisibleSlideIndex,
136
+ getLastVisibleSlideIndex,
137
+ getLeftPositionToScrollTo,
138
+ getVisibilityByIntersectionRatio,
139
+ };
140
+ };
141
+
80
142
  const Slider = ({ children, hideNavigationButtons = false }) => {
81
143
  const slides = useRef([]);
82
144
  const wrapper = useRef(null);
83
- const visibleSlideIndices = useRef([]);
84
- const partiallyVisibleSlideIndices = useRef([]);
85
145
  const [nextArrowVisible, setNextArrowVisible] = useState(false);
86
146
  const [prevArrowVisible, setPrevArrowVisible] = useState(false);
87
147
  const [isScrollable, setIsScrollable] = useState(false);
@@ -91,8 +151,7 @@ const Slider = ({ children, hideNavigationButtons = false }) => {
91
151
  clientX: 0,
92
152
  scrollX: 0,
93
153
  });
94
- const arrowPrevRef = useRef(null);
95
- const arrowNextRef = useRef(null);
154
+ const { getLeftPositionToScrollTo, getVisibilityByIntersectionRatio, addVisibleSlide, addPartiallyVisibleSlide, getLastVisibleSlideIndex, sortSlides, getFirstVisibleSlideIndex, removeVisibleSlide, removePartiallyVisibleSlide, } = useSlider();
96
155
  useEffect(() => {
97
156
  const currentWrapper = wrapper.current;
98
157
  if (!currentWrapper) {
@@ -126,9 +185,7 @@ const Slider = ({ children, hideNavigationButtons = false }) => {
126
185
  }
127
186
  setIsBlockingClicks(false);
128
187
  };
129
- const mouseUpHandler = () => {
130
- setIsDragging(false);
131
- };
188
+ const mouseUpHandler = () => setIsDragging(false);
132
189
  const mouseDownHandler = (event) => {
133
190
  setMousePosition({
134
191
  ...mousePosition,
@@ -149,26 +206,14 @@ const Slider = ({ children, hideNavigationButtons = false }) => {
149
206
  const addSlide = (node, index) => {
150
207
  slides.current[index] = {
151
208
  element: node,
152
- visibility: Visbility.NONE,
209
+ visibility: Visibility.NONE,
153
210
  };
154
211
  };
155
- const getFirstVisibleSlideIndex = () => visibleSlideIndices.current[0] ?? partiallyVisibleSlideIndices.current[0] ?? -1;
156
- const getLastVisibleSlideIndex = () => visibleSlideIndices.current[visibleSlideIndices.current.length - 1]
157
- ?? partiallyVisibleSlideIndices.current[partiallyVisibleSlideIndices.current.length - 1] ?? -1;
158
212
  const setControlsVisibility = useCallback(() => {
159
213
  const lastSlideFullyVisible = getLastVisibleSlideIndex() + 1 === slides.current.length;
160
214
  setPrevArrowVisible(getFirstVisibleSlideIndex() > 0 && isScrollable);
161
215
  setNextArrowVisible(isScrollable && lastSlideFullyVisible === false);
162
- }, [isScrollable]);
163
- const getVisibilityByIntersectionRatio = (intersectionRatio) => {
164
- if (intersectionRatio >= 0.9) {
165
- return Visbility.FULL;
166
- }
167
- if (intersectionRatio >= 0.5) {
168
- return Visbility.PARTIAL;
169
- }
170
- return Visbility.NONE;
171
- };
216
+ }, [getFirstVisibleSlideIndex, getLastVisibleSlideIndex, isScrollable]);
172
217
  useEffect(() => {
173
218
  if (!wrapper.current) {
174
219
  return () => { };
@@ -177,21 +222,11 @@ const Slider = ({ children, hideNavigationButtons = false }) => {
177
222
  entries.forEach((entry) => {
178
223
  const target = entry.target;
179
224
  const index = Number(target.dataset.slideIndex);
180
- if (getVisibilityByIntersectionRatio(entry.intersectionRatio) === Visbility.FULL) {
181
- visibleSlideIndices.current.push(index);
182
- }
183
- else {
184
- visibleSlideIndices.current = visibleSlideIndices.current.filter((slideIndex) => slideIndex !== index);
185
- }
186
- if (getVisibilityByIntersectionRatio(entry.intersectionRatio) === Visbility.PARTIAL) {
187
- partiallyVisibleSlideIndices.current.push(index);
188
- }
189
- else {
190
- partiallyVisibleSlideIndices.current = partiallyVisibleSlideIndices.current.filter((slideIndex) => slideIndex !== index);
191
- }
225
+ const visibility = getVisibilityByIntersectionRatio(entry.intersectionRatio);
226
+ visibility === Visibility.FULL ? addVisibleSlide(index) : removeVisibleSlide(index);
227
+ visibility === Visibility.PARTIAL ? addPartiallyVisibleSlide(index) : removePartiallyVisibleSlide(index);
192
228
  });
193
- visibleSlideIndices.current = [...new Set(visibleSlideIndices.current)].sort((a, b) => a - b);
194
- partiallyVisibleSlideIndices.current = [...new Set(partiallyVisibleSlideIndices.current)].sort((a, b) => a - b);
229
+ sortSlides();
195
230
  if (hideNavigationButtons === false) {
196
231
  setControlsVisibility();
197
232
  }
@@ -202,23 +237,27 @@ const Slider = ({ children, hideNavigationButtons = false }) => {
202
237
  });
203
238
  slides.current.forEach(({ element }) => intersectionObserver.observe(element));
204
239
  return () => intersectionObserver.disconnect();
205
- }, [wrapper, setControlsVisibility, hideNavigationButtons]);
240
+ }, [
241
+ wrapper,
242
+ setControlsVisibility,
243
+ hideNavigationButtons,
244
+ sortSlides,
245
+ addVisibleSlide,
246
+ removeVisibleSlide,
247
+ addPartiallyVisibleSlide,
248
+ removePartiallyVisibleSlide,
249
+ getVisibilityByIntersectionRatio,
250
+ ]);
206
251
  const navigate = (direction) => {
207
252
  if (!wrapper.current) {
208
253
  return;
209
254
  }
210
255
  const targetSlideIndex = direction === NavigationDirection.PREV ? getFirstVisibleSlideIndex() - 1 : getLastVisibleSlideIndex() + 1;
211
256
  const targetSlide = slides.current[targetSlideIndex];
212
- let scrollLeft = 0;
213
257
  if (!targetSlide) {
214
258
  return;
215
259
  }
216
- if (direction === NavigationDirection.PREV) {
217
- scrollLeft = targetSlide.element.offsetLeft - wrapper.current.offsetLeft - wrapper.current.clientWidth + targetSlide.element.clientWidth;
218
- }
219
- else {
220
- scrollLeft = targetSlide.element.offsetLeft - wrapper.current.offsetLeft;
221
- }
260
+ const scrollLeft = getLeftPositionToScrollTo(direction, targetSlide.element.offsetLeft, wrapper.current.offsetLeft, wrapper.current.clientWidth, targetSlide.element.clientWidth);
222
261
  wrapper.current.scrollTo({ behavior: 'smooth', left: scrollLeft, top: 0 });
223
262
  };
224
263
  return (jsxs("div", { className: "slider", children: [jsx("div", { role: "list", ref: wrapper, onMouseDown: mouseDownHandler, onMouseMove: mouseMoveHandler, onMouseUp: mouseUpHandler, onClickCapture: blockChildClickHandler, className: classNames('slider__wrapper', {
@@ -226,15 +265,7 @@ const Slider = ({ children, hideNavigationButtons = false }) => {
226
265
  'is-dragging': isDragging,
227
266
  }), children: Children.map(children, (child, index) => (jsx("div", { className: "slider__wrapper__slide", role: "listitem", "data-slide-index": index, ref: (node) => { if (node) {
228
267
  addSlide(node, index);
229
- } }, children: child }, index))) }), hideNavigationButtons === false && (jsx("button", { "aria-label": "Previous slide", type: "button", onClick: () => navigate(NavigationDirection.PREV), ref: arrowPrevRef, "aria-hidden": prevArrowVisible === false, className: classNames([
230
- 'slider__button',
231
- 'slider__button--prev',
232
- { 'slider__button--hidden': prevArrowVisible === false },
233
- ]), children: jsx("svg", { fill: "#554c44", xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 256 256", children: jsx("path", { d: "M160,216a8.5,8.5,0,0,1-5.7-2.3l-80-80a8.1,8.1,0,0,1,0-11.4l80-80a8.1,8.1,0,0,1,11.4,11.4L91.3,128l74.4,74.3a8.1,8.1,0,0,1,0,11.4A8.5,8.5,0,0,1,160,216Z" }) }) })), hideNavigationButtons === false && (jsx("button", { "aria-label": "Next slide", type: "button", onClick: () => navigate(NavigationDirection.NEXT), ref: arrowNextRef, "aria-hidden": nextArrowVisible === false, className: classNames([
234
- 'slider__button',
235
- 'slider__button--next',
236
- { 'slider__button--hidden': nextArrowVisible === false },
237
- ]), children: jsx("svg", { fill: "#554c44", xmlns: "http://www.w3.org/2000/svg", width: "18", height: "18", viewBox: "0 0 256 256", children: jsx("path", { d: "M96,216a8.5,8.5,0,0,1-5.7-2.3,8.1,8.1,0,0,1,0-11.4L164.7,128,90.3,53.7a8.1,8.1,0,0,1,11.4-11.4l80,80a8.1,8.1,0,0,1,0,11.4l-80,80A8.5,8.5,0,0,1,96,216Z" }) }) }))] }));
268
+ } }, children: child }, index))) }), hideNavigationButtons === false && (jsxs(Fragment, { children: [jsx(PreviousButton, { onClick: () => navigate(NavigationDirection.PREV), isHidden: prevArrowVisible === false }), jsx(NextButton, { onClick: () => navigate(NavigationDirection.NEXT), isHidden: nextArrowVisible === false })] }))] }));
238
269
  };
239
270
 
240
271
  export { Slider };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../node_modules/classnames/index.js","../src/Slider.tsx"],"sourcesContent":["/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\tvar nativeCodeString = '[native code]';\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n",null],"names":["_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../node_modules/classnames/index.js","../src/Components/Controls/NextButton.tsx","../src/Components/Controls/PreviousButton.tsx","../src/Hooks/UseSlider.ts","../src/Slider.tsx"],"sourcesContent":["/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\tvar nativeCodeString = '[native code]';\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n",null,null,null,null],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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","x_google_ignoreList":[0]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yoursurprise/slider",
3
- "version": "0.0.21",
3
+ "version": "1.0.1",
4
4
  "description": "Basic React slider using modern Javascript and CSS",
5
5
  "module": "dist/index.js",
6
6
  "main": "dist/index.js",
@@ -32,7 +32,7 @@
32
32
  "devDependencies": {
33
33
  "@babel/preset-env": "^7.19.4",
34
34
  "@babel/preset-react": "^7.18.6",
35
- "@babel/preset-typescript": "^7.18.6",
35
+ "@babel/preset-typescript": "^7.21.0",
36
36
  "@parcel/transformer-sass": "^2.8.3",
37
37
  "@rollup/plugin-commonjs": "^23.0.2",
38
38
  "@rollup/plugin-node-resolve": "^15.0.1",
@@ -40,33 +40,33 @@
40
40
  "@testing-library/jest-dom": "^5.16.5",
41
41
  "@testing-library/react": "^13.4.0",
42
42
  "@testing-library/user-event": "^14.4.3",
43
- "@types/jest": "^29.2.0",
44
- "@types/react": "^18.0.21",
45
- "@typescript-eslint/eslint-plugin": "^5.39.0",
46
- "@typescript-eslint/parser": "^5.39.0",
47
- "babel-jest": "^29.2.2",
48
- "eslint": "^8.26.0",
43
+ "@types/jest": "^29.5.0",
44
+ "@types/react": "^18.0.28",
45
+ "@typescript-eslint/eslint-plugin": "^5.56.0",
46
+ "@typescript-eslint/parser": "^5.56.0",
47
+ "babel-jest": "^29.5.0",
48
+ "eslint": "^8.36.0",
49
49
  "eslint-config-airbnb": "^19.0.4",
50
50
  "eslint-config-airbnb-typescript": "^17.0.0",
51
51
  "eslint-plugin-import": "^2.26.0",
52
52
  "eslint-plugin-jsx-a11y": "^6.6.1",
53
53
  "eslint-plugin-react": "^7.31.10",
54
54
  "eslint-plugin-react-hooks": "^4.6.0",
55
- "eslint-plugin-testing-library": "^5.9.1",
55
+ "eslint-plugin-testing-library": "^5.10.2",
56
56
  "gh-pages": "^5.0.0",
57
- "jest": "^29.2.2",
58
- "jest-environment-jsdom": "^29.2.2",
59
- "npm": "^8.19.3",
57
+ "jest": "^29.5.0",
58
+ "jest-environment-jsdom": "^29.5.0",
59
+ "npm": "^8.19.4",
60
60
  "parcel": "^2.8.3",
61
61
  "postcss": "^8.4.18",
62
62
  "process": "^0.11.10",
63
63
  "react": "^18.2.0",
64
64
  "react-dom": "^18.2.0",
65
65
  "react-test-renderer": "^18.2.0",
66
- "rollup": "^3.2.5",
66
+ "rollup": "^3.20.2",
67
67
  "rollup-plugin-peer-deps-external": "^2.2.4",
68
68
  "rollup-plugin-postcss": "^4.0.2",
69
- "sass": "^1.56.0",
69
+ "sass": "^1.60.0",
70
70
  "ts-node": "^10.9.1",
71
71
  "typescript": "^4.8.4"
72
72
  },
@@ -0,0 +1,42 @@
1
+ .slider__button {
2
+ position: absolute;
3
+ top: 0;
4
+ bottom: 0;
5
+ height: 48px;
6
+ width: 48px;
7
+ margin: auto 0;
8
+ border-radius: 50%;
9
+ background-color: white;
10
+ align-items: center;
11
+ justify-content: center;
12
+ cursor: pointer;
13
+ display: none;
14
+ border: none;
15
+ outline: none;
16
+ box-shadow: inset 0 0 0 1px rgba(32, 32, 32, .1);
17
+ transition: box-shadow .2s ease-in-out;
18
+
19
+ &__icon {
20
+ fill: #554c44;
21
+ }
22
+
23
+ &:hover {
24
+ box-shadow: inset 0 0 0 1px rgba(32, 32, 32, .2);
25
+ }
26
+
27
+ @media (hover: hover) {
28
+ display: flex;
29
+ }
30
+
31
+ &--hidden {
32
+ display: none;
33
+ }
34
+
35
+ &--next {
36
+ right: 5px;
37
+ }
38
+
39
+ &--prev {
40
+ left: 5px;
41
+ }
42
+ }
@@ -0,0 +1,28 @@
1
+ import classNames from 'classnames';
2
+ import React from 'react';
3
+ import './Button.scss';
4
+
5
+ interface Props {
6
+ onClick: () => void;
7
+ isHidden: boolean;
8
+ }
9
+
10
+ export const NextButton: React.FC<Props> = ({ onClick, isHidden }) => {
11
+ return (
12
+ <button
13
+ aria-label="Next slide"
14
+ type="button"
15
+ onClick={onClick}
16
+ aria-hidden={isHidden}
17
+ className={classNames([
18
+ 'slider__button',
19
+ 'slider__button--next',
20
+ { 'slider__button--hidden': isHidden },
21
+ ])}
22
+ >
23
+ <svg className="slider__button__icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 256 256">
24
+ <path d="M96,216a8.5,8.5,0,0,1-5.7-2.3,8.1,8.1,0,0,1,0-11.4L164.7,128,90.3,53.7a8.1,8.1,0,0,1,11.4-11.4l80,80a8.1,8.1,0,0,1,0,11.4l-80,80A8.5,8.5,0,0,1,96,216Z"/>
25
+ </svg>
26
+ </button>
27
+ );
28
+ };
@@ -0,0 +1,28 @@
1
+ import classNames from 'classnames';
2
+ import React from 'react';
3
+ import './Button.scss';
4
+
5
+ interface Props {
6
+ onClick: () => void;
7
+ isHidden: boolean;
8
+ }
9
+
10
+ export const PreviousButton: React.FC<Props> = ({ onClick, isHidden }) => {
11
+ return (
12
+ <button
13
+ aria-label="Previous slide"
14
+ type="button"
15
+ onClick={onClick}
16
+ aria-hidden={isHidden}
17
+ className={classNames([
18
+ 'slider__button',
19
+ 'slider__button--prev',
20
+ { 'slider__button--hidden': isHidden },
21
+ ])}
22
+ >
23
+ <svg className="slider__button__icon" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 256 256">
24
+ <path d="M160,216a8.5,8.5,0,0,1-5.7-2.3l-80-80a8.1,8.1,0,0,1,0-11.4l80-80a8.1,8.1,0,0,1,11.4,11.4L91.3,128l74.4,74.3a8.1,8.1,0,0,1,0,11.4A8.5,8.5,0,0,1,160,216Z"/>
25
+ </svg>
26
+ </button>
27
+ );
28
+ };
@@ -0,0 +1,123 @@
1
+ import { NavigationDirection, useSlider, Visibility } from './UseSlider';
2
+ import { renderHook } from '@testing-library/react';
3
+
4
+ describe('UseSlider', () => {
5
+ describe('keeps track of slides', () => {
6
+ it('gets the first fully visible slide', () => {
7
+ const { result } = renderHook(() => useSlider());
8
+
9
+ result.current.addPartiallyVisibleSlide(1);
10
+ result.current.addVisibleSlide(2);
11
+ result.current.addVisibleSlide(3);
12
+
13
+
14
+ expect(result.current.getFirstVisibleSlideIndex()).toBe(2);
15
+ });
16
+
17
+ it('gets the last fully visible slide', () => {
18
+ const { result } = renderHook(() => useSlider());
19
+
20
+ result.current.addVisibleSlide(1);
21
+ result.current.addVisibleSlide(2);
22
+ result.current.addPartiallyVisibleSlide(3);
23
+
24
+ expect(result.current.getLastVisibleSlideIndex()).toBe(2);
25
+ });
26
+
27
+
28
+ it('gets the first partially visible slide when no slide is fully visible', () => {
29
+ const { result } = renderHook(() => useSlider());
30
+
31
+ result.current.addPartiallyVisibleSlide(1);
32
+ result.current.addPartiallyVisibleSlide(2);
33
+
34
+ expect(result.current.getFirstVisibleSlideIndex()).toBe(1);
35
+ });
36
+
37
+ it('gets the last visible slide when no slide is fully visible', () => {
38
+ const { result } = renderHook(() => useSlider());
39
+
40
+ result.current.addPartiallyVisibleSlide(1);
41
+ result.current.addPartiallyVisibleSlide(2);
42
+
43
+ expect(result.current.getLastVisibleSlideIndex()).toBe(2);
44
+ });
45
+
46
+
47
+ it('falls back when first slide is non-existant', () => {
48
+ const { result } = renderHook(() => useSlider());
49
+ expect(result.current.getFirstVisibleSlideIndex()).toBe(-1);
50
+ });
51
+
52
+
53
+ it('falls back when last slide is non-existant', () => {
54
+ const { result } = renderHook(() => useSlider());
55
+ expect(result.current.getLastVisibleSlideIndex()).toBe(-1);
56
+ });
57
+
58
+ it('sorts the fully visible slides by index', () => {
59
+ const { result } = renderHook(() => useSlider());
60
+
61
+ result.current.addVisibleSlide(3);
62
+ result.current.addVisibleSlide(2);
63
+ result.current.addVisibleSlide(1);
64
+
65
+ expect(result.current.getFirstVisibleSlideIndex()).toBe(3);
66
+ expect(result.current.getLastVisibleSlideIndex()).toBe(1);
67
+
68
+ result.current.sortSlides();
69
+
70
+ expect(result.current.getLastVisibleSlideIndex()).toBe(3);
71
+ });
72
+
73
+ it('sorts the partially fully visible slides by index', () => {
74
+ const { result } = renderHook(() => useSlider());
75
+
76
+ result.current.addPartiallyVisibleSlide(3);
77
+ result.current.addPartiallyVisibleSlide(2);
78
+ result.current.addPartiallyVisibleSlide(1);
79
+
80
+ expect(result.current.getFirstVisibleSlideIndex()).toBe(3);
81
+ expect(result.current.getLastVisibleSlideIndex()).toBe(1);
82
+
83
+ result.current.sortSlides();
84
+
85
+ expect(result.current.getLastVisibleSlideIndex()).toBe(3);
86
+ });
87
+ });
88
+
89
+ describe('calculations', () => {
90
+
91
+ it('calculates the scrollLeft position (next)', () => {
92
+ const { result } = renderHook(() => useSlider());
93
+
94
+ expect(result.current.getLeftPositionToScrollTo(NavigationDirection.NEXT, 200, 50, 1250, 325)).toBe(150);
95
+ });
96
+
97
+ it('calculates the scrollLeft position (prev)', () => {
98
+ const { result } = renderHook(() => useSlider());
99
+
100
+ expect(result.current.getLeftPositionToScrollTo(NavigationDirection.PREV, 875, 50, 1250, 325)).toBe(-100);
101
+ });
102
+
103
+ it('calculates the visibility of a slide', () => {
104
+ const { result } = renderHook(() => useSlider());
105
+
106
+ [
107
+ [0.0, Visibility.NONE],
108
+ [0.1, Visibility.NONE],
109
+ [0.2, Visibility.NONE],
110
+ [0.3, Visibility.NONE],
111
+ [0.4, Visibility.NONE],
112
+ [0.5, Visibility.PARTIAL],
113
+ [0.6, Visibility.PARTIAL],
114
+ [0.7, Visibility.PARTIAL],
115
+ [0.8, Visibility.PARTIAL],
116
+ [0.9, Visibility.FULL],
117
+ [1.0, Visibility.FULL],
118
+ ].forEach(([ratio, expectation]) => {
119
+ expect(result.current.getVisibilityByIntersectionRatio(ratio)).toBe(expectation);
120
+ });
121
+ });
122
+ });
123
+ });
@@ -0,0 +1,84 @@
1
+ import { useRef } from 'react';
2
+
3
+ export enum Visibility {
4
+ FULL,
5
+ PARTIAL,
6
+ NONE,
7
+ }
8
+
9
+ export enum NavigationDirection {
10
+ PREV,
11
+ NEXT,
12
+ }
13
+
14
+ interface UseSlider {
15
+ getLeftPositionToScrollTo: (direction: NavigationDirection, slideOffsetLeft: number, wrapperOffsetLeft: number, wrapperWidth: number, slideWidth: number) => number;
16
+ getVisibilityByIntersectionRatio: (intersectionRatio: number) => Visibility;
17
+ getFirstVisibleSlideIndex: () => number;
18
+ getLastVisibleSlideIndex: () => number;
19
+ addVisibleSlide: (index: number) => void;
20
+ addPartiallyVisibleSlide: (index: number) => void;
21
+ sortSlides: () => void;
22
+ removeVisibleSlide: (index: number) => void;
23
+ removePartiallyVisibleSlide: (index: number) => void;
24
+ }
25
+
26
+ export const useSlider = (): UseSlider => {
27
+ const visibleSlideIndices = useRef<number[]>([]);
28
+ const partiallyVisibleSlideIndices = useRef<number[]>([]);
29
+
30
+ const getFirstVisibleSlideIndex = (): number => visibleSlideIndices.current[0] ?? partiallyVisibleSlideIndices.current[0] ?? -1;
31
+
32
+ const getLastVisibleSlideIndex = (): number => visibleSlideIndices.current[visibleSlideIndices.current.length - 1]
33
+ ?? partiallyVisibleSlideIndices.current[partiallyVisibleSlideIndices.current.length - 1] ?? -1;
34
+
35
+ const addVisibleSlide = (index: number) => visibleSlideIndices.current.push(index);
36
+
37
+ const addPartiallyVisibleSlide = (index: number) => partiallyVisibleSlideIndices.current.push(index);
38
+
39
+ const removePartiallyVisibleSlide = (index: number) => partiallyVisibleSlideIndices.current = partiallyVisibleSlideIndices.current.filter((slideIndex) => slideIndex !== index);
40
+
41
+ const removeVisibleSlide = (index: number) => visibleSlideIndices.current = visibleSlideIndices.current.filter((slideIndex) => slideIndex !== index);
42
+
43
+ const sortSlides = () => {
44
+ // Make sure there are no duplicate visible slides, then sort to retain proper order
45
+ visibleSlideIndices.current = [...new Set(visibleSlideIndices.current)].sort((a, b) => a - b);
46
+ partiallyVisibleSlideIndices.current = [...new Set(partiallyVisibleSlideIndices.current)].sort((a, b) => a - b);
47
+ };
48
+
49
+ const getLeftPositionToScrollTo = (direction: NavigationDirection, slideOffsetLeft: number, wrapperOffsetLeft: number, wrapperWidth: number, slideWidth: number) => {
50
+ let scrollLeft = 0;
51
+
52
+ if (direction === NavigationDirection.PREV) {
53
+ scrollLeft = slideOffsetLeft - wrapperOffsetLeft - wrapperWidth + slideWidth;
54
+ } else {
55
+ scrollLeft = slideOffsetLeft - wrapperOffsetLeft;
56
+ }
57
+
58
+ return scrollLeft;
59
+ };
60
+
61
+ const getVisibilityByIntersectionRatio = (intersectionRatio: number) => {
62
+ if (intersectionRatio >= 0.9) {
63
+ return Visibility.FULL;
64
+ }
65
+
66
+ if (intersectionRatio >= 0.5) {
67
+ return Visibility.PARTIAL;
68
+ }
69
+
70
+ return Visibility.NONE;
71
+ };
72
+
73
+ return {
74
+ addVisibleSlide,
75
+ addPartiallyVisibleSlide,
76
+ removePartiallyVisibleSlide,
77
+ removeVisibleSlide,
78
+ sortSlides,
79
+ getFirstVisibleSlideIndex,
80
+ getLastVisibleSlideIndex,
81
+ getLeftPositionToScrollTo,
82
+ getVisibilityByIntersectionRatio,
83
+ };
84
+ };
package/src/Slider.scss CHANGED
@@ -1,45 +1,6 @@
1
1
  .slider {
2
2
  position: relative;
3
3
 
4
- &__button {
5
- position: absolute;
6
- top: 0;
7
- bottom: 0;
8
- height: 48px;
9
- width: 48px;
10
- margin: auto 0;
11
- border-radius: 50%;
12
- background-color: white;
13
- align-items: center;
14
- justify-content: center;
15
- cursor: pointer;
16
- display: none;
17
- border: none;
18
- outline: none;
19
- box-shadow: inset 0 0 0 1px rgba(32, 32, 32, .1);
20
- transition: box-shadow .2s ease-in-out;
21
-
22
- &:hover {
23
- box-shadow: inset 0 0 0 1px rgba(32, 32, 32, .2);
24
- }
25
-
26
- @media (hover: hover) {
27
- display: flex;
28
- }
29
-
30
- &--hidden {
31
- display: none;
32
- }
33
-
34
- &--next {
35
- right: 5px;
36
- }
37
-
38
- &--prev {
39
- left: 5px;
40
- }
41
- }
42
-
43
4
  &__wrapper {
44
5
 
45
6
  // Prevent the browser from going back in history when there is no scroll area left
package/src/Slider.tsx CHANGED
@@ -2,22 +2,14 @@ import classNames from 'classnames';
2
2
  import type React from 'react';
3
3
  import type { MouseEvent as ReactMouseEvent, PropsWithChildren } from 'react';
4
4
  import { useRef, useEffect, Children, useCallback, useState } from 'react';
5
+ import { NextButton } from './Components/Controls/NextButton';
6
+ import { PreviousButton } from './Components/Controls/PreviousButton';
7
+ import { NavigationDirection, useSlider, Visibility } from './Hooks/UseSlider';
5
8
  import './Slider.scss';
6
9
 
7
- enum Visbility {
8
- FULL,
9
- PARTIAL,
10
- NONE,
11
- }
12
-
13
- enum NavigationDirection {
14
- PREV,
15
- NEXT,
16
- }
17
-
18
10
  interface SlideVisibilityEntry {
19
11
  element: HTMLDivElement;
20
- visibility: Visbility;
12
+ visibility: Visibility;
21
13
  }
22
14
 
23
15
  interface Settings {
@@ -28,8 +20,6 @@ interface Settings {
28
20
  export const Slider: React.FC<PropsWithChildren<Settings>> = ({ children, hideNavigationButtons = false }) => {
29
21
  const slides = useRef<SlideVisibilityEntry[]>([]);
30
22
  const wrapper = useRef<HTMLDivElement>(null);
31
- const visibleSlideIndices = useRef<number[]>([]);
32
- const partiallyVisibleSlideIndices = useRef<number[]>([]);
33
23
 
34
24
  const [nextArrowVisible, setNextArrowVisible] = useState<boolean>(false);
35
25
  const [prevArrowVisible, setPrevArrowVisible] = useState<boolean>(false);
@@ -42,8 +32,17 @@ export const Slider: React.FC<PropsWithChildren<Settings>> = ({ children, hideNa
42
32
  scrollX: 0,
43
33
  });
44
34
 
45
- const arrowPrevRef = useRef<HTMLButtonElement>(null);
46
- const arrowNextRef = useRef<HTMLButtonElement>(null);
35
+ const {
36
+ getLeftPositionToScrollTo,
37
+ getVisibilityByIntersectionRatio,
38
+ addVisibleSlide,
39
+ addPartiallyVisibleSlide,
40
+ getLastVisibleSlideIndex,
41
+ sortSlides,
42
+ getFirstVisibleSlideIndex,
43
+ removeVisibleSlide,
44
+ removePartiallyVisibleSlide,
45
+ } = useSlider();
47
46
 
48
47
  useEffect(() => {
49
48
  const currentWrapper = wrapper.current;
@@ -90,9 +89,7 @@ export const Slider: React.FC<PropsWithChildren<Settings>> = ({ children, hideNa
90
89
  setIsBlockingClicks(false);
91
90
  };
92
91
 
93
- const mouseUpHandler = () => {
94
- setIsDragging(false);
95
- };
92
+ const mouseUpHandler = () => setIsDragging(false);
96
93
 
97
94
  const mouseDownHandler = (event: ReactMouseEvent<HTMLDivElement>) => {
98
95
  setMousePosition({
@@ -119,33 +116,16 @@ export const Slider: React.FC<PropsWithChildren<Settings>> = ({ children, hideNa
119
116
  const addSlide = (node: HTMLDivElement, index: number) => {
120
117
  slides.current[index] = {
121
118
  element: node,
122
- visibility: Visbility.NONE,
119
+ visibility: Visibility.NONE,
123
120
  };
124
121
  };
125
122
 
126
- const getFirstVisibleSlideIndex = (): number => visibleSlideIndices.current[0] ?? partiallyVisibleSlideIndices.current[0] ?? -1;
127
-
128
- const getLastVisibleSlideIndex = (): number => visibleSlideIndices.current[visibleSlideIndices.current.length - 1]
129
- ?? partiallyVisibleSlideIndices.current[partiallyVisibleSlideIndices.current.length - 1] ?? -1;
130
-
131
123
  const setControlsVisibility = useCallback(() => {
132
124
  const lastSlideFullyVisible = getLastVisibleSlideIndex() + 1 === slides.current.length;
133
125
 
134
126
  setPrevArrowVisible(getFirstVisibleSlideIndex() > 0 && isScrollable);
135
127
  setNextArrowVisible(isScrollable && lastSlideFullyVisible === false);
136
- }, [isScrollable]);
137
-
138
- const getVisibilityByIntersectionRatio = (intersectionRatio: number) => {
139
- if (intersectionRatio >= 0.9) {
140
- return Visbility.FULL;
141
- }
142
-
143
- if (intersectionRatio >= 0.5) {
144
- return Visbility.PARTIAL;
145
- }
146
-
147
- return Visbility.NONE;
148
- };
128
+ }, [getFirstVisibleSlideIndex, getLastVisibleSlideIndex, isScrollable]);
149
129
 
150
130
  useEffect(() => {
151
131
  if (!wrapper.current) {
@@ -156,23 +136,13 @@ export const Slider: React.FC<PropsWithChildren<Settings>> = ({ children, hideNa
156
136
  entries.forEach((entry: IntersectionObserverEntry) => {
157
137
  const target = entry.target as HTMLDivElement;
158
138
  const index = Number(target.dataset.slideIndex);
139
+ const visibility = getVisibilityByIntersectionRatio(entry.intersectionRatio);
159
140
 
160
- if (getVisibilityByIntersectionRatio(entry.intersectionRatio) === Visbility.FULL) {
161
- visibleSlideIndices.current.push(index);
162
- } else {
163
- visibleSlideIndices.current = visibleSlideIndices.current.filter((slideIndex) => slideIndex !== index);
164
- }
165
-
166
- if (getVisibilityByIntersectionRatio(entry.intersectionRatio) === Visbility.PARTIAL) {
167
- partiallyVisibleSlideIndices.current.push(index);
168
- } else {
169
- partiallyVisibleSlideIndices.current = partiallyVisibleSlideIndices.current.filter((slideIndex) => slideIndex !== index);
170
- }
141
+ visibility === Visibility.FULL ? addVisibleSlide(index) : removeVisibleSlide(index);
142
+ visibility === Visibility.PARTIAL ? addPartiallyVisibleSlide(index) : removePartiallyVisibleSlide(index);
171
143
  });
172
144
 
173
- // Make sure there are no duplicate visible slides, then sort to retain proper order
174
- visibleSlideIndices.current = [...new Set(visibleSlideIndices.current)].sort((a, b) => a - b);
175
- partiallyVisibleSlideIndices.current = [...new Set(partiallyVisibleSlideIndices.current)].sort((a, b) => a - b);
145
+ sortSlides();
176
146
 
177
147
  if (hideNavigationButtons === false) {
178
148
  setControlsVisibility();
@@ -187,7 +157,17 @@ export const Slider: React.FC<PropsWithChildren<Settings>> = ({ children, hideNa
187
157
  slides.current.forEach(({ element }) => intersectionObserver.observe(element));
188
158
 
189
159
  return () => intersectionObserver.disconnect();
190
- }, [wrapper, setControlsVisibility, hideNavigationButtons]);
160
+ }, [
161
+ wrapper,
162
+ setControlsVisibility,
163
+ hideNavigationButtons,
164
+ sortSlides,
165
+ addVisibleSlide,
166
+ removeVisibleSlide,
167
+ addPartiallyVisibleSlide,
168
+ removePartiallyVisibleSlide,
169
+ getVisibilityByIntersectionRatio,
170
+ ]);
191
171
 
192
172
  const navigate = (direction: NavigationDirection) => {
193
173
  if (!wrapper.current) {
@@ -195,19 +175,19 @@ export const Slider: React.FC<PropsWithChildren<Settings>> = ({ children, hideNa
195
175
  }
196
176
 
197
177
  const targetSlideIndex = direction === NavigationDirection.PREV ? getFirstVisibleSlideIndex() - 1 : getLastVisibleSlideIndex() + 1;
198
-
199
178
  const targetSlide = slides.current[targetSlideIndex];
200
- let scrollLeft = 0;
201
179
 
202
180
  if (!targetSlide) {
203
181
  return;
204
182
  }
205
183
 
206
- if (direction === NavigationDirection.PREV) {
207
- scrollLeft = targetSlide.element.offsetLeft - wrapper.current.offsetLeft - wrapper.current.clientWidth + targetSlide.element.clientWidth;
208
- } else {
209
- scrollLeft = targetSlide.element.offsetLeft - wrapper.current.offsetLeft;
210
- }
184
+ const scrollLeft = getLeftPositionToScrollTo(
185
+ direction,
186
+ targetSlide.element.offsetLeft,
187
+ wrapper.current.offsetLeft,
188
+ wrapper.current.clientWidth,
189
+ targetSlide.element.clientWidth,
190
+ );
211
191
 
212
192
  wrapper.current.scrollTo({ behavior: 'smooth', left: scrollLeft, top: 0 });
213
193
  };
@@ -231,40 +211,10 @@ export const Slider: React.FC<PropsWithChildren<Settings>> = ({ children, hideNa
231
211
  ))}
232
212
  </div>
233
213
  { hideNavigationButtons === false && (
234
- <button
235
- aria-label="Previous slide"
236
- type="button"
237
- onClick={() => navigate(NavigationDirection.PREV)}
238
- ref={arrowPrevRef}
239
- aria-hidden={prevArrowVisible === false}
240
- className={classNames([
241
- 'slider__button',
242
- 'slider__button--prev',
243
- { 'slider__button--hidden': prevArrowVisible === false },
244
- ])}
245
- >
246
- <svg fill="#554c44" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 256 256">
247
- <path d="M160,216a8.5,8.5,0,0,1-5.7-2.3l-80-80a8.1,8.1,0,0,1,0-11.4l80-80a8.1,8.1,0,0,1,11.4,11.4L91.3,128l74.4,74.3a8.1,8.1,0,0,1,0,11.4A8.5,8.5,0,0,1,160,216Z"/>
248
- </svg>
249
- </button>
250
- )}
251
- { hideNavigationButtons === false && (
252
- <button
253
- aria-label="Next slide"
254
- type="button"
255
- onClick={() => navigate(NavigationDirection.NEXT)}
256
- ref={arrowNextRef}
257
- aria-hidden={nextArrowVisible === false}
258
- className={classNames([
259
- 'slider__button',
260
- 'slider__button--next',
261
- { 'slider__button--hidden': nextArrowVisible === false },
262
- ])}
263
- >
264
- <svg fill="#554c44" xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 256 256">
265
- <path d="M96,216a8.5,8.5,0,0,1-5.7-2.3,8.1,8.1,0,0,1,0-11.4L164.7,128,90.3,53.7a8.1,8.1,0,0,1,11.4-11.4l80,80a8.1,8.1,0,0,1,0,11.4l-80,80A8.5,8.5,0,0,1,96,216Z"/>
266
- </svg>
267
- </button>
214
+ <>
215
+ <PreviousButton onClick={() => navigate(NavigationDirection.PREV)} isHidden={prevArrowVisible === false}/>
216
+ <NextButton onClick={() => navigate(NavigationDirection.NEXT)} isHidden={nextArrowVisible === false}/>
217
+ </>
268
218
  )}
269
219
  </div>
270
220
  );