Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Composite: stabilize APIs #63569

Merged
merged 10 commits into from
Sep 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
Button,
Spinner,
VisuallyHidden,
privateApis as componentsPrivateApis,
Composite,
} from '@wordpress/components';
import { createInterpolateElement } from '@wordpress/element';
import { decodeEntities } from '@wordpress/html-entities';
Expand All @@ -20,9 +20,6 @@ import BlockRatings from '../block-ratings';
import DownloadableBlockIcon from '../downloadable-block-icon';
import DownloadableBlockNotice from '../downloadable-block-notice';
import { store as blockDirectoryStore } from '../../store';
import { unlock } from '../../lock-unlock';

const { CompositeItemV2: CompositeItem } = unlock( componentsPrivateApis );

// Return the appropriate block item label, given the block data and status.
function getDownloadableBlockLabel(
Expand Down Expand Up @@ -93,7 +90,7 @@ function DownloadableBlockListItem( { item, onClick } ) {
}

return (
<CompositeItem
<Composite.Item
render={
<Button
// TODO: Switch to `true` (40px size) if possible
Expand Down Expand Up @@ -162,7 +159,7 @@ function DownloadableBlockListItem( { item, onClick } ) {
</>
) }
</span>
</CompositeItem>
</Composite.Item>
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* WordPress dependencies
*/
import { __ } from '@wordpress/i18n';
import { privateApis as componentsPrivateApis } from '@wordpress/components';
import { Composite } from '@wordpress/components';
import { getBlockType } from '@wordpress/blocks';
import { useDispatch } from '@wordpress/data';

Expand All @@ -11,9 +11,7 @@ import { useDispatch } from '@wordpress/data';
*/
import DownloadableBlockListItem from '../downloadable-block-list-item';
import { store as blockDirectoryStore } from '../../store';
import { unlock } from '../../lock-unlock';

const { CompositeV2: Composite } = unlock( componentsPrivateApis );
const noop = () => {};

function DownloadableBlocksList( { items, onHover = noop, onSelect } ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@
*/
import { useDispatch } from '@wordpress/data';
import { cloneBlock } from '@wordpress/blocks';
import {
VisuallyHidden,
privateApis as componentsPrivateApis,
} from '@wordpress/components';
import { Composite, VisuallyHidden } from '@wordpress/components';

import { useState } from '@wordpress/element';
import { useInstanceId } from '@wordpress/compose';
Expand All @@ -20,11 +17,6 @@ import BlockPreview from '../block-preview';
import SetupToolbar from './setup-toolbar';
import usePatternsSetup from './use-patterns-setup';
import { VIEWMODES } from './constants';
import { unlock } from '../../lock-unlock';

const { CompositeV2: Composite, CompositeItemV2: CompositeItem } = unlock(
componentsPrivateApis
);

const SetupContent = ( {
viewMode,
Expand Down Expand Up @@ -88,7 +80,7 @@ function BlockPattern( { pattern, onSelect, showTitles } ) {
);
return (
<div className={ `${ baseClassName }__list-item` }>
<CompositeItem
<Composite.Item
render={
<div
aria-describedby={
Expand Down Expand Up @@ -116,7 +108,7 @@ function BlockPattern( { pattern, onSelect, showTitles } ) {
{ description }
</VisuallyHidden>
) }
</CompositeItem>
</Composite.Item>
</div>
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ import clsx from 'clsx';
import { cloneBlock } from '@wordpress/blocks';
import { useEffect, useState, forwardRef, useMemo } from '@wordpress/element';
import {
Composite,
VisuallyHidden,
Tooltip,
privateApis as componentsPrivateApis,
__experimentalHStack as HStack,
} from '@wordpress/components';
import { useInstanceId } from '@wordpress/compose';
Expand All @@ -21,16 +21,11 @@ import { Icon, symbol } from '@wordpress/icons';
/**
* Internal dependencies
*/
import { unlock } from '../../lock-unlock';
import BlockPreview from '../block-preview';
import InserterDraggableBlocks from '../inserter-draggable-blocks';
import BlockPatternsPaging from '../block-patterns-paging';
import { INSERTER_PATTERN_TYPES } from '../inserter/block-patterns-tab/utils';

const { CompositeV2: Composite, CompositeItemV2: CompositeItem } = unlock(
componentsPrivateApis
);

const WithToolTip = ( { showTooltip, title, children } ) => {
if ( showTooltip ) {
return <Tooltip text={ title }>{ children }</Tooltip>;
Expand Down Expand Up @@ -105,7 +100,7 @@ function BlockPattern( {
}
title={ pattern.title }
>
<CompositeItem
<Composite.Item
render={
<div
role="option"
Expand Down Expand Up @@ -174,7 +169,7 @@ function BlockPattern( {
{ pattern.description }
</VisuallyHidden>
) }
</CompositeItem>
</Composite.Item>
</WithToolTip>
</div>
) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,18 @@ import { useInstanceId, useViewportMatch } from '@wordpress/compose';
import { chevronRight } from '@wordpress/icons';

import {
Composite,
MenuGroup,
MenuItem,
Popover,
VisuallyHidden,
privateApis as componentsPrivateApis,
} from '@wordpress/components';

/**
* Internal dependencies
*/
import BlockPreview from '../block-preview';
import useTransformedPatterns from './use-transformed-patterns';
import { unlock } from '../../lock-unlock';

const { CompositeV2: Composite, CompositeItemV2: CompositeItem } = unlock(
componentsPrivateApis
);

function PatternTransformationsMenu( {
blocks,
Expand Down Expand Up @@ -107,7 +102,7 @@ function BlockPattern( { pattern, onSelect } ) {
);
return (
<div className={ `${ baseClassName }-list__list-item` }>
<CompositeItem
<Composite.Item
render={
<div
role="option"
Expand All @@ -127,7 +122,7 @@ function BlockPattern( { pattern, onSelect } ) {
<div className={ `${ baseClassName }-list__item-title` }>
{ pattern.title }
</div>
</CompositeItem>
</Composite.Item>
{ !! pattern.description && (
<VisuallyHidden id={ descriptionId }>
{ pattern.description }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
Button,
FlexItem,
Dropdown,
privateApis as componentsPrivateApis,
Composite,
} from '@wordpress/components';
import { useMemo } from '@wordpress/element';
import { shadow as shadowIcon, Icon, check } from '@wordpress/icons';
Expand All @@ -20,21 +20,13 @@ import { shadow as shadowIcon, Icon, check } from '@wordpress/icons';
*/
import clsx from 'clsx';

/**
* Internal dependencies
*/
import { unlock } from '../../lock-unlock';

/**
* Shared reference to an empty array for cases where it is important to avoid
* returning a new array reference on every invocation.
*
* @type {Array}
*/
const EMPTY_ARRAY = [];
const { CompositeItemV2: CompositeItem, CompositeV2: Composite } = unlock(
componentsPrivateApis
);

export function ShadowPopoverContainer( { shadow, onShadowChange, settings } ) {
const shadows = useShadowPresets( settings );
Expand Down Expand Up @@ -88,7 +80,7 @@ export function ShadowPresets( { presets, activeShadow, onSelect } ) {

export function ShadowIndicator( { type, label, isActive, onSelect, shadow } ) {
return (
<CompositeItem
<Composite.Item
role="option"
aria-label={ label }
aria-selected={ isActive }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
/**
* WordPress dependencies
*/
import { privateApis as componentsPrivateApis } from '@wordpress/components';
import { Composite } from '@wordpress/components';

/**
* Internal dependencies
*/
import { unlock } from '../../lock-unlock';

export { default as InserterListboxGroup } from './group';
export { default as InserterListboxRow } from './row';
export { default as InserterListboxItem } from './item';

const { CompositeV2: Composite } = unlock( componentsPrivateApis );

function InserterListbox( { children } ) {
return (
<Composite focusShift focusWrap="horizontal" render={ <></> }>
Expand Down
16 changes: 3 additions & 13 deletions packages/block-editor/src/components/inserter-listbox/item.js
Original file line number Diff line number Diff line change
@@ -1,28 +1,18 @@
/**
* WordPress dependencies
*/
import {
Button,
privateApis as componentsPrivateApis,
} from '@wordpress/components';
import { Button, Composite } from '@wordpress/components';
import { forwardRef } from '@wordpress/element';

/**
* Internal dependencies
*/
import { unlock } from '../../lock-unlock';

const { CompositeItemV2: CompositeItem } = unlock( componentsPrivateApis );

function InserterListboxItem(
{ isFirst, as: Component, children, ...props },
ref
) {
return (
<CompositeItem
<Composite.Item
ref={ ref }
role="option"
// Use the CompositeItem `accessibleWhenDisabled` prop
// Use the Composite.Item `accessibleWhenDisabled` prop
// over Button's `isFocusable`. The latter was shown to
// cause an issue with tab order in the inserter list.
accessibleWhenDisabled
Expand Down
11 changes: 2 additions & 9 deletions packages/block-editor/src/components/inserter-listbox/row.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,10 @@
* WordPress dependencies
*/
import { forwardRef } from '@wordpress/element';
import { privateApis as componentsPrivateApis } from '@wordpress/components';

/**
* Internal dependencies
*/
import { unlock } from '../../lock-unlock';

const { CompositeGroupV2: CompositeGroup } = unlock( componentsPrivateApis );
import { Composite } from '@wordpress/components';

function InserterListboxRow( props, ref ) {
return <CompositeGroup role="presentation" ref={ ref } { ...props } />;
return <Composite.Group role="presentation" ref={ ref } { ...props } />;
}

export default forwardRef( InserterListboxRow );
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
/**
* WordPress dependencies
*/
import { privateApis as componentsPrivateApis } from '@wordpress/components';
import { Composite } from '@wordpress/components';
import { __ } from '@wordpress/i18n';

/**
* Internal dependencies
*/
import { MediaPreview } from './media-preview';
import { unlock } from '../../../lock-unlock';

const { CompositeV2: Composite } = unlock( componentsPrivateApis );

function MediaList( {
mediaList,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import {
Flex,
FlexItem,
Button,
privateApis as componentsPrivateApis,
Composite,
__experimentalVStack as VStack,
} from '@wordpress/components';
import { __, sprintf } from '@wordpress/i18n';
Expand All @@ -33,7 +33,6 @@ import { isBlobURL } from '@wordpress/blob';
import InserterDraggableBlocks from '../../inserter-draggable-blocks';
import { getBlockAndPreviewFromMedia } from './utils';
import { store as blockEditorStore } from '../../../store';
import { unlock } from '../../../lock-unlock';

const ALLOWED_MEDIA_TYPES = [ 'image' ];
const MAXIMUM_TITLE_LENGTH = 25;
Expand All @@ -43,8 +42,6 @@ const MEDIA_OPTIONS_POPOVER_PROPS = {
'block-editor-inserter__media-list__item-preview-options__popover',
};

const { CompositeItemV2: CompositeItem } = unlock( componentsPrivateApis );

function MediaPreviewOptions( { category, media } ) {
if ( ! category.getReportUrl ) {
return null;
Expand Down Expand Up @@ -249,7 +246,7 @@ export function MediaPreview( { media, onClick, category } ) {
onMouseLeave={ onMouseLeave }
>
<Tooltip text={ truncatedTitle || title }>
<CompositeItem
<Composite.Item
render={
<div
aria-label={ title }
Expand All @@ -267,7 +264,7 @@ export function MediaPreview( { media, onClick, category } ) {
</div>
) }
</div>
</CompositeItem>
</Composite.Item>
</Tooltip>
{ ! isInserting && (
<MediaPreviewOptions
Expand Down
8 changes: 8 additions & 0 deletions packages/components/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@

## Unreleased

### New Features

- `Composite`: add stable version of the component ([#63569](https://github.com/WordPress/gutenberg/pull/63569)).

### Internal

- `Composite`: Remove from private APIs ([#63569](https://github.com/WordPress/gutenberg/pull/63569)).

## 28.7.0 (2024-09-05)

### Deprecations
Expand Down
4 changes: 0 additions & 4 deletions packages/components/src/composite/README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
# `Composite`

<div class="callout callout-alert">
This feature is still experimental. “Experimental” means this is an early implementation subject to drastic and breaking changes.
</div>

`Composite` provides a single tab stop on the page and allows navigation through the focusable descendants with arrow keys. This abstract component is based on the [WAI-ARIA Composite Role⁠](https://w3c.github.io/aria/#composite).

## Usage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ import {
import { UseCompositeStatePlaceholder, transform } from './utils';

const meta: Meta< typeof UseCompositeStatePlaceholder > = {
title: 'Components/Composite',
title: 'Components (Deprecated)/Composite (Unstable)',
id: 'components-composite-unstable',
component: UseCompositeStatePlaceholder,
subcomponents: {
Composite,
Expand Down
Loading
Loading