diff --git a/CHANGELOG.md b/CHANGELOG.md index 28e9b4178af..01ebc3d44a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ## [`master`](https://github.com/elastic/eui/tree/master) -No public interface changes since `27.1.0`. +- Replaced `react-focus-lock` with `react-focus-on` ([#3631](https://github.com/elastic/eui/pull/3631)) ## [`27.1.0`](https://github.com/elastic/eui/tree/v27.1.0) diff --git a/package.json b/package.json index 76d3b9c271a..5addf191fd2 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "prop-types": "^15.6.0", "react-ace": "^7.0.5", "react-beautiful-dnd": "^13.0.0", - "react-focus-lock": "^1.17.7", + "react-focus-on": "^3.4.1", "react-input-autosize": "^2.2.2", "react-is": "~16.3.0", "react-view": "^2.3.2", diff --git a/src-docs/src/views/focus_trap/focus_trap.js b/src-docs/src/views/focus_trap/focus_trap.js index 3d77dae2281..6272c0a441e 100644 --- a/src-docs/src/views/focus_trap/focus_trap.js +++ b/src-docs/src/views/focus_trap/focus_trap.js @@ -12,7 +12,7 @@ import { import FormExample from '../form_compressed/form_compressed'; export default () => { - const [isDisabled, changeDisabled] = useState(false); + const [isDisabled, changeDisabled] = useState(true); const toggleDisabled = () => changeDisabled(!isDisabled); diff --git a/src-docs/src/views/focus_trap/focus_trap_example.js b/src-docs/src/views/focus_trap/focus_trap_example.js index 89de1fad48f..844ec9b175a 100644 --- a/src-docs/src/views/focus_trap/focus_trap_example.js +++ b/src-docs/src/views/focus_trap/focus_trap_example.js @@ -47,6 +47,10 @@ export const FocusTrapExample = { Use clickOutsideDisables to disable the focus trap when the user clicks outside the trap.

+

