@chayns-components/core 5.0.0-beta.601 → 5.0.0-beta.602
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/lib/cjs/components/slider-button/SliderButton.js +123 -16
- package/lib/cjs/components/slider-button/SliderButton.js.map +1 -1
- package/lib/cjs/components/slider-button/SliderButton.styles.js +20 -6
- package/lib/cjs/components/slider-button/SliderButton.styles.js.map +1 -1
- package/lib/cjs/utils/sliderButton.js +9 -4
- package/lib/cjs/utils/sliderButton.js.map +1 -1
- package/lib/esm/components/slider-button/SliderButton.js +123 -17
- package/lib/esm/components/slider-button/SliderButton.js.map +1 -1
- package/lib/esm/components/slider-button/SliderButton.styles.js +35 -18
- package/lib/esm/components/slider-button/SliderButton.styles.js.map +1 -1
- package/lib/esm/utils/sliderButton.js +9 -4
- package/lib/esm/utils/sliderButton.js.map +1 -1
- package/lib/types/components/slider-button/SliderButton.styles.d.ts +5 -0
- package/lib/types/utils/sliderButton.d.ts +7 -2
- package/package.json +2 -2
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.default = void 0;
|
|
7
7
|
var _framerMotion = require("framer-motion");
|
|
8
8
|
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
var _useElementSize = require("../../hooks/useElementSize");
|
|
9
10
|
var _calculate = require("../../utils/calculate");
|
|
10
11
|
var _sliderButton = require("../../utils/sliderButton");
|
|
11
12
|
var _SliderButton = require("./SliderButton.styles");
|
|
@@ -23,14 +24,23 @@ const SliderButton = ({
|
|
|
23
24
|
right: 0
|
|
24
25
|
});
|
|
25
26
|
const sliderButtonRef = (0, _react.useRef)(null);
|
|
27
|
+
const sliderButtonWrapperRef = (0, _react.useRef)(null);
|
|
28
|
+
const timeout = (0, _react.useRef)();
|
|
29
|
+
const preventHandleScroll = (0, _react.useRef)(false);
|
|
26
30
|
const [scope, animate] = (0, _framerMotion.useAnimate)();
|
|
27
31
|
const itemWidth = (0, _react.useMemo)(() => (0, _calculate.calculateBiggestWidth)(items), [items]);
|
|
32
|
+
const sliderSize = (0, _useElementSize.useElementSize)(sliderButtonRef);
|
|
33
|
+
const isSliderBigger = (0, _react.useMemo)(() => sliderSize && sliderSize.width < itemWidth * (items.length - 1), [itemWidth, items.length, sliderSize]);
|
|
28
34
|
(0, _react.useEffect)(() => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
35
|
+
if (sliderSize) {
|
|
36
|
+
const sliderWidth = itemWidth * (items.length - 1);
|
|
37
|
+
const count = Math.floor(sliderSize.width / itemWidth);
|
|
38
|
+
setDragRange({
|
|
39
|
+
left: 0,
|
|
40
|
+
right: isSliderBigger ? itemWidth * count : sliderWidth
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}, [isSliderBigger, itemWidth, items.length, sliderSize]);
|
|
34
44
|
const animation = (0, _react.useCallback)(async x => {
|
|
35
45
|
await animate(scope.current, {
|
|
36
46
|
x
|
|
@@ -61,8 +71,20 @@ const SliderButton = ({
|
|
|
61
71
|
if (typeof onChange === 'function') {
|
|
62
72
|
onChange(id);
|
|
63
73
|
}
|
|
64
|
-
|
|
65
|
-
|
|
74
|
+
if (!isSliderBigger) {
|
|
75
|
+
void animation(itemWidth * index);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const count = dragRange.right / itemWidth;
|
|
79
|
+
if (items.length - count >= index) {
|
|
80
|
+
void animation(0);
|
|
81
|
+
} else {
|
|
82
|
+
void animation(itemWidth * (count - (items.length - index)));
|
|
83
|
+
}
|
|
84
|
+
if (sliderButtonWrapperRef.current) {
|
|
85
|
+
sliderButtonWrapperRef.current.scrollLeft = itemWidth * index;
|
|
86
|
+
}
|
|
87
|
+
}, [animation, dragRange.right, isDisabled, isSliderBigger, itemWidth, items.length, onChange]);
|
|
66
88
|
const buttons = (0, _react.useMemo)(() => items.map(({
|
|
67
89
|
id,
|
|
68
90
|
text
|
|
@@ -98,22 +120,45 @@ const SliderButton = ({
|
|
|
98
120
|
return;
|
|
99
121
|
}
|
|
100
122
|
const {
|
|
101
|
-
|
|
123
|
+
middle,
|
|
124
|
+
left
|
|
125
|
+
} = position;
|
|
126
|
+
let scrollLeft = 0;
|
|
127
|
+
if (sliderButtonWrapperRef.current) {
|
|
128
|
+
scrollLeft = sliderButtonWrapperRef.current.scrollLeft;
|
|
129
|
+
sliderButtonWrapperRef.current.scrollLeft = (0, _sliderButton.getNearestPoint)({
|
|
130
|
+
snapPoints,
|
|
131
|
+
position: middle,
|
|
132
|
+
scrollLeft: scrollLeft - left
|
|
133
|
+
}).nearestPoint;
|
|
134
|
+
}
|
|
135
|
+
const {
|
|
102
136
|
nearestIndex
|
|
103
137
|
} = (0, _sliderButton.getNearestPoint)({
|
|
104
138
|
snapPoints,
|
|
105
|
-
position
|
|
139
|
+
position: middle,
|
|
140
|
+
scrollLeft
|
|
141
|
+
});
|
|
142
|
+
const {
|
|
143
|
+
nearestPoint
|
|
144
|
+
} = (0, _sliderButton.getNearestPoint)({
|
|
145
|
+
snapPoints,
|
|
146
|
+
position: middle,
|
|
147
|
+
scrollLeft: 0
|
|
106
148
|
});
|
|
107
149
|
if (nearestPoint >= 0 && nearestIndex >= 0) {
|
|
108
150
|
var _items$nearestIndex;
|
|
109
151
|
void animation(nearestPoint);
|
|
110
152
|
const id = (_items$nearestIndex = items[nearestIndex]) === null || _items$nearestIndex === void 0 ? void 0 : _items$nearestIndex.id;
|
|
153
|
+
setSelectedButton(id);
|
|
111
154
|
if (typeof onChange === 'function' && id) {
|
|
112
155
|
onChange(id);
|
|
113
156
|
}
|
|
114
157
|
}
|
|
158
|
+
preventHandleScroll.current = false;
|
|
115
159
|
}, [animation, itemWidth, items, onChange, scope, snapPoints]);
|
|
116
160
|
const handleWhileDrag = (0, _react.useCallback)(() => {
|
|
161
|
+
preventHandleScroll.current = true;
|
|
117
162
|
const position = (0, _sliderButton.getThumbPosition)({
|
|
118
163
|
scope,
|
|
119
164
|
itemWidth
|
|
@@ -121,34 +166,96 @@ const SliderButton = ({
|
|
|
121
166
|
if (!position) {
|
|
122
167
|
return;
|
|
123
168
|
}
|
|
124
|
-
|
|
125
|
-
|
|
169
|
+
const {
|
|
170
|
+
right,
|
|
171
|
+
left,
|
|
172
|
+
middle
|
|
173
|
+
} = position;
|
|
174
|
+
let scrollLeft = 0;
|
|
175
|
+
const scrollSpeed = 3;
|
|
176
|
+
if (sliderButtonWrapperRef.current) {
|
|
177
|
+
if (right >= dragRange.right) {
|
|
178
|
+
sliderButtonWrapperRef.current.scrollLeft += scrollSpeed;
|
|
179
|
+
}
|
|
180
|
+
if (left <= dragRange.left) {
|
|
181
|
+
sliderButtonWrapperRef.current.scrollLeft -= scrollSpeed;
|
|
182
|
+
}
|
|
183
|
+
scrollLeft = sliderButtonWrapperRef.current.scrollLeft;
|
|
126
184
|
}
|
|
127
185
|
const {
|
|
128
186
|
nearestIndex
|
|
129
187
|
} = (0, _sliderButton.getNearestPoint)({
|
|
130
188
|
snapPoints,
|
|
131
|
-
position
|
|
189
|
+
position: middle,
|
|
190
|
+
scrollLeft
|
|
132
191
|
});
|
|
133
192
|
if (nearestIndex >= 0) {
|
|
134
193
|
var _items$nearestIndex2;
|
|
135
194
|
setSelectedButton((_items$nearestIndex2 = items[nearestIndex]) === null || _items$nearestIndex2 === void 0 ? void 0 : _items$nearestIndex2.id);
|
|
136
195
|
}
|
|
137
|
-
}, [itemWidth, items, scope, snapPoints]);
|
|
196
|
+
}, [dragRange, itemWidth, items, scope, snapPoints]);
|
|
197
|
+
|
|
198
|
+
// With this, the handleScroll works before the thumb is moved the first time.
|
|
199
|
+
(0, _react.useEffect)(() => {
|
|
200
|
+
void animation(1);
|
|
201
|
+
void animation(0);
|
|
202
|
+
}, [animation]);
|
|
203
|
+
const handleScroll = (0, _react.useCallback)(event => {
|
|
204
|
+
if (preventHandleScroll.current) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const position = (0, _sliderButton.getThumbPosition)({
|
|
208
|
+
scope,
|
|
209
|
+
itemWidth
|
|
210
|
+
});
|
|
211
|
+
if (!position) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const {
|
|
215
|
+
middle
|
|
216
|
+
} = position;
|
|
217
|
+
const {
|
|
218
|
+
scrollLeft
|
|
219
|
+
} = event.target;
|
|
220
|
+
const {
|
|
221
|
+
nearestIndex
|
|
222
|
+
} = (0, _sliderButton.getNearestPoint)({
|
|
223
|
+
snapPoints,
|
|
224
|
+
position: middle,
|
|
225
|
+
scrollLeft
|
|
226
|
+
});
|
|
227
|
+
if (nearestIndex >= 0) {
|
|
228
|
+
var _items$nearestIndex3;
|
|
229
|
+
setSelectedButton((_items$nearestIndex3 = items[nearestIndex]) === null || _items$nearestIndex3 === void 0 ? void 0 : _items$nearestIndex3.id);
|
|
230
|
+
}
|
|
231
|
+
if (timeout.current) {
|
|
232
|
+
clearTimeout(timeout.current);
|
|
233
|
+
}
|
|
234
|
+
timeout.current = window.setTimeout(() => {
|
|
235
|
+
handleDragEnd();
|
|
236
|
+
}, 200);
|
|
237
|
+
}, [handleDragEnd, itemWidth, items, scope, snapPoints]);
|
|
138
238
|
return (0, _react.useMemo)(() => /*#__PURE__*/_react.default.createElement(_SliderButton.StyledSliderButton, {
|
|
139
239
|
$isDisabled: isDisabled,
|
|
140
240
|
ref: sliderButtonRef
|
|
141
|
-
}, /*#__PURE__*/_react.default.createElement(
|
|
241
|
+
}, /*#__PURE__*/_react.default.createElement(_SliderButton.StyledMotionSliderButtonThumb, {
|
|
142
242
|
ref: scope,
|
|
143
243
|
drag: isDisabled ? false : 'x',
|
|
144
244
|
dragElastic: 0,
|
|
145
|
-
dragConstraints: {
|
|
245
|
+
dragConstraints: isSliderBigger ? {
|
|
246
|
+
...dragRange,
|
|
247
|
+
right: dragRange.right - itemWidth
|
|
248
|
+
} : {
|
|
146
249
|
...dragRange
|
|
147
250
|
},
|
|
148
251
|
$width: itemWidth,
|
|
149
252
|
onDrag: handleWhileDrag,
|
|
150
253
|
onDragEnd: handleDragEnd
|
|
151
|
-
}, thumbText)
|
|
254
|
+
}, thumbText), /*#__PURE__*/_react.default.createElement(_SliderButton.StyledSliderButtonWrapper, {
|
|
255
|
+
$width: !isSliderBigger ? dragRange.right + itemWidth : dragRange.right,
|
|
256
|
+
ref: sliderButtonWrapperRef,
|
|
257
|
+
onScroll: handleScroll
|
|
258
|
+
}, /*#__PURE__*/_react.default.createElement(_framerMotion.AnimatePresence, null, /*#__PURE__*/_react.default.createElement(_SliderButton.StyledSliderButtonButtonsWrapper, null, buttons)))), [buttons, dragRange, handleDragEnd, handleScroll, handleWhileDrag, isDisabled, isSliderBigger, itemWidth, scope, thumbText]);
|
|
152
259
|
};
|
|
153
260
|
SliderButton.displayName = 'SliderButton';
|
|
154
261
|
var _default = exports.default = SliderButton;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SliderButton.js","names":["_framerMotion","require","_react","_interopRequireWildcard","_calculate","_sliderButton","_SliderButton","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","SliderButton","selectedButtonId","isDisabled","items","onChange","selectedButton","setSelectedButton","useState","undefined","dragRange","setDragRange","left","right","sliderButtonRef","useRef","scope","animate","useAnimate","itemWidth","useMemo","calculateBiggestWidth","useEffect","length","animation","useCallback","x","current","type","duration","index","findIndex","id","_items$","handleClick","buttons","map","text","createElement","StyledSliderButtonItem","$width","key","onClick","$isSelected","thumbText","selectedItem","find","snapPoints","points","push","handleDragEnd","position","getThumbPosition","nearestPoint","nearestIndex","getNearestPoint","_items$nearestIndex","handleWhileDrag","scrollLeft","_items$nearestIndex2","StyledSliderButton","$isDisabled","ref","AnimatePresence","StyledMotionSliderButtonThumb","drag","dragElastic","dragConstraints","onDrag","onDragEnd","displayName","_default","exports"],"sources":["../../../../src/components/slider-button/SliderButton.tsx"],"sourcesContent":["import { AnimatePresence, useAnimate } from 'framer-motion';\nimport React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { SliderButtonItem } from '../../types/slider-button';\nimport { calculateBiggestWidth } from '../../utils/calculate';\nimport { getNearestPoint, getThumbPosition } from '../../utils/sliderButton';\nimport {\n StyledMotionSliderButtonThumb,\n StyledSliderButton,\n StyledSliderButtonItem,\n} from './SliderButton.styles';\n\nexport type SliderButtonProps = {\n /**\n * Whether the button is disabled.\n */\n isDisabled?: boolean;\n /**\n * Function to be executed when a button is selected.\n * @param id\n */\n onChange?: (id: string) => void;\n /**\n * The buttons that are slidable.\n */\n items: SliderButtonItem[];\n /**\n * The id of a button that should be selected.\n */\n selectedButtonId?: string;\n};\n\nconst SliderButton: FC<SliderButtonProps> = ({ selectedButtonId, isDisabled, items, onChange }) => {\n const [selectedButton, setSelectedButton] = useState<string | undefined>(undefined);\n const [dragRange, setDragRange] = useState({ left: 0, right: 0 });\n\n const sliderButtonRef = useRef<HTMLDivElement>(null);\n\n const [scope, animate] = useAnimate();\n\n const itemWidth = useMemo(() => calculateBiggestWidth(items), [items]);\n\n useEffect(() => {\n setDragRange({ left: 0, right: itemWidth * (items.length - 1) });\n }, [itemWidth, items.length]);\n\n const animation = useCallback(\n async (x: number) => {\n await animate(\n scope.current,\n { x },\n {\n type: 'tween',\n duration: 0.2,\n },\n );\n },\n [animate, scope],\n );\n\n useEffect(() => {\n if (selectedButtonId) {\n setSelectedButton(selectedButtonId);\n\n const index = items.findIndex(({ id }) => id === selectedButtonId);\n\n if (index >= 0) {\n void animation(itemWidth * index);\n }\n } else {\n setSelectedButton(items[0]?.id);\n }\n }, [animation, itemWidth, items, selectedButtonId]);\n\n const handleClick = useCallback(\n (id: string, index: number) => {\n if (isDisabled) {\n return;\n }\n\n setSelectedButton(id);\n\n if (typeof onChange === 'function') {\n onChange(id);\n }\n\n void animation(itemWidth * index);\n },\n [animation, isDisabled, itemWidth, onChange],\n );\n\n const buttons = useMemo(\n () =>\n items.map(({ id, text }, index) => (\n <StyledSliderButtonItem\n $width={itemWidth}\n key={`slider-button-${id}`}\n onClick={() => handleClick(id, index)}\n $isSelected={id === selectedButton}\n >\n {text}\n </StyledSliderButtonItem>\n )),\n [handleClick, itemWidth, items, selectedButton],\n );\n\n const thumbText = useMemo(() => {\n const selectedItem = items.find(({ id }) => id === selectedButton);\n\n return selectedItem ? selectedItem.text : '';\n }, [items, selectedButton]);\n\n /**\n * Creates an array with the snap points relative to the width of the items\n */\n const snapPoints = useMemo(() => {\n const points = [0];\n\n for (let i = 1; i < items.length; i++) {\n points.push(itemWidth * i);\n }\n\n return points;\n }, [itemWidth, items.length]);\n\n const handleDragEnd = useCallback(() => {\n const position = getThumbPosition({ scope, itemWidth });\n\n if (!position) {\n return;\n }\n\n const { nearestPoint, nearestIndex } = getNearestPoint({ snapPoints, position });\n\n if (nearestPoint >= 0 && nearestIndex >= 0) {\n void animation(nearestPoint);\n\n const id = items[nearestIndex]?.id;\n\n if (typeof onChange === 'function' && id) {\n onChange(id);\n }\n }\n }, [animation, itemWidth, items, onChange, scope, snapPoints]);\n\n const handleWhileDrag = useCallback(() => {\n const position = getThumbPosition({ scope, itemWidth });\n\n if (!position) {\n return;\n }\n\n if (sliderButtonRef.current) {\n sliderButtonRef.current.scrollLeft = (position - itemWidth / 2) / 1.1;\n }\n\n const { nearestIndex } = getNearestPoint({ snapPoints, position });\n\n if (nearestIndex >= 0) {\n setSelectedButton(items[nearestIndex]?.id);\n }\n }, [itemWidth, items, scope, snapPoints]);\n\n return useMemo(\n () => (\n <StyledSliderButton $isDisabled={isDisabled} ref={sliderButtonRef}>\n <AnimatePresence>\n {buttons}\n <StyledMotionSliderButtonThumb\n ref={scope}\n drag={isDisabled ? false : 'x'}\n dragElastic={0}\n dragConstraints={{ ...dragRange }}\n $width={itemWidth}\n onDrag={handleWhileDrag}\n onDragEnd={handleDragEnd}\n >\n {thumbText}\n </StyledMotionSliderButtonThumb>\n </AnimatePresence>\n </StyledSliderButton>\n ),\n [\n buttons,\n dragRange,\n handleDragEnd,\n handleWhileDrag,\n isDisabled,\n itemWidth,\n scope,\n thumbText,\n ],\n );\n};\n\nSliderButton.displayName = 'SliderButton';\n\nexport default SliderButton;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"SliderButton.js","names":["_framerMotion","require","_react","_interopRequireWildcard","_useElementSize","_calculate","_sliderButton","_SliderButton","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","SliderButton","selectedButtonId","isDisabled","items","onChange","selectedButton","setSelectedButton","useState","undefined","dragRange","setDragRange","left","right","sliderButtonRef","useRef","sliderButtonWrapperRef","timeout","preventHandleScroll","scope","animate","useAnimate","itemWidth","useMemo","calculateBiggestWidth","sliderSize","useElementSize","isSliderBigger","width","length","useEffect","sliderWidth","count","Math","floor","animation","useCallback","x","current","type","duration","index","findIndex","id","_items$","handleClick","scrollLeft","buttons","map","text","createElement","StyledSliderButtonItem","$width","key","onClick","$isSelected","thumbText","selectedItem","find","snapPoints","points","push","handleDragEnd","position","getThumbPosition","middle","getNearestPoint","nearestPoint","nearestIndex","_items$nearestIndex","handleWhileDrag","scrollSpeed","_items$nearestIndex2","handleScroll","event","target","_items$nearestIndex3","clearTimeout","window","setTimeout","StyledSliderButton","$isDisabled","ref","StyledMotionSliderButtonThumb","drag","dragElastic","dragConstraints","onDrag","onDragEnd","StyledSliderButtonWrapper","onScroll","AnimatePresence","StyledSliderButtonButtonsWrapper","displayName","_default","exports"],"sources":["../../../../src/components/slider-button/SliderButton.tsx"],"sourcesContent":["import { AnimatePresence, useAnimate } from 'framer-motion';\nimport React, { FC, UIEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useElementSize } from '../../hooks/useElementSize';\nimport type { SliderButtonItem } from '../../types/slider-button';\nimport { calculateBiggestWidth } from '../../utils/calculate';\nimport { getNearestPoint, getThumbPosition } from '../../utils/sliderButton';\nimport {\n StyledMotionSliderButtonThumb,\n StyledSliderButton,\n StyledSliderButtonButtonsWrapper,\n StyledSliderButtonItem,\n StyledSliderButtonWrapper,\n} from './SliderButton.styles';\n\nexport type SliderButtonProps = {\n /**\n * Whether the button is disabled.\n */\n isDisabled?: boolean;\n /**\n * Function to be executed when a button is selected.\n * @param id\n */\n onChange?: (id: string) => void;\n /**\n * The buttons that are slidable.\n */\n items: SliderButtonItem[];\n /**\n * The id of a button that should be selected.\n */\n selectedButtonId?: string;\n};\n\nconst SliderButton: FC<SliderButtonProps> = ({ selectedButtonId, isDisabled, items, onChange }) => {\n const [selectedButton, setSelectedButton] = useState<string | undefined>(undefined);\n const [dragRange, setDragRange] = useState({ left: 0, right: 0 });\n\n const sliderButtonRef = useRef<HTMLDivElement>(null);\n const sliderButtonWrapperRef = useRef<HTMLDivElement>(null);\n const timeout = useRef<number>();\n const preventHandleScroll = useRef(false);\n\n const [scope, animate] = useAnimate();\n\n const itemWidth = useMemo(() => calculateBiggestWidth(items), [items]);\n\n const sliderSize = useElementSize(sliderButtonRef);\n\n const isSliderBigger = useMemo(\n () => sliderSize && sliderSize.width < itemWidth * (items.length - 1),\n [itemWidth, items.length, sliderSize],\n );\n\n useEffect(() => {\n if (sliderSize) {\n const sliderWidth = itemWidth * (items.length - 1);\n\n const count = Math.floor(sliderSize.width / itemWidth);\n\n setDragRange({ left: 0, right: isSliderBigger ? itemWidth * count : sliderWidth });\n }\n }, [isSliderBigger, itemWidth, items.length, sliderSize]);\n\n const animation = useCallback(\n async (x: number) => {\n await animate(\n scope.current,\n { x },\n {\n type: 'tween',\n duration: 0.2,\n },\n );\n },\n [animate, scope],\n );\n\n useEffect(() => {\n if (selectedButtonId) {\n setSelectedButton(selectedButtonId);\n\n const index = items.findIndex(({ id }) => id === selectedButtonId);\n\n if (index >= 0) {\n void animation(itemWidth * index);\n }\n } else {\n setSelectedButton(items[0]?.id);\n }\n }, [animation, itemWidth, items, selectedButtonId]);\n\n const handleClick = useCallback(\n (id: string, index: number) => {\n if (isDisabled) {\n return;\n }\n\n setSelectedButton(id);\n\n if (typeof onChange === 'function') {\n onChange(id);\n }\n\n if (!isSliderBigger) {\n void animation(itemWidth * index);\n\n return;\n }\n\n const count = dragRange.right / itemWidth;\n\n if (items.length - count >= index) {\n void animation(0);\n } else {\n void animation(itemWidth * (count - (items.length - index)));\n }\n\n if (sliderButtonWrapperRef.current) {\n sliderButtonWrapperRef.current.scrollLeft = itemWidth * index;\n }\n },\n [animation, dragRange.right, isDisabled, isSliderBigger, itemWidth, items.length, onChange],\n );\n\n const buttons = useMemo(\n () =>\n items.map(({ id, text }, index) => (\n <StyledSliderButtonItem\n $width={itemWidth}\n key={`slider-button-${id}`}\n onClick={() => handleClick(id, index)}\n $isSelected={id === selectedButton}\n >\n {text}\n </StyledSliderButtonItem>\n )),\n [handleClick, itemWidth, items, selectedButton],\n );\n\n const thumbText = useMemo(() => {\n const selectedItem = items.find(({ id }) => id === selectedButton);\n\n return selectedItem ? selectedItem.text : '';\n }, [items, selectedButton]);\n\n /**\n * Creates an array with the snap points relative to the width of the items\n */\n const snapPoints = useMemo(() => {\n const points = [0];\n\n for (let i = 1; i < items.length; i++) {\n points.push(itemWidth * i);\n }\n\n return points;\n }, [itemWidth, items.length]);\n\n const handleDragEnd = useCallback(() => {\n const position = getThumbPosition({ scope, itemWidth });\n\n if (!position) {\n return;\n }\n\n const { middle, left } = position;\n\n let scrollLeft = 0;\n\n if (sliderButtonWrapperRef.current) {\n scrollLeft = sliderButtonWrapperRef.current.scrollLeft;\n\n sliderButtonWrapperRef.current.scrollLeft = getNearestPoint({\n snapPoints,\n position: middle,\n scrollLeft: scrollLeft - left,\n }).nearestPoint;\n }\n\n const { nearestIndex } = getNearestPoint({\n snapPoints,\n position: middle,\n scrollLeft,\n });\n\n const { nearestPoint } = getNearestPoint({\n snapPoints,\n position: middle,\n scrollLeft: 0,\n });\n\n if (nearestPoint >= 0 && nearestIndex >= 0) {\n void animation(nearestPoint);\n\n const id = items[nearestIndex]?.id;\n\n setSelectedButton(id);\n\n if (typeof onChange === 'function' && id) {\n onChange(id);\n }\n }\n\n preventHandleScroll.current = false;\n }, [animation, itemWidth, items, onChange, scope, snapPoints]);\n\n const handleWhileDrag = useCallback(() => {\n preventHandleScroll.current = true;\n\n const position = getThumbPosition({ scope, itemWidth });\n\n if (!position) {\n return;\n }\n\n const { right, left, middle } = position;\n\n let scrollLeft = 0;\n\n const scrollSpeed = 3;\n\n if (sliderButtonWrapperRef.current) {\n if (right >= dragRange.right) {\n sliderButtonWrapperRef.current.scrollLeft += scrollSpeed;\n }\n\n if (left <= dragRange.left) {\n sliderButtonWrapperRef.current.scrollLeft -= scrollSpeed;\n }\n\n scrollLeft = sliderButtonWrapperRef.current.scrollLeft;\n }\n\n const { nearestIndex } = getNearestPoint({ snapPoints, position: middle, scrollLeft });\n\n if (nearestIndex >= 0) {\n setSelectedButton(items[nearestIndex]?.id);\n }\n }, [dragRange, itemWidth, items, scope, snapPoints]);\n\n // With this, the handleScroll works before the thumb is moved the first time.\n useEffect(() => {\n void animation(1);\n void animation(0);\n }, [animation]);\n\n const handleScroll = useCallback(\n (event: UIEvent<HTMLElement>) => {\n if (preventHandleScroll.current) {\n return;\n }\n\n const position = getThumbPosition({ scope, itemWidth });\n\n if (!position) {\n return;\n }\n\n const { middle } = position;\n\n const { scrollLeft } = event.target as HTMLDivElement;\n\n const { nearestIndex } = getNearestPoint({ snapPoints, position: middle, scrollLeft });\n\n if (nearestIndex >= 0) {\n setSelectedButton(items[nearestIndex]?.id);\n }\n\n if (timeout.current) {\n clearTimeout(timeout.current);\n }\n\n timeout.current = window.setTimeout(() => {\n handleDragEnd();\n }, 200);\n },\n [handleDragEnd, itemWidth, items, scope, snapPoints],\n );\n\n return useMemo(\n () => (\n <StyledSliderButton $isDisabled={isDisabled} ref={sliderButtonRef}>\n <StyledMotionSliderButtonThumb\n ref={scope}\n drag={isDisabled ? false : 'x'}\n dragElastic={0}\n dragConstraints={\n isSliderBigger\n ? { ...dragRange, right: dragRange.right - itemWidth }\n : { ...dragRange }\n }\n $width={itemWidth}\n onDrag={handleWhileDrag}\n onDragEnd={handleDragEnd}\n >\n {thumbText}\n </StyledMotionSliderButtonThumb>\n <StyledSliderButtonWrapper\n $width={!isSliderBigger ? dragRange.right + itemWidth : dragRange.right}\n ref={sliderButtonWrapperRef}\n onScroll={handleScroll}\n >\n <AnimatePresence>\n <StyledSliderButtonButtonsWrapper>\n {buttons}\n </StyledSliderButtonButtonsWrapper>\n </AnimatePresence>\n </StyledSliderButtonWrapper>\n </StyledSliderButton>\n ),\n [\n buttons,\n dragRange,\n handleDragEnd,\n handleScroll,\n handleWhileDrag,\n isDisabled,\n isSliderBigger,\n itemWidth,\n scope,\n thumbText,\n ],\n );\n};\n\nSliderButton.displayName = 'SliderButton';\n\nexport default SliderButton;\n"],"mappings":";;;;;;AAAA,IAAAA,aAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,uBAAA,CAAAF,OAAA;AACA,IAAAG,eAAA,GAAAH,OAAA;AAEA,IAAAI,UAAA,GAAAJ,OAAA;AACA,IAAAK,aAAA,GAAAL,OAAA;AACA,IAAAM,aAAA,GAAAN,OAAA;AAM+B,SAAAO,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAN,wBAAAM,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAsB/B,MAAMW,YAAmC,GAAGA,CAAC;EAAEC,gBAAgB;EAAEC,UAAU;EAAEC,KAAK;EAAEC;AAAS,CAAC,KAAK;EAC/F,MAAM,CAACC,cAAc,EAAEC,iBAAiB,CAAC,GAAG,IAAAC,eAAQ,EAAqBC,SAAS,CAAC;EACnF,MAAM,CAACC,SAAS,EAAEC,YAAY,CAAC,GAAG,IAAAH,eAAQ,EAAC;IAAEI,IAAI,EAAE,CAAC;IAAEC,KAAK,EAAE;EAAE,CAAC,CAAC;EAEjE,MAAMC,eAAe,GAAG,IAAAC,aAAM,EAAiB,IAAI,CAAC;EACpD,MAAMC,sBAAsB,GAAG,IAAAD,aAAM,EAAiB,IAAI,CAAC;EAC3D,MAAME,OAAO,GAAG,IAAAF,aAAM,EAAS,CAAC;EAChC,MAAMG,mBAAmB,GAAG,IAAAH,aAAM,EAAC,KAAK,CAAC;EAEzC,MAAM,CAACI,KAAK,EAAEC,OAAO,CAAC,GAAG,IAAAC,wBAAU,EAAC,CAAC;EAErC,MAAMC,SAAS,GAAG,IAAAC,cAAO,EAAC,MAAM,IAAAC,gCAAqB,EAACpB,KAAK,CAAC,EAAE,CAACA,KAAK,CAAC,CAAC;EAEtE,MAAMqB,UAAU,GAAG,IAAAC,8BAAc,EAACZ,eAAe,CAAC;EAElD,MAAMa,cAAc,GAAG,IAAAJ,cAAO,EAC1B,MAAME,UAAU,IAAIA,UAAU,CAACG,KAAK,GAAGN,SAAS,IAAIlB,KAAK,CAACyB,MAAM,GAAG,CAAC,CAAC,EACrE,CAACP,SAAS,EAAElB,KAAK,CAACyB,MAAM,EAAEJ,UAAU,CACxC,CAAC;EAED,IAAAK,gBAAS,EAAC,MAAM;IACZ,IAAIL,UAAU,EAAE;MACZ,MAAMM,WAAW,GAAGT,SAAS,IAAIlB,KAAK,CAACyB,MAAM,GAAG,CAAC,CAAC;MAElD,MAAMG,KAAK,GAAGC,IAAI,CAACC,KAAK,CAACT,UAAU,CAACG,KAAK,GAAGN,SAAS,CAAC;MAEtDX,YAAY,CAAC;QAAEC,IAAI,EAAE,CAAC;QAAEC,KAAK,EAAEc,cAAc,GAAGL,SAAS,GAAGU,KAAK,GAAGD;MAAY,CAAC,CAAC;IACtF;EACJ,CAAC,EAAE,CAACJ,cAAc,EAAEL,SAAS,EAAElB,KAAK,CAACyB,MAAM,EAAEJ,UAAU,CAAC,CAAC;EAEzD,MAAMU,SAAS,GAAG,IAAAC,kBAAW,EACzB,MAAOC,CAAS,IAAK;IACjB,MAAMjB,OAAO,CACTD,KAAK,CAACmB,OAAO,EACb;MAAED;IAAE,CAAC,EACL;MACIE,IAAI,EAAE,OAAO;MACbC,QAAQ,EAAE;IACd,CACJ,CAAC;EACL,CAAC,EACD,CAACpB,OAAO,EAAED,KAAK,CACnB,CAAC;EAED,IAAAW,gBAAS,EAAC,MAAM;IACZ,IAAI5B,gBAAgB,EAAE;MAClBK,iBAAiB,CAACL,gBAAgB,CAAC;MAEnC,MAAMuC,KAAK,GAAGrC,KAAK,CAACsC,SAAS,CAAC,CAAC;QAAEC;MAAG,CAAC,KAAKA,EAAE,KAAKzC,gBAAgB,CAAC;MAElE,IAAIuC,KAAK,IAAI,CAAC,EAAE;QACZ,KAAKN,SAAS,CAACb,SAAS,GAAGmB,KAAK,CAAC;MACrC;IACJ,CAAC,MAAM;MAAA,IAAAG,OAAA;MACHrC,iBAAiB,EAAAqC,OAAA,GAACxC,KAAK,CAAC,CAAC,CAAC,cAAAwC,OAAA,uBAARA,OAAA,CAAUD,EAAE,CAAC;IACnC;EACJ,CAAC,EAAE,CAACR,SAAS,EAAEb,SAAS,EAAElB,KAAK,EAAEF,gBAAgB,CAAC,CAAC;EAEnD,MAAM2C,WAAW,GAAG,IAAAT,kBAAW,EAC3B,CAACO,EAAU,EAAEF,KAAa,KAAK;IAC3B,IAAItC,UAAU,EAAE;MACZ;IACJ;IAEAI,iBAAiB,CAACoC,EAAE,CAAC;IAErB,IAAI,OAAOtC,QAAQ,KAAK,UAAU,EAAE;MAChCA,QAAQ,CAACsC,EAAE,CAAC;IAChB;IAEA,IAAI,CAAChB,cAAc,EAAE;MACjB,KAAKQ,SAAS,CAACb,SAAS,GAAGmB,KAAK,CAAC;MAEjC;IACJ;IAEA,MAAMT,KAAK,GAAGtB,SAAS,CAACG,KAAK,GAAGS,SAAS;IAEzC,IAAIlB,KAAK,CAACyB,MAAM,GAAGG,KAAK,IAAIS,KAAK,EAAE;MAC/B,KAAKN,SAAS,CAAC,CAAC,CAAC;IACrB,CAAC,MAAM;MACH,KAAKA,SAAS,CAACb,SAAS,IAAIU,KAAK,IAAI5B,KAAK,CAACyB,MAAM,GAAGY,KAAK,CAAC,CAAC,CAAC;IAChE;IAEA,IAAIzB,sBAAsB,CAACsB,OAAO,EAAE;MAChCtB,sBAAsB,CAACsB,OAAO,CAACQ,UAAU,GAAGxB,SAAS,GAAGmB,KAAK;IACjE;EACJ,CAAC,EACD,CAACN,SAAS,EAAEzB,SAAS,CAACG,KAAK,EAAEV,UAAU,EAAEwB,cAAc,EAAEL,SAAS,EAAElB,KAAK,CAACyB,MAAM,EAAExB,QAAQ,CAC9F,CAAC;EAED,MAAM0C,OAAO,GAAG,IAAAxB,cAAO,EACnB,MACInB,KAAK,CAAC4C,GAAG,CAAC,CAAC;IAAEL,EAAE;IAAEM;EAAK,CAAC,EAAER,KAAK,kBAC1BlE,MAAA,CAAAY,OAAA,CAAA+D,aAAA,CAACtE,aAAA,CAAAuE,sBAAsB;IACnBC,MAAM,EAAE9B,SAAU;IAClB+B,GAAG,EAAG,iBAAgBV,EAAG,EAAE;IAC3BW,OAAO,EAAEA,CAAA,KAAMT,WAAW,CAACF,EAAE,EAAEF,KAAK,CAAE;IACtCc,WAAW,EAAEZ,EAAE,KAAKrC;EAAe,GAElC2C,IACmB,CAC3B,CAAC,EACN,CAACJ,WAAW,EAAEvB,SAAS,EAAElB,KAAK,EAAEE,cAAc,CAClD,CAAC;EAED,MAAMkD,SAAS,GAAG,IAAAjC,cAAO,EAAC,MAAM;IAC5B,MAAMkC,YAAY,GAAGrD,KAAK,CAACsD,IAAI,CAAC,CAAC;MAAEf;IAAG,CAAC,KAAKA,EAAE,KAAKrC,cAAc,CAAC;IAElE,OAAOmD,YAAY,GAAGA,YAAY,CAACR,IAAI,GAAG,EAAE;EAChD,CAAC,EAAE,CAAC7C,KAAK,EAAEE,cAAc,CAAC,CAAC;;EAE3B;AACJ;AACA;EACI,MAAMqD,UAAU,GAAG,IAAApC,cAAO,EAAC,MAAM;IAC7B,MAAMqC,MAAM,GAAG,CAAC,CAAC,CAAC;IAElB,KAAK,IAAI7D,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGK,KAAK,CAACyB,MAAM,EAAE9B,CAAC,EAAE,EAAE;MACnC6D,MAAM,CAACC,IAAI,CAACvC,SAAS,GAAGvB,CAAC,CAAC;IAC9B;IAEA,OAAO6D,MAAM;EACjB,CAAC,EAAE,CAACtC,SAAS,EAAElB,KAAK,CAACyB,MAAM,CAAC,CAAC;EAE7B,MAAMiC,aAAa,GAAG,IAAA1B,kBAAW,EAAC,MAAM;IACpC,MAAM2B,QAAQ,GAAG,IAAAC,8BAAgB,EAAC;MAAE7C,KAAK;MAAEG;IAAU,CAAC,CAAC;IAEvD,IAAI,CAACyC,QAAQ,EAAE;MACX;IACJ;IAEA,MAAM;MAAEE,MAAM;MAAErD;IAAK,CAAC,GAAGmD,QAAQ;IAEjC,IAAIjB,UAAU,GAAG,CAAC;IAElB,IAAI9B,sBAAsB,CAACsB,OAAO,EAAE;MAChCQ,UAAU,GAAG9B,sBAAsB,CAACsB,OAAO,CAACQ,UAAU;MAEtD9B,sBAAsB,CAACsB,OAAO,CAACQ,UAAU,GAAG,IAAAoB,6BAAe,EAAC;QACxDP,UAAU;QACVI,QAAQ,EAAEE,MAAM;QAChBnB,UAAU,EAAEA,UAAU,GAAGlC;MAC7B,CAAC,CAAC,CAACuD,YAAY;IACnB;IAEA,MAAM;MAAEC;IAAa,CAAC,GAAG,IAAAF,6BAAe,EAAC;MACrCP,UAAU;MACVI,QAAQ,EAAEE,MAAM;MAChBnB;IACJ,CAAC,CAAC;IAEF,MAAM;MAAEqB;IAAa,CAAC,GAAG,IAAAD,6BAAe,EAAC;MACrCP,UAAU;MACVI,QAAQ,EAAEE,MAAM;MAChBnB,UAAU,EAAE;IAChB,CAAC,CAAC;IAEF,IAAIqB,YAAY,IAAI,CAAC,IAAIC,YAAY,IAAI,CAAC,EAAE;MAAA,IAAAC,mBAAA;MACxC,KAAKlC,SAAS,CAACgC,YAAY,CAAC;MAE5B,MAAMxB,EAAE,IAAA0B,mBAAA,GAAGjE,KAAK,CAACgE,YAAY,CAAC,cAAAC,mBAAA,uBAAnBA,mBAAA,CAAqB1B,EAAE;MAElCpC,iBAAiB,CAACoC,EAAE,CAAC;MAErB,IAAI,OAAOtC,QAAQ,KAAK,UAAU,IAAIsC,EAAE,EAAE;QACtCtC,QAAQ,CAACsC,EAAE,CAAC;MAChB;IACJ;IAEAzB,mBAAmB,CAACoB,OAAO,GAAG,KAAK;EACvC,CAAC,EAAE,CAACH,SAAS,EAAEb,SAAS,EAAElB,KAAK,EAAEC,QAAQ,EAAEc,KAAK,EAAEwC,UAAU,CAAC,CAAC;EAE9D,MAAMW,eAAe,GAAG,IAAAlC,kBAAW,EAAC,MAAM;IACtClB,mBAAmB,CAACoB,OAAO,GAAG,IAAI;IAElC,MAAMyB,QAAQ,GAAG,IAAAC,8BAAgB,EAAC;MAAE7C,KAAK;MAAEG;IAAU,CAAC,CAAC;IAEvD,IAAI,CAACyC,QAAQ,EAAE;MACX;IACJ;IAEA,MAAM;MAAElD,KAAK;MAAED,IAAI;MAAEqD;IAAO,CAAC,GAAGF,QAAQ;IAExC,IAAIjB,UAAU,GAAG,CAAC;IAElB,MAAMyB,WAAW,GAAG,CAAC;IAErB,IAAIvD,sBAAsB,CAACsB,OAAO,EAAE;MAChC,IAAIzB,KAAK,IAAIH,SAAS,CAACG,KAAK,EAAE;QAC1BG,sBAAsB,CAACsB,OAAO,CAACQ,UAAU,IAAIyB,WAAW;MAC5D;MAEA,IAAI3D,IAAI,IAAIF,SAAS,CAACE,IAAI,EAAE;QACxBI,sBAAsB,CAACsB,OAAO,CAACQ,UAAU,IAAIyB,WAAW;MAC5D;MAEAzB,UAAU,GAAG9B,sBAAsB,CAACsB,OAAO,CAACQ,UAAU;IAC1D;IAEA,MAAM;MAAEsB;IAAa,CAAC,GAAG,IAAAF,6BAAe,EAAC;MAAEP,UAAU;MAAEI,QAAQ,EAAEE,MAAM;MAAEnB;IAAW,CAAC,CAAC;IAEtF,IAAIsB,YAAY,IAAI,CAAC,EAAE;MAAA,IAAAI,oBAAA;MACnBjE,iBAAiB,EAAAiE,oBAAA,GAACpE,KAAK,CAACgE,YAAY,CAAC,cAAAI,oBAAA,uBAAnBA,oBAAA,CAAqB7B,EAAE,CAAC;IAC9C;EACJ,CAAC,EAAE,CAACjC,SAAS,EAAEY,SAAS,EAAElB,KAAK,EAAEe,KAAK,EAAEwC,UAAU,CAAC,CAAC;;EAEpD;EACA,IAAA7B,gBAAS,EAAC,MAAM;IACZ,KAAKK,SAAS,CAAC,CAAC,CAAC;IACjB,KAAKA,SAAS,CAAC,CAAC,CAAC;EACrB,CAAC,EAAE,CAACA,SAAS,CAAC,CAAC;EAEf,MAAMsC,YAAY,GAAG,IAAArC,kBAAW,EAC3BsC,KAA2B,IAAK;IAC7B,IAAIxD,mBAAmB,CAACoB,OAAO,EAAE;MAC7B;IACJ;IAEA,MAAMyB,QAAQ,GAAG,IAAAC,8BAAgB,EAAC;MAAE7C,KAAK;MAAEG;IAAU,CAAC,CAAC;IAEvD,IAAI,CAACyC,QAAQ,EAAE;MACX;IACJ;IAEA,MAAM;MAAEE;IAAO,CAAC,GAAGF,QAAQ;IAE3B,MAAM;MAAEjB;IAAW,CAAC,GAAG4B,KAAK,CAACC,MAAwB;IAErD,MAAM;MAAEP;IAAa,CAAC,GAAG,IAAAF,6BAAe,EAAC;MAAEP,UAAU;MAAEI,QAAQ,EAAEE,MAAM;MAAEnB;IAAW,CAAC,CAAC;IAEtF,IAAIsB,YAAY,IAAI,CAAC,EAAE;MAAA,IAAAQ,oBAAA;MACnBrE,iBAAiB,EAAAqE,oBAAA,GAACxE,KAAK,CAACgE,YAAY,CAAC,cAAAQ,oBAAA,uBAAnBA,oBAAA,CAAqBjC,EAAE,CAAC;IAC9C;IAEA,IAAI1B,OAAO,CAACqB,OAAO,EAAE;MACjBuC,YAAY,CAAC5D,OAAO,CAACqB,OAAO,CAAC;IACjC;IAEArB,OAAO,CAACqB,OAAO,GAAGwC,MAAM,CAACC,UAAU,CAAC,MAAM;MACtCjB,aAAa,CAAC,CAAC;IACnB,CAAC,EAAE,GAAG,CAAC;EACX,CAAC,EACD,CAACA,aAAa,EAAExC,SAAS,EAAElB,KAAK,EAAEe,KAAK,EAAEwC,UAAU,CACvD,CAAC;EAED,OAAO,IAAApC,cAAO,EACV,mBACIhD,MAAA,CAAAY,OAAA,CAAA+D,aAAA,CAACtE,aAAA,CAAAoG,kBAAkB;IAACC,WAAW,EAAE9E,UAAW;IAAC+E,GAAG,EAAEpE;EAAgB,gBAC9DvC,MAAA,CAAAY,OAAA,CAAA+D,aAAA,CAACtE,aAAA,CAAAuG,6BAA6B;IAC1BD,GAAG,EAAE/D,KAAM;IACXiE,IAAI,EAAEjF,UAAU,GAAG,KAAK,GAAG,GAAI;IAC/BkF,WAAW,EAAE,CAAE;IACfC,eAAe,EACX3D,cAAc,GACR;MAAE,GAAGjB,SAAS;MAAEG,KAAK,EAAEH,SAAS,CAACG,KAAK,GAAGS;IAAU,CAAC,GACpD;MAAE,GAAGZ;IAAU,CACxB;IACD0C,MAAM,EAAE9B,SAAU;IAClBiE,MAAM,EAAEjB,eAAgB;IACxBkB,SAAS,EAAE1B;EAAc,GAExBN,SAC0B,CAAC,eAChCjF,MAAA,CAAAY,OAAA,CAAA+D,aAAA,CAACtE,aAAA,CAAA6G,yBAAyB;IACtBrC,MAAM,EAAE,CAACzB,cAAc,GAAGjB,SAAS,CAACG,KAAK,GAAGS,SAAS,GAAGZ,SAAS,CAACG,KAAM;IACxEqE,GAAG,EAAElE,sBAAuB;IAC5B0E,QAAQ,EAAEjB;EAAa,gBAEvBlG,MAAA,CAAAY,OAAA,CAAA+D,aAAA,CAAC7E,aAAA,CAAAsH,eAAe,qBACZpH,MAAA,CAAAY,OAAA,CAAA+D,aAAA,CAACtE,aAAA,CAAAgH,gCAAgC,QAC5B7C,OAC6B,CACrB,CACM,CACX,CACvB,EACD,CACIA,OAAO,EACPrC,SAAS,EACToD,aAAa,EACbW,YAAY,EACZH,eAAe,EACfnE,UAAU,EACVwB,cAAc,EACdL,SAAS,EACTH,KAAK,EACLqC,SAAS,CAEjB,CAAC;AACL,CAAC;AAEDvD,YAAY,CAAC4F,WAAW,GAAG,cAAc;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAA5G,OAAA,GAE3Bc,YAAY","ignoreList":[]}
|
|
@@ -3,11 +3,17 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.StyledSliderButtonItem = exports.StyledSliderButton = exports.StyledMotionSliderButtonThumb = void 0;
|
|
6
|
+
exports.StyledSliderButtonWrapper = exports.StyledSliderButtonItem = exports.StyledSliderButtonButtonsWrapper = exports.StyledSliderButton = exports.StyledMotionSliderButtonThumb = void 0;
|
|
7
7
|
var _framerMotion = require("framer-motion");
|
|
8
8
|
var _styledComponents = _interopRequireDefault(require("styled-components"));
|
|
9
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
10
|
const StyledSliderButton = exports.StyledSliderButton = _styledComponents.default.div`
|
|
11
|
+
opacity: ${({
|
|
12
|
+
$isDisabled
|
|
13
|
+
}) => $isDisabled ? 0.5 : 1};
|
|
14
|
+
width: 100%;
|
|
15
|
+
`;
|
|
16
|
+
const StyledSliderButtonWrapper = exports.StyledSliderButtonWrapper = _styledComponents.default.div`
|
|
11
17
|
align-items: center;
|
|
12
18
|
background-color: ${({
|
|
13
19
|
theme
|
|
@@ -18,15 +24,16 @@ const StyledSliderButton = exports.StyledSliderButton = _styledComponents.defaul
|
|
|
18
24
|
cursor: pointer;
|
|
19
25
|
display: inline-flex;
|
|
20
26
|
line-height: 1.15;
|
|
21
|
-
|
|
22
|
-
opacity: ${({
|
|
23
|
-
$isDisabled
|
|
24
|
-
}) => $isDisabled ? 0.5 : 1};
|
|
27
|
+
height: 32px;
|
|
25
28
|
position: relative;
|
|
26
29
|
user-select: none;
|
|
27
30
|
transition: opacity 0.3s ease;
|
|
28
31
|
z-index: 1;
|
|
29
32
|
|
|
33
|
+
width: ${({
|
|
34
|
+
$width
|
|
35
|
+
}) => $width}px;
|
|
36
|
+
|
|
30
37
|
max-width: 100%;
|
|
31
38
|
overflow-x: scroll;
|
|
32
39
|
|
|
@@ -54,6 +61,11 @@ const StyledSliderButtonItem = exports.StyledSliderButtonItem = _styledComponent
|
|
|
54
61
|
display: flex;
|
|
55
62
|
justify-content: center;
|
|
56
63
|
`;
|
|
64
|
+
const StyledSliderButtonButtonsWrapper = exports.StyledSliderButtonButtonsWrapper = _styledComponents.default.div`
|
|
65
|
+
position: absolute;
|
|
66
|
+
display: flex;
|
|
67
|
+
align-items: center;
|
|
68
|
+
`;
|
|
57
69
|
const StyledMotionSliderButtonThumb = exports.StyledMotionSliderButtonThumb = (0, _styledComponents.default)(_framerMotion.motion.div)`
|
|
58
70
|
font-size: 110%;
|
|
59
71
|
font-family: 'Roboto Medium', serif;
|
|
@@ -67,9 +79,11 @@ const StyledMotionSliderButtonThumb = exports.StyledMotionSliderButtonThumb = (0
|
|
|
67
79
|
border-radius: 3px;
|
|
68
80
|
box-shadow: 1px 2px 3px rgba(0, 0, 0, 0.2);
|
|
69
81
|
z-index: 3;
|
|
70
|
-
height:
|
|
82
|
+
height: 32px;
|
|
71
83
|
padding: 7px 12px;
|
|
72
84
|
display: flex;
|
|
73
85
|
justify-content: center;
|
|
86
|
+
align-items: center;
|
|
87
|
+
cursor: pointer;
|
|
74
88
|
`;
|
|
75
89
|
//# sourceMappingURL=SliderButton.styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SliderButton.styles.js","names":["_framerMotion","require","_styledComponents","_interopRequireDefault","obj","__esModule","default","StyledSliderButton","exports","styled","div","theme","$
|
|
1
|
+
{"version":3,"file":"SliderButton.styles.js","names":["_framerMotion","require","_styledComponents","_interopRequireDefault","obj","__esModule","default","StyledSliderButton","exports","styled","div","$isDisabled","StyledSliderButtonWrapper","theme","$width","StyledSliderButtonItem","StyledSliderButtonButtonsWrapper","StyledMotionSliderButtonThumb","motion"],"sources":["../../../../src/components/slider-button/SliderButton.styles.ts"],"sourcesContent":["import { motion } from 'framer-motion';\nimport styled from 'styled-components';\nimport type { WithTheme } from '../color-scheme-provider/ColorSchemeProvider';\n\ntype StyledSliderButtonProps = WithTheme<{ $isDisabled?: boolean }>;\n\nexport const StyledSliderButton = styled.div<StyledSliderButtonProps>`\n opacity: ${({ $isDisabled }) => ($isDisabled ? 0.5 : 1)};\n width: 100%;\n`;\n\ntype StyledSliderButtonWrapperProps = WithTheme<{ $width: number }>;\n\nexport const StyledSliderButtonWrapper = styled.div<StyledSliderButtonWrapperProps>`\n align-items: center;\n background-color: ${({ theme }: StyledSliderButtonProps) => theme['404']};\n border-radius: 3px;\n border: none;\n color: white;\n cursor: pointer;\n display: inline-flex;\n line-height: 1.15;\n height: 32px;\n position: relative;\n user-select: none;\n transition: opacity 0.3s ease;\n z-index: 1;\n\n width: ${({ $width }) => $width}px;\n\n max-width: 100%;\n overflow-x: scroll;\n\n // Chrome\n &::-webkit-scrollbar {\n display: none;\n }\n\n // IE and Edge\n -ms-overflow-style: none;\n\n // Firefox\n scrollbar-width: none;\n`;\n\ntype StyledSliderButtonItemProps = WithTheme<{ $isSelected: boolean; $width: number }>;\n\nexport const StyledSliderButtonItem = styled.div<StyledSliderButtonItemProps>`\n font-size: 110%;\n font-family: 'Roboto Medium', serif;\n padding: 7px 12px;\n min-width: ${({ $width }) => $width}px;\n max-width: ${({ $width }) => $width}px;\n display: flex;\n justify-content: center;\n`;\n\nexport const StyledSliderButtonButtonsWrapper = styled.div`\n position: absolute;\n display: flex;\n align-items: center;\n`;\n\ntype StyledMotionSliderButtonThumbProps = WithTheme<{ $width: number }>;\n\nexport const StyledMotionSliderButtonThumb = styled(motion.div)<StyledMotionSliderButtonThumbProps>`\n font-size: 110%;\n font-family: 'Roboto Medium', serif;\n background-color: ${({ theme }: StyledMotionSliderButtonThumbProps) => theme['408']};\n width: ${({ $width }) => $width}px;\n position: absolute;\n border-radius: 3px;\n box-shadow: 1px 2px 3px rgba(0, 0, 0, 0.2);\n z-index: 3;\n height: 32px;\n padding: 7px 12px;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n`;\n"],"mappings":";;;;;;AAAA,IAAAA,aAAA,GAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAC,sBAAA,CAAAF,OAAA;AAAuC,SAAAE,uBAAAC,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAKhC,MAAMG,kBAAkB,GAAAC,OAAA,CAAAD,kBAAA,GAAGE,yBAAM,CAACC,GAA6B;AACtE,eAAe,CAAC;EAAEC;AAAY,CAAC,KAAMA,WAAW,GAAG,GAAG,GAAG,CAAG;AAC5D;AACA,CAAC;AAIM,MAAMC,yBAAyB,GAAAJ,OAAA,CAAAI,yBAAA,GAAGH,yBAAM,CAACC,GAAoC;AACpF;AACA,wBAAwB,CAAC;EAAEG;AAA+B,CAAC,KAAKA,KAAK,CAAC,KAAK,CAAE;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa,CAAC;EAAEC;AAAO,CAAC,KAAKA,MAAO;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAIM,MAAMC,sBAAsB,GAAAP,OAAA,CAAAO,sBAAA,GAAGN,yBAAM,CAACC,GAAiC;AAC9E;AACA;AACA;AACA,iBAAiB,CAAC;EAAEI;AAAO,CAAC,KAAKA,MAAO;AACxC,iBAAiB,CAAC;EAAEA;AAAO,CAAC,KAAKA,MAAO;AACxC;AACA;AACA,CAAC;AAEM,MAAME,gCAAgC,GAAAR,OAAA,CAAAQ,gCAAA,GAAGP,yBAAM,CAACC,GAAI;AAC3D;AACA;AACA;AACA,CAAC;AAIM,MAAMO,6BAA6B,GAAAT,OAAA,CAAAS,6BAAA,GAAG,IAAAR,yBAAM,EAACS,oBAAM,CAACR,GAAG,CAAsC;AACpG;AACA;AACA,wBAAwB,CAAC;EAAEG;AAA0C,CAAC,KAAKA,KAAK,CAAC,KAAK,CAAE;AACxF,aAAa,CAAC;EAAEC;AAAO,CAAC,KAAKA,MAAO;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC","ignoreList":[]}
|
|
@@ -6,13 +6,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.getThumbPosition = exports.getNearestPoint = void 0;
|
|
7
7
|
const getNearestPoint = ({
|
|
8
8
|
snapPoints,
|
|
9
|
-
position
|
|
9
|
+
position,
|
|
10
|
+
scrollLeft
|
|
10
11
|
}) => {
|
|
11
12
|
let nearestIndex = -1;
|
|
12
13
|
let nearestPoint = -Infinity;
|
|
13
14
|
for (let i = 0; i < snapPoints.length; i++) {
|
|
14
15
|
const index = snapPoints[i];
|
|
15
|
-
if (index && index < position && index > nearestPoint) {
|
|
16
|
+
if (index && index < position + scrollLeft && index > nearestPoint) {
|
|
16
17
|
nearestPoint = index;
|
|
17
18
|
nearestIndex = i;
|
|
18
19
|
}
|
|
@@ -44,10 +45,14 @@ const getThumbPosition = ({
|
|
|
44
45
|
position = parseFloat(match[1]);
|
|
45
46
|
}
|
|
46
47
|
}
|
|
47
|
-
if (!position) {
|
|
48
|
+
if (typeof position !== 'number' && !position) {
|
|
48
49
|
return undefined;
|
|
49
50
|
}
|
|
50
|
-
return
|
|
51
|
+
return {
|
|
52
|
+
left: position,
|
|
53
|
+
right: position + itemWidth,
|
|
54
|
+
middle: position + itemWidth / 2
|
|
55
|
+
};
|
|
51
56
|
};
|
|
52
57
|
exports.getThumbPosition = getThumbPosition;
|
|
53
58
|
//# sourceMappingURL=sliderButton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sliderButton.js","names":["getNearestPoint","snapPoints","position","nearestIndex","nearestPoint","Infinity","i","length","index","exports","getThumbPosition","itemWidth","scope","current","undefined","transform","style","match","parseFloat"],"sources":["../../../src/utils/sliderButton.ts"],"sourcesContent":["import type { AnimationScope } from 'framer-motion';\n\ninterface GetNearestPointProps {\n position: number;\n snapPoints: number[];\n}\nexport const getNearestPoint = ({ snapPoints, position }: GetNearestPointProps) => {\n let nearestIndex = -1;\n let nearestPoint = -Infinity;\n\n for (let i = 0; i < snapPoints.length; i++) {\n const index = snapPoints[i];\n\n if (index && index < position && index > nearestPoint) {\n nearestPoint = index;\n nearestIndex = i;\n }\n }\n\n nearestIndex = nearestIndex === -1 ? 0 : nearestIndex;\n nearestPoint = nearestPoint === -Infinity ? 0 : nearestPoint;\n\n return { nearestIndex, nearestPoint };\n};\n\ninterface GetThumbPositionProps {\n scope: AnimationScope;\n itemWidth: number;\n}\n\nexport const getThumbPosition = ({ itemWidth, scope }: GetThumbPositionProps) => {\n if (!scope.current) {\n return undefined;\n }\n\n const { transform } = (scope.current as HTMLElement).style;\n let position;\n\n if (transform === 'none') {\n position = 0;\n } else {\n const match = transform.match(/translateX\\(([-\\d.]+)px\\)/);\n\n if (match && match[1]) {\n position = parseFloat(match[1]);\n }\n }\n\n if (!position) {\n return undefined;\n }\n\n return position + itemWidth / 2;\n};\n"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"sliderButton.js","names":["getNearestPoint","snapPoints","position","scrollLeft","nearestIndex","nearestPoint","Infinity","i","length","index","exports","getThumbPosition","itemWidth","scope","current","undefined","transform","style","match","parseFloat","left","right","middle"],"sources":["../../../src/utils/sliderButton.ts"],"sourcesContent":["import type { AnimationScope } from 'framer-motion';\n\ninterface GetNearestPointProps {\n position: number;\n snapPoints: number[];\n scrollLeft: number;\n}\nexport const getNearestPoint = ({ snapPoints, position, scrollLeft }: GetNearestPointProps) => {\n let nearestIndex = -1;\n let nearestPoint = -Infinity;\n\n for (let i = 0; i < snapPoints.length; i++) {\n const index = snapPoints[i];\n\n if (index && index < position + scrollLeft && index > nearestPoint) {\n nearestPoint = index;\n nearestIndex = i;\n }\n }\n\n nearestIndex = nearestIndex === -1 ? 0 : nearestIndex;\n nearestPoint = nearestPoint === -Infinity ? 0 : nearestPoint;\n\n return { nearestIndex, nearestPoint };\n};\n\ninterface GetThumbPositionProps {\n scope: AnimationScope;\n itemWidth: number;\n}\n\nexport const getThumbPosition = ({ itemWidth, scope }: GetThumbPositionProps) => {\n if (!scope.current) {\n return undefined;\n }\n\n const { transform } = (scope.current as HTMLElement).style;\n let position;\n\n if (transform === 'none') {\n position = 0;\n } else {\n const match = transform.match(/translateX\\(([-\\d.]+)px\\)/);\n\n if (match && match[1]) {\n position = parseFloat(match[1]);\n }\n }\n\n if (typeof position !== 'number' && !position) {\n return undefined;\n }\n\n return { left: position, right: position + itemWidth, middle: position + itemWidth / 2 };\n};\n"],"mappings":";;;;;;AAOO,MAAMA,eAAe,GAAGA,CAAC;EAAEC,UAAU;EAAEC,QAAQ;EAAEC;AAAiC,CAAC,KAAK;EAC3F,IAAIC,YAAY,GAAG,CAAC,CAAC;EACrB,IAAIC,YAAY,GAAG,CAACC,QAAQ;EAE5B,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGN,UAAU,CAACO,MAAM,EAAED,CAAC,EAAE,EAAE;IACxC,MAAME,KAAK,GAAGR,UAAU,CAACM,CAAC,CAAC;IAE3B,IAAIE,KAAK,IAAIA,KAAK,GAAGP,QAAQ,GAAGC,UAAU,IAAIM,KAAK,GAAGJ,YAAY,EAAE;MAChEA,YAAY,GAAGI,KAAK;MACpBL,YAAY,GAAGG,CAAC;IACpB;EACJ;EAEAH,YAAY,GAAGA,YAAY,KAAK,CAAC,CAAC,GAAG,CAAC,GAAGA,YAAY;EACrDC,YAAY,GAAGA,YAAY,KAAK,CAACC,QAAQ,GAAG,CAAC,GAAGD,YAAY;EAE5D,OAAO;IAAED,YAAY;IAAEC;EAAa,CAAC;AACzC,CAAC;AAACK,OAAA,CAAAV,eAAA,GAAAA,eAAA;AAOK,MAAMW,gBAAgB,GAAGA,CAAC;EAAEC,SAAS;EAAEC;AAA6B,CAAC,KAAK;EAC7E,IAAI,CAACA,KAAK,CAACC,OAAO,EAAE;IAChB,OAAOC,SAAS;EACpB;EAEA,MAAM;IAAEC;EAAU,CAAC,GAAIH,KAAK,CAACC,OAAO,CAAiBG,KAAK;EAC1D,IAAIf,QAAQ;EAEZ,IAAIc,SAAS,KAAK,MAAM,EAAE;IACtBd,QAAQ,GAAG,CAAC;EAChB,CAAC,MAAM;IACH,MAAMgB,KAAK,GAAGF,SAAS,CAACE,KAAK,CAAC,2BAA2B,CAAC;IAE1D,IAAIA,KAAK,IAAIA,KAAK,CAAC,CAAC,CAAC,EAAE;MACnBhB,QAAQ,GAAGiB,UAAU,CAACD,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC;EACJ;EAEA,IAAI,OAAOhB,QAAQ,KAAK,QAAQ,IAAI,CAACA,QAAQ,EAAE;IAC3C,OAAOa,SAAS;EACpB;EAEA,OAAO;IAAEK,IAAI,EAAElB,QAAQ;IAAEmB,KAAK,EAAEnB,QAAQ,GAAGU,SAAS;IAAEU,MAAM,EAAEpB,QAAQ,GAAGU,SAAS,GAAG;EAAE,CAAC;AAC5F,CAAC;AAACF,OAAA,CAAAC,gBAAA,GAAAA,gBAAA","ignoreList":[]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { AnimatePresence, useAnimate } from 'framer-motion';
|
|
2
2
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
3
|
+
import { useElementSize } from '../../hooks/useElementSize';
|
|
3
4
|
import { calculateBiggestWidth } from '../../utils/calculate';
|
|
4
5
|
import { getNearestPoint, getThumbPosition } from '../../utils/sliderButton';
|
|
5
|
-
import { StyledMotionSliderButtonThumb, StyledSliderButton, StyledSliderButtonItem } from './SliderButton.styles';
|
|
6
|
+
import { StyledMotionSliderButtonThumb, StyledSliderButton, StyledSliderButtonButtonsWrapper, StyledSliderButtonItem, StyledSliderButtonWrapper } from './SliderButton.styles';
|
|
6
7
|
const SliderButton = _ref => {
|
|
7
8
|
let {
|
|
8
9
|
selectedButtonId,
|
|
@@ -16,14 +17,23 @@ const SliderButton = _ref => {
|
|
|
16
17
|
right: 0
|
|
17
18
|
});
|
|
18
19
|
const sliderButtonRef = useRef(null);
|
|
20
|
+
const sliderButtonWrapperRef = useRef(null);
|
|
21
|
+
const timeout = useRef();
|
|
22
|
+
const preventHandleScroll = useRef(false);
|
|
19
23
|
const [scope, animate] = useAnimate();
|
|
20
24
|
const itemWidth = useMemo(() => calculateBiggestWidth(items), [items]);
|
|
25
|
+
const sliderSize = useElementSize(sliderButtonRef);
|
|
26
|
+
const isSliderBigger = useMemo(() => sliderSize && sliderSize.width < itemWidth * (items.length - 1), [itemWidth, items.length, sliderSize]);
|
|
21
27
|
useEffect(() => {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
if (sliderSize) {
|
|
29
|
+
const sliderWidth = itemWidth * (items.length - 1);
|
|
30
|
+
const count = Math.floor(sliderSize.width / itemWidth);
|
|
31
|
+
setDragRange({
|
|
32
|
+
left: 0,
|
|
33
|
+
right: isSliderBigger ? itemWidth * count : sliderWidth
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}, [isSliderBigger, itemWidth, items.length, sliderSize]);
|
|
27
37
|
const animation = useCallback(async x => {
|
|
28
38
|
await animate(scope.current, {
|
|
29
39
|
x
|
|
@@ -56,8 +66,20 @@ const SliderButton = _ref => {
|
|
|
56
66
|
if (typeof onChange === 'function') {
|
|
57
67
|
onChange(id);
|
|
58
68
|
}
|
|
59
|
-
|
|
60
|
-
|
|
69
|
+
if (!isSliderBigger) {
|
|
70
|
+
void animation(itemWidth * index);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const count = dragRange.right / itemWidth;
|
|
74
|
+
if (items.length - count >= index) {
|
|
75
|
+
void animation(0);
|
|
76
|
+
} else {
|
|
77
|
+
void animation(itemWidth * (count - (items.length - index)));
|
|
78
|
+
}
|
|
79
|
+
if (sliderButtonWrapperRef.current) {
|
|
80
|
+
sliderButtonWrapperRef.current.scrollLeft = itemWidth * index;
|
|
81
|
+
}
|
|
82
|
+
}, [animation, dragRange.right, isDisabled, isSliderBigger, itemWidth, items.length, onChange]);
|
|
61
83
|
const buttons = useMemo(() => items.map((_ref3, index) => {
|
|
62
84
|
let {
|
|
63
85
|
id,
|
|
@@ -99,21 +121,44 @@ const SliderButton = _ref => {
|
|
|
99
121
|
return;
|
|
100
122
|
}
|
|
101
123
|
const {
|
|
102
|
-
|
|
124
|
+
middle,
|
|
125
|
+
left
|
|
126
|
+
} = position;
|
|
127
|
+
let scrollLeft = 0;
|
|
128
|
+
if (sliderButtonWrapperRef.current) {
|
|
129
|
+
scrollLeft = sliderButtonWrapperRef.current.scrollLeft;
|
|
130
|
+
sliderButtonWrapperRef.current.scrollLeft = getNearestPoint({
|
|
131
|
+
snapPoints,
|
|
132
|
+
position: middle,
|
|
133
|
+
scrollLeft: scrollLeft - left
|
|
134
|
+
}).nearestPoint;
|
|
135
|
+
}
|
|
136
|
+
const {
|
|
103
137
|
nearestIndex
|
|
104
138
|
} = getNearestPoint({
|
|
105
139
|
snapPoints,
|
|
106
|
-
position
|
|
140
|
+
position: middle,
|
|
141
|
+
scrollLeft
|
|
142
|
+
});
|
|
143
|
+
const {
|
|
144
|
+
nearestPoint
|
|
145
|
+
} = getNearestPoint({
|
|
146
|
+
snapPoints,
|
|
147
|
+
position: middle,
|
|
148
|
+
scrollLeft: 0
|
|
107
149
|
});
|
|
108
150
|
if (nearestPoint >= 0 && nearestIndex >= 0) {
|
|
109
151
|
void animation(nearestPoint);
|
|
110
152
|
const id = items[nearestIndex]?.id;
|
|
153
|
+
setSelectedButton(id);
|
|
111
154
|
if (typeof onChange === 'function' && id) {
|
|
112
155
|
onChange(id);
|
|
113
156
|
}
|
|
114
157
|
}
|
|
158
|
+
preventHandleScroll.current = false;
|
|
115
159
|
}, [animation, itemWidth, items, onChange, scope, snapPoints]);
|
|
116
160
|
const handleWhileDrag = useCallback(() => {
|
|
161
|
+
preventHandleScroll.current = true;
|
|
117
162
|
const position = getThumbPosition({
|
|
118
163
|
scope,
|
|
119
164
|
itemWidth
|
|
@@ -121,33 +166,94 @@ const SliderButton = _ref => {
|
|
|
121
166
|
if (!position) {
|
|
122
167
|
return;
|
|
123
168
|
}
|
|
124
|
-
|
|
125
|
-
|
|
169
|
+
const {
|
|
170
|
+
right,
|
|
171
|
+
left,
|
|
172
|
+
middle
|
|
173
|
+
} = position;
|
|
174
|
+
let scrollLeft = 0;
|
|
175
|
+
const scrollSpeed = 3;
|
|
176
|
+
if (sliderButtonWrapperRef.current) {
|
|
177
|
+
if (right >= dragRange.right) {
|
|
178
|
+
sliderButtonWrapperRef.current.scrollLeft += scrollSpeed;
|
|
179
|
+
}
|
|
180
|
+
if (left <= dragRange.left) {
|
|
181
|
+
sliderButtonWrapperRef.current.scrollLeft -= scrollSpeed;
|
|
182
|
+
}
|
|
183
|
+
scrollLeft = sliderButtonWrapperRef.current.scrollLeft;
|
|
184
|
+
}
|
|
185
|
+
const {
|
|
186
|
+
nearestIndex
|
|
187
|
+
} = getNearestPoint({
|
|
188
|
+
snapPoints,
|
|
189
|
+
position: middle,
|
|
190
|
+
scrollLeft
|
|
191
|
+
});
|
|
192
|
+
if (nearestIndex >= 0) {
|
|
193
|
+
setSelectedButton(items[nearestIndex]?.id);
|
|
194
|
+
}
|
|
195
|
+
}, [dragRange, itemWidth, items, scope, snapPoints]);
|
|
196
|
+
|
|
197
|
+
// With this, the handleScroll works before the thumb is moved the first time.
|
|
198
|
+
useEffect(() => {
|
|
199
|
+
void animation(1);
|
|
200
|
+
void animation(0);
|
|
201
|
+
}, [animation]);
|
|
202
|
+
const handleScroll = useCallback(event => {
|
|
203
|
+
if (preventHandleScroll.current) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const position = getThumbPosition({
|
|
207
|
+
scope,
|
|
208
|
+
itemWidth
|
|
209
|
+
});
|
|
210
|
+
if (!position) {
|
|
211
|
+
return;
|
|
126
212
|
}
|
|
213
|
+
const {
|
|
214
|
+
middle
|
|
215
|
+
} = position;
|
|
216
|
+
const {
|
|
217
|
+
scrollLeft
|
|
218
|
+
} = event.target;
|
|
127
219
|
const {
|
|
128
220
|
nearestIndex
|
|
129
221
|
} = getNearestPoint({
|
|
130
222
|
snapPoints,
|
|
131
|
-
position
|
|
223
|
+
position: middle,
|
|
224
|
+
scrollLeft
|
|
132
225
|
});
|
|
133
226
|
if (nearestIndex >= 0) {
|
|
134
227
|
setSelectedButton(items[nearestIndex]?.id);
|
|
135
228
|
}
|
|
136
|
-
|
|
229
|
+
if (timeout.current) {
|
|
230
|
+
clearTimeout(timeout.current);
|
|
231
|
+
}
|
|
232
|
+
timeout.current = window.setTimeout(() => {
|
|
233
|
+
handleDragEnd();
|
|
234
|
+
}, 200);
|
|
235
|
+
}, [handleDragEnd, itemWidth, items, scope, snapPoints]);
|
|
137
236
|
return useMemo(() => /*#__PURE__*/React.createElement(StyledSliderButton, {
|
|
138
237
|
$isDisabled: isDisabled,
|
|
139
238
|
ref: sliderButtonRef
|
|
140
|
-
}, /*#__PURE__*/React.createElement(
|
|
239
|
+
}, /*#__PURE__*/React.createElement(StyledMotionSliderButtonThumb, {
|
|
141
240
|
ref: scope,
|
|
142
241
|
drag: isDisabled ? false : 'x',
|
|
143
242
|
dragElastic: 0,
|
|
144
|
-
dragConstraints: {
|
|
243
|
+
dragConstraints: isSliderBigger ? {
|
|
244
|
+
...dragRange,
|
|
245
|
+
right: dragRange.right - itemWidth
|
|
246
|
+
} : {
|
|
145
247
|
...dragRange
|
|
146
248
|
},
|
|
147
249
|
$width: itemWidth,
|
|
148
250
|
onDrag: handleWhileDrag,
|
|
149
251
|
onDragEnd: handleDragEnd
|
|
150
|
-
}, thumbText)
|
|
252
|
+
}, thumbText), /*#__PURE__*/React.createElement(StyledSliderButtonWrapper, {
|
|
253
|
+
$width: !isSliderBigger ? dragRange.right + itemWidth : dragRange.right,
|
|
254
|
+
ref: sliderButtonWrapperRef,
|
|
255
|
+
onScroll: handleScroll
|
|
256
|
+
}, /*#__PURE__*/React.createElement(AnimatePresence, null, /*#__PURE__*/React.createElement(StyledSliderButtonButtonsWrapper, null, buttons)))), [buttons, dragRange, handleDragEnd, handleScroll, handleWhileDrag, isDisabled, isSliderBigger, itemWidth, scope, thumbText]);
|
|
151
257
|
};
|
|
152
258
|
SliderButton.displayName = 'SliderButton';
|
|
153
259
|
export default SliderButton;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SliderButton.js","names":["AnimatePresence","useAnimate","React","useCallback","useEffect","useMemo","useRef","useState","calculateBiggestWidth","getNearestPoint","getThumbPosition","StyledMotionSliderButtonThumb","StyledSliderButton","StyledSliderButtonItem","SliderButton","_ref","selectedButtonId","isDisabled","items","onChange","selectedButton","setSelectedButton","undefined","dragRange","setDragRange","left","right","sliderButtonRef","scope","animate","itemWidth","length","animation","x","current","type","duration","index","findIndex","_ref2","id","handleClick","buttons","map","_ref3","text","createElement","$width","key","onClick","$isSelected","thumbText","selectedItem","find","_ref4","snapPoints","points","i","push","handleDragEnd","position","nearestPoint","nearestIndex","handleWhileDrag","scrollLeft","$isDisabled","ref","drag","dragElastic","dragConstraints","onDrag","onDragEnd","displayName"],"sources":["../../../../src/components/slider-button/SliderButton.tsx"],"sourcesContent":["import { AnimatePresence, useAnimate } from 'framer-motion';\nimport React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { SliderButtonItem } from '../../types/slider-button';\nimport { calculateBiggestWidth } from '../../utils/calculate';\nimport { getNearestPoint, getThumbPosition } from '../../utils/sliderButton';\nimport {\n StyledMotionSliderButtonThumb,\n StyledSliderButton,\n StyledSliderButtonItem,\n} from './SliderButton.styles';\n\nexport type SliderButtonProps = {\n /**\n * Whether the button is disabled.\n */\n isDisabled?: boolean;\n /**\n * Function to be executed when a button is selected.\n * @param id\n */\n onChange?: (id: string) => void;\n /**\n * The buttons that are slidable.\n */\n items: SliderButtonItem[];\n /**\n * The id of a button that should be selected.\n */\n selectedButtonId?: string;\n};\n\nconst SliderButton: FC<SliderButtonProps> = ({ selectedButtonId, isDisabled, items, onChange }) => {\n const [selectedButton, setSelectedButton] = useState<string | undefined>(undefined);\n const [dragRange, setDragRange] = useState({ left: 0, right: 0 });\n\n const sliderButtonRef = useRef<HTMLDivElement>(null);\n\n const [scope, animate] = useAnimate();\n\n const itemWidth = useMemo(() => calculateBiggestWidth(items), [items]);\n\n useEffect(() => {\n setDragRange({ left: 0, right: itemWidth * (items.length - 1) });\n }, [itemWidth, items.length]);\n\n const animation = useCallback(\n async (x: number) => {\n await animate(\n scope.current,\n { x },\n {\n type: 'tween',\n duration: 0.2,\n },\n );\n },\n [animate, scope],\n );\n\n useEffect(() => {\n if (selectedButtonId) {\n setSelectedButton(selectedButtonId);\n\n const index = items.findIndex(({ id }) => id === selectedButtonId);\n\n if (index >= 0) {\n void animation(itemWidth * index);\n }\n } else {\n setSelectedButton(items[0]?.id);\n }\n }, [animation, itemWidth, items, selectedButtonId]);\n\n const handleClick = useCallback(\n (id: string, index: number) => {\n if (isDisabled) {\n return;\n }\n\n setSelectedButton(id);\n\n if (typeof onChange === 'function') {\n onChange(id);\n }\n\n void animation(itemWidth * index);\n },\n [animation, isDisabled, itemWidth, onChange],\n );\n\n const buttons = useMemo(\n () =>\n items.map(({ id, text }, index) => (\n <StyledSliderButtonItem\n $width={itemWidth}\n key={`slider-button-${id}`}\n onClick={() => handleClick(id, index)}\n $isSelected={id === selectedButton}\n >\n {text}\n </StyledSliderButtonItem>\n )),\n [handleClick, itemWidth, items, selectedButton],\n );\n\n const thumbText = useMemo(() => {\n const selectedItem = items.find(({ id }) => id === selectedButton);\n\n return selectedItem ? selectedItem.text : '';\n }, [items, selectedButton]);\n\n /**\n * Creates an array with the snap points relative to the width of the items\n */\n const snapPoints = useMemo(() => {\n const points = [0];\n\n for (let i = 1; i < items.length; i++) {\n points.push(itemWidth * i);\n }\n\n return points;\n }, [itemWidth, items.length]);\n\n const handleDragEnd = useCallback(() => {\n const position = getThumbPosition({ scope, itemWidth });\n\n if (!position) {\n return;\n }\n\n const { nearestPoint, nearestIndex } = getNearestPoint({ snapPoints, position });\n\n if (nearestPoint >= 0 && nearestIndex >= 0) {\n void animation(nearestPoint);\n\n const id = items[nearestIndex]?.id;\n\n if (typeof onChange === 'function' && id) {\n onChange(id);\n }\n }\n }, [animation, itemWidth, items, onChange, scope, snapPoints]);\n\n const handleWhileDrag = useCallback(() => {\n const position = getThumbPosition({ scope, itemWidth });\n\n if (!position) {\n return;\n }\n\n if (sliderButtonRef.current) {\n sliderButtonRef.current.scrollLeft = (position - itemWidth / 2) / 1.1;\n }\n\n const { nearestIndex } = getNearestPoint({ snapPoints, position });\n\n if (nearestIndex >= 0) {\n setSelectedButton(items[nearestIndex]?.id);\n }\n }, [itemWidth, items, scope, snapPoints]);\n\n return useMemo(\n () => (\n <StyledSliderButton $isDisabled={isDisabled} ref={sliderButtonRef}>\n <AnimatePresence>\n {buttons}\n <StyledMotionSliderButtonThumb\n ref={scope}\n drag={isDisabled ? false : 'x'}\n dragElastic={0}\n dragConstraints={{ ...dragRange }}\n $width={itemWidth}\n onDrag={handleWhileDrag}\n onDragEnd={handleDragEnd}\n >\n {thumbText}\n </StyledMotionSliderButtonThumb>\n </AnimatePresence>\n </StyledSliderButton>\n ),\n [\n buttons,\n dragRange,\n handleDragEnd,\n handleWhileDrag,\n isDisabled,\n itemWidth,\n scope,\n thumbText,\n ],\n );\n};\n\nSliderButton.displayName = 'SliderButton';\n\nexport default SliderButton;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"SliderButton.js","names":["AnimatePresence","useAnimate","React","useCallback","useEffect","useMemo","useRef","useState","useElementSize","calculateBiggestWidth","getNearestPoint","getThumbPosition","StyledMotionSliderButtonThumb","StyledSliderButton","StyledSliderButtonButtonsWrapper","StyledSliderButtonItem","StyledSliderButtonWrapper","SliderButton","_ref","selectedButtonId","isDisabled","items","onChange","selectedButton","setSelectedButton","undefined","dragRange","setDragRange","left","right","sliderButtonRef","sliderButtonWrapperRef","timeout","preventHandleScroll","scope","animate","itemWidth","sliderSize","isSliderBigger","width","length","sliderWidth","count","Math","floor","animation","x","current","type","duration","index","findIndex","_ref2","id","handleClick","scrollLeft","buttons","map","_ref3","text","createElement","$width","key","onClick","$isSelected","thumbText","selectedItem","find","_ref4","snapPoints","points","i","push","handleDragEnd","position","middle","nearestPoint","nearestIndex","handleWhileDrag","scrollSpeed","handleScroll","event","target","clearTimeout","window","setTimeout","$isDisabled","ref","drag","dragElastic","dragConstraints","onDrag","onDragEnd","onScroll","displayName"],"sources":["../../../../src/components/slider-button/SliderButton.tsx"],"sourcesContent":["import { AnimatePresence, useAnimate } from 'framer-motion';\nimport React, { FC, UIEvent, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useElementSize } from '../../hooks/useElementSize';\nimport type { SliderButtonItem } from '../../types/slider-button';\nimport { calculateBiggestWidth } from '../../utils/calculate';\nimport { getNearestPoint, getThumbPosition } from '../../utils/sliderButton';\nimport {\n StyledMotionSliderButtonThumb,\n StyledSliderButton,\n StyledSliderButtonButtonsWrapper,\n StyledSliderButtonItem,\n StyledSliderButtonWrapper,\n} from './SliderButton.styles';\n\nexport type SliderButtonProps = {\n /**\n * Whether the button is disabled.\n */\n isDisabled?: boolean;\n /**\n * Function to be executed when a button is selected.\n * @param id\n */\n onChange?: (id: string) => void;\n /**\n * The buttons that are slidable.\n */\n items: SliderButtonItem[];\n /**\n * The id of a button that should be selected.\n */\n selectedButtonId?: string;\n};\n\nconst SliderButton: FC<SliderButtonProps> = ({ selectedButtonId, isDisabled, items, onChange }) => {\n const [selectedButton, setSelectedButton] = useState<string | undefined>(undefined);\n const [dragRange, setDragRange] = useState({ left: 0, right: 0 });\n\n const sliderButtonRef = useRef<HTMLDivElement>(null);\n const sliderButtonWrapperRef = useRef<HTMLDivElement>(null);\n const timeout = useRef<number>();\n const preventHandleScroll = useRef(false);\n\n const [scope, animate] = useAnimate();\n\n const itemWidth = useMemo(() => calculateBiggestWidth(items), [items]);\n\n const sliderSize = useElementSize(sliderButtonRef);\n\n const isSliderBigger = useMemo(\n () => sliderSize && sliderSize.width < itemWidth * (items.length - 1),\n [itemWidth, items.length, sliderSize],\n );\n\n useEffect(() => {\n if (sliderSize) {\n const sliderWidth = itemWidth * (items.length - 1);\n\n const count = Math.floor(sliderSize.width / itemWidth);\n\n setDragRange({ left: 0, right: isSliderBigger ? itemWidth * count : sliderWidth });\n }\n }, [isSliderBigger, itemWidth, items.length, sliderSize]);\n\n const animation = useCallback(\n async (x: number) => {\n await animate(\n scope.current,\n { x },\n {\n type: 'tween',\n duration: 0.2,\n },\n );\n },\n [animate, scope],\n );\n\n useEffect(() => {\n if (selectedButtonId) {\n setSelectedButton(selectedButtonId);\n\n const index = items.findIndex(({ id }) => id === selectedButtonId);\n\n if (index >= 0) {\n void animation(itemWidth * index);\n }\n } else {\n setSelectedButton(items[0]?.id);\n }\n }, [animation, itemWidth, items, selectedButtonId]);\n\n const handleClick = useCallback(\n (id: string, index: number) => {\n if (isDisabled) {\n return;\n }\n\n setSelectedButton(id);\n\n if (typeof onChange === 'function') {\n onChange(id);\n }\n\n if (!isSliderBigger) {\n void animation(itemWidth * index);\n\n return;\n }\n\n const count = dragRange.right / itemWidth;\n\n if (items.length - count >= index) {\n void animation(0);\n } else {\n void animation(itemWidth * (count - (items.length - index)));\n }\n\n if (sliderButtonWrapperRef.current) {\n sliderButtonWrapperRef.current.scrollLeft = itemWidth * index;\n }\n },\n [animation, dragRange.right, isDisabled, isSliderBigger, itemWidth, items.length, onChange],\n );\n\n const buttons = useMemo(\n () =>\n items.map(({ id, text }, index) => (\n <StyledSliderButtonItem\n $width={itemWidth}\n key={`slider-button-${id}`}\n onClick={() => handleClick(id, index)}\n $isSelected={id === selectedButton}\n >\n {text}\n </StyledSliderButtonItem>\n )),\n [handleClick, itemWidth, items, selectedButton],\n );\n\n const thumbText = useMemo(() => {\n const selectedItem = items.find(({ id }) => id === selectedButton);\n\n return selectedItem ? selectedItem.text : '';\n }, [items, selectedButton]);\n\n /**\n * Creates an array with the snap points relative to the width of the items\n */\n const snapPoints = useMemo(() => {\n const points = [0];\n\n for (let i = 1; i < items.length; i++) {\n points.push(itemWidth * i);\n }\n\n return points;\n }, [itemWidth, items.length]);\n\n const handleDragEnd = useCallback(() => {\n const position = getThumbPosition({ scope, itemWidth });\n\n if (!position) {\n return;\n }\n\n const { middle, left } = position;\n\n let scrollLeft = 0;\n\n if (sliderButtonWrapperRef.current) {\n scrollLeft = sliderButtonWrapperRef.current.scrollLeft;\n\n sliderButtonWrapperRef.current.scrollLeft = getNearestPoint({\n snapPoints,\n position: middle,\n scrollLeft: scrollLeft - left,\n }).nearestPoint;\n }\n\n const { nearestIndex } = getNearestPoint({\n snapPoints,\n position: middle,\n scrollLeft,\n });\n\n const { nearestPoint } = getNearestPoint({\n snapPoints,\n position: middle,\n scrollLeft: 0,\n });\n\n if (nearestPoint >= 0 && nearestIndex >= 0) {\n void animation(nearestPoint);\n\n const id = items[nearestIndex]?.id;\n\n setSelectedButton(id);\n\n if (typeof onChange === 'function' && id) {\n onChange(id);\n }\n }\n\n preventHandleScroll.current = false;\n }, [animation, itemWidth, items, onChange, scope, snapPoints]);\n\n const handleWhileDrag = useCallback(() => {\n preventHandleScroll.current = true;\n\n const position = getThumbPosition({ scope, itemWidth });\n\n if (!position) {\n return;\n }\n\n const { right, left, middle } = position;\n\n let scrollLeft = 0;\n\n const scrollSpeed = 3;\n\n if (sliderButtonWrapperRef.current) {\n if (right >= dragRange.right) {\n sliderButtonWrapperRef.current.scrollLeft += scrollSpeed;\n }\n\n if (left <= dragRange.left) {\n sliderButtonWrapperRef.current.scrollLeft -= scrollSpeed;\n }\n\n scrollLeft = sliderButtonWrapperRef.current.scrollLeft;\n }\n\n const { nearestIndex } = getNearestPoint({ snapPoints, position: middle, scrollLeft });\n\n if (nearestIndex >= 0) {\n setSelectedButton(items[nearestIndex]?.id);\n }\n }, [dragRange, itemWidth, items, scope, snapPoints]);\n\n // With this, the handleScroll works before the thumb is moved the first time.\n useEffect(() => {\n void animation(1);\n void animation(0);\n }, [animation]);\n\n const handleScroll = useCallback(\n (event: UIEvent<HTMLElement>) => {\n if (preventHandleScroll.current) {\n return;\n }\n\n const position = getThumbPosition({ scope, itemWidth });\n\n if (!position) {\n return;\n }\n\n const { middle } = position;\n\n const { scrollLeft } = event.target as HTMLDivElement;\n\n const { nearestIndex } = getNearestPoint({ snapPoints, position: middle, scrollLeft });\n\n if (nearestIndex >= 0) {\n setSelectedButton(items[nearestIndex]?.id);\n }\n\n if (timeout.current) {\n clearTimeout(timeout.current);\n }\n\n timeout.current = window.setTimeout(() => {\n handleDragEnd();\n }, 200);\n },\n [handleDragEnd, itemWidth, items, scope, snapPoints],\n );\n\n return useMemo(\n () => (\n <StyledSliderButton $isDisabled={isDisabled} ref={sliderButtonRef}>\n <StyledMotionSliderButtonThumb\n ref={scope}\n drag={isDisabled ? false : 'x'}\n dragElastic={0}\n dragConstraints={\n isSliderBigger\n ? { ...dragRange, right: dragRange.right - itemWidth }\n : { ...dragRange }\n }\n $width={itemWidth}\n onDrag={handleWhileDrag}\n onDragEnd={handleDragEnd}\n >\n {thumbText}\n </StyledMotionSliderButtonThumb>\n <StyledSliderButtonWrapper\n $width={!isSliderBigger ? dragRange.right + itemWidth : dragRange.right}\n ref={sliderButtonWrapperRef}\n onScroll={handleScroll}\n >\n <AnimatePresence>\n <StyledSliderButtonButtonsWrapper>\n {buttons}\n </StyledSliderButtonButtonsWrapper>\n </AnimatePresence>\n </StyledSliderButtonWrapper>\n </StyledSliderButton>\n ),\n [\n buttons,\n dragRange,\n handleDragEnd,\n handleScroll,\n handleWhileDrag,\n isDisabled,\n isSliderBigger,\n itemWidth,\n scope,\n thumbText,\n ],\n );\n};\n\nSliderButton.displayName = 'SliderButton';\n\nexport default SliderButton;\n"],"mappings":"AAAA,SAASA,eAAe,EAAEC,UAAU,QAAQ,eAAe;AAC3D,OAAOC,KAAK,IAAiBC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,OAAO;AAC7F,SAASC,cAAc,QAAQ,4BAA4B;AAE3D,SAASC,qBAAqB,QAAQ,uBAAuB;AAC7D,SAASC,eAAe,EAAEC,gBAAgB,QAAQ,0BAA0B;AAC5E,SACIC,6BAA6B,EAC7BC,kBAAkB,EAClBC,gCAAgC,EAChCC,sBAAsB,EACtBC,yBAAyB,QACtB,uBAAuB;AAsB9B,MAAMC,YAAmC,GAAGC,IAAA,IAAuD;EAAA,IAAtD;IAAEC,gBAAgB;IAAEC,UAAU;IAAEC,KAAK;IAAEC;EAAS,CAAC,GAAAJ,IAAA;EAC1F,MAAM,CAACK,cAAc,EAAEC,iBAAiB,CAAC,GAAGjB,QAAQ,CAAqBkB,SAAS,CAAC;EACnF,MAAM,CAACC,SAAS,EAAEC,YAAY,CAAC,GAAGpB,QAAQ,CAAC;IAAEqB,IAAI,EAAE,CAAC;IAAEC,KAAK,EAAE;EAAE,CAAC,CAAC;EAEjE,MAAMC,eAAe,GAAGxB,MAAM,CAAiB,IAAI,CAAC;EACpD,MAAMyB,sBAAsB,GAAGzB,MAAM,CAAiB,IAAI,CAAC;EAC3D,MAAM0B,OAAO,GAAG1B,MAAM,CAAS,CAAC;EAChC,MAAM2B,mBAAmB,GAAG3B,MAAM,CAAC,KAAK,CAAC;EAEzC,MAAM,CAAC4B,KAAK,EAAEC,OAAO,CAAC,GAAGlC,UAAU,CAAC,CAAC;EAErC,MAAMmC,SAAS,GAAG/B,OAAO,CAAC,MAAMI,qBAAqB,CAACY,KAAK,CAAC,EAAE,CAACA,KAAK,CAAC,CAAC;EAEtE,MAAMgB,UAAU,GAAG7B,cAAc,CAACsB,eAAe,CAAC;EAElD,MAAMQ,cAAc,GAAGjC,OAAO,CAC1B,MAAMgC,UAAU,IAAIA,UAAU,CAACE,KAAK,GAAGH,SAAS,IAAIf,KAAK,CAACmB,MAAM,GAAG,CAAC,CAAC,EACrE,CAACJ,SAAS,EAAEf,KAAK,CAACmB,MAAM,EAAEH,UAAU,CACxC,CAAC;EAEDjC,SAAS,CAAC,MAAM;IACZ,IAAIiC,UAAU,EAAE;MACZ,MAAMI,WAAW,GAAGL,SAAS,IAAIf,KAAK,CAACmB,MAAM,GAAG,CAAC,CAAC;MAElD,MAAME,KAAK,GAAGC,IAAI,CAACC,KAAK,CAACP,UAAU,CAACE,KAAK,GAAGH,SAAS,CAAC;MAEtDT,YAAY,CAAC;QAAEC,IAAI,EAAE,CAAC;QAAEC,KAAK,EAAES,cAAc,GAAGF,SAAS,GAAGM,KAAK,GAAGD;MAAY,CAAC,CAAC;IACtF;EACJ,CAAC,EAAE,CAACH,cAAc,EAAEF,SAAS,EAAEf,KAAK,CAACmB,MAAM,EAAEH,UAAU,CAAC,CAAC;EAEzD,MAAMQ,SAAS,GAAG1C,WAAW,CACzB,MAAO2C,CAAS,IAAK;IACjB,MAAMX,OAAO,CACTD,KAAK,CAACa,OAAO,EACb;MAAED;IAAE,CAAC,EACL;MACIE,IAAI,EAAE,OAAO;MACbC,QAAQ,EAAE;IACd,CACJ,CAAC;EACL,CAAC,EACD,CAACd,OAAO,EAAED,KAAK,CACnB,CAAC;EAED9B,SAAS,CAAC,MAAM;IACZ,IAAIe,gBAAgB,EAAE;MAClBK,iBAAiB,CAACL,gBAAgB,CAAC;MAEnC,MAAM+B,KAAK,GAAG7B,KAAK,CAAC8B,SAAS,CAACC,KAAA;QAAA,IAAC;UAAEC;QAAG,CAAC,GAAAD,KAAA;QAAA,OAAKC,EAAE,KAAKlC,gBAAgB;MAAA,EAAC;MAElE,IAAI+B,KAAK,IAAI,CAAC,EAAE;QACZ,KAAKL,SAAS,CAACT,SAAS,GAAGc,KAAK,CAAC;MACrC;IACJ,CAAC,MAAM;MACH1B,iBAAiB,CAACH,KAAK,CAAC,CAAC,CAAC,EAAEgC,EAAE,CAAC;IACnC;EACJ,CAAC,EAAE,CAACR,SAAS,EAAET,SAAS,EAAEf,KAAK,EAAEF,gBAAgB,CAAC,CAAC;EAEnD,MAAMmC,WAAW,GAAGnD,WAAW,CAC3B,CAACkD,EAAU,EAAEH,KAAa,KAAK;IAC3B,IAAI9B,UAAU,EAAE;MACZ;IACJ;IAEAI,iBAAiB,CAAC6B,EAAE,CAAC;IAErB,IAAI,OAAO/B,QAAQ,KAAK,UAAU,EAAE;MAChCA,QAAQ,CAAC+B,EAAE,CAAC;IAChB;IAEA,IAAI,CAACf,cAAc,EAAE;MACjB,KAAKO,SAAS,CAACT,SAAS,GAAGc,KAAK,CAAC;MAEjC;IACJ;IAEA,MAAMR,KAAK,GAAGhB,SAAS,CAACG,KAAK,GAAGO,SAAS;IAEzC,IAAIf,KAAK,CAACmB,MAAM,GAAGE,KAAK,IAAIQ,KAAK,EAAE;MAC/B,KAAKL,SAAS,CAAC,CAAC,CAAC;IACrB,CAAC,MAAM;MACH,KAAKA,SAAS,CAACT,SAAS,IAAIM,KAAK,IAAIrB,KAAK,CAACmB,MAAM,GAAGU,KAAK,CAAC,CAAC,CAAC;IAChE;IAEA,IAAInB,sBAAsB,CAACgB,OAAO,EAAE;MAChChB,sBAAsB,CAACgB,OAAO,CAACQ,UAAU,GAAGnB,SAAS,GAAGc,KAAK;IACjE;EACJ,CAAC,EACD,CAACL,SAAS,EAAEnB,SAAS,CAACG,KAAK,EAAET,UAAU,EAAEkB,cAAc,EAAEF,SAAS,EAAEf,KAAK,CAACmB,MAAM,EAAElB,QAAQ,CAC9F,CAAC;EAED,MAAMkC,OAAO,GAAGnD,OAAO,CACnB,MACIgB,KAAK,CAACoC,GAAG,CAAC,CAAAC,KAAA,EAAeR,KAAK;IAAA,IAAnB;MAAEG,EAAE;MAAEM;IAAK,CAAC,GAAAD,KAAA;IAAA,oBACnBxD,KAAA,CAAA0D,aAAA,CAAC7C,sBAAsB;MACnB8C,MAAM,EAAEzB,SAAU;MAClB0B,GAAG,EAAG,iBAAgBT,EAAG,EAAE;MAC3BU,OAAO,EAAEA,CAAA,KAAMT,WAAW,CAACD,EAAE,EAAEH,KAAK,CAAE;MACtCc,WAAW,EAAEX,EAAE,KAAK9B;IAAe,GAElCoC,IACmB,CAAC;EAAA,CAC5B,CAAC,EACN,CAACL,WAAW,EAAElB,SAAS,EAAEf,KAAK,EAAEE,cAAc,CAClD,CAAC;EAED,MAAM0C,SAAS,GAAG5D,OAAO,CAAC,MAAM;IAC5B,MAAM6D,YAAY,GAAG7C,KAAK,CAAC8C,IAAI,CAACC,KAAA;MAAA,IAAC;QAAEf;MAAG,CAAC,GAAAe,KAAA;MAAA,OAAKf,EAAE,KAAK9B,cAAc;IAAA,EAAC;IAElE,OAAO2C,YAAY,GAAGA,YAAY,CAACP,IAAI,GAAG,EAAE;EAChD,CAAC,EAAE,CAACtC,KAAK,EAAEE,cAAc,CAAC,CAAC;;EAE3B;AACJ;AACA;EACI,MAAM8C,UAAU,GAAGhE,OAAO,CAAC,MAAM;IAC7B,MAAMiE,MAAM,GAAG,CAAC,CAAC,CAAC;IAElB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGlD,KAAK,CAACmB,MAAM,EAAE+B,CAAC,EAAE,EAAE;MACnCD,MAAM,CAACE,IAAI,CAACpC,SAAS,GAAGmC,CAAC,CAAC;IAC9B;IAEA,OAAOD,MAAM;EACjB,CAAC,EAAE,CAAClC,SAAS,EAAEf,KAAK,CAACmB,MAAM,CAAC,CAAC;EAE7B,MAAMiC,aAAa,GAAGtE,WAAW,CAAC,MAAM;IACpC,MAAMuE,QAAQ,GAAG/D,gBAAgB,CAAC;MAAEuB,KAAK;MAAEE;IAAU,CAAC,CAAC;IAEvD,IAAI,CAACsC,QAAQ,EAAE;MACX;IACJ;IAEA,MAAM;MAAEC,MAAM;MAAE/C;IAAK,CAAC,GAAG8C,QAAQ;IAEjC,IAAInB,UAAU,GAAG,CAAC;IAElB,IAAIxB,sBAAsB,CAACgB,OAAO,EAAE;MAChCQ,UAAU,GAAGxB,sBAAsB,CAACgB,OAAO,CAACQ,UAAU;MAEtDxB,sBAAsB,CAACgB,OAAO,CAACQ,UAAU,GAAG7C,eAAe,CAAC;QACxD2D,UAAU;QACVK,QAAQ,EAAEC,MAAM;QAChBpB,UAAU,EAAEA,UAAU,GAAG3B;MAC7B,CAAC,CAAC,CAACgD,YAAY;IACnB;IAEA,MAAM;MAAEC;IAAa,CAAC,GAAGnE,eAAe,CAAC;MACrC2D,UAAU;MACVK,QAAQ,EAAEC,MAAM;MAChBpB;IACJ,CAAC,CAAC;IAEF,MAAM;MAAEqB;IAAa,CAAC,GAAGlE,eAAe,CAAC;MACrC2D,UAAU;MACVK,QAAQ,EAAEC,MAAM;MAChBpB,UAAU,EAAE;IAChB,CAAC,CAAC;IAEF,IAAIqB,YAAY,IAAI,CAAC,IAAIC,YAAY,IAAI,CAAC,EAAE;MACxC,KAAKhC,SAAS,CAAC+B,YAAY,CAAC;MAE5B,MAAMvB,EAAE,GAAGhC,KAAK,CAACwD,YAAY,CAAC,EAAExB,EAAE;MAElC7B,iBAAiB,CAAC6B,EAAE,CAAC;MAErB,IAAI,OAAO/B,QAAQ,KAAK,UAAU,IAAI+B,EAAE,EAAE;QACtC/B,QAAQ,CAAC+B,EAAE,CAAC;MAChB;IACJ;IAEApB,mBAAmB,CAACc,OAAO,GAAG,KAAK;EACvC,CAAC,EAAE,CAACF,SAAS,EAAET,SAAS,EAAEf,KAAK,EAAEC,QAAQ,EAAEY,KAAK,EAAEmC,UAAU,CAAC,CAAC;EAE9D,MAAMS,eAAe,GAAG3E,WAAW,CAAC,MAAM;IACtC8B,mBAAmB,CAACc,OAAO,GAAG,IAAI;IAElC,MAAM2B,QAAQ,GAAG/D,gBAAgB,CAAC;MAAEuB,KAAK;MAAEE;IAAU,CAAC,CAAC;IAEvD,IAAI,CAACsC,QAAQ,EAAE;MACX;IACJ;IAEA,MAAM;MAAE7C,KAAK;MAAED,IAAI;MAAE+C;IAAO,CAAC,GAAGD,QAAQ;IAExC,IAAInB,UAAU,GAAG,CAAC;IAElB,MAAMwB,WAAW,GAAG,CAAC;IAErB,IAAIhD,sBAAsB,CAACgB,OAAO,EAAE;MAChC,IAAIlB,KAAK,IAAIH,SAAS,CAACG,KAAK,EAAE;QAC1BE,sBAAsB,CAACgB,OAAO,CAACQ,UAAU,IAAIwB,WAAW;MAC5D;MAEA,IAAInD,IAAI,IAAIF,SAAS,CAACE,IAAI,EAAE;QACxBG,sBAAsB,CAACgB,OAAO,CAACQ,UAAU,IAAIwB,WAAW;MAC5D;MAEAxB,UAAU,GAAGxB,sBAAsB,CAACgB,OAAO,CAACQ,UAAU;IAC1D;IAEA,MAAM;MAAEsB;IAAa,CAAC,GAAGnE,eAAe,CAAC;MAAE2D,UAAU;MAAEK,QAAQ,EAAEC,MAAM;MAAEpB;IAAW,CAAC,CAAC;IAEtF,IAAIsB,YAAY,IAAI,CAAC,EAAE;MACnBrD,iBAAiB,CAACH,KAAK,CAACwD,YAAY,CAAC,EAAExB,EAAE,CAAC;IAC9C;EACJ,CAAC,EAAE,CAAC3B,SAAS,EAAEU,SAAS,EAAEf,KAAK,EAAEa,KAAK,EAAEmC,UAAU,CAAC,CAAC;;EAEpD;EACAjE,SAAS,CAAC,MAAM;IACZ,KAAKyC,SAAS,CAAC,CAAC,CAAC;IACjB,KAAKA,SAAS,CAAC,CAAC,CAAC;EACrB,CAAC,EAAE,CAACA,SAAS,CAAC,CAAC;EAEf,MAAMmC,YAAY,GAAG7E,WAAW,CAC3B8E,KAA2B,IAAK;IAC7B,IAAIhD,mBAAmB,CAACc,OAAO,EAAE;MAC7B;IACJ;IAEA,MAAM2B,QAAQ,GAAG/D,gBAAgB,CAAC;MAAEuB,KAAK;MAAEE;IAAU,CAAC,CAAC;IAEvD,IAAI,CAACsC,QAAQ,EAAE;MACX;IACJ;IAEA,MAAM;MAAEC;IAAO,CAAC,GAAGD,QAAQ;IAE3B,MAAM;MAAEnB;IAAW,CAAC,GAAG0B,KAAK,CAACC,MAAwB;IAErD,MAAM;MAAEL;IAAa,CAAC,GAAGnE,eAAe,CAAC;MAAE2D,UAAU;MAAEK,QAAQ,EAAEC,MAAM;MAAEpB;IAAW,CAAC,CAAC;IAEtF,IAAIsB,YAAY,IAAI,CAAC,EAAE;MACnBrD,iBAAiB,CAACH,KAAK,CAACwD,YAAY,CAAC,EAAExB,EAAE,CAAC;IAC9C;IAEA,IAAIrB,OAAO,CAACe,OAAO,EAAE;MACjBoC,YAAY,CAACnD,OAAO,CAACe,OAAO,CAAC;IACjC;IAEAf,OAAO,CAACe,OAAO,GAAGqC,MAAM,CAACC,UAAU,CAAC,MAAM;MACtCZ,aAAa,CAAC,CAAC;IACnB,CAAC,EAAE,GAAG,CAAC;EACX,CAAC,EACD,CAACA,aAAa,EAAErC,SAAS,EAAEf,KAAK,EAAEa,KAAK,EAAEmC,UAAU,CACvD,CAAC;EAED,OAAOhE,OAAO,CACV,mBACIH,KAAA,CAAA0D,aAAA,CAAC/C,kBAAkB;IAACyE,WAAW,EAAElE,UAAW;IAACmE,GAAG,EAAEzD;EAAgB,gBAC9D5B,KAAA,CAAA0D,aAAA,CAAChD,6BAA6B;IAC1B2E,GAAG,EAAErD,KAAM;IACXsD,IAAI,EAAEpE,UAAU,GAAG,KAAK,GAAG,GAAI;IAC/BqE,WAAW,EAAE,CAAE;IACfC,eAAe,EACXpD,cAAc,GACR;MAAE,GAAGZ,SAAS;MAAEG,KAAK,EAAEH,SAAS,CAACG,KAAK,GAAGO;IAAU,CAAC,GACpD;MAAE,GAAGV;IAAU,CACxB;IACDmC,MAAM,EAAEzB,SAAU;IAClBuD,MAAM,EAAEb,eAAgB;IACxBc,SAAS,EAAEnB;EAAc,GAExBR,SAC0B,CAAC,eAChC/D,KAAA,CAAA0D,aAAA,CAAC5C,yBAAyB;IACtB6C,MAAM,EAAE,CAACvB,cAAc,GAAGZ,SAAS,CAACG,KAAK,GAAGO,SAAS,GAAGV,SAAS,CAACG,KAAM;IACxE0D,GAAG,EAAExD,sBAAuB;IAC5B8D,QAAQ,EAAEb;EAAa,gBAEvB9E,KAAA,CAAA0D,aAAA,CAAC5D,eAAe,qBACZE,KAAA,CAAA0D,aAAA,CAAC9C,gCAAgC,QAC5B0C,OAC6B,CACrB,CACM,CACX,CACvB,EACD,CACIA,OAAO,EACP9B,SAAS,EACT+C,aAAa,EACbO,YAAY,EACZF,eAAe,EACf1D,UAAU,EACVkB,cAAc,EACdF,SAAS,EACTF,KAAK,EACL+B,SAAS,CAEjB,CAAC;AACL,CAAC;AAEDhD,YAAY,CAAC6E,WAAW,GAAG,cAAc;AAEzC,eAAe7E,YAAY","ignoreList":[]}
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import { motion } from 'framer-motion';
|
|
2
2
|
import styled from 'styled-components';
|
|
3
3
|
export const StyledSliderButton = styled.div`
|
|
4
|
+
opacity: ${_ref => {
|
|
5
|
+
let {
|
|
6
|
+
$isDisabled
|
|
7
|
+
} = _ref;
|
|
8
|
+
return $isDisabled ? 0.5 : 1;
|
|
9
|
+
}};
|
|
10
|
+
width: 100%;
|
|
11
|
+
`;
|
|
12
|
+
export const StyledSliderButtonWrapper = styled.div`
|
|
4
13
|
align-items: center;
|
|
5
|
-
background-color: ${
|
|
14
|
+
background-color: ${_ref2 => {
|
|
6
15
|
let {
|
|
7
16
|
theme
|
|
8
|
-
} =
|
|
17
|
+
} = _ref2;
|
|
9
18
|
return theme['404'];
|
|
10
19
|
}};
|
|
11
20
|
border-radius: 3px;
|
|
@@ -14,18 +23,19 @@ export const StyledSliderButton = styled.div`
|
|
|
14
23
|
cursor: pointer;
|
|
15
24
|
display: inline-flex;
|
|
16
25
|
line-height: 1.15;
|
|
17
|
-
|
|
18
|
-
opacity: ${_ref2 => {
|
|
19
|
-
let {
|
|
20
|
-
$isDisabled
|
|
21
|
-
} = _ref2;
|
|
22
|
-
return $isDisabled ? 0.5 : 1;
|
|
23
|
-
}};
|
|
26
|
+
height: 32px;
|
|
24
27
|
position: relative;
|
|
25
28
|
user-select: none;
|
|
26
29
|
transition: opacity 0.3s ease;
|
|
27
30
|
z-index: 1;
|
|
28
31
|
|
|
32
|
+
width: ${_ref3 => {
|
|
33
|
+
let {
|
|
34
|
+
$width
|
|
35
|
+
} = _ref3;
|
|
36
|
+
return $width;
|
|
37
|
+
}}px;
|
|
38
|
+
|
|
29
39
|
max-width: 100%;
|
|
30
40
|
overflow-x: scroll;
|
|
31
41
|
|
|
@@ -44,43 +54,50 @@ export const StyledSliderButtonItem = styled.div`
|
|
|
44
54
|
font-size: 110%;
|
|
45
55
|
font-family: 'Roboto Medium', serif;
|
|
46
56
|
padding: 7px 12px;
|
|
47
|
-
min-width: ${
|
|
57
|
+
min-width: ${_ref4 => {
|
|
48
58
|
let {
|
|
49
59
|
$width
|
|
50
|
-
} =
|
|
60
|
+
} = _ref4;
|
|
51
61
|
return $width;
|
|
52
62
|
}}px;
|
|
53
|
-
max-width: ${
|
|
63
|
+
max-width: ${_ref5 => {
|
|
54
64
|
let {
|
|
55
65
|
$width
|
|
56
|
-
} =
|
|
66
|
+
} = _ref5;
|
|
57
67
|
return $width;
|
|
58
68
|
}}px;
|
|
59
69
|
display: flex;
|
|
60
70
|
justify-content: center;
|
|
61
71
|
`;
|
|
72
|
+
export const StyledSliderButtonButtonsWrapper = styled.div`
|
|
73
|
+
position: absolute;
|
|
74
|
+
display: flex;
|
|
75
|
+
align-items: center;
|
|
76
|
+
`;
|
|
62
77
|
export const StyledMotionSliderButtonThumb = styled(motion.div)`
|
|
63
78
|
font-size: 110%;
|
|
64
79
|
font-family: 'Roboto Medium', serif;
|
|
65
|
-
background-color: ${
|
|
80
|
+
background-color: ${_ref6 => {
|
|
66
81
|
let {
|
|
67
82
|
theme
|
|
68
|
-
} =
|
|
83
|
+
} = _ref6;
|
|
69
84
|
return theme['408'];
|
|
70
85
|
}};
|
|
71
|
-
width: ${
|
|
86
|
+
width: ${_ref7 => {
|
|
72
87
|
let {
|
|
73
88
|
$width
|
|
74
|
-
} =
|
|
89
|
+
} = _ref7;
|
|
75
90
|
return $width;
|
|
76
91
|
}}px;
|
|
77
92
|
position: absolute;
|
|
78
93
|
border-radius: 3px;
|
|
79
94
|
box-shadow: 1px 2px 3px rgba(0, 0, 0, 0.2);
|
|
80
95
|
z-index: 3;
|
|
81
|
-
height:
|
|
96
|
+
height: 32px;
|
|
82
97
|
padding: 7px 12px;
|
|
83
98
|
display: flex;
|
|
84
99
|
justify-content: center;
|
|
100
|
+
align-items: center;
|
|
101
|
+
cursor: pointer;
|
|
85
102
|
`;
|
|
86
103
|
//# sourceMappingURL=SliderButton.styles.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SliderButton.styles.js","names":["motion","styled","StyledSliderButton","div","_ref","
|
|
1
|
+
{"version":3,"file":"SliderButton.styles.js","names":["motion","styled","StyledSliderButton","div","_ref","$isDisabled","StyledSliderButtonWrapper","_ref2","theme","_ref3","$width","StyledSliderButtonItem","_ref4","_ref5","StyledSliderButtonButtonsWrapper","StyledMotionSliderButtonThumb","_ref6","_ref7"],"sources":["../../../../src/components/slider-button/SliderButton.styles.ts"],"sourcesContent":["import { motion } from 'framer-motion';\nimport styled from 'styled-components';\nimport type { WithTheme } from '../color-scheme-provider/ColorSchemeProvider';\n\ntype StyledSliderButtonProps = WithTheme<{ $isDisabled?: boolean }>;\n\nexport const StyledSliderButton = styled.div<StyledSliderButtonProps>`\n opacity: ${({ $isDisabled }) => ($isDisabled ? 0.5 : 1)};\n width: 100%;\n`;\n\ntype StyledSliderButtonWrapperProps = WithTheme<{ $width: number }>;\n\nexport const StyledSliderButtonWrapper = styled.div<StyledSliderButtonWrapperProps>`\n align-items: center;\n background-color: ${({ theme }: StyledSliderButtonProps) => theme['404']};\n border-radius: 3px;\n border: none;\n color: white;\n cursor: pointer;\n display: inline-flex;\n line-height: 1.15;\n height: 32px;\n position: relative;\n user-select: none;\n transition: opacity 0.3s ease;\n z-index: 1;\n\n width: ${({ $width }) => $width}px;\n\n max-width: 100%;\n overflow-x: scroll;\n\n // Chrome\n &::-webkit-scrollbar {\n display: none;\n }\n\n // IE and Edge\n -ms-overflow-style: none;\n\n // Firefox\n scrollbar-width: none;\n`;\n\ntype StyledSliderButtonItemProps = WithTheme<{ $isSelected: boolean; $width: number }>;\n\nexport const StyledSliderButtonItem = styled.div<StyledSliderButtonItemProps>`\n font-size: 110%;\n font-family: 'Roboto Medium', serif;\n padding: 7px 12px;\n min-width: ${({ $width }) => $width}px;\n max-width: ${({ $width }) => $width}px;\n display: flex;\n justify-content: center;\n`;\n\nexport const StyledSliderButtonButtonsWrapper = styled.div`\n position: absolute;\n display: flex;\n align-items: center;\n`;\n\ntype StyledMotionSliderButtonThumbProps = WithTheme<{ $width: number }>;\n\nexport const StyledMotionSliderButtonThumb = styled(motion.div)<StyledMotionSliderButtonThumbProps>`\n font-size: 110%;\n font-family: 'Roboto Medium', serif;\n background-color: ${({ theme }: StyledMotionSliderButtonThumbProps) => theme['408']};\n width: ${({ $width }) => $width}px;\n position: absolute;\n border-radius: 3px;\n box-shadow: 1px 2px 3px rgba(0, 0, 0, 0.2);\n z-index: 3;\n height: 32px;\n padding: 7px 12px;\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n`;\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,eAAe;AACtC,OAAOC,MAAM,MAAM,mBAAmB;AAKtC,OAAO,MAAMC,kBAAkB,GAAGD,MAAM,CAACE,GAA6B;AACtE,eAAeC,IAAA;EAAA,IAAC;IAAEC;EAAY,CAAC,GAAAD,IAAA;EAAA,OAAMC,WAAW,GAAG,GAAG,GAAG,CAAC;AAAA,CAAE;AAC5D;AACA,CAAC;AAID,OAAO,MAAMC,yBAAyB,GAAGL,MAAM,CAACE,GAAoC;AACpF;AACA,wBAAwBI,KAAA;EAAA,IAAC;IAAEC;EAA+B,CAAC,GAAAD,KAAA;EAAA,OAAKC,KAAK,CAAC,KAAK,CAAC;AAAA,CAAC;AAC7E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAaC,KAAA;EAAA,IAAC;IAAEC;EAAO,CAAC,GAAAD,KAAA;EAAA,OAAKC,MAAM;AAAA,CAAC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAID,OAAO,MAAMC,sBAAsB,GAAGV,MAAM,CAACE,GAAiC;AAC9E;AACA;AACA;AACA,iBAAiBS,KAAA;EAAA,IAAC;IAAEF;EAAO,CAAC,GAAAE,KAAA;EAAA,OAAKF,MAAM;AAAA,CAAC;AACxC,iBAAiBG,KAAA;EAAA,IAAC;IAAEH;EAAO,CAAC,GAAAG,KAAA;EAAA,OAAKH,MAAM;AAAA,CAAC;AACxC;AACA;AACA,CAAC;AAED,OAAO,MAAMI,gCAAgC,GAAGb,MAAM,CAACE,GAAI;AAC3D;AACA;AACA;AACA,CAAC;AAID,OAAO,MAAMY,6BAA6B,GAAGd,MAAM,CAACD,MAAM,CAACG,GAAG,CAAsC;AACpG;AACA;AACA,wBAAwBa,KAAA;EAAA,IAAC;IAAER;EAA0C,CAAC,GAAAQ,KAAA;EAAA,OAAKR,KAAK,CAAC,KAAK,CAAC;AAAA,CAAC;AACxF,aAAaS,KAAA;EAAA,IAAC;IAAEP;EAAO,CAAC,GAAAO,KAAA;EAAA,OAAKP,MAAM;AAAA,CAAC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC","ignoreList":[]}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
export const getNearestPoint = _ref => {
|
|
2
2
|
let {
|
|
3
3
|
snapPoints,
|
|
4
|
-
position
|
|
4
|
+
position,
|
|
5
|
+
scrollLeft
|
|
5
6
|
} = _ref;
|
|
6
7
|
let nearestIndex = -1;
|
|
7
8
|
let nearestPoint = -Infinity;
|
|
8
9
|
for (let i = 0; i < snapPoints.length; i++) {
|
|
9
10
|
const index = snapPoints[i];
|
|
10
|
-
if (index && index < position && index > nearestPoint) {
|
|
11
|
+
if (index && index < position + scrollLeft && index > nearestPoint) {
|
|
11
12
|
nearestPoint = index;
|
|
12
13
|
nearestIndex = i;
|
|
13
14
|
}
|
|
@@ -39,9 +40,13 @@ export const getThumbPosition = _ref2 => {
|
|
|
39
40
|
position = parseFloat(match[1]);
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
|
-
if (!position) {
|
|
43
|
+
if (typeof position !== 'number' && !position) {
|
|
43
44
|
return undefined;
|
|
44
45
|
}
|
|
45
|
-
return
|
|
46
|
+
return {
|
|
47
|
+
left: position,
|
|
48
|
+
right: position + itemWidth,
|
|
49
|
+
middle: position + itemWidth / 2
|
|
50
|
+
};
|
|
46
51
|
};
|
|
47
52
|
//# sourceMappingURL=sliderButton.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sliderButton.js","names":["getNearestPoint","_ref","snapPoints","position","nearestIndex","nearestPoint","Infinity","i","length","index","getThumbPosition","_ref2","itemWidth","scope","current","undefined","transform","style","match","parseFloat"],"sources":["../../../src/utils/sliderButton.ts"],"sourcesContent":["import type { AnimationScope } from 'framer-motion';\n\ninterface GetNearestPointProps {\n position: number;\n snapPoints: number[];\n}\nexport const getNearestPoint = ({ snapPoints, position }: GetNearestPointProps) => {\n let nearestIndex = -1;\n let nearestPoint = -Infinity;\n\n for (let i = 0; i < snapPoints.length; i++) {\n const index = snapPoints[i];\n\n if (index && index < position && index > nearestPoint) {\n nearestPoint = index;\n nearestIndex = i;\n }\n }\n\n nearestIndex = nearestIndex === -1 ? 0 : nearestIndex;\n nearestPoint = nearestPoint === -Infinity ? 0 : nearestPoint;\n\n return { nearestIndex, nearestPoint };\n};\n\ninterface GetThumbPositionProps {\n scope: AnimationScope;\n itemWidth: number;\n}\n\nexport const getThumbPosition = ({ itemWidth, scope }: GetThumbPositionProps) => {\n if (!scope.current) {\n return undefined;\n }\n\n const { transform } = (scope.current as HTMLElement).style;\n let position;\n\n if (transform === 'none') {\n position = 0;\n } else {\n const match = transform.match(/translateX\\(([-\\d.]+)px\\)/);\n\n if (match && match[1]) {\n position = parseFloat(match[1]);\n }\n }\n\n if (!position) {\n return undefined;\n }\n\n return position + itemWidth / 2;\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"sliderButton.js","names":["getNearestPoint","_ref","snapPoints","position","scrollLeft","nearestIndex","nearestPoint","Infinity","i","length","index","getThumbPosition","_ref2","itemWidth","scope","current","undefined","transform","style","match","parseFloat","left","right","middle"],"sources":["../../../src/utils/sliderButton.ts"],"sourcesContent":["import type { AnimationScope } from 'framer-motion';\n\ninterface GetNearestPointProps {\n position: number;\n snapPoints: number[];\n scrollLeft: number;\n}\nexport const getNearestPoint = ({ snapPoints, position, scrollLeft }: GetNearestPointProps) => {\n let nearestIndex = -1;\n let nearestPoint = -Infinity;\n\n for (let i = 0; i < snapPoints.length; i++) {\n const index = snapPoints[i];\n\n if (index && index < position + scrollLeft && index > nearestPoint) {\n nearestPoint = index;\n nearestIndex = i;\n }\n }\n\n nearestIndex = nearestIndex === -1 ? 0 : nearestIndex;\n nearestPoint = nearestPoint === -Infinity ? 0 : nearestPoint;\n\n return { nearestIndex, nearestPoint };\n};\n\ninterface GetThumbPositionProps {\n scope: AnimationScope;\n itemWidth: number;\n}\n\nexport const getThumbPosition = ({ itemWidth, scope }: GetThumbPositionProps) => {\n if (!scope.current) {\n return undefined;\n }\n\n const { transform } = (scope.current as HTMLElement).style;\n let position;\n\n if (transform === 'none') {\n position = 0;\n } else {\n const match = transform.match(/translateX\\(([-\\d.]+)px\\)/);\n\n if (match && match[1]) {\n position = parseFloat(match[1]);\n }\n }\n\n if (typeof position !== 'number' && !position) {\n return undefined;\n }\n\n return { left: position, right: position + itemWidth, middle: position + itemWidth / 2 };\n};\n"],"mappings":"AAOA,OAAO,MAAMA,eAAe,GAAGC,IAAA,IAAgE;EAAA,IAA/D;IAAEC,UAAU;IAAEC,QAAQ;IAAEC;EAAiC,CAAC,GAAAH,IAAA;EACtF,IAAII,YAAY,GAAG,CAAC,CAAC;EACrB,IAAIC,YAAY,GAAG,CAACC,QAAQ;EAE5B,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGN,UAAU,CAACO,MAAM,EAAED,CAAC,EAAE,EAAE;IACxC,MAAME,KAAK,GAAGR,UAAU,CAACM,CAAC,CAAC;IAE3B,IAAIE,KAAK,IAAIA,KAAK,GAAGP,QAAQ,GAAGC,UAAU,IAAIM,KAAK,GAAGJ,YAAY,EAAE;MAChEA,YAAY,GAAGI,KAAK;MACpBL,YAAY,GAAGG,CAAC;IACpB;EACJ;EAEAH,YAAY,GAAGA,YAAY,KAAK,CAAC,CAAC,GAAG,CAAC,GAAGA,YAAY;EACrDC,YAAY,GAAGA,YAAY,KAAK,CAACC,QAAQ,GAAG,CAAC,GAAGD,YAAY;EAE5D,OAAO;IAAED,YAAY;IAAEC;EAAa,CAAC;AACzC,CAAC;AAOD,OAAO,MAAMK,gBAAgB,GAAGC,KAAA,IAAiD;EAAA,IAAhD;IAAEC,SAAS;IAAEC;EAA6B,CAAC,GAAAF,KAAA;EACxE,IAAI,CAACE,KAAK,CAACC,OAAO,EAAE;IAChB,OAAOC,SAAS;EACpB;EAEA,MAAM;IAAEC;EAAU,CAAC,GAAIH,KAAK,CAACC,OAAO,CAAiBG,KAAK;EAC1D,IAAIf,QAAQ;EAEZ,IAAIc,SAAS,KAAK,MAAM,EAAE;IACtBd,QAAQ,GAAG,CAAC;EAChB,CAAC,MAAM;IACH,MAAMgB,KAAK,GAAGF,SAAS,CAACE,KAAK,CAAC,2BAA2B,CAAC;IAE1D,IAAIA,KAAK,IAAIA,KAAK,CAAC,CAAC,CAAC,EAAE;MACnBhB,QAAQ,GAAGiB,UAAU,CAACD,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC;EACJ;EAEA,IAAI,OAAOhB,QAAQ,KAAK,QAAQ,IAAI,CAACA,QAAQ,EAAE;IAC3C,OAAOa,SAAS;EACpB;EAEA,OAAO;IAAEK,IAAI,EAAElB,QAAQ;IAAEmB,KAAK,EAAEnB,QAAQ,GAAGU,SAAS;IAAEU,MAAM,EAAEpB,QAAQ,GAAGU,SAAS,GAAG;EAAE,CAAC;AAC5F,CAAC","ignoreList":[]}
|
|
@@ -5,11 +5,16 @@ type StyledSliderButtonProps = WithTheme<{
|
|
|
5
5
|
$isDisabled?: boolean;
|
|
6
6
|
}>;
|
|
7
7
|
export declare const StyledSliderButton: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, StyledSliderButtonProps>> & string;
|
|
8
|
+
type StyledSliderButtonWrapperProps = WithTheme<{
|
|
9
|
+
$width: number;
|
|
10
|
+
}>;
|
|
11
|
+
export declare const StyledSliderButtonWrapper: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, StyledSliderButtonWrapperProps>> & string;
|
|
8
12
|
type StyledSliderButtonItemProps = WithTheme<{
|
|
9
13
|
$isSelected: boolean;
|
|
10
14
|
$width: number;
|
|
11
15
|
}>;
|
|
12
16
|
export declare const StyledSliderButtonItem: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, StyledSliderButtonItemProps>> & string;
|
|
17
|
+
export declare const StyledSliderButtonButtonsWrapper: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
|
|
13
18
|
type StyledMotionSliderButtonThumbProps = WithTheme<{
|
|
14
19
|
$width: number;
|
|
15
20
|
}>;
|
|
@@ -2,8 +2,9 @@ import type { AnimationScope } from 'framer-motion';
|
|
|
2
2
|
interface GetNearestPointProps {
|
|
3
3
|
position: number;
|
|
4
4
|
snapPoints: number[];
|
|
5
|
+
scrollLeft: number;
|
|
5
6
|
}
|
|
6
|
-
export declare const getNearestPoint: ({ snapPoints, position }: GetNearestPointProps) => {
|
|
7
|
+
export declare const getNearestPoint: ({ snapPoints, position, scrollLeft }: GetNearestPointProps) => {
|
|
7
8
|
nearestIndex: number;
|
|
8
9
|
nearestPoint: number;
|
|
9
10
|
};
|
|
@@ -11,5 +12,9 @@ interface GetThumbPositionProps {
|
|
|
11
12
|
scope: AnimationScope;
|
|
12
13
|
itemWidth: number;
|
|
13
14
|
}
|
|
14
|
-
export declare const getThumbPosition: ({ itemWidth, scope }: GetThumbPositionProps) =>
|
|
15
|
+
export declare const getThumbPosition: ({ itemWidth, scope }: GetThumbPositionProps) => {
|
|
16
|
+
left: number;
|
|
17
|
+
right: number;
|
|
18
|
+
middle: number;
|
|
19
|
+
} | undefined;
|
|
15
20
|
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chayns-components/core",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.602",
|
|
4
4
|
"description": "A set of beautiful React components for developing your own applications with chayns.",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"browserslist": [
|
|
@@ -83,5 +83,5 @@
|
|
|
83
83
|
"publishConfig": {
|
|
84
84
|
"access": "public"
|
|
85
85
|
},
|
|
86
|
-
"gitHead": "
|
|
86
|
+
"gitHead": "24e553c3b9526581091d125fe8c500dbd87e5b87"
|
|
87
87
|
}
|