Skip to content

Commit

Permalink
Merge pull request #17536 from storybookjs/11984-conditional-controls
Browse files Browse the repository at this point in the history
Controls: Add conditional controls
  • Loading branch information
shilman authored Mar 23, 2022
2 parents 93f50a7 + 1a37df7 commit f968dba
Show file tree
Hide file tree
Showing 47 changed files with 450 additions and 313 deletions.
2 changes: 1 addition & 1 deletion addons/a11y/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
"@storybook/client-logger": "6.5.0-alpha.49",
"@storybook/components": "6.5.0-alpha.49",
"@storybook/core-events": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/theming": "6.5.0-alpha.49",
"axe-core": "^4.2.0",
"core-js": "^3.8.2",
Expand Down
2 changes: 1 addition & 1 deletion addons/actions/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
"@storybook/api": "6.5.0-alpha.49",
"@storybook/components": "6.5.0-alpha.49",
"@storybook/core-events": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/theming": "6.5.0-alpha.49",
"core-js": "^3.8.2",
"fast-deep-equal": "^3.1.3",
Expand Down
2 changes: 1 addition & 1 deletion addons/backgrounds/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
"@storybook/client-logger": "6.5.0-alpha.49",
"@storybook/components": "6.5.0-alpha.49",
"@storybook/core-events": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/theming": "6.5.0-alpha.49",
"core-js": "^3.8.2",
"global": "^4.4.0",
Expand Down
2 changes: 1 addition & 1 deletion addons/controls/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
"@storybook/client-logger": "6.5.0-alpha.49",
"@storybook/components": "6.5.0-alpha.49",
"@storybook/core-common": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/node-logger": "6.5.0-alpha.49",
"@storybook/store": "6.5.0-alpha.49",
"@storybook/theming": "6.5.0-alpha.49",
Expand Down
6 changes: 4 additions & 2 deletions addons/docs/docs/multiframework.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ export interface ArgType {
name?: string;
description?: string;
defaultValue?: any;
addIf?: string;
removeIf?: string;
[key: string]: any;
}

