Skip to content

Commit

Permalink
WIP refactor 2 - add sort prop
Browse files Browse the repository at this point in the history
  • Loading branch information
mj12albert committed May 31, 2024
1 parent 4da80a7 commit d770922
Show file tree
Hide file tree
Showing 20 changed files with 217 additions and 67 deletions.
10 changes: 5 additions & 5 deletions docs/pages/base-ui/api/use-slider-thumb.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,6 @@
"default": "'horizontal'",
"required": true
},
"percentageValues": {
"type": { "name": "readonly number[]", "description": "readonly number[]" },
"required": true
},
"scale": {
"type": {
"name": "(value: number) => number",
Expand All @@ -45,7 +41,11 @@
"default": "1",
"required": true
},
"values": {
"unsortedPercentageValues": {
"type": { "name": "readonly number[]", "description": "readonly number[]" },
"required": true
},
"unsortedValues": {
"type": { "name": "readonly number[]", "description": "readonly number[]" },
"required": true
},
Expand Down
19 changes: 15 additions & 4 deletions docs/pages/base-ui/api/use-slider.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,13 @@
},
"default": "function Identity(x) {\nreturn x;\n}"
},
"sort": {
"type": {
"name": "'asc' | 'off'",
"description": "'asc' | 'off'"
},
"default": "'asc'"
},
"step": { "type": { "name": "number", "description": "number" }, "default": "1" },
"tabIndex": { "type": { "name": "number", "description": "number" } },
"value": {
Expand Down Expand Up @@ -123,10 +130,6 @@
"default": "'horizontal'",
"required": true
},
"percentageValues": {
"type": { "name": "readonly number[]", "description": "readonly number[]" },
"required": true
},
"scale": {
"type": {
"name": "(value: number) => number",
Expand Down Expand Up @@ -171,6 +174,14 @@
},
"required": true
},
"unsortedPercentageValues": {
"type": { "name": "readonly number[]", "description": "readonly number[]" },
"required": true
},
"unsortedValues": {
"type": { "name": "readonly number[]", "description": "readonly number[]" },
"required": true
},
"values": {
"type": { "name": "readonly number[]", "description": "readonly number[]" },
"required": true
Expand Down
4 changes: 2 additions & 2 deletions docs/pages/experiments/slider-label.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import * as Slider from '@base_ui/react/Slider';
import { useSliderContext } from '@base_ui/react/Slider';
import { Styles, TrackFill } from './slider';

function Label(props: any) {
export function Label(props: any) {
const { id: idProp, ...otherProps } = props;
const defaultId = React.useId();
const labelId = idProp ?? defaultId;
Expand All @@ -19,7 +19,7 @@ function Label(props: any) {
return <label id={labelId} htmlFor={htmlFor} {...otherProps} />;
}

function LabelRange(props: any) {
export function LabelRange(props: any) {
const { id: idProp, ...otherProps } = props;

const defaultId = React.useId();
Expand Down
91 changes: 91 additions & 0 deletions docs/pages/experiments/slider-sort-prop.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import * as React from 'react';
import * as Slider from '@base_ui/react/Slider';
import { Styles, TrackFill } from './slider';
import { Label, LabelRange } from './slider-label';

export default function App() {
return (
<div className="App">
<pre>default behavior</pre>
<Slider.Root className="MySlider" defaultValue={[40, 50]} aria-labelledby="LabelId">
<Label id="LabelId" className="MySlider-label">
Label
</Label>
<Slider.Output className="MySlider-output" />
<Slider.Track className="MySlider-track">
<TrackFill className="MySlider-track-fill" />
<Slider.Thumb className="MySlider-thumb red" />
<Slider.Thumb className="MySlider-thumb blue" />
</Slider.Track>
</Slider.Root>

<pre>sort=&ldquo;off&rdquo;</pre>
<Slider.Root
className="MySlider"
defaultValue={[40, 50]}
sort="off"
aria-labelledby="LabelRangeId"
>
<LabelRange id="LabelRangeId" className="MySlider-label">
Range Label
</LabelRange>
<Slider.Output className="MySlider-output" />
<Slider.Track className="MySlider-track">
<TrackFill className="MySlider-track-fill" />
<Slider.Thumb className="MySlider-thumb red" />
<Slider.Thumb className="MySlider-thumb blue" />
</Slider.Track>
</Slider.Root>
<Styles />
<Styles2 />
</div>
);
}

function Styles2() {
return (
<style>
{`
.MySlider-thumb:focus-visible {
z-index: 1;
}
.MySlider {
grid-template-columns: 1fr 1fr;
}
.MySlider-label {
font-size: .875rem;
}
.MySlider-track {
grid-column: span 2;
}
.red,
.red[data-dragging] {
background-color: red;
}
.blue,
.blue[data-dragging] {
background-color: blue;
}
.green,
.green[data-dragging] {
background-color: green;
}
pre {
font-size: .5rem;
margin-bottom: 2rem;
}
pre:not(:first-of-type) {
margin-top: 8rem;
}
`}
</style>
);
}
4 changes: 2 additions & 2 deletions docs/pages/experiments/slider.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ export function TrackFill(props: any) {
// does not support inverted range fill! (yet)
const { inverted = false, style, ...otherProps } = props;

const { axis, disabled, isRtl, orientation, percentageValues } = useSliderContext();
const { axis, disabled, isRtl, orientation, unsortedPercentageValues } = useSliderContext();

const values = percentageValues.slice().sort((a, b) => a - b);
const values = unsortedPercentageValues.slice().sort((a, b) => a - b);

const isRange = values.length > 1;

Expand Down
4 changes: 2 additions & 2 deletions docs/src/modules/home/BaseUIThemesDemo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -411,15 +411,15 @@ const StyledSliderTrack = styled(Slider.Track)`
function TrackFill(props: any) {
const { inverted = false, style, ...otherProps } = props;

const { disabled, isRtl, percentageValues } = useSliderContext();
const { disabled, isRtl, unsortedPercentageValues } = useSliderContext();

return (
<span
data-disabled={disabled}
data-inverted={inverted}
{...otherProps}
style={{
width: `${inverted ? 100 - percentageValues[0] : percentageValues[0]}%`,
width: `${inverted ? 100 - unsortedPercentageValues[0] : unsortedPercentageValues[0]}%`,
[(isRtl || inverted) && isRtl !== inverted ? 'right' : 'left']: 0,
...style,
}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,13 @@
"max": { "description": "The maximum allowed value of the slider." },
"min": { "description": "The minimum allowed value of the slider." },
"orientation": { "description": "The component orientation." },
"percentageValues": { "description": "The value(s) of the slider as percentages" },
"step": {
"description": "The step value of the slider when incrementing or decrementing. It will snap to multiples of this value. Decimal values are supported."
},
"values": { "description": "The value(s) of the slider" }
"unsortedPercentageValues": {
"description": "The internal unsorted percentage value(s) of the slider"
},
"unsortedValues": { "description": "The internal unsorted value(s) of the slider." }
},
"returnValueDescriptions": {
"getThumbStyle": { "description": "Resolver for the thumb slot&#39;s style prop." }
Expand Down
9 changes: 6 additions & 3 deletions docs/translations/api-docs/use-slider/use-slider.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
"description": "Tab index attribute of the Thumb component&#39;s <code>input</code> element."
},
"value": {
"description": "The value of the slider. For ranged sliders, provide an array with two values."
"description": "The value of the slider. For ranged sliders, provide an array with multiple values"
}
},
"returnValueDescriptions": {
Expand All @@ -59,13 +59,16 @@
"min": { "description": "The minimum allowed value of the slider." },
"open": { "description": "The thumb index for the current value when in hover state." },
"orientation": { "description": "The component orientation." },
"percentageValues": { "description": "The value(s) of the slider as percentages" },
"step": {
"description": "The step value of the slider when incrementing or decrementing. It will snap to multiples of this value. Decimal values are supported."
},
"subitems": {
"description": "A map containing all the Thumb components registered to the slider"
},
"values": { "description": "The value(s) of the slider" }
"unsortedPercentageValues": {
"description": "The internal unsorted percentage value(s) of the slider"
},
"unsortedValues": { "description": "The internal unsorted value(s) of the slider." },
"values": { "description": "The sorted values(s) of the slider." }
}
}
4 changes: 4 additions & 0 deletions packages/mui-base/src/Slider/Root/SliderRoot.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,10 @@ SliderRoot.propTypes /* remove-proptypes */ = {
* }
*/
scale: PropTypes.func,
/**
* @default 'asc'
*/
sort: PropTypes.oneOf(['asc', 'off']),
/**
* The granularity with which the slider can step through values. (A "discrete" slider.)
* The `min` prop serves as the origin for the valid values.
Expand Down
20 changes: 14 additions & 6 deletions packages/mui-base/src/Slider/Root/SliderRoot.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ export interface SliderRootOwnerState {
orientation: 'horizontal' | 'vertical';
step: number;
/**
* The raw number value of the slider.
* The sorted values(s) of the slider.
*/
values: ReadonlyArray<number>;
values: readonly number[];
}

export interface SliderRootProps
Expand Down Expand Up @@ -157,6 +157,10 @@ export interface UseSliderParameters {
* @default 10
*/
largeStep?: number;
/**
* @default 'asc'
*/
sort?: 'asc' | 'off';
/**
* The granularity with which the slider can step through values. (A "discrete" slider.)
* The `min` prop serves as the origin for the valid values.
Expand All @@ -170,7 +174,7 @@ export interface UseSliderParameters {
tabIndex?: number;
/**
* The value of the slider.
* For ranged sliders, provide an array with two values.
* For ranged sliders, provide an array with multiple values
*/
value?: number | ReadonlyArray<number>;
}
Expand Down Expand Up @@ -260,9 +264,9 @@ export interface UseSliderReturnValue {
*/
orientation: 'horizontal' | 'vertical';
/**
* The value(s) of the slider as percentages
* The internal unsorted percentage value(s) of the slider
*/
percentageValues: readonly number[];
unsortedPercentageValues: readonly number[];
scale: (value: number) => number;
setActive: (activeIndex: number) => void;
setDragging: (isDragging: boolean) => void;
Expand All @@ -280,7 +284,11 @@ export interface UseSliderReturnValue {
subitems: Map<string, SliderThumbMetadata>;
tabIndex?: number;
/**
* The value(s) of the slider
* The internal unsorted value(s) of the slider.
*/
unsortedValues: readonly number[];
/**
* The sorted values(s) of the slider.
*/
values: readonly number[];
}
Expand Down
Loading

0 comments on commit d770922

Please sign in to comment.