Skip to content

Commit 21cb067

Browse files
ktaborsLFDanLu
andauthored
Adding viewport width to Chromatic stories (#2980)
* adding viewport 320px width stories to chromatic * lint fixes Co-authored-by: Daniel Lu <[email protected]>
1 parent baebf23 commit 21cb067

File tree

7 files changed

+209
-1
lines changed

7 files changed

+209
-1
lines changed

packages/@react-spectrum/dialog/chromatic/Dialog.chromatic.tsx

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ storiesOf('Dialog', module)
4343
'long content',
4444
() => renderLongContent({})
4545
)
46+
.add(
47+
'long content, mobile viewport',
48+
() => renderLongContent({}),
49+
{chromatic: {viewports: [320]}}
50+
)
4651
.add(
4752
'with hero',
4853
() => renderHero({})
@@ -75,6 +80,11 @@ storiesOf('Dialog', module)
7580
'fullscreenTakeover form',
7681
() => renderWithForm({type: 'fullscreenTakeover'})
7782
)
83+
.add(
84+
'fullscreenTakeover form, mobile viewport',
85+
() => renderWithForm({type: 'fullscreenTakeover'}),
86+
{chromatic: {viewports: [320]}}
87+
)
7888
.add(
7989
'three buttons',
8090
() => renderWithThreeButtons({})
@@ -86,8 +96,51 @@ storiesOf('Dialog', module)
8696
.add(
8797
'cleared content',
8898
() => renderWithDividerInContent({})
99+
)
100+
.add(
101+
'tray',
102+
() => renderTriggerProps({type: 'tray'}), {
103+
chromatic: {viewports: [320, 1200]},
104+
chromaticProvider: {colorSchemes: ['light'], locales: ['ar-AE'], scales: ['large'], disableAnimations: true}
105+
}
106+
)
107+
.add(
108+
'popover',
109+
() => renderTriggerProps({type: 'popover'}), {
110+
chromatic: {viewports: [320, 1200]},
111+
chromaticProvider: {colorSchemes: ['light'], locales: ['ar-AE'], scales: ['large'], disableAnimations: true}
112+
}
113+
)
114+
.add(
115+
'mobileType fullscreen, modal',
116+
() => renderTriggerProps({type: 'modal', mobileType: 'fullscreen'}), {
117+
chromatic: {viewports: [320, 1200]},
118+
chromaticProvider: {colorSchemes: ['light'], locales: ['ar-AE'], scales: ['large'], disableAnimations: true}
119+
}
120+
)
121+
.add(
122+
'mobileType fullscreenTakeover, modal',
123+
() => renderTriggerProps({type: 'modal', mobileType: 'fullscreenTakeover'}), {
124+
chromatic: {viewports: [320, 1200]},
125+
chromaticProvider: {colorSchemes: ['light'], locales: ['ar-AE'], scales: ['large'], disableAnimations: true}
126+
}
127+
)
128+
.add(
129+
'mobileType: modal, popover',
130+
() => renderTriggerProps({type: 'popover', mobileType: 'modal'}), {
131+
chromatic: {viewports: [320, 1200]},
132+
chromaticProvider: {colorSchemes: ['light'], locales: ['ar-AE'], scales: ['large'], disableAnimations: true}
133+
}
134+
)
135+
.add(
136+
'mobileType: tray, popover',
137+
() => renderTriggerProps({type: 'popover', mobileType: 'tray'}), {
138+
chromatic: {viewports: [320, 1200]},
139+
chromaticProvider: {colorSchemes: ['light'], locales: ['ar-AE'], scales: ['large'], disableAnimations: true}
140+
}
89141
);
90142

143+
91144
storiesOf('Dialog/Alert', module)
92145
.addParameters({chromaticProvider: {colorSchemes: ['light'], locales: ['en-US'], scales: ['medium'], disableAnimations: true}})
93146
.add(
@@ -223,6 +276,29 @@ function render({width = 'auto', isDismissable = undefined, ...props}) {
223276
);
224277
}
225278

279+
function renderTriggerProps({width = 'auto', isDismissable = undefined, ...triggerProps}) {
280+
return (
281+
<div style={{display: 'flex', width, margin: '100px 0'}}>
282+
<DialogTrigger isDismissable={isDismissable} defaultOpen {...triggerProps}>
283+
<ActionButton>Trigger</ActionButton>
284+
{(close) => (
285+
<Dialog>
286+
<Heading>The Heading</Heading>
287+
<Header>The Header</Header>
288+
<Divider />
289+
<Content>{singleParagraph()}</Content>
290+
{!isDismissable &&
291+
<ButtonGroup>
292+
<Button variant="secondary" onPress={close}>Cancel</Button>
293+
<Button variant="cta" onPress={close}>Confirm</Button>
294+
</ButtonGroup>}
295+
</Dialog>
296+
)}
297+
</DialogTrigger>
298+
</div>
299+
);
300+
}
301+
226302
function renderHero({width = 'auto', isDismissable = undefined, ...props}) {
227303
return (
228304
<div style={{display: 'flex', width, margin: '100px 0'}}>

packages/@react-spectrum/menu/chromatic/MenuTrigger.chromatic.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,13 @@ WithSections.storyName = 'with sections';
169169
export const Complex = TemplateWithIcons().bind({});
170170
Complex.storyName = 'complex items';
171171

172+
export const ComplexMobile = TemplateWithIcons().bind({});
173+
ComplexMobile.storyName = 'complex items, mobile viewport';
174+
ComplexMobile.parameters = {
175+
chromatic: {viewports: [320]},
176+
chromaticProvider: {colorSchemes: ['light'], locales: ['en-US'], scales: ['large'], disableAnimations: true}
177+
};
178+
172179
export const AlignEnd = Template().bind({});
173180
AlignEnd.storyName = 'align="end"';
174181
AlignEnd.args = {align: 'end'};

packages/@react-spectrum/menu/chromatic/MenuTriggerRTL.chromatic.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
* governing permissions and limitations under the License.
1111
*/
1212

13+
import {ComplexMobile} from './MenuTrigger.chromatic';
1314
import {Meta} from '@storybook/react';
1415
import React from 'react';
1516

@@ -42,3 +43,10 @@ export {
4243
DirectionRightEnd,
4344
ArabicComplex
4445
} from './MenuTrigger.chromatic';
46+
47+
export const ComplexItemsMobileViewport = ComplexMobile.bind({});
48+
ComplexItemsMobileViewport.storyName = 'complex items, mobile viewport';
49+
ComplexItemsMobileViewport.parameters = {
50+
chromatic: {viewports: [320]},
51+
chromaticProvider: {colorSchemes: ['light'], locales: ['ar-AE'], scales: ['large'], disableAnimations: true}
52+
};

packages/@react-spectrum/numberfield/chromatic/NumberField.chromatic.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,17 @@ const Template: Story<SpectrumNumberFieldProps> = (args) => (
113113
</Grid>
114114
);
115115

116+
const TemplateVertical: Story<SpectrumNumberFieldProps> = (args) => (
117+
<Grid autoFlow="row" gap="size-300">
118+
{combinations.map(c => {
119+
let key = Object.keys(c).map(k => shortName(k, c[k])).join(' ');
120+
if (!key) {
121+
key = 'empty';
122+
}
123+
return <NumberField key={key} {...args} {...c} label={args['aria-label'] ? undefined : key} />;
124+
})}
125+
</Grid>
126+
);
116127

117128
const TemplateSmall: Story<SpectrumNumberFieldProps> = (args) => (
118129
<Grid columns={repeat(4, '1fr')} autoFlow="row" gap="size-200">
@@ -147,6 +158,14 @@ export const PropValue = Template.bind({});
147158
PropValue.storyName = 'value';
148159
PropValue.args = {...PropDefaults.args, value: 10};
149160

161+
export const PropValueMobileViewport = TemplateVertical.bind({});
162+
PropValueMobileViewport.storyName = 'value, mobile viewport';
163+
PropValueMobileViewport.args = {...PropDefaults.args, value: 10};
164+
PropValueMobileViewport.parameters = {
165+
chromatic: {viewports: [320]},
166+
chromaticProvider: {colorSchemes: ['light'], locales: ['en-US'], scales: ['large'], disableAnimations: true}
167+
};
168+
150169
export const PropAriaLabelled = Template.bind({});
151170
PropAriaLabelled.storyName = 'aria-label';
152171
PropAriaLabelled.args = {'aria-label': 'Label'};

packages/@react-spectrum/picker/chromatic/Picker.chromatic.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ const ComplexItemsTemplate = <T extends object>(): Story<SpectrumPickerProps<T>>
8585
</Picker>
8686
);
8787

88-
8988
export const Default = Template().bind({});
9089
Default.args = {label: 'Pick your favorite', isOpen: true};
9190

@@ -107,3 +106,10 @@ ValidationStateValid.args = {...Default.args, validationState: 'valid'};
107106

108107
export const ComplexItems = ComplexItemsTemplate().bind({});
109108
ComplexItems.args = {...Default.args};
109+
110+
export const ComplexItemsLabelPositionSideValidationStateInvalidMobileViewport = ComplexItemsTemplate().bind({});
111+
ComplexItemsLabelPositionSideValidationStateInvalidMobileViewport.args = {...Default.args, labelPosition: 'side', validationState: 'invalid'};
112+
ComplexItemsLabelPositionSideValidationStateInvalidMobileViewport.parameters = {
113+
chromatic: {viewports: [320]},
114+
chromaticProvider: {colorSchemes: ['light'], locales: ['ar-AE'], scales: ['large'], disableAnimations: true}
115+
};

packages/@react-spectrum/provider/chromatic/Provider.chromatic.tsx

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import {SearchField} from '@react-spectrum/searchfield';
2929
import {SearchWithin} from '@react-spectrum/searchwithin';
3030
import {Switch} from '@react-spectrum/switch';
3131
import {TextField} from '@react-spectrum/textfield';
32+
import {useBreakpoint} from '@react-spectrum/utils';
3233

3334
const THEME = {
3435
light: customTheme,
@@ -107,6 +108,75 @@ const NestedPropTemplate = (): Story<ProviderProps> => () => (
107108
</Provider>
108109
);
109110

111+
const ResponsiveStyleTemplate = (): Story<ProviderProps> => () => (
112+
<Provider>
113+
<div>
114+
<TextField
115+
label="A text field"
116+
placeholder="Something"
117+
width={{base: 'size-800', S: 'size-1000', M: 'size-2000', L: 'size-3000'}} />
118+
</div>
119+
<Button
120+
isHidden={{base: false, S: false, M: false, L: true}}
121+
marginTop={{base: 'size-100', M: 'size-1000'}}
122+
variant="primary" >
123+
This button is hidden in large display.
124+
</Button>
125+
</Provider>
126+
);
127+
128+
const CustomResponsivStylePropsTemplate = (): Story<ProviderProps> => () => {
129+
let Breakpoint = () => {
130+
let {matchedBreakpoints} = useBreakpoint();
131+
let breakpoint = matchedBreakpoints[0];
132+
let width = {base: 'size-1600', XS: 'size-2000', S: 'size-2400', M: 'size-3000', L: 'size-3400', XL: 'size-4600', XXL: 'size-6000'};
133+
return (
134+
<>
135+
<Button
136+
variant="primary"
137+
width={width} >
138+
Button with {breakpoint} breakpoint.
139+
</Button>
140+
<div>
141+
width: {width[breakpoint]}
142+
</div>
143+
</>
144+
);
145+
};
146+
return (
147+
<Provider
148+
breakpoints={{S: 480, M: 640, L: 1024}}
149+
UNSAFE_style={{padding: 50}}>
150+
<Breakpoint />
151+
</Provider>
152+
);
153+
};
154+
155+
const BreakpointOmittedTemplate = (): Story<ProviderProps> => () => {
156+
let Breakpoint = () => {
157+
let {matchedBreakpoints} = useBreakpoint();
158+
let breakpoint = matchedBreakpoints[0];
159+
let width = {base: 'size-1600', S: 'size-2400', L: 'size-3400'};
160+
return (
161+
<>
162+
<p>
163+
button's width will be S: 'size-2400' at M viewport.
164+
</p>
165+
<Button
166+
variant="primary"
167+
width={width} >
168+
Button with {breakpoint} breakpoint.
169+
</Button>
170+
</>
171+
);
172+
};
173+
return (
174+
<Provider UNSAFE_style={{padding: 50}}>
175+
<Breakpoint />
176+
</Provider>
177+
);
178+
};
179+
110180
export const Default = Template().bind({});
111181
Default.storyName = 'default';
112182
Default.args = {};
@@ -146,3 +216,22 @@ ReadOnly.args = {isReadOnly: true};
146216
export const Required = Template().bind({});
147217
Required.storyName = 'isRequired';
148218
Required.args = {isRequired: true};
219+
220+
export const ResponsiveStyle = ResponsiveStyleTemplate().bind({});
221+
ResponsiveStyle.parameters = {
222+
chromatic: {viewports: [320, 700, 1000, 1200, 1300]},
223+
chromaticProvider: {colorSchemes: ['light'], locales: ['en-US'], scales: ['large'], disableAnimations: true}
224+
};
225+
226+
export const CustomResponsivStyleProps = CustomResponsivStylePropsTemplate().bind({});
227+
CustomResponsivStyleProps.storyNname = 'custom responsive styleProps';
228+
CustomResponsivStyleProps.parameters = {
229+
chromatic: {viewports: [320, 600, 1000, 1200, 1300, 1600]},
230+
chromaticProvider: {colorSchemes: ['light'], locales: ['en-US'], scales: ['large'], disableAnimations: true}
231+
};
232+
233+
export const BreakpointOmitted = BreakpointOmittedTemplate().bind({});
234+
BreakpointOmitted.parameters = {
235+
chromatic: {viewports: [320, 1000, 1200]},
236+
chromaticProvider: {colorSchemes: ['light'], locales: ['en-US'], scales: ['large'], disableAnimations: true}
237+
};

packages/@react-spectrum/tabs/chromatic/Tabs.chromatic.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ const Template = <T extends object>(): Story<SpectrumTabsProps<T>> => (args) =>
7979
export const Default = Template().bind({});
8080
Default.args = {};
8181

82+
export const DefaultMobileViewport = Template().bind({});
83+
DefaultMobileViewport.parameters = {chromatic: {viewports: [320]}};
84+
8285
export const Quiet = Template().bind({});
8386
Quiet.args = {...Default.args, isQuiet: true};
8487

0 commit comments

Comments
 (0)