Skip to content

Commit 4e0bd70

Browse files
apennellsapegin
authored andcommitted
New: Modifier to add whitespace between example components (#1456, fixes #841)
Let users to be able to add padding between example components without adding manual styling to their example code. This adds the `padded` modifier option to the Playground that adds padding between each example component in that block. ```jsx padded <Button>Push Me</Button> <Button>Click Me</Button> <Button>Tap Me</Button> ```
1 parent aaf0471 commit 4e0bd70

File tree

6 files changed

+60
-5
lines changed

6 files changed

+60
-5
lines changed

docs/Documenting.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,14 @@ Styleguidist will look for any `Readme.md` or `ComponentName.md` files in the co
7070
<Button>I’m transparent!</Button>
7171
```
7272

73+
Or add padding between examples in a block by passing the `padded` modifier:
74+
75+
```jsx padded
76+
<Button>Push Me</Button>
77+
<Button>Click Me</Button>
78+
<Button>Tap Me</Button>
79+
```
80+
7381
Or disable an editor by passing a `noeditor` modifier:
7482

7583
```jsx noeditor

examples/basic/src/components/Button/Button.css

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,6 @@
1414
cursor: default;
1515
}
1616

17-
.button + .button {
18-
margin-left: 8px;
19-
}
20-
2117
.checks {
2218
background-image: linear-gradient(45deg, #f5f5f5 25%, transparent 25%),
2319
linear-gradient(-45deg, #f5f5f5 25%, transparent 25%),

examples/basic/src/components/Button/Readme.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,14 @@ Fenced code blocks with `js`, `jsx` or `javascript` languages are rendered as a
2020
<Button>Push Me</Button>
2121
```
2222

23+
Add padding between examples in a block by passing a `padded` modifier (` ```jsx padded `):
24+
25+
```jsx padded
26+
<Button>Push Me</Button>
27+
<Button>Click Me</Button>
28+
<Button>Tap Me</Button>
29+
```
30+
2331
You can add a custom props to an example wrapper (` ```js { "props": { "className": "checks" } } `):
2432

2533
```js { "props": { "className": "checks" } }

src/client/rsg-components/Playground/Playground.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ class Playground extends Component {
7676
<PlaygroundRenderer
7777
name={name}
7878
exampleIndex={index}
79+
padded={!!settings.padded}
7980
preview={preview}
8081
previewProps={settings.props || {}}
8182
tabButtons={

src/client/rsg-components/Playground/Playground.spec.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,29 @@ it('showcode option in example settings should overwrite style guide config opti
112112

113113
expect(queryByRole('textbox')).not.toBeInTheDocument();
114114
});
115+
116+
it('should not include padded class if padded option is not passed in example settings', () => {
117+
const { getByTestId } = render(
118+
<Provider>
119+
<Playground {...defaultProps} settings={{ padded: false }} />
120+
</Provider>
121+
);
122+
123+
expect(getByTestId('preview-wrapper')).not.toHaveAttribute(
124+
'class',
125+
expect.stringContaining('rsg--padded-')
126+
);
127+
});
128+
129+
it('should include padded class if padded option is passed in example settings', () => {
130+
const { getByTestId } = render(
131+
<Provider>
132+
<Playground {...defaultProps} settings={{ padded: true }} />
133+
</Provider>
134+
);
135+
136+
expect(getByTestId('preview-wrapper')).toHaveAttribute(
137+
'class',
138+
expect.stringContaining('rsg--padded-')
139+
);
140+
});

src/client/rsg-components/Playground/PlaygroundRenderer.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,37 @@ export const styles = ({ space, color, borderRadius }) => ({
2424
marginLeft: 'auto',
2525
},
2626
tab: {}, // expose className to allow using it in 'styles' settings
27+
padded: {
28+
// add padding between each example element rendered
29+
'& > *': {
30+
isolate: false,
31+
marginLeft: -space[1],
32+
marginRight: -space[1],
33+
'& > *': {
34+
isolate: false,
35+
marginRight: space[1],
36+
marginLeft: space[1],
37+
},
38+
},
39+
},
2740
});
2841

2942
export function PlaygroundRenderer({
3043
classes,
3144
exampleIndex,
3245
name,
46+
padded,
3347
preview,
3448
previewProps,
3549
tabButtons,
3650
tabBody,
3751
toolbar,
3852
}) {
3953
const { className, ...props } = previewProps;
54+
const previewClasses = cx(classes.preview, className, { [classes.padded]: padded });
4055
return (
4156
<div className={classes.root} data-testid={`${name}-example-${exampleIndex}`}>
42-
<div className={cx(classes.preview, className)} {...props} data-preview={name}>
57+
<div className={previewClasses} {...props} data-preview={name} data-testid="preview-wrapper">
4358
{preview}
4459
</div>
4560
<div className={classes.controls}>
@@ -55,6 +70,7 @@ PlaygroundRenderer.propTypes = {
5570
classes: PropTypes.object.isRequired,
5671
exampleIndex: PropTypes.number.isRequired,
5772
name: PropTypes.string.isRequired,
73+
padded: PropTypes.bool.isRequired,
5874
preview: PropTypes.node.isRequired,
5975
previewProps: PropTypes.object.isRequired,
6076
tabButtons: PropTypes.node.isRequired,

0 commit comments

Comments
 (0)