Skip to content

Commit 2649a2a

Browse files
authored
feat(Modal): new light/dark mode colors (#1808)
1 parent 12c7917 commit 2649a2a

12 files changed

+129
-111
lines changed

package-lock.json

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

packages/modals/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"@floating-ui/react-dom": "^2.0.0",
2525
"@zendeskgarden/container-modal": "^1.0.0",
2626
"@zendeskgarden/container-utilities": "^2.0.0",
27+
"@zendeskgarden/react-buttons": "^9.0.0-next.11",
2728
"dom-helpers": "^5.1.0",
2829
"prop-types": "^15.5.7",
2930
"react-merge-refs": "^2.0.0",

packages/modals/src/styled/StyledBackdrop.spec.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
*/
77

88
import React from 'react';
9-
import { render, renderRtl } from 'garden-test-utils';
9+
import { render, renderDark, renderRtl } from 'garden-test-utils';
1010
import { StyledBackdrop } from './StyledBackdrop';
11+
import { rgba } from 'polished';
12+
import { DEFAULT_THEME, PALETTE } from '@zendeskgarden/react-theming';
1113

1214
describe('StyledBackdrop', () => {
1315
it('renders default styling', () => {
@@ -32,4 +34,16 @@ describe('StyledBackdrop', () => {
3234
expect(container.firstChild).toHaveStyleRule('align-items', 'center');
3335
expect(container.firstChild).toHaveStyleRule('justify-content', 'center');
3436
});
37+
38+
describe('backdrop color', () => {
39+
it.each([['light'], ['dark']])('gets the correct %s mode color', mode => {
40+
const renderFn = mode === 'light' ? render : renderDark;
41+
const { container } = renderFn(<StyledBackdrop isCentered />);
42+
43+
expect(container.firstChild).toHaveStyleRule(
44+
'background-color',
45+
rgba(mode === 'light' ? PALETTE.grey[900] : PALETTE.grey[1200], DEFAULT_THEME.opacity[1000])
46+
);
47+
});
48+
});
3549
});

packages/modals/src/styled/StyledBackdrop.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import PropTypes from 'prop-types';
99
import styled, { css, keyframes } from 'styled-components';
10-
import { getColorV8, DEFAULT_THEME, retrieveComponentStyles } from '@zendeskgarden/react-theming';
10+
import { DEFAULT_THEME, retrieveComponentStyles, getColor } from '@zendeskgarden/react-theming';
1111

1212
const COMPONENT_ID = 'modals.backdrop';
1313

@@ -49,7 +49,14 @@ export const StyledBackdrop = styled.div.attrs<IStyledBackdropProps>({
4949
align-items: ${props => props.isCentered && 'center'};
5050
justify-content: ${props => props.isCentered && 'center'};
5151
z-index: 400;
52-
background-color: ${props => getColorV8('neutralHue', 800, props.theme, 0.85)};
52+
background-color: ${({ theme }) =>
53+
getColor({
54+
theme,
55+
hue: 'neutralHue',
56+
transparency: theme.opacity[1000],
57+
light: { shade: 900 },
58+
dark: { shade: 1200 }
59+
})};
5360
overflow: auto;
5461
-webkit-overflow-scrolling: touch; /* [1] */
5562
font-family: ${props => props.theme.fonts.system};

packages/modals/src/styled/StyledBody.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
getLineHeight,
1111
retrieveComponentStyles,
1212
DEFAULT_THEME,
13-
getColorV8
13+
getColor
1414
} from '@zendeskgarden/react-theming';
1515

1616
const COMPONENT_ID = 'modals.body';
@@ -25,7 +25,7 @@ export const StyledBody = styled.div.attrs({
2525
height: 100%;
2626
overflow: auto;
2727
line-height: ${props => getLineHeight(props.theme.lineHeights.md, props.theme.fontSizes.md)};
28-
color: ${props => getColorV8('foreground', 600 /* default shade */, props.theme)};
28+
color: ${({ theme }) => getColor({ theme, variable: 'foreground.default' })};
2929
font-size: ${props => props.theme.fontSizes.md};
3030
${props => retrieveComponentStyles(COMPONENT_ID, props)};
3131
`;

packages/modals/src/styled/StyledClose.spec.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,26 @@
88
import React from 'react';
99
import { render, renderRtl } from 'garden-test-utils';
1010
import { StyledClose } from './StyledClose';
11+
import XStrokeIcon from '@zendeskgarden/svg-icons/src/16/x-stroke.svg';
1112

1213
describe('StyledClose', () => {
1314
it('renders default styling', () => {
14-
const { container } = render(<StyledClose />);
15+
const { container } = render(
16+
<StyledClose>
17+
<XStrokeIcon />
18+
</StyledClose>
19+
);
1520

1621
expect(container.firstChild).toHaveStyleRule('top', '10px');
1722
expect(container.firstChild).toHaveStyleRule('right', '26px');
1823
});
1924

2025
it('renders RTL styling if provided', () => {
21-
const { container } = renderRtl(<StyledClose />);
26+
const { container } = renderRtl(
27+
<StyledClose>
28+
<XStrokeIcon />
29+
</StyledClose>
30+
);
2231

2332
expect(container.firstChild).toHaveStyleRule('top', '10px');
2433
expect(container.firstChild).toHaveStyleRule('left', '26px');

packages/modals/src/styled/StyledClose.ts

Lines changed: 4 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -5,89 +5,26 @@
55
* found at http://www.apache.org/licenses/LICENSE-2.0.
66
*/
77

8-
import styled, { css, DefaultTheme, ThemeProps } from 'styled-components';
9-
import {
10-
getColorV8,
11-
retrieveComponentStyles,
12-
DEFAULT_THEME,
13-
focusStyles
14-
} from '@zendeskgarden/react-theming';
8+
import styled from 'styled-components';
9+
import { retrieveComponentStyles, DEFAULT_THEME } from '@zendeskgarden/react-theming';
10+
import { IconButton } from '@zendeskgarden/react-buttons';
1511

1612
const COMPONENT_ID = 'modals.close';
1713

18-
const colorStyles = (props: ThemeProps<DefaultTheme>) => {
19-
const backgroundColor = 'primaryHue';
20-
const foregroundColor = 'neutralHue';
21-
22-
return css`
23-
background-color: transparent;
24-
color: ${getColorV8(foregroundColor, 600, props.theme)};
25-
26-
&:hover {
27-
background-color: ${getColorV8(backgroundColor, 600, props.theme, 0.08)};
28-
color: ${getColorV8(foregroundColor, 700, props.theme)};
29-
}
30-
31-
${focusStyles({
32-
theme: props.theme,
33-
color: { hue: backgroundColor }
34-
})}
35-
36-
&:active {
37-
/* prettier-ignore */
38-
transition:
39-
background-color 0.1s ease-in-out,
40-
color 0.1s ease-in-out;
41-
background-color: ${getColorV8(backgroundColor, 600, props.theme, 0.2)};
42-
color: ${getColorV8(foregroundColor, 800, props.theme)};
43-
}
44-
`;
45-
};
46-
4714
export const BASE_MULTIPLIERS = {
4815
top: 2.5,
4916
side: 6.5,
5017
size: 10
5118
};
5219

53-
/**
54-
* 1. Remove dotted outline from Firefox on focus.
55-
*/
56-
export const StyledClose = styled.button.attrs({
20+
export const StyledClose = styled(IconButton).attrs({
5721
'data-garden-id': COMPONENT_ID,
5822
'data-garden-version': PACKAGE_VERSION
5923
})`
60-
display: block;
6124
position: absolute;
6225
top: ${props => props.theme.space.base * BASE_MULTIPLIERS.top}px;
6326
${props => (props.theme.rtl ? 'left' : 'right')}: ${props =>
6427
`${props.theme.space.base * BASE_MULTIPLIERS.side}px`};
65-
/* prettier-ignore */
66-
transition:
67-
box-shadow 0.1s ease-in-out,
68-
background-color 0.25s ease-in-out,
69-
color 0.25s ease-in-out;
70-
border: none;
71-
border-radius: 50%;
72-
background-color: transparent;
73-
cursor: pointer;
74-
padding: 0;
75-
width: ${props => props.theme.space.base * BASE_MULTIPLIERS.size}px;
76-
height: ${props => props.theme.space.base * BASE_MULTIPLIERS.size}px;
77-
overflow: hidden;
78-
text-decoration: none;
79-
font-size: 0;
80-
user-select: none;
81-
82-
&::-moz-focus-inner {
83-
border: 0; /* [1] */
84-
}
85-
86-
${props => colorStyles(props)}
87-
88-
& > svg {
89-
vertical-align: middle;
90-
}
9128
9229
${props => retrieveComponentStyles(COMPONENT_ID, props)};
9330
`;

packages/modals/src/styled/StyledDrawerClose.spec.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,26 @@
88
import React from 'react';
99
import { render, renderRtl } from 'garden-test-utils';
1010
import { StyledDrawerClose } from './StyledDrawerClose';
11+
import XStrokeIcon from '@zendeskgarden/svg-icons/src/16/x-stroke.svg';
1112

1213
describe('StyledDrawerClose', () => {
1314
it('renders default styling', () => {
14-
const { container } = render(<StyledDrawerClose />);
15+
const { container } = render(
16+
<StyledDrawerClose>
17+
<XStrokeIcon />
18+
</StyledDrawerClose>
19+
);
1520

1621
expect(container.firstChild).toHaveStyleRule('top', '10px');
1722
expect(container.firstChild).toHaveStyleRule('right', '8px');
1823
});
1924

2025
it('renders RTL styling if provided', () => {
21-
const { container } = renderRtl(<StyledDrawerClose />);
26+
const { container } = renderRtl(
27+
<StyledDrawerClose>
28+
<XStrokeIcon />
29+
</StyledDrawerClose>
30+
);
2231

2332
expect(container.firstChild).toHaveStyleRule('top', '10px');
2433
expect(container.firstChild).toHaveStyleRule('left', '8px');

packages/modals/src/styled/StyledDrawerHeader.spec.tsx

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,29 @@
66
*/
77

88
import React from 'react';
9-
import { render } from 'garden-test-utils';
10-
import { PALETTE_V8 } from '@zendeskgarden/react-theming';
9+
import { render, renderDark } from 'garden-test-utils';
10+
import { PALETTE } from '@zendeskgarden/react-theming';
1111

1212
import { StyledDrawerHeader } from './StyledDrawerHeader';
1313

1414
describe('StyledDrawerHeader', () => {
15-
it('renders default styling', () => {
16-
const { container } = render(<StyledDrawerHeader />);
15+
it.each([['light'], ['dark']])('gets the correct %s mode default color', mode => {
16+
const renderFn = mode === 'light' ? render : renderDark;
17+
const { container } = renderFn(<StyledDrawerHeader />);
1718

18-
expect(container.firstChild).toHaveStyleRule('color', PALETTE_V8.grey[800]);
19+
expect(container.firstChild).toHaveStyleRule(
20+
'color',
21+
mode === 'light' ? PALETTE.grey[900] : PALETTE.grey[300]
22+
);
1923
});
2024

21-
it('renders danger styling if provided', () => {
22-
const { container } = render(<StyledDrawerHeader isDanger />);
25+
it.each([['light'], ['dark']])('gets the correct %s mode danger color', mode => {
26+
const renderFn = mode === 'light' ? render : renderDark;
27+
const { container } = renderFn(<StyledDrawerHeader isDanger />);
2328

24-
expect(container.firstChild).toHaveStyleRule('color', PALETTE_V8.red[600]);
29+
expect(container.firstChild).toHaveStyleRule(
30+
'color',
31+
mode === 'light' ? PALETTE.red[700] : PALETTE.red[400]
32+
);
2533
});
2634
});

packages/modals/src/styled/StyledHeader.spec.tsx

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,29 @@
66
*/
77

88
import React from 'react';
9-
import { PALETTE_V8 } from '@zendeskgarden/react-theming';
10-
import { render } from 'garden-test-utils';
9+
import { PALETTE } from '@zendeskgarden/react-theming';
10+
import { render, renderDark } from 'garden-test-utils';
1111

1212
import { StyledHeader } from './StyledHeader';
1313

1414
describe('StyledHeader', () => {
15-
it('renders default styling', () => {
16-
const { container } = render(<StyledHeader />);
15+
it.each([['light'], ['dark']])('gets the correct %s mode default color', mode => {
16+
const renderFn = mode === 'light' ? render : renderDark;
17+
const { container } = renderFn(<StyledHeader />);
1718

18-
expect(container.firstChild).toHaveStyleRule('color', PALETTE_V8.grey[800]);
19+
expect(container.firstChild).toHaveStyleRule(
20+
'color',
21+
mode === 'light' ? PALETTE.grey[900] : PALETTE.grey[300]
22+
);
1923
});
2024

21-
it('renders danger styling if provided', () => {
22-
const { container } = render(<StyledHeader isDanger />);
25+
it.each([['light'], ['dark']])('gets the correct %s mode danger color', mode => {
26+
const renderFn = mode === 'light' ? render : renderDark;
27+
const { container } = renderFn(<StyledHeader isDanger />);
2328

24-
expect(container.firstChild).toHaveStyleRule('color', PALETTE_V8.red[600]);
29+
expect(container.firstChild).toHaveStyleRule(
30+
'color',
31+
mode === 'light' ? PALETTE.red[700] : PALETTE.red[400]
32+
);
2533
});
2634
});

0 commit comments

Comments
 (0)