From c757c8def9df65353cde125c99230b0d33dc03ff Mon Sep 17 00:00:00 2001 From: Nathan Arthur Date: Fri, 9 Jun 2017 09:51:31 -0400 Subject: [PATCH 01/43] Fix display of large components Add CSS to allow for oversized components to scroll in all directions. See [issue #1225](https://github.com/storybooks/storybook/issues/1225#issuecomment-307259951). --- addons/centered/src/index.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/addons/centered/src/index.js b/addons/centered/src/index.js index 2761bdfa615..63aa501b866 100644 --- a/addons/centered/src/index.js +++ b/addons/centered/src/index.js @@ -9,8 +9,13 @@ const style = { display: 'flex', alignItems: 'center', justifyContent: 'center', + overflow: 'auto', }; -export default function(storyFn) { - return
{storyFn()}
; +const innerStyle = { + margin: 'auto', +} + +export default function(storyFn) { + return
{storyFn()}
; } From c360601e35e7538d155110207d86907ad46e27a8 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Fri, 30 Jun 2017 18:37:27 +0000 Subject: [PATCH 02/43] chore(package): update danger to version 1.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 076b0be0e40..3becee50624 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "babel-preset-stage-0": "^6.24.1", "chalk": "^1.1.3", "codecov": "^2.2.0", - "danger": "^0.21.0", + "danger": "^1.0.0", "enzyme": "^2.8.2", "eslint": "^3.19.0", "eslint-config-airbnb": "^15.0.1", From a11cbed827e7f8624d34c573af3bd9769baa8f39 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Wed, 5 Jul 2017 10:56:18 +0000 Subject: [PATCH 03/43] chore(package): update husky to version 0.14.3 Closes #1340 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 076b0be0e40..c3a73f43343 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "eslint-plugin-react": "^7.0.1", "gh-pages": "^1.0.0", "github-release-from-changelog": "^1.2.1", - "husky": "^0.13.4", + "husky": "^0.14.3", "jest": "^20.0.4", "jest-enzyme": "^3.2.0", "lerna": "2.0.0-rc.5", From b3d79a5edae9a8883882040eeee6769f3c18a613 Mon Sep 17 00:00:00 2001 From: Tom Cunningham Date: Wed, 5 Jul 2017 12:02:30 -0500 Subject: [PATCH 04/43] Verify that name is a string in addons/actions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It appears that it’s possible that `name` can be passed in as an object. In order for the `replace` method to work, name must be a string. This pull request adds a condition to the `fnName` constant that verifies the value of `name` is a string. --- addons/actions/src/preview.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/actions/src/preview.js b/addons/actions/src/preview.js index 7eece2d95cb..fa722f3effe 100644 --- a/addons/actions/src/preview.js +++ b/addons/actions/src/preview.js @@ -30,7 +30,7 @@ export function action(name) { // the same. // // Ref: https://bocoup.com/weblog/whats-in-a-function-name - const fnName = name ? name.replace(/\W+/g, '_') : 'action'; + const fnName = name && typeof name === 'string' ? name.replace(/\W+/g, '_') : 'action'; // eslint-disable-next-line no-eval const named = eval(`(function ${fnName}() { return handler.apply(this, arguments) })`); return named; From f6e4c1167f1e1ff0a8b136c1000a2969d1d5d0cd Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Thu, 6 Jul 2017 01:39:33 -0700 Subject: [PATCH 05/43] v3.2.0-alpha.7 --- addons/actions/package.json | 2 +- addons/knobs/package.json | 2 +- addons/storyshots/package.json | 6 +++--- app/react-native/package.json | 6 +++--- app/react/package.json | 6 +++--- lerna.json | 5 +++-- lib/ui/package.json | 2 +- 7 files changed, 15 insertions(+), 14 deletions(-) diff --git a/addons/actions/package.json b/addons/actions/package.json index 534ced050c1..a3f0d64017f 100644 --- a/addons/actions/package.json +++ b/addons/actions/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-actions", - "version": "3.1.6", + "version": "3.2.0-alpha.7", "description": "Action Logger addon for storybook", "keywords": [ "storybook" diff --git a/addons/knobs/package.json b/addons/knobs/package.json index 54a85cf920d..3769785eb9d 100644 --- a/addons/knobs/package.json +++ b/addons/knobs/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-knobs", - "version": "3.2.0-alpha.5", + "version": "3.2.0-alpha.7", "description": "Storybook Addon Prop Editor Component", "license": "MIT", "main": "dist/index.js", diff --git a/addons/storyshots/package.json b/addons/storyshots/package.json index 0bec738d32f..e066b92c25c 100644 --- a/addons/storyshots/package.json +++ b/addons/storyshots/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-storyshots", - "version": "3.2.0-alpha.5", + "version": "3.2.0-alpha.7", "description": "StoryShots is a Jest Snapshot Testing Addon for Storybook.", "license": "MIT", "main": "dist/index.js", @@ -22,7 +22,7 @@ "devDependencies": { "@storybook/addons": "^3.1.6", "@storybook/channels": "^3.1.6", - "@storybook/react": "^3.2.0-alpha.5", + "@storybook/react": "^3.2.0-alpha.7", "babel-cli": "^6.24.1", "babel-plugin-transform-runtime": "^6.23.0", "babel-preset-es2015": "^6.24.1", @@ -33,7 +33,7 @@ "peerDependencies": { "@storybook/addons": "^3.1.6", "@storybook/channels": "^3.1.6", - "@storybook/react": "^3.2.0-alpha.5", + "@storybook/react": "^3.2.0-alpha.7", "babel-core": "^6.24.1", "react": "*", "react-test-renderer": "*" diff --git a/app/react-native/package.json b/app/react-native/package.json index 4f9bf8b5666..44d730da883 100644 --- a/app/react-native/package.json +++ b/app/react-native/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-native", - "version": "3.2.0-alpha.5", + "version": "3.2.0-alpha.7", "description": "A better way to develop React Native Components for your app", "keywords": [ "react", @@ -24,11 +24,11 @@ "prepublish": "node ../../scripts/prepublish.js" }, "dependencies": { - "@storybook/addon-actions": "^3.1.6", + "@storybook/addon-actions": "^3.2.0-alpha.7", "@storybook/addon-links": "^3.2.0-alpha.5", "@storybook/addons": "^3.1.6", "@storybook/channel-websocket": "^3.1.6", - "@storybook/ui": "^3.2.0-alpha.5", + "@storybook/ui": "^3.2.0-alpha.7", "autoprefixer": "^7.0.1", "babel-core": "^6.24.1", "babel-loader": "^7.0.0", diff --git a/app/react/package.json b/app/react/package.json index daa7f7205ff..764f72fba87 100644 --- a/app/react/package.json +++ b/app/react/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react", - "version": "3.2.0-alpha.5", + "version": "3.2.0-alpha.7", "description": "Storybook for React: Develop React Component in isolation with Hot Reloading.", "homepage": "https://github.com/storybooks/storybook/tree/master/apps/react", "bugs": { @@ -22,11 +22,11 @@ "prepublish": "node ../../scripts/prepublish.js" }, "dependencies": { - "@storybook/addon-actions": "^3.1.6", + "@storybook/addon-actions": "^3.2.0-alpha.7", "@storybook/addon-links": "^3.2.0-alpha.5", "@storybook/addons": "^3.1.6", "@storybook/channel-postmessage": "^3.1.6", - "@storybook/ui": "^3.2.0-alpha.5", + "@storybook/ui": "^3.2.0-alpha.7", "airbnb-js-shims": "^1.1.1", "autoprefixer": "^7.1.1", "babel-core": "^6.24.1", diff --git a/lerna.json b/lerna.json index bd8c50a77d6..0aed3b368e4 100644 --- a/lerna.json +++ b/lerna.json @@ -13,7 +13,8 @@ "test-cra", "react-native-vanilla", "vue-example", - "@storybook/components" + "@storybook/components", + "@storybook/vue" ] } }, @@ -24,5 +25,5 @@ "examples/*" ], "concurrency": 1, - "version": "3.2.0-alpha.5" + "version": "3.2.0-alpha.7" } diff --git a/lib/ui/package.json b/lib/ui/package.json index 89f8585fa46..3263144ea0f 100644 --- a/lib/ui/package.json +++ b/lib/ui/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/ui", - "version": "3.2.0-alpha.5", + "version": "3.2.0-alpha.7", "description": "Core Storybook UI", "license": "MIT", "main": "dist/index.js", From fbc665f24cec033e93a5e26e575d839c117b1472 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Thu, 6 Jul 2017 01:59:39 -0700 Subject: [PATCH 06/43] v3.2.0-alpha.7 --- app/vue/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/vue/package.json b/app/vue/package.json index 487b01693e0..a43afacecce 100644 --- a/app/vue/package.json +++ b/app/vue/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/vue", - "version": "3.2.0-alpha.6", + "version": "3.2.0-alpha.7", "description": "Storybook for Vue: Develop Vue Component in isolation with Hot Reloading.", "homepage": "https://github.com/storybooks/storybook/tree/master/apps/vue", "bugs": { From f2a02e7c9c9d448856fe2b2d298da33a7237fcb6 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Thu, 6 Jul 2017 02:14:55 -0700 Subject: [PATCH 07/43] v3.1.8 --- CHANGELOG.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 17b384aa433..34df28e74f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,22 @@ +# 3.1.8 + +2017-July-06 + +#### Documentation + +- Updated addon knob readme. [#1406](https://github.com/storybooks/storybook/pull/1406) +- Add a FAQ entry for shared config with next [#1390](https://github.com/storybooks/storybook/pull/1390) +- Documented webpack customization example for typescript [#1386](https://github.com/storybooks/storybook/pull/1386) + +#### Maintenance + +- Removed empty array, since webpack 2 doesn't support them anymore. [#1381](https://github.com/storybooks/storybook/pull/1381) + +#### Dependency Upgrades + +- Support webpack 3.0.0 [#1410](https://github.com/storybooks/storybook/pull/1410) +- Update react inspector to fix #1385 [#1408](https://github.com/storybooks/storybook/pull/1408) + # 3.1.7 2017-June-28 From b0df780525e48bd372891b1232f15ed518ca8a98 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Thu, 6 Jul 2017 02:17:29 -0700 Subject: [PATCH 08/43] v3.1.8 --- addons/actions/package.json | 2 +- addons/knobs/package.json | 2 +- addons/storyshots/package.json | 6 +++--- app/react-native/package.json | 4 ++-- app/react/package.json | 4 ++-- lerna.json | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/addons/actions/package.json b/addons/actions/package.json index 534ced050c1..3e0c43141ac 100644 --- a/addons/actions/package.json +++ b/addons/actions/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-actions", - "version": "3.1.6", + "version": "3.1.8", "description": "Action Logger addon for storybook", "keywords": [ "storybook" diff --git a/addons/knobs/package.json b/addons/knobs/package.json index 2d96b76ae03..c9bfc91ae8b 100644 --- a/addons/knobs/package.json +++ b/addons/knobs/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-knobs", - "version": "3.1.6", + "version": "3.1.8", "description": "Storybook Addon Prop Editor Component", "license": "MIT", "main": "dist/index.js", diff --git a/addons/storyshots/package.json b/addons/storyshots/package.json index 7ec747b0e0e..630d79c9fca 100644 --- a/addons/storyshots/package.json +++ b/addons/storyshots/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/addon-storyshots", - "version": "3.1.7", + "version": "3.1.8", "description": "StoryShots is a Jest Snapshot Testing Addon for Storybook.", "license": "MIT", "main": "dist/index.js", @@ -22,7 +22,7 @@ "devDependencies": { "@storybook/addons": "^3.1.6", "@storybook/channels": "^3.1.6", - "@storybook/react": "^3.1.7", + "@storybook/react": "^3.1.8", "babel-cli": "^6.24.1", "babel-plugin-transform-runtime": "^6.23.0", "babel-preset-es2015": "^6.24.1", @@ -33,7 +33,7 @@ "peerDependencies": { "@storybook/addons": "^3.1.6", "@storybook/channels": "^3.1.6", - "@storybook/react": "^3.1.7", + "@storybook/react": "^3.1.8", "babel-core": "^6.24.1", "react": "*", "react-test-renderer": "*" diff --git a/app/react-native/package.json b/app/react-native/package.json index fdf0a0b2ea7..753dfc8bc55 100644 --- a/app/react-native/package.json +++ b/app/react-native/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react-native", - "version": "3.1.6", + "version": "3.1.8", "description": "A better way to develop React Native Components for your app", "keywords": [ "react", @@ -24,7 +24,7 @@ "prepublish": "node ../../scripts/prepublish.js" }, "dependencies": { - "@storybook/addon-actions": "^3.1.6", + "@storybook/addon-actions": "^3.1.8", "@storybook/addon-links": "^3.1.6", "@storybook/addons": "^3.1.6", "@storybook/channel-websocket": "^3.1.6", diff --git a/app/react/package.json b/app/react/package.json index 63d51076790..25b0123e034 100644 --- a/app/react/package.json +++ b/app/react/package.json @@ -1,6 +1,6 @@ { "name": "@storybook/react", - "version": "3.1.7", + "version": "3.1.8", "description": "Storybook for React: Develop React Component in isolation with Hot Reloading.", "homepage": "https://github.com/storybooks/storybook/tree/master/apps/react", "bugs": { @@ -22,7 +22,7 @@ "prepublish": "node ../../scripts/prepublish.js" }, "dependencies": { - "@storybook/addon-actions": "^3.1.6", + "@storybook/addon-actions": "^3.1.8", "@storybook/addon-links": "^3.1.6", "@storybook/addons": "^3.1.6", "@storybook/channel-postmessage": "^3.1.6", diff --git a/lerna.json b/lerna.json index 2ff3ed4575d..468a77e140b 100644 --- a/lerna.json +++ b/lerna.json @@ -23,5 +23,5 @@ "examples/*" ], "concurrency": 1, - "version": "3.1.7" + "version": "3.1.8" } From 6896df34080673a4ea586171ba526273025555c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Ra=CC=88dlinger?= Date: Thu, 6 Jul 2017 11:29:34 +0200 Subject: [PATCH 09/43] refine docs about loading stories dynamically for react-native --- docs/pages/basics/writing-stories/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/pages/basics/writing-stories/index.md b/docs/pages/basics/writing-stories/index.md index 63f0b05e3d4..82a231090bf 100644 --- a/docs/pages/basics/writing-stories/index.md +++ b/docs/pages/basics/writing-stories/index.md @@ -65,6 +65,8 @@ configure(loadStories, module); Here we use Webpack's [require.context](https://webpack.github.io/docs/context.html#require-context) to load modules dynamically. Have a look at the relevant Webpack [docs](https://webpack.github.io/docs/context.html#require-context) to learn more about how to use require.context. +The **React Native** packager resolves all the imports at build-time, so it's not possible to load modules dynamically. If you don't want to import all your stories manually you can use [react-native-storybook-loader](https://github.com/elderfo/react-native-storybook-loader) to automatically create the import statements for all of your stories. + ## Using Decorators A decorator is a way to wrap a story with a common set of component(s). Let's say you want to center all your stories. Here is how we can do this with a decorator: From 1678a31f157df131c78f09372224386fe3020609 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Thu, 6 Jul 2017 02:50:58 -0700 Subject: [PATCH 10/43] Update story shots docs and fix a typo in the API --- addons/storyshots/README.md | 6 +++--- addons/storyshots/src/index.js | 4 ++-- .../pages/testing/structural-testing/index.md | 21 ++++++++----------- 3 files changed, 14 insertions(+), 17 deletions(-) diff --git a/addons/storyshots/README.md b/addons/storyshots/README.md index 3f9c2a3f716..a110dd6cceb 100644 --- a/addons/storyshots/README.md +++ b/addons/storyshots/README.md @@ -68,15 +68,15 @@ initStoryshots({ }); ``` -### `suit` +### `suite` -By default, Storyshots groups stories inside a Jest test suit called "Storyshots". You could change it like this: +By default, Storyshots groups stories inside a Jest test suite called "Storyshots". You could change it like this: ```js import initStoryshots from '@storybook/addon-storyshots'; initStoryshots({ - suit: 'MyStoryshots' + suite: 'MyStoryshots' }); ``` diff --git a/addons/storyshots/src/index.js b/addons/storyshots/src/index.js index cdca24c81f1..5c4385fb398 100644 --- a/addons/storyshots/src/index.js +++ b/addons/storyshots/src/index.js @@ -56,7 +56,7 @@ export default function testStorySnapshots(options = {}) { throw new Error('testStorySnapshots is intended only to be used inside jest'); } - const suit = options.suit || 'Storyshots'; + const suite = options.suite || options.suit || 'Storyshots'; const stories = storybook.getStorybook(); // Added not to break existing storyshots configs (can be removed in a future major release) @@ -72,7 +72,7 @@ export default function testStorySnapshots(options = {}) { continue; } - describe(suit, () => { + describe(suite, () => { describe(group.kind, () => { // eslint-disable-next-line for (const story of group.stories) { diff --git a/docs/pages/testing/structural-testing/index.md b/docs/pages/testing/structural-testing/index.md index 3a9018332ed..131077b9650 100644 --- a/docs/pages/testing/structural-testing/index.md +++ b/docs/pages/testing/structural-testing/index.md @@ -34,31 +34,28 @@ Then, install StoryShots into your app with: npm i -D @storybook/addon-storyshots ``` -Then, add the following NPM script into your package.json: +Then, assuming you are using Jest for testing, you can create a test file `storyshots.test.js` that contains the following: -```json -{ - "scripts": { - "test-storybook": "storyshots" - } -} +```js +import initStoryshots from '@storybook/addon-storyshots'; + +initStoryshots({ /* configuration options */ }); ``` -Now you can run the above command with: +Now you can snapshot test all of your stories with: ```sh -npm run test-storybook +npm test ``` This will save the initial set of snapshots inside your Storybook config directory. ![StoryShots First](../static/storyshots-first-run.png) -After you complete any changes, you can run the above NPM script again and find our structural changes. +After you complete any changes, you can run the test again and find all structural changes. ![StoryShots Diff View](../static/storyshots-diff-view.png) * * * -StoryShots also comes with a few important [productive features](https://github.com/storybooks/storybook/tree/master/addons/storyshots#key-features) that can be customized. -Have a look at the StoryShots [repo](https://github.com/storybooks/storybook/tree/master/addons/storyshots) for more information. +StoryShots also comes with a variety of customization options. Have a look at the StoryShots [repo](https://github.com/storybooks/storybook/tree/master/addons/storyshots) for more information. From febca3f095024aabfe7d9d966b784d977e2ebc08 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Thu, 6 Jul 2017 02:54:30 -0700 Subject: [PATCH 11/43] Add a comment to rationalize the typo --- addons/storyshots/src/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/storyshots/src/index.js b/addons/storyshots/src/index.js index 5c4385fb398..6bd2614cb89 100644 --- a/addons/storyshots/src/index.js +++ b/addons/storyshots/src/index.js @@ -56,6 +56,7 @@ export default function testStorySnapshots(options = {}) { throw new Error('testStorySnapshots is intended only to be used inside jest'); } + // NOTE: keep `suit` typo for backwards compatibility const suite = options.suite || options.suit || 'Storyshots'; const stories = storybook.getStorybook(); From 0040d7186a00845f8306abc9f42028c42e846497 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Thu, 6 Jul 2017 09:25:10 -0700 Subject: [PATCH 12/43] Update coursera example link --- docs/pages/examples/_examples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pages/examples/_examples.yml b/docs/pages/examples/_examples.yml index 6f2a59323a3..2cd0fa05a2f 100644 --- a/docs/pages/examples/_examples.yml +++ b/docs/pages/examples/_examples.yml @@ -29,7 +29,7 @@ coursera: thumbnail: ./thumbnails/coursera-ui.png title: Coursera description: Coursera UI component library - demo: https://building.coursera.org/ui/ + demo: https://webedx-spark.github.io/coursera-ui/ artsy: thumbnail: ./thumbnails/artsy.png title: Artsy Force From e870759e1e867afefa56886cc42f63abf5bb5658 Mon Sep 17 00:00:00 2001 From: "greenkeeper[bot]" Date: Thu, 6 Jul 2017 17:10:45 +0000 Subject: [PATCH 13/43] chore(package): update lerna to version 2.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 076b0be0e40..824c960b28c 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "husky": "^0.13.4", "jest": "^20.0.4", "jest-enzyme": "^3.2.0", - "lerna": "2.0.0-rc.5", + "lerna": "2.0.0", "lint-staged": "^4.0.0", "markdown-it-anchor": "^4.0.0", "markdownlint-cli": "^0.3.1", From e34cf1999e4e44232db4c6c051a1f9c4413c3077 Mon Sep 17 00:00:00 2001 From: igor Date: Fri, 7 Jul 2017 11:05:53 +0300 Subject: [PATCH 14/43] Add keyboard accessibility to stories tree --- .../left_panel/stories_tree/index.js | 13 ++- .../stories_tree/tree_decorators.js | 82 ++++++++++++------- 2 files changed, 62 insertions(+), 33 deletions(-) diff --git a/lib/ui/src/modules/ui/components/left_panel/stories_tree/index.js b/lib/ui/src/modules/ui/components/left_panel/stories_tree/index.js index 88b34694743..bf238de67b1 100644 --- a/lib/ui/src/modules/ui/components/left_panel/stories_tree/index.js +++ b/lib/ui/src/modules/ui/components/left_panel/stories_tree/index.js @@ -3,10 +3,11 @@ import PropTypes from 'prop-types'; import React from 'react'; import deepEqual from 'deep-equal'; import treeNodeTypes from './tree_node_type'; -import treeDecorators from './tree_decorators'; +import createTreeDecorators from './tree_decorators'; import treeStyle from './tree_style'; const namespaceSeparator = '@'; +const keyCodeEnter = 13; function createNodeKey({ namespaces, type }) { return [...namespaces, [type]].join(namespaceSeparator); @@ -39,12 +40,14 @@ class Stories extends React.Component { constructor(...args) { super(...args); this.onToggle = this.onToggle.bind(this); + this.onKeyDown = this.onKeyDown.bind(this); const { selectedHierarchy } = this.props; this.state = { nodes: getSelectedNodes(selectedHierarchy), }; + this.treeDecorators = createTreeDecorators(this); } componentWillReceiveProps(nextProps) { @@ -82,6 +85,12 @@ class Stories extends React.Component { })); } + onKeyDown(event, node) { + if (event.keyCode === keyCodeEnter) { + this.onToggle(node, !node.toggled); + } + } + fireOnKind(kind) { const { onSelectStory } = this.props; if (onSelectStory) onSelectStory(kind, null); @@ -144,7 +153,7 @@ class Stories extends React.Component { style={treeStyle} data={data} onToggle={this.onToggle} - decorators={treeDecorators} + decorators={this.treeDecorators} /> ); } diff --git a/lib/ui/src/modules/ui/components/left_panel/stories_tree/tree_decorators.js b/lib/ui/src/modules/ui/components/left_panel/stories_tree/tree_decorators.js index b228a7e5df7..25d7901f946 100644 --- a/lib/ui/src/modules/ui/components/left_panel/stories_tree/tree_decorators.js +++ b/lib/ui/src/modules/ui/components/left_panel/stories_tree/tree_decorators.js @@ -34,41 +34,61 @@ ContainerDecorator.propTypes = { }).isRequired, }; -function HeaderDecorator(props) { - const { style, node } = props; +function createHeaderDecoratorScope(parent) { + class HeaderDecorator extends React.Component { + constructor(...args) { + super(...args); + this.onKeyDown = this.onKeyDown.bind(this); + } - const newStyleTitle = { - ...style.title, - }; + onKeyDown(event) { + const { onKeyDown } = parent; + const { node } = this.props; - const Icon = iconsMap[node.type]; + onKeyDown(event, node); + } - if (!node.children || !node.children.length) { - newStyleTitle.fontSize = '13px'; + render() { + const { style, node } = this.props; + + const newStyleTitle = { + ...style.title, + }; + + const Icon = iconsMap[node.type]; + + if (!node.children || !node.children.length) { + newStyleTitle.fontSize = '13px'; + } + + return ( +
+ {Icon && } + + {node.name} + +
+ ); + } } - return ( -
- {Icon && } - - {node.name} - -
- ); + HeaderDecorator.propTypes = { + style: PropTypes.shape({ + title: PropTypes.object, + base: PropTypes.object, + }).isRequired, + node: PropTypes.shape({ + name: PropTypes.string, + }).isRequired, + }; + + return HeaderDecorator; } -HeaderDecorator.propTypes = { - style: PropTypes.shape({ - title: PropTypes.object, - base: PropTypes.object, - }).isRequired, - node: PropTypes.shape({ - name: PropTypes.string, - }).isRequired, -}; - -export default { - ...decorators, - Header: HeaderDecorator, - Container: ContainerDecorator, -}; +export default function(parent) { + return { + ...decorators, + Header: createHeaderDecoratorScope(parent), + Container: ContainerDecorator, + }; +} From 760a75225628cda77e526b139d3d3f9668f01a89 Mon Sep 17 00:00:00 2001 From: igor Date: Fri, 7 Jul 2017 21:10:17 +0300 Subject: [PATCH 15/43] Fix long story name word-breaking --- .../ui/components/left_panel/stories_tree/tree_style.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/ui/src/modules/ui/components/left_panel/stories_tree/tree_style.js b/lib/ui/src/modules/ui/components/left_panel/stories_tree/tree_style.js index e3698c4a169..7c20af54ec1 100644 --- a/lib/ui/src/modules/ui/components/left_panel/stories_tree/tree_style.js +++ b/lib/ui/src/modules/ui/components/left_panel/stories_tree/tree_style.js @@ -1,5 +1,7 @@ import { baseFonts } from '../../theme'; +const toggleWidth = '24px'; + export default { tree: { base: { @@ -30,7 +32,7 @@ export default { verticalAlign: 'top', marginLeft: '-5px', height: '24px', - width: '24px', + width: toggleWidth, }, wrapper: { position: 'absolute', @@ -49,6 +51,7 @@ export default { base: { display: 'inline-block', verticalAlign: 'top', + maxWidth: `calc(100% - ${toggleWidth})`, }, connector: { width: '2px', From de858e58993120df60fc29d27d66afeb47e0505c Mon Sep 17 00:00:00 2001 From: igor Date: Sat, 8 Jul 2017 00:04:40 +0300 Subject: [PATCH 16/43] Add test for pressing enter on story --- .../left_panel/stories_tree/index.test.js | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/lib/ui/src/modules/ui/components/left_panel/stories_tree/index.test.js b/lib/ui/src/modules/ui/components/left_panel/stories_tree/index.test.js index 14aef342047..ffcca452097 100644 --- a/lib/ui/src/modules/ui/components/left_panel/stories_tree/index.test.js +++ b/lib/ui/src/modules/ui/components/left_panel/stories_tree/index.test.js @@ -313,5 +313,46 @@ describe('manager.ui.components.left_panel.stories', () => { expect(onSelectStory).toHaveBeenCalledWith('another.space.20', 'b2'); }); + + test('should call the onSelectStory prop when a story is selected with enter key', () => { + const data = createHierarchy( + [ + { kind: 'some.name.item1', stories: ['a1', 'a2'] }, + { kind: 'another.space.20', stories: ['b1', 'b2'] }, + ], + '\\.' + ); + + const onSelectStory = jest.fn(); + const wrap = mount( + + ); + + wrap + .find('a') + .filterWhere(el => el.text() === 'another') + .last() + .simulate('keyDown', { keyCode: 13 }); + + wrap + .find('a') + .filterWhere(el => el.text() === 'space') + .last() + .simulate('keyDown', { keyCode: 13 }); + + wrap + .find('a') + .filterWhere(el => el.text() === '20') + .last() + .simulate('keyDown', { keyCode: 13 }); + + expect(onSelectStory).toHaveBeenCalledWith('another.space.20', null); + }); }); }); From c390802d3996f732f17cbe11b0c17686b6ab6ccf Mon Sep 17 00:00:00 2001 From: Jack Hurley Date: Sat, 8 Jul 2017 16:50:08 +1000 Subject: [PATCH 17/43] Implement filtering on story-level --- .../src/modules/ui/containers/left_panel.js | 9 +++++-- lib/ui/src/modules/ui/libs/filters.js | 22 +++++++++++++---- lib/ui/src/modules/ui/libs/filters.test.js | 24 +++++++++++++++++++ 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/lib/ui/src/modules/ui/containers/left_panel.js b/lib/ui/src/modules/ui/containers/left_panel.js index 3ee95809c24..3f3dc11bfd8 100755 --- a/lib/ui/src/modules/ui/containers/left_panel.js +++ b/lib/ui/src/modules/ui/containers/left_panel.js @@ -8,9 +8,14 @@ export const mapper = (state, props, { actions }) => { const actionMap = actions(); const { stories, selectedKind, selectedStory, uiOptions, storyFilter } = state; const { name, url, sortStoriesByKind, hierarchySeparator } = uiOptions; - const filteredStores = filters.storyFilter(stories, storyFilter, selectedKind, sortStoriesByKind); + const filteredStories = filters.storyFilter( + stories, + storyFilter, + selectedKind, + sortStoriesByKind + ); - const storiesHierarchy = createHierarchy(filteredStores, hierarchySeparator); + const storiesHierarchy = createHierarchy(filteredStories, hierarchySeparator); const selectedHierarchy = resolveStoryHierarchy(selectedKind, hierarchySeparator); const data = { diff --git a/lib/ui/src/modules/ui/libs/filters.js b/lib/ui/src/modules/ui/libs/filters.js index 79d2ef7e9ea..d7e48b876de 100755 --- a/lib/ui/src/modules/ui/libs/filters.js +++ b/lib/ui/src/modules/ui/libs/filters.js @@ -12,10 +12,24 @@ export function storyFilter(stories, filter, selectedKind, sortStoriesByKind) { const sorted = sort(stories, sortStoriesByKind); if (!filter) return sorted; - return sorted.filter(kindInfo => { - if (kindInfo.kind === selectedKind) return true; + return sorted.reduce((acc, kindInfo) => { + // Don't filter out currently selected filter + if (kindInfo.kind === selectedKind) return acc.concat(kindInfo); const needle = filter.toLocaleLowerCase(); const hstack = kindInfo.kind.toLocaleLowerCase(); - return fuzzysearch(needle, hstack); - }); + + // If a match is found in the story hierachy structure return kindInfo + if (fuzzysearch(needle, hstack)) return acc.concat(kindInfo); + + // Now search at individual story level and filter results + const matchedStories = kindInfo.stories.filter(story => fuzzysearch(needle, story)); + + if (matchedStories.length) + return acc.concat({ + kind: kindInfo.kind, + stories: matchedStories, + }); + + return acc; + }, []); } diff --git a/lib/ui/src/modules/ui/libs/filters.test.js b/lib/ui/src/modules/ui/libs/filters.test.js index 638776289b2..d15d256ed9a 100755 --- a/lib/ui/src/modules/ui/libs/filters.test.js +++ b/lib/ui/src/modules/ui/libs/filters.test.js @@ -54,5 +54,29 @@ describe('manager.ui.libs.filters', () => { expect(res).toEqual([stories[1], stories[2], stories[0]]); }); + + test('should filter on story level', () => { + const stories = [ + { kind: 'aa', stories: ['bb'] }, + { kind: 'cc', stories: ['dd'] }, + { kind: 'ee', stories: ['ff'] }, + ]; + const selectedKind = 'aa'; + const res = storyFilter(stories, 'ff', selectedKind); + + expect(res).toEqual([stories[0], stories[2]]); + }); + + test('should filter out unmatched stories at lowest level', () => { + const stories = [ + { kind: 'aa', stories: ['bb'] }, + { kind: 'cc', stories: ['dd'] }, + { kind: 'ee', stories: ['ff', 'gg'] }, + ]; + const selectedKind = 'aa'; + const res = storyFilter(stories, 'ff', selectedKind); + + expect(res).toEqual([stories[0], { kind: 'ee', stories: ['ff'] }]); + }); }); }); From a1a0d147b561f4ba5d5f08ca72a8f8b326e4891b Mon Sep 17 00:00:00 2001 From: Jack Hurley Date: Sat, 8 Jul 2017 20:38:30 +1000 Subject: [PATCH 18/43] Update filtering to be case-insensitive at story level --- lib/ui/src/modules/ui/libs/filters.js | 6 ++++-- lib/ui/src/modules/ui/libs/filters.test.js | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/ui/src/modules/ui/libs/filters.js b/lib/ui/src/modules/ui/libs/filters.js index d7e48b876de..cc327758b81 100755 --- a/lib/ui/src/modules/ui/libs/filters.js +++ b/lib/ui/src/modules/ui/libs/filters.js @@ -11,7 +11,6 @@ export function storyFilter(stories, filter, selectedKind, sortStoriesByKind) { if (!stories) return null; const sorted = sort(stories, sortStoriesByKind); if (!filter) return sorted; - return sorted.reduce((acc, kindInfo) => { // Don't filter out currently selected filter if (kindInfo.kind === selectedKind) return acc.concat(kindInfo); @@ -22,7 +21,10 @@ export function storyFilter(stories, filter, selectedKind, sortStoriesByKind) { if (fuzzysearch(needle, hstack)) return acc.concat(kindInfo); // Now search at individual story level and filter results - const matchedStories = kindInfo.stories.filter(story => fuzzysearch(needle, story)); + const matchedStories = kindInfo.stories.filter(story => { + const storyHstack = story.toLocaleLowerCase(); + return fuzzysearch(needle, storyHstack); + }); if (matchedStories.length) return acc.concat({ diff --git a/lib/ui/src/modules/ui/libs/filters.test.js b/lib/ui/src/modules/ui/libs/filters.test.js index d15d256ed9a..abfe36c2134 100755 --- a/lib/ui/src/modules/ui/libs/filters.test.js +++ b/lib/ui/src/modules/ui/libs/filters.test.js @@ -78,5 +78,21 @@ describe('manager.ui.libs.filters', () => { expect(res).toEqual([stories[0], { kind: 'ee', stories: ['ff'] }]); }); + + test('should be case insensitive at tree level', () => { + const stories = [{ kind: 'aA', stories: ['bb'] }, { kind: 'cc', stories: ['dd'] }]; + const selectedKind = 'aA'; + const res = storyFilter(stories, 'aa', selectedKind); + + expect(res).toEqual([stories[0]]); + }); + + test('should be case insensitive at story level', () => { + const stories = [{ kind: 'aa', stories: ['bb'] }, { kind: 'cc', stories: ['dd', 'eE'] }]; + const selectedKind = 'aa'; + const res = storyFilter(stories, 'ee', selectedKind); + + expect(res).toEqual([stories[0], { kind: 'cc', stories: ['eE'] }]); + }); }); }); From c331251fcb9388d79a0e78a8944026bee3606e05 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Sat, 8 Jul 2017 08:05:01 -0700 Subject: [PATCH 19/43] Update cra-kitchen-sink package versions for 3.2-alpha --- examples/cra-kitchen-sink/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/cra-kitchen-sink/package.json b/examples/cra-kitchen-sink/package.json index 16d651f5b69..e3b872617f1 100644 --- a/examples/cra-kitchen-sink/package.json +++ b/examples/cra-kitchen-sink/package.json @@ -19,17 +19,17 @@ "uuid": "^3.0.1" }, "devDependencies": { - "@storybook/addon-actions": "^3.0.0", + "@storybook/addon-actions": "3.2.0-alpha.7", "@storybook/addon-centered": "^3.0.0", "@storybook/addon-events": "^3.0.0", - "@storybook/addon-knobs": "3.2.0-alpha.5", + "@storybook/addon-knobs": "3.2.0-alpha.7", "@storybook/addon-info": "^3.0.0", "@storybook/addon-links": "3.2.0-alpha.5", "@storybook/addon-notes": "3.2.0-alpha.5", "@storybook/addon-options": "3.2.0-alpha.5", - "@storybook/addon-storyshots": "3.2.0-alpha.5", + "@storybook/addon-storyshots": "3.2.0-alpha.7", "@storybook/addons": "^3.0.0", - "@storybook/react": "3.2.0-alpha.5", + "@storybook/react": "3.2.0-alpha.7", "react-scripts": "1.0.1" }, "private": true From 15540df990c47d9e92ac3051d3ef4e1567d58bbb Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Sat, 8 Jul 2017 22:57:21 +0200 Subject: [PATCH 20/43] CHANGE indentation rule eslint (prettier) --- .eslintrc.js | 1 + .../src/components/ActionLogger/index.js | 14 ++++++-- addons/centered/src/index.js | 10 ++++-- .../manager/components/CommentItem/index.js | 12 +++++-- .../manager/components/CommentsPanel/index.js | 4 ++- addons/events/src/components/Event.js | 4 ++- addons/info/src/components/Node.js | 16 ++++++--- addons/info/src/components/PropTable.js | 25 ++++++++----- addons/info/src/components/PropVal.js | 34 ++++++++++++++---- addons/info/src/components/Props.js | 16 +++++++-- addons/info/src/components/Story.js | 16 ++++++--- addons/info/src/components/markdown/code.js | 12 +++++-- addons/info/src/components/markdown/htags.js | 36 +++++++++++++++---- addons/info/src/components/markdown/text.js | 18 ++++++++-- addons/knobs/src/components/Panel.js | 4 ++- addons/knobs/src/components/types/Select.js | 6 +++- .../src/manager/components/PreviewHelp.js | 28 ++++++--------- app/react/src/client/preview/error_display.js | 4 ++- docs/components/Docs/Content/index.js | 4 ++- docs/components/Docs/Nav/dropdown.js | 12 +++++-- docs/components/Docs/Nav/index.js | 13 ++++--- docs/components/Footer/index.js | 6 +--- docs/components/Grid/GridItem/index.js | 20 ++++++++--- docs/components/Homepage/Featured/index.js | 4 ++- docs/components/Homepage/MainLinks/index.js | 36 ++++++++++++++----- docs/components/Homepage/Platforms/index.js | 7 ++-- docs/html.js | 4 ++- docs/wrappers/md.jsx | 4 ++- .../cra-kitchen-sink/src/stories/Logger.js | 8 +++-- .../cra-kitchen-sink/src/stories/index.js | 22 +++++++++--- .../storybook/stories/index.js | 6 +++- .../template/storybook/stories/index.js | 6 +++- .../template/storybook/stories/index.js | 6 +++- .../modules/ui/components/down_panel/index.js | 20 ++++++----- .../src/modules/ui/components/layout/index.js | 4 ++- .../ui/components/left_panel/header.js | 8 +++-- .../modules/ui/components/shortcuts_help.js | 18 ++++++++-- 37 files changed, 342 insertions(+), 126 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 27d5285d1af..72362a1964b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -53,6 +53,7 @@ module.exports = { ], 'import/prefer-default-export': ignore, 'react/jsx-wrap-multilines': ignore, + 'react/jsx-indent': ignore, 'react/jsx-indent-props': ignore, 'react/jsx-closing-bracket-location': ignore, 'react/jsx-uses-react': error, diff --git a/addons/actions/src/components/ActionLogger/index.js b/addons/actions/src/components/ActionLogger/index.js index 76de8f0f477..1f0b0ad7296 100644 --- a/addons/actions/src/components/ActionLogger/index.js +++ b/addons/actions/src/components/ActionLogger/index.js @@ -9,7 +9,11 @@ class ActionLogger extends Component { } renderAction(action) { - const counter =
{action.count}
; + const counter = ( +
+ {action.count} +
+ ); return (
@@ -29,8 +33,12 @@ class ActionLogger extends Component { render() { return (
-
{this.getActionData()}
- +
+          {this.getActionData()}
+        
+
); } diff --git a/addons/centered/src/index.js b/addons/centered/src/index.js index 63aa501b866..093fbdcff4d 100644 --- a/addons/centered/src/index.js +++ b/addons/centered/src/index.js @@ -14,8 +14,14 @@ const style = { const innerStyle = { margin: 'auto', -} +}; export default function(storyFn) { - return
{storyFn()}
; + return ( +
+
+ {storyFn()} +
+
+ ); } diff --git a/addons/comments/src/manager/components/CommentItem/index.js b/addons/comments/src/manager/components/CommentItem/index.js index 70b7f8202e3..8a6244a3f26 100644 --- a/addons/comments/src/manager/components/CommentItem/index.js +++ b/addons/comments/src/manager/components/CommentItem/index.js @@ -59,10 +59,16 @@ export default class CommentItem extends Component {
- {comment.user.name} - {time} + + {comment.user.name} + + + {time} +
- {body} + + {body} + {showDelete ? this.renderDelete() : null}
diff --git a/addons/comments/src/manager/components/CommentsPanel/index.js b/addons/comments/src/manager/components/CommentsPanel/index.js index 25f44415eec..c438bb19fb4 100644 --- a/addons/comments/src/manager/components/CommentsPanel/index.js +++ b/addons/comments/src/manager/components/CommentsPanel/index.js @@ -18,7 +18,9 @@ export default function CommentsPanel(props) { return ( ); diff --git a/addons/events/src/components/Event.js b/addons/events/src/components/Event.js index df107a8b3b7..9c8df880bd6 100644 --- a/addons/events/src/components/Event.js +++ b/addons/events/src/components/Event.js @@ -136,7 +136,9 @@ export default class Item extends Component { return (
- +
); } @@ -75,7 +77,9 @@ export default function Node(props) { if (!children) { return (
- <{name} + + <{name} +
- <{name} + + <{name} + )}
- </{name}> + + </{name}> +
); diff --git a/addons/info/src/components/PropTable.js b/addons/info/src/components/PropTable.js index ded66643608..fbd3f0780b8 100644 --- a/addons/info/src/components/PropTable.js +++ b/addons/info/src/components/PropTable.js @@ -34,11 +34,10 @@ export default function PropTable(props) { Object.keys(type.propTypes).forEach(property => { const typeInfo = type.propTypes[property]; const required = typeInfo.isRequired === undefined ? 'yes' : 'no'; - const description = type.__docgenInfo && - type.__docgenInfo.props && - type.__docgenInfo.props[property] - ? type.__docgenInfo.props[property].description - : null; + const description = + type.__docgenInfo && type.__docgenInfo.props && type.__docgenInfo.props[property] + ? type.__docgenInfo.props[property].description + : null; let propType = PropTypesMap.get(typeInfo) || 'other'; if (propType === 'other') { @@ -100,15 +99,23 @@ export default function PropTable(props) { {array.map(row => - {row.property} - {row.propType} - {row.required} + + {row.property} + + + {row.propType} + + + {row.required} + {row.defaultValue === undefined ? '-' : } - {row.description} + + {row.description} + )} diff --git a/addons/info/src/components/PropVal.js b/addons/info/src/components/PropVal.js index 13901ab87fe..3cab672ea3f 100644 --- a/addons/info/src/components/PropVal.js +++ b/addons/info/src/components/PropVal.js @@ -59,7 +59,11 @@ function previewObject(val, maxPropObjectKeys) { const names = Object.keys(val); const items = {}; names.slice(0, maxPropObjectKeys).forEach((name, i) => { - items[`k${i}`] = {name}; + items[`k${i}`] = ( + + {name} + + ); items[`c${i}`] = ': '; items[`v${i}`] = ; items[`m${i}`] = ', '; @@ -71,7 +75,9 @@ function previewObject(val, maxPropObjectKeys) { } return ( - {'{'}{createFragment(items)}{'}'} + {'{'} + {createFragment(items)} + {'}'} ); } @@ -83,19 +89,31 @@ export default function PropVal(props) { let content = null; if (typeof val === 'number') { - content = {val}; + content = ( + + {val} + + ); } else if (typeof val === 'string') { if (val.length > maxPropStringLength) { val = `${val.slice(0, maxPropStringLength)}…`; } - content = "{val}"; + content = ( + + "{val}" + + ); braceWrap = false; } else if (typeof val === 'boolean') { content = {`${val}`}; } else if (Array.isArray(val)) { content = previewArray(val, maxPropArrayLength); } else if (typeof val === 'function') { - content = {val.name ? `${val.name}()` : 'anonymous()'}; + content = ( + + {val.name ? `${val.name}()` : 'anonymous()'} + + ); } else if (!val) { content = {`${val}`}; } else if (typeof val !== 'object') { @@ -112,7 +130,11 @@ export default function PropVal(props) { if (!braceWrap) return content; - return {content}; + return ( + + {content} + + ); } PropVal.propTypes = { diff --git a/addons/info/src/components/Props.js b/addons/info/src/components/Props.js index b973d5d1093..6dd57d463f3 100644 --- a/addons/info/src/components/Props.js +++ b/addons/info/src/components/Props.js @@ -32,8 +32,14 @@ export default function Props(props) { names.forEach((name, i) => { items.push( - {breakIntoNewLines ?
  
: ' '} - {name} + {breakIntoNewLines + ? +
   +
+ : ' '} + + {name} + {/* Use implicit true: */} {(!nodeProps[name] || typeof nodeProps[name] !== 'boolean') && @@ -53,7 +59,11 @@ export default function Props(props) { ); }); - return {items}; + return ( + + {items} + + ); } Props.defaultProps = { diff --git a/addons/info/src/components/Story.js b/addons/info/src/components/Story.js index 618d64d4f31..fd1fdec3238 100644 --- a/addons/info/src/components/Story.js +++ b/addons/info/src/components/Story.js @@ -180,9 +180,13 @@ export default class Story extends React.Component {
{this.props.children}
- Show Info + + Show Info +
- × + + × +
{this._getInfoHeader()} @@ -204,8 +208,12 @@ export default class Story extends React.Component { return (
-

{this.props.context.kind}

-

{this.props.context.story}

+

+ {this.props.context.kind} +

+

+ {this.props.context.story} +

); } diff --git a/addons/info/src/components/markdown/code.js b/addons/info/src/components/markdown/code.js index f43d67955b8..e48550518d9 100644 --- a/addons/info/src/components/markdown/code.js +++ b/addons/info/src/components/markdown/code.js @@ -61,7 +61,11 @@ export function Pre(props) { lineHeight: 1.5, overflowX: 'scroll', }; - return
{props.children}
; + return ( +
+      {props.children}
+    
+ ); } Pre.propTypes = { children: PropTypes.node }; @@ -74,7 +78,11 @@ export function Blockquote(props) { borderLeft: '8px solid #fafafa', padding: '1rem', }; - return
{props.children}
; + return ( +
+ {props.children} +
+ ); } Blockquote.propTypes = { children: PropTypes.node }; diff --git a/addons/info/src/components/markdown/htags.js b/addons/info/src/components/markdown/htags.js index 99257c85159..ec00e8dd1b3 100644 --- a/addons/info/src/components/markdown/htags.js +++ b/addons/info/src/components/markdown/htags.js @@ -20,7 +20,11 @@ export function H1(props) { padding: 0, fontSize: '40px', }; - return

{props.children}

; + return ( +

+ {props.children} +

+ ); } H1.defaultProps = defaultProps; @@ -34,7 +38,11 @@ export function H2(props) { padding: 0, fontSize: '30px', }; - return

{props.children}

; + return ( +

+ {props.children} +

+ ); } H2.defaultProps = defaultProps; @@ -49,7 +57,11 @@ export function H3(props) { fontSize: '22px', textTransform: 'uppercase', }; - return

{props.children}

; + return ( +

+ {props.children} +

+ ); } H3.defaultProps = defaultProps; @@ -63,7 +75,11 @@ export function H4(props) { padding: 0, fontSize: '20px', }; - return

{props.children}

; + return ( +

+ {props.children} +

+ ); } H4.defaultProps = defaultProps; @@ -77,7 +93,11 @@ export function H5(props) { padding: 0, fontSize: '18px', }; - return
{props.children}
; + return ( +
+ {props.children} +
+ ); } H5.defaultProps = defaultProps; @@ -91,7 +111,11 @@ export function H6(props) { padding: 0, fontSize: '18px', }; - return
{props.children}
; + return ( +
+ {props.children} +
+ ); } H6.defaultProps = defaultProps; diff --git a/addons/info/src/components/markdown/text.js b/addons/info/src/components/markdown/text.js index dae5f8f3a93..5e71aff886e 100644 --- a/addons/info/src/components/markdown/text.js +++ b/addons/info/src/components/markdown/text.js @@ -10,7 +10,11 @@ export function P(props) { ...baseFonts, fontSize: '15px', }; - return

{props.children}

; + return ( +

+ {props.children} +

+ ); } P.defaultProps = defaultProps; @@ -21,7 +25,11 @@ export function LI(props) { ...baseFonts, fontSize: '15px', }; - return
  • {props.children}
  • ; + return ( +
  • + {props.children} +
  • + ); } LI.defaultProps = defaultProps; @@ -32,7 +40,11 @@ export function UL(props) { ...baseFonts, fontSize: '15px', }; - return
      {props.children}
    ; + return ( +
      + {props.children} +
    + ); } UL.defaultProps = defaultProps; diff --git a/addons/knobs/src/components/Panel.js b/addons/knobs/src/components/Panel.js index 5682dd30e52..f83c875641c 100644 --- a/addons/knobs/src/components/Panel.js +++ b/addons/knobs/src/components/Panel.js @@ -141,7 +141,9 @@ export default class Panel extends React.Component {
    - +
    ); } diff --git a/addons/knobs/src/components/types/Select.js b/addons/knobs/src/components/types/Select.js index a0a5366af62..1777dce1603 100644 --- a/addons/knobs/src/components/types/Select.js +++ b/addons/knobs/src/components/types/Select.js @@ -24,7 +24,11 @@ class SelectType extends React.Component { value: key, }; - return ; + return ( + + ); } _options(values) { let data = []; diff --git a/app/react-native/src/manager/components/PreviewHelp.js b/app/react-native/src/manager/components/PreviewHelp.js index b3ce3c3b10d..eb7b581c711 100644 --- a/app/react-native/src/manager/components/PreviewHelp.js +++ b/app/react-native/src/manager/components/PreviewHelp.js @@ -28,27 +28,19 @@ const styles = { const PreviewHelp = () =>

    Welcome to storybook

    +

    This is a UI component dev environment for your app.

    - This is a UI component dev environment for your app. + We've added some basic stories inside the + storybook/stories + {' '} + directory. A story is a single state of one or more UI components. You can have as many + stories as you want. Basically a story is like a visual test case.

    - We've added some basic stories inside the - {' '} - storybook/stories - {' '} - directory. - {' '} - A story is a single state of one or more UI components. You can have as many stories as you - want. Basically a story is like a visual test case. -

    -

    - To see your Storybook stories on the device, you should start your mobile app for the - {' '} - <platform> - {' '} - of your choice (typically ios or android). (Note that due to an implementation detail, your - stories will only show up in the left-pane after your device has connected to this storybook - server.) + To see your Storybook stories on the device, you should start your mobile app for the{' '} + <platform> of your choice (typically ios or android). + (Note that due to an implementation detail, your stories will only show up in the left-pane + after your device has connected to this storybook server.)

    For create-react-native-app apps: diff --git a/app/react/src/client/preview/error_display.js b/app/react/src/client/preview/error_display.js index fcdf905a66b..18cbaab8b3c 100644 --- a/app/react/src/client/preview/error_display.js +++ b/app/react/src/client/preview/error_display.js @@ -32,7 +32,9 @@ const codeStyle = { const ErrorDisplay = ({ error }) =>

    -
    {error.message}
    +
    + {error.message} +
           
             {error.stack}
    diff --git a/docs/components/Docs/Content/index.js b/docs/components/Docs/Content/index.js
    index d76fa806f7b..40aeda2b5a8 100644
    --- a/docs/components/Docs/Content/index.js
    +++ b/docs/components/Docs/Content/index.js
    @@ -8,7 +8,9 @@ import './style.css';
     const DocsContent = ({ title, content, editUrl }) =>
       
    -

    {title}

    +

    + {title} +

    Edit this page diff --git a/docs/components/Docs/Nav/dropdown.js b/docs/components/Docs/Nav/dropdown.js index b2943178e49..24cccede0bd 100644 --- a/docs/components/Docs/Nav/dropdown.js +++ b/docs/components/Docs/Nav/dropdown.js @@ -24,11 +24,19 @@ class Nav extends React.Component { } renderNavOpts(nav) { - return ; + return ( + + ); } renderHeadingOpts(section) { - return ; + return ( + + ); } render() { const { sections, selectedSection, selectedItem } = this.props; diff --git a/docs/components/Docs/Nav/index.js b/docs/components/Docs/Nav/index.js index 6830a931f22..915b594a596 100644 --- a/docs/components/Docs/Nav/index.js +++ b/docs/components/Docs/Nav/index.js @@ -7,18 +7,21 @@ const Nav = ({ sections, selectedSectionId, selectedItemId }) =>

    -

    Basics

    + +

    Basics

    +
      -
    • Quick setup
    • -
    • Adding to existing project
    • -
    • Writing stories
    • +
    • + Quick setup +
    • +
    • + Adding to existing project +
    • +
    • + Writing stories +
    -

    Configuration

    + +

    Configuration

    +
      -
    • Babel configurations
    • +
    • + Babel configurations +
    • Webpack configurations
    • @@ -76,9 +90,13 @@ const MainLinks = () =>
    -

    Addons

    + +

    Addons

    +
      -
    • Intro to Addons
    • +
    • + Intro to Addons +
    • Using Addons
    • diff --git a/docs/components/Homepage/Platforms/index.js b/docs/components/Homepage/Platforms/index.js index 63f0fe3a6fb..63c5d750a25 100644 --- a/docs/components/Homepage/Platforms/index.js +++ b/docs/components/Homepage/Platforms/index.js @@ -6,17 +6,14 @@ const Platform = () =>

      Built for

      - React - - {' '} - & - {' '} + {' '} + &{' '} { - {title} + + {title} + {css} diff --git a/docs/wrappers/md.jsx b/docs/wrappers/md.jsx index 0fd2fb3bce0..7cc8b5e6500 100644 --- a/docs/wrappers/md.jsx +++ b/docs/wrappers/md.jsx @@ -10,7 +10,9 @@ const Markdown = ({ route }) => { return (

      -

      {post.title}

      +

      + {post.title} +

      Edit this page diff --git a/examples/cra-kitchen-sink/src/stories/Logger.js b/examples/cra-kitchen-sink/src/stories/Logger.js index ac517a1f57e..ec3bfaa8cee 100644 --- a/examples/cra-kitchen-sink/src/stories/Logger.js +++ b/examples/cra-kitchen-sink/src/stories/Logger.js @@ -60,8 +60,12 @@ export default class Logger extends Component {

      {events.map(({ id, name, payload }) =>
      -
      Event name: {name}
      -
      Event payload: {json.plain(payload)}
      +
      + Event name: {name} +
      +
      + Event payload: {json.plain(payload)} +
      )}
      diff --git a/examples/cra-kitchen-sink/src/stories/index.js b/examples/cra-kitchen-sink/src/stories/index.js index fabd50e219a..a4fa0367dc8 100644 --- a/examples/cra-kitchen-sink/src/stories/index.js +++ b/examples/cra-kitchen-sink/src/stories/index.js @@ -74,14 +74,26 @@ storiesOf('Button', module) return (
      -

      {intro}

      -

      My birthday is: {new Date(birthday).toLocaleDateString()}

      -

      My wallet contains: ${dollars.toFixed(2)}

      +

      + {intro} +

      +

      + My birthday is: {new Date(birthday).toLocaleDateString()} +

      +

      + My wallet contains: ${dollars.toFixed(2)} +

      In my backpack, I have:

        - {items.map(item =>
      • {item}
      • )} + {items.map(item => +
      • + {item} +
      • + )}
      -

      {salutation}

      +

      + {salutation} +

      ); }) diff --git a/examples/react-native-vanilla/storybook/stories/index.js b/examples/react-native-vanilla/storybook/stories/index.js index 1f0e1cb917a..99ab2205a9d 100644 --- a/examples/react-native-vanilla/storybook/stories/index.js +++ b/examples/react-native-vanilla/storybook/stories/index.js @@ -12,7 +12,11 @@ import Welcome from './Welcome'; storiesOf('Welcome', module).add('to Storybook', () => ); storiesOf('Button', module) - .addDecorator(getStory => {getStory()}) + .addDecorator(getStory => + + {getStory()} + + ) .add('with text', () => +
      -

      {name}

      +

      + {name} +

      ; diff --git a/lib/ui/src/modules/ui/components/shortcuts_help.js b/lib/ui/src/modules/ui/components/shortcuts_help.js index d02e7fd4e1f..40b572d2dd0 100755 --- a/lib/ui/src/modules/ui/components/shortcuts_help.js +++ b/lib/ui/src/modules/ui/components/shortcuts_help.js @@ -62,19 +62,31 @@ export function getShortcuts(platform) { export const Keys = ({ shortcutKeys }) => { // if we have only one key combination for a shortcut if (shortcutKeys.length === 1) { - return {shortcutKeys[0]}; + return ( + + + {shortcutKeys[0]} + + + ); } // if we have multiple key combinations for a shortcut const keys = shortcutKeys.map((key, index, arr) => - {key} + + {key} + {/* add / & space if it is not a last key combination */} {arr.length - 1 !== index ? /   : ''} ); - return {keys}; + return ( + + {keys} + + ); }; Keys.propTypes = { From 07ce512e44c03283fe349ff7b983f03ad748dd19 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Sun, 9 Jul 2017 00:32:07 +0200 Subject: [PATCH 21/43] UPGRADE chalk --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6bea2e79eeb..15866c095e3 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "babel-preset-env": "^1.5.1", "babel-preset-react": "^6.24.1", "babel-preset-stage-0": "^6.24.1", - "chalk": "^1.1.3", + "chalk": "^2.0.1", "codecov": "^2.2.0", "danger": "^1.0.0", "enzyme": "^2.8.2", From 51be2c791fcb120fbb8c4cf74db155d8153ed2f6 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Sun, 9 Jul 2017 00:39:13 +0200 Subject: [PATCH 22/43] UPDATE prettier and remove unused dependencies --- package.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/package.json b/package.json index 15866c095e3..b4cc8deec0d 100644 --- a/package.json +++ b/package.json @@ -59,11 +59,9 @@ "jest-enzyme": "^3.2.0", "lerna": "2.0.0", "lint-staged": "^4.0.0", - "markdown-it-anchor": "^4.0.0", - "markdownlint-cli": "^0.3.1", "nodemon": "^1.11.0", "npmc": "^5.0.3-canary.12", - "prettier": "^1.3.1", + "prettier": "^1.5.2", "react": "^15.5.4", "react-dom": "^15.5.4", "react-test-renderer": "^15.5.4", From 91e3c82e9cb99db1a80211223d84841a5f5d06f6 Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Sun, 9 Jul 2017 01:45:07 +0200 Subject: [PATCH 23/43] Dependency updates --- examples/cra-kitchen-sink/package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/cra-kitchen-sink/package.json b/examples/cra-kitchen-sink/package.json index 97433bad113..12e29d108e2 100644 --- a/examples/cra-kitchen-sink/package.json +++ b/examples/cra-kitchen-sink/package.json @@ -30,7 +30,7 @@ "@storybook/addon-storyshots": "^3.0.0", "@storybook/addons": "^3.0.0", "@storybook/react": "^3.0.0", - "react-scripts": "1.0.1" + "react-scripts": "1.0.10" }, "private": true } diff --git a/package.json b/package.json index b4cc8deec0d..b64637b4892 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "lerna": "2.0.0", "lint-staged": "^4.0.0", "nodemon": "^1.11.0", - "npmc": "^5.0.3-canary.12", + "npmc": "^5.1.0-canary.2", "prettier": "^1.5.2", "react": "^15.5.4", "react-dom": "^15.5.4", From d9a2948dabb58be6558323ccb9aac339699b41ad Mon Sep 17 00:00:00 2001 From: Oleg Proskurin Date: Mon, 10 Jul 2017 00:30:31 +0300 Subject: [PATCH 24/43] Refactoring Addon Info [WIP] --- addons/info/src/index.js | 100 +++++++++-------- .../cra-kitchen-sink/src/stories/index.js | 103 +++++++++++++++--- 2 files changed, 141 insertions(+), 62 deletions(-) diff --git a/addons/info/src/index.js b/addons/info/src/index.js index 4567ed366ba..b5c7225a5f6 100644 --- a/addons/info/src/index.js +++ b/addons/info/src/index.js @@ -29,57 +29,61 @@ const defaultMarksyConf = { ul: UL, }; +export function withInfo(info, storyFn, _options, context) { + if (typeof storyFn !== 'function') { + if (typeof info === 'function') { + _options = storyFn; // eslint-disable-line + storyFn = info; // eslint-disable-line + info = ''; // eslint-disable-line + } else { + throw new Error('No story defining function has been specified'); + } + } + + const options = { + ...defaultOptions, + ..._options, + }; + + // props.propTables can only be either an array of components or null + // propTables option is allowed to be set to 'false' (a boolean) + // if the option is false, replace it with null to avoid react warnings + if (!options.propTables) { + options.propTables = null; + } + + const marksyConf = { ...defaultMarksyConf }; + if (options && options.marksyConf) { + Object.assign(marksyConf, options.marksyConf); + } + + const props = { + info, + context, + showInline: Boolean(options.inline), + showHeader: Boolean(options.header), + showSource: Boolean(options.source), + propTables: options.propTables, + propTablesExclude: options.propTablesExclude, + styles: typeof options.styles === 'function' ? options.styles : s => s, + marksyConf, + maxPropObjectKeys: options.maxPropObjectKeys, + maxPropArrayLength: options.maxPropArrayLength, + maxPropsIntoLine: options.maxPropsIntoLine, + maxPropStringLength: options.maxPropStringLength, + }; + + return ( + + {storyFn(context)} + + ); +} + export default { addWithInfo(storyName, info, storyFn, _options) { - if (typeof storyFn !== 'function') { - if (typeof info === 'function') { - _options = storyFn; // eslint-disable-line - storyFn = info; // eslint-disable-line - info = ''; // eslint-disable-line - } else { - throw new Error('No story defining function has been specified'); - } - } - - const options = { - ...defaultOptions, - ..._options, - }; - - // props.propTables can only be either an array of components or null - // propTables option is allowed to be set to 'false' (a boolean) - // if the option is false, replace it with null to avoid react warnings - if (!options.propTables) { - options.propTables = null; - } - - const marksyConf = { ...defaultMarksyConf }; - if (options && options.marksyConf) { - Object.assign(marksyConf, options.marksyConf); - } - return this.add(storyName, context => { - const props = { - info, - context, - showInline: Boolean(options.inline), - showHeader: Boolean(options.header), - showSource: Boolean(options.source), - propTables: options.propTables, - propTablesExclude: options.propTablesExclude, - styles: typeof options.styles === 'function' ? options.styles : s => s, - marksyConf, - maxPropObjectKeys: options.maxPropObjectKeys, - maxPropArrayLength: options.maxPropArrayLength, - maxPropsIntoLine: options.maxPropsIntoLine, - maxPropStringLength: options.maxPropStringLength, - }; - - return ( - - {storyFn(context)} - - ); + return withInfo(info, storyFn, _options, context); }); }, }; diff --git a/examples/cra-kitchen-sink/src/stories/index.js b/examples/cra-kitchen-sink/src/stories/index.js index 9c34858322d..db4ace74367 100644 --- a/examples/cra-kitchen-sink/src/stories/index.js +++ b/examples/cra-kitchen-sink/src/stories/index.js @@ -19,6 +19,7 @@ import { object, } from '@storybook/addon-knobs'; import centered from '@storybook/addon-centered'; +import { withInfo } from '@storybook/addon-info'; import { Button, Welcome } from '@storybook/react/demo'; @@ -37,6 +38,24 @@ const emit = emiter.emit.bind(emiter); storiesOf('Welcome', module).add('to Storybook', () => ); +const InfoButton = () => + + {' '}Show Info{' '} + ; + storiesOf('Button', module) .addDecorator(withKnobs) .add('with text', () => ) @@ -75,21 +94,46 @@ storiesOf('Button', module) return (
      -

      {intro}

      -

      My birthday is: {new Date(birthday).toLocaleDateString()}

      -

      My wallet contains: ${dollars.toFixed(2)}

      +

      + {intro} +

      +

      + My birthday is: {new Date(birthday).toLocaleDateString()} +

      +

      + My wallet contains: ${dollars.toFixed(2)} +

      In my backpack, I have:

        - {items.map(item =>
      • {item}
      • )} + {items.map(item => +
      • + {item} +
      • + )}
      -

      {salutation}

      +

      + {salutation} +

      ); }) .addWithInfo( 'with some info', 'Use the [info addon](https://github.com/storybooks/storybook/tree/master/addons/info) with its painful API.', - () => + () => +
      + click the label in top right for info +
      + ) + .add('with new info', (context) => + withInfo( + 'Use the [info addon](https://github.com/storybooks/storybook/tree/master/addons/info) with its painful API.', () => ( +
      + click the label in top right for info +
      ), + {}, + context + ) ); storiesOf('App', module).add('full app', () => ); @@ -177,7 +221,11 @@ storiesOf('Addon Knobs deprecated Decorator', module) const age = number('Age', 120); const content = `I am ${name} and I'm ${age} years old.`; - return
      {content}
      ; + return ( +
      + {content} +
      + ); }); storiesOf('Addon Knobs', module).add( @@ -187,14 +235,26 @@ storiesOf('Addon Knobs', module).add( const age = number('Age', 89); const content = `I am ${name} and I'm ${age} years old.`; - return
      {content}
      ; + return ( +
      + {content} +
      + ); }) ); storiesOf('component.base.Link') .addDecorator(withKnobs) - .add('first', () => {text('firstLink', 'first link')}) - .add('second', () => {text('secondLink', 'second link')}); + .add('first', () => + + {text('firstLink', 'first link')} + + ) + .add('second', () => + + {text('secondLink', 'second link')} + + ); storiesOf('component.base.Span') .add('first', () => first span) @@ -205,8 +265,20 @@ storiesOf('component.common.Div') .add('second', () =>
      second div
      ); storiesOf('component.common.Table') - .add('first', () =>
      first table
      ) - .add('second', () =>
      first table
      ); + .add('first', () => + + + + +
      first table
      + ) + .add('second', () => + + + + +
      first table
      + ); storiesOf('component.Button') .add('first', () => ) @@ -216,7 +288,11 @@ storiesOf('component.Button') storiesOf('Cells¯\\_(ツ)_/¯Molecules.Atoms/simple', module) .addDecorator(withKnobs) - .add('with text', () => ) + .add('with text', () => + + ) .add('with some emoji', () => ); storiesOf('Cells/Molecules/Atoms.more', module) @@ -230,4 +306,3 @@ storiesOf('Cells/Molecules', module) storiesOf('Cells.Molecules.Atoms', module) .add('with text2', () => ) .add('with some emoji2', () => ); - From 7e9a03c54b54b2eb972eb9e98412f95ec2a9282b Mon Sep 17 00:00:00 2001 From: Yogesh Date: Mon, 10 Jul 2017 06:02:52 +0530 Subject: [PATCH 25/43] Updated the storybook URL for Artsy Updated artsy url to reflect the current storybook deployment. --- docs/pages/examples/_examples.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/pages/examples/_examples.yml b/docs/pages/examples/_examples.yml index 2cd0fa05a2f..9d987f77db9 100644 --- a/docs/pages/examples/_examples.yml +++ b/docs/pages/examples/_examples.yml @@ -34,7 +34,7 @@ artsy: thumbnail: ./thumbnails/artsy.png title: Artsy Force description: Artsy's "Force" component library - demo: https://artsy.github.io/reaction-force/ + demo: https://artsy.github.io/reaction/ source: https://github.com/artsy/reaction-force site: https://artsy.net necolas: From d41888f848533af99cb2ae39e74b8bcd8874bd46 Mon Sep 17 00:00:00 2001 From: Oleg Proskurin Date: Mon, 10 Jul 2017 11:09:10 +0300 Subject: [PATCH 26/43] Addons composition --- addons/info/src/components/PropVal.js | 15 ++++-- addons/info/src/index.js | 47 +++++++++---------- .../cra-kitchen-sink/src/stories/index.js | 35 ++++++++++---- 3 files changed, 60 insertions(+), 37 deletions(-) diff --git a/addons/info/src/components/PropVal.js b/addons/info/src/components/PropVal.js index 13901ab87fe..1afad856f2b 100644 --- a/addons/info/src/components/PropVal.js +++ b/addons/info/src/components/PropVal.js @@ -115,9 +115,16 @@ export default function PropVal(props) { return {content}; } +PropVal.defaultProps = { + val: null, // eslint-disable-line + maxPropObjectKeys: 0, + maxPropArrayLength: 0, + maxPropStringLength: 0, +} + PropVal.propTypes = { - val: PropTypes.any.isRequired, // eslint-disable-line - maxPropObjectKeys: PropTypes.number.isRequired, - maxPropArrayLength: PropTypes.number.isRequired, - maxPropStringLength: PropTypes.number.isRequired, + val: PropTypes.any, // eslint-disable-line + maxPropObjectKeys: PropTypes.number, + maxPropArrayLength: PropTypes.number, + maxPropStringLength: PropTypes.number, }; diff --git a/addons/info/src/index.js b/addons/info/src/index.js index b5c7225a5f6..712a95d4791 100644 --- a/addons/info/src/index.js +++ b/addons/info/src/index.js @@ -29,7 +29,7 @@ const defaultMarksyConf = { ul: UL, }; -export function withInfo(info, storyFn, _options, context) { +export function withInfo(info, storyFn, _options) { if (typeof storyFn !== 'function') { if (typeof info === 'function') { _options = storyFn; // eslint-disable-line @@ -57,34 +57,33 @@ export function withInfo(info, storyFn, _options, context) { Object.assign(marksyConf, options.marksyConf); } - const props = { - info, - context, - showInline: Boolean(options.inline), - showHeader: Boolean(options.header), - showSource: Boolean(options.source), - propTables: options.propTables, - propTablesExclude: options.propTablesExclude, - styles: typeof options.styles === 'function' ? options.styles : s => s, - marksyConf, - maxPropObjectKeys: options.maxPropObjectKeys, - maxPropArrayLength: options.maxPropArrayLength, - maxPropsIntoLine: options.maxPropsIntoLine, - maxPropStringLength: options.maxPropStringLength, + return context => { + const props = { + info, + context, + showInline: Boolean(options.inline), + showHeader: Boolean(options.header), + showSource: Boolean(options.source), + propTables: options.propTables, + propTablesExclude: options.propTablesExclude, + styles: typeof options.styles === 'function' ? options.styles : s => s, + marksyConf, + maxPropObjectKeys: options.maxPropObjectKeys, + maxPropArrayLength: options.maxPropArrayLength, + maxPropsIntoLine: options.maxPropsIntoLine, + maxPropStringLength: options.maxPropStringLength, + }; + return ( + + {storyFn(context)} + + ); }; - - return ( - - {storyFn(context)} - - ); } export default { addWithInfo(storyName, info, storyFn, _options) { - return this.add(storyName, context => { - return withInfo(info, storyFn, _options, context); - }); + return this.add(storyName, withInfo(info, storyFn, _options)); }, }; diff --git a/examples/cra-kitchen-sink/src/stories/index.js b/examples/cra-kitchen-sink/src/stories/index.js index db4ace74367..db81e4f03c9 100644 --- a/examples/cra-kitchen-sink/src/stories/index.js +++ b/examples/cra-kitchen-sink/src/stories/index.js @@ -56,6 +56,11 @@ const InfoButton = () => {' '}Show Info{' '} ; +const withNotes = (note, storyFn) => context => + + {storyFn(context)} + ; + storiesOf('Button', module) .addDecorator(withKnobs) .add('with text', () => ) @@ -120,19 +125,31 @@ storiesOf('Button', module) .addWithInfo( 'with some info', 'Use the [info addon](https://github.com/storybooks/storybook/tree/master/addons/info) with its painful API.', - () => + context =>
      - click the label in top right for info + click the label in top right for info about "{context.story}"
      ) - .add('with new info', (context) => + .add( + 'with new info', withInfo( - 'Use the [info addon](https://github.com/storybooks/storybook/tree/master/addons/info) with its painful API.', () => ( -
      - click the label in top right for info -
      ), - {}, - context + 'Use the [info addon](https://github.com/storybooks/storybook/tree/master/addons/info) with its new painless API.', + context => +
      + click the label in top right for info about "{context.story}" +
      + ) + ) + .add( + 'addons composition', + withInfo( + 'Addon info', + withNotes('Addons composition: Info(Notes(storyFn))', context => +
      + click the label in top right and select "Notes" on Addons Panel to know + more about "{context.story}" +
      + ) ) ); From 28eb25af2ef9ba83e3ba5bd6e6f2d06315ef5c8d Mon Sep 17 00:00:00 2001 From: Joscha Feth Date: Tue, 11 Jul 2017 00:53:33 +1000 Subject: [PATCH 27/43] Add hierarchySeparator to README --- addons/options/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/options/README.md b/addons/options/README.md index c85a55af5c5..65103a57675 100644 --- a/addons/options/README.md +++ b/addons/options/README.md @@ -44,6 +44,7 @@ setOptions({ showSearchBox: false, downPanelInRight: false, sortStoriesByKind: false, + hierarchySeparator: /\./, }); storybook.configure(() => require('./stories'), module); From 0c9d561042dc5b3a42c41da49c121c9d3684a642 Mon Sep 17 00:00:00 2001 From: Oleg Proskurin Date: Mon, 10 Jul 2017 22:28:23 +0300 Subject: [PATCH 28/43] Fix addon notes --- addons/notes/src/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/notes/src/index.js b/addons/notes/src/index.js index f825eac410d..d7202a3d757 100644 --- a/addons/notes/src/index.js +++ b/addons/notes/src/index.js @@ -5,10 +5,10 @@ import { WithNotes as ReactWithNotes } from './react'; export const addonNotes = ({ notes }) => { const channel = addons.getChannel(); - return getStory => () => { + return getStory => (context) => { // send the notes to the channel before the story is rendered channel.emit('storybook/notes/add_notes', notes); - return getStory(); + return getStory(context); }; }; From 73f64c805247c39ac64d26206933c1c64e1ad9ac Mon Sep 17 00:00:00 2001 From: Oleg Proskurin Date: Mon, 10 Jul 2017 22:22:10 +0300 Subject: [PATCH 29/43] Add withInfo()(storyFn) --- addons/info/src/index.js | 97 ++++++++++--------- .../cra-kitchen-sink/src/stories/index.js | 20 ++-- 2 files changed, 58 insertions(+), 59 deletions(-) diff --git a/addons/info/src/index.js b/addons/info/src/index.js index 712a95d4791..3439706d68c 100644 --- a/addons/info/src/index.js +++ b/addons/info/src/index.js @@ -29,61 +29,62 @@ const defaultMarksyConf = { ul: UL, }; -export function withInfo(info, storyFn, _options) { - if (typeof storyFn !== 'function') { - if (typeof info === 'function') { - _options = storyFn; // eslint-disable-line - storyFn = info; // eslint-disable-line - info = ''; // eslint-disable-line - } else { - throw new Error('No story defining function has been specified'); +export function withInfo(info, _options) { + return (storyFn) => { + if (typeof storyFn !== 'function') { + if (typeof info === 'function') { + _options = storyFn; // eslint-disable-line + storyFn = info; // eslint-disable-line + info = ''; // eslint-disable-line + } else { + throw new Error('No story defining function has been specified'); + } } - } - const options = { - ...defaultOptions, - ..._options, - }; - - // props.propTables can only be either an array of components or null - // propTables option is allowed to be set to 'false' (a boolean) - // if the option is false, replace it with null to avoid react warnings - if (!options.propTables) { - options.propTables = null; - } - - const marksyConf = { ...defaultMarksyConf }; - if (options && options.marksyConf) { - Object.assign(marksyConf, options.marksyConf); - } - - return context => { - const props = { - info, - context, - showInline: Boolean(options.inline), - showHeader: Boolean(options.header), - showSource: Boolean(options.source), - propTables: options.propTables, - propTablesExclude: options.propTablesExclude, - styles: typeof options.styles === 'function' ? options.styles : s => s, - marksyConf, - maxPropObjectKeys: options.maxPropObjectKeys, - maxPropArrayLength: options.maxPropArrayLength, - maxPropsIntoLine: options.maxPropsIntoLine, - maxPropStringLength: options.maxPropStringLength, + const options = { + ...defaultOptions, + ..._options, }; - return ( - - {storyFn(context)} - - ); - }; + + // props.propTables can only be either an array of components or null + // propTables option is allowed to be set to 'false' (a boolean) + // if the option is false, replace it with null to avoid react warnings + if (!options.propTables) { + options.propTables = null; + } + + const marksyConf = { ...defaultMarksyConf }; + if (options && options.marksyConf) { + Object.assign(marksyConf, options.marksyConf); + } + + return context => { + const props = { + info, + context, + showInline: Boolean(options.inline), + showHeader: Boolean(options.header), + showSource: Boolean(options.source), + propTables: options.propTables, + propTablesExclude: options.propTablesExclude, + styles: typeof options.styles === 'function' ? options.styles : s => s, + marksyConf, + maxPropObjectKeys: options.maxPropObjectKeys, + maxPropArrayLength: options.maxPropArrayLength, + maxPropsIntoLine: options.maxPropsIntoLine, + maxPropStringLength: options.maxPropStringLength, + }; + return ( + + {storyFn(context)} + + ); + };} } export default { addWithInfo(storyName, info, storyFn, _options) { - return this.add(storyName, withInfo(info, storyFn, _options)); + return this.add(storyName, withInfo(info, _options)(storyFn)); }, }; diff --git a/examples/cra-kitchen-sink/src/stories/index.js b/examples/cra-kitchen-sink/src/stories/index.js index db81e4f03c9..e1c33e210ce 100644 --- a/examples/cra-kitchen-sink/src/stories/index.js +++ b/examples/cra-kitchen-sink/src/stories/index.js @@ -43,12 +43,12 @@ const InfoButton = () => style={{ fontFamily: 'sans-serif', fontSize: 12, - // display: 'block', textDecoration: 'none', background: 'rgb(34, 136, 204)', color: 'rgb(255, 255, 255)', padding: '5px 15px', margin: 4, + marginTop: 16, cursor: 'pointer', borderRadius: '0px 0px 0px 5px', }} @@ -133,21 +133,19 @@ storiesOf('Button', module) .add( 'with new info', withInfo( - 'Use the [info addon](https://github.com/storybooks/storybook/tree/master/addons/info) with its new painless API.', - context => -
      - click the label in top right for info about "{context.story}" -
      + 'Use the [info addon](https://github.com/storybooks/storybook/tree/master/addons/info) with its new painless API.' + )(context => +
      + click the label in top right for info about "{context.story}" +
      ) ) .add( 'addons composition', - withInfo( - 'Addon info', - withNotes('Addons composition: Info(Notes(storyFn))', context => + withInfo('see Notes panel for composition info')( + addonNotes({ notes: 'Composition: Info(Notes())' })(context =>
      - click the label in top right and select "Notes" on Addons Panel to know - more about "{context.story}" + click the label in top right for info about "{context.story}"
      ) ) From 64814491811836c5b7efb803f4e0ed6ef5bae2e7 Mon Sep 17 00:00:00 2001 From: igor Date: Tue, 11 Jul 2017 10:04:09 +0300 Subject: [PATCH 30/43] Fix the left panel width when narrowing --- lib/ui/src/modules/ui/components/layout/index.js | 2 +- lib/ui/src/modules/ui/components/left_panel/index.js | 2 +- .../modules/ui/components/left_panel/stories_tree/tree_style.js | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/ui/src/modules/ui/components/layout/index.js b/lib/ui/src/modules/ui/components/layout/index.js index 7b07f889676..62d7270a766 100755 --- a/lib/ui/src/modules/ui/components/layout/index.js +++ b/lib/ui/src/modules/ui/components/layout/index.js @@ -204,7 +204,7 @@ class Layout extends React.Component { showLeftPanel, () =>
      -
      {leftPanel()}
      +
      {leftPanel()}
      , () => diff --git a/lib/ui/src/modules/ui/components/left_panel/index.js b/lib/ui/src/modules/ui/components/left_panel/index.js index 1ac73afd74f..4e23362ad5b 100755 --- a/lib/ui/src/modules/ui/components/left_panel/index.js +++ b/lib/ui/src/modules/ui/components/left_panel/index.js @@ -8,7 +8,7 @@ import TextFilter from './text_filter'; const scrollStyle = { height: 'calc(100vh - 105px)', marginTop: 10, - overflowY: 'auto', + overflow: 'auto', }; const mainStyle = { diff --git a/lib/ui/src/modules/ui/components/left_panel/stories_tree/tree_style.js b/lib/ui/src/modules/ui/components/left_panel/stories_tree/tree_style.js index 7c20af54ec1..0cc5f691a85 100644 --- a/lib/ui/src/modules/ui/components/left_panel/stories_tree/tree_style.js +++ b/lib/ui/src/modules/ui/components/left_panel/stories_tree/tree_style.js @@ -10,6 +10,7 @@ export default { padding: 0, fontFamily: baseFonts.fontFamily, fontSize: '15px', + minWidth: '200px', }, node: { base: { From ec8ee5cb2d9edddc560e959f2683444a23c21ee9 Mon Sep 17 00:00:00 2001 From: Oleg Proskurin Date: Tue, 11 Jul 2017 20:06:39 +0300 Subject: [PATCH 31/43] Add deprecation warning --- addons/info/src/index.js | 28 +++++++++++++++++-- .../cra-kitchen-sink/src/stories/index.js | 9 +----- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/addons/info/src/index.js b/addons/info/src/index.js index 3439706d68c..cf132ed1f40 100644 --- a/addons/info/src/index.js +++ b/addons/info/src/index.js @@ -30,7 +30,7 @@ const defaultMarksyConf = { }; export function withInfo(info, _options) { - return (storyFn) => { + return storyFn => { if (typeof storyFn !== 'function') { if (typeof info === 'function') { _options = storyFn; // eslint-disable-line @@ -79,12 +79,34 @@ export function withInfo(info, _options) { {storyFn(context)} ); - };} + }; + }; } +function deprecate() { + const logger = console; + let warned = false; + const deprecated = msg => { + if (!warned) { + logger.warn(msg); + warned = true; + } + }; + return deprecated; +} + +const showWaring = deprecate(); + +const warning = storyFn => context => { + showWaring( + `Warning: Applying addWithInfo is deprecated and will be removed in the next major release. Use withInfo from the same package instead. Please check the "${context.kind}/${context.story}" story. See https://github.com/storybooks/storybook/tree/master/addons/info` + ); + return storyFn(context); +}; + export default { addWithInfo(storyName, info, storyFn, _options) { - return this.add(storyName, withInfo(info, _options)(storyFn)); + return this.add(storyName, warning(withInfo(info, _options)(storyFn))); }, }; diff --git a/examples/cra-kitchen-sink/src/stories/index.js b/examples/cra-kitchen-sink/src/stories/index.js index e1c33e210ce..e308ad06511 100644 --- a/examples/cra-kitchen-sink/src/stories/index.js +++ b/examples/cra-kitchen-sink/src/stories/index.js @@ -47,20 +47,13 @@ const InfoButton = () => background: 'rgb(34, 136, 204)', color: 'rgb(255, 255, 255)', padding: '5px 15px', - margin: 4, - marginTop: 16, - cursor: 'pointer', + margin: 10, borderRadius: '0px 0px 0px 5px', }} > {' '}Show Info{' '} ; -const withNotes = (note, storyFn) => context => - - {storyFn(context)} - ; - storiesOf('Button', module) .addDecorator(withKnobs) .add('with text', () => ) From 0e8230c45973e969116df175fc264ba373bc3a22 Mon Sep 17 00:00:00 2001 From: Oleg Proskurin Date: Tue, 11 Jul 2017 21:29:46 +0300 Subject: [PATCH 32/43] Refactoring withInfo function --- addons/info/src/index.js | 132 ++++++++++++++++++++------------------- 1 file changed, 67 insertions(+), 65 deletions(-) diff --git a/addons/info/src/index.js b/addons/info/src/index.js index cf132ed1f40..38408cba072 100644 --- a/addons/info/src/index.js +++ b/addons/info/src/index.js @@ -2,6 +2,31 @@ import React from 'react'; import _Story from './components/Story'; import { H1, H2, H3, H4, H5, H6, Code, P, UL, A, LI } from './components/markdown'; +function addonCompose(addonFn) { + return storyFn => context => addonFn(storyFn, context); +} + +function deprecate() { + const logger = console; + let warned = false; + const deprecated = msg => { + if (!warned) { + logger.warn(msg); + warned = true; + } + }; + return deprecated; +} + +const showWaring = deprecate(); + +const warning = addonCompose((storyFn, context) => { + showWaring( + `Warning: Applying addWithInfo is deprecated and will be removed in the next major release. Use withInfo from the same package instead. \nPlease check the "${context.kind}/${context.story}" story. \nSee https://github.com/storybooks/storybook/tree/master/addons/info` + ); + return storyFn(context); +}); + export const Story = _Story; const defaultOptions = { @@ -29,80 +54,57 @@ const defaultMarksyConf = { ul: UL, }; -export function withInfo(info, _options) { - return storyFn => { - if (typeof storyFn !== 'function') { - if (typeof info === 'function') { +export function addInfo(storyFn, context, { info, _options }) { + if (typeof storyFn !== 'function') { + if (typeof info === 'function') { _options = storyFn; // eslint-disable-line storyFn = info; // eslint-disable-line info = ''; // eslint-disable-line - } else { - throw new Error('No story defining function has been specified'); - } + } else { + throw new Error('No story defining function has been specified'); } + } - const options = { - ...defaultOptions, - ..._options, - }; - - // props.propTables can only be either an array of components or null - // propTables option is allowed to be set to 'false' (a boolean) - // if the option is false, replace it with null to avoid react warnings - if (!options.propTables) { - options.propTables = null; - } - - const marksyConf = { ...defaultMarksyConf }; - if (options && options.marksyConf) { - Object.assign(marksyConf, options.marksyConf); - } - - return context => { - const props = { - info, - context, - showInline: Boolean(options.inline), - showHeader: Boolean(options.header), - showSource: Boolean(options.source), - propTables: options.propTables, - propTablesExclude: options.propTablesExclude, - styles: typeof options.styles === 'function' ? options.styles : s => s, - marksyConf, - maxPropObjectKeys: options.maxPropObjectKeys, - maxPropArrayLength: options.maxPropArrayLength, - maxPropsIntoLine: options.maxPropsIntoLine, - maxPropStringLength: options.maxPropStringLength, - }; - return ( - - {storyFn(context)} - - ); - }; + const options = { + ...defaultOptions, + ..._options, }; -} -function deprecate() { - const logger = console; - let warned = false; - const deprecated = msg => { - if (!warned) { - logger.warn(msg); - warned = true; - } + // props.propTables can only be either an array of components or null + // propTables option is allowed to be set to 'false' (a boolean) + // if the option is false, replace it with null to avoid react warnings + if (!options.propTables) { + options.propTables = null; + } + + const marksyConf = { ...defaultMarksyConf }; + if (options && options.marksyConf) { + Object.assign(marksyConf, options.marksyConf); + } + const props = { + info, + context, + showInline: Boolean(options.inline), + showHeader: Boolean(options.header), + showSource: Boolean(options.source), + propTables: options.propTables, + propTablesExclude: options.propTablesExclude, + styles: typeof options.styles === 'function' ? options.styles : s => s, + marksyConf, + maxPropObjectKeys: options.maxPropObjectKeys, + maxPropArrayLength: options.maxPropArrayLength, + maxPropsIntoLine: options.maxPropsIntoLine, + maxPropStringLength: options.maxPropStringLength, }; - return deprecated; -} - -const showWaring = deprecate(); - -const warning = storyFn => context => { - showWaring( - `Warning: Applying addWithInfo is deprecated and will be removed in the next major release. Use withInfo from the same package instead. Please check the "${context.kind}/${context.story}" story. See https://github.com/storybooks/storybook/tree/master/addons/info` + return ( + + {storyFn(context)} + ); - return storyFn(context); -}; +} + +export const withInfo = (info, _options) => + addonCompose((storyFn, context) => addInfo(storyFn, context, { info, _options })); export default { addWithInfo(storyName, info, storyFn, _options) { From 868dcedd127d4cdc2eb865225770ce011b027a9c Mon Sep 17 00:00:00 2001 From: Oleg Proskurin Date: Tue, 11 Jul 2017 22:31:28 +0300 Subject: [PATCH 33/43] Add test --- addons/info/src/index.test.js | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 addons/info/src/index.test.js diff --git a/addons/info/src/index.test.js b/addons/info/src/index.test.js new file mode 100644 index 00000000000..b828d441b24 --- /dev/null +++ b/addons/info/src/index.test.js @@ -0,0 +1,23 @@ +/* global document */ + +import React from 'react'; +import ReactDOM from 'react-dom'; +import AddonInfo, { withInfo } from './'; + +describe('addon Info', () => { + const story = context => +
      + It's a {context.story} story +
      ; + const api = { + add: (name, fn) => fn({ kind: 'addon_info', story: 'jest_test' }), + }; + it('should render ', () => { + const Info = withInfo('Test Info')(story); + ReactDOM.render(, document.createElement('div')); + }); + it('should show deprecation warning', () => { + const addWithInfo = AddonInfo.addWithInfo.bind(api); + addWithInfo('jest', 'test info', story); + }); +}); From 1e2892f2f15a3ff7128f3f42d6947534e1e11393 Mon Sep 17 00:00:00 2001 From: UsulPro Date: Wed, 12 Jul 2017 11:48:38 +0300 Subject: [PATCH 34/43] Improve test coverage --- addons/info/src/index.test.js | 42 +++++++++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 4 deletions(-) diff --git a/addons/info/src/index.test.js b/addons/info/src/index.test.js index b828d441b24..68c2d371d8f 100644 --- a/addons/info/src/index.test.js +++ b/addons/info/src/index.test.js @@ -2,22 +2,56 @@ import React from 'react'; import ReactDOM from 'react-dom'; -import AddonInfo, { withInfo } from './'; +import AddonInfo, { withInfo, setDefaults, addInfo } from './'; + +/* eslint-disable */ +const TestComponent = ({ func, obj, array, number, string, bool, empty }) => +
      +

      {func}

      +

      {obj.toString()}

      +

      {array}

      +

      {number}

      +
      {string}
      +
      {bool}
      +

      {empty}

      + test + storiesOf + +
    • 1
    • +
    • 2
    • +
      +
      ; +/* eslint-enable */ + +const testContext = { kind: 'addon_info', story: 'jest_test' }; +const testOptions = { propTables: false }; describe('addon Info', () => { const story = context =>
      - It's a {context.story} story + It's a {context.story} story: + x + 1} + obj={{ a: 'a', b: 'b' }} + array={[1, 2, 3]} + number={7} + string={'seven'} + bool + />
      ; const api = { - add: (name, fn) => fn({ kind: 'addon_info', story: 'jest_test' }), + add: (name, fn) => fn(testContext), }; it('should render ', () => { const Info = withInfo('Test Info')(story); ReactDOM.render(, document.createElement('div')); }); + it('should should render with missed info', () => { + setDefaults(testOptions); + addInfo(null, testContext, { info: story, options: testOptions }); + }); it('should show deprecation warning', () => { const addWithInfo = AddonInfo.addWithInfo.bind(api); - addWithInfo('jest', 'test info', story); + addWithInfo('jest', story); }); }); From 7f9b7212fcaa6fffd4fdff2008fd5f6da0233b40 Mon Sep 17 00:00:00 2001 From: ShockiTV Date: Wed, 12 Jul 2017 14:16:45 +0200 Subject: [PATCH 35/43] typo in import name --- MIGRATION.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MIGRATION.md b/MIGRATION.md index 063c1947074..583288d56d0 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -124,5 +124,5 @@ If you **are** using these addons, migrating is simple: import React from 'react'; import { storiesOf } from '@storybook/react'; import { action } from '@storybook/addon-actions'; - import { link } from '@storybook/addon-links'; + import { linkTo } from '@storybook/addon-links'; ``` From 6c128f3c3b979d037b89e94a02ff66e0625a4009 Mon Sep 17 00:00:00 2001 From: Oleg Proskurin Date: Wed, 12 Jul 2017 19:50:44 +0300 Subject: [PATCH 36/43] Fix typo --- addons/info/src/index.js | 4 ++-- addons/info/src/index.test.js | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/addons/info/src/index.js b/addons/info/src/index.js index 38408cba072..fc3e6588e94 100644 --- a/addons/info/src/index.js +++ b/addons/info/src/index.js @@ -18,10 +18,10 @@ function deprecate() { return deprecated; } -const showWaring = deprecate(); +const showWarning = deprecate(); const warning = addonCompose((storyFn, context) => { - showWaring( + showWarning( `Warning: Applying addWithInfo is deprecated and will be removed in the next major release. Use withInfo from the same package instead. \nPlease check the "${context.kind}/${context.story}" story. \nSee https://github.com/storybooks/storybook/tree/master/addons/info` ); return storyFn(context); diff --git a/addons/info/src/index.test.js b/addons/info/src/index.test.js index 68c2d371d8f..c41e13eff64 100644 --- a/addons/info/src/index.test.js +++ b/addons/info/src/index.test.js @@ -42,11 +42,13 @@ describe('addon Info', () => { const api = { add: (name, fn) => fn(testContext), }; - it('should render ', () => { - const Info = withInfo('Test Info')(story); + it('should render and markdown', () => { + const Info = withInfo( + '# Test story \n## with markdown info \ncontaing **bold**, *cursive* text and `code`' + )(story); ReactDOM.render(, document.createElement('div')); }); - it('should should render with missed info', () => { + it('should render with missed info', () => { setDefaults(testOptions); addInfo(null, testContext, { info: story, options: testOptions }); }); From f07d9956be1f36ab23daa5fccf65c1baeb89fa0b Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Wed, 12 Jul 2017 17:14:08 -0700 Subject: [PATCH 37/43] Pin gatsby version and upgrade gh-pages --- docs/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/package.json b/docs/package.json index e27eba457ba..b3703e7ce75 100644 --- a/docs/package.json +++ b/docs/package.json @@ -33,8 +33,8 @@ "color-pairs-picker": "^1.3.5", "docsearch.js": "^2.3.3", "front-matter": "^2.1.2", - "gatsby": "^0.12.45", - "gh-pages": "^0.12.0", + "gatsby": "0.12.48", + "gh-pages": "^1.0.0", "global": "^4.3.2", "highlight.js": "^9.12.0", "loader-utils": "^1.1.0", From 3832ae9fd7630eb7fb7e4debee2570e411eb087c Mon Sep 17 00:00:00 2001 From: Oleg Proskurin Date: Thu, 13 Jul 2017 15:05:56 +0300 Subject: [PATCH 38/43] Switch to util-deprecate --- addons/info/package.json | 3 ++- addons/info/src/index.js | 32 ++++++-------------------------- 2 files changed, 8 insertions(+), 27 deletions(-) diff --git a/addons/info/package.json b/addons/info/package.json index 6a880a325b1..394881b11a7 100644 --- a/addons/info/package.json +++ b/addons/info/package.json @@ -19,7 +19,8 @@ "global": "^4.3.2", "marksy": "^2.0.0", "prop-types": "^15.5.8", - "react-addons-create-fragment": "^15.5.3" + "react-addons-create-fragment": "^15.5.3", + "util-deprecate": "^1.0.2" }, "devDependencies": { "git-url-parse": "^6.2.2", diff --git a/addons/info/src/index.js b/addons/info/src/index.js index fc3e6588e94..3ff306f3ee5 100644 --- a/addons/info/src/index.js +++ b/addons/info/src/index.js @@ -1,4 +1,5 @@ import React from 'react'; +import deprecate from 'util-deprecate'; import _Story from './components/Story'; import { H1, H2, H3, H4, H5, H6, Code, P, UL, A, LI } from './components/markdown'; @@ -6,27 +7,6 @@ function addonCompose(addonFn) { return storyFn => context => addonFn(storyFn, context); } -function deprecate() { - const logger = console; - let warned = false; - const deprecated = msg => { - if (!warned) { - logger.warn(msg); - warned = true; - } - }; - return deprecated; -} - -const showWarning = deprecate(); - -const warning = addonCompose((storyFn, context) => { - showWarning( - `Warning: Applying addWithInfo is deprecated and will be removed in the next major release. Use withInfo from the same package instead. \nPlease check the "${context.kind}/${context.story}" story. \nSee https://github.com/storybooks/storybook/tree/master/addons/info` - ); - return storyFn(context); -}); - export const Story = _Story; const defaultOptions = { @@ -54,7 +34,7 @@ const defaultMarksyConf = { ul: UL, }; -export function addInfo(storyFn, context, { info, _options }) { +export function addInfo(storyFn, context, info, _options) { if (typeof storyFn !== 'function') { if (typeof info === 'function') { _options = storyFn; // eslint-disable-line @@ -104,12 +84,12 @@ export function addInfo(storyFn, context, { info, _options }) { } export const withInfo = (info, _options) => - addonCompose((storyFn, context) => addInfo(storyFn, context, { info, _options })); + addonCompose((storyFn, context) => addInfo(storyFn, context, info, _options)); export default { - addWithInfo(storyName, info, storyFn, _options) { - return this.add(storyName, warning(withInfo(info, _options)(storyFn))); - }, + addWithInfo: deprecate(function addWithInfo(storyName, info, storyFn, _options) { + return this.add(storyName, withInfo(info, _options)(storyFn)); + }, '@storybook/addon-info .addWithInfo() addon is deprecated, use withInfo() from the same package instead. \nSee https://github.com/storybooks/storybook/tree/master/addons/info'), }; export function setDefaults(newDefaults) { From cabfee0c240a0ebb17ea7435d184021ea11353dc Mon Sep 17 00:00:00 2001 From: igor Date: Thu, 13 Jul 2017 19:46:56 +0300 Subject: [PATCH 39/43] Mark the nested prop types with isRequired --- .../components/left_panel/stories_tree/tree_decorators.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/ui/src/modules/ui/components/left_panel/stories_tree/tree_decorators.js b/lib/ui/src/modules/ui/components/left_panel/stories_tree/tree_decorators.js index 25d7901f946..32f911d0048 100644 --- a/lib/ui/src/modules/ui/components/left_panel/stories_tree/tree_decorators.js +++ b/lib/ui/src/modules/ui/components/left_panel/stories_tree/tree_decorators.js @@ -74,11 +74,11 @@ function createHeaderDecoratorScope(parent) { HeaderDecorator.propTypes = { style: PropTypes.shape({ - title: PropTypes.object, - base: PropTypes.object, + title: PropTypes.object.isRequired, + base: PropTypes.object.isRequired, }).isRequired, node: PropTypes.shape({ - name: PropTypes.string, + name: PropTypes.string.isRequired, }).isRequired, }; From a73d01d6323c7baf8cb27bf842ac8f824cce7065 Mon Sep 17 00:00:00 2001 From: Oleg Proskurin Date: Thu, 13 Jul 2017 20:42:47 +0300 Subject: [PATCH 40/43] Fix tests and default props --- addons/info/src/components/PropVal.js | 10 +++++----- addons/info/src/index.test.js | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/info/src/components/PropVal.js b/addons/info/src/components/PropVal.js index 1afad856f2b..2012528afd7 100644 --- a/addons/info/src/components/PropVal.js +++ b/addons/info/src/components/PropVal.js @@ -116,11 +116,11 @@ export default function PropVal(props) { } PropVal.defaultProps = { - val: null, // eslint-disable-line - maxPropObjectKeys: 0, - maxPropArrayLength: 0, - maxPropStringLength: 0, -} + val: null, + maxPropObjectKeys: 3, + maxPropArrayLength: 3, + maxPropStringLength: 50, +}; PropVal.propTypes = { val: PropTypes.any, // eslint-disable-line diff --git a/addons/info/src/index.test.js b/addons/info/src/index.test.js index c41e13eff64..afbae389ce2 100644 --- a/addons/info/src/index.test.js +++ b/addons/info/src/index.test.js @@ -50,7 +50,7 @@ describe('addon Info', () => { }); it('should render with missed info', () => { setDefaults(testOptions); - addInfo(null, testContext, { info: story, options: testOptions }); + addInfo(null, testContext, story, testOptions); }); it('should show deprecation warning', () => { const addWithInfo = AddonInfo.addWithInfo.bind(api); From 450b60f49697ef9e97dfb747a598c6bd4ea0e440 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Thu, 13 Jul 2017 21:46:34 -0700 Subject: [PATCH 41/43] Add rebass example --- docs/pages/examples/_examples.yml | 7 +++++++ docs/pages/examples/thumbnails/rebass.png | Bin 0 -> 112230 bytes 2 files changed, 7 insertions(+) create mode 100644 docs/pages/examples/thumbnails/rebass.png diff --git a/docs/pages/examples/_examples.yml b/docs/pages/examples/_examples.yml index 9d987f77db9..a841718442c 100644 --- a/docs/pages/examples/_examples.yml +++ b/docs/pages/examples/_examples.yml @@ -25,6 +25,13 @@ algolia: description: Lightning-fast, hyper-configurable search. source: https://github.com/algolia/react-instantsearch/ demo: https://community.algolia.com/react-instantsearch/storybook/ +rebass: + thumbnail: ./thumbnails/rebass.png + title: Rebass + description: Functional React UI component library + demo: http://jxnblk.com/rebass/stories/ + source: https://github.com/jxnblk/rebass + site: http://jxnblk.com/rebass coursera: thumbnail: ./thumbnails/coursera-ui.png title: Coursera diff --git a/docs/pages/examples/thumbnails/rebass.png b/docs/pages/examples/thumbnails/rebass.png new file mode 100644 index 0000000000000000000000000000000000000000..c2b78b1dde3c9f161b495554e36329427957e689 GIT binary patch literal 112230 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%0DNR1Kilwt) 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 literal 0 HcmV?d00001 From 1315a493fb8d8a3d732432dd3837ee5e3eb1ffe2 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Thu, 13 Jul 2017 21:47:16 -0700 Subject: [PATCH 42/43] Make examples button more clickable --- docs/components/Homepage/UsedBy/index.jsx | 6 +++--- docs/components/Homepage/UsedBy/style.css | 10 +++++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/docs/components/Homepage/UsedBy/index.jsx b/docs/components/Homepage/UsedBy/index.jsx index dcb0594a5a4..1afc296c308 100644 --- a/docs/components/Homepage/UsedBy/index.jsx +++ b/docs/components/Homepage/UsedBy/index.jsx @@ -67,9 +67,9 @@ const UsedBy = ({ users }) =>
    - - See more examples… - +
    + See more examples… +
    ; UsedBy.propTypes = { users: PropTypes.array, // eslint-disable-line diff --git a/docs/components/Homepage/UsedBy/style.css b/docs/components/Homepage/UsedBy/style.css index e4c0306f955..92eea1f3c61 100644 --- a/docs/components/Homepage/UsedBy/style.css +++ b/docs/components/Homepage/UsedBy/style.css @@ -63,5 +63,13 @@ .used-by-more-examples { text-align: center; display: block; - margin-top: 10px; + margin-top: 50px; + font-size: 2em; +} + +.used-by-more-examples a { + background-color: #e4004f; + color: #fff; + padding: 20px; + border-radius: 6px; } From fdcacc8eddeec9d0892bb8d071fa5d8721d8042c Mon Sep 17 00:00:00 2001 From: Joscha Feth Date: Fri, 14 Jul 2017 17:08:57 +1000 Subject: [PATCH 43/43] cahnge to / --- addons/options/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/options/README.md b/addons/options/README.md index 65103a57675..7d504201174 100644 --- a/addons/options/README.md +++ b/addons/options/README.md @@ -44,7 +44,7 @@ setOptions({ showSearchBox: false, downPanelInRight: false, sortStoriesByKind: false, - hierarchySeparator: /\./, + hierarchySeparator: /\//, }); storybook.configure(() => require('./stories'), module);