@atlaskit/range 5.0.11
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/CHANGELOG.md +349 -0
- package/LICENSE +13 -0
- package/README.md +13 -0
- package/__perf__/default.tsx +7 -0
- package/__perf__/range.tsx +42 -0
- package/build/tsconfig.json +17 -0
- package/codemods/4.0.0-lite-mode.ts +92 -0
- package/codemods/__tests__/4.0.0-lite-mode.ts +109 -0
- package/constellation/index/examples.mdx +39 -0
- package/constellation/index/images/range-anatomy.png +0 -0
- package/constellation/index/props.mdx +5 -0
- package/constellation/index/usage.mdx +31 -0
- package/dist/cjs/index.js +15 -0
- package/dist/cjs/range.js +108 -0
- package/dist/cjs/styled.js +94 -0
- package/dist/cjs/theme.js +56 -0
- package/dist/cjs/version.json +5 -0
- package/dist/es2019/index.js +1 -0
- package/dist/es2019/range.js +67 -0
- package/dist/es2019/styled.js +255 -0
- package/dist/es2019/theme.js +36 -0
- package/dist/es2019/version.json +5 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/range.js +86 -0
- package/dist/esm/styled.js +79 -0
- package/dist/esm/theme.js +38 -0
- package/dist/esm/version.json +5 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/range.d.ts +28 -0
- package/dist/types/styled.d.ts +12 -0
- package/dist/types/theme.d.ts +60 -0
- package/docs/0-intro.tsx +13 -0
- package/extract-react-types/range-props.tsx +5 -0
- package/package.json +80 -0
- package/range/package.json +7 -0
- package/styled/package.json +7 -0
- package/theme/package.json +7 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
4
|
+
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.Theme = exports.track = exports.thumb = void 0;
|
|
9
|
+
|
|
10
|
+
var colors = _interopRequireWildcard(require("@atlaskit/theme/colors"));
|
|
11
|
+
|
|
12
|
+
var _components = require("@atlaskit/theme/components");
|
|
13
|
+
|
|
14
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
15
|
+
|
|
16
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
17
|
+
|
|
18
|
+
var thumb = {
|
|
19
|
+
default: {
|
|
20
|
+
background: colors.N0,
|
|
21
|
+
// This border color is not being used - awaiting focus state lift to props
|
|
22
|
+
border: colors.N800
|
|
23
|
+
},
|
|
24
|
+
disabled: {
|
|
25
|
+
boxShadow: colors.N60A
|
|
26
|
+
},
|
|
27
|
+
focus: {
|
|
28
|
+
// This border color is not being used - awaiting focus state lift to props
|
|
29
|
+
background: colors.N0,
|
|
30
|
+
border: colors.B200
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
exports.thumb = thumb;
|
|
34
|
+
var track = {
|
|
35
|
+
background: colors.N30A,
|
|
36
|
+
default: {
|
|
37
|
+
lower: colors.B400,
|
|
38
|
+
upper: colors.N30
|
|
39
|
+
},
|
|
40
|
+
disabled: {
|
|
41
|
+
lower: colors.N50,
|
|
42
|
+
upper: colors.N30
|
|
43
|
+
},
|
|
44
|
+
hover: {
|
|
45
|
+
lower: colors.B300,
|
|
46
|
+
upper: colors.N40
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
exports.track = track;
|
|
50
|
+
var Theme = (0, _components.createTheme)(function () {
|
|
51
|
+
return {
|
|
52
|
+
thumb: thumb,
|
|
53
|
+
track: track
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
exports.Theme = Theme;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './range';
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import React, { forwardRef, useCallback, useState } from 'react';
|
|
3
|
+
import { Input } from './styled';
|
|
4
|
+
import { Theme } from './theme';
|
|
5
|
+
|
|
6
|
+
const snapToStep = (value, min, step) => {
|
|
7
|
+
// Normalise the value to allow for division properly with different min values
|
|
8
|
+
const adjustedValue = value - min; // Find the number of steps the value covers
|
|
9
|
+
|
|
10
|
+
const numSteps = Math.round(adjustedValue / step); // Convert numSteps back into original range
|
|
11
|
+
|
|
12
|
+
return numSteps * step + min;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const getRoundedPercentValue = (value, min, max, step) => {
|
|
16
|
+
let percent = '0';
|
|
17
|
+
|
|
18
|
+
if (min < max && value > min) {
|
|
19
|
+
const snappedValue = snapToStep(value, min, step);
|
|
20
|
+
percent = ((snappedValue - min) / (max - min) * 100).toFixed(2);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return percent;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const noop = () => {};
|
|
27
|
+
|
|
28
|
+
export default /*#__PURE__*/forwardRef(function Range(props, ref) {
|
|
29
|
+
const {
|
|
30
|
+
isDisabled = false,
|
|
31
|
+
defaultValue = 50,
|
|
32
|
+
max = 100,
|
|
33
|
+
min = 0,
|
|
34
|
+
onChange = noop,
|
|
35
|
+
step = 1,
|
|
36
|
+
value: propsValue,
|
|
37
|
+
theme,
|
|
38
|
+
testId,
|
|
39
|
+
...rest
|
|
40
|
+
} = props;
|
|
41
|
+
const spreadProps = {
|
|
42
|
+
max,
|
|
43
|
+
min,
|
|
44
|
+
step,
|
|
45
|
+
ref,
|
|
46
|
+
...rest
|
|
47
|
+
};
|
|
48
|
+
const [value, setValue] = useState(propsValue !== undefined ? propsValue : defaultValue);
|
|
49
|
+
const handleChange = useCallback(e => {
|
|
50
|
+
const newValue = Number(e.target.value);
|
|
51
|
+
setValue(newValue); // Note use of newValue to ensure up=to-date value is used
|
|
52
|
+
|
|
53
|
+
onChange(newValue);
|
|
54
|
+
}, [onChange]);
|
|
55
|
+
const renderValue = propsValue !== undefined ? propsValue : value;
|
|
56
|
+
const valuePercent = getRoundedPercentValue(renderValue, min, max, step);
|
|
57
|
+
return /*#__PURE__*/React.createElement(Theme.Provider, {
|
|
58
|
+
value: theme
|
|
59
|
+
}, /*#__PURE__*/React.createElement(Theme.Consumer, null, computedTheme => /*#__PURE__*/React.createElement(Input, _extends({
|
|
60
|
+
type: "range",
|
|
61
|
+
disabled: isDisabled,
|
|
62
|
+
onChange: handleChange,
|
|
63
|
+
value: renderValue,
|
|
64
|
+
valuePercent: valuePercent,
|
|
65
|
+
"data-testid": testId
|
|
66
|
+
}, computedTheme, spreadProps))));
|
|
67
|
+
});
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
|
|
3
|
+
/** @jsx jsx */
|
|
4
|
+
|
|
5
|
+
/* eslint-disable no-mixed-operators */
|
|
6
|
+
import { forwardRef, useMemo } from 'react';
|
|
7
|
+
import { css, jsx } from '@emotion/core';
|
|
8
|
+
import { fontFamily } from '@atlaskit/theme/constants';
|
|
9
|
+
import { e200 } from '@atlaskit/theme/elevation';
|
|
10
|
+
const sliderThumbSize = 16;
|
|
11
|
+
const sliderThumbBorderThickness = 2;
|
|
12
|
+
const sliderLineThickness = 4;
|
|
13
|
+
const transitionDuration = '0.2s';
|
|
14
|
+
const sliderBorderRadius = sliderLineThickness / 2;
|
|
15
|
+
export const overallHeight = 40;
|
|
16
|
+
|
|
17
|
+
const getBackgroundGradient = ({
|
|
18
|
+
lower,
|
|
19
|
+
upper
|
|
20
|
+
}) => `
|
|
21
|
+
background: linear-gradient(${lower}, ${lower}) 0 / var(--range-inline-width) 100%
|
|
22
|
+
no-repeat ${upper};
|
|
23
|
+
[dir='rtl'] & {
|
|
24
|
+
background-position: right;
|
|
25
|
+
}
|
|
26
|
+
`; // Thumb style
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
const sliderThumbStyle = ({
|
|
30
|
+
thumb
|
|
31
|
+
}) => {
|
|
32
|
+
return `
|
|
33
|
+
background: ${thumb.default.background};
|
|
34
|
+
border: ${sliderThumbBorderThickness}px solid transparent;
|
|
35
|
+
border-radius: 50%;
|
|
36
|
+
height: ${sliderThumbSize}px;
|
|
37
|
+
width: ${sliderThumbSize}px;
|
|
38
|
+
box-sizing: border-box;
|
|
39
|
+
transition: border-color ${transitionDuration} ease-in-out;
|
|
40
|
+
${e200()};
|
|
41
|
+
`;
|
|
42
|
+
}; // Track styles
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
const sliderTrackStyle = `
|
|
46
|
+
border-radius: ${sliderBorderRadius}px;
|
|
47
|
+
border: 0;
|
|
48
|
+
cursor: pointer;
|
|
49
|
+
height: ${sliderLineThickness}px;
|
|
50
|
+
width: 100%;
|
|
51
|
+
transition: background-color ${transitionDuration} ease-in-out;
|
|
52
|
+
`; // Range input styles
|
|
53
|
+
|
|
54
|
+
const chromeRangeInputStyle = tokens => {
|
|
55
|
+
return `
|
|
56
|
+
&::-webkit-slider-thumb {
|
|
57
|
+
-webkit-appearance: none;
|
|
58
|
+
margin-top: -${(sliderThumbSize - sliderLineThickness) / 2}px;
|
|
59
|
+
${sliderThumbStyle(tokens)};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
&:focus::-webkit-slider-thumb {
|
|
63
|
+
border-color: ${tokens.thumb.focus.border};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
&:disabled::-webkit-slider-thumb {
|
|
67
|
+
cursor: not-allowed;
|
|
68
|
+
box-shadow: 0 0 1px ${tokens.thumb.disabled.boxShadow};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
&::-webkit-slider-runnable-track {
|
|
72
|
+
${sliderTrackStyle};
|
|
73
|
+
${getBackgroundGradient(tokens.track.default)};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
&:focus::-webkit-slider-runnable-track {
|
|
77
|
+
${getBackgroundGradient(tokens.track.default)};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
&:active::-webkit-slider-runnable-track,
|
|
81
|
+
&:hover::-webkit-slider-runnable-track {
|
|
82
|
+
${getBackgroundGradient(tokens.track.hover)};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
&:disabled::-webkit-slider-runnable-track {
|
|
86
|
+
${getBackgroundGradient(tokens.track.disabled)}
|
|
87
|
+
cursor: not-allowed;
|
|
88
|
+
}
|
|
89
|
+
`;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
const firefoxRangeInputStyle = tokens => {
|
|
93
|
+
return `
|
|
94
|
+
&::-moz-focus-outer {
|
|
95
|
+
border: 0;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
&::-moz-range-thumb {
|
|
99
|
+
${sliderThumbStyle(tokens)};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
&:focus::-moz-range-thumb {
|
|
103
|
+
border-color: ${tokens.thumb.focus.border};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
&:disabled::-moz-range-thumb {
|
|
107
|
+
cursor: not-allowed;
|
|
108
|
+
box-shadow: 0 0 1px ${tokens.thumb.disabled.boxShadow};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
&::-moz-range-progress {
|
|
112
|
+
${sliderTrackStyle};
|
|
113
|
+
background: ${tokens.track.default.lower};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
&::-moz-range-track {
|
|
117
|
+
${sliderTrackStyle};
|
|
118
|
+
background: ${tokens.track.default.upper};
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
&:active::-moz-range-progress,
|
|
122
|
+
&:hover::-moz-range-progress {
|
|
123
|
+
background: ${tokens.track.hover.lower};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
&:active::-moz-range-track,
|
|
127
|
+
&:hover::-moz-range-track {
|
|
128
|
+
background: ${tokens.track.hover.upper};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
&:disabled::-moz-range-progress {
|
|
132
|
+
background: ${tokens.track.disabled.lower};
|
|
133
|
+
cursor: not-allowed;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
&:disabled::-moz-range-track {
|
|
137
|
+
background: ${tokens.track.disabled.upper};
|
|
138
|
+
cursor: not-allowed;
|
|
139
|
+
}
|
|
140
|
+
`;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
const IERangeInputStyle = tokens => {
|
|
144
|
+
return `
|
|
145
|
+
&::-ms-thumb {
|
|
146
|
+
margin-top: 0;
|
|
147
|
+
${sliderThumbStyle(tokens)};
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
&:focus::-ms-thumb {
|
|
151
|
+
border-color: ${tokens.thumb.focus.border};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
&:disabled::-ms-thumb {
|
|
155
|
+
cursor: not-allowed;
|
|
156
|
+
box-shadow: 0 0 1px ${tokens.thumb.disabled.boxShadow};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
&::-ms-track {
|
|
160
|
+
background: transparent;
|
|
161
|
+
border-color: transparent;
|
|
162
|
+
color: transparent;
|
|
163
|
+
cursor: pointer;
|
|
164
|
+
height: ${sliderLineThickness}px;
|
|
165
|
+
transition: background-color ${transitionDuration} ease-in-out;
|
|
166
|
+
width: 100%;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
&::-ms-fill-lower {
|
|
170
|
+
background: ${tokens.track.default.lower};
|
|
171
|
+
border-radius: ${sliderBorderRadius}px;
|
|
172
|
+
border: 0;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
&::-ms-fill-upper {
|
|
176
|
+
background: ${tokens.track.default.upper};
|
|
177
|
+
border-radius: ${sliderBorderRadius}px;
|
|
178
|
+
border: 0;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
&:active::-ms-fill-lower,
|
|
182
|
+
&:hover::-ms-fill-lower {
|
|
183
|
+
background: ${tokens.track.hover.lower};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
&:active::-ms-fill-upper,
|
|
187
|
+
&:hover::-ms-fill-upper {
|
|
188
|
+
background: ${tokens.track.hover.upper};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
&:disabled::-ms-fill-lower {
|
|
192
|
+
background: ${tokens.track.disabled.lower};
|
|
193
|
+
cursor: not-allowed;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
&:disabled::-ms-fill-upper {
|
|
197
|
+
background: ${tokens.track.disabled.upper};
|
|
198
|
+
cursor: not-allowed;
|
|
199
|
+
}
|
|
200
|
+
`;
|
|
201
|
+
}; // Styles are split per browser as they are implemented differently
|
|
202
|
+
// Cannot consolidate as Chrome & Firefox don't recognise styles if they are grouped
|
|
203
|
+
// with CSS selectors they don't recognise, e.g. &::-ms-thumb
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
export const rangeInputStyle = tokens => {
|
|
207
|
+
return css`
|
|
208
|
+
-webkit-appearance: none; /* Hides the slider so that custom slider can be made */
|
|
209
|
+
background: transparent; /* Otherwise white in Chrome */
|
|
210
|
+
height: ${overallHeight}px; /* Otherwise thumb will collide with previous box element */
|
|
211
|
+
padding: 0; /* IE11 includes padding, this normalises it */
|
|
212
|
+
width: 100%; /* Specific width is required for Firefox. */
|
|
213
|
+
|
|
214
|
+
&:focus {
|
|
215
|
+
outline: none;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
&:disabled {
|
|
219
|
+
cursor: not-allowed;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
${chromeRangeInputStyle(tokens)}
|
|
223
|
+
${firefoxRangeInputStyle(tokens)}
|
|
224
|
+
${IERangeInputStyle(tokens)};
|
|
225
|
+
|
|
226
|
+
font-family: ${fontFamily()};
|
|
227
|
+
|
|
228
|
+
background-position: right;
|
|
229
|
+
`;
|
|
230
|
+
};
|
|
231
|
+
export const Input = /*#__PURE__*/forwardRef((props, ref) => {
|
|
232
|
+
const {
|
|
233
|
+
valuePercent,
|
|
234
|
+
thumb,
|
|
235
|
+
track,
|
|
236
|
+
style,
|
|
237
|
+
...strippedProps
|
|
238
|
+
} = props; // Note: emotion will cache unique outputs as their own this
|
|
239
|
+
// We are memoizing the creation of this string
|
|
240
|
+
|
|
241
|
+
const styles = useMemo(() => rangeInputStyle({
|
|
242
|
+
track,
|
|
243
|
+
thumb
|
|
244
|
+
}), [thumb, track]); // We are creating a css variable to control the "progress" portion of the range input
|
|
245
|
+
// This avoids us needing to create a new css class for each new percentage value
|
|
246
|
+
|
|
247
|
+
return jsx("input", _extends({}, strippedProps, {
|
|
248
|
+
style: {
|
|
249
|
+
'--range-inline-width': `${valuePercent}%`
|
|
250
|
+
},
|
|
251
|
+
ref: ref,
|
|
252
|
+
css: styles
|
|
253
|
+
}));
|
|
254
|
+
});
|
|
255
|
+
Input.displayName = 'InputRange';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as colors from '@atlaskit/theme/colors';
|
|
2
|
+
import { createTheme } from '@atlaskit/theme/components';
|
|
3
|
+
export const thumb = {
|
|
4
|
+
default: {
|
|
5
|
+
background: colors.N0,
|
|
6
|
+
// This border color is not being used - awaiting focus state lift to props
|
|
7
|
+
border: colors.N800
|
|
8
|
+
},
|
|
9
|
+
disabled: {
|
|
10
|
+
boxShadow: colors.N60A
|
|
11
|
+
},
|
|
12
|
+
focus: {
|
|
13
|
+
// This border color is not being used - awaiting focus state lift to props
|
|
14
|
+
background: colors.N0,
|
|
15
|
+
border: colors.B200
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
export const track = {
|
|
19
|
+
background: colors.N30A,
|
|
20
|
+
default: {
|
|
21
|
+
lower: colors.B400,
|
|
22
|
+
upper: colors.N30
|
|
23
|
+
},
|
|
24
|
+
disabled: {
|
|
25
|
+
lower: colors.N50,
|
|
26
|
+
upper: colors.N30
|
|
27
|
+
},
|
|
28
|
+
hover: {
|
|
29
|
+
lower: colors.B300,
|
|
30
|
+
upper: colors.N40
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
export const Theme = createTheme(() => ({
|
|
34
|
+
thumb,
|
|
35
|
+
track
|
|
36
|
+
}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './range';
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/extends";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
4
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
5
|
+
|
|
6
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
7
|
+
|
|
8
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
9
|
+
|
|
10
|
+
import React, { forwardRef, useCallback, useState } from 'react';
|
|
11
|
+
import { Input } from './styled';
|
|
12
|
+
import { Theme } from './theme';
|
|
13
|
+
|
|
14
|
+
var snapToStep = function snapToStep(value, min, step) {
|
|
15
|
+
// Normalise the value to allow for division properly with different min values
|
|
16
|
+
var adjustedValue = value - min; // Find the number of steps the value covers
|
|
17
|
+
|
|
18
|
+
var numSteps = Math.round(adjustedValue / step); // Convert numSteps back into original range
|
|
19
|
+
|
|
20
|
+
return numSteps * step + min;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
var getRoundedPercentValue = function getRoundedPercentValue(value, min, max, step) {
|
|
24
|
+
var percent = '0';
|
|
25
|
+
|
|
26
|
+
if (min < max && value > min) {
|
|
27
|
+
var snappedValue = snapToStep(value, min, step);
|
|
28
|
+
percent = ((snappedValue - min) / (max - min) * 100).toFixed(2);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return percent;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
var noop = function noop() {};
|
|
35
|
+
|
|
36
|
+
export default /*#__PURE__*/forwardRef(function Range(props, ref) {
|
|
37
|
+
var _props$isDisabled = props.isDisabled,
|
|
38
|
+
isDisabled = _props$isDisabled === void 0 ? false : _props$isDisabled,
|
|
39
|
+
_props$defaultValue = props.defaultValue,
|
|
40
|
+
defaultValue = _props$defaultValue === void 0 ? 50 : _props$defaultValue,
|
|
41
|
+
_props$max = props.max,
|
|
42
|
+
max = _props$max === void 0 ? 100 : _props$max,
|
|
43
|
+
_props$min = props.min,
|
|
44
|
+
min = _props$min === void 0 ? 0 : _props$min,
|
|
45
|
+
_props$onChange = props.onChange,
|
|
46
|
+
onChange = _props$onChange === void 0 ? noop : _props$onChange,
|
|
47
|
+
_props$step = props.step,
|
|
48
|
+
step = _props$step === void 0 ? 1 : _props$step,
|
|
49
|
+
propsValue = props.value,
|
|
50
|
+
theme = props.theme,
|
|
51
|
+
testId = props.testId,
|
|
52
|
+
rest = _objectWithoutProperties(props, ["isDisabled", "defaultValue", "max", "min", "onChange", "step", "value", "theme", "testId"]);
|
|
53
|
+
|
|
54
|
+
var spreadProps = _objectSpread({
|
|
55
|
+
max: max,
|
|
56
|
+
min: min,
|
|
57
|
+
step: step,
|
|
58
|
+
ref: ref
|
|
59
|
+
}, rest);
|
|
60
|
+
|
|
61
|
+
var _useState = useState(propsValue !== undefined ? propsValue : defaultValue),
|
|
62
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
63
|
+
value = _useState2[0],
|
|
64
|
+
setValue = _useState2[1];
|
|
65
|
+
|
|
66
|
+
var handleChange = useCallback(function (e) {
|
|
67
|
+
var newValue = Number(e.target.value);
|
|
68
|
+
setValue(newValue); // Note use of newValue to ensure up=to-date value is used
|
|
69
|
+
|
|
70
|
+
onChange(newValue);
|
|
71
|
+
}, [onChange]);
|
|
72
|
+
var renderValue = propsValue !== undefined ? propsValue : value;
|
|
73
|
+
var valuePercent = getRoundedPercentValue(renderValue, min, max, step);
|
|
74
|
+
return /*#__PURE__*/React.createElement(Theme.Provider, {
|
|
75
|
+
value: theme
|
|
76
|
+
}, /*#__PURE__*/React.createElement(Theme.Consumer, null, function (computedTheme) {
|
|
77
|
+
return /*#__PURE__*/React.createElement(Input, _extends({
|
|
78
|
+
type: "range",
|
|
79
|
+
disabled: isDisabled,
|
|
80
|
+
onChange: handleChange,
|
|
81
|
+
value: renderValue,
|
|
82
|
+
valuePercent: valuePercent,
|
|
83
|
+
"data-testid": testId
|
|
84
|
+
}, computedTheme, spreadProps));
|
|
85
|
+
}));
|
|
86
|
+
});
|