Skip to content

Commit 2596cbe

Browse files
committed
Controlled gradient popover.
setAngle refactor
1 parent 8e839e6 commit 2596cbe

File tree

12 files changed

+135
-39
lines changed

12 files changed

+135
-39
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,6 @@ const App = () => {
8484
| Name | Type | Default Value | Required? | Description
8585
|-|-|-|-|-
8686
| `angle` | `Number` | `undefined` | Yes | The controlled angle.
87-
| `onChange` | `Function` | `undefined` | Yes | The on change to be trigger after an angle was changes.
87+
| `setAngle` | `Function` | `undefined` | Yes | The set angle method to be trigger after an angle was changes.
8888
| `size` | `Number` | `48` | No | Determines the size of the angle picker
8989
| `snap` | `Number` | `5` | No | Determines the angle change snapping, Can be removed with setting as 0

dist/index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/index.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-linear-gradient-picker",
3-
"version": "1.0.5",
3+
"version": "1.0.6",
44
"description": "React linear gradient picker",
55
"main": "dist/index.js",
66
"scripts": {

src/components/AnglePicker/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
} from '../../lib';
1010
import './index.css';
1111

12-
const AnglePicker = ({ angle, onChange, size = 48, snap = 5 }) => {
12+
const AnglePicker = ({ angle, setAngle, size = 48, snap = 5 }) => {
1313
const pickerRef = useRef();
1414
const sizeStyle = { height: size, width: size };
1515

@@ -20,7 +20,7 @@ const AnglePicker = ({ angle, onChange, size = 48, snap = 5 }) => {
2020
const clamped = clampAngle(degrees);
2121
const angle = useSnap ? snapAngle(clamped, snap) : clamped;
2222

23-
onChange(angle);
23+
setAngle(angle);
2424
return angle;
2525
};
2626

@@ -31,7 +31,7 @@ const AnglePicker = ({ angle, onChange, size = 48, snap = 5 }) => {
3131
if (!angle) return;
3232
const snappedAngle = snapAngle(angle, snap);
3333

34-
onChange(snappedAngle);
34+
setAngle(snappedAngle);
3535
}
3636
});
3737

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
.gpw {
2+
padding: 20px;
3+
}
4+
5+
.gpw .trigger {
6+
padding: 5px;
7+
background: rgb(255, 255, 255);
8+
border-radius: 1px;
9+
box-shadow: rgba(0, 0, 0, 0.1) 0 0 0 1px;
10+
display: inline-block;
11+
cursor: pointer;
12+
}
13+
14+
.gpw .trigger .inner {
15+
width: 36px;
16+
height: 14px;
17+
border-radius: 2px;
18+
}
19+
20+
.gpw .popover {
21+
z-index: 2;
22+
margin-top: 6px;
23+
box-shadow: rgba(0, 0, 0, 0.15) 0 0 0 1px,
24+
rgba(0, 0, 0, 0.15) 0 8px 16px;
25+
padding: 12px;
26+
border-radius: 4px;
27+
position: absolute;
28+
}
29+
30+
.gpw .popover .angle-holder {
31+
margin: 0 -10px;
32+
padding: 10px 0 0 10px;
33+
border-top: 1px solid rgb(238, 238, 238);
34+
display: flex;
35+
flex-wrap: wrap;
36+
position: relative;
37+
}
38+
39+
.gpw .overlay {
40+
position: fixed;
41+
top: 0;
42+
right: 0;
43+
bottom: 0;
44+
left: 0;
45+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import React from 'react';
2+
import GradientPicker from '../GradientPicker';
3+
import { GRADIENT_PICKER_POPOVER_PROP_TYPES } from '../propTypes/index';
4+
import { getGradientPreview } from '../../lib';
5+
import AnglePicker from '../AnglePicker';
6+
import './index.css';
7+
8+
const defaultTrigger = (background, togglePicker) => (
9+
<div className="trigger" onClick={togglePicker}>
10+
<div className="inner" style={{ background }}/>
11+
</div>
12+
);
13+
14+
const GradientPickerPopover = ({
15+
palette,
16+
open = false,
17+
setOpen,
18+
trigger = defaultTrigger,
19+
showAnglePicker = false,
20+
angle,
21+
setAngle,
22+
...gradientPickerProps
23+
}) => {
24+
25+
const togglePicker = () => setOpen(!open);
26+
const { background } = getGradientPreview(palette, angle);
27+
28+
return (
29+
<div className="gpw">
30+
{ trigger(background, togglePicker) }
31+
{ open && (
32+
<>
33+
<div className="overlay" onClick={() => setOpen(false)}/>
34+
<div className="popover">
35+
<GradientPicker {...gradientPickerProps} palette={palette} flatStyle/>
36+
{ showAnglePicker && (
37+
<div className="angle-holder">
38+
<AnglePicker angle={angle} setAngle={setAngle} size={36}/>
39+
</div>
40+
)}
41+
</div>
42+
</>
43+
)}
44+
</div>
45+
);
46+
};
47+
48+
GradientPickerPopover.propTypes = GRADIENT_PICKER_POPOVER_PROP_TYPES;
49+
50+
export default GradientPickerPopover;

src/components/propTypes/index.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,16 @@ export const GRADIENT_PICKER_PROP_TYPES = {
6161

6262
export const ANGLE_PICKER_PROP_TYPES = {
6363
angle: number.isRequired,
64-
onChange: func.isRequired,
64+
setAngle: func.isRequired,
6565
size: number,
6666
snap: number
67+
};
68+
69+
export const GRADIENT_PICKER_POPOVER_PROP_TYPES = {
70+
...GRADIENT_PICKER_PROP_TYPES,
71+
...ANGLE_PICKER_PROP_TYPES,
72+
showAnglePicker: bool,
73+
open: bool.isRequired,
74+
setOpen: func.isRequired,
75+
trigger: func,
6776
};

src/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
import { getGradientPreview } from './lib';
22
import AnglePicker from './components/AnglePicker';
33
import GradientPicker from './components/GradientPicker';
4+
import GradientPickerPopover from './components/GradientPickerPopover';
45

56
export {
67
GradientPicker,
8+
GradientPickerPopover,
79
AnglePicker,
810
getGradientPreview
911
};

stories/AnglePicker/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const AnglePickerStory = () => {
1010
rgb(126, 32, 207) 100%)`;
1111
return (
1212
<div className="aps">
13-
<AnglePicker angle={localAngle} onChange={setLocalAngle}/>
13+
<AnglePicker angle={localAngle} setAngle={setLocalAngle}/>
1414
<h4>Background preview for {localAngle} Angle</h4>
1515
<div className="preview" style={{ background }}/>
1616
</div>

0 commit comments

Comments
 (0)