From af34d1ef0bf3db2913c71fb1e9686c34a61f3ee2 Mon Sep 17 00:00:00 2001
From: Jorge Costa
Date: Wed, 11 Dec 2024 10:02:25 +0000
Subject: [PATCH 001/239] [Dataviews] Fix: Media item focus style is not
visible on Grid. (#67789)
Co-authored-by: jorgefilipecosta
Co-authored-by: oandregal
Co-authored-by: jameskoster
---
.../src/dataviews-layouts/grid/style.scss | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/packages/dataviews/src/dataviews-layouts/grid/style.scss b/packages/dataviews/src/dataviews-layouts/grid/style.scss
index e9fcb472dc318..51db297b4025b 100644
--- a/packages/dataviews/src/dataviews-layouts/grid/style.scss
+++ b/packages/dataviews/src/dataviews-layouts/grid/style.scss
@@ -30,11 +30,16 @@
.dataviews-view-grid__fields .dataviews-view-grid__field .dataviews-view-grid__field-value {
color: $gray-900;
}
-
- .dataviews-view-grid__media::after {
- background-color: rgba(var(--wp-admin-theme-color--rgb), 0.08);
- box-shadow: inset 0 0 0 $border-width var(--wp-admin-theme-color);
- }
+ }
+ &.is-selected .dataviews-view-grid__media::after,
+ .dataviews-view-grid__media:focus::after {
+ background-color: rgba(var(--wp-admin-theme-color--rgb), 0.08);
+ }
+ &.is-selected .dataviews-view-grid__media::after {
+ box-shadow: inset 0 0 0 $border-width var(--wp-admin-theme-color);
+ }
+ .dataviews-view-grid__media:focus::after {
+ box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
}
}
From db42416a94822534ec6a44c46534c89d975d8042 Mon Sep 17 00:00:00 2001
From: Marin Atanasov <8436925+tyxla@users.noreply.github.com>
Date: Wed, 11 Dec 2024 12:19:10 +0200
Subject: [PATCH 002/239] Components: Unite inline Ariakit imports (#67818)
Co-authored-by: tyxla
Co-authored-by: Mamaduka
---
.../components/src/custom-select-control-v2/custom-select.tsx | 3 +--
packages/components/src/menu/index.tsx | 3 +--
packages/components/src/radio-group/radio.tsx | 3 +--
packages/components/src/tab-panel/index.tsx | 3 +--
.../toggle-group-control/as-radio-group.tsx | 3 +--
packages/components/src/tooltip/index.tsx | 3 +--
6 files changed, 6 insertions(+), 12 deletions(-)
diff --git a/packages/components/src/custom-select-control-v2/custom-select.tsx b/packages/components/src/custom-select-control-v2/custom-select.tsx
index bb458abcc282f..9c3baf182a399 100644
--- a/packages/components/src/custom-select-control-v2/custom-select.tsx
+++ b/packages/components/src/custom-select-control-v2/custom-select.tsx
@@ -2,7 +2,6 @@
* External dependencies
*/
import * as Ariakit from '@ariakit/react';
-import { useStoreState } from '@ariakit/react';
/**
* WordPress dependencies
@@ -63,7 +62,7 @@ const CustomSelectButton = ( {
CustomSelectStore,
'onChange'
> ) => {
- const { value: currentValue } = useStoreState( store );
+ const { value: currentValue } = Ariakit.useStoreState( store );
const computedRenderSelectedValue = useMemo(
() => renderSelectedValue ?? defaultRenderSelectedValue,
diff --git a/packages/components/src/menu/index.tsx b/packages/components/src/menu/index.tsx
index 6f6e89b0a1c72..9886f32482321 100644
--- a/packages/components/src/menu/index.tsx
+++ b/packages/components/src/menu/index.tsx
@@ -2,7 +2,6 @@
* External dependencies
*/
import * as Ariakit from '@ariakit/react';
-import { useStoreState } from '@ariakit/react';
/**
* WordPress dependencies
@@ -109,7 +108,7 @@ const UnconnectedMenu = (
// Extract the side from the applied placement — useful for animations.
// Using `currentPlacement` instead of `placement` to make sure that we
// use the final computed placement (including "flips" etc).
- const appliedPlacementSide = useStoreState(
+ const appliedPlacementSide = Ariakit.useStoreState(
menuStore,
'currentPlacement'
).split( '-' )[ 0 ];
diff --git a/packages/components/src/radio-group/radio.tsx b/packages/components/src/radio-group/radio.tsx
index 782a737b6ba28..4c54e0694f4bd 100644
--- a/packages/components/src/radio-group/radio.tsx
+++ b/packages/components/src/radio-group/radio.tsx
@@ -7,7 +7,6 @@ import { forwardRef, useContext } from '@wordpress/element';
* External dependencies
*/
import * as Ariakit from '@ariakit/react';
-import { useStoreState } from '@ariakit/react';
/**
* Internal dependencies
@@ -28,7 +27,7 @@ function UnforwardedRadio(
) {
const { store, disabled } = useContext( RadioGroupContext );
- const selectedValue = useStoreState( store, 'value' );
+ const selectedValue = Ariakit.useStoreState( store, 'value' );
const isChecked = selectedValue !== undefined && selectedValue === value;
maybeWarnDeprecated36pxSize( {
diff --git a/packages/components/src/tab-panel/index.tsx b/packages/components/src/tab-panel/index.tsx
index be06b42fcd013..ec4f33d875a38 100644
--- a/packages/components/src/tab-panel/index.tsx
+++ b/packages/components/src/tab-panel/index.tsx
@@ -2,7 +2,6 @@
* External dependencies
*/
import * as Ariakit from '@ariakit/react';
-import { useStoreState } from '@ariakit/react';
import clsx from 'clsx';
import type { ForwardedRef } from 'react';
@@ -125,7 +124,7 @@ const UnforwardedTabPanel = (
} );
const selectedTabName = extractTabName(
- useStoreState( tabStore, 'selectedId' )
+ Ariakit.useStoreState( tabStore, 'selectedId' )
);
const setTabStoreSelectedId = useCallback(
diff --git a/packages/components/src/toggle-group-control/toggle-group-control/as-radio-group.tsx b/packages/components/src/toggle-group-control/toggle-group-control/as-radio-group.tsx
index 0166728dbafba..56fb5faca5638 100644
--- a/packages/components/src/toggle-group-control/toggle-group-control/as-radio-group.tsx
+++ b/packages/components/src/toggle-group-control/toggle-group-control/as-radio-group.tsx
@@ -3,7 +3,6 @@
*/
import type { ForwardedRef } from 'react';
import * as Ariakit from '@ariakit/react';
-import { useStoreState } from '@ariakit/react';
/**
* WordPress dependencies
@@ -70,7 +69,7 @@ function UnforwardedToggleGroupControlAsRadioGroup(
rtl: isRTL(),
} );
- const selectedValue = useStoreState( radio, 'value' );
+ const selectedValue = Ariakit.useStoreState( radio, 'value' );
const setValue = radio.setValue;
// Ensures that the active id is also reset after the value is "reset" by the consumer.
diff --git a/packages/components/src/tooltip/index.tsx b/packages/components/src/tooltip/index.tsx
index ce94daf67bfab..b7184579ceca9 100644
--- a/packages/components/src/tooltip/index.tsx
+++ b/packages/components/src/tooltip/index.tsx
@@ -2,7 +2,6 @@
* External dependencies
*/
import * as Ariakit from '@ariakit/react';
-import { useStoreState } from '@ariakit/react';
import clsx from 'clsx';
/**
@@ -94,7 +93,7 @@ function UnforwardedTooltip(
placement: computedPlacement,
showTimeout: delay,
} );
- const mounted = useStoreState( tooltipStore, 'mounted' );
+ const mounted = Ariakit.useStoreState( tooltipStore, 'mounted' );
if ( isNestedInTooltip ) {
return isOnlyChild ? (
From b65823092b1a319ac533be48d33a09f5f9a239d1 Mon Sep 17 00:00:00 2001
From: Jorge Costa
Date: Wed, 11 Dec 2024 10:59:58 +0000
Subject: [PATCH 003/239] Fix: Templates and patterns are nesting two elements
with the button role (#67801)
Co-authored-by: jorgefilipecosta
Co-authored-by: oandregal
---
.../src/components/page-patterns/fields.js | 52 ++++---------------
.../src/components/page-patterns/style.scss | 22 --------
.../src/components/page-templates/fields.js | 22 +++-----
.../src/components/page-templates/style.scss | 18 -------
4 files changed, 17 insertions(+), 97 deletions(-)
diff --git a/packages/edit-site/src/components/page-patterns/fields.js b/packages/edit-site/src/components/page-patterns/fields.js
index f202664389f0f..d884508e57506 100644
--- a/packages/edit-site/src/components/page-patterns/fields.js
+++ b/packages/edit-site/src/components/page-patterns/fields.js
@@ -15,50 +15,25 @@ import {
} from '@wordpress/block-editor';
import { Icon } from '@wordpress/icons';
import { parse } from '@wordpress/blocks';
-import { privateApis as routerPrivateApis } from '@wordpress/router';
/**
* Internal dependencies
*/
import {
- PATTERN_TYPES,
TEMPLATE_PART_POST_TYPE,
PATTERN_SYNC_TYPES,
OPERATOR_IS,
} from '../../utils/constants';
import { unlock } from '../../lock-unlock';
import { useAddedBy } from '../page-templates/hooks';
-import { defaultGetTitle } from './search-items';
-const { useLink } = unlock( routerPrivateApis );
const { useGlobalStyle } = unlock( blockEditorPrivateApis );
-function PreviewWrapper( { item, onClick, ariaDescribedBy, children } ) {
- return (
-
- { children }
-
- );
-}
-
function PreviewField( { item } ) {
const descriptionId = useId();
const description = item.description || item?.excerpt?.raw;
- const isUserPattern = item.type === PATTERN_TYPES.user;
const isTemplatePart = item.type === TEMPLATE_PART_POST_TYPE;
const [ backgroundColor ] = useGlobalStyle( 'color.background' );
- const { onClick } = useLink(
- `/${ item.type }/${
- isUserPattern || isTemplatePart ? item.id : item.name
- }?canvas=edit`
- );
const blocks = useMemo( () => {
return (
item.blocks ??
@@ -73,23 +48,18 @@ function PreviewField( { item } ) {
-
- { isEmpty && isTemplatePart && __( 'Empty template part' ) }
- { isEmpty && ! isTemplatePart && __( 'Empty pattern' ) }
- { ! isEmpty && (
-
-
-
- ) }
-
+ { isEmpty && isTemplatePart && __( 'Empty template part' ) }
+ { isEmpty && ! isTemplatePart && __( 'Empty pattern' ) }
+ { ! isEmpty && (
+
+
+
+ ) }
{ !! description && (
{ description }
diff --git a/packages/edit-site/src/components/page-patterns/style.scss b/packages/edit-site/src/components/page-patterns/style.scss
index 72d53c2a721af..1ee6ceb94ddbf 100644
--- a/packages/edit-site/src/components/page-patterns/style.scss
+++ b/packages/edit-site/src/components/page-patterns/style.scss
@@ -12,28 +12,6 @@
width: 96px;
flex-grow: 0;
}
-
- .page-patterns-preview-field__button {
- box-shadow: none;
- border: none;
- padding: 0;
- background-color: unset;
- box-sizing: border-box;
- cursor: pointer;
- overflow: hidden;
- height: 100%;
- border-radius: $grid-unit-05;
-
- &:focus-visible {
- box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
- // Windows High Contrast mode will show this outline, but not the box-shadow.
- outline: 2px solid transparent;
- }
-
- &[aria-disabled="true"] {
- cursor: default;
- }
- }
}
.edit-site-patterns__pattern-icon {
diff --git a/packages/edit-site/src/components/page-templates/fields.js b/packages/edit-site/src/components/page-templates/fields.js
index 88c20ff27ebbc..97b427690901a 100644
--- a/packages/edit-site/src/components/page-templates/fields.js
+++ b/packages/edit-site/src/components/page-templates/fields.js
@@ -16,7 +16,6 @@ import {
privateApis as blockEditorPrivateApis,
} from '@wordpress/block-editor';
import { EditorProvider } from '@wordpress/editor';
-import { privateApis as routerPrivateApis } from '@wordpress/router';
/**
* Internal dependencies
@@ -25,7 +24,6 @@ import { useAddedBy } from './hooks';
import usePatternSettings from '../page-patterns/use-pattern-settings';
import { unlock } from '../../lock-unlock';
-const { useLink } = unlock( routerPrivateApis );
const { useGlobalStyle } = unlock( blockEditorPrivateApis );
function PreviewField( { item } ) {
@@ -34,7 +32,6 @@ function PreviewField( { item } ) {
const blocks = useMemo( () => {
return parse( item.content.raw );
}, [ item.content.raw ] );
- const { onClick } = useLink( `/${ item.type }/${ item.id }?canvas=edit` );
const isEmpty = ! blocks?.length;
// Wrap everything in a block editor provider to ensure 'styles' that are needed
@@ -50,19 +47,12 @@ function PreviewField( { item } ) {
className="page-templates-preview-field"
style={ { backgroundColor } }
>
-
- { isEmpty && __( 'Empty template' ) }
- { ! isEmpty && (
-
-
-
- ) }
-
+ { isEmpty && __( 'Empty template' ) }
+ { ! isEmpty && (
+
+
+
+ ) }
);
diff --git a/packages/edit-site/src/components/page-templates/style.scss b/packages/edit-site/src/components/page-templates/style.scss
index 4432cf6bec492..29df1f5bd0803 100644
--- a/packages/edit-site/src/components/page-templates/style.scss
+++ b/packages/edit-site/src/components/page-templates/style.scss
@@ -5,24 +5,6 @@
width: 100%;
border-radius: $radius-medium;
- .page-templates-preview-field__button {
- box-shadow: none;
- border: none;
- padding: 0;
- background-color: unset;
- box-sizing: border-box;
- cursor: pointer;
- overflow: hidden;
- height: 100%;
- border-radius: $radius-medium;
-
- &:focus-visible {
- box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
- // Windows High Contrast mode will show this outline, but not the box-shadow.
- outline: 2px solid transparent;
- }
- }
-
.dataviews-view-list & {
.block-editor-block-preview__container {
height: 120px;
From f2ba0fdb4c7714e516f7e9045ac53e59401d5b82 Mon Sep 17 00:00:00 2001
From: Birgit Pauli-Haack
Date: Wed, 11 Dec 2024 13:42:12 +0100
Subject: [PATCH 004/239] Add a Playground blueprint json to the
/assets/blueprints folder of Plugin Repo (#67742)
* create dirs, add blueprint.json
* updated landing page and php setting
* add step to set admin_color to modern
Co-authored-by: bph
Co-authored-by: brandonpayton
---
assets/blueprints/blueprint.json | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
create mode 100644 assets/blueprints/blueprint.json
diff --git a/assets/blueprints/blueprint.json b/assets/blueprints/blueprint.json
new file mode 100644
index 0000000000000..d0626ffc15dd9
--- /dev/null
+++ b/assets/blueprints/blueprint.json
@@ -0,0 +1,28 @@
+{
+ "$schema": "https://playground.wordpress.net/blueprint-schema.json",
+ "landingPage": "/wp-admin/post.php?post=1&action=edit",
+ "plugins": [ "gutenberg" ],
+ "login": true,
+ "features": {
+ "networking": true
+ },
+ "preferredVersions": {
+ "php": "latest",
+ "wp": "latest"
+ },
+ "steps": [
+ {
+ "step": "setSiteOptions",
+ "options": {
+ "blogname": "Testing Gutenberg"
+ }
+ },
+ {
+ "step": "updateUserMeta",
+ "meta": {
+ "admin_color": "modern"
+ },
+ "userId": 1
+ }
+ ]
+}
From 6470e097826f0ef15c90e821784b24c401b1903d Mon Sep 17 00:00:00 2001
From: Eshaan Dabasiya <76681468+im3dabasia@users.noreply.github.com>
Date: Wed, 11 Dec 2024 18:38:08 +0530
Subject: [PATCH 005/239] add: Added css classname to the itemgroup in
MainSidebarNavigationContent (#67825)
Co-authored-by: im3dabasia
Co-authored-by: jameskoster
Co-authored-by: t-hamano
---
.../src/components/sidebar-navigation-screen-main/index.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/edit-site/src/components/sidebar-navigation-screen-main/index.js b/packages/edit-site/src/components/sidebar-navigation-screen-main/index.js
index e205de2563697..abcc7183f6604 100644
--- a/packages/edit-site/src/components/sidebar-navigation-screen-main/index.js
+++ b/packages/edit-site/src/components/sidebar-navigation-screen-main/index.js
@@ -19,7 +19,7 @@ import { store as editSiteStore } from '../../store';
export function MainSidebarNavigationContent( { isBlockBasedTheme = true } ) {
return (
-
+
{ isBlockBasedTheme && (
<>
Date: Wed, 11 Dec 2024 10:15:36 -0300
Subject: [PATCH 006/239] Stylebook: avoid double line in subcategory titles
(#67752)
* avoid double line in titles
* Revert "avoid double line in titles"
This reverts commit bb96d6ba7fbf65ff943065758d14c313b864a524.
* use only border top
Co-authored-by: matiasbenedetto
Co-authored-by: tellthemachines
Co-authored-by: jasmussen
---
packages/edit-site/src/components/style-book/constants.ts | 1 -
1 file changed, 1 deletion(-)
diff --git a/packages/edit-site/src/components/style-book/constants.ts b/packages/edit-site/src/components/style-book/constants.ts
index 401d532b98cbb..ea99279fd9e65 100644
--- a/packages/edit-site/src/components/style-book/constants.ts
+++ b/packages/edit-site/src/components/style-book/constants.ts
@@ -239,7 +239,6 @@ export const STYLE_BOOK_IFRAME_STYLES = `
.edit-site-style-book__subcategory-title {
font-size: 16px;
margin-bottom: 40px;
- border-bottom: 1px solid #ddd;
padding-bottom: 8px;
}
From b66f9ff095f5b70f9af15a50af1772c0e201a5e6 Mon Sep 17 00:00:00 2001
From: Jon Surrell
Date: Wed, 11 Dec 2024 14:30:39 +0100
Subject: [PATCH 007/239] Add --glob argument to rimraf cli scripts (#67829)
After a rimraf upgrade, windows machines would error when clean scripts were called.
Rimraf now requires a --glob argument to handled glob patterns.
---
Co-authored-by: sirreal
Co-authored-by: t-hamano
---
package.json | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/package.json b/package.json
index dbf69043c5829..b4fd877c82690 100644
--- a/package.json
+++ b/package.json
@@ -180,8 +180,8 @@
"build:packages": "npm run --silent build:package-types && node ./bin/packages/build.js",
"postbuild:packages": " npm run --if-present --workspaces build:wp",
"build:plugin-zip": "bash ./bin/build-plugin-zip.sh",
- "clean:package-types": "tsc --build --clean && rimraf \"./packages/*/build-types\"",
- "clean:packages": "rimraf \"./packages/*/@(build|build-module|build-wp|build-style)\"",
+ "clean:package-types": "tsc --build --clean && rimraf --glob './packages/*/build-types'",
+ "clean:packages": "rimraf --glob './packages/*/@(build|build-module|build-wp|build-style)'",
"component-usage-stats": "node ./node_modules/react-scanner/bin/react-scanner -c ./react-scanner.config.js",
"dev": "cross-env NODE_ENV=development npm run build:packages && concurrently \"wp-scripts start\" \"npm run dev:packages\"",
"dev:packages": "cross-env NODE_ENV=development concurrently \"node ./bin/packages/watch.js\" \"tsc --build --watch\"",
@@ -193,7 +193,7 @@
"docs:gen": "node ./docs/tool/index.js",
"docs:theme-ref": "node ./bin/api-docs/gen-theme-reference.mjs",
"env": "wp-env",
- "fixtures:clean": "rimraf \"test/integration/fixtures/blocks/*.+(json|serialized.html)\"",
+ "fixtures:clean": "rimraf --glob 'test/integration/fixtures/blocks/*.+(json|serialized.html)'",
"fixtures:generate": "cross-env GENERATE_MISSING_FIXTURES=y npm run test:unit test/integration/full-content/ && npm run format test/integration/fixtures/blocks/*.json",
"fixtures:regenerate": "npm-run-all fixtures:clean fixtures:generate",
"format": "wp-scripts format",
From bb8a14772e83049e1d255f317c735d7936734629 Mon Sep 17 00:00:00 2001
From: Dave Smith
Date: Wed, 11 Dec 2024 15:36:55 +0000
Subject: [PATCH 008/239] Hide separators for currently dragged section in Zoom
Out (#67638)
* Hide separators for currently dragged section
* Add comment by way of explanation
Co-authored-by: getdave
Co-authored-by: richtabor
Co-authored-by: mikachan
---
.../block-list/zoom-out-separator.js | 30 +++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/packages/block-editor/src/components/block-list/zoom-out-separator.js b/packages/block-editor/src/components/block-list/zoom-out-separator.js
index f2e6d050141fb..86191c1e4ce32 100644
--- a/packages/block-editor/src/components/block-list/zoom-out-separator.js
+++ b/packages/block-editor/src/components/block-list/zoom-out-separator.js
@@ -33,6 +33,7 @@ export function ZoomOutSeparator( {
insertionPoint,
blockInsertionPointVisible,
blockInsertionPoint,
+ blocksBeingDragged,
} = useSelect( ( select ) => {
const {
getInsertionPoint,
@@ -40,6 +41,7 @@ export function ZoomOutSeparator( {
getSectionRootClientId,
isBlockInsertionPointVisible,
getBlockInsertionPoint,
+ getDraggedBlockClientIds,
} = unlock( select( blockEditorStore ) );
const root = getSectionRootClientId();
@@ -51,6 +53,7 @@ export function ZoomOutSeparator( {
insertionPoint: getInsertionPoint(),
blockInsertionPoint: getBlockInsertionPoint(),
blockInsertionPointVisible: isBlockInsertionPointVisible(),
+ blocksBeingDragged: getDraggedBlockClientIds(),
};
}, [] );
@@ -78,6 +81,7 @@ export function ZoomOutSeparator( {
insertionPoint &&
insertionPoint.hasOwnProperty( 'index' ) &&
clientId === sectionClientIds[ insertionPoint.index - 1 ];
+
// We want to show the zoom out separator in either of these conditions:
// 1. If the inserter has an insertion index set
// 2. We are dragging a pattern over an insertion point
@@ -97,6 +101,32 @@ export function ZoomOutSeparator( {
sectionClientIds[ blockInsertionPoint.index - 1 ] );
}
+ const blockBeingDraggedClientId = blocksBeingDragged[ 0 ];
+
+ const isCurrentBlockBeingDragged = blocksBeingDragged.includes( clientId );
+
+ const blockBeingDraggedIndex = sectionClientIds.indexOf(
+ blockBeingDraggedClientId
+ );
+ const blockBeingDraggedPreviousSiblingClientId =
+ blockBeingDraggedIndex > 0
+ ? sectionClientIds[ blockBeingDraggedIndex - 1 ]
+ : null;
+
+ const isCurrentBlockPreviousSiblingOfBlockBeingDragged =
+ blockBeingDraggedPreviousSiblingClientId === clientId;
+
+ // The separators are visually top/bottom of the block, but in actual fact
+ // the "top" separator is the "bottom" separator of the previous block.
+ // Therefore, this logic hides the separator if the current block is being dragged
+ // or if the current block is the previous sibling of the block being dragged.
+ if (
+ isCurrentBlockBeingDragged ||
+ isCurrentBlockPreviousSiblingOfBlockBeingDragged
+ ) {
+ isVisible = false;
+ }
+
return (
{ isVisible && (
From eb01c74959f6dc39d11a9060d15a4097932f49b1 Mon Sep 17 00:00:00 2001
From: Marin Atanasov <8436925+tyxla@users.noreply.github.com>
Date: Wed, 11 Dec 2024 17:56:49 +0200
Subject: [PATCH 009/239] Storybook: Upgrade to v8.0.x (#67574)
* Bump dependencies
* Patch storybook-source-link to import from @storybook/manager-api
* Add webpack5 compiler babel addon and enable react-docgen-typescript
* Use @storybook/icons in introduction docs
* Update storybook-source-link patch to use @storybook/icons
* Fix status icons
* Fix status icon styles
* Preview: ArgsTable => Controls
* Add explicit action spies
Co-authored-by: tyxla
Co-authored-by: ciampo
---
package-lock.json | 2784 +++++++----------
package.json | 26 +-
.../stories/index.story.tsx | 4 +
.../src/tab-panel/stories/index.story.tsx | 4 +
.../src/tabs/stories/index.story.tsx | 5 +
patches/storybook-source-link+2.0.9.patch | 55 +
storybook/main.js | 4 +
storybook/preview.js | 5 +-
storybook/sidebar.js | 6 +-
storybook/stories/docs/inline-icon.js | 10 +-
storybook/stories/docs/introduction.mdx | 3 +-
11 files changed, 1279 insertions(+), 1627 deletions(-)
create mode 100644 patches/storybook-source-link+2.0.9.patch
diff --git a/package-lock.json b/package-lock.json
index 2dde4727531b6..ede83fa0e38c2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24,7 +24,7 @@
"@emotion/babel-plugin": "11.11.0",
"@emotion/jest": "11.7.1",
"@emotion/native": "11.0.0",
- "@geometricpanda/storybook-addon-badges": "2.0.1",
+ "@geometricpanda/storybook-addon-badges": "2.0.5",
"@octokit/rest": "16.26.0",
"@octokit/types": "6.34.0",
"@octokit/webhooks-types": "5.8.0",
@@ -33,16 +33,18 @@
"@react-native/babel-preset": "0.73.10",
"@react-native/metro-babel-transformer": "0.73.10",
"@react-native/metro-config": "0.73.4",
- "@storybook/addon-a11y": "7.6.15",
- "@storybook/addon-actions": "7.6.15",
- "@storybook/addon-controls": "7.6.15",
- "@storybook/addon-docs": "7.6.15",
- "@storybook/addon-toolbars": "7.6.15",
- "@storybook/addon-viewport": "7.6.15",
- "@storybook/react": "7.6.15",
- "@storybook/react-webpack5": "7.6.15",
- "@storybook/source-loader": "7.6.15",
- "@storybook/theming": "7.6.15",
+ "@storybook/addon-a11y": "8.0.10",
+ "@storybook/addon-actions": "8.0.10",
+ "@storybook/addon-controls": "8.0.10",
+ "@storybook/addon-docs": "8.0.10",
+ "@storybook/addon-toolbars": "8.0.10",
+ "@storybook/addon-viewport": "8.0.10",
+ "@storybook/addon-webpack5-compiler-babel": "3.0.3",
+ "@storybook/react": "8.0.10",
+ "@storybook/react-webpack5": "8.0.10",
+ "@storybook/source-loader": "8.0.10",
+ "@storybook/test": "8.0.10",
+ "@storybook/theming": "8.0.10",
"@testing-library/jest-dom": "5.16.5",
"@testing-library/react": "14.3.0",
"@testing-library/react-native": "12.4.3",
@@ -147,7 +149,7 @@
"snapshot-diff": "0.10.0",
"source-map-loader": "3.0.0",
"sprintf-js": "1.1.1",
- "storybook": "7.6.15",
+ "storybook": "8.0.10",
"storybook-source-link": "2.0.9",
"strip-json-comments": "5.0.0",
"style-loader": "3.2.1",
@@ -4652,9 +4654,9 @@
"integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
},
"node_modules/@emotion/use-insertion-effect-with-fallbacks": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz",
- "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz",
+ "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==",
"dev": true,
"peerDependencies": {
"react": ">=16.8.0"
@@ -5174,20 +5176,6 @@
"integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==",
"license": "MIT"
},
- "node_modules/@floating-ui/react-dom": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz",
- "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@floating-ui/dom": "^1.0.0"
- },
- "peerDependencies": {
- "react": ">=16.8.0",
- "react-dom": ">=16.8.0"
- }
- },
"node_modules/@floating-ui/utils": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz",
@@ -5244,18 +5232,18 @@
}
},
"node_modules/@geometricpanda/storybook-addon-badges": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/@geometricpanda/storybook-addon-badges/-/storybook-addon-badges-2.0.1.tgz",
- "integrity": "sha512-dCEK/xJewuFe1d+ndF0hQIAJRnUsV9q5kuDmp7zvO7fTd7cDz0X9Bjz0lNRn6n4Z9bL9/iFHKzJESDHFfs4ihQ==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@geometricpanda/storybook-addon-badges/-/storybook-addon-badges-2.0.5.tgz",
+ "integrity": "sha512-FH56ly6ZhltjyKQWxUKORP67BxhL9FMJRByS5lqKZpeP8J2MMsMXG7eQmFXKcZGQORfVQye+1uYYWXweDOiFTQ==",
"dev": true,
"peerDependencies": {
- "@storybook/blocks": "^7.0.0",
- "@storybook/components": "^7.0.0",
- "@storybook/core-events": "^7.0.0",
- "@storybook/manager-api": "^7.0.0",
- "@storybook/preview-api": "^7.0.0",
- "@storybook/theming": "^7.0.0",
- "@storybook/types": "^7.0.0",
+ "@storybook/blocks": "^8.3.0",
+ "@storybook/components": "^8.3.0",
+ "@storybook/core-events": "^8.3.0",
+ "@storybook/manager-api": "^8.3.0",
+ "@storybook/preview-api": "^8.3.0",
+ "@storybook/theming": "^8.3.0",
+ "@storybook/types": "^8.3.0",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
},
@@ -5877,9 +5865,9 @@
}
},
"node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.25",
@@ -5896,12 +5884,6 @@
"integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==",
"dev": true
},
- "node_modules/@juggle/resize-observer": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
- "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==",
- "dev": true
- },
"node_modules/@kwsites/file-exists": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
@@ -6938,19 +6920,19 @@
}
},
"node_modules/@mdx-js/react": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-2.3.0.tgz",
- "integrity": "sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz",
+ "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==",
"dev": true,
"dependencies": {
- "@types/mdx": "^2.0.0",
- "@types/react": ">=16"
+ "@types/mdx": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
},
"peerDependencies": {
+ "@types/react": ">=16",
"react": ">=16"
}
},
@@ -6982,7 +6964,6 @@
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
"integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
@@ -8815,15 +8796,6 @@
"streamx": "^2.15.0"
}
},
- "node_modules/@radix-ui/number": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz",
- "integrity": "sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.10"
- }
- },
"node_modules/@radix-ui/primitive": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz",
@@ -8833,57 +8805,6 @@
"@babel/runtime": "^7.13.10"
}
},
- "node_modules/@radix-ui/react-arrow": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.3.tgz",
- "integrity": "sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@radix-ui/react-primitive": "1.0.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0",
- "react-dom": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-collection": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.3.tgz",
- "integrity": "sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@radix-ui/react-compose-refs": "1.0.1",
- "@radix-ui/react-context": "1.0.1",
- "@radix-ui/react-primitive": "1.0.3",
- "@radix-ui/react-slot": "1.0.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0",
- "react-dom": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
"node_modules/@radix-ui/react-compose-refs": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz",
@@ -8920,53 +8841,6 @@
}
}
},
- "node_modules/@radix-ui/react-direction": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.1.tgz",
- "integrity": "sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-dismissable-layer": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.4.tgz",
- "integrity": "sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@radix-ui/primitive": "1.0.1",
- "@radix-ui/react-compose-refs": "1.0.1",
- "@radix-ui/react-primitive": "1.0.3",
- "@radix-ui/react-use-callback-ref": "1.0.1",
- "@radix-ui/react-use-escape-keydown": "1.0.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0",
- "react-dom": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
"node_modules/@radix-ui/react-focus-guards": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz",
@@ -8985,33 +8859,6 @@
}
}
},
- "node_modules/@radix-ui/react-focus-scope": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.3.tgz",
- "integrity": "sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@radix-ui/react-compose-refs": "1.0.1",
- "@radix-ui/react-primitive": "1.0.3",
- "@radix-ui/react-use-callback-ref": "1.0.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0",
- "react-dom": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
"node_modules/@radix-ui/react-id": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz",
@@ -9031,64 +8878,6 @@
}
}
},
- "node_modules/@radix-ui/react-popper": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.2.tgz",
- "integrity": "sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@floating-ui/react-dom": "^2.0.0",
- "@radix-ui/react-arrow": "1.0.3",
- "@radix-ui/react-compose-refs": "1.0.1",
- "@radix-ui/react-context": "1.0.1",
- "@radix-ui/react-primitive": "1.0.3",
- "@radix-ui/react-use-callback-ref": "1.0.1",
- "@radix-ui/react-use-layout-effect": "1.0.1",
- "@radix-ui/react-use-rect": "1.0.1",
- "@radix-ui/react-use-size": "1.0.1",
- "@radix-ui/rect": "1.0.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0",
- "react-dom": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-portal": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz",
- "integrity": "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@radix-ui/react-primitive": "1.0.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0",
- "react-dom": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
"node_modules/@radix-ui/react-primitive": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz",
@@ -9113,106 +8902,6 @@
}
}
},
- "node_modules/@radix-ui/react-roving-focus": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.4.tgz",
- "integrity": "sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@radix-ui/primitive": "1.0.1",
- "@radix-ui/react-collection": "1.0.3",
- "@radix-ui/react-compose-refs": "1.0.1",
- "@radix-ui/react-context": "1.0.1",
- "@radix-ui/react-direction": "1.0.1",
- "@radix-ui/react-id": "1.0.1",
- "@radix-ui/react-primitive": "1.0.3",
- "@radix-ui/react-use-callback-ref": "1.0.1",
- "@radix-ui/react-use-controllable-state": "1.0.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0",
- "react-dom": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-select": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-1.2.2.tgz",
- "integrity": "sha512-zI7McXr8fNaSrUY9mZe4x/HC0jTLY9fWNhO1oLWYMQGDXuV4UCivIGTxwioSzO0ZCYX9iSLyWmAh/1TOmX3Cnw==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@radix-ui/number": "1.0.1",
- "@radix-ui/primitive": "1.0.1",
- "@radix-ui/react-collection": "1.0.3",
- "@radix-ui/react-compose-refs": "1.0.1",
- "@radix-ui/react-context": "1.0.1",
- "@radix-ui/react-direction": "1.0.1",
- "@radix-ui/react-dismissable-layer": "1.0.4",
- "@radix-ui/react-focus-guards": "1.0.1",
- "@radix-ui/react-focus-scope": "1.0.3",
- "@radix-ui/react-id": "1.0.1",
- "@radix-ui/react-popper": "1.1.2",
- "@radix-ui/react-portal": "1.0.3",
- "@radix-ui/react-primitive": "1.0.3",
- "@radix-ui/react-slot": "1.0.2",
- "@radix-ui/react-use-callback-ref": "1.0.1",
- "@radix-ui/react-use-controllable-state": "1.0.1",
- "@radix-ui/react-use-layout-effect": "1.0.1",
- "@radix-ui/react-use-previous": "1.0.1",
- "@radix-ui/react-visually-hidden": "1.0.3",
- "aria-hidden": "^1.1.1",
- "react-remove-scroll": "2.5.5"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0",
- "react-dom": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-separator": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.0.3.tgz",
- "integrity": "sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@radix-ui/react-primitive": "1.0.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0",
- "react-dom": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
"node_modules/@radix-ui/react-slot": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz",
@@ -9232,92 +8921,6 @@
}
}
},
- "node_modules/@radix-ui/react-toggle": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.0.3.tgz",
- "integrity": "sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@radix-ui/primitive": "1.0.1",
- "@radix-ui/react-primitive": "1.0.3",
- "@radix-ui/react-use-controllable-state": "1.0.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0",
- "react-dom": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-toggle-group": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.0.4.tgz",
- "integrity": "sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@radix-ui/primitive": "1.0.1",
- "@radix-ui/react-context": "1.0.1",
- "@radix-ui/react-direction": "1.0.1",
- "@radix-ui/react-primitive": "1.0.3",
- "@radix-ui/react-roving-focus": "1.0.4",
- "@radix-ui/react-toggle": "1.0.3",
- "@radix-ui/react-use-controllable-state": "1.0.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0",
- "react-dom": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-toolbar": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-toolbar/-/react-toolbar-1.0.4.tgz",
- "integrity": "sha512-tBgmM/O7a07xbaEkYJWYTXkIdU/1pW4/KZORR43toC/4XWyBCURK0ei9kMUdp+gTPPKBgYLxXmRSH1EVcIDp8Q==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@radix-ui/primitive": "1.0.1",
- "@radix-ui/react-context": "1.0.1",
- "@radix-ui/react-direction": "1.0.1",
- "@radix-ui/react-primitive": "1.0.3",
- "@radix-ui/react-roving-focus": "1.0.4",
- "@radix-ui/react-separator": "1.0.3",
- "@radix-ui/react-toggle-group": "1.0.4"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0",
- "react-dom": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
"node_modules/@radix-ui/react-use-callback-ref": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz",
@@ -9392,95 +8995,6 @@
}
}
},
- "node_modules/@radix-ui/react-use-previous": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-previous/-/react-use-previous-1.0.1.tgz",
- "integrity": "sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.10"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-use-rect": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.1.tgz",
- "integrity": "sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@radix-ui/rect": "1.0.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-use-size": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.1.tgz",
- "integrity": "sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@radix-ui/react-use-layout-effect": "1.0.1"
- },
- "peerDependencies": {
- "@types/react": "*",
- "react": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/react-visually-hidden": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.0.3.tgz",
- "integrity": "sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.10",
- "@radix-ui/react-primitive": "1.0.3"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-dom": "*",
- "react": "^16.8 || ^17.0 || ^18.0",
- "react-dom": "^16.8 || ^17.0 || ^18.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/@radix-ui/rect": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.1.tgz",
- "integrity": "sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==",
- "dev": true,
- "dependencies": {
- "@babel/runtime": "^7.13.10"
- }
- },
"node_modules/@react-native-clipboard/clipboard": {
"version": "1.11.2",
"resolved": "https://registry.npmjs.org/@react-native-clipboard/clipboard/-/clipboard-1.11.2.tgz",
@@ -11874,12 +11388,12 @@
}
},
"node_modules/@storybook/addon-a11y": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-7.6.15.tgz",
- "integrity": "sha512-8PxRMBJUSxNoceo2IYXFyZp3VU+/ONK/DsD0dj/fVrv7izFrS8aw2GWSsSMK8xAbEUpANXWMKGaSyvrRFVgsVQ==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-8.0.10.tgz",
+ "integrity": "sha512-ymeTRE1uWplifWUMc3tO5lLGn4buS/hUVWKRM11SqugmxRym55B4thCJU089HAEMY+V/imiCeOE63TT+DGsk8g==",
"dev": true,
"dependencies": {
- "@storybook/addon-highlight": "7.6.15",
+ "@storybook/addon-highlight": "8.0.10",
"axe-core": "^4.2.0"
},
"funding": {
@@ -11888,12 +11402,12 @@
}
},
"node_modules/@storybook/addon-actions": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.6.15.tgz",
- "integrity": "sha512-2Jfvbahe/tmq1iNnNxmcP0JnX0rqCuijjXXai9yMDV3koIMawn6t88MPVrdcso5ch/fxE45522nZqA3SZJbM4g==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.0.10.tgz",
+ "integrity": "sha512-IEuc30UAFl7Ws0GwaY/whjBnGaViVEVjmPc+MXUym2wwwJbnCbI+BKJxPoYi/I7QJb5aUNToAE6pl2pDda2g3Q==",
"dev": true,
"dependencies": {
- "@storybook/core-events": "7.6.15",
+ "@storybook/core-events": "8.0.10",
"@storybook/global": "^5.0.0",
"@types/uuid": "^9.0.1",
"dequal": "^2.0.2",
@@ -11912,12 +11426,12 @@
"dev": true
},
"node_modules/@storybook/addon-controls": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.6.15.tgz",
- "integrity": "sha512-HXcG/Lr4ri7WUFz14Y5lEBTA1XmKy0E/DepW88XVy6YNsTpERVWEBcvjKoLAU1smKrfhVto96hK2AVFL3A8EBQ==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.0.10.tgz",
+ "integrity": "sha512-MAUtIJGayNSsfn3VZ6SjQwpRkb4ky+10oVfos+xX9GQ5+7RCs+oYMuE4+aiQvvfXNdV8v0pUGPUPeUzqfJmhOA==",
"dev": true,
"dependencies": {
- "@storybook/blocks": "7.6.15",
+ "@storybook/blocks": "8.0.10",
"lodash": "^4.17.21",
"ts-dedent": "^2.0.0"
},
@@ -11927,38 +11441,35 @@
}
},
"node_modules/@storybook/addon-docs": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.6.15.tgz",
- "integrity": "sha512-UPODqO+mrYaKyTSAtfRslxOFgSP/v/5vfDx896pbNTC4Sf8xLytoudw4I14hzkHmRdXiOnd21FqXJfmF/Onsvw==",
- "dev": true,
- "dependencies": {
- "@jest/transform": "^29.3.1",
- "@mdx-js/react": "^2.1.5",
- "@storybook/blocks": "7.6.15",
- "@storybook/client-logger": "7.6.15",
- "@storybook/components": "7.6.15",
- "@storybook/csf-plugin": "7.6.15",
- "@storybook/csf-tools": "7.6.15",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.0.10.tgz",
+ "integrity": "sha512-y+Agoez/hXZHKUMIZHU96T5V1v0cs4ArSNfjqDg9DPYcyQ88ihJNb6ZabIgzmEaJF/NncCW+LofWeUtkTwalkw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@mdx-js/react": "^3.0.0",
+ "@storybook/blocks": "8.0.10",
+ "@storybook/client-logger": "8.0.10",
+ "@storybook/components": "8.0.10",
+ "@storybook/csf-plugin": "8.0.10",
+ "@storybook/csf-tools": "8.0.10",
"@storybook/global": "^5.0.0",
- "@storybook/mdx2-csf": "^1.0.0",
- "@storybook/node-logger": "7.6.15",
- "@storybook/postinstall": "7.6.15",
- "@storybook/preview-api": "7.6.15",
- "@storybook/react-dom-shim": "7.6.15",
- "@storybook/theming": "7.6.15",
- "@storybook/types": "7.6.15",
+ "@storybook/node-logger": "8.0.10",
+ "@storybook/preview-api": "8.0.10",
+ "@storybook/react-dom-shim": "8.0.10",
+ "@storybook/theming": "8.0.10",
+ "@storybook/types": "8.0.10",
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"fs-extra": "^11.1.0",
- "remark-external-links": "^8.0.0",
- "remark-slug": "^6.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "rehype-external-links": "^3.0.0",
+ "rehype-slug": "^6.0.0",
"ts-dedent": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/@storybook/addon-docs/node_modules/fs-extra": {
@@ -11997,9 +11508,9 @@
}
},
"node_modules/@storybook/addon-highlight": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.6.15.tgz",
- "integrity": "sha512-ptidWZJJcEM83YsxCjf+m1q8Rr9sN8piJ4PJlM2vyc4MLZY4q6htb1JJFeq3ov1Iz6SY9KjKc/zOkWo4L54nxw==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.0.10.tgz",
+ "integrity": "sha512-40GB82t1e2LCCjqXcC6Z5lq1yIpA1+Yl5E2tKeggOVwg5HHAX02ESNDdBaIOlCqMkU3WKzjGPurDNOLUAbsV2g==",
"dev": true,
"dependencies": {
"@storybook/global": "^5.0.0"
@@ -12010,9 +11521,9 @@
}
},
"node_modules/@storybook/addon-toolbars": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.6.15.tgz",
- "integrity": "sha512-QougKS2eABB5Jd332i9tBpKgh2lN4aaqXkvmVC5egT5dOuJ9IeuZbGwiALef/uf1f3IuyUP41So9l2dI4u19aw==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.0.10.tgz",
+ "integrity": "sha512-67HP6mTJU/gjRju01Z5HjeqoRiJMDlrMvMvjGBg7w5+tPNtjYqdelfe2+kcfU+Hf6dfcuqaBDwaUUGSv+RYtRQ==",
"dev": true,
"funding": {
"type": "opencollective",
@@ -12020,9 +11531,9 @@
}
},
"node_modules/@storybook/addon-viewport": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.6.15.tgz",
- "integrity": "sha512-0esg0+onJftU2prD3n/sbxBTrTOIGQnZhbrKPP+/S26dVHuYaR/65XdwpRgXNY5PHK2yjU78HxiJP+Kyu75ntw==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.0.10.tgz",
+ "integrity": "sha512-NJ88Nd/tXreHLyLeF3VP+b8Fu2KtUuJ0L4JYpEMmcdaejGARTrJJOU+pcZBiUqEHFeXQ8rDY8DKXhUJZQFQ1Wg==",
"dev": true,
"dependencies": {
"memoizerific": "^1.11.3"
@@ -12032,28 +11543,42 @@
"url": "https://opencollective.com/storybook"
}
},
+ "node_modules/@storybook/addon-webpack5-compiler-babel": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-webpack5-compiler-babel/-/addon-webpack5-compiler-babel-3.0.3.tgz",
+ "integrity": "sha512-rVQTTw+oxJltbVKaejIWSHwVKOBJs3au21f/pYXhV0aiNgNhxEa3vr79t/j0j8ox8uJtzM8XYOb7FlkvGfHlwQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.23.7",
+ "babel-loader": "^9.1.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@storybook/blocks": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.6.15.tgz",
- "integrity": "sha512-ODP7AVh2iIGblI5WKGokWSHbp9YQHc+Uce7JCGcnDbNavoy64Z6R6G+wXzF5jfl7xQlbhQ8yQCuSSL4GNdYTeA==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.0.10.tgz",
+ "integrity": "sha512-LOaxvcO2d4dT4YoWlQ0bq/c8qA3aHoqtyuvBjwbVn+359bjMtgj/91YuP9Y2+ggZZ4p+ttgvk39PcmJlNXlJsw==",
"dev": true,
"dependencies": {
- "@storybook/channels": "7.6.15",
- "@storybook/client-logger": "7.6.15",
- "@storybook/components": "7.6.15",
- "@storybook/core-events": "7.6.15",
- "@storybook/csf": "^0.1.2",
- "@storybook/docs-tools": "7.6.15",
+ "@storybook/channels": "8.0.10",
+ "@storybook/client-logger": "8.0.10",
+ "@storybook/components": "8.0.10",
+ "@storybook/core-events": "8.0.10",
+ "@storybook/csf": "^0.1.4",
+ "@storybook/docs-tools": "8.0.10",
"@storybook/global": "^5.0.0",
- "@storybook/manager-api": "7.6.15",
- "@storybook/preview-api": "7.6.15",
- "@storybook/theming": "7.6.15",
- "@storybook/types": "7.6.15",
+ "@storybook/icons": "^1.2.5",
+ "@storybook/manager-api": "8.0.10",
+ "@storybook/preview-api": "8.0.10",
+ "@storybook/theming": "8.0.10",
+ "@storybook/types": "8.0.10",
"@types/lodash": "^4.14.167",
"color-convert": "^2.0.1",
"dequal": "^2.0.2",
"lodash": "^4.17.21",
- "markdown-to-jsx": "^7.1.8",
+ "markdown-to-jsx": "7.3.2",
"memoizerific": "^1.11.3",
"polished": "^4.2.2",
"react-colorful": "^5.1.2",
@@ -12069,6 +11594,14 @@
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
}
},
"node_modules/@storybook/blocks/node_modules/color-convert": {
@@ -12090,24 +11623,22 @@
"dev": true
},
"node_modules/@storybook/builder-manager": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.6.15.tgz",
- "integrity": "sha512-vfpfCywiasyP7vtbgLJhjssBEwUjZhBsRsubDAzumgOochPiKKPNwsSc5NU/4ZIGaC5zRO26kUaUqFIbJdTEUQ==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-8.0.10.tgz",
+ "integrity": "sha512-lo57jeeYuYCKYrmGOdLg25rMyiGYSTwJ+zYsQ3RvClVICjP6X0I1RCKAJDzkI0BixH6s1+w5ynD6X3PtDnhUuw==",
"dev": true,
"dependencies": {
"@fal-works/esbuild-plugin-global-externals": "^2.1.2",
- "@storybook/core-common": "7.6.15",
- "@storybook/manager": "7.6.15",
- "@storybook/node-logger": "7.6.15",
+ "@storybook/core-common": "8.0.10",
+ "@storybook/manager": "8.0.10",
+ "@storybook/node-logger": "8.0.10",
"@types/ejs": "^3.1.1",
- "@types/find-cache-dir": "^3.2.1",
"@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10",
"browser-assert": "^1.2.1",
"ejs": "^3.1.8",
- "esbuild": "^0.18.0",
+ "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0",
"esbuild-plugin-alias": "^0.2.1",
"express": "^4.17.3",
- "find-cache-dir": "^3.0.0",
"fs-extra": "^11.1.0",
"process": "^0.11.10",
"util": "^0.12.4"
@@ -12117,36 +11648,6 @@
"url": "https://opencollective.com/storybook"
}
},
- "node_modules/@storybook/builder-manager/node_modules/find-cache-dir": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
- "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
- "dev": true,
- "dependencies": {
- "commondir": "^1.0.1",
- "make-dir": "^3.0.2",
- "pkg-dir": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
- }
- },
- "node_modules/@storybook/builder-manager/node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/@storybook/builder-manager/node_modules/fs-extra": {
"version": "11.2.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
@@ -12173,99 +11674,6 @@
"graceful-fs": "^4.1.6"
}
},
- "node_modules/@storybook/builder-manager/node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/builder-manager/node_modules/make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "dev": true,
- "dependencies": {
- "semver": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/builder-manager/node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/builder-manager/node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/builder-manager/node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@storybook/builder-manager/node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/builder-manager/node_modules/pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
- "dev": true,
- "dependencies": {
- "find-up": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/builder-manager/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
"node_modules/@storybook/builder-manager/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
@@ -12289,24 +11697,21 @@
}
},
"node_modules/@storybook/builder-webpack5": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-7.6.15.tgz",
- "integrity": "sha512-HF+TSK/eU2ld8uQ8VWgcAIzOQ2hjnEkzup363vGZkYUfsHsVbjMpZgf+foDjI4LZNfQ/RjcVEZxqJqIbpM0Sjg==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.23.2",
- "@storybook/channels": "7.6.15",
- "@storybook/client-logger": "7.6.15",
- "@storybook/core-common": "7.6.15",
- "@storybook/core-events": "7.6.15",
- "@storybook/core-webpack": "7.6.15",
- "@storybook/node-logger": "7.6.15",
- "@storybook/preview": "7.6.15",
- "@storybook/preview-api": "7.6.15",
- "@swc/core": "^1.3.82",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.0.10.tgz",
+ "integrity": "sha512-FrETNEPu9UcZD8yRIQhszcmdMMS73yXRbZFldeZzJ2b8lKNJG+tmqRwh5d5xEMzMrENYkDY+sXheOLSjKfvq9g==",
+ "dev": true,
+ "dependencies": {
+ "@storybook/channels": "8.0.10",
+ "@storybook/client-logger": "8.0.10",
+ "@storybook/core-common": "8.0.10",
+ "@storybook/core-events": "8.0.10",
+ "@storybook/core-webpack": "8.0.10",
+ "@storybook/node-logger": "8.0.10",
+ "@storybook/preview": "8.0.10",
+ "@storybook/preview-api": "8.0.10",
"@types/node": "^18.0.0",
"@types/semver": "^7.3.4",
- "babel-loader": "^9.0.0",
"browser-assert": "^1.2.1",
"case-sensitive-paths-webpack-plugin": "^2.4.0",
"cjs-module-lexer": "^1.2.3",
@@ -12322,14 +11727,13 @@
"process": "^0.11.10",
"semver": "^7.3.7",
"style-loader": "^3.3.1",
- "swc-loader": "^0.2.3",
"terser-webpack-plugin": "^5.3.1",
"ts-dedent": "^2.0.0",
"url": "^0.11.0",
"util": "^0.12.4",
"util-deprecate": "^1.0.2",
"webpack": "5",
- "webpack-dev-middleware": "^6.1.1",
+ "webpack-dev-middleware": "^6.1.2",
"webpack-hot-middleware": "^2.25.1",
"webpack-virtual-modules": "^0.5.0"
},
@@ -12455,15 +11859,14 @@
}
},
"node_modules/@storybook/channels": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.15.tgz",
- "integrity": "sha512-UPDYRzGkygYFa8QUpEiumWrvZm4u4RKVzgiBt9C4RmHORqkkZzL9LXhaZJp2SmIz1ND5gx6KR5ze8ZnAdwxxoQ==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-8.0.10.tgz",
+ "integrity": "sha512-3JLxfD7czlx31dAGvAYJ4J4BNE/Y2+hhj/dsV3xlQTHKVpnWknaoeYEC1a6YScyfsH6W+XmP2rzZKzH4EkLSGQ==",
"dev": true,
"dependencies": {
- "@storybook/client-logger": "7.6.15",
- "@storybook/core-events": "7.6.15",
+ "@storybook/client-logger": "8.0.10",
+ "@storybook/core-events": "8.0.10",
"@storybook/global": "^5.0.0",
- "qs": "^6.10.0",
"telejson": "^7.2.0",
"tiny-invariant": "^1.3.1"
},
@@ -12473,23 +11876,22 @@
}
},
"node_modules/@storybook/cli": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-7.6.15.tgz",
- "integrity": "sha512-2QRqCyVGDSkraHxX2JPYkkFccbu5Uo+JYFaFJo4vmMXzDurjWON+Ga2B8FCTd4A8P4C02Ca/79jgQoyBB3xoew==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-8.0.10.tgz",
+ "integrity": "sha512-KUZEO2lyvOS2sRJEFXovt6+5b65iWsh7F8e8S1cM20fCM1rZAlWtwmoxmDVXDmyEp0wTrq4FrRxKnbo9UO518w==",
"dev": true,
"dependencies": {
- "@babel/core": "^7.23.2",
- "@babel/preset-env": "^7.23.2",
+ "@babel/core": "^7.23.0",
"@babel/types": "^7.23.0",
"@ndelangen/get-tarball": "^3.0.7",
- "@storybook/codemod": "7.6.15",
- "@storybook/core-common": "7.6.15",
- "@storybook/core-events": "7.6.15",
- "@storybook/core-server": "7.6.15",
- "@storybook/csf-tools": "7.6.15",
- "@storybook/node-logger": "7.6.15",
- "@storybook/telemetry": "7.6.15",
- "@storybook/types": "7.6.15",
+ "@storybook/codemod": "8.0.10",
+ "@storybook/core-common": "8.0.10",
+ "@storybook/core-events": "8.0.10",
+ "@storybook/core-server": "8.0.10",
+ "@storybook/csf-tools": "8.0.10",
+ "@storybook/node-logger": "8.0.10",
+ "@storybook/telemetry": "8.0.10",
+ "@storybook/types": "8.0.10",
"@types/semver": "^7.3.4",
"@yarnpkg/fslib": "2.10.3",
"@yarnpkg/libzip": "2.3.0",
@@ -12499,25 +11901,22 @@
"detect-indent": "^6.1.0",
"envinfo": "^7.7.3",
"execa": "^5.0.0",
- "express": "^4.17.3",
"find-up": "^5.0.0",
"fs-extra": "^11.1.0",
"get-npm-tarball-url": "^2.0.3",
- "get-port": "^5.1.1",
"giget": "^1.0.0",
"globby": "^11.0.2",
"jscodeshift": "^0.15.1",
"leven": "^3.1.0",
"ora": "^5.4.1",
- "prettier": "^2.8.0",
+ "prettier": "^3.1.1",
"prompts": "^2.4.0",
- "puppeteer-core": "^2.1.1",
"read-pkg-up": "^7.0.1",
"semver": "^7.3.7",
"strip-json-comments": "^3.0.1",
"tempy": "^1.0.1",
- "ts-dedent": "^2.0.0",
- "util-deprecate": "^1.0.2"
+ "tiny-invariant": "^1.3.1",
+ "ts-dedent": "^2.0.0"
},
"bin": {
"getstorybook": "bin/index.js",
@@ -12528,15 +11927,6 @@
"url": "https://opencollective.com/storybook"
}
},
- "node_modules/@storybook/cli/node_modules/agent-base": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz",
- "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==",
- "dev": true,
- "engines": {
- "node": ">= 6.0.0"
- }
- },
"node_modules/@storybook/cli/node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -12648,26 +12038,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@storybook/cli/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/@storybook/cli/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -12677,19 +12047,6 @@
"node": ">=8"
}
},
- "node_modules/@storybook/cli/node_modules/https-proxy-agent": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz",
- "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==",
- "dev": true,
- "dependencies": {
- "agent-base": "5",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6.0.0"
- }
- },
"node_modules/@storybook/cli/node_modules/human-signals": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
@@ -12777,18 +12134,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@storybook/cli/node_modules/mime": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
- "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
- "dev": true,
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
"node_modules/@storybook/cli/node_modules/mimic-fn": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
@@ -12882,47 +12227,25 @@
}
},
"node_modules/@storybook/cli/node_modules/prettier": {
- "version": "2.8.8",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
- "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
+ "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
"dev": true,
"bin": {
- "prettier": "bin-prettier.js"
+ "prettier": "bin/prettier.cjs"
},
"engines": {
- "node": ">=10.13.0"
+ "node": ">=14"
},
"funding": {
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
- "node_modules/@storybook/cli/node_modules/puppeteer-core": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-2.1.1.tgz",
- "integrity": "sha512-n13AWriBMPYxnpbb6bnaY5YoY6rGj8vPLrz6CZF3o0qJNEwlcfJVxBzYZ0NJsQ21UbdJoijPCDrM++SUVEz7+w==",
- "dev": true,
- "dependencies": {
- "@types/mime-types": "^2.1.0",
- "debug": "^4.1.0",
- "extract-zip": "^1.6.6",
- "https-proxy-agent": "^4.0.0",
- "mime": "^2.0.3",
- "mime-types": "^2.1.25",
- "progress": "^2.0.1",
- "proxy-from-env": "^1.0.0",
- "rimraf": "^2.6.1",
- "ws": "^6.1.0"
- },
- "engines": {
- "node": ">=8.16.0"
- }
- },
"node_modules/@storybook/cli/node_modules/recast": {
"version": "0.23.9",
"resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz",
"integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==",
"dev": true,
- "license": "MIT",
"dependencies": {
"ast-types": "^0.16.1",
"esprima": "~4.0.0",
@@ -12947,18 +12270,6 @@
"node": ">=8"
}
},
- "node_modules/@storybook/cli/node_modules/rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- }
- },
"node_modules/@storybook/cli/node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -12992,20 +12303,10 @@
"node": ">= 10.0.0"
}
},
- "node_modules/@storybook/cli/node_modules/ws": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz",
- "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "async-limiter": "~1.0.0"
- }
- },
"node_modules/@storybook/client-logger": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.15.tgz",
- "integrity": "sha512-n+K8IqnombqiQNnywVovS+lK61tvv/XSfgPt0cgvoF/hJZB0VDOMRjWsV+v9qQpj1TQEl1lLWeJwZMthTWupJA==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-8.0.10.tgz",
+ "integrity": "sha512-u38SbZNAunZzxZNHMJb9jkUwFkLyWxmvp4xtiRM3u9sMUShXoTnzbw1yKrxs+kYJjg+58UQPZ1JhEBRcHt5Oww==",
"dev": true,
"dependencies": {
"@storybook/global": "^5.0.0"
@@ -13016,25 +12317,26 @@
}
},
"node_modules/@storybook/codemod": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.6.15.tgz",
- "integrity": "sha512-NiEbTLCdacj6TMxC7G49IImXeMzkG8wpPr8Ayxm9HeG6q5UkiF5/DiZdqbJm2zaosOsOKWwvXg1t6Pq6Nivytg==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-8.0.10.tgz",
+ "integrity": "sha512-t45jKGs/eyR/nKVX6QgRtMZSAjJo5aXWWk3B24xVbW6ywr0jt1LC100FkHG4Af8cApIfh8uUmS9X05hMG5zGGA==",
"dev": true,
"dependencies": {
"@babel/core": "^7.23.2",
"@babel/preset-env": "^7.23.2",
"@babel/types": "^7.23.0",
- "@storybook/csf": "^0.1.2",
- "@storybook/csf-tools": "7.6.15",
- "@storybook/node-logger": "7.6.15",
- "@storybook/types": "7.6.15",
+ "@storybook/csf": "^0.1.4",
+ "@storybook/csf-tools": "8.0.10",
+ "@storybook/node-logger": "8.0.10",
+ "@storybook/types": "8.0.10",
"@types/cross-spawn": "^6.0.2",
"cross-spawn": "^7.0.3",
"globby": "^11.0.2",
"jscodeshift": "^0.15.1",
"lodash": "^4.17.21",
- "prettier": "^2.8.0",
- "recast": "^0.23.1"
+ "prettier": "^3.1.1",
+ "recast": "^0.23.5",
+ "tiny-invariant": "^1.3.1"
},
"funding": {
"type": "opencollective",
@@ -13106,15 +12408,15 @@
}
},
"node_modules/@storybook/codemod/node_modules/prettier": {
- "version": "2.8.8",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
- "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
+ "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
"dev": true,
"bin": {
- "prettier": "bin-prettier.js"
+ "prettier": "bin/prettier.cjs"
},
"engines": {
- "node": ">=10.13.0"
+ "node": ">=14"
},
"funding": {
"url": "https://github.com/prettier/prettier?sponsor=1"
@@ -13125,7 +12427,6 @@
"resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz",
"integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==",
"dev": true,
- "license": "MIT",
"dependencies": {
"ast-types": "^0.16.1",
"esprima": "~4.0.0",
@@ -13150,20 +12451,19 @@
}
},
"node_modules/@storybook/components": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/components/-/components-7.6.15.tgz",
- "integrity": "sha512-xD+maP7+C9HeZXi2vJ+uK9hXN4S4spP4uDj9pyZ9yViKb+ztEO6WpovUMT8WRQ0mMegWyLXkx3zqu43hZvXM1g==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.0.10.tgz",
+ "integrity": "sha512-eo+oDDcm35YBB3dtDYDfcjJypNVPmRty85VWpAOBsJXpwp/fgU8csx0DM3KmhrQ4cWLf2WzcFowJwI1w+J88Sw==",
"dev": true,
"dependencies": {
- "@radix-ui/react-select": "^1.2.2",
- "@radix-ui/react-toolbar": "^1.0.4",
- "@storybook/client-logger": "7.6.15",
- "@storybook/csf": "^0.1.2",
+ "@radix-ui/react-slot": "^1.0.2",
+ "@storybook/client-logger": "8.0.10",
+ "@storybook/csf": "^0.1.4",
"@storybook/global": "^5.0.0",
- "@storybook/theming": "7.6.15",
- "@storybook/types": "7.6.15",
+ "@storybook/icons": "^1.2.5",
+ "@storybook/theming": "8.0.10",
+ "@storybook/types": "8.0.10",
"memoizerific": "^1.11.3",
- "use-resize-observer": "^9.1.0",
"util-deprecate": "^1.0.2"
},
"funding": {
@@ -13175,36 +12475,23 @@
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
- "node_modules/@storybook/core-client": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.15.tgz",
- "integrity": "sha512-jwWol+zo+ItKBzPm9i80bEL6seHMsV0wKSaViVMQ4TqHtEbNeFE8sFEc2NTr18VNBnQOdlQPnEWmdboXBUrGcA==",
- "dev": true,
- "dependencies": {
- "@storybook/client-logger": "7.6.15",
- "@storybook/preview-api": "7.6.15"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
"node_modules/@storybook/core-common": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.15.tgz",
- "integrity": "sha512-VGmcLJ5U1r1s8/YnLbKcyB4GnNL+/sZIPqwlcSKzDXO76HoVFv1kywf7PbASote7P3gdhLSxBdg95LH2bdIbmw==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-8.0.10.tgz",
+ "integrity": "sha512-hsFlPieputaDQoxstnPa3pykTc4bUwEDgCHf8U43+/Z7qmLOQ9fpG+2CFW930rsCRghYpPreOvsmhY7lsGKWLQ==",
"dev": true,
"dependencies": {
- "@storybook/core-events": "7.6.15",
- "@storybook/node-logger": "7.6.15",
- "@storybook/types": "7.6.15",
- "@types/find-cache-dir": "^3.2.1",
- "@types/node": "^18.0.0",
- "@types/node-fetch": "^2.6.4",
- "@types/pretty-hrtime": "^1.0.0",
+ "@storybook/core-events": "8.0.10",
+ "@storybook/csf-tools": "8.0.10",
+ "@storybook/node-logger": "8.0.10",
+ "@storybook/types": "8.0.10",
+ "@yarnpkg/fslib": "2.10.3",
+ "@yarnpkg/libzip": "2.3.0",
"chalk": "^4.1.0",
- "esbuild": "^0.18.0",
+ "cross-spawn": "^7.0.3",
+ "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0",
"esbuild-register": "^3.5.0",
+ "execa": "^5.0.0",
"file-system-cache": "2.3.0",
"find-cache-dir": "^3.0.0",
"find-up": "^5.0.0",
@@ -13217,7 +12504,11 @@
"pkg-dir": "^5.0.0",
"pretty-hrtime": "^1.0.3",
"resolve-from": "^5.0.0",
- "ts-dedent": "^2.0.0"
+ "semver": "^7.3.7",
+ "tempy": "^1.0.1",
+ "tiny-invariant": "^1.3.1",
+ "ts-dedent": "^2.0.0",
+ "util": "^0.12.4"
},
"funding": {
"type": "opencollective",
@@ -13233,6 +12524,29 @@
"balanced-match": "^1.0.0"
}
},
+ "node_modules/@storybook/core-common/node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
"node_modules/@storybook/core-common/node_modules/find-cache-dir": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
@@ -13344,12 +12658,23 @@
"node": ">=14.14"
}
},
+ "node_modules/@storybook/core-common/node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@storybook/core-common/node_modules/glob": {
"version": "10.4.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
"integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
"dev": true,
- "license": "ISC",
"dependencies": {
"foreground-child": "^3.1.0",
"jackspeak": "^3.1.2",
@@ -13365,6 +12690,27 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/@storybook/core-common/node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/@storybook/core-common/node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@storybook/core-common/node_modules/jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
@@ -13407,12 +12753,29 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/@storybook/core-common/node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@storybook/core-common/node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/@storybook/core-common/node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
- "license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
@@ -13428,11 +12791,37 @@
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
"dev": true,
- "license": "ISC",
"engines": {
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/@storybook/core-common/node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@storybook/core-common/node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@storybook/core-common/node_modules/p-locate": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
@@ -13466,6 +12855,15 @@
"node": ">=8"
}
},
+ "node_modules/@storybook/core-common/node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/@storybook/core-common/node_modules/pkg-dir": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
@@ -13487,15 +12885,6 @@
"node": ">=8"
}
},
- "node_modules/@storybook/core-common/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
"node_modules/@storybook/core-common/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
@@ -13505,10 +12894,23 @@
"node": ">= 10.0.0"
}
},
+ "node_modules/@storybook/core-common/node_modules/util": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+ "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "which-typed-array": "^1.1.2"
+ }
+ },
"node_modules/@storybook/core-events": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.15.tgz",
- "integrity": "sha512-i4YnjGecbpGyrFe0340sPhQ9QjZZEBqvMy6kF4XWt6DYLHxZmsTj1HEdvxVl4Ej7V49Vw0Dm8MepJ1d4Y8MKrQ==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-8.0.10.tgz",
+ "integrity": "sha512-TuHPS6p5ZNr4vp4butLb4R98aFx0NRYCI/7VPhJEUH5rPiqNzE3PZd8DC8rnVxavsJ+jO1/y+egNKXRYkEcoPQ==",
"dev": true,
"dependencies": {
"ts-dedent": "^2.0.0"
@@ -13519,26 +12921,28 @@
}
},
"node_modules/@storybook/core-server": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.6.15.tgz",
- "integrity": "sha512-iIlxEAkrmKTSA3iGNqt/4QG7hf5suxBGYIB3DZAOfBo8EdZogMYaEmuCm5dbuaJr0mcVwlqwdhQiWb1VsR/NhA==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-8.0.10.tgz",
+ "integrity": "sha512-HYDw2QFBxg1X/d6g0rUhirOB5Jq6g90HBnyrZzxKoqKWJCNsCADSgM+h9HgtUw0jA97qBpIqmNO9n3mXFPWU/Q==",
"dev": true,
"dependencies": {
"@aw-web-design/x-default-browser": "1.4.126",
+ "@babel/core": "^7.23.9",
"@discoveryjs/json-ext": "^0.5.3",
- "@storybook/builder-manager": "7.6.15",
- "@storybook/channels": "7.6.15",
- "@storybook/core-common": "7.6.15",
- "@storybook/core-events": "7.6.15",
- "@storybook/csf": "^0.1.2",
- "@storybook/csf-tools": "7.6.15",
- "@storybook/docs-mdx": "^0.1.0",
+ "@storybook/builder-manager": "8.0.10",
+ "@storybook/channels": "8.0.10",
+ "@storybook/core-common": "8.0.10",
+ "@storybook/core-events": "8.0.10",
+ "@storybook/csf": "^0.1.4",
+ "@storybook/csf-tools": "8.0.10",
+ "@storybook/docs-mdx": "3.0.0",
"@storybook/global": "^5.0.0",
- "@storybook/manager": "7.6.15",
- "@storybook/node-logger": "7.6.15",
- "@storybook/preview-api": "7.6.15",
- "@storybook/telemetry": "7.6.15",
- "@storybook/types": "7.6.15",
+ "@storybook/manager": "8.0.10",
+ "@storybook/manager-api": "8.0.10",
+ "@storybook/node-logger": "8.0.10",
+ "@storybook/preview-api": "8.0.10",
+ "@storybook/telemetry": "8.0.10",
+ "@storybook/types": "8.0.10",
"@types/detect-port": "^1.3.0",
"@types/node": "^18.0.0",
"@types/pretty-hrtime": "^1.0.0",
@@ -13551,7 +12955,7 @@
"express": "^4.17.3",
"fs-extra": "^11.1.0",
"globby": "^11.0.2",
- "ip": "^2.0.0",
+ "ip": "^2.0.1",
"lodash": "^4.17.21",
"open": "^8.4.0",
"pretty-hrtime": "^1.0.3",
@@ -13659,7 +13063,6 @@
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
"integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
"dev": true,
- "license": "MIT",
"dependencies": {
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.1.2"
@@ -13673,7 +13076,6 @@
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
"integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
"dev": true,
- "license": "MIT",
"engines": {
"node": ">=10.0.0"
},
@@ -13691,14 +13093,14 @@
}
},
"node_modules/@storybook/core-webpack": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-7.6.15.tgz",
- "integrity": "sha512-6Qk/kc7OKcy4jNowQFz6TFLWM2NYeLoJ73dIbFnN2o8DYS5WwmQLZhZ+MRvr92M+w1nlnc268kaqooYmAj8Mnw==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.0.10.tgz",
+ "integrity": "sha512-nfhdhulKk0BTQA2e5cuoEpu+mdZawMr7DNnpc29gkTl8sRsED+4TR5HTjWUVCRqMb/a1UNbY4QVe7ozM/rVNdQ==",
"dev": true,
"dependencies": {
- "@storybook/core-common": "7.6.15",
- "@storybook/node-logger": "7.6.15",
- "@storybook/types": "7.6.15",
+ "@storybook/core-common": "8.0.10",
+ "@storybook/node-logger": "8.0.10",
+ "@storybook/types": "8.0.10",
"@types/node": "^18.0.0",
"ts-dedent": "^2.0.0"
},
@@ -13718,12 +13120,12 @@
}
},
"node_modules/@storybook/csf-plugin": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.6.15.tgz",
- "integrity": "sha512-5Pm2B8XKNdG3fHyItWKbWnXHSRDFSvetlML+sMWGWYIjwOsnvPqt+gAvLksWhv/uJgDujGxNcPEh+/Y5C8ZAjQ==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.0.10.tgz",
+ "integrity": "sha512-0EsyEx/06sCjI8sn40r7cABtBU1vUKPMPD+S5mJiZymm73BgdARj0qZOlLoK2LP+t2pcaB/Cn7KX/uyhhv7M2g==",
"dev": true,
"dependencies": {
- "@storybook/csf-tools": "7.6.15",
+ "@storybook/csf-tools": "8.0.10",
"unplugin": "^1.3.1"
},
"funding": {
@@ -13732,19 +13134,19 @@
}
},
"node_modules/@storybook/csf-tools": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.15.tgz",
- "integrity": "sha512-8iKgg2cmbFTpVhRRJOqouhPcEh0c8ywabG4S8ICZvnJooSXUI9mD9p3tYCS7MYuSiHj0epa1Kkn9DtXJRo9o6g==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-8.0.10.tgz",
+ "integrity": "sha512-xUc6fVIKoCujf/7JZhkYjrVXeNsTSoDrZFNmqLEmtfktJVqYdXY4LuSAtlBmAIyETi09ULTuuVexrcKFwjzuBA==",
"dev": true,
"dependencies": {
"@babel/generator": "^7.23.0",
"@babel/parser": "^7.23.0",
"@babel/traverse": "^7.23.2",
"@babel/types": "^7.23.0",
- "@storybook/csf": "^0.1.2",
- "@storybook/types": "7.6.15",
+ "@storybook/csf": "^0.1.4",
+ "@storybook/types": "8.0.10",
"fs-extra": "^11.1.0",
- "recast": "^0.23.1",
+ "recast": "^0.23.5",
"ts-dedent": "^2.0.0"
},
"funding": {
@@ -13783,7 +13185,6 @@
"resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz",
"integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==",
"dev": true,
- "license": "MIT",
"dependencies": {
"ast-types": "^0.16.1",
"esprima": "~4.0.0",
@@ -13817,20 +13218,21 @@
}
},
"node_modules/@storybook/docs-mdx": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-0.1.0.tgz",
- "integrity": "sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-3.0.0.tgz",
+ "integrity": "sha512-NmiGXl2HU33zpwTv1XORe9XG9H+dRUC1Jl11u92L4xr062pZtrShLmD4VKIsOQujxhhOrbxpwhNOt+6TdhyIdQ==",
"dev": true
},
"node_modules/@storybook/docs-tools": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.15.tgz",
- "integrity": "sha512-npZEaI9Wpn9uJcRXFElqyiRw8bSxt95mLywPiEEGMT2kE5FfXM8d5Uj5O64kzoXdRI9IhRPEEZZidOtA/UInfQ==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-8.0.10.tgz",
+ "integrity": "sha512-rg9KS81vEh13VMr4mAgs+7L4kYqoRtG7kVfV1WHxzJxjR3wYcVR0kP9gPTWV4Xha/TA3onHu9sxKxMTWha0urQ==",
"dev": true,
"dependencies": {
- "@storybook/core-common": "7.6.15",
- "@storybook/preview-api": "7.6.15",
- "@storybook/types": "7.6.15",
+ "@storybook/core-common": "8.0.10",
+ "@storybook/core-events": "8.0.10",
+ "@storybook/preview-api": "8.0.10",
+ "@storybook/types": "8.0.10",
"@types/doctrine": "^0.0.3",
"assert": "^2.1.0",
"doctrine": "^3.0.0",
@@ -13885,10 +13287,55 @@
"integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==",
"dev": true
},
+ "node_modules/@storybook/icons": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.3.0.tgz",
+ "integrity": "sha512-Nz/UzeYQdUZUhacrPyfkiiysSjydyjgg/p0P9HxB4p/WaJUUjMAcaoaLgy3EXx61zZJ3iD36WPuDkZs5QYrA0A==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta"
+ }
+ },
+ "node_modules/@storybook/instrumenter": {
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.0.10.tgz",
+ "integrity": "sha512-6IYjWeQFA5x68xRoW5dU4yAc1Hwq1ZBkZbXVgJbr5LJw5x+y8eKdZzIaOmSsSKOI96R7J5YWWd2WA1Q0nRurtg==",
+ "dev": true,
+ "dependencies": {
+ "@storybook/channels": "8.0.10",
+ "@storybook/client-logger": "8.0.10",
+ "@storybook/core-events": "8.0.10",
+ "@storybook/global": "^5.0.0",
+ "@storybook/preview-api": "8.0.10",
+ "@vitest/utils": "^1.3.1",
+ "util": "^0.12.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/instrumenter/node_modules/util": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+ "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "which-typed-array": "^1.1.2"
+ }
+ },
"node_modules/@storybook/manager": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-7.6.15.tgz",
- "integrity": "sha512-GGV2ElV5AOIApy/FSDzoSlLUbyd2VhQVD3TdNGRxNauYRjEO8ulXHw2tNbT6ludtpYpDTAILzI6zT/iag8hmPQ==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-8.0.10.tgz",
+ "integrity": "sha512-bojGglUQNry48L4siURc2zQKswavLzMh69rqsfL3ZXx+i+USfRfB7593azTlaZh0q6HO4bUAjB24RfQCyifLLQ==",
"dev": true,
"funding": {
"type": "opencollective",
@@ -13896,19 +13343,20 @@
}
},
"node_modules/@storybook/manager-api": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.15.tgz",
- "integrity": "sha512-cPBsXcnJiaO3QyaEum2JgdihYea3cI03FeV35JdrBYLIelT4oqbYFnzjznsFg9+Ia9iAbz7aOBNyyRsWnC/UKw==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.0.10.tgz",
+ "integrity": "sha512-LLu6YKQLWf5QB3h3RO8IevjLrSOew7aidIQPr9DIr9xC8wA7N2fQabr+qrJdE306p3cHZ0nzhYNYZxSjm4Dvdw==",
"dev": true,
"dependencies": {
- "@storybook/channels": "7.6.15",
- "@storybook/client-logger": "7.6.15",
- "@storybook/core-events": "7.6.15",
- "@storybook/csf": "^0.1.2",
+ "@storybook/channels": "8.0.10",
+ "@storybook/client-logger": "8.0.10",
+ "@storybook/core-events": "8.0.10",
+ "@storybook/csf": "^0.1.4",
"@storybook/global": "^5.0.0",
- "@storybook/router": "7.6.15",
- "@storybook/theming": "7.6.15",
- "@storybook/types": "7.6.15",
+ "@storybook/icons": "^1.2.5",
+ "@storybook/router": "8.0.10",
+ "@storybook/theming": "8.0.10",
+ "@storybook/types": "8.0.10",
"dequal": "^2.0.2",
"lodash": "^4.17.21",
"memoizerific": "^1.11.3",
@@ -13921,26 +13369,10 @@
"url": "https://opencollective.com/storybook"
}
},
- "node_modules/@storybook/mdx2-csf": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@storybook/mdx2-csf/-/mdx2-csf-1.1.0.tgz",
- "integrity": "sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==",
- "dev": true
- },
"node_modules/@storybook/node-logger": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.15.tgz",
- "integrity": "sha512-C+sCvRjR+5uVU3VTrfyv7/RlPBxesAjIucUAK0keGyIZ7sFQYCPdkm4m/C4s+TcubgAzVvuoUHlRrSppdA7WzQ==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/postinstall": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.6.15.tgz",
- "integrity": "sha512-DXQQ4kjAbQ7BSd9M4lDI/12vEEciYMP8uYFDlrPFjwD9LezsxtRiORkazjNRRX4730faO5zZsnWhXxCVkxck0g==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-8.0.10.tgz",
+ "integrity": "sha512-UMmaUaA3VOX/mKLsSvOnbZre2/1tZ6hazA6H0eAnClKb51jRD1AJrsBYK+uHr/CAp7t710bB5U8apPov7hayDw==",
"dev": true,
"funding": {
"type": "opencollective",
@@ -13948,50 +13380,60 @@
}
},
"node_modules/@storybook/preset-react-webpack": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-7.6.15.tgz",
- "integrity": "sha512-Oo3J7RKO/tFUVnRXs16tZGcX6n90gTpHdlT2Z1fZ+y8wEd9o+VvvKFEIIeMcRxf3hHa49R6Kbc4AQaE9FAuDlw==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-8.0.10.tgz",
+ "integrity": "sha512-+I0x8snLl9sfc3xXh51YLXwp0Km4Jhri+JJeT2r+zSI3k/fdu5bLz5NFPcxDmRm5ZPpaQyiLc2Mge4txMkFsZw==",
"dev": true,
"dependencies": {
- "@babel/preset-flow": "^7.22.15",
- "@babel/preset-react": "^7.22.15",
- "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11",
- "@storybook/core-webpack": "7.6.15",
- "@storybook/docs-tools": "7.6.15",
- "@storybook/node-logger": "7.6.15",
- "@storybook/react": "7.6.15",
+ "@storybook/core-webpack": "8.0.10",
+ "@storybook/docs-tools": "8.0.10",
+ "@storybook/node-logger": "8.0.10",
+ "@storybook/react": "8.0.10",
"@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0",
"@types/node": "^18.0.0",
"@types/semver": "^7.3.4",
- "babel-plugin-add-react-displayname": "^0.0.5",
+ "find-up": "^5.0.0",
"fs-extra": "^11.1.0",
"magic-string": "^0.30.5",
"react-docgen": "^7.0.0",
- "react-refresh": "^0.14.0",
+ "resolve": "^1.22.8",
"semver": "^7.3.7",
+ "tsconfig-paths": "^4.2.0",
"webpack": "5"
},
"engines": {
- "node": ">=16.0.0"
+ "node": ">=18.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "@babel/core": "^7.22.0",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
},
"peerDependenciesMeta": {
- "@babel/core": {
- "optional": true
- },
"typescript": {
"optional": true
}
}
},
+ "node_modules/@storybook/preset-react-webpack/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@storybook/preset-react-webpack/node_modules/fs-extra": {
"version": "11.2.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
@@ -14018,6 +13460,68 @@
"graceful-fs": "^4.1.6"
}
},
+ "node_modules/@storybook/preset-react-webpack/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@storybook/preset-react-webpack/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@storybook/preset-react-webpack/node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@storybook/preset-react-webpack/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@storybook/preset-react-webpack/node_modules/tsconfig-paths": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz",
+ "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==",
+ "dev": true,
+ "dependencies": {
+ "json5": "^2.2.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/@storybook/preset-react-webpack/node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
@@ -14028,9 +13532,9 @@
}
},
"node_modules/@storybook/preview": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.15.tgz",
- "integrity": "sha512-q8d9v0+Bo/DHLV68OyV3Klep4knf2GAbrlHhLW1X4jlPccuEDUojIfqfK7m48ayeIxJzO48fcO0JdKM1XABx7g==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-8.0.10.tgz",
+ "integrity": "sha512-op7gZqop8PSFyPA4tc1Zds8jG6VnskwpYUUsa44pZoEez9PKEFCf4jE+7AQwbBS3hnuCb0CKBfASN8GRyoznbw==",
"dev": true,
"funding": {
"type": "opencollective",
@@ -14038,23 +13542,23 @@
}
},
"node_modules/@storybook/preview-api": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.15.tgz",
- "integrity": "sha512-2KN9vlizF6sFlYsJEGnFqcQaJXs4TTdawC1VazVdtaMSHANDxxDu8F1cP+u7lpPH3DkNZUmTGQDBYfYY9xR0eQ==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.0.10.tgz",
+ "integrity": "sha512-uZ6btF7Iloz9TnDcKLQ5ydi2YK0cnulv/8FLQhBCwSrzLLLb+T2DGz0cAeuWZEvMUNWNmkWJ9PAFQFs09/8p/Q==",
"dev": true,
"dependencies": {
- "@storybook/channels": "7.6.15",
- "@storybook/client-logger": "7.6.15",
- "@storybook/core-events": "7.6.15",
- "@storybook/csf": "^0.1.2",
+ "@storybook/channels": "8.0.10",
+ "@storybook/client-logger": "8.0.10",
+ "@storybook/core-events": "8.0.10",
+ "@storybook/csf": "^0.1.4",
"@storybook/global": "^5.0.0",
- "@storybook/types": "7.6.15",
+ "@storybook/types": "8.0.10",
"@types/qs": "^6.9.5",
"dequal": "^2.0.2",
"lodash": "^4.17.21",
"memoizerific": "^1.11.3",
"qs": "^6.10.0",
- "synchronous-promise": "^2.0.15",
+ "tiny-invariant": "^1.3.1",
"ts-dedent": "^2.0.0",
"util-deprecate": "^1.0.2"
},
@@ -14064,18 +13568,17 @@
}
},
"node_modules/@storybook/react": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/react/-/react-7.6.15.tgz",
- "integrity": "sha512-oJMSh4iTGu6OqCmj0LhkuPyMkxGMTCoohN4HcDpXd96jCSyWotVebRsg9xm5ddB7f54e6DY4XDoGH0WnVoR23g==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.0.10.tgz",
+ "integrity": "sha512-/MIMc02TNmiNXDzk55dm9+ujfNE5LVNeqqK+vxXWLlCZ0aXRAd1/ZLYeRFuYLgEETB7mh7IP8AXjvM68NX5HYg==",
"dev": true,
"dependencies": {
- "@storybook/client-logger": "7.6.15",
- "@storybook/core-client": "7.6.15",
- "@storybook/docs-tools": "7.6.15",
+ "@storybook/client-logger": "8.0.10",
+ "@storybook/docs-tools": "8.0.10",
"@storybook/global": "^5.0.0",
- "@storybook/preview-api": "7.6.15",
- "@storybook/react-dom-shim": "7.6.15",
- "@storybook/types": "7.6.15",
+ "@storybook/preview-api": "8.0.10",
+ "@storybook/react-dom-shim": "8.0.10",
+ "@storybook/types": "8.0.10",
"@types/escodegen": "^0.0.6",
"@types/estree": "^0.0.51",
"@types/node": "^18.0.0",
@@ -14087,12 +13590,13 @@
"lodash": "^4.17.21",
"prop-types": "^15.7.2",
"react-element-to-jsx-string": "^15.0.0",
+ "semver": "^7.3.7",
"ts-dedent": "^2.0.0",
"type-fest": "~2.19",
"util-deprecate": "^1.0.2"
},
"engines": {
- "node": ">=16.0.0"
+ "node": ">=18.0.0"
},
"funding": {
"type": "opencollective",
@@ -14101,7 +13605,7 @@
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "typescript": "*"
+ "typescript": ">= 4.2.x"
},
"peerDependenciesMeta": {
"typescript": {
@@ -14252,9 +13756,9 @@
}
},
"node_modules/@storybook/react-dom-shim": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.15.tgz",
- "integrity": "sha512-2+X0HIxIyvjfSKVyGGjSJJLEFJ2ox7Rr8FjlMiRo5QfoOJhohZuWH7p4Lw7JMwm5PotnjrwlfsZI3cCilYJeYA==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.0.10.tgz",
+ "integrity": "sha512-3x8EWEkZebpWpp1pwXEzdabGINwOQt8odM5+hsOlDRtFZBmUqmmzK0rtn7orlcGlOXO4rd6QuZj4Tc5WV28dVQ==",
"dev": true,
"funding": {
"type": "opencollective",
@@ -14266,33 +13770,29 @@
}
},
"node_modules/@storybook/react-webpack5": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-7.6.15.tgz",
- "integrity": "sha512-TyYYSDho+4cQRBCVMKu7XDTCrAsLWaeldCoZm910e4DTXZUV3NDG8hVJIXzweaCu1o7JtDOelxsA6iizR/22GQ==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-8.0.10.tgz",
+ "integrity": "sha512-KqQTYiFBTfWJOKP4SxirXRNLYCaLxFlDmEyUjQHuBbA03fEnvTYlCR7Kv5leArvBTiMpat2IfPqXlc048PKFRw==",
"dev": true,
"dependencies": {
- "@storybook/builder-webpack5": "7.6.15",
- "@storybook/preset-react-webpack": "7.6.15",
- "@storybook/react": "7.6.15",
+ "@storybook/builder-webpack5": "8.0.10",
+ "@storybook/preset-react-webpack": "8.0.10",
+ "@storybook/react": "8.0.10",
"@types/node": "^18.0.0"
},
"engines": {
- "node": ">=16.0.0"
+ "node": ">=18.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "@babel/core": "^7.22.0",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "typescript": "*"
+ "typescript": ">= 4.2.x"
},
"peerDependenciesMeta": {
- "@babel/core": {
- "optional": true
- },
"typescript": {
"optional": true
}
@@ -14329,12 +13829,12 @@
}
},
"node_modules/@storybook/router": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/router/-/router-7.6.15.tgz",
- "integrity": "sha512-5yhXXoVZ1iKUgeZoO8PGqBclrLgoJisxIYVK/Y1iJMXZ2ZvwUiTswLALT6lu97tSrcoBVxmqSghg0+U0YEU4Fg==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/router/-/router-8.0.10.tgz",
+ "integrity": "sha512-AZhgiet+EK0ZsPbaDgbbVTAHW2LAMCP1z/Un2uMBbdDeD0Ys29Af47AbEj/Ome5r1cqasLvzq2WXJlVXPNB0Zw==",
"dev": true,
"dependencies": {
- "@storybook/client-logger": "7.6.15",
+ "@storybook/client-logger": "8.0.10",
"memoizerific": "^1.11.3",
"qs": "^6.10.0"
},
@@ -14344,16 +13844,16 @@
}
},
"node_modules/@storybook/source-loader": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-7.6.15.tgz",
- "integrity": "sha512-E7LqjfvEUs2dn8ZWc1OfqzXU3vyi2/yP7rPHPRFjDUIpz1QI4IUCUIFY+n3YWkbk8wlmf6dV/2QYzYZPp6RD0g==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-8.0.10.tgz",
+ "integrity": "sha512-bv9FRPzELjcoMJLWLDqkUNh1zY0DiCgcvM+9qsZva8pxAD4fzrX+mgCS2vZVJHRg8wMAhw/ymdXixDUodHAvsw==",
"dev": true,
"dependencies": {
- "@storybook/csf": "^0.1.2",
- "@storybook/types": "7.6.15",
+ "@storybook/csf": "^0.1.4",
+ "@storybook/types": "8.0.10",
"estraverse": "^5.2.0",
"lodash": "^4.17.21",
- "prettier": "^2.8.0"
+ "prettier": "^3.1.1"
},
"funding": {
"type": "opencollective",
@@ -14370,29 +13870,29 @@
}
},
"node_modules/@storybook/source-loader/node_modules/prettier": {
- "version": "2.8.8",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
- "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
+ "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
"dev": true,
"bin": {
- "prettier": "bin-prettier.js"
+ "prettier": "bin/prettier.cjs"
},
"engines": {
- "node": ">=10.13.0"
+ "node": ">=14"
},
"funding": {
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
"node_modules/@storybook/telemetry": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.6.15.tgz",
- "integrity": "sha512-klhKXLUS3OXozGEtMbbhKZLDfm+m3nNk2jvGwD6kkBenzFUzb0P2m8awxU7h1pBcKZKH/27U9t3KVzNFzWoWPw==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-8.0.10.tgz",
+ "integrity": "sha512-s4Uc+KZQkdmD2d+64Qf8wYknhQZwmjf2CxjIjv9b4KLsU/nyfDheK7Fzd1jhBKb2UQUlLW5HhZkBgs1RsZcDHA==",
"dev": true,
"dependencies": {
- "@storybook/client-logger": "7.6.15",
- "@storybook/core-common": "7.6.15",
- "@storybook/csf-tools": "7.6.15",
+ "@storybook/client-logger": "8.0.10",
+ "@storybook/core-common": "8.0.10",
+ "@storybook/csf-tools": "8.0.10",
"chalk": "^4.1.0",
"detect-package-manager": "^2.0.1",
"fetch-retry": "^5.0.2",
@@ -14439,14 +13939,131 @@
"node": ">= 10.0.0"
}
},
+ "node_modules/@storybook/test": {
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.0.10.tgz",
+ "integrity": "sha512-VqjzKJiOCjaZ0CjLeKygYk8uetiaiKbpIox+BrND9GtpEBHcRZA5AeFY2P1aSCOhsaDwuh4KRBxJWFug7DhWGQ==",
+ "dev": true,
+ "dependencies": {
+ "@storybook/client-logger": "8.0.10",
+ "@storybook/core-events": "8.0.10",
+ "@storybook/instrumenter": "8.0.10",
+ "@storybook/preview-api": "8.0.10",
+ "@testing-library/dom": "^9.3.4",
+ "@testing-library/jest-dom": "^6.4.2",
+ "@testing-library/user-event": "^14.5.2",
+ "@vitest/expect": "1.3.1",
+ "@vitest/spy": "^1.3.1",
+ "util": "^0.12.4"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ }
+ },
+ "node_modules/@storybook/test/node_modules/@testing-library/jest-dom": {
+ "version": "6.6.3",
+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz",
+ "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==",
+ "dev": true,
+ "dependencies": {
+ "@adobe/css-tools": "^4.4.0",
+ "aria-query": "^5.0.0",
+ "chalk": "^3.0.0",
+ "css.escape": "^1.5.1",
+ "dom-accessibility-api": "^0.6.3",
+ "lodash": "^4.17.21",
+ "redent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=14",
+ "npm": ">=6",
+ "yarn": ">=1"
+ }
+ },
+ "node_modules/@storybook/test/node_modules/@testing-library/user-event": {
+ "version": "14.5.2",
+ "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz",
+ "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ },
+ "peerDependencies": {
+ "@testing-library/dom": ">=7.21.4"
+ }
+ },
+ "node_modules/@storybook/test/node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/@storybook/test/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@storybook/test/node_modules/dom-accessibility-api": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
+ "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==",
+ "dev": true
+ },
+ "node_modules/@storybook/test/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@storybook/test/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@storybook/test/node_modules/util": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+ "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "which-typed-array": "^1.1.2"
+ }
+ },
"node_modules/@storybook/theming": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.15.tgz",
- "integrity": "sha512-9PpsHAbUf6o0w33/P3mnb7QheTmfGlTYCismj5HMM1O2/zY0kQK9XcG9W+Cyvu56D/lFC19fz9YHQY8W4AbfnQ==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.0.10.tgz",
+ "integrity": "sha512-7NHt7bMC7lPkwz9KdDpa6DkLoQZz5OV6jsx/qY91kcdLo1rpnRPAiVlJvmWesFxi1oXOpVDpHHllWzf8KDBv8A==",
"dev": true,
"dependencies": {
- "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0",
- "@storybook/client-logger": "7.6.15",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
+ "@storybook/client-logger": "8.0.10",
"@storybook/global": "^5.0.0",
"memoizerific": "^1.11.3"
},
@@ -14457,16 +14074,23 @@
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
}
},
"node_modules/@storybook/types": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/@storybook/types/-/types-7.6.15.tgz",
- "integrity": "sha512-tLH0lK6SXECSfMpKin9bge+7XiHZII17n6jc9ZI1TfSBZJyq3M6VzWh2r1C2lC97FlkcKXjIwM3n8h1xNjnI+A==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/@storybook/types/-/types-8.0.10.tgz",
+ "integrity": "sha512-S/hKS7+SqNnYIehwxdQ4M2nnlfGDdYWAXdtPCVJCmS+YF2amgAxeuisiHbUg7eypds6VL0Oxk/j2nPEHOHk9pg==",
"dev": true,
"dependencies": {
- "@storybook/channels": "7.6.15",
- "@types/babel__core": "^7.0.0",
+ "@storybook/channels": "8.0.10",
"@types/express": "^4.7.0",
"file-system-cache": "2.3.0"
},
@@ -14864,216 +14488,6 @@
"url": "https://github.com/sponsors/gregberge"
}
},
- "node_modules/@swc/core": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.1.tgz",
- "integrity": "sha512-3y+Y8js+e7BbM16iND+6Rcs3jdiL28q3iVtYsCviYSSpP2uUVKkp5sJnCY4pg8AaVvyN7CGQHO7gLEZQ5ByozQ==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "@swc/counter": "^0.1.2",
- "@swc/types": "^0.1.5"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/swc"
- },
- "optionalDependencies": {
- "@swc/core-darwin-arm64": "1.4.1",
- "@swc/core-darwin-x64": "1.4.1",
- "@swc/core-linux-arm-gnueabihf": "1.4.1",
- "@swc/core-linux-arm64-gnu": "1.4.1",
- "@swc/core-linux-arm64-musl": "1.4.1",
- "@swc/core-linux-x64-gnu": "1.4.1",
- "@swc/core-linux-x64-musl": "1.4.1",
- "@swc/core-win32-arm64-msvc": "1.4.1",
- "@swc/core-win32-ia32-msvc": "1.4.1",
- "@swc/core-win32-x64-msvc": "1.4.1"
- },
- "peerDependencies": {
- "@swc/helpers": "^0.5.0"
- },
- "peerDependenciesMeta": {
- "@swc/helpers": {
- "optional": true
- }
- }
- },
- "node_modules/@swc/core-darwin-arm64": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.1.tgz",
- "integrity": "sha512-ePyfx0348UbR4DOAW24TedeJbafnzha8liXFGuQ4bdXtEVXhLfPngprrxKrAddCuv42F9aTxydlF6+adD3FBhA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-darwin-x64": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.1.tgz",
- "integrity": "sha512-eLf4JSe6VkCMdDowjM8XNC5rO+BrgfbluEzAVtKR8L2HacNYukieumN7EzpYCi0uF1BYwu1ku6tLyG2r0VcGxA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-linux-arm-gnueabihf": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.1.tgz",
- "integrity": "sha512-K8VtTLWMw+rkN/jDC9o/Q9SMmzdiHwYo2CfgkwVT29NsGccwmNhCQx6XoYiPKyKGIFKt4tdQnJHKUFzxUqQVtQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-linux-arm64-gnu": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.1.tgz",
- "integrity": "sha512-0e8p4g0Bfkt8lkiWgcdiENH3RzkcqKtpRXIVNGOmVc0OBkvc2tpm2WTx/eoCnes2HpTT4CTtR3Zljj4knQ4Fvw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-linux-arm64-musl": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.1.tgz",
- "integrity": "sha512-b/vWGQo2n7lZVUnSQ7NBq3Qrj85GrAPPiRbpqaIGwOytiFSk8VULFihbEUwDe0rXgY4LDm8z8wkgADZcLnmdUA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-linux-x64-gnu": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.1.tgz",
- "integrity": "sha512-AFMQlvkKEdNi1Vk2GFTxxJzbICttBsOQaXa98kFTeWTnFFIyiIj2w7Sk8XRTEJ/AjF8ia8JPKb1zddBWr9+bEQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-linux-x64-musl": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.1.tgz",
- "integrity": "sha512-QX2MxIECX1gfvUVZY+jk528/oFkS9MAl76e3ZRvG2KC/aKlCQL0KSzcTSm13mOxkDKS30EaGRDRQWNukGpMeRg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-win32-arm64-msvc": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.1.tgz",
- "integrity": "sha512-OklkJYXXI/tntD2zaY8i3iZldpyDw5q+NAP3k9OlQ7wXXf37djRsHLV0NW4+ZNHBjE9xp2RsXJ0jlOJhfgGoFA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-win32-ia32-msvc": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.1.tgz",
- "integrity": "sha512-MBuc3/QfKX9FnLOU7iGN+6yHRTQaPQ9WskiC8s8JFiKQ+7I2p25tay2RplR9dIEEGgVAu6L7auv96LbNTh+FaA==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/core-win32-x64-msvc": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.1.tgz",
- "integrity": "sha512-lu4h4wFBb/bOK6N2MuZwg7TrEpwYXgpQf5R7ObNSXL65BwZ9BG8XRzD+dLJmALu8l5N08rP/TrpoKRoGT4WSxw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@swc/counter": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
- "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
- "dev": true
- },
- "node_modules/@swc/types": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz",
- "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==",
- "dev": true
- },
"node_modules/@szmarczak/http-timer": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
@@ -15113,9 +14527,9 @@
"integrity": "sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw=="
},
"node_modules/@testing-library/dom": {
- "version": "9.3.1",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.1.tgz",
- "integrity": "sha512-0DGPd9AR3+iDTjGoMpxIkAsUihHZ3Ai6CneU6bRRrffXMgzCdlNk43jTrD2/5LT6CBb3MWTP8v510JzYtahD2w==",
+ "version": "9.3.4",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz",
+ "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.10.4",
@@ -15563,9 +14977,9 @@
"dev": true
},
"node_modules/@types/emscripten": {
- "version": "1.39.10",
- "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.10.tgz",
- "integrity": "sha512-TB/6hBkYQJxsZHSqyeuO1Jt0AB/bW6G7rHt9g7lML7SOF6lbgcHvw/Lr+69iqN0qxgXLhWKScAon73JNnptuDw==",
+ "version": "1.39.13",
+ "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.13.tgz",
+ "integrity": "sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==",
"dev": true
},
"node_modules/@types/escodegen": {
@@ -15631,12 +15045,6 @@
"integrity": "sha512-g39Vp8ZJ3D0gXhhkhDidVvdy4QajkF7/PV6HGn23FMaMqE/tLC1JNHUeQ7SshKLsBjucakZsXBLkWULbGLdL5g==",
"dev": true
},
- "node_modules/@types/find-cache-dir": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@types/find-cache-dir/-/find-cache-dir-3.2.1.tgz",
- "integrity": "sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw==",
- "dev": true
- },
"node_modules/@types/find-root": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@types/find-root/-/find-root-1.1.2.tgz",
@@ -15667,6 +15075,15 @@
"resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.45.tgz",
"integrity": "sha512-qkcUlZmX6c4J8q45taBKTL3p+LbITgyx7qhlPYOdOHZB7B31K0mXbP5YA7i7SgDeEGuI9MnumiKPEMrxg8j3KQ=="
},
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
"node_modules/@types/highlight-words-core": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@types/highlight-words-core/-/highlight-words-core-1.2.1.tgz",
@@ -15790,9 +15207,9 @@
"license": "MIT"
},
"node_modules/@types/mdx": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.6.tgz",
- "integrity": "sha512-sVcwEG10aFU2KcM7cIA0M410UPv/DesOPyG8zMVk0QUDexHA3lYmGucpEpZ2dtWWhi2ip3CG+5g/iH0PwoW4Fw==",
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz",
+ "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==",
"dev": true
},
"node_modules/@types/method-override": {
@@ -15811,12 +15228,6 @@
"integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==",
"dev": true
},
- "node_modules/@types/mime-types": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.4.tgz",
- "integrity": "sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==",
- "dev": true
- },
"node_modules/@types/minimatch": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
@@ -15858,16 +15269,6 @@
"undici-types": "~5.26.4"
}
},
- "node_modules/@types/node-fetch": {
- "version": "2.6.11",
- "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz",
- "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==",
- "dev": true,
- "dependencies": {
- "@types/node": "*",
- "form-data": "^4.0.0"
- }
- },
"node_modules/@types/node-forge": {
"version": "1.3.11",
"resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz",
@@ -16763,6 +16164,12 @@
"url": "https://opencollective.com/eslint"
}
},
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz",
+ "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==",
+ "dev": true
+ },
"node_modules/@use-gesture/core": {
"version": "10.3.1",
"resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz",
@@ -16779,6 +16186,47 @@
"react": ">= 16.8.0"
}
},
+ "node_modules/@vitest/expect": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.3.1.tgz",
+ "integrity": "sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==",
+ "dev": true,
+ "dependencies": {
+ "@vitest/spy": "1.3.1",
+ "@vitest/utils": "1.3.1",
+ "chai": "^4.3.10"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.3.1.tgz",
+ "integrity": "sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==",
+ "dev": true,
+ "dependencies": {
+ "tinyspy": "^2.2.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.3.1.tgz",
+ "integrity": "sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==",
+ "dev": true,
+ "dependencies": {
+ "diff-sequences": "^29.6.3",
+ "estree-walker": "^3.0.3",
+ "loupe": "^2.3.7",
+ "pretty-format": "^29.7.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
"node_modules/@wdio/config": {
"version": "8.16.20",
"resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.16.20.tgz",
@@ -19412,6 +18860,15 @@
"inherits": "2.0.3"
}
},
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/assign-symbols": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
@@ -19827,12 +19284,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/babel-plugin-add-react-displayname": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz",
- "integrity": "sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw==",
- "dev": true
- },
"node_modules/babel-plugin-inline-json-import": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/babel-plugin-inline-json-import/-/babel-plugin-inline-json-import-0.3.2.tgz",
@@ -21108,6 +20559,33 @@
"resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.3.tgz",
"integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw=="
},
+ "node_modules/chai": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz",
+ "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==",
+ "dev": true,
+ "dependencies": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.3",
+ "deep-eql": "^4.1.3",
+ "get-func-name": "^2.0.2",
+ "loupe": "^2.3.6",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chai/node_modules/type-detect": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz",
+ "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/chalk": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
@@ -21194,6 +20672,18 @@
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
},
+ "node_modules/check-error": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
+ "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
+ "dev": true,
+ "dependencies": {
+ "get-func-name": "^2.0.2"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/check-node-version": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/check-node-version/-/check-node-version-4.1.0.tgz",
@@ -21575,9 +21065,9 @@
}
},
"node_modules/cli-table3": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
- "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==",
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
+ "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
"dev": true,
"dependencies": {
"string-width": "^4.2.0"
@@ -22235,6 +21725,12 @@
"node": ">=0.8.0"
}
},
+ "node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+ "dev": true
+ },
"node_modules/configstore": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
@@ -24010,6 +23506,18 @@
"integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
"dev": true
},
+ "node_modules/deep-eql": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz",
+ "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
@@ -24724,9 +24232,9 @@
}
},
"node_modules/detect-port": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz",
- "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==",
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz",
+ "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==",
"dev": true,
"dependencies": {
"address": "^1.0.1",
@@ -24735,6 +24243,9 @@
"bin": {
"detect": "bin/detect-port.js",
"detect-port": "bin/detect-port.js"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
}
},
"node_modules/devtools-protocol": {
@@ -25598,9 +25109,9 @@
"dev": true
},
"node_modules/esbuild-register": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz",
- "integrity": "sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz",
+ "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==",
"dev": true,
"dependencies": {
"debug": "^4.3.4"
@@ -26452,6 +25963,15 @@
"node": ">=4.0"
}
},
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
"node_modules/esutils": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
@@ -28336,6 +27856,15 @@
"node": "6.* || 8.* || >= 10.*"
}
},
+ "node_modules/get-func-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/get-intrinsic": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
@@ -28581,18 +28110,18 @@
}
},
"node_modules/giget": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.1.tgz",
- "integrity": "sha512-4VG22mopWtIeHwogGSy1FViXVo0YT+m6BrqZfz0JJFwbSsePsCdOzdLIIli5BtMp7Xe8f/o2OmBpQX2NBOC24g==",
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.3.tgz",
+ "integrity": "sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==",
"dev": true,
"dependencies": {
- "citty": "^0.1.5",
+ "citty": "^0.1.6",
"consola": "^3.2.3",
- "defu": "^6.1.3",
- "node-fetch-native": "^1.6.1",
- "nypm": "^0.3.3",
+ "defu": "^6.1.4",
+ "node-fetch-native": "^1.6.3",
+ "nypm": "^0.3.8",
"ohash": "^1.1.3",
- "pathe": "^1.1.1",
+ "pathe": "^1.1.2",
"tar": "^6.2.0"
},
"bin": {
@@ -28707,9 +28236,9 @@
"optional": true
},
"node_modules/github-slugger": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz",
- "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
+ "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==",
"dev": true
},
"node_modules/glob": {
@@ -29226,6 +28755,45 @@
"node": ">= 0.4"
}
},
+ "node_modules/hast-util-heading-rank": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz",
+ "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==",
+ "dev": true,
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-is-element": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz",
+ "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==",
+ "dev": true,
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-string": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz",
+ "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==",
+ "dev": true,
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -29430,9 +28998,9 @@
}
},
"node_modules/html-webpack-plugin": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz",
- "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==",
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz",
+ "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==",
"dev": true,
"dependencies": {
"@types/html-minifier-terser": "^6.0.0",
@@ -30304,12 +29872,15 @@
}
},
"node_modules/is-absolute-url": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
- "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz",
+ "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==",
"dev": true,
"engines": {
- "node": ">=8"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-accessor-descriptor": {
@@ -35045,6 +34616,15 @@
"loose-envify": "cli.js"
}
},
+ "node_modules/loupe": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
+ "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
+ "dev": true,
+ "dependencies": {
+ "get-func-name": "^2.0.1"
+ }
+ },
"node_modules/lower-case": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
@@ -35092,15 +34672,12 @@
}
},
"node_modules/magic-string": {
- "version": "0.30.7",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.7.tgz",
- "integrity": "sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==",
+ "version": "0.30.15",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.15.tgz",
+ "integrity": "sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==",
"dev": true,
"dependencies": {
- "@jridgewell/sourcemap-codec": "^1.4.15"
- },
- "engines": {
- "node": ">=12"
+ "@jridgewell/sourcemap-codec": "^1.5.0"
}
},
"node_modules/make-dir": {
@@ -35628,9 +35205,9 @@
"integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q=="
},
"node_modules/markdown-to-jsx": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.1.tgz",
- "integrity": "sha512-GbrbkTnHp9u6+HqbPRFJbObi369AgJNXi/sGqq5HRsoZW063xR1XDCaConqq+whfEIAlzB1YPnOgsPc7B7bc/A==",
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.3.2.tgz",
+ "integrity": "sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==",
"dev": true,
"engines": {
"node": ">= 10"
@@ -35812,58 +35389,6 @@
"unist-util-visit": "^1.1.0"
}
},
- "node_modules/mdast-util-definitions": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz",
- "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==",
- "dev": true,
- "dependencies": {
- "unist-util-visit": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-definitions/node_modules/unist-util-is": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
- "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-definitions/node_modules/unist-util-visit": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
- "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
- "dev": true,
- "dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0",
- "unist-util-visit-parents": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-definitions/node_modules/unist-util-visit-parents": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
- "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==",
- "dev": true,
- "dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
"node_modules/mdast-util-inject": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/mdast-util-inject/-/mdast-util-inject-1.1.0.tgz",
@@ -37017,6 +36542,30 @@
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
"dev": true
},
+ "node_modules/mlly": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.3.tgz",
+ "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "pathe": "^1.1.2",
+ "pkg-types": "^1.2.1",
+ "ufo": "^1.5.4"
+ }
+ },
+ "node_modules/mlly/node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/mock-match-media": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/mock-match-media/-/mock-match-media-0.4.2.tgz",
@@ -37641,9 +37190,9 @@
}
},
"node_modules/node-fetch-native": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.2.tgz",
- "integrity": "sha512-69mtXOFZ6hSkYiXAVB5SqaRvrbITC/NPyqv7yuu/qw0nmgPyYbIMYYNIDhNtwPrzk0ptrimrLz/hhjvm4w5Z+w==",
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz",
+ "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==",
"dev": true
},
"node_modules/node-forge": {
@@ -38924,15 +38473,17 @@
}
},
"node_modules/nypm": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.6.tgz",
- "integrity": "sha512-2CATJh3pd6CyNfU5VZM7qSwFu0ieyabkEdnogE30Obn1czrmOYiZ8DOZLe1yBdLKWoyD3Mcy2maUs+0MR3yVjQ==",
+ "version": "0.3.12",
+ "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.12.tgz",
+ "integrity": "sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==",
"dev": true,
"dependencies": {
- "citty": "^0.1.5",
+ "citty": "^0.1.6",
+ "consola": "^3.2.3",
"execa": "^8.0.1",
"pathe": "^1.1.2",
- "ufo": "^1.3.2"
+ "pkg-types": "^1.2.0",
+ "ufo": "^1.5.4"
},
"bin": {
"nypm": "dist/cli.mjs"
@@ -38941,6 +38492,15 @@
"node": "^14.16.0 || >=16.10.0"
}
},
+ "node_modules/nypm/node_modules/consola": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
+ "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
+ "dev": true,
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
"node_modules/nypm/node_modules/execa": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
@@ -39024,11 +38584,14 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/nypm/node_modules/npm-run-path/node_modules/path-key": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
- "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "node_modules/nypm/node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
"dev": true,
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
"engines": {
"node": ">=12"
},
@@ -39036,14 +38599,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/nypm/node_modules/onetime": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
- "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "node_modules/nypm/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
"dev": true,
- "dependencies": {
- "mimic-fn": "^4.0.0"
- },
"engines": {
"node": ">=12"
},
@@ -39282,9 +38842,9 @@
"dev": true
},
"node_modules/ohash": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz",
- "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.4.tgz",
+ "integrity": "sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==",
"dev": true
},
"node_modules/on-finished": {
@@ -40526,6 +40086,15 @@
"integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
"dev": true
},
+ "node_modules/pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/pbkdf2": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
@@ -40657,6 +40226,17 @@
"node": ">=4"
}
},
+ "node_modules/pkg-types": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.1.tgz",
+ "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==",
+ "dev": true,
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.2",
+ "pathe": "^1.1.2"
+ }
+ },
"node_modules/platform": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz",
@@ -42338,9 +41918,9 @@
}
},
"node_modules/react-docgen": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.0.3.tgz",
- "integrity": "sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.1.0.tgz",
+ "integrity": "sha512-APPU8HB2uZnpl6Vt/+0AFoVYgSRtfiP6FLrZgPPTDmqSb2R4qZRbgd0A3VzIFxDt5e+Fozjx79WjLWnF69DK8g==",
"dev": true,
"dependencies": {
"@babel/core": "^7.18.9",
@@ -43507,155 +43087,176 @@
"regjsparser": "bin/parser"
}
},
- "node_modules/relateurl": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
- "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+ "node_modules/rehype-external-links": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz",
+ "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==",
"dev": true,
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/remark": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz",
- "integrity": "sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==",
"dependencies": {
- "remark-parse": "^6.0.0",
- "remark-stringify": "^6.0.0",
- "unified": "^7.0.0"
+ "@types/hast": "^3.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "hast-util-is-element": "^3.0.0",
+ "is-absolute-url": "^4.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/remark-external-links": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz",
- "integrity": "sha512-5vPSX0kHoSsqtdftSHhIYofVINC8qmp0nctkeU9YoJwV3YfiBRiI6cbFRJ0oI/1F9xS+bopXG0m2KS8VFscuKA==",
+ "node_modules/rehype-external-links/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "dev": true
+ },
+ "node_modules/rehype-external-links/node_modules/unist-util-is": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
+ "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
"dev": true,
"dependencies": {
- "extend": "^3.0.0",
- "is-absolute-url": "^3.0.0",
- "mdast-util-definitions": "^4.0.0",
- "space-separated-tokens": "^1.0.0",
- "unist-util-visit": "^2.0.0"
+ "@types/unist": "^3.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
- "node_modules/remark-external-links/node_modules/unist-util-is": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
- "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
+ "node_modules/rehype-external-links/node_modules/unist-util-visit": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
+ "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
"dev": true,
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
- "node_modules/remark-external-links/node_modules/unist-util-visit": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
- "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
+ "node_modules/rehype-external-links/node_modules/unist-util-visit-parents": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
+ "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
"dev": true,
"dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0",
- "unist-util-visit-parents": "^3.0.0"
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
- "node_modules/remark-external-links/node_modules/unist-util-visit-parents": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
- "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==",
+ "node_modules/rehype-slug": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz",
+ "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==",
"dev": true,
"dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0"
+ "@types/hast": "^3.0.0",
+ "github-slugger": "^2.0.0",
+ "hast-util-heading-rank": "^3.0.0",
+ "hast-util-to-string": "^3.0.0",
+ "unist-util-visit": "^5.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
- "node_modules/remark-parse": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz",
- "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==",
- "dependencies": {
- "collapse-white-space": "^1.0.2",
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "is-word-character": "^1.0.0",
- "markdown-escapes": "^1.0.0",
- "parse-entities": "^1.1.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "trim": "0.0.1",
- "trim-trailing-lines": "^1.0.0",
- "unherit": "^1.0.4",
- "unist-util-remove-position": "^1.0.0",
- "vfile-location": "^2.0.0",
- "xtend": "^4.0.1"
- }
+ "node_modules/rehype-slug/node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "dev": true
},
- "node_modules/remark-slug": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/remark-slug/-/remark-slug-6.1.0.tgz",
- "integrity": "sha512-oGCxDF9deA8phWvxFuyr3oSJsdyUAxMFbA0mZ7Y1Sas+emILtO+e5WutF9564gDsEN4IXaQXm5pFo6MLH+YmwQ==",
+ "node_modules/rehype-slug/node_modules/unist-util-is": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
+ "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
"dev": true,
"dependencies": {
- "github-slugger": "^1.0.0",
- "mdast-util-to-string": "^1.0.0",
- "unist-util-visit": "^2.0.0"
+ "@types/unist": "^3.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
- "node_modules/remark-slug/node_modules/unist-util-is": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
- "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
+ "node_modules/rehype-slug/node_modules/unist-util-visit": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
+ "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
"dev": true,
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
- "node_modules/remark-slug/node_modules/unist-util-visit": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
- "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
+ "node_modules/rehype-slug/node_modules/unist-util-visit-parents": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
+ "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
"dev": true,
"dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0",
- "unist-util-visit-parents": "^3.0.0"
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/unified"
}
},
- "node_modules/remark-slug/node_modules/unist-util-visit-parents": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
- "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==",
+ "node_modules/relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
"dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/remark": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz",
+ "integrity": "sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==",
"dependencies": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
+ "remark-parse": "^6.0.0",
+ "remark-stringify": "^6.0.0",
+ "unified": "^7.0.0"
+ }
+ },
+ "node_modules/remark-parse": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz",
+ "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==",
+ "dependencies": {
+ "collapse-white-space": "^1.0.2",
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-whitespace-character": "^1.0.0",
+ "is-word-character": "^1.0.0",
+ "markdown-escapes": "^1.0.0",
+ "parse-entities": "^1.1.0",
+ "repeat-string": "^1.5.4",
+ "state-toggle": "^1.0.0",
+ "trim": "0.0.1",
+ "trim-trailing-lines": "^1.0.0",
+ "unherit": "^1.0.4",
+ "unist-util-remove-position": "^1.0.0",
+ "vfile-location": "^2.0.0",
+ "xtend": "^4.0.1"
}
},
"node_modules/remark-stringify": {
@@ -45808,9 +45409,9 @@
"deprecated": "See https://github.com/lydell/source-map-url#deprecated"
},
"node_modules/space-separated-tokens": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
- "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
"dev": true,
"funding": {
"type": "github",
@@ -46131,18 +45732,18 @@
}
},
"node_modules/store2": {
- "version": "2.14.2",
- "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz",
- "integrity": "sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w==",
+ "version": "2.14.3",
+ "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.3.tgz",
+ "integrity": "sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==",
"dev": true
},
"node_modules/storybook": {
- "version": "7.6.15",
- "resolved": "https://registry.npmjs.org/storybook/-/storybook-7.6.15.tgz",
- "integrity": "sha512-Ybezq9JRk5CBhzjgzZ/oT7mnU45UwhyVSGKW+PUKZGGUG9VH2hCrTEES9f/zEF82kj/5COVPyqR/5vlXuuS39A==",
+ "version": "8.0.10",
+ "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.0.10.tgz",
+ "integrity": "sha512-9/4oxISopLyr5xz7Du27mmQgcIfB7UTLlNzkK4IklWTiSgsOgYgZpsmIwymoXNtkrvh+QsqskdcUP1C7nNiEtw==",
"dev": true,
"dependencies": {
- "@storybook/cli": "7.6.15"
+ "@storybook/cli": "8.0.10"
},
"bin": {
"sb": "index.js",
@@ -47102,19 +46703,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/swc-loader": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/swc-loader/-/swc-loader-0.2.6.tgz",
- "integrity": "sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==",
- "dev": true,
- "dependencies": {
- "@swc/counter": "^0.1.3"
- },
- "peerDependencies": {
- "@swc/core": "^1.2.147",
- "webpack": ">=2"
- }
- },
"node_modules/symbol-observable": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
@@ -47129,12 +46717,6 @@
"resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
"integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
},
- "node_modules/synchronous-promise": {
- "version": "2.0.17",
- "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.17.tgz",
- "integrity": "sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==",
- "dev": true
- },
"node_modules/synckit": {
"version": "0.8.5",
"resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz",
@@ -47494,7 +47076,6 @@
"integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
"deprecated": "Glob versions prior to v9 are no longer supported",
"dev": true,
- "license": "ISC",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -47537,7 +47118,6 @@
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"deprecated": "Rimraf versions prior to v4 are no longer supported",
"dev": true,
- "license": "ISC",
"dependencies": {
"glob": "^7.1.3"
},
@@ -47829,6 +47409,15 @@
"integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
"dev": true
},
+ "node_modules/tinyspy": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz",
+ "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/titleize": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz",
@@ -47941,9 +47530,9 @@
}
},
"node_modules/tocbot": {
- "version": "4.25.0",
- "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.25.0.tgz",
- "integrity": "sha512-kE5wyCQJ40hqUaRVkyQ4z5+4juzYsv/eK+aqD97N62YH0TxFhzJvo22RUQQZdO3YnXAk42ZOfOpjVdy+Z0YokA==",
+ "version": "4.32.2",
+ "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.32.2.tgz",
+ "integrity": "sha512-UbVZNXX79LUqMzsnSTwE/YF/PYc2pg3G77D/jcolHd6lmw+oklzfcLtHSsmWBhOf1wfWD1HfYzdjGQef1VcQgg==",
"dev": true
},
"node_modules/toidentifier": {
@@ -48410,9 +47999,9 @@
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
},
"node_modules/ufo": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz",
- "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==",
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz",
+ "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==",
"dev": true
},
"node_modules/uglify-js": {
@@ -48688,23 +48277,23 @@
}
},
"node_modules/unplugin": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.7.1.tgz",
- "integrity": "sha512-JqzORDAPxxs8ErLV4x+LL7bk5pk3YlcWqpSNsIkAZj972KzFZLClc/ekppahKkOczGkwIG6ElFgdOgOlK4tXZw==",
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.0.tgz",
+ "integrity": "sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==",
"dev": true,
"dependencies": {
- "acorn": "^8.11.3",
- "chokidar": "^3.5.3",
- "webpack-sources": "^3.2.3",
- "webpack-virtual-modules": "^0.6.1"
+ "acorn": "^8.14.0",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
}
},
"node_modules/unplugin/node_modules/acorn": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz",
- "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==",
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
"dev": true,
- "license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
@@ -48716,8 +48305,7 @@
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
"integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
- "dev": true,
- "license": "MIT"
+ "dev": true
},
"node_modules/unset-value": {
"version": "1.0.0",
@@ -48981,19 +48569,6 @@
"react": "^16.8.0"
}
},
- "node_modules/use-resize-observer": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/use-resize-observer/-/use-resize-observer-9.1.0.tgz",
- "integrity": "sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==",
- "dev": true,
- "dependencies": {
- "@juggle/resize-observer": "^3.3.1"
- },
- "peerDependencies": {
- "react": "16.8.0 - 18",
- "react-dom": "16.8.0 - 18"
- }
- },
"node_modules/use-sidecar": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
@@ -50505,7 +50080,6 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dev": true,
- "license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
diff --git a/package.json b/package.json
index b4fd877c82690..ce20056deb5ce 100644
--- a/package.json
+++ b/package.json
@@ -33,7 +33,7 @@
"@emotion/babel-plugin": "11.11.0",
"@emotion/jest": "11.7.1",
"@emotion/native": "11.0.0",
- "@geometricpanda/storybook-addon-badges": "2.0.1",
+ "@geometricpanda/storybook-addon-badges": "2.0.5",
"@octokit/rest": "16.26.0",
"@octokit/types": "6.34.0",
"@octokit/webhooks-types": "5.8.0",
@@ -42,16 +42,18 @@
"@react-native/babel-preset": "0.73.10",
"@react-native/metro-babel-transformer": "0.73.10",
"@react-native/metro-config": "0.73.4",
- "@storybook/addon-a11y": "7.6.15",
- "@storybook/addon-actions": "7.6.15",
- "@storybook/addon-controls": "7.6.15",
- "@storybook/addon-docs": "7.6.15",
- "@storybook/addon-toolbars": "7.6.15",
- "@storybook/addon-viewport": "7.6.15",
- "@storybook/react": "7.6.15",
- "@storybook/react-webpack5": "7.6.15",
- "@storybook/source-loader": "7.6.15",
- "@storybook/theming": "7.6.15",
+ "@storybook/addon-a11y": "8.0.10",
+ "@storybook/addon-actions": "8.0.10",
+ "@storybook/addon-controls": "8.0.10",
+ "@storybook/addon-docs": "8.0.10",
+ "@storybook/addon-toolbars": "8.0.10",
+ "@storybook/addon-viewport": "8.0.10",
+ "@storybook/addon-webpack5-compiler-babel": "3.0.3",
+ "@storybook/react": "8.0.10",
+ "@storybook/react-webpack5": "8.0.10",
+ "@storybook/source-loader": "8.0.10",
+ "@storybook/test": "8.0.10",
+ "@storybook/theming": "8.0.10",
"@testing-library/jest-dom": "5.16.5",
"@testing-library/react": "14.3.0",
"@testing-library/react-native": "12.4.3",
@@ -156,7 +158,7 @@
"snapshot-diff": "0.10.0",
"source-map-loader": "3.0.0",
"sprintf-js": "1.1.1",
- "storybook": "7.6.15",
+ "storybook": "8.0.10",
"storybook-source-link": "2.0.9",
"strip-json-comments": "5.0.0",
"style-loader": "3.2.1",
diff --git a/packages/components/src/custom-select-control-v2/stories/index.story.tsx b/packages/components/src/custom-select-control-v2/stories/index.story.tsx
index 75226314af8db..b65c599ec9997 100644
--- a/packages/components/src/custom-select-control-v2/stories/index.story.tsx
+++ b/packages/components/src/custom-select-control-v2/stories/index.story.tsx
@@ -2,6 +2,7 @@
* External dependencies
*/
import type { Meta, StoryFn } from '@storybook/react';
+import { fn } from '@storybook/test';
/**
* WordPress dependencies
@@ -44,6 +45,9 @@ const meta: Meta< typeof CustomSelectControlV2 > = {
),
],
+ args: {
+ onChange: fn(),
+ },
};
export default meta;
diff --git a/packages/components/src/tab-panel/stories/index.story.tsx b/packages/components/src/tab-panel/stories/index.story.tsx
index 57a3cc311f863..8f40c61beb523 100644
--- a/packages/components/src/tab-panel/stories/index.story.tsx
+++ b/packages/components/src/tab-panel/stories/index.story.tsx
@@ -2,6 +2,7 @@
* External dependencies
*/
import type { Meta, StoryFn } from '@storybook/react';
+import { fn } from '@storybook/test';
/**
* WordPress dependencies
@@ -22,6 +23,9 @@ const meta: Meta< typeof TabPanel > = {
controls: { expanded: true },
docs: { canvas: { sourceState: 'shown' } },
},
+ args: {
+ onSelect: fn(),
+ },
};
export default meta;
diff --git a/packages/components/src/tabs/stories/index.story.tsx b/packages/components/src/tabs/stories/index.story.tsx
index 5b2fd621bbb43..e434bb501d85c 100644
--- a/packages/components/src/tabs/stories/index.story.tsx
+++ b/packages/components/src/tabs/stories/index.story.tsx
@@ -2,6 +2,7 @@
* External dependencies
*/
import type { Meta, StoryFn } from '@storybook/react';
+import { fn } from '@storybook/test';
/**
* WordPress dependencies
@@ -39,6 +40,10 @@ const meta: Meta< typeof Tabs > = {
controls: { expanded: true },
docs: { canvas: { sourceState: 'shown' } },
},
+ args: {
+ onActiveTabIdChange: fn(),
+ onSelect: fn(),
+ },
};
export default meta;
diff --git a/patches/storybook-source-link+2.0.9.patch b/patches/storybook-source-link+2.0.9.patch
new file mode 100644
index 0000000000000..c1db218d953a9
--- /dev/null
+++ b/patches/storybook-source-link+2.0.9.patch
@@ -0,0 +1,55 @@
+diff --git a/node_modules/storybook-source-link/dist/esm/Tool.js b/node_modules/storybook-source-link/dist/esm/Tool.js
+index 100099e..53d37c4 100644
+--- a/node_modules/storybook-source-link/dist/esm/Tool.js
++++ b/node_modules/storybook-source-link/dist/esm/Tool.js
+@@ -1,7 +1,8 @@
+ import React from "react";
+-import { Icons, IconButton, TooltipMessage, WithTooltip } from "@storybook/components";
+-import { PARAM_KEY, PREFIX_PARAM_KEY, ICON_PARAM_KEY, INFO_LINK, TOOL_ID } from "./constants";
+-import { useParameter } from '@storybook/api';
++import { IconButton, TooltipMessage, WithTooltip } from "@storybook/components";
++import { RepoIcon } from '@storybook/icons';
++import { PARAM_KEY, PREFIX_PARAM_KEY, INFO_LINK, TOOL_ID } from "./constants";
++import { useParameter } from '@storybook/manager-api';
+
+ var Tooltip = function Tooltip() {
+ return /*#__PURE__*/React.createElement(TooltipMessage, {
+@@ -24,7 +25,6 @@ export var getLink = function getLink(prefix, link) {
+ export var Tool = function Tool() {
+ var param_link = useParameter(PARAM_KEY, null);
+ var param_prefix = useParameter(PREFIX_PARAM_KEY, null);
+- var param_icon = useParameter(ICON_PARAM_KEY, "repository");
+ var link = getLink(param_prefix, param_link);
+ return link ? /*#__PURE__*/React.createElement(IconButton, {
+ key: TOOL_ID,
+@@ -35,9 +35,7 @@ export var Tool = function Tool() {
+ window.open(link);
+ }
+ }
+- }, /*#__PURE__*/React.createElement(Icons, {
+- icon: param_icon
+- })) : /*#__PURE__*/React.createElement(WithTooltip, {
++ }, /*#__PURE__*/React.createElement(RepoIcon)) : /*#__PURE__*/React.createElement(WithTooltip, {
+ placement: "top",
+ trigger: "click",
+ tooltip: /*#__PURE__*/React.createElement(Tooltip, null)
+@@ -45,7 +43,5 @@ export var Tool = function Tool() {
+ key: TOOL_ID,
+ title: "View Source Repository",
+ active: false
+- }, /*#__PURE__*/React.createElement(Icons, {
+- icon: param_icon
+- })));
++ }, /*#__PURE__*/React.createElement(RepoIcon)));
+ };
+\ No newline at end of file
+diff --git a/node_modules/storybook-source-link/dist/esm/preset/manager.js b/node_modules/storybook-source-link/dist/esm/preset/manager.js
+index 845f81d..ca1d066 100644
+--- a/node_modules/storybook-source-link/dist/esm/preset/manager.js
++++ b/node_modules/storybook-source-link/dist/esm/preset/manager.js
+@@ -1,4 +1,4 @@
+-import { addons, types } from "@storybook/addons";
++import { addons, types } from "@storybook/manager-api";
+ import { ADDON_ID, TOOL_ID } from "../constants";
+ import { Tool } from "../Tool"; // Register the addon
+
diff --git a/storybook/main.js b/storybook/main.js
index 5261fbbf4726a..8a1203938fba5 100644
--- a/storybook/main.js
+++ b/storybook/main.js
@@ -54,6 +54,7 @@ module.exports = {
'@storybook/addon-a11y',
'@storybook/addon-toolbars',
'@storybook/addon-actions',
+ '@storybook/addon-webpack5-compiler-babel',
'storybook-source-link',
'@geometricpanda/storybook-addon-badges',
],
@@ -64,6 +65,9 @@ module.exports = {
docs: {
autodocs: true,
},
+ typescript: {
+ reactDocgen: 'react-docgen-typescript',
+ },
webpackFinal: async ( config ) => {
return {
...config,
diff --git a/storybook/preview.js b/storybook/preview.js
index a7c9aa0c085fc..e173ab3ed1e26 100644
--- a/storybook/preview.js
+++ b/storybook/preview.js
@@ -2,7 +2,7 @@
* External dependencies
*/
import {
- ArgsTable,
+ Controls,
Description,
Primary,
Stories,
@@ -114,8 +114,7 @@ export const parameters = {
- { /* `story="^"` enables Controls for the primary props table */ }
-
+
>
),
diff --git a/storybook/sidebar.js b/storybook/sidebar.js
index d8ff2ba777dd7..ab438440e3b83 100644
--- a/storybook/sidebar.js
+++ b/storybook/sidebar.js
@@ -28,7 +28,9 @@ const Title = styled.span( {
const Icons = styled.span( {} );
-const Icon = styled.span( {} );
+const Icon = styled.span( {
+ lineHeight: 1,
+} );
/**
* Fetches tags from the Storybook API, and returns Icon
@@ -41,7 +43,7 @@ function useIcons( item ) {
return useMemo( () => {
let data = {};
- if ( item.isComponent && item.children?.length ) {
+ if ( item.type === 'component' && item.children?.length ) {
data = api.getData( item.children[ 0 ] ) ?? {};
}
diff --git a/storybook/stories/docs/inline-icon.js b/storybook/stories/docs/inline-icon.js
index d7d1fafc28723..b947dbd534a00 100644
--- a/storybook/stories/docs/inline-icon.js
+++ b/storybook/stories/docs/inline-icon.js
@@ -2,11 +2,13 @@
* External dependencies
*/
import styled from '@emotion/styled';
-import { Icons } from '@storybook/components';
-const StyledIcons = styled( Icons )`
+const IconWrapper = ( { icon, ...props } ) => {
+ const IconComponent = icon;
+ return ;
+};
+
+export const InlineIcon = styled( IconWrapper )`
display: inline-block !important;
width: 14px;
`;
-
-export const InlineIcon = ( props ) => ;
diff --git a/storybook/stories/docs/introduction.mdx b/storybook/stories/docs/introduction.mdx
index 731c570942f6b..cff649d189bd4 100644
--- a/storybook/stories/docs/introduction.mdx
+++ b/storybook/stories/docs/introduction.mdx
@@ -1,4 +1,5 @@
import { Meta } from '@storybook/blocks';
+import { RepoIcon } from '@storybook/icons';
import { InlineIcon } from './inline-icon';
@@ -28,7 +29,7 @@ The site shows the individual components in the sidebar and the Canvas on the ri
To view the documentation for each component use the **Docs** menu item in the top toolbar.
-To view the source code for the component and its stories on GitHub, click the View Source Repository button in the top right corner.
+To view the source code for the component and its stories on GitHub, click the View Source Repository button in the top right corner.
To use it in your local development environment run the following command in the top level Gutenberg directory:
From 1a8771bc6c27721c7dfccabc807bca14c527801c Mon Sep 17 00:00:00 2001
From: Mitchell Austin
Date: Wed, 11 Dec 2024 08:05:40 -0800
Subject: [PATCH 010/239] Update platform docs intro so following it actually
works (#61341)
Unlinked contributors: aks30498.
Co-authored-by: youknowriad
Co-authored-by: michalczaplinski
Co-authored-by: ramonjd
---
platform-docs/docs/intro.md | 83 +++++++++++++++++++++----------------
1 file changed, 48 insertions(+), 35 deletions(-)
diff --git a/platform-docs/docs/intro.md b/platform-docs/docs/intro.md
index 05cfa103492f3..48f1410871cce 100644
--- a/platform-docs/docs/intro.md
+++ b/platform-docs/docs/intro.md
@@ -4,17 +4,16 @@ sidebar_position: 1
# Getting Started
-Let's discover how to use the **Gutenberg Block Editor** to build your own block editor in less than 10 minutes**.
-
+Let's discover how to use the **Gutenberg Block Editor** to build your own block editor in less than 10 minutes.
## What you'll need
- [Node.js](https://nodejs.org/en/download/) version 20.10 or above.
-- We're going to be using "vite" to setup our single page application (SPA) that contains a block editor. You can use your own setup, and your own application for this.
+- We're going to be using "Vite" to setup our single page application (SPA) that contains a block editor. You can use your own setup, and your own application for this.
## Preparing the SPA powered by Vite.
-First bootstrap a vite project using `npm create vite@latest` and pick `Vanilla` variant and `JavaScript` as a language.
+First bootstrap a Vite project using `npm create vite@latest` and pick `React` variant and `JavaScript` as a language.
Once done, you can navigate to your application folder and run it locally using `npm run dev`. Open the displayed local URL in a browser.
@@ -28,58 +27,72 @@ To build a block editor, you need to install the following dependencies:
## JSX
-We're going to be using JSX to write our UI and components. So one of the first steps we need to do is to configure our build tooling, By default vite supports JSX and and outputs the result as a React pragma. The Block editor uses React so there's no need to configure anything here but if you're using a different bundler/build tool, make sure the JSX transpilation is setup properly.
+We're going to be using JSX to write our UI and components as the block editor is built with React. Using the Vite bootstrap described above there’s no need to configure anything as it outputs the result as a React pragma. If you're using a different bundler/build tool, you may need to configure the JSX transpilation to do the same.
## Bootstrap your block editor
-It's time to render our first block editor.
+It's time to render our first block editor. We’ll do this with changes to three files – `index.html`, `src/main.jsx`, and `src/App.jsx`.
+
+First, we’ll add the base styles are for the editor UI. In `index.html` add these styles in the ``:
+```html
+
+
+```
+:::note
+
+There are more styles needed but can’t be added here because they are for the editor’s content which is in a separate document within an `
-
+
Close Modal
diff --git a/packages/components/src/number-control/index.tsx b/packages/components/src/number-control/index.tsx
index efa84879b8ff3..6dd1af4024af7 100644
--- a/packages/components/src/number-control/index.tsx
+++ b/packages/components/src/number-control/index.tsx
@@ -242,6 +242,7 @@ function UnforwardedNumberControl(
return stateReducerProp?.( baseState, action ) ?? baseState;
} }
size={ size }
+ __shouldNotWarnDeprecated36pxSize
suffix={
spinControls === 'custom' ? (
<>
diff --git a/packages/components/src/palette-edit/index.tsx b/packages/components/src/palette-edit/index.tsx
index a58ecbb685e51..2eb6e3bbe3b6f 100644
--- a/packages/components/src/palette-edit/index.tsx
+++ b/packages/components/src/palette-edit/index.tsx
@@ -60,6 +60,7 @@ const DEFAULT_COLOR = '#000';
function NameInput( { value, onChange, label }: NameInputProps ) {
return (
-
-
+
+
-
+
diff --git a/packages/components/src/tree-grid/stories/index.story.tsx b/packages/components/src/tree-grid/stories/index.story.tsx
index f91ba4631d320..e113103897dbd 100644
--- a/packages/components/src/tree-grid/stories/index.story.tsx
+++ b/packages/components/src/tree-grid/stories/index.story.tsx
@@ -111,6 +111,7 @@ const Rows = ( {
label="Description"
hideLabelFromVision
placeholder="Description"
+ __next40pxDefaultSize
{ ...props }
/>
) }
@@ -121,6 +122,7 @@ const Rows = ( {
label="Notes"
hideLabelFromVision
placeholder="Notes"
+ __next40pxDefaultSize
{ ...props }
/>
) }
From 1168fa55ad5af9034d3d29b500d2990aae589eea Mon Sep 17 00:00:00 2001
From: Yogesh Bhutkar
Date: Thu, 12 Dec 2024 13:03:58 +0530
Subject: [PATCH 016/239] CustomSelectControl: Refactor to use Ariakit store
state for current value (#67815)
Co-authored-by: yogeshbhutkar
Co-authored-by: Mamaduka
Co-authored-by: tyxla
Co-authored-by: mirka <0mirka00@git.wordpress.org>
---
packages/components/CHANGELOG.md | 1 +
packages/components/src/custom-select-control/index.tsx | 6 +++---
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md
index 5c8643dc08cf6..3525216fcc432 100644
--- a/packages/components/CHANGELOG.md
+++ b/packages/components/CHANGELOG.md
@@ -54,6 +54,7 @@
- `ResizableBox`: Make drag handles focusable ([#67305](https://github.com/WordPress/gutenberg/pull/67305)).
- `CustomSelectControl`: Update correctly when `showSelectedHint` is enabled ([#67733](https://github.com/WordPress/gutenberg/pull/67733)).
+- `CustomSelectControl`: Use `useStoreState` to get `currentValue` and avoid stale values ([#67815](https://github.com/WordPress/gutenberg/pull/67815)).
## 28.13.0 (2024-11-27)
diff --git a/packages/components/src/custom-select-control/index.tsx b/packages/components/src/custom-select-control/index.tsx
index 339944f419872..e014e4bc642ee 100644
--- a/packages/components/src/custom-select-control/index.tsx
+++ b/packages/components/src/custom-select-control/index.tsx
@@ -149,16 +149,16 @@ function CustomSelectControl< T extends CustomSelectOption >(
);
} );
- const { value: currentValue } = store.getState();
+ const currentValue = Ariakit.useStoreState( store, 'value' );
const renderSelectedValueHint = () => {
const selectedOptionHint = options
?.map( applyOptionDeprecations )
- ?.find( ( { name } ) => store.getState().value === name )?.hint;
+ ?.find( ( { name } ) => currentValue === name )?.hint;
return (
- { store.getState().value }
+ { currentValue }
{ selectedOptionHint && (
Date: Thu, 12 Dec 2024 13:27:41 +0530
Subject: [PATCH 017/239] Visual Refactor: Add Chevron Icon for Shadows in
Global Styles (#67720)
Co-authored-by: yogeshbhutkar
Co-authored-by: Mamaduka
Co-authored-by: afercia
Co-authored-by: richtabor
Co-authored-by: jameskoster
---
.../global-styles/font-sizes/font-sizes.js | 24 +++++++------------
.../components/global-styles/shadows-panel.js | 12 ++++++----
2 files changed, 17 insertions(+), 19 deletions(-)
diff --git a/packages/edit-site/src/components/global-styles/font-sizes/font-sizes.js b/packages/edit-site/src/components/global-styles/font-sizes/font-sizes.js
index 4bda7a7b3266b..7498dd7c78fb3 100644
--- a/packages/edit-site/src/components/global-styles/font-sizes/font-sizes.js
+++ b/packages/edit-site/src/components/global-styles/font-sizes/font-sizes.js
@@ -11,7 +11,6 @@ import {
__experimentalVStack as VStack,
__experimentalHStack as HStack,
FlexItem,
- FlexBlock,
Button,
} from '@wordpress/components';
import {
@@ -111,23 +110,18 @@ function FontSizeGroup( {
key={ size.slug }
path={ `/typography/font-sizes/${ origin }/${ size.slug }` }
>
-
+
{ size.name }
-
-
-
- { size.size }
-
-
-
+
+
diff --git a/packages/edit-site/src/components/global-styles/shadows-panel.js b/packages/edit-site/src/components/global-styles/shadows-panel.js
index 43e0c063f492b..5df8208ebdb09 100644
--- a/packages/edit-site/src/components/global-styles/shadows-panel.js
+++ b/packages/edit-site/src/components/global-styles/shadows-panel.js
@@ -9,9 +9,9 @@ import {
Flex,
FlexItem,
} from '@wordpress/components';
-import { __, sprintf } from '@wordpress/i18n';
+import { __, sprintf, isRTL } from '@wordpress/i18n';
import { privateApis as blockEditorPrivateApis } from '@wordpress/block-editor';
-import { plus, shadow as shadowIcon } from '@wordpress/icons';
+import { plus, Icon, chevronLeft, chevronRight } from '@wordpress/icons';
/**
* Internal dependencies
@@ -135,9 +135,13 @@ function ShadowItem( { shadow, category } ) {
return (
- { shadow.name }
+
+ { shadow.name }
+
+
+
+
);
}
From 29978b7c3e68f14ec62bf985e7e59ef61b9be0d1 Mon Sep 17 00:00:00 2001
From: Christian Leucht
Date: Thu, 12 Dec 2024 10:28:14 +0100
Subject: [PATCH 018/239] Introduce new filter
"render_block_core_navigation_link_allowed_post_status" (#63181)
* navigation-link // introduce new filter "render_block_core_navigation_link_allowed_post_status" to align with WP_Query whitelisting post_status in frontend.
* navigation-link // add $attributes and $block as filter params.
* Update @since comment
---------
Co-authored-by: Chrico
Co-authored-by: getdave
Co-authored-by: draganescu
---
.../block-library/src/navigation-link/index.php | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/packages/block-library/src/navigation-link/index.php b/packages/block-library/src/navigation-link/index.php
index 5653e04fca88a..81df2099dfc18 100644
--- a/packages/block-library/src/navigation-link/index.php
+++ b/packages/block-library/src/navigation-link/index.php
@@ -177,7 +177,22 @@ function render_block_core_navigation_link( $attributes, $content, $block ) {
// Don't render the block's subtree if it is a draft or if the ID does not exist.
if ( $is_post_type && $navigation_link_has_id ) {
$post = get_post( $attributes['id'] );
- if ( ! $post || 'publish' !== $post->post_status ) {
+ /**
+ * Filter allowed post_status for navigation link block to render.
+ *
+ * @since 6.8.0
+ *
+ * @param array $post_status
+ * @param array $attributes
+ * @param WP_Block $block
+ */
+ $allowed_post_status = (array) apply_filters(
+ 'render_block_core_navigation_link_allowed_post_status',
+ array( 'publish' ),
+ $attributes,
+ $block
+ );
+ if ( ! $post || ! in_array( $post->post_status, $allowed_post_status, true ) ) {
return '';
}
}
From 8277a741d81998a97f444a796e9c1757368e160e Mon Sep 17 00:00:00 2001
From: Aki Hamano <54422211+t-hamano@users.noreply.github.com>
Date: Thu, 12 Dec 2024 18:35:18 +0900
Subject: [PATCH 019/239] Fix: Script with glob option doesn't work on Windows
(#67862)
Co-authored-by: t-hamano
Co-authored-by: sirreal
---
package.json | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/package.json b/package.json
index 4d6dc94d58a66..b799ee7aed99b 100644
--- a/package.json
+++ b/package.json
@@ -182,8 +182,8 @@
"build:packages": "npm run --silent build:package-types && node ./bin/packages/build.js",
"postbuild:packages": " npm run --if-present --workspaces build:wp",
"build:plugin-zip": "bash ./bin/build-plugin-zip.sh",
- "clean:package-types": "tsc --build --clean && rimraf --glob './packages/*/build-types'",
- "clean:packages": "rimraf --glob './packages/*/{build,build-module,build-wp,build-style}'",
+ "clean:package-types": "tsc --build --clean && rimraf --glob \"./packages/*/build-types\"",
+ "clean:packages": "rimraf --glob \"./packages/*/{build,build-module,build-wp,build-style}\"",
"component-usage-stats": "node ./node_modules/react-scanner/bin/react-scanner -c ./react-scanner.config.js",
"dev": "cross-env NODE_ENV=development npm run build:packages && concurrently \"wp-scripts start\" \"npm run dev:packages\"",
"dev:packages": "cross-env NODE_ENV=development concurrently \"node ./bin/packages/watch.js\" \"tsc --build --watch\"",
@@ -195,7 +195,7 @@
"docs:gen": "node ./docs/tool/index.js",
"docs:theme-ref": "node ./bin/api-docs/gen-theme-reference.mjs",
"env": "wp-env",
- "fixtures:clean": "rimraf --glob 'test/integration/fixtures/blocks/*.{json,serialized.html}'",
+ "fixtures:clean": "rimraf --glob \"test/integration/fixtures/blocks/*.{json,serialized.html}\"",
"fixtures:generate": "cross-env GENERATE_MISSING_FIXTURES=y npm run test:unit test/integration/full-content/ && npm run format test/integration/fixtures/blocks/*.json",
"fixtures:regenerate": "npm-run-all fixtures:clean fixtures:generate",
"format": "wp-scripts format",
From 40022a360e19febca1067cdc26af4c9df65caba5 Mon Sep 17 00:00:00 2001
From: George Mamadashvili
Date: Thu, 12 Dec 2024 14:51:49 +0400
Subject: [PATCH 020/239] Image: Avoid link class loss when pasting for raw
transformation (#67803)
Unlinked contributors: designsimply.
Co-authored-by: Mamaduka
Co-authored-by: t-hamano
Co-authored-by: paaljoachim
Co-authored-by: talldan
Co-authored-by: greatislander
---
packages/block-library/src/image/transforms.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/packages/block-library/src/image/transforms.js b/packages/block-library/src/image/transforms.js
index 347d240828017..32824c372efdc 100644
--- a/packages/block-library/src/image/transforms.js
+++ b/packages/block-library/src/image/transforms.js
@@ -59,6 +59,7 @@ const schema = ( { phrasingContentSchema } ) => ( {
...imageSchema,
a: {
attributes: [ 'href', 'rel', 'target' ],
+ classes: [ /[\w-]*/ ],
children: imageSchema,
},
figcaption: {
From 9e3bdebbc37f9abff1cd2756dae77befce6e3ddf Mon Sep 17 00:00:00 2001
From: Riad Benguella
Date: Thu, 12 Dec 2024 11:57:22 +0100
Subject: [PATCH 021/239] BoxControl: Better minimum value support (#67819)
Co-authored-by: youknowriad
Co-authored-by: jorgefilipecosta
---
packages/components/CHANGELOG.md | 4 ++++
packages/components/src/box-control/input-control.tsx | 4 +++-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md
index 3525216fcc432..e8ae2bc7ba609 100644
--- a/packages/components/CHANGELOG.md
+++ b/packages/components/CHANGELOG.md
@@ -7,6 +7,10 @@
- `SelectControl`: Deprecate 36px default size ([#66898](https://github.com/WordPress/gutenberg/pull/66898)).
- `InputControl`: Deprecate 36px default size ([#66897](https://github.com/WordPress/gutenberg/pull/66897)).
+### Bug Fixes
+
+- `BoxControl`: Better respect for the `min` prop in the Range Slider ([#67819](https://github.com/WordPress/gutenberg/pull/67819)).
+
## 29.0.0 (2024-12-11)
### Breaking Changes
diff --git a/packages/components/src/box-control/input-control.tsx b/packages/components/src/box-control/input-control.tsx
index 9086cebedc274..2e1765f518a57 100644
--- a/packages/components/src/box-control/input-control.tsx
+++ b/packages/components/src/box-control/input-control.tsx
@@ -78,6 +78,7 @@ export default function BoxInputControl( {
setSelectedUnits,
sides,
side,
+ min = 0,
...props
}: BoxControlInputControlProps ) {
const defaultValuesToModify = getSidesToModify( side, sides );
@@ -154,6 +155,7 @@ export default function BoxInputControl( {
Date: Thu, 12 Dec 2024 12:45:06 +0100
Subject: [PATCH 022/239] Update "Call to Action" to "Call to action" (#67876)
Update "Call to Action" to "Call to action".
Co-authored-by: juanfra
Co-authored-by: jasmussen
---
.../editor/src/components/editor-help/intro-to-blocks.native.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/packages/editor/src/components/editor-help/intro-to-blocks.native.js b/packages/editor/src/components/editor-help/intro-to-blocks.native.js
index 3dc23ec261917..9e23a70936d4e 100644
--- a/packages/editor/src/components/editor-help/intro-to-blocks.native.js
+++ b/packages/editor/src/components/editor-help/intro-to-blocks.native.js
@@ -71,7 +71,7 @@ const IntroToBlocks = () => {
Date: Thu, 12 Dec 2024 14:13:58 +0200
Subject: [PATCH 023/239] Storybook: Upgrade to the latest version (v8.4.7)
(#67863)
* Bump dependencies to v8.1.11
* 8.1: Move autodocs to preview tags
* Bump dependencies to v8.2.10
* Bump dependencies to v8.3.7
* Bump dependencies to v8.4.7
Co-authored-by: tyxla
Co-authored-by: ciampo
---
package-lock.json | 3883 ++++++------------------------------------
package.json | 25 +-
storybook/main.js | 4 +-
storybook/preview.js | 2 +
4 files changed, 555 insertions(+), 3359 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index de4627eb245ad..32ff2db498651 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -33,18 +33,19 @@
"@react-native/babel-preset": "0.73.10",
"@react-native/metro-babel-transformer": "0.73.10",
"@react-native/metro-config": "0.73.4",
- "@storybook/addon-a11y": "8.0.10",
- "@storybook/addon-actions": "8.0.10",
- "@storybook/addon-controls": "8.0.10",
- "@storybook/addon-docs": "8.0.10",
- "@storybook/addon-toolbars": "8.0.10",
- "@storybook/addon-viewport": "8.0.10",
+ "@storybook/addon-a11y": "8.4.7",
+ "@storybook/addon-actions": "8.4.7",
+ "@storybook/addon-controls": "8.4.7",
+ "@storybook/addon-docs": "8.4.7",
+ "@storybook/addon-toolbars": "8.4.7",
+ "@storybook/addon-viewport": "8.4.7",
"@storybook/addon-webpack5-compiler-babel": "3.0.3",
- "@storybook/react": "8.0.10",
- "@storybook/react-webpack5": "8.0.10",
- "@storybook/source-loader": "8.0.10",
- "@storybook/test": "8.0.10",
- "@storybook/theming": "8.0.10",
+ "@storybook/react": "8.4.7",
+ "@storybook/react-webpack5": "8.4.7",
+ "@storybook/source-loader": "8.4.7",
+ "@storybook/test": "8.4.7",
+ "@storybook/theming": "8.4.7",
+ "@storybook/types": "8.4.7",
"@testing-library/jest-dom": "5.16.5",
"@testing-library/react": "14.3.0",
"@testing-library/react-native": "12.4.3",
@@ -149,7 +150,7 @@
"snapshot-diff": "0.10.0",
"source-map-loader": "3.0.0",
"sprintf-js": "1.1.1",
- "storybook": "8.0.10",
+ "storybook": "8.4.7",
"storybook-source-link": "2.0.9",
"strip-json-comments": "5.0.0",
"style-loader": "3.2.1",
@@ -1447,18 +1448,6 @@
}
}
},
- "node_modules/@aw-web-design/x-default-browser": {
- "version": "1.4.126",
- "resolved": "https://registry.npmjs.org/@aw-web-design/x-default-browser/-/x-default-browser-1.4.126.tgz",
- "integrity": "sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==",
- "dev": true,
- "dependencies": {
- "default-browser-id": "3.0.0"
- },
- "bin": {
- "x-default-browser": "bin/x-default-browser.js"
- }
- },
"node_modules/@axe-core/puppeteer": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@axe-core/puppeteer/-/puppeteer-4.0.0.tgz",
@@ -4162,12 +4151,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@base2/pretty-print-object": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz",
- "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==",
- "dev": true
- },
"node_modules/@bcoe/v8-coverage": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
@@ -4653,15 +4636,6 @@
"resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
"integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
},
- "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz",
- "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==",
- "dev": true,
- "peerDependencies": {
- "react": ">=16.8.0"
- }
- },
"node_modules/@emotion/utils": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz",
@@ -5139,12 +5113,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@fal-works/esbuild-plugin-global-externals": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz",
- "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==",
- "dev": true
- },
"node_modules/@fastify/busboy": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
@@ -6948,27 +6916,6 @@
"@tybys/wasm-util": "^0.9.0"
}
},
- "node_modules/@ndelangen/get-tarball": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/@ndelangen/get-tarball/-/get-tarball-3.0.9.tgz",
- "integrity": "sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==",
- "dev": true,
- "dependencies": {
- "gunzip-maybe": "^1.4.2",
- "pump": "^3.0.0",
- "tar-fs": "^2.1.1"
- }
- },
- "node_modules/@ndelangen/get-tarball/node_modules/pump": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
- "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
- "dev": true,
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
"node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
"version": "5.1.1-v1",
"resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
@@ -11388,26 +11335,28 @@
}
},
"node_modules/@storybook/addon-a11y": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-8.0.10.tgz",
- "integrity": "sha512-ymeTRE1uWplifWUMc3tO5lLGn4buS/hUVWKRM11SqugmxRym55B4thCJU089HAEMY+V/imiCeOE63TT+DGsk8g==",
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-8.4.7.tgz",
+ "integrity": "sha512-GpUvXp6n25U1ZSv+hmDC+05BEqxWdlWjQTb/GaboRXZQeMBlze6zckpVb66spjmmtQAIISo0eZxX1+mGcVR7lA==",
"dev": true,
"dependencies": {
- "@storybook/addon-highlight": "8.0.10",
+ "@storybook/addon-highlight": "8.4.7",
"axe-core": "^4.2.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.4.7"
}
},
"node_modules/@storybook/addon-actions": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.0.10.tgz",
- "integrity": "sha512-IEuc30UAFl7Ws0GwaY/whjBnGaViVEVjmPc+MXUym2wwwJbnCbI+BKJxPoYi/I7QJb5aUNToAE6pl2pDda2g3Q==",
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.4.7.tgz",
+ "integrity": "sha512-mjtD5JxcPuW74T6h7nqMxWTvDneFtokg88p6kQ5OnC1M259iAXb//yiSZgu/quunMHPCXSiqn4FNOSgASTSbsA==",
"dev": true,
"dependencies": {
- "@storybook/core-events": "8.0.10",
"@storybook/global": "^5.0.0",
"@types/uuid": "^9.0.1",
"dequal": "^2.0.2",
@@ -11417,6 +11366,9 @@
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.4.7"
}
},
"node_modules/@storybook/addon-actions/node_modules/@types/uuid": {
@@ -11426,91 +11378,49 @@
"dev": true
},
"node_modules/@storybook/addon-controls": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.0.10.tgz",
- "integrity": "sha512-MAUtIJGayNSsfn3VZ6SjQwpRkb4ky+10oVfos+xX9GQ5+7RCs+oYMuE4+aiQvvfXNdV8v0pUGPUPeUzqfJmhOA==",
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.4.7.tgz",
+ "integrity": "sha512-377uo5IsJgXLnQLJixa47+11V+7Wn9KcDEw+96aGCBCfLbWNH8S08tJHHnSu+jXg9zoqCAC23MetntVp6LetHA==",
"dev": true,
"dependencies": {
- "@storybook/blocks": "8.0.10",
- "lodash": "^4.17.21",
+ "@storybook/global": "^5.0.0",
+ "dequal": "^2.0.2",
"ts-dedent": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.4.7"
}
},
"node_modules/@storybook/addon-docs": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.0.10.tgz",
- "integrity": "sha512-y+Agoez/hXZHKUMIZHU96T5V1v0cs4ArSNfjqDg9DPYcyQ88ihJNb6ZabIgzmEaJF/NncCW+LofWeUtkTwalkw==",
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.4.7.tgz",
+ "integrity": "sha512-NwWaiTDT5puCBSUOVuf6ME7Zsbwz7Y79WF5tMZBx/sLQ60vpmJVQsap6NSjvK1Ravhc21EsIXqemAcBjAWu80w==",
"dev": true,
"dependencies": {
- "@babel/core": "^7.12.3",
"@mdx-js/react": "^3.0.0",
- "@storybook/blocks": "8.0.10",
- "@storybook/client-logger": "8.0.10",
- "@storybook/components": "8.0.10",
- "@storybook/csf-plugin": "8.0.10",
- "@storybook/csf-tools": "8.0.10",
- "@storybook/global": "^5.0.0",
- "@storybook/node-logger": "8.0.10",
- "@storybook/preview-api": "8.0.10",
- "@storybook/react-dom-shim": "8.0.10",
- "@storybook/theming": "8.0.10",
- "@storybook/types": "8.0.10",
- "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "fs-extra": "^11.1.0",
+ "@storybook/blocks": "8.4.7",
+ "@storybook/csf-plugin": "8.4.7",
+ "@storybook/react-dom-shim": "8.4.7",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "rehype-external-links": "^3.0.0",
- "rehype-slug": "^6.0.0",
"ts-dedent": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/addon-docs/node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
- "node_modules/@storybook/addon-docs/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/@storybook/addon-docs/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
+ "peerDependencies": {
+ "storybook": "^8.4.7"
}
},
"node_modules/@storybook/addon-highlight": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.0.10.tgz",
- "integrity": "sha512-40GB82t1e2LCCjqXcC6Z5lq1yIpA1+Yl5E2tKeggOVwg5HHAX02ESNDdBaIOlCqMkU3WKzjGPurDNOLUAbsV2g==",
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.4.7.tgz",
+ "integrity": "sha512-whQIDBd3PfVwcUCrRXvCUHWClXe9mQ7XkTPCdPo4B/tZ6Z9c6zD8JUHT76ddyHivixFLowMnA8PxMU6kCMAiNw==",
"dev": true,
"dependencies": {
"@storybook/global": "^5.0.0"
@@ -11518,22 +11428,28 @@
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.4.7"
}
},
"node_modules/@storybook/addon-toolbars": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.0.10.tgz",
- "integrity": "sha512-67HP6mTJU/gjRju01Z5HjeqoRiJMDlrMvMvjGBg7w5+tPNtjYqdelfe2+kcfU+Hf6dfcuqaBDwaUUGSv+RYtRQ==",
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.4.7.tgz",
+ "integrity": "sha512-OSfdv5UZs+NdGB+nZmbafGUWimiweJ/56gShlw8Neo/4jOJl1R3rnRqqY7MYx8E4GwoX+i3GF5C3iWFNQqlDcw==",
"dev": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.4.7"
}
},
"node_modules/@storybook/addon-viewport": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.0.10.tgz",
- "integrity": "sha512-NJ88Nd/tXreHLyLeF3VP+b8Fu2KtUuJ0L4JYpEMmcdaejGARTrJJOU+pcZBiUqEHFeXQ8rDY8DKXhUJZQFQ1Wg==",
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.4.7.tgz",
+ "integrity": "sha512-hvczh/jjuXXcOogih09a663sRDDSATXwbE866al1DXgbDFraYD/LxX/QDb38W9hdjU9+Qhx8VFIcNWoMQns5HQ==",
"dev": true,
"dependencies": {
"memoizerific": "^1.11.3"
@@ -11541,6 +11457,9 @@
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.4.7"
}
},
"node_modules/@storybook/addon-webpack5-compiler-babel": {
@@ -11557,43 +11476,23 @@
}
},
"node_modules/@storybook/blocks": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.0.10.tgz",
- "integrity": "sha512-LOaxvcO2d4dT4YoWlQ0bq/c8qA3aHoqtyuvBjwbVn+359bjMtgj/91YuP9Y2+ggZZ4p+ttgvk39PcmJlNXlJsw==",
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.4.7.tgz",
+ "integrity": "sha512-+QH7+JwXXXIyP3fRCxz/7E2VZepAanXJM7G8nbR3wWsqWgrRp4Wra6MvybxAYCxU7aNfJX5c+RW84SNikFpcIA==",
"dev": true,
"dependencies": {
- "@storybook/channels": "8.0.10",
- "@storybook/client-logger": "8.0.10",
- "@storybook/components": "8.0.10",
- "@storybook/core-events": "8.0.10",
- "@storybook/csf": "^0.1.4",
- "@storybook/docs-tools": "8.0.10",
- "@storybook/global": "^5.0.0",
- "@storybook/icons": "^1.2.5",
- "@storybook/manager-api": "8.0.10",
- "@storybook/preview-api": "8.0.10",
- "@storybook/theming": "8.0.10",
- "@storybook/types": "8.0.10",
- "@types/lodash": "^4.14.167",
- "color-convert": "^2.0.1",
- "dequal": "^2.0.2",
- "lodash": "^4.17.21",
- "markdown-to-jsx": "7.3.2",
- "memoizerific": "^1.11.3",
- "polished": "^4.2.2",
- "react-colorful": "^5.1.2",
- "telejson": "^7.2.0",
- "tocbot": "^4.20.1",
- "ts-dedent": "^2.0.0",
- "util-deprecate": "^1.0.2"
+ "@storybook/csf": "^0.1.11",
+ "@storybook/icons": "^1.2.12",
+ "ts-dedent": "^2.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "storybook": "^8.4.7"
},
"peerDependenciesMeta": {
"react": {
@@ -11604,123 +11503,22 @@
}
}
},
- "node_modules/@storybook/blocks/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/@storybook/blocks/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/@storybook/builder-manager": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-8.0.10.tgz",
- "integrity": "sha512-lo57jeeYuYCKYrmGOdLg25rMyiGYSTwJ+zYsQ3RvClVICjP6X0I1RCKAJDzkI0BixH6s1+w5ynD6X3PtDnhUuw==",
- "dev": true,
- "dependencies": {
- "@fal-works/esbuild-plugin-global-externals": "^2.1.2",
- "@storybook/core-common": "8.0.10",
- "@storybook/manager": "8.0.10",
- "@storybook/node-logger": "8.0.10",
- "@types/ejs": "^3.1.1",
- "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10",
- "browser-assert": "^1.2.1",
- "ejs": "^3.1.8",
- "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0",
- "esbuild-plugin-alias": "^0.2.1",
- "express": "^4.17.3",
- "fs-extra": "^11.1.0",
- "process": "^0.11.10",
- "util": "^0.12.4"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/builder-manager/node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
- "node_modules/@storybook/builder-manager/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/@storybook/builder-manager/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/@storybook/builder-manager/node_modules/util": {
- "version": "0.12.5",
- "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
- "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
+ "node_modules/@storybook/builder-webpack5": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.4.7.tgz",
+ "integrity": "sha512-O8LpsQ+4g2x5kh7rI9+jEUdX8k1a5egBQU1lbudmHchqsV0IKiVqBD9LL5Gj3wpit4vB8coSW4ZWTFBw8FQb4Q==",
"dev": true,
"dependencies": {
- "inherits": "^2.0.3",
- "is-arguments": "^1.0.4",
- "is-generator-function": "^1.0.7",
- "is-typed-array": "^1.1.3",
- "which-typed-array": "^1.1.2"
- }
- },
- "node_modules/@storybook/builder-webpack5": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-8.0.10.tgz",
- "integrity": "sha512-FrETNEPu9UcZD8yRIQhszcmdMMS73yXRbZFldeZzJ2b8lKNJG+tmqRwh5d5xEMzMrENYkDY+sXheOLSjKfvq9g==",
- "dev": true,
- "dependencies": {
- "@storybook/channels": "8.0.10",
- "@storybook/client-logger": "8.0.10",
- "@storybook/core-common": "8.0.10",
- "@storybook/core-events": "8.0.10",
- "@storybook/core-webpack": "8.0.10",
- "@storybook/node-logger": "8.0.10",
- "@storybook/preview": "8.0.10",
- "@storybook/preview-api": "8.0.10",
- "@types/node": "^18.0.0",
+ "@storybook/core-webpack": "8.4.7",
+ "@types/node": "^22.0.0",
"@types/semver": "^7.3.4",
"browser-assert": "^1.2.1",
"case-sensitive-paths-webpack-plugin": "^2.4.0",
"cjs-module-lexer": "^1.2.3",
"constants-browserify": "^1.0.0",
"css-loader": "^6.7.1",
- "es-module-lexer": "^1.4.1",
- "express": "^4.17.3",
+ "es-module-lexer": "^1.5.0",
"fork-ts-checker-webpack-plugin": "^8.0.0",
- "fs-extra": "^11.1.0",
"html-webpack-plugin": "^5.5.0",
"magic-string": "^0.30.5",
"path-browserify": "^1.0.1",
@@ -11735,12 +11533,15 @@
"webpack": "5",
"webpack-dev-middleware": "^6.1.2",
"webpack-hot-middleware": "^2.25.1",
- "webpack-virtual-modules": "^0.5.0"
+ "webpack-virtual-modules": "^0.6.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
},
+ "peerDependencies": {
+ "storybook": "^8.4.7"
+ },
"peerDependenciesMeta": {
"typescript": {
"optional": true
@@ -11782,32 +11583,6 @@
}
}
},
- "node_modules/@storybook/builder-webpack5/node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
- "node_modules/@storybook/builder-webpack5/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
"node_modules/@storybook/builder-webpack5/node_modules/path-browserify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
@@ -11836,15 +11611,6 @@
"webpack": "^5.0.0"
}
},
- "node_modules/@storybook/builder-webpack5/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
"node_modules/@storybook/builder-webpack5/node_modules/util": {
"version": "0.12.5",
"resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
@@ -11858,333 +11624,302 @@
"which-typed-array": "^1.1.2"
}
},
- "node_modules/@storybook/channels": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-8.0.10.tgz",
- "integrity": "sha512-3JLxfD7czlx31dAGvAYJ4J4BNE/Y2+hhj/dsV3xlQTHKVpnWknaoeYEC1a6YScyfsH6W+XmP2rzZKzH4EkLSGQ==",
+ "node_modules/@storybook/components": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.4.7.tgz",
+ "integrity": "sha512-uyJIcoyeMWKAvjrG9tJBUCKxr2WZk+PomgrgrUwejkIfXMO76i6jw9BwLa0NZjYdlthDv30r9FfbYZyeNPmF0g==",
"dev": true,
- "dependencies": {
- "@storybook/client-logger": "8.0.10",
- "@storybook/core-events": "8.0.10",
- "@storybook/global": "^5.0.0",
- "telejson": "^7.2.0",
- "tiny-invariant": "^1.3.1"
- },
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
}
},
- "node_modules/@storybook/cli": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-8.0.10.tgz",
- "integrity": "sha512-KUZEO2lyvOS2sRJEFXovt6+5b65iWsh7F8e8S1cM20fCM1rZAlWtwmoxmDVXDmyEp0wTrq4FrRxKnbo9UO518w==",
+ "node_modules/@storybook/core": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.4.7.tgz",
+ "integrity": "sha512-7Z8Z0A+1YnhrrSXoKKwFFI4gnsLbWzr8fnDCU6+6HlDukFYh8GHRcZ9zKfqmy6U3hw2h8H5DrHsxWfyaYUUOoA==",
"dev": true,
"dependencies": {
- "@babel/core": "^7.23.0",
- "@babel/types": "^7.23.0",
- "@ndelangen/get-tarball": "^3.0.7",
- "@storybook/codemod": "8.0.10",
- "@storybook/core-common": "8.0.10",
- "@storybook/core-events": "8.0.10",
- "@storybook/core-server": "8.0.10",
- "@storybook/csf-tools": "8.0.10",
- "@storybook/node-logger": "8.0.10",
- "@storybook/telemetry": "8.0.10",
- "@storybook/types": "8.0.10",
- "@types/semver": "^7.3.4",
- "@yarnpkg/fslib": "2.10.3",
- "@yarnpkg/libzip": "2.3.0",
- "chalk": "^4.1.0",
- "commander": "^6.2.1",
- "cross-spawn": "^7.0.3",
- "detect-indent": "^6.1.0",
- "envinfo": "^7.7.3",
- "execa": "^5.0.0",
- "find-up": "^5.0.0",
- "fs-extra": "^11.1.0",
- "get-npm-tarball-url": "^2.0.3",
- "giget": "^1.0.0",
- "globby": "^11.0.2",
- "jscodeshift": "^0.15.1",
- "leven": "^3.1.0",
- "ora": "^5.4.1",
- "prettier": "^3.1.1",
- "prompts": "^2.4.0",
- "read-pkg-up": "^7.0.1",
- "semver": "^7.3.7",
- "strip-json-comments": "^3.0.1",
- "tempy": "^1.0.1",
- "tiny-invariant": "^1.3.1",
- "ts-dedent": "^2.0.0"
- },
- "bin": {
- "getstorybook": "bin/index.js",
- "sb": "bin/index.js"
+ "@storybook/csf": "^0.1.11",
+ "better-opn": "^3.0.2",
+ "browser-assert": "^1.2.1",
+ "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0",
+ "esbuild-register": "^3.5.0",
+ "jsdoc-type-pratt-parser": "^4.0.0",
+ "process": "^0.11.10",
+ "recast": "^0.23.5",
+ "semver": "^7.6.2",
+ "util": "^0.12.5",
+ "ws": "^8.2.3"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "prettier": "^2 || ^3"
+ },
+ "peerDependenciesMeta": {
+ "prettier": {
+ "optional": true
+ }
}
},
- "node_modules/@storybook/cli/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/@storybook/core-webpack": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.4.7.tgz",
+ "integrity": "sha512-Tj+CjQLpFyBJxhhMms+vbPT3+gTRAiQlrhY3L1IEVwBa3wtRMS0qjozH26d1hK4G6mUIEdwu13L54HMU/w33Sg==",
"dev": true,
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
+ "@types/node": "^22.0.0",
+ "ts-dedent": "^2.0.0"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.4.7"
}
},
- "node_modules/@storybook/cli/node_modules/cli-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
- "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "node_modules/@storybook/core/node_modules/recast": {
+ "version": "0.23.9",
+ "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz",
+ "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==",
"dev": true,
"dependencies": {
- "restore-cursor": "^3.1.0"
+ "ast-types": "^0.16.1",
+ "esprima": "~4.0.0",
+ "source-map": "~0.6.1",
+ "tiny-invariant": "^1.3.3",
+ "tslib": "^2.0.1"
},
"engines": {
- "node": ">=8"
+ "node": ">= 4"
}
},
- "node_modules/@storybook/cli/node_modules/commander": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
- "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+ "node_modules/@storybook/core/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
"dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
"engines": {
- "node": ">= 6"
+ "node": ">=10"
}
},
- "node_modules/@storybook/cli/node_modules/detect-indent": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz",
- "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==",
+ "node_modules/@storybook/core/node_modules/util": {
+ "version": "0.12.5",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
+ "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
"dev": true,
- "engines": {
- "node": ">=8"
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "is-arguments": "^1.0.4",
+ "is-generator-function": "^1.0.7",
+ "is-typed-array": "^1.1.3",
+ "which-typed-array": "^1.1.2"
}
},
- "node_modules/@storybook/cli/node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "node_modules/@storybook/core/node_modules/ws": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
+ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
"dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- },
"engines": {
- "node": ">=10"
+ "node": ">=10.0.0"
},
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
}
},
- "node_modules/@storybook/cli/node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "node_modules/@storybook/csf": {
+ "version": "0.1.11",
+ "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz",
+ "integrity": "sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type-fest": "^2.19.0"
}
},
- "node_modules/@storybook/cli/node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "node_modules/@storybook/csf-plugin": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.4.7.tgz",
+ "integrity": "sha512-Fgogplu4HImgC+AYDcdGm1rmL6OR1rVdNX1Be9C/NEXwOCpbbBwi0BxTf/2ZxHRk9fCeaPEcOdP5S8QHfltc1g==",
"dev": true,
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
+ "unplugin": "^1.3.1"
},
- "engines": {
- "node": ">=14.14"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.4.7"
}
},
- "node_modules/@storybook/cli/node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "node_modules/@storybook/csf/node_modules/type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
"dev": true,
"engines": {
- "node": ">=10"
+ "node": ">=12.20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@storybook/cli/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/cli/node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true,
- "engines": {
- "node": ">=10.17.0"
- }
+ "node_modules/@storybook/global": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz",
+ "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==",
+ "dev": true
},
- "node_modules/@storybook/cli/node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "node_modules/@storybook/icons": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.3.0.tgz",
+ "integrity": "sha512-Nz/UzeYQdUZUhacrPyfkiiysSjydyjgg/p0P9HxB4p/WaJUUjMAcaoaLgy3EXx61zZJ3iD36WPuDkZs5QYrA0A==",
"dev": true,
"engines": {
- "node": ">=8"
+ "node": ">=14.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta"
}
},
- "node_modules/@storybook/cli/node_modules/jscodeshift": {
- "version": "0.15.2",
- "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz",
- "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==",
+ "node_modules/@storybook/instrumenter": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.4.7.tgz",
+ "integrity": "sha512-k6NSD3jaRCCHAFtqXZ7tw8jAzD/yTEWXGya+REgZqq5RCkmJ+9S4Ytp/6OhQMPtPFX23gAuJJzTQVLcCr+gjRg==",
"dev": true,
"dependencies": {
- "@babel/core": "^7.23.0",
- "@babel/parser": "^7.23.0",
- "@babel/plugin-transform-class-properties": "^7.22.5",
- "@babel/plugin-transform-modules-commonjs": "^7.23.0",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11",
- "@babel/plugin-transform-optional-chaining": "^7.23.0",
- "@babel/plugin-transform-private-methods": "^7.22.5",
- "@babel/preset-flow": "^7.22.15",
- "@babel/preset-typescript": "^7.23.0",
- "@babel/register": "^7.22.15",
- "babel-core": "^7.0.0-bridge.0",
- "chalk": "^4.1.2",
- "flow-parser": "0.*",
- "graceful-fs": "^4.2.4",
- "micromatch": "^4.0.4",
- "neo-async": "^2.5.0",
- "node-dir": "^0.1.17",
- "recast": "^0.23.3",
- "temp": "^0.8.4",
- "write-file-atomic": "^2.3.0"
+ "@storybook/global": "^5.0.0",
+ "@vitest/utils": "^2.1.1"
},
- "bin": {
- "jscodeshift": "bin/jscodeshift.js"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "@babel/preset-env": "^7.1.6"
- },
- "peerDependenciesMeta": {
- "@babel/preset-env": {
- "optional": true
- }
+ "storybook": "^8.4.7"
}
},
- "node_modules/@storybook/cli/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "node_modules/@storybook/instrumenter/node_modules/@vitest/pretty-format": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz",
+ "integrity": "sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==",
"dev": true,
"dependencies": {
- "universalify": "^2.0.0"
+ "tinyrainbow": "^1.2.0"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/@storybook/cli/node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "node_modules/@storybook/instrumenter/node_modules/@vitest/utils": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz",
+ "integrity": "sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==",
"dev": true,
"dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
+ "@vitest/pretty-format": "2.1.8",
+ "loupe": "^3.1.2",
+ "tinyrainbow": "^1.2.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/@storybook/cli/node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "node_modules/@storybook/manager-api": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.4.7.tgz",
+ "integrity": "sha512-ELqemTviCxAsZ5tqUz39sDmQkvhVAvAgiplYy9Uf15kO0SP2+HKsCMzlrm2ue2FfkUNyqbDayCPPCB0Cdn/mpQ==",
"dev": true,
- "engines": {
- "node": ">=6"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
}
},
- "node_modules/@storybook/cli/node_modules/npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "node_modules/@storybook/preset-react-webpack": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-8.4.7.tgz",
+ "integrity": "sha512-geTSBKyrBagVihil5MF7LkVFynbfHhCinvnbCZZqXW7M1vgcxvatunUENB+iV8eWg/0EJ+8O7scZL+BAxQ/2qg==",
"dev": true,
"dependencies": {
- "path-key": "^3.0.0"
+ "@storybook/core-webpack": "8.4.7",
+ "@storybook/react": "8.4.7",
+ "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0",
+ "@types/node": "^22.0.0",
+ "@types/semver": "^7.3.4",
+ "find-up": "^5.0.0",
+ "magic-string": "^0.30.5",
+ "react-docgen": "^7.0.0",
+ "resolve": "^1.22.8",
+ "semver": "^7.3.7",
+ "tsconfig-paths": "^4.2.0",
+ "webpack": "5"
},
"engines": {
- "node": ">=8"
+ "node": ">=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "storybook": "^8.4.7"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
}
},
- "node_modules/@storybook/cli/node_modules/onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "node_modules/@storybook/preset-react-webpack/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
"dependencies": {
- "mimic-fn": "^2.1.0"
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
},
"engines": {
- "node": ">=6"
+ "node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@storybook/cli/node_modules/ora": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
- "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
+ "node_modules/@storybook/preset-react-webpack/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true,
"dependencies": {
- "bl": "^4.1.0",
- "chalk": "^4.1.0",
- "cli-cursor": "^3.1.0",
- "cli-spinners": "^2.5.0",
- "is-interactive": "^1.0.0",
- "is-unicode-supported": "^0.1.0",
- "log-symbols": "^4.1.0",
- "strip-ansi": "^6.0.0",
- "wcwidth": "^1.0.1"
+ "p-locate": "^5.0.0"
},
"engines": {
"node": ">=10"
@@ -12193,7 +11928,7 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@storybook/cli/node_modules/p-locate": {
+ "node_modules/@storybook/preset-react-webpack/node_modules/p-locate": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
@@ -12208,7 +11943,7 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@storybook/cli/node_modules/path-exists": {
+ "node_modules/@storybook/preset-react-webpack/node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
@@ -12217,1295 +11952,13 @@
"node": ">=8"
}
},
- "node_modules/@storybook/cli/node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "node_modules/@storybook/preset-react-webpack/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
"dev": true,
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/cli/node_modules/prettier": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
- "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
- "dev": true,
- "bin": {
- "prettier": "bin/prettier.cjs"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/@storybook/cli/node_modules/recast": {
- "version": "0.23.9",
- "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz",
- "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==",
- "dev": true,
- "dependencies": {
- "ast-types": "^0.16.1",
- "esprima": "~4.0.0",
- "source-map": "~0.6.1",
- "tiny-invariant": "^1.3.3",
- "tslib": "^2.0.1"
- },
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/@storybook/cli/node_modules/restore-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
- "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
- "dev": true,
- "dependencies": {
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/cli/node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/cli/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/cli/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/@storybook/client-logger": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-8.0.10.tgz",
- "integrity": "sha512-u38SbZNAunZzxZNHMJb9jkUwFkLyWxmvp4xtiRM3u9sMUShXoTnzbw1yKrxs+kYJjg+58UQPZ1JhEBRcHt5Oww==",
- "dev": true,
- "dependencies": {
- "@storybook/global": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/codemod": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-8.0.10.tgz",
- "integrity": "sha512-t45jKGs/eyR/nKVX6QgRtMZSAjJo5aXWWk3B24xVbW6ywr0jt1LC100FkHG4Af8cApIfh8uUmS9X05hMG5zGGA==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.23.2",
- "@babel/preset-env": "^7.23.2",
- "@babel/types": "^7.23.0",
- "@storybook/csf": "^0.1.4",
- "@storybook/csf-tools": "8.0.10",
- "@storybook/node-logger": "8.0.10",
- "@storybook/types": "8.0.10",
- "@types/cross-spawn": "^6.0.2",
- "cross-spawn": "^7.0.3",
- "globby": "^11.0.2",
- "jscodeshift": "^0.15.1",
- "lodash": "^4.17.21",
- "prettier": "^3.1.1",
- "recast": "^0.23.5",
- "tiny-invariant": "^1.3.1"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/codemod/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@storybook/codemod/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/codemod/node_modules/jscodeshift": {
- "version": "0.15.2",
- "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz",
- "integrity": "sha512-FquR7Okgmc4Sd0aEDwqho3rEiKR3BdvuG9jfdHjLJ6JQoWSMpavug3AoIfnfWhxFlf+5pzQh8qjqz0DWFrNQzA==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.23.0",
- "@babel/parser": "^7.23.0",
- "@babel/plugin-transform-class-properties": "^7.22.5",
- "@babel/plugin-transform-modules-commonjs": "^7.23.0",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11",
- "@babel/plugin-transform-optional-chaining": "^7.23.0",
- "@babel/plugin-transform-private-methods": "^7.22.5",
- "@babel/preset-flow": "^7.22.15",
- "@babel/preset-typescript": "^7.23.0",
- "@babel/register": "^7.22.15",
- "babel-core": "^7.0.0-bridge.0",
- "chalk": "^4.1.2",
- "flow-parser": "0.*",
- "graceful-fs": "^4.2.4",
- "micromatch": "^4.0.4",
- "neo-async": "^2.5.0",
- "node-dir": "^0.1.17",
- "recast": "^0.23.3",
- "temp": "^0.8.4",
- "write-file-atomic": "^2.3.0"
- },
- "bin": {
- "jscodeshift": "bin/jscodeshift.js"
- },
- "peerDependencies": {
- "@babel/preset-env": "^7.1.6"
- },
- "peerDependenciesMeta": {
- "@babel/preset-env": {
- "optional": true
- }
- }
- },
- "node_modules/@storybook/codemod/node_modules/prettier": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz",
- "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==",
- "dev": true,
- "bin": {
- "prettier": "bin/prettier.cjs"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/@storybook/codemod/node_modules/recast": {
- "version": "0.23.9",
- "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz",
- "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==",
- "dev": true,
- "dependencies": {
- "ast-types": "^0.16.1",
- "esprima": "~4.0.0",
- "source-map": "~0.6.1",
- "tiny-invariant": "^1.3.3",
- "tslib": "^2.0.1"
- },
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/@storybook/codemod/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/components": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.0.10.tgz",
- "integrity": "sha512-eo+oDDcm35YBB3dtDYDfcjJypNVPmRty85VWpAOBsJXpwp/fgU8csx0DM3KmhrQ4cWLf2WzcFowJwI1w+J88Sw==",
- "dev": true,
- "dependencies": {
- "@radix-ui/react-slot": "^1.0.2",
- "@storybook/client-logger": "8.0.10",
- "@storybook/csf": "^0.1.4",
- "@storybook/global": "^5.0.0",
- "@storybook/icons": "^1.2.5",
- "@storybook/theming": "8.0.10",
- "@storybook/types": "8.0.10",
- "memoizerific": "^1.11.3",
- "util-deprecate": "^1.0.2"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
- }
- },
- "node_modules/@storybook/core-common": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/core-common/-/core-common-8.0.10.tgz",
- "integrity": "sha512-hsFlPieputaDQoxstnPa3pykTc4bUwEDgCHf8U43+/Z7qmLOQ9fpG+2CFW930rsCRghYpPreOvsmhY7lsGKWLQ==",
- "dev": true,
- "dependencies": {
- "@storybook/core-events": "8.0.10",
- "@storybook/csf-tools": "8.0.10",
- "@storybook/node-logger": "8.0.10",
- "@storybook/types": "8.0.10",
- "@yarnpkg/fslib": "2.10.3",
- "@yarnpkg/libzip": "2.3.0",
- "chalk": "^4.1.0",
- "cross-spawn": "^7.0.3",
- "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0",
- "esbuild-register": "^3.5.0",
- "execa": "^5.0.0",
- "file-system-cache": "2.3.0",
- "find-cache-dir": "^3.0.0",
- "find-up": "^5.0.0",
- "fs-extra": "^11.1.0",
- "glob": "^10.0.0",
- "handlebars": "^4.7.7",
- "lazy-universal-dotenv": "^4.0.0",
- "node-fetch": "^2.0.0",
- "picomatch": "^2.3.0",
- "pkg-dir": "^5.0.0",
- "pretty-hrtime": "^1.0.3",
- "resolve-from": "^5.0.0",
- "semver": "^7.3.7",
- "tempy": "^1.0.1",
- "tiny-invariant": "^1.3.1",
- "ts-dedent": "^2.0.0",
- "util": "^0.12.4"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/core-common/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/@storybook/core-common/node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/@storybook/core-common/node_modules/find-cache-dir": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
- "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
- "dev": true,
- "dependencies": {
- "commondir": "^1.0.1",
- "make-dir": "^3.0.2",
- "pkg-dir": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
- }
- },
- "node_modules/@storybook/core-common/node_modules/find-cache-dir/node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/core-common/node_modules/find-cache-dir/node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/core-common/node_modules/find-cache-dir/node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/core-common/node_modules/find-cache-dir/node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/core-common/node_modules/find-cache-dir/node_modules/pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
- "dev": true,
- "dependencies": {
- "find-up": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/core-common/node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/core-common/node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
- "node_modules/@storybook/core-common/node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/core-common/node_modules/glob": {
- "version": "10.4.5",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
- "dev": true,
- "dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
- "minipass": "^7.1.2",
- "package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
- },
- "bin": {
- "glob": "dist/esm/bin.mjs"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@storybook/core-common/node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true,
- "engines": {
- "node": ">=10.17.0"
- }
- },
- "node_modules/@storybook/core-common/node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/core-common/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/@storybook/core-common/node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/core-common/node_modules/make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "dev": true,
- "dependencies": {
- "semver": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/core-common/node_modules/make-dir/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@storybook/core-common/node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@storybook/core-common/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@storybook/core-common/node_modules/minipass": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
- "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
- "dev": true,
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/@storybook/core-common/node_modules/npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/core-common/node_modules/onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dev": true,
- "dependencies": {
- "mimic-fn": "^2.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/core-common/node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/core-common/node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@storybook/core-common/node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/core-common/node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/core-common/node_modules/pkg-dir": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
- "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
- "dev": true,
- "dependencies": {
- "find-up": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@storybook/core-common/node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/core-common/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/@storybook/core-common/node_modules/util": {
- "version": "0.12.5",
- "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
- "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "is-arguments": "^1.0.4",
- "is-generator-function": "^1.0.7",
- "is-typed-array": "^1.1.3",
- "which-typed-array": "^1.1.2"
- }
- },
- "node_modules/@storybook/core-events": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-8.0.10.tgz",
- "integrity": "sha512-TuHPS6p5ZNr4vp4butLb4R98aFx0NRYCI/7VPhJEUH5rPiqNzE3PZd8DC8rnVxavsJ+jO1/y+egNKXRYkEcoPQ==",
- "dev": true,
- "dependencies": {
- "ts-dedent": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/core-server": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-8.0.10.tgz",
- "integrity": "sha512-HYDw2QFBxg1X/d6g0rUhirOB5Jq6g90HBnyrZzxKoqKWJCNsCADSgM+h9HgtUw0jA97qBpIqmNO9n3mXFPWU/Q==",
- "dev": true,
- "dependencies": {
- "@aw-web-design/x-default-browser": "1.4.126",
- "@babel/core": "^7.23.9",
- "@discoveryjs/json-ext": "^0.5.3",
- "@storybook/builder-manager": "8.0.10",
- "@storybook/channels": "8.0.10",
- "@storybook/core-common": "8.0.10",
- "@storybook/core-events": "8.0.10",
- "@storybook/csf": "^0.1.4",
- "@storybook/csf-tools": "8.0.10",
- "@storybook/docs-mdx": "3.0.0",
- "@storybook/global": "^5.0.0",
- "@storybook/manager": "8.0.10",
- "@storybook/manager-api": "8.0.10",
- "@storybook/node-logger": "8.0.10",
- "@storybook/preview-api": "8.0.10",
- "@storybook/telemetry": "8.0.10",
- "@storybook/types": "8.0.10",
- "@types/detect-port": "^1.3.0",
- "@types/node": "^18.0.0",
- "@types/pretty-hrtime": "^1.0.0",
- "@types/semver": "^7.3.4",
- "better-opn": "^3.0.2",
- "chalk": "^4.1.0",
- "cli-table3": "^0.6.1",
- "compression": "^1.7.4",
- "detect-port": "^1.3.0",
- "express": "^4.17.3",
- "fs-extra": "^11.1.0",
- "globby": "^11.0.2",
- "ip": "^2.0.1",
- "lodash": "^4.17.21",
- "open": "^8.4.0",
- "pretty-hrtime": "^1.0.3",
- "prompts": "^2.4.0",
- "read-pkg-up": "^7.0.1",
- "semver": "^7.3.7",
- "telejson": "^7.2.0",
- "tiny-invariant": "^1.3.1",
- "ts-dedent": "^2.0.0",
- "util": "^0.12.4",
- "util-deprecate": "^1.0.2",
- "watchpack": "^2.2.0",
- "ws": "^8.2.3"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/core-server/node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
- "node_modules/@storybook/core-server/node_modules/ip": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz",
- "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==",
- "dev": true
- },
- "node_modules/@storybook/core-server/node_modules/is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "dev": true,
- "dependencies": {
- "is-docker": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/core-server/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/@storybook/core-server/node_modules/open": {
- "version": "8.4.2",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
- "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
- "dev": true,
- "dependencies": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/core-server/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/@storybook/core-server/node_modules/util": {
- "version": "0.12.5",
- "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
- "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "is-arguments": "^1.0.4",
- "is-generator-function": "^1.0.7",
- "is-typed-array": "^1.1.3",
- "which-typed-array": "^1.1.2"
- }
- },
- "node_modules/@storybook/core-server/node_modules/watchpack": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
- "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
- "dev": true,
- "dependencies": {
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.1.2"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/@storybook/core-server/node_modules/ws": {
- "version": "8.18.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
- "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
- "dev": true,
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/@storybook/core-webpack": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-8.0.10.tgz",
- "integrity": "sha512-nfhdhulKk0BTQA2e5cuoEpu+mdZawMr7DNnpc29gkTl8sRsED+4TR5HTjWUVCRqMb/a1UNbY4QVe7ozM/rVNdQ==",
- "dev": true,
- "dependencies": {
- "@storybook/core-common": "8.0.10",
- "@storybook/node-logger": "8.0.10",
- "@storybook/types": "8.0.10",
- "@types/node": "^18.0.0",
- "ts-dedent": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/csf": {
- "version": "0.1.11",
- "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz",
- "integrity": "sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "type-fest": "^2.19.0"
- }
- },
- "node_modules/@storybook/csf-plugin": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.0.10.tgz",
- "integrity": "sha512-0EsyEx/06sCjI8sn40r7cABtBU1vUKPMPD+S5mJiZymm73BgdARj0qZOlLoK2LP+t2pcaB/Cn7KX/uyhhv7M2g==",
- "dev": true,
- "dependencies": {
- "@storybook/csf-tools": "8.0.10",
- "unplugin": "^1.3.1"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/csf-tools": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-8.0.10.tgz",
- "integrity": "sha512-xUc6fVIKoCujf/7JZhkYjrVXeNsTSoDrZFNmqLEmtfktJVqYdXY4LuSAtlBmAIyETi09ULTuuVexrcKFwjzuBA==",
- "dev": true,
- "dependencies": {
- "@babel/generator": "^7.23.0",
- "@babel/parser": "^7.23.0",
- "@babel/traverse": "^7.23.2",
- "@babel/types": "^7.23.0",
- "@storybook/csf": "^0.1.4",
- "@storybook/types": "8.0.10",
- "fs-extra": "^11.1.0",
- "recast": "^0.23.5",
- "ts-dedent": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/csf-tools/node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
- "node_modules/@storybook/csf-tools/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/@storybook/csf-tools/node_modules/recast": {
- "version": "0.23.9",
- "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz",
- "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==",
- "dev": true,
- "dependencies": {
- "ast-types": "^0.16.1",
- "esprima": "~4.0.0",
- "source-map": "~0.6.1",
- "tiny-invariant": "^1.3.3",
- "tslib": "^2.0.1"
- },
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/@storybook/csf-tools/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/@storybook/csf/node_modules/type-fest": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
- "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
- "dev": true,
- "engines": {
- "node": ">=12.20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/docs-mdx": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-3.0.0.tgz",
- "integrity": "sha512-NmiGXl2HU33zpwTv1XORe9XG9H+dRUC1Jl11u92L4xr062pZtrShLmD4VKIsOQujxhhOrbxpwhNOt+6TdhyIdQ==",
- "dev": true
- },
- "node_modules/@storybook/docs-tools": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-8.0.10.tgz",
- "integrity": "sha512-rg9KS81vEh13VMr4mAgs+7L4kYqoRtG7kVfV1WHxzJxjR3wYcVR0kP9gPTWV4Xha/TA3onHu9sxKxMTWha0urQ==",
- "dev": true,
- "dependencies": {
- "@storybook/core-common": "8.0.10",
- "@storybook/core-events": "8.0.10",
- "@storybook/preview-api": "8.0.10",
- "@storybook/types": "8.0.10",
- "@types/doctrine": "^0.0.3",
- "assert": "^2.1.0",
- "doctrine": "^3.0.0",
- "lodash": "^4.17.21"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/docs-tools/node_modules/assert": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz",
- "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "is-nan": "^1.3.2",
- "object-is": "^1.1.5",
- "object.assign": "^4.1.4",
- "util": "^0.12.5"
- }
- },
- "node_modules/@storybook/docs-tools/node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@storybook/docs-tools/node_modules/util": {
- "version": "0.12.5",
- "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
- "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "is-arguments": "^1.0.4",
- "is-generator-function": "^1.0.7",
- "is-typed-array": "^1.1.3",
- "which-typed-array": "^1.1.2"
- }
- },
- "node_modules/@storybook/global": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz",
- "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==",
- "dev": true
- },
- "node_modules/@storybook/icons": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.3.0.tgz",
- "integrity": "sha512-Nz/UzeYQdUZUhacrPyfkiiysSjydyjgg/p0P9HxB4p/WaJUUjMAcaoaLgy3EXx61zZJ3iD36WPuDkZs5QYrA0A==",
- "dev": true,
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta"
- }
- },
- "node_modules/@storybook/instrumenter": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.0.10.tgz",
- "integrity": "sha512-6IYjWeQFA5x68xRoW5dU4yAc1Hwq1ZBkZbXVgJbr5LJw5x+y8eKdZzIaOmSsSKOI96R7J5YWWd2WA1Q0nRurtg==",
- "dev": true,
- "dependencies": {
- "@storybook/channels": "8.0.10",
- "@storybook/client-logger": "8.0.10",
- "@storybook/core-events": "8.0.10",
- "@storybook/global": "^5.0.0",
- "@storybook/preview-api": "8.0.10",
- "@vitest/utils": "^1.3.1",
- "util": "^0.12.4"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/instrumenter/node_modules/util": {
- "version": "0.12.5",
- "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
- "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "is-arguments": "^1.0.4",
- "is-generator-function": "^1.0.7",
- "is-typed-array": "^1.1.3",
- "which-typed-array": "^1.1.2"
- }
- },
- "node_modules/@storybook/manager": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-8.0.10.tgz",
- "integrity": "sha512-bojGglUQNry48L4siURc2zQKswavLzMh69rqsfL3ZXx+i+USfRfB7593azTlaZh0q6HO4bUAjB24RfQCyifLLQ==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/manager-api": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.0.10.tgz",
- "integrity": "sha512-LLu6YKQLWf5QB3h3RO8IevjLrSOew7aidIQPr9DIr9xC8wA7N2fQabr+qrJdE306p3cHZ0nzhYNYZxSjm4Dvdw==",
- "dev": true,
- "dependencies": {
- "@storybook/channels": "8.0.10",
- "@storybook/client-logger": "8.0.10",
- "@storybook/core-events": "8.0.10",
- "@storybook/csf": "^0.1.4",
- "@storybook/global": "^5.0.0",
- "@storybook/icons": "^1.2.5",
- "@storybook/router": "8.0.10",
- "@storybook/theming": "8.0.10",
- "@storybook/types": "8.0.10",
- "dequal": "^2.0.2",
- "lodash": "^4.17.21",
- "memoizerific": "^1.11.3",
- "store2": "^2.14.2",
- "telejson": "^7.2.0",
- "ts-dedent": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/node-logger": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-8.0.10.tgz",
- "integrity": "sha512-UMmaUaA3VOX/mKLsSvOnbZre2/1tZ6hazA6H0eAnClKb51jRD1AJrsBYK+uHr/CAp7t710bB5U8apPov7hayDw==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/preset-react-webpack": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-8.0.10.tgz",
- "integrity": "sha512-+I0x8snLl9sfc3xXh51YLXwp0Km4Jhri+JJeT2r+zSI3k/fdu5bLz5NFPcxDmRm5ZPpaQyiLc2Mge4txMkFsZw==",
- "dev": true,
- "dependencies": {
- "@storybook/core-webpack": "8.0.10",
- "@storybook/docs-tools": "8.0.10",
- "@storybook/node-logger": "8.0.10",
- "@storybook/react": "8.0.10",
- "@storybook/react-docgen-typescript-plugin": "1.0.6--canary.9.0c3f3b7.0",
- "@types/node": "^18.0.0",
- "@types/semver": "^7.3.4",
- "find-up": "^5.0.0",
- "fs-extra": "^11.1.0",
- "magic-string": "^0.30.5",
- "react-docgen": "^7.0.0",
- "resolve": "^1.22.8",
- "semver": "^7.3.7",
- "tsconfig-paths": "^4.2.0",
- "webpack": "5"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- },
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@storybook/preset-react-webpack/node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/preset-react-webpack/node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
- "node_modules/@storybook/preset-react-webpack/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/@storybook/preset-react-webpack/node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/preset-react-webpack/node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/preset-react-webpack/node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@storybook/preset-react-webpack/node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
- "dev": true,
- "engines": {
- "node": ">=4"
+ "node": ">=4"
}
},
"node_modules/@storybook/preset-react-webpack/node_modules/tsconfig-paths": {
@@ -13522,78 +11975,31 @@
"node": ">=6"
}
},
- "node_modules/@storybook/preset-react-webpack/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/@storybook/preview": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-8.0.10.tgz",
- "integrity": "sha512-op7gZqop8PSFyPA4tc1Zds8jG6VnskwpYUUsa44pZoEez9PKEFCf4jE+7AQwbBS3hnuCb0CKBfASN8GRyoznbw==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
"node_modules/@storybook/preview-api": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.0.10.tgz",
- "integrity": "sha512-uZ6btF7Iloz9TnDcKLQ5ydi2YK0cnulv/8FLQhBCwSrzLLLb+T2DGz0cAeuWZEvMUNWNmkWJ9PAFQFs09/8p/Q==",
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.4.7.tgz",
+ "integrity": "sha512-0QVQwHw+OyZGHAJEXo6Knx+6/4er7n2rTDE5RYJ9F2E2Lg42E19pfdLlq2Jhoods2Xrclo3wj6GWR//Ahi39Eg==",
"dev": true,
- "dependencies": {
- "@storybook/channels": "8.0.10",
- "@storybook/client-logger": "8.0.10",
- "@storybook/core-events": "8.0.10",
- "@storybook/csf": "^0.1.4",
- "@storybook/global": "^5.0.0",
- "@storybook/types": "8.0.10",
- "@types/qs": "^6.9.5",
- "dequal": "^2.0.2",
- "lodash": "^4.17.21",
- "memoizerific": "^1.11.3",
- "qs": "^6.10.0",
- "tiny-invariant": "^1.3.1",
- "ts-dedent": "^2.0.0",
- "util-deprecate": "^1.0.2"
- },
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
}
},
"node_modules/@storybook/react": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.0.10.tgz",
- "integrity": "sha512-/MIMc02TNmiNXDzk55dm9+ujfNE5LVNeqqK+vxXWLlCZ0aXRAd1/ZLYeRFuYLgEETB7mh7IP8AXjvM68NX5HYg==",
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.4.7.tgz",
+ "integrity": "sha512-nQ0/7i2DkaCb7dy0NaT95llRVNYWQiPIVuhNfjr1mVhEP7XD090p0g7eqUmsx8vfdHh2BzWEo6CoBFRd3+EXxw==",
"dev": true,
"dependencies": {
- "@storybook/client-logger": "8.0.10",
- "@storybook/docs-tools": "8.0.10",
+ "@storybook/components": "8.4.7",
"@storybook/global": "^5.0.0",
- "@storybook/preview-api": "8.0.10",
- "@storybook/react-dom-shim": "8.0.10",
- "@storybook/types": "8.0.10",
- "@types/escodegen": "^0.0.6",
- "@types/estree": "^0.0.51",
- "@types/node": "^18.0.0",
- "acorn": "^7.4.1",
- "acorn-jsx": "^5.3.1",
- "acorn-walk": "^7.2.0",
- "escodegen": "^2.1.0",
- "html-tags": "^3.1.0",
- "lodash": "^4.17.21",
- "prop-types": "^15.7.2",
- "react-element-to-jsx-string": "^15.0.0",
- "semver": "^7.3.7",
- "ts-dedent": "^2.0.0",
- "type-fest": "~2.19",
- "util-deprecate": "^1.0.2"
+ "@storybook/manager-api": "8.4.7",
+ "@storybook/preview-api": "8.4.7",
+ "@storybook/react-dom-shim": "8.4.7",
+ "@storybook/theming": "8.4.7"
},
"engines": {
"node": ">=18.0.0"
@@ -13603,11 +12009,16 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "@storybook/test": "8.4.7",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "storybook": "^8.4.7",
"typescript": ">= 4.2.x"
},
"peerDependenciesMeta": {
+ "@storybook/test": {
+ "optional": true
+ },
"typescript": {
"optional": true
}
@@ -13756,29 +12167,30 @@
}
},
"node_modules/@storybook/react-dom-shim": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.0.10.tgz",
- "integrity": "sha512-3x8EWEkZebpWpp1pwXEzdabGINwOQt8odM5+hsOlDRtFZBmUqmmzK0rtn7orlcGlOXO4rd6QuZj4Tc5WV28dVQ==",
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.4.7.tgz",
+ "integrity": "sha512-6bkG2jvKTmWrmVzCgwpTxwIugd7Lu+2btsLAqhQSzDyIj2/uhMNp8xIMr/NBDtLgq3nomt9gefNa9xxLwk/OMg==",
"dev": true,
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "storybook": "^8.4.7"
}
},
"node_modules/@storybook/react-webpack5": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-8.0.10.tgz",
- "integrity": "sha512-KqQTYiFBTfWJOKP4SxirXRNLYCaLxFlDmEyUjQHuBbA03fEnvTYlCR7Kv5leArvBTiMpat2IfPqXlc048PKFRw==",
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-8.4.7.tgz",
+ "integrity": "sha512-T9GLqlsP4It4El7cC8rSkBPRWvORAsTDULeWlO36RST2TrYnmBOUytsi22mk7cAAAVhhD6rTrs1YdqWRMpfa1w==",
"dev": true,
"dependencies": {
- "@storybook/builder-webpack5": "8.0.10",
- "@storybook/preset-react-webpack": "8.0.10",
- "@storybook/react": "8.0.10",
- "@types/node": "^18.0.0"
+ "@storybook/builder-webpack5": "8.4.7",
+ "@storybook/preset-react-webpack": "8.4.7",
+ "@storybook/react": "8.4.7",
+ "@types/node": "^22.0.0"
},
"engines": {
"node": ">=18.0.0"
@@ -13788,8 +12200,9 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta",
+ "storybook": "^8.4.7",
"typescript": ">= 4.2.x"
},
"peerDependenciesMeta": {
@@ -13798,66 +12211,23 @@
}
}
},
- "node_modules/@storybook/react/node_modules/@types/estree": {
- "version": "0.0.51",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
- "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==",
- "dev": true
- },
- "node_modules/@storybook/react/node_modules/acorn": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
- "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/@storybook/react/node_modules/type-fest": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
- "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
- "dev": true,
- "engines": {
- "node": ">=12.20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@storybook/router": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/router/-/router-8.0.10.tgz",
- "integrity": "sha512-AZhgiet+EK0ZsPbaDgbbVTAHW2LAMCP1z/Un2uMBbdDeD0Ys29Af47AbEj/Ome5r1cqasLvzq2WXJlVXPNB0Zw==",
- "dev": true,
- "dependencies": {
- "@storybook/client-logger": "8.0.10",
- "memoizerific": "^1.11.3",
- "qs": "^6.10.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
- }
- },
"node_modules/@storybook/source-loader": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-8.0.10.tgz",
- "integrity": "sha512-bv9FRPzELjcoMJLWLDqkUNh1zY0DiCgcvM+9qsZva8pxAD4fzrX+mgCS2vZVJHRg8wMAhw/ymdXixDUodHAvsw==",
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/source-loader/-/source-loader-8.4.7.tgz",
+ "integrity": "sha512-DrsYGGfNbbqlMzkhbLoNyNqrPa4QIkZ6O7FJ8Z/8jWb0cerQH2N6JW6k12ZnXgs8dO2Z33+iSEDIV8odh0E0PA==",
"dev": true,
"dependencies": {
- "@storybook/csf": "^0.1.4",
- "@storybook/types": "8.0.10",
+ "@storybook/csf": "^0.1.11",
+ "es-toolkit": "^1.22.0",
"estraverse": "^5.2.0",
- "lodash": "^4.17.21",
"prettier": "^3.1.1"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.4.7"
}
},
"node_modules/@storybook/source-loader/node_modules/estraverse": {
@@ -13884,87 +12254,52 @@
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
- "node_modules/@storybook/telemetry": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-8.0.10.tgz",
- "integrity": "sha512-s4Uc+KZQkdmD2d+64Qf8wYknhQZwmjf2CxjIjv9b4KLsU/nyfDheK7Fzd1jhBKb2UQUlLW5HhZkBgs1RsZcDHA==",
+ "node_modules/@storybook/test": {
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.4.7.tgz",
+ "integrity": "sha512-AhvJsu5zl3uG40itSQVuSy5WByp3UVhS6xAnme4FWRwgSxhvZjATJ3AZkkHWOYjnnk+P2/sbz/XuPli1FVCWoQ==",
"dev": true,
"dependencies": {
- "@storybook/client-logger": "8.0.10",
- "@storybook/core-common": "8.0.10",
- "@storybook/csf-tools": "8.0.10",
- "chalk": "^4.1.0",
- "detect-package-manager": "^2.0.1",
- "fetch-retry": "^5.0.2",
- "fs-extra": "^11.1.0",
- "read-pkg-up": "^7.0.1"
+ "@storybook/csf": "^0.1.11",
+ "@storybook/global": "^5.0.0",
+ "@storybook/instrumenter": "8.4.7",
+ "@testing-library/dom": "10.4.0",
+ "@testing-library/jest-dom": "6.5.0",
+ "@testing-library/user-event": "14.5.2",
+ "@vitest/expect": "2.0.5",
+ "@vitest/spy": "2.0.5"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
- }
- },
- "node_modules/@storybook/telemetry/node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
},
- "engines": {
- "node": ">=14.14"
+ "peerDependencies": {
+ "storybook": "^8.4.7"
}
},
- "node_modules/@storybook/telemetry/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "node_modules/@storybook/test/node_modules/@testing-library/dom": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz",
+ "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==",
"dev": true,
"dependencies": {
- "universalify": "^2.0.0"
+ "@babel/code-frame": "^7.10.4",
+ "@babel/runtime": "^7.12.5",
+ "@types/aria-query": "^5.0.1",
+ "aria-query": "5.3.0",
+ "chalk": "^4.1.0",
+ "dom-accessibility-api": "^0.5.9",
+ "lz-string": "^1.5.0",
+ "pretty-format": "^27.0.2"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/@storybook/telemetry/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
"engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/@storybook/test": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.0.10.tgz",
- "integrity": "sha512-VqjzKJiOCjaZ0CjLeKygYk8uetiaiKbpIox+BrND9GtpEBHcRZA5AeFY2P1aSCOhsaDwuh4KRBxJWFug7DhWGQ==",
- "dev": true,
- "dependencies": {
- "@storybook/client-logger": "8.0.10",
- "@storybook/core-events": "8.0.10",
- "@storybook/instrumenter": "8.0.10",
- "@storybook/preview-api": "8.0.10",
- "@testing-library/dom": "^9.3.4",
- "@testing-library/jest-dom": "^6.4.2",
- "@testing-library/user-event": "^14.5.2",
- "@vitest/expect": "1.3.1",
- "@vitest/spy": "^1.3.1",
- "util": "^0.12.4"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/storybook"
+ "node": ">=18"
}
},
"node_modules/@storybook/test/node_modules/@testing-library/jest-dom": {
- "version": "6.6.3",
- "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz",
- "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==",
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.5.0.tgz",
+ "integrity": "sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==",
"dev": true,
"dependencies": {
"@adobe/css-tools": "^4.4.0",
@@ -13981,6 +12316,25 @@
"yarn": ">=1"
}
},
+ "node_modules/@storybook/test/node_modules/@testing-library/jest-dom/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@storybook/test/node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
+ "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==",
+ "dev": true
+ },
"node_modules/@storybook/test/node_modules/@testing-library/user-event": {
"version": "14.5.2",
"resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz",
@@ -13995,42 +12349,55 @@
}
},
"node_modules/@storybook/test/node_modules/aria-query": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
- "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
+ "dev": true,
+ "dependencies": {
+ "dequal": "^2.0.3"
+ }
+ },
+ "node_modules/@storybook/test/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"engines": {
- "node": ">= 0.4"
+ "node": ">=8"
}
},
- "node_modules/@storybook/test/node_modules/chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "node_modules/@storybook/test/node_modules/pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
"dev": true,
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
},
"engines": {
- "node": ">=8"
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
}
},
- "node_modules/@storybook/test/node_modules/dom-accessibility-api": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
- "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==",
- "dev": true
- },
- "node_modules/@storybook/test/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "node_modules/@storybook/test/node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
"dev": true,
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
+ "node_modules/@storybook/test/node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true
+ },
"node_modules/@storybook/test/node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -14043,60 +12410,30 @@
"node": ">=8"
}
},
- "node_modules/@storybook/test/node_modules/util": {
- "version": "0.12.5",
- "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
- "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "is-arguments": "^1.0.4",
- "is-generator-function": "^1.0.7",
- "is-typed-array": "^1.1.3",
- "which-typed-array": "^1.1.2"
- }
- },
"node_modules/@storybook/theming": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.0.10.tgz",
- "integrity": "sha512-7NHt7bMC7lPkwz9KdDpa6DkLoQZz5OV6jsx/qY91kcdLo1rpnRPAiVlJvmWesFxi1oXOpVDpHHllWzf8KDBv8A==",
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.4.7.tgz",
+ "integrity": "sha512-99rgLEjf7iwfSEmdqlHkSG3AyLcK0sfExcr0jnc6rLiAkBhzuIsvcHjjUwkR210SOCgXqBPW0ZA6uhnuyppHLw==",
"dev": true,
- "dependencies": {
- "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
- "@storybook/client-logger": "8.0.10",
- "@storybook/global": "^5.0.0",
- "memoizerific": "^1.11.3"
- },
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "react": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- }
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
}
},
"node_modules/@storybook/types": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/@storybook/types/-/types-8.0.10.tgz",
- "integrity": "sha512-S/hKS7+SqNnYIehwxdQ4M2nnlfGDdYWAXdtPCVJCmS+YF2amgAxeuisiHbUg7eypds6VL0Oxk/j2nPEHOHk9pg==",
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/@storybook/types/-/types-8.4.7.tgz",
+ "integrity": "sha512-zuf0uPFjODB9Ls9/lqXnb1YsDKFuaASLOpTzpRlz9amFtTepo1dB0nVF9ZWcseTgGs7UxA4+ZR2SZrduXw/ihw==",
"dev": true,
- "dependencies": {
- "@storybook/channels": "8.0.10",
- "@types/express": "^4.7.0",
- "file-system-cache": "2.3.0"
- },
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0"
}
},
"node_modules/@stylistic/stylelint-plugin": {
@@ -14949,43 +13286,10 @@
"@types/node": "*"
}
},
- "node_modules/@types/cross-spawn": {
- "version": "6.0.6",
- "resolved": "https://registry.npmjs.org/@types/cross-spawn/-/cross-spawn-6.0.6.tgz",
- "integrity": "sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==",
- "dev": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/detect-port": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/detect-port/-/detect-port-1.3.5.tgz",
- "integrity": "sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==",
- "dev": true
- },
"node_modules/@types/doctrine": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz",
- "integrity": "sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==",
- "dev": true
- },
- "node_modules/@types/ejs": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.5.tgz",
- "integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==",
- "dev": true
- },
- "node_modules/@types/emscripten": {
- "version": "1.39.13",
- "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.13.tgz",
- "integrity": "sha512-cFq+fO/isvhvmuP/+Sl4K4jtU6E23DoivtbO4r50e3odaxAiVdbfSYRDdJ4gCdxx+3aRjhphS5ZMwIH4hFy/Cw==",
- "dev": true
- },
- "node_modules/@types/escodegen": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/@types/escodegen/-/escodegen-0.0.6.tgz",
- "integrity": "sha512-AjwI4MvWx3HAOaZqYsjKWyEObT9lcVV0Y0V8nXo6cXzN8ZiMxVhf6F3d/UNvXVGKrEzL/Dluc5p+y9GkzlTWig==",
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz",
+ "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==",
"dev": true
},
"node_modules/@types/eslint": {
@@ -15075,15 +13379,6 @@
"resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.45.tgz",
"integrity": "sha512-qkcUlZmX6c4J8q45taBKTL3p+LbITgyx7qhlPYOdOHZB7B31K0mXbP5YA7i7SgDeEGuI9MnumiKPEMrxg8j3KQ=="
},
- "node_modules/@types/hast": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
- "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
- "dev": true,
- "dependencies": {
- "@types/unist": "*"
- }
- },
"node_modules/@types/highlight-words-core": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@types/highlight-words-core/-/highlight-words-core-1.2.1.tgz",
@@ -15261,12 +13556,11 @@
}
},
"node_modules/@types/node": {
- "version": "18.19.59",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.59.tgz",
- "integrity": "sha512-vizm2EqwV/7Zay+A6J3tGl9Lhr7CjZe2HmWS988sefiEmsyP9CeXEleho6i4hJk/8UtZAo0bWN4QPZZr83RxvQ==",
- "license": "MIT",
+ "version": "22.10.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz",
+ "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==",
"dependencies": {
- "undici-types": "~5.26.4"
+ "undici-types": "~6.20.0"
}
},
"node_modules/@types/node-forge": {
@@ -15318,12 +13612,6 @@
"integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==",
"dev": true
},
- "node_modules/@types/pretty-hrtime": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
- "integrity": "sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==",
- "dev": true
- },
"node_modules/@types/prop-types": {
"version": "15.7.4",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
@@ -16164,12 +14452,6 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/@ungap/structured-clone": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz",
- "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==",
- "dev": true
- },
"node_modules/@use-gesture/core": {
"version": "10.3.1",
"resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz",
@@ -16187,41 +14469,54 @@
}
},
"node_modules/@vitest/expect": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.3.1.tgz",
- "integrity": "sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz",
+ "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==",
"dev": true,
"dependencies": {
- "@vitest/spy": "1.3.1",
- "@vitest/utils": "1.3.1",
- "chai": "^4.3.10"
+ "@vitest/spy": "2.0.5",
+ "@vitest/utils": "2.0.5",
+ "chai": "^5.1.1",
+ "tinyrainbow": "^1.2.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/pretty-format": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz",
+ "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==",
+ "dev": true,
+ "dependencies": {
+ "tinyrainbow": "^1.2.0"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
"node_modules/@vitest/spy": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.3.1.tgz",
- "integrity": "sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz",
+ "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==",
"dev": true,
"dependencies": {
- "tinyspy": "^2.2.0"
+ "tinyspy": "^3.0.0"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
"node_modules/@vitest/utils": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.3.1.tgz",
- "integrity": "sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==",
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz",
+ "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==",
"dev": true,
"dependencies": {
- "diff-sequences": "^29.6.3",
+ "@vitest/pretty-format": "2.0.5",
"estree-walker": "^3.0.3",
- "loupe": "^2.3.7",
- "pretty-format": "^29.7.0"
+ "loupe": "^3.1.1",
+ "tinyrainbow": "^1.2.0"
},
"funding": {
"url": "https://opencollective.com/vitest"
@@ -17571,59 +15866,6 @@
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
},
- "node_modules/@yarnpkg/esbuild-plugin-pnp": {
- "version": "3.0.0-rc.15",
- "resolved": "https://registry.npmjs.org/@yarnpkg/esbuild-plugin-pnp/-/esbuild-plugin-pnp-3.0.0-rc.15.tgz",
- "integrity": "sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==",
- "dev": true,
- "dependencies": {
- "tslib": "^2.4.0"
- },
- "engines": {
- "node": ">=14.15.0"
- },
- "peerDependencies": {
- "esbuild": ">=0.10.0"
- }
- },
- "node_modules/@yarnpkg/fslib": {
- "version": "2.10.3",
- "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-2.10.3.tgz",
- "integrity": "sha512-41H+Ga78xT9sHvWLlFOZLIhtU6mTGZ20pZ29EiZa97vnxdohJD2AF42rCoAoWfqUz486xY6fhjMH+DYEM9r14A==",
- "dev": true,
- "dependencies": {
- "@yarnpkg/libzip": "^2.3.0",
- "tslib": "^1.13.0"
- },
- "engines": {
- "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0"
- }
- },
- "node_modules/@yarnpkg/fslib/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- },
- "node_modules/@yarnpkg/libzip": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@yarnpkg/libzip/-/libzip-2.3.0.tgz",
- "integrity": "sha512-6xm38yGVIa6mKm/DUCF2zFFJhERh/QWp1ufm4cNUvxsONBmfPg8uZ9pZBdOmF6qFGr/HlT6ABBkCSx/dlEtvWg==",
- "dev": true,
- "dependencies": {
- "@types/emscripten": "^1.39.6",
- "tslib": "^1.13.0"
- },
- "engines": {
- "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0"
- }
- },
- "node_modules/@yarnpkg/libzip/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- },
"node_modules/@yarnpkg/lockfile": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
@@ -17734,15 +15976,6 @@
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
- "node_modules/acorn-walk": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
- "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
- "dev": true,
- "engines": {
- "node": ">=0.4.0"
- }
- },
"node_modules/add-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz",
@@ -17750,15 +15983,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/address": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
- "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
"node_modules/adm-zip": {
"version": "0.5.9",
"resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.9.tgz",
@@ -18020,12 +16244,6 @@
"node": ">= 8"
}
},
- "node_modules/app-root-dir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/app-root-dir/-/app-root-dir-1.0.2.tgz",
- "integrity": "sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==",
- "dev": true
- },
"node_modules/app-root-path": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz",
@@ -18861,12 +17079,12 @@
}
},
"node_modules/assertion-error": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
- "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
"dev": true,
"engines": {
- "node": "*"
+ "node": ">=12"
}
},
"node_modules/assign-symbols": {
@@ -20560,30 +18778,19 @@
"integrity": "sha512-Jt9tIBkRc9POUof7QA/VwWd+58fKkEEfI+/t1/eOlxKM7ZhrczNzMFefge7Ai+39y1pR/pP6cI19guHy3FSLmw=="
},
"node_modules/chai": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz",
- "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==",
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz",
+ "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==",
"dev": true,
"dependencies": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.3",
- "deep-eql": "^4.1.3",
- "get-func-name": "^2.0.2",
- "loupe": "^2.3.6",
- "pathval": "^1.1.1",
- "type-detect": "^4.1.0"
+ "assertion-error": "^2.0.1",
+ "check-error": "^2.1.1",
+ "deep-eql": "^5.0.1",
+ "loupe": "^3.1.0",
+ "pathval": "^2.0.0"
},
"engines": {
- "node": ">=4"
- }
- },
- "node_modules/chai/node_modules/type-detect": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz",
- "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==",
- "dev": true,
- "engines": {
- "node": ">=4"
+ "node": ">=12"
}
},
"node_modules/chalk": {
@@ -20673,15 +18880,12 @@
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
},
"node_modules/check-error": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
- "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz",
+ "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==",
"dev": true,
- "dependencies": {
- "get-func-name": "^2.0.2"
- },
"engines": {
- "node": "*"
+ "node": ">= 16"
}
},
"node_modules/check-node-version": {
@@ -20956,24 +19160,6 @@
"safe-buffer": "^5.0.1"
}
},
- "node_modules/citty": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz",
- "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
- "dev": true,
- "dependencies": {
- "consola": "^3.2.3"
- }
- },
- "node_modules/citty/node_modules/consola": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
- "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
- "dev": true,
- "engines": {
- "node": "^14.18.0 || >=16.10.0"
- }
- },
"node_modules/cjs-module-lexer": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz",
@@ -21064,50 +19250,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/cli-table3": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
- "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": "10.* || >= 12.*"
- },
- "optionalDependencies": {
- "@colors/colors": "1.5.0"
- }
- },
- "node_modules/cli-table3/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/cli-table3/node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cli-table3/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/cli-truncate": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz",
@@ -21725,12 +19867,6 @@
"node": ">=0.8.0"
}
},
- "node_modules/confbox": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
- "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
- "dev": true
- },
"node_modules/configstore": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
@@ -23507,13 +21643,10 @@
"dev": true
},
"node_modules/deep-eql": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz",
- "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==",
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz",
+ "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==",
"dev": true,
- "dependencies": {
- "type-detect": "^4.0.0"
- },
"engines": {
"node": ">=6"
}
@@ -23894,12 +22027,6 @@
"node": ">= 0.4"
}
},
- "node_modules/defu": {
- "version": "6.1.4",
- "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
- "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
- "dev": true
- },
"node_modules/degenerator": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
@@ -24118,136 +22245,6 @@
"resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
"integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
},
- "node_modules/detect-package-manager": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz",
- "integrity": "sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==",
- "dev": true,
- "dependencies": {
- "execa": "^5.1.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/detect-package-manager/node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/detect-package-manager/node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/detect-package-manager/node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true,
- "engines": {
- "node": ">=10.17.0"
- }
- },
- "node_modules/detect-package-manager/node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/detect-package-manager/node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/detect-package-manager/node_modules/npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/detect-package-manager/node_modules/onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dev": true,
- "dependencies": {
- "mimic-fn": "^2.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/detect-package-manager/node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/detect-port": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz",
- "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==",
- "dev": true,
- "dependencies": {
- "address": "^1.0.1",
- "debug": "4"
- },
- "bin": {
- "detect": "bin/detect-port.js",
- "detect-port": "bin/detect-port.js"
- },
- "engines": {
- "node": ">= 4.0.0"
- }
- },
"node_modules/devtools-protocol": {
"version": "0.0.1367902",
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz",
@@ -24449,15 +22446,6 @@
"url": "https://dotenvx.com"
}
},
- "node_modules/dotenv-expand": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz",
- "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==",
- "dev": true,
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/dset": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz",
@@ -25017,9 +23005,9 @@
"dev": true
},
"node_modules/es-module-lexer": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
- "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w=="
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
+ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw=="
},
"node_modules/es-set-tostringtag": {
"version": "2.0.1",
@@ -25058,6 +23046,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/es-toolkit": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.29.0.tgz",
+ "integrity": "sha512-GjTll+E6APcfAQA09D89HdT8Qn2Yb+TeDSDBTMcxAo+V+w1amAtCI15LJu4YPH/UCPoSo/F47Gr1LIM0TE0lZA==",
+ "dev": true
+ },
"node_modules/es6-error": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
@@ -25102,12 +23096,6 @@
"@esbuild/win32-x64": "0.18.20"
}
},
- "node_modules/esbuild-plugin-alias": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/esbuild-plugin-alias/-/esbuild-plugin-alias-0.2.1.tgz",
- "integrity": "sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==",
- "dev": true
- },
"node_modules/esbuild-register": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz",
@@ -26679,12 +24667,6 @@
"node": "^12.20 || >= 14.13"
}
},
- "node_modules/fetch-retry": {
- "version": "5.0.6",
- "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.6.tgz",
- "integrity": "sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==",
- "dev": true
- },
"node_modules/figgy-pudding": {
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
@@ -26715,51 +24697,6 @@
"node": "^10.12.0 || >=12.0.0"
}
},
- "node_modules/file-system-cache": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/file-system-cache/-/file-system-cache-2.3.0.tgz",
- "integrity": "sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==",
- "dev": true,
- "dependencies": {
- "fs-extra": "11.1.1",
- "ramda": "0.29.0"
- }
- },
- "node_modules/file-system-cache/node_modules/fs-extra": {
- "version": "11.1.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz",
- "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
- "node_modules/file-system-cache/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/file-system-cache/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
"node_modules/file-uri-to-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
@@ -27856,15 +25793,6 @@
"node": "6.* || 8.* || >= 10.*"
}
},
- "node_modules/get-func-name": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
- "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
"node_modules/get-intrinsic": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
@@ -27891,15 +25819,6 @@
"node": ">=6"
}
},
- "node_modules/get-npm-tarball-url": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/get-npm-tarball-url/-/get-npm-tarball-url-2.1.0.tgz",
- "integrity": "sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==",
- "dev": true,
- "engines": {
- "node": ">=12.17"
- }
- },
"node_modules/get-own-enumerable-property-symbols": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
@@ -28109,34 +26028,6 @@
"safe-buffer": "^5.1.1"
}
},
- "node_modules/giget": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.3.tgz",
- "integrity": "sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA==",
- "dev": true,
- "dependencies": {
- "citty": "^0.1.6",
- "consola": "^3.2.3",
- "defu": "^6.1.4",
- "node-fetch-native": "^1.6.3",
- "nypm": "^0.3.8",
- "ohash": "^1.1.3",
- "pathe": "^1.1.2",
- "tar": "^6.2.0"
- },
- "bin": {
- "giget": "dist/cli.mjs"
- }
- },
- "node_modules/giget/node_modules/consola": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
- "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
- "dev": true,
- "engines": {
- "node": "^14.18.0 || >=16.10.0"
- }
- },
"node_modules/git-raw-commits": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-3.0.0.tgz",
@@ -28235,12 +26126,6 @@
"license": "MIT",
"optional": true
},
- "node_modules/github-slugger": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
- "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==",
- "dev": true
- },
"node_modules/glob": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
@@ -28474,38 +26359,6 @@
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="
},
- "node_modules/gunzip-maybe": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz",
- "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==",
- "dev": true,
- "dependencies": {
- "browserify-zlib": "^0.1.4",
- "is-deflate": "^1.0.0",
- "is-gzip": "^1.0.0",
- "peek-stream": "^1.1.0",
- "pumpify": "^1.3.3",
- "through2": "^2.0.3"
- },
- "bin": {
- "gunzip-maybe": "bin.js"
- }
- },
- "node_modules/gunzip-maybe/node_modules/browserify-zlib": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
- "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==",
- "dev": true,
- "dependencies": {
- "pako": "~0.2.0"
- }
- },
- "node_modules/gunzip-maybe/node_modules/pako": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
- "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==",
- "dev": true
- },
"node_modules/handle-thing": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
@@ -28755,45 +26608,6 @@
"node": ">= 0.4"
}
},
- "node_modules/hast-util-heading-rank": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-heading-rank/-/hast-util-heading-rank-3.0.0.tgz",
- "integrity": "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==",
- "dev": true,
- "dependencies": {
- "@types/hast": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-is-element": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz",
- "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==",
- "dev": true,
- "dependencies": {
- "@types/hast": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-to-string": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz",
- "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==",
- "dev": true,
- "dependencies": {
- "@types/hast": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
"node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@@ -29871,18 +27685,6 @@
"node": ">=8"
}
},
- "node_modules/is-absolute-url": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz",
- "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==",
- "dev": true,
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/is-accessor-descriptor": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz",
@@ -30082,12 +27884,6 @@
"resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.2.tgz",
"integrity": "sha512-TRzl7mOCchnhchN+f3ICUCzYvL9ul7R+TYOsZ8xia++knyZAJfv/uA1FvQXsAnYIl1T3B2X5E/J7Wb1QXiIBXg=="
},
- "node_modules/is-deflate": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz",
- "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==",
- "dev": true
- },
"node_modules/is-descriptor": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
@@ -30181,15 +27977,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/is-gzip": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz",
- "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/is-hexadecimal": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.2.tgz",
@@ -30250,22 +28037,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-nan": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz",
- "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-negative-zero": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
@@ -32289,20 +30060,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/lazy-universal-dotenv": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-4.0.0.tgz",
- "integrity": "sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==",
- "dev": true,
- "dependencies": {
- "app-root-dir": "^1.0.2",
- "dotenv": "^16.0.0",
- "dotenv-expand": "^10.0.0"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
"node_modules/lazystream": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
@@ -34617,13 +32374,10 @@
}
},
"node_modules/loupe": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
- "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
- "dev": true,
- "dependencies": {
- "get-func-name": "^2.0.1"
- }
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz",
+ "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==",
+ "dev": true
},
"node_modules/lower-case": {
"version": "2.0.2",
@@ -35204,18 +32958,6 @@
"resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz",
"integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q=="
},
- "node_modules/markdown-to-jsx": {
- "version": "7.3.2",
- "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.3.2.tgz",
- "integrity": "sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==",
- "dev": true,
- "engines": {
- "node": ">= 10"
- },
- "peerDependencies": {
- "react": ">= 0.14.0"
- }
- },
"node_modules/markdownlint": {
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.25.1.tgz",
@@ -36542,30 +34284,6 @@
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
"dev": true
},
- "node_modules/mlly": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.3.tgz",
- "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==",
- "dev": true,
- "dependencies": {
- "acorn": "^8.14.0",
- "pathe": "^1.1.2",
- "pkg-types": "^1.2.1",
- "ufo": "^1.5.4"
- }
- },
- "node_modules/mlly/node_modules/acorn": {
- "version": "8.14.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
- "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
"node_modules/mock-match-media": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/mock-match-media/-/mock-match-media-0.4.2.tgz",
@@ -37190,12 +34908,6 @@
}
}
},
- "node_modules/node-fetch-native": {
- "version": "1.6.4",
- "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz",
- "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==",
- "dev": true
- },
"node_modules/node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
@@ -38473,169 +36185,6 @@
"node": ">=12"
}
},
- "node_modules/nypm": {
- "version": "0.3.12",
- "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.12.tgz",
- "integrity": "sha512-D3pzNDWIvgA+7IORhD/IuWzEk4uXv6GsgOxiid4UU3h9oq5IqV1KtPDi63n4sZJ/xcWlr88c0QM2RgN5VbOhFA==",
- "dev": true,
- "dependencies": {
- "citty": "^0.1.6",
- "consola": "^3.2.3",
- "execa": "^8.0.1",
- "pathe": "^1.1.2",
- "pkg-types": "^1.2.0",
- "ufo": "^1.5.4"
- },
- "bin": {
- "nypm": "dist/cli.mjs"
- },
- "engines": {
- "node": "^14.16.0 || >=16.10.0"
- }
- },
- "node_modules/nypm/node_modules/consola": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
- "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
- "dev": true,
- "engines": {
- "node": "^14.18.0 || >=16.10.0"
- }
- },
- "node_modules/nypm/node_modules/execa": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
- "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^8.0.1",
- "human-signals": "^5.0.0",
- "is-stream": "^3.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^5.1.0",
- "onetime": "^6.0.0",
- "signal-exit": "^4.1.0",
- "strip-final-newline": "^3.0.0"
- },
- "engines": {
- "node": ">=16.17"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/nypm/node_modules/get-stream": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
- "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
- "dev": true,
- "engines": {
- "node": ">=16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/nypm/node_modules/human-signals": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
- "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
- "dev": true,
- "engines": {
- "node": ">=16.17.0"
- }
- },
- "node_modules/nypm/node_modules/is-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
- "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
- "dev": true,
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/nypm/node_modules/mimic-fn": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
- "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/nypm/node_modules/npm-run-path": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
- "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
- "dev": true,
- "dependencies": {
- "path-key": "^4.0.0"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/nypm/node_modules/onetime": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
- "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
- "dev": true,
- "dependencies": {
- "mimic-fn": "^4.0.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/nypm/node_modules/path-key": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
- "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/nypm/node_modules/signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "dev": true,
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/nypm/node_modules/strip-final-newline": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
- "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/ob1": {
"version": "0.80.5",
"resolved": "https://registry.npmjs.org/ob1/-/ob1-0.80.5.tgz",
@@ -38842,12 +36391,6 @@
"integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==",
"dev": true
},
- "node_modules/ohash": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.4.tgz",
- "integrity": "sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==",
- "dev": true
- },
"node_modules/on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@@ -40081,19 +37624,13 @@
"node": ">=4"
}
},
- "node_modules/pathe": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz",
- "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==",
- "dev": true
- },
"node_modules/pathval": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
- "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz",
+ "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==",
"dev": true,
"engines": {
- "node": "*"
+ "node": ">= 14.16"
}
},
"node_modules/pbkdf2": {
@@ -40112,17 +37649,6 @@
"node": ">=0.12"
}
},
- "node_modules/peek-stream": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz",
- "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==",
- "dev": true,
- "dependencies": {
- "buffer-from": "^1.0.0",
- "duplexify": "^3.5.0",
- "through2": "^2.0.3"
- }
- },
"node_modules/pegjs": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz",
@@ -40227,17 +37753,6 @@
"node": ">=4"
}
},
- "node_modules/pkg-types": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.1.tgz",
- "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==",
- "dev": true,
- "dependencies": {
- "confbox": "^0.1.8",
- "mlly": "^1.7.2",
- "pathe": "^1.1.2"
- }
- },
"node_modules/platform": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz",
@@ -41150,15 +38665,6 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
},
- "node_modules/pretty-hrtime": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
- "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
"node_modules/proc-log": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz",
@@ -41706,16 +39212,6 @@
"node": ">=8"
}
},
- "node_modules/ramda": {
- "version": "0.29.0",
- "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.29.0.tgz",
- "integrity": "sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==",
- "dev": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/ramda"
- }
- },
"node_modules/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
@@ -41949,12 +39445,6 @@
"typescript": ">= 4.3.x"
}
},
- "node_modules/react-docgen/node_modules/@types/doctrine": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz",
- "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==",
- "dev": true
- },
"node_modules/react-docgen/node_modules/doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@@ -41994,27 +39484,6 @@
"react": "^18.3.1"
}
},
- "node_modules/react-element-to-jsx-string": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz",
- "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==",
- "dev": true,
- "dependencies": {
- "@base2/pretty-print-object": "1.0.1",
- "is-plain-object": "5.0.0",
- "react-is": "18.1.0"
- },
- "peerDependencies": {
- "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0",
- "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0"
- }
- },
- "node_modules/react-element-to-jsx-string/node_modules/react-is": {
- "version": "18.1.0",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz",
- "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==",
- "dev": true
- },
"node_modules/react-freeze": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.3.tgz",
@@ -42437,9 +39906,9 @@
}
},
"node_modules/react-remove-scroll-bar": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz",
- "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==",
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz",
+ "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==",
"dependencies": {
"react-style-singleton": "^2.2.1",
"tslib": "^2.0.0"
@@ -43088,137 +40557,6 @@
"regjsparser": "bin/parser"
}
},
- "node_modules/rehype-external-links": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz",
- "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==",
- "dev": true,
- "dependencies": {
- "@types/hast": "^3.0.0",
- "@ungap/structured-clone": "^1.0.0",
- "hast-util-is-element": "^3.0.0",
- "is-absolute-url": "^4.0.0",
- "space-separated-tokens": "^2.0.0",
- "unist-util-visit": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/rehype-external-links/node_modules/@types/unist": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
- "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
- "dev": true
- },
- "node_modules/rehype-external-links/node_modules/unist-util-is": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
- "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
- "dev": true,
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/rehype-external-links/node_modules/unist-util-visit": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
- "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
- "dev": true,
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0",
- "unist-util-visit-parents": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/rehype-external-links/node_modules/unist-util-visit-parents": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
- "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
- "dev": true,
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/rehype-slug": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/rehype-slug/-/rehype-slug-6.0.0.tgz",
- "integrity": "sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==",
- "dev": true,
- "dependencies": {
- "@types/hast": "^3.0.0",
- "github-slugger": "^2.0.0",
- "hast-util-heading-rank": "^3.0.0",
- "hast-util-to-string": "^3.0.0",
- "unist-util-visit": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/rehype-slug/node_modules/@types/unist": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
- "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
- "dev": true
- },
- "node_modules/rehype-slug/node_modules/unist-util-is": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
- "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
- "dev": true,
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/rehype-slug/node_modules/unist-util-visit": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
- "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
- "dev": true,
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0",
- "unist-util-visit-parents": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/rehype-slug/node_modules/unist-util-visit-parents": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
- "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
- "dev": true,
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
"node_modules/relateurl": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
@@ -45409,16 +42747,6 @@
"integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
"deprecated": "See https://github.com/lydell/source-map-url#deprecated"
},
- "node_modules/space-separated-tokens": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
- "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
- "dev": true,
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
"node_modules/spacetrim": {
"version": "0.11.59",
"resolved": "https://registry.npmjs.org/spacetrim/-/spacetrim-0.11.59.tgz",
@@ -45732,27 +43060,30 @@
"node": ">= 0.4"
}
},
- "node_modules/store2": {
- "version": "2.14.3",
- "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.3.tgz",
- "integrity": "sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==",
- "dev": true
- },
"node_modules/storybook": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.0.10.tgz",
- "integrity": "sha512-9/4oxISopLyr5xz7Du27mmQgcIfB7UTLlNzkK4IklWTiSgsOgYgZpsmIwymoXNtkrvh+QsqskdcUP1C7nNiEtw==",
+ "version": "8.4.7",
+ "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.4.7.tgz",
+ "integrity": "sha512-RP/nMJxiWyFc8EVMH5gp20ID032Wvk+Yr3lmKidoegto5Iy+2dVQnUoElZb2zpbVXNHWakGuAkfI0dY1Hfp/vw==",
"dev": true,
"dependencies": {
- "@storybook/cli": "8.0.10"
+ "@storybook/core": "8.4.7"
},
"bin": {
- "sb": "index.js",
- "storybook": "index.js"
+ "getstorybook": "bin/index.cjs",
+ "sb": "bin/index.cjs",
+ "storybook": "bin/index.cjs"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/storybook"
+ },
+ "peerDependencies": {
+ "prettier": "^2 || ^3"
+ },
+ "peerDependenciesMeta": {
+ "prettier": {
+ "optional": true
+ }
}
},
"node_modules/storybook-source-link": {
@@ -46838,6 +44169,7 @@
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
"integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
"dev": true,
+ "optional": true,
"dependencies": {
"chownr": "^1.1.1",
"mkdirp-classic": "^0.5.2",
@@ -46851,6 +44183,7 @@
"integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
"dev": true,
"license": "MIT",
+ "optional": true,
"dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
@@ -46970,15 +44303,6 @@
"node": ">= 8"
}
},
- "node_modules/telejson": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/telejson/-/telejson-7.2.0.tgz",
- "integrity": "sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==",
- "dev": true,
- "dependencies": {
- "memoizerific": "^1.11.3"
- }
- },
"node_modules/temp": {
"version": "0.8.4",
"resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz",
@@ -47030,126 +44354,6 @@
"rimraf": "bin.js"
}
},
- "node_modules/tempy": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz",
- "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==",
- "dev": true,
- "dependencies": {
- "del": "^6.0.0",
- "is-stream": "^2.0.0",
- "temp-dir": "^2.0.0",
- "type-fest": "^0.16.0",
- "unique-string": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/tempy/node_modules/del": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz",
- "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==",
- "dev": true,
- "dependencies": {
- "globby": "^11.0.1",
- "graceful-fs": "^4.2.4",
- "is-glob": "^4.0.1",
- "is-path-cwd": "^2.2.0",
- "is-path-inside": "^3.0.2",
- "p-map": "^4.0.0",
- "rimraf": "^3.0.2",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/tempy/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/tempy/node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/tempy/node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/tempy/node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "deprecated": "Rimraf versions prior to v4 are no longer supported",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/tempy/node_modules/temp-dir": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
- "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/tempy/node_modules/type-fest": {
- "version": "0.16.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
- "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/terminal-link": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.0.0.tgz",
@@ -47410,10 +44614,19 @@
"integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==",
"dev": true
},
+ "node_modules/tinyrainbow": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz",
+ "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/tinyspy": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz",
- "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
+ "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
"dev": true,
"engines": {
"node": ">=14.0.0"
@@ -47530,12 +44743,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/tocbot": {
- "version": "4.32.2",
- "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.32.2.tgz",
- "integrity": "sha512-UbVZNXX79LUqMzsnSTwE/YF/PYc2pg3G77D/jcolHd6lmw+oklzfcLtHSsmWBhOf1wfWD1HfYzdjGQef1VcQgg==",
- "dev": true
- },
"node_modules/toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
@@ -47999,12 +45206,6 @@
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
},
- "node_modules/ufo": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz",
- "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==",
- "dev": true
- },
"node_modules/uglify-js": {
"version": "3.13.7",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.7.tgz",
@@ -48077,9 +45278,9 @@
}
},
"node_modules/undici-types": {
- "version": "5.26.5",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
- "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+ "version": "6.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg=="
},
"node_modules/unherit": {
"version": "1.1.1",
@@ -48302,12 +45503,6 @@
"node": ">=0.4.0"
}
},
- "node_modules/unplugin/node_modules/webpack-virtual-modules": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
- "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
- "dev": true
- },
"node_modules/unset-value": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
@@ -50117,9 +47312,9 @@
"dev": true
},
"node_modules/webpack-dev-middleware/node_modules/schema-utils": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
- "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz",
+ "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==",
"dev": true,
"dependencies": {
"@types/json-schema": "^7.0.9",
@@ -50128,7 +47323,7 @@
"ajv-keywords": "^5.1.0"
},
"engines": {
- "node": ">= 12.13.0"
+ "node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
@@ -50404,9 +47599,9 @@
}
},
"node_modules/webpack-virtual-modules": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
- "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
+ "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
"dev": true
},
"node_modules/webpack/node_modules/@types/estree": {
diff --git a/package.json b/package.json
index b799ee7aed99b..07d725c4a3edc 100644
--- a/package.json
+++ b/package.json
@@ -42,18 +42,19 @@
"@react-native/babel-preset": "0.73.10",
"@react-native/metro-babel-transformer": "0.73.10",
"@react-native/metro-config": "0.73.4",
- "@storybook/addon-a11y": "8.0.10",
- "@storybook/addon-actions": "8.0.10",
- "@storybook/addon-controls": "8.0.10",
- "@storybook/addon-docs": "8.0.10",
- "@storybook/addon-toolbars": "8.0.10",
- "@storybook/addon-viewport": "8.0.10",
+ "@storybook/addon-a11y": "8.4.7",
+ "@storybook/addon-actions": "8.4.7",
+ "@storybook/addon-controls": "8.4.7",
+ "@storybook/addon-docs": "8.4.7",
+ "@storybook/addon-toolbars": "8.4.7",
+ "@storybook/addon-viewport": "8.4.7",
"@storybook/addon-webpack5-compiler-babel": "3.0.3",
- "@storybook/react": "8.0.10",
- "@storybook/react-webpack5": "8.0.10",
- "@storybook/source-loader": "8.0.10",
- "@storybook/test": "8.0.10",
- "@storybook/theming": "8.0.10",
+ "@storybook/react": "8.4.7",
+ "@storybook/react-webpack5": "8.4.7",
+ "@storybook/source-loader": "8.4.7",
+ "@storybook/test": "8.4.7",
+ "@storybook/theming": "8.4.7",
+ "@storybook/types": "8.4.7",
"@testing-library/jest-dom": "5.16.5",
"@testing-library/react": "14.3.0",
"@testing-library/react-native": "12.4.3",
@@ -158,7 +159,7 @@
"snapshot-diff": "0.10.0",
"source-map-loader": "3.0.0",
"sprintf-js": "1.1.1",
- "storybook": "8.0.10",
+ "storybook": "8.4.7",
"storybook-source-link": "2.0.9",
"strip-json-comments": "5.0.0",
"style-loader": "3.2.1",
diff --git a/storybook/main.js b/storybook/main.js
index 8a1203938fba5..29f24c223ccdf 100644
--- a/storybook/main.js
+++ b/storybook/main.js
@@ -62,9 +62,7 @@ module.exports = {
name: '@storybook/react-webpack5',
options: {},
},
- docs: {
- autodocs: true,
- },
+ docs: {},
typescript: {
reactDocgen: 'react-docgen-typescript',
},
diff --git a/storybook/preview.js b/storybook/preview.js
index e173ab3ed1e26..b29fceec846ff 100644
--- a/storybook/preview.js
+++ b/storybook/preview.js
@@ -155,3 +155,5 @@ export const parameters = {
},
sourceLinkPrefix: 'https://github.com/WordPress/gutenberg/blob/trunk/',
};
+
+export const tags = [ 'autodocs' ];
From f1f59887a8aa3b6d3fa5f7163338fec7bee1b79b Mon Sep 17 00:00:00 2001
From: Andrei Draganescu
Date: Thu, 12 Dec 2024 15:24:30 +0200
Subject: [PATCH 024/239] Make Write mode and Zoom out block options menus
consistent (#67749)
* hide block settings slot in content only and zoom out, allow copy in content only
* adds tests for counting the length of the options menu
* remove duplicate condition, zoom out makes sections content only
Co-authored-by: draganescu
Co-authored-by: talldan
Co-authored-by: rinkalpagdar
Co-authored-by: richtabor
---
.../block-settings-dropdown.js | 37 +++++++++----------
.../editor/src/components/provider/index.js | 19 ++--------
.../editor/various/write-design-mode.spec.js | 11 ++++++
test/e2e/specs/site-editor/zoom-out.spec.js | 33 +++++++++++++++++
4 files changed, 64 insertions(+), 36 deletions(-)
diff --git a/packages/block-editor/src/components/block-settings-menu/block-settings-dropdown.js b/packages/block-editor/src/components/block-settings-menu/block-settings-dropdown.js
index b9caee7c338be..ade9ddd5ec165 100644
--- a/packages/block-editor/src/components/block-settings-menu/block-settings-dropdown.js
+++ b/packages/block-editor/src/components/block-settings-menu/block-settings-dropdown.js
@@ -65,7 +65,6 @@ export function BlockSettingsDropdown( {
selectedBlockClientIds,
openedBlockSettingsMenu,
isContentOnly,
- isZoomOut,
} = useSelect(
( select ) => {
const {
@@ -76,7 +75,6 @@ export function BlockSettingsDropdown( {
getBlockAttributes,
getOpenedBlockSettingsMenu,
getBlockEditingMode,
- isZoomOut: _isZoomOut,
} = unlock( select( blockEditorStore ) );
const { getActiveBlockVariation } = select( blocksStore );
@@ -101,7 +99,6 @@ export function BlockSettingsDropdown( {
openedBlockSettingsMenu: getOpenedBlockSettingsMenu(),
isContentOnly:
getBlockEditingMode( firstBlockClientId ) === 'contentOnly',
- isZoomOut: _isZoomOut(),
};
},
[ firstBlockClientId ]
@@ -253,15 +250,13 @@ export function BlockSettingsDropdown( {
clientId={ firstBlockClientId }
/>
) }
- { ( ! isContentOnly || isZoomOut ) && (
-
- ) }
+
{ canDuplicate && (
) }
-
+ { ! isContentOnly && (
+
+ ) }
{ typeof children === 'function'
? children( { onClose } )
: Children.map( ( child ) =>
diff --git a/packages/editor/src/components/provider/index.js b/packages/editor/src/components/provider/index.js
index 68d7bd1d3f4f5..4b8a3b6b23c25 100644
--- a/packages/editor/src/components/provider/index.js
+++ b/packages/editor/src/components/provider/index.js
@@ -13,7 +13,6 @@ import {
BlockEditorProvider,
BlockContextProvider,
privateApis as blockEditorPrivateApis,
- store as blockEditorStore,
} from '@wordpress/block-editor';
import { store as noticesStore } from '@wordpress/notices';
import { privateApis as editPatternsPrivateApis } from '@wordpress/patterns';
@@ -207,14 +206,6 @@ export const ExperimentalEditorProvider = withRegistryProvider(
[ post.type ]
);
- const isZoomOut = useSelect( ( select ) => {
- const { isZoomOut: _isZoomOut } = unlock(
- select( blockEditorStore )
- );
-
- return _isZoomOut();
- } );
-
const shouldRenderTemplate = !! template && mode !== 'post-only';
const rootLevelPost = shouldRenderTemplate ? template : post;
const defaultBlockContext = useMemo( () => {
@@ -367,13 +358,9 @@ export const ExperimentalEditorProvider = withRegistryProvider(
{ children }
{ ! settings.isPreviewMode && (
<>
- { ! isZoomOut && (
- <>
-
-
-
- >
- ) }
+
+
+
{ mode === 'template-locked' && (
) }
diff --git a/test/e2e/specs/editor/various/write-design-mode.spec.js b/test/e2e/specs/editor/various/write-design-mode.spec.js
index 2892b4aea89e9..fb3e231e6fff6 100644
--- a/test/e2e/specs/editor/various/write-design-mode.spec.js
+++ b/test/e2e/specs/editor/various/write-design-mode.spec.js
@@ -100,6 +100,17 @@ test.describe( 'Write/Design mode', () => {
expect( await getSelectedBlock() ).toEqual( sectionClientId );
+ // open the block toolbar more settings menu
+ await page.getByLabel( 'Block tools' ).getByLabel( 'Options' ).click();
+
+ // get the length of the options menu
+ const optionsMenu = page
+ .getByRole( 'menu', { name: 'Options' } )
+ .getByRole( 'menuitem' );
+
+ // we expect 3 items in the options menu
+ await expect( optionsMenu ).toHaveCount( 3 );
+
// We should be able to select the paragraph block and write in it.
await paragraph.click();
await page.keyboard.type( ' something' );
diff --git a/test/e2e/specs/site-editor/zoom-out.spec.js b/test/e2e/specs/site-editor/zoom-out.spec.js
index 77d121e199939..493b566671f8b 100644
--- a/test/e2e/specs/site-editor/zoom-out.spec.js
+++ b/test/e2e/specs/site-editor/zoom-out.spec.js
@@ -234,6 +234,39 @@ test.describe( 'Zoom Out', () => {
await expect( fourthSectionStart ).not.toBeInViewport();
} );
+ test( 'Zoom out selected section has three items in options menu', async ( {
+ page,
+ } ) => {
+ // open the inserter
+ await page
+ .getByRole( 'button', {
+ name: 'Block Inserter',
+ exact: true,
+ } )
+ .click();
+ // switch to patterns tab
+ await page.getByRole( 'tab', { name: 'Patterns' } ).click();
+ // search for a pattern
+ await page
+ .getByRole( 'searchbox', { name: 'Search' } )
+ .fill( 'Footer' );
+ // click on Footer with colophon, 3 columns
+ await page
+ .getByRole( 'option', { name: 'Footer with colophon, 3 columns' } )
+ .click();
+
+ // open the block toolbar more settings menu
+ await page.getByLabel( 'Block tools' ).getByLabel( 'Options' ).click();
+
+ // get the length of the options menu
+ const optionsMenu = page
+ .getByRole( 'menu', { name: 'Options' } )
+ .getByRole( 'menuitem' );
+
+ // we expect 3 items in the options menu
+ await expect( optionsMenu ).toHaveCount( 3 );
+ } );
+
test( 'Zoom Out cannot be activated when the section root is missing', async ( {
page,
editor,
From 0ef8a35b55e07b633292fe25805994f6843d5af1 Mon Sep 17 00:00:00 2001
From: VATALIYA PARTH <88878890+PARTHVATALIYA@users.noreply.github.com>
Date: Thu, 12 Dec 2024 19:17:36 +0530
Subject: [PATCH 025/239] Widget Editor: Fix: close button is not working
(#65443)
* Fix: close button is not working
* Remove unnecessary CSS
---------
Unlinked contributors: parthVataliya16.
Co-authored-by: PARTHVATALIYA
Co-authored-by: draganescu
Co-authored-by: t-hamano
Co-authored-by: miminari
---
.../edit-widgets/src/components/layout/style.scss | 7 -------
.../secondary-sidebar/inserter-sidebar.js | 13 +------------
2 files changed, 1 insertion(+), 19 deletions(-)
diff --git a/packages/edit-widgets/src/components/layout/style.scss b/packages/edit-widgets/src/components/layout/style.scss
index 14d74e4db9248..71b1049adf196 100644
--- a/packages/edit-widgets/src/components/layout/style.scss
+++ b/packages/edit-widgets/src/components/layout/style.scss
@@ -7,13 +7,6 @@
}
}
-.edit-widgets-layout__inserter-panel-header {
- padding-top: $grid-unit-10;
- padding-right: $grid-unit-10;
- display: flex;
- justify-content: flex-end;
-}
-
.edit-widgets-layout__inserter-panel-content {
// Leave space for the close button
height: calc(100% - #{$button-size} - #{$grid-unit-10});
diff --git a/packages/edit-widgets/src/components/secondary-sidebar/inserter-sidebar.js b/packages/edit-widgets/src/components/secondary-sidebar/inserter-sidebar.js
index 4b26dd306ea0a..72e04e5f62034 100644
--- a/packages/edit-widgets/src/components/secondary-sidebar/inserter-sidebar.js
+++ b/packages/edit-widgets/src/components/secondary-sidebar/inserter-sidebar.js
@@ -1,8 +1,6 @@
/**
* WordPress dependencies
*/
-import { Button, VisuallyHidden } from '@wordpress/components';
-import { close } from '@wordpress/icons';
import { __experimentalLibrary as Library } from '@wordpress/block-editor';
import {
useViewportMatch,
@@ -10,7 +8,6 @@ import {
} from '@wordpress/compose';
import { useCallback, useRef } from '@wordpress/element';
import { useDispatch } from '@wordpress/data';
-import { __ } from '@wordpress/i18n';
/**
* Internal dependencies
@@ -28,7 +25,6 @@ export default function InserterSidebar() {
return setIsInserterOpened( false );
}, [ setIsInserterOpened ] );
- const TagName = ! isMobileViewport ? VisuallyHidden : 'div';
const [ inserterDialogRef, inserterDialogProps ] = useDialog( {
onClose: closeInserter,
focusOnMount: true,
@@ -42,14 +38,6 @@ export default function InserterSidebar() {
{ ...inserterDialogProps }
className="edit-widgets-layout__inserter-panel"
>
-
-
-
From 3de8dfbebe63daa6e23d5441dfe61996bc78c7b2 Mon Sep 17 00:00:00 2001
From: Bernie Reiter <96308+ockham@users.noreply.github.com>
Date: Thu, 12 Dec 2024 16:50:08 +0100
Subject: [PATCH 026/239] Block Hooks: Apply to Post Content (on frontend and
in editor) (#67272)
Co-authored-by: ockham
Co-authored-by: gziolo
---
backport-changelog/6.8/7898.md | 3 +
lib/compat/wordpress-6.8/blocks.php | 162 ++++++++++++++++++
.../block-library/src/post-content/index.php | 23 +++
3 files changed, 188 insertions(+)
create mode 100644 backport-changelog/6.8/7898.md
diff --git a/backport-changelog/6.8/7898.md b/backport-changelog/6.8/7898.md
new file mode 100644
index 0000000000000..d824c5da82ec1
--- /dev/null
+++ b/backport-changelog/6.8/7898.md
@@ -0,0 +1,3 @@
+https://github.com/WordPress/wordpress-develop/pull/7898
+
+* https://github.com/WordPress/gutenberg/pull/67272
diff --git a/lib/compat/wordpress-6.8/blocks.php b/lib/compat/wordpress-6.8/blocks.php
index e0f5082bfce8d..8e176e58c8d7f 100644
--- a/lib/compat/wordpress-6.8/blocks.php
+++ b/lib/compat/wordpress-6.8/blocks.php
@@ -149,3 +149,165 @@ function gutenberg_stabilize_experimental_block_supports( $args ) {
}
add_filter( 'register_block_type_args', 'gutenberg_stabilize_experimental_block_supports', PHP_INT_MAX, 1 );
+
+function gutenberg_apply_block_hooks_to_post_content( $content ) {
+ // The `the_content` filter does not provide the post that the content is coming from.
+ // However, we can infer it by calling `get_post()`, which will return the current post
+ // if no post ID is provided.
+ return apply_block_hooks_to_content( $content, get_post(), 'insert_hooked_blocks' );
+}
+// We need to apply this filter before `do_blocks` (which is hooked to `the_content` at priority 9).
+add_filter( 'the_content', 'gutenberg_apply_block_hooks_to_post_content', 8 );
+
+/**
+ * Hooks into the REST API response for the Posts endpoint and adds the first and last inner blocks.
+ *
+ * @since 6.6.0
+ * @since 6.8.0 Support non-`wp_navigation` post types.
+ *
+ * @param WP_REST_Response $response The response object.
+ * @param WP_Post $post Post object.
+ * @return WP_REST_Response The response object.
+ */
+function gutenberg_insert_hooked_blocks_into_rest_response( $response, $post ) {
+ if ( empty( $response->data['content']['raw'] ) || empty( $response->data['content']['rendered'] ) ) {
+ return $response;
+ }
+
+ $attributes = array();
+ $ignored_hooked_blocks = get_post_meta( $post->ID, '_wp_ignored_hooked_blocks', true );
+ if ( ! empty( $ignored_hooked_blocks ) ) {
+ $ignored_hooked_blocks = json_decode( $ignored_hooked_blocks, true );
+ $attributes['metadata'] = array(
+ 'ignoredHookedBlocks' => $ignored_hooked_blocks,
+ );
+ }
+
+ if ( 'wp_navigation' === $post->post_type ) {
+ $wrapper_block_type = 'core/navigation';
+ } else {
+ $wrapper_block_type = 'core/post-content';
+ }
+
+ $content = get_comment_delimited_block_content(
+ $wrapper_block_type,
+ $attributes,
+ $response->data['content']['raw']
+ );
+
+ $content = apply_block_hooks_to_content(
+ $content,
+ $post,
+ 'insert_hooked_blocks_and_set_ignored_hooked_blocks_metadata'
+ );
+
+ // Remove mock block wrapper.
+ $content = remove_serialized_parent_block( $content );
+
+ $response->data['content']['raw'] = $content;
+
+ // No need to inject hooked blocks twice.
+ $priority = has_filter( 'the_content', 'apply_block_hooks_to_content' );
+ if ( false !== $priority ) {
+ remove_filter( 'the_content', 'apply_block_hooks_to_content', $priority );
+ }
+
+ /** This filter is documented in wp-includes/post-template.php */
+ $response->data['content']['rendered'] = apply_filters( 'the_content', $content );
+
+ // Add back the filter.
+ if ( false !== $priority ) {
+ add_filter( 'the_content', 'apply_block_hooks_to_content', $priority );
+ }
+
+ return $response;
+}
+add_filter( 'rest_prepare_page', 'gutenberg_insert_hooked_blocks_into_rest_response', 10, 2 );
+add_filter( 'rest_prepare_post', 'gutenberg_insert_hooked_blocks_into_rest_response', 10, 2 );
+
+/**
+ * Updates the wp_postmeta with the list of ignored hooked blocks
+ * where the inner blocks are stored as post content.
+ *
+ * @since 6.6.0
+ * @since 6.8.0 Support other post types. (Previously, it was limited to `wp_navigation` only.)
+ * @access private
+ *
+ * @param stdClass $post Post object.
+ * @return stdClass The updated post object.
+ */
+function gutenberg_update_ignored_hooked_blocks_postmeta( $post ) {
+ /*
+ * In this scenario the user has likely tried to create a new post object via the REST API.
+ * In which case we won't have a post ID to work with and store meta against.
+ */
+ if ( empty( $post->ID ) ) {
+ return $post;
+ }
+
+ /*
+ * Skip meta generation when consumers intentionally update specific fields
+ * and omit the content update.
+ */
+ if ( ! isset( $post->post_content ) ) {
+ return $post;
+ }
+
+ /*
+ * Skip meta generation if post type is not set.
+ */
+ if ( ! isset( $post->post_type ) ) {
+ return $post;
+ }
+
+ $attributes = array();
+
+ $ignored_hooked_blocks = get_post_meta( $post->ID, '_wp_ignored_hooked_blocks', true );
+ if ( ! empty( $ignored_hooked_blocks ) ) {
+ $ignored_hooked_blocks = json_decode( $ignored_hooked_blocks, true );
+ $attributes['metadata'] = array(
+ 'ignoredHookedBlocks' => $ignored_hooked_blocks,
+ );
+ }
+
+ if ( 'wp_navigation' === $post->post_type ) {
+ $wrapper_block_type = 'core/navigation';
+ } else {
+ $wrapper_block_type = 'core/post-content';
+ }
+
+ $markup = get_comment_delimited_block_content(
+ $wrapper_block_type,
+ $attributes,
+ $post->post_content
+ );
+
+ $existing_post = get_post( $post->ID );
+ // Merge the existing post object with the updated post object to pass to the block hooks algorithm for context.
+ $context = (object) array_merge( (array) $existing_post, (array) $post );
+ $context = new WP_Post( $context ); // Convert to WP_Post object.
+ $serialized_block = apply_block_hooks_to_content( $markup, $context, 'set_ignored_hooked_blocks_metadata' );
+ $root_block = parse_blocks( $serialized_block )[0];
+
+ $ignored_hooked_blocks = isset( $root_block['attrs']['metadata']['ignoredHookedBlocks'] )
+ ? $root_block['attrs']['metadata']['ignoredHookedBlocks']
+ : array();
+
+ if ( ! empty( $ignored_hooked_blocks ) ) {
+ $existing_ignored_hooked_blocks = get_post_meta( $post->ID, '_wp_ignored_hooked_blocks', true );
+ if ( ! empty( $existing_ignored_hooked_blocks ) ) {
+ $existing_ignored_hooked_blocks = json_decode( $existing_ignored_hooked_blocks, true );
+ $ignored_hooked_blocks = array_unique( array_merge( $ignored_hooked_blocks, $existing_ignored_hooked_blocks ) );
+ }
+
+ if ( ! isset( $post->meta_input ) ) {
+ $post->meta_input = array();
+ }
+ $post->meta_input['_wp_ignored_hooked_blocks'] = json_encode( $ignored_hooked_blocks );
+ }
+
+ $post->post_content = remove_serialized_parent_block( $serialized_block );
+ return $post;
+}
+add_filter( 'rest_pre_insert_page', 'gutenberg_update_ignored_hooked_blocks_postmeta' );
+add_filter( 'rest_pre_insert_post', 'gutenberg_update_ignored_hooked_blocks_postmeta' );
diff --git a/packages/block-library/src/post-content/index.php b/packages/block-library/src/post-content/index.php
index 25be880cc4788..e0a06b7217eeb 100644
--- a/packages/block-library/src/post-content/index.php
+++ b/packages/block-library/src/post-content/index.php
@@ -46,10 +46,33 @@ function render_block_core_post_content( $attributes, $content, $block ) {
$content .= wp_link_pages( array( 'echo' => 0 ) );
}
+ $ignored_hooked_blocks = get_post_meta( $post_id, '_wp_ignored_hooked_blocks', true );
+ if ( ! empty( $ignored_hooked_blocks ) ) {
+ $ignored_hooked_blocks = json_decode( $ignored_hooked_blocks, true );
+ $attributes['metadata'] = array(
+ 'ignoredHookedBlocks' => $ignored_hooked_blocks,
+ );
+ }
+
+ // Wrap in Post Content block so the Block Hooks algorithm can insert blocks
+ // that are hooked as first or last child of `core/post-content`.
+ $content = get_comment_delimited_block_content(
+ 'core/post-content',
+ $attributes,
+ $content
+ );
+
+ // We need to remove the `core/post-content` block wrapper after the Block Hooks algorithm,
+ // but before `do_blocks` runs, as it would otherwise attempt to render the same block again --
+ // thus recursing infinitely.
+ add_filter( 'the_content', 'remove_serialized_parent_block', 8 );
+
/** This filter is documented in wp-includes/post-template.php */
$content = apply_filters( 'the_content', str_replace( ']]>', ']]>', $content ) );
unset( $seen_ids[ $post_id ] );
+ remove_filter( 'the_content', 'remove_serialized_parent_block', 8 );
+
if ( empty( $content ) ) {
return '';
}
From 4263e8549989b374bbf8f47c61e1e08a3fe3b041 Mon Sep 17 00:00:00 2001
From: Riad Benguella
Date: Thu, 12 Dec 2024 17:42:58 +0100
Subject: [PATCH 027/239] BoxControl: Add support for presets (#67688)
Co-authored-by: youknowriad
Co-authored-by: ntsekouras
Co-authored-by: ramonjd
Co-authored-by: jorgefilipecosta
Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: jameskoster
---
packages/components/CHANGELOG.md | 6 +-
packages/components/src/box-control/README.md | 16 ++
packages/components/src/box-control/index.tsx | 4 +
.../src/box-control/input-control.tsx | 182 ++++++++++++++----
.../src/box-control/stories/index.story.tsx | 12 ++
packages/components/src/box-control/types.ts | 18 ++
packages/components/src/box-control/utils.ts | 60 ++++++
7 files changed, 256 insertions(+), 42 deletions(-)
diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md
index e8ae2bc7ba609..49cc196b1f7e6 100644
--- a/packages/components/CHANGELOG.md
+++ b/packages/components/CHANGELOG.md
@@ -2,6 +2,10 @@
## Unreleased
+### Enhancements
+
+- `BoxControl`: Add presets support ([#67688](https://github.com/WordPress/gutenberg/pull/67688)).
+
### Deprecations
- `SelectControl`: Deprecate 36px default size ([#66898](https://github.com/WordPress/gutenberg/pull/66898)).
@@ -24,7 +28,7 @@
- `Menu`: Replace hardcoded white color with theme-ready variable ([#67649](https://github.com/WordPress/gutenberg/pull/67649)).
- `Navigation` (deprecated): Replace hardcoded white color with theme-ready variable ([#67649](https://github.com/WordPress/gutenberg/pull/67649)).
- `ToggleGroupControl`: Replace hardcoded white color with theme-ready variable ([#67649](https://github.com/WordPress/gutenberg/pull/67649)).
-- `RangeControl`: Update the design of the range control marks ([#67611](https://github.com/WordPress/gutenberg/pull/67611))
+- `RangeControl`: Update the design of the range control marks ([#67611](https://github.com/WordPress/gutenberg/pull/67611)).
- `BorderBoxControl`: Reduce gap value when unlinked ([#67049](https://github.com/WordPress/gutenberg/pull/67049)).
- `DropdownMenu`: Increase option height to 40px ([#67435](https://github.com/WordPress/gutenberg/pull/67435)).
- `MenuItem`: Increase height to 40px ([#67435](https://github.com/WordPress/gutenberg/pull/67435)).
diff --git a/packages/components/src/box-control/README.md b/packages/components/src/box-control/README.md
index 8bcb5a5dad8fc..da08cafceee42 100644
--- a/packages/components/src/box-control/README.md
+++ b/packages/components/src/box-control/README.md
@@ -79,6 +79,22 @@ A callback function when an input value changes.
- Required: No
- Default: `() => {}`
+### `presets`
+
+Available presets to pick from.
+
+ - Type: `Preset[]`
+ - Required: No
+
+### `presetKey`
+
+The key of the preset to apply.
+If you provide a list of presets, you must provide a preset key to use.
+The format of preset selected values is going to be `var:preset|${ presetKey }|${ presetSlug }`
+
+ - Type: `string`
+ - Required: No
+
### `resetValues`
The `top`, `right`, `bottom`, and `left` box dimension values to use when the control is reset.
diff --git a/packages/components/src/box-control/index.tsx b/packages/components/src/box-control/index.tsx
index 279dfa55eafe3..d4d4b03f89303 100644
--- a/packages/components/src/box-control/index.tsx
+++ b/packages/components/src/box-control/index.tsx
@@ -83,6 +83,8 @@ function BoxControl( {
splitOnAxis = false,
allowReset = true,
resetValues = DEFAULT_VALUES,
+ presets,
+ presetKey,
onMouseOver,
onMouseOut,
}: BoxControlProps ) {
@@ -153,6 +155,8 @@ function BoxControl( {
sides,
values: inputValues,
__next40pxDefaultSize,
+ presets,
+ presetKey,
};
maybeWarnDeprecated36pxSize( {
diff --git a/packages/components/src/box-control/input-control.tsx b/packages/components/src/box-control/input-control.tsx
index 2e1765f518a57..81fbcad42c1d0 100644
--- a/packages/components/src/box-control/input-control.tsx
+++ b/packages/components/src/box-control/input-control.tsx
@@ -3,6 +3,8 @@
*/
import { useInstanceId } from '@wordpress/compose';
import { __ } from '@wordpress/i18n';
+import { useState } from '@wordpress/element';
+import { settings } from '@wordpress/icons';
/**
* Internal dependencies
@@ -11,10 +13,13 @@ import Tooltip from '../tooltip';
import { parseQuantityAndUnitFromRawValue } from '../unit-control/utils';
import {
CUSTOM_VALUE_SETTINGS,
- getAllowedSides,
getMergedValue,
- isValueMixed,
+ getAllowedSides,
+ getPresetIndexFromValue,
+ getPresetValueFromIndex,
+ isValuePreset,
isValuesDefined,
+ isValueMixed,
LABELS,
} from './utils';
import {
@@ -24,6 +29,7 @@ import {
StyledUnitControl,
} from './styles/box-control-styles';
import type { BoxControlInputControlProps, BoxControlValue } from './types';
+import Button from '../button';
const noop = () => {};
@@ -79,6 +85,8 @@ export default function BoxInputControl( {
sides,
side,
min = 0,
+ presets,
+ presetKey,
...props
}: BoxControlInputControlProps ) {
const defaultValuesToModify = getSidesToModify( side, sides );
@@ -91,6 +99,15 @@ export default function BoxInputControl( {
onChange( nextValues );
};
+ const handleRawOnValueChange = ( next?: string ) => {
+ const nextValues = { ...values };
+ defaultValuesToModify.forEach( ( modifiedSide ) => {
+ nextValues[ modifiedSide ] = next;
+ } );
+
+ handleOnChange( nextValues );
+ };
+
const handleOnValueChange = (
next?: string,
extra?: { event: React.SyntheticEvent< Element, Event > }
@@ -148,52 +165,135 @@ export default function BoxInputControl( {
const usedValue =
mergedValue === undefined && computedUnit ? computedUnit : mergedValue;
const mixedPlaceholder = isMixed || isMixedUnit ? __( 'Mixed' ) : undefined;
+ const hasPresets = presets && presets.length > 0 && presetKey;
+ const hasPresetValue =
+ hasPresets &&
+ mergedValue !== undefined &&
+ ! isMixed &&
+ isValuePreset( mergedValue, presetKey );
+ const [ showCustomValueControl, setShowCustomValueControl ] = useState(
+ ! hasPresets ||
+ ( ! hasPresetValue && ! isMixed && mergedValue !== undefined )
+ );
+ const presetIndex = hasPresetValue
+ ? getPresetIndexFromValue( mergedValue, presetKey, presets )
+ : undefined;
+ const marks = hasPresets
+ ? [ { value: 0, label: '', tooltip: __( 'None' ) } ].concat(
+ presets.map( ( preset, index ) => ( {
+ value: index + 1,
+ label: '',
+ tooltip: preset.name ?? preset.slug,
+ } ) )
+ )
+ : [];
return (
-
-
+
+
+
+
+ {
+ handleOnValueChange(
+ newValue !== undefined
+ ? [ newValue, computedUnit ].join( '' )
+ : undefined
+ );
+ } }
+ min={ isFinite( min ) ? min : 0 }
+ max={
+ CUSTOM_VALUE_SETTINGS[ computedUnit ?? 'px' ]
+ ?.max ?? 10
+ }
+ step={
+ CUSTOM_VALUE_SETTINGS[ computedUnit ?? 'px' ]
+ ?.step ?? 0.1
+ }
+ value={ parsedQuantity ?? 0 }
+ withInputField={ false }
+ />
+ >
+ ) }
+
+ { hasPresets && ! showCustomValueControl && (
+ {
+ const newValue =
+ newIndex === 0 || newIndex === undefined
+ ? undefined
+ : getPresetValueFromIndex(
+ newIndex - 1,
+ presetKey,
+ presets
+ );
+ handleRawOnValueChange( newValue );
+ } }
+ withInputField={ false }
+ aria-valuenow={
+ presetIndex !== undefined ? presetIndex + 1 : 0
+ }
+ aria-valuetext={
+ marks[ presetIndex !== undefined ? presetIndex + 1 : 0 ]
+ .label
+ }
+ renderTooltipContent={ ( index ) =>
+ marks[ ! index ? 0 : index ].tooltip
+ }
+ min={ 0 }
+ max={ marks.length - 1 }
+ marks={ marks }
label={ LABELS[ side ] }
- placeholder={ mixedPlaceholder }
hideLabelFromVision
+ __nextHasNoMarginBottom
+ />
+ ) }
+
+ { hasPresets && (
+ {
+ setShowCustomValueControl( ! showCustomValueControl );
+ } }
+ isPressed={ showCustomValueControl }
+ size="small"
+ iconSize={ 24 }
/>
-
-
- {
- handleOnValueChange(
- newValue !== undefined
- ? [ newValue, computedUnit ].join( '' )
- : undefined
- );
- } }
- min={ isFinite( min ) ? min : 0 }
- max={ CUSTOM_VALUE_SETTINGS[ computedUnit ?? 'px' ]?.max ?? 10 }
- step={
- CUSTOM_VALUE_SETTINGS[ computedUnit ?? 'px' ]?.step ?? 0.1
- }
- value={ parsedQuantity ?? 0 }
- withInputField={ false }
- />
+ ) }
);
}
diff --git a/packages/components/src/box-control/stories/index.story.tsx b/packages/components/src/box-control/stories/index.story.tsx
index 0d8b96de06316..aa16547d24ab1 100644
--- a/packages/components/src/box-control/stories/index.story.tsx
+++ b/packages/components/src/box-control/stories/index.story.tsx
@@ -81,3 +81,15 @@ AxialControlsWithSingleSide.args = {
sides: [ 'horizontal' ],
splitOnAxis: true,
};
+
+export const ControlWithPresets = TemplateControlled.bind( {} );
+ControlWithPresets.args = {
+ ...Default.args,
+ presets: [
+ { name: 'Small', slug: 'small', value: '4px' },
+ { name: 'Medium', slug: 'medium', value: '8px' },
+ { name: 'Large', slug: 'large', value: '12px' },
+ { name: 'Extra Large', slug: 'extra-large', value: '16px' },
+ ],
+ presetKey: 'padding',
+};
diff --git a/packages/components/src/box-control/types.ts b/packages/components/src/box-control/types.ts
index 73de68d1bd513..43629e09258a5 100644
--- a/packages/components/src/box-control/types.ts
+++ b/packages/components/src/box-control/types.ts
@@ -15,6 +15,12 @@ export type CustomValueUnits = {
[ key: string ]: { max: number; step: number };
};
+export interface Preset {
+ name: string;
+ slug: string;
+ value?: string;
+}
+
type UnitControlPassthroughProps = Omit<
UnitControlProps,
'label' | 'onChange' | 'onFocus' | 'units'
@@ -94,6 +100,16 @@ export type BoxControlProps = Pick< UnitControlProps, 'units' > &
* @default false
*/
__next40pxDefaultSize?: boolean;
+ /**
+ * Available presets to pick from.
+ */
+ presets?: Preset[];
+ /**
+ * The key of the preset to apply.
+ * If you provide a list of presets, you must provide a preset key to use.
+ * The format of preset selected values is going to be `var:preset|${ presetKey }|${ presetSlug }`
+ */
+ presetKey?: string;
};
export type BoxControlInputControlProps = UnitControlPassthroughProps & {
@@ -120,6 +136,8 @@ export type BoxControlInputControlProps = UnitControlPassthroughProps & {
* It can be a concrete side like: left, right, top, bottom or a combined one like: horizontal, vertical.
*/
side: keyof typeof LABELS;
+ presets?: Preset[];
+ presetKey?: string;
};
export type BoxControlIconProps = {
diff --git a/packages/components/src/box-control/utils.ts b/packages/components/src/box-control/utils.ts
index 111451790e35d..26bdae4e55951 100644
--- a/packages/components/src/box-control/utils.ts
+++ b/packages/components/src/box-control/utils.ts
@@ -11,6 +11,7 @@ import type {
BoxControlProps,
BoxControlValue,
CustomValueUnits,
+ Preset,
} from './types';
import deprecated from '@wordpress/deprecated';
@@ -272,3 +273,62 @@ export function getAllowedSides(
} );
return allowedSides;
}
+
+/**
+ * Checks if a value is a preset value.
+ *
+ * @param value The value to check.
+ * @param presetKey The preset key to check against.
+ * @return Whether the value is a preset value.
+ */
+export function isValuePreset( value: string, presetKey: string ) {
+ return value.startsWith( `var:preset|${ presetKey }|` );
+}
+
+/**
+ * Returns the index of the preset value in the presets array.
+ *
+ * @param value The value to check.
+ * @param presetKey The preset key to check against.
+ * @param presets The array of presets to search.
+ * @return The index of the preset value in the presets array.
+ */
+export function getPresetIndexFromValue(
+ value: string,
+ presetKey: string,
+ presets: Preset[]
+) {
+ if ( ! isValuePreset( value, presetKey ) ) {
+ return undefined;
+ }
+
+ const match = value.match(
+ new RegExp( `^var:preset\\|${ presetKey }\\|(.+)$` )
+ );
+ if ( ! match ) {
+ return undefined;
+ }
+ const slug = match[ 1 ];
+ const index = presets.findIndex( ( preset ) => {
+ return preset.slug === slug;
+ } );
+
+ return index !== -1 ? index : undefined;
+}
+
+/**
+ * Returns the preset value from the index.
+ *
+ * @param index The index of the preset value in the presets array.
+ * @param presetKey The preset key to check against.
+ * @param presets The array of presets to search.
+ * @return The preset value from the index.
+ */
+export function getPresetValueFromIndex(
+ index: number,
+ presetKey: string,
+ presets: Preset[]
+) {
+ const preset = presets[ index ];
+ return `var:preset|${ presetKey }|${ preset.slug }`;
+}
From f88ec2b59fbe1dcfc9b56b3ccbc2e0a8c9cf48c6 Mon Sep 17 00:00:00 2001
From: Miguel Fonseca <150562+mcsf@users.noreply.github.com>
Date: Thu, 12 Dec 2024 16:57:39 +0000
Subject: [PATCH 028/239] WIP: wp-env: add multisite support (#67845)
---
packages/env/CHANGELOG.md | 1 +
packages/env/lib/config/parse-config.js | 6 ++++
.../__snapshots__/config-integration.js.snap | 8 +++++
packages/env/lib/config/test/parse-config.js | 1 +
packages/env/lib/wordpress.js | 31 ++++++++++++++++++-
schemas/json/wp-env.json | 7 ++++-
6 files changed, 52 insertions(+), 2 deletions(-)
diff --git a/packages/env/CHANGELOG.md b/packages/env/CHANGELOG.md
index 0298e21c81000..252e1e65dae87 100644
--- a/packages/env/CHANGELOG.md
+++ b/packages/env/CHANGELOG.md
@@ -7,6 +7,7 @@
### Enhancements
- Add phpMyAdmin as an optional service. Enabled via the new `phpmyadminPort` environment config, as well as env vars `WP_ENV_PHPMYADMIN_PORT` and `WP_ENV_TESTS_PHPMYADMIN_PORT`.
+- Add support for WordPress multisite installations. Enabled via the new `multisite` environment config.
### Internal
diff --git a/packages/env/lib/config/parse-config.js b/packages/env/lib/config/parse-config.js
index bddd7bc72aaee..d5e06c5bb9bee 100644
--- a/packages/env/lib/config/parse-config.js
+++ b/packages/env/lib/config/parse-config.js
@@ -52,6 +52,7 @@ const mergeConfigs = require( './merge-configs' );
* @property {number} port The port to use.
* @property {number} mysqlPort The port to use for MySQL. Random if empty.
* @property {number} phpmyadminPort The port to use for phpMyAdmin. If empty, disabled phpMyAdmin.
+ * @property {boolean} multisite Whether to set up a multisite installation.
* @property {Object} config Mapping of wp-config.php constants to their desired values.
* @property {Object.} mappings Mapping of WordPress directories to local directories which should be mounted.
* @property {string|null} phpVersion Version of PHP to use in the environments, of the format 0.0.
@@ -89,6 +90,7 @@ const DEFAULT_ENVIRONMENT_CONFIG = {
testsPort: 8889,
mysqlPort: null,
phpmyadminPort: null,
+ multisite: false,
mappings: {},
config: {
FS_METHOD: 'direct',
@@ -466,6 +468,10 @@ async function parseEnvironmentConfig(
parsedConfig.phpmyadminPort = config.phpmyadminPort;
}
+ if ( config.multisite !== undefined ) {
+ parsedConfig.multisite = config.multisite;
+ }
+
if ( config.phpVersion !== undefined ) {
// Support null as a valid input.
if ( config.phpVersion !== null ) {
diff --git a/packages/env/lib/config/test/__snapshots__/config-integration.js.snap b/packages/env/lib/config/test/__snapshots__/config-integration.js.snap
index 6b671a6bc858e..833a8a54d7749 100644
--- a/packages/env/lib/config/test/__snapshots__/config-integration.js.snap
+++ b/packages/env/lib/config/test/__snapshots__/config-integration.js.snap
@@ -29,6 +29,7 @@ exports[`Config Integration should load local and override configuration files 1
"url": "https://github.com/WordPress/WordPress.git",
},
"mappings": {},
+ "multisite": false,
"mysqlPort": 23306,
"phpVersion": null,
"phpmyadminPort": null,
@@ -59,6 +60,7 @@ exports[`Config Integration should load local and override configuration files 1
"url": "https://github.com/WordPress/WordPress.git",
},
"mappings": {},
+ "multisite": false,
"mysqlPort": 23307,
"phpVersion": null,
"phpmyadminPort": null,
@@ -106,6 +108,7 @@ exports[`Config Integration should load local configuration file 1`] = `
"url": "https://github.com/WordPress/WordPress.git",
},
"mappings": {},
+ "multisite": false,
"mysqlPort": 13306,
"phpVersion": null,
"phpmyadminPort": null,
@@ -136,6 +139,7 @@ exports[`Config Integration should load local configuration file 1`] = `
"url": "https://github.com/WordPress/WordPress.git",
},
"mappings": {},
+ "multisite": false,
"mysqlPort": 23307,
"phpVersion": null,
"phpmyadminPort": null,
@@ -183,6 +187,7 @@ exports[`Config Integration should use default configuration 1`] = `
"url": "https://github.com/WordPress/WordPress.git",
},
"mappings": {},
+ "multisite": false,
"mysqlPort": null,
"phpVersion": null,
"phpmyadminPort": null,
@@ -213,6 +218,7 @@ exports[`Config Integration should use default configuration 1`] = `
"url": "https://github.com/WordPress/WordPress.git",
},
"mappings": {},
+ "multisite": false,
"mysqlPort": null,
"phpVersion": null,
"phpmyadminPort": null,
@@ -260,6 +266,7 @@ exports[`Config Integration should use environment variables over local and over
"url": "https://github.com/WordPress/WordPress.git",
},
"mappings": {},
+ "multisite": false,
"mysqlPort": 23306,
"phpVersion": null,
"phpmyadminPort": null,
@@ -291,6 +298,7 @@ exports[`Config Integration should use environment variables over local and over
"url": "https://github.com/WordPress/WordPress.git",
},
"mappings": {},
+ "multisite": false,
"mysqlPort": 23307,
"phpVersion": null,
"phpmyadminPort": null,
diff --git a/packages/env/lib/config/test/parse-config.js b/packages/env/lib/config/test/parse-config.js
index cc6e2c7a96bbc..968c8b66a4ec1 100644
--- a/packages/env/lib/config/test/parse-config.js
+++ b/packages/env/lib/config/test/parse-config.js
@@ -23,6 +23,7 @@ const DEFAULT_CONFIG = {
testsPort: 8889,
mysqlPort: null,
phpmyadminPort: null,
+ multisite: false,
phpVersion: null,
coreSource: {
type: 'git',
diff --git a/packages/env/lib/wordpress.js b/packages/env/lib/wordpress.js
index bd3c4a23f8ff5..8c08fb1f20ec7 100644
--- a/packages/env/lib/wordpress.js
+++ b/packages/env/lib/wordpress.js
@@ -86,11 +86,40 @@ async function configureWordPress( environment, config, spinner ) {
// Ignore error.
}
- const installCommand = `wp core install --url="${ config.env[ environment ].config.WP_SITEURL }" --title="${ config.name }" --admin_user=admin --admin_password=password --admin_email=wordpress@example.com --skip-email`;
+ const isMultisite = config.env[ environment ].multisite;
+
+ const installMethod = isMultisite ? 'multisite-install' : 'install';
+ const installCommand = `wp core ${ installMethod } --url="${ config.env[ environment ].config.WP_SITEURL }" --title="${ config.name }" --admin_user=admin --admin_password=password --admin_email=wordpress@example.com --skip-email`;
// -eo pipefail exits the command as soon as anything fails in bash.
const setupCommands = [ 'set -eo pipefail', installCommand ];
+ // Bootstrap .htaccess for multisite
+ if ( isMultisite ) {
+ // Using a subshell with `exec` was the best tradeoff I could come up
+ // with between readability of this source and compatibility with the
+ // way that all strings in `setupCommands` are later joined with '&&'.
+ setupCommands.push(
+ `(
+exec > /var/www/html/.htaccess
+echo 'RewriteEngine On'
+echo 'RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]'
+echo 'RewriteBase /'
+echo 'RewriteRule ^index\.php$ - [L]'
+echo ''
+echo '# add a trailing slash to /wp-admin'
+echo 'RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]'
+echo ''
+echo 'RewriteCond %{REQUEST_FILENAME} -f [OR]'
+echo 'RewriteCond %{REQUEST_FILENAME} -d'
+echo 'RewriteRule ^ - [L]'
+echo 'RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]'
+echo 'RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]'
+echo 'RewriteRule . index.php [L]'
+)`
+ );
+ }
+
// WordPress versions below 5.1 didn't use proper spacing in wp-config.
const configAnchor =
wpVersion && isWPMajorMinorVersionLower( wpVersion, '5.1' )
diff --git a/schemas/json/wp-env.json b/schemas/json/wp-env.json
index 8aa604ed41ed1..3958818714e4e 100644
--- a/schemas/json/wp-env.json
+++ b/schemas/json/wp-env.json
@@ -66,6 +66,10 @@
"phpmyadminPort": {
"description": "The port number to access phpMyAdmin.",
"type": "integer"
+ },
+ "multisite": {
+ "description": "Whether to set up a multisite installation.",
+ "type": "boolean"
}
}
},
@@ -78,7 +82,8 @@
"port",
"config",
"mappings",
- "phpmyadminPort"
+ "phpmyadminPort",
+ "multisite"
]
}
},
From 9437f7e73f9c6c9f831f2a26a555dfa8fddb3d61 Mon Sep 17 00:00:00 2001
From: Marco Ciampini
Date: Thu, 12 Dec 2024 18:47:35 +0100
Subject: [PATCH 029/239] RangeControl: animate thumb and track only when using
marks (#67836)
Co-authored-by: ciampo
Co-authored-by: jameskoster
Co-authored-by: youknowriad
Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: tyxla
---
.../src/range-control/styles/range-control-styles.ts | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/packages/components/src/range-control/styles/range-control-styles.ts b/packages/components/src/range-control/styles/range-control-styles.ts
index d943ca472911e..c86c57800cac4 100644
--- a/packages/components/src/range-control/styles/range-control-styles.ts
+++ b/packages/components/src/range-control/styles/range-control-styles.ts
@@ -130,8 +130,10 @@ export const Track = styled.span`
margin-top: ${ ( rangeHeightValue - railHeight ) / 2 }px;
top: 0;
- @media not ( prefers-reduced-motion ) {
- transition: width ease 0.1s;
+ .is-marked & {
+ @media not ( prefers-reduced-motion ) {
+ transition: width ease 0.1s;
+ }
}
${ trackBackgroundColor };
@@ -203,8 +205,10 @@ export const ThumbWrapper = styled.span`
border-radius: ${ CONFIG.radiusRound };
z-index: 3;
- @media not ( prefers-reduced-motion ) {
- transition: left ease 0.1s;
+ .is-marked & {
+ @media not ( prefers-reduced-motion ) {
+ transition: left ease 0.1s;
+ }
}
${ thumbColor };
From b74283b82cf1cae766f3982f158a004eaf115d46 Mon Sep 17 00:00:00 2001
From: Eshaan Dabasiya <76681468+im3dabasia@users.noreply.github.com>
Date: Fri, 13 Dec 2024 00:12:59 +0530
Subject: [PATCH 030/239] Refactor "Settings" panel of Archives block to use
ToolsPanel instead of PanelBody (#67841)
Co-authored-by: im3dabasia
Co-authored-by: fabiankaegy < fabiankaegy@git.wordpress.org>
---
packages/block-library/src/archives/edit.js | 122 ++++++++++++++------
1 file changed, 86 insertions(+), 36 deletions(-)
diff --git a/packages/block-library/src/archives/edit.js b/packages/block-library/src/archives/edit.js
index 60b8715988ed9..b51bd9a4fe1e6 100644
--- a/packages/block-library/src/archives/edit.js
+++ b/packages/block-library/src/archives/edit.js
@@ -2,10 +2,11 @@
* WordPress dependencies
*/
import {
- PanelBody,
ToggleControl,
SelectControl,
Disabled,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
} from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import { InspectorControls, useBlockProps } from '@wordpress/block-editor';
@@ -17,55 +18,104 @@ export default function ArchivesEdit( { attributes, setAttributes } ) {
return (
<>
-
- {
+ setAttributes( {
+ displayAsDropdown: false,
+ showLabel: false,
+ showPostCounts: false,
+ type: 'monthly',
+ } );
+ } }
+ >
+
- setAttributes( {
- displayAsDropdown: ! displayAsDropdown,
- } )
+ isShownByDefault
+ hasValue={ () => displayAsDropdown }
+ onDeselect={ () =>
+ setAttributes( { displayAsDropdown: false } )
}
- />
- { displayAsDropdown && (
+ >
setAttributes( {
- showLabel: ! showLabel,
+ displayAsDropdown: ! displayAsDropdown,
} )
}
/>
+
+
+ { displayAsDropdown && (
+ showLabel }
+ onDeselect={ () =>
+ setAttributes( { showLabel: false } )
+ }
+ >
+
+ setAttributes( {
+ showLabel: ! showLabel,
+ } )
+ }
+ />
+
) }
-
- setAttributes( {
- showPostCounts: ! showPostCounts,
- } )
+ isShownByDefault
+ hasValue={ () => showPostCounts }
+ onDeselect={ () =>
+ setAttributes( { showPostCounts: false } )
}
- />
-
+
+ setAttributes( {
+ showPostCounts: ! showPostCounts,
+ } )
+ }
+ />
+
+
+
- setAttributes( { type: value } )
+ isShownByDefault
+ hasValue={ () => !! type }
+ onDeselect={ () =>
+ setAttributes( { type: 'monthly' } )
}
- />
-
+ >
+
+ setAttributes( { type: value } )
+ }
+ />
+
+
From 70c6cb796896e99157fe5adc8d09f64e0da35b15 Mon Sep 17 00:00:00 2001
From: Lena Morita
Date: Fri, 13 Dec 2024 04:13:31 +0900
Subject: [PATCH 031/239] LineHeightControl: Deprecate 36px default size
(#67850)
Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: tyxla
---
.../src/components/line-height-control/README.md | 1 +
.../src/components/line-height-control/index.js | 12 ++++++++++++
.../line-height-control/stories/index.story.js | 1 +
.../src/components/line-height-control/test/index.js | 8 +++++++-
4 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/packages/block-editor/src/components/line-height-control/README.md b/packages/block-editor/src/components/line-height-control/README.md
index 89bcc69622367..2f719b5a7210e 100644
--- a/packages/block-editor/src/components/line-height-control/README.md
+++ b/packages/block-editor/src/components/line-height-control/README.md
@@ -18,6 +18,7 @@ const MyLineHeightControl = () => (
);
```
diff --git a/packages/block-editor/src/components/line-height-control/index.js b/packages/block-editor/src/components/line-height-control/index.js
index e6af602c2875a..ea692ceb452e3 100644
--- a/packages/block-editor/src/components/line-height-control/index.js
+++ b/packages/block-editor/src/components/line-height-control/index.js
@@ -3,6 +3,7 @@
*/
import { __ } from '@wordpress/i18n';
import { __experimentalNumberControl as NumberControl } from '@wordpress/components';
+import deprecated from '@wordpress/deprecated';
/**
* Internal dependencies
@@ -89,6 +90,17 @@ const LineHeightControl = ( {
onChange( `${ nextValue }` );
};
+ if (
+ ! __next40pxDefaultSize &&
+ ( otherProps.size === undefined || otherProps.size === 'default' )
+ ) {
+ deprecated( `36px default size for wp.blockEditor.LineHeightControl`, {
+ since: '6.8',
+ version: '7.1',
+ hint: 'Set the `__next40pxDefaultSize` prop to true to start opting into the new default size, which will become the default in a future version.',
+ } );
+ }
+
return (
{
export const Default = Template.bind( {} );
Default.args = {
+ __next40pxDefaultSize: true,
__unstableInputWidth: '100px',
};
diff --git a/packages/block-editor/src/components/line-height-control/test/index.js b/packages/block-editor/src/components/line-height-control/test/index.js
index b98bc93c48a83..488d22b768114 100644
--- a/packages/block-editor/src/components/line-height-control/test/index.js
+++ b/packages/block-editor/src/components/line-height-control/test/index.js
@@ -19,7 +19,13 @@ const SPIN = STEP * SPIN_FACTOR;
const ControlledLineHeightControl = () => {
const [ value, setValue ] = useState();
- return ;
+ return (
+
+ );
};
describe( 'LineHeightControl', () => {
From 75713215b3562a6a61986641f1f42a12bde7c643 Mon Sep 17 00:00:00 2001
From: Lena Morita
Date: Fri, 13 Dec 2024 04:14:12 +0900
Subject: [PATCH 032/239] FontAppearanceControl: Deprecate 36px default size
(#67854)
Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: tyxla
---
.../components/font-appearance-control/index.js | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/packages/block-editor/src/components/font-appearance-control/index.js b/packages/block-editor/src/components/font-appearance-control/index.js
index f9e8023f93ec6..62396c2dc7bd6 100644
--- a/packages/block-editor/src/components/font-appearance-control/index.js
+++ b/packages/block-editor/src/components/font-appearance-control/index.js
@@ -2,6 +2,7 @@
* WordPress dependencies
*/
import { CustomSelectControl } from '@wordpress/components';
+import deprecated from '@wordpress/deprecated';
import { useMemo } from '@wordpress/element';
import { __, sprintf } from '@wordpress/i18n';
@@ -147,6 +148,20 @@ export default function FontAppearanceControl( props ) {
);
};
+ if (
+ ! __next40pxDefaultSize &&
+ ( otherProps.size === undefined || otherProps.size === 'default' )
+ ) {
+ deprecated(
+ `36px default size for wp.blockEditor.__experimentalFontAppearanceControl`,
+ {
+ since: '6.8',
+ version: '7.1',
+ hint: 'Set the `__next40pxDefaultSize` prop to true to start opting into the new default size, which will become the default in a future version.',
+ }
+ );
+ }
+
return (
hasStylesOrWeights && (
Date: Fri, 13 Dec 2024 04:14:37 +0900
Subject: [PATCH 033/239] FontFamilyControl: Deprecate 36px default size
(#67853)
Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: tyxla
---
.../src/components/font-family/README.md | 1 +
.../src/components/font-family/index.js | 14 ++++++++++++++
.../components/font-family/stories/index.story.js | 1 +
3 files changed, 16 insertions(+)
diff --git a/packages/block-editor/src/components/font-family/README.md b/packages/block-editor/src/components/font-family/README.md
index 57697f595cc80..25190802e5d0b 100644
--- a/packages/block-editor/src/components/font-family/README.md
+++ b/packages/block-editor/src/components/font-family/README.md
@@ -29,6 +29,7 @@ const MyFontFamilyControl = () => {
setFontFamily( newFontFamily );
} }
__nextHasNoMarginBottom
+ __next40pxDefaultSize
/>
);
};
diff --git a/packages/block-editor/src/components/font-family/index.js b/packages/block-editor/src/components/font-family/index.js
index e8d0d7ed2dd80..6a723bb24c48e 100644
--- a/packages/block-editor/src/components/font-family/index.js
+++ b/packages/block-editor/src/components/font-family/index.js
@@ -58,6 +58,20 @@ export default function FontFamilyControl( {
);
}
+ if (
+ ! __next40pxDefaultSize &&
+ ( props.size === undefined || props.size === 'default' )
+ ) {
+ deprecated(
+ `36px default size for wp.blockEditor.__experimentalFontFamilyControl`,
+ {
+ since: '6.8',
+ version: '7.1',
+ hint: 'Set the `__next40pxDefaultSize` prop to true to start opting into the new default size, which will become the default in a future version.',
+ }
+ );
+ }
+
return (
Date: Fri, 13 Dec 2024 00:52:00 +0530
Subject: [PATCH 034/239] Refactor "Settings" panel of Button block to use
ToolsPanel instead of PanelBody (#67887)
Co-authored-by: Mayank-Tripathi32
Co-authored-by: fabiankaegy
---
packages/block-library/src/button/edit.js | 56 ++++++++++++++---------
1 file changed, 35 insertions(+), 21 deletions(-)
diff --git a/packages/block-library/src/button/edit.js b/packages/block-library/src/button/edit.js
index 2106c2031491f..9f2a9048af4c0 100644
--- a/packages/block-library/src/button/edit.js
+++ b/packages/block-library/src/button/edit.js
@@ -18,10 +18,11 @@ import { useEffect, useState, useRef, useMemo } from '@wordpress/element';
import {
Button,
ButtonGroup,
- PanelBody,
TextControl,
ToolbarButton,
Popover,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
} from '@wordpress/components';
import {
AlignmentControl,
@@ -123,26 +124,39 @@ function WidthPanel( { selectedWidth, setAttributes } ) {
}
return (
-
-
- { [ 25, 50, 75, 100 ].map( ( widthValue ) => {
- return (
- handleChange( widthValue ) }
- >
- { widthValue }%
-
- );
- } ) }
-
-
+ {
+ handleChange( undefined );
+ } }
+ >
+ !! selectedWidth }
+ onDeselect={ () => handleChange( undefined ) }
+ >
+
+ { [ 25, 50, 75, 100 ].map( ( widthValue ) => {
+ return (
+ handleChange( widthValue ) }
+ >
+ { widthValue }%
+
+ );
+ } ) }
+
+
+
);
}
From 63b0e7f1ce6a8626fecf6714d6288b534220f46b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fabian=20K=C3=A4gy?=
Date: Thu, 12 Dec 2024 20:27:21 +0100
Subject: [PATCH 035/239] Adding @fabiankaegy as a code owner of the block
library package (#67891)
Co-authored-by: fabiankaegy
Co-authored-by: youknowriad
---
.github/CODEOWNERS | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 2ec03cba722c6..3e02267da7c51 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -13,7 +13,7 @@
/packages/data-controls @nerrad
# Blocks
-/packages/block-library @ajitbohra
+/packages/block-library @ajitbohra @fabiankaegy
/packages/block-library/src/gallery @geriux
/packages/block-library/src/comment-template @michalczaplinski
/packages/block-library/src/comments @michalczaplinski
From cff73d475e9323e63657c0c246cb613ca3388c8f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9?= <583546+oandregal@users.noreply.github.com>
Date: Thu, 12 Dec 2024 21:19:27 +0100
Subject: [PATCH 036/239] Pages: update layout-specific config when the view is
updated (#67881)
Co-authored-by: oandregal
Co-authored-by: youknowriad
---
packages/edit-site/src/components/post-list/index.js | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/packages/edit-site/src/components/post-list/index.js b/packages/edit-site/src/components/post-list/index.js
index a67a505795b3c..bbf5d654ddb57 100644
--- a/packages/edit-site/src/components/post-list/index.js
+++ b/packages/edit-site/src/components/post-list/index.js
@@ -109,6 +109,7 @@ function useView( postType ) {
return {
...initialView,
type,
+ ...defaultLayouts[ type ],
};
} );
@@ -140,13 +141,15 @@ function useView( postType ) {
// without affecting any other config.
const onUrlLayoutChange = useEvent( () => {
setView( ( prevView ) => {
- const layoutToApply = layout ?? LAYOUT_LIST;
- if ( layoutToApply === prevView.type ) {
+ const newType = layout ?? LAYOUT_LIST;
+ if ( newType === prevView.type ) {
return prevView;
}
+
return {
...prevView,
- type: layout ?? LAYOUT_LIST,
+ type: newType,
+ ...defaultLayouts[ newType ],
};
} );
} );
@@ -168,6 +171,7 @@ function useView( postType ) {
setView( {
...newView,
type,
+ ...defaultLayouts[ type ],
} );
}
} );
From 8d6b8c5c05a2427af04e8639341ddcfac299751e Mon Sep 17 00:00:00 2001
From: Sukhendu Sekhar Guria
Date: Fri, 13 Dec 2024 04:09:55 +0530
Subject: [PATCH 037/239] Refactor "Settings" panel of Table block to use
ToolsPanel instead of PanelBody (#67896)
Co-authored-by: Sukhendu2002
Co-authored-by: fabiankaegy
---
packages/block-library/src/table/edit.js | 74 +++++++++++++++++-------
1 file changed, 54 insertions(+), 20 deletions(-)
diff --git a/packages/block-library/src/table/edit.js b/packages/block-library/src/table/edit.js
index f1cb3fa5d8b8a..1d61bab0787e4 100644
--- a/packages/block-library/src/table/edit.js
+++ b/packages/block-library/src/table/edit.js
@@ -20,12 +20,13 @@ import {
import { __ } from '@wordpress/i18n';
import {
Button,
- PanelBody,
Placeholder,
TextControl,
ToggleControl,
ToolbarDropdownMenu,
__experimentalHasSplitBorders as hasSplitBorders,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
} from '@wordpress/components';
import {
alignLeft,
@@ -473,33 +474,66 @@ function TableEdit( {
>
) }
- {
+ setAttributes( {
+ hasFixedLayout: true,
+ head: [],
+ foot: [],
+ } );
+ } }
>
- hasFixedLayout !== true }
label={ __( 'Fixed width table cells' ) }
- checked={ !! hasFixedLayout }
- onChange={ onChangeFixedLayout }
- />
+ onDeselect={ () =>
+ setAttributes( { hasFixedLayout: true } )
+ }
+ isShownByDefault
+ >
+
+
{ ! isEmpty && (
<>
- head && head.length }
label={ __( 'Header section' ) }
- checked={ !! ( head && head.length ) }
- onChange={ onToggleHeaderSection }
- />
-
+ setAttributes( { head: [] } )
+ }
+ isShownByDefault
+ >
+
+
+ foot && foot.length }
label={ __( 'Footer section' ) }
- checked={ !! ( foot && foot.length ) }
- onChange={ onToggleFooterSection }
- />
+ onDeselect={ () =>
+ setAttributes( { foot: [] } )
+ }
+ isShownByDefault
+ >
+
+
>
) }
-
+
{ ! isEmpty && (
Date: Fri, 13 Dec 2024 09:02:59 +0200
Subject: [PATCH 038/239] Storybook: Fix warnings in Layout document (#67865)
Co-authored-by: tyxla
Co-authored-by: jameskoster
Co-authored-by: mirka <0mirka00@git.wordpress.org>
---
storybook/stories/foundations/layout.mdx | 60 ++++++++++++------------
1 file changed, 31 insertions(+), 29 deletions(-)
diff --git a/storybook/stories/foundations/layout.mdx b/storybook/stories/foundations/layout.mdx
index abc0c7c4f6947..578f4e8b66e42 100644
--- a/storybook/stories/foundations/layout.mdx
+++ b/storybook/stories/foundations/layout.mdx
@@ -1,4 +1,4 @@
-import { Meta } from '@storybook/addon-docs/blocks';
+import { Meta } from '@storybook/blocks';
import areas from './static/areas.svg';
import pageLayoutExample1 from './static/page-layout-example-1.svg';
import pageLayoutExample2 from './static/page-layout-example-2.svg';
@@ -27,32 +27,34 @@ At the highest level admin pages are comprised of _areas_, that can be arranged
Areas can be combined in different ways depending on the use case. Here are some examples.
-
-
- #### Sidebar, Content Frame and Preview Frame
-
-
- A demonstration of this arrangement can be found in the Styles section of the Site Editor, and in the Pages and Templates sections when List layout is selected.
-
-
- #### Sidebar and Preview Frame
-
-
- A demonstration of this arrangement can be found in the Design section.
-
-
-
-
- #### Sidebar and Content Frame
-
-
- A demonstration of this arrangement can be found in the Patterns and Templates sections of the Site Editor, or in the Pages section when Table or Grid layout are selected.
-
-
- #### Sidebar and multiple Content Frames
-
-
- Multiple content frames can be utilised as required.
-
-
+
+
+
+ #### Sidebar, Content Frame and Preview Frame
+
+
+ A demonstration of this arrangement can be found in the Styles section of the Site Editor, and in the Pages and Templates sections when List layout is selected.
+
+
+ #### Sidebar and Preview Frame
+
+
+ A demonstration of this arrangement can be found in the Design section.
+
+
+
+
+ #### Sidebar and Content Frame
+
+
+ A demonstration of this arrangement can be found in the Patterns and Templates sections of the Site Editor, or in the Pages section when Table or Grid layout are selected.
+
+
+ #### Sidebar and multiple Content Frames
+
+
+ Multiple content frames can be utilised as required.
+
+
+
From cbe7ef4d597cc28f3ab0fc9c7593b9af8085aa36 Mon Sep 17 00:00:00 2001
From: Sukhendu Sekhar Guria
Date: Fri, 13 Dec 2024 13:49:27 +0530
Subject: [PATCH 039/239] Refactor "Settings" panel of Date block to use
ToolsPanel instead of PanelBody (#67906)
Co-authored-by: Sukhendu2002
Co-authored-by: fabiankaegy
---
packages/block-library/src/post-date/edit.js | 97 +++++++++++++++-----
1 file changed, 72 insertions(+), 25 deletions(-)
diff --git a/packages/block-library/src/post-date/edit.js b/packages/block-library/src/post-date/edit.js
index 5057466c6af45..6ac39c0f14798 100644
--- a/packages/block-library/src/post-date/edit.js
+++ b/packages/block-library/src/post-date/edit.js
@@ -26,7 +26,8 @@ import {
ToolbarGroup,
ToolbarButton,
ToggleControl,
- PanelBody,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
} from '@wordpress/components';
import { __, _x, sprintf } from '@wordpress/i18n';
import { edit } from '@wordpress/icons';
@@ -160,16 +161,36 @@ export default function PostDateEdit( {
-
-
- setAttributes( { format: nextFormat } )
+ {
+ setAttributes( {
+ format: undefined,
+ isLink: false,
+ displayType: 'date',
+ } );
+ } }
+ >
+
+ format !== undefined && format !== siteFormat
+ }
+ label={ __( 'Date Format' ) }
+ onDeselect={ () =>
+ setAttributes( { format: undefined } )
}
- />
-
+
+ setAttributes( { format: nextFormat } )
+ }
+ />
+
+ isLink !== false }
label={
postType?.labels.singular_name
? sprintf(
@@ -179,23 +200,49 @@ export default function PostDateEdit( {
)
: __( 'Link to post' )
}
- onChange={ () => setAttributes( { isLink: ! isLink } ) }
- checked={ isLink }
- />
- setAttributes( { isLink: false } ) }
+ isShownByDefault
+ >
+
+ setAttributes( { isLink: ! isLink } )
+ }
+ checked={ isLink }
+ />
+
+ displayType !== 'date' }
label={ __( 'Display last modified date' ) }
- onChange={ ( value ) =>
- setAttributes( {
- displayType: value ? 'modified' : 'date',
- } )
+ onDeselect={ () =>
+ setAttributes( { displayType: 'date' } )
}
- checked={ displayType === 'modified' }
- help={ __(
- 'Only shows if the post has been modified'
- ) }
- />
-
+ isShownByDefault
+ >
+
+ setAttributes( {
+ displayType: value ? 'modified' : 'date',
+ } )
+ }
+ checked={ displayType === 'modified' }
+ help={ __(
+ 'Only shows if the post has been modified'
+ ) }
+ />
+
+
{ postDate }
From 7050a44afb90ee187e2ed401ee1d99b8de2ad34f Mon Sep 17 00:00:00 2001
From: Jorge Costa
Date: Fri, 13 Dec 2024 08:55:35 +0000
Subject: [PATCH 040/239] Fix: Fix link to minimal-block example plugin code.
(#67888)
Co-authored-by: jorgefilipecosta
Co-authored-by: shail-mehta
---
docs/getting-started/fundamentals/registration-of-a-block.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/getting-started/fundamentals/registration-of-a-block.md b/docs/getting-started/fundamentals/registration-of-a-block.md
index 5c80422f6f857..63a7a9031f72a 100644
--- a/docs/getting-started/fundamentals/registration-of-a-block.md
+++ b/docs/getting-started/fundamentals/registration-of-a-block.md
@@ -42,7 +42,7 @@ function minimal_block_ca6eda___register_block() {
add_action( 'init', 'minimal_block_ca6eda___register_block' );
```
-_See the [full block example](https://github.com/WordPress/block-development-examples/tree/trunk/plugins/minimal-block-ca6eda) of the [code above](https://github.com/WordPress/block-development-examples/blob/trunk/plugins/minimal-block-ca6eda/index.php)_
+_See the [full block example](https://github.com/WordPress/block-development-examples/tree/trunk/plugins/minimal-block-ca6eda) of the [code above](https://github.com/WordPress/block-development-examples/blob/trunk/plugins/minimal-block-ca6eda/plugin.php)_
## Registering a block with JavaScript (client-side)
From 7e85993a0be6830a398515513b8c42366cbcd2b4 Mon Sep 17 00:00:00 2001
From: George Mamadashvili
Date: Fri, 13 Dec 2024 13:18:26 +0400
Subject: [PATCH 041/239] Plugin: Fix eligibility check for post types' default
rendering mode (#67879)
* Plugin: Fix eligibility check for post types' default rendering mode
* Add backport changelog entry
Unlinked contributors: CreativeDive.
Co-authored-by: Mamaduka
Co-authored-by: fabiankaegy
---
backport-changelog/6.8/7129.md | 1 +
lib/compat/wordpress-6.8/post.php | 9 ++++++---
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/backport-changelog/6.8/7129.md b/backport-changelog/6.8/7129.md
index 90c9168cdc6f8..301f1abc45d0d 100644
--- a/backport-changelog/6.8/7129.md
+++ b/backport-changelog/6.8/7129.md
@@ -1,3 +1,4 @@
https://github.com/WordPress/wordpress-develop/pull/7129
* https://github.com/WordPress/gutenberg/pull/62304
+* https://github.com/WordPress/gutenberg/pull/67879
diff --git a/lib/compat/wordpress-6.8/post.php b/lib/compat/wordpress-6.8/post.php
index 639e33b4e5ca5..be842d89b5151 100644
--- a/lib/compat/wordpress-6.8/post.php
+++ b/lib/compat/wordpress-6.8/post.php
@@ -32,15 +32,18 @@ function gutenberg_post_type_rendering_modes() {
* @return array Updated array of post type arguments.
*/
function gutenberg_post_type_default_rendering_mode( $args, $post_type ) {
- $rendering_mode = 'page' === $post_type ? 'template-locked' : 'post-only';
- $rendering_modes = gutenberg_post_type_rendering_modes();
+ if ( ! wp_is_block_theme() || ! current_theme_supports( 'block-templates' ) ) {
+ return $args;
+ }
// Make sure the post type supports the block editor.
if (
- wp_is_block_theme() &&
( isset( $args['show_in_rest'] ) && $args['show_in_rest'] ) &&
( ! empty( $args['supports'] ) && in_array( 'editor', $args['supports'], true ) )
) {
+ $rendering_mode = 'page' === $post_type ? 'template-locked' : 'post-only';
+ $rendering_modes = gutenberg_post_type_rendering_modes();
+
// Validate the supplied rendering mode.
if (
isset( $args['default_rendering_mode'] ) &&
From 25e9753bfb4884ddcf02855f47cef3eb418eaea9 Mon Sep 17 00:00:00 2001
From: Jorge Costa
Date: Fri, 13 Dec 2024 10:01:50 +0000
Subject: [PATCH 042/239] [Docs] Fix: Two broken links to the packages
reference API and to blocks docs (#67889)
Co-authored-by: jorgefilipecosta
Co-authored-by: shail-mehta
---
.../fundamentals/javascript-in-the-block-editor.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/getting-started/fundamentals/javascript-in-the-block-editor.md b/docs/getting-started/fundamentals/javascript-in-the-block-editor.md
index 348b95ba88da3..7accc5d4c2129 100644
--- a/docs/getting-started/fundamentals/javascript-in-the-block-editor.md
+++ b/docs/getting-started/fundamentals/javascript-in-the-block-editor.md
@@ -38,9 +38,9 @@ The `wp-scripts` package also facilitates the use of JavaScript modules, allowin
Integrating JavaScript into your WordPress projects without a build process can be the most straightforward approach in specific scenarios. This is particularly true for projects that don't leverage JSX or other advanced JavaScript features requiring compilation.
-When you opt out of a build process, you interact directly with WordPress's [JavaScript APIs](/docs/reference-guides/packages/) through the global `wp` object. This means that all the methods and packages provided by WordPress are readily available, but with one caveat: you must manually manage script dependencies. This is done by adding [the handle](/docs/contributors/code/scripts.md) of each corresponding package to the dependency array of your enqueued JavaScript file.
+When you opt out of a build process, you interact directly with WordPress's [JavaScript APIs](/docs/reference-guides/packages.md) through the global `wp` object. This means that all the methods and packages provided by WordPress are readily available, but with one caveat: you must manually manage script dependencies. This is done by adding [the handle](/docs/contributors/code/scripts.md) of each corresponding package to the dependency array of your enqueued JavaScript file.
-For example, suppose you're creating a script that registers a new block [variation](/docs/reference-guides/block-api/block-variations.md) using the `registerBlockVariation` function from the [`blocks`](/docs/reference-guides/packages/packages-blocks.md) package. You must include `wp-blocks` in your script's dependency array. This guarantees that the `wp.blocks.registerBlockVariation` method is available and defined by the time your script executes.
+For example, suppose you're creating a script that registers a new block [variation](/docs/reference-guides/block-api/block-variations.md) using the `registerBlockVariation` function from the [`blocks`](/packages/blocks/README.md) package. You must include `wp-blocks` in your script's dependency array. This guarantees that the `wp.blocks.registerBlockVariation` method is available and defined by the time your script executes.
In the following example, the `wp-blocks` dependency is defined when enqueuing the `variations.js` file.
From 20f41746aebc0a4c736879419ea9cb7229de08f9 Mon Sep 17 00:00:00 2001
From: Jarda Snajdr
Date: Fri, 13 Dec 2024 11:26:54 +0100
Subject: [PATCH 043/239] Create a catalog list of private APIs (#66558)
* Create a catalog list of private APIs
* Document some private components
* Rewrite the introduction
* Rewrite the introduction again
---
docs/private-apis.md | 340 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 340 insertions(+)
create mode 100644 docs/private-apis.md
diff --git a/docs/private-apis.md b/docs/private-apis.md
new file mode 100644
index 0000000000000..14c1a4aa22472
--- /dev/null
+++ b/docs/private-apis.md
@@ -0,0 +1,340 @@
+# Gutenberg Private APIs
+
+This is an overview of private APIs exposed by Gutenberg packages. These APIs are used to implement parts of the Gutenberg editor (Post Editor, Site Editor, Core blocks and others) but are not exposed publicly to plugin and theme authors or authors of custom Gutenberg integrations.
+
+The purpose of this document is to present a picture of how many private APIs we have and how they are used to build the Gutenberg editor apps with the libraries and frameworks provided by the family of `@wordpress/*` packages.
+
+## data
+
+The registry has two private methods:
+- `privateActionsOf`
+- `privateSelectorsOf`
+
+Every store has a private API for registering private selectors/actions:
+- `privateActions`
+- `registerPrivateActions`
+- `privateSelectors`
+- `registerPrivateSelectors`
+
+## blocks
+
+### `core/blocks` store
+
+Private actions:
+- `addBlockBindingsSource`
+- `removeBlockBindingsSource`
+- `addBootstrappedBlockType`
+- `addUnprocessedBlockType`
+
+Private selectors:
+- `getAllBlockBindingsSources`
+- `getBlockBindingsSource`
+- `getBootstrappedBlockType`
+- `getSupportedStyles`
+- `getUnprocessedBlockTypes`
+- `hasContentRoleAttribute`
+
+## components
+
+Private exports:
+- `__experimentalPopoverLegacyPositionToPlacement`
+- `ComponentsContext`
+- `Tabs`
+- `Theme`
+- `Menu`
+- `kebabCase`
+
+## commands
+
+Private exports:
+- `useCommandContext` (added May 2023 in #50543)
+
+### `core/commands` store
+
+Private actions:
+- `setContext` (added together with `useCommandContext`)
+
+## preferences
+
+Private exports: (added in Jan 2024 in #57639)
+- `PreferenceBaseOption`
+- `PreferenceToggleControl`
+- `PreferencesModal`
+- `PreferencesModalSection`
+- `PreferencesModalTabs`
+
+There is only one publicly exported component!
+- `PreferenceToggleMenuItem`
+
+## block-editor
+
+Private exports:
+- `AdvancedPanel`
+- `BackgroundPanel`
+- `BorderPanel`
+- `ColorPanel`
+- `DimensionsPanel`
+- `FiltersPanel`
+- `GlobalStylesContext`
+- `ImageSettingsPanel`
+- `TypographyPanel`
+- `areGlobalStyleConfigsEqual`
+- `getBlockCSSSelector`
+- `getBlockSelectors`
+- `getGlobalStylesChanges`
+- `getLayoutStyles`
+- `toStyles`
+- `useGlobalSetting`
+- `useGlobalStyle`
+- `useGlobalStylesOutput`
+- `useGlobalStylesOutputWithConfig`
+- `useGlobalStylesReset`
+- `useHasBackgroundPanel`
+- `useHasBorderPanel`
+- `useHasBorderPanelControls`
+- `useHasColorPanel`
+- `useHasDimensionsPanel`
+- `useHasFiltersPanel`
+- `useHasImageSettingsPanel`
+- `useHasTypographyPanel`
+- `useSettingsForBlockElement`
+- `ExperimentalBlockCanvas`: version of public `BlockCanvas` that has several extra props: `contentRef`, `shouldIframe`, `iframeProps`.
+- `ExperimentalBlockEditorProvider`: version of public `BlockEditorProvider` that filters out several private/experimental settings. See also `__experimentalUpdateSettings`.
+- `getDuotoneFilter`
+- `getRichTextValues`
+- `PrivateQuickInserter`
+- `extractWords`
+- `getNormalizedSearchTerms`
+- `normalizeString`
+- `PrivateListView`
+- `ResizableBoxPopover`
+- `BlockInfo`
+- `useHasBlockToolbar`
+- `cleanEmptyObject`
+- `BlockQuickNavigation`
+- `LayoutStyle`
+- `BlockRemovalWarningModal`
+- `useLayoutClasses`
+- `useLayoutStyles`
+- `DimensionsTool`
+- `ResolutionTool`
+- `TabbedSidebar`
+- `TextAlignmentControl`
+- `usesContextKey`
+- `useFlashEditableBlocks`
+- `useZoomOut`
+- `globalStylesDataKey`
+- `globalStylesLinksDataKey`
+- `selectBlockPatternsKey`
+- `requiresWrapperOnCopy`
+- `PrivateRichText`: has an extra prop `readOnly` added in #58916 and #60327 (Feb and Mar 2024).
+- `PrivateInserterLibrary`: has an extra prop `onPatternCategorySelection` added in #62130 (May 2024).
+- `reusableBlocksSelectKey`
+- `PrivateBlockPopover`: has two extra props, `__unstableContentRef` and `__unstablePopoverSlot`.
+- `PrivatePublishDateTimePicker`: version of public `PublishDateTimePicker` that has two extra props: `isCompact` and `showPopoverHeaderActions`.
+- `useSpacingSizes`
+- `useBlockDisplayTitle`
+- `__unstableBlockStyleVariationOverridesWithConfig`
+- `setBackgroundStyleDefaults`
+- `sectionRootClientIdKey`
+- `__unstableCommentIconFill`
+- `__unstableCommentIconToolbarFill`
+
+### `core/block-editor` store
+
+Private actions:
+- `__experimentalUpdateSettings`: version of public `updateSettings` action that filters out some private/experimental settings.
+- `clearBlockRemovalPrompt`
+- `deleteStyleOverride`
+- `ensureDefaultBlock`
+- `expandBlock`
+- `hideBlockInterface`
+- `modifyContentLockBlock`
+- `privateRemoveBlocks`
+- `resetZoomLevel`
+- `setBlockRemovalRules`
+- `setInsertionPoint`
+- `setLastFocus`
+- `setOpenedBlockSettingsMenu`
+- `setStyleOverride`
+- `setZoomLevel`
+- `showBlockInterface`
+- `startDragging`
+- `stopDragging`
+- `stopEditingAsBlocks`
+
+Private selectors:
+- `getAllPatterns`
+- `getBlockRemovalRules`
+- `getBlockSettings`
+- `getBlockStyles`
+- `getBlockWithoutAttributes`
+- `getClosestAllowedInsertionPoint`
+- `getClosestAllowedInsertionPointForPattern`
+- `getContentLockingParent`
+- `getEnabledBlockParents`
+- `getEnabledClientIdsTree`
+- `getExpandedBlock`
+- `getInserterMediaCategories`
+- `getInsertionPoint`
+- `getLastFocus`
+- `getLastInsertedBlocksClientIds`
+- `getOpenedBlockSettingsMenu`
+- `getParentSectionBlock`
+- `getPatternBySlug`
+- `getRegisteredInserterMediaCategories`
+- `getRemovalPromptData`
+- `getReusableBlocks`
+- `getSectionRootClientId`
+- `getStyleOverrides`
+- `getTemporarilyEditingAsBlocks`
+- `getTemporarilyEditingFocusModeToRevert`
+- `getZoomLevel`
+- `hasAllowedPatterns`
+- `isBlockInterfaceHidden`
+- `isBlockSubtreeDisabled`
+- `isDragging`
+- `isResolvingPatterns`
+- `isSectionBlock`
+- `isZoomOut`
+
+## core-data
+
+Private exports:
+- `useEntityRecordsWithPermissions`
+
+### `core` store
+
+Private actions:
+- `receiveRegisteredPostMeta`
+
+Private selectors:
+- `getBlockPatternsForPostType`
+- `getEntityRecordPermissions`
+- `getEntityRecordsPermissions`
+- `getNavigationFallbackId`
+- `getRegisteredPostMeta`
+- `getUndoManager`
+
+## patterns (package created in Aug 2023 and has no public exports, everything is private)
+
+Private exports:
+- `OverridesPanel`
+- `CreatePatternModal`
+- `CreatePatternModalContents`
+- `DuplicatePatternModal`
+- `isOverridableBlock`
+- `hasOverridableBlocks`
+- `useDuplicatePatternProps`
+- `RenamePatternModal`
+- `PatternsMenuItems`
+- `RenamePatternCategoryModal`
+- `PatternOverridesControls`
+- `ResetOverridesControl`
+- `PatternOverridesBlockControls`
+- `useAddPatternCategory`
+- `PATTERN_TYPES`
+- `PATTERN_DEFAULT_CATEGORY`
+- `PATTERN_USER_CATEGORY`
+- `EXCLUDED_PATTERN_SOURCES`
+- `PATTERN_SYNC_TYPES`
+- `PARTIAL_SYNCING_SUPPORTED_BLOCKS`
+
+### `core/patterns` store
+
+Private actions:
+- `convertSyncedPatternToStatic`
+- `createPattern`
+- `createPatternFromFile`
+- `setEditingPattern`
+
+Private selectors:
+- `isEditingPattern`
+
+## block-library
+
+Private exports:
+- `BlockKeyboardShortcuts`
+
+## router (private exports only)
+
+Private exports:
+- `useHistory`
+- `useLocation`
+- `RouterProvider`
+
+## core-commands (private exports only)
+
+Private exports:
+- `useCommands`
+
+## editor
+
+Private exports:
+- `CreateTemplatePartModal`
+- `BackButton`
+- `EntitiesSavedStatesExtensible`
+- `Editor`
+- `EditorContentSlotFill`
+- `GlobalStylesProvider`
+- `mergeBaseAndUserConfigs`
+- `PluginPostExcerpt`
+- `PostCardPanel`
+- `PreferencesModal`
+- `usePostActions`
+- `ToolsMoreMenuGroup`
+- `ViewMoreMenuGroup`
+- `ResizableEditor`
+- `registerCoreBlockBindingsSources`
+- `interfaceStore`
+- `ActionItem`
+- `ComplementaryArea`
+- `ComplementaryAreaMoreMenuItem`
+- `FullscreenMode`
+- `InterfaceSkeleton`
+- `NavigableRegion`
+- `PinnedItems`
+
+### `core/editor` store
+
+Private actions:
+- `createTemplate`
+- `hideBlockTypes`
+- `registerEntityAction`
+- `registerPostTypeActions`
+- `removeTemplates`
+- `revertTemplate`
+- `saveDirtyEntities`
+- `setCurrentTemplateId`
+- `setIsReady`
+- `showBlockTypes`
+- `unregisterEntityAction`
+
+Private selectors:
+- `getEntityActions`
+- `getInserter`
+- `getInserterSidebarToggleRef`
+- `getListViewToggleRef`
+- `getPostBlocksByName`
+- `getPostIcon`
+- `hasPostMetaChanges`
+- `isEntityReady`
+
+## edit-post
+
+### `core/edit-post` store
+
+Private selectors:
+- `getEditedPostTemplateId`
+
+## edit-site
+
+### `core/edit-site` store
+
+Private actions:
+- `registerRoute`
+- `setEditorCanvasContainerView`
+
+Private selectors:
+- `getRoutes`
+- `getEditorCanvasContainerView`
From d988d2817c5971775a2e340afea5a3b53c17ced0 Mon Sep 17 00:00:00 2001
From: Prasad Karmalkar
Date: Fri, 13 Dec 2024 15:58:40 +0530
Subject: [PATCH 044/239] Refactor "Settings" panel of Columns block to use
ToolsPanel instead of PanelBody (#67910)
Co-authored-by: prasadkarmalkar
Co-authored-by: fabiankaegy
---
packages/block-library/src/columns/edit.js | 47 +++++++++++++++++-----
1 file changed, 36 insertions(+), 11 deletions(-)
diff --git a/packages/block-library/src/columns/edit.js b/packages/block-library/src/columns/edit.js
index f8cf0297302cc..3d5f298aef835 100644
--- a/packages/block-library/src/columns/edit.js
+++ b/packages/block-library/src/columns/edit.js
@@ -9,9 +9,10 @@ import clsx from 'clsx';
import { __ } from '@wordpress/i18n';
import {
Notice,
- PanelBody,
RangeControl,
ToggleControl,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
} from '@wordpress/components';
import {
@@ -149,9 +150,22 @@ function ColumnInspectorControls( {
}
return (
-
+ {
+ updateColumns( count, minCount );
+ setAttributes( {
+ isStackedOnMobile: true,
+ } );
+ } }
+ >
{ canInsertColumnBlock && (
- <>
+ count }
+ onDeselect={ () => updateColumns( count, minCount ) }
+ >
) }
- >
+
) }
-
+ isShownByDefault
+ hasValue={ () => isStackedOnMobile !== true }
+ onDeselect={ () =>
setAttributes( {
- isStackedOnMobile: ! isStackedOnMobile,
+ isStackedOnMobile: true,
} )
}
- />
-
+ >
+
+ setAttributes( {
+ isStackedOnMobile: ! isStackedOnMobile,
+ } )
+ }
+ />
+
+
);
}
From d90fbad61cf2abd35f242b5d45dad4f0e4116c5a Mon Sep 17 00:00:00 2001
From: Prasad Karmalkar
Date: Fri, 13 Dec 2024 16:01:03 +0530
Subject: [PATCH 045/239] Refactor "Settings" panel of Column block to use
ToolsPanel instead of PanelBody (#67913)
Co-authored-by: prasadkarmalkar
Co-authored-by: fabiankaegy
---
packages/block-library/src/column/edit.js | 40 +++++++++++++++--------
1 file changed, 27 insertions(+), 13 deletions(-)
diff --git a/packages/block-library/src/column/edit.js b/packages/block-library/src/column/edit.js
index a0f3cdcf65393..b88e72e8da699 100644
--- a/packages/block-library/src/column/edit.js
+++ b/packages/block-library/src/column/edit.js
@@ -18,8 +18,9 @@ import {
} from '@wordpress/block-editor';
import {
__experimentalUseCustomUnits as useCustomUnits,
- PanelBody,
__experimentalUnitControl as UnitControl,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
} from '@wordpress/components';
import { useSelect, useDispatch } from '@wordpress/data';
import { sprintf, __ } from '@wordpress/i18n';
@@ -30,19 +31,32 @@ function ColumnInspectorControls( { width, setAttributes } ) {
availableUnits: availableUnits || [ '%', 'px', 'em', 'rem', 'vw' ],
} );
return (
-
- {
+ setAttributes( { width: undefined } );
+ } }
+ >
+ width !== undefined }
label={ __( 'Width' ) }
- __unstableInputWidth="calc(50% - 8px)"
- __next40pxDefaultSize
- value={ width || '' }
- onChange={ ( nextWidth ) => {
- nextWidth = 0 > parseFloat( nextWidth ) ? '0' : nextWidth;
- setAttributes( { width: nextWidth } );
- } }
- units={ units }
- />
-
+ onDeselect={ () => setAttributes( { width: undefined } ) }
+ isShownByDefault
+ >
+ {
+ nextWidth =
+ 0 > parseFloat( nextWidth ) ? '0' : nextWidth;
+ setAttributes( { width: nextWidth } );
+ } }
+ units={ units }
+ />
+
+
);
}
From 662455d9a5e40327e58c6f71190f254969f71081 Mon Sep 17 00:00:00 2001
From: Andrea Fercia
Date: Fri, 13 Dec 2024 13:45:33 +0100
Subject: [PATCH 046/239] Make sure the sidebar navigation item focus style is
fully visible. (#67817)
Co-authored-by: afercia
Co-authored-by: oandregal
---
.../src/components/sidebar-navigation-item/style.scss | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/packages/edit-site/src/components/sidebar-navigation-item/style.scss b/packages/edit-site/src/components/sidebar-navigation-item/style.scss
index ac1cf8b730861..230967c4c7e0e 100644
--- a/packages/edit-site/src/components/sidebar-navigation-item/style.scss
+++ b/packages/edit-site/src/components/sidebar-navigation-item/style.scss
@@ -20,6 +20,11 @@
color: $white;
}
+ // Make sure the focus style is drawn on top of the current item background.
+ &:focus-visible {
+ transform: translateZ(0);
+ }
+
.edit-site-sidebar-navigation-item__drilldown-indicator {
fill: $gray-600;
}
From 673f80d43810fe7d596cef0e4d3543677d85798d Mon Sep 17 00:00:00 2001
From: Manzoor Wani
Date: Fri, 13 Dec 2024 04:57:54 -0800
Subject: [PATCH 047/239] Fix dataviews commonjs export (#67962)
Co-authored-by: manzoorwanijk
Co-authored-by: youknowriad
Co-authored-by: anomiex
---
packages/dataviews/CHANGELOG.md | 18 +++++++++++-------
packages/dataviews/package.json | 3 ++-
2 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/packages/dataviews/CHANGELOG.md b/packages/dataviews/CHANGELOG.md
index 0468a277ba292..887c279714ec0 100644
--- a/packages/dataviews/CHANGELOG.md
+++ b/packages/dataviews/CHANGELOG.md
@@ -2,21 +2,25 @@
## Unreleased
+### Bug Fixes
+
+- Fixed commonjs export ([#67962](https://github.com/WordPress/gutenberg/pull/67962))
+
## 4.10.0 (2024-12-11)
## Breaking Changes
- Support showing or hiding title, media and description fields ([#67477](https://github.com/WordPress/gutenberg/pull/67477)).
-- Unify the `title`, `media` and `description` fields for the different layouts. So instead of the previous `view.layout.mediaField`, `view.layout.primaryField` and `view.layout.columnFields`, all the layouts now support these three fields with the following config ([#67477](https://github.com/WordPress/gutenberg/pull/67477)):
+- Unify the `title`, `media` and `description` fields for the different layouts. So instead of the previous `view.layout.mediaField`, `view.layout.primaryField` and `view.layout.columnFields`, all the layouts now support these three fields with the following config ([#67477](https://github.com/WordPress/gutenberg/pull/67477)):
```js
const view = {
- type: 'table',
- titleField: 'title',
- mediaField: 'media',
- descriptionField: 'description',
- fields: [ 'author', 'date' ],
-}
+ type: 'table',
+ titleField: 'title',
+ mediaField: 'media',
+ descriptionField: 'description',
+ fields: [ 'author', 'date' ],
+};
```
## Internal
diff --git a/packages/dataviews/package.json b/packages/dataviews/package.json
index c307085bbea07..7f6d96745acab 100644
--- a/packages/dataviews/package.json
+++ b/packages/dataviews/package.json
@@ -27,7 +27,8 @@
"exports": {
".": {
"types": "./build-types/index.d.ts",
- "import": "./build-module/index.js"
+ "import": "./build-module/index.js",
+ "default": "./build/index.js"
},
"./wp": {
"types": "./build-types/index.d.ts",
From 750c8e46e2847cbb780278bd3815a4fdf76098a1 Mon Sep 17 00:00:00 2001
From: George Mamadashvili
Date: Fri, 13 Dec 2024 17:03:57 +0400
Subject: [PATCH 048/239] Editor: Remove the 'content-only' check from
'TemplatePartConverterMenuItem' (#67961)
Co-authored-by: Mamaduka
---
.../components/template-part-menu-items/index.js | 13 ++-----------
1 file changed, 2 insertions(+), 11 deletions(-)
diff --git a/packages/editor/src/components/template-part-menu-items/index.js b/packages/editor/src/components/template-part-menu-items/index.js
index 0e126644d4993..52c50f91b3933 100644
--- a/packages/editor/src/components/template-part-menu-items/index.js
+++ b/packages/editor/src/components/template-part-menu-items/index.js
@@ -27,25 +27,16 @@ export default function TemplatePartMenuItems() {
}
function TemplatePartConverterMenuItem( { clientIds, onClose } ) {
- const { isContentOnly, blocks } = useSelect(
+ const { blocks } = useSelect(
( select ) => {
- const { getBlocksByClientId, getBlockEditingMode } =
- select( blockEditorStore );
+ const { getBlocksByClientId } = select( blockEditorStore );
return {
blocks: getBlocksByClientId( clientIds ),
- isContentOnly:
- clientIds.length === 1 &&
- getBlockEditingMode( clientIds[ 0 ] ) === 'contentOnly',
};
},
[ clientIds ]
);
- // Do not show the convert button if the block is in content-only mode.
- if ( isContentOnly ) {
- return null;
- }
-
// Allow converting a single template part to standard blocks.
if ( blocks.length === 1 && blocks[ 0 ]?.name === 'core/template-part' ) {
return (
From 0b1a6b6631ce033f0fa751c2238ba14bf9e3cfce Mon Sep 17 00:00:00 2001
From: Andrea Fercia
Date: Fri, 13 Dec 2024 14:43:22 +0100
Subject: [PATCH 049/239] Improve logic to show entities saved panel
description. (#67971)
* Improve logic to show entities saved panel description.
* Apply CR suggestion
---------
Co-authored-by: afercia
Co-authored-by: Mamaduka
Co-authored-by: t-hamano
---
.../editor/src/components/entities-saved-states/index.js | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/packages/editor/src/components/entities-saved-states/index.js b/packages/editor/src/components/entities-saved-states/index.js
index ad584b0df7557..200473cccff70 100644
--- a/packages/editor/src/components/entities-saved-states/index.js
+++ b/packages/editor/src/components/entities-saved-states/index.js
@@ -115,6 +115,10 @@ export function EntitiesSavedStatesExtensible( {
'description'
);
+ const selectItemsToSaveDescription = !! dirtyEntityRecords.length
+ ? __( 'Select the items you want to save.' )
+ : undefined;
+
return (
}
)
- : __( 'Select the items you want to save.' ) }
+ : selectItemsToSaveDescription }
From 629123201f2f513717fab82b43231c681382da5b Mon Sep 17 00:00:00 2001
From: Aki Hamano <54422211+t-hamano@users.noreply.github.com>
Date: Fri, 13 Dec 2024 22:55:30 +0900
Subject: [PATCH 050/239] Customizer Widgets: Fix inserter button size and
animation (#67880)
Co-authored-by: t-hamano
Co-authored-by: tyxla
Co-authored-by: jameskoster
---
.../src/components/header/style.scss | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/packages/customize-widgets/src/components/header/style.scss b/packages/customize-widgets/src/components/header/style.scss
index 5c3f37a0bf0d4..73789282108af 100644
--- a/packages/customize-widgets/src/components/header/style.scss
+++ b/packages/customize-widgets/src/components/header/style.scss
@@ -33,16 +33,25 @@
border-radius: $radius-small;
color: $white;
padding: 0;
- min-width: $grid-unit-30;
- height: $grid-unit-30;
+ min-width: $grid-unit-40;
+ height: $grid-unit-40;
margin: $grid-unit-15 0 $grid-unit-15 auto;
&::before {
content: none;
}
+ svg {
+ transition: transform cubic-bezier(0.165, 0.84, 0.44, 1) 0.2s;
+ @include reduce-motion("transition");
+ }
+
&.is-pressed {
background: $gray-900;
+
+ svg {
+ transform: rotate(45deg);
+ }
}
}
From 67557edac8a22538ca3ff9cd9594cf821c5153e9 Mon Sep 17 00:00:00 2001
From: Himanshu Pathak
Date: Fri, 13 Dec 2024 19:34:52 +0530
Subject: [PATCH 051/239] Storybook: Add stories for the TextAlignmentControl
component (#67371)
* Storybook: Add stories for the text-alignment-control component
* Storybook: Update TextAlignmentControl story to follow best practices and simplify the structure
* Storybook: Simplify TextAlignmentControl story
* Storybook: Simplify the documentation for TextAlignmentControl story
Co-authored-by: himanshupathak95
Co-authored-by: t-hamano
---
.../stories/index.story.js | 73 ++++++++++++++-----
1 file changed, 55 insertions(+), 18 deletions(-)
diff --git a/packages/block-editor/src/components/text-alignment-control/stories/index.story.js b/packages/block-editor/src/components/text-alignment-control/stories/index.story.js
index 3744f3fa012a7..fd97f9b60e6a9 100644
--- a/packages/block-editor/src/components/text-alignment-control/stories/index.story.js
+++ b/packages/block-editor/src/components/text-alignment-control/stories/index.story.js
@@ -8,32 +8,69 @@ import { useState } from '@wordpress/element';
*/
import TextAlignmentControl from '../';
-export default {
+const meta = {
title: 'BlockEditor/TextAlignmentControl',
component: TextAlignmentControl,
+ parameters: {
+ docs: {
+ canvas: { sourceState: 'shown' },
+ description: {
+ component: 'Control to facilitate text alignment selections.',
+ },
+ },
+ },
argTypes: {
- onChange: { action: 'onChange' },
- className: { control: 'text' },
+ value: {
+ control: { type: null },
+ description: 'Currently selected text alignment value.',
+ table: {
+ type: {
+ summary: 'string',
+ },
+ },
+ },
+ onChange: {
+ action: 'onChange',
+ control: { type: null },
+ description: 'Handles change in text alignment selection.',
+ table: {
+ type: {
+ summary: 'function',
+ },
+ },
+ },
options: {
control: 'check',
+ description: 'Array of text alignment options to display.',
options: [ 'left', 'center', 'right', 'justify' ],
+ table: {
+ type: { summary: 'array' },
+ },
+ },
+ className: {
+ control: 'text',
+ description: 'Class name to add to the control.',
+ table: {
+ type: { summary: 'string' },
+ },
},
- value: { control: false },
},
};
-const Template = ( { onChange, ...args } ) => {
- const [ value, setValue ] = useState();
- return (
- {
- onChange( ...changeArgs );
- setValue( ...changeArgs );
- } }
- value={ value }
- />
- );
-};
+export default meta;
-export const Default = Template.bind( {} );
+export const Default = {
+ render: function Template( { onChange, ...args } ) {
+ const [ value, setValue ] = useState();
+ return (
+ {
+ onChange( ...changeArgs );
+ setValue( ...changeArgs );
+ } }
+ value={ value }
+ />
+ );
+ },
+};
From 3d17c61018b2e5d37755f690e35e7a0e6eadf5ff Mon Sep 17 00:00:00 2001
From: Lena Morita
Date: Fri, 13 Dec 2024 23:05:33 +0900
Subject: [PATCH 052/239] TreeSelect: Deprecate 36px default size (#67855)
* TreeSelect: Deprecate 36px default size
* Fix types
* Auto-generate readme
* Add changelog
* Fixup readme
Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: tyxla
---
packages/components/CHANGELOG.md | 1 +
.../components/src/input-control/types.ts | 6 +-
packages/components/src/tree-select/README.md | 171 +++++++++++++++---
.../src/tree-select/docs-manifest.json | 5 +
packages/components/src/tree-select/index.tsx | 12 +-
.../src/tree-select/stories/index.story.tsx | 1 +
packages/components/src/tree-select/types.ts | 9 +-
7 files changed, 172 insertions(+), 33 deletions(-)
create mode 100644 packages/components/src/tree-select/docs-manifest.json
diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md
index 49cc196b1f7e6..af71c4104b4d9 100644
--- a/packages/components/CHANGELOG.md
+++ b/packages/components/CHANGELOG.md
@@ -8,6 +8,7 @@
### Deprecations
+- `TreeSelect`: Deprecate 36px default size ([#67855](https://github.com/WordPress/gutenberg/pull/67855)).
- `SelectControl`: Deprecate 36px default size ([#66898](https://github.com/WordPress/gutenberg/pull/66898)).
- `InputControl`: Deprecate 36px default size ([#66897](https://github.com/WordPress/gutenberg/pull/66897)).
diff --git a/packages/components/src/input-control/types.ts b/packages/components/src/input-control/types.ts
index 99c5b1aea92c3..edb69def61905 100644
--- a/packages/components/src/input-control/types.ts
+++ b/packages/components/src/input-control/types.ts
@@ -136,7 +136,7 @@ export interface InputBaseProps extends BaseProps, FlexProps {
* If you want to apply standard padding in accordance with the size variant, wrap the element in
* the provided `` component.
*
- * @example
+ * ```jsx
* import {
* __experimentalInputControl as InputControl,
* __experimentalInputControlPrefixWrapper as InputControlPrefixWrapper,
@@ -145,6 +145,7 @@ export interface InputBaseProps extends BaseProps, FlexProps {
* @ }
* />
+ * ```
*/
prefix?: ReactNode;
/**
@@ -154,7 +155,7 @@ export interface InputBaseProps extends BaseProps, FlexProps {
* If you want to apply standard padding in accordance with the size variant, wrap the element in
* the provided `` component.
*
- * @example
+ * ```jsx
* import {
* __experimentalInputControl as InputControl,
* __experimentalInputControlSuffixWrapper as InputControlSuffixWrapper,
@@ -163,6 +164,7 @@ export interface InputBaseProps extends BaseProps, FlexProps {
* % }
* />
+ * ```
*/
suffix?: ReactNode;
/**
diff --git a/packages/components/src/tree-select/README.md b/packages/components/src/tree-select/README.md
index 3d26488478bd0..493c83bf993b0 100644
--- a/packages/components/src/tree-select/README.md
+++ b/packages/components/src/tree-select/README.md
@@ -1,10 +1,10 @@
# TreeSelect
-TreeSelect component is used to generate select input fields.
+
-## Usage
+See the WordPress Storybook for more detailed, interactive documentation.
-Render a user interface to select the parent page in a hierarchy of pages:
+Generates a hierarchical select input.
```jsx
import { useState } from 'react';
@@ -15,7 +15,8 @@ const MyTreeSelect = () => {
return (
setPage( newPage ) }
@@ -50,51 +51,165 @@ const MyTreeSelect = () => {
);
}
```
-
## Props
-The set of props accepted by the component will be specified below.
-Props not included in this set will be applied to the SelectControl component being used.
+### `__next40pxDefaultSize`
+
+Start opting into the larger default height that will become the default size in a future version.
+
+ - Type: `boolean`
+ - Required: No
+ - Default: `false`
+
+### `__nextHasNoMarginBottom`
+
+Start opting into the new margin-free styles that will become the default in a future version.
+
+ - Type: `boolean`
+ - Required: No
+ - Default: `false`
+
+### `children`
+
+As an alternative to the `options` prop, `optgroup`s and `options` can be
+passed in as `children` for more customizability.
+
+ - Type: `ReactNode`
+ - Required: No
+
+### `disabled`
-### label
+If true, the `input` will be disabled.
+
+ - Type: `boolean`
+ - Required: No
+ - Default: `false`
+
+### `hideLabelFromVision`
+
+If true, the label will only be visible to screen readers.
+
+ - Type: `boolean`
+ - Required: No
+ - Default: `false`
+
+### `help`
+
+Additional description for the control.
+
+Only use for meaningful description or instructions for the control. An element containing the description will be programmatically associated to the BaseControl by the means of an `aria-describedby` attribute.
+
+ - Type: `ReactNode`
+ - Required: No
+
+### `label`
If this property is added, a label will be generated using label property as the content.
-- Type: `String`
-- Required: No
+ - Type: `ReactNode`
+ - Required: No
+
+### `labelPosition`
+
+The position of the label.
-### noOptionLabel
+ - Type: `"top" | "bottom" | "side" | "edge"`
+ - Required: No
+ - Default: `'top'`
+
+### `noOptionLabel`
If this property is added, an option will be added with this label to represent empty selection.
-- Type: `String`
-- Required: No
+ - Type: `string`
+ - Required: No
+
+### `onChange`
+
+A function that receives the value of the new option that is being selected as input.
+
+ - Type: `(value: string, extra?: { event?: ChangeEvent; }) => void`
+ - Required: No
+
+### `options`
+
+An array of option property objects to be rendered,
+each with a `label` and `value` property, as well as any other
+`` attributes.
-### onChange
+ - Type: `readonly ({ label: string; value: string; } & Omit, "label" | "value">)[]`
+ - Required: No
-A function that receives the id of the new node element that is being selected.
+### `prefix`
+
+Renders an element on the left side of the input.
+
+By default, the prefix is aligned with the edge of the input border, with no padding.
+If you want to apply standard padding in accordance with the size variant, wrap the element in
+the provided `` component.
+
+```jsx
+import {
+ __experimentalInputControl as InputControl,
+ __experimentalInputControlPrefixWrapper as InputControlPrefixWrapper,
+} from '@wordpress/components';
+
+@ }
+/>
+```
-- Type: `function`
-- Required: Yes
+ - Type: `ReactNode`
+ - Required: No
-### selectedId
+### `selectedId`
The id of the currently selected node.
-- Type: `string` | `string[]`
-- Required: No
+ - Type: `string`
+ - Required: No
-### tree
+### `size`
+
+Adjusts the size of the input.
+
+ - Type: `"default" | "small" | "compact" | "__unstable-large"`
+ - Required: No
+ - Default: `'default'`
+
+### `suffix`
+
+Renders an element on the right side of the input.
+
+By default, the suffix is aligned with the edge of the input border, with no padding.
+If you want to apply standard padding in accordance with the size variant, wrap the element in
+the provided `` component.
+
+```jsx
+import {
+ __experimentalInputControl as InputControl,
+ __experimentalInputControlSuffixWrapper as InputControlSuffixWrapper,
+} from '@wordpress/components';
+
+% }
+/>
+```
+
+ - Type: `ReactNode`
+ - Required: No
+
+### `tree`
An array containing the tree objects with the possible nodes the user can select.
-- Type: `Object[]`
-- Required: No
+ - Type: `Tree[]`
+ - Required: No
-#### __nextHasNoMarginBottom
+### `variant`
-Start opting into the new margin-free styles that will become the default in a future version.
+The style variant of the control.
-- Type: `Boolean`
-- Required: No
-- Default: `false`
+ - Type: `"default" | "minimal"`
+ - Required: No
+ - Default: `'default'`
diff --git a/packages/components/src/tree-select/docs-manifest.json b/packages/components/src/tree-select/docs-manifest.json
new file mode 100644
index 0000000000000..0e74d71d309e1
--- /dev/null
+++ b/packages/components/src/tree-select/docs-manifest.json
@@ -0,0 +1,5 @@
+{
+ "$schema": "../../schemas/docs-manifest.json",
+ "displayName": "TreeSelect",
+ "filePath": "./index.tsx"
+}
diff --git a/packages/components/src/tree-select/index.tsx b/packages/components/src/tree-select/index.tsx
index 075ae1268e3c7..6611657636162 100644
--- a/packages/components/src/tree-select/index.tsx
+++ b/packages/components/src/tree-select/index.tsx
@@ -11,6 +11,7 @@ import { SelectControl } from '../select-control';
import type { TreeSelectProps, Tree, Truthy } from './types';
import { useDeprecated36pxDefaultSizeProp } from '../utils/use-deprecated-props';
import { ContextSystemProvider } from '../context';
+import { maybeWarnDeprecated36pxSize } from '../utils/deprecated-36px-size';
const CONTEXT_VALUE = {
BaseControl: {
@@ -35,11 +36,11 @@ function getSelectOptions(
}
/**
- * TreeSelect component is used to generate select input fields.
+ * Generates a hierarchical select input.
*
* ```jsx
+ * import { useState } from 'react';
* import { TreeSelect } from '@wordpress/components';
- * import { useState } from '@wordpress/element';
*
* const MyTreeSelect = () => {
* const [ page, setPage ] = useState( 'p21' );
@@ -47,6 +48,7 @@ function getSelectOptions(
* return (
* setPage( newPage ) }
@@ -99,6 +101,12 @@ export function TreeSelect( props: TreeSelectProps ) {
].filter( < T, >( option: T ): option is Truthy< T > => !! option );
}, [ noOptionLabel, tree ] );
+ maybeWarnDeprecated36pxSize( {
+ componentName: 'TreeSelect',
+ size: restProps.size,
+ __next40pxDefaultSize: restProps.__next40pxDefaultSize,
+ } );
+
return (
= ( props ) => {
export const Default = TreeSelectWithState.bind( {} );
Default.args = {
__nextHasNoMarginBottom: true,
+ __next40pxDefaultSize: true,
label: 'Label Text',
noOptionLabel: 'No parent page',
help: 'Help text to explain the select control.',
diff --git a/packages/components/src/tree-select/types.ts b/packages/components/src/tree-select/types.ts
index da90ece3a658e..59e8e173fab02 100644
--- a/packages/components/src/tree-select/types.ts
+++ b/packages/components/src/tree-select/types.ts
@@ -16,11 +16,18 @@ export interface Tree {
// `TreeSelect` inherits props from `SelectControl`, but only
// in single selection mode (ie. when the `multiple` prop is not defined).
export interface TreeSelectProps
- extends Omit< SelectControlSingleSelectionProps, 'value' | 'multiple' > {
+ extends Omit<
+ SelectControlSingleSelectionProps,
+ 'value' | 'multiple' | 'onChange'
+ > {
/**
* If this property is added, an option will be added with this label to represent empty selection.
*/
noOptionLabel?: string;
+ /**
+ * A function that receives the value of the new option that is being selected as input.
+ */
+ onChange?: SelectControlSingleSelectionProps[ 'onChange' ];
/**
* An array containing the tree objects with the possible nodes the user can select.
*/
From c8cdff33b275505b2cc39772eab44fea3553100e Mon Sep 17 00:00:00 2001
From: Sukhendu Sekhar Guria
Date: Fri, 13 Dec 2024 20:00:28 +0530
Subject: [PATCH 053/239] Refactor "Settings" panel of Site Title block to use
ToolsPanel instead of PanelBody (#67898)
Co-authored-by: Sukhendu2002
Co-authored-by: fabiankaegy
---
packages/block-library/src/site-title/edit.js | 60 ++++++++++++++-----
1 file changed, 45 insertions(+), 15 deletions(-)
diff --git a/packages/block-library/src/site-title/edit.js b/packages/block-library/src/site-title/edit.js
index 82e3c1d7f7bb4..644629a96fe4e 100644
--- a/packages/block-library/src/site-title/edit.js
+++ b/packages/block-library/src/site-title/edit.js
@@ -17,7 +17,11 @@ import {
useBlockProps,
HeadingLevelDropdown,
} from '@wordpress/block-editor';
-import { ToggleControl, PanelBody } from '@wordpress/components';
+import {
+ ToggleControl,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
+} from '@wordpress/components';
import { createBlock, getDefaultBlockName } from '@wordpress/blocks';
import { decodeEntities } from '@wordpress/html-entities';
@@ -109,26 +113,52 @@ export default function SiteTitleEdit( {
/>
-
- {
+ setAttributes( {
+ isLink: false,
+ linkTarget: '_self',
+ } );
+ } }
+ >
+ isLink !== false }
label={ __( 'Make title link to home' ) }
- onChange={ () => setAttributes( { isLink: ! isLink } ) }
- checked={ isLink }
- />
- { isLink && (
+ onDeselect={ () => setAttributes( { isLink: false } ) }
+ isShownByDefault
+ >
- setAttributes( {
- linkTarget: value ? '_blank' : '_self',
- } )
+ label={ __( 'Make title link to home' ) }
+ onChange={ () =>
+ setAttributes( { isLink: ! isLink } )
}
- checked={ linkTarget === '_blank' }
+ checked={ isLink }
/>
+
+ { isLink && (
+ linkTarget !== '_self' }
+ label={ __( 'Open in new tab' ) }
+ onDeselect={ () =>
+ setAttributes( { linkTarget: '_self' } )
+ }
+ isShownByDefault
+ >
+
+ setAttributes( {
+ linkTarget: value ? '_blank' : '_self',
+ } )
+ }
+ checked={ linkTarget === '_blank' }
+ />
+
) }
-
+
{ siteTitleContent }
>
From 0d7f1e32f369159dec5352d10fdb89f5a9063d60 Mon Sep 17 00:00:00 2001
From: Sukhendu Sekhar Guria
Date: Fri, 13 Dec 2024 20:02:36 +0530
Subject: [PATCH 054/239] Refactor "Settings" panel of Excerpt block to use
ToolsPanel instead of PanelBody (#67908)
Co-authored-by: Sukhendu2002
Co-authored-by: fabiankaegy
---
.../block-library/src/post-excerpt/edit.js | 73 +++++++++++++------
1 file changed, 52 insertions(+), 21 deletions(-)
diff --git a/packages/block-library/src/post-excerpt/edit.js b/packages/block-library/src/post-excerpt/edit.js
index 05aaf543b5919..ad2b6300e79e4 100644
--- a/packages/block-library/src/post-excerpt/edit.js
+++ b/packages/block-library/src/post-excerpt/edit.js
@@ -16,7 +16,12 @@ import {
Warning,
useBlockProps,
} from '@wordpress/block-editor';
-import { PanelBody, ToggleControl, RangeControl } from '@wordpress/components';
+import {
+ ToggleControl,
+ RangeControl,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
+} from '@wordpress/components';
import { __, _x } from '@wordpress/i18n';
import { useSelect } from '@wordpress/data';
@@ -219,29 +224,55 @@ export default function PostExcerptEditor( {
/>
-
- {
+ setAttributes( {
+ showMoreOnNewLine: true,
+ excerptLength: 55,
+ } );
+ } }
+ >
+ showMoreOnNewLine !== true }
label={ __( 'Show link on new line' ) }
- checked={ showMoreOnNewLine }
- onChange={ ( newShowMoreOnNewLine ) =>
- setAttributes( {
- showMoreOnNewLine: newShowMoreOnNewLine,
- } )
+ onDeselect={ () =>
+ setAttributes( { showMoreOnNewLine: true } )
}
- />
-
+
+ setAttributes( {
+ showMoreOnNewLine: newShowMoreOnNewLine,
+ } )
+ }
+ />
+
+ excerptLength !== 55 }
label={ __( 'Max number of words' ) }
- value={ excerptLength }
- onChange={ ( value ) => {
- setAttributes( { excerptLength: value } );
- } }
- min="10"
- max="100"
- />
-
+ onDeselect={ () =>
+ setAttributes( { excerptLength: 55 } )
+ }
+ isShownByDefault
+ >
+ {
+ setAttributes( { excerptLength: value } );
+ } }
+ min="10"
+ max="100"
+ />
+
+
{ excerptContent }
From d0d1045056c3c2a6c96609ea0694a5d29761ccde Mon Sep 17 00:00:00 2001
From: George Mamadashvili
Date: Fri, 13 Dec 2024 18:33:40 +0400
Subject: [PATCH 055/239] Button: Replace ButtonGroup usage with
ToggleGroupControl (#65346)
Co-authored-by: Mamaduka
Co-authored-by: ciampo
Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: t-hamano
Co-authored-by: tyxla
Co-authored-by: andreawetzel
---
packages/block-library/src/button/edit.js | 48 ++++++++------------
test/e2e/specs/editor/blocks/buttons.spec.js | 14 +++---
2 files changed, 28 insertions(+), 34 deletions(-)
diff --git a/packages/block-library/src/button/edit.js b/packages/block-library/src/button/edit.js
index 9f2a9048af4c0..520da26ef9671 100644
--- a/packages/block-library/src/button/edit.js
+++ b/packages/block-library/src/button/edit.js
@@ -16,13 +16,13 @@ import removeAnchorTag from '../utils/remove-anchor-tag';
import { __ } from '@wordpress/i18n';
import { useEffect, useState, useRef, useMemo } from '@wordpress/element';
import {
- Button,
- ButtonGroup,
TextControl,
ToolbarButton,
Popover,
__experimentalToolsPanel as ToolsPanel,
__experimentalToolsPanelItem as ToolsPanelItem,
+ __experimentalToggleGroupControl as ToggleGroupControl,
+ __experimentalToggleGroupControlOption as ToggleGroupControlOption,
} from '@wordpress/components';
import {
AlignmentControl,
@@ -115,46 +115,38 @@ function useEnter( props ) {
}
function WidthPanel( { selectedWidth, setAttributes } ) {
- function handleChange( newWidth ) {
- // Check if we are toggling the width off
- const width = selectedWidth === newWidth ? undefined : newWidth;
-
- // Update attributes.
- setAttributes( { width } );
- }
-
return (
{
- handleChange( undefined );
- } }
+ resetAll={ () => setAttributes( { width: undefined } ) }
>
!! selectedWidth }
- onDeselect={ () => handleChange( undefined ) }
+ onDeselect={ () => setAttributes( { width: undefined } ) }
+ __nextHasNoMarginBottom
>
-
+
+ setAttributes( { width: newWidth } )
+ }
+ isBlock
+ __next40pxDefaultSize
+ __nextHasNoMarginBottom
+ >
{ [ 25, 50, 75, 100 ].map( ( widthValue ) => {
return (
- handleChange( widthValue ) }
- >
- { widthValue }%
-
+ value={ widthValue }
+ label={ `${ widthValue }%` }
+ />
);
} ) }
-
+
);
diff --git a/test/e2e/specs/editor/blocks/buttons.spec.js b/test/e2e/specs/editor/blocks/buttons.spec.js
index d6b0a0a15c4ea..c7fdc18429e11 100644
--- a/test/e2e/specs/editor/blocks/buttons.spec.js
+++ b/test/e2e/specs/editor/blocks/buttons.spec.js
@@ -263,12 +263,14 @@ test.describe( 'Buttons', () => {
await editor.insertBlock( { name: 'core/buttons' } );
await page.keyboard.type( 'Content' );
await editor.openDocumentSettingsSidebar();
- await page.click(
- `role=region[name="Editor settings"i] >> role=tab[name="Settings"i]`
- );
- await page.click(
- 'role=group[name="Button width"i] >> role=button[name="25%"i]'
- );
+ await page
+ .getByRole( 'region', { name: 'Editor settings' } )
+ .getByRole( 'tab', { name: 'Settings' } )
+ .click();
+ await page
+ .getByRole( 'radiogroup', { name: 'Button width' } )
+ .getByRole( 'radio', { name: '25%' } )
+ .click();
// Check the content.
const content = await editor.getEditedPostContent();
From 2b5da49117f7bca612099ae39e36c0c184bd4e99 Mon Sep 17 00:00:00 2001
From: Mayank Tripathi <70465598+Mayank-Tripathi32@users.noreply.github.com>
Date: Fri, 13 Dec 2024 20:16:02 +0530
Subject: [PATCH 056/239] Refactor "Settings" panel of Details block to use
ToolsPanel instead of PanelBody (#67966)
Co-authored-by: Mayank-Tripathi32
Co-authored-by: fabiankaegy
---
packages/block-library/src/details/edit.js | 44 ++++++++++++++++------
1 file changed, 33 insertions(+), 11 deletions(-)
diff --git a/packages/block-library/src/details/edit.js b/packages/block-library/src/details/edit.js
index 314556ba6d591..14c89b7d0f9f0 100644
--- a/packages/block-library/src/details/edit.js
+++ b/packages/block-library/src/details/edit.js
@@ -9,7 +9,11 @@ import {
InspectorControls,
} from '@wordpress/block-editor';
import { useSelect } from '@wordpress/data';
-import { PanelBody, ToggleControl } from '@wordpress/components';
+import {
+ ToggleControl,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
+} from '@wordpress/components';
import { __ } from '@wordpress/i18n';
const TEMPLATE = [
@@ -46,18 +50,36 @@ function DetailsEdit( { attributes, setAttributes, clientId } ) {
return (
<>
-
- {
+ setAttributes( {
+ showContent: false,
+ } );
+ } }
+ >
+
+ hasValue={ () => showContent }
+ onDeselect={ () => {
setAttributes( {
- showContent: ! showContent,
- } )
- }
- />
-
+ showContent: false,
+ } );
+ } }
+ >
+
+ setAttributes( {
+ showContent: ! showContent,
+ } )
+ }
+ />
+
+
Date: Fri, 13 Dec 2024 20:23:39 +0530
Subject: [PATCH 057/239] Refactor "Settings" panel of Social Icon block to use
ToolsPanel instead of PanelBody (#67974)
Co-authored-by: Mayank-Tripathi32
Co-authored-by: fabiankaegy
---
.../block-library/src/social-link/edit.js | 24 ++++++++++++++-----
1 file changed, 18 insertions(+), 6 deletions(-)
diff --git a/packages/block-library/src/social-link/edit.js b/packages/block-library/src/social-link/edit.js
index 91f1e4170b33d..43fb305d52ffa 100644
--- a/packages/block-library/src/social-link/edit.js
+++ b/packages/block-library/src/social-link/edit.js
@@ -22,10 +22,10 @@ import { useState, useRef } from '@wordpress/element';
import {
Button,
Dropdown,
- PanelBody,
- PanelRow,
TextControl,
ToolbarButton,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
__experimentalInputControlSuffixWrapper as InputControlSuffixWrapper,
} from '@wordpress/components';
import { useMergeRefs } from '@wordpress/compose';
@@ -195,8 +195,20 @@ const SocialLinkEdit = ( {
) }
-
-
+ {
+ setAttributes( { label: undefined } );
+ } }
+ >
+ !! label }
+ onDeselect={ () => {
+ setAttributes( { label: undefined } );
+ } }
+ >
-
-
+
+
Date: Fri, 13 Dec 2024 20:26:38 +0530
Subject: [PATCH 058/239] Refactor "Settings" panel of Login/Logour block to
use ToolsPanel instead of PanelBody (#67909)
Co-authored-by: Infinite-Null
Co-authored-by: fabiankaegy
---
packages/block-library/src/loginout/edit.js | 70 +++++++++++++++------
1 file changed, 50 insertions(+), 20 deletions(-)
diff --git a/packages/block-library/src/loginout/edit.js b/packages/block-library/src/loginout/edit.js
index b6c2e9cf01304..76d6e98b1ccc3 100644
--- a/packages/block-library/src/loginout/edit.js
+++ b/packages/block-library/src/loginout/edit.js
@@ -1,9 +1,13 @@
/**
* WordPress dependencies
*/
-import { PanelBody, ToggleControl } from '@wordpress/components';
-import { __ } from '@wordpress/i18n';
import { InspectorControls, useBlockProps } from '@wordpress/block-editor';
+import {
+ ToggleControl,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
+} from '@wordpress/components';
+import { __ } from '@wordpress/i18n';
export default function LoginOutEdit( { attributes, setAttributes } ) {
const { displayLoginAsForm, redirectToCurrent } = attributes;
@@ -11,28 +15,54 @@ export default function LoginOutEdit( { attributes, setAttributes } ) {
return (
<>
-
- {
+ setAttributes( {
+ displayLoginAsForm: false,
+ redirectToCurrent: true,
+ } );
+ } }
+ >
+
- setAttributes( {
- displayLoginAsForm: ! displayLoginAsForm,
- } )
+ isShownByDefault
+ hasValue={ () => displayLoginAsForm }
+ onDeselect={ () =>
+ setAttributes( { displayLoginAsForm: false } )
}
- />
-
+
+ setAttributes( {
+ displayLoginAsForm: ! displayLoginAsForm,
+ } )
+ }
+ />
+
+
- setAttributes( {
- redirectToCurrent: ! redirectToCurrent,
- } )
+ isShownByDefault
+ hasValue={ () => ! redirectToCurrent }
+ onDeselect={ () =>
+ setAttributes( { redirectToCurrent: true } )
}
- />
-
+ >
+
+ setAttributes( {
+ redirectToCurrent: ! redirectToCurrent,
+ } )
+ }
+ />
+
+
Date: Fri, 13 Dec 2024 20:27:22 +0530
Subject: [PATCH 059/239] Refactor "Settings" panel of Tag Cloud block to use
ToolsPanel instead of PanelBody (#67911)
Co-authored-by: Sukhendu2002
Co-authored-by: fabiankaegy
---
packages/block-library/src/tag-cloud/edit.js | 61 ++++++++++++++++---
.../block-library/src/tag-cloud/editor.scss | 8 ---
2 files changed, 53 insertions(+), 16 deletions(-)
diff --git a/packages/block-library/src/tag-cloud/edit.js b/packages/block-library/src/tag-cloud/edit.js
index eeb568e7a89ef..b41e47faec369 100644
--- a/packages/block-library/src/tag-cloud/edit.js
+++ b/packages/block-library/src/tag-cloud/edit.js
@@ -4,14 +4,14 @@
import {
Flex,
FlexItem,
- PanelBody,
ToggleControl,
SelectControl,
RangeControl,
__experimentalUnitControl as UnitControl,
__experimentalUseCustomUnits as useCustomUnits,
__experimentalParseQuantityAndUnitFromRawValue as parseQuantityAndUnitFromRawValue,
- __experimentalVStack as VStack,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
Disabled,
} from '@wordpress/components';
import { useSelect } from '@wordpress/data';
@@ -118,10 +118,25 @@ function TagCloudEdit( { attributes, setAttributes } ) {
const inspectorControls = (
-
- {
+ setAttributes( {
+ taxonomy: 'post_tag',
+ showTagCounts: false,
+ numberOfTags: 45,
+ smallestFontSize: '8pt',
+ largestFontSize: '22pt',
+ } );
+ } }
+ >
+ taxonomy !== 'post_tag' }
+ label={ __( 'Taxonomy' ) }
+ onDeselect={ () =>
+ setAttributes( { taxonomy: 'post_tag' } )
+ }
+ isShownByDefault
>
+
+
+ smallestFontSize !== '8pt' || largestFontSize !== '22pt'
+ }
+ label={ __( 'Font size' ) }
+ onDeselect={ () =>
+ setAttributes( {
+ smallestFontSize: '8pt',
+ largestFontSize: '22pt',
+ } )
+ }
+ isShownByDefault
+ >
+
+ numberOfTags !== 45 }
+ label={ __( 'Number of tags' ) }
+ onDeselect={ () => setAttributes( { numberOfTags: 45 } ) }
+ isShownByDefault
+ >
+
+ showTagCounts !== false }
+ label={ __( 'Show tag counts' ) }
+ onDeselect={ () =>
+ setAttributes( { showTagCounts: false } )
+ }
+ isShownByDefault
+ >
-
-
+
+
);
diff --git a/packages/block-library/src/tag-cloud/editor.scss b/packages/block-library/src/tag-cloud/editor.scss
index e85129e22f1ac..d00a450174f2f 100644
--- a/packages/block-library/src/tag-cloud/editor.scss
+++ b/packages/block-library/src/tag-cloud/editor.scss
@@ -9,11 +9,3 @@
border: none;
border-radius: inherit;
}
-
-.wp-block-tag-cloud__inspector-settings {
- .components-base-control,
- .components-base-control:last-child {
- // Cancel out extra margins added by block inspector
- margin-bottom: 0;
- }
-}
From 75289cf599ec29cda2dfd6d75298252ec52fa0dc Mon Sep 17 00:00:00 2001
From: Mayank Tripathi <70465598+Mayank-Tripathi32@users.noreply.github.com>
Date: Fri, 13 Dec 2024 20:36:17 +0530
Subject: [PATCH 060/239] Refactor "Settings" panel of Social Icons block to
use ToolsPanel instead of PanelBody (#67975)
Co-authored-by: Mayank-Tripathi32
Co-authored-by: fabiankaegy
---
.../block-library/src/social-links/edit.js | 59 ++++++++++++++-----
1 file changed, 44 insertions(+), 15 deletions(-)
diff --git a/packages/block-library/src/social-links/edit.js b/packages/block-library/src/social-links/edit.js
index 068b34a3a70a4..af39219af25a1 100644
--- a/packages/block-library/src/social-links/edit.js
+++ b/packages/block-library/src/social-links/edit.js
@@ -22,9 +22,10 @@ import {
import {
MenuGroup,
MenuItem,
- PanelBody,
ToggleControl,
ToolbarDropdownMenu,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
} from '@wordpress/components';
import { __ } from '@wordpress/i18n';
import { check } from '@wordpress/icons';
@@ -198,24 +199,52 @@ export function SocialLinksEdit( props ) {
-
- {
+ setAttributes( {
+ openInNewTab: false,
+ showLabels: false,
+ } );
+ } }
+ >
+
- setAttributes( { openInNewTab: ! openInNewTab } )
+ hasValue={ () => !! openInNewTab }
+ onDeselect={ () =>
+ setAttributes( { openInNewTab: false } )
}
- />
-
+
+ setAttributes( {
+ openInNewTab: ! openInNewTab,
+ } )
+ }
+ />
+
+
- setAttributes( { showLabels: ! showLabels } )
+ hasValue={ () => !! showLabels }
+ onDeselect={ () =>
+ setAttributes( { showLabels: false } )
}
- />
-
+ >
+
+ setAttributes( { showLabels: ! showLabels } )
+ }
+ />
+
+
{ colorGradientSettings.hasColorsOrGradients && (
From b371f6e44aba95efb00c9d7f8578e145bc2ae5c5 Mon Sep 17 00:00:00 2001
From: Lena Morita
Date: Sat, 14 Dec 2024 00:10:51 +0900
Subject: [PATCH 061/239] Icons: Deprecate `warning` and rename to
`cautionFilled` (#67895)
* Icons: Deprecate `warning` and rename to `cautionFilled`
* Update changelog
* Update icon
* Update mobile snapshots
* Rename original variable
* Update existing usage in native files
---------
Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: jameskoster
Co-authored-by: tyxla
---
.../src/components/audio-player/index.native.js | 4 ++--
.../src/components/contrast-checker/index.native.js | 4 ++--
.../src/audio/test/__snapshots__/edit.native.js.snap | 2 +-
packages/block-library/src/cover/edit.native.js | 7 +++++--
.../src/file/test/__snapshots__/edit.native.js.snap | 2 +-
.../src/components/error-boundary/index.native.js | 4 ++--
packages/icons/CHANGELOG.md | 2 ++
packages/icons/src/icon/stories/index.story.js | 9 ++++++++-
packages/icons/src/icon/stories/keywords.ts | 2 +-
packages/icons/src/index.js | 6 +++++-
packages/icons/src/library/caution-filled.js | 12 ++++++++++++
packages/icons/src/library/warning.js | 12 ------------
12 files changed, 41 insertions(+), 25 deletions(-)
create mode 100644 packages/icons/src/library/caution-filled.js
delete mode 100644 packages/icons/src/library/warning.js
diff --git a/packages/block-editor/src/components/audio-player/index.native.js b/packages/block-editor/src/components/audio-player/index.native.js
index bee31ea5872ef..734226408cb92 100644
--- a/packages/block-editor/src/components/audio-player/index.native.js
+++ b/packages/block-editor/src/components/audio-player/index.native.js
@@ -17,7 +17,7 @@ import { View } from '@wordpress/primitives';
import { Icon } from '@wordpress/components';
import { withPreferredColorScheme } from '@wordpress/compose';
import { __ } from '@wordpress/i18n';
-import { audio, warning } from '@wordpress/icons';
+import { audio, cautionFilled } from '@wordpress/icons';
import {
requestImageFailedRetryDialog,
requestImageUploadCancelDialog,
@@ -167,7 +167,7 @@ function Player( {
{ isUploadFailed && (
-
+
{ msg }
);
diff --git a/packages/block-library/src/audio/test/__snapshots__/edit.native.js.snap b/packages/block-library/src/audio/test/__snapshots__/edit.native.js.snap
index 4cf28f7063ad3..9cf88d804068a 100644
--- a/packages/block-library/src/audio/test/__snapshots__/edit.native.js.snap
+++ b/packages/block-library/src/audio/test/__snapshots__/edit.native.js.snap
@@ -89,7 +89,7 @@ exports[`Audio block renders audio block error state without crashing 1`] = `
diff --git a/packages/block-library/src/cover/edit.native.js b/packages/block-library/src/cover/edit.native.js
index 99324545bf798..7f73ec85a798e 100644
--- a/packages/block-library/src/cover/edit.native.js
+++ b/packages/block-library/src/cover/edit.native.js
@@ -58,7 +58,7 @@ import {
useCallback,
useMemo,
} from '@wordpress/element';
-import { cover as icon, replace, image, warning } from '@wordpress/icons';
+import { cover as icon, replace, image, cautionFilled } from '@wordpress/icons';
import { getProtocol } from '@wordpress/url';
// eslint-disable-next-line no-restricted-imports
import { store as editPostStore } from '@wordpress/edit-post';
@@ -665,7 +665,10 @@ const Cover = ( {
style={ styles.uploadFailedContainer }
>
-
+
) }
diff --git a/packages/block-library/src/file/test/__snapshots__/edit.native.js.snap b/packages/block-library/src/file/test/__snapshots__/edit.native.js.snap
index 5ce876137ade0..0c9d88a207401 100644
--- a/packages/block-library/src/file/test/__snapshots__/edit.native.js.snap
+++ b/packages/block-library/src/file/test/__snapshots__/edit.native.js.snap
@@ -132,7 +132,7 @@ exports[`File block renders file error state without crashing 1`] = `
diff --git a/packages/editor/src/components/error-boundary/index.native.js b/packages/editor/src/components/error-boundary/index.native.js
index 0de048e811445..4c05ceb3fc150 100644
--- a/packages/editor/src/components/error-boundary/index.native.js
+++ b/packages/editor/src/components/error-boundary/index.native.js
@@ -16,7 +16,7 @@ import {
usePreferredColorSchemeStyle,
withPreferredColorScheme,
} from '@wordpress/compose';
-import { warning } from '@wordpress/icons';
+import { cautionFilled } from '@wordpress/icons';
import { Icon } from '@wordpress/components';
/**
@@ -141,7 +141,7 @@ class ErrorBoundary extends Component {
diff --git a/packages/icons/CHANGELOG.md b/packages/icons/CHANGELOG.md
index d622019f1ee78..952e3164d4507 100644
--- a/packages/icons/CHANGELOG.md
+++ b/packages/icons/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+- Deprecate `warning` icon and rename to `cautionFilled` ([#67895](https://github.com/WordPress/gutenberg/pull/67895)).
+
## 10.14.0 (2024-12-11)
## 10.13.0 (2024-11-27)
diff --git a/packages/icons/src/icon/stories/index.story.js b/packages/icons/src/icon/stories/index.story.js
index 8cbf65d9f259e..406f986e6ef5d 100644
--- a/packages/icons/src/icon/stories/index.story.js
+++ b/packages/icons/src/icon/stories/index.story.js
@@ -11,7 +11,14 @@ import check from '../../library/check';
import * as icons from '../../';
import keywords from './keywords';
-const { Icon: _Icon, ...availableIcons } = icons;
+const {
+ Icon: _Icon,
+
+ // Deprecated aliases
+ warning: _warning,
+
+ ...availableIcons
+} = icons;
const meta = {
component: Icon,
diff --git a/packages/icons/src/icon/stories/keywords.ts b/packages/icons/src/icon/stories/keywords.ts
index 3fd962e047bc1..4965bc38c3451 100644
--- a/packages/icons/src/icon/stories/keywords.ts
+++ b/packages/icons/src/icon/stories/keywords.ts
@@ -1,5 +1,6 @@
const keywords: Partial< Record< keyof typeof import('../../'), string[] > > = {
cancelCircleFilled: [ 'close' ],
+ cautionFilled: [ 'alert', 'caution', 'warning' ],
create: [ 'add' ],
file: [ 'folder' ],
seen: [ 'show' ],
@@ -7,7 +8,6 @@ const keywords: Partial< Record< keyof typeof import('../../'), string[] > > = {
thumbsUp: [ 'like' ],
trash: [ 'delete' ],
unseen: [ 'hide' ],
- warning: [ 'alert', 'caution' ],
};
export default keywords;
diff --git a/packages/icons/src/index.js b/packages/icons/src/index.js
index 14eaec92b78c4..ab7edf65e496b 100644
--- a/packages/icons/src/index.js
+++ b/packages/icons/src/index.js
@@ -37,6 +37,11 @@ export { default as caption } from './library/caption';
export { default as capturePhoto } from './library/capture-photo';
export { default as captureVideo } from './library/capture-video';
export { default as category } from './library/category';
+export {
+ /** @deprecated Import `cautionFilled` instead. */
+ default as warning,
+ default as cautionFilled,
+} from './library/caution-filled';
export { default as chartBar } from './library/chart-bar';
export { default as check } from './library/check';
export { default as chevronDown } from './library/chevron-down';
@@ -301,6 +306,5 @@ export { default as update } from './library/update';
export { default as upload } from './library/upload';
export { default as verse } from './library/verse';
export { default as video } from './library/video';
-export { default as warning } from './library/warning';
export { default as widget } from './library/widget';
export { default as wordpress } from './library/wordpress';
diff --git a/packages/icons/src/library/caution-filled.js b/packages/icons/src/library/caution-filled.js
new file mode 100644
index 0000000000000..5e7779db85f86
--- /dev/null
+++ b/packages/icons/src/library/caution-filled.js
@@ -0,0 +1,12 @@
+/**
+ * WordPress dependencies
+ */
+import { SVG, Path } from '@wordpress/primitives';
+
+const cautionFilled = (
+
+
+
+);
+
+export default cautionFilled;
diff --git a/packages/icons/src/library/warning.js b/packages/icons/src/library/warning.js
deleted file mode 100644
index 97086c5c9292b..0000000000000
--- a/packages/icons/src/library/warning.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
- * WordPress dependencies
- */
-import { SVG, Path } from '@wordpress/primitives';
-
-const warning = (
-
-
-
-);
-
-export default warning;
From 5931dd517d69d3c567c0445a00f8685f26dff6c0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9?= <583546+oandregal@users.noreply.github.com>
Date: Fri, 13 Dec 2024 16:51:27 +0100
Subject: [PATCH 062/239] Pages: scope padding to custom items (#67977)
Co-authored-by: oandregal
Co-authored-by: afercia
Co-authored-by: jameskoster
---
.../components/sidebar-dataviews/custom-dataviews-list.js | 2 +-
.../edit-site/src/components/sidebar-dataviews/style.scss | 5 ++++-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/packages/edit-site/src/components/sidebar-dataviews/custom-dataviews-list.js b/packages/edit-site/src/components/sidebar-dataviews/custom-dataviews-list.js
index 847029e8d6dcf..467648e814276 100644
--- a/packages/edit-site/src/components/sidebar-dataviews/custom-dataviews-list.js
+++ b/packages/edit-site/src/components/sidebar-dataviews/custom-dataviews-list.js
@@ -212,7 +212,7 @@ export default function CustomDataViewsList( { type, activeView, isCustom } ) {
{ __( 'Custom Views' ) }
-
+
{ customDataViews.map( ( customViewRecord ) => {
return (
Date: Fri, 13 Dec 2024 20:26:41 +0400
Subject: [PATCH 063/239] Enhancement : Badge Component (#66555)
* Create badge component
* Imports and Manifest
* Add test and capability for additional props using spread operator
* Enhance componenet furthermore
* Generate README via manifest & Add in ignore list
* Lock Badge
* Convert Storybook from CSF 2 to CSF 3 Format
* Improve the component
* New iteration
* Add new icons: Error and Caution
* Utilize new icons
* Update icons
* decrease icon size
* Address feedback
* Fix SVG formatting
* Fix unit test
* Remove unnecessary type (already included)
* Update readme
* Adjust icon keywords
* Add changelog
---------
Co-authored-by: Vrishabhsk
Co-authored-by: jameskoster
Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: rogermattic
Co-authored-by: jasmussen
---
docs/tool/manifest.js | 1 +
packages/components/CHANGELOG.md | 4 ++
packages/components/src/badge/README.md | 22 +++++++
.../components/src/badge/docs-manifest.json | 5 ++
packages/components/src/badge/index.tsx | 66 +++++++++++++++++++
.../src/badge/stories/index.story.tsx | 53 +++++++++++++++
packages/components/src/badge/styles.scss | 38 +++++++++++
packages/components/src/badge/test/index.tsx | 40 +++++++++++
packages/components/src/badge/types.ts | 12 ++++
packages/components/src/private-apis.ts | 2 +
packages/components/src/style.scss | 1 +
packages/icons/CHANGELOG.md | 2 +
packages/icons/src/icon/stories/keywords.ts | 4 +-
packages/icons/src/index.js | 2 +
packages/icons/src/library/caution.js | 16 +++++
packages/icons/src/library/error.js | 16 +++++
packages/icons/src/library/info.js | 8 ++-
17 files changed, 289 insertions(+), 3 deletions(-)
create mode 100644 packages/components/src/badge/README.md
create mode 100644 packages/components/src/badge/docs-manifest.json
create mode 100644 packages/components/src/badge/index.tsx
create mode 100644 packages/components/src/badge/stories/index.story.tsx
create mode 100644 packages/components/src/badge/styles.scss
create mode 100644 packages/components/src/badge/test/index.tsx
create mode 100644 packages/components/src/badge/types.ts
create mode 100644 packages/icons/src/library/caution.js
create mode 100644 packages/icons/src/library/error.js
diff --git a/docs/tool/manifest.js b/docs/tool/manifest.js
index 2004fae84f7cc..569d78bc5bea8 100644
--- a/docs/tool/manifest.js
+++ b/docs/tool/manifest.js
@@ -18,6 +18,7 @@ const componentPaths = glob( 'packages/components/src/*/**/README.md', {
'packages/components/src/menu/README.md',
'packages/components/src/tabs/README.md',
'packages/components/src/custom-select-control-v2/README.md',
+ 'packages/components/src/badge/README.md',
],
} );
const packagePaths = glob( 'packages/*/package.json' )
diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md
index af71c4104b4d9..c58817a420a74 100644
--- a/packages/components/CHANGELOG.md
+++ b/packages/components/CHANGELOG.md
@@ -16,6 +16,10 @@
- `BoxControl`: Better respect for the `min` prop in the Range Slider ([#67819](https://github.com/WordPress/gutenberg/pull/67819)).
+### Experimental
+
+- Add new `Badge` component ([#66555](https://github.com/WordPress/gutenberg/pull/66555)).
+
## 29.0.0 (2024-12-11)
### Breaking Changes
diff --git a/packages/components/src/badge/README.md b/packages/components/src/badge/README.md
new file mode 100644
index 0000000000000..0be531ca6f2df
--- /dev/null
+++ b/packages/components/src/badge/README.md
@@ -0,0 +1,22 @@
+# Badge
+
+
+
+See the WordPress Storybook for more detailed, interactive documentation.
+
+## Props
+
+### `children`
+
+Text to display inside the badge.
+
+ - Type: `string`
+ - Required: Yes
+
+### `intent`
+
+Badge variant.
+
+ - Type: `"default" | "info" | "success" | "warning" | "error"`
+ - Required: No
+ - Default: `default`
diff --git a/packages/components/src/badge/docs-manifest.json b/packages/components/src/badge/docs-manifest.json
new file mode 100644
index 0000000000000..3b70c0ef22843
--- /dev/null
+++ b/packages/components/src/badge/docs-manifest.json
@@ -0,0 +1,5 @@
+{
+ "$schema": "../../schemas/docs-manifest.json",
+ "displayName": "Badge",
+ "filePath": "./index.tsx"
+}
diff --git a/packages/components/src/badge/index.tsx b/packages/components/src/badge/index.tsx
new file mode 100644
index 0000000000000..8a55f3881215f
--- /dev/null
+++ b/packages/components/src/badge/index.tsx
@@ -0,0 +1,66 @@
+/**
+ * External dependencies
+ */
+import clsx from 'clsx';
+
+/**
+ * WordPress dependencies
+ */
+import { info, caution, error, published } from '@wordpress/icons';
+
+/**
+ * Internal dependencies
+ */
+import type { BadgeProps } from './types';
+import type { WordPressComponentProps } from '../context';
+import Icon from '../icon';
+
+function Badge( {
+ className,
+ intent = 'default',
+ children,
+ ...props
+}: WordPressComponentProps< BadgeProps, 'span', false > ) {
+ /**
+ * Returns an icon based on the badge context.
+ *
+ * @return The corresponding icon for the provided context.
+ */
+ function contextBasedIcon() {
+ switch ( intent ) {
+ case 'info':
+ return info;
+ case 'success':
+ return published;
+ case 'warning':
+ return caution;
+ case 'error':
+ return error;
+ default:
+ return null;
+ }
+ }
+
+ return (
+
+ { intent !== 'default' && (
+
+ ) }
+ { children }
+
+ );
+}
+
+export default Badge;
diff --git a/packages/components/src/badge/stories/index.story.tsx b/packages/components/src/badge/stories/index.story.tsx
new file mode 100644
index 0000000000000..aaa4bfb3c08f6
--- /dev/null
+++ b/packages/components/src/badge/stories/index.story.tsx
@@ -0,0 +1,53 @@
+/**
+ * External dependencies
+ */
+import type { Meta, StoryObj } from '@storybook/react';
+
+/**
+ * Internal dependencies
+ */
+import Badge from '..';
+
+const meta = {
+ component: Badge,
+ title: 'Components/Containers/Badge',
+ tags: [ 'status-private' ],
+} satisfies Meta< typeof Badge >;
+
+export default meta;
+
+type Story = StoryObj< typeof meta >;
+
+export const Default: Story = {
+ args: {
+ children: 'Code is Poetry',
+ },
+};
+
+export const Info: Story = {
+ args: {
+ ...Default.args,
+ intent: 'info',
+ },
+};
+
+export const Success: Story = {
+ args: {
+ ...Default.args,
+ intent: 'success',
+ },
+};
+
+export const Warning: Story = {
+ args: {
+ ...Default.args,
+ intent: 'warning',
+ },
+};
+
+export const Error: Story = {
+ args: {
+ ...Default.args,
+ intent: 'error',
+ },
+};
diff --git a/packages/components/src/badge/styles.scss b/packages/components/src/badge/styles.scss
new file mode 100644
index 0000000000000..e1e9cd5312d11
--- /dev/null
+++ b/packages/components/src/badge/styles.scss
@@ -0,0 +1,38 @@
+$badge-colors: (
+ "info": #3858e9,
+ "warning": $alert-yellow,
+ "error": $alert-red,
+ "success": $alert-green,
+);
+
+.components-badge {
+ background-color: color-mix(in srgb, $white 90%, var(--base-color));
+ color: color-mix(in srgb, $black 50%, var(--base-color));
+ padding: 0 $grid-unit-10;
+ min-height: $grid-unit-30;
+ border-radius: $radius-small;
+ font-size: $font-size-small;
+ font-weight: 400;
+ flex-shrink: 0;
+ line-height: $font-line-height-small;
+ width: fit-content;
+ display: flex;
+ align-items: center;
+ gap: 2px;
+
+ &:where(.is-default) {
+ background-color: $gray-100;
+ color: $gray-800;
+ }
+
+ &.has-icon {
+ padding-inline-start: $grid-unit-05;
+ }
+
+ // Generate color variants
+ @each $type, $color in $badge-colors {
+ &.is-#{$type} {
+ --base-color: #{$color};
+ }
+ }
+}
diff --git a/packages/components/src/badge/test/index.tsx b/packages/components/src/badge/test/index.tsx
new file mode 100644
index 0000000000000..47c832eb3c830
--- /dev/null
+++ b/packages/components/src/badge/test/index.tsx
@@ -0,0 +1,40 @@
+/**
+ * External dependencies
+ */
+import { render, screen } from '@testing-library/react';
+
+/**
+ * Internal dependencies
+ */
+import Badge from '..';
+
+describe( 'Badge', () => {
+ it( 'should render correctly with default props', () => {
+ render( Code is Poetry );
+ const badge = screen.getByText( 'Code is Poetry' );
+ expect( badge ).toBeInTheDocument();
+ expect( badge.tagName ).toBe( 'SPAN' );
+ expect( badge ).toHaveClass( 'components-badge' );
+ } );
+
+ it( 'should render as per its intent and contain an icon', () => {
+ render( Code is Poetry );
+ const badge = screen.getByText( 'Code is Poetry' );
+ expect( badge ).toHaveClass( 'components-badge', 'is-error' );
+ expect( badge ).toHaveClass( 'has-icon' );
+ } );
+
+ it( 'should combine custom className with default class', () => {
+ render( Code is Poetry );
+ const badge = screen.getByText( 'Code is Poetry' );
+ expect( badge ).toHaveClass( 'components-badge' );
+ expect( badge ).toHaveClass( 'custom-class' );
+ } );
+
+ it( 'should pass through additional props', () => {
+ render( Code is Poetry );
+ const badge = screen.getByTestId( 'custom-badge' );
+ expect( badge ).toHaveTextContent( 'Code is Poetry' );
+ expect( badge ).toHaveClass( 'components-badge' );
+ } );
+} );
diff --git a/packages/components/src/badge/types.ts b/packages/components/src/badge/types.ts
new file mode 100644
index 0000000000000..91cd7c39b549b
--- /dev/null
+++ b/packages/components/src/badge/types.ts
@@ -0,0 +1,12 @@
+export type BadgeProps = {
+ /**
+ * Badge variant.
+ *
+ * @default 'default'
+ */
+ intent?: 'default' | 'info' | 'success' | 'warning' | 'error';
+ /**
+ * Text to display inside the badge.
+ */
+ children: string;
+};
diff --git a/packages/components/src/private-apis.ts b/packages/components/src/private-apis.ts
index 2ced100dc576b..f5a9ee90519c2 100644
--- a/packages/components/src/private-apis.ts
+++ b/packages/components/src/private-apis.ts
@@ -8,6 +8,7 @@ import Theme from './theme';
import { Tabs } from './tabs';
import { kebabCase } from './utils/strings';
import { lock } from './lock-unlock';
+import Badge from './badge';
export const privateApis = {};
lock( privateApis, {
@@ -17,4 +18,5 @@ lock( privateApis, {
Theme,
Menu,
kebabCase,
+ Badge,
} );
diff --git a/packages/components/src/style.scss b/packages/components/src/style.scss
index 70317f4a2d0e0..368dec0f5e253 100644
--- a/packages/components/src/style.scss
+++ b/packages/components/src/style.scss
@@ -10,6 +10,7 @@
// Components
@import "./animate/style.scss";
@import "./autocomplete/style.scss";
+@import "./badge/styles.scss";
@import "./button-group/style.scss";
@import "./button/style.scss";
@import "./checkbox-control/style.scss";
diff --git a/packages/icons/CHANGELOG.md b/packages/icons/CHANGELOG.md
index 952e3164d4507..64c1a58b549ca 100644
--- a/packages/icons/CHANGELOG.md
+++ b/packages/icons/CHANGELOG.md
@@ -2,6 +2,8 @@
## Unreleased
+- Add new `caution` icon ([#66555](https://github.com/WordPress/gutenberg/pull/66555)).
+- Add new `error` icon ([#66555](https://github.com/WordPress/gutenberg/pull/66555)).
- Deprecate `warning` icon and rename to `cautionFilled` ([#67895](https://github.com/WordPress/gutenberg/pull/67895)).
## 10.14.0 (2024-12-11)
diff --git a/packages/icons/src/icon/stories/keywords.ts b/packages/icons/src/icon/stories/keywords.ts
index 4965bc38c3451..4de5ae9a7dae9 100644
--- a/packages/icons/src/icon/stories/keywords.ts
+++ b/packages/icons/src/icon/stories/keywords.ts
@@ -1,7 +1,9 @@
const keywords: Partial< Record< keyof typeof import('../../'), string[] > > = {
cancelCircleFilled: [ 'close' ],
- cautionFilled: [ 'alert', 'caution', 'warning' ],
+ caution: [ 'alert', 'warning' ],
+ cautionFilled: [ 'alert', 'warning' ],
create: [ 'add' ],
+ error: [ 'alert', 'caution', 'warning' ],
file: [ 'folder' ],
seen: [ 'show' ],
thumbsDown: [ 'dislike' ],
diff --git a/packages/icons/src/index.js b/packages/icons/src/index.js
index ab7edf65e496b..e82b09e5d5afe 100644
--- a/packages/icons/src/index.js
+++ b/packages/icons/src/index.js
@@ -37,6 +37,7 @@ export { default as caption } from './library/caption';
export { default as capturePhoto } from './library/capture-photo';
export { default as captureVideo } from './library/capture-video';
export { default as category } from './library/category';
+export { default as caution } from './library/caution';
export {
/** @deprecated Import `cautionFilled` instead. */
default as warning,
@@ -89,6 +90,7 @@ export { default as download } from './library/download';
export { default as edit } from './library/edit';
export { default as envelope } from './library/envelope';
export { default as external } from './library/external';
+export { default as error } from './library/error';
export { default as file } from './library/file';
export { default as filter } from './library/filter';
export { default as flipHorizontal } from './library/flip-horizontal';
diff --git a/packages/icons/src/library/caution.js b/packages/icons/src/library/caution.js
new file mode 100644
index 0000000000000..f6d23fdfc7edd
--- /dev/null
+++ b/packages/icons/src/library/caution.js
@@ -0,0 +1,16 @@
+/**
+ * WordPress dependencies
+ */
+import { SVG, Path } from '@wordpress/primitives';
+
+const caution = (
+
+
+
+);
+
+export default caution;
diff --git a/packages/icons/src/library/error.js b/packages/icons/src/library/error.js
new file mode 100644
index 0000000000000..2dc2bccbf639c
--- /dev/null
+++ b/packages/icons/src/library/error.js
@@ -0,0 +1,16 @@
+/**
+ * WordPress dependencies
+ */
+import { SVG, Path } from '@wordpress/primitives';
+
+const error = (
+
+
+
+);
+
+export default error;
diff --git a/packages/icons/src/library/info.js b/packages/icons/src/library/info.js
index f3425d9e95041..24d41d798263f 100644
--- a/packages/icons/src/library/info.js
+++ b/packages/icons/src/library/info.js
@@ -4,8 +4,12 @@
import { SVG, Path } from '@wordpress/primitives';
const info = (
-
-
+
+
);
From 9bdbadaa011c28b94b01694cafc80e5a3aaa42b1 Mon Sep 17 00:00:00 2001
From: Sarah Norris <1645628+mikachan@users.noreply.github.com>
Date: Fri, 13 Dec 2024 17:29:42 +0000
Subject: [PATCH 064/239] Pages: Add "Set as posts page" action (#67650)
* Move getItemTitle to its own file
* Add unset homepage action
* Add unset as posts page action
* Add set as posts page action
* Update homepage action tests
* Rename unset options to reset
* Reword posts page reset notice
* Ensure Move to trash is always at end of list
* Update packages/editor/src/components/post-actions/actions.js
Co-authored-by: Aki Hamano <54422211+t-hamano@users.noreply.github.com>
* Update packages/editor/src/components/post-actions/reset-homepage.js
Co-authored-by: Aki Hamano <54422211+t-hamano@users.noreply.github.com>
* Remove getItemTitle from utils index.js
* Remove reset actions
* Slight refactor to modal warning in set as posts page action
* Remove use of saveEditedEntityRecord
* Check for currentPostsPage before setting modalwarning
* Add full stop to action success notices
---------
Co-authored-by: Aki Hamano <54422211+t-hamano@users.noreply.github.com>
Co-authored-by: mikachan
Co-authored-by: t-hamano
Co-authored-by: oandregal
Co-authored-by: jameskoster
Co-authored-by: jasmussen
Co-authored-by: paaljoachim
Co-authored-by: youknowriad
---
.../src/components/post-actions/actions.js | 16 +-
.../post-actions/set-as-homepage.js | 38 +----
.../post-actions/set-as-posts-page.js | 158 ++++++++++++++++++
packages/editor/src/utils/get-item-title.js | 25 +++
.../site-editor/homepage-settings.spec.js | 56 ++++++-
5 files changed, 251 insertions(+), 42 deletions(-)
create mode 100644 packages/editor/src/components/post-actions/set-as-posts-page.js
create mode 100644 packages/editor/src/utils/get-item-title.js
diff --git a/packages/editor/src/components/post-actions/actions.js b/packages/editor/src/components/post-actions/actions.js
index 808134ea969a1..023b93d31bb51 100644
--- a/packages/editor/src/components/post-actions/actions.js
+++ b/packages/editor/src/components/post-actions/actions.js
@@ -11,6 +11,7 @@ import { store as coreStore } from '@wordpress/core-data';
import { store as editorStore } from '../../store';
import { unlock } from '../../lock-unlock';
import { useSetAsHomepageAction } from './set-as-homepage';
+import { useSetAsPostsPageAction } from './set-as-posts-page';
export function usePostActions( { postType, onActionPerformed, context } ) {
const { defaultActions } = useSelect(
@@ -43,7 +44,8 @@ export function usePostActions( { postType, onActionPerformed, context } ) {
);
const setAsHomepageAction = useSetAsHomepageAction();
- const shouldShowSetAsHomepageAction =
+ const setAsPostsPageAction = useSetAsPostsPageAction();
+ const shouldShowHomepageActions =
canManageOptions && ! hasFrontPageTemplate;
const { registerPostTypeSchema } = unlock( useDispatch( editorStore ) );
@@ -53,10 +55,15 @@ export function usePostActions( { postType, onActionPerformed, context } ) {
return useMemo( () => {
let actions = [ ...defaultActions ];
- if ( shouldShowSetAsHomepageAction ) {
- actions.push( setAsHomepageAction );
+ if ( shouldShowHomepageActions ) {
+ actions.push( setAsHomepageAction, setAsPostsPageAction );
}
+ // Ensure "Move to trash" is always the last action.
+ actions = actions.sort( ( a, b ) =>
+ b.id === 'move-to-trash' ? -1 : 0
+ );
+
// Filter actions based on provided context. If not provided
// all actions are returned. We'll have a single entry for getting the actions
// and the consumer should provide the context to filter the actions, if needed.
@@ -123,6 +130,7 @@ export function usePostActions( { postType, onActionPerformed, context } ) {
defaultActions,
onActionPerformed,
setAsHomepageAction,
- shouldShowSetAsHomepageAction,
+ setAsPostsPageAction,
+ shouldShowHomepageActions,
] );
}
diff --git a/packages/editor/src/components/post-actions/set-as-homepage.js b/packages/editor/src/components/post-actions/set-as-homepage.js
index 0252c84e3ab3f..671906575b412 100644
--- a/packages/editor/src/components/post-actions/set-as-homepage.js
+++ b/packages/editor/src/components/post-actions/set-as-homepage.js
@@ -12,20 +12,11 @@ import {
import { useDispatch, useSelect } from '@wordpress/data';
import { store as coreStore } from '@wordpress/core-data';
import { store as noticesStore } from '@wordpress/notices';
-import { decodeEntities } from '@wordpress/html-entities';
-const getItemTitle = ( item ) => {
- if ( typeof item.title === 'string' ) {
- return decodeEntities( item.title );
- }
- if ( item.title && 'rendered' in item.title ) {
- return decodeEntities( item.title.rendered );
- }
- if ( item.title && 'raw' in item.title ) {
- return decodeEntities( item.title.raw );
- }
- return '';
-};
+/**
+ * Internal dependencies
+ */
+import { getItemTitle } from '../../utils/get-item-title';
const SetAsHomepageModal = ( { items, closeModal } ) => {
const [ item ] = items;
@@ -48,8 +39,7 @@ const SetAsHomepageModal = ( { items, closeModal } ) => {
}
);
- const { saveEditedEntityRecord, saveEntityRecord } =
- useDispatch( coreStore );
+ const { saveEntityRecord } = useDispatch( coreStore );
const { createSuccessNotice, createErrorNotice } =
useDispatch( noticesStore );
@@ -57,29 +47,19 @@ const SetAsHomepageModal = ( { items, closeModal } ) => {
event.preventDefault();
try {
- // Save new home page settings.
- await saveEditedEntityRecord( 'root', 'site', undefined, {
- page_on_front: item.id,
- show_on_front: 'page',
- } );
-
- // This second call to a save function is a workaround for a bug in
- // `saveEditedEntityRecord`. This forces the root site settings to be updated.
- // See https://github.com/WordPress/gutenberg/issues/67161.
await saveEntityRecord( 'root', 'site', {
page_on_front: item.id,
show_on_front: 'page',
} );
- createSuccessNotice( __( 'Homepage updated' ), {
+ createSuccessNotice( __( 'Homepage updated.' ), {
type: 'snackbar',
} );
} catch ( error ) {
- const typedError = error;
const errorMessage =
- typedError.message && typedError.code !== 'unknown_error'
- ? typedError.message
- : __( 'An error occurred while setting the homepage' );
+ error.message && error.code !== 'unknown_error'
+ ? error.message
+ : __( 'An error occurred while setting the homepage.' );
createErrorNotice( errorMessage, { type: 'snackbar' } );
} finally {
closeModal?.();
diff --git a/packages/editor/src/components/post-actions/set-as-posts-page.js b/packages/editor/src/components/post-actions/set-as-posts-page.js
new file mode 100644
index 0000000000000..67c42a7991fe4
--- /dev/null
+++ b/packages/editor/src/components/post-actions/set-as-posts-page.js
@@ -0,0 +1,158 @@
+/**
+ * WordPress dependencies
+ */
+import { __, sprintf } from '@wordpress/i18n';
+import { useMemo } from '@wordpress/element';
+import {
+ Button,
+ __experimentalText as Text,
+ __experimentalHStack as HStack,
+ __experimentalVStack as VStack,
+} from '@wordpress/components';
+import { useDispatch, useSelect } from '@wordpress/data';
+import { store as coreStore } from '@wordpress/core-data';
+import { store as noticesStore } from '@wordpress/notices';
+
+/**
+ * Internal dependencies
+ */
+import { getItemTitle } from '../../utils/get-item-title';
+
+const SetAsPostsPageModal = ( { items, closeModal } ) => {
+ const [ item ] = items;
+ const pageTitle = getItemTitle( item );
+ const { currentPostsPage, isPageForPostsSet, isSaving } = useSelect(
+ ( select ) => {
+ const { getEntityRecord, isSavingEntityRecord } =
+ select( coreStore );
+ const siteSettings = getEntityRecord( 'root', 'site' );
+ const currentPostsPageItem = getEntityRecord(
+ 'postType',
+ 'page',
+ siteSettings?.page_for_posts
+ );
+ return {
+ currentPostsPage: currentPostsPageItem,
+ isPageForPostsSet: siteSettings?.page_for_posts !== 0,
+ isSaving: isSavingEntityRecord( 'root', 'site' ),
+ };
+ }
+ );
+
+ const { saveEntityRecord } = useDispatch( coreStore );
+ const { createSuccessNotice, createErrorNotice } =
+ useDispatch( noticesStore );
+
+ async function onSetPageAsPostsPage( event ) {
+ event.preventDefault();
+
+ try {
+ await saveEntityRecord( 'root', 'site', {
+ page_for_posts: item.id,
+ show_on_front: 'page',
+ } );
+
+ createSuccessNotice( __( 'Posts page updated.' ), {
+ type: 'snackbar',
+ } );
+ } catch ( error ) {
+ const errorMessage =
+ error.message && error.code !== 'unknown_error'
+ ? error.message
+ : __( 'An error occurred while setting the posts page.' );
+ createErrorNotice( errorMessage, { type: 'snackbar' } );
+ } finally {
+ closeModal?.();
+ }
+ }
+
+ const modalWarning =
+ isPageForPostsSet && currentPostsPage
+ ? sprintf(
+ // translators: %s: title of the current posts page.
+ __( 'This will replace the current posts page: "%s"' ),
+ getItemTitle( currentPostsPage )
+ )
+ : __( 'This page will show the latest posts.' );
+
+ const modalText = sprintf(
+ // translators: %1$s: title of the page to be set as the posts page, %2$s: posts page replacement warning message.
+ __( 'Set "%1$s" as the posts page? %2$s' ),
+ pageTitle,
+ modalWarning
+ );
+
+ // translators: Button label to confirm setting the specified page as the posts page.
+ const modalButtonLabel = __( 'Set posts page' );
+
+ return (
+
+ );
+};
+
+export const useSetAsPostsPageAction = () => {
+ const { pageOnFront, pageForPosts } = useSelect( ( select ) => {
+ const { getEntityRecord } = select( coreStore );
+ const siteSettings = getEntityRecord( 'root', 'site' );
+ return {
+ pageOnFront: siteSettings?.page_on_front,
+ pageForPosts: siteSettings?.page_for_posts,
+ };
+ } );
+
+ return useMemo(
+ () => ( {
+ id: 'set-as-posts-page',
+ label: __( 'Set as posts page' ),
+ isEligible( post ) {
+ if ( post.status !== 'publish' ) {
+ return false;
+ }
+
+ if ( post.type !== 'page' ) {
+ return false;
+ }
+
+ // Don't show the action if the page is already set as the homepage.
+ if ( pageOnFront === post.id ) {
+ return false;
+ }
+
+ // Don't show the action if the page is already set as the page for posts.
+ if ( pageForPosts === post.id ) {
+ return false;
+ }
+
+ return true;
+ },
+ RenderModal: SetAsPostsPageModal,
+ } ),
+ [ pageForPosts, pageOnFront ]
+ );
+};
diff --git a/packages/editor/src/utils/get-item-title.js b/packages/editor/src/utils/get-item-title.js
new file mode 100644
index 0000000000000..86929c27408a8
--- /dev/null
+++ b/packages/editor/src/utils/get-item-title.js
@@ -0,0 +1,25 @@
+/**
+ * WordPress dependencies
+ */
+import { decodeEntities } from '@wordpress/html-entities';
+
+/**
+ * Helper function to get the title of a post item.
+ * This is duplicated from the `@wordpress/fields` package.
+ * `packages/fields/src/actions/utils.ts`
+ *
+ * @param {Object} item The post item.
+ * @return {string} The title of the item, or an empty string if the title is not found.
+ */
+export function getItemTitle( item ) {
+ if ( typeof item.title === 'string' ) {
+ return decodeEntities( item.title );
+ }
+ if ( item.title && 'rendered' in item.title ) {
+ return decodeEntities( item.title.rendered );
+ }
+ if ( item.title && 'raw' in item.title ) {
+ return decodeEntities( item.title.raw );
+ }
+ return '';
+}
diff --git a/test/e2e/specs/site-editor/homepage-settings.spec.js b/test/e2e/specs/site-editor/homepage-settings.spec.js
index d53130af23ac8..e80e14830364c 100644
--- a/test/e2e/specs/site-editor/homepage-settings.spec.js
+++ b/test/e2e/specs/site-editor/homepage-settings.spec.js
@@ -10,6 +10,14 @@ test.describe( 'Homepage Settings via Editor', () => {
title: 'Homepage',
status: 'publish',
} );
+ await requestUtils.createPage( {
+ title: 'Sample page',
+ status: 'publish',
+ } );
+ await requestUtils.createPage( {
+ title: 'Draft page',
+ status: 'draft',
+ } );
} );
test.beforeEach( async ( { admin, page } ) => {
@@ -28,27 +36,30 @@ test.describe( 'Homepage Settings via Editor', () => {
] );
} );
- test( 'should show "Set as homepage" action on pages with `publish` status', async ( {
+ test( 'should not show "Set as homepage" and "Set as posts page" action on pages with `draft` status', async ( {
page,
} ) => {
- const samplePage = page
+ const draftPage = page
.getByRole( 'gridcell' )
- .getByLabel( 'Homepage' );
- const samplePageRow = page
+ .getByLabel( 'Draft page' );
+ const draftPageRow = page
.getByRole( 'row' )
- .filter( { has: samplePage } );
- await samplePageRow.hover();
- await samplePageRow
+ .filter( { has: draftPage } );
+ await draftPageRow.hover();
+ await draftPageRow
.getByRole( 'button', {
name: 'Actions',
} )
.click();
await expect(
page.getByRole( 'menuitem', { name: 'Set as homepage' } )
- ).toBeVisible();
+ ).toBeHidden();
+ await expect(
+ page.getByRole( 'menuitem', { name: 'Set as posts page' } )
+ ).toBeHidden();
} );
- test( 'should not show "Set as homepage" action on current homepage', async ( {
+ test( 'should show correct homepage actions based on current homepage or posts page', async ( {
page,
} ) => {
const samplePage = page
@@ -68,5 +79,32 @@ test.describe( 'Homepage Settings via Editor', () => {
await expect(
page.getByRole( 'menuitem', { name: 'Set as homepage' } )
).toBeHidden();
+ await expect(
+ page.getByRole( 'menuitem', { name: 'Set as posts page' } )
+ ).toBeHidden();
+
+ const samplePageTwo = page
+ .getByRole( 'gridcell' )
+ .getByLabel( 'Sample page' );
+ const samplePageTwoRow = page
+ .getByRole( 'row' )
+ .filter( { has: samplePageTwo } );
+ // eslint-disable-next-line playwright/no-force-option
+ await samplePageTwoRow.click( { force: true } );
+ await samplePageTwoRow
+ .getByRole( 'button', {
+ name: 'Actions',
+ } )
+ .click();
+ await page
+ .getByRole( 'menuitem', { name: 'Set as posts page' } )
+ .click();
+ await page.getByRole( 'button', { name: 'Set posts page' } ).click();
+ await expect(
+ page.getByRole( 'menuitem', { name: 'Set as homepage' } )
+ ).toBeHidden();
+ await expect(
+ page.getByRole( 'menuitem', { name: 'Set as posts page' } )
+ ).toBeHidden();
} );
} );
From 8066995500dd2370dfc3c3b0f5b471506bf3c6ae Mon Sep 17 00:00:00 2001
From: Jarda Snajdr
Date: Fri, 13 Dec 2024 22:23:00 +0100
Subject: [PATCH 065/239] SlotFill: use observableMap everywhere, remove manual
rerendering (#67400)
* SlotFill: use observableMap in base version
* Add changelog entry
---
packages/components/CHANGELOG.md | 4 +
packages/components/src/slot-fill/context.ts | 8 +-
packages/components/src/slot-fill/fill.ts | 25 ++--
.../components/src/slot-fill/provider.tsx | 127 +++++++++---------
packages/components/src/slot-fill/slot.tsx | 63 +++++----
packages/components/src/slot-fill/types.ts | 34 +++--
packages/components/src/slot-fill/use-slot.ts | 27 ----
7 files changed, 143 insertions(+), 145 deletions(-)
delete mode 100644 packages/components/src/slot-fill/use-slot.ts
diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md
index c58817a420a74..fef1769c19b0f 100644
--- a/packages/components/CHANGELOG.md
+++ b/packages/components/CHANGELOG.md
@@ -20,6 +20,10 @@
- Add new `Badge` component ([#66555](https://github.com/WordPress/gutenberg/pull/66555)).
+### Internal
+
+- `SlotFill`: rewrite the non-portal version to use `observableMap` ([#67400](https://github.com/WordPress/gutenberg/pull/67400)).
+
## 29.0.0 (2024-12-11)
### Breaking Changes
diff --git a/packages/components/src/slot-fill/context.ts b/packages/components/src/slot-fill/context.ts
index c4839462fbce0..b1f0718180e9e 100644
--- a/packages/components/src/slot-fill/context.ts
+++ b/packages/components/src/slot-fill/context.ts
@@ -1,20 +1,22 @@
/**
* WordPress dependencies
*/
+import { observableMap } from '@wordpress/compose';
import { createContext } from '@wordpress/element';
+
/**
* Internal dependencies
*/
import type { BaseSlotFillContext } from './types';
const initialValue: BaseSlotFillContext = {
+ slots: observableMap(),
+ fills: observableMap(),
registerSlot: () => {},
unregisterSlot: () => {},
registerFill: () => {},
unregisterFill: () => {},
- getSlot: () => undefined,
- getFills: () => [],
- subscribe: () => () => {},
+ updateFill: () => {},
};
export const SlotFillContext = createContext( initialValue );
diff --git a/packages/components/src/slot-fill/fill.ts b/packages/components/src/slot-fill/fill.ts
index 0a31c8276b3f1..0bd1aec8fa3e0 100644
--- a/packages/components/src/slot-fill/fill.ts
+++ b/packages/components/src/slot-fill/fill.ts
@@ -7,31 +7,26 @@ import { useContext, useLayoutEffect, useRef } from '@wordpress/element';
* Internal dependencies
*/
import SlotFillContext from './context';
-import useSlot from './use-slot';
import type { FillComponentProps } from './types';
export default function Fill( { name, children }: FillComponentProps ) {
const registry = useContext( SlotFillContext );
- const slot = useSlot( name );
+ const instanceRef = useRef( {} );
+ const childrenRef = useRef( children );
- const ref = useRef( {
- name,
- children,
- } );
+ useLayoutEffect( () => {
+ childrenRef.current = children;
+ }, [ children ] );
useLayoutEffect( () => {
- const refValue = ref.current;
- refValue.name = name;
- registry.registerFill( name, refValue );
- return () => registry.unregisterFill( name, refValue );
+ const instance = instanceRef.current;
+ registry.registerFill( name, instance, childrenRef.current );
+ return () => registry.unregisterFill( name, instance );
}, [ registry, name ] );
useLayoutEffect( () => {
- ref.current.children = children;
- if ( slot ) {
- slot.rerender();
- }
- }, [ slot, children ] );
+ registry.updateFill( name, instanceRef.current, childrenRef.current );
+ } );
return null;
}
diff --git a/packages/components/src/slot-fill/provider.tsx b/packages/components/src/slot-fill/provider.tsx
index e2b98e73e1b70..e5319bc7f33e4 100644
--- a/packages/components/src/slot-fill/provider.tsx
+++ b/packages/components/src/slot-fill/provider.tsx
@@ -8,103 +8,102 @@ import { useState } from '@wordpress/element';
*/
import SlotFillContext from './context';
import type {
- FillComponentProps,
+ FillInstance,
+ FillChildren,
+ BaseSlotInstance,
BaseSlotFillContext,
SlotFillProviderProps,
SlotKey,
- Rerenderable,
} from './types';
+import { observableMap } from '@wordpress/compose';
function createSlotRegistry(): BaseSlotFillContext {
- const slots: Record< SlotKey, Rerenderable > = {};
- const fills: Record< SlotKey, FillComponentProps[] > = {};
- let listeners: Array< () => void > = [];
-
- function registerSlot( name: SlotKey, slot: Rerenderable ) {
- const previousSlot = slots[ name ];
- slots[ name ] = slot;
- triggerListeners();
-
- // Sometimes the fills are registered after the initial render of slot
- // But before the registerSlot call, we need to rerender the slot.
- forceUpdateSlot( name );
-
- // If a new instance of a slot is being mounted while another with the
- // same name exists, force its update _after_ the new slot has been
- // assigned into the instance, such that its own rendering of children
- // will be empty (the new Slot will subsume all fills for this name).
- if ( previousSlot ) {
- previousSlot.rerender();
- }
- }
-
- function registerFill( name: SlotKey, instance: FillComponentProps ) {
- fills[ name ] = [ ...( fills[ name ] || [] ), instance ];
- forceUpdateSlot( name );
+ const slots = observableMap< SlotKey, BaseSlotInstance >();
+ const fills = observableMap<
+ SlotKey,
+ { instance: FillInstance; children: FillChildren }[]
+ >();
+
+ function registerSlot( name: SlotKey, instance: BaseSlotInstance ) {
+ slots.set( name, instance );
}
- function unregisterSlot( name: SlotKey, instance: Rerenderable ) {
+ function unregisterSlot( name: SlotKey, instance: BaseSlotInstance ) {
// If a previous instance of a Slot by this name unmounts, do nothing,
// as the slot and its fills should only be removed for the current
// known instance.
- if ( slots[ name ] !== instance ) {
+ if ( slots.get( name ) !== instance ) {
return;
}
- delete slots[ name ];
- triggerListeners();
+ slots.delete( name );
}
- function unregisterFill( name: SlotKey, instance: FillComponentProps ) {
- fills[ name ] =
- fills[ name ]?.filter( ( fill ) => fill !== instance ) ?? [];
- forceUpdateSlot( name );
+ function registerFill(
+ name: SlotKey,
+ instance: FillInstance,
+ children: FillChildren
+ ) {
+ fills.set( name, [
+ ...( fills.get( name ) || [] ),
+ { instance, children },
+ ] );
}
- function getSlot( name: SlotKey ): Rerenderable | undefined {
- return slots[ name ];
+ function unregisterFill( name: SlotKey, instance: FillInstance ) {
+ const fillsForName = fills.get( name );
+ if ( ! fillsForName ) {
+ return;
+ }
+
+ fills.set(
+ name,
+ fillsForName.filter( ( fill ) => fill.instance !== instance )
+ );
}
- function getFills(
+ function updateFill(
name: SlotKey,
- slotInstance: Rerenderable
- ): FillComponentProps[] {
- // Fills should only be returned for the current instance of the slot
- // in which they occupy.
- if ( slots[ name ] !== slotInstance ) {
- return [];
+ instance: FillInstance,
+ children: FillChildren
+ ) {
+ const fillsForName = fills.get( name );
+ if ( ! fillsForName ) {
+ return;
}
- return fills[ name ];
- }
-
- function forceUpdateSlot( name: SlotKey ) {
- const slot = getSlot( name );
- if ( slot ) {
- slot.rerender();
+ const fillForInstance = fillsForName.find(
+ ( f ) => f.instance === instance
+ );
+ if ( ! fillForInstance ) {
+ return;
}
- }
- function triggerListeners() {
- listeners.forEach( ( listener ) => listener() );
- }
-
- function subscribe( listener: () => void ) {
- listeners.push( listener );
+ if ( fillForInstance.children === children ) {
+ return;
+ }
- return () => {
- listeners = listeners.filter( ( l ) => l !== listener );
- };
+ fills.set(
+ name,
+ fillsForName.map( ( f ) => {
+ if ( f.instance === instance ) {
+ // Replace with new record with updated `children`.
+ return { instance, children };
+ }
+
+ return f;
+ } )
+ );
}
return {
+ slots,
+ fills,
registerSlot,
unregisterSlot,
registerFill,
unregisterFill,
- getSlot,
- getFills,
- subscribe,
+ updateFill,
};
}
diff --git a/packages/components/src/slot-fill/slot.tsx b/packages/components/src/slot-fill/slot.tsx
index fe4a741ddbfba..82feaa04199f5 100644
--- a/packages/components/src/slot-fill/slot.tsx
+++ b/packages/components/src/slot-fill/slot.tsx
@@ -6,10 +6,10 @@ import type { ReactElement, ReactNode, Key } from 'react';
/**
* WordPress dependencies
*/
+import { useObservableValue } from '@wordpress/compose';
import {
useContext,
useEffect,
- useReducer,
useRef,
Children,
cloneElement,
@@ -32,41 +32,48 @@ function isFunction( maybeFunc: any ): maybeFunc is Function {
return typeof maybeFunc === 'function';
}
+function addKeysToChildren( children: ReactNode ) {
+ return Children.map( children, ( child, childIndex ) => {
+ if ( ! child || typeof child === 'string' ) {
+ return child;
+ }
+ let childKey: Key = childIndex;
+ if ( typeof child === 'object' && 'key' in child && child?.key ) {
+ childKey = child.key;
+ }
+
+ return cloneElement( child as ReactElement, {
+ key: childKey,
+ } );
+ } );
+}
+
function Slot( props: Omit< SlotComponentProps, 'bubblesVirtually' > ) {
const registry = useContext( SlotFillContext );
- const [ , rerender ] = useReducer( () => [], [] );
- const ref = useRef( { rerender } );
+ const instanceRef = useRef( {} );
const { name, children, fillProps = {} } = props;
useEffect( () => {
- const refValue = ref.current;
- registry.registerSlot( name, refValue );
- return () => registry.unregisterSlot( name, refValue );
+ const instance = instanceRef.current;
+ registry.registerSlot( name, instance );
+ return () => registry.unregisterSlot( name, instance );
}, [ registry, name ] );
- const fills: ReactNode[] = ( registry.getFills( name, ref.current ) ?? [] )
+ let fills = useObservableValue( registry.fills, name ) ?? [];
+ const currentSlot = useObservableValue( registry.slots, name );
+
+ // Fills should only be rendered in the currently registered instance of the slot.
+ if ( currentSlot !== instanceRef.current ) {
+ fills = [];
+ }
+
+ const renderedFills = fills
.map( ( fill ) => {
const fillChildren = isFunction( fill.children )
? fill.children( fillProps )
: fill.children;
- return Children.map( fillChildren, ( child, childIndex ) => {
- if ( ! child || typeof child === 'string' ) {
- return child;
- }
- let childKey: Key = childIndex;
- if (
- typeof child === 'object' &&
- 'key' in child &&
- child?.key
- ) {
- childKey = child.key;
- }
-
- return cloneElement( child as ReactElement, {
- key: childKey,
- } );
- } );
+ return addKeysToChildren( fillChildren );
} )
.filter(
// In some cases fills are rendered only when some conditions apply.
@@ -75,7 +82,13 @@ function Slot( props: Omit< SlotComponentProps, 'bubblesVirtually' > ) {
( element ) => ! isEmptyElement( element )
);
- return <>{ isFunction( children ) ? children( fills ) : fills }>;
+ return (
+ <>
+ { isFunction( children )
+ ? children( renderedFills )
+ : renderedFills }
+ >
+ );
}
export default Slot;
diff --git a/packages/components/src/slot-fill/types.ts b/packages/components/src/slot-fill/types.ts
index 6668057323edd..758f1c8257d54 100644
--- a/packages/components/src/slot-fill/types.ts
+++ b/packages/components/src/slot-fill/types.ts
@@ -84,6 +84,10 @@ export type SlotComponentProps =
style?: never;
} );
+export type FillChildren =
+ | ReactNode
+ | ( ( fillProps: FillProps ) => ReactNode );
+
export type FillComponentProps = {
/**
* The name of the slot to fill into.
@@ -93,7 +97,7 @@ export type FillComponentProps = {
/**
* Children elements or render function.
*/
- children?: ReactNode | ( ( fillProps: FillProps ) => ReactNode );
+ children?: FillChildren;
};
export type SlotFillProviderProps = {
@@ -109,8 +113,8 @@ export type SlotFillProviderProps = {
};
export type SlotRef = RefObject< HTMLElement >;
-export type Rerenderable = { rerender: () => void };
export type FillInstance = {};
+export type BaseSlotInstance = {};
export type SlotFillBubblesVirtuallyContext = {
slots: ObservableMap< SlotKey, { ref: SlotRef; fillProps: FillProps } >;
@@ -128,14 +132,22 @@ export type SlotFillBubblesVirtuallyContext = {
};
export type BaseSlotFillContext = {
- registerSlot: ( name: SlotKey, slot: Rerenderable ) => void;
- unregisterSlot: ( name: SlotKey, slot: Rerenderable ) => void;
- registerFill: ( name: SlotKey, instance: FillComponentProps ) => void;
- unregisterFill: ( name: SlotKey, instance: FillComponentProps ) => void;
- getSlot: ( name: SlotKey ) => Rerenderable | undefined;
- getFills: (
+ slots: ObservableMap< SlotKey, BaseSlotInstance >;
+ fills: ObservableMap<
+ SlotKey,
+ { instance: FillInstance; children: FillChildren }[]
+ >;
+ registerSlot: ( name: SlotKey, slot: BaseSlotInstance ) => void;
+ unregisterSlot: ( name: SlotKey, slot: BaseSlotInstance ) => void;
+ registerFill: (
+ name: SlotKey,
+ instance: FillInstance,
+ children: FillChildren
+ ) => void;
+ unregisterFill: ( name: SlotKey, instance: FillInstance ) => void;
+ updateFill: (
name: SlotKey,
- slotInstance: Rerenderable
- ) => FillComponentProps[];
- subscribe: ( listener: () => void ) => () => void;
+ instance: FillInstance,
+ children: FillChildren
+ ) => void;
};
diff --git a/packages/components/src/slot-fill/use-slot.ts b/packages/components/src/slot-fill/use-slot.ts
deleted file mode 100644
index 4ab419be1ad2b..0000000000000
--- a/packages/components/src/slot-fill/use-slot.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-/**
- * WordPress dependencies
- */
-import { useContext, useSyncExternalStore } from '@wordpress/element';
-
-/**
- * Internal dependencies
- */
-import SlotFillContext from './context';
-import type { SlotKey } from './types';
-
-/**
- * React hook returning the active slot given a name.
- *
- * @param name Slot name.
- * @return Slot object.
- */
-const useSlot = ( name: SlotKey ) => {
- const { getSlot, subscribe } = useContext( SlotFillContext );
- return useSyncExternalStore(
- subscribe,
- () => getSlot( name ),
- () => getSlot( name )
- );
-};
-
-export default useSlot;
From e9fb12f396fd1d93c4d0f7f1f4ebad5719c769ad Mon Sep 17 00:00:00 2001
From: Eshaan Dabasiya <76681468+im3dabasia@users.noreply.github.com>
Date: Sat, 14 Dec 2024 04:18:33 +0530
Subject: [PATCH 066/239] Refactor "Settings" panel of Page List block to use
ToolsPanel instead of PanelBody (#67903)
Co-authored-by: im3dabasia
Co-authored-by: fabiankaegy
---
packages/block-library/src/page-list/edit.js | 85 +++++++++++++-------
1 file changed, 54 insertions(+), 31 deletions(-)
diff --git a/packages/block-library/src/page-list/edit.js b/packages/block-library/src/page-list/edit.js
index 31e400b867671..d9fee67968ac0 100644
--- a/packages/block-library/src/page-list/edit.js
+++ b/packages/block-library/src/page-list/edit.js
@@ -17,12 +17,13 @@ import {
Warning,
} from '@wordpress/block-editor';
import {
- PanelBody,
ToolbarButton,
Spinner,
Notice,
ComboboxControl,
Button,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
} from '@wordpress/components';
import { __, sprintf } from '@wordpress/i18n';
import { useMemo, useState, useEffect, useCallback } from '@wordpress/element';
@@ -320,38 +321,60 @@ export default function PageListEdit( {
return (
<>
- { pagesTree.length > 0 && (
-
-
- setAttributes( { parentPageID: value ?? 0 } )
+ {
+ setAttributes( { parentPageID: 0 } );
+ } }
+ >
+ { pagesTree.length > 0 && (
+ parentPageID !== 0 }
+ onDeselect={ () =>
+ setAttributes( { parentPageID: 0 } )
}
- help={ __(
- 'Choose a page to show only its subpages.'
- ) }
- />
-
- ) }
- { allowConvertToLinks && (
-
- { convertDescription }
-
- { __( 'Edit' ) }
-
-
- ) }
+
+ setAttributes( {
+ parentPageID: value ?? 0,
+ } )
+ }
+ help={ __(
+ 'Choose a page to show only its subpages.'
+ ) }
+ />
+
+ ) }
+
+ { allowConvertToLinks && (
+
+
+
{ convertDescription }
+
+ { __( 'Edit' ) }
+
+
+
+ ) }
+
{ allowConvertToLinks && (
<>
From 84d26fcb7235f70a6e83dc51a9b64030b541b19b Mon Sep 17 00:00:00 2001
From: Eshaan Dabasiya <76681468+im3dabasia@users.noreply.github.com>
Date: Sat, 14 Dec 2024 04:22:43 +0530
Subject: [PATCH 067/239] Refactor "Settings" panel of Navigation Submenu block
to use ToolsPanel instead of PanelBody (#67969)
Co-authored-by: im3dabasia
Co-authored-by: fabiankaegy
---
.../src/navigation-submenu/edit.js | 167 ++++++++++++------
1 file changed, 110 insertions(+), 57 deletions(-)
diff --git a/packages/block-library/src/navigation-submenu/edit.js b/packages/block-library/src/navigation-submenu/edit.js
index c89eadf1cb589..dbdbd23b13b2f 100644
--- a/packages/block-library/src/navigation-submenu/edit.js
+++ b/packages/block-library/src/navigation-submenu/edit.js
@@ -8,11 +8,12 @@ import clsx from 'clsx';
*/
import { useSelect, useDispatch } from '@wordpress/data';
import {
- PanelBody,
TextControl,
TextareaControl,
ToolbarButton,
ToolbarGroup,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
} from '@wordpress/components';
import { displayShortcut, isKeyboardEvent } from '@wordpress/keycodes';
import { __ } from '@wordpress/i18n';
@@ -382,67 +383,119 @@ export default function NavigationSubmenuEdit( {
{ /* Warning, this duplicated in packages/block-library/src/navigation-link/edit.js */ }
-
- {
- setAttributes( { label: labelValue } );
- } }
+ {
+ setAttributes( {
+ label: '',
+ url: '',
+ description: '',
+ title: '',
+ rel: '',
+ } );
+ } }
+ >
+
- {
- setAttributes( { url: urlValue } );
- } }
+ isShownByDefault
+ hasValue={ () => !! label }
+ onDeselect={ () => setAttributes( { label: '' } ) }
+ >
+ {
+ setAttributes( { label: labelValue } );
+ } }
+ label={ __( 'Text' ) }
+ autoComplete="off"
+ />
+
+
+
- {
- setAttributes( {
- description: descriptionValue,
- } );
- } }
+ isShownByDefault
+ hasValue={ () => !! url }
+ onDeselect={ () => setAttributes( { url: '' } ) }
+ >
+ {
+ setAttributes( { url: urlValue } );
+ } }
+ label={ __( 'Link' ) }
+ autoComplete="off"
+ />
+
+
+
- {
- setAttributes( { title: titleValue } );
- } }
+ isShownByDefault
+ hasValue={ () => !! description }
+ onDeselect={ () =>
+ setAttributes( { description: '' } )
+ }
+ >
+ {
+ setAttributes( {
+ description: descriptionValue,
+ } );
+ } }
+ label={ __( 'Description' ) }
+ help={ __(
+ 'The description will be displayed in the menu if the current theme supports it.'
+ ) }
+ />
+
+
+
- {
- setAttributes( { rel: relValue } );
- } }
+ isShownByDefault
+ hasValue={ () => !! title }
+ onDeselect={ () => setAttributes( { title: '' } ) }
+ >
+ {
+ setAttributes( { title: titleValue } );
+ } }
+ label={ __( 'Title attribute' ) }
+ autoComplete="off"
+ help={ __(
+ 'Additional information to help clarify the purpose of the link.'
+ ) }
+ />
+
+
+
-
+ isShownByDefault
+ hasValue={ () => !! rel }
+ onDeselect={ () => setAttributes( { rel: '' } ) }
+ >
+ {
+ setAttributes( { rel: relValue } );
+ } }
+ label={ __( 'Rel attribute' ) }
+ autoComplete="off"
+ help={ __(
+ 'The relationship of the linked URL as space-separated link types.'
+ ) }
+ />
+
+
{ /* eslint-disable jsx-a11y/anchor-is-valid */ }
From 85912cb17595b028f2a8477c36209b5342cbed0e Mon Sep 17 00:00:00 2001
From: Eshaan Dabasiya <76681468+im3dabasia@users.noreply.github.com>
Date: Sat, 14 Dec 2024 04:24:04 +0530
Subject: [PATCH 068/239] Refactor "Settings" panel of Query Page Numbers block
to use ToolsPanel instead of PanelBody (#67958)
Co-authored-by: im3dabasia
Co-authored-by: fabiankaegy
---
.../src/query-pagination-numbers/edit.js | 53 ++++++++++++-------
1 file changed, 34 insertions(+), 19 deletions(-)
diff --git a/packages/block-library/src/query-pagination-numbers/edit.js b/packages/block-library/src/query-pagination-numbers/edit.js
index b8d8c160cc874..0497393e2a4ed 100644
--- a/packages/block-library/src/query-pagination-numbers/edit.js
+++ b/packages/block-library/src/query-pagination-numbers/edit.js
@@ -3,7 +3,11 @@
*/
import { __ } from '@wordpress/i18n';
import { InspectorControls, useBlockProps } from '@wordpress/block-editor';
-import { PanelBody, RangeControl } from '@wordpress/components';
+import {
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
+ RangeControl,
+} from '@wordpress/components';
const createPaginationItem = ( content, Tag = 'a', extraClass = '' ) => (
@@ -46,28 +50,39 @@ export default function QueryPaginationNumbersEdit( {
const paginationNumbers = previewPaginationNumbers(
parseInt( midSize, 10 )
);
+
return (
<>
-
- setAttributes( { midSize: 2 } ) }
+ >
+ {
- setAttributes( {
- midSize: parseInt( value, 10 ),
- } );
- } }
- min={ 0 }
- max={ 5 }
- withInputField={ false }
- />
-
+ hasValue={ () => midSize !== undefined }
+ onDeselect={ () => setAttributes( { midSize: 2 } ) }
+ isShownByDefault
+ >
+ {
+ setAttributes( {
+ midSize: parseInt( value, 10 ),
+ } );
+ } }
+ min={ 0 }
+ max={ 5 }
+ withInputField={ false }
+ />
+
+
{ paginationNumbers }
>
From 183d93a90b9eaf9ebe08ce6ae9df4e12abeb14ae Mon Sep 17 00:00:00 2001
From: Sunil Prajapati <61308756+akasunil@users.noreply.github.com>
Date: Sat, 14 Dec 2024 11:07:11 +0530
Subject: [PATCH 069/239] Featured Image Block: Refactor setting panel (#67456)
* Refactor setting panel of featured image block control
* Fix link target attribute reset
Co-authored-by: akasunil
Co-authored-by: fabiankaegy
Co-authored-by: aaronrobertshaw
---
.../src/post-featured-image/edit.js | 77 ++++++++++++++++---
1 file changed, 67 insertions(+), 10 deletions(-)
diff --git a/packages/block-library/src/post-featured-image/edit.js b/packages/block-library/src/post-featured-image/edit.js
index 95441a5a55cfd..05888c41fecf2 100644
--- a/packages/block-library/src/post-featured-image/edit.js
+++ b/packages/block-library/src/post-featured-image/edit.js
@@ -11,11 +11,12 @@ import { useEntityProp, store as coreStore } from '@wordpress/core-data';
import { useSelect, useDispatch } from '@wordpress/data';
import {
ToggleControl,
- PanelBody,
Placeholder,
Button,
Spinner,
TextControl,
+ __experimentalToolsPanel as ToolsPanel,
+ __experimentalToolsPanelItem as ToolsPanelItem,
} from '@wordpress/components';
import {
InspectorControls,
@@ -38,6 +39,7 @@ import { store as noticesStore } from '@wordpress/notices';
import DimensionControls from './dimension-controls';
import OverlayControls from './overlay-controls';
import Overlay from './overlay';
+import { useToolsPanelDropdownMenuProps } from '../utils/hooks';
const ALLOWED_MEDIA_TYPES = [ 'image' ];
@@ -183,6 +185,8 @@ export default function PostFeaturedImageEdit( {
setTemporaryURL();
};
+ const dropdownMenuProps = useToolsPanelDropdownMenuProps();
+
const controls = blockEditingMode === 'default' && (
<>
@@ -201,9 +205,18 @@ export default function PostFeaturedImageEdit( {
/>
-
- {
+ setAttributes( {
+ isLink: false,
+ linkTarget: '_self',
+ rel: '',
+ } );
+ } }
+ dropdownMenuProps={ dropdownMenuProps }
+ >
+ setAttributes( { isLink: ! isLink } ) }
- checked={ isLink }
- />
+ isShownByDefault
+ hasValue={ () => !! isLink }
+ onDeselect={ () =>
+ setAttributes( {
+ isLink: false,
+ } )
+ }
+ >
+
+ setAttributes( { isLink: ! isLink } )
+ }
+ checked={ isLink }
+ />
+
{ isLink && (
- <>
+ '_self' !== linkTarget }
+ onDeselect={ () =>
+ setAttributes( {
+ linkTarget: '_self',
+ } )
+ }
+ >
+
+ ) }
+ { isLink && (
+ !! rel }
+ onDeselect={ () =>
+ setAttributes( {
+ rel: '',
+ } )
+ }
+ >
- >
+
) }
-
+
>
);
From aed83a9f30583f9b4627956c7e3d3b56b910aef1 Mon Sep 17 00:00:00 2001
From: Mayur Prajapati <91679132+mayurprajapatii@users.noreply.github.com>
Date: Sat, 14 Dec 2024 13:14:02 +0530
Subject: [PATCH 070/239] Updated Document URL in Documentation (#67990)
Co-authored-by: mayurprajapatii
Co-authored-by: pateljaymin29
---
docs/README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/README.md b/docs/README.md
index 31471a9928b2c..4fd7d16595e13 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -48,7 +48,7 @@ This handbook should be considered the canonical resource for all things related
## Are you in the right place?
-The Block Editor Handbook is designed for those looking to create and develop for the Block Editor. However, it's important to note that there are multiple other handbooks available within the [Developer Resources](http://developer.wordpress.org/) that you may find beneficial:
+The Block Editor Handbook is designed for those looking to create and develop for the Block Editor. However, it's important to note that there are multiple other handbooks available within the [Developer Resources](https://developer.wordpress.org/) that you may find beneficial:
- [Theme Handbook](https://developer.wordpress.org/themes)
- [Plugin Handbook](https://developer.wordpress.org/plugins)
From 6e8588865ed61c990227dfb9d1324a52f4ff39af Mon Sep 17 00:00:00 2001
From: George Mamadashvili
Date: Sat, 14 Dec 2024 13:09:11 +0400
Subject: [PATCH 071/239] Columns: Replace some store selectors with
'getBlockOrder' (#67991)
Co-authored-by: Mamaduka
Co-authored-by: t-hamano
---
packages/block-library/src/columns/edit.js | 18 +++++++-----------
1 file changed, 7 insertions(+), 11 deletions(-)
diff --git a/packages/block-library/src/columns/edit.js b/packages/block-library/src/columns/edit.js
index 3d5f298aef835..d79dfe4fc94a4 100644
--- a/packages/block-library/src/columns/edit.js
+++ b/packages/block-library/src/columns/edit.js
@@ -52,19 +52,15 @@ function ColumnInspectorControls( {
} ) {
const { count, canInsertColumnBlock, minCount } = useSelect(
( select ) => {
- const {
- canInsertBlockType,
- canRemoveBlock,
- getBlocks,
- getBlockCount,
- } = select( blockEditorStore );
- const innerBlocks = getBlocks( clientId );
+ const { canInsertBlockType, canRemoveBlock, getBlockOrder } =
+ select( blockEditorStore );
+ const blockOrder = getBlockOrder( clientId );
// Get the indexes of columns for which removal is prevented.
// The highest index will be used to determine the minimum column count.
- const preventRemovalBlockIndexes = innerBlocks.reduce(
- ( acc, block, index ) => {
- if ( ! canRemoveBlock( block.clientId ) ) {
+ const preventRemovalBlockIndexes = blockOrder.reduce(
+ ( acc, blockId, index ) => {
+ if ( ! canRemoveBlock( blockId ) ) {
acc.push( index );
}
return acc;
@@ -73,7 +69,7 @@ function ColumnInspectorControls( {
);
return {
- count: getBlockCount( clientId ),
+ count: blockOrder.length,
canInsertColumnBlock: canInsertBlockType(
'core/column',
clientId
From 737698812d1991396fe49cfc14d36f57eeba59be Mon Sep 17 00:00:00 2001
From: Jorge Costa
Date: Sun, 15 Dec 2024 11:52:04 +0000
Subject: [PATCH 072/239] Dataviews List layout: do not use grid role on a `ul`
element. (#67849)
Co-authored-by: jorgefilipecosta
Co-authored-by: oandregal
---
.../dataviews/src/dataviews-layouts/list/index.tsx | 4 ++--
.../dataviews/src/dataviews-layouts/list/style.scss | 10 +++++-----
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/packages/dataviews/src/dataviews-layouts/list/index.tsx b/packages/dataviews/src/dataviews-layouts/list/index.tsx
index fd6cdff6dbcdc..960865164fd6c 100644
--- a/packages/dataviews/src/dataviews-layouts/list/index.tsx
+++ b/packages/dataviews/src/dataviews-layouts/list/index.tsx
@@ -257,7 +257,7 @@ function ListItem< Item >( {
return (
}
+ render={
}
role="row"
className={ clsx( {
'is-selected': isSelected,
@@ -482,7 +482,7 @@ export default function ViewList< Item >( props: ViewListProps< Item > ) {
return (
}
+ render={
}
className="dataviews-view-list"
role="grid"
activeId={ activeCompositeId }
diff --git a/packages/dataviews/src/dataviews-layouts/list/style.scss b/packages/dataviews/src/dataviews-layouts/list/style.scss
index 82ef269d46964..e892006faecb0 100644
--- a/packages/dataviews/src/dataviews-layouts/list/style.scss
+++ b/packages/dataviews/src/dataviews-layouts/list/style.scss
@@ -1,11 +1,11 @@
-ul.dataviews-view-list {
+div.dataviews-view-list {
list-style-type: none;
}
.dataviews-view-list {
margin: 0 0 auto;
- li {
+ div[role="row"] {
margin: 0;
border-top: 1px solid $gray-100;
@@ -45,7 +45,7 @@ ul.dataviews-view-list {
&.is-selected.is-selected {
border-top: 1px solid rgba(var(--wp-admin-theme-color--rgb), 0.12);
- & + li {
+ & + div[role="row"] {
border-top: 1px solid rgba(var(--wp-admin-theme-color--rgb), 0.12);
}
}
@@ -69,8 +69,8 @@ ul.dataviews-view-list {
}
- li.is-selected,
- li.is-selected:focus-within {
+ div[role="row"].is-selected,
+ div[role="row"].is-selected:focus-within {
.dataviews-view-list__item-wrapper {
background-color: rgba(var(--wp-admin-theme-color--rgb), 0.04);
color: $gray-900;
From 6893b2d87910bdc2f1c5dab899f0e352cd774c33 Mon Sep 17 00:00:00 2001
From: tellthemachines
Date: Mon, 16 Dec 2024 14:18:48 +1100
Subject: [PATCH 073/239] Try toggle instead of dropdown to show stylebook.
(#67810)
* Try toggle instead of dropdown to show stylebook.
* Use button instead of actual toggle
* Make button icon except if text labels are enabled
---
.../edit-site/src/components/editor/index.js | 8 +---
.../edit-site/src/components/layout/index.js | 13 ++++-
.../sidebar-global-styles-wrapper/index.js | 47 +++++--------------
.../sidebar-global-styles-wrapper/style.scss | 22 +++++++++
4 files changed, 46 insertions(+), 44 deletions(-)
diff --git a/packages/edit-site/src/components/editor/index.js b/packages/edit-site/src/components/editor/index.js
index c045bafd8a683..ad88ee07e2150 100644
--- a/packages/edit-site/src/components/editor/index.js
+++ b/packages/edit-site/src/components/editor/index.js
@@ -20,7 +20,6 @@ import { privateApis as blockLibraryPrivateApis } from '@wordpress/block-library
import { useCallback, useMemo } from '@wordpress/element';
import { store as noticesStore } from '@wordpress/notices';
import { privateApis as routerPrivateApis } from '@wordpress/router';
-import { store as preferencesStore } from '@wordpress/preferences';
import { decodeEntities } from '@wordpress/html-entities';
import { Icon, arrowUpLeft } from '@wordpress/icons';
import { store as blockEditorStore } from '@wordpress/block-editor';
@@ -130,7 +129,6 @@ export default function EditSiteEditor( { isPostsList = false } ) {
const { postType, postId, context } = entity;
const {
supportsGlobalStyles,
- showIconLabels,
editorCanvasView,
currentPostIsTrashed,
hasSiteIcon,
@@ -138,13 +136,11 @@ export default function EditSiteEditor( { isPostsList = false } ) {
const { getEditorCanvasContainerView } = unlock(
select( editSiteStore )
);
- const { get } = select( preferencesStore );
const { getCurrentTheme, getEntityRecord } = select( coreDataStore );
const siteData = getEntityRecord( 'root', '__unstableBase', undefined );
return {
supportsGlobalStyles: getCurrentTheme()?.is_block_theme,
- showIconLabels: get( 'core', 'showIconLabels' ),
editorCanvasView: getEditorCanvasContainerView(),
currentPostIsTrashed:
select( editorStore ).getCurrentPostAttribute( 'status' ) ===
@@ -267,9 +263,7 @@ export default function EditSiteEditor( { isPostsList = false } ) {
postId={ postWithTemplate ? context.postId : postId }
templateId={ postWithTemplate ? postId : undefined }
settings={ settings }
- className={ clsx( 'edit-site-editor__editor-interface', {
- 'show-icon-labels': showIconLabels,
- } ) }
+ className="edit-site-editor__editor-interface"
styles={ styles }
customSaveButton={
_isPreviewingTheme &&
diff --git a/packages/edit-site/src/components/layout/index.js b/packages/edit-site/src/components/layout/index.js
index 20162c5272f2e..a5e14f0be8281 100644
--- a/packages/edit-site/src/components/layout/index.js
+++ b/packages/edit-site/src/components/layout/index.js
@@ -32,7 +32,8 @@ import { privateApis as coreCommandsPrivateApis } from '@wordpress/core-commands
import { privateApis as routerPrivateApis } from '@wordpress/router';
import { PluginArea } from '@wordpress/plugins';
import { store as noticesStore } from '@wordpress/notices';
-import { useDispatch } from '@wordpress/data';
+import { useDispatch, useSelect } from '@wordpress/data';
+import { store as preferencesStore } from '@wordpress/preferences';
/**
* Internal dependencies
@@ -70,6 +71,15 @@ function Layout() {
triggerAnimationOnChange: routeKey + '-' + canvas,
} );
+ const { showIconLabels } = useSelect( ( select ) => {
+ return {
+ showIconLabels: select( preferencesStore ).get(
+ 'core',
+ 'showIconLabels'
+ ),
+ };
+ } );
+
const [ backgroundColor ] = useGlobalStyle( 'color.background' );
const [ gradientValue ] = useGlobalStyle( 'color.gradient' );
const previousCanvaMode = usePrevious( canvas );
@@ -93,6 +103,7 @@ function Layout() {
navigateRegionsProps.className,
{
'is-full-canvas': canvas === 'edit',
+ 'show-icon-labels': showIconLabels,
}
) }
>
diff --git a/packages/edit-site/src/components/sidebar-global-styles-wrapper/index.js b/packages/edit-site/src/components/sidebar-global-styles-wrapper/index.js
index 980f20c49821b..030512a38fab3 100644
--- a/packages/edit-site/src/components/sidebar-global-styles-wrapper/index.js
+++ b/packages/edit-site/src/components/sidebar-global-styles-wrapper/index.js
@@ -5,11 +5,9 @@ import { __ } from '@wordpress/i18n';
import { useMemo, useState } from '@wordpress/element';
import { privateApis as routerPrivateApis } from '@wordpress/router';
import { useViewportMatch } from '@wordpress/compose';
-import {
- Button,
- privateApis as componentsPrivateApis,
-} from '@wordpress/components';
+import { Button } from '@wordpress/components';
import { addQueryArgs } from '@wordpress/url';
+import { seen } from '@wordpress/icons';
/**
* Internal dependencies
@@ -21,44 +19,21 @@ import StyleBook from '../style-book';
import { STYLE_BOOK_COLOR_GROUPS } from '../style-book/constants';
const { useLocation, useHistory } = unlock( routerPrivateApis );
-const { Menu } = unlock( componentsPrivateApis );
const GlobalStylesPageActions = ( {
isStyleBookOpened,
setIsStyleBookOpened,
} ) => {
return (
-
- { __( 'Preview' ) }
-
- }
- >
- setIsStyleBookOpened( true ) }
- defaultChecked
- >
- { __( 'Style book' ) }
-
- { __( 'Preview blocks and styles.' ) }
-
-
- setIsStyleBookOpened( false ) }
- >
- { __( 'Site' ) }
-
- { __( 'Preview your site.' ) }
-
-
-
+ {
+ setIsStyleBookOpened( ! isStyleBookOpened );
+ } }
+ size="compact"
+ />
);
};
diff --git a/packages/edit-site/src/components/sidebar-global-styles-wrapper/style.scss b/packages/edit-site/src/components/sidebar-global-styles-wrapper/style.scss
index 88aa9ddf0c161..0fa4e158fe7f1 100644
--- a/packages/edit-site/src/components/sidebar-global-styles-wrapper/style.scss
+++ b/packages/edit-site/src/components/sidebar-global-styles-wrapper/style.scss
@@ -33,3 +33,25 @@
color: $gray-900;
}
}
+
+.show-icon-labels {
+ .edit-site-styles .edit-site-page-content {
+ .edit-site-page-header__actions {
+ .components-button.has-icon {
+ width: auto;
+ padding: 0 $grid-unit-10;
+
+ // Hide the button icons when labels are set to display...
+ svg {
+ display: none;
+ }
+ // ... and display labels.
+ &::after {
+ content: attr(aria-label);
+ font-size: $helptext-font-size;
+ }
+ }
+
+ }
+ }
+}
From 34d25a8faf8f60faa23bf11c150b4ff48a4d020a Mon Sep 17 00:00:00 2001
From: Aki Hamano <54422211+t-hamano@users.noreply.github.com>
Date: Mon, 16 Dec 2024 15:45:39 +0900
Subject: [PATCH 074/239] DateFormatPicker: Improve line breaks in JSDoc and
README (#68006)
Co-authored-by: t-hamano
Co-authored-by: Mamaduka
---
.../components/date-format-picker/README.md | 19 ++++++-------------
.../components/date-format-picker/index.js | 19 ++++---------------
2 files changed, 10 insertions(+), 28 deletions(-)
diff --git a/packages/block-editor/src/components/date-format-picker/README.md b/packages/block-editor/src/components/date-format-picker/README.md
index e057bdc31a168..f6160cb90955b 100644
--- a/packages/block-editor/src/components/date-format-picker/README.md
+++ b/packages/block-editor/src/components/date-format-picker/README.md
@@ -1,17 +1,12 @@
# DateFormatPicker
-The `DateFormatPicker` component renders controls that let the user choose a
-_date format_. That is, how they want their dates to be formatted.
+The `DateFormatPicker` component renders controls that let the user choose a _date format_. That is, how they want their dates to be formatted.
-A user can pick _Default_ to use the default date format (usually set at the
-site level).
+A user can pick _Default_ to use the default date format (usually set at the site level).
-Otherwise, a user may choose a suggested date format or type in their own date
-format by selecting _Custom_.
+Otherwise, a user may choose a suggested date format or type in their own date format by selecting _Custom_.
-All date format strings should be in the format accepted by by the [`dateI18n`
-function in
-`@wordpress/date`](https://github.com/WordPress/gutenberg/tree/trunk/packages/date#datei18n).
+All date format strings should be in the format accepted by by the [`dateI18n` function in `@wordpress/date`](https://github.com/WordPress/gutenberg/tree/trunk/packages/date#datei18n).
## Usage
@@ -43,16 +38,14 @@ The current date format selected by the user. If `null`, _Default_ is selected.
### `defaultFormat`
-The default format string. Used to show to the user what the date will look like
-if _Default_ is selected.
+The default format string. Used to show to the user what the date will look like if _Default_ is selected.
- Type: `string`
- Required: Yes
### `onChange`
-Called when the user makes a selection, or when the user types in a date format.
-`null` indicates that _Default_ is selected.
+Called when the user makes a selection, or when the user types in a date format. `null` indicates that _Default_ is selected.
- Type: `( format: string|null ) => void`
- Required: Yes
diff --git a/packages/block-editor/src/components/date-format-picker/index.js b/packages/block-editor/src/components/date-format-picker/index.js
index eb269e03ca5ab..719390a1d6f90 100644
--- a/packages/block-editor/src/components/date-format-picker/index.js
+++ b/packages/block-editor/src/components/date-format-picker/index.js
@@ -29,21 +29,10 @@ if ( exampleDate.getMonth() === 4 ) {
*
* @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/date-format-picker/README.md
*
- * @param {Object} props
- * @param {string|null} props.format The selected date
- * format. If
- * `null`,
- * _Default_ is
- * selected.
- * @param {string} props.defaultFormat The date format that
- * will be used if the
- * user selects
- * 'Default'.
- * @param {( format: string|null ) => void} props.onChange Called when a
- * selection is
- * made. If `null`,
- * _Default_ is
- * selected.
+ * @param {Object} props
+ * @param {string|null} props.format The selected date format. If `null`, _Default_ is selected.
+ * @param {string} props.defaultFormat The date format that will be used if the user selects 'Default'.
+ * @param {Function} props.onChange Called when a selection is made. If `null`, _Default_ is selected.
*/
export default function DateFormatPicker( {
format,
From bc4f6c6632f52dfc455709bd27bda08041e225ec Mon Sep 17 00:00:00 2001
From: Ankit Kumar Shah
Date: Mon, 16 Dec 2024 13:22:32 +0530
Subject: [PATCH 075/239] LoginOut: Add dropdown menu props to ToolsPanel
component (#68009)
Co-authored-by: Infinite-Null
Co-authored-by: fabiankaegy
---
packages/block-library/src/loginout/edit.js | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/packages/block-library/src/loginout/edit.js b/packages/block-library/src/loginout/edit.js
index 76d6e98b1ccc3..9af634c87371c 100644
--- a/packages/block-library/src/loginout/edit.js
+++ b/packages/block-library/src/loginout/edit.js
@@ -8,9 +8,14 @@ import {
__experimentalToolsPanelItem as ToolsPanelItem,
} from '@wordpress/components';
import { __ } from '@wordpress/i18n';
+/**
+ * Internal dependencies
+ */
+import { useToolsPanelDropdownMenuProps } from '../utils/hooks';
export default function LoginOutEdit( { attributes, setAttributes } ) {
const { displayLoginAsForm, redirectToCurrent } = attributes;
+ const dropdownMenuProps = useToolsPanelDropdownMenuProps();
return (
<>
@@ -23,6 +28,7 @@ export default function LoginOutEdit( { attributes, setAttributes } ) {
redirectToCurrent: true,
} );
} }
+ dropdownMenuProps={ dropdownMenuProps }
>
Date: Mon, 16 Dec 2024 12:12:45 +0400
Subject: [PATCH 076/239] DOM: Support class wildcard matcher in
'cleanNodeList' (#67830)
Co-authored-by: Mamaduka
Co-authored-by: ntsekouras
---
packages/block-library/src/image/transforms.js | 2 +-
packages/dom/src/dom/clean-node-list.js | 5 ++++-
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/packages/block-library/src/image/transforms.js b/packages/block-library/src/image/transforms.js
index 32824c372efdc..0119009b2182c 100644
--- a/packages/block-library/src/image/transforms.js
+++ b/packages/block-library/src/image/transforms.js
@@ -59,7 +59,7 @@ const schema = ( { phrasingContentSchema } ) => ( {
...imageSchema,
a: {
attributes: [ 'href', 'rel', 'target' ],
- classes: [ /[\w-]*/ ],
+ classes: [ '*' ],
children: imageSchema,
},
figcaption: {
diff --git a/packages/dom/src/dom/clean-node-list.js b/packages/dom/src/dom/clean-node-list.js
index bbdff13b470d6..f1b7e1be7264f 100644
--- a/packages/dom/src/dom/clean-node-list.js
+++ b/packages/dom/src/dom/clean-node-list.js
@@ -76,7 +76,10 @@ export default function cleanNodeList( nodeList, doc, schema, inline ) {
// TODO: Explore patching this in jsdom-jscore.
if ( node.classList && node.classList.length ) {
const mattchers = classes.map( ( item ) => {
- if ( typeof item === 'string' ) {
+ if ( item === '*' ) {
+ // Keep all classes.
+ return () => true;
+ } else if ( typeof item === 'string' ) {
return (
/** @type {string} */ className
) => className === item;
From d02331c2d22a636f20818dd311f9cc8a48b9f82d Mon Sep 17 00:00:00 2001
From: Eshaan Dabasiya <76681468+im3dabasia@users.noreply.github.com>
Date: Mon, 16 Dec 2024 14:00:46 +0530
Subject: [PATCH 077/239] Page List Block: Add dropdown menu props to
ToolsPanel component (#68012)
Co-authored-by: im3dabasia
Co-authored-by: fabiankaegy
---
packages/block-library/src/page-list/edit.js | 3 +++
1 file changed, 3 insertions(+)
diff --git a/packages/block-library/src/page-list/edit.js b/packages/block-library/src/page-list/edit.js
index d9fee67968ac0..00d96e9ba307b 100644
--- a/packages/block-library/src/page-list/edit.js
+++ b/packages/block-library/src/page-list/edit.js
@@ -38,6 +38,7 @@ import {
convertDescription,
ConvertToLinksModal,
} from './convert-to-links-modal';
+import { useToolsPanelDropdownMenuProps } from '../utils/hooks';
// We only show the edit option when page count is <= MAX_PAGE_COUNT
// Performance of Navigation Links is not good past this value.
@@ -124,6 +125,7 @@ export default function PageListEdit( {
const [ isOpen, setOpen ] = useState( false );
const openModal = useCallback( () => setOpen( true ), [] );
const closeModal = () => setOpen( false );
+ const dropdownMenuProps = useToolsPanelDropdownMenuProps();
const { records: pages, hasResolved: hasResolvedPages } = useEntityRecords(
'postType',
@@ -326,6 +328,7 @@ export default function PageListEdit( {
resetAll={ () => {
setAttributes( { parentPageID: 0 } );
} }
+ dropdownMenuProps={ dropdownMenuProps }
>
{ pagesTree.length > 0 && (
Date: Mon, 16 Dec 2024 14:01:42 +0530
Subject: [PATCH 078/239] Archive: Add dropdown menu props to ToolsPanel
component (#68010)
Co-authored-by: im3dabasia
Co-authored-by: fabiankaegy
---
packages/block-library/src/archives/edit.js | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/packages/block-library/src/archives/edit.js b/packages/block-library/src/archives/edit.js
index b51bd9a4fe1e6..d4f25da8507f3 100644
--- a/packages/block-library/src/archives/edit.js
+++ b/packages/block-library/src/archives/edit.js
@@ -12,9 +12,16 @@ import { __ } from '@wordpress/i18n';
import { InspectorControls, useBlockProps } from '@wordpress/block-editor';
import ServerSideRender from '@wordpress/server-side-render';
+/**
+ * Internal dependencies
+ */
+import { useToolsPanelDropdownMenuProps } from '../utils/hooks';
+
export default function ArchivesEdit( { attributes, setAttributes } ) {
const { showLabel, showPostCounts, displayAsDropdown, type } = attributes;
+ const dropdownMenuProps = useToolsPanelDropdownMenuProps();
+
return (
<>
@@ -28,6 +35,7 @@ export default function ArchivesEdit( { attributes, setAttributes } ) {
type: 'monthly',
} );
} }
+ dropdownMenuProps={ dropdownMenuProps }
>
Date: Mon, 16 Dec 2024 14:14:40 +0530
Subject: [PATCH 079/239] Query Page Numbers: Add dropdown menu props to
ToolsPanel component (#68013)
Co-authored-by: im3dabasia
Co-authored-by: fabiankaegy < fabiankaegy@git.wordpress.org>
---
.../block-library/src/query-pagination-numbers/edit.js | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/packages/block-library/src/query-pagination-numbers/edit.js b/packages/block-library/src/query-pagination-numbers/edit.js
index 0497393e2a4ed..cf2f92f41791f 100644
--- a/packages/block-library/src/query-pagination-numbers/edit.js
+++ b/packages/block-library/src/query-pagination-numbers/edit.js
@@ -9,6 +9,11 @@ import {
RangeControl,
} from '@wordpress/components';
+/**
+ * Internal dependencies
+ */
+import { useToolsPanelDropdownMenuProps } from '../utils/hooks';
+
const createPaginationItem = ( content, Tag = 'a', extraClass = '' ) => (
{ content }
@@ -50,6 +55,7 @@ export default function QueryPaginationNumbersEdit( {
const paginationNumbers = previewPaginationNumbers(
parseInt( midSize, 10 )
);
+ const dropdownMenuProps = useToolsPanelDropdownMenuProps();
return (
<>
@@ -57,6 +63,7 @@ export default function QueryPaginationNumbersEdit( {
setAttributes( { midSize: 2 } ) }
+ dropdownMenuProps={ dropdownMenuProps }
>
Date: Mon, 16 Dec 2024 10:08:59 +0100
Subject: [PATCH 080/239] Add new private `upload-media` package (#66290)
Co-authored-by: ndiego
Co-authored-by: fabiankaegy
Co-authored-by: carolinan
Co-authored-by: Jon Surrell
Co-authored-by: t-hamano
Co-authored-by: sirreal
Co-authored-by: Andrew Serong <14988353+andrewserong@users.noreply.github.com>
Co-authored-by: stokesman
Co-authored-by: andrewserong
Co-authored-by: ramonjd
Co-authored-by: ntsekouras
Co-authored-by: Mamaduka
Co-authored-by: youknowriad
Co-authored-by: Nick Diego
Co-authored-by: Ella <4710635+ellatrix@users.noreply.github.com>
Co-authored-by: Aki Hamano <54422211+t-hamano@users.noreply.github.com>
Co-authored-by: Mitchell Austin
Co-authored-by: Nik Tsekouras
Co-authored-by: George Mamadashvili
---
bin/check-licenses.mjs | 2 +-
package-lock.json | 60 +++
.../src/components/provider/index.js | 85 +++-
.../provider/use-media-upload-settings.js | 25 ++
.../block-editor/src/store/private-actions.js | 1 +
packages/editor/README.md | 1 +
.../provider/use-block-editor-settings.js | 3 +
.../editor/src/utils/media-sideload/index.js | 13 +
.../src/utils/media-sideload/index.native.js | 1 +
.../editor/src/utils/media-upload/index.js | 5 +-
packages/media-utils/src/utils/types.ts | 1 -
.../media-utils/src/utils/upload-media.ts | 27 +-
packages/private-apis/src/implementation.ts | 1 +
packages/upload-media/CHANGELOG.md | 5 +
packages/upload-media/README.md | 136 ++++++
packages/upload-media/package.json | 45 ++
.../src/components/provider/index.tsx | 25 ++
.../provider/with-registry-provider.tsx | 59 +++
.../upload-media/src/get-mime-types-array.ts | 29 ++
packages/upload-media/src/image-file.ts | 38 ++
packages/upload-media/src/index.ts | 11 +
packages/upload-media/src/lock-unlock.ts | 10 +
packages/upload-media/src/store/actions.ts | 183 ++++++++
packages/upload-media/src/store/constants.ts | 1 +
packages/upload-media/src/store/index.ts | 43 ++
.../upload-media/src/store/private-actions.ts | 407 ++++++++++++++++++
.../src/store/private-selectors.ts | 113 +++++
packages/upload-media/src/store/reducer.ts | 195 +++++++++
packages/upload-media/src/store/selectors.ts | 67 +++
.../upload-media/src/store/test/actions.ts | 112 +++++
.../upload-media/src/store/test/reducer.ts | 279 ++++++++++++
.../upload-media/src/store/test/selectors.ts | 105 +++++
packages/upload-media/src/store/types.ts | 172 ++++++++
packages/upload-media/src/stub-file.ts | 5 +
.../src/test/get-file-basename.ts | 15 +
.../src/test/get-file-extension.ts | 15 +
.../src/test/get-file-name-from-url.ts | 14 +
.../src/test/get-mime-types-array.ts | 47 ++
packages/upload-media/src/test/image-file.ts | 15 +
.../upload-media/src/test/upload-error.ts | 24 ++
.../src/test/validate-file-size.ts | 70 +++
.../src/test/validate-mime-type-for-user.ts | 37 ++
.../src/test/validate-mime-type.ts | 57 +++
packages/upload-media/src/upload-error.ts | 26 ++
packages/upload-media/src/utils.ts | 90 ++++
.../upload-media/src/validate-file-size.ts | 44 ++
.../src/validate-mime-type-for-user.ts | 46 ++
.../upload-media/src/validate-mime-type.ts | 43 ++
packages/upload-media/tsconfig.json | 20 +
tsconfig.json | 1 +
50 files changed, 2813 insertions(+), 16 deletions(-)
create mode 100644 packages/block-editor/src/components/provider/use-media-upload-settings.js
create mode 100644 packages/editor/src/utils/media-sideload/index.js
create mode 100644 packages/editor/src/utils/media-sideload/index.native.js
create mode 100644 packages/upload-media/CHANGELOG.md
create mode 100644 packages/upload-media/README.md
create mode 100644 packages/upload-media/package.json
create mode 100644 packages/upload-media/src/components/provider/index.tsx
create mode 100644 packages/upload-media/src/components/provider/with-registry-provider.tsx
create mode 100644 packages/upload-media/src/get-mime-types-array.ts
create mode 100644 packages/upload-media/src/image-file.ts
create mode 100644 packages/upload-media/src/index.ts
create mode 100644 packages/upload-media/src/lock-unlock.ts
create mode 100644 packages/upload-media/src/store/actions.ts
create mode 100644 packages/upload-media/src/store/constants.ts
create mode 100644 packages/upload-media/src/store/index.ts
create mode 100644 packages/upload-media/src/store/private-actions.ts
create mode 100644 packages/upload-media/src/store/private-selectors.ts
create mode 100644 packages/upload-media/src/store/reducer.ts
create mode 100644 packages/upload-media/src/store/selectors.ts
create mode 100644 packages/upload-media/src/store/test/actions.ts
create mode 100644 packages/upload-media/src/store/test/reducer.ts
create mode 100644 packages/upload-media/src/store/test/selectors.ts
create mode 100644 packages/upload-media/src/store/types.ts
create mode 100644 packages/upload-media/src/stub-file.ts
create mode 100644 packages/upload-media/src/test/get-file-basename.ts
create mode 100644 packages/upload-media/src/test/get-file-extension.ts
create mode 100644 packages/upload-media/src/test/get-file-name-from-url.ts
create mode 100644 packages/upload-media/src/test/get-mime-types-array.ts
create mode 100644 packages/upload-media/src/test/image-file.ts
create mode 100644 packages/upload-media/src/test/upload-error.ts
create mode 100644 packages/upload-media/src/test/validate-file-size.ts
create mode 100644 packages/upload-media/src/test/validate-mime-type-for-user.ts
create mode 100644 packages/upload-media/src/test/validate-mime-type.ts
create mode 100644 packages/upload-media/src/upload-error.ts
create mode 100644 packages/upload-media/src/utils.ts
create mode 100644 packages/upload-media/src/validate-file-size.ts
create mode 100644 packages/upload-media/src/validate-mime-type-for-user.ts
create mode 100644 packages/upload-media/src/validate-mime-type.ts
create mode 100644 packages/upload-media/tsconfig.json
diff --git a/bin/check-licenses.mjs b/bin/check-licenses.mjs
index 458590e696a9f..b453ebd84cd3a 100755
--- a/bin/check-licenses.mjs
+++ b/bin/check-licenses.mjs
@@ -10,7 +10,7 @@ import { spawnSync } from 'node:child_process';
*/
import { checkDepsInTree } from '../packages/scripts/utils/license.js';
-const ignored = [ '@ampproject/remapping' ];
+const ignored = [ '@ampproject/remapping', 'webpack' ];
/*
* `wp-scripts check-licenses` uses prod and dev dependencies of the package to scan for dependencies. With npm workspaces, workspace packages (the @wordpress/* packages) are not listed in the main package json and this approach does not work.
diff --git a/package-lock.json b/package-lock.json
index 32ff2db498651..e2063a35c7d0a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11071,6 +11071,12 @@
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
+ "node_modules/@remote-ui/rpc": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/@remote-ui/rpc/-/rpc-1.4.5.tgz",
+ "integrity": "sha512-Cr+06niG/vmE4A9YsmaKngRuuVSWKMY42NMwtZfy+gctRWGu6Wj9BWuMJg5CEp+JTkRBPToqT5rqnrg1G/Wvow==",
+ "license": "MIT"
+ },
"node_modules/@samverschueren/stream-to-observable": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz",
@@ -11170,6 +11176,34 @@
"node": ">=8"
}
},
+ "node_modules/@shopify/web-worker": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/@shopify/web-worker/-/web-worker-6.4.0.tgz",
+ "integrity": "sha512-RvY1mgRyAqawFiYBvsBkek2pVK4GVpV9mmhWFCZXwx01usxXd2HMhKNTFeRYhSp29uoUcfBlKZAwCwQzt826tg==",
+ "license": "MIT",
+ "dependencies": {
+ "@remote-ui/rpc": "^1.2.5"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "webpack": "^5.38.0",
+ "webpack-virtual-modules": "^0.4.3 || ^0.5.0 || ^0.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ },
+ "webpack-virtual-modules": {
+ "optional": true
+ }
+ }
+ },
"node_modules/@sideway/address": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
@@ -15823,6 +15857,10 @@
"resolved": "packages/undo-manager",
"link": true
},
+ "node_modules/@wordpress/upload-media": {
+ "resolved": "packages/upload-media",
+ "link": true
+ },
"node_modules/@wordpress/url": {
"resolved": "packages/url",
"link": true
@@ -52562,6 +52600,28 @@
"npm": ">=8.19.2"
}
},
+ "packages/upload-media": {
+ "name": "@wordpress/upload-media",
+ "version": "1.0.0-prerelease",
+ "license": "GPL-2.0-or-later",
+ "dependencies": {
+ "@shopify/web-worker": "^6.4.0",
+ "@wordpress/api-fetch": "file:../api-fetch",
+ "@wordpress/blob": "file:../blob",
+ "@wordpress/compose": "file:../compose",
+ "@wordpress/data": "file:../data",
+ "@wordpress/element": "file:../element",
+ "@wordpress/i18n": "file:../i18n",
+ "@wordpress/preferences": "file:../preferences",
+ "@wordpress/private-apis": "file:../private-apis",
+ "@wordpress/url": "file:../url",
+ "uuid": "^9.0.1"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
"packages/url": {
"name": "@wordpress/url",
"version": "4.14.0",
diff --git a/packages/block-editor/src/components/provider/index.js b/packages/block-editor/src/components/provider/index.js
index abbb122ae3a0e..97aa0b9521687 100644
--- a/packages/block-editor/src/components/provider/index.js
+++ b/packages/block-editor/src/components/provider/index.js
@@ -2,8 +2,13 @@
* WordPress dependencies
*/
import { useDispatch } from '@wordpress/data';
-import { useEffect } from '@wordpress/element';
+import { useEffect, useMemo } from '@wordpress/element';
import { SlotFillProvider } from '@wordpress/components';
+//eslint-disable-next-line import/no-extraneous-dependencies -- Experimental package, not published.
+import {
+ MediaUploadProvider,
+ store as uploadStore,
+} from '@wordpress/upload-media';
/**
* Internal dependencies
@@ -14,12 +19,71 @@ import { store as blockEditorStore } from '../../store';
import { BlockRefsProvider } from './block-refs-provider';
import { unlock } from '../../lock-unlock';
import KeyboardShortcuts from '../keyboard-shortcuts';
+import useMediaUploadSettings from './use-media-upload-settings';
/** @typedef {import('@wordpress/data').WPDataRegistry} WPDataRegistry */
+const noop = () => {};
+
+/**
+ * Upload a media file when the file upload button is activated
+ * or when adding a file to the editor via drag & drop.
+ *
+ * @param {WPDataRegistry} registry
+ * @param {Object} $3 Parameters object passed to the function.
+ * @param {Array} $3.allowedTypes Array with the types of media that can be uploaded, if unset all types are allowed.
+ * @param {Object} $3.additionalData Additional data to include in the request.
+ * @param {Array} $3.filesList List of files.
+ * @param {Function} $3.onError Function called when an error happens.
+ * @param {Function} $3.onFileChange Function called each time a file or a temporary representation of the file is available.
+ * @param {Function} $3.onSuccess Function called once a file has completely finished uploading, including thumbnails.
+ * @param {Function} $3.onBatchSuccess Function called once all files in a group have completely finished uploading, including thumbnails.
+ */
+function mediaUpload(
+ registry,
+ {
+ allowedTypes,
+ additionalData = {},
+ filesList,
+ onError = noop,
+ onFileChange,
+ onSuccess,
+ onBatchSuccess,
+ }
+) {
+ void registry.dispatch( uploadStore ).addItems( {
+ files: filesList,
+ onChange: onFileChange,
+ onSuccess,
+ onBatchSuccess,
+ onError: ( { message } ) => onError( message ),
+ additionalData,
+ allowedTypes,
+ } );
+}
+
export const ExperimentalBlockEditorProvider = withRegistryProvider(
( props ) => {
- const { children, settings, stripExperimentalSettings = false } = props;
+ const {
+ settings: _settings,
+ registry,
+ stripExperimentalSettings = false,
+ } = props;
+
+ const mediaUploadSettings = useMediaUploadSettings( _settings );
+
+ let settings = _settings;
+
+ if ( window.__experimentalMediaProcessing && _settings.mediaUpload ) {
+ // Create a new variable so that the original props.settings.mediaUpload is not modified.
+ settings = useMemo(
+ () => ( {
+ ..._settings,
+ mediaUpload: mediaUpload.bind( null, registry ),
+ } ),
+ [ _settings, registry ]
+ );
+ }
const { __experimentalUpdateSettings } = unlock(
useDispatch( blockEditorStore )
@@ -44,12 +108,25 @@ export const ExperimentalBlockEditorProvider = withRegistryProvider(
// Syncs the entity provider with changes in the block-editor store.
useBlockSync( props );
- return (
+ const children = (
{ ! settings?.isPreviewMode && }
- { children }
+ { props.children }
);
+
+ if ( window.__experimentalMediaProcessing ) {
+ return (
+
+ { children }
+
+ );
+ }
+
+ return children;
}
);
diff --git a/packages/block-editor/src/components/provider/use-media-upload-settings.js b/packages/block-editor/src/components/provider/use-media-upload-settings.js
new file mode 100644
index 0000000000000..486066c7aa730
--- /dev/null
+++ b/packages/block-editor/src/components/provider/use-media-upload-settings.js
@@ -0,0 +1,25 @@
+/**
+ * WordPress dependencies
+ */
+import { useMemo } from '@wordpress/element';
+
+/**
+ * React hook used to compute the media upload settings to use in the post editor.
+ *
+ * @param {Object} settings Media upload settings prop.
+ *
+ * @return {Object} Media upload settings.
+ */
+function useMediaUploadSettings( settings ) {
+ return useMemo(
+ () => ( {
+ mediaUpload: settings.mediaUpload,
+ mediaSideload: settings.mediaSideload,
+ maxUploadFileSize: settings.maxUploadFileSize,
+ allowedMimeTypes: settings.allowedMimeTypes,
+ } ),
+ [ settings ]
+ );
+}
+
+export default useMediaUploadSettings;
diff --git a/packages/block-editor/src/store/private-actions.js b/packages/block-editor/src/store/private-actions.js
index e79833e0a73da..f085eb2807c6f 100644
--- a/packages/block-editor/src/store/private-actions.js
+++ b/packages/block-editor/src/store/private-actions.js
@@ -26,6 +26,7 @@ const castArray = ( maybeArray ) =>
const privateSettings = [
'inserterMediaCategories',
'blockInspectorAnimation',
+ 'mediaSideload',
];
/**
diff --git a/packages/editor/README.md b/packages/editor/README.md
index 3211e6664256d..c006ec097982c 100644
--- a/packages/editor/README.md
+++ b/packages/editor/README.md
@@ -499,6 +499,7 @@ _Parameters_
- _$0.maxUploadFileSize_ `?number`: Maximum upload size in bytes allowed for the site.
- _$0.onError_ `Function`: Function called when an error happens.
- _$0.onFileChange_ `Function`: Function called each time a file or a temporary representation of the file is available.
+- _$0.onSuccess_ `Function`: Function called after the final representation of the file is available.
### MediaUploadCheck
diff --git a/packages/editor/src/components/provider/use-block-editor-settings.js b/packages/editor/src/components/provider/use-block-editor-settings.js
index f5c45f431e2c8..d0c2e36d47443 100644
--- a/packages/editor/src/components/provider/use-block-editor-settings.js
+++ b/packages/editor/src/components/provider/use-block-editor-settings.js
@@ -23,6 +23,7 @@ import {
*/
import inserterMediaCategories from '../media-categories';
import { mediaUpload } from '../../utils';
+import { default as mediaSideload } from '../../utils/media-sideload';
import { store as editorStore } from '../../store';
import { unlock } from '../../lock-unlock';
import { useGlobalStylesContext } from '../global-styles-provider';
@@ -45,6 +46,7 @@ const BLOCK_EDITOR_SETTINGS = [
'__experimentalGlobalStylesBaseStyles',
'alignWide',
'blockInspectorTabs',
+ 'maxUploadFileSize',
'allowedMimeTypes',
'bodyPlaceholder',
'canLockBlocks',
@@ -290,6 +292,7 @@ function useBlockEditorSettings( settings, postType, postId, renderingMode ) {
isDistractionFree,
keepCaretInsideBlock,
mediaUpload: hasUploadPermissions ? mediaUpload : undefined,
+ mediaSideload: hasUploadPermissions ? mediaSideload : undefined,
__experimentalBlockPatterns: blockPatterns,
[ selectBlockPatternsKey ]: ( select ) => {
const { hasFinishedResolution, getBlockPatternsForPostType } =
diff --git a/packages/editor/src/utils/media-sideload/index.js b/packages/editor/src/utils/media-sideload/index.js
new file mode 100644
index 0000000000000..86fcdc688abf8
--- /dev/null
+++ b/packages/editor/src/utils/media-sideload/index.js
@@ -0,0 +1,13 @@
+/**
+ * WordPress dependencies
+ */
+import { privateApis } from '@wordpress/media-utils';
+
+/**
+ * Internal dependencies
+ */
+import { unlock } from '../../lock-unlock';
+
+const { sideloadMedia: mediaSideload } = unlock( privateApis );
+
+export default mediaSideload;
diff --git a/packages/editor/src/utils/media-sideload/index.native.js b/packages/editor/src/utils/media-sideload/index.native.js
new file mode 100644
index 0000000000000..d84a912ec92de
--- /dev/null
+++ b/packages/editor/src/utils/media-sideload/index.native.js
@@ -0,0 +1 @@
+export default function mediaSideload() {}
diff --git a/packages/editor/src/utils/media-upload/index.js b/packages/editor/src/utils/media-upload/index.js
index 6b39db2443cc3..0d970d91ce745 100644
--- a/packages/editor/src/utils/media-upload/index.js
+++ b/packages/editor/src/utils/media-upload/index.js
@@ -27,6 +27,7 @@ const noop = () => {};
* @param {?number} $0.maxUploadFileSize Maximum upload size in bytes allowed for the site.
* @param {Function} $0.onError Function called when an error happens.
* @param {Function} $0.onFileChange Function called each time a file or a temporary representation of the file is available.
+ * @param {Function} $0.onSuccess Function called after the final representation of the file is available.
*/
export default function mediaUpload( {
additionalData = {},
@@ -35,6 +36,7 @@ export default function mediaUpload( {
maxUploadFileSize,
onError = noop,
onFileChange,
+ onSuccess,
} ) {
const { getCurrentPost, getEditorSettings } = select( editorStore );
const {
@@ -77,8 +79,9 @@ export default function mediaUpload( {
} else {
clearSaveLock();
}
- onFileChange( file );
+ onFileChange?.( file );
},
+ onSuccess,
additionalData: {
...postData,
...additionalData,
diff --git a/packages/media-utils/src/utils/types.ts b/packages/media-utils/src/utils/types.ts
index c91d4c67cfc46..c4c6882ea2532 100644
--- a/packages/media-utils/src/utils/types.ts
+++ b/packages/media-utils/src/utils/types.ts
@@ -199,7 +199,6 @@ export type Attachment = BetterOmit<
};
export type OnChangeHandler = ( attachments: Partial< Attachment >[] ) => void;
-export type OnSuccessHandler = ( attachments: Partial< Attachment >[] ) => void;
export type OnErrorHandler = ( error: Error ) => void;
export type CreateRestAttachment = Partial< RestAttachment >;
diff --git a/packages/media-utils/src/utils/upload-media.ts b/packages/media-utils/src/utils/upload-media.ts
index 1bc861cfb3b60..ff3f718076512 100644
--- a/packages/media-utils/src/utils/upload-media.ts
+++ b/packages/media-utils/src/utils/upload-media.ts
@@ -12,7 +12,6 @@ import type {
Attachment,
OnChangeHandler,
OnErrorHandler,
- OnSuccessHandler,
} from './types';
import { uploadToServer } from './upload-to-server';
import { validateMimeType } from './validate-mime-type';
@@ -20,6 +19,12 @@ import { validateMimeTypeForUser } from './validate-mime-type-for-user';
import { validateFileSize } from './validate-file-size';
import { UploadError } from './upload-error';
+declare global {
+ interface Window {
+ __experimentalMediaProcessing?: boolean;
+ }
+}
+
interface UploadMediaArgs {
// Additional data to include in the request.
additionalData?: AdditionalData;
@@ -33,8 +38,6 @@ interface UploadMediaArgs {
onError?: OnErrorHandler;
// Function called each time a file or a temporary representation of the file is available.
onFileChange?: OnChangeHandler;
- // Function called once a file has completely finished uploading, including thumbnails.
- onSuccess?: OnSuccessHandler;
// List of allowed mime types and file extensions.
wpAllowedMimeTypes?: Record< string, string > | null;
// Abort signal.
@@ -69,8 +72,11 @@ export function uploadMedia( {
const filesSet: Array< Partial< Attachment > | null > = [];
const setAndUpdateFiles = ( index: number, value: Attachment | null ) => {
- if ( filesSet[ index ]?.url ) {
- revokeBlobURL( filesSet[ index ].url );
+ // For client-side media processing, this is handled by the upload-media package.
+ if ( ! window.__experimentalMediaProcessing ) {
+ if ( filesSet[ index ]?.url ) {
+ revokeBlobURL( filesSet[ index ].url );
+ }
}
filesSet[ index ] = value;
onFileChange?.(
@@ -107,10 +113,13 @@ export function uploadMedia( {
validFiles.push( mediaFile );
- // Set temporary URL to create placeholder media file, this is replaced
- // with final file from media gallery when upload is `done` below.
- filesSet.push( { url: createBlobURL( mediaFile ) } );
- onFileChange?.( filesSet as Array< Partial< Attachment > > );
+ // For client-side media processing, this is handled by the upload-media package.
+ if ( ! window.__experimentalMediaProcessing ) {
+ // Set temporary URL to create placeholder media file, this is replaced
+ // with final file from media gallery when upload is `done` below.
+ filesSet.push( { url: createBlobURL( mediaFile ) } );
+ onFileChange?.( filesSet as Array< Partial< Attachment > > );
+ }
}
validFiles.map( async ( file, index ) => {
diff --git a/packages/private-apis/src/implementation.ts b/packages/private-apis/src/implementation.ts
index 5a5fb3f39fa18..1ac08a71550ff 100644
--- a/packages/private-apis/src/implementation.ts
+++ b/packages/private-apis/src/implementation.ts
@@ -32,6 +32,7 @@ const CORE_MODULES_USING_PRIVATE_APIS = [
'@wordpress/dataviews',
'@wordpress/fields',
'@wordpress/media-utils',
+ '@wordpress/upload-media',
];
/**
diff --git a/packages/upload-media/CHANGELOG.md b/packages/upload-media/CHANGELOG.md
new file mode 100644
index 0000000000000..e04ce921cdfdc
--- /dev/null
+++ b/packages/upload-media/CHANGELOG.md
@@ -0,0 +1,5 @@
+
+
+## Unreleased
+
+Initial release.
diff --git a/packages/upload-media/README.md b/packages/upload-media/README.md
new file mode 100644
index 0000000000000..982e59148fe87
--- /dev/null
+++ b/packages/upload-media/README.md
@@ -0,0 +1,136 @@
+# (Experimental) Upload Media
+
+This module is a media upload handler with a queue-like system that is implemented using a custom `@wordpress/data` store.
+
+Such a system is useful for additional client-side processing of media files (e.g. image compression) before uploading them to a server.
+
+It is typically used by `@wordpress/block-editor` but can also be leveraged outside of it.
+
+## Installation
+
+Install the module
+
+```bash
+npm install @wordpress/upload-media --save
+```
+
+## Usage
+
+This is a basic example of how one can interact with the upload data store:
+
+```js
+import { store as uploadStore } from '@wordpress/upload-media';
+import { dispatch } from '@wordpress/data';
+
+dispatch( uploadStore ).updateSettings( /* ... */ );
+dispatch( uploadStore ).addItems( [
+ /* ... */
+] );
+```
+
+Refer to the API reference below or the TypeScript types for further help.
+
+## API Reference
+
+### Actions
+
+The following set of dispatching action creators are available on the object returned by `wp.data.dispatch( 'core/upload-media' )`:
+
+
+
+#### addItems
+
+Adds a new item to the upload queue.
+
+_Parameters_
+
+- _$0_ `AddItemsArgs`:
+- _$0.files_ `AddItemsArgs[ 'files' ]`: Files
+- _$0.onChange_ `[AddItemsArgs[ 'onChange' ]]`: Function called each time a file or a temporary representation of the file is available.
+- _$0.onSuccess_ `[AddItemsArgs[ 'onSuccess' ]]`: Function called after the file is uploaded.
+- _$0.onBatchSuccess_ `[AddItemsArgs[ 'onBatchSuccess' ]]`: Function called after a batch of files is uploaded.
+- _$0.onError_ `[AddItemsArgs[ 'onError' ]]`: Function called when an error happens.
+- _$0.additionalData_ `[AddItemsArgs[ 'additionalData' ]]`: Additional data to include in the request.
+- _$0.allowedTypes_ `[AddItemsArgs[ 'allowedTypes' ]]`: Array with the types of media that can be uploaded, if unset all types are allowed.
+
+#### cancelItem
+
+Cancels an item in the queue based on an error.
+
+_Parameters_
+
+- _id_ `QueueItemId`: Item ID.
+- _error_ `Error`: Error instance.
+- _silent_ Whether to cancel the item silently, without invoking its `onError` callback.
+
+
+
+### Selectors
+
+The following selectors are available on the object returned by `wp.data.select( 'core/upload-media' )`:
+
+
+
+#### getItems
+
+Returns all items currently being uploaded.
+
+_Parameters_
+
+- _state_ `State`: Upload state.
+
+_Returns_
+
+- `QueueItem[]`: Queue items.
+
+#### getSettings
+
+Returns the media upload settings.
+
+_Parameters_
+
+- _state_ `State`: Upload state.
+
+_Returns_
+
+- `Settings`: Settings
+
+#### isUploading
+
+Determines whether any upload is currently in progress.
+
+_Parameters_
+
+- _state_ `State`: Upload state.
+
+_Returns_
+
+- `boolean`: Whether any upload is currently in progress.
+
+#### isUploadingById
+
+Determines whether an upload is currently in progress given an attachment ID.
+
+_Parameters_
+
+- _state_ `State`: Upload state.
+- _attachmentId_ `number`: Attachment ID.
+
+_Returns_
+
+- `boolean`: Whether upload is currently in progress for the given attachment.
+
+#### isUploadingByUrl
+
+Determines whether an upload is currently in progress given an attachment URL.
+
+_Parameters_
+
+- _state_ `State`: Upload state.
+- _url_ `string`: Attachment URL.
+
+_Returns_
+
+- `boolean`: Whether upload is currently in progress for the given attachment.
+
+
diff --git a/packages/upload-media/package.json b/packages/upload-media/package.json
new file mode 100644
index 0000000000000..ec7eaabbb3940
--- /dev/null
+++ b/packages/upload-media/package.json
@@ -0,0 +1,45 @@
+{
+ "name": "@wordpress/upload-media",
+ "version": "1.0.0-prerelease",
+ "private": true,
+ "description": "Core media upload logic.",
+ "author": "The WordPress Contributors",
+ "license": "GPL-2.0-or-later",
+ "keywords": [
+ "wordpress",
+ "media"
+ ],
+ "homepage": "https://github.com/WordPress/gutenberg/tree/HEAD/packages/upload-media/README.md",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/WordPress/gutenberg.git",
+ "directory": "packages/upload-media"
+ },
+ "bugs": {
+ "url": "https://github.com/WordPress/gutenberg/issues"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "main": "build/index.js",
+ "module": "build-module/index.js",
+ "wpScript": true,
+ "types": "build-types",
+ "dependencies": {
+ "@shopify/web-worker": "^6.4.0",
+ "@wordpress/api-fetch": "file:../api-fetch",
+ "@wordpress/blob": "file:../blob",
+ "@wordpress/compose": "file:../compose",
+ "@wordpress/data": "file:../data",
+ "@wordpress/element": "file:../element",
+ "@wordpress/i18n": "file:../i18n",
+ "@wordpress/preferences": "file:../preferences",
+ "@wordpress/private-apis": "file:../private-apis",
+ "@wordpress/url": "file:../url",
+ "uuid": "^9.0.1"
+ },
+ "publishConfig": {
+ "access": "public"
+ }
+}
diff --git a/packages/upload-media/src/components/provider/index.tsx b/packages/upload-media/src/components/provider/index.tsx
new file mode 100644
index 0000000000000..0bc187e6a1d86
--- /dev/null
+++ b/packages/upload-media/src/components/provider/index.tsx
@@ -0,0 +1,25 @@
+/**
+ * WordPress dependencies
+ */
+import { useEffect } from '@wordpress/element';
+import { useDispatch } from '@wordpress/data';
+
+/**
+ * Internal dependencies
+ */
+import withRegistryProvider from './with-registry-provider';
+import { unlock } from '../../lock-unlock';
+import { store as uploadStore } from '../../store';
+
+const MediaUploadProvider = withRegistryProvider( ( props: any ) => {
+ const { children, settings } = props;
+ const { updateSettings } = unlock( useDispatch( uploadStore ) );
+
+ useEffect( () => {
+ updateSettings( settings );
+ }, [ settings, updateSettings ] );
+
+ return <>{ children }>;
+} );
+
+export default MediaUploadProvider;
diff --git a/packages/upload-media/src/components/provider/with-registry-provider.tsx b/packages/upload-media/src/components/provider/with-registry-provider.tsx
new file mode 100644
index 0000000000000..9a47a5601d33e
--- /dev/null
+++ b/packages/upload-media/src/components/provider/with-registry-provider.tsx
@@ -0,0 +1,59 @@
+/**
+ * WordPress dependencies
+ */
+import { useState } from '@wordpress/element';
+import { useRegistry, createRegistry, RegistryProvider } from '@wordpress/data';
+import { createHigherOrderComponent } from '@wordpress/compose';
+
+/**
+ * Internal dependencies
+ */
+import { storeConfig } from '../../store';
+import { STORE_NAME as mediaUploadStoreName } from '../../store/constants';
+
+type WPDataRegistry = ReturnType< typeof createRegistry >;
+
+function getSubRegistry(
+ subRegistries: WeakMap< WPDataRegistry, WPDataRegistry >,
+ registry: WPDataRegistry,
+ useSubRegistry: boolean
+) {
+ if ( ! useSubRegistry ) {
+ return registry;
+ }
+ let subRegistry = subRegistries.get( registry );
+ if ( ! subRegistry ) {
+ subRegistry = createRegistry( {}, registry );
+ subRegistry.registerStore( mediaUploadStoreName, storeConfig );
+ subRegistries.set( registry, subRegistry );
+ }
+ return subRegistry;
+}
+
+const withRegistryProvider = createHigherOrderComponent(
+ ( WrappedComponent ) =>
+ ( { useSubRegistry = true, ...props } ) => {
+ const registry = useRegistry() as unknown as WPDataRegistry;
+ const [ subRegistries ] = useState<
+ WeakMap< WPDataRegistry, WPDataRegistry >
+ >( () => new WeakMap() );
+ const subRegistry = getSubRegistry(
+ subRegistries,
+ registry,
+ useSubRegistry
+ );
+
+ if ( subRegistry === registry ) {
+ return ;
+ }
+
+ return (
+
+
+
+ );
+ },
+ 'withRegistryProvider'
+);
+
+export default withRegistryProvider;
diff --git a/packages/upload-media/src/get-mime-types-array.ts b/packages/upload-media/src/get-mime-types-array.ts
new file mode 100644
index 0000000000000..d4940d36cd6ae
--- /dev/null
+++ b/packages/upload-media/src/get-mime-types-array.ts
@@ -0,0 +1,29 @@
+/**
+ * Browsers may use unexpected mime types, and they differ from browser to browser.
+ * This function computes a flexible array of mime types from the mime type structured provided by the server.
+ * Converts { jpg|jpeg|jpe: "image/jpeg" } into [ "image/jpeg", "image/jpg", "image/jpeg", "image/jpe" ]
+ *
+ * @param {?Object} wpMimeTypesObject Mime type object received from the server.
+ * Extensions are keys separated by '|' and values are mime types associated with an extension.
+ *
+ * @return An array of mime types or null
+ */
+export function getMimeTypesArray(
+ wpMimeTypesObject?: Record< string, string > | null
+) {
+ if ( ! wpMimeTypesObject ) {
+ return null;
+ }
+ return Object.entries( wpMimeTypesObject ).flatMap(
+ ( [ extensionsString, mime ] ) => {
+ const [ type ] = mime.split( '/' );
+ const extensions = extensionsString.split( '|' );
+ return [
+ mime,
+ ...extensions.map(
+ ( extension ) => `${ type }/${ extension }`
+ ),
+ ];
+ }
+ );
+}
diff --git a/packages/upload-media/src/image-file.ts b/packages/upload-media/src/image-file.ts
new file mode 100644
index 0000000000000..2c1a43ee1ab67
--- /dev/null
+++ b/packages/upload-media/src/image-file.ts
@@ -0,0 +1,38 @@
+/**
+ * ImageFile class.
+ *
+ * Small wrapper around the `File` class to hold
+ * information about current dimensions and original
+ * dimensions, in case the image was resized.
+ */
+export class ImageFile extends File {
+ width = 0;
+ height = 0;
+ originalWidth? = 0;
+ originalHeight? = 0;
+
+ get wasResized() {
+ return (
+ ( this.originalWidth || 0 ) > this.width ||
+ ( this.originalHeight || 0 ) > this.height
+ );
+ }
+
+ constructor(
+ file: File,
+ width: number,
+ height: number,
+ originalWidth?: number,
+ originalHeight?: number
+ ) {
+ super( [ file ], file.name, {
+ type: file.type,
+ lastModified: file.lastModified,
+ } );
+
+ this.width = width;
+ this.height = height;
+ this.originalWidth = originalWidth;
+ this.originalHeight = originalHeight;
+ }
+}
diff --git a/packages/upload-media/src/index.ts b/packages/upload-media/src/index.ts
new file mode 100644
index 0000000000000..d105c2dba9039
--- /dev/null
+++ b/packages/upload-media/src/index.ts
@@ -0,0 +1,11 @@
+/**
+ * Internal dependencies
+ */
+import { store as uploadStore } from './store';
+
+export { uploadStore as store };
+
+export { default as MediaUploadProvider } from './components/provider';
+export { UploadError } from './upload-error';
+
+export type { ImageFormat } from './store/types';
diff --git a/packages/upload-media/src/lock-unlock.ts b/packages/upload-media/src/lock-unlock.ts
new file mode 100644
index 0000000000000..5089cb80e4bb4
--- /dev/null
+++ b/packages/upload-media/src/lock-unlock.ts
@@ -0,0 +1,10 @@
+/**
+ * WordPress dependencies
+ */
+import { __dangerousOptInToUnstableAPIsOnlyForCoreModules } from '@wordpress/private-apis';
+
+export const { lock, unlock } =
+ __dangerousOptInToUnstableAPIsOnlyForCoreModules(
+ 'I acknowledge private features are not for use in themes or plugins and doing so will break in the next version of WordPress.',
+ '@wordpress/upload-media'
+ );
diff --git a/packages/upload-media/src/store/actions.ts b/packages/upload-media/src/store/actions.ts
new file mode 100644
index 0000000000000..4cc3c3e31ae0e
--- /dev/null
+++ b/packages/upload-media/src/store/actions.ts
@@ -0,0 +1,183 @@
+/**
+ * External dependencies
+ */
+import { v4 as uuidv4 } from 'uuid';
+
+/**
+ * WordPress dependencies
+ */
+import type { createRegistry } from '@wordpress/data';
+
+type WPDataRegistry = ReturnType< typeof createRegistry >;
+
+/**
+ * Internal dependencies
+ */
+import type {
+ AdditionalData,
+ CancelAction,
+ OnBatchSuccessHandler,
+ OnChangeHandler,
+ OnErrorHandler,
+ OnSuccessHandler,
+ QueueItemId,
+ State,
+} from './types';
+import { Type } from './types';
+import type {
+ addItem,
+ processItem,
+ removeItem,
+ revokeBlobUrls,
+} from './private-actions';
+import { validateMimeType } from '../validate-mime-type';
+import { validateMimeTypeForUser } from '../validate-mime-type-for-user';
+import { validateFileSize } from '../validate-file-size';
+
+type ActionCreators = {
+ addItem: typeof addItem;
+ addItems: typeof addItems;
+ removeItem: typeof removeItem;
+ processItem: typeof processItem;
+ cancelItem: typeof cancelItem;
+ revokeBlobUrls: typeof revokeBlobUrls;
+ < T = Record< string, unknown > >( args: T ): void;
+};
+
+type AllSelectors = typeof import('./selectors') &
+ typeof import('./private-selectors');
+type CurriedState< F > = F extends ( state: State, ...args: infer P ) => infer R
+ ? ( ...args: P ) => R
+ : F;
+type Selectors = {
+ [ key in keyof AllSelectors ]: CurriedState< AllSelectors[ key ] >;
+};
+
+type ThunkArgs = {
+ select: Selectors;
+ dispatch: ActionCreators;
+ registry: WPDataRegistry;
+};
+
+interface AddItemsArgs {
+ files: File[];
+ onChange?: OnChangeHandler;
+ onSuccess?: OnSuccessHandler;
+ onBatchSuccess?: OnBatchSuccessHandler;
+ onError?: OnErrorHandler;
+ additionalData?: AdditionalData;
+ allowedTypes?: string[];
+}
+
+/**
+ * Adds a new item to the upload queue.
+ *
+ * @param $0
+ * @param $0.files Files
+ * @param [$0.onChange] Function called each time a file or a temporary representation of the file is available.
+ * @param [$0.onSuccess] Function called after the file is uploaded.
+ * @param [$0.onBatchSuccess] Function called after a batch of files is uploaded.
+ * @param [$0.onError] Function called when an error happens.
+ * @param [$0.additionalData] Additional data to include in the request.
+ * @param [$0.allowedTypes] Array with the types of media that can be uploaded, if unset all types are allowed.
+ */
+export function addItems( {
+ files,
+ onChange,
+ onSuccess,
+ onError,
+ onBatchSuccess,
+ additionalData,
+ allowedTypes,
+}: AddItemsArgs ) {
+ return async ( { select, dispatch }: ThunkArgs ) => {
+ const batchId = uuidv4();
+ for ( const file of files ) {
+ /*
+ Check if the caller (e.g. a block) supports this mime type.
+ Special case for file types such as HEIC which will be converted before upload anyway.
+ Another check will be done before upload.
+ */
+ try {
+ validateMimeType( file, allowedTypes );
+ validateMimeTypeForUser(
+ file,
+ select.getSettings().allowedMimeTypes
+ );
+ } catch ( error: unknown ) {
+ onError?.( error as Error );
+ continue;
+ }
+
+ try {
+ validateFileSize(
+ file,
+ select.getSettings().maxUploadFileSize
+ );
+ } catch ( error: unknown ) {
+ onError?.( error as Error );
+ continue;
+ }
+
+ dispatch.addItem( {
+ file,
+ batchId,
+ onChange,
+ onSuccess,
+ onBatchSuccess,
+ onError,
+ additionalData,
+ } );
+ }
+ };
+}
+
+/**
+ * Cancels an item in the queue based on an error.
+ *
+ * @param id Item ID.
+ * @param error Error instance.
+ * @param silent Whether to cancel the item silently,
+ * without invoking its `onError` callback.
+ */
+export function cancelItem( id: QueueItemId, error: Error, silent = false ) {
+ return async ( { select, dispatch }: ThunkArgs ) => {
+ const item = select.getItem( id );
+
+ if ( ! item ) {
+ /*
+ * Do nothing if item has already been removed.
+ * This can happen if an upload is cancelled manually
+ * while transcoding with vips is still in progress.
+ * Then, cancelItem() is once invoked manually and once
+ * by the error handler in optimizeImageItem().
+ */
+ return;
+ }
+
+ item.abortController?.abort();
+
+ if ( ! silent ) {
+ const { onError } = item;
+ onError?.( error ?? new Error( 'Upload cancelled' ) );
+ if ( ! onError && error ) {
+ // TODO: Find better way to surface errors with sideloads etc.
+ // eslint-disable-next-line no-console -- Deliberately log errors here.
+ console.error( 'Upload cancelled', error );
+ }
+ }
+
+ dispatch< CancelAction >( {
+ type: Type.Cancel,
+ id,
+ error,
+ } );
+ dispatch.removeItem( id );
+ dispatch.revokeBlobUrls( id );
+
+ // All items of this batch were cancelled or finished.
+ if ( item.batchId && select.isBatchUploaded( item.batchId ) ) {
+ item.onBatchSuccess?.();
+ }
+ };
+}
diff --git a/packages/upload-media/src/store/constants.ts b/packages/upload-media/src/store/constants.ts
new file mode 100644
index 0000000000000..ad0960cf62f46
--- /dev/null
+++ b/packages/upload-media/src/store/constants.ts
@@ -0,0 +1 @@
+export const STORE_NAME = 'core/upload-media';
diff --git a/packages/upload-media/src/store/index.ts b/packages/upload-media/src/store/index.ts
new file mode 100644
index 0000000000000..c74f59ea7a7cf
--- /dev/null
+++ b/packages/upload-media/src/store/index.ts
@@ -0,0 +1,43 @@
+/**
+ * WordPress dependencies
+ */
+import { createReduxStore, register } from '@wordpress/data';
+
+/**
+ * Internal dependencies
+ */
+import reducer from './reducer';
+import * as selectors from './selectors';
+import * as privateSelectors from './private-selectors';
+import * as actions from './actions';
+import * as privateActions from './private-actions';
+import { unlock } from '../lock-unlock';
+import { STORE_NAME } from './constants';
+
+/**
+ * Media upload data store configuration.
+ *
+ * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/data/README.md#registerStore
+ */
+export const storeConfig = {
+ reducer,
+ selectors,
+ actions,
+};
+
+/**
+ * Store definition for the media upload namespace.
+ *
+ * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/data/README.md#createReduxStore
+ */
+export const store = createReduxStore( STORE_NAME, {
+ reducer,
+ selectors,
+ actions,
+} );
+
+register( store );
+// @ts-ignore
+unlock( store ).registerPrivateActions( privateActions );
+// @ts-ignore
+unlock( store ).registerPrivateSelectors( privateSelectors );
diff --git a/packages/upload-media/src/store/private-actions.ts b/packages/upload-media/src/store/private-actions.ts
new file mode 100644
index 0000000000000..a4d4ee7b99c78
--- /dev/null
+++ b/packages/upload-media/src/store/private-actions.ts
@@ -0,0 +1,407 @@
+/**
+ * External dependencies
+ */
+import { v4 as uuidv4 } from 'uuid';
+
+/**
+ * WordPress dependencies
+ */
+import { createBlobURL, isBlobURL, revokeBlobURL } from '@wordpress/blob';
+import type { createRegistry } from '@wordpress/data';
+
+type WPDataRegistry = ReturnType< typeof createRegistry >;
+
+/**
+ * Internal dependencies
+ */
+import { cloneFile, convertBlobToFile } from '../utils';
+import { StubFile } from '../stub-file';
+import type {
+ AddAction,
+ AdditionalData,
+ AddOperationsAction,
+ BatchId,
+ CacheBlobUrlAction,
+ OnBatchSuccessHandler,
+ OnChangeHandler,
+ OnErrorHandler,
+ OnSuccessHandler,
+ Operation,
+ OperationFinishAction,
+ OperationStartAction,
+ PauseQueueAction,
+ QueueItem,
+ QueueItemId,
+ ResumeQueueAction,
+ RevokeBlobUrlsAction,
+ Settings,
+ State,
+ UpdateSettingsAction,
+} from './types';
+import { ItemStatus, OperationType, Type } from './types';
+import type { cancelItem } from './actions';
+
+type ActionCreators = {
+ cancelItem: typeof cancelItem;
+ addItem: typeof addItem;
+ removeItem: typeof removeItem;
+ prepareItem: typeof prepareItem;
+ processItem: typeof processItem;
+ finishOperation: typeof finishOperation;
+ uploadItem: typeof uploadItem;
+ revokeBlobUrls: typeof revokeBlobUrls;
+ < T = Record< string, unknown > >( args: T ): void;
+};
+
+type AllSelectors = typeof import('./selectors') &
+ typeof import('./private-selectors');
+type CurriedState< F > = F extends ( state: State, ...args: infer P ) => infer R
+ ? ( ...args: P ) => R
+ : F;
+type Selectors = {
+ [ key in keyof AllSelectors ]: CurriedState< AllSelectors[ key ] >;
+};
+
+type ThunkArgs = {
+ select: Selectors;
+ dispatch: ActionCreators;
+ registry: WPDataRegistry;
+};
+
+interface AddItemArgs {
+ // It should always be a File, but some consumers might still pass Blobs only.
+ file: File | Blob;
+ batchId?: BatchId;
+ onChange?: OnChangeHandler;
+ onSuccess?: OnSuccessHandler;
+ onError?: OnErrorHandler;
+ onBatchSuccess?: OnBatchSuccessHandler;
+ additionalData?: AdditionalData;
+ sourceUrl?: string;
+ sourceAttachmentId?: number;
+ abortController?: AbortController;
+ operations?: Operation[];
+}
+
+/**
+ * Adds a new item to the upload queue.
+ *
+ * @param $0
+ * @param $0.file File
+ * @param [$0.batchId] Batch ID.
+ * @param [$0.onChange] Function called each time a file or a temporary representation of the file is available.
+ * @param [$0.onSuccess] Function called after the file is uploaded.
+ * @param [$0.onBatchSuccess] Function called after a batch of files is uploaded.
+ * @param [$0.onError] Function called when an error happens.
+ * @param [$0.additionalData] Additional data to include in the request.
+ * @param [$0.sourceUrl] Source URL. Used when importing a file from a URL or optimizing an existing file.
+ * @param [$0.sourceAttachmentId] Source attachment ID. Used when optimizing an existing file for example.
+ * @param [$0.abortController] Abort controller for upload cancellation.
+ * @param [$0.operations] List of operations to perform. Defaults to automatically determined list, based on the file.
+ */
+export function addItem( {
+ file: fileOrBlob,
+ batchId,
+ onChange,
+ onSuccess,
+ onBatchSuccess,
+ onError,
+ additionalData = {} as AdditionalData,
+ sourceUrl,
+ sourceAttachmentId,
+ abortController,
+ operations,
+}: AddItemArgs ) {
+ return async ( { dispatch }: ThunkArgs ) => {
+ const itemId = uuidv4();
+
+ // Hardening in case a Blob is passed instead of a File.
+ // See https://github.com/WordPress/gutenberg/pull/65693 for an example.
+ const file = convertBlobToFile( fileOrBlob );
+
+ let blobUrl;
+
+ // StubFile could be coming from addItemFromUrl().
+ if ( ! ( file instanceof StubFile ) ) {
+ blobUrl = createBlobURL( file );
+ dispatch< CacheBlobUrlAction >( {
+ type: Type.CacheBlobUrl,
+ id: itemId,
+ blobUrl,
+ } );
+ }
+
+ dispatch< AddAction >( {
+ type: Type.Add,
+ item: {
+ id: itemId,
+ batchId,
+ status: ItemStatus.Processing,
+ sourceFile: cloneFile( file ),
+ file,
+ attachment: {
+ url: blobUrl,
+ },
+ additionalData: {
+ convert_format: false,
+ ...additionalData,
+ },
+ onChange,
+ onSuccess,
+ onBatchSuccess,
+ onError,
+ sourceUrl,
+ sourceAttachmentId,
+ abortController: abortController || new AbortController(),
+ operations: Array.isArray( operations )
+ ? operations
+ : [ OperationType.Prepare ],
+ },
+ } );
+
+ dispatch.processItem( itemId );
+ };
+}
+
+/**
+ * Processes a single item in the queue.
+ *
+ * Runs the next operation in line and invokes any callbacks.
+ *
+ * @param id Item ID.
+ */
+export function processItem( id: QueueItemId ) {
+ return async ( { select, dispatch }: ThunkArgs ) => {
+ if ( select.isPaused() ) {
+ return;
+ }
+
+ const item = select.getItem( id ) as QueueItem;
+
+ const { attachment, onChange, onSuccess, onBatchSuccess, batchId } =
+ item;
+
+ const operation = Array.isArray( item.operations?.[ 0 ] )
+ ? item.operations[ 0 ][ 0 ]
+ : item.operations?.[ 0 ];
+
+ if ( attachment ) {
+ onChange?.( [ attachment ] );
+ }
+
+ /*
+ If there are no more operations, the item can be removed from the queue,
+ but only if there are no thumbnails still being side-loaded,
+ or if itself is a side-loaded item.
+ */
+
+ if ( ! operation ) {
+ if ( attachment ) {
+ onSuccess?.( [ attachment ] );
+ }
+
+ // dispatch.removeItem( id );
+ dispatch.revokeBlobUrls( id );
+
+ if ( batchId && select.isBatchUploaded( batchId ) ) {
+ onBatchSuccess?.();
+ }
+
+ /*
+ At this point we are dealing with a parent whose children haven't fully uploaded yet.
+ Do nothing and let the removal happen once the last side-loaded item finishes.
+ */
+
+ return;
+ }
+
+ if ( ! operation ) {
+ // This shouldn't really happen.
+ return;
+ }
+
+ dispatch< OperationStartAction >( {
+ type: Type.OperationStart,
+ id,
+ operation,
+ } );
+
+ switch ( operation ) {
+ case OperationType.Prepare:
+ dispatch.prepareItem( item.id );
+ break;
+
+ case OperationType.Upload:
+ dispatch.uploadItem( id );
+ break;
+ }
+ };
+}
+
+/**
+ * Returns an action object that pauses all processing in the queue.
+ *
+ * Useful for testing purposes.
+ *
+ * @return Action object.
+ */
+export function pauseQueue(): PauseQueueAction {
+ return {
+ type: Type.PauseQueue,
+ };
+}
+
+/**
+ * Resumes all processing in the queue.
+ *
+ * Dispatches an action object for resuming the queue itself,
+ * and triggers processing for each remaining item in the queue individually.
+ */
+export function resumeQueue() {
+ return async ( { select, dispatch }: ThunkArgs ) => {
+ dispatch< ResumeQueueAction >( {
+ type: Type.ResumeQueue,
+ } );
+
+ for ( const item of select.getAllItems() ) {
+ dispatch.processItem( item.id );
+ }
+ };
+}
+
+/**
+ * Removes a specific item from the queue.
+ *
+ * @param id Item ID.
+ */
+export function removeItem( id: QueueItemId ) {
+ return async ( { select, dispatch }: ThunkArgs ) => {
+ const item = select.getItem( id );
+ if ( ! item ) {
+ return;
+ }
+
+ dispatch( {
+ type: Type.Remove,
+ id,
+ } );
+ };
+}
+
+/**
+ * Finishes an operation for a given item ID and immediately triggers processing the next one.
+ *
+ * @param id Item ID.
+ * @param updates Updated item data.
+ */
+export function finishOperation(
+ id: QueueItemId,
+ updates: Partial< QueueItem >
+) {
+ return async ( { dispatch }: ThunkArgs ) => {
+ dispatch< OperationFinishAction >( {
+ type: Type.OperationFinish,
+ id,
+ item: updates,
+ } );
+
+ dispatch.processItem( id );
+ };
+}
+
+/**
+ * Prepares an item for initial processing.
+ *
+ * Determines the list of operations to perform for a given image,
+ * depending on its media type.
+ *
+ * For example, HEIF images first need to be converted, resized,
+ * compressed, and then uploaded.
+ *
+ * Or videos need to be compressed, and then need poster generation
+ * before upload.
+ *
+ * @param id Item ID.
+ */
+export function prepareItem( id: QueueItemId ) {
+ return async ( { dispatch }: ThunkArgs ) => {
+ const operations: Operation[] = [ OperationType.Upload ];
+
+ dispatch< AddOperationsAction >( {
+ type: Type.AddOperations,
+ id,
+ operations,
+ } );
+
+ dispatch.finishOperation( id, {} );
+ };
+}
+
+/**
+ * Uploads an item to the server.
+ *
+ * @param id Item ID.
+ */
+export function uploadItem( id: QueueItemId ) {
+ return async ( { select, dispatch }: ThunkArgs ) => {
+ const item = select.getItem( id ) as QueueItem;
+
+ select.getSettings().mediaUpload( {
+ filesList: [ item.file ],
+ additionalData: item.additionalData,
+ signal: item.abortController?.signal,
+ onFileChange: ( [ attachment ] ) => {
+ if ( ! isBlobURL( attachment.url ) ) {
+ dispatch.finishOperation( id, {
+ attachment,
+ } );
+ }
+ },
+ onSuccess: ( [ attachment ] ) => {
+ dispatch.finishOperation( id, {
+ attachment,
+ } );
+ },
+ onError: ( error ) => {
+ dispatch.cancelItem( id, error );
+ },
+ } );
+ };
+}
+
+/**
+ * Revokes all blob URLs for a given item, freeing up memory.
+ *
+ * @param id Item ID.
+ */
+export function revokeBlobUrls( id: QueueItemId ) {
+ return async ( { select, dispatch }: ThunkArgs ) => {
+ const blobUrls = select.getBlobUrls( id );
+
+ for ( const blobUrl of blobUrls ) {
+ revokeBlobURL( blobUrl );
+ }
+
+ dispatch< RevokeBlobUrlsAction >( {
+ type: Type.RevokeBlobUrls,
+ id,
+ } );
+ };
+}
+
+/**
+ * Returns an action object that pauses all processing in the queue.
+ *
+ * Useful for testing purposes.
+ *
+ * @param settings
+ * @return Action object.
+ */
+export function updateSettings(
+ settings: Partial< Settings >
+): UpdateSettingsAction {
+ return {
+ type: Type.UpdateSettings,
+ settings,
+ };
+}
diff --git a/packages/upload-media/src/store/private-selectors.ts b/packages/upload-media/src/store/private-selectors.ts
new file mode 100644
index 0000000000000..f2cfdbef76df8
--- /dev/null
+++ b/packages/upload-media/src/store/private-selectors.ts
@@ -0,0 +1,113 @@
+/**
+ * Internal dependencies
+ */
+import {
+ type BatchId,
+ ItemStatus,
+ OperationType,
+ type QueueItem,
+ type QueueItemId,
+ type State,
+} from './types';
+
+/**
+ * Returns all items currently being uploaded.
+ *
+ * @param state Upload state.
+ *
+ * @return Queue items.
+ */
+export function getAllItems( state: State ): QueueItem[] {
+ return state.queue;
+}
+
+/**
+ * Returns a specific item given its unique ID.
+ *
+ * @param state Upload state.
+ * @param id Item ID.
+ *
+ * @return Queue item.
+ */
+export function getItem(
+ state: State,
+ id: QueueItemId
+): QueueItem | undefined {
+ return state.queue.find( ( item ) => item.id === id );
+}
+
+/**
+ * Determines whether a batch has been successfully uploaded, given its unique ID.
+ *
+ * @param state Upload state.
+ * @param batchId Batch ID.
+ *
+ * @return Whether a batch has been uploaded.
+ */
+export function isBatchUploaded( state: State, batchId: BatchId ): boolean {
+ const batchItems = state.queue.filter(
+ ( item ) => batchId === item.batchId
+ );
+ return batchItems.length === 0;
+}
+
+/**
+ * Determines whether an upload is currently in progress given a post or attachment ID.
+ *
+ * @param state Upload state.
+ * @param postOrAttachmentId Post ID or attachment ID.
+ *
+ * @return Whether upload is currently in progress for the given post or attachment.
+ */
+export function isUploadingToPost(
+ state: State,
+ postOrAttachmentId: number
+): boolean {
+ return state.queue.some(
+ ( item ) =>
+ item.currentOperation === OperationType.Upload &&
+ item.additionalData.post === postOrAttachmentId
+ );
+}
+
+/**
+ * Returns the next paused upload for a given post or attachment ID.
+ *
+ * @param state Upload state.
+ * @param postOrAttachmentId Post ID or attachment ID.
+ *
+ * @return Paused item.
+ */
+export function getPausedUploadForPost(
+ state: State,
+ postOrAttachmentId: number
+): QueueItem | undefined {
+ return state.queue.find(
+ ( item ) =>
+ item.status === ItemStatus.Paused &&
+ item.additionalData.post === postOrAttachmentId
+ );
+}
+
+/**
+ * Determines whether uploading is currently paused.
+ *
+ * @param state Upload state.
+ *
+ * @return Whether uploading is currently paused.
+ */
+export function isPaused( state: State ): boolean {
+ return state.queueStatus === 'paused';
+}
+
+/**
+ * Returns all cached blob URLs for a given item ID.
+ *
+ * @param state Upload state.
+ * @param id Item ID
+ *
+ * @return List of blob URLs.
+ */
+export function getBlobUrls( state: State, id: QueueItemId ): string[] {
+ return state.blobUrls[ id ] || [];
+}
diff --git a/packages/upload-media/src/store/reducer.ts b/packages/upload-media/src/store/reducer.ts
new file mode 100644
index 0000000000000..290a319fcbc1d
--- /dev/null
+++ b/packages/upload-media/src/store/reducer.ts
@@ -0,0 +1,195 @@
+/**
+ * Internal dependencies
+ */
+import {
+ type AddAction,
+ type AddOperationsAction,
+ type CacheBlobUrlAction,
+ type CancelAction,
+ type OperationFinishAction,
+ type OperationStartAction,
+ type PauseQueueAction,
+ type QueueItem,
+ type RemoveAction,
+ type ResumeQueueAction,
+ type RevokeBlobUrlsAction,
+ type State,
+ Type,
+ type UnknownAction,
+ type UpdateSettingsAction,
+} from './types';
+
+const noop = () => {};
+
+const DEFAULT_STATE: State = {
+ queue: [],
+ queueStatus: 'active',
+ blobUrls: {},
+ settings: {
+ mediaUpload: noop,
+ },
+};
+
+type Action =
+ | AddAction
+ | RemoveAction
+ | CancelAction
+ | PauseQueueAction
+ | ResumeQueueAction
+ | AddOperationsAction
+ | OperationFinishAction
+ | OperationStartAction
+ | CacheBlobUrlAction
+ | RevokeBlobUrlsAction
+ | UpdateSettingsAction
+ | UnknownAction;
+
+function reducer(
+ state = DEFAULT_STATE,
+ action: Action = { type: Type.Unknown }
+) {
+ switch ( action.type ) {
+ case Type.PauseQueue: {
+ return {
+ ...state,
+ queueStatus: 'paused',
+ };
+ }
+
+ case Type.ResumeQueue: {
+ return {
+ ...state,
+ queueStatus: 'active',
+ };
+ }
+
+ case Type.Add:
+ return {
+ ...state,
+ queue: [ ...state.queue, action.item ],
+ };
+
+ case Type.Cancel:
+ return {
+ ...state,
+ queue: state.queue.map(
+ ( item ): QueueItem =>
+ item.id === action.id
+ ? {
+ ...item,
+ error: action.error,
+ }
+ : item
+ ),
+ };
+
+ case Type.Remove:
+ return {
+ ...state,
+ queue: state.queue.filter( ( item ) => item.id !== action.id ),
+ };
+
+ case Type.OperationStart: {
+ return {
+ ...state,
+ queue: state.queue.map(
+ ( item ): QueueItem =>
+ item.id === action.id
+ ? {
+ ...item,
+ currentOperation: action.operation,
+ }
+ : item
+ ),
+ };
+ }
+
+ case Type.AddOperations:
+ return {
+ ...state,
+ queue: state.queue.map( ( item ): QueueItem => {
+ if ( item.id !== action.id ) {
+ return item;
+ }
+
+ return {
+ ...item,
+ operations: [
+ ...( item.operations || [] ),
+ ...action.operations,
+ ],
+ };
+ } ),
+ };
+
+ case Type.OperationFinish:
+ return {
+ ...state,
+ queue: state.queue.map( ( item ): QueueItem => {
+ if ( item.id !== action.id ) {
+ return item;
+ }
+
+ const operations = item.operations
+ ? item.operations.slice( 1 )
+ : [];
+
+ // Prevent an empty object if there's no attachment data.
+ const attachment =
+ item.attachment || action.item.attachment
+ ? {
+ ...item.attachment,
+ ...action.item.attachment,
+ }
+ : undefined;
+
+ return {
+ ...item,
+ currentOperation: undefined,
+ operations,
+ ...action.item,
+ attachment,
+ additionalData: {
+ ...item.additionalData,
+ ...action.item.additionalData,
+ },
+ };
+ } ),
+ };
+
+ case Type.CacheBlobUrl: {
+ const blobUrls = state.blobUrls[ action.id ] || [];
+ return {
+ ...state,
+ blobUrls: {
+ ...state.blobUrls,
+ [ action.id ]: [ ...blobUrls, action.blobUrl ],
+ },
+ };
+ }
+
+ case Type.RevokeBlobUrls: {
+ const newBlobUrls = { ...state.blobUrls };
+ delete newBlobUrls[ action.id ];
+
+ return {
+ ...state,
+ blobUrls: newBlobUrls,
+ };
+ }
+
+ case Type.UpdateSettings: {
+ return {
+ ...state,
+ settings: {
+ ...state.settings,
+ ...action.settings,
+ },
+ };
+ }
+ }
+
+ return state;
+}
+
+export default reducer;
diff --git a/packages/upload-media/src/store/selectors.ts b/packages/upload-media/src/store/selectors.ts
new file mode 100644
index 0000000000000..8bcb8c5d63b6a
--- /dev/null
+++ b/packages/upload-media/src/store/selectors.ts
@@ -0,0 +1,67 @@
+/**
+ * Internal dependencies
+ */
+import type { QueueItem, Settings, State } from './types';
+
+/**
+ * Returns all items currently being uploaded.
+ *
+ * @param state Upload state.
+ *
+ * @return Queue items.
+ */
+export function getItems( state: State ): QueueItem[] {
+ return state.queue;
+}
+
+/**
+ * Determines whether any upload is currently in progress.
+ *
+ * @param state Upload state.
+ *
+ * @return Whether any upload is currently in progress.
+ */
+export function isUploading( state: State ): boolean {
+ return state.queue.length >= 1;
+}
+
+/**
+ * Determines whether an upload is currently in progress given an attachment URL.
+ *
+ * @param state Upload state.
+ * @param url Attachment URL.
+ *
+ * @return Whether upload is currently in progress for the given attachment.
+ */
+export function isUploadingByUrl( state: State, url: string ): boolean {
+ return state.queue.some(
+ ( item ) => item.attachment?.url === url || item.sourceUrl === url
+ );
+}
+
+/**
+ * Determines whether an upload is currently in progress given an attachment ID.
+ *
+ * @param state Upload state.
+ * @param attachmentId Attachment ID.
+ *
+ * @return Whether upload is currently in progress for the given attachment.
+ */
+export function isUploadingById( state: State, attachmentId: number ): boolean {
+ return state.queue.some(
+ ( item ) =>
+ item.attachment?.id === attachmentId ||
+ item.sourceAttachmentId === attachmentId
+ );
+}
+
+/**
+ * Returns the media upload settings.
+ *
+ * @param state Upload state.
+ *
+ * @return Settings
+ */
+export function getSettings( state: State ): Settings {
+ return state.settings;
+}
diff --git a/packages/upload-media/src/store/test/actions.ts b/packages/upload-media/src/store/test/actions.ts
new file mode 100644
index 0000000000000..adb38ab27128e
--- /dev/null
+++ b/packages/upload-media/src/store/test/actions.ts
@@ -0,0 +1,112 @@
+/**
+ * WordPress dependencies
+ */
+import { createRegistry } from '@wordpress/data';
+
+type WPDataRegistry = ReturnType< typeof createRegistry >;
+
+/**
+ * Internal dependencies
+ */
+import { store as uploadStore } from '..';
+import { ItemStatus } from '../types';
+import { unlock } from '../../lock-unlock';
+
+jest.mock( '@wordpress/blob', () => ( {
+ __esModule: true,
+ createBlobURL: jest.fn( () => 'blob:foo' ),
+ isBlobURL: jest.fn( ( str: string ) => str.startsWith( 'blob:' ) ),
+ revokeBlobURL: jest.fn(),
+} ) );
+
+function createRegistryWithStores() {
+ // Create a registry and register used stores.
+ const registry = createRegistry();
+ // @ts-ignore
+ [ uploadStore ].forEach( registry.register );
+ return registry;
+}
+
+const jpegFile = new File( [ 'foo' ], 'example.jpg', {
+ lastModified: 1234567891,
+ type: 'image/jpeg',
+} );
+
+const mp4File = new File( [ 'foo' ], 'amazing-video.mp4', {
+ lastModified: 1234567891,
+ type: 'video/mp4',
+} );
+
+describe( 'actions', () => {
+ let registry: WPDataRegistry;
+ beforeEach( () => {
+ registry = createRegistryWithStores();
+ unlock( registry.dispatch( uploadStore ) ).pauseQueue();
+ } );
+
+ describe( 'addItem', () => {
+ it( 'adds an item to the queue', () => {
+ unlock( registry.dispatch( uploadStore ) ).addItem( {
+ file: jpegFile,
+ } );
+
+ expect( registry.select( uploadStore ).getItems() ).toHaveLength(
+ 1
+ );
+ expect(
+ registry.select( uploadStore ).getItems()[ 0 ]
+ ).toStrictEqual(
+ expect.objectContaining( {
+ id: expect.any( String ),
+ file: jpegFile,
+ sourceFile: jpegFile,
+ status: ItemStatus.Processing,
+ attachment: {
+ url: expect.stringMatching( /^blob:/ ),
+ },
+ } )
+ );
+ } );
+ } );
+
+ describe( 'addItems', () => {
+ it( 'adds multiple items to the queue', () => {
+ const onError = jest.fn();
+ registry.dispatch( uploadStore ).addItems( {
+ files: [ jpegFile, mp4File ],
+ onError,
+ } );
+
+ expect( onError ).not.toHaveBeenCalled();
+ expect( registry.select( uploadStore ).getItems() ).toHaveLength(
+ 2
+ );
+ expect(
+ registry.select( uploadStore ).getItems()[ 0 ]
+ ).toStrictEqual(
+ expect.objectContaining( {
+ id: expect.any( String ),
+ file: jpegFile,
+ sourceFile: jpegFile,
+ status: ItemStatus.Processing,
+ attachment: {
+ url: expect.stringMatching( /^blob:/ ),
+ },
+ } )
+ );
+ expect(
+ registry.select( uploadStore ).getItems()[ 1 ]
+ ).toStrictEqual(
+ expect.objectContaining( {
+ id: expect.any( String ),
+ file: mp4File,
+ sourceFile: mp4File,
+ status: ItemStatus.Processing,
+ attachment: {
+ url: expect.stringMatching( /^blob:/ ),
+ },
+ } )
+ );
+ } );
+ } );
+} );
diff --git a/packages/upload-media/src/store/test/reducer.ts b/packages/upload-media/src/store/test/reducer.ts
new file mode 100644
index 0000000000000..80b92e4b14c3d
--- /dev/null
+++ b/packages/upload-media/src/store/test/reducer.ts
@@ -0,0 +1,279 @@
+/**
+ * Internal dependencies
+ */
+import reducer from '../reducer';
+import {
+ ItemStatus,
+ OperationType,
+ type QueueItem,
+ type State,
+ Type,
+} from '../types';
+
+describe( 'reducer', () => {
+ describe( `${ Type.Add }`, () => {
+ it( 'adds an item to the queue', () => {
+ const initialState: State = {
+ queueStatus: 'active',
+ blobUrls: {},
+ settings: {
+ mediaUpload: jest.fn(),
+ },
+ queue: [
+ {
+ id: '1',
+ status: ItemStatus.Processing,
+ } as QueueItem,
+ ],
+ };
+ const state = reducer( initialState, {
+ type: Type.Add,
+ item: {
+ id: '2',
+ status: ItemStatus.Processing,
+ } as QueueItem,
+ } );
+
+ expect( state ).toEqual( {
+ queueStatus: 'active',
+ blobUrls: {},
+ settings: {
+ mediaUpload: expect.any( Function ),
+ },
+ queue: [
+ {
+ id: '1',
+ status: ItemStatus.Processing,
+ } as QueueItem,
+ {
+ id: '2',
+ status: ItemStatus.Processing,
+ },
+ ],
+ } );
+ } );
+ } );
+
+ describe( `${ Type.Cancel }`, () => {
+ it( 'removes an item from the queue', () => {
+ const initialState: State = {
+ queueStatus: 'active',
+ blobUrls: {},
+ settings: {
+ mediaUpload: jest.fn(),
+ },
+ queue: [
+ {
+ id: '1',
+ status: ItemStatus.Processing,
+ } as QueueItem,
+ {
+ id: '2',
+ status: ItemStatus.Processing,
+ } as QueueItem,
+ ],
+ };
+ const state = reducer( initialState, {
+ type: Type.Cancel,
+ id: '2',
+ error: new Error(),
+ } );
+
+ expect( state ).toEqual( {
+ queueStatus: 'active',
+ blobUrls: {},
+ settings: {
+ mediaUpload: expect.any( Function ),
+ },
+ queue: [
+ {
+ id: '1',
+ status: ItemStatus.Processing,
+ },
+ {
+ id: '2',
+ status: ItemStatus.Processing,
+ error: expect.any( Error ),
+ },
+ ],
+ } );
+ } );
+ } );
+
+ describe( `${ Type.Remove }`, () => {
+ it( 'removes an item from the queue', () => {
+ const initialState: State = {
+ queueStatus: 'active',
+ blobUrls: {},
+ settings: {
+ mediaUpload: jest.fn(),
+ },
+ queue: [
+ {
+ id: '1',
+ status: ItemStatus.Processing,
+ } as QueueItem,
+ {
+ id: '2',
+ status: ItemStatus.Processing,
+ } as QueueItem,
+ ],
+ };
+ const state = reducer( initialState, {
+ type: Type.Remove,
+ id: '1',
+ } );
+
+ expect( state ).toEqual( {
+ queueStatus: 'active',
+ blobUrls: {},
+ settings: {
+ mediaUpload: expect.any( Function ),
+ },
+ queue: [
+ {
+ id: '2',
+ status: ItemStatus.Processing,
+ },
+ ],
+ } );
+ } );
+ } );
+
+ describe( `${ Type.AddOperations }`, () => {
+ it( 'appends operations to the list', () => {
+ const initialState: State = {
+ queueStatus: 'active',
+ blobUrls: {},
+ settings: {
+ mediaUpload: jest.fn(),
+ },
+ queue: [
+ {
+ id: '1',
+ status: ItemStatus.Processing,
+ operations: [ OperationType.Upload ],
+ } as QueueItem,
+ ],
+ };
+ const state = reducer( initialState, {
+ type: Type.AddOperations,
+ id: '1',
+ operations: [ OperationType.Upload ],
+ } );
+
+ expect( state ).toEqual( {
+ queueStatus: 'active',
+ blobUrls: {},
+ settings: {
+ mediaUpload: expect.any( Function ),
+ },
+ queue: [
+ {
+ id: '1',
+ status: ItemStatus.Processing,
+ operations: [
+ OperationType.Upload,
+ OperationType.Upload,
+ ],
+ },
+ ],
+ } );
+ } );
+ } );
+
+ describe( `${ Type.OperationStart }`, () => {
+ it( 'marks an item as processing', () => {
+ const initialState: State = {
+ queueStatus: 'active',
+ blobUrls: {},
+ settings: {
+ mediaUpload: jest.fn(),
+ },
+ queue: [
+ {
+ id: '1',
+ status: ItemStatus.Processing,
+ operations: [ OperationType.Upload ],
+ } as QueueItem,
+ {
+ id: '2',
+ status: ItemStatus.Processing,
+ operations: [ OperationType.Upload ],
+ } as QueueItem,
+ ],
+ };
+ const state = reducer( initialState, {
+ type: Type.OperationStart,
+ id: '2',
+ operation: OperationType.Upload,
+ } );
+
+ expect( state ).toEqual( {
+ queueStatus: 'active',
+ blobUrls: {},
+ settings: {
+ mediaUpload: expect.any( Function ),
+ },
+ queue: [
+ {
+ id: '1',
+ status: ItemStatus.Processing,
+ operations: [ OperationType.Upload ],
+ },
+ {
+ id: '2',
+ status: ItemStatus.Processing,
+ operations: [ OperationType.Upload ],
+ currentOperation: OperationType.Upload,
+ },
+ ],
+ } );
+ } );
+ } );
+
+ describe( `${ Type.OperationFinish }`, () => {
+ it( 'marks an item as processing', () => {
+ const initialState: State = {
+ queueStatus: 'active',
+ blobUrls: {},
+ settings: {
+ mediaUpload: jest.fn(),
+ },
+ queue: [
+ {
+ id: '1',
+ additionalData: {},
+ attachment: {},
+ status: ItemStatus.Processing,
+ operations: [ OperationType.Upload ],
+ currentOperation: OperationType.Upload,
+ } as QueueItem,
+ ],
+ };
+ const state = reducer( initialState, {
+ type: Type.OperationFinish,
+ id: '1',
+ item: {},
+ } );
+
+ expect( state ).toEqual( {
+ queueStatus: 'active',
+ blobUrls: {},
+ settings: {
+ mediaUpload: expect.any( Function ),
+ },
+ queue: [
+ {
+ id: '1',
+ additionalData: {},
+ attachment: {},
+ status: ItemStatus.Processing,
+ currentOperation: undefined,
+ operations: [],
+ },
+ ],
+ } );
+ } );
+ } );
+} );
diff --git a/packages/upload-media/src/store/test/selectors.ts b/packages/upload-media/src/store/test/selectors.ts
new file mode 100644
index 0000000000000..716b7792ef77a
--- /dev/null
+++ b/packages/upload-media/src/store/test/selectors.ts
@@ -0,0 +1,105 @@
+/**
+ * Internal dependencies
+ */
+import {
+ getItems,
+ isUploading,
+ isUploadingById,
+ isUploadingByUrl,
+} from '../selectors';
+import { ItemStatus, type QueueItem, type State } from '../types';
+
+describe( 'selectors', () => {
+ describe( 'getItems', () => {
+ it( 'should return empty array by default', () => {
+ const state: State = {
+ queue: [],
+ queueStatus: 'paused',
+ blobUrls: {},
+ settings: {
+ mediaUpload: jest.fn(),
+ },
+ };
+
+ expect( getItems( state ) ).toHaveLength( 0 );
+ } );
+ } );
+
+ describe( 'isUploading', () => {
+ it( 'should return true if there are items in the pipeline', () => {
+ const state: State = {
+ queue: [
+ {
+ status: ItemStatus.Processing,
+ },
+ {
+ status: ItemStatus.Processing,
+ },
+ {
+ status: ItemStatus.Paused,
+ },
+ ] as QueueItem[],
+ queueStatus: 'paused',
+ blobUrls: {},
+ settings: {
+ mediaUpload: jest.fn(),
+ },
+ };
+
+ expect( isUploading( state ) ).toBe( true );
+ } );
+ } );
+
+ describe( 'isUploadingByUrl', () => {
+ it( 'should return true if there are items in the pipeline', () => {
+ const state: State = {
+ queue: [
+ {
+ status: ItemStatus.Processing,
+ attachment: {
+ url: 'https://example.com/one.jpeg',
+ },
+ },
+ {
+ status: ItemStatus.Processing,
+ },
+ ] as QueueItem[],
+ queueStatus: 'paused',
+ blobUrls: {},
+ settings: {
+ mediaUpload: jest.fn(),
+ },
+ };
+
+ expect(
+ isUploadingByUrl( state, 'https://example.com/one.jpeg' )
+ ).toBe( true );
+ expect(
+ isUploadingByUrl( state, 'https://example.com/three.jpeg' )
+ ).toBe( false );
+ } );
+ } );
+
+ describe( 'isUploadingById', () => {
+ it( 'should return true if there are items in the pipeline', () => {
+ const state: State = {
+ queue: [
+ {
+ status: ItemStatus.Processing,
+ attachment: {
+ id: 123,
+ },
+ },
+ ] as QueueItem[],
+ queueStatus: 'paused',
+ blobUrls: {},
+ settings: {
+ mediaUpload: jest.fn(),
+ },
+ };
+
+ expect( isUploadingById( state, 123 ) ).toBe( true );
+ expect( isUploadingById( state, 789 ) ).toBe( false );
+ } );
+ } );
+} );
diff --git a/packages/upload-media/src/store/types.ts b/packages/upload-media/src/store/types.ts
new file mode 100644
index 0000000000000..5084e006a2cfa
--- /dev/null
+++ b/packages/upload-media/src/store/types.ts
@@ -0,0 +1,172 @@
+export type QueueItemId = string;
+
+export type QueueStatus = 'active' | 'paused';
+
+export type BatchId = string;
+
+export interface QueueItem {
+ id: QueueItemId;
+ sourceFile: File;
+ file: File;
+ poster?: File;
+ attachment?: Partial< Attachment >;
+ status: ItemStatus;
+ additionalData: AdditionalData;
+ onChange?: OnChangeHandler;
+ onSuccess?: OnSuccessHandler;
+ onError?: OnErrorHandler;
+ onBatchSuccess?: OnBatchSuccessHandler;
+ currentOperation?: OperationType;
+ operations?: Operation[];
+ error?: Error;
+ batchId?: string;
+ sourceUrl?: string;
+ sourceAttachmentId?: number;
+ abortController?: AbortController;
+}
+
+export interface State {
+ queue: QueueItem[];
+ queueStatus: QueueStatus;
+ blobUrls: Record< QueueItemId, string[] >;
+ settings: Settings;
+}
+
+export enum Type {
+ Unknown = 'REDUX_UNKNOWN',
+ Add = 'ADD_ITEM',
+ Prepare = 'PREPARE_ITEM',
+ Cancel = 'CANCEL_ITEM',
+ Remove = 'REMOVE_ITEM',
+ PauseItem = 'PAUSE_ITEM',
+ ResumeItem = 'RESUME_ITEM',
+ PauseQueue = 'PAUSE_QUEUE',
+ ResumeQueue = 'RESUME_QUEUE',
+ OperationStart = 'OPERATION_START',
+ OperationFinish = 'OPERATION_FINISH',
+ AddOperations = 'ADD_OPERATIONS',
+ CacheBlobUrl = 'CACHE_BLOB_URL',
+ RevokeBlobUrls = 'REVOKE_BLOB_URLS',
+ UpdateSettings = 'UPDATE_SETTINGS',
+}
+
+type Action< T = Type, Payload = Record< string, unknown > > = {
+ type: T;
+} & Payload;
+
+export type UnknownAction = Action< Type.Unknown >;
+export type AddAction = Action<
+ Type.Add,
+ {
+ item: Omit< QueueItem, 'operations' > &
+ Partial< Pick< QueueItem, 'operations' > >;
+ }
+>;
+export type OperationStartAction = Action<
+ Type.OperationStart,
+ { id: QueueItemId; operation: OperationType }
+>;
+export type OperationFinishAction = Action<
+ Type.OperationFinish,
+ {
+ id: QueueItemId;
+ item: Partial< QueueItem >;
+ }
+>;
+export type AddOperationsAction = Action<
+ Type.AddOperations,
+ { id: QueueItemId; operations: Operation[] }
+>;
+export type CancelAction = Action<
+ Type.Cancel,
+ { id: QueueItemId; error: Error }
+>;
+export type PauseItemAction = Action< Type.PauseItem, { id: QueueItemId } >;
+export type ResumeItemAction = Action< Type.ResumeItem, { id: QueueItemId } >;
+export type PauseQueueAction = Action< Type.PauseQueue >;
+export type ResumeQueueAction = Action< Type.ResumeQueue >;
+export type RemoveAction = Action< Type.Remove, { id: QueueItemId } >;
+export type CacheBlobUrlAction = Action<
+ Type.CacheBlobUrl,
+ { id: QueueItemId; blobUrl: string }
+>;
+export type RevokeBlobUrlsAction = Action<
+ Type.RevokeBlobUrls,
+ { id: QueueItemId }
+>;
+export type UpdateSettingsAction = Action<
+ Type.UpdateSettings,
+ { settings: Partial< Settings > }
+>;
+
+interface UploadMediaArgs {
+ // Additional data to include in the request.
+ additionalData?: AdditionalData;
+ // Array with the types of media that can be uploaded, if unset all types are allowed.
+ allowedTypes?: string[];
+ // List of files.
+ filesList: File[];
+ // Maximum upload size in bytes allowed for the site.
+ maxUploadFileSize?: number;
+ // Function called when an error happens.
+ onError?: OnErrorHandler;
+ // Function called each time a file or a temporary representation of the file is available.
+ onFileChange?: OnChangeHandler;
+ // Function called once a file has completely finished uploading, including thumbnails.
+ onSuccess?: OnSuccessHandler;
+ // List of allowed mime types and file extensions.
+ wpAllowedMimeTypes?: Record< string, string > | null;
+ // Abort signal.
+ signal?: AbortSignal;
+}
+
+export interface Settings {
+ // Function for uploading files to the server.
+ mediaUpload: ( args: UploadMediaArgs ) => void;
+ // List of allowed mime types and file extensions.
+ allowedMimeTypes?: Record< string, string > | null;
+ // Maximum upload file size
+ maxUploadFileSize?: number;
+}
+
+// Must match the Attachment type from the media-utils package.
+export interface Attachment {
+ id: number;
+ alt: string;
+ caption: string;
+ title: string;
+ url: string;
+ filename: string | null;
+ filesize: number | null;
+ media_type: 'image' | 'file';
+ mime_type: string;
+ featured_media?: number;
+ missing_image_sizes?: string[];
+ poster?: string;
+}
+
+export type OnChangeHandler = ( attachments: Partial< Attachment >[] ) => void;
+export type OnSuccessHandler = ( attachments: Partial< Attachment >[] ) => void;
+export type OnErrorHandler = ( error: Error ) => void;
+export type OnBatchSuccessHandler = () => void;
+
+export enum ItemStatus {
+ Processing = 'PROCESSING',
+ Paused = 'PAUSED',
+}
+
+export enum OperationType {
+ Prepare = 'PREPARE',
+ Upload = 'UPLOAD',
+}
+
+export interface OperationArgs {}
+
+type OperationWithArgs< T extends keyof OperationArgs = keyof OperationArgs > =
+ [ T, OperationArgs[ T ] ];
+
+export type Operation = OperationType | OperationWithArgs;
+
+export type AdditionalData = Record< string, unknown >;
+
+export type ImageFormat = 'jpeg' | 'webp' | 'avif' | 'png' | 'gif';
diff --git a/packages/upload-media/src/stub-file.ts b/packages/upload-media/src/stub-file.ts
new file mode 100644
index 0000000000000..f308c0d48b6f4
--- /dev/null
+++ b/packages/upload-media/src/stub-file.ts
@@ -0,0 +1,5 @@
+export class StubFile extends File {
+ constructor( fileName = 'stub-file' ) {
+ super( [], fileName );
+ }
+}
diff --git a/packages/upload-media/src/test/get-file-basename.ts b/packages/upload-media/src/test/get-file-basename.ts
new file mode 100644
index 0000000000000..6bf968a764346
--- /dev/null
+++ b/packages/upload-media/src/test/get-file-basename.ts
@@ -0,0 +1,15 @@
+/**
+ * Internal dependencies
+ */
+import { getFileBasename } from '../utils';
+
+describe( 'getFileBasename', () => {
+ it.each( [
+ [ 'my-video.mp4', 'my-video' ],
+ [ 'my.video.mp4', 'my.video' ],
+ [ 'my-video', 'my-video' ],
+ [ '', '' ],
+ ] )( 'for file name %s returns basename %s', ( fileName, baseName ) => {
+ expect( getFileBasename( fileName ) ).toStrictEqual( baseName );
+ } );
+} );
diff --git a/packages/upload-media/src/test/get-file-extension.ts b/packages/upload-media/src/test/get-file-extension.ts
new file mode 100644
index 0000000000000..b26c4571be73f
--- /dev/null
+++ b/packages/upload-media/src/test/get-file-extension.ts
@@ -0,0 +1,15 @@
+/**
+ * Internal dependencies
+ */
+import { getFileExtension } from '../utils';
+
+describe( 'getFileExtension', () => {
+ it.each( [
+ [ 'my-video.mp4', 'mp4' ],
+ [ 'my.video.mp4', 'mp4' ],
+ [ 'my-video', null ],
+ [ '', null ],
+ ] )( 'for file name %s returns extension %s', ( fileName, baseName ) => {
+ expect( getFileExtension( fileName ) ).toStrictEqual( baseName );
+ } );
+} );
diff --git a/packages/upload-media/src/test/get-file-name-from-url.ts b/packages/upload-media/src/test/get-file-name-from-url.ts
new file mode 100644
index 0000000000000..6e2d497472e76
--- /dev/null
+++ b/packages/upload-media/src/test/get-file-name-from-url.ts
@@ -0,0 +1,14 @@
+/**
+ * Internal dependencies
+ */
+import { getFileNameFromUrl } from '../utils';
+
+describe( 'getFileNameFromUrl', () => {
+ it.each( [
+ [ 'https://example.com/', 'unnamed' ],
+ [ 'https://example.com/photo.jpeg', 'photo.jpeg' ],
+ [ 'https://example.com/path/to/video.mp4', 'video.mp4' ],
+ ] )( 'for %s returns %s', ( url, fileName ) => {
+ expect( getFileNameFromUrl( url ) ).toBe( fileName );
+ } );
+} );
diff --git a/packages/upload-media/src/test/get-mime-types-array.ts b/packages/upload-media/src/test/get-mime-types-array.ts
new file mode 100644
index 0000000000000..156955373bd0d
--- /dev/null
+++ b/packages/upload-media/src/test/get-mime-types-array.ts
@@ -0,0 +1,47 @@
+/**
+ * Internal dependencies
+ */
+import { getMimeTypesArray } from '../get-mime-types-array';
+
+describe( 'getMimeTypesArray', () => {
+ it( 'should return null if it is "falsy" e.g: undefined or null', () => {
+ expect( getMimeTypesArray( null ) ).toEqual( null );
+ expect( getMimeTypesArray( undefined ) ).toEqual( null );
+ } );
+
+ it( 'should return an empty array if an empty object is passed', () => {
+ expect( getMimeTypesArray( {} ) ).toEqual( [] );
+ } );
+
+ it( 'should return the type plus a new mime type with type and subtype with the extension if a type is passed', () => {
+ expect( getMimeTypesArray( { ext: 'chicken' } ) ).toEqual( [
+ 'chicken',
+ 'chicken/ext',
+ ] );
+ } );
+
+ it( 'should return the mime type passed and a new mime type with type and the extension as subtype', () => {
+ expect( getMimeTypesArray( { ext: 'chicken/ribs' } ) ).toEqual( [
+ 'chicken/ribs',
+ 'chicken/ext',
+ ] );
+ } );
+
+ it( 'should return the mime type passed and an additional mime type per extension supported', () => {
+ expect( getMimeTypesArray( { 'jpg|jpeg|jpe': 'image/jpeg' } ) ).toEqual(
+ [ 'image/jpeg', 'image/jpg', 'image/jpeg', 'image/jpe' ]
+ );
+ } );
+
+ it( 'should handle multiple mime types', () => {
+ expect(
+ getMimeTypesArray( { 'ext|aaa': 'chicken/ribs', aaa: 'bbb' } )
+ ).toEqual( [
+ 'chicken/ribs',
+ 'chicken/ext',
+ 'chicken/aaa',
+ 'bbb',
+ 'bbb/aaa',
+ ] );
+ } );
+} );
diff --git a/packages/upload-media/src/test/image-file.ts b/packages/upload-media/src/test/image-file.ts
new file mode 100644
index 0000000000000..e48ae2df6ebce
--- /dev/null
+++ b/packages/upload-media/src/test/image-file.ts
@@ -0,0 +1,15 @@
+/**
+ * Internal dependencies
+ */
+import { ImageFile } from '../image-file';
+
+describe( 'ImageFile', () => {
+ it( 'returns whether the file was resizes', () => {
+ const file = new window.File( [ 'fake_file' ], 'test.jpeg', {
+ type: 'image/jpeg',
+ } );
+
+ const image = new ImageFile( file, 1000, 1000, 2000, 200 );
+ expect( image.wasResized ).toBe( true );
+ } );
+} );
diff --git a/packages/upload-media/src/test/upload-error.ts b/packages/upload-media/src/test/upload-error.ts
new file mode 100644
index 0000000000000..4d5f025ed8cf3
--- /dev/null
+++ b/packages/upload-media/src/test/upload-error.ts
@@ -0,0 +1,24 @@
+/**
+ * Internal dependencies
+ */
+import { UploadError } from '../upload-error';
+
+describe( 'UploadError', () => {
+ it( 'holds error code and file name', () => {
+ const file = new File( [], 'example.jpg', {
+ lastModified: 1234567891,
+ type: 'image/jpeg',
+ } );
+
+ const error = new UploadError( {
+ code: 'some_error',
+ message: 'An error occurred',
+ file,
+ } );
+
+ expect( error ).toStrictEqual( expect.any( Error ) );
+ expect( error.code ).toBe( 'some_error' );
+ expect( error.message ).toBe( 'An error occurred' );
+ expect( error.file ).toBe( file );
+ } );
+} );
diff --git a/packages/upload-media/src/test/validate-file-size.ts b/packages/upload-media/src/test/validate-file-size.ts
new file mode 100644
index 0000000000000..31d6af0e7e4a5
--- /dev/null
+++ b/packages/upload-media/src/test/validate-file-size.ts
@@ -0,0 +1,70 @@
+/**
+ * Internal dependencies
+ */
+import { validateFileSize } from '../validate-file-size';
+import { UploadError } from '../upload-error';
+
+const imageFile = new window.File( [ 'fake_file' ], 'test.jpeg', {
+ type: 'image/jpeg',
+} );
+
+const emptyFile = new window.File( [], 'test.jpeg', {
+ type: 'image/jpeg',
+} );
+
+describe( 'validateFileSize', () => {
+ afterEach( () => {
+ jest.clearAllMocks();
+ } );
+
+ it( 'should error if the file is empty', () => {
+ expect( () => {
+ validateFileSize( emptyFile );
+ } ).toThrow(
+ new UploadError( {
+ code: 'EMPTY_FILE',
+ message: 'test.jpeg: This file is empty.',
+ file: imageFile,
+ } )
+ );
+ } );
+
+ it( 'should error if the file is is greater than the maximum', () => {
+ expect( () => {
+ validateFileSize( imageFile, 2 );
+ } ).toThrow(
+ new UploadError( {
+ code: 'SIZE_ABOVE_LIMIT',
+ message:
+ 'test.jpeg: This file exceeds the maximum upload size for this site.',
+ file: imageFile,
+ } )
+ );
+ } );
+
+ it( 'should not error if the file is below the limit', () => {
+ expect( () => {
+ validateFileSize( imageFile, 100 );
+ } ).not.toThrow(
+ new UploadError( {
+ code: 'SIZE_ABOVE_LIMIT',
+ message:
+ 'test.jpeg: This file exceeds the maximum upload size for this site.',
+ file: imageFile,
+ } )
+ );
+ } );
+
+ it( 'should not error if there is no limit', () => {
+ expect( () => {
+ validateFileSize( imageFile );
+ } ).not.toThrow(
+ new UploadError( {
+ code: 'SIZE_ABOVE_LIMIT',
+ message:
+ 'test.jpeg: This file exceeds the maximum upload size for this site.',
+ file: imageFile,
+ } )
+ );
+ } );
+} );
diff --git a/packages/upload-media/src/test/validate-mime-type-for-user.ts b/packages/upload-media/src/test/validate-mime-type-for-user.ts
new file mode 100644
index 0000000000000..d256656686214
--- /dev/null
+++ b/packages/upload-media/src/test/validate-mime-type-for-user.ts
@@ -0,0 +1,37 @@
+/**
+ * Internal dependencies
+ */
+import { validateMimeTypeForUser } from '../validate-mime-type-for-user';
+import { UploadError } from '../upload-error';
+
+const imageFile = new window.File( [ 'fake_file' ], 'test.jpeg', {
+ type: 'image/jpeg',
+} );
+
+describe( 'validateMimeTypeForUser', () => {
+ afterEach( () => {
+ jest.clearAllMocks();
+ } );
+
+ it( 'should not error if wpAllowedMimeTypes is null or missing', async () => {
+ expect( () => {
+ validateMimeTypeForUser( imageFile );
+ } ).not.toThrow();
+ expect( () => {
+ validateMimeTypeForUser( imageFile, null );
+ } ).not.toThrow();
+ } );
+
+ it( 'should error if file type is not allowed for user', async () => {
+ expect( () => {
+ validateMimeTypeForUser( imageFile, { aac: 'audio/aac' } );
+ } ).toThrow(
+ new UploadError( {
+ code: 'MIME_TYPE_NOT_ALLOWED_FOR_USER',
+ message:
+ 'test.jpeg: Sorry, you are not allowed to upload this file type.',
+ file: imageFile,
+ } )
+ );
+ } );
+} );
diff --git a/packages/upload-media/src/test/validate-mime-type.ts b/packages/upload-media/src/test/validate-mime-type.ts
new file mode 100644
index 0000000000000..a83cdcefe5f99
--- /dev/null
+++ b/packages/upload-media/src/test/validate-mime-type.ts
@@ -0,0 +1,57 @@
+/**
+ * Internal dependencies
+ */
+import { validateMimeType } from '../validate-mime-type';
+import { UploadError } from '../upload-error';
+
+const xmlFile = new window.File( [ 'fake_file' ], 'test.xml', {
+ type: 'text/xml',
+} );
+const imageFile = new window.File( [ 'fake_file' ], 'test.jpeg', {
+ type: 'image/jpeg',
+} );
+
+describe( 'validateMimeType', () => {
+ afterEach( () => {
+ jest.clearAllMocks();
+ } );
+
+ it( 'should error if allowedTypes contains a partial mime type and the validation fails', async () => {
+ expect( () => {
+ validateMimeType( xmlFile, [ 'image' ] );
+ } ).toThrow(
+ new UploadError( {
+ code: 'MIME_TYPE_NOT_SUPPORTED',
+ message:
+ 'test.xml: Sorry, this file type is not supported here.',
+ file: xmlFile,
+ } )
+ );
+ } );
+
+ it( 'should error if allowedTypes contains a complete mime type and the validation fails', async () => {
+ expect( () => {
+ validateMimeType( imageFile, [ 'image/gif' ] );
+ } ).toThrow(
+ new UploadError( {
+ code: 'MIME_TYPE_NOT_SUPPORTED',
+ message:
+ 'test.jpeg: Sorry, this file type is not supported here.',
+ file: xmlFile,
+ } )
+ );
+ } );
+
+ it( 'should error if allowedTypes contains multiple types and the validation fails', async () => {
+ expect( () => {
+ validateMimeType( xmlFile, [ 'video', 'image' ] );
+ } ).toThrow(
+ new UploadError( {
+ code: 'MIME_TYPE_NOT_SUPPORTED',
+ message:
+ 'test.xml: Sorry, this file type is not supported here.',
+ file: xmlFile,
+ } )
+ );
+ } );
+} );
diff --git a/packages/upload-media/src/upload-error.ts b/packages/upload-media/src/upload-error.ts
new file mode 100644
index 0000000000000..d712e9dcdb696
--- /dev/null
+++ b/packages/upload-media/src/upload-error.ts
@@ -0,0 +1,26 @@
+interface UploadErrorArgs {
+ code: string;
+ message: string;
+ file: File;
+ cause?: Error;
+}
+
+/**
+ * MediaError class.
+ *
+ * Small wrapper around the `Error` class
+ * to hold an error code and a reference to a file object.
+ */
+export class UploadError extends Error {
+ code: string;
+ file: File;
+
+ constructor( { code, message, file, cause }: UploadErrorArgs ) {
+ super( message, { cause } );
+
+ Object.setPrototypeOf( this, new.target.prototype );
+
+ this.code = code;
+ this.file = file;
+ }
+}
diff --git a/packages/upload-media/src/utils.ts b/packages/upload-media/src/utils.ts
new file mode 100644
index 0000000000000..3950ec0388792
--- /dev/null
+++ b/packages/upload-media/src/utils.ts
@@ -0,0 +1,90 @@
+/**
+ * WordPress dependencies
+ */
+import { getFilename } from '@wordpress/url';
+import { _x } from '@wordpress/i18n';
+
+/**
+ * Converts a Blob to a File with a default name like "image.png".
+ *
+ * If it is already a File object, it is returned unchanged.
+ *
+ * @param fileOrBlob Blob object.
+ * @return File object.
+ */
+export function convertBlobToFile( fileOrBlob: Blob | File ): File {
+ if ( fileOrBlob instanceof File ) {
+ return fileOrBlob;
+ }
+
+ // Extension is only an approximation.
+ // The server will override it if incorrect.
+ const ext = fileOrBlob.type.split( '/' )[ 1 ];
+ const mediaType =
+ 'application/pdf' === fileOrBlob.type
+ ? 'document'
+ : fileOrBlob.type.split( '/' )[ 0 ];
+ return new File( [ fileOrBlob ], `${ mediaType }.${ ext }`, {
+ type: fileOrBlob.type,
+ } );
+}
+
+/**
+ * Renames a given file and returns a new file.
+ *
+ * Copies over the last modified time.
+ *
+ * @param file File object.
+ * @param name File name.
+ * @return Renamed file object.
+ */
+export function renameFile( file: File, name: string ): File {
+ return new File( [ file ], name, {
+ type: file.type,
+ lastModified: file.lastModified,
+ } );
+}
+
+/**
+ * Clones a given file object.
+ *
+ * @param file File object.
+ * @return New file object.
+ */
+export function cloneFile( file: File ): File {
+ return renameFile( file, file.name );
+}
+
+/**
+ * Returns the file extension from a given file name or URL.
+ *
+ * @param file File URL.
+ * @return File extension or null if it does not have one.
+ */
+export function getFileExtension( file: string ): string | null {
+ return file.includes( '.' ) ? file.split( '.' ).pop() || null : null;
+}
+
+/**
+ * Returns file basename without extension.
+ *
+ * For example, turns "my-awesome-file.jpeg" into "my-awesome-file".
+ *
+ * @param name File name.
+ * @return File basename.
+ */
+export function getFileBasename( name: string ): string {
+ return name.includes( '.' )
+ ? name.split( '.' ).slice( 0, -1 ).join( '.' )
+ : name;
+}
+
+/**
+ * Returns the file name including extension from a URL.
+ *
+ * @param url File URL.
+ * @return File name.
+ */
+export function getFileNameFromUrl( url: string ) {
+ return getFilename( url ) || _x( 'unnamed', 'file name' );
+}
diff --git a/packages/upload-media/src/validate-file-size.ts b/packages/upload-media/src/validate-file-size.ts
new file mode 100644
index 0000000000000..cc34462b268dd
--- /dev/null
+++ b/packages/upload-media/src/validate-file-size.ts
@@ -0,0 +1,44 @@
+/**
+ * WordPress dependencies
+ */
+import { __, sprintf } from '@wordpress/i18n';
+
+/**
+ * Internal dependencies
+ */
+import { UploadError } from './upload-error';
+
+/**
+ * Verifies whether the file is within the file upload size limits for the site.
+ *
+ * @param file File object.
+ * @param maxUploadFileSize Maximum upload size in bytes allowed for the site.
+ */
+export function validateFileSize( file: File, maxUploadFileSize?: number ) {
+ // Don't allow empty files to be uploaded.
+ if ( file.size <= 0 ) {
+ throw new UploadError( {
+ code: 'EMPTY_FILE',
+ message: sprintf(
+ // translators: %s: file name.
+ __( '%s: This file is empty.' ),
+ file.name
+ ),
+ file,
+ } );
+ }
+
+ if ( maxUploadFileSize && file.size > maxUploadFileSize ) {
+ throw new UploadError( {
+ code: 'SIZE_ABOVE_LIMIT',
+ message: sprintf(
+ // translators: %s: file name.
+ __(
+ '%s: This file exceeds the maximum upload size for this site.'
+ ),
+ file.name
+ ),
+ file,
+ } );
+ }
+}
diff --git a/packages/upload-media/src/validate-mime-type-for-user.ts b/packages/upload-media/src/validate-mime-type-for-user.ts
new file mode 100644
index 0000000000000..858c583561978
--- /dev/null
+++ b/packages/upload-media/src/validate-mime-type-for-user.ts
@@ -0,0 +1,46 @@
+/**
+ * WordPress dependencies
+ */
+import { __, sprintf } from '@wordpress/i18n';
+
+/**
+ * Internal dependencies
+ */
+import { UploadError } from './upload-error';
+import { getMimeTypesArray } from './get-mime-types-array';
+
+/**
+ * Verifies if the user is allowed to upload this mime type.
+ *
+ * @param file File object.
+ * @param wpAllowedMimeTypes List of allowed mime types and file extensions.
+ */
+export function validateMimeTypeForUser(
+ file: File,
+ wpAllowedMimeTypes?: Record< string, string > | null
+) {
+ // Allowed types for the current WP_User.
+ const allowedMimeTypesForUser = getMimeTypesArray( wpAllowedMimeTypes );
+
+ if ( ! allowedMimeTypesForUser ) {
+ return;
+ }
+
+ const isAllowedMimeTypeForUser = allowedMimeTypesForUser.includes(
+ file.type
+ );
+
+ if ( file.type && ! isAllowedMimeTypeForUser ) {
+ throw new UploadError( {
+ code: 'MIME_TYPE_NOT_ALLOWED_FOR_USER',
+ message: sprintf(
+ // translators: %s: file name.
+ __(
+ '%s: Sorry, you are not allowed to upload this file type.'
+ ),
+ file.name
+ ),
+ file,
+ } );
+ }
+}
diff --git a/packages/upload-media/src/validate-mime-type.ts b/packages/upload-media/src/validate-mime-type.ts
new file mode 100644
index 0000000000000..2d99455d7b60f
--- /dev/null
+++ b/packages/upload-media/src/validate-mime-type.ts
@@ -0,0 +1,43 @@
+/**
+ * WordPress dependencies
+ */
+import { __, sprintf } from '@wordpress/i18n';
+
+/**
+ * Internal dependencies
+ */
+import { UploadError } from './upload-error';
+
+/**
+ * Verifies if the caller (e.g. a block) supports this mime type.
+ *
+ * @param file File object.
+ * @param allowedTypes List of allowed mime types.
+ */
+export function validateMimeType( file: File, allowedTypes?: string[] ) {
+ if ( ! allowedTypes ) {
+ return;
+ }
+
+ // Allowed type specified by consumer.
+ const isAllowedType = allowedTypes.some( ( allowedType ) => {
+ // If a complete mimetype is specified verify if it matches exactly the mime type of the file.
+ if ( allowedType.includes( '/' ) ) {
+ return allowedType === file.type;
+ }
+ // Otherwise a general mime type is used, and we should verify if the file mimetype starts with it.
+ return file.type.startsWith( `${ allowedType }/` );
+ } );
+
+ if ( file.type && ! isAllowedType ) {
+ throw new UploadError( {
+ code: 'MIME_TYPE_NOT_SUPPORTED',
+ message: sprintf(
+ // translators: %s: file name.
+ __( '%s: Sorry, this file type is not supported here.' ),
+ file.name
+ ),
+ file,
+ } );
+ }
+}
diff --git a/packages/upload-media/tsconfig.json b/packages/upload-media/tsconfig.json
new file mode 100644
index 0000000000000..b0bc834698905
--- /dev/null
+++ b/packages/upload-media/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "$schema": "https://json.schemastore.org/tsconfig.json",
+ "extends": "../../tsconfig.base.json",
+ "compilerOptions": {
+ "rootDir": "src",
+ "declarationDir": "build-types",
+ "types": [ "gutenberg-env" ]
+ },
+ "include": [ "src/**/*" ],
+ "references": [
+ { "path": "../api-fetch" },
+ { "path": "../blob" },
+ { "path": "../compose" },
+ { "path": "../data" },
+ { "path": "../element" },
+ { "path": "../i18n" },
+ { "path": "../private-apis" },
+ { "path": "../url" }
+ ]
+}
diff --git a/tsconfig.json b/tsconfig.json
index 1010054ea512e..93d0bd976dd00 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -55,6 +55,7 @@
{ "path": "packages/sync" },
{ "path": "packages/token-list" },
{ "path": "packages/undo-manager" },
+ { "path": "packages/upload-media" },
{ "path": "packages/url" },
{ "path": "packages/vips" },
{ "path": "packages/warning" },
From 2cdd37d45d9eea93377314acfa803786d9049dec Mon Sep 17 00:00:00 2001
From: Marco Ciampini
Date: Mon, 16 Dec 2024 11:17:15 +0100
Subject: [PATCH 081/239] Menu: more granular sub-components (#67422)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* MenuItem: add render and store props
* Extract sub-components: popover, trigger button, submenu trigger item
* Unit tests
* CHANGELOG
* Add more memory to node on CI
* Refactor block bindings panel menu (#67633)
Co-authored-by: ciampo
* Storybook (#67632)
* Refactor dataviews item actions menu (#67636)
* Refactor dataviews view config menu (#67637)
* Refactor global styles shadows edit panel menu (#67641)
* Refactor global styles font size menus (#67642)
* Refactor "Add filter" dataviews menu (#67634)
* Menu granular subcomponents: Refactor dataviews list layout actions menu (#67639)
Co-authored-by: ciampo
Co-authored-by: tyxla
Co-authored-by: oandregal
* Menu granular subcomponents: Refactor dataviews table layout header menu (#67640)
Co-authored-by: ciampo
Co-authored-by: tyxla
Co-authored-by: oandregal