From d7dae8af4c30b91c8179948e18a72bb3f60f147d Mon Sep 17 00:00:00 2001 From: Aki Hamano <54422211+t-hamano@users.noreply.github.com> Date: Sun, 25 Jun 2023 12:25:51 +0900 Subject: [PATCH 01/37] Site Editor: Disable the revision button if there is no clickable menu (#51851) --- .../src/components/global-styles/ui.js | 58 +++++++++++-------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/packages/edit-site/src/components/global-styles/ui.js b/packages/edit-site/src/components/global-styles/ui.js index 986ec21dc9dd4..8d62da34f4966 100644 --- a/packages/edit-site/src/components/global-styles/ui.js +++ b/packages/edit-site/src/components/global-styles/ui.js @@ -11,6 +11,7 @@ import { __experimentalNavigatorScreen as NavigatorScreen, __experimentalUseNavigator as useNavigator, createSlotFill, + Button, DropdownMenu, MenuGroup, MenuItem, @@ -142,33 +143,42 @@ function GlobalStylesRevisionsMenu() { return ( - - { ( { onClose } ) => ( - - { hasRevisions && ( + { canReset || hasRevisions ? ( + + { ( { onClose } ) => ( + + { hasRevisions && ( + + { revisionsCount } + + } + > + { __( 'Revision history' ) } + + ) } - { revisionsCount } - - } + onClick={ () => { + onReset(); + onClose(); + } } + disabled={ ! canReset } > - { __( 'Revision history' ) } + { __( 'Reset to defaults' ) } - ) } - { - onReset(); - onClose(); - } } - disabled={ ! canReset } - > - { __( 'Reset to defaults' ) } - - - ) } - + + ) } + + ) : ( + - - + { showActions && ( +
+ +
) } diff --git a/packages/block-editor/src/components/link-control/search-input.js b/packages/block-editor/src/components/link-control/search-input.js index 4e30daaa96524..d6023b9220d63 100644 --- a/packages/block-editor/src/components/link-control/search-input.js +++ b/packages/block-editor/src/components/link-control/search-input.js @@ -46,7 +46,7 @@ const LinkControlSearchInput = forwardRef( suggestionsQuery = {}, withURLSuggestion = true, createSuggestionButtonText, - useLabel = false, + hideLabelFromVision = false, }, ref ) => { @@ -120,7 +120,7 @@ const LinkControlSearchInput = forwardRef( }; const inputClasses = classnames( className, { - 'has-no-label': ! useLabel, + // 'has-no-label': ! hideLabelFromVision, } ); return ( @@ -128,7 +128,8 @@ const LinkControlSearchInput = forwardRef( setSettingsOpen( ! settingsOpen ) } - icon={ settingsIcon } - label={ __( 'Link Settings' ) } + icon={ isRTL() ? chevronLeftSmall : chevronRightSmall } aria-controls={ settingsDrawerId } - /> + > + { _x( 'Advanced', 'Additional link settings' ) } + { settingsOpen && ( .components-base-control__field { - display: flex; - align-items: center; - } - - .components-base-control__label { - margin-right: $grid-unit-20; - margin-bottom: 0; - min-width: 29px; // align with search results. - } - input[type="text"], // Specificity overide of URLInput defaults. &.block-editor-url-input input[type="text"].block-editor-url-input__input { @include input-control; - width: calc(100% - #{$grid-unit-20 * 2}); display: block; - padding: 11px $grid-unit-20; + border: 1px solid $gray-600; + border-radius: $radius-block-ui; + height: $button-size-next-default-40px; // components do not properly support unstable-large yet. margin: 0; + padding: $grid-unit-10 $grid-unit-20; position: relative; - border: 1px solid $gray-300; - border-radius: $radius-block-ui; + width: 100%; } } @@ -94,12 +83,12 @@ $preview-image-height: 140px; flex-direction: row-reverse; // put "Cancel" on the left but retain DOM order. justify-content: flex-start; gap: $grid-unit-10; + padding: $grid-unit-10; order: 20; } .block-editor-link-control__search-results-wrapper { position: relative; - margin-top: -$grid-unit-20 + 1px; &::before, &::after { @@ -440,36 +429,7 @@ $preview-image-height: 140px; display: flex; // allow for ordering. flex-direction: column; flex-basis: 100%; // occupy full width. - margin-top: $grid-unit-20; - padding-top: $grid-unit-20; position: relative; - - &::after { - content: ""; - display: block; - height: 1px; - background-color: $gray-300; - position: absolute; - left: -$grid-unit-20; - right: -$grid-unit-20; - top: 0; - } -} - -.block-editor-link-control__tools { - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-between; - margin: 0; - padding: $grid-unit-20; - - // To hide the horizontal scrollbar on toggle. - // Margin and padding are needed to prevent cutoff of the toggle button focus outline. - // See: https://github.com/WordPress/gutenberg/pull/47986 - margin-top: calc(var(--wp-admin-border-width-focus) * -1); - padding-top: var(--wp-admin-border-width-focus); - overflow: hidden; } .block-editor-link-control__unlink { @@ -477,17 +437,10 @@ $preview-image-height: 140px; padding-right: $grid-unit-20; } -.block-editor-link-control__settings { - flex: 1; - margin: 0; - - .is-alternate & { - border-top: $border-width solid $gray-900; - } -} - .block-editor-link-control__setting { margin-bottom: $grid-unit-20; + flex: 1; + padding: $grid-unit-10 0 $grid-unit-10 $grid-unit-30; // Cancel left margin inherited from WP Admin Forms CSS. input { @@ -499,6 +452,31 @@ $preview-image-height: 140px; } } +.block-editor-link-control__tools { + padding: $grid-unit-10 $grid-unit-10 0 $grid-unit-10; + margin-top: #{$grid-unit-20 * -1}; + + .components-button.block-editor-link-control__drawer-toggle { + padding-left: 0; + gap: 0; + + // Point downwards when open (same as list view expander) + &[aria-expanded="true"] svg { + visibility: visible; + transition: transform 0.1s ease; + transform: rotate(90deg); + @include reduce-motion("transition"); + } + // Point rightwards when closed (same as list view expander) + &[aria-expanded="false"] svg { + visibility: visible; + transform: rotate(0deg); + transition: transform 0.1s ease; + @include reduce-motion("transition"); + } + } +} + .block-editor-link-control .block-editor-link-control__search-input .components-spinner { display: block; diff --git a/packages/block-editor/src/components/link-control/test/index.js b/packages/block-editor/src/components/link-control/test/index.js index e5084844946be..20b72363391ee 100644 --- a/packages/block-editor/src/components/link-control/test/index.js +++ b/packages/block-editor/src/components/link-control/test/index.js @@ -138,7 +138,7 @@ describe( 'Basic rendering', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); expect( searchInput ).toBeVisible(); } ); @@ -147,7 +147,7 @@ describe( 'Basic rendering', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); expect( searchInput ).toBeVisible(); // Make sure we use the ARIA 1.0 pattern with aria-owns. @@ -170,7 +170,7 @@ describe( 'Basic rendering', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); // Simulate searching for a term. await user.type( searchInput, 'Hello' ); @@ -283,7 +283,7 @@ describe( 'Basic rendering', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); // Simulate searching for a term. await user.type( searchInput, searchTerm ); @@ -296,7 +296,7 @@ describe( 'Basic rendering', () => { render( ); expect( - screen.queryByRole( 'combobox', { name: 'URL' } ) + screen.queryByRole( 'combobox', { name: 'Link' } ) ).not.toBeInTheDocument(); } ); @@ -309,7 +309,7 @@ describe( 'Basic rendering', () => { ); expect( - screen.getByRole( 'combobox', { name: 'URL' } ) + screen.getByRole( 'combobox', { name: 'Link' } ) ).toBeVisible(); } ); @@ -327,7 +327,7 @@ describe( 'Basic rendering', () => { await user.click( editButton ); expect( - screen.getByRole( 'combobox', { name: 'URL' } ) + screen.getByRole( 'combobox', { name: 'Link' } ) ).toBeVisible(); // If passed `forceIsEditingLink` of `false` while editing, should @@ -340,7 +340,7 @@ describe( 'Basic rendering', () => { ); expect( - screen.queryByRole( 'combobox', { name: 'URL' } ) + screen.queryByRole( 'combobox', { name: 'Link' } ) ).not.toBeInTheDocument(); } ); @@ -424,7 +424,7 @@ describe( 'Searching for a link', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); // Simulate searching for a term. await user.type( searchInput, searchTerm ); @@ -448,7 +448,9 @@ describe( 'Searching for a link', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { + name: 'Link', + } ); // Simulate searching for a term. await user.type( searchInput, searchTerm ); @@ -497,7 +499,9 @@ describe( 'Searching for a link', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { + name: 'Link', + } ); // Simulate searching for a term. await user.type( searchInput, searchTerm ); @@ -528,7 +532,7 @@ describe( 'Searching for a link', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); // Simulate searching for a term. await user.type( searchInput, searchTerm ); @@ -571,7 +575,7 @@ describe( 'Searching for a link', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); // Simulate searching for a term. await user.type( searchInput, 'anything' ); @@ -582,12 +586,43 @@ describe( 'Searching for a link', () => { expect( mockFetchSearchSuggestions ).not.toHaveBeenCalled(); } ); + it( 'should not display a URL suggestion when input is not likely to be a URL.', async () => { + const searchTerm = 'unlikelytobeaURL'; + const user = userEvent.setup(); + render( ); + + // Search Input UI. + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); + + // Simulate searching for a term. + await user.type( searchInput, searchTerm ); + + const searchResultElements = within( + await screen.findByRole( 'listbox', { + name: /Search results for.*/, + } ) + ).getAllByRole( 'option' ); + + const lastSearchResultItem = + searchResultElements[ searchResultElements.length - 1 ]; + + // We should see a search result for each of the expect search suggestions. + expect( searchResultElements ).toHaveLength( + fauxEntitySuggestions.length + ); + + // The URL search suggestion should not exist. + expect( lastSearchResultItem ).not.toHaveTextContent( + 'Press ENTER to add this link' + ); + } ); + it( 'should not display a URL suggestion as a default fallback when noURLSuggestion is passed.', async () => { const user = userEvent.setup(); render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); // Simulate searching for a term. await user.type( searchInput, 'couldbeurlorentitysearchterm' ); @@ -617,7 +652,9 @@ describe( 'Manual link entry', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { + name: 'Link', + } ); // Simulate searching for a term. await user.type( searchInput, searchTerm ); @@ -653,19 +690,9 @@ describe( 'Manual link entry', () => { // Search Input UI. const searchInput = screen.getByRole( 'combobox', { - name: 'URL', - } ); - - let submitButton = screen.getByRole( 'button', { - name: 'Save', + name: 'Link', } ); - expect( submitButton ).toHaveAttribute( - 'aria-disabled', - 'true' - ); - expect( submitButton ).toBeVisible(); - if ( searchString.length ) { // Simulate searching for a term. await user.type( searchInput, searchString ); @@ -677,102 +704,74 @@ describe( 'Manual link entry', () => { // Attempt to submit the empty search value in the input. await user.keyboard( '[Enter]' ); - submitButton = screen.getByRole( 'button', { - name: 'Save', - } ); - - // Verify the UI hasn't allowed submission. + // Verify the UI hasn't allowed submission because + // the search input is still visible. expect( searchInput ).toBeVisible(); - expect( submitButton ).toHaveAttribute( - 'aria-disabled', - 'true' - ); - expect( submitButton ).toBeVisible(); } ); it.each( testTable )( - 'should not allow creation of links %s via the UI "submit" button', + 'should not allow editing of links to a new link %s via the UI "submit" button', async ( _desc, searchString ) => { const user = userEvent.setup(); - render( ); + render( + + ); // Search Input UI. const searchInput = screen.getByRole( 'combobox', { - name: 'URL', + name: 'Link', } ); - let submitButton = screen.queryByRole( 'button', { - name: 'Save', - } ); + // Remove the existing link. + await user.clear( searchInput ); - expect( submitButton ).toHaveAttribute( - 'aria-disabled', - 'true' - ); - expect( submitButton ).toBeVisible(); - - // Simulate searching for a term. if ( searchString.length ) { - // Simulate searching for a term. await user.type( searchInput, searchString ); } else { // Simulate clearing the search term. await user.clear( searchInput ); } - // Attempt to submit the empty search value in the input. - await user.click( submitButton ); - - submitButton = screen.queryByRole( 'button', { + const submitButton = screen.queryByRole( 'button', { name: 'Save', } ); - // Verify the UI hasn't allowed submission. - expect( searchInput ).toBeVisible(); + // debug the UI state + // screen.debug(); + + // Verify the submission UI is disabled. + expect( submitButton ).toBeVisible(); expect( submitButton ).toHaveAttribute( 'aria-disabled', 'true' ); - expect( submitButton ).toBeVisible(); + + // Attempt to submit the empty search value in the input. + await user.click( submitButton ); + + // Verify the UI hasn't allowed submission because + // the search input is still visible. + expect( searchInput ).toBeVisible(); } ); } ); describe( 'Handling cancellation', () => { - it( 'should allow cancellation of the link creation process and reset any entered values', async () => { - const user = userEvent.setup(); + it( 'should not show cancellation button during link creation', async () => { const mockOnRemove = jest.fn(); - const mockOnCancel = jest.fn(); render( ); - // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { - name: 'URL', - } ); - const cancelButton = screen.queryByRole( 'button', { name: 'Cancel', } ); - expect( cancelButton ).toBeEnabled(); - expect( cancelButton ).toBeVisible(); - - // Simulate adding a link for a term. - await user.type( searchInput, 'https://www.wordpress.org' ); - - // Attempt to submit the empty search value in the input. - await user.click( cancelButton ); - - // Verify the consumer can handle the cancellation. - expect( mockOnRemove ).toHaveBeenCalled(); - - // Ensure optional callback is not called. - expect( mockOnCancel ).not.toHaveBeenCalled(); - - expect( searchInput ).toHaveValue( '' ); + expect( cancelButton ).not.toBeInTheDocument(); } ); it( 'should allow cancellation of the link editing process and reset any entered values', async () => { @@ -809,7 +808,7 @@ describe( 'Manual link entry', () => { await toggleSettingsDrawer( user ); let searchInput = screen.getByRole( 'combobox', { - name: 'URL', + name: 'Link', } ); let textInput = screen.getByRole( 'textbox', { @@ -844,7 +843,7 @@ describe( 'Manual link entry', () => { // Re-query the inputs as they have been replaced. searchInput = screen.getByRole( 'combobox', { - name: 'URL', + name: 'Link', } ); textInput = screen.getByRole( 'textbox', { @@ -860,7 +859,13 @@ describe( 'Manual link entry', () => { const user = userEvent.setup(); const mockOnCancel = jest.fn(); - render( ); + render( + + ); const cancelButton = screen.queryByRole( 'button', { name: 'Cancel', @@ -886,7 +891,7 @@ describe( 'Manual link entry', () => { // Search Input UI. const searchInput = screen.getByRole( 'combobox', { - name: 'URL', + name: 'Link', } ); // Simulate searching for a term. @@ -922,7 +927,7 @@ describe( 'Default search suggestions', () => { // Verify input has no value has default suggestions should only show // when this does not have a value. // Search Input UI. - expect( screen.getByRole( 'combobox', { name: 'URL' } ) ).toHaveValue( + expect( screen.getByRole( 'combobox', { name: 'Link' } ) ).toHaveValue( '' ); @@ -951,7 +956,7 @@ describe( 'Default search suggestions', () => { } ); await user.click( currentLinkBtn ); - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); // Search input is set to the URL value. expect( searchInput ).toHaveValue( initialValue.url ); @@ -973,7 +978,7 @@ describe( 'Default search suggestions', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); // Simulate searching for a term. await user.type( searchInput, searchTerm ); @@ -1011,7 +1016,7 @@ describe( 'Default search suggestions', () => { render( ); - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); const searchResultsField = screen.queryByRole( 'listbox', { name: 'Suggestions', @@ -1069,7 +1074,9 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { + name: 'Link', + } ); // Simulate searching for a term. await user.type( searchInput, entityNameText ); @@ -1136,7 +1143,7 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); // Simulate searching for a term. await user.type( searchInput, 'Some new page to create' ); @@ -1185,7 +1192,7 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); // Simulate searching for a term. await user.type( searchInput, entityNameText ); @@ -1228,7 +1235,7 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); // Simulate searching for a term. await user.type( searchInput, entityNameText ); @@ -1252,7 +1259,7 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => { // Search Input UI. const searchInput = screen.getByRole( 'combobox', { - name: 'URL', + name: 'Link', } ); const searchResultsField = screen.queryByRole( 'listbox' ); @@ -1272,7 +1279,9 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => { ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { + name: 'Link', + } ); const searchResultsField = screen.queryByRole( 'listbox' ); @@ -1295,7 +1304,7 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => { // Search Input UI. const searchInput = screen.getByRole( 'combobox', { - name: 'URL', + name: 'Link', } ); // Simulate searching for a term. @@ -1329,7 +1338,7 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => { render( ); // Search Input UI. - searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); // Simulate searching for a term. await user.type( searchInput, searchText ); @@ -1344,7 +1353,7 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => { await user.click( createButton ); - searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); const errorNotice = screen.getAllByText( 'API response returned invalid entity.' @@ -1417,7 +1426,7 @@ describe( 'Selecting links', () => { // Simulate searching for a term. await user.click( currentLinkBtn ); - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); currentLinkUI = screen.queryByLabelText( 'Currently selected' ); // We should be back to showing the search input. @@ -1458,7 +1467,7 @@ describe( 'Selecting links', () => { // Search Input UI. const searchInput = screen.getByRole( 'combobox', { - name: 'URL', + name: 'Link', } ); // Simulate searching for a term. @@ -1520,7 +1529,7 @@ describe( 'Selecting links', () => { // Search Input UI. const searchInput = screen.getByRole( 'combobox', { - name: 'URL', + name: 'Link', } ); // Simulate searching for a term. @@ -1609,7 +1618,9 @@ describe( 'Selecting links', () => { ).toBeVisible(); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { + name: 'Link', + } ); // Step down into the search results, highlighting the first result item. triggerArrowDown( searchInput ); @@ -1665,7 +1676,9 @@ describe( 'Selecting links', () => { render( ); // focus the search input - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { + name: 'Link', + } ); fireEvent.focus( searchInput ); @@ -1707,10 +1720,7 @@ describe( 'Addition Settings UI', () => { render( ); - const settingsToggle = screen.queryByRole( 'button', { - name: 'Link Settings', - ariaControls: 'link-settings-1', - } ); + const settingsToggle = getSettingsDrawerToggle(); expect( settingsToggle ).not.toBeInTheDocument(); } ); @@ -1727,10 +1737,7 @@ describe( 'Addition Settings UI', () => { const user = userEvent.setup(); - const settingsToggle = screen.queryByRole( 'button', { - name: 'Link Settings', - ariaControls: 'link-settings-1', - } ); + const settingsToggle = getSettingsDrawerToggle(); expect( settingsToggle ).toHaveAttribute( 'aria-expanded', 'false' ); @@ -1891,7 +1898,7 @@ describe( 'Post types', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { name: 'Link' } ); // Simulate searching for a term. await user.type( searchInput, searchTerm ); @@ -1918,7 +1925,9 @@ describe( 'Post types', () => { render( ); // Search Input UI. - const searchInput = screen.getByRole( 'combobox', { name: 'URL' } ); + const searchInput = screen.getByRole( 'combobox', { + name: 'Link', + } ); // Simulate searching for a term. await user.type( searchInput, searchTerm ); @@ -2376,10 +2385,14 @@ describe( 'Controlling link title text', () => { } ); } ); -async function toggleSettingsDrawer( user ) { - const settingsToggle = screen.queryByRole( 'button', { - name: 'Link Settings', +function getSettingsDrawerToggle() { + return screen.queryByRole( 'button', { + name: 'Advanced', } ); +} + +async function toggleSettingsDrawer( user ) { + const settingsToggle = getSettingsDrawerToggle(); await user.click( settingsToggle ); } diff --git a/packages/block-editor/src/components/media-replace-flow/test/index.js b/packages/block-editor/src/components/media-replace-flow/test/index.js index 2be7e7372260d..cef747ce6be63 100644 --- a/packages/block-editor/src/components/media-replace-flow/test/index.js +++ b/packages/block-editor/src/components/media-replace-flow/test/index.js @@ -128,7 +128,7 @@ describe( 'General media replace flow', () => { ); const mediaURLInput = screen.getByRole( 'combobox', { - name: 'URL', + name: 'Link', expanded: false, } ); diff --git a/packages/block-editor/src/components/url-input/index.js b/packages/block-editor/src/components/url-input/index.js index eb448f79d1b3f..1451397ce68e5 100644 --- a/packages/block-editor/src/components/url-input/index.js +++ b/packages/block-editor/src/components/url-input/index.js @@ -434,6 +434,7 @@ class URLInput extends Component { placeholder = __( 'Paste URL or type to search' ), __experimentalRenderControl: renderControl, value = '', + hideLabelFromVision = false, } = this.props; const { @@ -452,6 +453,7 @@ class URLInput extends Component { className: classnames( 'block-editor-url-input', className, { 'is-full-width': isFullWidth, } ), + hideLabelFromVision, }; const inputProps = { diff --git a/packages/e2e-tests/specs/editor/various/links.test.js b/packages/e2e-tests/specs/editor/various/links.test.js index 3be80f786fbc2..719d00afe076b 100644 --- a/packages/e2e-tests/specs/editor/various/links.test.js +++ b/packages/e2e-tests/specs/editor/various/links.test.js @@ -105,7 +105,8 @@ describe( 'Links', () => { await waitForURLFieldAutoFocus(); const urlInputValue = await page.evaluate( - () => document.querySelector( '[aria-label="URL"]' ).value + () => + document.querySelector( '.block-editor-url-input__input' ).value ); expect( urlInputValue ).toBe( '' ); @@ -496,7 +497,7 @@ describe( 'Links', () => { await pressKeyWithModifier( 'primary', 'K' ); const [ settingsToggle ] = await page.$x( - '//button[contains(@aria-label, "Link Settings")]' + '//button[contains(text(), "Advanced")]' ); await settingsToggle.click(); @@ -528,7 +529,7 @@ describe( 'Links', () => { await waitForURLFieldAutoFocus(); - await page.keyboard.press( 'Tab' ); + await pressKeyWithModifier( 'shift', 'Tab' ); // Tabbing should land us in the text input. const { isTextInput, textValue } = await page.evaluate( () => { @@ -585,8 +586,10 @@ describe( 'Links', () => { await editButton.click(); - // Tabbing forward should land us in the "Text" input. - await page.keyboard.press( 'Tab' ); + await waitForURLFieldAutoFocus(); + + // Tabbing backward should land us in the "Text" input. + await pressKeyWithModifier( 'shift', 'Tab' ); const textInputValue = await page.evaluate( () => document.activeElement.value @@ -614,8 +617,9 @@ describe( 'Links', () => { ); await editButton.click(); - // tab forward to the text input. - await page.keyboard.press( 'Tab' ); + await waitForURLFieldAutoFocus(); + + await pressKeyWithModifier( 'shift', 'Tab' ); const textInputValue = await page.evaluate( () => document.activeElement.value @@ -661,7 +665,7 @@ describe( 'Links', () => { await waitForURLFieldAutoFocus(); const [ settingsToggle ] = await page.$x( - '//button[contains(@aria-label, "Link Settings")]' + '//button[contains(text(), "Advanced")]' ); await settingsToggle.click(); @@ -679,7 +683,7 @@ describe( 'Links', () => { await pressKeyWithModifier( 'shift', 'ArrowRight' ); // Move back to the text input. - await pressKeyTimes( 'Tab', 2 ); + await pressKeyTimes( 'Tab', 1 ); // Tabbing back should land us in the text input. const textInputValue = await page.evaluate( @@ -879,8 +883,11 @@ describe( 'Links', () => { await waitForURLFieldAutoFocus(); - // Move to Link Text field. - await page.keyboard.press( 'Tab' ); + // Move to "Text" field. + await pressKeyWithModifier( 'shift', 'Tab' ); + + // Delete existing value from "Text" field + await page.keyboard.press( 'Delete' ); // Change text to "z" await page.keyboard.type( 'z' ); diff --git a/test/e2e/specs/editor/blocks/buttons.spec.js b/test/e2e/specs/editor/blocks/buttons.spec.js index 8eacb7e2bed2e..d6bdcb167f9ac 100644 --- a/test/e2e/specs/editor/blocks/buttons.spec.js +++ b/test/e2e/specs/editor/blocks/buttons.spec.js @@ -10,6 +10,9 @@ test.describe( 'Buttons', () => { test( 'has focus on button content', async ( { editor, page } ) => { await editor.insertBlock( { name: 'core/buttons' } ); + await expect( + editor.canvas.locator( 'role=textbox[name="Button text"i]' ) + ).toBeFocused(); await page.keyboard.type( 'Content' ); // Check the content. @@ -50,9 +53,12 @@ test.describe( 'Buttons', () => { } ) => { // Regression: https://github.com/WordPress/gutenberg/pull/19885 await editor.insertBlock( { name: 'core/buttons' } ); + await expect( + editor.canvas.locator( 'role=textbox[name="Button text"i]' ) + ).toBeFocused(); await pageUtils.pressKeys( 'primary+k' ); await expect( - page.locator( 'role=combobox[name="URL"i]' ) + page.locator( 'role=combobox[name="Link"i]' ) ).toBeFocused(); await page.keyboard.press( 'Escape' ); await expect( @@ -78,9 +84,12 @@ test.describe( 'Buttons', () => { } ) => { // Regression: https://github.com/WordPress/gutenberg/issues/34307 await editor.insertBlock( { name: 'core/buttons' } ); + await expect( + editor.canvas.locator( 'role=textbox[name="Button text"i]' ) + ).toBeFocused(); await pageUtils.pressKeys( 'primary+k' ); await expect( - page.locator( 'role=combobox[name="URL"i]' ) + page.locator( 'role=combobox[name="Link"i]' ) ).toBeFocused(); await page.keyboard.type( 'https://example.com' ); await page.keyboard.press( 'Enter' ); @@ -107,9 +116,12 @@ test.describe( 'Buttons', () => { } ) => { // Regression: https://github.com/WordPress/gutenberg/issues/34307 await editor.insertBlock( { name: 'core/buttons' } ); + await expect( + editor.canvas.locator( 'role=textbox[name="Button text"i]' ) + ).toBeFocused(); await pageUtils.pressKeys( 'primary+k' ); - const urlInput = page.locator( 'role=combobox[name="URL"i]' ); + const urlInput = page.locator( 'role=combobox[name="Link"i]' ); await expect( urlInput ).toBeFocused(); await page.keyboard.type( 'example.com' ); diff --git a/test/e2e/specs/editor/blocks/links.spec.js b/test/e2e/specs/editor/blocks/links.spec.js index 6493b9effe8aa..8443a04d0417e 100644 --- a/test/e2e/specs/editor/blocks/links.spec.js +++ b/test/e2e/specs/editor/blocks/links.spec.js @@ -28,8 +28,32 @@ test.describe( 'Links', () => { // Type a URL. await page.keyboard.type( 'https://wordpress.org/gutenberg' ); + // Ensure that the contents of the post have not been changed, since at + // this point the link is still not inserted. + await expect.poll( editor.getBlocks ).toMatchObject( [ + { + name: 'core/paragraph', + attributes: { content: 'This is Gutenberg' }, + }, + ] ); + + await page.keyboard.press( 'Enter' ); + + await page.keyboard.press( 'ArrowLeft' ); + await page.keyboard.press( 'ArrowLeft' ); + + // Edit link. + await page.getByRole( 'button', { name: 'Edit' } ).click(); + // Open settings. - await page.getByRole( 'button', { name: 'Link Settings' } ).click(); + await page + .getByRole( 'region', { + name: 'Editor content', + } ) + .getByRole( 'button', { + name: 'Advanced', + } ) + .click(); // Navigate to and toggle the "Open in new tab" checkbox. const checkbox = page.getByLabel( 'Open in new tab' ); @@ -39,15 +63,6 @@ test.describe( 'Links', () => { await expect( checkbox ).toBeChecked(); await expect( checkbox ).toBeFocused(); - // Ensure that the contents of the post have not been changed, since at - // this point the link is still not inserted. - await expect.poll( editor.getBlocks ).toMatchObject( [ - { - name: 'core/paragraph', - attributes: { content: 'This is Gutenberg' }, - }, - ] ); - // Tab back to the Submit and apply the link. await page //TODO: change to a better selector when https://github.com/WordPress/gutenberg/issues/51060 is resolved. @@ -82,11 +97,7 @@ test.describe( 'Links', () => { await pageUtils.pressKeys( 'primary+k' ); await page.keyboard.type( 'w.org' ); - await page - //TODO: change to a better selector when https://github.com/WordPress/gutenberg/issues/51060 is resolved. - .locator( '.block-editor-link-control' ) - .getByRole( 'button', { name: 'Save' } ) - .click(); + await page.keyboard.press( 'Enter' ); await expect.poll( editor.getBlocks ).toMatchObject( [ { @@ -107,7 +118,11 @@ test.describe( 'Links', () => { await page.keyboard.type( 'wordpress.org' ); // Update the link. - await page.keyboard.press( 'Enter' ); + await page + //TODO: change to a better selector when https://github.com/WordPress/gutenberg/issues/51060 is resolved. + .locator( '.block-editor-link-control' ) + .getByRole( 'button', { name: 'Save' } ) + .click(); // Navigate back to the popover. await page.keyboard.press( 'ArrowLeft' ); diff --git a/test/e2e/specs/editor/blocks/navigation.spec.js b/test/e2e/specs/editor/blocks/navigation.spec.js index 67b48d528adc7..8f45e8ddcf7e3 100644 --- a/test/e2e/specs/editor/blocks/navigation.spec.js +++ b/test/e2e/specs/editor/blocks/navigation.spec.js @@ -902,7 +902,7 @@ test.describe( 'Navigation block', () => { // Immediately dismiss the Link UI thereby not populating the `url` attribute // of the block. - await linkControl.pressCancel(); + await page.keyboard.press( 'Escape' ); // Get the Inspector Tabs. const blockSettings = page.getByRole( 'region', { @@ -1263,18 +1263,10 @@ class LinkControl { getSearchInput() { return this.page.getByRole( 'combobox', { - name: 'URL', + name: 'Link', } ); } - async pressCancel() { - const cancelButton = this.page.getByRole( 'button', { - name: 'Cancel', - } ); - - return cancelButton.click(); - } - async getSearchResults() { const searchInput = this.getSearchInput(); From 132f8b966a663d086adb99c9a01db18cf392bbc0 Mon Sep 17 00:00:00 2001 From: James Koster Date: Mon, 26 Jun 2023 12:19:19 +0100 Subject: [PATCH 03/37] Update colors (#51856) --- packages/edit-site/src/components/layout/style.scss | 2 +- packages/edit-site/src/components/page-library/style.scss | 4 ++-- .../edit-site/src/components/sidebar-button/style.scss | 2 +- .../sidebar-navigation-screen-navigation-menu/style.scss | 4 ++-- .../src/components/sidebar-navigation-screen/index.js | 2 +- .../src/components/sidebar-navigation-screen/style.scss | 1 - packages/edit-site/src/components/site-hub/style.scss | 7 ++++--- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/edit-site/src/components/layout/style.scss b/packages/edit-site/src/components/layout/style.scss index 2097154fa94c3..69a108f5fc9a3 100644 --- a/packages/edit-site/src/components/layout/style.scss +++ b/packages/edit-site/src/components/layout/style.scss @@ -1,7 +1,7 @@ .edit-site-layout { height: 100%; background: $gray-900; - color: $white; + color: $gray-400; display: flex; flex-direction: column; } diff --git a/packages/edit-site/src/components/page-library/style.scss b/packages/edit-site/src/components/page-library/style.scss index e663fcdc24841..f0bb6b30b9db6 100644 --- a/packages/edit-site/src/components/page-library/style.scss +++ b/packages/edit-site/src/components/page-library/style.scss @@ -6,7 +6,7 @@ } .components-heading { - color: $white; + color: $gray-200; } @include break-medium { @@ -78,7 +78,7 @@ .edit-site-library__search { &#{&} input[type="search"] { background: $gray-800; - color: $gray-100; + color: $gray-200; &:focus { background: $gray-800; diff --git a/packages/edit-site/src/components/sidebar-button/style.scss b/packages/edit-site/src/components/sidebar-button/style.scss index 8388aae266e3e..5135f97869bb8 100644 --- a/packages/edit-site/src/components/sidebar-button/style.scss +++ b/packages/edit-site/src/components/sidebar-button/style.scss @@ -19,6 +19,6 @@ &:focus, &:not([aria-disabled="true"]):active, &[aria-expanded="true"] { - color: $white; + color: $gray-100; } } diff --git a/packages/edit-site/src/components/sidebar-navigation-screen-navigation-menu/style.scss b/packages/edit-site/src/components/sidebar-navigation-screen-navigation-menu/style.scss index e00f9210b4e4b..ae35cb4525b88 100644 --- a/packages/edit-site/src/components/sidebar-navigation-screen-navigation-menu/style.scss +++ b/packages/edit-site/src/components/sidebar-navigation-screen-navigation-menu/style.scss @@ -1,10 +1,10 @@ .sidebar-navigation__more-menu { .components-button { - color: $gray-600; + color: $gray-200; &:hover, &:focus, &[aria-current] { - color: $white; + color: $gray-100; } } } diff --git a/packages/edit-site/src/components/sidebar-navigation-screen/index.js b/packages/edit-site/src/components/sidebar-navigation-screen/index.js index 83e0da4cf9f83..fd052e00f4ac1 100644 --- a/packages/edit-site/src/components/sidebar-navigation-screen/index.js +++ b/packages/edit-site/src/components/sidebar-navigation-screen/index.js @@ -88,7 +88,7 @@ export default function SidebarNavigationScreen( { ) } diff --git a/packages/edit-site/src/components/sidebar-navigation-screen/style.scss b/packages/edit-site/src/components/sidebar-navigation-screen/style.scss index 417dc7d6b1f05..3a7ff63314262 100644 --- a/packages/edit-site/src/components/sidebar-navigation-screen/style.scss +++ b/packages/edit-site/src/components/sidebar-navigation-screen/style.scss @@ -12,7 +12,6 @@ } .edit-site-sidebar-navigation-screen__content { - color: $gray-400; padding: 0 $grid-unit-20; .components-item-group { diff --git a/packages/edit-site/src/components/site-hub/style.scss b/packages/edit-site/src/components/site-hub/style.scss index cc2254a6231ee..d0689fec4efa9 100644 --- a/packages/edit-site/src/components/site-hub/style.scss +++ b/packages/edit-site/src/components/site-hub/style.scss @@ -20,7 +20,7 @@ opacity: 1; } svg { - fill: $white; + fill: $gray-200; } } &:hover { @@ -55,12 +55,13 @@ .edit-site-site-hub__site-title { margin-left: $grid-unit-05; flex-grow: 1; + color: $gray-200; } .edit-site-site-hub_toggle-command-center { - color: $white; + color: $gray-200; &:hover { - color: $white; + color: $gray-100; } } From 844a8041d210ac6e08595a51f32fff4ea498e107 Mon Sep 17 00:00:00 2001 From: Aki Hamano <54422211+t-hamano@users.noreply.github.com> Date: Mon, 26 Jun 2023 09:22:14 +0900 Subject: [PATCH 04/37] Library: Fix misalignment of description in custom template parts (#51868) --- .../style.scss | 25 ++++++++++++++++ .../style.scss | 30 +++++++++---------- packages/edit-site/src/style.scss | 1 + 3 files changed, 41 insertions(+), 15 deletions(-) create mode 100644 packages/edit-site/src/components/sidebar-navigation-screen-pattern/style.scss diff --git a/packages/edit-site/src/components/sidebar-navigation-screen-pattern/style.scss b/packages/edit-site/src/components/sidebar-navigation-screen-pattern/style.scss new file mode 100644 index 0000000000000..469451d8943dc --- /dev/null +++ b/packages/edit-site/src/components/sidebar-navigation-screen-pattern/style.scss @@ -0,0 +1,25 @@ +.edit-site-sidebar-navigation-screen-pattern__added-by-description { + display: flex; + align-items: center; + justify-content: space-between; + margin-top: $grid-unit-30; +} + +.edit-site-sidebar-navigation-screen-pattern__added-by-description-author { + display: inline-flex; + align-items: center; + + img { + border-radius: $grid-unit-15; + } + + svg { + fill: $gray-600; + } +} + +.edit-site-sidebar-navigation-screen-pattern__added-by-description-author-icon { + width: 24px; + height: 24px; + margin-right: $grid-unit-10; +} diff --git a/packages/edit-site/src/components/sidebar-navigation-screen-template/style.scss b/packages/edit-site/src/components/sidebar-navigation-screen-template/style.scss index 8b1cf5bbf456c..20b39d8e89817 100644 --- a/packages/edit-site/src/components/sidebar-navigation-screen-template/style.scss +++ b/packages/edit-site/src/components/sidebar-navigation-screen-template/style.scss @@ -3,27 +3,27 @@ align-items: center; justify-content: space-between; margin-top: $grid-unit-30; +} - &-author { - display: inline-flex; - align-items: center; - - img { - border-radius: $grid-unit-15; - } +.edit-site-sidebar-navigation-screen-template__added-by-description-author { + display: inline-flex; + align-items: center; - svg { - fill: $gray-600; - } + img { + border-radius: $grid-unit-15; + } - &-icon { - width: 24px; - height: 24px; - margin-right: $grid-unit-10; - } + svg { + fill: $gray-600; } } +.edit-site-sidebar-navigation-screen-template__added-by-description-author-icon { + width: 24px; + height: 24px; + margin-right: $grid-unit-10; +} + .edit-site-sidebar-navigation-screen-template__template-area-button { color: $white; display: flex; diff --git a/packages/edit-site/src/style.scss b/packages/edit-site/src/style.scss index 5e78005ea21d6..324f1ab4bc0ec 100644 --- a/packages/edit-site/src/style.scss +++ b/packages/edit-site/src/style.scss @@ -37,6 +37,7 @@ @import "./components/sidebar-navigation-screen-navigation-menu/style.scss"; @import "./components/sidebar-navigation-screen-page/style.scss"; @import "components/sidebar-navigation-screen-details-panel/style.scss"; +@import "./components/sidebar-navigation-screen-pattern/style.scss"; @import "./components/sidebar-navigation-screen-template/style.scss"; @import "./components/site-hub/style.scss"; @import "./components/sidebar-navigation-screen-navigation-menus/style.scss"; From 9ee0bfd0aec8e292135cc5483147b664aba5296d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor?= <27339341+priethor@users.noreply.github.com> Date: Tue, 27 Jun 2023 03:09:53 +0200 Subject: [PATCH 05/37] Backport adding the distraction free mode to the site editor (#51173) (#51932) --- packages/base-styles/_z-index.scss | 1 + packages/block-editor/README.md | 1 + packages/block-editor/src/store/defaults.js | 1 + .../edit-post/src/components/header/index.js | 20 +-- .../components/keyboard-shortcuts/index.js | 2 - .../edit-site/src/components/editor/index.js | 1 + .../src/components/editor/style.scss | 4 + .../src/components/header-edit-mode/index.js | 150 ++++++++++------ .../header-edit-mode/more-menu/index.js | 47 ++++- .../keyboard-shortcuts/edit-mode.js | 37 +++- .../components/keyboard-shortcuts/register.js | 10 ++ .../edit-site/src/components/layout/index.js | 161 +++++++++++++----- .../src/components/layout/style.scss | 46 +++++ .../preferences-modal/enable-feature.js | 7 +- .../src/components/preferences-modal/index.js | 25 +++ .../index.js | 18 +- packages/edit-site/src/index.js | 1 + packages/edit-site/src/store/selectors.js | 5 + .../edit-site/src/store/test/selectors.js | 2 + .../provider/use-block-editor-settings.js | 1 + .../components/interface-skeleton/index.js | 18 +- 21 files changed, 429 insertions(+), 129 deletions(-) diff --git a/packages/base-styles/_z-index.scss b/packages/base-styles/_z-index.scss index 96040ec29d07b..cc4a42df98f0a 100644 --- a/packages/base-styles/_z-index.scss +++ b/packages/base-styles/_z-index.scss @@ -182,6 +182,7 @@ $z-layers: ( ".customize-widgets__block-toolbar": 7, // Site editor layout + ".edit-site-layout__header-container": 4, ".edit-site-layout__hub": 3, ".edit-site-layout__header": 2, ".edit-site-page-header": 2, diff --git a/packages/block-editor/README.md b/packages/block-editor/README.md index 72c3d50372e48..2c42b42afc442 100644 --- a/packages/block-editor/README.md +++ b/packages/block-editor/README.md @@ -711,6 +711,7 @@ _Properties_ - _maxWidth_ `number`: Max width to constraint resizing - _allowedBlockTypes_ `boolean|Array`: Allowed block types - _hasFixedToolbar_ `boolean`: Whether or not the editor toolbar is fixed +- _distractionFree_ `boolean`: Whether or not the editor UI is distraction free - _focusMode_ `boolean`: Whether the focus mode is enabled or not - _styles_ `Array`: Editor Styles - _keepCaretInsideBlock_ `boolean`: Whether caret should move between blocks in edit mode diff --git a/packages/block-editor/src/store/defaults.js b/packages/block-editor/src/store/defaults.js index 7c33350d12dd0..acd40244cb260 100644 --- a/packages/block-editor/src/store/defaults.js +++ b/packages/block-editor/src/store/defaults.js @@ -18,6 +18,7 @@ export const PREFERENCES_DEFAULTS = { * @property {number} maxWidth Max width to constraint resizing * @property {boolean|Array} allowedBlockTypes Allowed block types * @property {boolean} hasFixedToolbar Whether or not the editor toolbar is fixed + * @property {boolean} distractionFree Whether or not the editor UI is distraction free * @property {boolean} focusMode Whether the focus mode is enabled or not * @property {Array} styles Editor Styles * @property {boolean} keepCaretInsideBlock Whether caret should move between blocks in edit mode diff --git a/packages/edit-post/src/components/header/index.js b/packages/edit-post/src/components/header/index.js index dfdeb2d130aa3..3f42d4736f57b 100644 --- a/packages/edit-post/src/components/header/index.js +++ b/packages/edit-post/src/components/header/index.js @@ -20,6 +20,16 @@ import MainDashboardButton from './main-dashboard-button'; import { store as editPostStore } from '../../store'; import DocumentTitle from './document-title'; +const slideY = { + hidden: { y: '-50px' }, + hover: { y: 0, transition: { type: 'tween', delay: 0.2 } }, +}; + +const slideX = { + hidden: { x: '-100%' }, + hover: { x: 0, transition: { type: 'tween', delay: 0.2 } }, +}; + function Header( { setEntitiesSavedStatesCallback } ) { const isLargeViewport = useViewportMatch( 'large' ); const { @@ -39,16 +49,6 @@ function Header( { setEntitiesSavedStatesCallback } ) { [] ); - const slideY = { - hidden: { y: '-50px' }, - hover: { y: 0, transition: { type: 'tween', delay: 0.2 } }, - }; - - const slideX = { - hidden: { x: '-100%' }, - hover: { x: 0, transition: { type: 'tween', delay: 0.2 } }, - }; - return (
diff --git a/packages/edit-post/src/components/keyboard-shortcuts/index.js b/packages/edit-post/src/components/keyboard-shortcuts/index.js index 432bce0a3bff5..9a9574fd38bb7 100644 --- a/packages/edit-post/src/components/keyboard-shortcuts/index.js +++ b/packages/edit-post/src/components/keyboard-shortcuts/index.js @@ -223,8 +223,6 @@ function KeyboardShortcuts() { } ); useShortcut( 'core/edit-post/toggle-distraction-free', () => { - closeGeneralSidebar(); - setIsListViewOpened( false ); toggleDistractionFree(); toggleFeature( 'distractionFree' ); createInfoNotice( diff --git a/packages/edit-site/src/components/editor/index.js b/packages/edit-site/src/components/editor/index.js index 24805014e3d69..238cad7387055 100644 --- a/packages/edit-site/src/components/editor/index.js +++ b/packages/edit-site/src/components/editor/index.js @@ -180,6 +180,7 @@ export default function Editor( { isLoading } ) { { isEditMode && } { hasDefaultEditorCanvasView && (
- + { ! isDistractionFree && ( + + ) } { isLargeViewport && ( <> - - { isZoomedOutViewExperimentEnabled && ( + { ! isDistractionFree && ( { - setPreviewDeviceType( 'desktop' ); - __unstableSetEditorMode( - isZoomedOutView - ? 'edit' - : 'zoom-out' - ); - } } + label={ __( 'List View' ) } + onClick={ toggleListView } + shortcut={ listViewShortcut } + showTooltip={ ! showIconLabels } + variant={ + showIconLabels + ? 'tertiary' + : undefined + } /> ) } + { isZoomedOutViewExperimentEnabled && + ! isDistractionFree && ( + { + setPreviewDeviceType( + 'desktop' + ); + __unstableSetEditorMode( + isZoomedOutView + ? 'edit' + : 'zoom-out' + ); + } } + /> + ) } ) }
) } -
- { ! hasDefaultEditorCanvasView ? ( - getEditorCanvasContainerTitle( editorCanvasView ) - ) : ( - - ) } -
+ { ! isDistractionFree && ( +
+ { ! hasDefaultEditorCanvasView ? ( + getEditorCanvasContainerTitle( editorCanvasView ) + ) : ( + + ) } +
+ ) }
-
+ { ! isFocusMode && hasDefaultEditorCanvasView && (
) } - + { ! isDistractionFree && ( + + ) } -
+
); diff --git a/packages/edit-site/src/components/header-edit-mode/more-menu/index.js b/packages/edit-site/src/components/header-edit-mode/more-menu/index.js index a7c9ea977db17..802e9f9439811 100644 --- a/packages/edit-site/src/components/header-edit-mode/more-menu/index.js +++ b/packages/edit-site/src/components/header-edit-mode/more-menu/index.js @@ -3,12 +3,16 @@ */ import { __, _x } from '@wordpress/i18n'; import { useReducer } from '@wordpress/element'; +import { useSelect, useDispatch, useRegistry } from '@wordpress/data'; import { useShortcut } from '@wordpress/keyboard-shortcuts'; import { displayShortcut } from '@wordpress/keycodes'; import { external } from '@wordpress/icons'; import { MenuGroup, MenuItem, VisuallyHidden } from '@wordpress/components'; import { ActionItem, MoreMenuDropdown } from '@wordpress/interface'; -import { PreferenceToggleMenuItem } from '@wordpress/preferences'; +import { + PreferenceToggleMenuItem, + store as preferencesStore, +} from '@wordpress/preferences'; /** * Internal dependencies @@ -20,6 +24,7 @@ import SiteExport from './site-export'; import WelcomeGuideMenuItem from './welcome-guide-menu-item'; import CopyContentMenuItem from './copy-content-menu-item'; import ModeSwitcher from '../mode-switcher'; +import { store as siteEditorStore } from '../../../store'; export default function MoreMenu( { showIconLabels } ) { const [ isModalActive, toggleModal ] = useReducer( @@ -32,6 +37,29 @@ export default function MoreMenu( { showIconLabels } ) { false ); + const registry = useRegistry(); + const isDistractionFree = useSelect( + ( select ) => + select( preferencesStore ).get( + 'core/edit-site', + 'distractionFree' + ), + [] + ); + + const { setIsInserterOpened, setIsListViewOpened, closeGeneralSidebar } = + useDispatch( siteEditorStore ); + const { set: setPreference } = useDispatch( preferencesStore ); + + const toggleDistractionFree = () => { + registry.batch( () => { + setPreference( 'core/edit-site', 'fixedToolbar', false ); + setIsInserterOpened( false ); + setIsListViewOpened( false ); + closeGeneralSidebar(); + } ); + }; + useShortcut( 'core/edit-site/keyboard-shortcuts', toggleModal ); return ( @@ -48,6 +76,7 @@ export default function MoreMenu( { showIconLabels } ) { + { + setPreference( 'core/edit-site', 'fixedToolbar', false ); + setIsInserterOpened( false ); + setIsListViewOpened( false ); + closeGeneralSidebar(); + }; + const handleTextLevelShortcut = ( event, level ) => { event.preventDefault(); const destinationBlockName = @@ -114,6 +133,20 @@ function KeyboardShortcutsEditMode() { ); } ); + useShortcut( 'core/edit-site/toggle-distraction-free', () => { + toggleDistractionFree(); + toggleFeature( 'distractionFree' ); + createInfoNotice( + isFeatureActive( 'distractionFree' ) + ? __( 'Distraction free mode turned on.' ) + : __( 'Distraction free mode turned off.' ), + { + id: 'core/edit-site/distraction-free-mode/notice', + type: 'snackbar', + } + ); + } ); + return null; } diff --git a/packages/edit-site/src/components/keyboard-shortcuts/register.js b/packages/edit-site/src/components/keyboard-shortcuts/register.js index 9660b03e762ed..8dfd1e3e2a45b 100644 --- a/packages/edit-site/src/components/keyboard-shortcuts/register.js +++ b/packages/edit-site/src/components/keyboard-shortcuts/register.js @@ -149,6 +149,16 @@ function KeyboardShortcutsRegister() { }, } ); } ); + + registerShortcut( { + name: 'core/edit-site/toggle-distraction-free', + category: 'global', + description: __( 'Toggle distraction free mode.' ), + keyCombination: { + modifier: 'primaryShift', + character: '\\', + }, + } ); }, [ registerShortcut ] ); return null; diff --git a/packages/edit-site/src/components/layout/index.js b/packages/edit-site/src/components/layout/index.js index 60d493192b9a1..3398ec332c766 100644 --- a/packages/edit-site/src/components/layout/index.js +++ b/packages/edit-site/src/components/layout/index.js @@ -72,24 +72,36 @@ export default function Layout() { const isMobileViewport = useViewportMatch( 'medium', '<' ); const isListPage = getIsListPage( params, isMobileViewport ); const isEditorPage = ! isListPage; - const { hasFixedToolbar, canvasMode, previousShortcut, nextShortcut } = - useSelect( ( select ) => { - const { getAllShortcutKeyCombinations } = select( - keyboardShortcutsStore - ); - const { getCanvasMode } = unlock( select( editSiteStore ) ); - return { - canvasMode: getCanvasMode(), - previousShortcut: getAllShortcutKeyCombinations( - 'core/edit-site/previous-region' - ), - nextShortcut: getAllShortcutKeyCombinations( - 'core/edit-site/next-region' - ), - hasFixedToolbar: - select( preferencesStore ).get( 'fixedToolbar' ), - }; - }, [] ); + + const { + isDistractionFree, + hasFixedToolbar, + canvasMode, + previousShortcut, + nextShortcut, + } = useSelect( ( select ) => { + const { getAllShortcutKeyCombinations } = select( + keyboardShortcutsStore + ); + const { getCanvasMode } = unlock( select( editSiteStore ) ); + return { + canvasMode: getCanvasMode(), + previousShortcut: getAllShortcutKeyCombinations( + 'core/edit-site/previous-region' + ), + nextShortcut: getAllShortcutKeyCombinations( + 'core/edit-site/next-region' + ), + hasFixedToolbar: select( preferencesStore ).get( + 'core/edit-site', + 'fixedToolbar' + ), + isDistractionFree: select( preferencesStore ).get( + 'core/edit-site', + 'distractionFree' + ), + }; + }, [] ); const isEditing = canvasMode === 'edit'; const navigateRegionsProps = useNavigateRegions( { previous: previousShortcut, @@ -110,6 +122,27 @@ export default function Layout() { const [ isResizing ] = useState( false ); const isEditorLoading = useIsSiteEditorLoading(); + // This determines which animation variant should apply to the header. + // There is also a `isDistractionFreeHovering` state that gets priority + // when hovering the `edit-site-layout__header-container` in distraction + // free mode. It's set via framer and trickles down to all the children + // so they can use this variant state too. + // + // TODO: The issue with this is we want to have the hover state stick when hovering + // a popover opened via the header. We'll probably need to lift this state to + // handle it ourselves. Also, focusWithin the header needs to be handled. + let headerAnimationState; + + if ( canvasMode === 'view' ) { + // We need 'view' to always take priority so 'isDistractionFree' + // doesn't bleed over into the view (sidebar) state + headerAnimationState = 'view'; + } else if ( isDistractionFree ) { + headerAnimationState = 'isDistractionFree'; + } else { + headerAnimationState = canvasMode; // edit, view, init + } + // Sets the right context for the command center const commandContext = canvasMode === 'edit' && isEditorPage @@ -140,41 +173,77 @@ export default function Layout() { 'edit-site-layout', navigateRegionsProps.className, { + 'is-distraction-free': isDistractionFree && isEditing, 'is-full-canvas': isFullCanvas, 'is-edit-mode': isEditing, 'has-fixed-toolbar': hasFixedToolbar, } ) } > - - - - { isEditorPage && isEditing && ( - - { isEditing &&
} - - ) } - + delay: 0.8, + delayChildren: 0.8, + }, // How long to wait before the header exits + }, + isDistractionFreeHovering: { + opacity: 1, + transition: { + type: 'tween', + delay: 0.2, + delayChildren: 0.2, + }, // How long to wait before the header shows + }, + view: { opacity: 1 }, + edit: { opacity: 1 }, + } } + whileHover={ + isDistractionFree + ? 'isDistractionFreeHovering' + : undefined + } + animate={ headerAnimationState } + > + + + + { isEditorPage && isEditing && ( + + { isEditing &&
} + + ) } + +
diff --git a/packages/edit-site/src/components/layout/style.scss b/packages/edit-site/src/components/layout/style.scss index 69a108f5fc9a3..2fe210327661d 100644 --- a/packages/edit-site/src/components/layout/style.scss +++ b/packages/edit-site/src/components/layout/style.scss @@ -36,6 +36,10 @@ } } +.edit-site-layout__header-container { + z-index: z-index(".edit-site-layout__header-container"); +} + .edit-site-layout__header { height: $header-height; display: flex; @@ -249,6 +253,9 @@ // so the fixed toolbar can be positioned on top of it // but only on desktop @include break-medium() { + .edit-site-layout__canvas-container { + z-index: 5; + } .edit-site-site-hub { z-index: 4; } @@ -258,3 +265,42 @@ } } +.is-edit-mode.is-distraction-free { + + .edit-site-layout__header-container { + height: $header-height; + position: absolute; + top: 0; + left: 0; + right: 0; + z-index: z-index(".edit-site-layout__header-container"); + width: 100%; + + // We need ! important because we override inline styles + // set by the motion component. + &:focus-within { + opacity: 1 !important; + div { + transform: translateX(0) translateY(0) translateZ(0) !important; + } + + .edit-site-layout__header { + opacity: 1 !important; + } + } + } + + .edit-site-site-hub, + .edit-site-layout__header { + position: absolute; + top: 0; + z-index: z-index(".edit-site-layout__header"); + } + .edit-site-site-hub { + z-index: z-index(".edit-site-layout__hub"); + } + .edit-site-layout__header { + width: 100%; + } + +} diff --git a/packages/edit-site/src/components/preferences-modal/enable-feature.js b/packages/edit-site/src/components/preferences-modal/enable-feature.js index ca4a8a1bb1a32..9cd2105ba69ff 100644 --- a/packages/edit-site/src/components/preferences-modal/enable-feature.js +++ b/packages/edit-site/src/components/preferences-modal/enable-feature.js @@ -6,14 +6,17 @@ import { ___unstablePreferencesModalBaseOption as BaseOption } from '@wordpress/ import { store as preferencesStore } from '@wordpress/preferences'; export default function EnableFeature( props ) { - const { featureName, ...remainingProps } = props; + const { featureName, onToggle = () => {}, ...remainingProps } = props; const isChecked = useSelect( ( select ) => !! select( preferencesStore ).get( 'core/edit-site', featureName ), [ featureName ] ); const { toggle } = useDispatch( preferencesStore ); - const onChange = () => toggle( 'core/edit-site', featureName ); + const onChange = () => { + onToggle(); + toggle( 'core/edit-site', featureName ); + }; return ( { + registry.batch( () => { + setPreference( 'core/edit-site', 'fixedToolbar', false ); + setIsInserterOpened( false ); + setIsListViewOpened( false ); + closeGeneralSidebar(); + } ); + }; + const sections = useMemo( () => [ { name: 'general', @@ -29,6 +46,14 @@ export default function EditSitePreferencesModal( { 'Customize options related to the block editor interface and editing flow.' ) } > + {}; export function SidebarNavigationItemGlobalStyles( props ) { - const { openGeneralSidebar } = useDispatch( editSiteStore ); + const { openGeneralSidebar, toggleFeature } = useDispatch( editSiteStore ); const { setCanvasMode } = unlock( useDispatch( editSiteStore ) ); + const { createNotice } = useDispatch( noticesStore ); const hasGlobalStyleVariations = useSelect( ( select ) => !! select( @@ -53,9 +55,19 @@ export function SidebarNavigationItemGlobalStyles( props ) { { - // switch to edit mode. + // Disable distraction free mode. + toggleFeature( 'distractionFree', false ); + createNotice( + 'info', + __( 'Distraction free mode turned off' ), + { + isDismissible: true, + type: 'snackbar', + } + ); + // Switch to edit mode. setCanvasMode( 'edit' ); - // open global styles sidebar. + // Open global styles sidebar. openGeneralSidebar( 'edit-site/global-styles' ); } } /> diff --git a/packages/edit-site/src/index.js b/packages/edit-site/src/index.js index e696a441bb10d..a4698c02aff90 100644 --- a/packages/edit-site/src/index.js +++ b/packages/edit-site/src/index.js @@ -63,6 +63,7 @@ export function initializeEditor( id, settings ) { editorMode: 'visual', fixedToolbar: false, focusMode: false, + distractionFree: false, keepCaretInsideBlock: false, welcomeGuide: true, welcomeGuideStyles: true, diff --git a/packages/edit-site/src/store/selectors.js b/packages/edit-site/src/store/selectors.js index e8dcd03da7341..654b3c321ae93 100644 --- a/packages/edit-site/src/store/selectors.js +++ b/packages/edit-site/src/store/selectors.js @@ -107,6 +107,10 @@ export const getSettings = createSelector( ...state.settings, outlineMode: true, focusMode: !! __unstableGetPreference( state, 'focusMode' ), + isDistractionFree: !! __unstableGetPreference( + state, + 'distractionFree' + ), hasFixedToolbar: !! __unstableGetPreference( state, 'fixedToolbar' @@ -143,6 +147,7 @@ export const getSettings = createSelector( getCanUserCreateMedia( state ), state.settings, __unstableGetPreference( state, 'focusMode' ), + __unstableGetPreference( state, 'distractionFree' ), __unstableGetPreference( state, 'fixedToolbar' ), __unstableGetPreference( state, 'keepCaretInsideBlock' ), __unstableGetPreference( state, 'showIconLabels' ), diff --git a/packages/edit-site/src/store/test/selectors.js b/packages/edit-site/src/store/test/selectors.js index ac4778f03c7b5..9380f8ea4d276 100644 --- a/packages/edit-site/src/store/test/selectors.js +++ b/packages/edit-site/src/store/test/selectors.js @@ -77,6 +77,7 @@ describe( 'selectors', () => { outlineMode: true, focusMode: false, hasFixedToolbar: false, + isDistractionFree: false, keepCaretInsideBlock: false, showIconLabels: false, __experimentalSetIsInserterOpened: setInserterOpened, @@ -102,6 +103,7 @@ describe( 'selectors', () => { key: 'value', focusMode: true, hasFixedToolbar: true, + isDistractionFree: false, keepCaretInsideBlock: false, showIconLabels: false, __experimentalSetIsInserterOpened: setInserterOpened, diff --git a/packages/editor/src/components/provider/use-block-editor-settings.js b/packages/editor/src/components/provider/use-block-editor-settings.js index 8a71fb5deca65..400e6799996cc 100644 --- a/packages/editor/src/components/provider/use-block-editor-settings.js +++ b/packages/editor/src/components/provider/use-block-editor-settings.js @@ -47,6 +47,7 @@ const BLOCK_EDITOR_SETTINGS = [ 'enableCustomUnits', 'enableOpenverseMediaCategory', 'focusMode', + 'distractionFree', 'fontSizes', 'gradients', 'generateAnchors', diff --git a/packages/interface/src/components/interface-skeleton/index.js b/packages/interface/src/components/interface-skeleton/index.js index 43e4e532e8eab..baf98d153ed87 100644 --- a/packages/interface/src/components/interface-skeleton/index.js +++ b/packages/interface/src/components/interface-skeleton/index.js @@ -33,6 +33,15 @@ function useHTMLClass( className ) { }, [ className ] ); } +const headerVariants = { + hidden: { opacity: 0 }, + hover: { + opacity: 1, + transition: { type: 'tween', delay: 0.2, delayChildren: 0.2 }, + }, + distractionFreeInactive: { opacity: 1, transition: { delay: 0 } }, +}; + function InterfaceSkeleton( { isDistractionFree, @@ -74,15 +83,6 @@ function InterfaceSkeleton( const mergedLabels = { ...defaultLabels, ...labels }; - const headerVariants = { - hidden: { opacity: 0 }, - hover: { - opacity: 1, - transition: { type: 'tween', delay: 0.2, delayChildren: 0.2 }, - }, - distractionFreeInactive: { opacity: 1, transition: { delay: 0 } }, - }; - return (
Date: Fri, 23 Jun 2023 15:39:57 +0300 Subject: [PATCH 06/37] Fix toolbar overlap in site editor (#51810) * expand fixed toolbar to cover document title control * adds the z-index code back --- packages/edit-site/src/components/layout/style.scss | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/edit-site/src/components/layout/style.scss b/packages/edit-site/src/components/layout/style.scss index 2fe210327661d..126a31bfe34d2 100644 --- a/packages/edit-site/src/components/layout/style.scss +++ b/packages/edit-site/src/components/layout/style.scss @@ -4,6 +4,17 @@ color: $gray-400; display: flex; flex-direction: column; + + // Expand the fixed block toolbar to cover the document title control. + .block-editor-block-contextual-toolbar { + @include break-medium() { + &.is-fixed { + // the combined with of the tools at the right of the header and the margin left + width: calc(100% - 240px - #{$grid-unit-80} - #{$grid-unit-70}); + } + } + } + } .edit-site-layout__hub { From fb8efb955e2f06b38a6a57cf5d7936503cf9fe78 Mon Sep 17 00:00:00 2001 From: Robert Anderson Date: Mon, 26 Jun 2023 16:18:19 +1000 Subject: [PATCH 07/37] Page Content Focus: Switch to Page panel when deselecting a block (#51881) --- .../edit-site/src/components/sidebar-edit-mode/index.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/edit-site/src/components/sidebar-edit-mode/index.js b/packages/edit-site/src/components/sidebar-edit-mode/index.js index 80a02c11bd88f..8a36a0b539561 100644 --- a/packages/edit-site/src/components/sidebar-edit-mode/index.js +++ b/packages/edit-site/src/components/sidebar-edit-mode/index.js @@ -56,11 +56,13 @@ export function SidebarComplementaryAreaFills() { useEffect( () => { // Don't automatically switch tab when the sidebar is closed or when we // are focused on page content. - if ( ! isEditorSidebarOpened || hasPageContentFocus ) { + if ( ! isEditorSidebarOpened ) { return; } if ( hasBlockSelection ) { - enableComplementaryArea( STORE_NAME, SIDEBAR_BLOCK ); + if ( ! hasPageContentFocus ) { + enableComplementaryArea( STORE_NAME, SIDEBAR_BLOCK ); + } } else { enableComplementaryArea( STORE_NAME, SIDEBAR_TEMPLATE ); } From 553fbed098d36a159bea4bfca7a382567afaaf34 Mon Sep 17 00:00:00 2001 From: Robert Anderson Date: Tue, 27 Jun 2023 10:15:13 +1000 Subject: [PATCH 08/37] Don't show 'Back to page' notification when navigating away from page (#51880) --- .../back-to-page-notification.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/edit-site/src/components/page-content-focus-manager/back-to-page-notification.js b/packages/edit-site/src/components/page-content-focus-manager/back-to-page-notification.js index 171d4b6a5f757..a2990c56a673c 100644 --- a/packages/edit-site/src/components/page-content-focus-manager/back-to-page-notification.js +++ b/packages/edit-site/src/components/page-content-focus-manager/back-to-page-notification.js @@ -25,8 +25,11 @@ export default function BackToPageNotification() { * switches from focusing on editing page content to editing a template. */ export function useBackToPageNotification() { - const hasPageContentFocus = useSelect( - ( select ) => select( editSiteStore ).hasPageContentFocus(), + const { isPage, hasPageContentFocus } = useSelect( + ( select ) => ( { + isPage: select( editSiteStore ).isPage(), + hasPageContentFocus: select( editSiteStore ).hasPageContentFocus(), + } ), [] ); @@ -39,6 +42,7 @@ export function useBackToPageNotification() { useEffect( () => { if ( ! alreadySeen.current && + isPage && prevHasPageContentFocus.current && ! hasPageContentFocus ) { @@ -57,6 +61,7 @@ export function useBackToPageNotification() { prevHasPageContentFocus.current = hasPageContentFocus; }, [ alreadySeen, + isPage, prevHasPageContentFocus, hasPageContentFocus, createInfoNotice, From bef847dfc2aff7c117fdbc314d19026d3706e063 Mon Sep 17 00:00:00 2001 From: James Koster Date: Mon, 26 Jun 2023 09:30:19 +0100 Subject: [PATCH 09/37] Add top margin to page details (#51858) --- .../sidebar-navigation-screen-details-panel/style.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/edit-site/src/components/sidebar-navigation-screen-details-panel/style.scss b/packages/edit-site/src/components/sidebar-navigation-screen-details-panel/style.scss index e94894c0d6ea3..3beef739f7808 100644 --- a/packages/edit-site/src/components/sidebar-navigation-screen-details-panel/style.scss +++ b/packages/edit-site/src/components/sidebar-navigation-screen-details-panel/style.scss @@ -1,5 +1,5 @@ .edit-site-sidebar-navigation-details-screen-panel { - margin-bottom: $grid-unit-30; + margin: $grid-unit-30 0; &:last-of-type { margin-bottom: 0; From d1a6d075033efa8960f3056387871502f594080f Mon Sep 17 00:00:00 2001 From: tellthemachines Date: Tue, 27 Jun 2023 10:54:54 +1000 Subject: [PATCH 10/37] Keep framer-motion from updating minor version (#51894) * Keep framer-motion from updating minor version * Revert unnecessary package-lock changes --- package-lock.json | 716 +++++++++++++++---------------- packages/components/package.json | 2 +- 2 files changed, 359 insertions(+), 359 deletions(-) diff --git a/package-lock.json b/package-lock.json index f8c2aafcb1bc9..0d21ebb76061c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10455,7 +10455,7 @@ "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -13585,7 +13585,7 @@ "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -16068,7 +16068,7 @@ "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "@types/keyv": { @@ -17450,7 +17450,7 @@ "dom-scroll-into-view": "^1.2.1", "downshift": "^6.0.15", "fast-deep-equal": "^3.1.3", - "framer-motion": "^10.11.6", + "framer-motion": "~10.11.6", "gradient-parser": "^0.1.5", "highlight-words-core": "^1.2.2", "is-plain-object": "^5.0.0", @@ -18806,7 +18806,7 @@ "absolute-path": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/absolute-path/-/absolute-path-0.0.0.tgz", - "integrity": "sha1-p4di+9rftSl76ZsV01p4Wy8JW/c=" + "integrity": "sha512-HQiug4c+/s3WOvEnDRxXVmNtSG5s2gJM9r19BTcqjp7BWcE48PB+Y2G6jE65kqI0LpsQeMZygt/b60Gi4KxGyA==" }, "accepts": { "version": "1.3.7", @@ -25848,7 +25848,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" } } }, @@ -25873,7 +25873,7 @@ "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==" }, "arr-flatten": { "version": "1.1.0", @@ -25883,7 +25883,7 @@ "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==" }, "array-differ": { "version": "3.0.0", @@ -25894,20 +25894,20 @@ "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", "dev": true, "optional": true }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, "array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, "array-includes": { @@ -26158,7 +26158,7 @@ "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", "dev": true, "requires": { "array-uniq": "^1.0.1" @@ -26167,13 +26167,13 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==" }, "array.prototype.flat": { "version": "1.2.1", @@ -26917,7 +26917,7 @@ "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "asn1": { "version": "0.2.3", @@ -26958,13 +26958,13 @@ "inherits": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", "dev": true }, "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", "dev": true, "requires": { "inherits": "2.0.1" @@ -26975,13 +26975,13 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==" }, "ast-types": { "version": "0.14.2", @@ -26994,7 +26994,7 @@ "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", "dev": true }, "astral-regex": { @@ -27022,7 +27022,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "at-least-node": { @@ -27039,7 +27039,7 @@ "atob-lite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", - "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=", + "integrity": "sha512-LEeSAWeh2Gfa2FtlQE1shxQ8zi5F9GHarrGKz08TMdODD5T4eH6BMsvtnhbWZ+XQn+Gb6om/917ucvRu7l7ukw==", "dev": true }, "autoprefixer": { @@ -27109,7 +27109,7 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true }, "aws4": { @@ -27542,7 +27542,7 @@ "babel-plugin-transform-remove-console": { "version": "6.9.4", "resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz", - "integrity": "sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A=", + "integrity": "sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==", "dev": true }, "babel-preset-current-node-syntax": { @@ -27637,7 +27637,7 @@ "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "requires": { "is-descriptor": "^1.0.0" } @@ -27678,7 +27678,7 @@ "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, "batch-processor": { @@ -27690,7 +27690,7 @@ "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "optional": true, "requires": { @@ -27706,7 +27706,7 @@ "benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", - "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", + "integrity": "sha512-l9MlfN4M1K/H2fbhfMy3B7vJd6AGKJVQn2h6Sg/Yx+KckoUA7ewS5Vv6TjSq18ooE1kS9hhAlQRH3AkXIh/aOQ==", "dev": true, "requires": { "lodash": "^4.17.4", @@ -27892,7 +27892,7 @@ "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "boxen": { "version": "5.1.2", @@ -28018,7 +28018,7 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, "browser-assert": { @@ -28160,7 +28160,7 @@ "btoa-lite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", - "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", + "integrity": "sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA==", "dev": true }, "buffer": { @@ -28177,7 +28177,7 @@ "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "dev": true }, "buffer-from": { @@ -28194,7 +28194,7 @@ "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", "dev": true }, "builtin-modules": { @@ -28206,13 +28206,13 @@ "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", "dev": true }, "builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", "dev": true }, "byte-size": { @@ -28459,7 +28459,7 @@ "caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "requires": { "callsites": "^2.0.0" }, @@ -28467,14 +28467,14 @@ "callsites": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==" } } }, "caller-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "requires": { "caller-callsite": "^2.0.0" } @@ -28482,7 +28482,7 @@ "callsite": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", "dev": true }, "callsites": { @@ -28513,7 +28513,7 @@ "camelcase-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", "dev": true, "optional": true, "requires": { @@ -28524,7 +28524,7 @@ "camelcase": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", "dev": true, "optional": true } @@ -28580,7 +28580,7 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, "ccount": { @@ -28899,7 +28899,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "requires": { "is-descriptor": "^0.1.0" } @@ -29093,7 +29093,7 @@ "cli-truncate": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "integrity": "sha512-f4r4yJnbT++qUPI9NR4XLDLq41gQ+uqnPItWG0F5ZkehuNiTTa3EY0S4AqTSUOeJ7/zU41oWPQSNkW5BqPL9bg==", "dev": true, "requires": { "slice-ansi": "0.0.4", @@ -29103,13 +29103,13 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -29118,7 +29118,7 @@ "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, "requires": { "code-point-at": "^1.0.0", @@ -29129,7 +29129,7 @@ "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -29201,7 +29201,7 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==" }, "clone-deep": { "version": "4.0.1", @@ -29276,7 +29276,7 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "dev": true }, "collapse-white-space": { @@ -29294,7 +29294,7 @@ "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -29441,7 +29441,7 @@ "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "compare-func": { "version": "2.0.0", @@ -29553,12 +29553,12 @@ "computed-style": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/computed-style/-/computed-style-0.1.4.tgz", - "integrity": "sha1-fzRP2FhLLkJb7cpKGvwOMAuwXXQ=" + "integrity": "sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w==" }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "concat-stream": { "version": "1.6.2", @@ -29575,7 +29575,7 @@ "concurrently": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-3.5.0.tgz", - "integrity": "sha1-jPG3cHppFqeKT/W3e7BN7FSzebI=", + "integrity": "sha512-Z2iVM5+c0VxKmENTXrG/kp+MUhWEEH+wI5wV/L8CTFJDb/uae1zSVIkNM7o3W4Tdt42pv7RGsOICaskWy9bqSA==", "dev": true, "requires": { "chalk": "0.5.1", @@ -29591,19 +29591,19 @@ "ansi-regex": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", - "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", "dev": true }, "ansi-styles": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", - "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==", "dev": true }, "chalk": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", - "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "integrity": "sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==", "dev": true, "requires": { "ansi-styles": "^1.1.0", @@ -29616,7 +29616,7 @@ "supports-color": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", - "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==", "dev": true } } @@ -29624,7 +29624,7 @@ "commander": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", - "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=", + "integrity": "sha512-PhbTMT+ilDXZKqH8xbvuUY2ZEQNef0Q7DKxgoEKb4ccytsdvVVJmYqR0sGbi96nxU6oGrwEIQnclpK2NBZuQlg==", "dev": true }, "date-fns": { @@ -29645,13 +29645,13 @@ "has-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", "dev": true }, "strip-ansi": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", - "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==", "dev": true, "requires": { "ansi-regex": "^0.2.1" @@ -29660,7 +29660,7 @@ "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", "dev": true, "requires": { "has-flag": "^1.0.0" @@ -29714,7 +29714,7 @@ "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, "constant-case": { @@ -29730,7 +29730,7 @@ "constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", "dev": true }, "content-type": { @@ -30065,7 +30065,7 @@ "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, "copy-concurrently": { @@ -30110,7 +30110,7 @@ "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==" }, "copy-dir": { "version": "1.3.0", @@ -30686,7 +30686,7 @@ "cross-env": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-3.2.4.tgz", - "integrity": "sha1-ngWF8neGTtQhznVvgamA/w1piro=", + "integrity": "sha512-T8AFEAiuJ0w53ou6rnu3Fipaiu1W6ZO9GYfd33uxe1kAIiXM0fD8QnIm7orcJBOt7WQC5Ply63E7WZW/jSM+FA==", "dev": true, "requires": { "cross-spawn": "^5.1.0", @@ -30744,7 +30744,7 @@ "css-color-keywords": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=" + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==" }, "css-color-names": { "version": "1.0.1", @@ -30829,7 +30829,7 @@ "css-mediaquery": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz", - "integrity": "sha1-aiw3NEkoYYYxxUvTPO3TAdoYvqA=" + "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==" }, "css-to-react-native": { "version": "2.3.2", @@ -30982,7 +30982,7 @@ "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", "dev": true, "optional": true, "requires": { @@ -30992,7 +30992,7 @@ "cwd": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", - "integrity": "sha1-FyQAaUBXwioTsM8WFix+S3p/5Wc=", + "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==", "dev": true, "requires": { "find-pkg": "^0.1.2", @@ -31020,7 +31020,7 @@ "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -31116,7 +31116,7 @@ "debuglog": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", "dev": true }, "decache": { @@ -31131,7 +31131,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" }, "decamelize-keys": { "version": "1.1.0", @@ -31182,7 +31182,7 @@ "dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, "deep-equal": { @@ -31216,7 +31216,7 @@ "deep-freeze": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", - "integrity": "sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=", + "integrity": "sha512-Z+z8HiAvsGwmjqlphnHW5oz6yWlOwu6EQfFTjmeTWlDeda3FS2yv3jhq35TX/ewmsnqB+RX2IdsIOyjJCQN5tg==", "dev": true }, "deep-is": { @@ -31525,7 +31525,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, "delegate": { @@ -31536,13 +31536,13 @@ "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true }, "denodeify": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=" + "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==" }, "depd": { "version": "1.1.2", @@ -31588,7 +31588,7 @@ "detect-indent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", "dev": true }, "detect-newline": { @@ -31812,7 +31812,7 @@ "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", "dev": true }, "dns-packet": { @@ -31867,7 +31867,7 @@ "dom-scroll-into-view": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz", - "integrity": "sha1-6PNnMt0ImwIBqI14Fdw/iObWbH4=" + "integrity": "sha512-LwNVg3GJOprWDO+QhLL1Z9MMgWe/KAFLxVWKzjRTxNSPn8/LLDIfmuG71YHznXCqaqTjvHJDYO1MEAgX6XCNbQ==" }, "dom-serializer": { "version": "0.1.0", @@ -31977,7 +31977,7 @@ "downloadjs": { "version": "1.4.7", "resolved": "https://registry.npmjs.org/downloadjs/-/downloadjs-1.4.7.tgz", - "integrity": "sha1-9p+W+UDg0FU9rCkROYZaPNAQHjw=" + "integrity": "sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q==" }, "downshift": { "version": "6.1.0", @@ -32028,12 +32028,12 @@ "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "elegant-spinner": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "integrity": "sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==", "dev": true }, "element-resize-detector": { @@ -32094,7 +32094,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "encoding": { "version": "0.1.12", @@ -32336,7 +32336,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-latex": { "version": "1.2.0", @@ -33843,7 +33843,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "event-target-shim": { "version": "5.0.1", @@ -33853,7 +33853,7 @@ "eventemitter2": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-1.0.5.tgz", - "integrity": "sha1-+YNhBRexc3wLncZDvsqTiTwE3xg=" + "integrity": "sha512-EUFhWUYzqqBZlzBMI+dPU8rnKXfQZEUnitnccQuEIAnvWFHCpt3+4fts2+4dpxLtlsiseVXCMFg37KjYChSxpg==" }, "eventemitter3": { "version": "4.0.7", @@ -34010,13 +34010,13 @@ "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -34038,7 +34038,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "requires": { "is-descriptor": "^0.1.0" } @@ -34046,7 +34046,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "requires": { "is-extendable": "^0.1.0" } @@ -34056,7 +34056,7 @@ "expand-tilde": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", - "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", + "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==", "dev": true, "requires": { "os-homedir": "^1.0.1" @@ -34297,7 +34297,7 @@ "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -34363,7 +34363,7 @@ "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "requires": { "is-descriptor": "^1.0.0" } @@ -34371,7 +34371,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "requires": { "is-extendable": "^0.1.0" } @@ -34430,7 +34430,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true }, "fast-average-color": { @@ -34566,7 +34566,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "fast-memoize": { @@ -34756,7 +34756,7 @@ "filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", "dev": true }, "filenamify": { @@ -34799,7 +34799,7 @@ "filter-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha1-mzERErxsYSehbgFsbF1/GeCAXFs=" + "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==" }, "finalhandler": { "version": "1.1.2", @@ -34831,7 +34831,7 @@ "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" } } }, @@ -34915,7 +34915,7 @@ "find-file-up": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", - "integrity": "sha1-z2gJG8+fMApA2kEbN9pczlovvqA=", + "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==", "dev": true, "requires": { "fs-exists-sync": "^0.1.0", @@ -34931,7 +34931,7 @@ "find-pkg": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", - "integrity": "sha1-G9wiwG42NlUy4qJIBGhUuXiNpVc=", + "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==", "dev": true, "requires": { "find-file-up": "^0.1.2" @@ -35136,12 +35136,12 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==" }, "for-own": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", "dev": true, "requires": { "for-in": "^1.0.1" @@ -35208,7 +35208,7 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true }, "fork-ts-checker-webpack-plugin": { @@ -35355,7 +35355,7 @@ "format": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", "dev": true }, "fraction.js": { @@ -35367,7 +35367,7 @@ "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", "requires": { "map-cache": "^0.2.2" } @@ -35391,12 +35391,12 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -35412,7 +35412,7 @@ "fs-exists-sync": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", - "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=", + "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", "dev": true }, "fs-extra": { @@ -35467,7 +35467,7 @@ "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -35479,7 +35479,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { "version": "2.3.2", @@ -35832,7 +35832,7 @@ "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", "dev": true, "optional": true }, @@ -35899,12 +35899,12 @@ "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==" }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -35957,7 +35957,7 @@ "git-remote-origin-url": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", "dev": true, "requires": { "gitconfiglocal": "^1.0.0", @@ -36004,7 +36004,7 @@ "gitconfiglocal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", "dev": true, "requires": { "ini": "^1.3.2" @@ -36283,13 +36283,13 @@ "globjoin": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", "dev": true }, "good-listener": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", "requires": { "delegate": "^3.1.2" } @@ -36321,7 +36321,7 @@ "gradient-parser": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/gradient-parser/-/gradient-parser-0.1.5.tgz", - "integrity": "sha1-DH4heVWeXOfY1x9EI6+TcQCyJIw=" + "integrity": "sha512-+uPlcVbjrKOnTzvz0MjTj7BfACj8OmxIa1moIjJV7btvhUMSJk0D47RfDCgDrZE3dYMz9Cf5xKJwnrKLjUq0KQ==" }, "handle-thing": { "version": "2.0.1", @@ -36353,7 +36353,7 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "dev": true }, "har-validator": { @@ -36420,7 +36420,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "has-glob": { "version": "1.0.0", @@ -36495,13 +36495,13 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -36511,7 +36511,7 @@ "has-values": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -36520,7 +36520,7 @@ "kind-of": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", "requires": { "is-buffer": "^1.1.5" } @@ -36826,7 +36826,7 @@ "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dev": true, "requires": { "hash.js": "^1.0.3", @@ -36880,7 +36880,7 @@ "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -36986,7 +36986,7 @@ "htmlparser2-without-node-native": { "version": "3.9.2", "resolved": "https://registry.npmjs.org/htmlparser2-without-node-native/-/htmlparser2-without-node-native-3.9.2.tgz", - "integrity": "sha1-s+0FDYd9D/NGWWnjOYd7f59mMfY=", + "integrity": "sha512-+FplQXqmY5fRx6vCIp2P5urWaoBCpTNJMXnKP/6mNCcyb+AZWWJzA8D03peXfozlxDL+vpgLK5dJblqEgu8j6A==", "requires": { "domelementtype": "^1.3.0", "domhandler": "^2.3.0", @@ -37006,7 +37006,7 @@ "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "dev": true }, "http-errors": { @@ -37184,7 +37184,7 @@ "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -37213,7 +37213,7 @@ "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", "dev": true }, "https-proxy-agent": { @@ -37252,7 +37252,7 @@ "humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "requires": { "ms": "^2.0.0" @@ -37287,7 +37287,7 @@ "iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", "dev": true }, "ignore": { @@ -37405,7 +37405,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" }, "indent-string": { "version": "3.2.0", @@ -37428,7 +37428,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "requires": { "once": "^1.3.0", "wrappy": "1" @@ -37822,7 +37822,7 @@ "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", "requires": { "kind-of": "^3.0.2" }, @@ -37830,7 +37830,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "requires": { "is-buffer": "^1.1.5" } @@ -37846,7 +37846,7 @@ "is-alphanumeric": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz", - "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=", + "integrity": "sha512-ZmRL7++ZkcMOfDuWZuMJyIVLr2keE1o/DeNWh1EmgqGhUcV+9BIVsx0BcSBOHTZqzjs4+dISzr2KAeBEWGgXeA==", "dev": true }, "is-alphanumerical": { @@ -37871,7 +37871,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-bigint": { "version": "1.0.1", @@ -37958,7 +37958,7 @@ "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", "requires": { "kind-of": "^3.0.2" }, @@ -37966,7 +37966,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "requires": { "is-buffer": "^1.1.5" } @@ -38005,7 +38005,7 @@ "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==" }, "is-docker": { "version": "2.2.1", @@ -38026,12 +38026,12 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, "is-finite": { @@ -38044,7 +38044,7 @@ "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" }, "is-function": { "version": "1.0.2", @@ -38218,7 +38218,7 @@ "is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", "dev": true }, "is-resolvable": { @@ -38251,7 +38251,7 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" }, "is-string": { "version": "1.0.5", @@ -38268,7 +38268,7 @@ "is-text-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", "dev": true, "requires": { "text-extensions": "^1.0.0" @@ -38502,7 +38502,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "is-unicode-supported": { @@ -38513,7 +38513,7 @@ "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", "dev": true, "optional": true }, @@ -38597,22 +38597,22 @@ "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==" }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" }, "isomorphic-unfetch": { "version": "3.1.0", @@ -38627,7 +38627,7 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, "istanbul-lib-coverage": { @@ -38760,7 +38760,7 @@ "jed": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/jed/-/jed-1.1.1.tgz", - "integrity": "sha1-elSbvZ/+FYWwzQoZHiAwVb7ldLQ=" + "integrity": "sha512-z35ZSEcXHxLW4yumw0dF6L464NT36vmx3wxJw8MDpraBcWuNVgUPZgPJKcu1HekNgwlMFNqol7i/IpSbjhqwqA==" }, "jest": { "version": "29.5.0", @@ -39662,7 +39662,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true, "optional": true }, @@ -39998,7 +39998,7 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "json-stringify-nice": { @@ -40010,7 +40010,7 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "json2php": { @@ -40033,7 +40033,7 @@ "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "requires": { "graceful-fs": "^4.1.6" } @@ -40041,7 +40041,7 @@ "jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true }, "jsprim": { @@ -40230,7 +40230,7 @@ "klaw": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", "requires": { "graceful-fs": "^4.1.9" } @@ -40270,7 +40270,7 @@ "language-tags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", "dev": true, "requires": { "language-subtag-registry": "~0.3.2" @@ -40279,7 +40279,7 @@ "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", "dev": true }, "lazy-universal-dotenv": { @@ -40340,7 +40340,7 @@ "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, "requires": { "prelude-ls": "~1.1.2", @@ -40547,7 +40547,7 @@ "line-height": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/line-height/-/line-height-0.3.1.tgz", - "integrity": "sha1-SxIF7d4YKHKl76PI9iCzGHqcVMk=", + "integrity": "sha512-YExecgqPwnp5gplD2+Y8e8A5+jKpr25+DzMbFdI1/1UAr0FJrTFv4VkHLf8/6B590i1wUPJWMKKldkd/bdQ//w==", "requires": { "computed-style": "~0.1.3" } @@ -40754,13 +40754,13 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "supports-color": { @@ -40922,7 +40922,7 @@ "listr-silent-renderer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "integrity": "sha512-L26cIFm7/oZeSNVhWB6faeorXhMg4HNlb/dS/7jHhr708jxlXrtrBWo4YUxZQkc6dGoxEAe6J/D3juTRBUzjtA==", "dev": true }, "listr-update-renderer": { @@ -40944,19 +40944,19 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "dev": true }, "ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "dev": true }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dev": true, "requires": { "ansi-styles": "^2.2.1", @@ -40969,7 +40969,7 @@ "figures": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5", @@ -40979,7 +40979,7 @@ "log-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", "dev": true, "requires": { "chalk": "^1.0.0" @@ -40988,7 +40988,7 @@ "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -40997,7 +40997,7 @@ "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true } } @@ -41045,7 +41045,7 @@ "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", "dev": true, "optional": true, "requires": { @@ -41059,7 +41059,7 @@ "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", "dev": true, "optional": true, "requires": { @@ -41113,53 +41113,53 @@ "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "lodash.defaults": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", "dev": true }, "lodash.difference": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", "dev": true }, "lodash.flatten": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", "dev": true }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" }, "lodash.ismatch": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", "dev": true }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, "lodash.merge": { @@ -41171,30 +41171,30 @@ "lodash.set": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", - "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=", + "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==", "dev": true }, "lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=" + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, "lodash.union": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", "dev": true }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, "log-symbols": { @@ -41209,7 +41209,7 @@ "log-update": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "integrity": "sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==", "dev": true, "requires": { "ansi-escapes": "^3.0.0", @@ -41241,7 +41241,7 @@ "wrap-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "integrity": "sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==", "dev": true, "requires": { "string-width": "^2.1.1", @@ -41382,7 +41382,7 @@ "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", "dev": true, "optional": true, "requires": { @@ -41627,31 +41627,31 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==" }, "map-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, "optional": true }, "map-or-similar": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", - "integrity": "sha1-beJlMXSt+12e3DPGnT6Sobdvrwg=", + "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", "dev": true }, "map-values": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/map-values/-/map-values-1.0.1.tgz", - "integrity": "sha1-douOecAJvytk/ugG4ip7HEGQyZA=", + "integrity": "sha512-BbShUnr5OartXJe1GeccAWtfro11hhgNJg6G9/UtWKjVGvV5U4C09cg5nk8JUevhXODaXY+hQ3xxMUKSs62ONQ==", "dev": true }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", "requires": { "object-visit": "^1.0.0" } @@ -42109,7 +42109,7 @@ "mdast-util-inject": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mdast-util-inject/-/mdast-util-inject-1.1.0.tgz", - "integrity": "sha1-2wa4tYW+lZotzS+H9HK6m3VvNnU=", + "integrity": "sha512-CcJ0mHa36QYumDKiZ2OIR+ClhfOM7zIzN+Wfy8tRZ1hpH9DKLCS+Mh4DyK5bCxzE9uxMWcbIpeNFWsg1zrj/2g==", "dev": true, "requires": { "mdast-util-to-string": "^1.0.0" @@ -42174,13 +42174,13 @@ "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", "dev": true }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true }, "mem": { @@ -42223,7 +42223,7 @@ "memoizerific": { "version": "1.11.3", "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", - "integrity": "sha1-fIekZGREwy11Q4VwkF8tvRsagFo=", + "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", "dev": true, "requires": { "map-or-similar": "^1.5.0" @@ -42232,7 +42232,7 @@ "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", "dev": true, "requires": { "errno": "^0.1.3", @@ -42242,7 +42242,7 @@ "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "dev": true }, "meow": { @@ -42379,7 +42379,7 @@ "clone-deep": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", - "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", + "integrity": "sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==", "dev": true, "requires": { "for-own": "^0.1.3", @@ -42403,7 +42403,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, "requires": { "is-buffer": "^1.1.5" @@ -42412,7 +42412,7 @@ "shallow-clone": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", - "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", + "integrity": "sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==", "dev": true, "requires": { "is-extendable": "^0.1.1", @@ -42424,7 +42424,7 @@ "kind-of": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", - "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", + "integrity": "sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==", "dev": true, "requires": { "is-buffer": "^1.0.2" @@ -42433,7 +42433,7 @@ "lazy-cache": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", - "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=", + "integrity": "sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==", "dev": true } } @@ -42443,7 +42443,7 @@ "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, "merge-stream": { @@ -42460,7 +42460,7 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true }, "metro": { @@ -43603,7 +43603,7 @@ "min-document": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", "dev": true, "requires": { "dom-walk": "^0.1.0" @@ -43680,7 +43680,7 @@ "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", "dev": true }, "minimatch": { @@ -43942,7 +43942,7 @@ "mixin-object": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "integrity": "sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==", "dev": true, "requires": { "for-in": "^0.1.3", @@ -43952,7 +43952,7 @@ "for-in": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "integrity": "sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==", "dev": true } } @@ -43960,7 +43960,7 @@ "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==", "requires": { "minimist": "0.0.8" }, @@ -43968,7 +43968,7 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==" } } }, @@ -44039,7 +44039,7 @@ "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", "dev": true, "requires": { "aproba": "^1.1.1", @@ -44170,7 +44170,7 @@ "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "negotiator": { @@ -44246,7 +44246,7 @@ "node-dir": { "version": "0.1.17", "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=", + "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", "requires": { "minimatch": "^3.0.2" } @@ -44314,7 +44314,7 @@ "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node-libs-browser": { "version": "2.2.1", @@ -44350,7 +44350,7 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true } } @@ -44413,7 +44413,7 @@ "normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", "dev": true }, "normalize-selector": { @@ -44998,7 +44998,7 @@ "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -45010,7 +45010,7 @@ "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "requires": { "error-ex": "^1.3.1", @@ -45020,13 +45020,13 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, "requires": { "load-json-file": "^4.0.0", @@ -45043,7 +45043,7 @@ "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true } } @@ -45051,7 +45051,7 @@ "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "requires": { "path-key": "^2.0.0" } @@ -45082,7 +45082,7 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "dev": true }, "nwsapi": { @@ -45494,12 +45494,12 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", "requires": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -45509,7 +45509,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "requires": { "is-descriptor": "^0.1.0" } @@ -45517,7 +45517,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "requires": { "is-buffer": "^1.1.5" } @@ -45527,7 +45527,7 @@ "object-filter": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/object-filter/-/object-filter-1.0.2.tgz", - "integrity": "sha1-rwt5f/6+r4pSxmN87b6IFs/sG8g=", + "integrity": "sha512-NahvP2vZcy1ZiiYah30CEPw0FpDcSkSePJBMpzl5EQgCmISijiGuJm3SPYp7U+Lf2TljyaIw3E5EgkEx/TNEVA==", "dev": true }, "object-inspect": { @@ -45575,7 +45575,7 @@ "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", "requires": { "isobject": "^3.0.0" } @@ -46178,7 +46178,7 @@ "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "requires": { "isobject": "^3.0.1" } @@ -46357,7 +46357,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "requires": { "wrappy": "1" } @@ -46497,13 +46497,13 @@ "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", "dev": true }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", "dev": true }, "os-name": { @@ -46519,7 +46519,7 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" }, "p-all": { "version": "2.1.0", @@ -46579,7 +46579,7 @@ "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==" }, "p-limit": { "version": "3.1.0", @@ -47015,7 +47015,7 @@ "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true }, "parse-path": { @@ -47070,7 +47070,7 @@ "pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==" }, "patch-package": { "version": "6.2.2", @@ -47191,29 +47191,29 @@ "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", "dev": true }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", "dev": true }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" }, "path-parse": { "version": "1.0.7", @@ -47223,7 +47223,7 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, "path-type": { @@ -47259,24 +47259,24 @@ "pegjs": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", - "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=" + "integrity": "sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow==" }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, "phpegjs": { "version": "1.0.0-beta7", "resolved": "https://registry.npmjs.org/phpegjs/-/phpegjs-1.0.0-beta7.tgz", - "integrity": "sha1-uLbthQGYB//Q7+ID4AKj5e2LTZQ=" + "integrity": "sha512-SO+NP5argMoJVCWcYiOofPUeEWDIM47FNCBJtp6uJ8PpjtBcudYJTzCbCMit5dzmfSLCoijzEwIXOqPqD45xQg==" }, "picocolors": { "version": "1.0.0", @@ -47303,13 +47303,13 @@ "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, "requires": { "pinkie": "^2.0.0" @@ -47427,7 +47427,7 @@ "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==" }, "postcss": { "version": "8.4.16", @@ -47588,7 +47588,7 @@ "postcss-media-query-parser": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", - "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", "dev": true }, "postcss-merge-longhand": { @@ -47960,7 +47960,7 @@ "postcss-resolve-nested-selector": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", "dev": true }, "postcss-safe-parser": { @@ -48035,7 +48035,7 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true }, "prettier": { @@ -48109,7 +48109,7 @@ "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true }, "process-nextick-args": { @@ -48146,7 +48146,7 @@ "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, "promise-retry": { @@ -48650,7 +48650,7 @@ "promzard": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", - "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", + "integrity": "sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw==", "dev": true, "requires": { "read": "1" @@ -48684,7 +48684,7 @@ "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true }, "protocols": { @@ -48707,13 +48707,13 @@ "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", "dev": true }, "psl": { @@ -49069,7 +49069,7 @@ "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", "dev": true }, "qs": { @@ -49100,7 +49100,7 @@ "querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", "dev": true }, "querystringify": { @@ -50301,7 +50301,7 @@ "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", "dev": true, "requires": { "mute-stream": "~0.0.4" @@ -50580,7 +50580,7 @@ "readline": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", - "integrity": "sha1-xYDXfvLPyHUrEySYBg3JeTp6wBw=" + "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==" }, "reakit": { "version": "1.3.11", @@ -50647,7 +50647,7 @@ "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", "dev": true, "optional": true, "requires": { @@ -50658,7 +50658,7 @@ "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", "dev": true, "optional": true, "requires": { @@ -51285,7 +51285,7 @@ "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", "dev": true }, "renderkid": { @@ -51409,12 +51409,12 @@ "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", "dev": true, "optional": true, "requires": { @@ -51424,7 +51424,7 @@ "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "integrity": "sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==", "dev": true }, "request": { @@ -51503,7 +51503,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "require-from-string": { "version": "2.0.2", @@ -51525,7 +51525,7 @@ "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, "resize-observer-polyfill": { @@ -51591,7 +51591,7 @@ "resolve-dir": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", - "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", + "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==", "dev": true, "requires": { "expand-tilde": "^1.2.2", @@ -51636,7 +51636,7 @@ "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==" }, "resolve.exports": { "version": "2.0.1", @@ -51800,7 +51800,7 @@ "run-queue": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", "dev": true, "requires": { "aproba": "^1.1.1" @@ -51809,12 +51809,12 @@ "rungen": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/rungen/-/rungen-0.3.2.tgz", - "integrity": "sha1-QAwJ6+kU57F+C27zJjQA/Cq8fLM=" + "integrity": "sha512-zWl10xu2D7zoR8zSC2U6bg5bYF6T/Wk7rxwp8IPaJH7f0Ge21G03kNHVgHR7tyVkSSfAOG0Rqf/Cl38JftSmtw==" }, "rx": { "version": "2.3.24", "resolved": "https://registry.npmjs.org/rx/-/rx-2.3.24.tgz", - "integrity": "sha1-FPlQpCF9fjXapxu8vljv9o6ksrc=", + "integrity": "sha512-Ue4ZB7Dzbn2I9sIj8ws536nOP2S53uypyCkCz9q0vlYD5Kn6/pu4dE+wt2ZfFzd9m73hiYKnnCb1OyKqc+MRkg==", "dev": true }, "rxjs": { @@ -51842,7 +51842,7 @@ "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", "requires": { "ret": "~0.1.10" } @@ -52244,12 +52244,12 @@ "select": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=" + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true }, "selfsigned": { @@ -52290,7 +52290,7 @@ "semver-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "dev": true }, "send": { @@ -52376,7 +52376,7 @@ "serialize-error": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=" + "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==" }, "serialize-javascript": { "version": "4.0.0", @@ -52390,7 +52390,7 @@ "serve-favicon": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", - "integrity": "sha1-k10kDN/g9YBTB/3+ln2IlCosvPA=", + "integrity": "sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==", "dev": true, "requires": { "etag": "~1.8.1", @@ -52417,7 +52417,7 @@ "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, "requires": { "accepts": "~1.3.4", @@ -52441,7 +52441,7 @@ "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "requires": { "depd": "~1.1.2", @@ -52472,7 +52472,7 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "set-value": { "version": "2.0.1", @@ -52488,7 +52488,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "requires": { "is-extendable": "^0.1.0" } @@ -52506,7 +52506,7 @@ "setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "setprototypeof": { "version": "1.2.0", @@ -52540,7 +52540,7 @@ "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "requires": { "shebang-regex": "^1.0.0" } @@ -52548,7 +52548,7 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" }, "shell-quote": { "version": "1.7.3", @@ -52748,7 +52748,7 @@ "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "requires": { "is-arrayish": "^0.3.1" }, @@ -52836,7 +52836,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "requires": { "is-descriptor": "^0.1.0" } @@ -52844,7 +52844,7 @@ "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "requires": { "is-extendable": "^0.1.0" } @@ -52869,7 +52869,7 @@ "define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "requires": { "is-descriptor": "^1.0.0" } @@ -52913,7 +52913,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "requires": { "is-buffer": "^1.1.5" } @@ -53011,7 +53011,7 @@ "sort-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", "dev": true, "requires": { "is-plain-obj": "^1.0.0" @@ -53088,7 +53088,7 @@ "spawn-command": { "version": "0.0.2-1", "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", + "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", "dev": true }, "spawnd": { @@ -53267,7 +53267,7 @@ "sprintf-js": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", - "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=" + "integrity": "sha512-h/U+VScR2Ft+aXDjGTLtguUEIrYuOjTj79BAOElUvdahYMaaa7SNLjJpOIn+Uzt0hsgHfYvlbcno3e9yXOSo8Q==" }, "sshpk": { "version": "1.14.2", @@ -53347,7 +53347,7 @@ "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -53356,7 +53356,7 @@ "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "requires": { "is-descriptor": "^0.1.0" } @@ -53423,7 +53423,7 @@ "strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=" + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==" }, "string-hash-64": { "version": "1.0.3", @@ -54434,7 +54434,7 @@ "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==" }, "strip-final-newline": { "version": "2.0.0", @@ -54445,7 +54445,7 @@ "strip-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", "dev": true, "optional": true, "requires": { @@ -54487,7 +54487,7 @@ "style-search": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", + "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", "dev": true }, "style-to-object": { @@ -55104,7 +55104,7 @@ "svg-tags": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", "dev": true }, "svgo": { @@ -55675,7 +55675,7 @@ "temp": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "integrity": "sha512-jtnWJs6B1cZlHs9wPG7BrowKxZw/rf6+UpGAkr8AaYmiTyTO7zQlLoST8zx/8TcUPnZmeBoB+H8ARuHZaSijVw==", "requires": { "os-tmpdir": "^1.0.0", "rimraf": "~2.2.6" @@ -55684,14 +55684,14 @@ "rimraf": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=" + "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==" } } }, "temp-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", "dev": true }, "terminal-link": { @@ -55858,7 +55858,7 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "throat": { @@ -55875,7 +55875,7 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "through2": { @@ -55935,18 +55935,18 @@ "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", "dev": true }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", "requires": { "kind-of": "^3.0.2" }, @@ -55954,7 +55954,7 @@ "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "requires": { "is-buffer": "^1.1.5" } @@ -56031,20 +56031,20 @@ "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", - "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=", + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", "dev": true }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", "dev": true, "optional": true }, "trim-repeated": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.2" @@ -56128,7 +56128,7 @@ "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", "dev": true }, "tunnel": { @@ -56140,7 +56140,7 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -56154,14 +56154,14 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true, "optional": true }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, "requires": { "prelude-ls": "~1.1.2" @@ -56215,7 +56215,7 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true }, "typedarray-to-buffer": { @@ -56525,12 +56525,12 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -56539,7 +56539,7 @@ "has-value": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -56549,7 +56549,7 @@ "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", "requires": { "isarray": "1.0.0" } @@ -56559,14 +56559,14 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==" } } }, "untildify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz", - "integrity": "sha1-F+soB5h/dpUunASF/DEdBqgmouA=", + "integrity": "sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig==", "dev": true, "optional": true, "requires": { @@ -56608,7 +56608,7 @@ "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==" }, "url": { "version": "0.11.0", @@ -56720,7 +56720,7 @@ "url-template": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", "dev": true }, "use": { @@ -56795,7 +56795,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "util.promisify": { "version": "1.0.0", @@ -56810,7 +56810,7 @@ "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", "dev": true }, "utility-types": { @@ -56821,7 +56821,7 @@ "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, "uuid": { "version": "8.3.0", @@ -56831,7 +56831,7 @@ "uuid-browser": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uuid-browser/-/uuid-browser-3.1.0.tgz", - "integrity": "sha1-DwWkCu90+eWVHiDvv0SxGHHlZBA=", + "integrity": "sha512-dsNgbLaTrd6l3MMxTtouOCFw4CBFc/3a+GgYA2YyrJvyQ1u6q4pcu3ktLoUZ/VN/Aw9WsauazbgsgdfVWgAKQg==", "dev": true }, "v8-compile-cache": { @@ -56872,7 +56872,7 @@ "validate-npm-package-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", "dev": true, "requires": { "builtins": "^1.0.3" @@ -56890,13 +56890,13 @@ "vargs": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/vargs/-/vargs-0.1.0.tgz", - "integrity": "sha1-a2GE2mUgzDIEzhtAfKwm2SYJ6/8=", + "integrity": "sha512-d/j1kMUt0YjLCQPAI+VMZ7IKwNGjk8dSHMCrHq9txFOCcCIDoe8ck9FmPvABJgxIaZO1tabXmNojQG6mBkLLCw==", "dev": true }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, "vendors": { "version": "1.0.4", @@ -56907,7 +56907,7 @@ "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -56918,7 +56918,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true } } @@ -57174,7 +57174,7 @@ "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", "dev": true, "optional": true, "requires": { @@ -57236,7 +57236,7 @@ "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "requires": { "defaults": "^1.0.3" } @@ -58817,7 +58817,7 @@ "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, "worker-farm": { @@ -58907,7 +58907,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "write-file-atomic": { "version": "2.4.3", @@ -58990,7 +58990,7 @@ "x-default-browser": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/x-default-browser/-/x-default-browser-0.4.0.tgz", - "integrity": "sha1-cM8NqF2nwKtcsPFaiX8jIqa91IE=", + "integrity": "sha512-7LKo7RtWfoFN/rHx1UELv/2zHGMx8MkZKDq1xENmOCTkfIqZJ0zZ26NEJX8czhnPXVcqS0ARjjfJB+eJ0/5Cvw==", "dev": true, "requires": { "default-browser-id": "^1.0.4" @@ -58999,13 +58999,13 @@ "x-is-string": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", - "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=", + "integrity": "sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w==", "dev": true }, "xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", "dev": true }, "xml-name-validator": { diff --git a/packages/components/package.json b/packages/components/package.json index 7e4925bd4fcc6..71f01450f1207 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -66,7 +66,7 @@ "dom-scroll-into-view": "^1.2.1", "downshift": "^6.0.15", "fast-deep-equal": "^3.1.3", - "framer-motion": "^10.11.6", + "framer-motion": "~10.11.6", "gradient-parser": "^0.1.5", "highlight-words-core": "^1.2.2", "is-plain-object": "^5.0.0", From e58fb9dad20fe106c7c7c2ddbfc268c9c3ad9584 Mon Sep 17 00:00:00 2001 From: Robert Anderson Date: Tue, 27 Jun 2023 10:18:32 +1000 Subject: [PATCH 11/37] useBlockSync(): Reset inner blocks when component unmounts (#51783) --- .../provider/test/use-block-sync.js | 27 ++++++++++++++----- .../src/components/provider/use-block-sync.js | 19 +++++++++++++ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/packages/block-editor/src/components/provider/test/use-block-sync.js b/packages/block-editor/src/components/provider/test/use-block-sync.js index 7901c3d98f3a9..b1e6a97d137c9 100644 --- a/packages/block-editor/src/components/provider/test/use-block-sync.js +++ b/packages/block-editor/src/components/provider/test/use-block-sync.js @@ -48,7 +48,7 @@ describe( 'useBlockSync hook', () => { jest.clearAllMocks(); } ); - it( 'resets the block-editor blocks when the controll value changes', async () => { + it( 'resets the block-editor blocks when the controlled value changes', async () => { const fakeBlocks = []; const resetBlocks = jest.spyOn( blockEditorActions, 'resetBlocks' ); const replaceInnerBlocks = jest.spyOn( @@ -58,7 +58,7 @@ describe( 'useBlockSync hook', () => { const onChange = jest.fn(); const onInput = jest.fn(); - const { rerender } = render( + const { rerender, unmount } = render( { expect( onInput ).not.toHaveBeenCalled(); expect( replaceInnerBlocks ).not.toHaveBeenCalled(); expect( resetBlocks ).toHaveBeenCalledWith( testBlocks ); + + unmount(); + + expect( onChange ).not.toHaveBeenCalled(); + expect( onInput ).not.toHaveBeenCalled(); + expect( replaceInnerBlocks ).not.toHaveBeenCalled(); + expect( resetBlocks ).toHaveBeenCalledWith( [] ); } ); - it( 'replaces the inner blocks of a block when the control value changes if a clientId is passed', async () => { + it( 'replaces the inner blocks of a block when the controlled value changes if a clientId is passed', async () => { const fakeBlocks = []; const replaceInnerBlocks = jest.spyOn( blockEditorActions, @@ -100,7 +107,7 @@ describe( 'useBlockSync hook', () => { const onChange = jest.fn(); const onInput = jest.fn(); - const { rerender } = render( + const { rerender, unmount } = render( { expect( onChange ).not.toHaveBeenCalled(); expect( onInput ).not.toHaveBeenCalled(); expect( resetBlocks ).not.toHaveBeenCalled(); - // We can't check the args because the blocks are cloned. - expect( replaceInnerBlocks ).toHaveBeenCalled(); + expect( replaceInnerBlocks ).toHaveBeenCalledWith( 'test', [ + expect.objectContaining( { name: 'test/test-block' } ), + ] ); + + unmount(); + + expect( onChange ).not.toHaveBeenCalled(); + expect( onInput ).not.toHaveBeenCalled(); + expect( resetBlocks ).not.toHaveBeenCalled(); + expect( replaceInnerBlocks ).toHaveBeenCalledWith( 'test', [] ); } ); it( 'does not add the controlled blocks to the block-editor store if the store already contains them', async () => { diff --git a/packages/block-editor/src/components/provider/use-block-sync.js b/packages/block-editor/src/components/provider/use-block-sync.js index f7392f99035a9..d788c7b444230 100644 --- a/packages/block-editor/src/components/provider/use-block-sync.js +++ b/packages/block-editor/src/components/provider/use-block-sync.js @@ -134,6 +134,19 @@ export default function useBlockSync( { } }; + // Clean up the changes made by setControlledBlocks() when the component + // containing useBlockSync() unmounts. + const unsetControlledBlocks = () => { + __unstableMarkNextChangeAsNotPersistent(); + if ( clientId ) { + setHasControlledInnerBlocks( clientId, false ); + __unstableMarkNextChangeAsNotPersistent(); + replaceInnerBlocks( clientId, [] ); + } else { + resetBlocks( [] ); + } + }; + // Add a subscription to the block-editor registry to detect when changes // have been made. This lets us inform the data source of changes. This // is an effect so that the subscriber can run synchronously without @@ -287,4 +300,10 @@ export default function useBlockSync( { unsubscribe(); }; }, [ registry, clientId ] ); + + useEffect( () => { + return () => { + unsetControlledBlocks(); + }; + }, [] ); } From 1472d940c8869bf9aa3437f8623b72a4f6872fa9 Mon Sep 17 00:00:00 2001 From: Marco Ciampini Date: Mon, 26 Jun 2023 20:47:34 +0200 Subject: [PATCH 12/37] BlockLockModal: restore focus on fallback toolbar button when original button is not rendered (#51666) * useFocusReturn: pass focus restoration default target to the onFocusReturn callback * Modal: pass onFocusReturn callback * BlockLockModal: restore focus to first focusable item when unlocking block from toolbar button * Add comments * Revert changes to `useFocusReturn` and `Modal` component, just add logic to the BlockLockToolbar instead * Comment --- .../src/components/block-lock/toolbar.js | 40 ++++++++++++++++--- .../src/components/block-toolbar/index.js | 5 ++- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/packages/block-editor/src/components/block-lock/toolbar.js b/packages/block-editor/src/components/block-lock/toolbar.js index d0a9d3d8bf3d3..0abd693b5a7c9 100644 --- a/packages/block-editor/src/components/block-lock/toolbar.js +++ b/packages/block-editor/src/components/block-lock/toolbar.js @@ -3,7 +3,8 @@ */ import { __ } from '@wordpress/i18n'; import { ToolbarButton, ToolbarGroup } from '@wordpress/components'; -import { useReducer } from '@wordpress/element'; +import { focus } from '@wordpress/dom'; +import { useReducer, useRef, useEffect } from '@wordpress/element'; import { lock } from '@wordpress/icons'; /** @@ -12,7 +13,7 @@ import { lock } from '@wordpress/icons'; import BlockLockModal from './modal'; import useBlockLock from './use-block-lock'; -export default function BlockLockToolbar( { clientId } ) { +export default function BlockLockToolbar( { clientId, wrapperRef } ) { const { canEdit, canMove, canRemove, canLock } = useBlockLock( clientId ); const [ isModalOpen, toggleModal ] = useReducer( @@ -20,11 +21,37 @@ export default function BlockLockToolbar( { clientId } ) { false ); - if ( ! canLock ) { - return null; - } + const lockButtonRef = useRef( null ); + const isFirstRender = useRef( true ); + + const shouldHideBlockLockUI = + ! canLock || ( canEdit && canMove && canRemove ); + + // Restore focus manually on the first focusable element in the toolbar + // when the block lock modal is closed and the block is not locked anymore. + // See https://github.com/WordPress/gutenberg/issues/51447 + useEffect( () => { + if ( isFirstRender.current ) { + isFirstRender.current = false; + return; + } + + if ( ! isModalOpen && shouldHideBlockLockUI ) { + focus.focusable + .find( wrapperRef.current, { + sequential: false, + } ) + .find( + ( element ) => + element.tagName === 'BUTTON' && + element !== lockButtonRef.current + ) + ?.focus(); + } + // wrapperRef is a reference object and should be stable + }, [ isModalOpen, shouldHideBlockLockUI, wrapperRef ] ); - if ( canEdit && canMove && canRemove ) { + if ( shouldHideBlockLockUI ) { return null; } @@ -35,6 +62,7 @@ export default function BlockLockToolbar( { clientId } ) { icon={ lock } label={ __( 'Unlock' ) } onClick={ toggleModal } + ref={ lockButtonRef } /> { isModalOpen && ( diff --git a/packages/block-editor/src/components/block-toolbar/index.js b/packages/block-editor/src/components/block-toolbar/index.js index 4dc53aae0afff..94de64fc91492 100644 --- a/packages/block-editor/src/components/block-toolbar/index.js +++ b/packages/block-editor/src/components/block-toolbar/index.js @@ -78,6 +78,8 @@ const BlockToolbar = ( { hideDragHandle } ) => { }; }, [] ); + const toolbarWrapperRef = useRef( null ); + // Handles highlighting the current block outline on hover or focus of the // block type toolbar area. const { toggleBlockHighlight } = useDispatch( blockEditorStore ); @@ -123,7 +125,7 @@ const BlockToolbar = ( { hideDragHandle } ) => { } ); return ( -
+
{ ! isMultiToolbar && isLargeViewport && blockEditingMode === 'default' && } @@ -135,6 +137,7 @@ const BlockToolbar = ( { hideDragHandle } ) => { { ! isMultiToolbar && ( ) } Date: Mon, 26 Jun 2023 11:36:30 -0400 Subject: [PATCH 13/37] Fix missing MenuGroup in header more menu (#51860) --- .../components/header-edit-mode/more-menu/index.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/edit-site/src/components/header-edit-mode/more-menu/index.js b/packages/edit-site/src/components/header-edit-mode/more-menu/index.js index 802e9f9439811..7fe63a343960a 100644 --- a/packages/edit-site/src/components/header-edit-mode/more-menu/index.js +++ b/packages/edit-site/src/components/header-edit-mode/more-menu/index.js @@ -116,14 +116,14 @@ export default function MoreMenu( { showIconLabels } ) { '\\' ) } /> - - + + Date: Mon, 26 Jun 2023 11:22:38 +0300 Subject: [PATCH 14/37] Add `manage all custom patterns` command (#51845) * Add manage all custom patterns command * reorganise with useAdminNavigationCommands --- ...type-commands.js => admin-navigation-commands.js} | 12 ++++++++++-- packages/core-commands/src/private-apis.js | 4 ++-- 2 files changed, 12 insertions(+), 4 deletions(-) rename packages/core-commands/src/{add-post-type-commands.js => admin-navigation-commands.js} (60%) diff --git a/packages/core-commands/src/add-post-type-commands.js b/packages/core-commands/src/admin-navigation-commands.js similarity index 60% rename from packages/core-commands/src/add-post-type-commands.js rename to packages/core-commands/src/admin-navigation-commands.js index 47e6014f56944..577e7258df0b6 100644 --- a/packages/core-commands/src/add-post-type-commands.js +++ b/packages/core-commands/src/admin-navigation-commands.js @@ -3,9 +3,9 @@ */ import { useCommand } from '@wordpress/commands'; import { __ } from '@wordpress/i18n'; -import { plus } from '@wordpress/icons'; +import { external, plus } from '@wordpress/icons'; -export function useAddPostTypeCommands() { +export function useAdminNavigationCommands() { useCommand( { name: 'core/add-new-post', label: __( 'Add new post' ), @@ -22,4 +22,12 @@ export function useAddPostTypeCommands() { document.location.href = 'post-new.php?post_type=page'; }, } ); + useCommand( { + name: 'core/manage-reusable-blocks', + label: __( 'Manage all custom patterns' ), + callback: () => { + document.location.href = 'edit.php?post_type=wp_block'; + }, + icon: external, + } ); } diff --git a/packages/core-commands/src/private-apis.js b/packages/core-commands/src/private-apis.js index b0e0cd87040f6..de5b0de197600 100644 --- a/packages/core-commands/src/private-apis.js +++ b/packages/core-commands/src/private-apis.js @@ -1,12 +1,12 @@ /** * Internal dependencies */ -import { useAddPostTypeCommands } from './add-post-type-commands'; +import { useAdminNavigationCommands } from './admin-navigation-commands'; import { useSiteEditorNavigationCommands } from './site-editor-navigation-commands'; import { lock } from './lock-unlock'; function useCommands() { - useAddPostTypeCommands(); + useAdminNavigationCommands(); useSiteEditorNavigationCommands(); } From 340833e53b835cf78ec86fcc90e0830d59491a58 Mon Sep 17 00:00:00 2001 From: Riad Benguella Date: Sun, 25 Jun 2023 11:41:19 +0100 Subject: [PATCH 15/37] Command center: Add another batch of commands to the site editor (#51832) Co-authored-by: Nik Tsekouras --- packages/commands/src/hooks/use-command.js | 2 +- .../src/hooks/commands/use-common-commands.js | 21 +++- .../hooks/commands/use-edit-mode-commands.js | 108 +++++++++++++++++- 3 files changed, 127 insertions(+), 4 deletions(-) diff --git a/packages/commands/src/hooks/use-command.js b/packages/commands/src/hooks/use-command.js index e3f56662b91f2..7d92439a3d5ed 100644 --- a/packages/commands/src/hooks/use-command.js +++ b/packages/commands/src/hooks/use-command.js @@ -28,7 +28,7 @@ export default function useCommand( command ) { label: command.label, searchLabel: command.searchLabel, icon: command.icon, - callback: currentCallback.current, + callback: ( ...args ) => currentCallback.current( ...args ), } ); return () => { unregisterCommand( command.name ); diff --git a/packages/edit-site/src/hooks/commands/use-common-commands.js b/packages/edit-site/src/hooks/commands/use-common-commands.js index 34fef28c277fe..96a48980c021a 100644 --- a/packages/edit-site/src/hooks/commands/use-common-commands.js +++ b/packages/edit-site/src/hooks/commands/use-common-commands.js @@ -4,7 +4,7 @@ import { useMemo } from '@wordpress/element'; import { useDispatch, useSelect } from '@wordpress/data'; import { __ } from '@wordpress/i18n'; -import { trash, backup, help, styles } from '@wordpress/icons'; +import { trash, backup, help, styles, external } from '@wordpress/icons'; import { useCommandLoader, useCommand } from '@wordpress/commands'; import { privateApis as blockEditorPrivateApis } from '@wordpress/block-editor'; import { privateApis as routerPrivateApis } from '@wordpress/router'; @@ -105,6 +105,15 @@ export function useCommonCommands() { ); const { set } = useDispatch( preferencesStore ); const history = useHistory(); + const { homeUrl } = useSelect( ( select ) => { + const { + getUnstableBase, // Site index. + } = select( coreStore ); + + return { + homeUrl: getUnstableBase()?.home, + }; + }, [] ); useCommand( { name: 'core/edit-site/open-global-styles-revisions', @@ -155,6 +164,16 @@ export function useCommonCommands() { icon: help, } ); + useCommand( { + name: 'core/edit-site/view-site', + label: __( 'View site' ), + callback: ( { close } ) => { + close(); + window.open( homeUrl, '_blank' ); + }, + icon: external, + } ); + useCommandLoader( { name: 'core/edit-site/reset-global-styles', hook: useGlobalStylesResetCommands, diff --git a/packages/edit-site/src/hooks/commands/use-edit-mode-commands.js b/packages/edit-site/src/hooks/commands/use-edit-mode-commands.js index 16414eb1cc98f..7d6dcdbd05440 100644 --- a/packages/edit-site/src/hooks/commands/use-edit-mode-commands.js +++ b/packages/edit-site/src/hooks/commands/use-edit-mode-commands.js @@ -2,10 +2,22 @@ * WordPress dependencies */ import { useSelect, useDispatch } from '@wordpress/data'; -import { __ } from '@wordpress/i18n'; -import { trash, backup, layout, page } from '@wordpress/icons'; +import { __, isRTL } from '@wordpress/i18n'; +import { + code, + cog, + trash, + backup, + layout, + page, + drawerLeft, + drawerRight, + blockDefault, +} from '@wordpress/icons'; import { useCommandLoader } from '@wordpress/commands'; import { privateApis as routerPrivateApis } from '@wordpress/router'; +import { store as preferencesStore } from '@wordpress/preferences'; +import { store as interfaceStore } from '@wordpress/interface'; /** * Internal dependencies @@ -106,10 +118,102 @@ function useEditModeCommandLoader() { }; } +function useEditUICommandLoader() { + const { openGeneralSidebar, closeGeneralSidebar, switchEditorMode } = + useDispatch( editSiteStore ); + const { canvasMode, editorMode, activeSidebar } = useSelect( + ( select ) => ( { + isPage: select( editSiteStore ).isPage(), + hasPageContentFocus: select( editSiteStore ).hasPageContentFocus(), + canvasMode: unlock( select( editSiteStore ) ).getCanvasMode(), + editorMode: select( editSiteStore ).getEditorMode(), + activeSidebar: select( interfaceStore ).getActiveComplementaryArea( + editSiteStore.name + ), + } ), + [] + ); + const { toggle } = useDispatch( preferencesStore ); + + if ( canvasMode !== 'edit' ) { + return { isLoading: false, commands: [] }; + } + + const commands = []; + + commands.push( { + name: 'core/open-settings-sidebar', + label: __( 'Toggle settings sidebar' ), + icon: isRTL() ? drawerLeft : drawerRight, + callback: ( { close } ) => { + close(); + if ( activeSidebar === 'edit-site/template' ) { + closeGeneralSidebar(); + } else { + openGeneralSidebar( 'edit-site/template' ); + } + }, + } ); + + commands.push( { + name: 'core/open-block-inspector', + label: __( 'Toggle block inspector' ), + icon: blockDefault, + callback: ( { close } ) => { + close(); + if ( activeSidebar === 'edit-site/block-inspector' ) { + closeGeneralSidebar(); + } else { + openGeneralSidebar( 'edit-site/block-inspector' ); + } + }, + } ); + + commands.push( { + name: 'core/toggle-distraction-free-mode', + label: __( 'Toggle spotlight mode' ), + icon: cog, + callback: ( { close } ) => { + toggle( 'core/edit-site', 'focusMode' ); + close(); + }, + } ); + + commands.push( { + name: 'core/toggle-top-toolbar', + label: __( 'Toggle top toolbar' ), + icon: cog, + callback: ( { close } ) => { + toggle( 'core/edit-site', 'fixedToolbar' ); + close(); + }, + } ); + + commands.push( { + name: 'core/toggle-code-editor', + label: __( 'Toggle code editor' ), + icon: code, + callback: ( { close } ) => { + switchEditorMode( editorMode === 'visual' ? 'text' : 'visual' ); + close(); + }, + } ); + + return { + isLoading: false, + commands, + }; +} + export function useEditModeCommands() { useCommandLoader( { name: 'core/edit-site/manipulate-document', hook: useEditModeCommandLoader, context: 'site-editor-edit', } ); + + useCommandLoader( { + name: 'core/edit-site/edit-ui', + hook: useEditUICommandLoader, + } ); } From 64ed918d3e6360a4a42c20d01d93a57fea79e950 Mon Sep 17 00:00:00 2001 From: Daniel Richards Date: Fri, 23 Jun 2023 15:15:48 +0800 Subject: [PATCH 16/37] Fix delete shortcut incorrectly bound to non-user patterns (#51830) --- .../src/components/page-library/grid-item.js | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/edit-site/src/components/page-library/grid-item.js b/packages/edit-site/src/components/page-library/grid-item.js index 673057a12f43b..f46d7861a40dc 100644 --- a/packages/edit-site/src/components/page-library/grid-item.js +++ b/packages/edit-site/src/components/page-library/grid-item.js @@ -49,6 +49,12 @@ export default function GridItem( { categoryId, composite, icon, item } ) { canvas: 'edit', } ); + const onKeyDown = ( event ) => { + if ( DELETE === event.keyCode || BACKSPACE === event.keyCode ) { + setIsDeleteDialogOpen( true ); + } + }; + const isEmpty = ! item.blocks?.length; const patternClassNames = classnames( 'edit-site-library__pattern', { 'is-placeholder': isEmpty, @@ -72,8 +78,9 @@ export default function GridItem( { categoryId, composite, icon, item } ) { } }; + const isUserPattern = item.type === USER_PATTERNS; let ariaDescription; - if ( item.type === USER_PATTERNS ) { + if ( isUserPattern ) { // User patterns don't have descriptions, but can be edited and deleted, so include some help text. ariaDescription = __( 'Press Enter to edit, or Delete to delete the pattern.' @@ -90,19 +97,12 @@ export default function GridItem( { categoryId, composite, icon, item } ) { role="option" as="div" { ...composite } - onClick={ item.type !== PATTERNS ? onClick : undefined } + onClick={ isUserPattern ? onClick : undefined } + onKeyDown={ isUserPattern ? onKeyDown : undefined } aria-label={ item.title } aria-describedby={ ariaDescription ? descriptionId : undefined } - onKeyDown={ ( event ) => { - if ( - DELETE === event.keyCode || - BACKSPACE === event.keyCode - ) { - setIsDeleteDialogOpen( true ); - } - } } > { isEmpty && __( 'Empty pattern' ) } { ! isEmpty && } From 60e8c8e149fab00a93bf649f81790dafa76cd154 Mon Sep 17 00:00:00 2001 From: Daniel Richards Date: Fri, 23 Jun 2023 13:33:59 +0800 Subject: [PATCH 17/37] `ConfirmDialog`: Fix affirmative action being triggered an extra time when selecting a button via keyboard (#51730) * Ensure the confirm dialog cannnot be submitted using enter when the cancel button is focused * Add test case * Add CHANGELOG entry * Add PR number to changelog * Also prevent double submission of Confirm button * Use actions in storybook example rather than outputting to a heading --- packages/components/CHANGELOG.md | 1 + .../src/confirm-dialog/component.tsx | 14 ++++++- .../src/confirm-dialog/stories/index.js | 23 ++++------ .../src/confirm-dialog/test/index.js | 42 +++++++++++++++++++ 4 files changed, 63 insertions(+), 17 deletions(-) diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md index f33d32ed89497..2322d6f48ae73 100644 --- a/packages/components/CHANGELOG.md +++ b/packages/components/CHANGELOG.md @@ -13,6 +13,7 @@ - `Popover`: Allow legitimate 0 positions to update popover position ([#51320](https://github.com/WordPress/gutenberg/pull/51320)). - `Button`: Remove unnecessary margin from dashicon ([#51395](https://github.com/WordPress/gutenberg/pull/51395)). - `Autocomplete`: Announce how many results are available to screen readers when suggestions list first renders ([#51018](https://github.com/WordPress/gutenberg/pull/51018)). +- `ConfirmDialog`: Ensure onConfirm isn't called an extra time when submitting one of the buttons using the keyboard ([#51730](https://github.com/WordPress/gutenberg/pull/51730)). ### Internal diff --git a/packages/components/src/confirm-dialog/component.tsx b/packages/components/src/confirm-dialog/component.tsx index 92fb3fa08fbb1..b5c6cdf45f99a 100644 --- a/packages/components/src/confirm-dialog/component.tsx +++ b/packages/components/src/confirm-dialog/component.tsx @@ -7,7 +7,7 @@ import type { ForwardedRef, KeyboardEvent } from 'react'; * WordPress dependencies */ import { __ } from '@wordpress/i18n'; -import { useCallback, useEffect, useState } from '@wordpress/element'; +import { useCallback, useEffect, useRef, useState } from '@wordpress/element'; /** * Internal dependencies @@ -42,6 +42,8 @@ function ConfirmDialog( const cx = useCx(); const wrapperClassName = cx( styles.wrapper ); + const cancelButtonRef = useRef(); + const confirmButtonRef = useRef(); const [ isOpen, setIsOpen ] = useState< boolean >(); const [ shouldSelfClose, setShouldSelfClose ] = useState< boolean >(); @@ -69,7 +71,13 @@ function ConfirmDialog( const handleEnter = useCallback( ( event: KeyboardEvent< HTMLDivElement > ) => { - if ( event.key === 'Enter' ) { + // Avoid triggering the 'confirm' action when a button is focused, + // as this can cause a double submission. + const isConfirmOrCancelButton = + event.target === cancelButtonRef.current || + event.target === confirmButtonRef.current; + + if ( ! isConfirmOrCancelButton && event.key === 'Enter' ) { handleEvent( onConfirm )( event ); } }, @@ -96,12 +104,14 @@ function ConfirmDialog( { children } @@ -48,7 +48,7 @@ exports[`AlignmentUI should allow custom alignment controls to be specified 1`] xmlns="http://www.w3.org/2000/svg" > @@ -80,7 +80,7 @@ exports[`AlignmentUI should match snapshot when controls are hidden 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -113,7 +113,7 @@ exports[`AlignmentUI should match snapshot when controls are visible 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -136,7 +136,7 @@ exports[`AlignmentUI should match snapshot when controls are visible 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -159,7 +159,7 @@ exports[`AlignmentUI should match snapshot when controls are visible 1`] = ` xmlns="http://www.w3.org/2000/svg" > diff --git a/packages/block-editor/src/components/block-alignment-control/test/__snapshots__/index.js.snap b/packages/block-editor/src/components/block-alignment-control/test/__snapshots__/index.js.snap index 9b56e451a56bd..246e5dca2ae32 100644 --- a/packages/block-editor/src/components/block-alignment-control/test/__snapshots__/index.js.snap +++ b/packages/block-editor/src/components/block-alignment-control/test/__snapshots__/index.js.snap @@ -23,7 +23,7 @@ exports[`BlockAlignmentUI should match snapshot when controls are hidden 1`] = ` xmlns="http://www.w3.org/2000/svg" > @@ -55,7 +55,7 @@ exports[`BlockAlignmentUI should match snapshot when controls are visible 1`] = xmlns="http://www.w3.org/2000/svg" > @@ -77,7 +77,7 @@ exports[`BlockAlignmentUI should match snapshot when controls are visible 1`] = xmlns="http://www.w3.org/2000/svg" > @@ -99,7 +99,7 @@ exports[`BlockAlignmentUI should match snapshot when controls are visible 1`] = xmlns="http://www.w3.org/2000/svg" > @@ -121,7 +121,7 @@ exports[`BlockAlignmentUI should match snapshot when controls are visible 1`] = xmlns="http://www.w3.org/2000/svg" > diff --git a/packages/block-library/src/site-tagline/icon.js b/packages/block-library/src/site-tagline/icon.js index 262b980c1ce11..908d7149aa112 100644 --- a/packages/block-library/src/site-tagline/icon.js +++ b/packages/block-library/src/site-tagline/icon.js @@ -5,6 +5,6 @@ import { SVG, Path } from '@wordpress/components'; export default ( - + ); diff --git a/packages/icons/src/library/align-center.js b/packages/icons/src/library/align-center.js index 7e6f3ad7d7195..1b3408b1982ef 100644 --- a/packages/icons/src/library/align-center.js +++ b/packages/icons/src/library/align-center.js @@ -5,7 +5,7 @@ import { SVG, Path } from '@wordpress/primitives'; const alignCenter = ( - + ); diff --git a/packages/icons/src/library/align-left.js b/packages/icons/src/library/align-left.js index 152a2c2bd96f5..ef597eb019aee 100644 --- a/packages/icons/src/library/align-left.js +++ b/packages/icons/src/library/align-left.js @@ -5,7 +5,7 @@ import { SVG, Path } from '@wordpress/primitives'; const alignLeft = ( - + ); diff --git a/packages/icons/src/library/align-none.js b/packages/icons/src/library/align-none.js index 0948cd8d94300..2c29275123317 100644 --- a/packages/icons/src/library/align-none.js +++ b/packages/icons/src/library/align-none.js @@ -5,7 +5,7 @@ import { SVG, Path } from '@wordpress/primitives'; const alignNone = ( - + ); diff --git a/packages/icons/src/library/align-right.js b/packages/icons/src/library/align-right.js index 4d0f60f37309f..2daff79001f32 100644 --- a/packages/icons/src/library/align-right.js +++ b/packages/icons/src/library/align-right.js @@ -5,7 +5,7 @@ import { SVG, Path } from '@wordpress/primitives'; const alignRight = ( - + ); diff --git a/packages/icons/src/library/button.js b/packages/icons/src/library/button.js index 9081993de98dd..3565aac38cf19 100644 --- a/packages/icons/src/library/button.js +++ b/packages/icons/src/library/button.js @@ -5,7 +5,7 @@ import { Path, SVG } from '@wordpress/primitives'; const button = ( - + ); diff --git a/packages/icons/src/library/buttons.js b/packages/icons/src/library/buttons.js index 8fc5856efec1b..bb6f59a7764c1 100644 --- a/packages/icons/src/library/buttons.js +++ b/packages/icons/src/library/buttons.js @@ -5,7 +5,7 @@ import { Path, SVG } from '@wordpress/primitives'; const buttons = ( - + ); diff --git a/packages/icons/src/library/justify-center.js b/packages/icons/src/library/justify-center.js index e0b9e6645a40b..9276be34f08e0 100644 --- a/packages/icons/src/library/justify-center.js +++ b/packages/icons/src/library/justify-center.js @@ -5,7 +5,7 @@ import { SVG, Path } from '@wordpress/primitives'; const justifyCenter = ( - + ); diff --git a/packages/icons/src/library/media-and-text.js b/packages/icons/src/library/media-and-text.js index 31bb37d9b41f2..dd65590e49412 100644 --- a/packages/icons/src/library/media-and-text.js +++ b/packages/icons/src/library/media-and-text.js @@ -5,7 +5,7 @@ import { Path, SVG } from '@wordpress/primitives'; const mediaAndText = ( - + ); diff --git a/packages/icons/src/library/position-center.js b/packages/icons/src/library/position-center.js index 7c9686535ce65..6730c90638780 100644 --- a/packages/icons/src/library/position-center.js +++ b/packages/icons/src/library/position-center.js @@ -5,7 +5,7 @@ import { SVG, Path } from '@wordpress/primitives'; const positionCenter = ( - + ); diff --git a/packages/icons/src/library/position-left.js b/packages/icons/src/library/position-left.js index 5119fdf02acfc..fff393d10637e 100644 --- a/packages/icons/src/library/position-left.js +++ b/packages/icons/src/library/position-left.js @@ -5,7 +5,7 @@ import { SVG, Path } from '@wordpress/primitives'; const positionLeft = ( - + ); diff --git a/packages/icons/src/library/position-right.js b/packages/icons/src/library/position-right.js index ba6af93107723..eff1c853534f3 100644 --- a/packages/icons/src/library/position-right.js +++ b/packages/icons/src/library/position-right.js @@ -5,7 +5,7 @@ import { SVG, Path } from '@wordpress/primitives'; const positionRight = ( - + ); diff --git a/packages/icons/src/library/resize-corner-n-e.js b/packages/icons/src/library/resize-corner-n-e.js index 387efc99fb00d..48cd2a7a3fa58 100644 --- a/packages/icons/src/library/resize-corner-n-e.js +++ b/packages/icons/src/library/resize-corner-n-e.js @@ -5,7 +5,7 @@ import { Path, SVG } from '@wordpress/primitives'; const resizeCornerNE = ( - + ); diff --git a/packages/icons/src/library/separator.js b/packages/icons/src/library/separator.js index 98805ca181452..9e1b3334a88ba 100644 --- a/packages/icons/src/library/separator.js +++ b/packages/icons/src/library/separator.js @@ -5,7 +5,7 @@ import { Path, SVG } from '@wordpress/primitives'; const separator = ( - + ); diff --git a/packages/icons/src/library/stretch-full-width.js b/packages/icons/src/library/stretch-full-width.js index 3d6e37ff544d8..ee2c6393dcd22 100644 --- a/packages/icons/src/library/stretch-full-width.js +++ b/packages/icons/src/library/stretch-full-width.js @@ -5,7 +5,7 @@ import { SVG, Path } from '@wordpress/primitives'; const stretchFullWidth = ( - + ); diff --git a/packages/icons/src/library/stretch-wide.js b/packages/icons/src/library/stretch-wide.js index a9cf65fe001ff..c341d8718934b 100644 --- a/packages/icons/src/library/stretch-wide.js +++ b/packages/icons/src/library/stretch-wide.js @@ -5,7 +5,7 @@ import { SVG, Path } from '@wordpress/primitives'; const stretchWide = ( - + ); From 8e544a40d08cd92d84b78cfc38bd68e13fcbd834 Mon Sep 17 00:00:00 2001 From: Robert Anderson Date: Sat, 24 Jun 2023 00:41:38 +1000 Subject: [PATCH 23/37] Hide block toolbar using CSS when it is empty (#51779) --- .../block-editor/src/components/block-toolbar/index.js | 10 +++++----- .../block-editor/src/components/block-tools/style.scss | 4 ++++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/block-editor/src/components/block-toolbar/index.js b/packages/block-editor/src/components/block-toolbar/index.js index 94de64fc91492..0f968b8a209a7 100644 --- a/packages/block-editor/src/components/block-toolbar/index.js +++ b/packages/block-editor/src/components/block-toolbar/index.js @@ -129,9 +129,9 @@ const BlockToolbar = ( { hideDragHandle } ) => { { ! isMultiToolbar && isLargeViewport && blockEditingMode === 'default' && } -
- { ( shouldShowVisualToolbar || isMultiToolbar ) && - blockEditingMode === 'default' && ( + { ( shouldShowVisualToolbar || isMultiToolbar ) && + blockEditingMode === 'default' && ( +
{ ! isMultiToolbar && ( @@ -145,8 +145,8 @@ const BlockToolbar = ( { hideDragHandle } ) => { hideDragHandle={ hideDragHandle } /> - ) } -
+
+ ) } { shouldShowVisualToolbar && isMultiToolbar && ( ) } diff --git a/packages/block-editor/src/components/block-tools/style.scss b/packages/block-editor/src/components/block-tools/style.scss index cf38c9ee47de2..c55b8e651c2e7 100644 --- a/packages/block-editor/src/components/block-tools/style.scss +++ b/packages/block-editor/src/components/block-tools/style.scss @@ -121,6 +121,10 @@ } } + &:has(.block-editor-block-toolbar:empty) { + display: none; + } + // on desktop and tablet viewports the toolbar is fixed // on top of interface header From 62bdc0a2cb6d334b33cc8cb3101fad80b4524a81 Mon Sep 17 00:00:00 2001 From: James Koster Date: Fri, 23 Jun 2023 12:53:22 +0100 Subject: [PATCH 24/37] Update the add template modal design (#51806) * Add icons * alignment * Custom descriptions * justify content * Style custom template button * Remove min-height * Don't display description when there isn't one * Reduce space between template + description * Style icon * Style custom template * increase button size * Add prompt * Update template icons * Make year dynamic * Remove short descriptions * Revert "Remove short descriptions" This reverts commit 7eb06e8ab845b9cda3975989456614df5b221c29. * re-instate descriptions but only show as a tooltip * simplify a bit --------- Co-authored-by: ntsekouras --- .../add-new-template/new-template.js | 144 +++++++++++++++--- .../components/add-new-template/style.scss | 32 +++- 2 files changed, 150 insertions(+), 26 deletions(-) diff --git a/packages/edit-site/src/components/add-new-template/new-template.js b/packages/edit-site/src/components/add-new-template/new-template.js index b32ce67c7d317..0c6ab03899cc8 100644 --- a/packages/edit-site/src/components/add-new-template/new-template.js +++ b/packages/edit-site/src/components/add-new-template/new-template.js @@ -12,12 +12,32 @@ import { __experimentalGrid as Grid, __experimentalText as Text, __experimentalVStack as VStack, + Flex, + Icon, } from '@wordpress/components'; import { decodeEntities } from '@wordpress/html-entities'; import { useState } from '@wordpress/element'; -import { useDispatch } from '@wordpress/data'; +import { useSelect, useDispatch } from '@wordpress/data'; import { store as coreStore } from '@wordpress/core-data'; -import { plus } from '@wordpress/icons'; +import { + archive, + blockMeta, + calendar, + category, + commentAuthorAvatar, + edit, + home, + layout, + list, + media, + notFound, + page, + plus, + pin, + postList, + search, + tag, +} from '@wordpress/icons'; import { __, sprintf } from '@wordpress/i18n'; import { store as noticesStore } from '@wordpress/notices'; import { privateApis as routerPrivateApis } from '@wordpress/router'; @@ -56,27 +76,64 @@ const DEFAULT_TEMPLATE_SLUGS = [ '404', ]; -function TemplateListItem( { title, description, onClick } ) { +const TEMPLATE_ICONS = { + 'front-page': home, + home: postList, + single: pin, + page, + archive, + search, + 404: notFound, + index: list, + category, + author: commentAuthorAvatar, + taxonomy: blockMeta, + date: calendar, + tag, + attachment: media, +}; + +function TemplateListItem( { + title, + direction, + className, + description, + icon, + onClick, + children, +} ) { return ( -
+ - { title } - - - { description } - - + + { title } + + { children } + + ); } @@ -104,6 +161,26 @@ export default function NewTemplate( { const { createErrorNotice, createSuccessNotice } = useDispatch( noticesStore ); const { setTemplate } = unlock( useDispatch( editSiteStore ) ); + + const { homeUrl } = useSelect( ( select ) => { + const { + getUnstableBase, // Site index. + } = select( coreStore ); + + return { + homeUrl: getUnstableBase()?.home, + }; + }, [] ); + + const TEMPLATE_SHORT_DESCRIPTIONS = { + 'front-page': homeUrl, + date: sprintf( + // translators: %s: The homepage url. + __( 'E.g. %s' ), + homeUrl + '/' + new Date().getFullYear() + ), + }; + async function createTemplate( template, isWPSuggestion = true ) { if ( isCreatingTemplate ) { return; @@ -220,14 +297,25 @@ export default function NewTemplate( { justify="center" className="edit-site-add-new-template__template-list__contents" > + + { __( + 'Select what the new template should apply to:' + ) } + { missingTemplates.map( ( template ) => { - const { title, description, slug, onClick } = - template; + const { title, slug, onClick } = template; return ( onClick ? onClick( template ) @@ -238,15 +326,23 @@ export default function NewTemplate( { } ) } setModalContent( modalContentMap.customGenericTemplate ) } - /> + > + + { __( + 'A custom template can be manually applied to any post or page.' + ) } + + ) } { modalContent === modalContentMap.customTemplate && ( diff --git a/packages/edit-site/src/components/add-new-template/style.scss b/packages/edit-site/src/components/add-new-template/style.scss index c8c2ef9f54a07..b1c2b669e24ce 100644 --- a/packages/edit-site/src/components/add-new-template/style.scss +++ b/packages/edit-site/src/components/add-new-template/style.scss @@ -138,17 +138,39 @@ @include break-large() { width: calc(100% - #{$grid-unit-80 * 2}); } + + .edit-site-add-new-template__template-button, + .edit-site-add-new-template__custom-template-button { + svg { + fill: var(--wp-admin-theme-color); + } + } + + .edit-site-add-new-template__custom-template-button { + .edit-site-add-new-template__template-name { + flex-grow: 1; + align-items: flex-start; + } + } + + .edit-site-add-new-template__template-icon { + padding: $grid-unit-10; + background: rgba(var(--wp-admin-theme-color--rgb), 0.04); + border-radius: 100%; + max-height: $grid-unit-50; + max-width: $grid-unit-50; + } } .edit-site-custom-template-modal__contents, .edit-site-add-new-template__template-list__contents { > .components-button { - padding: $grid-unit-30; + padding: $grid-unit-40; border-radius: $radius-block-ui; display: flex; flex-direction: column; border: $border-width solid $gray-300; - min-height: $grid-unit-80 * 3; + justify-content: center; // Show the boundary of the button, in High Contrast Mode. outline: 1px solid transparent; @@ -183,6 +205,12 @@ } } } + + .edit-site-add-new-template__custom-template-button, + .edit-site-add-new-template__template-list__prompt { + grid-column-start: 1; + grid-column-end: 4; + } } .edit-site-add-new-template__template-list__contents { From bd973878c6daa871194bfb3e7197b4b999907f45 Mon Sep 17 00:00:00 2001 From: Aki Hamano <54422211+t-hamano@users.noreply.github.com> Date: Fri, 23 Jun 2023 23:32:45 +0900 Subject: [PATCH 25/37] Buttons Block: Fix for orientation-based block movers (#51831) --- packages/block-library/src/buttons/edit.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/block-library/src/buttons/edit.js b/packages/block-library/src/buttons/edit.js index 869968e5951a8..78be70ed9dc35 100644 --- a/packages/block-library/src/buttons/edit.js +++ b/packages/block-library/src/buttons/edit.js @@ -36,7 +36,7 @@ const DEFAULT_BLOCK = { }; function ButtonsEdit( { attributes, className } ) { - const { fontSize, style } = attributes; + const { fontSize, layout, style } = attributes; const blockProps = useBlockProps( { className: classnames( className, { 'has-custom-font-size': fontSize || style?.typography?.fontSize, @@ -59,8 +59,8 @@ function ButtonsEdit( { attributes, className } ) { { className: preferredStyle && `is-style-${ preferredStyle }` }, ], ], - templateInsertUpdatesSelection: true, + orientation: layout?.orientation ?? 'horizontal', } ); return
; From a7c4b8f2ec5b21df1c9c7e244f969d801a29996b Mon Sep 17 00:00:00 2001 From: Lena Morita Date: Sat, 24 Jun 2023 05:14:17 +0900 Subject: [PATCH 26/37] Button: Introduce `size` prop (#51842) * Revert "Button: Add opt-in prop for larger `isSmall` size (#51012)" This reverts commit 19bcabfcbbc483028d1a429d9abe6a0fd595d233. # Conflicts: # packages/components/CHANGELOG.md * Add docs for `size` prop Also fixes type duplicate prop name issues in NumberControl and FontSizePicker * Add CSS * Fixup * Add TODO for deprecation * Add test for back compat * Fixup * Add changelog * Tweak description for "compact" * Note that the `size` prop takes precedence * Add test for prop priority * Stop leaking `spinButtonSize` prop for styling --- packages/base-styles/_variables.scss | 2 +- packages/components/CHANGELOG.md | 1 + packages/components/src/button/README.md | 15 +++++++++++ packages/components/src/button/index.tsx | 15 ++++++++--- packages/components/src/button/style.scss | 25 +++++++++--------- packages/components/src/button/test/index.tsx | 13 ++++++++++ packages/components/src/button/types.ts | 26 ++++++++++++------- .../components/src/font-size-picker/index.tsx | 14 ++++++---- .../components/src/font-size-picker/styles.ts | 10 ------- .../components/src/number-control/index.tsx | 9 ++++--- .../styles/number-control-styles.ts | 24 ++++++----------- 11 files changed, 94 insertions(+), 60 deletions(-) diff --git a/packages/base-styles/_variables.scss b/packages/base-styles/_variables.scss index 31f197ba64270..584c057ec1eca 100644 --- a/packages/base-styles/_variables.scss +++ b/packages/base-styles/_variables.scss @@ -48,7 +48,7 @@ $icon-size: 24px; $button-size: 36px; $button-size-next-default-40px: 40px; // transitionary variable for next default button size $button-size-small: 24px; -$button-size-small-next-default-32px: 32px; // transitionary variable for next small button size +$button-size-compact: 32px; $header-height: 60px; $panel-header-height: $grid-unit-60; $nav-sidebar-width: 360px; diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md index 90a6d2d556f63..4c52a377f5b5e 100644 --- a/packages/components/CHANGELOG.md +++ b/packages/components/CHANGELOG.md @@ -7,6 +7,7 @@ - `SelectControl`: Added option to set hidden options. ([#51545](https://github.com/WordPress/gutenberg/pull/51545)) - `UnitControl`: Revamp support for changing unit by typing ([#39303](https://github.com/WordPress/gutenberg/pull/39303)). - `Modal`: Update corner radius to be between buttons and the site view frame, in a 2-4-8 system. ([#51254](https://github.com/WordPress/gutenberg/pull/51254)). +- `Button`: Introduce `size` prop with `default`, `compact`, and `small` variants ([#51842](https://github.com/WordPress/gutenberg/pull/51842)). - `ItemGroup`: Update button focus state styles to be inline with other button focus states in the editor. ([#51576](https://github.com/WordPress/gutenberg/pull/51576)). ### Bug Fix diff --git a/packages/components/src/button/README.md b/packages/components/src/button/README.md index 66bbae67ebcd5..5430b869485ea 100644 --- a/packages/components/src/button/README.md +++ b/packages/components/src/button/README.md @@ -198,6 +198,8 @@ Renders a pressed button style. Decreases the size of the button. +Deprecated in favor of the `size` prop. If both props are defined, the `size` prop will take precedence. + - Required: No #### `label`: `string` @@ -218,6 +220,19 @@ If provided, renders a [Tooltip](/packages/components/src/tooltip/README.md) com - Required: No +#### `size`: `'default'` | `'compact'` | `'small'` + +The size of the button. + +- `'default'`: For normal text-label buttons, unless it is a toggle button. +- `'compact'`: For toggle buttons, icon buttons, and buttons when used in context of either. +- `'small'`: For icon buttons associated with more advanced or auxiliary features. + +If the deprecated `isSmall` prop is also defined, this prop will take precedence. + +- Required: No +- Default: `'default'` + #### `target`: `string` If provided with `href`, sets the `target` attribute to the `a`. diff --git a/packages/components/src/button/index.tsx b/packages/components/src/button/index.tsx index 24932ab06a9b6..cc91cf4642586 100644 --- a/packages/components/src/button/index.tsx +++ b/packages/components/src/button/index.tsx @@ -33,11 +33,18 @@ function useDeprecatedProps( { isSecondary, isTertiary, isLink, + isSmall, + size, variant, ...otherProps }: ButtonProps & DeprecatedButtonProps ): ButtonProps { + let computedSize = size; let computedVariant = variant; + if ( isSmall ) { + computedSize ??= 'small'; + } + if ( isPrimary ) { computedVariant ??= 'primary'; } @@ -66,6 +73,7 @@ function useDeprecatedProps( { return { ...otherProps, + size: computedSize, variant: computedVariant, }; } @@ -76,8 +84,6 @@ export function UnforwardedButton( ) { const { __next40pxDefaultSize, - __next32pxSmallSize, - isSmall, isPressed, isBusy, isDestructive, @@ -91,6 +97,7 @@ export function UnforwardedButton( shortcut, label, children, + size = 'default', text, variant, __experimentalIsFocusable: isFocusable, @@ -118,10 +125,10 @@ export function UnforwardedButton( const classes = classnames( 'components-button', className, { 'is-next-40px-default-size': __next40pxDefaultSize, - 'is-next-32px-small-size': __next32pxSmallSize, 'is-secondary': variant === 'secondary', 'is-primary': variant === 'primary', - 'is-small': isSmall, + 'is-small': size === 'small', + 'is-compact': size === 'compact', 'is-tertiary': variant === 'tertiary', 'is-pressed': isPressed, 'is-busy': isBusy, diff --git a/packages/components/src/button/style.scss b/packages/components/src/button/style.scss index c93d7e2070c43..a450ef60b46af 100644 --- a/packages/components/src/button/style.scss +++ b/packages/components/src/button/style.scss @@ -257,25 +257,26 @@ /* stylelint-enable */ } + &.is-compact { + height: $button-size-compact; + + &.has-icon:not(.has-text) { + padding: 0; + width: $button-size-compact; + min-width: $button-size-compact; + } + } + &.is-small { - height: $button-size-small-next-default-32px; + height: $button-size-small; line-height: 22px; padding: 0 8px; font-size: 11px; &.has-icon:not(.has-text) { padding: 0; - width: $button-size-small-next-default-32px; - min-width: $button-size-small-next-default-32px; - } - - &:not(.is-next-32px-small-size) { - height: $button-size-small; - - &.has-icon:not(.has-text) { - width: $button-size-small; - min-width: $button-size-small; - } + width: $button-size-small; + min-width: $button-size-small; } } diff --git a/packages/components/src/button/test/index.tsx b/packages/components/src/button/test/index.tsx index 0219896781534..881a71484c18f 100644 --- a/packages/components/src/button/test/index.tsx +++ b/packages/components/src/button/test/index.tsx @@ -402,6 +402,19 @@ describe( 'Button', () => { ); expect( console ).toHaveWarned(); } ); + + it( 'should not break when the legacy isSmall prop is passed', () => { + render( ) } diff --git a/packages/components/src/font-size-picker/styles.ts b/packages/components/src/font-size-picker/styles.ts index 525c1be0c94b0..8ba0ce661c5eb 100644 --- a/packages/components/src/font-size-picker/styles.ts +++ b/packages/components/src/font-size-picker/styles.ts @@ -11,7 +11,6 @@ import Button from '../button'; import { HStack } from '../h-stack'; import { space } from '../ui/utils/space'; import { COLORS } from '../utils'; -import type { FontSizePickerProps } from './types'; export const Container = styled.fieldset` border: 0; @@ -44,12 +43,3 @@ export const Controls = styled.div< { ${ ( props ) => ! props.__nextHasNoMarginBottom && `margin-bottom: ${ space( 6 ) };` } `; - -export const ResetButton = styled( Button )< { - size: FontSizePickerProps[ 'size' ]; -} >` - &&& { - height: ${ ( props ) => - props.size === '__unstable-large' ? '40px' : '30px' }; - } -`; diff --git a/packages/components/src/number-control/index.tsx b/packages/components/src/number-control/index.tsx index 0df307e4ee45c..b2ab417d18af2 100644 --- a/packages/components/src/number-control/index.tsx +++ b/packages/components/src/number-control/index.tsx @@ -16,7 +16,7 @@ import deprecated from '@wordpress/deprecated'; /** * Internal dependencies */ -import { Input, SpinButton } from './styles/number-control-styles'; +import { Input, SpinButton, styles } from './styles/number-control-styles'; import * as inputControlActionTypes from '../input-control/reducer/actions'; import { add, subtract, roundClamp } from '../utils/math'; import { ensureNumber, isValueEmpty } from '../utils/values'; @@ -24,6 +24,7 @@ import type { WordPressComponentProps } from '../ui/context/wordpress-component' import type { NumberControlProps } from './types'; import { HStack } from '../h-stack'; import { Spacer } from '../spacer'; +import { useCx } from '../utils'; const noop = () => {}; @@ -78,6 +79,8 @@ function UnforwardedNumberControl( const autoComplete = typeProp === 'number' ? 'off' : undefined; const classes = classNames( 'components-number-control', className ); + const cx = useCx(); + const spinButtonClasses = cx( size === 'small' && styles.smallSpinButtons ); const spinValue = ( value: string | number | undefined, @@ -236,6 +239,7 @@ function UnforwardedNumberControl( diff --git a/packages/components/src/number-control/styles/number-control-styles.ts b/packages/components/src/number-control/styles/number-control-styles.ts index dfc6171cf411b..c18c02c69b790 100644 --- a/packages/components/src/number-control/styles/number-control-styles.ts +++ b/packages/components/src/number-control/styles/number-control-styles.ts @@ -11,7 +11,6 @@ import InputControl from '../../input-control'; import { COLORS } from '../../utils'; import Button from '../../button'; import { space } from '../../ui/utils/space'; -import type { NumberControlProps } from '../types'; const htmlArrowStyles = ( { hideHTMLArrows }: { hideHTMLArrows: boolean } ) => { if ( ! hideHTMLArrows ) { @@ -35,23 +34,16 @@ export const Input = styled( InputControl )` ${ htmlArrowStyles }; `; -const spinButtonSizeStyles = ( { - size, -}: Pick< NumberControlProps, 'size' > ) => { - if ( size !== 'small' ) { - return ``; - } - - return css` - width: ${ space( 5 ) }; - min-width: ${ space( 5 ) }; - height: ${ space( 5 ) }; - `; -}; - export const SpinButton = styled( Button )` &&&&& { color: ${ COLORS.ui.theme }; - ${ spinButtonSizeStyles } } `; + +const smallSpinButtons = css` + width: ${ space( 5 ) }; + min-width: ${ space( 5 ) }; + height: ${ space( 5 ) }; +`; + +export const styles = { smallSpinButtons }; From 000fc8ba30776edfdf46e47e36501387b93ea4c9 Mon Sep 17 00:00:00 2001 From: James Koster Date: Fri, 23 Jun 2023 14:28:18 +0100 Subject: [PATCH 27/37] Color (#51847) --- .../edit-site/src/components/sidebar-navigation-item/style.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/edit-site/src/components/sidebar-navigation-item/style.scss b/packages/edit-site/src/components/sidebar-navigation-item/style.scss index 054ecdac1b5b1..d032bece17107 100644 --- a/packages/edit-site/src/components/sidebar-navigation-item/style.scss +++ b/packages/edit-site/src/components/sidebar-navigation-item/style.scss @@ -9,7 +9,7 @@ &:hover, &:focus, &[aria-current] { - color: $white; + color: $gray-200; background: $gray-800; } From b64aabbc7063973f24af33e1cdd8a02586c93ce2 Mon Sep 17 00:00:00 2001 From: Robert Anderson Date: Mon, 26 Jun 2023 19:11:03 +1000 Subject: [PATCH 28/37] Only show Page Content Focus commands when in edit mode (#51888) --- .../hooks/commands/use-edit-mode-commands.js | 91 +++++++++++-------- 1 file changed, 53 insertions(+), 38 deletions(-) diff --git a/packages/edit-site/src/hooks/commands/use-edit-mode-commands.js b/packages/edit-site/src/hooks/commands/use-edit-mode-commands.js index 7d6dcdbd05440..63e20b9c22c14 100644 --- a/packages/edit-site/src/hooks/commands/use-edit-mode-commands.js +++ b/packages/edit-site/src/hooks/commands/use-edit-mode-commands.js @@ -30,51 +30,63 @@ import { unlock } from '../../lock-unlock'; const { useHistory } = unlock( routerPrivateApis ); -function useEditModeCommandLoader() { - const { isLoaded, record: template } = useEditedEntityRecord(); - const { removeTemplate, revertTemplate, setHasPageContentFocus } = - useDispatch( editSiteStore ); - const history = useHistory(); - const { isPage, hasPageContentFocus } = useSelect( +function usePageContentFocusCommands() { + const { isPage, canvasMode, hasPageContentFocus } = useSelect( ( select ) => ( { isPage: select( editSiteStore ).isPage(), + canvasMode: unlock( select( editSiteStore ) ).getCanvasMode(), hasPageContentFocus: select( editSiteStore ).hasPageContentFocus(), } ), [] ); + const { setHasPageContentFocus } = useDispatch( editSiteStore ); - if ( ! isLoaded ) { - return { isLoading: true, commands: [] }; + if ( ! isPage || canvasMode !== 'edit' ) { + return { isLoading: false, commands: [] }; } const commands = []; - if ( isPage ) { - if ( hasPageContentFocus ) { - commands.push( { - name: 'core/switch-to-template-focus', - label: __( 'Edit template' ), - icon: layout, - context: 'site-editor-edit', - callback: ( { close } ) => { - setHasPageContentFocus( false ); - close(); - }, - } ); - } else { - commands.push( { - name: 'core/switch-to-page-focus', - label: __( 'Back to page' ), - icon: page, - context: 'site-editor-edit', - callback: ( { close } ) => { - setHasPageContentFocus( true ); - close(); - }, - } ); - } + if ( hasPageContentFocus ) { + commands.push( { + name: 'core/switch-to-template-focus', + label: __( 'Edit template' ), + icon: layout, + callback: ( { close } ) => { + setHasPageContentFocus( false ); + close(); + }, + } ); + } else { + commands.push( { + name: 'core/switch-to-page-focus', + label: __( 'Back to page' ), + icon: page, + callback: ( { close } ) => { + setHasPageContentFocus( true ); + close(); + }, + } ); + } + + return { isLoading: false, commands }; +} + +function useManipulateDocumentCommands() { + const { isLoaded, record: template } = useEditedEntityRecord(); + const { removeTemplate, revertTemplate } = useDispatch( editSiteStore ); + const history = useHistory(); + const hasPageContentFocus = useSelect( + ( select ) => select( editSiteStore ).hasPageContentFocus(), + [] + ); + + if ( ! isLoaded ) { + return { isLoading: true, commands: [] }; } + const commands = []; + if ( isTemplateRevertable( template ) && ! hasPageContentFocus ) { const label = template.type === 'wp_template' @@ -100,7 +112,6 @@ function useEditModeCommandLoader() { name: 'core/remove-template', label, icon: trash, - context: 'site-editor-edit', callback: ( { close } ) => { removeTemplate( template ); // Navigate to the template list @@ -118,13 +129,11 @@ function useEditModeCommandLoader() { }; } -function useEditUICommandLoader() { +function useEditUICommands() { const { openGeneralSidebar, closeGeneralSidebar, switchEditorMode } = useDispatch( editSiteStore ); const { canvasMode, editorMode, activeSidebar } = useSelect( ( select ) => ( { - isPage: select( editSiteStore ).isPage(), - hasPageContentFocus: select( editSiteStore ).hasPageContentFocus(), canvasMode: unlock( select( editSiteStore ) ).getCanvasMode(), editorMode: select( editSiteStore ).getEditorMode(), activeSidebar: select( interfaceStore ).getActiveComplementaryArea( @@ -206,14 +215,20 @@ function useEditUICommandLoader() { } export function useEditModeCommands() { + useCommandLoader( { + name: 'core/edit-site/page-content-focus', + hook: usePageContentFocusCommands, + context: 'site-editor-edit', + } ); + useCommandLoader( { name: 'core/edit-site/manipulate-document', - hook: useEditModeCommandLoader, + hook: useManipulateDocumentCommands, context: 'site-editor-edit', } ); useCommandLoader( { name: 'core/edit-site/edit-ui', - hook: useEditUICommandLoader, + hook: useEditUICommands, } ); } From da17fa85ddb0b13b741217fb2f3af6731ce7a625 Mon Sep 17 00:00:00 2001 From: Riad Benguella Date: Mon, 26 Jun 2023 16:25:17 +0100 Subject: [PATCH 29/37] Add UI commands to the post editor (#51900) Co-authored-by: ntsekouras --- packages/edit-post/src/editor.js | 2 + .../src/hooks/commands/use-common-commands.js | 103 ++++++++++++++++++ .../hooks/commands/use-edit-mode-commands.js | 2 +- 3 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 packages/edit-post/src/hooks/commands/use-common-commands.js diff --git a/packages/edit-post/src/editor.js b/packages/edit-post/src/editor.js index 42a393c5fe324..6ec907bfe4b0b 100644 --- a/packages/edit-post/src/editor.js +++ b/packages/edit-post/src/editor.js @@ -25,6 +25,7 @@ import Layout from './components/layout'; import EditorInitialization from './components/editor-initialization'; import { store as editPostStore } from './store'; import { unlock } from './lock-unlock'; +import useCommonCommands from './hooks/commands/use-common-commands'; const { ExperimentalEditorProvider } = unlock( editorPrivateApis ); const { getLayoutStyles } = unlock( blockEditorPrivateApis ); @@ -32,6 +33,7 @@ const { useCommands } = unlock( coreCommandsPrivateApis ); function Editor( { postId, postType, settings, initialEdits, ...props } ) { useCommands(); + useCommonCommands(); const { hasFixedToolbar, focusMode, diff --git a/packages/edit-post/src/hooks/commands/use-common-commands.js b/packages/edit-post/src/hooks/commands/use-common-commands.js new file mode 100644 index 0000000000000..796e0665fc2fa --- /dev/null +++ b/packages/edit-post/src/hooks/commands/use-common-commands.js @@ -0,0 +1,103 @@ +/** + * WordPress dependencies + */ +import { useSelect, useDispatch } from '@wordpress/data'; +import { __, isRTL } from '@wordpress/i18n'; +import { + code, + cog, + drawerLeft, + drawerRight, + blockDefault, +} from '@wordpress/icons'; +import { useCommand } from '@wordpress/commands'; +import { store as preferencesStore } from '@wordpress/preferences'; +import { store as interfaceStore } from '@wordpress/interface'; + +/** + * Internal dependencies + */ +import { store as editPostStore } from '../../store'; + +export default function useCommonCommands() { + const { openGeneralSidebar, closeGeneralSidebar, switchEditorMode } = + useDispatch( editPostStore ); + const { editorMode, activeSidebar } = useSelect( + ( select ) => ( { + activeSidebar: select( interfaceStore ).getActiveComplementaryArea( + editPostStore.name + ), + editorMode: select( editPostStore ).getEditorMode(), + } ), + [] + ); + const { toggle } = useDispatch( preferencesStore ); + + useCommand( { + name: 'core/open-settings-sidebar', + label: __( 'Toggle settings sidebar' ), + icon: isRTL() ? drawerLeft : drawerRight, + callback: ( { close } ) => { + close(); + if ( activeSidebar === 'edit-post/document' ) { + closeGeneralSidebar(); + } else { + openGeneralSidebar( 'edit-post/document' ); + } + }, + } ); + + useCommand( { + name: 'core/open-block-inspector', + label: __( 'Toggle block inspector' ), + icon: blockDefault, + callback: ( { close } ) => { + close(); + if ( activeSidebar === 'edit-post/block' ) { + closeGeneralSidebar(); + } else { + openGeneralSidebar( 'edit-post/block' ); + } + }, + } ); + + useCommand( { + name: 'core/toggle-distraction-free', + label: __( 'Toggle distraction free' ), + icon: cog, + callback: ( { close } ) => { + toggle( 'core/edit-post', 'distractionFree' ); + close(); + }, + } ); + + useCommand( { + name: 'core/toggle-spotlight-mode', + label: __( 'Toggle spotlight mode' ), + icon: cog, + callback: ( { close } ) => { + toggle( 'core/edit-post', 'focusMode' ); + close(); + }, + } ); + + useCommand( { + name: 'core/toggle-top-toolbar', + label: __( 'Toggle top toolbar' ), + icon: cog, + callback: ( { close } ) => { + toggle( 'core/edit-post', 'fixedToolbar' ); + close(); + }, + } ); + + useCommand( { + name: 'core/toggle-code-editor', + label: __( 'Toggle code editor' ), + icon: code, + callback: ( { close } ) => { + switchEditorMode( editorMode === 'visual' ? 'text' : 'visual' ); + close(); + }, + } ); +} diff --git a/packages/edit-site/src/hooks/commands/use-edit-mode-commands.js b/packages/edit-site/src/hooks/commands/use-edit-mode-commands.js index 63e20b9c22c14..2466bb2a706c4 100644 --- a/packages/edit-site/src/hooks/commands/use-edit-mode-commands.js +++ b/packages/edit-site/src/hooks/commands/use-edit-mode-commands.js @@ -179,7 +179,7 @@ function useEditUICommands() { } ); commands.push( { - name: 'core/toggle-distraction-free-mode', + name: 'core/toggle-spotlight-mode', label: __( 'Toggle spotlight mode' ), icon: cog, callback: ( { close } ) => { From 4f0d57f129162b141902866a28a2d12dcf05a345 Mon Sep 17 00:00:00 2001 From: Marco Ciampini Date: Mon, 26 Jun 2023 12:45:57 +0200 Subject: [PATCH 30/37] ZStack: fix component bounding box to match children (#51836) * ZStack: rewrite using CSS grid * Use first-of-type instead of fist-child * CHANGELOG * Improve comment * Apply styles once in the parent wrapper * Avoid each child view from expanding to all available space * Remove unnecessary wrapeprs in storybook exmaple --- packages/components/CHANGELOG.md | 1 + packages/components/src/z-stack/component.tsx | 6 ++- .../components/src/z-stack/stories/index.tsx | 19 +++----- packages/components/src/z-stack/styles.ts | 47 +++++++++---------- 4 files changed, 34 insertions(+), 39 deletions(-) diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md index 4c52a377f5b5e..2d2011eda1bd8 100644 --- a/packages/components/CHANGELOG.md +++ b/packages/components/CHANGELOG.md @@ -16,6 +16,7 @@ - `Button`: Remove unnecessary margin from dashicon ([#51395](https://github.com/WordPress/gutenberg/pull/51395)). - `Autocomplete`: Announce how many results are available to screen readers when suggestions list first renders ([#51018](https://github.com/WordPress/gutenberg/pull/51018)). - `ConfirmDialog`: Ensure onConfirm isn't called an extra time when submitting one of the buttons using the keyboard ([#51730](https://github.com/WordPress/gutenberg/pull/51730)). +- `ZStack`: ZStack: fix component bounding box to match children ([#51836](https://github.com/WordPress/gutenberg/pull/51836)). ### Internal diff --git a/packages/components/src/z-stack/component.tsx b/packages/components/src/z-stack/component.tsx index 1cbcac56e4fb7..e087f8536e340 100644 --- a/packages/components/src/z-stack/component.tsx +++ b/packages/components/src/z-stack/component.tsx @@ -35,13 +35,14 @@ function UnconnectedZStack( const clonedChildren = validChildren.map( ( child, index ) => { const zIndex = isReversed ? childrenLastIndex - index : index; - const offsetAmount = offset * index; + // Only when the component is layered, the offset needs to be multiplied by + // the item's index, so that items can correctly stack at the right distance + const offsetAmount = isLayered ? offset * index : offset; const key = isValidElement( child ) ? child.key : index; return ( { clonedChildren } diff --git a/packages/components/src/z-stack/stories/index.tsx b/packages/components/src/z-stack/stories/index.tsx index b04e19962aed1..9b0b080378033 100644 --- a/packages/components/src/z-stack/stories/index.tsx +++ b/packages/components/src/z-stack/stories/index.tsx @@ -8,7 +8,6 @@ import type { ComponentMeta, ComponentStory } from '@storybook/react'; * Internal dependencies */ import { Elevation } from '../../elevation'; -import { HStack } from '../../h-stack'; import { View } from '../../view'; import { ZStack } from '..'; @@ -55,18 +54,12 @@ const Avatar = ( { const Template: ComponentStory< typeof ZStack > = ( args ) => { return ( - - - - - - - - - - - - + + + + + + ); }; diff --git a/packages/components/src/z-stack/styles.ts b/packages/components/src/z-stack/styles.ts index d0bf20d38b1f4..186f268e64366 100644 --- a/packages/components/src/z-stack/styles.ts +++ b/packages/components/src/z-stack/styles.ts @@ -4,36 +4,35 @@ import { css } from '@emotion/react'; import styled from '@emotion/styled'; -/** - * Internal dependencies - */ -import { rtl } from '../utils'; - -export const ZStackView = styled.div` - display: flex; - position: relative; -`; - export const ZStackChildView = styled.div< { - isLayered: boolean; offsetAmount: number; zIndex: number; } >` - ${ ( { isLayered, offsetAmount } ) => - isLayered - ? css( rtl( { marginLeft: offsetAmount } )() ) - : css( rtl( { right: offsetAmount * -1 } )() ) } + &:not( :first-of-type ) { + ${ ( { offsetAmount } ) => + css( { + marginInlineStart: offsetAmount, + } ) }; + } - ${ ( { isLayered } ) => - isLayered ? positionAbsolute : positionRelative } - - ${ ( { zIndex } ) => css( { zIndex } ) } -`; - -const positionAbsolute = css` - position: absolute; + ${ ( { zIndex } ) => css( { zIndex } ) }; `; -const positionRelative = css` +export const ZStackView = styled.div< { + isLayered: boolean; +} >` + display: inline-grid; + grid-auto-flow: column; position: relative; + + & > ${ ZStackChildView } { + position: relative; + justify-self: start; + + ${ ( { isLayered } ) => + isLayered + ? // When `isLayered` is true, all items overlap in the same grid cell + css( { gridRowStart: 1, gridColumnStart: 1 } ) + : undefined }; + } `; From 9292d095a2c68a5401ea039ae0a936c08dec6412 Mon Sep 17 00:00:00 2001 From: Andrea Fercia Date: Mon, 26 Jun 2023 00:23:38 +0200 Subject: [PATCH 31/37] Add view patterns plural label. (#51850) --- lib/compat/wordpress-6.3/blocks.php | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/compat/wordpress-6.3/blocks.php b/lib/compat/wordpress-6.3/blocks.php index 6902a258c5c3d..b338d0a246709 100644 --- a/lib/compat/wordpress-6.3/blocks.php +++ b/lib/compat/wordpress-6.3/blocks.php @@ -47,6 +47,7 @@ function gutenberg_rename_reusable_block_cpt_to_pattern( $args, $post_type ) { $args['labels']['new_item'] = __( 'New Pattern' ); $args['labels']['edit_item'] = __( 'Edit Pattern' ); $args['labels']['view_item'] = __( 'View Pattern' ); + $args['labels']['view_items'] = __( 'View Patterns' ); $args['labels']['all_items'] = __( 'All Patterns' ); $args['labels']['search_items'] = __( 'Search Patterns' ); $args['labels']['not_found'] = __( 'No Patterns found.' ); From c3283d6438e978945e769c5c0b1b49c2232a3c1a Mon Sep 17 00:00:00 2001 From: Jonny Harris Date: Sun, 25 Jun 2023 00:10:49 +0100 Subject: [PATCH 32/37] Fix css styles in block.jsons. (#51866) --- packages/block-library/src/avatar/block.json | 2 +- packages/block-library/src/query-pagination-numbers/block.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/block-library/src/avatar/block.json b/packages/block-library/src/avatar/block.json index 652a9a04cdebe..12e81d68aa767 100644 --- a/packages/block-library/src/avatar/block.json +++ b/packages/block-library/src/avatar/block.json @@ -48,6 +48,6 @@ "__experimentalDuotone": "img" } }, - "editorStyle": "wp-block-avatar", + "editorStyle": "wp-block-avatar-editor", "style": "wp-block-avatar" } diff --git a/packages/block-library/src/query-pagination-numbers/block.json b/packages/block-library/src/query-pagination-numbers/block.json index a6263ec131279..f00b2993a75f6 100644 --- a/packages/block-library/src/query-pagination-numbers/block.json +++ b/packages/block-library/src/query-pagination-numbers/block.json @@ -32,5 +32,5 @@ } } }, - "editorStyle": "query-pagination-numbers-editor" + "editorStyle": "wp-block-query-pagination-numbers-editor" } From 1a140db5ad992222f1493693a5752963e50cd3ba Mon Sep 17 00:00:00 2001 From: James Koster Date: Fri, 23 Jun 2023 14:38:34 +0100 Subject: [PATCH 33/37] Update active item appearance in Library (#51848) * Color * Use aria-current --- .../sidebar-navigation-screen-library/category-item.js | 2 +- .../components/sidebar-navigation-screen-library/style.scss | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/edit-site/src/components/sidebar-navigation-screen-library/category-item.js b/packages/edit-site/src/components/sidebar-navigation-screen-library/category-item.js index 288f92d8ef5dd..2ea9205b6fca7 100644 --- a/packages/edit-site/src/components/sidebar-navigation-screen-library/category-item.js +++ b/packages/edit-site/src/components/sidebar-navigation-screen-library/category-item.js @@ -35,7 +35,7 @@ export default function CategoryItem( { { ...linkInfo } icon={ icon } suffix={ { count } } - className={ isActive ? 'is-active-category' : undefined } + aria-current={ isActive ? 'true' : undefined } > { label } diff --git a/packages/edit-site/src/components/sidebar-navigation-screen-library/style.scss b/packages/edit-site/src/components/sidebar-navigation-screen-library/style.scss index 302faa17bc738..efb8b7537588d 100644 --- a/packages/edit-site/src/components/sidebar-navigation-screen-library/style.scss +++ b/packages/edit-site/src/components/sidebar-navigation-screen-library/style.scss @@ -1,7 +1,3 @@ .edit-site-sidebar-navigation-screen-library__group { margin-bottom: $grid-unit-30; } - -.edit-site-sidebar-navigation-item.is-active-category { - background: $gray-800; -} From bd853d53032a571c717a479556add0e015b545f3 Mon Sep 17 00:00:00 2001 From: Dave Smith Date: Fri, 23 Jun 2023 11:15:46 +0100 Subject: [PATCH 34/37] Fix Rename in Navigation on Browse Mode (#51791) * Ensure edits are passed to save * Ensure empty strings are invalid * Force break of long strings in menu titles --- .../index.js | 2 +- .../rename-modal.js | 13 ++++++++++++- .../use-navigation-menu-handlers.js | 6 +++++- .../index.js | 4 +++- .../components/sidebar-navigation-screen/style.scss | 2 ++ 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/packages/edit-site/src/components/sidebar-navigation-screen-navigation-menu/index.js b/packages/edit-site/src/components/sidebar-navigation-screen-navigation-menu/index.js index 6fae7b0926198..6bce0f356f740 100644 --- a/packages/edit-site/src/components/sidebar-navigation-screen-navigation-menu/index.js +++ b/packages/edit-site/src/components/sidebar-navigation-screen-navigation-menu/index.js @@ -60,7 +60,7 @@ export default function SidebarNavigationScreenNavigationMenu() { useNavigationMenuHandlers(); const _handleDelete = () => handleDelete( navigationMenu ); - const _handleSave = () => handleSave( navigationMenu ); + const _handleSave = ( edits ) => handleSave( navigationMenu, edits ); const _handleDuplicate = () => handleDuplicate( navigationMenu ); if ( isLoading ) { diff --git a/packages/edit-site/src/components/sidebar-navigation-screen-navigation-menu/rename-modal.js b/packages/edit-site/src/components/sidebar-navigation-screen-navigation-menu/rename-modal.js index 99f674ba8bee3..668179755ec35 100644 --- a/packages/edit-site/src/components/sidebar-navigation-screen-navigation-menu/rename-modal.js +++ b/packages/edit-site/src/components/sidebar-navigation-screen-navigation-menu/rename-modal.js @@ -11,9 +11,16 @@ import { import { __ } from '@wordpress/i18n'; import { useState } from '@wordpress/element'; +const notEmptyString = ( testString ) => testString?.trim()?.length > 0; + export default function RenameModal( { menuTitle, onClose, onSave } ) { const [ editedMenuTitle, setEditedMenuTitle ] = useState( menuTitle ); + const titleHasChanged = editedMenuTitle !== menuTitle; + + const isEditedMenuTitleValid = + titleHasChanged && notEmptyString( editedMenuTitle ); + return (
@@ -30,11 +37,15 @@ export default function RenameModal( { menuTitle, onClose, onSave } ) {