Skip to content

Commit 81f3793

Browse files
authored
[Columns] Refactor gap to use getResponsiveProps util (#7761)
### WHY are these changes introduced? Resolves #7749. Refactors the `Columns` `gap` prop to use the `getResponsiveProps` util. Also refactors `gap` so that it accepts a single string value or an object with different values at varying breakpoints. <!-- Context about the problem that’s being addressed. --> ### WHAT is this pull request doing? Updates `Columns` to use `getResponsiveProps` util. Also updates tests, storybook examples, and the style guide. <!-- ℹ️ Delete the following for small / trivial changes --> ### How to 🎩 **[Storybook](https://5d559397bae39100201eedc1-egzpnipkkn.chromatic.com/?path=/story/all-components-columns--default).** 🖥 [Local development instructions](https://github.com/Shopify/polaris/blob/main/README.md#local-development) 🗒 [General tophatting guidelines](https://github.com/Shopify/polaris/blob/main/documentation/Tophatting.md) 📄 [Changelog guidelines](https://github.com/Shopify/polaris/blob/main/.github/CONTRIBUTING.md#changelog) ### 🎩 checklist - [x] Tested on [mobile](https://github.com/Shopify/polaris/blob/main/documentation/Tophatting.md#cross-browser-testing) - [x] Tested on [multiple browsers](https://help.shopify.com/en/manual/shopify-admin/supported-browsers) - [ ] Tested for [accessibility](https://github.com/Shopify/polaris/blob/main/documentation/Accessibility%20testing.md) - [ ] Updated the component's `README.md` with documentation changes - [x] [Tophatted documentation](https://github.com/Shopify/polaris/blob/main/documentation/Tophatting%20documentation.md) changes in the style guide
1 parent 167791e commit 81f3793

File tree

6 files changed

+1378
-1357
lines changed

6 files changed

+1378
-1357
lines changed

.changeset/light-mirrors-act.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'@shopify/polaris': patch
3+
'polaris.shopify.com': patch
4+
---
5+
6+
Refactored `Columns` `gap` to use `getResponsiveProps` util
Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,29 @@
11
@import '../../styles/common';
22

33
.Columns {
4+
@include responsive-props('columns', 'gap', 'gap');
5+
46
--pc-columns-xs: 6;
57
--pc-columns-sm: var(--pc-columns-xs);
68
--pc-columns-md: var(--pc-columns-sm);
79
--pc-columns-lg: var(--pc-columns-md);
810
--pc-columns-xl: var(--pc-columns-lg);
9-
--pc-columns-gap-xs: var(--p-space-4);
10-
--pc-columns-gap-sm: var(--pc-columns-gap-xs);
11-
--pc-columns-gap-md: var(--pc-columns-gap-sm);
12-
--pc-columns-gap-lg: var(--pc-columns-gap-md);
13-
--pc-columns-gap-xl: var(--pc-columns-gap-lg);
1411
display: grid;
15-
gap: var(--pc-columns-gap-xs);
1612
grid-template-columns: var(--pc-columns-xs);
1713

1814
@media #{$p-breakpoints-sm-up} {
19-
gap: var(--pc-columns-gap-sm);
2015
grid-template-columns: var(--pc-columns-sm);
2116
}
2217

2318
@media #{$p-breakpoints-md-up} {
24-
gap: var(--pc-columns-gap-md);
2519
grid-template-columns: var(--pc-columns-md);
2620
}
2721

2822
@media #{$p-breakpoints-lg-up} {
29-
gap: var(--pc-columns-gap-lg);
3023
grid-template-columns: var(--pc-columns-lg);
3124
}
3225

3326
@media #{$p-breakpoints-xl-up} {
34-
gap: var(--pc-columns-gap-xl);
3527
grid-template-columns: var(--pc-columns-xl);
3628
}
3729
}

polaris-react/src/components/Columns/Columns.stories.tsx

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export default {
77
component: Columns,
88
} as ComponentMeta<typeof Columns>;
99

