Skip to content

Commit 149d7f1

Browse files
authored
feat: disableApha #23 (#52)
1 parent 5550f25 commit 149d7f1

File tree

8 files changed

+111
-57
lines changed

8 files changed

+111
-57
lines changed

src/components/ColorBox/index.jsx

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,9 @@ const StyledBox = styled.div`
8585
}
8686
`;
8787

88-
const ColorBox = ({ value, palette, inputFormats, deferred, onChange: _onChange, ...props }) => {
88+
const ColorBox = ({ value, palette, inputFormats, deferred, onChange: _onChange, disableAlpha, ...props }) => {
8989
const { t, i18n } = useTranslate();
90-
let color = validateColor(value, t, i18n.language);
90+
let color = validateColor(value, disableAlpha, t, i18n.language);
9191
let onChange = _onChange;
9292
let onDeferredChange;
9393
if (deferred) {
@@ -138,6 +138,7 @@ const ColorBox = ({ value, palette, inputFormats, deferred, onChange: _onChange,
138138
key={input}
139139
value={color}
140140
format={input}
141+
disableAlpha
141142
className="muicc-colorbox-input"
142143
onChange={handleInputChange}
143144
/>
@@ -164,22 +165,29 @@ const ColorBox = ({ value, palette, inputFormats, deferred, onChange: _onChange,
164165
max={360}
165166
onChange={handleHueChange}
166167
/>
167-
<AlphaSlider
168-
data-testid="alphaslider"
169-
color={cssColor}
170-
valueLabelDisplay="auto"
171-
aria-label="alpha slider"
172-
value={alpha}
173-
min={0}
174-
max={100}
175-
onChange={handleAlphaChange}
176-
/>
168+
{!disableAlpha && (
169+
<AlphaSlider
170+
data-testid="alphaslider"
171+
color={cssColor}
172+
valueLabelDisplay="auto"
173+
aria-label="alpha slider"
174+
value={alpha}
175+
min={0}
176+
max={100}
177+
onChange={handleAlphaChange}
178+
/>
179+
)}
177180
</div>
178181
{displayInput(inputFormats)}
179182
{palette && (
180183
<>
181184
<Divider />
182-
<ColorPalette size={26.65} palette={palette} onSelect={handlePaletteSelection} />
185+
<ColorPalette
186+
size={26.65}
187+
palette={palette}
188+
onSelect={handlePaletteSelection}
189+
disableAlpha={disableAlpha}
190+
/>
183191
</>
184192
)}
185193
{deferred && (
@@ -198,13 +206,18 @@ ColorBox.propTypes = {
198206
palette: CommonTypes.palette,
199207
inputFormats: CommonTypes.inputFormats,
200208
onChange: PropTypes.func.isRequired,
209+
/**
210+
Don't use alpha
211+
*/
212+
disableAlpha: PropTypes.bool,
201213
};
202214

203215
ColorBox.defaultProps = {
204216
value: undefined,
205217
deferred: false,
206218
palette: undefined,
207219
inputFormats: ['hex', 'rgb'],
220+
disableAlpha: false,
208221
};
209222

210223
export default uncontrolled(ColorBox);

src/components/ColorButton.jsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ const Styleddiv = styled.div`
4949
- Use a ColorButton to select a predefined color by clicking on this button.
5050
- If the color is not valid or transparent a crossed background is displayed.
5151
*/
52-
const ColorButton = ({ color: c, size, borderWidth, borderColor, forwardRef, tooltip, ...props }) => {
52+
const ColorButton = ({ color: c, size, borderWidth, borderColor, forwardRef, tooltip, disableAlpha, ...props }) => {
5353
const { t, i18n } = useTranslate();
54-
const color = ColorTool.validateColor(c, t, i18n.language);
54+
const color = ColorTool.validateColor(c, t, disableAlpha, i18n.language);
5555
const translated = t(tooltip);
5656
const style = color.css; // || { backgroundColor: ColorTool.getCssColor(color) };
5757
let l = color.hsl[2] - 10;
@@ -92,6 +92,10 @@ ColorButton.propTypes = {
9292
The size of the button in pixel
9393
*/
9494
size: PropTypes.number,
95+
/**
96+
Don't use alpha
97+
*/
98+
disableAlpha: PropTypes.bool,
9599
/**
96100
The width of the button's border, not displayed if borderWidth=0
97101
*/
@@ -116,6 +120,7 @@ ColorButton.defaultProps = {
116120
borderColor: undefined,
117121
forwardRef: undefined,
118122
tooltip: undefined,
123+
disableAlpha: false,
119124
};
120125

121126
export default ColorButton;

src/components/ColorInput.jsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ const StyledRoot = styled.div`
3535
}
3636
`;
3737

38-
const ColorInput = ({ value, format, onChange, forwardRef, ...props }) => {
38+
const ColorInput = ({ value, format, onChange, disableAlpha, forwardRef, ...props }) => {
3939
const { t, i18n } = useTranslate();
40-
const color = ColorTool.validateColor(value, t, i18n.language);
40+
const color = ColorTool.validateColor(value, disableAlpha, t, i18n.language);
4141
let field;
4242
let components;
4343

@@ -87,7 +87,7 @@ const ColorInput = ({ value, format, onChange, forwardRef, ...props }) => {
8787
if (format === 'plain') {
8888
field = buildInput('color-plain', 'Color', color.raw);
8989
} else {
90-
components = ColorTool.getComponents(color, format, t);
90+
components = ColorTool.getComponents(color, format, disableAlpha, t);
9191
const names = Object.keys(components);
9292
field = (
9393
<StyledRoot ref={forwardRef}>
@@ -111,6 +111,10 @@ ColorInput.propTypes = {
111111
value: CommonTypes.color,
112112
format: PropTypes.string,
113113
onChange: PropTypes.func.isRequired,
114+
/**
115+
Don't use alpha
116+
*/
117+
disableAlpha: PropTypes.bool,
114118
/**
115119
Internal usage
116120
*/
@@ -121,6 +125,7 @@ ColorInput.defaultProps = {
121125
value: '',
122126
format: 'plain',
123127
forwardRef: undefined,
128+
disableAlpha: false,
124129
};
125130

126131
export default uncontrolled(ColorInput);

src/components/ColorPalette.jsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const StyledRoot = styled.div`
2525
}
2626
`;
2727

28-
const ColorPalette = ({ size, borderWidth, palette, onSelect }) => {
28+
const ColorPalette = ({ size, borderWidth, palette, onSelect, disableAlpha }) => {
2929
const { t } = useTranslate();
3030
const handleSelectColor = name => {
3131
const translatedName = t(name);
@@ -42,6 +42,7 @@ const ColorPalette = ({ size, borderWidth, palette, onSelect }) => {
4242
className="muicc-palette-button"
4343
borderWidth={borderWidth}
4444
tooltip={name}
45+
disableAlpha={disableAlpha}
4546
onClick={() => handleSelectColor(name)}
4647
/>
4748
))}
@@ -55,13 +56,18 @@ ColorPalette.propTypes = {
5556
palette: CommonTypes.palette.isRequired,
5657
forwardRef: PropTypes.shape({ current: PropTypes.instanceOf(Element) }),
5758
onSelect: PropTypes.func,
59+
/**
60+
Don't use alpha
61+
*/
62+
disableAlpha: PropTypes.bool,
5863
};
5964

6065
ColorPalette.defaultProps = {
6166
borderWidth: 0,
6267
size: 24,
6368
forwardRef: undefined,
6469
onSelect: undefined,
70+
disableAlpha: false,
6571
};
6672

6773
export default ColorPalette;

src/components/ColorPicker.jsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,12 @@ const ColorPicker = ({
5454
onChange,
5555
onOpen,
5656
doPopup,
57+
disableAlpha,
5758
}) => {
5859
const refPicker = React.useRef();
5960
const [open, setOpen] = React.useState(openAtStart);
6061
const { t, i18n } = useTranslate();
61-
const color = ColorTool.validateColor(value, t, i18n.language);
62+
const color = ColorTool.validateColor(value, disableAlpha, t, i18n.language);
6263
const raw = getColorText(color);
6364
const handleClick = () => {
6465
const b = Boolean(refPicker.current);
@@ -89,6 +90,7 @@ const ColorPicker = ({
8990
deferred={deferred}
9091
palette={palette}
9192
inputFormats={inputFormats}
93+
disableAlpha={disableAlpha}
9294
onChange={handleColorChange}
9395
/>
9496
);
@@ -145,6 +147,10 @@ ColorPicker.propTypes = {
145147
onOpen: PropTypes.func,
146148
openAtStart: PropTypes.bool,
147149
doPopup: PropTypes.func,
150+
/**
151+
Don't use alpha
152+
*/
153+
disableAlpha: PropTypes.bool,
148154
};
149155

150156
ColorPicker.defaultProps = {
@@ -156,6 +162,7 @@ ColorPicker.defaultProps = {
156162
onOpen: undefined,
157163
openAtStart: false,
158164
doPopup: undefined,
165+
disableAlpha: false,
159166
};
160167

161168
export default uncontrolled(ColorPicker);

src/helpers/colorTool.js

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ const colorsCssConditions = [
296296
value => value.startsWith('hsl(') || value.startsWith('hsla('),
297297
];
298298

299-
const parse = (raw, _format) => {
299+
const parse = (raw, _format, disableAlpha = false) => {
300300
const color = { raw };
301301
let value;
302302
let alpha;
@@ -363,7 +363,14 @@ const parse = (raw, _format) => {
363363
color.value = value;
364364
color.alpha = Number.isNaN(alpha) || alpha === undefined ? 1 : alpha / 255;
365365
color.format = format;
366-
const hex = getCssHexa(value, alpha);
366+
let alpha255;
367+
if (!disableAlpha && color.alpha !== 1) {
368+
alpha255 = Math.floor(color.alpha * 255);
369+
} else if (color.alpha === 1 && color.value === -16777216) {
370+
// special case to distinguish between black 0x000000FF and transparent 0x000
371+
alpha255 = 255;
372+
}
373+
const hex = getCssHexa(value, alpha255);
367374
color.hex = hex;
368375
rgb = rgb || getRgb(value);
369376
color.rgb = rgb;
@@ -379,18 +386,21 @@ const parse = (raw, _format) => {
379386
return color;
380387
};
381388

382-
const getCssColor = (color, format, noAlpha) => {
389+
const getCssColor = (color, format, disableAlpha) => {
383390
let value;
384391
if (format === 'hex') {
385-
value = `#${getCssHexa(color.value, noAlpha || color.alpha === 1 ? undefined : Math.floor(color.alpha * 255))}`;
392+
value = `#${getCssHexa(
393+
color.value,
394+
disableAlpha || color.alpha === 1 ? undefined : Math.floor(color.alpha * 255),
395+
)}`;
386396
}
387397
return value;
388398
};
389399

390400
let cssColorsTranslated;
391401
let language;
392402

393-
const validateColor = (_color, translate, translateLanguage) => {
403+
const validateColor = (_color, disableAlpha, translate, translateLanguage) => {
394404
let color = _color;
395405
let isTranslated = false;
396406
if (!(_color && _color.format && _color.name)) {
@@ -406,7 +416,7 @@ const validateColor = (_color, translate, translateLanguage) => {
406416
color = cssColorsTranslated[color] || color;
407417
isTranslated = color !== _color;
408418
}
409-
color = parse(color);
419+
color = parse(color, null, disableAlpha);
410420
if (color.name && translate) {
411421
color.translated = translate(color.name);
412422
if (isTranslated && color.translated) {
@@ -420,8 +430,8 @@ const validateColor = (_color, translate, translateLanguage) => {
420430
return color;
421431
};
422432

423-
const getComponents = (_color, format, translate = value => value) => {
424-
const color = validateColor(_color, translate);
433+
const getComponents = (_color, format, disableAlpha, translate = value => value) => {
434+
const color = validateColor(_color, disableAlpha, translate);
425435
const components = {};
426436
if (format === 'rgb') {
427437
components.r = { value: color.rgb[0], format: 'integer', min: 0, max: 255, name: translate('R') };

stories/ColorPicker.stories.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import React, { useState } from 'react';
55
import { action } from '@storybook/addon-actions';
66
import Button from '@material-ui/core/Button';
7-
import { useTheme } from '@material-ui/styles';
7+
// import { useTheme } from '@material-ui/styles';
88
import { ColorPicker, useTranslate } from '../src';
99

1010
import frFR from '../translations/frFR.json';
@@ -37,6 +37,11 @@ Basic.story = {
3737
parameters: { defaultValue: '#000' },
3838
};
3939

40+
export const DisableAlpha = () => <ColorPicker defaultValue="#000" disableAlpha />;
41+
DisableAlpha.story = {
42+
parameters: { defaultValue: '#000', disableAlpha: true },
43+
};
44+
4045
export const Palette = () => (
4146
<div>
4247
<ColorPicker defaultValue="transparent" palette={paletteObj} />
@@ -97,8 +102,8 @@ Controlled.story = {
97102

98103
export const Localization = () => {
99104
const [language, setLanguage] = useState('enUS');
100-
const theme = useTheme();
101-
console.log('theme', theme);
105+
// TODO can't access MUi theme
106+
// const theme = useTheme();
102107
const handleChange = () => {
103108
const newLanguage = language === 'enUS' ? 'frFR' : 'enUS';
104109
setLanguage(newLanguage);
@@ -112,7 +117,7 @@ export const Localization = () => {
112117
useTranslate(() => ({ i18n: { language }, t: translate }));
113118
return (
114119
<div style={style}>
115-
<ColorPicker defaultValue="red" deferred palette={paletteObj} translate={v => translate(v)} />
120+
<ColorPicker defaultValue="#fe0" deferred palette={paletteObj} translate={v => translate(v)} />
116121
<Button variant="outlined" style={{ marginTop: '100px' }} onClick={handleChange}>
117122
{language === 'enUS' ? 'english' : 'français'}
118123
</Button>

0 commit comments

Comments
 (0)