Skip to content

Commit 7b4d1bc

Browse files
committed
Add support for reverse in sliders
1 parent 58847e0 commit 7b4d1bc

File tree

4 files changed

+43
-6
lines changed

4 files changed

+43
-6
lines changed

components/dash-core-components/src/components/css/dropdown.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@
4444
height: 100%;
4545
}
4646

47+
.dash-dropdown:focus {
48+
outline: 1px solid var(--Dash-Fill-Interactive-Strong);
49+
}
50+
4751
.dash-dropdown:disabled {
4852
opacity: 0.6;
4953
cursor: not-allowed;

components/dash-core-components/src/fragments/RangeSlider.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export default function RangeSlider(props: RangeSliderProps) {
3939
allowCross,
4040
pushable,
4141
count,
42+
reverse,
4243
} = props;
4344

4445
// For range slider, we expect an array of values
@@ -481,6 +482,7 @@ export default function RangeSlider(props: RangeSliderProps) {
481482
step={stepValue}
482483
disabled={disabled}
483484
orientation={vertical ? 'vertical' : 'horizontal'}
485+
inverted={reverse}
484486
data-included={included !== false}
485487
minStepsBetweenThumbs={
486488
typeof pushable === 'number'
@@ -498,14 +500,16 @@ export default function RangeSlider(props: RangeSliderProps) {
498500
renderedMarks,
499501
!!vertical,
500502
minMaxValues,
501-
!!dots
503+
!!dots,
504+
!!reverse
502505
)}
503506
{dots &&
504507
stepValue &&
505508
renderSliderDots(
506509
stepValue,
507510
minMaxValues,
508-
!!vertical
511+
!!vertical,
512+
!!reverse
509513
)}
510514
{/* Render thumbs with tooltips for each value */}
511515
{value.map((val, index) => {

components/dash-core-components/src/types.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,11 @@ export interface SliderProps extends BaseComponentProps<SliderProps> {
176176
*/
177177
included?: boolean;
178178

179+
/**
180+
* If the value is true, the slider is rendered in reverse.
181+
*/
182+
reverse?: boolean;
183+
179184
/**
180185
* Configuration for tooltips describing the current slider value
181186
*/
@@ -277,6 +282,11 @@ export interface RangeSliderProps extends BaseComponentProps<RangeSliderProps> {
277282
*/
278283
included?: boolean;
279284

285+
/**
286+
* If the value is true, the slider is rendered in reverse.
287+
*/
288+
reverse?: boolean;
289+
280290
/**
281291
* Configuration for tooltips describing the current slider values
282292
*/

components/dash-core-components/src/utils/sliderRendering.tsx

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,19 @@ export const renderSliderMarks = (
5858
renderedMarks: SliderMarks,
5959
vertical: boolean,
6060
minMaxValues: {min_mark: number; max_mark: number},
61-
dots: boolean
61+
dots: boolean,
62+
reverse = false
6263
) => {
6364
return Object.entries(renderedMarks).map(([position, mark]) => {
6465
const pos = parseFloat(position);
65-
const thumbPosition = getRadixThumbPosition(pos, minMaxValues);
66+
67+
// When reversed, use the inverted value for positioning
68+
const displayPos = reverse
69+
? minMaxValues.max_mark - pos + minMaxValues.min_mark
70+
: pos;
71+
72+
const thumbPosition = getRadixThumbPosition(displayPos, minMaxValues);
73+
6674
const style = vertical
6775
? {
6876
bottom: `calc(${thumbPosition.percentage}% + ${thumbPosition.offset}px - 13px)`,
@@ -95,7 +103,8 @@ export const renderSliderMarks = (
95103
export const renderSliderDots = (
96104
stepValue: number,
97105
minMaxValues: {min_mark: number; max_mark: number},
98-
vertical: boolean
106+
vertical: boolean,
107+
reverse = false
99108
) => {
100109
if (stepValue <= 1) {
101110
return null;
@@ -117,7 +126,17 @@ export const renderSliderDots = (
117126
},
118127
(_, i) => {
119128
const dotValue = minMaxValues.min_mark + i * stepValue;
120-
const thumbPosition = getRadixThumbPosition(dotValue, minMaxValues);
129+
130+
// When reversed, use the inverted value for positioning
131+
const displayValue = reverse
132+
? minMaxValues.max_mark - dotValue + minMaxValues.min_mark
133+
: dotValue;
134+
135+
const thumbPosition = getRadixThumbPosition(
136+
displayValue,
137+
minMaxValues
138+
);
139+
121140
const dotStyle = vertical
122141
? {
123142
bottom: `calc(${thumbPosition.percentage}% + ${thumbPosition.offset}px)`,

0 commit comments

Comments
 (0)