Skip to content

Commit

Permalink
[Slider] Add support for removed and inverted track (#17714)
Browse files Browse the repository at this point in the history
  • Loading branch information
mark-tate authored and oliviertassinari committed Oct 9, 2019
1 parent d6f414b commit 635ed7f
Show file tree
Hide file tree
Showing 9 changed files with 344 additions and 4 deletions.
3 changes: 3 additions & 0 deletions docs/pages/api/slider.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ You can learn more about the difference by [reading this guide](/guides/minimizi
| <span class="prop-name">orientation</span> | <span class="prop-type">'horizontal'<br>&#124;&nbsp;'vertical'</span> | <span class="prop-default">'horizontal'</span> | The slider orientation. |
| <span class="prop-name">step</span> | <span class="prop-type">number</span> | <span class="prop-default">1</span> | The granularity with which the slider can step through values. (A "discrete" slider.) When step is `null`, the thumb can only be slid onto marks provided with the `marks` prop. |
| <span class="prop-name">ThumbComponent</span> | <span class="prop-type">elementType</span> | <span class="prop-default">'span'</span> | The component used to display the value label. |
| <span class="prop-name">track</span> | <span class="prop-type">'normal'<br>&#124;&nbsp;false<br>&#124;&nbsp;'inverted'</span> | <span class="prop-default">'normal'</span> | The track presentation:<br>- `normal` the track will render a bar representing the slider value. - `inverted` the track will render a bar representing the remaining slider value. - `false` the track will render without a bar. |
| <span class="prop-name">value</span> | <span class="prop-type">number<br>&#124;&nbsp;Array<number></span> | | The value of the slider. For ranged sliders, provide an array with two values. |
| <span class="prop-name">ValueLabelComponent</span> | <span class="prop-type">elementType</span> | <span class="prop-default">ValueLabel</span> | The value label component. |
| <span class="prop-name">valueLabelDisplay</span> | <span class="prop-type">'on'<br>&#124;&nbsp;'auto'<br>&#124;&nbsp;'off'</span> | <span class="prop-default">'off'</span> | Controls when the value label is displayed:<br>- `auto` the value label will display when the thumb is hovered or focused. - `on` will display persistently. - `off` will never display. |
Expand All @@ -67,6 +68,8 @@ Any other props supplied will be provided to the root element (native element).
| <span class="prop-name">disabled</span> | <span class="prop-name">Mui-disabled</span> | Pseudo-class applied to the root element if `disabled={true}`.
| <span class="prop-name">rail</span> | <span class="prop-name">MuiSlider-rail</span> | Styles applied to the rail element.
| <span class="prop-name">track</span> | <span class="prop-name">MuiSlider-track</span> | Styles applied to the track element.
| <span class="prop-name">trackFalse</span> | <span class="prop-name">MuiSlider-trackFalse</span> | Styles applied to the track element if `track={false}`.
| <span class="prop-name">trackInverted</span> | <span class="prop-name">MuiSlider-trackInverted</span> | Styles applied to the track element if `track="inverted"`.
| <span class="prop-name">thumb</span> | <span class="prop-name">MuiSlider-thumb</span> | Styles applied to the thumb element.
| <span class="prop-name">thumbColorPrimary</span> | <span class="prop-name">MuiSlider-thumbColorPrimary</span> | Styles applied to the thumb element if `color="primary"`.
| <span class="prop-name">thumbColorSecondary</span> | <span class="prop-name">MuiSlider-thumbColorSecondary</span> | Styles applied to the thumb element if `color="secondary"`.
Expand Down
66 changes: 66 additions & 0 deletions docs/src/pages/components/slider/TrackFalseSlider.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import Typography from '@material-ui/core/Typography';
import Slider from '@material-ui/core/Slider';

const useStyles = makeStyles(theme => ({
root: {
width: 250,
},
margin: {
height: theme.spacing(3),
},
}));

const marks = [
{
value: 0,
label: '0°C',
},
{
value: 20,
label: '20°C',
},
{
value: 37,
label: '37°C',
},
{
value: 100,
label: '100°C',
},
];

function valuetext(value) {
return `${value}°C`;
}

export default function TrackFalseSlider() {
const classes = useStyles();

return (
<div className={classes.root}>
<Typography id="track-false-slider" gutterBottom>
Removed track
</Typography>
<Slider
track={false}
aria-labelledby="track-false-slider"
getAriaValueText={valuetext}
defaultValue={30}
marks={marks}
/>
<div className={classes.margin} />
<Typography id="track-false-multi-values-slider" gutterBottom>
Removed track multi-values
</Typography>
<Slider
track={false}
aria-labelledby="track-false-range-slider"
getAriaValueText={valuetext}
defaultValue={[20, 37, 50]}
marks={marks}
/>
</div>
);
}
68 changes: 68 additions & 0 deletions docs/src/pages/components/slider/TrackFalseSlider.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import React from 'react';
import { makeStyles, Theme, createStyles } from '@material-ui/core/styles';
import Typography from '@material-ui/core/Typography';
import Slider from '@material-ui/core/Slider';

const useStyles = makeStyles((theme: Theme) =>
createStyles({
root: {
width: 250,
},
margin: {
height: theme.spacing(3),
},
}),
);

const marks = [
{
value: 0,
label: '0°C',
},
{
value: 20,
label: '20°C',
},
{
value: 37,
label: '37°C',
},
{
value: 100,
label: '100°C',
},
];

function valuetext(value: number) {
return `${value}°C`;
}

export default function TrackFalseSlider() {
const classes = useStyles();

return (
<div className={classes.root}>
<Typography id="track-false-slider" gutterBottom>
Removed track
</Typography>
<Slider
track={false}
aria-labelledby="track-false-slider"
getAriaValueText={valuetext}
defaultValue={30}
marks={marks}
/>
<div className={classes.margin} />
<Typography id="track-false-multi-values-slider" gutterBottom>
Removed track multi-values
</Typography>
<Slider
track={false}
aria-labelledby="track-false-range-slider"
getAriaValueText={valuetext}
defaultValue={[20, 37, 50]}
marks={marks}
/>
</div>
);
}
66 changes: 66 additions & 0 deletions docs/src/pages/components/slider/TrackInvertedSlider.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import React from 'react';
import { makeStyles } from '@material-ui/core/styles';
import Typography from '@material-ui/core/Typography';
import Slider from '@material-ui/core/Slider';

const useStyles = makeStyles(theme => ({
root: {
width: 250,
},
margin: {
height: theme.spacing(3),
},
}));

const marks = [
{
value: 0,
label: '0°C',
},
{
value: 20,
label: '20°C',
},
{
value: 37,
label: '37°C',
},
{
value: 100,
label: '100°C',
},
];

function valuetext(value) {
return `${value}°C`;
}

export default function TrackInvertedSlider() {
const classes = useStyles();

return (
<div className={classes.root}>
<Typography id="track-inverted-slider" gutterBottom>
Inverted track
</Typography>
<Slider
track="inverted"
aria-labelledby="track-inverted-slider"
getAriaValueText={valuetext}
defaultValue={30}
marks={marks}
/>
<div className={classes.margin} />
<Typography id="track-inverted-range-slider" gutterBottom>
Inverted track range
</Typography>
<Slider
track="inverted"
aria-labelledby="track-inverted-range-slider"
getAriaValueText={valuetext}
defaultValue={[20, 37]}
marks={marks}
/>
</div>
);
}
68 changes: 68 additions & 0 deletions docs/src/pages/components/slider/TrackInvertedSlider.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import React from 'react';
import { makeStyles, Theme, createStyles } from '@material-ui/core/styles';
import Typography from '@material-ui/core/Typography';
import Slider from '@material-ui/core/Slider';

const useStyles = makeStyles((theme: Theme) =>
createStyles({
root: {
width: 250,
},
margin: {
height: theme.spacing(3),
},
}),
);

const marks = [
{
value: 0,
label: '0°C',
},
{
value: 20,
label: '20°C',
},
{
value: 37,
label: '37°C',
},
{
value: 100,
label: '100°C',
},
];

function valuetext(value: number) {
return `${value}°C`;
}

export default function TrackInvertedSlider() {
const classes = useStyles();

return (
<div className={classes.root}>
<Typography id="track-inverted-slider" gutterBottom>
Inverted track
</Typography>
<Slider
track="inverted"
aria-labelledby="track-inverted-slider"
getAriaValueText={valuetext}
defaultValue={30}
marks={marks}
/>
<div className={classes.margin} />
<Typography id="track-inverted-range-slider" gutterBottom>
Inverted track range
</Typography>
<Slider
track="inverted"
aria-labelledby="track-inverted-range-slider"
getAriaValueText={valuetext}
defaultValue={[20, 37]}
marks={marks}
/>
</div>
);
}
16 changes: 16 additions & 0 deletions docs/src/pages/components/slider/slider.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,22 @@ Continuous sliders allow users to select a value along a subjective range.

{{"demo": "pages/components/slider/VerticalSlider.js"}}

## Track

The track shows the range available for user selection.

### Removed track

The track can be turned off with `track={false}`.

{{"demo": "pages/components/slider/TrackFalseSlider.js"}}

### Inverted track

The track can be inverted with `track="inverted"`.

{{"demo": "pages/components/slider/TrackInvertedSlider.js"}}

## Accessibility

(WAI-ARIA: https://www.w3.org/TR/wai-aria-practices/#slider)
Expand Down
3 changes: 3 additions & 0 deletions packages/material-ui/src/Slider/Slider.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ export interface SliderProps
orientation?: 'horizontal' | 'vertical';
step?: number | null;
ThumbComponent?: React.ElementType<React.HTMLAttributes<HTMLSpanElement>>;
track?: 'normal' | false | 'inverted';
value?: number | number[];
ValueLabelComponent?: React.ElementType<ValueLabelProps>;
valueLabelDisplay?: 'on' | 'auto' | 'off';
Expand All @@ -52,6 +53,8 @@ export type SliderClassKey =
| 'disabled'
| 'rail'
| 'track'
| 'trackFalse'
| 'trackInverted'
| 'thumb'
| 'thumbColorPrimary'
| 'thumbColorSecondary'
Expand Down
Loading

0 comments on commit 635ed7f

Please sign in to comment.