Skip to content

Commit

Permalink
feat(react): slider (#507)
Browse files Browse the repository at this point in the history
* feat(react): slider

Closes #439.

* fix(react): fix incorrect styling
  • Loading branch information
resir014 authored Oct 12, 2021
1 parent 2d7032f commit 3be2ff0
Show file tree
Hide file tree
Showing 9 changed files with 155 additions and 0 deletions.
2 changes: 2 additions & 0 deletions packages/react/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
"react-fast-compare": "^3.2.0",
"react-popper": "^2.2.5",
"react-popper-tooltip": "^4.3.0",
"react-ranger": "^2.1.0",
"react-transition-group": "^4.4.2",
"styled-system": "^5.1.4",
"tslib": "^2.3.1"
Expand All @@ -72,6 +73,7 @@
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^12.0.0",
"@types/jest": "^26.0.24",
"@types/react-ranger": "^2.0.1",
"@types/react-transition-group": "^4.4.2",
"@types/styled-components": "^5.1.14",
"babel-loader": "^8.2.2",
Expand Down
1 change: 1 addition & 0 deletions packages/react/src/components/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export * from './panel';
export * from './pill';
export * from './popover';
export * from './side-sheet';
export * from './slider';
export * from './skeleton';
export * from './table';
export * from './tabs';
Expand Down
17 changes: 17 additions & 0 deletions packages/react/src/components/slider/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Slider

> Slider element.
## Usage

To use this component in your app, import as follows:

```jsx
import { Slider } from '@aksara-ui/react';

export function Example({ min, max, stepSize }) {
const [values, setValues] = React.useState([10]);

return <Slider values={values} onChange={setValues} min={min} max={max} stepSize={stepSize} />;
};
```
31 changes: 31 additions & 0 deletions packages/react/src/components/slider/Slider.stories.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { Story } from '@storybook/react';
import * as React from 'react';
import { Slider, SliderProps } from '.';

export default {
title: 'Core/Components/Slider',
component: Slider,
argTypes: {
min: {
control: 'number',
},
max: {
control: 'number',
},
stepSize: {
control: 'number',
},
},
};

export const Example: Story<SliderProps> = ({ values, min, max, stepSize }) => {
const [sliderValues, setSliderValues] = React.useState(values);

return <Slider values={sliderValues} onChange={setSliderValues} min={min} max={max} stepSize={stepSize} />;
};
Example.args = {
values: [10],
min: 0,
max: 100,
stepSize: 5,
};
48 changes: 48 additions & 0 deletions packages/react/src/components/slider/Slider.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import VisuallyHidden from '@reach/visually-hidden';
import * as React from 'react';
import { RangerOptions, useRanger } from 'react-ranger';
import { Box, BoxProps } from '../../layout';
import { useComponentStyles } from '../../system';
import { UnstyledButton } from '../button';

export interface SliderProps extends RangerOptions, BoxProps {}

const Slider = React.forwardRef<HTMLDivElement, SliderProps>(
({ values, onChange, min = 0, max = 100, stepSize = 5, sx, ...rest }, ref) => {
const sliderTrackStyles = useComponentStyles('sliderTrack');
const sliderHandleStyles = useComponentStyles('sliderHandle');
const { getTrackProps, segments, handles } = useRanger({
values,
onChange,
min,
max,
stepSize,
...rest,
});

return (
<Box ref={ref} sx={{ ...sliderTrackStyles, ...sx }} {...getTrackProps()}>
{segments.map(({ getSegmentProps }, i) => {
return (
<Box
height="100%"
backgroundColor={i === segments.length - 1 ? 'transparent' : 'blue06'}
borderRadius={8}
{...getSegmentProps()}
index={i}
/>
);
})}
{handles.map(({ value, getHandleProps }) => (
<UnstyledButton sx={sliderHandleStyles} {...getHandleProps()}>
<VisuallyHidden>{value}</VisuallyHidden>
</UnstyledButton>
))}
</Box>
);
}
);

Slider.displayName = 'InputSlider';

export default Slider;
2 changes: 2 additions & 0 deletions packages/react/src/components/slider/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export { default as Slider } from './Slider';
export * from './Slider';
2 changes: 2 additions & 0 deletions packages/react/src/theme/componentStyles/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import form from './form';
import message from './message';
import navigation from './navigation';
import pill from './pill';
import slider from './slider';
import typography from './typography';
import tabs from './tabs';
import toast from './toast';
Expand All @@ -25,6 +26,7 @@ const componentStyles = {
...message,
...navigation,
...pill,
...slider,
...typography,
...tabs,
...toast,
Expand Down
40 changes: 40 additions & 0 deletions packages/react/src/theme/componentStyles/slider.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { transparentize } from 'polished';
import { DefaultTheme } from 'styled-components';
import { ComponentThemeConfig } from '../types';

const sliderTrack: ComponentThemeConfig = {
baseStyle: ({ theme }: { theme: DefaultTheme }) => ({
height: 8,
background: theme.colors.blue01,
borderRadius: 8,
}),
};

const sliderHandle: ComponentThemeConfig = {
baseStyle: ({ theme }: { theme: DefaultTheme }) => ({
width: 16,
height: 16,
borderRadius: 9999,
backgroundColor: theme.colors.blue07,
outline: '2px solid',
outlineColor: theme.colors.greylight01,
cursor: 'unset',
'&:hover, &:focus, &:active': {
outline: '4px solid',
outlineColor: transparentize(0.3, theme.colors.blue03),
},
'&:hover, &:focus': {
backgroundColor: theme.colors.blue08,
},
'&:active': {
backgroundColor: theme.colors.blue09,
},
}),
};

const slider = {
sliderTrack,
sliderHandle,
};

export default slider;
12 changes: 12 additions & 0 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4395,6 +4395,13 @@
dependencies:
"@types/react" "*"

"@types/react-ranger@^2.0.1":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@types/react-ranger/-/react-ranger-2.0.1.tgz#63f1b7d71b7b3e666a1a62a0482470d965b66aa6"
integrity sha512-q+vEB4N38b/x3jpqUns05/7QoggT/A3WKVD7X153InQdlhuwYEZ1KxrlNoJLrMpQvB6sDru8+Gq9bGcndU6yMA==
dependencies:
"@types/react" "*"

"@types/[email protected]":
version "11.0.5"
resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-11.0.5.tgz#0d546261b4021e1f9d85b50401c0a42acb106087"
Expand Down Expand Up @@ -14017,6 +14024,11 @@ react-popper@^2.2.4, react-popper@^2.2.5:
react-fast-compare "^3.0.1"
warning "^4.0.2"

react-ranger@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/react-ranger/-/react-ranger-2.1.0.tgz#a9007d67a7871736fffc5fe0d7c54a736771e9a1"
integrity sha512-d8ezhyX3v/KlN8SkyoE5e8Dybsdmn94eUAqBDsAPrVhZde8sVt6pLJw4fC784KiMmS4LyAjvtjGxhAEqjjGYgw==

react-refresh@^0.8.3:
version "0.8.3"
resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f"
Expand Down

1 comment on commit 3be2ff0

@vercel
Copy link

@vercel vercel bot commented on 3be2ff0 Oct 12, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.