Expand Down Expand Up @@ -106,7 +108,7 @@ The input is the story function and the story context (id, parameters, args, etc

## Dynamic source rendering

With the release of Storybook 6.0, we've improved how stories are rendered in the [Source doc block](https://storybook.js.org/docs/react/writing-docs/doc-blocks#source). One of such improvements is the `dynamic` source type, which renders a snippet based on the output the story function.
With the release of Storybook 6.0, we've improved how stories are rendered in the [Source doc block](https://storybook.js.org/docs/react/writing-docs/doc-blocks#source). One of such improvements is the `dynamic` source type, which renders a snippet based on the output the story function.

This dynamic rendering is framework-specific, meaning it needs a custom implementation for each framework.

Expand Down Expand Up @@ -151,7 +153,7 @@ import { jsxDecorator } from './jsxDecorator';
export const decorators = [jsxDecorator];
```

This configures the `jsxDecorator` to be run on every story.
This configures the `jsxDecorator` to be run on every story.

<div class="aside">
To learn more and see how it's implemented in context, check out <a href="https://github.com/storybookjs/storybook/blob/next/addons/docs/src/frameworks/react/jsxDecorator.tsx">the code</a> .
Expand Down
2 changes: 1 addition & 1 deletion addons/docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@
"@storybook/components": "6.5.0-alpha.49",
"@storybook/core-common": "6.5.0-alpha.49",
"@storybook/core-events": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/docs-tools": "6.5.0-alpha.49",
"@storybook/mdx1-csf": "canary",
"@storybook/node-logger": "6.5.0-alpha.49",
Expand Down
2 changes: 1 addition & 1 deletion addons/interactions/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
"@storybook/components": "6.5.0-alpha.49",
"@storybook/core-common": "6.5.0-alpha.49",
"@storybook/core-events": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/instrumenter": "6.5.0-alpha.49",
"@storybook/theming": "6.5.0-alpha.49",
"core-js": "^3.8.2",
Expand Down
2 changes: 1 addition & 1 deletion addons/links/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
"@storybook/addons": "6.5.0-alpha.49",
"@storybook/client-logger": "6.5.0-alpha.49",
"@storybook/core-events": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/router": "6.5.0-alpha.49",
"@types/qs": "^6.9.5",
"core-js": "^3.8.2",
Expand Down
2 changes: 1 addition & 1 deletion addons/measure/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
"@storybook/client-logger": "6.5.0-alpha.49",
"@storybook/components": "6.5.0-alpha.49",
"@storybook/core-events": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"core-js": "^3.8.2",
"global": "^4.4.0"
},
Expand Down
2 changes: 1 addition & 1 deletion addons/outline/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
"@storybook/client-logger": "6.5.0-alpha.49",
"@storybook/components": "6.5.0-alpha.49",
"@storybook/core-events": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"core-js": "^3.8.2",
"global": "^4.4.0",
"regenerator-runtime": "^0.13.7",
Expand Down
2 changes: 1 addition & 1 deletion addons/storyshots/storyshots-core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
"@storybook/core": "6.5.0-alpha.49",
"@storybook/core-client": "6.5.0-alpha.49",
"@storybook/core-common": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@types/glob": "^7.1.3",
"@types/jest": "^26.0.16",
"@types/jest-specific-snapshot": "^0.5.3",
Expand Down
4 changes: 2 additions & 2 deletions addons/storyshots/storyshots-puppeteer/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,15 @@
},
"dependencies": {
"@axe-core/puppeteer": "^4.2.0",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/node-logger": "6.5.0-alpha.49",
"@types/jest-image-snapshot": "^4.1.3",
"core-js": "^3.8.2",
"jest-image-snapshot": "^4.3.0",
"regenerator-runtime": "^0.13.7"
},
"devDependencies": {
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@types/puppeteer": "^5.4.0"
},
"peerDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion app/angular/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
"@storybook/core": "6.5.0-alpha.49",
"@storybook/core-common": "6.5.0-alpha.49",
"@storybook/core-events": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/docs-tools": "6.5.0-alpha.49",
"@storybook/node-logger": "6.5.0-alpha.49",
"@storybook/semver": "^7.3.2",
Expand Down
2 changes: 1 addition & 1 deletion app/html/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
"@storybook/addons": "6.5.0-alpha.49",
"@storybook/core": "6.5.0-alpha.49",
"@storybook/core-common": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/docs-tools": "6.5.0-alpha.49",
"@storybook/preview-web": "6.5.0-alpha.49",
"@storybook/store": "6.5.0-alpha.49",
Expand Down
2 changes: 1 addition & 1 deletion app/preact/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
"@storybook/addons": "6.5.0-alpha.49",
"@storybook/core": "6.5.0-alpha.49",
"@storybook/core-common": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/store": "6.5.0-alpha.49",
"@types/node": "^14.14.20 || ^16.0.0",
"@types/webpack-env": "^1.16.0",
Expand Down
2 changes: 1 addition & 1 deletion app/react/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
"@storybook/client-logger": "6.5.0-alpha.49",
"@storybook/core": "6.5.0-alpha.49",
"@storybook/core-common": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/docs-tools": "6.5.0-alpha.49",
"@storybook/node-logger": "6.5.0-alpha.49",
"@storybook/react-docgen-typescript-plugin": "1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0",
Expand Down
2 changes: 1 addition & 1 deletion app/server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
"@storybook/client-api": "6.5.0-alpha.49",
"@storybook/core": "6.5.0-alpha.49",
"@storybook/core-common": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/node-logger": "6.5.0-alpha.49",
"@storybook/preview-web": "6.5.0-alpha.49",
"@storybook/store": "6.5.0-alpha.49",
Expand Down
2 changes: 1 addition & 1 deletion app/svelte/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
"@storybook/client-logger": "6.5.0-alpha.49",
"@storybook/core": "6.5.0-alpha.49",
"@storybook/core-common": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/docs-tools": "6.5.0-alpha.49",
"@storybook/node-logger": "6.5.0-alpha.49",
"@storybook/store": "6.5.0-alpha.49",
Expand Down
2 changes: 1 addition & 1 deletion app/vue/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
"@storybook/client-logger": "6.5.0-alpha.49",
"@storybook/core": "6.5.0-alpha.49",
"@storybook/core-common": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/docs-tools": "6.5.0-alpha.49",
"@storybook/store": "6.5.0-alpha.49",
"@types/node": "^14.14.20 || ^16.0.0",
Expand Down
2 changes: 1 addition & 1 deletion app/vue3/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
"@storybook/addons": "6.5.0-alpha.49",
"@storybook/core": "6.5.0-alpha.49",
"@storybook/core-common": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/docs-tools": "6.5.0-alpha.49",
"@storybook/store": "6.5.0-alpha.49",
"@types/node": "^14.14.20 || ^16.0.0",
Expand Down
2 changes: 1 addition & 1 deletion app/web-components/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
"@storybook/client-logger": "6.5.0-alpha.49",
"@storybook/core": "6.5.0-alpha.49",
"@storybook/core-common": "6.5.0-alpha.49",
"@storybook/csf": "0.0.2--canary.87bc651.0",
"@storybook/csf": "0.0.2--canary.507502b.0",
"@storybook/docs-tools": "6.5.0-alpha.49",
"@storybook/preview-web": "6.5.0-alpha.49",
"@storybook/store": "6.5.0-alpha.49",
Expand Down
28 changes: 28 additions & 0 deletions docs/essentials/controls.md
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,34 @@ paths={[

</div>

### Conditional controls

In some cases, it's useful to be able to conditionally exclude a control based on the value of another control. Controls supports basic versions of these use cases with the `addIf` and `removeIf` options, which can take a boolean value, or a string which can refer to the value of another arg.

Consider a collection of "advanced" settings that are only visible when the user toggles an "advanced" toggle.

<!-- prettier-ignore-start -->

<CodeSnippets
paths={[
'common/component-story-conditional-controls-toggle.js.mdx',
]}
/>

<!-- prettier-ignore-end -->

Or consider a constraint where if the user sets one control value, it doesn't make sense for the user to be able to set another value.

<!-- prettier-ignore-start -->

<CodeSnippets
paths={[
'common/component-story-conditional-controls-mutual-exclusion.js.mdx',
]}
/>

<!-- prettier-ignore-end -->

## Hide NoControls warning

If you don't plan to handle the control args inside your Story, you can remove the warning with:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
```js
// Button.stories.js
import { Button } from './Button';
export default {
component: Button,
title: 'Button',
argTypes: {
// button can be passed a label or an image, not both
label: { control: 'text', removeIf: 'image' },
image: {
control: { type: 'select', options: ['foo.jpg', 'bar.jpg'] },
removeIf: 'label',
},
},
};
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
```js
// Button.stories.js
import { Button } from './Button';
export default {
component: Button,
title: 'Button',
argTypes: {
label: { control: 'text' }, // always shows
advanced: { control: 'boolean' },
// below are only included when advanced is true
margin: { control: 'number', addIf: 'advanced' },
padding: { control: 'number', addIf: 'advanced' },
cornerRadius: { control: 'number', addIf: 'advanced' },
},
};
```
8 changes: 4 additions & 4 deletions docs/snippets/common/component-story-disable-controls.js.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import { YourComponent } from './YourComponent';

export default {
/* 👇 The title prop is optional.
* See https://storybook.js.org/docs/react/configure/overview#configure-story-loading
* to learn how to generate automatic titles
*/
* See https://storybook.js.org/docs/react/configure/overview#configure-story-loading
* to learn how to generate automatic titles
*/
title: 'YourComponent',
component: YourComponent,
argTypes: {
Expand All @@ -19,4 +19,4 @@ export default {
},
},
};
```
```
6 changes: 3 additions & 3 deletions docs/snippets/common/component-story-disable-controls.mdx.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ import { YourComponent } from './YourComponent'
title="YourComponent"
component={YourComponent}
argTypes={{
foo:{
table:{
foo: {
table: {
disable: true,
}
}
}} />
```
```
31 changes: 31 additions & 0 deletions examples/official-storybook/stories/addon-controls.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,37 @@ export default {
],
},
},
mutuallyExclusiveA: { control: 'text', removeIf: 'mutuallyExclusiveB' },
mutuallyExclusiveB: { control: 'text', removeIf: 'mutuallyExclusiveA' },
colorMode: {
control: 'boolean',
},
dynamicText: {
removeIf: 'colorMode',
control: 'text',
},
dynamicColor: {
addIf: 'colorMode',
control: 'color',
},
advanced: {
control: 'boolean',
},
margin: {
control: 'number',
addIf: 'advanced',
},
padding: {
control: 'number',
addIf: 'advanced',
},
cornerRadius: {
control: 'number',
addIf: 'advanced',
},
someText: { control: 'text' },
subText: { control: 'text', addIf: 'someText' },
anotherText: { control: 'text', addIf: 'someText' },
},
parameters: {
chromatic: { disable: true },
Expand Down
Loading

0 comments on commit f968dba

Please sign in to comment.