Skip to content

Commit b7d39a6

Browse files
authored
feat: range slider CU-2e09ymt (#219)
1 parent 51fbe2a commit b7d39a6

File tree

5 files changed

+134
-0
lines changed

5 files changed

+134
-0
lines changed

src/components/range-slider/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { default } from './range-slider';
2+
export type { Props as RangeSliderProps } from './range-slider';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { Meta, Story } from '@storybook/react/types-6-0';
2+
import React, { useState } from 'react';
3+
import { Box } from 'rebass';
4+
import RangeSlider, { Props } from './range-slider';
5+
import Value from '../typography/value';
6+
import Divider from '../divider';
7+
import Labeling from '../typography/labeling';
8+
9+
export default {
10+
title: 'Quartz/RangeSlider',
11+
component: RangeSlider,
12+
} as Meta;
13+
14+
export const DefaultSlider: Story<Pick<Props, 'label' | 'step' | 'range'>> = (
15+
props,
16+
) => {
17+
const [value, setValue] = useState([2, 4]);
18+
19+
return (
20+
<Box width="700px">
21+
<RangeSlider value={value} onChange={setValue} {...props} />
22+
<Divider />
23+
<Labeling>Current value:</Labeling>
24+
<Value>[{value.join(', ')}]</Value>
25+
</Box>
26+
);
27+
};
28+
29+
DefaultSlider.args = {
30+
label: 'CPU cores',
31+
step: 1,
32+
range: [0, 10],
33+
};
34+
35+
export const WithCustomDisplayValue: Story<
36+
Pick<Props, 'label' | 'step' | 'range' | 'formatDisplayValue'>
37+
> = (props) => {
38+
const [value, setValue] = useState([128, 256]);
39+
40+
return (
41+
<Box width="700px">
42+
<RangeSlider value={value} onChange={setValue} {...props} />
43+
<Divider />
44+
<Labeling>Current value:</Labeling>
45+
<Value>[{value.join(', ')}]</Value>
46+
</Box>
47+
);
48+
};
49+
50+
WithCustomDisplayValue.args = {
51+
label: 'RAM',
52+
step: 128,
53+
range: [0, 1024],
54+
formatDisplayValue: (value) => `${value} MB`,
55+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import React from 'react';
2+
import { Range as RCRangeSlider } from 'rc-slider';
3+
import { FlexProps, Flex } from 'rebass';
4+
import { useTheme } from 'emotion-theming';
5+
import { ITheme } from '../../theme/types';
6+
import Labeling from '../typography/labeling';
7+
import Value from '../typography/value';
8+
9+
export interface Props extends Omit<FlexProps, 'value' | 'css' | 'onChange'> {
10+
label: string;
11+
value: number[];
12+
range: number[];
13+
step: number;
14+
disabled?: boolean;
15+
onChange: (value: number[]) => void;
16+
formatDisplayValue?: (value: number) => string;
17+
}
18+
19+
const RangeSlider = ({
20+
label,
21+
defaultValue,
22+
value,
23+
onChange,
24+
range,
25+
step,
26+
disabled,
27+
formatDisplayValue = (displayValue) => displayValue.toString(),
28+
...flexProps
29+
}: Props) => {
30+
const theme = useTheme<ITheme>();
31+
32+
return (
33+
<Flex flexDirection="column" {...flexProps}>
34+
<Flex alignItems="center" mb="10px">
35+
<Labeling bold mr="8px">
36+
{label}
37+
</Labeling>
38+
<Flex
39+
backgroundColor="primaryShade2"
40+
px="4px"
41+
py="2px"
42+
sx={{ borderRadius: '2px' }}
43+
>
44+
<Value color="primary">{value.map(formatDisplayValue).join('-')}</Value>
45+
</Flex>
46+
</Flex>
47+
<RCRangeSlider
48+
disabled={disabled}
49+
value={value}
50+
onChange={onChange}
51+
min={range[0]}
52+
max={range[1]}
53+
step={step}
54+
railStyle={{
55+
backgroundColor: theme.colors.grayShade2,
56+
}}
57+
trackStyle={[
58+
{
59+
backgroundColor: theme.colors.primary,
60+
},
61+
]}
62+
handleStyle={[
63+
{
64+
borderColor: theme.colors.primary,
65+
boxShadow: `0 0 5px ${theme.colors.primary}`,
66+
},
67+
]}
68+
/>
69+
</Flex>
70+
);
71+
};
72+
73+
export default RangeSlider;

src/components/slider/slider.stories.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,4 @@ WithCustomDisplayValue.args = {
4444
range: [0, 1024],
4545
formatDisplayValue: (value) => `${value} MB`,
4646
};
47+

src/index.ts

+3
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import { SymbolMode } from './components/symbol/types';
5454
import Collapse from './components/collapse';
5555
import PerformanceCard from './components/performance-card';
5656
import Slider from './components/slider';
57+
import RangeSlider from './components/range-slider';
5758
import ExpandViewer from './components/expand-viewer';
5859

5960
// Popups
@@ -186,6 +187,7 @@ export {
186187
Divider,
187188
PerformanceCard,
188189
Slider,
190+
RangeSlider,
189191
ExpandViewer,
190192
// Popups
191193
usePopup,
@@ -261,6 +263,7 @@ export type ITheme = import('./theme/types').ITheme;
261263
export type TooltipProps = import('./components/tooltip').TooltipProps;
262264
export type BadgeProps = import('./components/badges').BadgeProps;
263265
export type SliderProps = import('./components/slider').SliderProps;
266+
export type RangeSliderProps = import('./components/range-slider').RangeSliderProps;
264267
export type EditableSelectProps =
265268
import('./components/editableSelect').EditableSelectProps;
266269
export type Select2Props = import('./components/select2').SelectProps;

0 commit comments

Comments
 (0)