10-
export function BasicColumns() {
10+
export function Default() {
1111
return (
1212
<Page fullWidth>
1313
<Columns>
@@ -22,7 +22,7 @@ export function BasicColumns() {
2222
);
2323
}
2424

25-
export function ColumnsWithTemplateColumns() {
25+
export function WithTemplateColumns() {
2626
return (
2727
<Page fullWidth>
2828
<Columns
@@ -32,7 +32,6 @@ export function ColumnsWithTemplateColumns() {
3232
md: '1fr 3fr auto 1fr',
3333
lg: '1fr 4fr auto 2fr 3fr auto',
3434
}}
35-
gap={{xs: '4'}}
3635
>
3736
<div style={{background: 'aquamarine'}}>Column one</div>
3837
<div style={{background: 'aquamarine'}}>Column two</div>
@@ -45,7 +44,7 @@ export function ColumnsWithTemplateColumns() {
4544
);
4645
}
4746

48-
export function ColumnsWithMixedPropTypes() {
47+
export function WithMixedPropTypes() {
4948
return (
5049
<Page fullWidth>
5150
<Columns
@@ -63,12 +62,24 @@ export function ColumnsWithMixedPropTypes() {
6362
);
6463
}
6564

66-
export function ColumnsWithVaryingGap() {
65+
export function WithGap() {
66+
return (
67+
<Page fullWidth>
68+
<Columns columns={{xs: 3}} gap="5">
69+
<div style={{background: 'aquamarine'}}>Column one</div>
70+
<div style={{background: 'aquamarine'}}>Column two</div>
71+
<div style={{background: 'aquamarine'}}>Column three</div>
72+
</Columns>
73+
</Page>
74+
);
75+
}
76+
77+
export function WithResponsiveGap() {
6778
return (
6879
<Page fullWidth>
6980
<Columns
7081
columns={{xs: 3}}
71-
gap={{xs: '025', sm: '05', md: '1', lg: '2', xl: '4'}}
82+
gap={{xs: '025', sm: '4', md: '6', lg: '8', xl: '10'}}
7283
>
7384
<div style={{background: 'aquamarine'}}>Column one</div>
7485
<div style={{background: 'aquamarine'}}>Column two</div>
@@ -78,7 +89,7 @@ export function ColumnsWithVaryingGap() {
7889
);
7990
}
8091

81-
export function ColumnsWithFreeAndFixedWidths() {
92+
export function WithFreeAndFixedWidths() {
8293
return (
8394
<Page fullWidth>
8495
<Columns columns={{xs: '1fr auto auto'}} gap={{xs: '05'}}>

polaris-react/src/components/Columns/Columns.tsx

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,44 @@ import type {
44
SpacingSpaceScale,
55
} from '@shopify/polaris-tokens';
66

7-
import {sanitizeCustomProperties} from '../../utilities/css';
7+
import {
8+
getResponsiveProps,
9+
sanitizeCustomProperties,
10+
} from '../../utilities/css';
11+
import type {ResponsiveProp} from '../../utilities/css';
812

913
import styles from './Columns.scss';
1014

1115
type Columns = {
1216
[Breakpoint in BreakpointsAlias]?: number | string;
1317
};
1418

15-
type Gap = {
16-
[Breakpoint in BreakpointsAlias]?: SpacingSpaceScale;
17-
};
19+
type Gap = ResponsiveProp<SpacingSpaceScale>;
1820

1921
export interface ColumnsProps {
20-
/** The spacing between columns
21-
* @default '4'
22-
*/
23-
gap?: Gap;
22+
/** Elements to display inside columns */
23+
children?: React.ReactNode;
2424
/** The number of columns to display
2525
* @default {xs: 6, sm: 6, md: 6, lg: 6, xl: 6}
2626
*/
2727
columns?: Columns;
28-
/** Elements to display inside columns */
29-
children?: React.ReactNode;
28+
/** The spacing between columns. Accepts a spacing token or an object of spacing tokens for different screen sizes.
29+
* @default '4'
30+
* @example
31+
* gap='2'
32+
* gap={{xs: '1', sm: '2', md: '3', lg: '4', xl: '5'}}
33+
*/
34+
gap?: Gap;
3035
}
3136

32-
export function Columns({columns, children, gap}: ColumnsProps) {
37+
export function Columns({children, columns, gap = '4'}: ColumnsProps) {
3338
const style = {
3439
'--pc-columns-xs': formatColumns(columns?.xs || 6),
3540
'--pc-columns-sm': formatColumns(columns?.sm),
3641
'--pc-columns-md': formatColumns(columns?.md),
3742
'--pc-columns-lg': formatColumns(columns?.lg),
3843
'--pc-columns-xl': formatColumns(columns?.xl),
39-
'--pc-columns-gap-xs': gap?.xs ? `var(--p-space-${gap?.xs})` : undefined,
40-
'--pc-columns-gap-sm': gap?.sm ? `var(--p-space-${gap?.sm})` : undefined,
41-
'--pc-columns-gap-md': gap?.md ? `var(--p-space-${gap?.md})` : undefined,
42-
'--pc-columns-gap-lg': gap?.lg ? `var(--p-space-${gap?.lg})` : undefined,
43-
'--pc-columns-gap-xl': gap?.xl ? `var(--p-space-${gap?.xl})` : undefined,
44+
...getResponsiveProps('columns', 'gap', 'space', gap),
4445
} as React.CSSProperties;
4546

4647
return (

polaris-react/src/components/Columns/tests/Columns.test.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ import {mountWithApp} from 'tests/utilities';
44
import {Columns} from '..';
55

66
describe('Columns', () => {
7-
it('does not render custom properties by default', () => {
7+
it('renders custom properties with default values', () => {
88
const columns = mountWithApp(<Columns />);
99

1010
expect(columns).toContainReactComponent('div', {
1111
style: {
1212
'--pc-columns-xs': 'repeat(6, minmax(0, 1fr))',
13+
'--pc-columns-gap-xs': 'var(--p-space-4)',
1314
} as React.CSSProperties,
1415
});
1516
});
@@ -34,6 +35,7 @@ describe('Columns', () => {
3435
style: {
3536
'--pc-columns-xs': '1fr 1fr',
3637
'--pc-columns-lg': '1.5fr 0.5fr',
38+
'--pc-columns-gap-xs': 'var(--p-space-4)',
3739
} as React.CSSProperties,
3840
});
3941
});
@@ -45,6 +47,7 @@ describe('Columns', () => {
4547
style: {
4648
'--pc-columns-xs': 'repeat(1, minmax(0, 1fr))',
4749
'--pc-columns-md': 'repeat(4, minmax(0, 1fr))',
50+
'--pc-columns-gap-xs': 'var(--p-space-4)',
4851
} as React.CSSProperties,
4952
});
5053
});

0 commit comments

Comments
 (0)