Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Slider improvements #211

Merged
merged 41 commits into from
Nov 4, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
90b8cb3
Slider improvements
jjenzz Oct 14, 2020
edfdc63
Compose onTouchStart event from props
jjenzz Oct 20, 2020
bfbfa60
Clean up some redundancy
jjenzz Oct 20, 2020
d1018cc
Avoid forwarding `focused` to span in story
jjenzz Oct 20, 2020
8bd5248
Changeset
jjenzz Oct 20, 2020
c78d0e5
Correct comment spelling
jjenzz Oct 20, 2020
8be10e7
Remove redundant thumbs from stories
jjenzz Oct 20, 2020
8fe14ab
Rename `isDisabled` to `disabled` & remove from context
jjenzz Oct 20, 2020
065dae8
Separate unrelated code blocks
jjenzz Oct 20, 2020
2e020e6
Avoid getting rect on every mouse move
jjenzz Oct 20, 2020
ae2b764
Rename `touches` to `touch`
jjenzz Oct 20, 2020
32087b2
Remove redundant ref composition
jjenzz Oct 20, 2020
18e6416
Cleanup timeout
jjenzz Oct 20, 2020
083eb84
Add thumb offset comment
jjenzz Oct 20, 2020
c41475d
Clean up events on unmount
jjenzz Oct 20, 2020
212921b
Remove inherited border-radius from range
jjenzz Oct 20, 2020
c2df807
Add comments to utils and move utils inline that aren't re-used
jjenzz Oct 21, 2020
b7a38e8
Add direction prop
jjenzz Oct 21, 2020
f543395
Add missing disabled attributes
jjenzz Oct 21, 2020
a828d1a
Remove `useChangeEffect`
jjenzz Oct 21, 2020
7c36320
Add thumb positioning span and ensure vertical always increases from …
jjenzz Oct 21, 2020
ef4cc8c
Make sure `onChange` calls only when value changes
jjenzz Oct 21, 2020
06a2296
Add pointer events
jjenzz Oct 22, 2020
45e2753
Convert pointer position to value within orientation components
jjenzz Oct 22, 2020
b9a430d
Move keydown into SliderPart so orientation comps can handle slide di…
jjenzz Oct 22, 2020
427b6dc
Add pointer events
jjenzz Oct 22, 2020
b09d304
Update stories
jjenzz Oct 22, 2020
522c3c9
Add comment to useControlledState hook
jjenzz Oct 22, 2020
433304f
Rename thumb offset variable
jjenzz Oct 22, 2020
28ef1a6
Changeset
jjenzz Oct 22, 2020
83e0bc4
Revert useControlledState changes
jjenzz Oct 22, 2020
2d3e518
Update hook to include itemediary direction changes
jjenzz Oct 27, 2020
8b3ccde
PR feedback
jjenzz Oct 27, 2020
7e3b0ce
Cache slider rect
jjenzz Oct 27, 2020
b0033a9
Fix useControlledState
jjenzz Oct 27, 2020
ced4224
Changeset
jjenzz Oct 27, 2020
3a661d9
Add `React.useCallback`
jjenzz Oct 28, 2020
54ec030
Remove redundant `useRect` import
jjenzz Oct 29, 2020
61bc959
Make sure thumb focuses on value change
jjenzz Nov 3, 2020
29a6df6
Focus thumb in event handlers
jjenzz Nov 3, 2020
1b04b84
Update comment
jjenzz Nov 3, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions .yarn/versions/68ce2791.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
releases:
"@interop-ui/popper": prerelease
"@interop-ui/react-accessible-icon": prerelease
"@interop-ui/react-accordion": prerelease
"@interop-ui/react-alert-dialog": prerelease
"@interop-ui/react-announce": prerelease
"@interop-ui/react-arrow": prerelease
"@interop-ui/react-aspect-ratio": prerelease
"@interop-ui/react-avatar": prerelease
"@interop-ui/react-checkbox": prerelease
"@interop-ui/react-collapsible": prerelease
"@interop-ui/react-collection": prerelease
"@interop-ui/react-debug-context": prerelease
"@interop-ui/react-dialog": prerelease
"@interop-ui/react-dismissable-layer": prerelease
"@interop-ui/react-focus-scope": prerelease
"@interop-ui/react-label": prerelease
"@interop-ui/react-popover": prerelease
"@interop-ui/react-popper": prerelease
"@interop-ui/react-portal": prerelease
"@interop-ui/react-progress-bar": prerelease
"@interop-ui/react-radio-group": prerelease
"@interop-ui/react-separator": prerelease
"@interop-ui/react-slider": prerelease
"@interop-ui/react-switch": prerelease
"@interop-ui/react-tabs": prerelease
"@interop-ui/react-toggle-button": prerelease
"@interop-ui/react-tooltip": prerelease
"@interop-ui/react-use-size": prerelease
"@interop-ui/react-utils": prerelease
"@interop-ui/react-visually-hidden": prerelease

declined:
- interop-ui
- "@interop-ui/docs"
178 changes: 139 additions & 39 deletions packages/react/slider/src/Slider.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,51 +1,151 @@
import * as React from 'react';
import { Slider as SliderPrimitive, styles } from './Slider';
import { Slider, styles } from './Slider';

export default { title: 'Slider' };

