From cfd9f7a15f3b996b3d76abe28305fe48a94cffc7 Mon Sep 17 00:00:00 2001 From: Tom Kirkpatrick <tkp@kirkdesigns.co.uk> Date: Tue, 9 Oct 2018 00:59:46 +0200 Subject: [PATCH] feat(ui): add Menu components --- app/components/UI/Menu.js | 30 ++++ app/components/UI/MenuItem.js | 33 ++++ app/components/UI/MenuItemGroup.js | 33 ++++ package.json | 1 + stories/components/menu.stories.js | 22 +++ test/unit/components/UI/Menu.spec.js | 32 ++++ .../UI/__snapshots__/Menu.spec.js.snap | 147 ++++++++++++++++++ yarn.lock | 125 ++++++++++++++- 8 files changed, 419 insertions(+), 4 deletions(-) create mode 100644 app/components/UI/Menu.js create mode 100644 app/components/UI/MenuItem.js create mode 100644 app/components/UI/MenuItemGroup.js create mode 100644 stories/components/menu.stories.js create mode 100644 test/unit/components/UI/Menu.spec.js create mode 100644 test/unit/components/UI/__snapshots__/Menu.spec.js.snap diff --git a/app/components/UI/Menu.js b/app/components/UI/Menu.js new file mode 100644 index 00000000..cd3ad2c7 --- /dev/null +++ b/app/components/UI/Menu.js @@ -0,0 +1,30 @@ +import React from 'react' +import system from '@rebass/components' +import styled from 'styled-components' +import MenuBase from 'rc-menu' + +const SystemMenu = system( + { + extend: MenuBase, + mb: 2, + p: 0 + }, + 'space' +) + +const StyledMenu = styled(SystemMenu)` + outline: none; +` + +/** + * @render react + * @name Menu + * @example + * <Menu> + <MenuItem>Menu item 1</MenuItem> + <MenuItem>Menu item 2</MenuItem> + </Menu> + */ +const Menu = props => <StyledMenu {...props} /> + +export default Menu diff --git a/app/components/UI/MenuItem.js b/app/components/UI/MenuItem.js new file mode 100644 index 00000000..20006668 --- /dev/null +++ b/app/components/UI/MenuItem.js @@ -0,0 +1,33 @@ +import React from 'react' +import { MenuItem as MenuItemBase } from 'rc-menu' +import system from '@rebass/components' +import styled from 'styled-components' + +const SystemMenuItem = system( + { + extend: MenuItemBase, + py: 2 + }, + 'space' +) + +const StyledMenuItem = styled(SystemMenuItem)` + list-style-type: none; + &.rc-menu-item-active { + color: ${props => props.theme.colors.lightningOrange}; + cursor: pointer; + } + &.rc-menu-item-selected { + color: ${props => props.theme.colors.lightningOrange}; + } +` + +/** + * @render react + * @name MenuItem + * @example + * <MenuItem>MenuItem item 1</MenuItem> + */ +const MenuItem = props => <StyledMenuItem {...props} /> + +export default MenuItem diff --git a/app/components/UI/MenuItemGroup.js b/app/components/UI/MenuItemGroup.js new file mode 100644 index 00000000..eb654cd2 --- /dev/null +++ b/app/components/UI/MenuItemGroup.js @@ -0,0 +1,33 @@ +import React from 'react' +import system from '@rebass/components' +import styled from 'styled-components' +import { MenuItemGroup as MenuItemGroupBase } from 'rc-menu' + +const SystemMenuItemGroup = system( + { + extend: MenuItemGroupBase, + mb: 3 + }, + 'space' +) + +const StyledMenuItemGroup = styled(SystemMenuItemGroup)` + list-style-type: none; + > .rc-menu-item-group-title { + font-weight: bold; + padding: ${props => props.theme.space[2]}px 0; + } + > .rc-menu-item-group-list { + padding: 0; + } +` + +/** + * @render react + * @name MenuItemGroup + * @example + * <MenuItem>MenuItem item 1</MenuItem> + */ +const MenuItemGroup = props => <StyledMenuItemGroup {...props} /> + +export default MenuItemGroup diff --git a/package.json b/package.json index 09984b31..2f0fcb8f 100644 --- a/package.json +++ b/package.json @@ -322,6 +322,7 @@ "lodash.pick": "^4.4.0", "prop-types": "^15.6.2", "qrcode.react": "0.8.0", + "rc-menu": "^7.4.15", "react": "^16.5.2", "react-dom": "^16.5.2", "react-hot-loader": "^4.3.11", diff --git a/stories/components/menu.stories.js b/stories/components/menu.stories.js new file mode 100644 index 00000000..b9eb6f62 --- /dev/null +++ b/stories/components/menu.stories.js @@ -0,0 +1,22 @@ +import React from 'react' +import { storiesOf } from '@storybook/react' +import { action } from '@storybook/addon-actions' +import Menu from 'components/UI/Menu' +import MenuItem from 'components/UI/MenuItem' +import MenuItemGroup from 'components/UI/MenuItemGroup' + +storiesOf('Components.Menu', module).add('Menu', () => ( + <Menu onSelect={action('select')}> + <MenuItemGroup title="My Items"> + <MenuItem key="item1">My item 1</MenuItem> + <MenuItem key="item2">My item 2</MenuItem> + <MenuItem key="item3">My item 3</MenuItem> + </MenuItemGroup> + + <MenuItemGroup title="Other items"> + <MenuItem key="item4">Other item 1</MenuItem> + <MenuItem key="item5">Other item 2</MenuItem> + <MenuItem key="item6">Other item 3</MenuItem> + </MenuItemGroup> + </Menu> +)) diff --git a/test/unit/components/UI/Menu.spec.js b/test/unit/components/UI/Menu.spec.js new file mode 100644 index 00000000..2a184948 --- /dev/null +++ b/test/unit/components/UI/Menu.spec.js @@ -0,0 +1,32 @@ +import React from 'react' +import Menu from 'components/UI/Menu' +import MenuItem from 'components/UI/MenuItem' +import MenuItemGroup from 'components/UI/MenuItemGroup' +import renderer from 'react-test-renderer' +import { dark } from 'themes' +import { ThemeProvider } from 'styled-components' + +describe('component.UI.Menu', () => { + it('should render correctly', () => { + const tree = renderer + .create( + <ThemeProvider theme={dark}> + <Menu> + <MenuItemGroup title="My Items"> + <MenuItem key="item1">My item 1</MenuItem> + <MenuItem key="item2">My item 2</MenuItem> + <MenuItem key="item3">My item 3</MenuItem> + </MenuItemGroup> + + <MenuItemGroup title="Other items"> + <MenuItem key="item4">Other item 1</MenuItem> + <MenuItem key="item5">Other item 2</MenuItem> + <MenuItem key="item6">Other item 3</MenuItem> + </MenuItemGroup> + </Menu> + </ThemeProvider> + ) + .toJSON() + expect(tree).toMatchSnapshot() + }) +}) diff --git a/test/unit/components/UI/__snapshots__/Menu.spec.js.snap b/test/unit/components/UI/__snapshots__/Menu.spec.js.snap new file mode 100644 index 00000000..dbd10e94 --- /dev/null +++ b/test/unit/components/UI/__snapshots__/Menu.spec.js.snap @@ -0,0 +1,147 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`component.UI.Menu should render correctly 1`] = ` +.c0 { + margin-bottom: 8px; + padding: 0px; + outline: none; +} + +.c2 { + padding-top: 8px; + padding-bottom: 8px; + list-style-type: none; +} + +.c2.rc-menu-item-active { + color: #fd9800; + cursor: pointer; +} + +.c2.rc-menu-item-selected { + color: #fd9800; +} + +.c1 { + margin-bottom: 16px; + list-style-type: none; +} + +.c1 > .rc-menu-item-group-title { + font-weight: bold; + padding: 8px 0; +} + +.c1 > .rc-menu-item-group-list { + padding: 0; +} + +<ul + className="rc-menu c0 rc-menu-root rc-menu-vertical" + mb={2} + onKeyDown={[Function]} + p={0} + role="menu" + style={Object {}} + tabIndex="0" +> + <li + className="c1 rc-menu-item-group" + mb={3} + > + <div + className="rc-menu-item-group-title" + style={Object {}} + title="My Items" + > + My Items + </div> + <ul + className="rc-menu-item-group-list" + > + <li + className="rc-menu-item c2" + onClick={[Function]} + onMouseEnter={[Function]} + onMouseLeave={[Function]} + py={2} + role="menuitem" + style={Object {}} + > + My item 1 + </li> + <li + className="rc-menu-item c2" + onClick={[Function]} + onMouseEnter={[Function]} + onMouseLeave={[Function]} + py={2} + role="menuitem" + style={Object {}} + > + My item 2 + </li> + <li + className="rc-menu-item c2" + onClick={[Function]} + onMouseEnter={[Function]} + onMouseLeave={[Function]} + py={2} + role="menuitem" + style={Object {}} + > + My item 3 + </li> + </ul> + </li> + <li + className="c1 rc-menu-item-group" + mb={3} + > + <div + className="rc-menu-item-group-title" + style={Object {}} + title="Other items" + > + Other items + </div> + <ul + className="rc-menu-item-group-list" + > + <li + className="rc-menu-item c2" + onClick={[Function]} + onMouseEnter={[Function]} + onMouseLeave={[Function]} + py={2} + role="menuitem" + style={Object {}} + > + Other item 1 + </li> + <li + className="rc-menu-item c2" + onClick={[Function]} + onMouseEnter={[Function]} + onMouseLeave={[Function]} + py={2} + role="menuitem" + style={Object {}} + > + Other item 2 + </li> + <li + className="rc-menu-item c2" + onClick={[Function]} + onMouseEnter={[Function]} + onMouseLeave={[Function]} + py={2} + role="menuitem" + style={Object {}} + > + Other item 3 + </li> + </ul> + </li> +</ul> +`; diff --git a/yarn.lock b/yarn.lock index 7627adfb..f643f99b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1838,6 +1838,13 @@ add-asset-html-webpack-plugin@^3.0.1: micromatch "^3.1.3" p-each-series "^1.0.0" +add-dom-event-listener@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz#6a92db3a0dd0abc254e095c0f1dc14acbbaae310" + integrity sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw== + dependencies: + object-assign "4.x" + address@1.0.3, address@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" @@ -3652,7 +3659,7 @@ babel-register@^6.26.0: mkdirp "^0.5.1" source-map-support "^0.4.15" -babel-runtime@6.26.0, babel-runtime@6.x.x, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0, babel-runtime@^6.5.0, babel-runtime@^6.9.2: +babel-runtime@6.26.0, babel-runtime@6.x, babel-runtime@6.x.x, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0, babel-runtime@^6.5.0, babel-runtime@^6.9.2: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -4659,7 +4666,7 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -classnames@^2.2.5: +classnames@2.x, classnames@^2.2.5, classnames@^2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== @@ -4967,11 +4974,23 @@ compare-version@^0.1.2: resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" integrity sha1-AWLsLZNR9d3VmpICy6k1NmpyUIA= +component-classes@^1.2.5: + version "1.2.6" + resolved "https://registry.yarnpkg.com/component-classes/-/component-classes-1.2.6.tgz#c642394c3618a4d8b0b8919efccbbd930e5cd691" + integrity sha1-xkI5TDYYpNiwuJGe/Mu9kw5c1pE= + dependencies: + component-indexof "0.0.3" + component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= +component-indexof@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/component-indexof/-/component-indexof-0.0.3.tgz#11d091312239eb8f32c8f25ae9cb002ffe8d3c24" + integrity sha1-EdCRMSI5648yyPJa6csAL/6NPCQ= + compress-commons@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f" @@ -5354,6 +5373,14 @@ csp-html-webpack-plugin@^2.3.0: cheerio "^1.0.0-rc.2" lodash "^4.17.10" +css-animation@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/css-animation/-/css-animation-1.4.1.tgz#5b8813125de0fbbbb0bbe1b472ae84221469b7a8" + integrity sha1-W4gTEl3g+7uwu+G0cq6EIhRpt6g= + dependencies: + babel-runtime "6.x" + component-classes "^1.2.5" + css-color-keywords@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" @@ -5980,6 +6007,11 @@ doctrine@^2.0.0, doctrine@^2.1.0: dependencies: esutils "^2.0.2" +dom-align@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.8.0.tgz#c0e89b5b674c6e836cd248c52c2992135f093654" + integrity sha512-B85D4ef2Gj5lw0rK0KM2+D5/pH7yqNxg2mB+E8uzFaolpm7RQmsxEfjyEuNiF8UBBkffumYDeKRzTzc3LePP+w== + dom-converter@~0.2: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" @@ -5992,6 +6024,11 @@ dom-helpers@^3.3.1: resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6" integrity sha512-2Sm+JaYn74OiTM2wHvxJOo3roiq/h25Yi69Fqk269cNUwIXsCvATB6CRSFC9Am/20G2b28hGv/+7NiWydIrPvg== +dom-scroll-into-view@1.x: + version "1.2.1" + resolved "https://registry.yarnpkg.com/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz#e8f36732dd089b0201a88d7815dc3f88e6d66c7e" + integrity sha1-6PNnMt0ImwIBqI14Fdw/iObWbH4= + dom-serializer@0, dom-serializer@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" @@ -11166,6 +11203,16 @@ mini-css-extract-plugin@^0.4.4: schema-utils "^1.0.0" webpack-sources "^1.1.0" +mini-store@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mini-store/-/mini-store-2.0.0.tgz#0843c048d6942ce55e3e78b1b67fc063022b5488" + integrity sha512-EG0CuwpQmX+XL4QVS0kxNwHW5ftSbhygu1qxQH0pipugjnPkbvkalCdQbEihMwtQY6d3MTN+MS0q+aurs+RfLQ== + dependencies: + hoist-non-react-statics "^2.3.1" + prop-types "^15.6.0" + react-lifecycles-compat "^3.0.4" + shallowequal "^1.0.2" + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -11340,6 +11387,11 @@ murmurhash3js@^3.0.1: resolved "https://registry.yarnpkg.com/murmurhash3js/-/murmurhash3js-3.0.1.tgz#3e983e5b47c2a06f43a713174e7e435ca044b998" integrity sha1-Ppg+W0fCoG9DpxMXTn5DXKBEuZg= +mutationobserver-shim@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz#f4d5dae7a4971a2207914fb5a90ebd514b65acca" + integrity sha1-9NXa56SXGiIHkU+1qQ69UUtlrMo= + mute-stream@0.0.7, mute-stream@~0.0.4: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -11952,7 +12004,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@4.x, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -13260,7 +13312,7 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.5.9, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2: +prop-types@15.x, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.6, prop-types@^15.5.8, prop-types@^15.5.9, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2: version "15.6.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102" integrity sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ== @@ -13544,6 +13596,66 @@ raw-loader@^0.5.1: resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" integrity sha1-DD0L6u2KAclm2Xh793goElKpeao= +rc-align@^2.4.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/rc-align/-/rc-align-2.4.3.tgz#b9b3c2a6d68adae71a8e1d041cd5e3b2a655f99a" + integrity sha512-h5KgyB5IXYR7iKpYFcMr54cuQ2eozPCZ11kbXPG5+6CWvmyJ+c0R/yjndVndiNk2G3MKcTMbJNdDv5DIckLAxQ== + dependencies: + babel-runtime "^6.26.0" + dom-align "^1.7.0" + prop-types "^15.5.8" + rc-util "^4.0.4" + +rc-animate@2.x: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rc-animate/-/rc-animate-2.5.4.tgz#3b308c42e137a2e3fb578650fdb145c2100fcc35" + integrity sha512-aYisNYRuOvH+r5/nxEHHUzk1celxPg4nMUOuBGHd77c6NZbZ5fcjHFgWF3/nPdRPbLaqY4Z7Q317EcLO41fOvQ== + dependencies: + babel-runtime "6.x" + classnames "^2.2.6" + css-animation "^1.3.2" + prop-types "15.x" + raf "^3.4.0" + react-lifecycles-compat "^3.0.4" + +rc-menu@^7.4.15: + version "7.4.15" + resolved "https://registry.yarnpkg.com/rc-menu/-/rc-menu-7.4.15.tgz#18304e8b837514eccc0cc6d171fc15b9a6f3822f" + integrity sha512-xEUlCWYiK1lw1SxcQZuSgaoJwjsnK5qJPM1HxiI8uUCvD3djM4eegAIC7E6PG79Xl0Zq2V4KZZj5T5hWJA3qNA== + dependencies: + babel-runtime "6.x" + classnames "2.x" + dom-scroll-into-view "1.x" + mini-store "^2.0.0" + mutationobserver-shim "^0.3.2" + prop-types "^15.5.6" + rc-animate "2.x" + rc-trigger "^2.3.0" + rc-util "^4.1.0" + resize-observer-polyfill "^1.5.0" + +rc-trigger@^2.3.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rc-trigger/-/rc-trigger-2.6.2.tgz#a9c09ba5fad63af3b2ec46349c7db6cb46657001" + integrity sha512-op4xCu95/gdHVaysyxxiYxbY+Z+UcIBSUY9nQfLqm1FlitdtnAN+owD5iMPfnnsRXntgcQ5+RdYKNUFQT5DjzA== + dependencies: + babel-runtime "6.x" + classnames "^2.2.6" + prop-types "15.x" + rc-align "^2.4.0" + rc-animate "2.x" + rc-util "^4.4.0" + +rc-util@^4.0.4, rc-util@^4.1.0, rc-util@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/rc-util/-/rc-util-4.6.0.tgz#ba33721783192ec4f3afb259e182b04e55deb7f6" + integrity sha512-rbgrzm1/i8mgfwOI4t1CwWK7wGe+OwX+dNa7PVMgxZYPBADGh86eD4OcJO1UKGeajIMDUUKMluaZxvgraQIOmw== + dependencies: + add-dom-event-listener "^1.1.0" + babel-runtime "6.x" + prop-types "^15.5.10" + shallowequal "^0.2.2" + rc@^1.0.1, rc@^1.1.6, rc@^1.2.1, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -14592,6 +14704,11 @@ reselect@^4.0.0: resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.0.0.tgz#f2529830e5d3d0e021408b246a206ef4ea4437f7" integrity sha512-qUgANli03jjAyGlnbYVAV5vvnOmJnODyABz51RdBN7M4WaVu8mecZWgyQNkG8Yqe3KRGRt0l4K4B3XVEULC4CA== +resize-observer-polyfill@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.0.tgz#660ff1d9712a2382baa2cad450a4716209f9ca69" + integrity sha512-M2AelyJDVR/oLnToJLtuDJRBBWUGUvvGigj1411hXhAdyFWqMaqHp7TixW3FpiLuVaikIcR1QL+zqoJoZlOgpg== + resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"