diff --git a/output/components.eslint.txt b/output/components.eslint.txt index 33437cfe84a..e70c91c1474 100644 --- a/output/components.eslint.txt +++ b/output/components.eslint.txt @@ -55,10 +55,6 @@ /home/travis/build/Talend/ui/packages/components/src/DateTimePickers/DateTimeRange/Manager/Manager.component.js 26:5 warning React Hook useEffect has missing dependencies: 'state.endDateTime' and 'state.startDateTime'. Either include them or remove the dependency array react-hooks/exhaustive-deps -/home/travis/build/Talend/ui/packages/components/src/DateTimePickers/InputDatePicker/InputDatePicker.component.js - 67:6 error Static HTML elements with event handlers require a role jsx-a11y/no-static-element-interactions - 108:2 error defaultProp "required" has no corresponding propTypes declaration react/default-props-match-prop-types - /home/travis/build/Talend/ui/packages/components/src/DateTimePickers/InputDateTimePicker/InputDateTimePicker.component.js 91:2 error defaultProp "required" has no corresponding propTypes declaration react/default-props-match-prop-types @@ -307,5 +303,5 @@ 673:44 error ["icon"] is better written in dot notation dot-notation 679:56 error ["resizable"] is better written in dot notation dot-notation -✖ 148 problems (128 errors, 20 warnings) +✖ 146 problems (126 errors, 20 warnings) 7 errors and 0 warnings potentially fixable with the `--fix` option. diff --git a/packages/components/.storybook/addons.js b/packages/components/.storybook/addons.js index 8a43488506e..330d5049efd 100644 --- a/packages/components/.storybook/addons.js +++ b/packages/components/.storybook/addons.js @@ -1,3 +1,2 @@ import '@storybook/addon-actions/register'; -import '@storybook/addon-a11y/register'; import 'storybook-addon-i18next/register'; diff --git a/packages/components/.storybook/config.js b/packages/components/.storybook/config.js index 4197858ca4a..73b3b7a54de 100644 --- a/packages/components/.storybook/config.js +++ b/packages/components/.storybook/config.js @@ -3,7 +3,6 @@ import '@talend/bootstrap-theme/src/theme/theme.scss'; import React from 'react'; import { configure, addDecorator } from '@storybook/react'; -import { withA11y } from '@storybook/addon-a11y'; import { withI18next } from 'storybook-addon-i18next'; import { locales as tuiLocales } from '@talend/locales-tui/locales'; @@ -20,7 +19,6 @@ addDecorator( languages, }), ); -addDecorator(withA11y); addDecorator(storyFn => ( <> diff --git a/packages/components/package.json b/packages/components/package.json index a54476bbe7d..ebcfba729d0 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -34,6 +34,7 @@ "url": "https://github.com/Talend/ui.git" }, "dependencies": { + "@popperjs/core": "^2.6.0", "ally.js": "^1.4.1", "classnames": "^2.2.5", "d3": "^6.3.0", @@ -54,7 +55,6 @@ "react-draggable": "^3.3.0", "react-grid-layout": "0.16.6", "react-immutable-proptypes": "^2.1.0", - "react-popper": "^1.3.7", "react-transition-group": "^2.3.1", "react-use": "^13.27.0", "react-virtualized": "9.21.0", @@ -67,7 +67,6 @@ "uuid": "^3.4.0" }, "devDependencies": { - "@storybook/addon-a11y": "^5.3.1", "@storybook/addon-actions": "^5.3.1", "@storybook/addons": "^5.3.1", "@storybook/react": "^5.3.1", diff --git a/packages/components/src/DateTimePickers/InputDatePicker/InputDatePicker.component.js b/packages/components/src/DateTimePickers/InputDatePicker/InputDatePicker.component.js index 9e12675648e..c52f976cb78 100644 --- a/packages/components/src/DateTimePickers/InputDatePicker/InputDatePicker.component.js +++ b/packages/components/src/DateTimePickers/InputDatePicker/InputDatePicker.component.js @@ -3,7 +3,6 @@ import PropTypes from 'prop-types'; import omit from 'lodash/omit'; import uuid from 'uuid'; import classnames from 'classnames'; -import { Popper } from 'react-popper'; import FocusManager from '../../FocusManager'; import { focusOnCalendar } from '../../Gesture/withCalendarGesture'; @@ -11,6 +10,7 @@ import { focusOnCalendar } from '../../Gesture/withCalendarGesture'; import DatePicker from '../Date'; import TimeZone from '../TimeZone'; import useInputPickerHandlers from '../hooks/useInputPickerHandlers'; +import { usePopper } from '../../usePopper'; import theme from './InputDatePicker.scss'; @@ -38,43 +38,29 @@ export default function InputDatePicker(props) { const inputRef = useRef(null); const containerRef = useRef(null); - + const ref = useRef(); const handlers = useInputPickerHandlers({ handleBlur: props.onBlur, handleChange: props.onChange, handleKeyDown: () => focusOnCalendar(containerRef.current), }); + usePopper(inputRef, ref, { + modifiers: [ + { name: 'hide', enabled: false }, + { name: 'preventOverflow', enabled: false }, + ], + placement: handlers.getPopperPlacement(inputRef.current), + strategy: 'fixed', + }); const inputProps = omit(props, PROPS_TO_OMIT_FOR_INPUT); const datePicker = [ , handlers.showPicker && ( - - {({ ref, style }) => ( -
- -
- )} -
+ // eslint-disable-next-line jsx-a11y/no-static-element-interactions +
+ +
), !props.hideTimezone && props.timezone && , ].filter(Boolean); @@ -118,4 +104,5 @@ InputDatePicker.propTypes = { timezone: PropTypes.string, hideTimezone: PropTypes.bool, useUTC: PropTypes.bool, + required: PropTypes.bool, }; diff --git a/packages/components/src/DateTimePickers/InputDateRangePicker/InputDateRangePicker.component.js b/packages/components/src/DateTimePickers/InputDateRangePicker/InputDateRangePicker.component.js index 9e065e3d520..4f2b6e723f5 100644 --- a/packages/components/src/DateTimePickers/InputDateRangePicker/InputDateRangePicker.component.js +++ b/packages/components/src/DateTimePickers/InputDateRangePicker/InputDateRangePicker.component.js @@ -2,7 +2,6 @@ import React, { useRef, useState } from 'react'; import PropTypes from 'prop-types'; import omit from 'lodash/omit'; import classnames from 'classnames'; -import { Popper } from 'react-popper'; import FocusManager from '../../FocusManager'; import { focusOnCalendar } from '../../Gesture/withCalendarGesture'; @@ -14,6 +13,7 @@ import useInputPickerHandlers from '../hooks/useInputPickerHandlers'; import getDefaultT from '../../translate'; +import { usePopper } from '../../usePopper'; import theme from './InputDateRangePicker.scss'; const PROPS_TO_OMIT_FOR_INPUT = ['id', 'dateFormat', 'onBlur', 'onChange', 't']; @@ -25,6 +25,7 @@ export default function InputDateRangePicker(props) { const endDateInputRef = useRef(null); const containerRef = useRef(null); const [inputRef, setInputRef] = useState(null); + const pickerRef = useRef(); const handlers = useInputPickerHandlers({ handleBlur: props.onBlur, @@ -50,6 +51,14 @@ export default function InputDateRangePicker(props) { } handlers.onChange(event, payload, inputRef.current); } + usePopper(inputRef, pickerRef, { + modifiers: [ + { name: 'hide', enabled: false }, + { name: 'preventOverflow', enabled: false }, + ], + placement: inputRef ? handlers.getPopperPlacement(inputRef.current) : 'bottom-start', + strategy: 'fixed', + }); return ( {handlers.showPicker && inputRef && ( - - {({ ref, style }) => ( -
- -
- )} -
+
+ +
)} ); diff --git a/packages/components/src/DateTimePickers/InputTimePicker/InputTimePicker.component.js b/packages/components/src/DateTimePickers/InputTimePicker/InputTimePicker.component.js index fa6d26b3eae..dc01c24e9f7 100644 --- a/packages/components/src/DateTimePickers/InputTimePicker/InputTimePicker.component.js +++ b/packages/components/src/DateTimePickers/InputTimePicker/InputTimePicker.component.js @@ -3,7 +3,6 @@ import PropTypes from 'prop-types'; import classnames from 'classnames'; import omit from 'lodash/omit'; import uuid from 'uuid'; -import { Popper } from 'react-popper'; import FocusManager from '../../FocusManager'; import Time from '../Time'; @@ -12,6 +11,7 @@ import TimeZone from '../TimeZone'; import theme from './InputTimePicker.scss'; import useInputPickerHandlers from '../hooks/useInputPickerHandlers'; import focusOnTime from '../gesture/timePickerGesture'; +import { usePopper } from '../../usePopper'; const PROPS_TO_OMIT_FOR_INPUT = [ 'id', @@ -28,42 +28,28 @@ export default function InputTimePicker(props) { const inputRef = useRef(null); const containerRef = useRef(null); + const ref = useRef(null); const handlers = useInputPickerHandlers({ handleBlur: props.onBlur, handleChange: props.onChange, handleKeyDown: () => focusOnTime(containerRef.current), }); - + usePopper(inputRef, ref, { + modifiers: [ + { name: 'hide', enabled: false }, + { name: 'preventOverflow', enabled: false }, + ], + placement: inputRef ? handlers.getPopperPlacement(inputRef.current) : 'bottom-start', + strategy: 'fixed', + }); const inputProps = omit(props, PROPS_TO_OMIT_FOR_INPUT); const timePicker = [ - , + , handlers.showPicker && ( - - {({ ref, style }) => ( -
- -
- )} -
+
+ +
), props.timezone && , ].filter(Boolean); diff --git a/packages/components/src/DateTimePickers/LegacyDateTimePickers/InputDateTimePicker/InputDateTimePicker.component.js b/packages/components/src/DateTimePickers/LegacyDateTimePickers/InputDateTimePicker/InputDateTimePicker.component.js index 20c57e4211f..e1c8f722cc3 100644 --- a/packages/components/src/DateTimePickers/LegacyDateTimePickers/InputDateTimePicker/InputDateTimePicker.component.js +++ b/packages/components/src/DateTimePickers/LegacyDateTimePickers/InputDateTimePicker/InputDateTimePicker.component.js @@ -4,12 +4,12 @@ import PropTypes from 'prop-types'; import omit from 'lodash/omit'; import keycode from 'keycode'; import uuid from 'uuid'; -import { Popper } from 'react-popper'; import FocusManager from '../../../FocusManager'; import { DateTimeContext } from '../DateTime/Context'; import DateTime from '../DateTime'; import { focusOnCalendar } from '../../../Gesture/withCalendarGesture'; +import { usePopper } from '../../../usePopper'; import theme from './InputDateTimePicker.scss'; @@ -30,6 +30,33 @@ function onMouseDown(event) { event.stopPropagation(); } +function Popper(props) { + const ref = React.useRef(); + usePopper(props.inputRef, ref, { + modifiers: [ + { name: 'hide', enabled: false }, + { name: 'preventOverflow', enabled: false }, + ], + placement: props.getPopperPlacement(), + strategy: 'fixed', + }); + return ( +
+ + {props.formMode && } +
+ ); +} +Popper.propTypes = { + formMode: PropTypes.bool.isRequired, + popoverId: PropTypes.string.isRequired, + getPopperPlacement: PropTypes.func.isRequired, + inputRef: PropTypes.oneOfType([ + PropTypes.func, + PropTypes.shape({ current: PropTypes.instanceOf(HTMLInputElement) }), + ]), +}; + class InputDateTimePicker extends React.Component { static propTypes = { id: PropTypes.string.isRequired, @@ -168,32 +195,12 @@ class InputDateTimePicker extends React.Component { />, this.state.showPicker && ( - {({ ref, style }) => ( -
- - {this.props.formMode && } -
- )} -
+ inputRef={this.inputRef} + popoverId={this.popoverId} + onMouseDown={this.onMouseDown} + formMode={this.formMode} + getPopperPlacement={this.getPopperPlacement} + /> ), ].filter(Boolean); diff --git a/packages/components/src/Typeahead/Typeahead.component.renderers.js b/packages/components/src/Typeahead/Typeahead.component.renderers.js index bfd17f3d0eb..a0472e4579b 100644 --- a/packages/components/src/Typeahead/Typeahead.component.renderers.js +++ b/packages/components/src/Typeahead/Typeahead.component.renderers.js @@ -6,12 +6,12 @@ import ControlLabel from 'react-bootstrap/lib/ControlLabel'; import FormControl from 'react-bootstrap/lib/FormControl'; import DebounceInput from 'react-debounce-input'; import classNames from 'classnames'; -import { Popper } from 'react-popper'; import { getTheme } from '../theme'; import Icon from '../Icon'; import CircularProgress from '../CircularProgress'; import Emphasis from '../Emphasis'; +import { usePopper } from '../usePopper'; import theme from './Typeahead.scss'; const css = getTheme(theme); @@ -94,28 +94,31 @@ renderInputComponent.propTypes = { readOnly: PropTypes.bool, }; +/** + * data: + state: $Shape, + instance: Instance, + options: $Shape, + name: string, + */ function computePopperPosition(data) { + const { state } = data; const GAP = 45; // the offset between the end of items container and screen boundaries - const inputDimensions = data.offsets.reference; - const { top, height } = inputDimensions; + const inputDimensions = state.rects.reference; + const { x: top, height } = inputDimensions; const offsetTop = top - GAP; const offsetBottom = window.innerHeight - top - height - GAP; - const placements = data.placement.split('-'); - let newPlacement = data.placement; + const placements = state.placement.split('-'); + let newPlacement = state.placement; + if (placements[0] === 'top' && offsetBottom > offsetTop) { newPlacement = `bottom-${placements[1]}`; } const maxHeight = newPlacement.includes('top') ? offsetTop : offsetBottom; - return { - ...data, - placement: newPlacement, - styles: { - ...data.styles, - width: inputDimensions.width, - maxHeight, - }, - }; + state.placement = newPlacement; + state.elements.popper.style.width = `${inputDimensions.width}px`; + state.elements.popper.style.maxHeight = maxHeight; } export function renderItemsContainerFactory( @@ -131,6 +134,21 @@ export function renderItemsContainerFactory( const isShown = items; const noResult = items && !items.length; + const modifiers = [ + { name: 'preventOverflow', enabled: false }, + { name: 'hide', enabled: false }, + { name: 'shift', enabled: false, phase: 'main' }, + { name: 'computePosition', enabled: true, phase: 'write', fn: computePopperPosition }, + ]; + + const tooltipref = React.createRef(); + + // eslint-disable-next-line react-hooks/rules-of-hooks + usePopper(inputRef, tooltipref, { + modifiers, + strategy: 'fixed', + placement: 'bottom-start', + }); function ItemsContainerComponent({ containerProps, children }) { if (!isShown) { return undefined; @@ -166,62 +184,26 @@ export function renderItemsContainerFactory( } return ( - - {({ placement = '', ref, scheduleUpdate, style }) => { - if (placement.includes('top')) { - // @see https://github.com/FezVrasta/react-popper/issues/283#issuecomment-512879262 - scheduleUpdate(); - } - - return ( -
-
- {render( - content, - { - isShown, - loading, - noResult, - searching, - }, - containerProps.ref, - )} -
-
- ); - }} -
+
+ {render( + content, + { + isShown, + loading, + noResult, + searching, + }, + containerProps.ref, + )} +
+ ); } @@ -239,7 +221,11 @@ export function renderSectionTitle(section) { return (
{section.icon && } - {section.title} + + {section.title} +
); } diff --git a/packages/components/src/Typeahead/__snapshots__/Typeahead.snapshot.test.js.snap b/packages/components/src/Typeahead/__snapshots__/Typeahead.snapshot.test.js.snap index 1a363cf7048..8ad4c2fc262 100644 --- a/packages/components/src/Typeahead/__snapshots__/Typeahead.snapshot.test.js.snap +++ b/packages/components/src/Typeahead/__snapshots__/Typeahead.snapshot.test.js.snap @@ -39,11 +39,9 @@ exports[`Typeahead injection should use render props to inject extra components role="listbox" style={ Object { - "left": 0, - "opacity": 0, - "pointerEvents": "none", + "left": "0", "position": "absolute", - "top": 0, + "top": "0", } } > @@ -172,11 +170,9 @@ exports[`Typeahead items should render typeahead items with match 1`] = ` role="listbox" style={ Object { - "left": 0, - "opacity": 0, - "pointerEvents": "none", + "left": "0", "position": "absolute", - "top": 0, + "top": "0", } } > @@ -439,11 +435,9 @@ exports[`Typeahead items should render typeahead with loading entry 1`] = ` role="listbox" style={ Object { - "left": 0, - "opacity": 0, - "pointerEvents": "none", + "left": "0", "position": "absolute", - "top": 0, + "top": "0", } } > @@ -506,11 +500,9 @@ exports[`Typeahead items should render typeahead with object items 1`] = ` role="listbox" style={ Object { - "left": 0, - "opacity": 0, - "pointerEvents": "none", + "left": "0", "position": "absolute", - "top": 0, + "top": "0", } } > @@ -715,11 +707,9 @@ exports[`Typeahead items should render typeahead with string items 1`] = ` role="listbox" style={ Object { - "left": 0, - "opacity": 0, - "pointerEvents": "none", + "left": "0", "position": "absolute", - "top": 0, + "top": "0", } } > @@ -830,11 +820,9 @@ exports[`Typeahead items should render typeahead without items 1`] = ` role="listbox" style={ Object { - "left": 0, - "opacity": 0, - "pointerEvents": "none", + "left": "0", "position": "absolute", - "top": 0, + "top": "0", } } > diff --git a/packages/components/src/usePopper.js b/packages/components/src/usePopper.js new file mode 100644 index 00000000000..dcf126cf6cd --- /dev/null +++ b/packages/components/src/usePopper.js @@ -0,0 +1,47 @@ +import React from 'react'; +import { createPopper } from '@popperjs/core'; + +export function usePopper(triggerRef, tooltipRef, options) { + React.useEffect(() => { + function show() { + // eslint-disable-next-line no-param-reassign + tooltipRef.current.style.display = 'block'; + } + + function hide() { + // eslint-disable-next-line no-param-reassign + tooltipRef.current.style.display = 'none'; + } + + const showEvents = ['focus', 'click']; + const hideEvents = ['blur']; + let popper = null; + if (triggerRef && tooltipRef && triggerRef.current && tooltipRef.current) { + popper = createPopper(triggerRef.current, tooltipRef.current, options); + hide(); + showEvents.forEach(event => { + triggerRef.current.addEventListener(event, show); + }); + + hideEvents.forEach(event => { + triggerRef.current.addEventListener(event, hide); + }); + } + return () => { + if (popper) { + popper.destroy(); + popper = null; + if (triggerRef && triggerRef.current) { + showEvents.forEach(event => { + triggerRef.current.removeEventListener(event, show); + }); + + hideEvents.forEach(event => { + // eslint-disable-next-line react-hooks/exhaustive-deps + triggerRef.current.removeEventListener(event, hide); + }); + } + } + }; + }, [triggerRef, tooltipRef, options]); +} diff --git a/packages/containers/.storybook/addons.js b/packages/containers/.storybook/addons.js index 8a43488506e..330d5049efd 100644 --- a/packages/containers/.storybook/addons.js +++ b/packages/containers/.storybook/addons.js @@ -1,3 +1,2 @@ import '@storybook/addon-actions/register'; -import '@storybook/addon-a11y/register'; import 'storybook-addon-i18next/register'; diff --git a/packages/containers/.storybook/config.js b/packages/containers/.storybook/config.js index dd326c1f268..d24bef4dd40 100644 --- a/packages/containers/.storybook/config.js +++ b/packages/containers/.storybook/config.js @@ -1,7 +1,6 @@ import React from 'react'; import { storiesOf, configure, addDecorator } from '@storybook/react'; import { action } from '@storybook/addon-actions'; -import { withA11y } from '@storybook/addon-a11y'; import { withI18next } from 'storybook-addon-i18next'; import { locales as tuiLocales } from '@talend/locales-tui/locales'; import createSagaMiddleware from 'redux-saga'; @@ -32,7 +31,6 @@ addDecorator( }), ); addDecorator(withCMF); -addDecorator(withA11y); addDecorator(storyFn => ( <> @@ -116,11 +114,9 @@ exports[`MultiSelectTagWidget should render section title when items has categor role="listbox" style={ Object { - "left": 0, - "opacity": 0, - "pointerEvents": "none", + "left": "0", "position": "absolute", - "top": 0, + "top": "0", } } > @@ -194,11 +190,9 @@ exports[`MultiSelectTagWidget should take default message when there isnt items role="listbox" style={ Object { - "left": 0, - "opacity": 0, - "pointerEvents": "none", + "left": "0", "position": "absolute", - "top": 0, + "top": "0", } } > diff --git a/packages/stepper/.storybook/addons.js b/packages/stepper/.storybook/addons.js index 76e401c00bc..5dea101a7c9 100644 --- a/packages/stepper/.storybook/addons.js +++ b/packages/stepper/.storybook/addons.js @@ -1,2 +1 @@ import '@storybook/addon-actions/register'; -import '@storybook/addon-a11y/register'; diff --git a/packages/stepper/.storybook/config.js b/packages/stepper/.storybook/config.js index cf2d6d1ae32..9c2cf8c2606 100644 --- a/packages/stepper/.storybook/config.js +++ b/packages/stepper/.storybook/config.js @@ -4,14 +4,12 @@ import a11y from 'react-a11y'; import IconsProvider from '@talend/react-components/lib/IconsProvider'; import { configure, addDecorator } from '@storybook/react'; import { withInfo } from '@storybook/addon-info'; -import { checkA11y } from '@storybook/addon-a11y'; import '@talend/bootstrap-theme/src/theme/theme.scss'; import 'focus-outline-manager'; a11y(ReactDOM); addDecorator(withInfo); -addDecorator(checkA11y); addDecorator(story => ( diff --git a/packages/stepper/package.json b/packages/stepper/package.json index 1f5884e2e6c..3bf1f0f696d 100644 --- a/packages/stepper/package.json +++ b/packages/stepper/package.json @@ -40,7 +40,6 @@ "lodash": "^4.17.15" }, "devDependencies": { - "@storybook/addon-a11y": "^5.3.1", "@storybook/addon-actions": "^5.3.1", "@storybook/addon-info": "^5.3.1", "@storybook/addons": "^5.3.1", diff --git a/versions/dependencies.json b/versions/dependencies.json index 504537dc102..e30e9d48549 100644 --- a/versions/dependencies.json +++ b/versions/dependencies.json @@ -59,7 +59,8 @@ "react-draggable": "^3.3.0", "react-hook-form": "^6.9.2", "react-i18next": "^10.11.4", - "react-popper": "^1.3.7", + "@popperjs/core": "^2.6.0", + "react-popper": "^2.2.4", "react-redux": "^5.0.7", "react-router": "^3.2.0", "react-router-redux": "^4.0.8", diff --git a/yarn.lock b/yarn.lock index a675e2b3986..5257c50a628 100644 --- a/yarn.lock +++ b/yarn.lock @@ -994,7 +994,7 @@ core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== @@ -2264,6 +2264,11 @@ dependencies: "@types/node" ">= 8" +"@popperjs/core@^2.6.0": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.6.0.tgz#f022195afdfc942e088ee2101285a1d31c7d727f" + integrity sha512-cPqjjzuFWNK3BSKLm0abspP0sp/IGOli4p5I5fKFAzdS8fvjdOwDCfZqAaIiXd9lPkOWi3SUUfZof3hEb7J/uw== + "@reach/router@^1.2.1": version "1.3.4" resolved "https://registry.yarnpkg.com/@reach/router/-/router-1.3.4.tgz#d2574b19370a70c80480ed91f3da840136d10f8c" @@ -2367,28 +2372,6 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@storybook/addon-a11y@^5.3.1": - version "5.3.21" - resolved "https://registry.yarnpkg.com/@storybook/addon-a11y/-/addon-a11y-5.3.21.tgz#29ab480c2b1e647da15f571448824a7f29ccfb50" - integrity sha512-pJdxyYRtEJdMjbZAurSi8RGJe7KE6w14thpDJmBfnn6Z1FKB8vprOfxJypVqcs9tY58UODqtU3ndOqnOG7d8tA== - dependencies: - "@storybook/addons" "5.3.21" - "@storybook/api" "5.3.21" - "@storybook/client-logger" "5.3.21" - "@storybook/components" "5.3.21" - "@storybook/core-events" "5.3.21" - "@storybook/theming" "5.3.21" - axe-core "^3.3.2" - core-js "^3.0.1" - global "^4.3.2" - memoizerific "^1.11.3" - react "^16.8.3" - react-redux "^7.0.2" - react-sizeme "^2.5.2" - redux "^4.0.1" - ts-dedent "^1.1.0" - util-deprecate "^1.0.2" - "@storybook/addon-actions@^5.3.1": version "5.3.21" resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-5.3.21.tgz#16eed3eb24996adfcbf70bd476a261324d6de593" @@ -4457,11 +4440,6 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axe-core@^3.3.2: - version "3.5.5" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-3.5.5.tgz#84315073b53fa3c0c51676c588d59da09a192227" - integrity sha512-5P0QZ6J5xGikH780pghEdbEKijCTrruK9KxtPZCFWUpef0f6GipO+xEZ5GKCb020mmqgbiNO6TcA55CriL784Q== - axe-core@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.0.2.tgz#c7cf7378378a51fcd272d3c09668002a4990b1cb" @@ -15903,17 +15881,6 @@ react-redux@^5.0.7: react-is "^16.6.0" react-lifecycles-compat "^3.0.0" -react-redux@^7.0.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.2.tgz#03862e803a30b6b9ef8582dadcc810947f74b736" - integrity sha512-8+CQ1EvIVFkYL/vu6Olo7JFLWop1qRUeb46sGtIMDCSpgwPQq8fPLpirIB0iTqFe9XYEFPHssdX8/UwN6pAkEA== - dependencies: - "@babel/runtime" "^7.12.1" - hoist-non-react-statics "^3.3.2" - loose-envify "^1.4.0" - prop-types "^15.7.2" - react-is "^16.13.1" - react-resizable@1.x: version "1.11.0" resolved "https://registry.yarnpkg.com/react-resizable/-/react-resizable-1.11.0.tgz#0b237c4aff16937b7663de1045861749683227ad" @@ -15965,7 +15932,7 @@ react-select@^3.0.8: react-input-autosize "^2.2.2" react-transition-group "^4.3.0" -react-sizeme@^2.5.2, react-sizeme@^2.6.7: +react-sizeme@^2.6.7: version "2.6.12" resolved "https://registry.yarnpkg.com/react-sizeme/-/react-sizeme-2.6.12.tgz#ed207be5476f4a85bf364e92042520499455453e" integrity sha512-tL4sCgfmvapYRZ1FO2VmBmjPVzzqgHA7kI8lSJ6JS6L78jXFNRdOZFpXyK6P1NBZvKPPCZxReNgzZNUajAerZw== @@ -16515,14 +16482,6 @@ redux@^3.7.1, redux@^3.7.2: loose-envify "^1.1.0" symbol-observable "^1.0.3" -redux@^4.0.1: - version "4.0.5" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" - integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== - dependencies: - loose-envify "^1.4.0" - symbol-observable "^1.2.0" - reflect.ownkeys@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460" @@ -18412,7 +18371,7 @@ symbol-observable@1.0.1: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= -symbol-observable@^1.0.3, symbol-observable@^1.2.0: +symbol-observable@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==