From 5e54a9dc3f8e9cc798f7a39417fd36f0ffcabb63 Mon Sep 17 00:00:00 2001 From: Carlos Bravo <37012961+c4rl0sbr4v0@users.noreply.github.com> Date: Fri, 4 Aug 2023 13:44:13 +0200 Subject: [PATCH 01/12] Interactivity API: Add support for underscores and leading dashes in the suffix part of the directive (#53337) * Allow BEM classes for wp-class directive * Update changelog, put back a missed $ sign --- .../interactive-blocks/directive-class/render.php | 11 +++++++++++ packages/interactivity/CHANGELOG.md | 4 ++++ packages/interactivity/src/vdom.js | 2 +- test/e2e/specs/interactivity/directives-class.spec.ts | 10 ++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/e2e-tests/plugins/interactive-blocks/directive-class/render.php b/packages/e2e-tests/plugins/interactive-blocks/directive-class/render.php index 19da052dc1148..b229418de2f67 100644 --- a/packages/e2e-tests/plugins/interactive-blocks/directive-class/render.php +++ b/packages/e2e-tests/plugins/interactive-blocks/directive-class/render.php @@ -72,4 +72,15 @@ class="foo" Toggle context falseValue + +
+ +
+ diff --git a/packages/interactivity/CHANGELOG.md b/packages/interactivity/CHANGELOG.md index 5a79ee8f5af75..9188f342ae2f7 100644 --- a/packages/interactivity/CHANGELOG.md +++ b/packages/interactivity/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +### Bug Fix + +- Add support for underscores and leading dashes in the suffix part of the directive. ([#53337](https://github.com/WordPress/gutenberg/pull/53337)) + ### Breaking Change - Remove the `wp-show` directive until we figure out its final implementation. ([#53240](https://github.com/WordPress/gutenberg/pull/53240)) diff --git a/packages/interactivity/src/vdom.js b/packages/interactivity/src/vdom.js index fe09f492dbd56..1cf4a91ec1ead 100644 --- a/packages/interactivity/src/vdom.js +++ b/packages/interactivity/src/vdom.js @@ -21,7 +21,7 @@ const directiveParser = new RegExp( // (Optional) Match '--' followed by any alphanumeric charachters. It // excludes underscore intentionally to prevent confusion, but it can // contain multiple hyphens. E.g., "--custom-prefix--with-more-info". - '(?:--([a-z0-9][a-z0-9-]+))?$', + '(?:--([a-z0-9_-]+))?$', 'i' // Case insensitive. ); diff --git a/test/e2e/specs/interactivity/directives-class.spec.ts b/test/e2e/specs/interactivity/directives-class.spec.ts index c0ec77e14d056..b7e085aba1514 100644 --- a/test/e2e/specs/interactivity/directives-class.spec.ts +++ b/test/e2e/specs/interactivity/directives-class.spec.ts @@ -98,4 +98,14 @@ test.describe( 'data-wp-class', () => { await page.getByTestId( 'toggle context false value' ).click(); await expect( el ).toHaveClass( '' ); } ); + + test( 'can use BEM notation classes', async ( { page } ) => { + const el = page.getByTestId( 'can use BEM notation classes' ); + await expect( el ).toHaveClass( 'block__element--modifier' ); + } ); + + test( 'can use classes with several dashes', async ( { page } ) => { + const el = page.getByTestId( 'can use classes with several dashes' ); + await expect( el ).toHaveClass( 'main-bg----color' ); + } ); } ); From de67122ae164f0c2f443953636fee5dd6d8c5601 Mon Sep 17 00:00:00 2001 From: Sarah Norris <1645628+mikachan@users.noreply.github.com> Date: Fri, 4 Aug 2023 12:58:39 +0100 Subject: [PATCH 02/12] Footnotes: Add typography, dimensions, and border block supports (#53044) * Remove background and add link to default color controls * Add typography, dimensions, and border controls --- docs/reference-guides/core-blocks.md | 2 +- .../block-library/src/footnotes/block.json | 40 ++++++++++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/docs/reference-guides/core-blocks.md b/docs/reference-guides/core-blocks.md index df34a04bcf5d7..0b323b3819779 100644 --- a/docs/reference-guides/core-blocks.md +++ b/docs/reference-guides/core-blocks.md @@ -275,7 +275,7 @@ Add a link to a downloadable file. ([Source](https://github.com/WordPress/gutenb - **Name:** core/footnotes - **Category:** text -- **Supports:** color (background, link, text), ~~html~~, ~~multiple~~, ~~reusable~~ +- **Supports:** color (background, link, text), spacing (margin, padding), typography (fontSize, lineHeight), ~~html~~, ~~multiple~~, ~~reusable~~ - **Attributes:** ## Classic diff --git a/packages/block-library/src/footnotes/block.json b/packages/block-library/src/footnotes/block.json index 6a94c42eb42e5..28b094f24f916 100644 --- a/packages/block-library/src/footnotes/block.json +++ b/packages/block-library/src/footnotes/block.json @@ -9,16 +9,52 @@ "textdomain": "default", "usesContext": [ "postId", "postType" ], "supports": { + "__experimentalBorder": { + "radius": true, + "color": true, + "width": true, + "style": true, + "__experimentalDefaultControls": { + "radius": false, + "color": false, + "width": false, + "style": false + } + }, "color": { + "background": true, "link": true, + "text": true, "__experimentalDefaultControls": { - "background": true, + "link": true, "text": true } }, "html": false, "multiple": false, - "reusable": false + "reusable": false, + "spacing": { + "margin": true, + "padding": true, + "__experimentalDefaultControls": { + "margin": false, + "padding": false + } + }, + "typography": { + "fontSize": true, + "lineHeight": true, + "__experimentalFontFamily": true, + "__experimentalTextDecoration": true, + "__experimentalFontStyle": true, + "__experimentalFontWeight": true, + "__experimentalLetterSpacing": true, + "__experimentalTextTransform": true, + "__experimentalWritingMode": true, + "__experimentalDefaultControls": { + "fontSize": true + } + } }, "style": "wp-block-footnotes" } From 16598fc7e3c5330b85fdee322f1f7155754a5e5e Mon Sep 17 00:00:00 2001 From: Aki Hamano <54422211+t-hamano@users.noreply.github.com> Date: Fri, 4 Aug 2023 21:03:48 +0900 Subject: [PATCH 03/12] Media & Text Block: Fix deprecation with `isStackOnMobile` default value changed (#49538) * Media & Text Block: Fixed deprecation with `isStackOnMobile` default value changed * Rename variable * Add fixture * Fix fixture html * Update test/integration/fixtures/blocks/core__media-text__deprecated-v2.html Co-authored-by: Aaron Robertshaw <60436221+aaronrobertshaw@users.noreply.github.com> * Update fixture --------- Co-authored-by: Aaron Robertshaw <60436221+aaronrobertshaw@users.noreply.github.com> --- .../src/media-text/deprecated.js | 20 +++++++++----- .../core__media-text__deprecated-v2.html | 12 +++++++++ .../core__media-text__deprecated-v2.json | 27 +++++++++++++++++++ ...ore__media-text__deprecated-v2.parsed.json | 25 +++++++++++++++++ ..._media-text__deprecated-v2.serialized.html | 5 ++++ 5 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 test/integration/fixtures/blocks/core__media-text__deprecated-v2.html create mode 100644 test/integration/fixtures/blocks/core__media-text__deprecated-v2.json create mode 100644 test/integration/fixtures/blocks/core__media-text__deprecated-v2.parsed.json create mode 100644 test/integration/fixtures/blocks/core__media-text__deprecated-v2.serialized.html diff --git a/packages/block-library/src/media-text/deprecated.js b/packages/block-library/src/media-text/deprecated.js index 93366f827055b..d03659022b95b 100644 --- a/packages/block-library/src/media-text/deprecated.js +++ b/packages/block-library/src/media-text/deprecated.js @@ -76,7 +76,7 @@ const migrateDefaultAlign = ( attributes ) => { }; }; -const baseAttributes = { +const v0Attributes = { align: { type: 'string', default: 'wide', @@ -104,12 +104,16 @@ const baseAttributes = { }, isStackedOnMobile: { type: 'boolean', - default: true, + default: false, }, }; const v4ToV5BlockAttributes = { - ...baseAttributes, + ...v0Attributes, + isStackedOnMobile: { + type: 'boolean', + default: true, + }, mediaUrl: { type: 'string', source: 'attribute', @@ -578,7 +582,11 @@ const v4 = { // See: https://github.com/WordPress/gutenberg/pull/21169 const v3 = { attributes: { - ...baseAttributes, + ...v0Attributes, + isStackedOnMobile: { + type: 'boolean', + default: true, + }, backgroundColor: { type: 'string', }, @@ -726,7 +734,7 @@ const v3 = { // See: https://github.com/WordPress/gutenberg/pull/14364 const v2 = { attributes: { - ...baseAttributes, + ...v0Attributes, backgroundColor: { type: 'string', }, @@ -828,7 +836,7 @@ const v2 = { // See: https://github.com/WordPress/gutenberg/pull/11922 const v1 = { attributes: { - ...baseAttributes, + ...v0Attributes, backgroundColor: { type: 'string', }, diff --git a/test/integration/fixtures/blocks/core__media-text__deprecated-v2.html b/test/integration/fixtures/blocks/core__media-text__deprecated-v2.html new file mode 100644 index 0000000000000..e258c04a8a8f8 --- /dev/null +++ b/test/integration/fixtures/blocks/core__media-text__deprecated-v2.html @@ -0,0 +1,12 @@ + +
+
+ +
+
+ +

My Content

+ +
+
+ diff --git a/test/integration/fixtures/blocks/core__media-text__deprecated-v2.json b/test/integration/fixtures/blocks/core__media-text__deprecated-v2.json new file mode 100644 index 0000000000000..ca2b001687268 --- /dev/null +++ b/test/integration/fixtures/blocks/core__media-text__deprecated-v2.json @@ -0,0 +1,27 @@ +[ + { + "name": "core/media-text", + "isValid": true, + "attributes": { + "align": "wide", + "mediaAlt": "", + "mediaPosition": "left", + "mediaType": "image", + "mediaWidth": 50, + "isStackedOnMobile": false, + "mediaUrl": "data:image/jpeg;base64,/9j/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/yQALCAABAAEBAREA/8wABgAQEAX/2gAIAQEAAD8A0s8g/9k=" + }, + "innerBlocks": [ + { + "name": "core/paragraph", + "isValid": true, + "attributes": { + "content": "My Content", + "dropCap": false, + "placeholder": "Content…" + }, + "innerBlocks": [] + } + ] + } +] diff --git a/test/integration/fixtures/blocks/core__media-text__deprecated-v2.parsed.json b/test/integration/fixtures/blocks/core__media-text__deprecated-v2.parsed.json new file mode 100644 index 0000000000000..46b59fa2cac5f --- /dev/null +++ b/test/integration/fixtures/blocks/core__media-text__deprecated-v2.parsed.json @@ -0,0 +1,25 @@ +[ + { + "blockName": "core/media-text", + "attrs": { + "mediaType": "image" + }, + "innerBlocks": [ + { + "blockName": "core/paragraph", + "attrs": { + "placeholder": "Content…" + }, + "innerBlocks": [], + "innerHTML": "\n\t\t

My Content

\n\t\t", + "innerContent": [ "\n\t\t

My Content

\n\t\t" ] + } + ], + "innerHTML": "\n
\n\t
\n\t\t\"\"/\n\t
\n\t
\n\t\t\n\t
\n
\n", + "innerContent": [ + "\n
\n\t
\n\t\t\"\"/\n\t
\n\t
\n\t\t", + null, + "\n\t
\n
\n" + ] + } +] diff --git a/test/integration/fixtures/blocks/core__media-text__deprecated-v2.serialized.html b/test/integration/fixtures/blocks/core__media-text__deprecated-v2.serialized.html new file mode 100644 index 0000000000000..0c0fb613d64b5 --- /dev/null +++ b/test/integration/fixtures/blocks/core__media-text__deprecated-v2.serialized.html @@ -0,0 +1,5 @@ + +
+

My Content

+
+ From 284455b1c4830c45ea0df749b801aab718c535dd Mon Sep 17 00:00:00 2001 From: David Calhoun Date: Fri, 4 Aug 2023 09:11:08 -0400 Subject: [PATCH 04/12] docs: Note the preios setup script (#53312) --- .../code/react-native/getting-started-react-native.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/contributors/code/react-native/getting-started-react-native.md b/docs/contributors/code/react-native/getting-started-react-native.md index 9b8ae44f0d8b1..93be2f088fdc5 100644 --- a/docs/contributors/code/react-native/getting-started-react-native.md +++ b/docs/contributors/code/react-native/getting-started-react-native.md @@ -28,6 +28,7 @@ Note that the commands described here should be run in the top-level directory o ```sh nvm install npm ci +npm run native preios ``` ## Run From c5cb220595c7f362b7da0529f7ffcaf1779fd49a Mon Sep 17 00:00:00 2001 From: Lena Morita Date: Sat, 5 Aug 2023 01:34:02 +0900 Subject: [PATCH 05/12] Components: Remove unused components from `/ui` (#52953) * Components: Remove unused components from `/ui` * Update readme * Add changelog --- packages/components/CHANGELOG.md | 4 + packages/components/src/ui/README.md | 23 +- .../components/src/ui/control-group/README.md | 23 -- .../src/ui/control-group/component.js | 75 ----- .../src/ui/control-group/context.js | 8 - .../components/src/ui/control-group/hook.js | 93 ------ .../components/src/ui/control-group/index.js | 3 - .../components/src/ui/control-group/styles.js | 43 --- .../test/__snapshots__/index.js.snap | 51 ---- .../src/ui/control-group/test/index.js | 22 -- .../components/src/ui/control-group/types.ts | 29 -- .../components/src/ui/control-label/README.md | 22 -- .../src/ui/control-label/component.js | 37 --- .../components/src/ui/control-label/hook.js | 43 --- .../components/src/ui/control-label/index.js | 2 - .../src/ui/control-label/stories/index.js | 13 - .../components/src/ui/control-label/styles.js | 65 ----- .../test/__snapshots__/index.js.snap | 141 ---------- .../src/ui/control-label/test/index.js | 39 --- .../components/src/ui/control-label/types.ts | 9 - .../components/src/ui/form-group/README.md | 113 -------- .../src/ui/form-group/form-group-content.js | 59 ---- .../src/ui/form-group/form-group-context.js | 31 -- .../src/ui/form-group/form-group-help.js | 32 --- .../src/ui/form-group/form-group-label.js | 30 -- .../src/ui/form-group/form-group-styles.js | 8 - .../src/ui/form-group/form-group.js | 54 ---- .../components/src/ui/form-group/index.js | 4 - .../src/ui/form-group/stories/index.js | 44 --- .../test/__snapshots__/index.js.snap | 121 -------- .../src/ui/form-group/test/index.js | 82 ------ .../components/src/ui/form-group/types.ts | 32 --- .../src/ui/form-group/use-form-group.js | 53 ---- packages/components/src/ui/index.js | 5 - packages/components/src/ui/spinner/README.md | 31 -- .../components/src/ui/spinner/component.js | 75 ----- packages/components/src/ui/spinner/index.js | 1 - .../src/ui/spinner/stories/index.js | 19 -- packages/components/src/ui/spinner/styles.js | 109 ------- .../spinner/test/__snapshots__/index.js.snap | 265 ------------------ .../components/src/ui/spinner/test/index.js | 32 --- packages/components/src/ui/spinner/utils.js | 2 - 42 files changed, 7 insertions(+), 1940 deletions(-) delete mode 100644 packages/components/src/ui/control-group/README.md delete mode 100644 packages/components/src/ui/control-group/component.js delete mode 100644 packages/components/src/ui/control-group/context.js delete mode 100644 packages/components/src/ui/control-group/hook.js delete mode 100644 packages/components/src/ui/control-group/index.js delete mode 100644 packages/components/src/ui/control-group/styles.js delete mode 100644 packages/components/src/ui/control-group/test/__snapshots__/index.js.snap delete mode 100644 packages/components/src/ui/control-group/test/index.js delete mode 100644 packages/components/src/ui/control-group/types.ts delete mode 100644 packages/components/src/ui/control-label/README.md delete mode 100644 packages/components/src/ui/control-label/component.js delete mode 100644 packages/components/src/ui/control-label/hook.js delete mode 100644 packages/components/src/ui/control-label/index.js delete mode 100644 packages/components/src/ui/control-label/stories/index.js delete mode 100644 packages/components/src/ui/control-label/styles.js delete mode 100644 packages/components/src/ui/control-label/test/__snapshots__/index.js.snap delete mode 100644 packages/components/src/ui/control-label/test/index.js delete mode 100644 packages/components/src/ui/control-label/types.ts delete mode 100644 packages/components/src/ui/form-group/README.md delete mode 100644 packages/components/src/ui/form-group/form-group-content.js delete mode 100644 packages/components/src/ui/form-group/form-group-context.js delete mode 100644 packages/components/src/ui/form-group/form-group-help.js delete mode 100644 packages/components/src/ui/form-group/form-group-label.js delete mode 100644 packages/components/src/ui/form-group/form-group-styles.js delete mode 100644 packages/components/src/ui/form-group/form-group.js delete mode 100644 packages/components/src/ui/form-group/index.js delete mode 100644 packages/components/src/ui/form-group/stories/index.js delete mode 100644 packages/components/src/ui/form-group/test/__snapshots__/index.js.snap delete mode 100644 packages/components/src/ui/form-group/test/index.js delete mode 100644 packages/components/src/ui/form-group/types.ts delete mode 100644 packages/components/src/ui/form-group/use-form-group.js delete mode 100644 packages/components/src/ui/index.js delete mode 100644 packages/components/src/ui/spinner/README.md delete mode 100644 packages/components/src/ui/spinner/component.js delete mode 100644 packages/components/src/ui/spinner/index.js delete mode 100644 packages/components/src/ui/spinner/stories/index.js delete mode 100644 packages/components/src/ui/spinner/styles.js delete mode 100644 packages/components/src/ui/spinner/test/__snapshots__/index.js.snap delete mode 100644 packages/components/src/ui/spinner/test/index.js delete mode 100644 packages/components/src/ui/spinner/utils.js diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md index 1fbb88ed83f94..a6fc7e845a4f9 100644 --- a/packages/components/CHANGELOG.md +++ b/packages/components/CHANGELOG.md @@ -17,6 +17,10 @@ - `Modal`: Fix loss of focus when clicking outside ([#52653](https://github.com/WordPress/gutenberg/pull/52653)). +### Internal + +- `ControlGroup`, `FormGroup`, `ControlLabel`, `Spinner`: Remove unused `ui/` components from the codebase ([#52953](https://github.com/WordPress/gutenberg/pull/52953)). + ## 25.4.0 (2023-07-20) ### Enhancements diff --git a/packages/components/src/ui/README.md b/packages/components/src/ui/README.md index 4fdf6dd220f56..6099fe0032851 100644 --- a/packages/components/src/ui/README.md +++ b/packages/components/src/ui/README.md @@ -1,22 +1,5 @@ -# (Next) Component System +# TODO -This directory contains the code for next Component System. +We want to get rid of this folder. Don't add anything new here. -More information can be found in the original GitHub issue: -https://github.com/WordPress/gutenberg/issues/27484 - -## Usage - -(This is still very much a work in progress) - -```jsx -import { Text, View } from '@wordpress/components/ui'; - -function Example() { - return ( - - Code is Poetry - - ); -} -``` +What is left of this folder should either be deleted (if unused elsewhere), or be moved into the root `packages/components/src` and `packages/components/src/utils` folders. \ No newline at end of file diff --git a/packages/components/src/ui/control-group/README.md b/packages/components/src/ui/control-group/README.md deleted file mode 100644 index 122a6a612a32c..0000000000000 --- a/packages/components/src/ui/control-group/README.md +++ /dev/null @@ -1,23 +0,0 @@ -# ControlGroup - -
-This feature is still experimental. “Experimental” means this is an early implementation subject to drastic and breaking changes. -
- -`ControlGroup` is a layout-based component for rendering a group of control-based components, such as `Button`, `Select` or `TextInput`. Control components that render within `ControlGroup` automatically have their borders offset and border-radii rounded. - -## Usage - -```jsx -import { Button, ControlGroup, Select, TextInput } from `@wordpress/components/ui` - -function Example() { - return ( - - - * - * - - - -`; diff --git a/packages/components/src/ui/control-group/test/index.js b/packages/components/src/ui/control-group/test/index.js deleted file mode 100644 index 0587c329b4056..0000000000000 --- a/packages/components/src/ui/control-group/test/index.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * External dependencies - */ -import { render } from '@testing-library/react'; - -/** - * Internal dependencies - */ -import { ControlGroup } from '..'; -import Button from '../../../button'; - -describe( 'props', () => { - test( 'should render correctly', () => { - const { container } = render( - - - - - ); - expect( container ).toMatchSnapshot(); - } ); -} ); diff --git a/packages/components/src/ui/control-group/types.ts b/packages/components/src/ui/control-group/types.ts deleted file mode 100644 index c7211eb35283a..0000000000000 --- a/packages/components/src/ui/control-group/types.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * External dependencies - */ -import type { CSSProperties } from 'react'; - -/** - * Internal dependencies - */ -import type { FlexProps } from '../../flex/types'; - -export type ControlGroupContext = { - isFirst?: boolean; - isLast?: boolean; - isMiddle?: boolean; - isOnly?: boolean; - isVertical?: boolean; - styles?: string; -}; - -export type Props = Pick< FlexProps, 'direction' > & { - /** - * Adjust the layout (width) of content using CSS grid (`grid-template-columns`). - */ - templateColumns?: CSSProperties[ 'gridTemplateColumns' ]; - /** - * The children elements. - */ - children: React.ReactNode; -}; diff --git a/packages/components/src/ui/control-label/README.md b/packages/components/src/ui/control-label/README.md deleted file mode 100644 index d4e31e034dfd8..0000000000000 --- a/packages/components/src/ui/control-label/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# ControlLabel - -
-This feature is still experimental. “Experimental” means this is an early implementation subject to drastic and breaking changes. -
- -`ControlLabel` is a form component that works with `FormGroup` to provide a label for form elements (e.g. `Switch` or `TextInput`). - -## Usage - -```jsx -import { ControlLabel, FormGroup, TextInput } from '@wordpress/components/ui'; - -function Example() { - return ( - - First Name - - - ); -} -``` diff --git a/packages/components/src/ui/control-label/component.js b/packages/components/src/ui/control-label/component.js deleted file mode 100644 index 62a3e8a790c68..0000000000000 --- a/packages/components/src/ui/control-label/component.js +++ /dev/null @@ -1,37 +0,0 @@ -/** - * Internal dependencies - */ -import { contextConnect } from '../context'; -import { View } from '../../view'; -import { useControlLabel } from './hook'; - -/** - * @param {import('../context').WordPressComponentProps} props - * @param {import('react').ForwardedRef} forwardedRef - */ -function ControlLabel( props, forwardedRef ) { - const controlLabelProps = useControlLabel( props ); - - return ; -} - -/** - * `ControlLabel` is a form component that works with `FormGroup` to provide a - * label for form elements (e.g. `Switch` or `TextInput`). - * - * ```jsx - * import { ControlLabel, FormGroup, TextInput } from '@wordpress/components/ui'; - * - * function Example() { - * return ( - * - * First Name - * - * - * ); - * } - * ``` - */ -const ConnectedControlLabel = contextConnect( ControlLabel, 'ControlLabel' ); - -export default ConnectedControlLabel; diff --git a/packages/components/src/ui/control-label/hook.js b/packages/components/src/ui/control-label/hook.js deleted file mode 100644 index dcdd5bb7e7eff..0000000000000 --- a/packages/components/src/ui/control-label/hook.js +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Internal dependencies - */ -import { useContextSystem } from '../context'; -import { useFormGroupContextId } from '../form-group'; -import { useText } from '../../text'; -import * as styles from './styles'; -import { useCx } from '../../utils/hooks/use-cx'; - -/** - * @param {import('../context').WordPressComponentProps} props - */ -export function useControlLabel( props ) { - const { - htmlFor: htmlForProp, - isBlock = false, - size = 'medium', - truncate = true, - ...otherProps - } = useContextSystem( props, 'ControlLabel' ); - - const { className, ...textProps } = useText( { - ...otherProps, - isBlock, - truncate, - } ); - - const cx = useCx(); - - const htmlFor = useFormGroupContextId( htmlForProp ); - const classes = cx( - styles.ControlLabel, - styles[ /** @type {'small' | 'medium' | 'large'} */ ( size ) ], - className, - isBlock ? styles.block : styles.inline - ); - - return { - ...textProps, - className: classes, - htmlFor, - }; -} diff --git a/packages/components/src/ui/control-label/index.js b/packages/components/src/ui/control-label/index.js deleted file mode 100644 index c73e0027014e2..0000000000000 --- a/packages/components/src/ui/control-label/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export { default as ControlLabel } from './component'; -export * from './hook'; diff --git a/packages/components/src/ui/control-label/stories/index.js b/packages/components/src/ui/control-label/stories/index.js deleted file mode 100644 index e22d46cbf7019..0000000000000 --- a/packages/components/src/ui/control-label/stories/index.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Internal dependencies - */ -import { ControlLabel } from '../index'; - -export default { - component: ControlLabel, - title: 'Components (Experimental)/ControlLabel', -}; - -export const _default = () => { - return Label; -}; diff --git a/packages/components/src/ui/control-label/styles.js b/packages/components/src/ui/control-label/styles.js deleted file mode 100644 index 8f96e91d0ef3f..0000000000000 --- a/packages/components/src/ui/control-label/styles.js +++ /dev/null @@ -1,65 +0,0 @@ -/** - * External dependencies - */ -import { css } from '@emotion/react'; - -/** - * Internal dependencies - */ -import CONFIG from '../../utils/config-values'; -import { getHighDpi } from '../utils/get-high-dpi'; - -const lineHeight = `calc(${ CONFIG.fontSize } * 1.2)`; - -/** - * @param {keyof CONFIG} size The padding size. - */ -function getPadding( size ) { - return `calc((${ CONFIG[ size ] } - ${ lineHeight }) / 2)`; -} - -const highDpiAdjust = getHighDpi` - > * { - position: relative; - top: 0.5px; - } -`; - -export const ControlLabel = css` - display: inline-block; - line-height: ${ lineHeight }; - margin: 0; - max-width: 100%; - padding-bottom: ${ getPadding( 'controlHeight' ) }; - padding-top: ${ getPadding( 'controlHeight' ) }; - - &:active { - user-select: none; - } - - ${ highDpiAdjust }; -`; - -export const large = css` - padding-bottom: ${ getPadding( 'controlHeightLarge' ) }; - padding-top: ${ getPadding( 'controlHeightLarge' ) }; -`; - -export const medium = css` - padding-bottom: ${ getPadding( 'controlHeight' ) }; - padding-top: ${ getPadding( 'controlHeight' ) }; -`; - -export const small = css` - padding-bottom: ${ getPadding( 'controlHeightSmall' ) }; - padding-top: ${ getPadding( 'controlHeightSmall' ) }; -`; - -export const inline = css` - display: inline-block; - vertical-align: middle; -`; - -export const block = css` - display: block; -`; diff --git a/packages/components/src/ui/control-label/test/__snapshots__/index.js.snap b/packages/components/src/ui/control-label/test/__snapshots__/index.js.snap deleted file mode 100644 index ffe2d42932d00..0000000000000 --- a/packages/components/src/ui/control-label/test/__snapshots__/index.js.snap +++ /dev/null @@ -1,141 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`props should render correctly 1`] = ` -.emotion-0 { - display: inline-block; - line-height: calc(13px * 1.2); - margin: 0; - max-width: 100%; - padding-bottom: calc((36px - calc(13px * 1.2)) / 2); - padding-top: calc((36px - calc(13px * 1.2)) / 2); - padding-bottom: calc((36px - calc(13px * 1.2)) / 2); - padding-top: calc((36px - calc(13px * 1.2)) / 2); - display: block; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - color: #1e1e1e; - line-height: 1.2; - margin: 0; - font-size: calc((13 / 13) * 13px); - font-weight: normal; - display: inline-block; - vertical-align: middle; -} - -.emotion-0:active { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -@media ( -webkit-min-device-pixel-ratio: 1.25 ), ( min-resolution: 120dpi ) { - .emotion-0>* { - position: relative; - top: 0.5px; - } -} - -
- -
-`; - -exports[`props should render no truncate 1`] = ` -.emotion-0 { - display: inline-block; - line-height: calc(13px * 1.2); - margin: 0; - max-width: 100%; - padding-bottom: calc((36px - calc(13px * 1.2)) / 2); - padding-top: calc((36px - calc(13px * 1.2)) / 2); - padding-bottom: calc((36px - calc(13px * 1.2)) / 2); - padding-top: calc((36px - calc(13px * 1.2)) / 2); - color: #1e1e1e; - line-height: 1.2; - margin: 0; - font-size: calc((13 / 13) * 13px); - font-weight: normal; - display: inline-block; - vertical-align: middle; -} - -.emotion-0:active { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -@media ( -webkit-min-device-pixel-ratio: 1.25 ), ( min-resolution: 120dpi ) { - .emotion-0>* { - position: relative; - top: 0.5px; - } -} - -
- -
-`; - -exports[`props should render size 1`] = ` -.emotion-0 { - display: inline-block; - line-height: calc(13px * 1.2); - margin: 0; - max-width: 100%; - padding-bottom: calc((36px - calc(13px * 1.2)) / 2); - padding-top: calc((36px - calc(13px * 1.2)) / 2); - padding-bottom: calc((calc( 36px * 0.8 ) - calc(13px * 1.2)) / 2); - padding-top: calc((calc( 36px * 0.8 ) - calc(13px * 1.2)) / 2); - display: block; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - color: #1e1e1e; - line-height: 1.2; - margin: 0; - font-size: calc((13 / 13) * 13px); - font-weight: normal; - display: inline-block; - vertical-align: middle; -} - -.emotion-0:active { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -@media ( -webkit-min-device-pixel-ratio: 1.25 ), ( min-resolution: 120dpi ) { - .emotion-0>* { - position: relative; - top: 0.5px; - } -} - -
- -
-`; diff --git a/packages/components/src/ui/control-label/test/index.js b/packages/components/src/ui/control-label/test/index.js deleted file mode 100644 index 4443457a566f9..0000000000000 --- a/packages/components/src/ui/control-label/test/index.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * External dependencies - */ -import { render, screen } from '@testing-library/react'; - -/** - * Internal dependencies - */ -import { ControlLabel } from '../index'; - -describe( 'props', () => { - test( 'should render correctly', () => { - const { container } = render( Label ); - - expect( container ).toMatchSnapshot(); - } ); - - test( 'should render htmlFor', () => { - render( Label ); - - expect( screen.getByText( 'Label' ) ).toHaveAttribute( 'for', 'Field' ); - } ); - - test( 'should render size', () => { - const { container } = render( - Label - ); - - expect( container ).toMatchSnapshot(); - } ); - - test( 'should render no truncate', () => { - const { container } = render( - Label - ); - - expect( container ).toMatchSnapshot(); - } ); -} ); diff --git a/packages/components/src/ui/control-label/types.ts b/packages/components/src/ui/control-label/types.ts deleted file mode 100644 index e76b7d3d895e7..0000000000000 --- a/packages/components/src/ui/control-label/types.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Internal dependencies - */ -import type { Props as TextProps } from '../../text/types'; - -export type Props = TextProps & { - isBlock?: boolean; - size?: 'large' | 'medium' | 'small'; -}; diff --git a/packages/components/src/ui/form-group/README.md b/packages/components/src/ui/form-group/README.md deleted file mode 100644 index fec4316caf355..0000000000000 --- a/packages/components/src/ui/form-group/README.md +++ /dev/null @@ -1,113 +0,0 @@ -# FormGroup - -
-This feature is still experimental. “Experimental” means this is an early implementation subject to drastic and breaking changes. -
- -`FormGroup` is a form component that groups a label with a form element (e.g. `Switch` or `TextInput`). - -## Usage - -```jsx -import { FormGroup, TextInput } from '@wordpress/components/ui'; - -function Example() { - return ( - - - - ); -} -``` - -## Props - -##### align - -**Type**: `CSS['alignItems']` - -Adjusts the block alignment of children. - -##### alignLabel - -**Type**: `Pick` - -Aligns the label within `FormGroup`. - -##### alignment - -**Type**: `string` - -Adjusts the horizontal and vertical alignment of children. - -##### columns - -**Type**: `number`,`(number`,`null)[]` - -Adjusts the number of columns of the `Grid`. - -##### gap - -**Type**: `number` - -Gap between each child. - -##### help - -**Type**: `React.ReactElement` - -Displays help content. - -##### horizontal - -**Type**: `boolean` - -Displays the label and form field horizontally. - -##### isInline - -**Type**: `boolean` - -Changes the CSS display from `grid` to `inline-grid`. - -##### justify - -**Type**: `CSS['justifyContent']` - -Adjusts the inline alignment of children. - -##### label - -**Type**: `string` - -Label of the form field. - -##### labelHidden - -**Type**: `boolean` - -Visually hides the label. - -##### rows - -**Type**: `number`,`(number`,`null)[]` - -Adjusts the number of rows of the `Grid`. - -##### templateColumns - -**Type**: `CSS['gridTemplateColumns']` - -Adjusts the CSS grid `template-columns`. - -##### templateRows - -**Type**: `CSS['gridTemplateRows']` - -Adjusts the CSS grid `template-rows`. - -##### truncate - -**Type**: `boolean` - -Truncates the label text content. diff --git a/packages/components/src/ui/form-group/form-group-content.js b/packages/components/src/ui/form-group/form-group-content.js deleted file mode 100644 index a9bdc87ec1b17..0000000000000 --- a/packages/components/src/ui/form-group/form-group-content.js +++ /dev/null @@ -1,59 +0,0 @@ -/** - * WordPress dependencies - */ -import { useMemo, memo } from '@wordpress/element'; - -/** - * Internal dependencies - */ -import { VStack } from '../../v-stack'; -import { FormGroupContext } from './form-group-context'; -import FormGroupHelp from './form-group-help'; -import FormGroupLabel from './form-group-label'; - -/** - * @param {import('../context').WordPressComponentProps} props - */ -function FormGroupContent( { - alignLabel, - children, - help, - horizontal = false, - id, - label, - labelHidden, - spacing = 2, - truncate, - ...props -} ) { - const contextProps = useMemo( - () => ( { id, horizontal } ), - [ id, horizontal ] - ); - - const content = help ? ( - - { children } - { help } - - ) : ( - children - ); - - return ( - - - { label } - - { content } - - ); -} - -export default memo( FormGroupContent ); diff --git a/packages/components/src/ui/form-group/form-group-context.js b/packages/components/src/ui/form-group/form-group-context.js deleted file mode 100644 index e98f93de5095a..0000000000000 --- a/packages/components/src/ui/form-group/form-group-context.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * WordPress dependencies - */ -import { createContext, useContext } from '@wordpress/element'; - -/** - * @typedef {{ id?: import('react').ReactText, horizontal: boolean }} FormGroupContext - */ - -/** - * @type {FormGroupContext} - */ -const initialContext = { - id: undefined, - horizontal: true, -}; - -/** - * @type {import('react').Context} - */ -export const FormGroupContext = createContext( initialContext ); -export const useFormGroupContext = () => useContext( FormGroupContext ); - -/** - * @param {string | undefined} id The preferred id for the form group element. - * @return {import('react').ReactText | undefined} The form group context id. - */ -export const useFormGroupContextId = ( id ) => { - const contextId = useFormGroupContext().id; - return id || contextId; -}; diff --git a/packages/components/src/ui/form-group/form-group-help.js b/packages/components/src/ui/form-group/form-group-help.js deleted file mode 100644 index 456d5325b5cbb..0000000000000 --- a/packages/components/src/ui/form-group/form-group-help.js +++ /dev/null @@ -1,32 +0,0 @@ -/** - * WordPress dependencies - */ -import { memo } from '@wordpress/element'; - -/** - * Internal dependencies - */ -import { ContextSystemProvider } from '../context'; - -const contextValue = { Text: { variant: 'muted' } }; - -/** - * @typedef Props - * @property {import('react').ReactNode} [children] The content to display within `FormGroupHelp`. - */ - -/** - * - * @param {Props} props - */ -function FormGroupHelp( { children } ) { - if ( ! children ) return null; - - return ( - - { children } - - ); -} - -export default memo( FormGroupHelp ); diff --git a/packages/components/src/ui/form-group/form-group-label.js b/packages/components/src/ui/form-group/form-group-label.js deleted file mode 100644 index 21a4a2dda5b12..0000000000000 --- a/packages/components/src/ui/form-group/form-group-label.js +++ /dev/null @@ -1,30 +0,0 @@ -/** - * WordPress dependencies - */ -import { memo } from '@wordpress/element'; - -/** - * Internal dependencies - */ -import { ControlLabel } from '../control-label'; -import { VisuallyHidden } from '../../visually-hidden'; - -/** - * @param {import('../context').WordPressComponentProps} props - * @return {JSX.Element | null} The form group's label. - */ -function FormGroupLabel( { children, id, labelHidden = false, ...props } ) { - if ( ! children ) return null; - - if ( labelHidden ) { - return ( - - { children } - - ); - } - - return { children }; -} - -export default memo( FormGroupLabel ); diff --git a/packages/components/src/ui/form-group/form-group-styles.js b/packages/components/src/ui/form-group/form-group-styles.js deleted file mode 100644 index b675565d24356..0000000000000 --- a/packages/components/src/ui/form-group/form-group-styles.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * External dependencies - */ -import { css } from '@emotion/react'; - -export const FormGroup = css` - width: 100%; -`; diff --git a/packages/components/src/ui/form-group/form-group.js b/packages/components/src/ui/form-group/form-group.js deleted file mode 100644 index 79881be46f711..0000000000000 --- a/packages/components/src/ui/form-group/form-group.js +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Internal dependencies - */ -import { contextConnect } from '../context'; -import { Grid } from '../../grid'; -import { View } from '../../view'; -import FormGroupContent from './form-group-content'; -import { useFormGroup } from './use-form-group'; - -/** - * @param {import('../context').WordPressComponentProps} props - * @param {import('react').ForwardedRef} forwardedRef - */ -function FormGroup( props, forwardedRef ) { - const { contentProps, horizontal, ...otherProps } = useFormGroup( props ); - - if ( horizontal ) { - return ( - - - - ); - } - - return ( - - - - ); -} - -/** - * `FormGroup` is a form component that groups a label with a form element (e.g. `Switch` or `TextInput`). - * - * @example - * ```jsx - * import { FormGroup, TextInput } from `@wordpress/components/ui`; - * - * function Example() { - * return ( - * - * - * - * ); - * } - * ``` - */ -const ConnectedFormGroup = contextConnect( FormGroup, 'FormGroup' ); - -export default ConnectedFormGroup; diff --git a/packages/components/src/ui/form-group/index.js b/packages/components/src/ui/form-group/index.js deleted file mode 100644 index 64c29381529b2..0000000000000 --- a/packages/components/src/ui/form-group/index.js +++ /dev/null @@ -1,4 +0,0 @@ -export { default as FormGroup } from './form-group'; - -export * from './use-form-group'; -export * from './form-group-context'; diff --git a/packages/components/src/ui/form-group/stories/index.js b/packages/components/src/ui/form-group/stories/index.js deleted file mode 100644 index 804a41ad265f2..0000000000000 --- a/packages/components/src/ui/form-group/stories/index.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Internal dependencies - */ -import { FormGroup, useFormGroupContextId } from '../index'; -import { Text } from '../../../text'; - -// @todo: Refactor this after adding next TextInput component. -const TextInput = ( { id: idProp, ...props } ) => { - const id = useFormGroupContextId( idProp ); - return ( -
- -
- ); -}; - -export default { - component: FormGroup, - title: 'Components (Experimental)/FormGroup', -}; - -export const _default = () => { - return ( - - - - ); -}; - -export const _labelHidden = () => { - return ( - - - - ); -}; - -export const _help = () => { - return ( - Help Text } label="Form Group"> - - - ); -}; diff --git a/packages/components/src/ui/form-group/test/__snapshots__/index.js.snap b/packages/components/src/ui/form-group/test/__snapshots__/index.js.snap deleted file mode 100644 index b10a44c09d5d8..0000000000000 --- a/packages/components/src/ui/form-group/test/__snapshots__/index.js.snap +++ /dev/null @@ -1,121 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`props should render alignLabel 1`] = ` -.emotion-0 { - width: 100%; -} - -.emotion-2 { - display: inline-block; - line-height: calc(13px * 1.2); - margin: 0; - max-width: 100%; - padding-bottom: calc((36px - calc(13px * 1.2)) / 2); - padding-top: calc((36px - calc(13px * 1.2)) / 2); - padding-bottom: calc((36px - calc(13px * 1.2)) / 2); - padding-top: calc((36px - calc(13px * 1.2)) / 2); - color: #1e1e1e; - line-height: 1.2; - margin: 0; - font-size: calc((13 / 13) * 13px); - font-weight: normal; - text-align: right; - display: inline-block; - vertical-align: middle; -} - -.emotion-2:active { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -@media ( -webkit-min-device-pixel-ratio: 1.25 ), ( min-resolution: 120dpi ) { - .emotion-2>* { - position: relative; - top: 0.5px; - } -} - -
-
- - -
-
-`; - -exports[`props should render vertically 1`] = ` -.emotion-0 { - width: 100%; -} - -.emotion-2 { - display: inline-block; - line-height: calc(13px * 1.2); - margin: 0; - max-width: 100%; - padding-bottom: calc((36px - calc(13px * 1.2)) / 2); - padding-top: calc((36px - calc(13px * 1.2)) / 2); - padding-bottom: calc((36px - calc(13px * 1.2)) / 2); - padding-top: calc((36px - calc(13px * 1.2)) / 2); - color: #1e1e1e; - line-height: 1.2; - margin: 0; - font-size: calc((13 / 13) * 13px); - font-weight: normal; - text-align: left; - display: inline-block; - vertical-align: middle; -} - -.emotion-2:active { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -@media ( -webkit-min-device-pixel-ratio: 1.25 ), ( min-resolution: 120dpi ) { - .emotion-2>* { - position: relative; - top: 0.5px; - } -} - -
-
- - -
-
-`; diff --git a/packages/components/src/ui/form-group/test/index.js b/packages/components/src/ui/form-group/test/index.js deleted file mode 100644 index b6bfcd4d8f211..0000000000000 --- a/packages/components/src/ui/form-group/test/index.js +++ /dev/null @@ -1,82 +0,0 @@ -/** - * External dependencies - */ -import { render, screen } from '@testing-library/react'; - -/** - * Internal dependencies - */ -import { ControlLabel } from '../../control-label'; -import { FormGroup, useFormGroupContextId } from '../index'; - -// @todo: Refactor this after adding next TextInput component. -const TextInput = ( { id: idProp, ...props } ) => { - const id = useFormGroupContextId( idProp ); - return ; -}; - -// We're intentionally using a string literal for the ID to ensure -// the htmlFor and id properties of the label and inputs are bound correctly. -/* eslint-disable no-restricted-syntax */ -describe( 'props', () => { - test( 'should render correctly', () => { - render( - - - - ); - - expect( - screen.getByRole( 'textbox', { name: 'First name' } ) - ).toBeVisible(); - } ); - - test( 'should render label without prop correctly', () => { - render( - - First name - - - ); - - expect( - screen.getByRole( 'textbox', { name: 'First name' } ) - ).toBeVisible(); - } ); - - test( 'should render labelHidden', () => { - render( - - - - ); - - expect( - screen.getByRole( 'textbox', { name: 'First name' } ) - ).toBeVisible(); - expect( screen.getByText( 'First name' ) ).toHaveClass( - 'components-visually-hidden' - ); - } ); - - test( 'should render alignLabel', () => { - const { container } = render( - - - - ); - - expect( container ).toMatchSnapshot(); - } ); - - test( 'should render vertically', () => { - const { container } = render( - - - - ); - - expect( container ).toMatchSnapshot(); - } ); -} ); -/* eslint-enable no-restricted-syntax */ diff --git a/packages/components/src/ui/form-group/types.ts b/packages/components/src/ui/form-group/types.ts deleted file mode 100644 index 288acfdba7e17..0000000000000 --- a/packages/components/src/ui/form-group/types.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * External dependencies - */ -import type { CSSProperties, ReactNode, ReactText } from 'react'; - -/** - * Internal dependencies - */ -import type { Props as ControlLabelProps } from '../control-label/types'; -import type { GridProps } from '../../grid/types'; - -export type FormGroupLabelProps = ControlLabelProps & { - labelHidden?: boolean; - id?: ReactText; -}; - -export type FormGroupContentProps = FormGroupLabelProps & { - alignLabel?: CSSProperties[ 'textAlign' ]; - help?: ReactNode; - horizontal?: boolean; - label?: ReactNode; - spacing?: CSSProperties[ 'width' ]; - truncate?: boolean; -}; - -type Horizontal = GridProps & { - horizontal: true; -}; - -type Vertical = { horizontal: false }; - -export type FormGroupProps = FormGroupContentProps & ( Horizontal | Vertical ); diff --git a/packages/components/src/ui/form-group/use-form-group.js b/packages/components/src/ui/form-group/use-form-group.js deleted file mode 100644 index eebc5ae350639..0000000000000 --- a/packages/components/src/ui/form-group/use-form-group.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * WordPress dependencies - */ -import { useInstanceId } from '@wordpress/compose'; - -/** - * Internal dependencies - */ -import { useContextSystem } from '../context'; -import * as styles from './form-group-styles'; -import { useCx } from '../../utils/hooks/use-cx'; - -/** - * @param {import('../context').WordPressComponentProps} props - */ -export function useFormGroup( props ) { - const { - alignLabel = 'left', - children, - className, - help, - horizontal = false, - id: idProp, - label, - labelHidden = false, - truncate = false, - ...otherProps - } = useContextSystem( props, 'FormGroup' ); - - const id = useInstanceId( useFormGroup, 'form-group', idProp ); - - const cx = useCx(); - - const classes = cx( styles.FormGroup, className ); - - const contentProps = { - alignLabel, - children, - help, - id, - horizontal, - label, - labelHidden, - truncate, - }; - - return { - ...otherProps, - className: classes, - contentProps, - horizontal, - }; -} diff --git a/packages/components/src/ui/index.js b/packages/components/src/ui/index.js deleted file mode 100644 index e8587d84b298a..0000000000000 --- a/packages/components/src/ui/index.js +++ /dev/null @@ -1,5 +0,0 @@ -export * from './control-group'; -export * from './control-label'; -export * from './form-group'; -export * from './shortcut'; -export * from './spinner'; diff --git a/packages/components/src/ui/spinner/README.md b/packages/components/src/ui/spinner/README.md deleted file mode 100644 index 5e25f9992d0c3..0000000000000 --- a/packages/components/src/ui/spinner/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# Spinner - -
-This feature is still experimental. “Experimental” means this is an early implementation subject to drastic and breaking changes. -
- -`Spinner` is a component that notify users that their action is being processed. - -## Usage - -```jsx -import { Spinner } from '@wordpress/components/ui'; - -function Example() { - return ; -} -``` - -## Props - -##### color - -**Type**: `CSSProperties['color']` - -The color of the `Spinner`. - -##### size - -**Type**: `number` - -The size of the `Spinner`. diff --git a/packages/components/src/ui/spinner/component.js b/packages/components/src/ui/spinner/component.js deleted file mode 100644 index d8da4fcf70823..0000000000000 --- a/packages/components/src/ui/spinner/component.js +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Internal dependencies - */ -import { BarsView, BarsWrapperView, ContainerView } from './styles'; -import { BASE_SIZE, WRAPPER_SIZE } from './utils'; -import { contextConnect, useContextSystem } from '../context'; -import { COLORS } from '../../utils/colors-values'; - -/* eslint-disable jsdoc/valid-types */ -/** - * @typedef Props - * @property {import('react').CSSProperties['color']} [color] Color of `Spinner`. - * @property {number} [size=16] Size of `Spinner`. - */ -/* eslint-enable jsdoc/valid-types */ - -/** - * - * @param {import('../context').WordPressComponentProps} props - * @param {import('react').ForwardedRef} forwardedRef - */ -function Spinner( props, forwardedRef ) { - const { - color = COLORS.gray[ 900 ], - size = BASE_SIZE, - ...otherProps - } = useContextSystem( props, 'Spinner' ); - const ratio = size / BASE_SIZE; - const scale = ( ratio * BASE_SIZE ) / WRAPPER_SIZE; - const transform = `scale(${ scale })`; - - const styles = { transform }; - - return ( - - - -
-
-
-
-
-
-
-
-
-
-
-
- - - - ); -} - -/** - * `Spinner` is a component that notify users that their action is being processed. - * - * @example - * ```jsx - * import { Spinner } from `@wordpress/components/ui`; - * - * function Example() { - * return ( - * - * ); - * } - * ``` - */ -export default contextConnect( Spinner, 'Spinner' ); diff --git a/packages/components/src/ui/spinner/index.js b/packages/components/src/ui/spinner/index.js deleted file mode 100644 index 84ac37f7401d5..0000000000000 --- a/packages/components/src/ui/spinner/index.js +++ /dev/null @@ -1 +0,0 @@ -export { default as Spinner } from './component'; diff --git a/packages/components/src/ui/spinner/stories/index.js b/packages/components/src/ui/spinner/stories/index.js deleted file mode 100644 index 9cb006d883c1e..0000000000000 --- a/packages/components/src/ui/spinner/stories/index.js +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Internal dependencies - */ -import { Spinner } from '../index'; - -export default { - component: Spinner, - title: 'Components (Experimental)/Spinner', -}; - -export const _default = () => { - return ( - <> - - - - - ); -}; diff --git a/packages/components/src/ui/spinner/styles.js b/packages/components/src/ui/spinner/styles.js deleted file mode 100644 index 057cca34c6846..0000000000000 --- a/packages/components/src/ui/spinner/styles.js +++ /dev/null @@ -1,109 +0,0 @@ -/** - * External dependencies - */ -import styled from '@emotion/styled'; - -/** - * Internal dependencies - */ -import { WRAPPER_SIZE } from './utils'; - -export const ContainerView = styled.div` - display: flex; - pointer-events: none; - position: relative; -`; - -export const BarsWrapperView = styled.div` - height: ${ WRAPPER_SIZE }px; - left: 0; - opacity: 0.6; - position: absolute; - top: 0; - transform-origin: top left; - width: ${ WRAPPER_SIZE }px; -`; - -export const BarsView = styled.div` - color: currentColor; - display: inline-flex; - height: 54px; - left: 50%; - padding: 10px; - position: absolute; - top: 50%; - transform: translate( -50%, -50% ); - width: 54px; - - > div { - animation: ComponentsUISpinnerFadeAnimation 1000ms linear infinite; - background: currentColor; - border-radius: 50px; - height: 16%; - left: 49%; - opacity: 0; - position: absolute; - top: 43%; - width: 6%; - } - - @keyframes ComponentsUISpinnerFadeAnimation { - from { - opacity: 1; - } - to { - opacity: 0.25; - } - } - - .InnerBar1 { - animation-delay: 0s; - transform: rotate( 0deg ) translate( 0, -130% ); - } - - .InnerBar2 { - animation-delay: -0.9167s; - transform: rotate( 30deg ) translate( 0, -130% ); - } - - .InnerBar3 { - animation-delay: -0.833s; - transform: rotate( 60deg ) translate( 0, -130% ); - } - .InnerBar4 { - animation-delay: -0.7497s; - transform: rotate( 90deg ) translate( 0, -130% ); - } - .InnerBar5 { - animation-delay: -0.667s; - transform: rotate( 120deg ) translate( 0, -130% ); - } - .InnerBar6 { - animation-delay: -0.5837s; - transform: rotate( 150deg ) translate( 0, -130% ); - } - .InnerBar7 { - animation-delay: -0.5s; - transform: rotate( 180deg ) translate( 0, -130% ); - } - .InnerBar8 { - animation-delay: -0.4167s; - transform: rotate( 210deg ) translate( 0, -130% ); - } - .InnerBar9 { - animation-delay: -0.333s; - transform: rotate( 240deg ) translate( 0, -130% ); - } - .InnerBar10 { - animation-delay: -0.2497s; - transform: rotate( 270deg ) translate( 0, -130% ); - } - .InnerBar11 { - animation-delay: -0.167s; - transform: rotate( 300deg ) translate( 0, -130% ); - } - .InnerBar12 { - animation-delay: -0.0833s; - transform: rotate( 330deg ) translate( 0, -130% ); - } -`; diff --git a/packages/components/src/ui/spinner/test/__snapshots__/index.js.snap b/packages/components/src/ui/spinner/test/__snapshots__/index.js.snap deleted file mode 100644 index 70fd3df3a5b48..0000000000000 --- a/packages/components/src/ui/spinner/test/__snapshots__/index.js.snap +++ /dev/null @@ -1,265 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`props should render color 1`] = ` -Snapshot Diff: -- First value -+ Second value - -@@ -11,11 +11,11 @@ - class="css-1rq9ofd-BarsWrapperView e1s9yo7h1" - style="transform: scale(0.4444444444444444);" - > -
-
-
div { - -webkit-animation: ComponentsUISpinnerFadeAnimation 1000ms linear infinite; - animation: ComponentsUISpinnerFadeAnimation 1000ms linear infinite; - background: currentColor; - border-radius: 50px; - height: 16%; - left: 49%; - opacity: 0; - position: absolute; - top: 43%; - width: 6%; -} - -.emotion-4 .InnerBar1 { - -webkit-animation-delay: 0s; - animation-delay: 0s; - -webkit-transform: rotate( 0deg ) translate( 0, -130% ); - -moz-transform: rotate( 0deg ) translate( 0, -130% ); - -ms-transform: rotate( 0deg ) translate( 0, -130% ); - transform: rotate( 0deg ) translate( 0, -130% ); -} - -.emotion-4 .InnerBar2 { - -webkit-animation-delay: -0.9167s; - animation-delay: -0.9167s; - -webkit-transform: rotate( 30deg ) translate( 0, -130% ); - -moz-transform: rotate( 30deg ) translate( 0, -130% ); - -ms-transform: rotate( 30deg ) translate( 0, -130% ); - transform: rotate( 30deg ) translate( 0, -130% ); -} - -.emotion-4 .InnerBar3 { - -webkit-animation-delay: -0.833s; - animation-delay: -0.833s; - -webkit-transform: rotate( 60deg ) translate( 0, -130% ); - -moz-transform: rotate( 60deg ) translate( 0, -130% ); - -ms-transform: rotate( 60deg ) translate( 0, -130% ); - transform: rotate( 60deg ) translate( 0, -130% ); -} - -.emotion-4 .InnerBar4 { - -webkit-animation-delay: -0.7497s; - animation-delay: -0.7497s; - -webkit-transform: rotate( 90deg ) translate( 0, -130% ); - -moz-transform: rotate( 90deg ) translate( 0, -130% ); - -ms-transform: rotate( 90deg ) translate( 0, -130% ); - transform: rotate( 90deg ) translate( 0, -130% ); -} - -.emotion-4 .InnerBar5 { - -webkit-animation-delay: -0.667s; - animation-delay: -0.667s; - -webkit-transform: rotate( 120deg ) translate( 0, -130% ); - -moz-transform: rotate( 120deg ) translate( 0, -130% ); - -ms-transform: rotate( 120deg ) translate( 0, -130% ); - transform: rotate( 120deg ) translate( 0, -130% ); -} - -.emotion-4 .InnerBar6 { - -webkit-animation-delay: -0.5837s; - animation-delay: -0.5837s; - -webkit-transform: rotate( 150deg ) translate( 0, -130% ); - -moz-transform: rotate( 150deg ) translate( 0, -130% ); - -ms-transform: rotate( 150deg ) translate( 0, -130% ); - transform: rotate( 150deg ) translate( 0, -130% ); -} - -.emotion-4 .InnerBar7 { - -webkit-animation-delay: -0.5s; - animation-delay: -0.5s; - -webkit-transform: rotate( 180deg ) translate( 0, -130% ); - -moz-transform: rotate( 180deg ) translate( 0, -130% ); - -ms-transform: rotate( 180deg ) translate( 0, -130% ); - transform: rotate( 180deg ) translate( 0, -130% ); -} - -.emotion-4 .InnerBar8 { - -webkit-animation-delay: -0.4167s; - animation-delay: -0.4167s; - -webkit-transform: rotate( 210deg ) translate( 0, -130% ); - -moz-transform: rotate( 210deg ) translate( 0, -130% ); - -ms-transform: rotate( 210deg ) translate( 0, -130% ); - transform: rotate( 210deg ) translate( 0, -130% ); -} - -.emotion-4 .InnerBar9 { - -webkit-animation-delay: -0.333s; - animation-delay: -0.333s; - -webkit-transform: rotate( 240deg ) translate( 0, -130% ); - -moz-transform: rotate( 240deg ) translate( 0, -130% ); - -ms-transform: rotate( 240deg ) translate( 0, -130% ); - transform: rotate( 240deg ) translate( 0, -130% ); -} - -.emotion-4 .InnerBar10 { - -webkit-animation-delay: -0.2497s; - animation-delay: -0.2497s; - -webkit-transform: rotate( 270deg ) translate( 0, -130% ); - -moz-transform: rotate( 270deg ) translate( 0, -130% ); - -ms-transform: rotate( 270deg ) translate( 0, -130% ); - transform: rotate( 270deg ) translate( 0, -130% ); -} - -.emotion-4 .InnerBar11 { - -webkit-animation-delay: -0.167s; - animation-delay: -0.167s; - -webkit-transform: rotate( 300deg ) translate( 0, -130% ); - -moz-transform: rotate( 300deg ) translate( 0, -130% ); - -ms-transform: rotate( 300deg ) translate( 0, -130% ); - transform: rotate( 300deg ) translate( 0, -130% ); -} - -.emotion-4 .InnerBar12 { - -webkit-animation-delay: -0.0833s; - animation-delay: -0.0833s; - -webkit-transform: rotate( 330deg ) translate( 0, -130% ); - -moz-transform: rotate( 330deg ) translate( 0, -130% ); - -ms-transform: rotate( 330deg ) translate( 0, -130% ); - transform: rotate( 330deg ) translate( 0, -130% ); -} - -
-
-