export const Basic = () => (
<Slider>
<SliderTrack>
<SliderRange />
</SliderTrack>
<SliderThumb />
<Slider defaultValue={10} style={styles.root}>
<Slider.Track style={styles.track}>
<Slider.Range style={styles.range} />
</Slider.Track>
<Slider.Thumb style={styles.thumb} />
</Slider>
);

export const InlineStyle = () => (
<Slider>
<SliderTrack
style={{
height: 4,
background: 'gainsboro',
borderRadius: 4,
}}
>
<SliderRange style={{ background: 'black' }} />
</SliderTrack>
<SliderThumb
style={{
borderRadius: 15,
width: 15,
height: 15,
background: 'black',
}}
/>
</Slider>
);
export const Horizontal = () => {
const [isFocusRange, setIsFocusRange] = React.useState([false, false]);
const [isFocusSingle, setIsFocusSingle] = React.useState(false);

const Slider = (props: React.ComponentProps<typeof SliderPrimitive>) => (
<SliderPrimitive {...props} style={{ ...styles.root, ...props.style }} />
);
return (
<>
<Slider as={Root} defaultValue={[10, 30]} style={{ height: 15 }}>
<Slider.Track as={Track} style={{ height: 4 }}>
<Slider.Range as={Range} style={{ height: '100%' }} />
</Slider.Track>
<Slider.Thumb
as={Thumb}
style={{ top: '50%' }}
focused={isFocusRange[0]}
onFocus={() => setIsFocusRange([true, false])}
onBlur={() => setIsFocusRange([false, false])}
/>
<Slider.Thumb
as={Thumb}
style={{ top: '50%' }}
focused={isFocusRange[1]}
onFocus={() => setIsFocusRange([false, true])}
onBlur={() => setIsFocusRange([false, false])}
/>
</Slider>

const SliderRange = (props: React.ComponentProps<typeof SliderPrimitive.Range>) => (
<SliderPrimitive.Range {...props} style={{ ...styles.range, ...props.style }} />
);
<br />

const SliderTrack = (props: React.ComponentProps<typeof SliderPrimitive.Track>) => (
<SliderPrimitive.Track {...props} style={{ ...styles.track, ...props.style }} />
);
<Slider as={Root} defaultValue={10} style={{ height: 15 }}>
<Slider.Track as={Track} style={{ height: 4 }}>
<Slider.Range as={Range} style={{ height: '100%' }} />
</Slider.Track>
<Slider.Thumb
as={Thumb}
style={{ top: '50%' }}
focused={isFocusSingle}
onFocus={() => setIsFocusSingle(true)}
onBlur={() => setIsFocusSingle(false)}
/>
</Slider>
</>
);
};

const SliderThumb = (props: React.ComponentProps<typeof SliderPrimitive.Thumb>) => (
<SliderPrimitive.Thumb {...props} style={{ ...styles.thumb, ...props.style }} />
);
export const Vertical = () => {
const [isFocusRange, setIsFocusRange] = React.useState([false, false]);
const [isFocusSingle, setIsFocusSingle] = React.useState(false);

return (
<>
<Slider
as={Root}
defaultValue={[10, 30]}
orientation="vertical"
style={{ width: 15, flexDirection: 'column' }}
>
<Slider.Track as={Track} style={{ height: '300px', width: 4 }}>
<Slider.Range as={Range} style={{ width: '100%' }} />
</Slider.Track>
<Slider.Thumb
as={Thumb}
style={{ left: '50%' }}
focused={isFocusRange[0]}
onFocus={() => setIsFocusRange([true, false])}
onBlur={() => setIsFocusRange([false, false])}
/>
<Slider.Thumb
as={Thumb}
style={{ left: '50%' }}
focused={isFocusRange[1]}
onFocus={() => setIsFocusRange([false, true])}
onBlur={() => setIsFocusRange([false, false])}
/>
</Slider>

<br />

<Slider
as={Root}
defaultValue={10}
orientation="vertical"
style={{ width: 15, flexDirection: 'column' }}
>
<Slider.Track as={Track} style={{ height: '300px', width: 4 }}>
<Slider.Range as={Range} style={{ width: '100%' }} />
</Slider.Track>
<Slider.Thumb
as={Thumb}
style={{ left: '50%' }}
focused={isFocusSingle}
onFocus={() => setIsFocusSingle(true)}
onBlur={() => setIsFocusSingle(false)}
/>
</Slider>
</>
);
};

const Root = React.forwardRef((props: any, ref) => (
<span
{...props}
ref={ref}
style={{ ...styles.root, ...props.style, display: 'flex', alignItems: 'center' }}
/>
));

const Track = React.forwardRef((props: any, ref) => (
<span
{...props}
ref={ref}
style={{ ...styles.track, ...props.style, background: 'gainsboro', borderRadius: 4 }}
/>
));

const Range = React.forwardRef((props: any, ref) => (
<span
{...props}
ref={ref}
style={{ ...styles.range, ...props.style, background: 'black', borderRadius: 'inherit' }}
/>
));

const Thumb = React.forwardRef(({ focused, ...props }: any, ref) => (
<span
{...props}
ref={ref}
style={{
...styles.thumb,
...props.style,
borderRadius: 15,
width: 15,
height: 15,
background: 'black',
outline: focused ? `2px solid red` : undefined,
}}
/>
));
Loading