+ Use noIsolation=false when pointer events on + outside elements should be disallowed. +

), props: { EuiFocusTrap }, diff --git a/src/components/collapsible_nav/__snapshots__/collapsible_nav.test.tsx.snap b/src/components/collapsible_nav/__snapshots__/collapsible_nav.test.tsx.snap index 43fabc7dfea..795c6060a97 100644 --- a/src/components/collapsible_nav/__snapshots__/collapsible_nav.test.tsx.snap +++ b/src/components/collapsible_nav/__snapshots__/collapsible_nav.test.tsx.snap @@ -6,12 +6,12 @@ Array [
, @@ -37,12 +37,12 @@ Array [
, @@ -91,12 +91,12 @@ Array [
, @@ -150,12 +150,12 @@ Array [
, @@ -201,12 +201,12 @@ Array [
, @@ -252,12 +252,12 @@ Array [
, @@ -351,12 +351,12 @@ Array [
, @@ -407,12 +407,12 @@ Array [
, diff --git a/src/components/collapsible_nav/collapsible_nav.test.tsx b/src/components/collapsible_nav/collapsible_nav.test.tsx index 32f0c401bfa..980559a5562 100644 --- a/src/components/collapsible_nav/collapsible_nav.test.tsx +++ b/src/components/collapsible_nav/collapsible_nav.test.tsx @@ -18,8 +18,8 @@ */ import React from 'react'; -import { render } from 'enzyme'; -import { requiredProps } from '../../test/required_props'; +import { render, mount } from 'enzyme'; +import { requiredProps, takeMountedSnapshot } from '../../test'; import { EuiCollapsibleNav } from './collapsible_nav'; @@ -33,20 +33,28 @@ const propsNeededToRender = { id: 'id', isOpen: true }; describe('EuiCollapsibleNav', () => { test('is rendered', () => { - const component = render( + const component = mount( ); - expect(component).toMatchSnapshot(); + expect( + takeMountedSnapshot(component, { + hasArrayOutput: true, + }) + ).toMatchSnapshot(); }); describe('props', () => { test('onClose', () => { - const component = render( + const component = mount( {}} /> ); - expect(component).toMatchSnapshot(); + expect( + takeMountedSnapshot(component, { + hasArrayOutput: true, + }) + ).toMatchSnapshot(); }); test('isDocked', () => { @@ -58,23 +66,31 @@ describe('EuiCollapsibleNav', () => { }); test('dockedBreakpoint', () => { - const component = render( + const component = mount( ); - expect(component).toMatchSnapshot(); + expect( + takeMountedSnapshot(component, { + hasArrayOutput: true, + }) + ).toMatchSnapshot(); }); test('button', () => { - const component = render( + const component = mount( } /> ); - expect(component).toMatchSnapshot(); + expect( + takeMountedSnapshot(component, { + hasArrayOutput: true, + }) + ).toMatchSnapshot(); }); test('showButtonIfDocked', () => { - const component = render( + const component = mount( } @@ -83,39 +99,55 @@ describe('EuiCollapsibleNav', () => { /> ); - expect(component).toMatchSnapshot(); + expect( + takeMountedSnapshot(component, { + hasArrayOutput: true, + }) + ).toMatchSnapshot(); }); test('can alter mask props with maskProps without throwing error', () => { - const component = render( + const component = mount( ); - expect(component).toMatchSnapshot(); + expect( + takeMountedSnapshot(component, { + hasArrayOutput: true, + }) + ).toMatchSnapshot(); }); }); describe('close button', () => { test('can be hidden', () => { - const component = render( + const component = mount( ); - expect(component).toMatchSnapshot(); + expect( + takeMountedSnapshot(component, { + hasArrayOutput: true, + }) + ).toMatchSnapshot(); }); test('extends EuiButtonEmpty', () => { - const component = render( + const component = mount( ); - expect(component).toMatchSnapshot(); + expect( + takeMountedSnapshot(component, { + hasArrayOutput: true, + }) + ).toMatchSnapshot(); }); }); diff --git a/src/components/color_picker/color_palette_picker/__snapshots__/color_palette_picker.test.tsx.snap b/src/components/color_picker/color_palette_picker/__snapshots__/color_palette_picker.test.tsx.snap index 4f5462bd6dd..bdd9ae741e0 100644 --- a/src/components/color_picker/color_palette_picker/__snapshots__/color_palette_picker.test.tsx.snap +++ b/src/components/color_picker/color_palette_picker/__snapshots__/color_palette_picker.test.tsx.snap @@ -404,1503 +404,3 @@ exports[`EuiColorPalettePicker more props are propagated to each option 1`] = `
`; - -exports[`EuiColorPalettePicker more props are propagated to each option 2`] = ` - - -
- Palette 1 -
-
-
, - "inputDisplay":
, - "value": "paletteFixed", - }, - Object { - "className": "paletteLinearClass", - "data-test-subj": "gradient-data-test-subj", - "dropdownDisplay":
-
- Linear Gradient -
-
-
, - "inputDisplay":
, - "value": "paletteLinear", - }, - Object { - "data-test-subj": "gradient-with-stops-data-test-subj", - "dropdownDisplay":
-
- Linear Gradient with stops -
-
-
, - "inputDisplay":
, - "value": "paletteLinearStops", - }, - Object { - "data-test-subj": "text-data-test-subj", - "dropdownDisplay":
- Plain text as a custom option -
, - "inputDisplay": "Plain text as a custom option", - "value": "custom", - }, - ] - } - readOnly={false} - valueOfSelected="paletteFixed" - > - -
- Palette 1 -
-
-
, - "inputDisplay":
, - "value": "paletteFixed", - }, - Object { - "className": "paletteLinearClass", - "data-test-subj": "gradient-data-test-subj", - "dropdownDisplay":
-
- Linear Gradient -
-
-
, - "inputDisplay":
, - "value": "paletteLinear", - }, - Object { - "data-test-subj": "gradient-with-stops-data-test-subj", - "dropdownDisplay":
-
- Linear Gradient with stops -
-
-
, - "inputDisplay":
, - "value": "paletteLinearStops", - }, - Object { - "data-test-subj": "text-data-test-subj", - "dropdownDisplay":
- Plain text as a custom option -
, - "inputDisplay": "Plain text as a custom option", - "value": "custom", - }, - ] - } - readOnly={false} - value="paletteFixed" - /> - } - buttonRef={[Function]} - className="euiSuperSelect" - closePopover={[Function]} - display="block" - hasArrow={false} - isOpen={true} - ownFocus={false} - panelClassName="euiSuperSelect__popoverPanel" - panelPaddingSize="none" - popoverRef={[Function]} - > - -
-
- -
- Palette 1 -
-
-
, - "inputDisplay":
, - "value": "paletteFixed", - }, - Object { - "className": "paletteLinearClass", - "data-test-subj": "gradient-data-test-subj", - "dropdownDisplay":
-
- Linear Gradient -
-
-
, - "inputDisplay":
, - "value": "paletteLinear", - }, - Object { - "data-test-subj": "gradient-with-stops-data-test-subj", - "dropdownDisplay":
-
- Linear Gradient with stops -
-
-
, - "inputDisplay":
, - "value": "paletteLinearStops", - }, - Object { - "data-test-subj": "text-data-test-subj", - "dropdownDisplay":
- Plain text as a custom option -
, - "inputDisplay": "Plain text as a custom option", - "value": "custom", - }, - ] - } - readOnly={false} - value="paletteFixed" - > - - -
-
- - - , - } - } - > - - } - > - Select an option: -
- , is selected - - - - - - -
- - -
-
- - -
- - -
-
-
-
- -
-
-
- } - > - - - -
- -
-
-
- - - } - onActivation={[Function]} - onDeactivation={[Function]} - persistentFocus={false} - > - - - } - onActivation={[Function]} - onDeactivation={[Function]} - persistentFocus={false} - /> - - -
-
- -
- -

- - You are in a form selector of 4 items and must select a single option. Use the up and down keys to navigate or escape to close. - -

-
-
- - - - - - - - - - - - -
-
-
-
- -
-
- -
- - - - - -
- - - - -`; diff --git a/src/components/color_picker/color_palette_picker/color_palette_picker.test.tsx b/src/components/color_picker/color_palette_picker/color_palette_picker.test.tsx index 1d0fcc2a189..e1f9a288678 100644 --- a/src/components/color_picker/color_palette_picker/color_palette_picker.test.tsx +++ b/src/components/color_picker/color_palette_picker/color_palette_picker.test.tsx @@ -174,7 +174,5 @@ describe('EuiColorPalettePicker', () => { .simulate('click'); expect(takeMountedSnapshot(component)).toMatchSnapshot(); - - expect(component).toMatchSnapshot(); }); }); diff --git a/src/components/datagrid/__snapshots__/data_grid.test.tsx.snap b/src/components/datagrid/__snapshots__/data_grid.test.tsx.snap index 2e43c1c11e9..e6e34f9d24d 100644 --- a/src/components/datagrid/__snapshots__/data_grid.test.tsx.snap +++ b/src/components/datagrid/__snapshots__/data_grid.test.tsx.snap @@ -179,7 +179,6 @@ Array [ />,
,
,
,
@@ -48,12 +48,12 @@ exports[`EuiFlyout props accepts div props 1`] = `
@@ -91,12 +91,12 @@ exports[`EuiFlyout props close button is not rendered 1`] = `
@@ -120,12 +120,12 @@ exports[`EuiFlyout props max width can be set to a custom number 1`] = `
- - -
- - - - -
- -
-
-
- - - } - onActivation={[Function]} - onDeactivation={[Function]} - persistentFocus={false} - > - - - } - onActivation={[Function]} - onDeactivation={[Function]} - persistentFocus={false} - /> - - -
-
- -
- -

- - You are in a form selector of 2 items and must select a single option. Use the up and down keys to navigate or escape to close. - -

-
-
- - - - - - -
-
-
-
- -
-
- -
- - - - -
- - - -`; - exports[`EuiSuperSelect props options are rendered when select is open 1`] = `
{ component.find('button[data-test-subj="superSelect"]').simulate('click'); expect(takeMountedSnapshot(component)).toMatchSnapshot(); - - expect(component).toMatchSnapshot(); }); }); }); diff --git a/src/components/modal/__snapshots__/confirm_modal.test.tsx.snap b/src/components/modal/__snapshots__/confirm_modal.test.tsx.snap index 1f40a73883a..0116ce17d1f 100644 --- a/src/components/modal/__snapshots__/confirm_modal.test.tsx.snap +++ b/src/components/modal/__snapshots__/confirm_modal.test.tsx.snap @@ -4,12 +4,12 @@ exports[`EuiConfirmModal renders EuiConfirmModal 1`] = ` Array [
,
,
,
, ] @@ -110,12 +110,12 @@ exports[`EuiConfirmModal renders EuiConfirmModal without EuiModalBody, if empty Array [
,
,
,
, ] diff --git a/src/components/modal/__snapshots__/modal.test.tsx.snap b/src/components/modal/__snapshots__/modal.test.tsx.snap index f6a48707fd4..81b29c3435b 100644 --- a/src/components/modal/__snapshots__/modal.test.tsx.snap +++ b/src/components/modal/__snapshots__/modal.test.tsx.snap @@ -4,12 +4,12 @@ exports[`renders EuiModal 1`] = ` Array [
,
,
,
, ] diff --git a/src/components/modal/confirm_modal.test.tsx b/src/components/modal/confirm_modal.test.tsx index 84bad6a0013..ec643169249 100644 --- a/src/components/modal/confirm_modal.test.tsx +++ b/src/components/modal/confirm_modal.test.tsx @@ -18,9 +18,13 @@ */ import React from 'react'; -import { mount, render } from 'enzyme'; +import { mount } from 'enzyme'; -import { findTestSubject, requiredProps } from '../../test'; +import { + findTestSubject, + requiredProps, + takeMountedSnapshot, +} from '../../test'; import { keys } from '../../services'; import { @@ -39,7 +43,7 @@ beforeEach(() => { describe('EuiConfirmModal', () => { test('renders EuiConfirmModal', () => { - const component = render( + const component = mount( {}} @@ -50,11 +54,13 @@ describe('EuiConfirmModal', () => { This is a confirmation modal example ); - expect(component).toMatchSnapshot(); + expect( + takeMountedSnapshot(component, { hasArrayOutput: true }) + ).toMatchSnapshot(); }); test('renders EuiConfirmModal without EuiModalBody, if empty', () => { - const component = render( + const component = mount( {}} @@ -64,7 +70,9 @@ describe('EuiConfirmModal', () => { {...requiredProps} /> ); - expect(component).toMatchSnapshot(); + expect( + takeMountedSnapshot(component, { hasArrayOutput: true }) + ).toMatchSnapshot(); }); test('onConfirm', () => { diff --git a/src/components/modal/modal.test.tsx b/src/components/modal/modal.test.tsx index ba4fc0fa4d4..18680529aee 100644 --- a/src/components/modal/modal.test.tsx +++ b/src/components/modal/modal.test.tsx @@ -18,8 +18,8 @@ */ import React from 'react'; -import { render } from 'enzyme'; -import { requiredProps } from '../../test/required_props'; +import { mount } from 'enzyme'; +import { requiredProps, takeMountedSnapshot } from '../../test'; import { EuiModal } from './modal'; @@ -30,5 +30,7 @@ test('renders EuiModal', () => { ); - expect(render(component)).toMatchSnapshot(); + expect( + takeMountedSnapshot(mount(component), { hasArrayOutput: true }) + ).toMatchSnapshot(); }); diff --git a/src/components/popover/popover.tsx b/src/components/popover/popover.tsx index d67f8982af0..e96f718ddbf 100644 --- a/src/components/popover/popover.tsx +++ b/src/components/popover/popover.tsx @@ -30,7 +30,7 @@ import tabbable from 'tabbable'; import { CommonProps, NoArgCallback } from '../common'; import { FocusTarget, EuiFocusTrap } from '../focus_trap'; -import { Props as ReactFocusLockProps } from 'react-focus-lock'; // eslint-disable-line import/named +import { ReactFocusOnProps } from 'react-focus-on/dist/es5/types'; import { cascadingMenuKeys, @@ -140,7 +140,7 @@ export interface EuiPopoverProps { /** * Function callback for when the focus trap is deactivated */ - onTrapDeactivation?: ReactFocusLockProps['onDeactivation']; + onTrapDeactivation?: ReactFocusOnProps['onDeactivation']; /** * Distance away from the anchor that the popover will render. diff --git a/src/test/take_mounted_snapshot.ts b/src/test/take_mounted_snapshot.ts index 6a319cb7711..a845b81b4e8 100644 --- a/src/test/take_mounted_snapshot.ts +++ b/src/test/take_mounted_snapshot.ts @@ -20,6 +20,10 @@ import { ReactWrapper } from 'enzyme'; import { Component } from 'react'; +interface TakeMountedSnapshotOptions { + hasArrayOutput?: boolean; +} + /** * Use this function to generate a Jest snapshot of components that have been fully rendered * using Enzyme's `mount` method. Typically, a mounted component will result in a snapshot @@ -27,10 +31,23 @@ import { Component } from 'react'; * leaving only HTML elements in the snapshot. */ export const takeMountedSnapshot = ( - mountedComponent: ReactWrapper<{}, {}, Component> + mountedComponent: ReactWrapper<{}, {}, Component>, + options: TakeMountedSnapshotOptions = {} ) => { + const opts: TakeMountedSnapshotOptions = { + hasArrayOutput: false, + ...options, + }; const html = mountedComponent.html(); const template = document.createElement('template'); template.innerHTML = html; - return template.content.firstChild; + const snapshot = template.content.firstChild; + if (opts.hasArrayOutput) { + const snapshotArray: ChildNode[] = []; + template.content.childNodes.forEach(el => { + snapshotArray.push(el); + }); + return snapshotArray; + } + return snapshot; }; diff --git a/yarn.lock b/yarn.lock index 62e83aa6687..cc794f6dabf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2314,6 +2314,13 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +aria-hidden@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.1.1.tgz#0c356026d3f65e2bd487a3adb73f0c586be2c37e" + integrity sha512-M7zYxCcOQPOaxGHoMTKUFD2UNcVFTp9ycrdStLcTPLf8zgTXC3+YcGe+UuzSh5X1BX/0/PtS8xTNy4xyH/6xtw== + dependencies: + tslib "^1.0.0" + aria-query@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc" @@ -6896,10 +6903,10 @@ flush-write-stream@^1.0.0: inherits "^2.0.1" readable-stream "^2.0.4" -focus-lock@^0.5.2: - version "0.5.4" - resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.5.4.tgz#537644d61b9e90fd97075aa680b8add1de24e819" - integrity sha512-A9ngdb0NyI6UygBQ0eD+p8SpLWTkdEDn67I3EGUUcDUfxH694mLA/xBWwhWhoj/2YLtsv2EoQdAx9UOKs8d/ZQ== +focus-lock@^0.6.7: + version "0.6.8" + resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.6.8.tgz#61985fadfa92f02f2ee1d90bc738efaf7f3c9f46" + integrity sha512-vkHTluRCoq9FcsrldC0ulQHiyBYgVJB2CX53I8r0nTC6KnEij7Of0jpBspjt3/CuNb6fyoj3aOh9J2HgQUM0og== follow-redirects@1.5.10: version "1.5.10" @@ -7245,6 +7252,11 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + get-port@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" @@ -13498,13 +13510,12 @@ react-beautiful-dnd@^13.0.0: redux "^4.0.4" use-memo-one "^1.1.1" -react-clientside-effect@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.0.tgz#db823695f75e9616a5e4dd6d908e5ea627fb2516" - integrity sha512-cVIsGG7SNHsQsCP4+fw7KFUB0HiYiU8hbvL640XaLCbZ31aK8/lj0qOKJ2K+xRjuQz/IM4Q4qclI0aEqTtcXtA== +react-clientside-effect@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.2.tgz#6212fb0e07b204e714581dd51992603d1accc837" + integrity sha512-nRmoyxeok5PBO6ytPvSjKp9xwXg9xagoTK1mMjwnQxqM9Hd7MNPl+LS1bOSOe+CV2+4fnEquc7H/S8QD3q697A== dependencies: "@babel/runtime" "^7.0.0" - shallowequal "^1.1.0" react-docgen@^4.1.0: version "4.1.1" @@ -13529,15 +13540,29 @@ react-dom@^16.12.0: prop-types "^15.6.2" scheduler "^0.18.0" -react-focus-lock@^1.17.7: - version "1.17.7" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-1.17.7.tgz#ea7fd05d88d0e32833cad241f9333c124c35ba9a" - integrity sha512-zDCqkIhuuHCCmWzJghAz6EM6ROx8/sHhQJWjmO6oteQRHX+xTCE5FWIu3zLB5UiUa5eLd66tTh4Fs8YDp0G+6Q== +react-focus-lock@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.3.1.tgz#9d5d85899773609c7eefa4fc54fff6a0f5f2fc47" + integrity sha512-j15cWLPzH0gOmRrUg01C09Peu8qbcdVqr6Bjyfxj80cNZmH+idk/bNBYEDSmkAtwkXI+xEYWSmHYqtaQhZ8iUQ== dependencies: "@babel/runtime" "^7.0.0" - focus-lock "^0.5.2" + focus-lock "^0.6.7" prop-types "^15.6.2" - react-clientside-effect "^1.2.0" + react-clientside-effect "^1.2.2" + use-callback-ref "^1.2.1" + use-sidecar "^1.0.1" + +react-focus-on@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/react-focus-on/-/react-focus-on-3.4.1.tgz#e184f3c44185e341598c5d9d44b2987ad459b240" + integrity sha512-KGRIl0iAu+1k1dcX7eQCXF5ZR/nl+XyXN5Ukw/OY80vLaK2b6vDzNqnX0HdYbY5xSUhIRUvMWEzSsdEyPjvk/Q== + dependencies: + aria-hidden "^1.1.1" + react-focus-lock "^2.3.1" + react-remove-scroll "^2.3.0" + react-style-singleton "^2.1.0" + use-callback-ref "^1.2.3" + use-sidecar "^1.0.1" react-input-autosize@^2.2.2: version "2.2.2" @@ -13602,6 +13627,25 @@ react-redux@^7.1.1: prop-types "^15.7.2" react-is "^16.9.0" +react-remove-scroll-bar@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.1.0.tgz#edafe9b42a42c0dad9bdd10712772a1f9a39d7b9" + integrity sha512-5X5Y5YIPjIPrAoMJxf6Pfa7RLNGCgwZ95TdnVPgPuMftRfO8DaC7F4KP1b5eiO8hHbe7u+wZNDbYN5WUTpv7+g== + dependencies: + react-style-singleton "^2.1.0" + tslib "^1.0.0" + +react-remove-scroll@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.3.0.tgz#3af06fe2f7130500704b676cdef94452c08fe593" + integrity sha512-UqVimLeAe+5EHXKfsca081hAkzg3WuDmoT9cayjBegd6UZVhlTEchleNp9J4TMGkb/ftLve7ARB5Wph+HJ7A5g== + dependencies: + react-remove-scroll-bar "^2.1.0" + react-style-singleton "^2.1.0" + tslib "^1.0.0" + use-callback-ref "^1.2.3" + use-sidecar "^1.0.1" + react-router-dom@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" @@ -13641,6 +13685,15 @@ react-simple-code-editor@^0.10.0: resolved "https://registry.yarnpkg.com/react-simple-code-editor/-/react-simple-code-editor-0.10.0.tgz#73e7ac550a928069715482aeb33ccba36efe2373" integrity sha512-bL5W5mAxSW6+cLwqqVWY47Silqgy2DKDTR4hDBrLrUqC5BXc29YVx17l2IZk5v36VcDEq1Bszu2oHm1qBwKqBA== +react-style-singleton@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.1.0.tgz#7396885332e9729957f9df51f08cadbfc164e1c4" + integrity sha512-DH4ED+YABC1dhvSDYGGreAHmfuTXj6+ezT3CmHoqIEfxNgEYfIMoOtmbRp42JsUst3IPqBTDL+8r4TF7EWhIHw== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^1.0.0" + react-test-renderer@^16.0.0-0: version "16.8.2" resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.8.2.tgz#3ce0bf12aa211116612fda01a886d6163c9c459b" @@ -14976,11 +15029,6 @@ shallow-clone@^1.0.0: kind-of "^5.0.0" mixin-object "^2.0.1" -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -16241,16 +16289,16 @@ ts-debounce@^1.0.0: resolved "https://registry.yarnpkg.com/ts-debounce/-/ts-debounce-1.0.0.tgz#e433301744ba75fe25466f7f23e1382c646aae6a" integrity sha512-V+IzWj418IoqqxVJD6I0zjPtgIyvAJ8VyViqzcxZ0JRiJXsi5mCmy1yUKkWd2gUygT28a8JsVFCgqdrf2pLUHQ== +tslib@^1.0.0, tslib@^1.9.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== -tslib@^1.9.1: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== - tsutils@^3.17.1: version "3.17.1" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" @@ -16620,11 +16668,24 @@ url@^0.11.0, url@~0.11.0: punycode "1.3.2" querystring "0.2.0" +use-callback-ref@^1.2.1, use-callback-ref@^1.2.3: + version "1.2.4" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.2.4.tgz#d86d1577bfd0b955b6e04aaf5971025f406bea3c" + integrity sha512-rXpsyvOnqdScyied4Uglsp14qzag1JIemLeTWGKbwpotWht57hbP78aNT+Q4wdFKQfQibbUX4fb6Qb4y11aVOQ== + use-memo-one@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.1.tgz#39e6f08fe27e422a7d7b234b5f9056af313bd22c" integrity sha512-oFfsyun+bP7RX8X2AskHNTxu+R3QdE/RC5IefMbqptmACAA/gfol1KDD5KRzPsGMa62sWxGZw+Ui43u6x4ddoQ== +use-sidecar@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.0.2.tgz#e72f582a75842f7de4ef8becd6235a4720ad8af6" + integrity sha512-287RZny6m5KNMTb/Kq9gmjafi7lQL0YHO1lYolU6+tY1h9+Z3uCtkJJ3OSOq3INwYf2hBryCcDh4520AhJibMA== + dependencies: + detect-node "^2.0.4" + tslib "^1.9.3" + use@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8"