Skip to content

Commit 40f4872

Browse files
eps1lonmarcelpanse
authored andcommitted
[Slider] Replace reversed with rtl support on horizontal sliders (mui#12972)
* [Slider] Replace reversed with rtl support on horizontal sliders This follows WAI-ARIA slider authoring practices as well as the material design specs. The vertical slider is kept regardless. * [docs] Remove obsolete reverse slider section
1 parent 9573e1f commit 40f4872

8 files changed

Lines changed: 13 additions & 93 deletions

File tree

docs/src/pages/lab/slider/ReverseSlider.js

Lines changed: 0 additions & 38 deletions
This file was deleted.

docs/src/pages/lab/slider/VerticalSlider.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ class VerticalSlider extends React.Component {
2626
return (
2727
<div className={classes.root}>
2828
<Slider value={value} onChange={this.handleChange} vertical />
29-
<Slider value={value} onChange={this.handleChange} vertical reverse />
3029
</div>
3130
);
3231
}

docs/src/pages/lab/slider/slider.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@ Sliders reflect the current state of the settings they control.
3535

3636
{{"demo": "pages/lab/slider/VerticalSlider.js"}}
3737

38-
## Reverse slider
39-
40-
{{"demo": "pages/lab/slider/ReverseSlider.js"}}
41-
4238
## Custom thumb
4339

4440
{{"demo": "pages/lab/slider/CustomIconSlider.js"}}

packages/material-ui-lab/src/Slider/Slider.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { TransitionHandlerProps } from '@material-ui/core/transitions/transition
77
export interface SliderProps
88
extends StandardProps<React.HTMLAttributes<HTMLDivElement>, SliderClassKey, 'onChange'> {
99
disabled?: boolean;
10-
reverse?: boolean;
1110
vertical?: boolean;
1211
max?: number;
1312
min?: number;
@@ -29,7 +28,6 @@ export type SliderClassKey =
2928
| 'activated'
3029
| 'disabled'
3130
| 'vertical'
32-
| 'reverse'
3331
| 'jumped';
3432

3533
declare const Slider: React.ComponentType<SliderProps>;

packages/material-ui-lab/src/Slider/Slider.js

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export const styles = theme => {
1515
};
1616

1717
const commonTransitions = theme.transitions.create(
18-
['width', 'height', 'left', 'top', 'box-shadow'],
18+
['width', 'height', 'left', 'right', 'top', 'box-shadow'],
1919
commonTransitionsOptions,
2020
);
2121
// no transition on the position
@@ -44,12 +44,6 @@ export const styles = theme => {
4444
height: '100%',
4545
padding: '8px 16px',
4646
},
47-
'&$reverse': {
48-
transform: 'scaleX(-1)',
49-
},
50-
'&$vertical$reverse': {
51-
transform: 'scaleY(-1)',
52-
},
5347
},
5448
/* Styles applied to the container element. */
5549
container: {
@@ -130,8 +124,6 @@ export const styles = theme => {
130124
height: 'inherit',
131125
width: 'inherit',
132126
},
133-
/* Class applied to the root element to trigger JSS nested styles if `reverse={true}`. */
134-
reverse: {},
135127
/* Class applied to the track and thumb elements to trigger JSS nested styles if `disabled`. */
136128
disabled: {},
137129
/* Class applied to the track and thumb elements to trigger JSS nested styles if `jumped`. */
@@ -177,15 +169,15 @@ function getMousePosition(event) {
177169
};
178170
}
179171

180-
function calculatePercent(node, event, isVertical, isReverted) {
172+
function calculatePercent(node, event, isVertical, isRtl) {
181173
const { width, height } = node.getBoundingClientRect();
182174
const { top, left } = getOffset(node);
183175
const { x, y } = getMousePosition(event);
184176

185177
const value = isVertical ? y - top : x - left;
186178
const onePercent = (isVertical ? height : width) / 100;
187179

188-
return isReverted ? 100 - clamp(value / onePercent) : clamp(value / onePercent);
180+
return isRtl && !isVertical ? 100 - clamp(value / onePercent) : clamp(value / onePercent);
189181
}
190182

191183
function preventPageScrolling(event) {
@@ -275,8 +267,8 @@ class Slider extends React.Component {
275267
};
276268

277269
handleClick = event => {
278-
const { min, max, vertical, reverse } = this.props;
279-
const percent = calculatePercent(this.containerRef, event, vertical, reverse);
270+
const { min, max, vertical } = this.props;
271+
const percent = calculatePercent(this.containerRef, event, vertical, this.isReverted());
280272
const value = percentToValue(percent, min, max);
281273

282274
this.emitChange(event, value, () => {
@@ -320,8 +312,8 @@ class Slider extends React.Component {
320312
};
321313

322314
handleMouseMove = event => {
323-
const { min, max, vertical, reverse } = this.props;
324-
const percent = calculatePercent(this.containerRef, event, vertical, reverse);
315+
const { min, max, vertical } = this.props;
316+
const percent = calculatePercent(this.containerRef, event, vertical, this.isReverted());
325317
const value = percentToValue(percent, min, max);
326318

327319
this.emitChange(event, value);
@@ -383,6 +375,10 @@ class Slider extends React.Component {
383375
});
384376
}
385377

378+
isReverted() {
379+
return this.props.theme.direction === 'rtl';
380+
}
381+
386382
render() {
387383
const { currentState } = this.state;
388384
const {
@@ -396,7 +392,6 @@ class Slider extends React.Component {
396392
onChange,
397393
onDragEnd,
398394
onDragStart,
399-
reverse,
400395
step,
401396
theme,
402397
value,
@@ -417,7 +412,6 @@ class Slider extends React.Component {
417412
classes.root,
418413
{
419414
[classes.vertical]: vertical,
420-
[classes.reverse]: reverse,
421415
[classes.disabled]: disabled,
422416
},
423417
classNameProp,
@@ -436,7 +430,8 @@ class Slider extends React.Component {
436430
});
437431

438432
const trackProperty = vertical ? 'height' : 'width';
439-
const thumbProperty = vertical ? 'top' : 'left';
433+
const horizontalMinimumPosition = theme.direction === 'ltr' ? 'left' : 'right';
434+
const thumbProperty = vertical ? 'top' : horizontalMinimumPosition;
440435
const inlineTrackBeforeStyles = { [trackProperty]: this.calculateTrackBeforeStyles(percent) };
441436
const inlineTrackAfterStyles = { [trackProperty]: this.calculateTrackAfterStyles(percent) };
442437
const inlineThumbStyles = { [thumbProperty]: `${percent}%` };
@@ -537,10 +532,6 @@ Slider.propTypes = {
537532
* Callback function that is fired when the slider has begun to move.
538533
*/
539534
onDragStart: PropTypes.func,
540-
/**
541-
* If `true`, the slider will be reversed.
542-
*/
543-
reverse: PropTypes.bool,
544535
/**
545536
* The granularity the slider can step through values.
546537
*/

packages/material-ui-lab/src/Slider/Slider.test.js

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -93,23 +93,6 @@ describe('<Slider />', () => {
9393
});
9494
});
9595

96-
describe('prop: reverse', () => {
97-
it('should render with the default and reverse classes', () => {
98-
const wrapper = shallow(<Slider reverse value={0} />);
99-
assert.strictEqual(wrapper.hasClass(classes.root), true);
100-
assert.strictEqual(wrapper.hasClass(classes.reverse), true);
101-
});
102-
});
103-
104-
describe('props: vertical & reverse', () => {
105-
it('should render with the default, reverse and vertical classes', () => {
106-
const wrapper = shallow(<Slider reverse vertical value={0} />);
107-
assert.strictEqual(wrapper.hasClass(classes.root), true);
108-
assert.strictEqual(wrapper.hasClass(classes.reverse), true);
109-
assert.strictEqual(wrapper.hasClass(classes.vertical), true);
110-
});
111-
});
112-
11396
describe('prop: disabled', () => {
11497
const handleChange = spy();
11598
let wrapper;

pages/lab/api/slider.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import Slider from '@material-ui/lab/Slider';
2727
| <span class="prop-name">onChange</span> | <span class="prop-type">func |   | Callback function that is fired when the slider's value changed. |
2828
| <span class="prop-name">onDragEnd</span> | <span class="prop-type">func |   | Callback function that is fired when the slide has stopped moving. |
2929
| <span class="prop-name">onDragStart</span> | <span class="prop-type">func |   | Callback function that is fired when the slider has begun to move. |
30-
| <span class="prop-name">reverse</span> | <span class="prop-type">bool |   | If `true`, the slider will be reversed. |
3130
| <span class="prop-name">step</span> | <span class="prop-type">number |   | The granularity the slider can step through values. |
3231
| <span class="prop-name">thumb</span> | <span class="prop-type">element |   | The component used for the slider icon. This is optional, if provided should be a react element. |
3332
| <span class="prop-name required">value *</span> | <span class="prop-type">number |   | The value of the slider. |
@@ -51,7 +50,6 @@ This property accepts the following keys:
5150
| <span class="prop-name">thumb</span> | Styles applied to the thumb element.
5251
| <span class="prop-name">thumbIconWrapper</span> | Class applied to the thumb element if custom thumb icon provided.
5352
| <span class="prop-name">thumbIcon</span> |
54-
| <span class="prop-name">reverse</span> | Class applied to the root element to trigger JSS nested styles if `reverse={true}`.
5553
| <span class="prop-name">disabled</span> | Class applied to the track and thumb elements to trigger JSS nested styles if `disabled`.
5654
| <span class="prop-name">jumped</span> | Class applied to the track and thumb elements to trigger JSS nested styles if `jumped`.
5755
| <span class="prop-name">focused</span> | Class applied to the track and thumb elements to trigger JSS nested styles if `focused`.

pages/lab/slider.js

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,6 @@ module.exports = require('fs')
3434
raw: preval`
3535
module.exports = require('fs')
3636
.readFileSync(require.resolve('docs/src/pages/lab/slider/VerticalSlider'), 'utf8')
37-
`,
38-
},
39-
'pages/lab/slider/ReverseSlider.js': {
40-
js: require('docs/src/pages/lab/slider/ReverseSlider').default,
41-
raw: preval`
42-
module.exports = require('fs')
43-
.readFileSync(require.resolve('docs/src/pages/lab/slider/ReverseSlider'), 'utf8')
4437
`,
4538
},
4639
'pages/lab/slider/CustomIconSlider.js': {

0 commit comments

Comments
 (0)