From fc54ccdf9a87d5c8806f91e706304efdc78da03c Mon Sep 17 00:00:00 2001 From: Haz Date: Fri, 19 Jun 2020 12:38:17 -0300 Subject: [PATCH 01/22] Deprecate legacy toolbar usage --- .../src/components/navigable-toolbar/index.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/block-editor/src/components/navigable-toolbar/index.js b/packages/block-editor/src/components/navigable-toolbar/index.js index fa63839248267..29b0c8a8c7cb0 100644 --- a/packages/block-editor/src/components/navigable-toolbar/index.js +++ b/packages/block-editor/src/components/navigable-toolbar/index.js @@ -9,6 +9,7 @@ import { useEffect, useCallback, } from '@wordpress/element'; +import deprecated from '@wordpress/deprecated'; import { focus } from '@wordpress/dom'; import { useShortcut } from '@wordpress/keyboard-shortcuts'; @@ -43,7 +44,13 @@ function useIsAccessibleToolbar( ref ) { const determineIsAccessibleToolbar = useCallback( () => { const tabbables = focus.tabbable.find( ref.current ); - setIsAccessibleToolbar( hasOnlyToolbarItem( tabbables ) ); + const onlyToolbarItem = hasOnlyToolbarItem( tabbables ); + if ( ! onlyToolbarItem ) { + deprecated( 'Using custom components as toolbar controls', { + alternative: 'ToolbarItem or ToolbarButton components', + } ); + } + setIsAccessibleToolbar( onlyToolbarItem ); }, [] ); useLayoutEffect( determineIsAccessibleToolbar, [] ); From e29ae9636de0da871ffa04704c546292ed585e05 Mon Sep 17 00:00:00 2001 From: Haz Date: Fri, 19 Jun 2020 15:31:00 -0300 Subject: [PATCH 02/22] Update e2e tests --- packages/e2e-tests/specs/editor/various/is-typing.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/e2e-tests/specs/editor/various/is-typing.test.js b/packages/e2e-tests/specs/editor/various/is-typing.test.js index 8161118d65944..50a44d831f434 100644 --- a/packages/e2e-tests/specs/editor/various/is-typing.test.js +++ b/packages/e2e-tests/specs/editor/various/is-typing.test.js @@ -39,7 +39,7 @@ describe( 'isTyping', () => { it( 'should not close the dropdown when typing in it', async () => { // Adds a Dropdown with an input to all blocks await page.evaluate( () => { - const { Dropdown, Button, Fill } = wp.components; + const { Dropdown, ToolbarButton, Fill } = wp.components; const { createElement: el, Fragment } = wp.element; function AddDropdown( BlockListBlock ) { return ( props ) => { @@ -52,7 +52,7 @@ describe( 'isTyping', () => { el( Dropdown, { renderToggle: ( { onToggle } ) => el( - Button, + ToolbarButton, { onClick: onToggle, className: 'dropdown-open', From d5201eb9be19c159ca8aa026ea21d842c1c5af2a Mon Sep 17 00:00:00 2001 From: Haz Date: Thu, 16 Jul 2020 11:45:24 -0300 Subject: [PATCH 03/22] Remove __experimental flag from Toolbar accessibilityLabel prop --- .../src/components/navigable-toolbar/index.js | 2 +- .../src/heading/heading-level-dropdown.js | 4 +--- packages/components/src/toolbar-button/index.js | 3 ++- .../src/toolbar-button/stories/index.js | 2 +- .../toolbar-group/toolbar-group-collapsed.js | 2 +- packages/components/src/toolbar/index.js | 17 +++++++---------- .../components/src/toolbar/stories/index.js | 7 ++----- packages/components/src/toolbar/test/index.js | 2 +- 8 files changed, 16 insertions(+), 23 deletions(-) diff --git a/packages/block-editor/src/components/navigable-toolbar/index.js b/packages/block-editor/src/components/navigable-toolbar/index.js index 29b0c8a8c7cb0..47d2fcb03ebb6 100644 --- a/packages/block-editor/src/components/navigable-toolbar/index.js +++ b/packages/block-editor/src/components/navigable-toolbar/index.js @@ -97,7 +97,7 @@ function NavigableToolbar( { children, focusOnMount, ...props } ) { if ( isAccessibleToolbar ) { return ( diff --git a/packages/block-library/src/heading/heading-level-dropdown.js b/packages/block-library/src/heading/heading-level-dropdown.js index 263d0a8ba650c..dbdc3eaf05109 100644 --- a/packages/block-library/src/heading/heading-level-dropdown.js +++ b/packages/block-library/src/heading/heading-level-dropdown.js @@ -69,9 +69,7 @@ export default function HeadingLevelDropdown( { selectedLevel, onChange } ) { renderContent={ () => ( + // TODO + // This should be deprecated when // becomes stable. return ( diff --git a/packages/components/src/toolbar-button/stories/index.js b/packages/components/src/toolbar-button/stories/index.js index 1bb0475003e16..6171b8483a908 100644 --- a/packages/components/src/toolbar-button/stories/index.js +++ b/packages/components/src/toolbar-button/stories/index.js @@ -16,7 +16,7 @@ export const _default = () => { const icon = text( 'Icon', 'wordpress' ); return ( - + ); diff --git a/packages/components/src/toolbar-group/toolbar-group-collapsed.js b/packages/components/src/toolbar-group/toolbar-group-collapsed.js index 1c020ad84d5c4..a8897debb937b 100644 --- a/packages/components/src/toolbar-group/toolbar-group-collapsed.js +++ b/packages/components/src/toolbar-group/toolbar-group-collapsed.js @@ -12,7 +12,7 @@ import ToolbarItem from '../toolbar-item'; function ToolbarGroupCollapsed( { controls = [], ...props } ) { // It'll contain state if `ToolbarGroup` is being used within - // `` + // `` const accessibleToolbarState = useContext( ToolbarContext ); const renderDropdownMenu = ( toggleProps ) => ( diff --git a/packages/components/src/toolbar/index.js b/packages/components/src/toolbar/index.js index ebf8e3482bf63..45715423a3d3f 100644 --- a/packages/components/src/toolbar/index.js +++ b/packages/components/src/toolbar/index.js @@ -21,14 +21,11 @@ import ToolbarContainer from './toolbar-container'; * * @param {Object} props Component props. * @param {string} [props.className] Class to set on the container div. - * @param {string} [props.__experimentalAccessibilityLabel] ARIA label for toolbar container. + * @param {string} [props.accessibilityLabel] ARIA label for toolbar container. * @param {Object} ref React Element ref. */ -function Toolbar( - { className, __experimentalAccessibilityLabel, ...props }, - ref -) { - if ( __experimentalAccessibilityLabel ) { +function Toolbar( { className, accessibilityLabel, ...props }, ref ) { + if ( accessibilityLabel ) { return ( ); } - // When the __experimentalAccessibilityLabel prop is not passed, Toolbar will - // fallback to ToolbarGroup. This should be deprecated as soon as the new API - // gets stable. + // TODO + // When the accessibilityLabel prop is not passed, Toolbar will fallback to + // ToolbarGroup. This should be deprecated as soon as the new API gets stable. // See https://github.com/WordPress/gutenberg/pull/20008#issuecomment-624503410 return ; } diff --git a/packages/components/src/toolbar/stories/index.js b/packages/components/src/toolbar/stories/index.js index 2749329089b77..237a618ce1071 100644 --- a/packages/components/src/toolbar/stories/index.js +++ b/packages/components/src/toolbar/stories/index.js @@ -41,10 +41,7 @@ function InlineImageIcon() { export const _default = () => { return ( // id is required for server side rendering - + @@ -116,7 +113,7 @@ export const withoutGroup = () => { return ( // id is required for server side rendering diff --git a/packages/components/src/toolbar/test/index.js b/packages/components/src/toolbar/test/index.js index d5de14b4a86c5..ade3b8ff4a6d9 100644 --- a/packages/components/src/toolbar/test/index.js +++ b/packages/components/src/toolbar/test/index.js @@ -13,7 +13,7 @@ describe( 'Toolbar', () => { describe( 'basic rendering', () => { it( 'should render a toolbar with toolbar buttons', () => { const { getByLabelText } = render( - + From 7aecd5ec1b55a1d0a424051aeb2ef95b177d1cc7 Mon Sep 17 00:00:00 2001 From: Haz Date: Thu, 23 Jul 2020 05:02:34 -0300 Subject: [PATCH 04/22] Use label instead of accessibilityLabel --- .../src/components/navigable-toolbar/index.js | 2 +- .../src/heading/heading-level-dropdown.js | 2 +- .../src/toolbar-button/stories/index.js | 2 +- packages/components/src/toolbar-group/index.js | 2 +- .../src/toolbar-group/toolbar-group-collapsed.js | 2 +- packages/components/src/toolbar/index.js | 16 ++++++++-------- packages/components/src/toolbar/stories/index.js | 7 ++----- packages/components/src/toolbar/test/index.js | 2 +- .../components/src/toolbar/toolbar-container.js | 4 ++-- 9 files changed, 18 insertions(+), 21 deletions(-) diff --git a/packages/block-editor/src/components/navigable-toolbar/index.js b/packages/block-editor/src/components/navigable-toolbar/index.js index 099f9523f2ae1..c4dd450dac2ac 100644 --- a/packages/block-editor/src/components/navigable-toolbar/index.js +++ b/packages/block-editor/src/components/navigable-toolbar/index.js @@ -113,7 +113,7 @@ function NavigableToolbar( { children, focusOnMount, ...props } ) { if ( isAccessibleToolbar ) { return ( diff --git a/packages/block-library/src/heading/heading-level-dropdown.js b/packages/block-library/src/heading/heading-level-dropdown.js index dbdc3eaf05109..c936c9383ba83 100644 --- a/packages/block-library/src/heading/heading-level-dropdown.js +++ b/packages/block-library/src/heading/heading-level-dropdown.js @@ -69,7 +69,7 @@ export default function HeadingLevelDropdown( { selectedLevel, onChange } ) { renderContent={ () => ( { const icon = text( 'Icon', 'wordpress' ); return ( - + ); diff --git a/packages/components/src/toolbar-group/index.js b/packages/components/src/toolbar-group/index.js index 86639e9e62823..595035fc59ee8 100644 --- a/packages/components/src/toolbar-group/index.js +++ b/packages/components/src/toolbar-group/index.js @@ -56,7 +56,7 @@ function ToolbarGroup( { ...props } ) { // It'll contain state if `ToolbarGroup` is being used within - // `` + // `` const accessibleToolbarState = useContext( ToolbarContext ); if ( ( ! controls || ! controls.length ) && ! children ) { diff --git a/packages/components/src/toolbar-group/toolbar-group-collapsed.js b/packages/components/src/toolbar-group/toolbar-group-collapsed.js index a8897debb937b..e112309890cce 100644 --- a/packages/components/src/toolbar-group/toolbar-group-collapsed.js +++ b/packages/components/src/toolbar-group/toolbar-group-collapsed.js @@ -12,7 +12,7 @@ import ToolbarItem from '../toolbar-item'; function ToolbarGroupCollapsed( { controls = [], ...props } ) { // It'll contain state if `ToolbarGroup` is being used within - // `` + // `` const accessibleToolbarState = useContext( ToolbarContext ); const renderDropdownMenu = ( toggleProps ) => ( diff --git a/packages/components/src/toolbar/index.js b/packages/components/src/toolbar/index.js index 45715423a3d3f..6aa1bc4290d21 100644 --- a/packages/components/src/toolbar/index.js +++ b/packages/components/src/toolbar/index.js @@ -19,13 +19,13 @@ import ToolbarContainer from './toolbar-container'; * * To add controls, simply pass `ToolbarButton` components as children. * - * @param {Object} props Component props. - * @param {string} [props.className] Class to set on the container div. - * @param {string} [props.accessibilityLabel] ARIA label for toolbar container. - * @param {Object} ref React Element ref. + * @param {Object} props Component props. + * @param {string} [props.className] Class to set on the container div. + * @param {string} [props.label] ARIA label for toolbar container. + * @param {Object} ref React Element ref. */ -function Toolbar( { className, accessibilityLabel, ...props }, ref ) { - if ( accessibilityLabel ) { +function Toolbar( { className, label, ...props }, ref ) { + if ( label ) { return ( ); } // TODO - // When the accessibilityLabel prop is not passed, Toolbar will fallback to + // When the label prop is not passed, Toolbar will fallback to // ToolbarGroup. This should be deprecated as soon as the new API gets stable. // See https://github.com/WordPress/gutenberg/pull/20008#issuecomment-624503410 return ; diff --git a/packages/components/src/toolbar/stories/index.js b/packages/components/src/toolbar/stories/index.js index 237a618ce1071..79915eb11035a 100644 --- a/packages/components/src/toolbar/stories/index.js +++ b/packages/components/src/toolbar/stories/index.js @@ -41,7 +41,7 @@ function InlineImageIcon() { export const _default = () => { return ( // id is required for server side rendering - + @@ -112,10 +112,7 @@ export const _default = () => { export const withoutGroup = () => { return ( // id is required for server side rendering - + diff --git a/packages/components/src/toolbar/test/index.js b/packages/components/src/toolbar/test/index.js index ade3b8ff4a6d9..86777a8455424 100644 --- a/packages/components/src/toolbar/test/index.js +++ b/packages/components/src/toolbar/test/index.js @@ -13,7 +13,7 @@ describe( 'Toolbar', () => { describe( 'basic rendering', () => { it( 'should render a toolbar with toolbar buttons', () => { const { getByLabelText } = render( - + diff --git a/packages/components/src/toolbar/toolbar-container.js b/packages/components/src/toolbar/toolbar-container.js index 5141e6fe69f95..df4f29c5afc79 100644 --- a/packages/components/src/toolbar/toolbar-container.js +++ b/packages/components/src/toolbar/toolbar-container.js @@ -14,7 +14,7 @@ import { forwardRef } from '@wordpress/element'; import ToolbarContext from '../toolbar-context'; import { getRTL } from '../utils/rtl'; -function ToolbarContainer( { accessibilityLabel, ...props }, ref ) { +function ToolbarContainer( { label, ...props }, ref ) { // https://reakit.io/docs/basic-concepts/#state-hooks // Passing baseId for server side rendering (which includes snapshots) // If an id prop is passed to Toolbar, toolbar items will use it as a base for their ids @@ -29,7 +29,7 @@ function ToolbarContainer( { accessibilityLabel, ...props }, ref ) { From 94d5ca266ff92fcd6ef1636d486ae6100d2cf375 Mon Sep 17 00:00:00 2001 From: Haz Date: Thu, 23 Jul 2020 05:08:21 -0300 Subject: [PATCH 05/22] Deprecate without label prop --- packages/components/src/toolbar/index.js | 37 ++++++++++++------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/packages/components/src/toolbar/index.js b/packages/components/src/toolbar/index.js index 6aa1bc4290d21..ce8ca17e9d4be 100644 --- a/packages/components/src/toolbar/index.js +++ b/packages/components/src/toolbar/index.js @@ -7,6 +7,7 @@ import classnames from 'classnames'; * WordPress dependencies */ import { forwardRef } from '@wordpress/element'; +import deprecated from '@wordpress/deprecated'; /** * Internal dependencies @@ -25,25 +26,25 @@ import ToolbarContainer from './toolbar-container'; * @param {Object} ref React Element ref. */ function Toolbar( { className, label, ...props }, ref ) { - if ( label ) { - return ( - - ); + if ( ! label ) { + deprecated( 'Using Toolbar without label prop', { + alternative: 'ToolbarGroup component', + } ); + return ; } - // TODO - // When the label prop is not passed, Toolbar will fallback to - // ToolbarGroup. This should be deprecated as soon as the new API gets stable. - // See https://github.com/WordPress/gutenberg/pull/20008#issuecomment-624503410 - return ; + // `ToolbarGroup` already uses components-toolbar for compatibility reasons + const finalClassName = classnames( + 'components-accessible-toolbar', + className + ); + return ( + + ); } export default forwardRef( Toolbar ); From 26dda7e46eccc275b0aca8ebe4cddf03013d4ade Mon Sep 17 00:00:00 2001 From: Haz Date: Thu, 23 Jul 2020 05:11:19 -0300 Subject: [PATCH 06/22] Make ToolbarItem component stable --- packages/block-editor/src/components/block-mover/index.js | 5 +---- .../block-editor/src/components/block-settings-menu/index.js | 5 +---- packages/block-editor/src/components/block-switcher/index.js | 2 +- .../src/components/rich-text/format-toolbar/index.js | 2 +- packages/block-library/src/image/image-editor.js | 2 +- packages/block-library/src/table/edit.js | 2 +- packages/components/src/index.js | 2 +- packages/components/src/toolbar/stories/index.js | 2 +- .../edit-post/src/components/header/header-toolbar/index.js | 5 +---- 9 files changed, 9 insertions(+), 18 deletions(-) diff --git a/packages/block-editor/src/components/block-mover/index.js b/packages/block-editor/src/components/block-mover/index.js index 0b45496222043..d4b9cc66ead73 100644 --- a/packages/block-editor/src/components/block-mover/index.js +++ b/packages/block-editor/src/components/block-mover/index.js @@ -7,10 +7,7 @@ import classnames from 'classnames'; /** * WordPress dependencies */ -import { - ToolbarGroup, - __experimentalToolbarItem as ToolbarItem, -} from '@wordpress/components'; +import { ToolbarGroup, ToolbarItem } from '@wordpress/components'; import { getBlockType } from '@wordpress/blocks'; import { Component } from '@wordpress/element'; import { withSelect } from '@wordpress/data'; diff --git a/packages/block-editor/src/components/block-settings-menu/index.js b/packages/block-editor/src/components/block-settings-menu/index.js index 7014f29f0e336..0b0b1a775e736 100644 --- a/packages/block-editor/src/components/block-settings-menu/index.js +++ b/packages/block-editor/src/components/block-settings-menu/index.js @@ -1,10 +1,7 @@ /** * WordPress dependencies */ -import { - ToolbarGroup, - __experimentalToolbarItem as ToolbarItem, -} from '@wordpress/components'; +import { ToolbarGroup, ToolbarItem } from '@wordpress/components'; /** * Internal dependencies diff --git a/packages/block-editor/src/components/block-switcher/index.js b/packages/block-editor/src/components/block-switcher/index.js index 1326e7c76cff7..6f77c5ccf8be3 100644 --- a/packages/block-editor/src/components/block-switcher/index.js +++ b/packages/block-editor/src/components/block-switcher/index.js @@ -11,7 +11,7 @@ import { DropdownMenu, ToolbarButton, ToolbarGroup, - __experimentalToolbarItem as ToolbarItem, + ToolbarItem, MenuGroup, Popover, } from '@wordpress/components'; diff --git a/packages/block-editor/src/components/rich-text/format-toolbar/index.js b/packages/block-editor/src/components/rich-text/format-toolbar/index.js index e0c35b11cdae5..4e98ce8d064ba 100644 --- a/packages/block-editor/src/components/rich-text/format-toolbar/index.js +++ b/packages/block-editor/src/components/rich-text/format-toolbar/index.js @@ -10,7 +10,7 @@ import { orderBy } from 'lodash'; import { __ } from '@wordpress/i18n'; import { - __experimentalToolbarItem as ToolbarItem, + ToolbarItem, ToolbarGroup, DropdownMenu, Slot, diff --git a/packages/block-library/src/image/image-editor.js b/packages/block-library/src/image/image-editor.js index 361355ee8d9a5..895d337c2699d 100644 --- a/packages/block-library/src/image/image-editor.js +++ b/packages/block-library/src/image/image-editor.js @@ -20,7 +20,7 @@ import { import { ToolbarGroup, ToolbarButton, - __experimentalToolbarItem as ToolbarItem, + ToolbarItem, Spinner, RangeControl, DropdownMenu, diff --git a/packages/block-library/src/table/edit.js b/packages/block-library/src/table/edit.js index 4bc6ca81bbdb3..515ef0a03f8f8 100644 --- a/packages/block-library/src/table/edit.js +++ b/packages/block-library/src/table/edit.js @@ -25,7 +25,7 @@ import { TextControl, ToggleControl, ToolbarGroup, - __experimentalToolbarItem as ToolbarItem, + ToolbarItem, } from '@wordpress/components'; import { alignLeft, diff --git a/packages/components/src/index.js b/packages/components/src/index.js index 7c1ec414adbae..cc2bc1deb3ace 100644 --- a/packages/components/src/index.js +++ b/packages/components/src/index.js @@ -99,7 +99,7 @@ export { default as Toolbar } from './toolbar'; export { default as ToolbarButton } from './toolbar-button'; export { default as __experimentalToolbarContext } from './toolbar-context'; export { default as ToolbarGroup } from './toolbar-group'; -export { default as __experimentalToolbarItem } from './toolbar-item'; +export { default as ToolbarItem } from './toolbar-item'; export { default as Tooltip } from './tooltip'; export { default as __experimentalTreeGrid, diff --git a/packages/components/src/toolbar/stories/index.js b/packages/components/src/toolbar/stories/index.js index 79915eb11035a..ae07d52535c9c 100644 --- a/packages/components/src/toolbar/stories/index.js +++ b/packages/components/src/toolbar/stories/index.js @@ -23,7 +23,7 @@ import { Path, ToolbarButton, ToolbarGroup, - __experimentalToolbarItem as ToolbarItem, + ToolbarItem, DropdownMenu, } from '../../'; diff --git a/packages/edit-post/src/components/header/header-toolbar/index.js b/packages/edit-post/src/components/header/header-toolbar/index.js index 6c178f193ba16..32ef40ea2a581 100644 --- a/packages/edit-post/src/components/header/header-toolbar/index.js +++ b/packages/edit-post/src/components/header/header-toolbar/index.js @@ -15,10 +15,7 @@ import { EditorHistoryRedo, EditorHistoryUndo, } from '@wordpress/editor'; -import { - Button, - __experimentalToolbarItem as ToolbarItem, -} from '@wordpress/components'; +import { Button, ToolbarItem } from '@wordpress/components'; import { plus } from '@wordpress/icons'; function HeaderToolbar() { From 5efe0db36a1fd175982b376488aee5c1c9d8c984 Mon Sep 17 00:00:00 2001 From: Haz Date: Thu, 23 Jul 2020 05:15:56 -0300 Subject: [PATCH 07/22] Deprecate ToolbarButton usage without a parent Toolbar --- packages/components/src/toolbar-button/index.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/components/src/toolbar-button/index.js b/packages/components/src/toolbar-button/index.js index f27eade16d96d..3a8b400fe82b7 100644 --- a/packages/components/src/toolbar-button/index.js +++ b/packages/components/src/toolbar-button/index.js @@ -6,6 +6,7 @@ import classnames from 'classnames'; * WordPress dependencies */ import { useContext, forwardRef } from '@wordpress/element'; +import deprecated from '@wordpress/deprecated'; /** * Internal dependencies */ @@ -30,9 +31,9 @@ function ToolbarButton( const accessibleToolbarState = useContext( ToolbarContext ); if ( ! accessibleToolbarState ) { - // TODO - // This should be deprecated when - // becomes stable. + deprecated( 'Rendering ToolbarButton without a parent Toolbar', { + alternative: 'Button', + } ); return (