diff --git a/cypress/integration/Tooltip.spec.ts b/cypress/integration/Tooltip.spec.ts new file mode 100644 index 0000000000..808846efe5 --- /dev/null +++ b/cypress/integration/Tooltip.spec.ts @@ -0,0 +1,75 @@ +import * as h from '../helpers'; + +describe('Tooltip', () => { + before(() => { + h.stories.visit(); + }); + + context('given Tooltip Default is rendered', () => { + beforeEach(() => { + h.stories.load('Tooltip', 'Default'); + }); + + it('should not have any axe errors', () => { + cy.checkA11y(); + }); + + it('should have an aria-label of "Close"', () => { + cy.get('button').should('have.attr', 'aria-label', 'Close'); + }); + + context('when close icon is hovered', () => { + beforeEach(() => { + cy.get('button').trigger('mouseover'); + }); + + it('should open the tooltip', () => { + cy.get('[role=tooltip]').should('be.visible'); + }); + + it('should not have any axe errors', () => { + cy.checkA11y(); + }); + + it('the button should be aria-describedby the tooltip', () => { + cy.get('[role=tooltip]', {log: false}).should($tooltip => { + const id = $tooltip.attr('id'); + expect(Cypress.$('button')).to.have.attr('aria-describedby', id); + expect($tooltip).to.have.attr('id', id); + }); + }); + }); + + context('when close icon gains focus', () => { + beforeEach(() => { + cy.get('button').focus(); + }); + + it('should open the tooltip', () => { + cy.get('[role=tooltip]').should('be.visible'); + }); + + context('then the close icon loses focus', () => { + beforeEach(() => { + cy.get('button').blur(); + }); + + it('should close the tooltip', () => { + cy.get('[role=tooltip]').should('not.be.visible'); + }); + }); + + context('then Escape key is pressed', () => { + beforeEach(() => { + cy.get('button').trigger('keydown', { + key: 'Escape', + }); + }); + + it('should not remove focus from the close icon button', () => { + cy.get('button').should('have.focus'); + }); + }); + }); + }); +}); diff --git a/modules/common/react/lib/Popper.tsx b/modules/common/react/lib/Popper.tsx index 55ba08f7f1..e648efead2 100644 --- a/modules/common/react/lib/Popper.tsx +++ b/modules/common/react/lib/Popper.tsx @@ -17,7 +17,7 @@ export interface PopperProps extends React.HTMLAttributes { /** * The element that contains the portal children when `portal` is true. */ - containerElement?: Element; + containerElement?: Element | null; /** * If true, set the Popper to the open state. * @default true diff --git a/modules/toast/react/stories/stories.tsx b/modules/toast/react/stories/stories.tsx index c8cbefcba7..a5b42e04e4 100644 --- a/modules/toast/react/stories/stories.tsx +++ b/modules/toast/react/stories/stories.tsx @@ -32,7 +32,7 @@ const toastData = { }; class ToastWrapper extends React.Component<{state?: string}> { - public render() { + render() { let toastMeta; switch (this.props.state) { diff --git a/modules/tooltip/react/README.md b/modules/tooltip/react/README.md index 74b49c6fe1..27eed1cc8b 100644 --- a/modules/tooltip/react/README.md +++ b/modules/tooltip/react/README.md @@ -2,9 +2,7 @@ A Tooltip component that renders information/text when the user hovers over an element. -Note: This Tooltip does not include a positioning engine. In our example we use Material UIs popper -component to wrap our Tooltip component and position it, which is a wrapper to Popper.js. For -reference: https://material-ui.com/api/popper/ +Note: This Tooltip does not include a positioning engine. In our example we use our Popper ## Installation @@ -22,7 +20,7 @@ yarn add @workday/canvas-kit-react-tooltip ```tsx import * as React from 'react'; -import Popper from '@material-ui/core/Popper'; +import {Popper} from '@workday/canvas-kit-react-common'; import Tooltip from '@workday/canvas-kit-react-tooltip'; class TooltipExample extends React.Component<{}, TooltipExampleState> { @@ -52,7 +50,7 @@ class TooltipExample extends React.Component<{}, TooltipExampleState> { > Hover Over Me - + Close diff --git a/modules/tooltip/react/lib/Tooltip.tsx b/modules/tooltip/react/lib/Tooltip.tsx index 2d27851304..8e6f52dbcb 100644 --- a/modules/tooltip/react/lib/Tooltip.tsx +++ b/modules/tooltip/react/lib/Tooltip.tsx @@ -3,6 +3,7 @@ import styled from '@emotion/styled'; import {borderRadius, colors, spacing, type} from '@workday/canvas-kit-react-core'; import {TransformOrigin, getTranslateFromOrigin} from '@workday/canvas-kit-react-common'; import {keyframes} from '@emotion/core'; +import uuid from 'uuid/v4'; export interface TooltipProps { /** @@ -11,7 +12,8 @@ export interface TooltipProps { */ transformOrigin: TransformOrigin; /** - * The unique id of the Tooltip. + * HTML id of the tooltip container - useful for accessibility. + * Should link the tooltip container to a `aria-describedby` on the target */ id?: string; } @@ -47,12 +49,12 @@ const TooltipContainer = styled('div')( }, }, ({transformOrigin}) => ({ - animation: tooltipAnimation(transformOrigin), - animationDuration: '150ms', - animationTimingFunction: 'ease-out', - transformOrigin: transformOrigin - ? `${transformOrigin.vertical} ${transformOrigin.horizontal}` - : 'top center', + // animation: tooltipAnimation(transformOrigin), + // animationDuration: '150ms', + // animationTimingFunction: 'ease-out', + // transformOrigin: transformOrigin + // ? `${transformOrigin.vertical} ${transformOrigin.horizontal}` + // : 'top center', }) ); @@ -72,3 +74,39 @@ export default class Tooltip extends React.Component { ); } } + +/** + * Convenience hook for creating components with tooltips + */ +export function useTooltip() { + const [isOpen, setOpen] = React.useState(false); + const [ref, setRef] = React.useState(null); + const id = React.useRef(); + const onClose = () => { + setOpen(false); + }; + const onOpen = (event: React.SyntheticEvent) => { + setRef(event.currentTarget); + if (!id.current) { + id.current = uuid(); + } + setOpen(true); + }; + + return { + targetProps: { + 'aria-describedby': id.current, + onMouseEnter: onOpen, + onMouseLeave: onClose, + onFocus: onOpen, + onBlur: onClose, + }, + popperProps: { + open: isOpen, + anchorElement: ref, + }, + tooltipProps: { + id: id.current, + }, + }; +} diff --git a/modules/tooltip/react/package.json b/modules/tooltip/react/package.json index 6e846e395e..09203bd5c9 100644 --- a/modules/tooltip/react/package.json +++ b/modules/tooltip/react/package.json @@ -45,7 +45,6 @@ "@workday/canvas-kit-react-core": "^3.5.0" }, "devDependencies": { - "@material-ui/core": "^3.9.2", "@workday/canvas-system-icons-web": "^1.0.20" } } diff --git a/modules/tooltip/react/spec/Tooltip.spec.tsx b/modules/tooltip/react/spec/Tooltip.spec.tsx index b81346870d..41138a758a 100644 --- a/modules/tooltip/react/spec/Tooltip.spec.tsx +++ b/modules/tooltip/react/spec/Tooltip.spec.tsx @@ -1,12 +1,43 @@ +/// + import * as React from 'react'; -import {mount} from 'enzyme'; -import Tooltip from '../lib/Tooltip'; +import {render, cleanup, fireEvent} from '@testing-library/react'; + +import Tooltip, {useTooltip} from '../lib/Tooltip'; + +const TooltipWithHook = () => { + const {targetProps, tooltipProps} = useTooltip(); + + return ( + <> + + Tooltip Content + + ); +}; describe('Tooltip', () => { - test('Tooltip should spread extra props', () => { - const component = mount(); - const container = component.at(0).getDOMNode(); - expect(container.getAttribute('data-propspread')).toBe('test'); - component.unmount(); + afterEach(cleanup); + + it('should spread extra props on the element', async () => { + const {container} = render(); + const tooltip = container.firstElementChild; + + expect(tooltip).toHaveAttribute('role', 'tooltip'); + }); + + describe('useToolip', () => { + it('should add aria attributes to correlate the target and the tooltip', async () => { + const rendered = render(); + + const target = await rendered.findByText('Hover'); + const tooltip = await rendered.findByRole('tooltip'); + + await fireEvent.mouseOver(target); // assign the ID to the tooltip + + expect(tooltip).toHaveAttribute('id'); + const id = tooltip.getAttribute('id'); + expect(target).toHaveAttribute('aria-describedby', id); + }); }); }); diff --git a/modules/tooltip/react/stories/stories.tsx b/modules/tooltip/react/stories/stories.tsx index fe39500ab7..3c2ca323e0 100644 --- a/modules/tooltip/react/stories/stories.tsx +++ b/modules/tooltip/react/stories/stories.tsx @@ -2,75 +2,101 @@ import * as React from 'react'; import {storiesOf} from '@storybook/react'; import withReadme from 'storybook-readme/with-readme'; -import Popper from '@material-ui/core/Popper'; + +import {Popper, Placement} from '@workday/canvas-kit-react-common'; import {xIcon} from '@workday/canvas-system-icons-web'; +import {Card} from '@workday/canvas-kit-react-card'; +import {IconButton} from '@workday/canvas-kit-react-button'; +import {Tooltip, useTooltip} from '@workday/canvas-kit-react-tooltip'; -import {IconButton} from '../../../button/react'; -import Tooltip from '../index'; import README from '../README.md'; -interface TooltipWrapperState { - open: boolean; - anchorEl: HTMLElement | null; -} +storiesOf('Components|Popups/Tooltip/React', module) + .addParameters({component: Tooltip}) + .addDecorator(withReadme(README)) + .add('Default', () => { + const {targetProps, popperProps, tooltipProps} = useTooltip(); -class TooltipWrapper extends React.Component<{}, TooltipWrapperState> { - private tooltipRef: React.RefObject; - public constructor(props: {}) { - super(props); - this.tooltipRef = React.createRef(); - this.state = { - open: false, - anchorEl: null, - }; - } + return ( + <> +

Hover over the icon

+ + + Close + + + ); + }) + .add('Placements', () => { + const [open, setOpen] = React.useState(false); + const [ref, setRef] = React.useState(null); + const [containerElement, setContainerElement] = React.useState(null); + React.useLayoutEffect(() => { + setContainerElement(document.querySelector('[data-testid="tooltip-container"]')); + setRef(document.querySelector('[data-testid="tooltip-target"]')); + setOpen(true); + }, []); - public render() { - const {open} = this.state; + const placements: Placement[] = [ + 'top-start', + 'top', + 'top-end', + 'right-start', + 'right', + 'right-end', + 'bottom-end', + 'bottom', + 'bottom-start', + 'left-end', + 'left', + 'left-start', + ]; return ( -
-

Hover over the icon.

+
- + + Target + + {placements.map(placement => + !open ? null : ( + + {placement} + + ) + )}
- - Close -
); - } - - private close = () => { - this.setState({ - open: false, - }); - }; - - private open = () => { - this.setState({ - open: true, - anchorEl: this.tooltipRef.current, - }); - }; -} - -storiesOf('Components|Popups/Tooltip/React', module) - .addParameters({component: Tooltip}) - .addDecorator(withReadme(README)) - .add('Default', () => ( -
- -
- )); + }); diff --git a/yarn.lock b/yarn.lock index df4fc11c81..1aa76db27a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4004,58 +4004,6 @@ mkdirp "^0.5.1" rimraf "^2.5.2" -"@material-ui/core@^3.9.2": - version "3.9.3" - resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-3.9.3.tgz#d378c1f4beb18df9a534ca7258c2c33fb8e0e51f" - integrity sha512-REIj62+zEvTgI/C//YL4fZxrCVIySygmpZglsu/Nl5jPqy3CDjZv1F9ubBYorHqmRgeVPh64EghMMWqk4egmfg== - dependencies: - "@babel/runtime" "^7.2.0" - "@material-ui/system" "^3.0.0-alpha.0" - "@material-ui/utils" "^3.0.0-alpha.2" - "@types/jss" "^9.5.6" - "@types/react-transition-group" "^2.0.8" - brcast "^3.0.1" - classnames "^2.2.5" - csstype "^2.5.2" - debounce "^1.1.0" - deepmerge "^3.0.0" - dom-helpers "^3.2.1" - hoist-non-react-statics "^3.2.1" - is-plain-object "^2.0.4" - jss "^9.8.7" - jss-camel-case "^6.0.0" - jss-default-unit "^8.0.2" - jss-global "^3.0.0" - jss-nested "^6.0.1" - jss-props-sort "^6.0.0" - jss-vendor-prefixer "^7.0.0" - normalize-scroll-left "^0.1.2" - popper.js "^1.14.1" - prop-types "^15.6.0" - react-event-listener "^0.6.2" - react-transition-group "^2.2.1" - recompose "0.28.0 - 0.30.0" - warning "^4.0.1" - -"@material-ui/system@^3.0.0-alpha.0": - version "3.0.0-alpha.2" - resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-3.0.0-alpha.2.tgz#096e80c8bb0f70aea435b9e38ea7749ee77b4e46" - integrity sha512-odmxQ0peKpP7RQBQ8koly06YhsPzcoVib1vByVPBH4QhwqBXuYoqlCjt02846fYspAqkrWzjxnWUD311EBbxOA== - dependencies: - "@babel/runtime" "^7.2.0" - deepmerge "^3.0.0" - prop-types "^15.6.0" - warning "^4.0.1" - -"@material-ui/utils@^3.0.0-alpha.2": - version "3.0.0-alpha.3" - resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-3.0.0-alpha.3.tgz#836c62ea46f5ffc6f0b5ea05ab814704a86908b1" - integrity sha512-rwMdMZptX0DivkqBuC+Jdq7BYTXwqKai5G5ejPpuEDKpWzi1Oxp+LygGw329FrKpuKeiqpcymlqJTjmy+quWng== - dependencies: - "@babel/runtime" "^7.2.0" - prop-types "^15.6.0" - react-is "^16.6.3" - "@mdx-js/loader@^1.5.1": version "1.5.5" resolved "https://registry.yarnpkg.com/@mdx-js/loader/-/loader-1.5.5.tgz#b658534153b3faab8f93ffc790c868dacc5b43d3" @@ -5182,14 +5130,6 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" integrity sha512-Il2DtDVRGDcqjDtE+rF8iqg1CArehSK84HZJCT7AMITlyXRBpuPhqGLDQMowraqqu1coEaimg4ZOqggt6L6L+A== -"@types/jss@^9.5.6": - version "9.5.8" - resolved "https://registry.yarnpkg.com/@types/jss/-/jss-9.5.8.tgz#258391f42211c042fc965508d505cbdc579baa5b" - integrity sha512-bBbHvjhm42UKki+wZpR89j73ykSXg99/bhuKuYYePtpma3ZAnmeGnl0WxXiZhPGsIfzKwCUkpPC0jlrVMBfRxA== - dependencies: - csstype "^2.0.0" - indefinite-observable "^1.0.1" - "@types/lodash@^4.14.136": version "4.14.136" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.136.tgz#413e85089046b865d960c9ff1d400e04c31ab60f" @@ -5302,7 +5242,7 @@ dependencies: "@types/react" "*" -"@types/react-transition-group@^2.0.8", "@types/react-transition-group@^2.9.2": +"@types/react-transition-group@^2.9.2": version "2.9.2" resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-2.9.2.tgz#c48cf2a11977c8b4ff539a1c91d259eaa627028d" integrity sha512-5Fv2DQNO+GpdPZcxp2x/OQG/H19A01WlmpjVD9cKvVFmoVLOZ9LvBgSWG6pSXIU4og5fgbvGPaCV5+VGkWAEHA== @@ -7402,11 +7342,6 @@ braces@^3.0.1, braces@~3.0.2: dependencies: fill-range "^7.0.1" -brcast@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/brcast/-/brcast-3.0.1.tgz#6256a8349b20de9eed44257a9b24d71493cd48dd" - integrity sha512-eI3yqf9YEqyGl9PCNTR46MGvDylGtaHjalcz6Q3fAPnP/PhpKkkve52vFdfGpwp4VUvK6LUr4TQN+2stCrEwTg== - brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -7900,11 +7835,6 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -change-emitter@^0.1.2: - version "0.1.6" - resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" - integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU= - character-entities-legacy@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.3.tgz#3c729991d9293da0ede6dddcaf1f2ce1009ee8b4" @@ -9060,13 +8990,6 @@ css-url-regex@^1.1.0: resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" integrity sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w= -css-vendor@^0.3.8: - version "0.3.8" - resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-0.3.8.tgz#6421cfd3034ce664fe7673972fd0119fc28941fa" - integrity sha1-ZCHP0wNM5mT+dnOXL9ARn8KJQfo= - dependencies: - is-in-browser "^1.0.2" - css-what@2.1, css-what@^2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" @@ -9255,12 +9178,7 @@ cssstyle@^2.1.0: dependencies: cssom "~0.3.6" -csstype@^2.0.0: - version "2.6.8" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.8.tgz#0fb6fc2417ffd2816a418c9336da74d7f07db431" - integrity sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA== - -csstype@^2.2.0, csstype@^2.5.2, csstype@^2.5.7: +csstype@^2.2.0, csstype@^2.5.7: version "2.6.5" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.5.tgz#1cd1dff742ebf4d7c991470ae71e12bb6751e034" integrity sha512-JsTaiksRsel5n7XwqPAfB0l3TFKdpjW/kgAELf9vrb5adGA7UCPLajKK5s3nFrcFm3Rkyp/Qkgl73ENc1UY3cA== @@ -9414,11 +9332,6 @@ de-indent@^1.0.2: resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= -debounce@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" - integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== - debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -9512,11 +9425,6 @@ deepmerge@3.2.1: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.2.1.tgz#76a1f47854bcfcd66ee9a948d110540a8e12b261" integrity sha512-+hbDSzTqEW0fWgnlKksg7XAOtT+ddZS5lHZJ6f6MdixRs9wQy+50fm1uUCVb1IkvjLUYX/SfFO021ZNwriURTw== -deepmerge@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.3.0.tgz#d3c47fd6f3a93d517b14426b0628a17b0125f5f7" - integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== - default-gateway@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" @@ -9828,7 +9736,7 @@ dom-converter@^0.2: dependencies: utila "~0.4" -dom-helpers@^3.2.1, dom-helpers@^3.4.0: +dom-helpers@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8" integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA== @@ -11164,7 +11072,7 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" -fbjs@^0.8.0, fbjs@^0.8.1: +fbjs@^0.8.0: version "0.8.17" resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd" integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90= @@ -12378,12 +12286,7 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^2.3.1: - version "2.5.5" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47" - integrity sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw== - -hoist-non-react-statics@^3.2.1, hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz#b09178f0122184fb95acf525daaecb4d8f45958b" integrity sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA== @@ -12671,11 +12574,6 @@ husky@^0.14.3: normalize-path "^1.0.0" strip-indent "^2.0.0" -hyphenate-style-name@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48" - integrity sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ== - iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -12806,13 +12704,6 @@ in-publish@^2.0.0: resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= -indefinite-observable@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/indefinite-observable/-/indefinite-observable-1.0.2.tgz#0a328793ab2385d4b9dca23eaab4afe6936a73f8" - integrity sha512-Mps0898zEduHyPhb7UCgNmfzlqNZknVmaFz5qzr0mm04YQ5FGLhAyK/dJ+NaRxGyR6juQXIxh5Ev0xx+qq0nYA== - dependencies: - symbol-observable "1.2.0" - indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -13379,11 +13270,6 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.3.tgz#e8a426a69b6d31470d3a33a47bb825cda02506ee" integrity sha512-zxQ9//Q3D/34poZf8fiy3m3XVpbQc7ren15iKqrTtLPwkPD/t3Scy9Imp63FujULGxuK0ZlCwoo5xNpktFgbOA== -is-in-browser@^1.0.2, is-in-browser@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" - integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU= - is-installed-globally@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" @@ -15252,51 +15138,6 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -jss-camel-case@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jss-camel-case/-/jss-camel-case-6.1.0.tgz#ccb1ff8d6c701c02a1fed6fb6fb6b7896e11ce44" - integrity sha512-HPF2Q7wmNW1t79mCqSeU2vdd/vFFGpkazwvfHMOhPlMgXrJDzdj9viA2SaHk9ZbD5pfL63a8ylp4++irYbbzMQ== - dependencies: - hyphenate-style-name "^1.0.2" - -jss-default-unit@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/jss-default-unit/-/jss-default-unit-8.0.2.tgz#cc1e889bae4c0b9419327b314ab1c8e2826890e6" - integrity sha512-WxNHrF/18CdoAGw2H0FqOEvJdREXVXLazn7PQYU7V6/BWkCV0GkmWsppNiExdw8dP4TU1ma1dT9zBNJ95feLmg== - -jss-global@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jss-global/-/jss-global-3.0.0.tgz#e19e5c91ab2b96353c227e30aa2cbd938cdaafa2" - integrity sha512-wxYn7vL+TImyQYGAfdplg7yaxnPQ9RaXY/cIA8hawaVnmmWxDHzBK32u1y+RAvWboa3lW83ya3nVZ/C+jyjZ5Q== - -jss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/jss-nested/-/jss-nested-6.0.1.tgz#ef992b79d6e8f63d939c4397b9d99b5cbbe824ca" - integrity sha512-rn964TralHOZxoyEgeq3hXY8hyuCElnvQoVrQwKHVmu55VRDd6IqExAx9be5HgK0yN/+hQdgAXQl/GUrBbbSTA== - dependencies: - warning "^3.0.0" - -jss-props-sort@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/jss-props-sort/-/jss-props-sort-6.0.0.tgz#9105101a3b5071fab61e2d85ea74cc22e9b16323" - integrity sha512-E89UDcrphmI0LzmvYk25Hp4aE5ZBsXqMWlkFXS0EtPkunJkRr+WXdCNYbXbksIPnKlBenGB9OxzQY+mVc70S+g== - -jss-vendor-prefixer@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz#0166729650015ef19d9f02437c73667231605c71" - integrity sha512-Agd+FKmvsI0HLcYXkvy8GYOw3AAASBUpsmIRvVQheps+JWaN892uFOInTr0DRydwaD91vSSUCU4NssschvF7MA== - dependencies: - css-vendor "^0.3.8" - -jss@^9.8.7: - version "9.8.7" - resolved "https://registry.yarnpkg.com/jss/-/jss-9.8.7.tgz#ed9763fc0f2f0260fc8260dac657af61e622ce05" - integrity sha512-awj3XRZYxbrmmrx9LUSj5pXSUfm12m8xzi/VKeqI1ZwWBtQ0kVPTs3vYs32t4rFw83CgFDukA8wKzOE9sMQnoQ== - dependencies: - is-in-browser "^1.1.3" - symbol-observable "^1.1.0" - warning "^3.0.0" - jstransformer@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" @@ -16955,11 +16796,6 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= -normalize-scroll-left@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-scroll-left/-/normalize-scroll-left-0.1.2.tgz#6b79691ba79eb5fb107fa5edfbdc06b55caee2aa" - integrity sha512-F9YMRls0zCF6BFIE2YnXDRpHPpfd91nOIaNdDgrx5YMoPLo8Wqj+6jNXHQsYBavJeXP4ww8HCt0xQAKc5qk2Fg== - normalize-url@1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" @@ -18008,7 +17844,7 @@ polished@^3.3.1: dependencies: "@babel/runtime" "^7.4.5" -popper.js@^1.14.1, popper.js@^1.14.4, popper.js@^1.14.7, popper.js@^1.15.0: +popper.js@^1.14.4, popper.js@^1.14.7, popper.js@^1.15.0: version "1.15.0" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.15.0.tgz#5560b99bbad7647e9faa475c6b8056621f5a4ff2" integrity sha512-w010cY1oCUmI+9KwwlWki+r5jxKfTFDVoadl7MSrIujHU5MJ5OR6HTDj6Xo8aoR/QsA56x8jKjA59qGH4ELtrA== @@ -19510,15 +19346,6 @@ react-error-overlay@^6.0.6: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.6.tgz#ac4d9dc4c1b5c536c2c312bf66aa2b09bfa384e2" integrity sha512-Yzpno3enVzSrSCnnljmr4b/2KUQSMZaPuqmS26t9k4nW7uwJk6STWmH9heNjPuvqUTO3jOSPkHoKgO4+Dw7uIw== -react-event-listener@^0.6.2: - version "0.6.6" - resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.6.6.tgz#758f7b991cad9086dd39fd29fad72127e1d8962a" - integrity sha512-+hCNqfy7o9wvO6UgjqFmBzARJS7qrNoda0VqzvOuioEpoEXKutiKuv92dSz6kP7rYLmyHPyYNLesi5t/aH1gfw== - dependencies: - "@babel/runtime" "^7.2.0" - prop-types "^15.6.0" - warning "^4.0.1" - react-fast-compare@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" @@ -19581,7 +19408,7 @@ react-inspector@^4.0.0: prop-types "^15.6.1" storybook-chromatic "^2.2.2" -react-is@^16.12.0, react-is@^16.6.3: +react-is@^16.12.0: version "16.12.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== @@ -19591,7 +19418,7 @@ react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.6.tgz#5bbc1e2d29141c9fbdfed456343fe2bc430a6a16" integrity sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA== -react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4: +react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== @@ -19740,7 +19567,7 @@ react-textarea-autosize@^7.1.0: "@babel/runtime" "^7.1.2" prop-types "^15.6.0" -react-transition-group@^2.2.1: +react-transition-group@^2.2.1, react-transition-group@^2.5.0: version "2.9.0" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== @@ -19993,18 +19820,6 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" -"recompose@0.28.0 - 0.30.0": - version "0.30.0" - resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.30.0.tgz#82773641b3927e8c7d24a0d87d65aeeba18aabd0" - integrity sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w== - dependencies: - "@babel/runtime" "^7.0.0" - change-emitter "^0.1.2" - fbjs "^0.8.1" - hoist-non-react-statics "^2.3.1" - react-lifecycles-compat "^3.0.2" - symbol-observable "^1.0.4" - recursive-readdir@2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f" @@ -22156,7 +21971,7 @@ svgo@^1.2.1: unquote "~1.1.1" util.promisify "~1.0.0" -symbol-observable@1.2.0, symbol-observable@^1.0.4, symbol-observable@^1.1.0: +symbol-observable@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== @@ -23414,7 +23229,7 @@ warning@^3.0.0: dependencies: loose-envify "^1.0.0" -warning@^4.0.1, warning@^4.0.2: +warning@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==