Skip to content

Storybook: Upgrade Storybook to 10.4#77382

Open
aduth wants to merge 17 commits into
trunkfrom
update/storybook-10-3
Open

Storybook: Upgrade Storybook to 10.4#77382
aduth wants to merge 17 commits into
trunkfrom
update/storybook-10-3

Conversation

@aduth
Copy link
Copy Markdown
Member

@aduth aduth commented Apr 15, 2026

What?

Updates Storybook to the latest version (10.4.1 at time of writing).

Why?

As identified in #77112, current component manifests produce incorrect results. One of the proposed action items there was to explore whether newer versions of Storybook and its related dependencies improve the outcome without workarounds like proposed in that pull request.

Additionally, this is also just general good code health maintenance to keep up to date with the latest features and bug fixes. Of note, Storybook 10.3 includes stable support for its MCP feature (which we indirectly leverage through the componentsManifest feature) as well as general accessibility improvements. Storybook 10.4 introduces a new, faster, more accurate "component meta" docgen tool which benefits the manifest.

For the manifests (which, in turn, are used by @wordpress/design-system-mcp) the difference is notable:

Hosted: https://wordpress.github.io/gutenberg/manifests/components.json
Local: storybook/build/manifests/components.json

Metric Hosted New Δ Hosted% New% Δ%
Components 63 63 0
With description 48 56 +8 76.2% 88.9% +12.7
With prop data 39 59 +20 61.9% 93.7% +31.7
Total props 245 664 +419
Props with description 215 593 +378 87.8% 89.3% +1.6

Missing descriptions and prop details are particularly problematic for the MCP server, which relays this information to AI agents to ensure the agents understand appropriateness of a component and how it should be used. Increasing the availability of descriptions for parity with how these components are documented through the live Storybook site improves the reliability of these tools.

Full details with script (AI assisted)

Descriptions gained (8)

  • ../packages/components/src/confirm-dialog/stories/index.story.tsx:ConfirmDialog
    ConfirmDialog is built of top of [Modal](/packages/components/src/modal/REA…
  • ../packages/components/src/dropdown/stories/index.story.tsx:Dropdown
    Renders a button that opens a floating content modal when clicked. ```jsx impor…
  • ../packages/components/src/popover/stories/index.story.tsx:Popover
    Popover renders its content in a floating modal. If no explicit anchor is pas…
  • ../packages/components/src/base-control/stories/index.story.tsx:BaseControl
    BaseControl is a low-level component used to generate labels and help text fo…
  • ../packages/components/src/toggle-group-control/stories/index.story.tsx:ToggleGroupControl
    ToggleGroupControl is a form component that lets users choose options represe…
  • ../packages/components/src/truncate/stories/index.story.tsx:Truncate
    Truncate is a typography primitive that trims text content. For almost all ca…
  • ../packages/components/src/scroll-lock/stories/index.story.tsx:ScrollLock
    ScrollLock is a content-free React component for declaratively preventing scrol…
  • ../packages/components/src/item-group/stories/index.story.tsx:ItemGroup
    ItemGroup displays a list of Items grouped and styled together. ```jsx impo…

Props gained (42)

  • ../packages/components/src/button/stories/index.story.tsx:Button: __next40pxDefaultSize, accessibleWhenDisabled, children, description, icon, iconPosition, iconSize, isBusy, isDestructive, isPressed (+11 more)
  • ../packages/components/src/menu-item/stories/index.story.tsx:MenuItem: isDestructive, className, children, info, icon, iconPosition, isSelected, shortcut, role, suffix (+1 more)
  • ../packages/components/src/panel/stories/index.story.tsx:Panel: ref, key
  • ../packages/components/src/progress-bar/stories/index.story.tsx:ProgressBar: value, className
  • ../packages/components/src/snackbar/stories/index.story.tsx:Snackbar: children, className, onRemove, onDismiss, listRef, as
  • ../packages/components/src/tree-grid/stories/index.story.tsx:TreeGrid: applicationAriaLabel, children
  • ../packages/components/src/confirm-dialog/stories/index.story.tsx:ConfirmDialog: children, onConfirm, confirmButtonText, cancelButtonText, onCancel, isOpen, isBusy
  • ../packages/components/src/dropdown/stories/index.story.tsx:Dropdown: as
  • ../packages/components/src/modal/stories/index.story.tsx:Modal: ref, key
  • ../packages/components/src/popover/stories/index.story.tsx:Popover: animate, children, variant, anchor, shift, inline, position, offset, onClose, resize (+15 more)
  • ../packages/components/src/tooltip/stories/index.story.tsx:Tooltip: ref, key
  • ../packages/components/src/base-control/stories/index.story.tsx:BaseControl: __nextHasNoMarginBottom, id, help, label, hideLabelFromVision, className, children, as
  • ../packages/components/src/checkbox-control/stories/index.story.tsx:CheckboxControl: help, __nextHasNoMarginBottom, disabled, onChange, label, checked, indeterminate, heading
  • ../packages/components/src/color-indicator/stories/index.story.tsx:ColorIndicator: colorValue
  • ../packages/components/src/color-palette/stories/index.story.tsx:ColorPalette: onChange, selectedSlug, clearable, colors, disableCustomColors, enableAlpha, headingLevel, value, asButtons, loop (+4 more)
  • ../packages/components/src/combobox-control/stories/index.story.tsx:ComboboxControl: label, className, help, __nextHasNoMarginBottom, hideLabelFromVision
  • ../packages/components/src/drop-zone/stories/index.story.tsx:DropZone: className, label, onDrop, onFilesDrop, onHTMLDrop
  • ../packages/components/src/form-file-upload/stories/index.story.tsx:FormFileUpload: __next40pxDefaultSize, accept, children, icon, onChange, onClick, render
  • ../packages/components/src/form-token-field/stories/index.story.tsx:FormTokenField: autoCapitalize, className, autoComplete
  • ../packages/components/src/gradient-picker/stories/index.story.tsx:GradientPicker: aria-label, aria-labelledby
  • ../packages/components/src/input-control/stories/index.story.tsx:InputControl: label, disabled, prefix, __next40pxDefaultSize, size, suffix, hideLabelFromVision, __next36pxDefaultSize, __shouldNotWarnDeprecated36pxSize, __unstableInputWidth (+13 more)
  • ../packages/components/src/number-control/stories/index.story.tsx:NumberControl: label, disabled, prefix, onChange, onDrag, onDragEnd, onDragStart, __next40pxDefaultSize, size, suffix (+23 more)
  • ../packages/components/src/radio-control/stories/index.story.tsx:RadioControl: label, help, hideLabelFromVision, disabled, onChange, options, selected
  • ../packages/components/src/range-control/stories/index.story.tsx:RangeControl: help, __nextHasNoMarginBottom, hideLabelFromVision, min, max, value, disabled, marks, step, afterIcon (+23 more)
  • ../packages/components/src/search-control/stories/index.story.tsx:SearchControl: value, help, __next40pxDefaultSize, __nextHasNoMarginBottom, onChange, onClose, onDrag, onDragStart, onDragEnd
  • ../packages/components/src/select-control/stories/index.story.tsx:SelectControl: label, disabled, prefix, __next40pxDefaultSize, size, suffix, hideLabelFromVision, __next36pxDefaultSize, __shouldNotWarnDeprecated36pxSize, labelPosition (+9 more)
  • ../packages/components/src/text-control/stories/index.story.tsx:TextControl: label, className, help, __nextHasNoMarginBottom, hideLabelFromVision, onChange, value, type, __next40pxDefaultSize
  • ../packages/components/src/textarea-control/stories/index.story.tsx:TextareaControl: label, help, __nextHasNoMarginBottom, hideLabelFromVision, onChange, value, rows
  • ../packages/components/src/toggle-control/stories/index.story.tsx:ToggleControl: disabled, checked, className, __nextHasNoMarginBottom, help, label, onChange
  • ../packages/components/src/toggle-group-control/stories/index.story.tsx:ToggleGroupControl: help, __nextHasNoMarginBottom, label, hideLabelFromVision, isAdaptiveWidth, isBlock, isDeselectable, onChange, value, children (+3 more)
  • ../packages/components/src/tree-select/stories/index.story.tsx:TreeSelect: label, children, disabled, prefix, __next40pxDefaultSize, size, variant, suffix, help, __nextHasNoMarginBottom (+5 more)
  • ../packages/components/src/unit-control/stories/index.story.tsx:UnitControl: size, onChange, isUnitSelectTabbable, units, label, disabled, value, prefix, onFocus, onBlur (+28 more)
  • ../packages/components/src/truncate/stories/index.story.tsx:Truncate: ellipsis, ellipsizeMode, limit, numberOfLines, children, as
  • ../packages/components/src/composite/stories/index.story.tsx:Composite: activeId, defaultActiveId, setActiveId, render, focusable, accessibleWhenDisabled, onFocusVisible, children
  • ../packages/components/src/disabled/stories/index.story.tsx:Disabled: children, as
  • ../packages/components/src/resizable-box/stories/index.story.tsx:ResizableBox: as, style, className, grid, snap, snapGap, bounds, boundsByDirection, size, minWidth (+20 more)
  • ../packages/components/src/slot-fill/stories/index.story.tsx:Slot: name, fillProps, bubblesVirtually, children, className, style, as
  • ../packages/components/src/form-toggle/stories/index.story.tsx:FormToggle: checked, disabled, onChange
  • ../packages/components/src/item-group/stories/index.story.tsx:ItemGroup: isBordered, isRounded, isSeparated, size, children, as
  • ../packages/ui/src/collapsible/stories/index.story.tsx:Collapsible.Root: open, defaultOpen, onOpenChange, disabled
  • ../packages/ui/src/link/stories/index.story.tsx:Link: className, render, style
  • ../packages/ui/src/tabs/stories/index.story.tsx:Tabs.Root: defaultValue, value, orientation, onValueChange

Props lost (regressions) (1)

  • ../packages/components/src/popover/stories/index.story.tsx:Popover: name

Prop count changed (42)

  • ../packages/components/src/button/stories/index.story.tsx:Button: 8 → 29
  • ../packages/components/src/menu-item/stories/index.story.tsx:MenuItem: 0 → 11
  • ../packages/components/src/panel/stories/index.story.tsx:Panel: 3 → 5
  • ../packages/components/src/progress-bar/stories/index.story.tsx:ProgressBar: 0 → 2
  • ../packages/components/src/snackbar/stories/index.story.tsx:Snackbar: 5 → 11
  • ../packages/components/src/tree-grid/stories/index.story.tsx:TreeGrid: 3 → 5
  • ../packages/components/src/confirm-dialog/stories/index.story.tsx:ConfirmDialog: 0 → 7
  • ../packages/components/src/dropdown/stories/index.story.tsx:Dropdown: 14 → 15
  • ../packages/components/src/modal/stories/index.story.tsx:Modal: 21 → 23
  • ../packages/components/src/popover/stories/index.story.tsx:Popover: 1 → 25
  • ../packages/components/src/tooltip/stories/index.story.tsx:Tooltip: 8 → 10
  • ../packages/components/src/base-control/stories/index.story.tsx:BaseControl: 0 → 8
  • ../packages/components/src/checkbox-control/stories/index.story.tsx:CheckboxControl: 0 → 8
  • ../packages/components/src/color-indicator/stories/index.story.tsx:ColorIndicator: 0 → 1
  • ../packages/components/src/color-palette/stories/index.story.tsx:ColorPalette: 0 → 14
  • ../packages/components/src/combobox-control/stories/index.story.tsx:ComboboxControl: 12 → 17
  • ../packages/components/src/drop-zone/stories/index.story.tsx:DropZone: 2 → 7
  • ../packages/components/src/form-file-upload/stories/index.story.tsx:FormFileUpload: 1 → 8
  • ../packages/components/src/form-token-field/stories/index.story.tsx:FormTokenField: 25 → 28
  • ../packages/components/src/gradient-picker/stories/index.story.tsx:GradientPicker: 12 → 14
  • ../packages/components/src/input-control/stories/index.story.tsx:InputControl: 1 → 24
  • ../packages/components/src/number-control/stories/index.story.tsx:NumberControl: 0 → 33
  • ../packages/components/src/radio-control/stories/index.story.tsx:RadioControl: 0 → 7
  • ../packages/components/src/range-control/stories/index.story.tsx:RangeControl: 0 → 33
  • ../packages/components/src/search-control/stories/index.story.tsx:SearchControl: 4 → 13
  • ../packages/components/src/select-control/stories/index.story.tsx:SelectControl: 0 → 19
  • ../packages/components/src/text-control/stories/index.story.tsx:TextControl: 0 → 9
  • ../packages/components/src/textarea-control/stories/index.story.tsx:TextareaControl: 0 → 7
  • ../packages/components/src/toggle-control/stories/index.story.tsx:ToggleControl: 0 → 7
  • ../packages/components/src/toggle-group-control/stories/index.story.tsx:ToggleGroupControl: 0 → 13
  • ../packages/components/src/tree-select/stories/index.story.tsx:TreeSelect: 4 → 19
  • ../packages/components/src/unit-control/stories/index.story.tsx:UnitControl: 0 → 38
  • ../packages/components/src/truncate/stories/index.story.tsx:Truncate: 0 → 6
  • ../packages/components/src/composite/stories/index.story.tsx:Composite: 7 → 15
  • ../packages/components/src/disabled/stories/index.story.tsx:Disabled: 1 → 3
  • ../packages/components/src/resizable-box/stories/index.story.tsx:ResizableBox: 4 → 34
  • ../packages/components/src/slot-fill/stories/index.story.tsx:Slot: 0 → 7
  • ../packages/components/src/form-toggle/stories/index.story.tsx:FormToggle: 0 → 3
  • ../packages/components/src/item-group/stories/index.story.tsx:ItemGroup: 0 → 6
  • ../packages/ui/src/collapsible/stories/index.story.tsx:Collapsible.Root: 4 → 8
  • ../packages/ui/src/link/stories/index.story.tsx:Link: 4 → 7
  • ../packages/ui/src/tabs/stories/index.story.tsx:Tabs.Root: 4 → 8

Prop descriptions gained (7)

  • ../packages/components/src/snackbar/stories/index.story.tsx:Snackbar: spokenMessage, politeness, actions, icon, explicitDismiss
  • ../packages/components/src/tree-grid/stories/index.story.tsx:TreeGrid: onExpandRow, onCollapseRow, onFocusRow
  • ../packages/components/src/drop-zone/stories/index.story.tsx:DropZone: icon, isEligible
  • ../packages/components/src/form-file-upload/stories/index.story.tsx:FormFileUpload: multiple
  • ../packages/components/src/search-control/stories/index.story.tsx:SearchControl: label, placeholder, hideLabelFromVision, size
  • ../packages/components/src/composite/stories/index.story.tsx:Composite: focusLoop, focusWrap, focusShift, virtualFocus, orientation, rtl, disabled
  • ../packages/components/src/disabled/stories/index.story.tsx:Disabled: isDisabled

Script:

#!/usr/bin/env node
/**
 * Compare a freshly built components manifest against the one currently
 * hosted at `wordpress.github.io/gutenberg/manifests/components.json`,
 * to evaluate how much the upgraded prop extractor recovers compared
 * to what's live today.
 *
 * Usage:
 *   node storybook/scripts/compare-with-hosted-manifest.mjs [path]
 *
 * The local manifest defaults to `storybook/build/manifests/components.json`.
 * The hosted manifest is read from `reactDocgen` (Storybook 10.2 shape).
 * The local manifest is read from `reactComponentMeta` (Storybook 10.4),
 * so the comparison reflects the real engine output rather than the
 * synthesized legacy field added by `inject-legacy-docgen.mjs`.
 *
 * Intended as a one-shot validation aid. Not wired into any build.
 */
import { readFile } from 'node:fs/promises';

const HOSTED_URL =
	'https://wordpress.github.io/gutenberg/manifests/components.json';
const LOCAL_PATH =
	process.argv[ 2 ] ?? 'storybook/build/manifests/components.json';

function getDocgen( component, legacy ) {
	if ( legacy ) {
		return component.reactDocgen;
	}
	return component.reactComponentMeta;
}

function getProps( component, legacy ) {
	return getDocgen( component, legacy )?.props ?? {};
}

function descriptionFor( component, legacy ) {
	return (
		component.description ||
		getDocgen( component, legacy )?.description ||
		''
	).trim();
}

function propDescriptionCount( props ) {
	return Object.values( props ).filter( ( p ) =>
		( p.description ?? '' ).trim()
	).length;
}

function summarize( label, components, legacy ) {
	const entries = Object.values( components );
	let withDescription = 0;
	let withProps = 0;
	let totalProps = 0;
	let propsWithDescription = 0;
	for ( const component of entries ) {
		if ( descriptionFor( component, legacy ) ) {
			withDescription += 1;
		}
		const props = getProps( component, legacy );
		const propCount = Object.keys( props ).length;
		if ( propCount > 0 ) {
			withProps += 1;
		}
		totalProps += propCount;
		propsWithDescription += propDescriptionCount( props );
	}
	return {
		label,
		total: entries.length,
		withDescription,
		withProps,
		totalProps,
		propsWithDescription,
	};
}

function formatSummary( old, fresh ) {
	const rows = [
		[ 'Components', old.total, fresh.total ],
		[ 'With description', old.withDescription, fresh.withDescription ],
		[ 'With prop data', old.withProps, fresh.withProps ],
		[ 'Total props', old.totalProps, fresh.totalProps ],
		[
			'Props with description',
			old.propsWithDescription,
			fresh.propsWithDescription,
		],
	];
	const colWidth = 24;
	const lines = [
		`${ 'Metric'.padEnd( colWidth ) }${ 'Hosted'.padStart(
			10
		) }${ 'New'.padStart( 10 ) }${ 'Δ'.padStart( 10 ) }`,
		'-'.repeat( colWidth + 30 ),
	];
	for ( const [ name, a, b ] of rows ) {
		const delta = b - a;
		const sign = delta > 0 ? '+' : '';
		lines.push(
			`${ name.padEnd( colWidth ) }${ String( a ).padStart(
				10
			) }${ String( b ).padStart( 10 ) }${ ( sign + delta ).padStart(
				10
			) }`
		);
	}
	return lines.join( '\n' );
}

function indexByKey( components ) {
	const result = new Map();
	for ( const component of Object.values( components ) ) {
		const key = `${ component.path }:${ component.name }`;
		result.set( key, component );
	}
	return result;
}

function diffPerComponent( oldIndex, newIndex ) {
	const findings = {
		descriptionGained: [],
		descriptionLost: [],
		descriptionChanged: [],
		propsGained: [],
		propsLost: [],
		propsCountChanged: [],
		propDescriptionsGained: [],
		propDescriptionsLost: [],
	};

	for ( const [ key, fresh ] of newIndex ) {
		const old = oldIndex.get( key );
		if ( ! old ) {
			continue;
		}
		const oldDesc = descriptionFor( old, true );
		const newDesc = descriptionFor( fresh, false );
		if ( ! oldDesc && newDesc ) {
			findings.descriptionGained.push( { key, newDesc } );
		} else if ( oldDesc && ! newDesc ) {
			findings.descriptionLost.push( { key, oldDesc } );
		} else if ( oldDesc && newDesc && oldDesc !== newDesc ) {
			findings.descriptionChanged.push( { key, oldDesc, newDesc } );
		}

		const oldProps = getProps( old, true );
		const newProps = getProps( fresh, false );
		const oldNames = new Set( Object.keys( oldProps ) );
		const newNames = new Set( Object.keys( newProps ) );
		const added = [ ...newNames ].filter( ( n ) => ! oldNames.has( n ) );
		const removed = [ ...oldNames ].filter( ( n ) => ! newNames.has( n ) );
		if ( added.length ) {
			findings.propsGained.push( { key, names: added } );
		}
		if ( removed.length ) {
			findings.propsLost.push( { key, names: removed } );
		}
		if ( oldNames.size !== newNames.size ) {
			findings.propsCountChanged.push( {
				key,
				before: oldNames.size,
				after: newNames.size,
			} );
		}

		const commonProps = [ ...oldNames ].filter( ( n ) =>
			newNames.has( n )
		);
		const gainedDescriptions = [];
		const lostDescriptions = [];
		for ( const name of commonProps ) {
			const had = ( oldProps[ name ].description ?? '' ).trim();
			const has = ( newProps[ name ].description ?? '' ).trim();
			if ( ! had && has ) {
				gainedDescriptions.push( name );
			} else if ( had && ! has ) {
				lostDescriptions.push( name );
			}
		}
		if ( gainedDescriptions.length ) {
			findings.propDescriptionsGained.push( {
				key,
				names: gainedDescriptions,
			} );
		}
		if ( lostDescriptions.length ) {
			findings.propDescriptionsLost.push( {
				key,
				names: lostDescriptions,
			} );
		}
	}

	return findings;
}

function formatList( title, items, render ) {
	if ( ! items.length ) {
		return '';
	}
	return [
		'',
		`## ${ title } (${ items.length })`,
		'',
		...items.map( render ),
	].join( '\n' );
}

function truncate( text, max = 80 ) {
	const flat = text.replace( /\s+/g, ' ' );
	return flat.length > max ? `${ flat.slice( 0, max - 1 ) }…` : flat;
}

const [ hostedManifest, localRaw ] = await Promise.all( [
	fetch( HOSTED_URL ).then( ( r ) => {
		if ( ! r.ok ) {
			throw new Error( `Failed to fetch ${ HOSTED_URL }: ${ r.status }` );
		}
		return r.json();
	} ),
	readFile( LOCAL_PATH, 'utf8' ).then( JSON.parse ),
] );

const oldIndex = indexByKey( hostedManifest.components ?? {} );
const newIndex = indexByKey( localRaw.components ?? {} );

const oldOnly = [ ...oldIndex.keys() ].filter( ( k ) => ! newIndex.has( k ) );
const newOnly = [ ...newIndex.keys() ].filter( ( k ) => ! oldIndex.has( k ) );

const oldStats = summarize( 'hosted', hostedManifest.components ?? {}, true );
const newStats = summarize( 'new', localRaw.components ?? {}, false );

const findings = diffPerComponent( oldIndex, newIndex );

console.log( '# Manifest comparison' );
console.log( '' );
console.log( `Hosted: ${ HOSTED_URL }` );
console.log( `Local:  ${ LOCAL_PATH }` );
console.log( '' );
console.log( formatSummary( oldStats, newStats ) );

console.log(
	formatList(
		'Components only in hosted manifest',
		oldOnly,
		( k ) => `- ${ k }`
	)
);
console.log(
	formatList(
		'Components only in new manifest',
		newOnly,
		( k ) => `- ${ k }`
	)
);
console.log(
	formatList(
		'Descriptions gained',
		findings.descriptionGained,
		( { key, newDesc } ) => `- ${ key }\n  ${ truncate( newDesc ) }`
	)
);
console.log(
	formatList(
		'Descriptions lost (regressions)',
		findings.descriptionLost,
		( { key, oldDesc } ) => `- ${ key }\n  was: ${ truncate( oldDesc ) }`
	)
);
console.log(
	formatList(
		'Descriptions changed',
		findings.descriptionChanged,
		( { key, oldDesc, newDesc } ) =>
			`- ${ key }\n  - ${ truncate( oldDesc ) }\n  + ${ truncate(
				newDesc
			) }`
	)
);
console.log(
	formatList(
		'Props gained',
		findings.propsGained,
		( { key, names } ) =>
			`- ${ key }: ${ names.slice( 0, 10 ).join( ', ' ) }${
				names.length > 10 ? ` (+${ names.length - 10 } more)` : ''
			}`
	)
);
console.log(
	formatList(
		'Props lost (regressions)',
		findings.propsLost,
		( { key, names } ) =>
			`- ${ key }: ${ names.slice( 0, 10 ).join( ', ' ) }${
				names.length > 10 ? ` (+${ names.length - 10 } more)` : ''
			}`
	)
);
console.log(
	formatList(
		'Prop count changed',
		findings.propsCountChanged,
		( { key, before, after } ) => `- ${ key }: ${ before }${ after }`
	)
);
console.log(
	formatList(
		'Prop descriptions gained',
		findings.propDescriptionsGained,
		( { key, names } ) =>
			`- ${ key }: ${ names.slice( 0, 10 ).join( ', ' ) }${
				names.length > 10 ? ` (+${ names.length - 10 } more)` : ''
			}`
	)
);
console.log(
	formatList(
		'Prop descriptions lost (regressions)',
		findings.propDescriptionsLost,
		( { key, names } ) =>
			`- ${ key }: ${ names.slice( 0, 10 ).join( ', ' ) }${
				names.length > 10 ? ` (+${ names.length - 10 } more)` : ''
			}`
	)
);

Testing Instructions

Verify that development and built outputs produce navigable stories, preserving existing expectations of Storybook that commonly regress in upgrades like like component descriptions, prop tables, code snippets.

Use of AI Tools

Used Claude Code and Claude Opus 4.7 to upgrade, iterate and analyze regressions, and explore workarounds to restore parity of documentation and build times.

@github-actions github-actions Bot added [Package] Components /packages/components [Package] DataViews /packages/dataviews [Package] Theme /packages/theme [Package] UI /packages/ui labels Apr 15, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 15, 2026

Size Change: -16 B (0%)

Total Size: 8.21 MB

📦 View Changed
Filename Size Change
build/scripts/components/index.min.js 263 kB -16 B (-0.01%)
ℹ️ View Unchanged
Filename Size Change
build/modules/a11y/index.min.js 355 B 0 B
build/modules/abilities/index.min.js 42.3 kB 0 B
build/modules/block-editor/utils/fit-text-frontend.min.js 617 B 0 B
build/modules/block-library/accordion/view.min.js 595 B 0 B
build/modules/block-library/file/view.min.js 346 B 0 B
build/modules/block-library/form/view.min.js 528 B 0 B
build/modules/block-library/image/view.min.js 2.64 kB 0 B
build/modules/block-library/navigation/view.min.js 1.14 kB 0 B
build/modules/block-library/playlist/view.min.js 10.9 kB 0 B
build/modules/block-library/query/view.min.js 518 B 0 B
build/modules/block-library/search/view.min.js 498 B 0 B
build/modules/block-library/tabs/view.min.js 946 B 0 B
build/modules/boot/index.min.js 51.8 kB 0 B
build/modules/connectors/index.min.js 2.05 kB 0 B
build/modules/content-types/index.min.js 157 kB 0 B
build/modules/core-abilities/index.min.js 926 B 0 B
build/modules/edit-site-init/index.min.js 1.4 kB 0 B
build/modules/interactivity-router/full-page.min.js 451 B 0 B
build/modules/interactivity-router/index.min.js 11.6 kB 0 B
build/modules/interactivity/index.min.js 15.3 kB 0 B
build/modules/latex-to-mathml/index.min.js 56.5 kB 0 B
build/modules/latex-to-mathml/loader.min.js 131 B 0 B
build/modules/lazy-editor/index.min.js 14.2 kB 0 B
build/modules/route/index.min.js 25.2 kB 0 B
build/modules/vips/loader.min.js 127 B 0 B
build/modules/vips/worker.min.js 4.56 MB 0 B
build/modules/workflow/index.min.js 19.9 kB 0 B
build/scripts/a11y/index.min.js 1.1 kB 0 B
build/scripts/annotations/index.min.js 2.53 kB 0 B
build/scripts/api-fetch/index.min.js 3.34 kB 0 B
build/scripts/autop/index.min.js 2.21 kB 0 B
build/scripts/base-styles/index.min.js 146 B 0 B
build/scripts/blob/index.min.js 665 B 0 B
build/scripts/block-directory/index.min.js 43 kB 0 B
build/scripts/block-editor/index.min.js 379 kB 0 B
build/scripts/block-library/index.min.js 324 kB 0 B
build/scripts/block-serialization-default-parser/index.min.js 1.2 kB 0 B
build/scripts/block-serialization-spec-parser/index.min.js 3.12 kB 0 B
build/scripts/blocks/index.min.js 57.1 kB 0 B
build/scripts/commands/index.min.js 21 kB 0 B
build/scripts/compose/index.min.js 11.7 kB 0 B
build/scripts/core-commands/index.min.js 4.37 kB 0 B
build/scripts/core-data/index.min.js 31.4 kB 0 B
build/scripts/customize-widgets/index.min.js 14.6 kB 0 B
build/scripts/data-controls/index.min.js 832 B 0 B
build/scripts/data/index.min.js 9.74 kB 0 B
build/scripts/date/index.min.js 23.7 kB 0 B
build/scripts/deprecated/index.min.js 784 B 0 B
build/scripts/dom-ready/index.min.js 502 B 0 B
build/scripts/dom/index.min.js 5.04 kB 0 B
build/scripts/edit-post/index.min.js 52 kB 0 B
build/scripts/edit-site/index.min.js 295 kB 0 B
build/scripts/edit-widgets/index.min.js 22.2 kB 0 B
build/scripts/editor/index.min.js 462 kB 0 B
build/scripts/element/index.min.js 5.63 kB 0 B
build/scripts/escape-html/index.min.js 622 B 0 B
build/scripts/format-library/index.min.js 13.1 kB 0 B
build/scripts/hooks/index.min.js 1.86 kB 0 B
build/scripts/html-entities/index.min.js 529 B 0 B
build/scripts/i18n/index.min.js 2.5 kB 0 B
build/scripts/is-shallow-equal/index.min.js 607 B 0 B
build/scripts/keyboard-shortcuts/index.min.js 1.65 kB 0 B
build/scripts/keycodes/index.min.js 1.6 kB 0 B
build/scripts/list-reusable-blocks/index.min.js 2.53 kB 0 B
build/scripts/media-utils/index.min.js 112 kB 0 B
build/scripts/notices/index.min.js 1.72 kB 0 B
build/scripts/nux/index.min.js 909 B 0 B
build/scripts/patterns/index.min.js 8 kB 0 B
build/scripts/plugins/index.min.js 2.18 kB 0 B
build/scripts/preferences-persistence/index.min.js 2.19 kB 0 B
build/scripts/preferences/index.min.js 3.33 kB 0 B
build/scripts/primitives/index.min.js 1.05 kB 0 B
build/scripts/priority-queue/index.min.js 1.65 kB 0 B
build/scripts/private-apis/index.min.js 1.15 kB 0 B
build/scripts/react-i18n/index.min.js 868 B 0 B
build/scripts/redux-routine/index.min.js 3.4 kB 0 B
build/scripts/reusable-blocks/index.min.js 3.14 kB 0 B
build/scripts/rich-text/index.min.js 14.1 kB 0 B
build/scripts/router/index.min.js 5.99 kB 0 B
build/scripts/server-side-render/index.min.js 1.98 kB 0 B
build/scripts/shortcode/index.min.js 1.62 kB 0 B
build/scripts/style-engine/index.min.js 2.45 kB 0 B
build/scripts/sync/index.min.js 39.6 kB 0 B
build/scripts/theme/index.min.js 22 kB 0 B
build/scripts/token-list/index.min.js 767 B 0 B
build/scripts/undo-manager/index.min.js 954 B 0 B
build/scripts/upload-media/index.min.js 11.5 kB 0 B
build/scripts/url/index.min.js 4.02 kB 0 B
build/scripts/vendors/react-dom.min.js 57.7 kB 0 B
build/scripts/vendors/react-jsx-runtime.min.js 513 B 0 B
build/scripts/vendors/react.min.js 3.1 kB 0 B
build/scripts/viewport/index.min.js 1.25 kB 0 B
build/scripts/warning/index.min.js 482 B 0 B
build/scripts/widgets/index.min.js 7.84 kB 0 B
build/scripts/wordcount/index.min.js 1.07 kB 0 B
build/styles/base-styles/admin-schemes-rtl.css 1.71 kB 0 B
build/styles/base-styles/admin-schemes-rtl.min.css 775 B 0 B
build/styles/base-styles/admin-schemes.css 1.71 kB 0 B
build/styles/base-styles/admin-schemes.min.css 775 B 0 B
build/styles/block-directory/style-rtl.css 1.97 kB 0 B
build/styles/block-directory/style-rtl.min.css 1.06 kB 0 B
build/styles/block-directory/style.css 1.98 kB 0 B
build/styles/block-directory/style.min.css 1.06 kB 0 B
build/styles/block-editor/content-rtl.css 5.51 kB 0 B
build/styles/block-editor/content-rtl.min.css 4.08 kB 0 B
build/styles/block-editor/content.css 5.52 kB 0 B
build/styles/block-editor/content.min.css 4.07 kB 0 B
build/styles/block-editor/default-editor-styles-rtl.css 697 B 0 B
build/styles/block-editor/default-editor-styles-rtl.min.css 224 B 0 B
build/styles/block-editor/default-editor-styles.css 697 B 0 B
build/styles/block-editor/default-editor-styles.min.css 224 B 0 B
build/styles/block-editor/style-rtl.css 18.7 kB 0 B
build/styles/block-editor/style-rtl.min.css 15.9 kB 0 B
build/styles/block-editor/style.css 18.7 kB 0 B
build/styles/block-editor/style.min.css 15.9 kB 0 B
build/styles/block-library/accordion-heading/style-rtl.css 346 B 0 B
build/styles/block-library/accordion-heading/style-rtl.min.css 325 B 0 B
build/styles/block-library/accordion-heading/style.css 346 B 0 B
build/styles/block-library/accordion-heading/style.min.css 325 B 0 B
build/styles/block-library/accordion-item/style-rtl.css 239 B 0 B
build/styles/block-library/accordion-item/style-rtl.min.css 180 B 0 B
build/styles/block-library/accordion-item/style.css 238 B 0 B
build/styles/block-library/accordion-item/style.min.css 180 B 0 B
build/styles/block-library/accordion-panel/style-rtl.css 110 B 0 B
build/styles/block-library/accordion-panel/style-rtl.min.css 99 B 0 B
build/styles/block-library/accordion-panel/style.css 110 B 0 B
build/styles/block-library/accordion-panel/style.min.css 99 B 0 B
build/styles/block-library/accordion/style-rtl.css 69 B 0 B
build/styles/block-library/accordion/style-rtl.min.css 62 B 0 B
build/styles/block-library/accordion/style.css 69 B 0 B
build/styles/block-library/accordion/style.min.css 62 B 0 B
build/styles/block-library/archives/style-rtl.css 101 B 0 B
build/styles/block-library/archives/style-rtl.min.css 90 B 0 B
build/styles/block-library/archives/style.css 101 B 0 B
build/styles/block-library/archives/style.min.css 90 B 0 B
build/styles/block-library/audio/editor-rtl.css 166 B 0 B
build/styles/block-library/audio/editor-rtl.min.css 149 B 0 B
build/styles/block-library/audio/editor.css 166 B 0 B
build/styles/block-library/audio/editor.min.css 151 B 0 B
build/styles/block-library/audio/style-rtl.css 945 B 0 B
build/styles/block-library/audio/style-rtl.min.css 132 B 0 B
build/styles/block-library/audio/style.css 945 B 0 B
build/styles/block-library/audio/style.min.css 132 B 0 B
build/styles/block-library/audio/theme-rtl.css 967 B 0 B
build/styles/block-library/audio/theme-rtl.min.css 134 B 0 B
build/styles/block-library/audio/theme.css 967 B 0 B
build/styles/block-library/audio/theme.min.css 134 B 0 B
build/styles/block-library/avatar/editor-rtl.css 127 B 0 B
build/styles/block-library/avatar/editor-rtl.min.css 115 B 0 B
build/styles/block-library/avatar/editor.css 127 B 0 B
build/styles/block-library/avatar/editor.min.css 115 B 0 B
build/styles/block-library/avatar/style-rtl.css 117 B 0 B
build/styles/block-library/avatar/style-rtl.min.css 104 B 0 B
build/styles/block-library/avatar/style.css 117 B 0 B
build/styles/block-library/avatar/style.min.css 104 B 0 B
build/styles/block-library/breadcrumbs/style-rtl.css 236 B 0 B
build/styles/block-library/breadcrumbs/style-rtl.min.css 206 B 0 B
build/styles/block-library/breadcrumbs/style.css 236 B 0 B
build/styles/block-library/breadcrumbs/style.min.css 206 B 0 B
build/styles/block-library/button/editor-rtl.css 306 B 0 B
build/styles/block-library/button/editor-rtl.min.css 265 B 0 B
build/styles/block-library/button/editor.css 317 B 0 B
build/styles/block-library/button/editor.min.css 265 B 0 B
build/styles/block-library/button/style-rtl.css 651 B 0 B
build/styles/block-library/button/style-rtl.min.css 596 B 0 B
build/styles/block-library/button/style.css 662 B 0 B
build/styles/block-library/button/style.min.css 596 B 0 B
build/styles/block-library/buttons/editor-rtl.css 391 B 0 B
build/styles/block-library/buttons/editor-rtl.min.css 291 B 0 B
build/styles/block-library/buttons/editor.css 391 B 0 B
build/styles/block-library/buttons/editor.min.css 291 B 0 B
build/styles/block-library/buttons/style-rtl.css 452 B 0 B
build/styles/block-library/buttons/style-rtl.min.css 349 B 0 B
build/styles/block-library/buttons/style.css 453 B 0 B
build/styles/block-library/buttons/style.min.css 349 B 0 B
build/styles/block-library/calendar/style-rtl.css 271 B 0 B
build/styles/block-library/calendar/style-rtl.min.css 239 B 0 B
build/styles/block-library/calendar/style.css 271 B 0 B
build/styles/block-library/calendar/style.min.css 239 B 0 B
build/styles/block-library/categories/editor-rtl.css 171 B 0 B
build/styles/block-library/categories/editor-rtl.min.css 132 B 0 B
build/styles/block-library/categories/editor.css 170 B 0 B
build/styles/block-library/categories/editor.min.css 131 B 0 B
build/styles/block-library/categories/style-rtl.css 226 B 0 B
build/styles/block-library/categories/style-rtl.min.css 169 B 0 B
build/styles/block-library/categories/style.css 235 B 0 B
build/styles/block-library/categories/style.min.css 169 B 0 B
build/styles/block-library/classic-rtl.css 402 B 0 B
build/styles/block-library/classic-rtl.min.css 358 B 0 B
build/styles/block-library/classic.css 402 B 0 B
build/styles/block-library/classic.min.css 358 B 0 B
build/styles/block-library/code/editor-rtl.css 59 B 0 B
build/styles/block-library/code/editor-rtl.min.css 53 B 0 B
build/styles/block-library/code/editor.css 59 B 0 B
build/styles/block-library/code/editor.min.css 53 B 0 B
build/styles/block-library/code/style-rtl.css 158 B 0 B
build/styles/block-library/code/style-rtl.min.css 140 B 0 B
build/styles/block-library/code/style.css 178 B 0 B
build/styles/block-library/code/style.min.css 140 B 0 B
build/styles/block-library/code/theme-rtl.css 135 B 0 B
build/styles/block-library/code/theme-rtl.min.css 122 B 0 B
build/styles/block-library/code/theme.css 135 B 0 B
build/styles/block-library/code/theme.min.css 122 B 0 B
build/styles/block-library/columns/editor-rtl.css 119 B 0 B
build/styles/block-library/columns/editor-rtl.min.css 108 B 0 B
build/styles/block-library/columns/editor.css 119 B 0 B
build/styles/block-library/columns/editor.min.css 108 B 0 B
build/styles/block-library/columns/style-rtl.css 1.3 kB 0 B
build/styles/block-library/columns/style-rtl.min.css 421 B 0 B
build/styles/block-library/columns/style.css 1.3 kB 0 B
build/styles/block-library/columns/style.min.css 421 B 0 B
build/styles/block-library/comment-author-avatar/editor-rtl.css 136 B 0 B
build/styles/block-library/comment-author-avatar/editor-rtl.min.css 124 B 0 B
build/styles/block-library/comment-author-avatar/editor.css 136 B 0 B
build/styles/block-library/comment-author-avatar/editor.min.css 124 B 0 B
build/styles/block-library/comment-author-name/style-rtl.css 79 B 0 B
build/styles/block-library/comment-author-name/style-rtl.min.css 72 B 0 B
build/styles/block-library/comment-author-name/style.css 79 B 0 B
build/styles/block-library/comment-author-name/style.min.css 72 B 0 B
build/styles/block-library/comment-content/style-rtl.css 137 B 0 B
build/styles/block-library/comment-content/style-rtl.min.css 120 B 0 B
build/styles/block-library/comment-content/style.css 137 B 0 B
build/styles/block-library/comment-content/style.min.css 120 B 0 B
build/styles/block-library/comment-date/style-rtl.css 72 B 0 B
build/styles/block-library/comment-date/style-rtl.min.css 65 B 0 B
build/styles/block-library/comment-date/style.css 72 B 0 B
build/styles/block-library/comment-date/style.min.css 65 B 0 B
build/styles/block-library/comment-edit-link/style-rtl.css 77 B 0 B
build/styles/block-library/comment-edit-link/style-rtl.min.css 70 B 0 B
build/styles/block-library/comment-edit-link/style.css 77 B 0 B
build/styles/block-library/comment-edit-link/style.min.css 70 B 0 B
build/styles/block-library/comment-reply-link/style-rtl.css 78 B 0 B
build/styles/block-library/comment-reply-link/style-rtl.min.css 71 B 0 B
build/styles/block-library/comment-reply-link/style.css 78 B 0 B
build/styles/block-library/comment-reply-link/style.min.css 71 B 0 B
build/styles/block-library/comment-template/style-rtl.css 213 B 0 B
build/styles/block-library/comment-template/style-rtl.min.css 191 B 0 B
build/styles/block-library/comment-template/style.css 213 B 0 B
build/styles/block-library/comment-template/style.min.css 191 B 0 B
build/styles/block-library/comments-pagination-numbers/editor-rtl.css 135 B 0 B
build/styles/block-library/comments-pagination-numbers/editor-rtl.min.css 122 B 0 B
build/styles/block-library/comments-pagination-numbers/editor.css 144 B 0 B
build/styles/block-library/comments-pagination-numbers/editor.min.css 121 B 0 B
build/styles/block-library/comments-pagination/editor-rtl.css 184 B 0 B
build/styles/block-library/comments-pagination/editor-rtl.min.css 168 B 0 B
build/styles/block-library/comments-pagination/editor.css 184 B 0 B
build/styles/block-library/comments-pagination/editor.min.css 168 B 0 B
build/styles/block-library/comments-pagination/style-rtl.css 224 B 0 B
build/styles/block-library/comments-pagination/style-rtl.min.css 201 B 0 B
build/styles/block-library/comments-pagination/style.css 236 B 0 B
build/styles/block-library/comments-pagination/style.min.css 201 B 0 B
build/styles/block-library/comments-title/editor-rtl.css 83 B 0 B
build/styles/block-library/comments-title/editor-rtl.min.css 75 B 0 B
build/styles/block-library/comments-title/editor.css 83 B 0 B
build/styles/block-library/comments-title/editor.min.css 75 B 0 B
build/styles/block-library/comments/editor-rtl.css 968 B 0 B
build/styles/block-library/comments/editor-rtl.min.css 842 B 0 B
build/styles/block-library/comments/editor.css 968 B 0 B
build/styles/block-library/comments/editor.min.css 842 B 0 B
build/styles/block-library/comments/style-rtl.css 754 B 0 B
build/styles/block-library/comments/style-rtl.min.css 637 B 0 B
build/styles/block-library/comments/style.css 752 B 0 B
build/styles/block-library/comments/style.min.css 637 B 0 B
build/styles/block-library/common-rtl.css 2.57 kB 0 B
build/styles/block-library/common-rtl.min.css 1.21 kB 0 B
build/styles/block-library/common.css 2.59 kB 0 B
build/styles/block-library/common.min.css 1.2 kB 0 B
build/styles/block-library/cover/editor-rtl.css 1.05 kB 0 B
build/styles/block-library/cover/editor-rtl.min.css 631 B 0 B
build/styles/block-library/cover/editor.css 1.05 kB 0 B
build/styles/block-library/cover/editor.min.css 631 B 0 B
build/styles/block-library/cover/style-rtl.css 2.5 kB 0 B
build/styles/block-library/cover/style-rtl.min.css 1.82 kB 0 B
build/styles/block-library/cover/style.css 2.51 kB 0 B
build/styles/block-library/cover/style.min.css 1.81 kB 0 B
build/styles/block-library/details/editor-rtl.css 72 B 0 B
build/styles/block-library/details/editor-rtl.min.css 65 B 0 B
build/styles/block-library/details/editor.css 72 B 0 B
build/styles/block-library/details/editor.min.css 65 B 0 B
build/styles/block-library/details/style-rtl.css 97 B 0 B
build/styles/block-library/details/style-rtl.min.css 86 B 0 B
build/styles/block-library/details/style.css 97 B 0 B
build/styles/block-library/details/style.min.css 86 B 0 B
build/styles/block-library/editor-elements-rtl.css 117 B 0 B
build/styles/block-library/editor-elements-rtl.min.css 75 B 0 B
build/styles/block-library/editor-elements.css 117 B 0 B
build/styles/block-library/editor-elements.min.css 75 B 0 B
build/styles/block-library/editor-rtl.css 12.5 kB 0 B
build/styles/block-library/editor-rtl.min.css 10.3 kB 0 B
build/styles/block-library/editor.css 12.5 kB 0 B
build/styles/block-library/editor.min.css 10.3 kB 0 B
build/styles/block-library/elements-rtl.css 84 B 0 B
build/styles/block-library/elements-rtl.min.css 54 B 0 B
build/styles/block-library/elements.css 84 B 0 B
build/styles/block-library/elements.min.css 54 B 0 B
build/styles/block-library/embed/editor-rtl.css 391 B 0 B
build/styles/block-library/embed/editor-rtl.min.css 331 B 0 B
build/styles/block-library/embed/editor.css 390 B 0 B
build/styles/block-library/embed/editor.min.css 331 B 0 B
build/styles/block-library/embed/style-rtl.css 1.29 kB 0 B
build/styles/block-library/embed/style-rtl.min.css 448 B 0 B
build/styles/block-library/embed/style.css 1.29 kB 0 B
build/styles/block-library/embed/style.min.css 448 B 0 B
build/styles/block-library/embed/theme-rtl.css 967 B 0 B
build/styles/block-library/embed/theme-rtl.min.css 133 B 0 B
build/styles/block-library/embed/theme.css 967 B 0 B
build/styles/block-library/embed/theme.min.css 133 B 0 B
build/styles/block-library/file/editor-rtl.css 352 B 0 B
build/styles/block-library/file/editor-rtl.min.css 324 B 0 B
build/styles/block-library/file/editor.css 353 B 0 B
build/styles/block-library/file/editor.min.css 324 B 0 B
build/styles/block-library/file/style-rtl.css 318 B 0 B
build/styles/block-library/file/style-rtl.min.css 278 B 0 B
build/styles/block-library/file/style.css 331 B 0 B
build/styles/block-library/file/style.min.css 278 B 0 B
build/styles/block-library/footnotes/style-rtl.css 220 B 0 B
build/styles/block-library/footnotes/style-rtl.min.css 198 B 0 B
build/styles/block-library/footnotes/style.css 219 B 0 B
build/styles/block-library/footnotes/style.min.css 197 B 0 B
build/styles/block-library/form-input/editor-rtl.css 286 B 0 B
build/styles/block-library/form-input/editor-rtl.min.css 265 B 0 B
build/styles/block-library/form-input/editor.css 285 B 0 B
build/styles/block-library/form-input/editor.min.css 264 B 0 B
build/styles/block-library/form-input/style-rtl.css 467 B 0 B
build/styles/block-library/form-input/style-rtl.min.css 366 B 0 B
build/styles/block-library/form-input/style.css 467 B 0 B
build/styles/block-library/form-input/style.min.css 366 B 0 B
build/styles/block-library/form-submission-notification/editor-rtl.css 368 B 0 B
build/styles/block-library/form-submission-notification/editor-rtl.min.css 344 B 0 B
build/styles/block-library/form-submission-notification/editor.css 368 B 0 B
build/styles/block-library/form-submission-notification/editor.min.css 341 B 0 B
build/styles/block-library/form-submit-button/style-rtl.css 77 B 0 B
build/styles/block-library/form-submit-button/style-rtl.min.css 69 B 0 B
build/styles/block-library/form-submit-button/style.css 77 B 0 B
build/styles/block-library/form-submit-button/style.min.css 69 B 0 B
build/styles/block-library/freeform/editor-rtl.css 1.12 kB 0 B
build/styles/block-library/freeform/editor-rtl.min.css 288 B 0 B
build/styles/block-library/freeform/editor.css 1.12 kB 0 B
build/styles/block-library/freeform/editor.min.css 288 B 0 B
build/styles/block-library/gallery/editor-rtl.css 1.46 kB 0 B
build/styles/block-library/gallery/editor-rtl.min.css 561 B 0 B
build/styles/block-library/gallery/editor.css 1.46 kB 0 B
build/styles/block-library/gallery/editor.min.css 564 B 0 B
build/styles/block-library/gallery/style-rtl.css 2.84 kB 0 B
build/styles/block-library/gallery/style-rtl.min.css 1.84 kB 0 B
build/styles/block-library/gallery/style.css 2.84 kB 0 B
build/styles/block-library/gallery/style.min.css 1.84 kB 0 B
build/styles/block-library/gallery/theme-rtl.css 941 B 0 B
build/styles/block-library/gallery/theme-rtl.min.css 108 B 0 B
build/styles/block-library/gallery/theme.css 941 B 0 B
build/styles/block-library/gallery/theme.min.css 108 B 0 B
build/styles/block-library/group/editor-rtl.css 772 B 0 B
build/styles/block-library/group/editor-rtl.min.css 335 B 0 B
build/styles/block-library/group/editor.css 772 B 0 B
build/styles/block-library/group/editor.min.css 335 B 0 B
build/styles/block-library/group/style-rtl.css 120 B 0 B
build/styles/block-library/group/style-rtl.min.css 103 B 0 B
build/styles/block-library/group/style.css 120 B 0 B
build/styles/block-library/group/style.min.css 103 B 0 B
build/styles/block-library/group/theme-rtl.css 468 B 0 B
build/styles/block-library/group/theme-rtl.min.css 79 B 0 B
build/styles/block-library/group/theme.css 468 B 0 B
build/styles/block-library/group/theme.min.css 79 B 0 B
build/styles/block-library/heading/style-rtl.css 604 B 0 B
build/styles/block-library/heading/style-rtl.min.css 205 B 0 B
build/styles/block-library/heading/style.css 604 B 0 B
build/styles/block-library/heading/style.min.css 205 B 0 B
build/styles/block-library/html/editor-rtl.css 1.29 kB 0 B
build/styles/block-library/html/editor-rtl.min.css 464 B 0 B
build/styles/block-library/html/editor.css 1.3 kB 0 B
build/styles/block-library/html/editor.min.css 464 B 0 B
build/styles/block-library/icon/editor-rtl.css 776 B 0 B
build/styles/block-library/icon/editor-rtl.min.css 377 B 0 B
build/styles/block-library/icon/editor.css 776 B 0 B
build/styles/block-library/icon/editor.min.css 377 B 0 B
build/styles/block-library/icon/style-rtl.css 218 B 0 B
build/styles/block-library/icon/style-rtl.min.css 154 B 0 B
build/styles/block-library/icon/style.css 218 B 0 B
build/styles/block-library/icon/style.min.css 154 B 0 B
build/styles/block-library/image/editor-rtl.css 1.64 kB 0 B
build/styles/block-library/image/editor-rtl.min.css 782 B 0 B
build/styles/block-library/image/editor.css 1.64 kB 0 B
build/styles/block-library/image/editor.min.css 780 B 0 B
build/styles/block-library/image/style-rtl.css 2.92 kB 0 B
build/styles/block-library/image/style-rtl.min.css 1.86 kB 0 B
build/styles/block-library/image/style.css 2.92 kB 0 B
build/styles/block-library/image/style.min.css 1.85 kB 0 B
build/styles/block-library/image/theme-rtl.css 971 B 0 B
build/styles/block-library/image/theme-rtl.min.css 137 B 0 B
build/styles/block-library/image/theme.css 971 B 0 B
build/styles/block-library/image/theme.min.css 137 B 0 B
build/styles/block-library/latest-comments/style-rtl.css 392 B 0 B
build/styles/block-library/latest-comments/style-rtl.min.css 352 B 0 B
build/styles/block-library/latest-comments/style.css 390 B 0 B
build/styles/block-library/latest-comments/style.min.css 352 B 0 B
build/styles/block-library/latest-posts/editor-rtl.css 154 B 0 B
build/styles/block-library/latest-posts/editor-rtl.min.css 139 B 0 B
build/styles/block-library/latest-posts/editor.css 153 B 0 B
build/styles/block-library/latest-posts/editor.min.css 138 B 0 B
build/styles/block-library/latest-posts/style-rtl.css 1.36 kB 0 B
build/styles/block-library/latest-posts/style-rtl.min.css 520 B 0 B
build/styles/block-library/latest-posts/style.css 1.37 kB 0 B
build/styles/block-library/latest-posts/style.min.css 520 B 0 B
build/styles/block-library/list/style-rtl.css 498 B 0 B
build/styles/block-library/list/style-rtl.min.css 107 B 0 B
build/styles/block-library/list/style.css 498 B 0 B
build/styles/block-library/list/style.min.css 107 B 0 B
build/styles/block-library/loginout/style-rtl.css 68 B 0 B
build/styles/block-library/loginout/style-rtl.min.css 61 B 0 B
build/styles/block-library/loginout/style.css 68 B 0 B
build/styles/block-library/loginout/style.min.css 61 B 0 B
build/styles/block-library/math/editor-rtl.css 491 B 0 B
build/styles/block-library/math/editor-rtl.min.css 105 B 0 B
build/styles/block-library/math/editor.css 502 B 0 B
build/styles/block-library/math/editor.min.css 105 B 0 B
build/styles/block-library/math/style-rtl.css 70 B 0 B
build/styles/block-library/math/style-rtl.min.css 61 B 0 B
build/styles/block-library/math/style.css 70 B 0 B
build/styles/block-library/math/style.min.css 61 B 0 B
build/styles/block-library/media-text/editor-rtl.css 389 B 0 B
build/styles/block-library/media-text/editor-rtl.min.css 321 B 0 B
build/styles/block-library/media-text/editor.css 389 B 0 B
build/styles/block-library/media-text/editor.min.css 320 B 0 B
build/styles/block-library/media-text/style-rtl.css 873 B 0 B
build/styles/block-library/media-text/style-rtl.min.css 552 B 0 B
build/styles/block-library/media-text/style.css 901 B 0 B
build/styles/block-library/media-text/style.min.css 550 B 0 B
build/styles/block-library/more/editor-rtl.css 796 B 0 B
build/styles/block-library/more/editor-rtl.min.css 393 B 0 B
build/styles/block-library/more/editor.css 798 B 0 B
build/styles/block-library/more/editor.min.css 393 B 0 B
build/styles/block-library/navigation-link/editor-rtl.css 1.28 kB 0 B
build/styles/block-library/navigation-link/editor-rtl.min.css 710 B 0 B
build/styles/block-library/navigation-link/editor.css 1.27 kB 0 B
build/styles/block-library/navigation-link/editor.min.css 713 B 0 B
build/styles/block-library/navigation-link/style-rtl.css 579 B 0 B
build/styles/block-library/navigation-link/style-rtl.min.css 190 B 0 B
build/styles/block-library/navigation-link/style.css 579 B 0 B
build/styles/block-library/navigation-link/style.min.css 188 B 0 B
build/styles/block-library/navigation-overlay-close/style-rtl.css 260 B 0 B
build/styles/block-library/navigation-overlay-close/style-rtl.min.css 237 B 0 B
build/styles/block-library/navigation-overlay-close/style.css 260 B 0 B
build/styles/block-library/navigation-overlay-close/style.min.css 237 B 0 B
build/styles/block-library/navigation-submenu/editor-rtl.css 1.12 kB 0 B
build/styles/block-library/navigation-submenu/editor-rtl.min.css 295 B 0 B
build/styles/block-library/navigation-submenu/editor.css 1.12 kB 0 B
build/styles/block-library/navigation-submenu/editor.min.css 294 B 0 B
build/styles/block-library/navigation/editor-rtl.css 3.28 kB 0 B
build/styles/block-library/navigation/editor-rtl.min.css 2.28 kB 0 B
build/styles/block-library/navigation/editor.css 3.29 kB 0 B
build/styles/block-library/navigation/editor.min.css 2.28 kB 0 B
build/styles/block-library/navigation/style-rtl.css 3.59 kB 0 B
build/styles/block-library/navigation/style-rtl.min.css 2.52 kB 0 B
build/styles/block-library/navigation/style.css 3.59 kB 0 B
build/styles/block-library/navigation/style.min.css 2.5 kB 0 B
build/styles/block-library/nextpage/editor-rtl.css 799 B 0 B
build/styles/block-library/nextpage/editor-rtl.min.css 392 B 0 B
build/styles/block-library/nextpage/editor.css 800 B 0 B
build/styles/block-library/nextpage/editor.min.css 392 B 0 B
build/styles/block-library/page-list/editor-rtl.css 1.18 kB 0 B
build/styles/block-library/page-list/editor-rtl.min.css 356 B 0 B
build/styles/block-library/page-list/editor.css 1.18 kB 0 B
build/styles/block-library/page-list/editor.min.css 356 B 0 B
build/styles/block-library/page-list/style-rtl.css 207 B 0 B
build/styles/block-library/page-list/style-rtl.min.css 192 B 0 B
build/styles/block-library/page-list/style.css 207 B 0 B
build/styles/block-library/page-list/style.min.css 192 B 0 B
build/styles/block-library/paragraph/editor-rtl.css 315 B 0 B
build/styles/block-library/paragraph/editor-rtl.min.css 292 B 0 B
build/styles/block-library/paragraph/editor.css 314 B 0 B
build/styles/block-library/paragraph/editor.min.css 292 B 0 B
build/styles/block-library/paragraph/style-rtl.css 746 B 0 B
build/styles/block-library/paragraph/style-rtl.min.css 341 B 0 B
build/styles/block-library/paragraph/style.css 752 B 0 B
build/styles/block-library/paragraph/style.min.css 340 B 0 B
build/styles/block-library/playlist-track/style-rtl.css 453 B 0 B
build/styles/block-library/playlist-track/style-rtl.min.css 420 B 0 B
build/styles/block-library/playlist-track/style.css 453 B 0 B
build/styles/block-library/playlist-track/style.min.css 420 B 0 B
build/styles/block-library/playlist/editor-rtl.css 120 B 0 B
build/styles/block-library/playlist/editor-rtl.min.css 112 B 0 B
build/styles/block-library/playlist/editor.css 120 B 0 B
build/styles/block-library/playlist/editor.min.css 112 B 0 B
build/styles/block-library/playlist/style-rtl.css 1.52 kB 0 B
build/styles/block-library/playlist/style-rtl.min.css 1.42 kB 0 B
build/styles/block-library/playlist/style.css 1.52 kB 0 B
build/styles/block-library/playlist/style.min.css 1.42 kB 0 B
build/styles/block-library/post-author-biography/style-rtl.css 96 B 0 B
build/styles/block-library/post-author-biography/style-rtl.min.css 86 B 0 B
build/styles/block-library/post-author-biography/style.css 96 B 0 B
build/styles/block-library/post-author-biography/style.min.css 86 B 0 B
build/styles/block-library/post-author-name/style-rtl.css 76 B 0 B
build/styles/block-library/post-author-name/style-rtl.min.css 69 B 0 B
build/styles/block-library/post-author-name/style.css 76 B 0 B
build/styles/block-library/post-author-name/style.min.css 69 B 0 B
build/styles/block-library/post-author/editor-rtl.css 490 B 0 B
build/styles/block-library/post-author/editor-rtl.min.css 104 B 0 B
build/styles/block-library/post-author/editor.css 490 B 0 B
build/styles/block-library/post-author/editor.min.css 104 B 0 B
build/styles/block-library/post-author/style-rtl.css 213 B 0 B
build/styles/block-library/post-author/style-rtl.min.css 188 B 0 B
build/styles/block-library/post-author/style.css 214 B 0 B
build/styles/block-library/post-author/style.min.css 189 B 0 B
build/styles/block-library/post-comments-count/style-rtl.css 79 B 0 B
build/styles/block-library/post-comments-count/style-rtl.min.css 72 B 0 B
build/styles/block-library/post-comments-count/style.css 79 B 0 B
build/styles/block-library/post-comments-count/style.min.css 72 B 0 B
build/styles/block-library/post-comments-form/editor-rtl.css 104 B 0 B
build/styles/block-library/post-comments-form/editor-rtl.min.css 96 B 0 B
build/styles/block-library/post-comments-form/editor.css 104 B 0 B
build/styles/block-library/post-comments-form/editor.min.css 96 B 0 B
build/styles/block-library/post-comments-form/style-rtl.css 585 B 0 B
build/styles/block-library/post-comments-form/style-rtl.min.css 525 B 0 B
build/styles/block-library/post-comments-form/style.css 584 B 0 B
build/styles/block-library/post-comments-form/style.min.css 525 B 0 B
build/styles/block-library/post-comments-link/style-rtl.css 78 B 0 B
build/styles/block-library/post-comments-link/style-rtl.min.css 71 B 0 B
build/styles/block-library/post-comments-link/style.css 78 B 0 B
build/styles/block-library/post-comments-link/style.min.css 71 B 0 B
build/styles/block-library/post-content/style-rtl.css 68 B 0 B
build/styles/block-library/post-content/style-rtl.min.css 61 B 0 B
build/styles/block-library/post-content/style.css 68 B 0 B
build/styles/block-library/post-content/style.min.css 61 B 0 B
build/styles/block-library/post-date/style-rtl.css 69 B 0 B
build/styles/block-library/post-date/style-rtl.min.css 62 B 0 B
build/styles/block-library/post-date/style.css 69 B 0 B
build/styles/block-library/post-date/style.min.css 62 B 0 B
build/styles/block-library/post-excerpt/editor-rtl.css 78 B 0 B
build/styles/block-library/post-excerpt/editor-rtl.min.css 71 B 0 B
build/styles/block-library/post-excerpt/editor.css 78 B 0 B
build/styles/block-library/post-excerpt/editor.min.css 71 B 0 B
build/styles/block-library/post-excerpt/style-rtl.css 171 B 0 B
build/styles/block-library/post-excerpt/style-rtl.min.css 155 B 0 B
build/styles/block-library/post-excerpt/style.css 171 B 0 B
build/styles/block-library/post-excerpt/style.min.css 155 B 0 B
build/styles/block-library/post-featured-image/editor-rtl.css 1.14 kB 0 B
build/styles/block-library/post-featured-image/editor-rtl.min.css 719 B 0 B
build/styles/block-library/post-featured-image/editor.css 1.14 kB 0 B
build/styles/block-library/post-featured-image/editor.min.css 717 B 0 B
build/styles/block-library/post-featured-image/style-rtl.css 392 B 0 B
build/styles/block-library/post-featured-image/style-rtl.min.css 347 B 0 B
build/styles/block-library/post-featured-image/style.css 392 B 0 B
build/styles/block-library/post-featured-image/style.min.css 347 B 0 B
build/styles/block-library/post-navigation-link/style-rtl.css 234 B 0 B
build/styles/block-library/post-navigation-link/style-rtl.min.css 215 B 0 B
build/styles/block-library/post-navigation-link/style.css 245 B 0 B
build/styles/block-library/post-navigation-link/style.min.css 214 B 0 B
build/styles/block-library/post-template/style-rtl.css 1.27 kB 0 B
build/styles/block-library/post-template/style-rtl.min.css 441 B 0 B
build/styles/block-library/post-template/style.css 1.27 kB 0 B
build/styles/block-library/post-template/style.min.css 441 B 0 B
build/styles/block-library/post-terms/style-rtl.css 108 B 0 B
build/styles/block-library/post-terms/style-rtl.min.css 96 B 0 B
build/styles/block-library/post-terms/style.css 108 B 0 B
build/styles/block-library/post-terms/style.min.css 96 B 0 B
build/styles/block-library/post-time-to-read/style-rtl.css 77 B 0 B
build/styles/block-library/post-time-to-read/style-rtl.min.css 70 B 0 B
build/styles/block-library/post-time-to-read/style.css 77 B 0 B
build/styles/block-library/post-time-to-read/style.min.css 70 B 0 B
build/styles/block-library/post-title/style-rtl.css 175 B 0 B
build/styles/block-library/post-title/style-rtl.min.css 162 B 0 B
build/styles/block-library/post-title/style.css 175 B 0 B
build/styles/block-library/post-title/style.min.css 162 B 0 B
build/styles/block-library/preformatted/style-rtl.css 511 B 0 B
build/styles/block-library/preformatted/style-rtl.min.css 125 B 0 B
build/styles/block-library/preformatted/style.css 511 B 0 B
build/styles/block-library/preformatted/style.min.css 125 B 0 B
build/styles/block-library/pullquote/editor-rtl.css 146 B 0 B
build/styles/block-library/pullquote/editor-rtl.min.css 133 B 0 B
build/styles/block-library/pullquote/editor.css 146 B 0 B
build/styles/block-library/pullquote/editor.min.css 133 B 0 B
build/styles/block-library/pullquote/style-rtl.css 765 B 0 B
build/styles/block-library/pullquote/style-rtl.min.css 365 B 0 B
build/styles/block-library/pullquote/style.css 764 B 0 B
build/styles/block-library/pullquote/style.min.css 365 B 0 B
build/styles/block-library/pullquote/theme-rtl.css 195 B 0 B
build/styles/block-library/pullquote/theme-rtl.min.css 176 B 0 B
build/styles/block-library/pullquote/theme.css 195 B 0 B
build/styles/block-library/pullquote/theme.min.css 176 B 0 B
build/styles/block-library/query-pagination-numbers/editor-rtl.css 134 B 0 B
build/styles/block-library/query-pagination-numbers/editor-rtl.min.css 121 B 0 B
build/styles/block-library/query-pagination-numbers/editor.css 144 B 0 B
build/styles/block-library/query-pagination-numbers/editor.min.css 118 B 0 B
build/styles/block-library/query-pagination/editor-rtl.css 168 B 0 B
build/styles/block-library/query-pagination/editor-rtl.min.css 154 B 0 B
build/styles/block-library/query-pagination/editor.css 168 B 0 B
build/styles/block-library/query-pagination/editor.min.css 154 B 0 B
build/styles/block-library/query-pagination/style-rtl.css 254 B 0 B
build/styles/block-library/query-pagination/style-rtl.min.css 237 B 0 B
build/styles/block-library/query-pagination/style.css 265 B 0 B
build/styles/block-library/query-pagination/style.min.css 237 B 0 B
build/styles/block-library/query-title/style-rtl.css 71 B 0 B
build/styles/block-library/query-title/style-rtl.min.css 64 B 0 B
build/styles/block-library/query-title/style.css 71 B 0 B
build/styles/block-library/query-title/style.min.css 64 B 0 B
build/styles/block-library/query-total/style-rtl.css 71 B 0 B
build/styles/block-library/query-total/style-rtl.min.css 64 B 0 B
build/styles/block-library/query-total/style.css 71 B 0 B
build/styles/block-library/query-total/style.min.css 64 B 0 B
build/styles/block-library/query/editor-rtl.css 1.28 kB 0 B
build/styles/block-library/query/editor-rtl.min.css 438 B 0 B
build/styles/block-library/query/editor.css 1.28 kB 0 B
build/styles/block-library/query/editor.min.css 438 B 0 B
build/styles/block-library/quote/style-rtl.css 255 B 0 B
build/styles/block-library/quote/style-rtl.min.css 238 B 0 B
build/styles/block-library/quote/style.css 256 B 0 B
build/styles/block-library/quote/style.min.css 238 B 0 B
build/styles/block-library/quote/theme-rtl.css 253 B 0 B
build/styles/block-library/quote/theme-rtl.min.css 233 B 0 B
build/styles/block-library/quote/theme.css 254 B 0 B
build/styles/block-library/quote/theme.min.css 236 B 0 B
build/styles/block-library/read-more/style-rtl.css 146 B 0 B
build/styles/block-library/read-more/style-rtl.min.css 131 B 0 B
build/styles/block-library/read-more/style.css 146 B 0 B
build/styles/block-library/read-more/style.min.css 131 B 0 B
build/styles/block-library/reset-rtl.css 936 B 0 B
build/styles/block-library/reset-rtl.min.css 467 B 0 B
build/styles/block-library/reset.css 936 B 0 B
build/styles/block-library/reset.min.css 467 B 0 B
build/styles/block-library/rss/editor-rtl.css 144 B 0 B
build/styles/block-library/rss/editor-rtl.min.css 126 B 0 B
build/styles/block-library/rss/editor.css 144 B 0 B
build/styles/block-library/rss/editor.min.css 126 B 0 B
build/styles/block-library/rss/style-rtl.css 1.11 kB 0 B
build/styles/block-library/rss/style-rtl.min.css 284 B 0 B
build/styles/block-library/rss/style.css 1.12 kB 0 B
build/styles/block-library/rss/style.min.css 283 B 0 B
build/styles/block-library/search/editor-rtl.css 217 B 0 B
build/styles/block-library/search/editor-rtl.min.css 199 B 0 B
build/styles/block-library/search/editor.css 217 B 0 B
build/styles/block-library/search/editor.min.css 199 B 0 B
build/styles/block-library/search/style-rtl.css 1.1 kB 0 B
build/styles/block-library/search/style-rtl.min.css 665 B 0 B
build/styles/block-library/search/style.css 1.1 kB 0 B
build/styles/block-library/search/style.min.css 666 B 0 B
build/styles/block-library/search/theme-rtl.css 130 B 0 B
build/styles/block-library/search/theme-rtl.min.css 113 B 0 B
build/styles/block-library/search/theme.css 130 B 0 B
build/styles/block-library/search/theme.min.css 113 B 0 B
build/styles/block-library/separator/editor-rtl.css 106 B 0 B
build/styles/block-library/separator/editor-rtl.min.css 100 B 0 B
build/styles/block-library/separator/editor.css 106 B 0 B
build/styles/block-library/separator/editor.min.css 100 B 0 B
build/styles/block-library/separator/style-rtl.css 284 B 0 B
build/styles/block-library/separator/style-rtl.min.css 248 B 0 B
build/styles/block-library/separator/style.css 297 B 0 B
build/styles/block-library/separator/style.min.css 248 B 0 B
build/styles/block-library/separator/theme-rtl.css 226 B 0 B
build/styles/block-library/separator/theme-rtl.min.css 195 B 0 B
build/styles/block-library/separator/theme.css 226 B 0 B
build/styles/block-library/separator/theme.min.css 195 B 0 B
build/styles/block-library/shortcode/editor-rtl.css 1.1 kB 0 B
build/styles/block-library/shortcode/editor-rtl.min.css 286 B 0 B
build/styles/block-library/shortcode/editor.css 1.1 kB 0 B
build/styles/block-library/shortcode/editor.min.css 286 B 0 B
build/styles/block-library/site-logo/editor-rtl.css 1.12 kB 0 B
build/styles/block-library/site-logo/editor-rtl.min.css 696 B 0 B
build/styles/block-library/site-logo/editor.css 1.12 kB 0 B
build/styles/block-library/site-logo/editor.min.css 692 B 0 B
build/styles/block-library/site-logo/style-rtl.css 239 B 0 B
build/styles/block-library/site-logo/style-rtl.min.css 218 B 0 B
build/styles/block-library/site-logo/style.css 238 B 0 B
build/styles/block-library/site-logo/style.min.css 218 B 0 B
build/styles/block-library/site-tagline/editor-rtl.css 94 B 0 B
build/styles/block-library/site-tagline/editor-rtl.min.css 87 B 0 B
build/styles/block-library/site-tagline/editor.css 94 B 0 B
build/styles/block-library/site-tagline/editor.min.css 87 B 0 B
build/styles/block-library/site-tagline/style-rtl.css 72 B 0 B
build/styles/block-library/site-tagline/style-rtl.min.css 65 B 0 B
build/styles/block-library/site-tagline/style.css 72 B 0 B
build/styles/block-library/site-tagline/style.min.css 65 B 0 B
build/styles/block-library/site-title/editor-rtl.css 93 B 0 B
build/styles/block-library/site-title/editor-rtl.min.css 85 B 0 B
build/styles/block-library/site-title/editor.css 93 B 0 B
build/styles/block-library/site-title/editor.min.css 85 B 0 B
build/styles/block-library/site-title/style-rtl.css 153 B 0 B
build/styles/block-library/site-title/style-rtl.min.css 143 B 0 B
build/styles/block-library/site-title/style.css 153 B 0 B
build/styles/block-library/site-title/style.min.css 143 B 0 B
build/styles/block-library/social-link/editor-rtl.css 346 B 0 B
build/styles/block-library/social-link/editor-rtl.min.css 314 B 0 B
build/styles/block-library/social-link/editor.css 348 B 0 B
build/styles/block-library/social-link/editor.min.css 314 B 0 B
build/styles/block-library/social-links/editor-rtl.css 737 B 0 B
build/styles/block-library/social-links/editor-rtl.min.css 339 B 0 B
build/styles/block-library/social-links/editor.css 738 B 0 B
build/styles/block-library/social-links/editor.min.css 338 B 0 B
build/styles/block-library/social-links/style-rtl.css 1.57 kB 0 B
build/styles/block-library/social-links/style-rtl.min.css 1.51 kB 0 B
build/styles/block-library/social-links/style.css 1.57 kB 0 B
build/styles/block-library/social-links/style.min.css 1.51 kB 0 B
build/styles/block-library/spacer/editor-rtl.css 774 B 0 B
build/styles/block-library/spacer/editor-rtl.min.css 346 B 0 B
build/styles/block-library/spacer/editor.css 774 B 0 B
build/styles/block-library/spacer/editor.min.css 346 B 0 B
build/styles/block-library/spacer/style-rtl.css 55 B 0 B
build/styles/block-library/spacer/style-rtl.min.css 48 B 0 B
build/styles/block-library/spacer/style.css 55 B 0 B
build/styles/block-library/spacer/style.min.css 48 B 0 B
build/styles/block-library/style-rtl.css 21.6 kB 0 B
build/styles/block-library/style-rtl.min.css 18.1 kB 0 B
build/styles/block-library/style.css 21.7 kB 0 B
build/styles/block-library/style.min.css 18 kB 0 B
build/styles/block-library/tab-list/editor-rtl.css 107 B 0 B
build/styles/block-library/tab-list/editor-rtl.min.css 97 B 0 B
build/styles/block-library/tab-list/editor.css 107 B 0 B
build/styles/block-library/tab-list/editor.min.css 97 B 0 B
build/styles/block-library/tab-panel/style-rtl.css 238 B 0 B
build/styles/block-library/tab-panel/style-rtl.min.css 215 B 0 B
build/styles/block-library/tab-panel/style.css 238 B 0 B
build/styles/block-library/tab-panel/style.min.css 215 B 0 B
build/styles/block-library/tab-panels/style-rtl.css 76 B 0 B
build/styles/block-library/tab-panels/style-rtl.min.css 65 B 0 B
build/styles/block-library/tab-panels/style.css 76 B 0 B
build/styles/block-library/tab-panels/style.min.css 65 B 0 B
build/styles/block-library/tab/editor-rtl.css 160 B 0 B
build/styles/block-library/tab/editor-rtl.min.css 148 B 0 B
build/styles/block-library/tab/editor.css 160 B 0 B
build/styles/block-library/tab/editor.min.css 148 B 0 B
build/styles/block-library/tab/style-rtl.css 397 B 0 B
build/styles/block-library/tab/style-rtl.min.css 352 B 0 B
build/styles/block-library/tab/style.css 398 B 0 B
build/styles/block-library/tab/style.min.css 356 B 0 B
build/styles/block-library/table-of-contents/style-rtl.css 89 B 0 B
build/styles/block-library/table-of-contents/style-rtl.min.css 83 B 0 B
build/styles/block-library/table-of-contents/style.css 89 B 0 B
build/styles/block-library/table-of-contents/style.min.css 83 B 0 B
build/styles/block-library/table/editor-rtl.css 1.25 kB 0 B
build/styles/block-library/table/editor-rtl.min.css 394 B 0 B
build/styles/block-library/table/editor.css 1.25 kB 0 B
build/styles/block-library/table/editor.min.css 394 B 0 B
build/styles/block-library/table/style-rtl.css 1.06 kB 0 B
build/styles/block-library/table/style-rtl.min.css 641 B 0 B
build/styles/block-library/table/style.css 1.06 kB 0 B
build/styles/block-library/table/style.min.css 640 B 0 B
build/styles/block-library/table/theme-rtl.css 985 B 0 B
build/styles/block-library/table/theme-rtl.min.css 152 B 0 B
build/styles/block-library/table/theme.css 985 B 0 B
build/styles/block-library/table/theme.min.css 152 B 0 B
build/styles/block-library/tabs/style-rtl.css 64 B 0 B
build/styles/block-library/tabs/style-rtl.min.css 57 B 0 B
build/styles/block-library/tabs/style.css 64 B 0 B
build/styles/block-library/tabs/style.min.css 57 B 0 B
build/styles/block-library/tag-cloud/style-rtl.css 283 B 0 B
build/styles/block-library/tag-cloud/style-rtl.min.css 248 B 0 B
build/styles/block-library/tag-cloud/style.css 283 B 0 B
build/styles/block-library/tag-cloud/style.min.css 248 B 0 B
build/styles/block-library/template-part/editor-rtl.css 1.2 kB 0 B
build/styles/block-library/template-part/editor-rtl.min.css 368 B 0 B
build/styles/block-library/template-part/editor.css 1.2 kB 0 B
build/styles/block-library/template-part/editor.min.css 368 B 0 B
build/styles/block-library/template-part/theme-rtl.css 492 B 0 B
build/styles/block-library/template-part/theme-rtl.min.css 113 B 0 B
build/styles/block-library/template-part/theme.css 492 B 0 B
build/styles/block-library/template-part/theme.min.css 113 B 0 B
build/styles/block-library/term-count/style-rtl.css 70 B 0 B
build/styles/block-library/term-count/style-rtl.min.css 63 B 0 B
build/styles/block-library/term-count/style.css 70 B 0 B
build/styles/block-library/term-count/style.min.css 63 B 0 B
build/styles/block-library/term-description/style-rtl.css 138 B 0 B
build/styles/block-library/term-description/style-rtl.min.css 126 B 0 B
build/styles/block-library/term-description/style.css 138 B 0 B
build/styles/block-library/term-description/style.min.css 126 B 0 B
build/styles/block-library/term-name/style-rtl.css 69 B 0 B
build/styles/block-library/term-name/style-rtl.min.css 62 B 0 B
build/styles/block-library/term-name/style.css 69 B 0 B
build/styles/block-library/term-name/style.min.css 62 B 0 B
build/styles/block-library/term-template/editor-rtl.css 267 B 0 B
build/styles/block-library/term-template/editor-rtl.min.css 225 B 0 B
build/styles/block-library/term-template/editor.css 267 B 0 B
build/styles/block-library/term-template/editor.min.css 225 B 0 B
build/styles/block-library/term-template/style-rtl.css 124 B 0 B
build/styles/block-library/term-template/style-rtl.min.css 114 B 0 B
build/styles/block-library/term-template/style.css 124 B 0 B
build/styles/block-library/term-template/style.min.css 114 B 0 B
build/styles/block-library/text-columns/editor-rtl.css 481 B 0 B
build/styles/block-library/text-columns/editor-rtl.min.css 95 B 0 B
build/styles/block-library/text-columns/editor.css 481 B 0 B
build/styles/block-library/text-columns/editor.min.css 95 B 0 B
build/styles/block-library/text-columns/style-rtl.css 177 B 0 B
build/styles/block-library/text-columns/style-rtl.min.css 165 B 0 B
build/styles/block-library/text-columns/style.css 177 B 0 B
build/styles/block-library/text-columns/style.min.css 165 B 0 B
build/styles/block-library/theme-rtl.css 1.59 kB 0 B
build/styles/block-library/theme-rtl.min.css 715 B 0 B
build/styles/block-library/theme.css 1.6 kB 0 B
build/styles/block-library/theme.min.css 719 B 0 B
build/styles/block-library/verse/style-rtl.css 155 B 0 B
build/styles/block-library/verse/style-rtl.min.css 137 B 0 B
build/styles/block-library/verse/style.css 155 B 0 B
build/styles/block-library/verse/style.min.css 137 B 0 B
build/styles/block-library/video/editor-rtl.css 839 B 0 B
build/styles/block-library/video/editor-rtl.min.css 428 B 0 B
build/styles/block-library/video/editor.css 840 B 0 B
build/styles/block-library/video/editor.min.css 428 B 0 B
build/styles/block-library/video/style-rtl.css 1.02 kB 0 B
build/styles/block-library/video/style-rtl.min.css 202 B 0 B
build/styles/block-library/video/style.css 1.02 kB 0 B
build/styles/block-library/video/style.min.css 202 B 0 B
build/styles/block-library/video/theme-rtl.css 967 B 0 B
build/styles/block-library/video/theme-rtl.min.css 134 B 0 B
build/styles/block-library/video/theme.css 967 B 0 B
build/styles/block-library/video/theme.min.css 134 B 0 B
build/styles/commands/style-rtl.css 2.07 kB 0 B
build/styles/commands/style-rtl.min.css 1.17 kB 0 B
build/styles/commands/style.css 2.06 kB 0 B
build/styles/commands/style.min.css 1.17 kB 0 B
build/styles/components/style-rtl.css 17.8 kB 0 B
build/styles/components/style-rtl.min.css 14.7 kB 0 B
build/styles/components/style.css 17.9 kB 0 B
build/styles/components/style.min.css 14.8 kB 0 B
build/styles/customize-widgets/style-rtl.css 2.35 kB 0 B
build/styles/customize-widgets/style-rtl.min.css 1.44 kB 0 B
build/styles/customize-widgets/style.css 2.35 kB 0 B
build/styles/customize-widgets/style.min.css 1.44 kB 0 B
build/styles/edit-post/classic-rtl.css 1.29 kB 0 B
build/styles/edit-post/classic-rtl.min.css 425 B 0 B
build/styles/edit-post/classic.css 1.31 kB 0 B
build/styles/edit-post/classic.min.css 428 B 0 B
build/styles/edit-post/experimental-admin-bar-in-editor-rtl.css 550 B 0 B
build/styles/edit-post/experimental-admin-bar-in-editor-rtl.min.css 513 B 0 B
build/styles/edit-post/experimental-admin-bar-in-editor.css 551 B 0 B
build/styles/edit-post/experimental-admin-bar-in-editor.min.css 514 B 0 B
build/styles/edit-post/style-rtl.css 3.8 kB 0 B
build/styles/edit-post/style-rtl.min.css 2.48 kB 0 B
build/styles/edit-post/style.css 3.81 kB 0 B
build/styles/edit-post/style.min.css 2.49 kB 0 B
build/styles/edit-site/experimental-admin-bar-in-editor-rtl.css 502 B 0 B
build/styles/edit-site/experimental-admin-bar-in-editor-rtl.min.css 474 B 0 B
build/styles/edit-site/experimental-admin-bar-in-editor.css 502 B 0 B
build/styles/edit-site/experimental-admin-bar-in-editor.min.css 474 B 0 B
build/styles/edit-site/style-rtl.css 21.3 kB 0 B
build/styles/edit-site/style-rtl.min.css 17.4 kB 0 B
build/styles/edit-site/style.css 21.3 kB 0 B
build/styles/edit-site/style.min.css 17.4 kB 0 B
build/styles/edit-widgets/style-rtl.css 4.85 kB 0 B
build/styles/edit-widgets/style-rtl.min.css 3.52 kB 0 B
build/styles/edit-widgets/style.css 4.85 kB 0 B
build/styles/edit-widgets/style.min.css 3.52 kB 0 B
build/styles/editor/style-rtl.css 29.4 kB 0 B
build/styles/editor/style-rtl.min.css 24.9 kB 0 B
build/styles/editor/style.css 29.5 kB 0 B
build/styles/editor/style.min.css 24.9 kB 0 B
build/styles/format-library/style-rtl.css 735 B 0 B
build/styles/format-library/style-rtl.min.css 326 B 0 B
build/styles/format-library/style.css 746 B 0 B
build/styles/format-library/style.min.css 326 B 0 B
build/styles/list-reusable-blocks/style-rtl.css 1.03 kB 0 B
build/styles/list-reusable-blocks/style-rtl.min.css 210 B 0 B
build/styles/list-reusable-blocks/style.css 1.03 kB 0 B
build/styles/list-reusable-blocks/style.min.css 211 B 0 B
build/styles/media-utils/style-rtl.css 2.12 kB 0 B
build/styles/media-utils/style-rtl.min.css 1.2 kB 0 B
build/styles/media-utils/style.css 2.11 kB 0 B
build/styles/media-utils/style.min.css 1.2 kB 0 B
build/styles/notices/style-rtl.css 121 B 0 B
build/styles/notices/style-rtl.min.css 106 B 0 B
build/styles/notices/style.css 121 B 0 B
build/styles/notices/style.min.css 106 B 0 B
build/styles/nux/style-rtl.css 118 B 0 B
build/styles/nux/style-rtl.min.css 0 B 0 B 🆕
build/styles/nux/style.css 118 B 0 B
build/styles/nux/style.min.css 0 B 0 B 🆕
build/styles/patterns/style-rtl.css 1.46 kB 0 B
build/styles/patterns/style-rtl.min.css 611 B 0 B
build/styles/patterns/style.css 1.46 kB 0 B
build/styles/patterns/style.min.css 611 B 0 B
build/styles/preferences/style-rtl.css 1.26 kB 0 B
build/styles/preferences/style-rtl.min.css 415 B 0 B
build/styles/preferences/style.css 1.26 kB 0 B
build/styles/preferences/style.min.css 415 B 0 B
build/styles/reusable-blocks/style-rtl.css 1.11 kB 0 B
build/styles/reusable-blocks/style-rtl.min.css 275 B 0 B
build/styles/reusable-blocks/style.css 1.11 kB 0 B
build/styles/reusable-blocks/style.min.css 275 B 0 B
build/styles/widgets/style-rtl.css 2.05 kB 0 B
build/styles/widgets/style-rtl.min.css 1.16 kB 0 B
build/styles/widgets/style.css 2.06 kB 0 B
build/styles/widgets/style.min.css 1.16 kB 0 B

compressed-size-action

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 15, 2026

Flaky tests detected in 8129b89.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/26776943834
📝 Reported issues:

@jsnajdr
Copy link
Copy Markdown
Member

jsnajdr commented Apr 16, 2026

npm run storybook:build is painfully slow. Was it always this slow?

On my machine the old Storybook build takes 1min20s, while with this PR it goes up to 12min. Something horrible is going on. I suspect it's related to react-docgen, but will need to investigate more.

Turning off componentsManifest completely doesn't help, the timing is still the same.

@jsnajdr
Copy link
Copy Markdown
Member

jsnajdr commented Apr 16, 2026

The build times go back to normal when I disable the EXPERIMENTAL_useProjectService option for react-docgen-typescript. I.e., when I basically revert #74807 where we added this option to fix missing component props.

@jsnajdr
Copy link
Copy Markdown
Member

jsnajdr commented Apr 16, 2026

After I disable EXPERIMENTAL_useProjectService, then:

  • build times are back to normal, there is even an improvement from 80s to 50s
  • the components props bug fixed by Storybook: Fix missing props from component stories #74807 doesn't reappear, i.e., I still see full set of component props
  • there continues to be a lot of "prop type error" messages on the manifests/components page, the component descriptions are not fixed

@aduth
Copy link
Copy Markdown
Member Author

aduth commented Apr 16, 2026

Nice find, @jsnajdr 👍 Yeah, I think it's fine to disable that as long as the regression doesn't return. And it sounds like it's separate problem from the component import resolution.

@jsnajdr
Copy link
Copy Markdown
Member

jsnajdr commented Apr 17, 2026

The "Prop type error" and "No component file found" errors happen because the manifest generator fails to read the component info with react-docgen-typescript. It reads the root tsconfig.json and there the file array files: [] is empty. The tsconfig.json loads successfully, the file path to read is also right, there are no problems with process.cwd, it's just that the TypeScript program project is empty. Everything is in project references, but these are ignored.

The storybookjs/storybook#34386 issue is very closely related. The reporter has the same problem, and tried to work around by creating a custom tsconfig.storybook.json that lists all the monorepo files directly. But then hit another bug, where the manifest generator ignores the custom tsconfig file.

This is a problem only in the manifest generator, which is quite independent from the main storybook build. There, when generating the stories for components and their props docs, react-docgen-typescript is also called, but slightly differently: there the TypeScript program is "synthetic", not based on tsconfig.json, and always includes just the one file to parse.

At this moment I don't know how to solve this, it will probably require an upstream patch.

@aduth
Copy link
Copy Markdown
Member Author

aduth commented Apr 17, 2026

Nice discovery @jsnajdr . I had also stumbled on storybookjs/storybook#34386 but wasn't entirely confident it was related. It was also the reason I added the commented tsconfigPath configuration, though I guess as you mention this wouldn't be properly respected anyways.

I wonder if there's some option to temporarily patch/override tsconfig.json as part of the build to configure it as Storybook would expect 🙈 We've certainly done similar things before, though it feels very hacky and error-prone.

@jsnajdr
Copy link
Copy Markdown
Member

jsnajdr commented Apr 17, 2026

I wonder if there's some option to temporarily patch/override tsconfig.json as part of the build to configure it as Storybook would expect

The main problem is that the manifest generator code is almost completely independent from the rest of Storybook, and does things its own way. And it's a very new code (2 months old) that is not battle-tested.

The main Storybook build uses react-docgen-typescript through the vite-plugin-react-docgen-typescript plugin that's part of the Vite framework preset. If you look at the plugin code:

https://github.com/joshwooding/vite-plugin-react-docgen-typescript/blob/main/packages/vite-plugin-react-docgen-typescript/src/index.ts

you can see it does a tremendous amount of preprocessing and wrapping before actually creating the docgen instance with docGen.withCompilerOptions. There is the resolveTypescriptProject function that reads the tsconfig.json and then manually resolves all the references and child tsconfig.jsons.

The manifest generator doesn't reuse this at all, it has its own code to load the TS project and create the docgen instance. It's much simpler, but doesn't work for our case.

aduth and others added 9 commits May 27, 2026 16:09
Bump Storybook and related framework packages from 10.2.8 to 10.4.1.
Bump `react-docgen-typescript` from 2.2.2 to 2.4.0 (root + tools/api-docs)
to align with what Storybook 10.4's react-vite framework expects.

The `experimentalComponentsManifest` feature flag stabilized to
`componentsManifest` in Storybook 10.3, so rename it accordingly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Opt into Storybook 10.4's `experimentalReactComponentMeta` feature, which
backs the components manifest with a persistent TypeScript LanguageService
(via `@volar/typescript`). The previous manifest extractor used a bespoke
tsconfig loader that ignored `references`, so our root `tsconfig.json`
(which has `files: []` and delegates everything to references) produced an
empty TS program. The result was a manifest peppered with "No component
file found" errors, identified in #77382 and the upstream issue
storybookjs/storybook#34386.

Also drop `EXPERIMENTAL_useProjectService: true` from the
`react-docgen-typescript` options. Per investigation in #77382, this flag
was the cause of a ~10x build slowdown. Removing it does not reintroduce
the prop-extraction regression that #74807 added it to address.

The `experimentalReactComponentMeta` flag only affects the manifest
pipeline. The in-stories docs UI continues to use `react-docgen-typescript`
through the React Vite framework's Vite plugin, including our existing
`propFilter`. The new engine has its own source filtering for the manifest.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Storybook 10.3 split prop extraction output across engine-specific
manifest fields (`reactDocgen`, `reactDocgenTypescript`, and as of 10.4
`reactComponentMeta`). Deployed `@wordpress/design-system-mcp` clients
were built against the 10.2 shape and read only the legacy `reactDocgen`
field, so the manifest published to GitHub Pages needs to keep carrying
that field for old clients to continue working.

Add a post-build step that walks the built manifest and synthesizes a
`reactDocgen` entry from `reactComponentMeta` data on each component
(and subcomponent) that has one. The only field that actually has to
change is the rename from `type` to `tsType`. Everything else passes
through verbatim, which matches what the legacy field has historically
carried (`description`, `displayName`, plus engine-specific extras).

The shim is intentionally temporary. Once the next
`@wordpress/design-system-mcp` release ships with parser support for
the new shape and consumers have rolled forward through their `@latest`
npm fetch (a few weeks given the 2-week publish cadence), the shim and
its npm script wire-up can be deleted.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Storybook 10.3 split the manifest's prop extraction output into
engine-specific fields. Storybook 10.4 added `reactComponentMeta` for
its new LanguageService-backed extractor, which we now use. New clients
of this package only ever read manifests built from this codebase, so
they can target the new field directly.

Backwards compatibility for in-the-wild MCP clients still pinned to the
previous shape is handled separately by the post-build shim in
`storybook/scripts/inject-legacy-docgen.mjs`, which synthesizes a
legacy `reactDocgen` field on the published manifest.

The new shape uses `type` rather than `tsType` for prop types and has
a nullable `defaultValue`. The parser is otherwise unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This is no longer necessary with React 19. Downstream components that access components package will do so through window.wp.components, which in older versions of WordPress will continue to use forwardRef approach, so this only interacts with environments where React 19 is available.

This is needed to ensure that Storybook prop description extraction can effectively access the component's metadata, which forwardRef can interfere with.
@aduth aduth force-pushed the update/storybook-10-3 branch from 72955b0 to 336edb4 Compare May 27, 2026 20:11
@aduth aduth changed the title Storybook: Upgrade Storybook to 10.3 Storybook: Upgrade Storybook to 10.4 May 27, 2026
@aduth
Copy link
Copy Markdown
Member Author

aduth commented May 27, 2026

I've refreshed this pull request and updated Storybook to the new latest version 10.4.1. One additional notable improvement in this new version is the availability of their new component meta extractor tool for manifests, which aims to replace react-docgen and react-docgen-typescript. Currently this is only available for manifests, but it's still very useful in how we use the manifests for the design system MCP server package. I added a detailed comparison in the original post, but a quick summary of findings:

Hosted: https://wordpress.github.io/gutenberg/manifests/components.json
Local: storybook/build/manifests/components.json

Metric Hosted New Δ
Components 63 63 0
With description 48 56 +8
With prop data 39 59 +20
Total props 245 664 +419
Props with description 215 593 +378

However, there were a lot of complications in this upgrade, some of which were already seen in the earlier attempt.

A quick summary:

  • Missing component descriptions (including regressions for some components like Button)
    • In manifests:
      • Some of this is attributable to a known upstream bug [Bug]: React Component Meta: "No component file found" for args-only CSF stories using preview.meta() + meta.story({ args }) storybookjs/storybook#34877, which is addressed here with a temporary workaround applying explicit render option for component stories
      • Some of this is related to inability to follow ref forwarding consistently. Since we're now on React 19, I chose to address components in @wordpress/components which were affected by this and which are surfaced as part of the components manifest (namely, Button).
        • I'm not sure it's safe to remove forwardRef for packages like @wordpress/ui which may be bundled into downstream plugins that support multiple versions of WordPress, but packages like @wordpress/components that are shipped through WordPress itself should be safe (i.e. this code will only ever run on WordPress 7.1, where React 19 is safely available)
    • In the Storybook front-end UI:
      • An AI analysis concluded that this was due to how, when using the base configuration, the docgen tool would detect multiple descriptions, including from built .d.ts files where the description was missing, and in resolving the duplication would pick the wrong one and drop the description. The solution is to remove references to avoid resolving these duplicate versions and only make the source component implementation code available to the TypeScript compiler.
  • Changing shape of component manifest breaking expectations in @wordpress/design-system-mcp
    • In an earlier analysis, I think I discovered that this would have happened regardless of switching to the new "meta" docgen tool, since the property we were relying on (reactDocgen) should have already been named according to the docgen tool we were using, i.e. reactDocgenTypescript) so it was going to break at some point regardless.
    • To address this, I'm adding a temporary "shim" to restore the property structure that existing consumers of @wordpress/design-system-mcp would expect to see. This means that people using an old version of the plugin will still be able to read the file once the new version becomes published at https://wordpress.github.io/gutenberg/manifests/components.json (the MCP reads directly from this URL). People using new version will also support the new property. And since the MCP server installation instructions embed @latest as part of the setup command, we should be able to expect that we can remove this shim once the updated package becomes the new latest version.

aduth added 2 commits May 27, 2026 16:36
Not seen locally, but local removal doesn't get reset on install. Might be caused by npm version difference
Comment on lines +131 to +135
### `ref`

- Type: `Ref<any>`
- Required: No

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something to consider for our docgen tool now that we're on React 19 and ref looks like any other prop. Should it be documented? We didn't document it before even though we were forwarding the ref.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm leaning more towards documenting it:

  • it's now a prop like any other, less custom code to maintain
  • not all components support ref (especially in @wordpress/components), so if we omit it, we'd be hiding that information

The question is: given we may want to add support for React 18 for some time, are we doing this migration now, or should we wait?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And also, should we apply the same "fix" to other components flagged with the same issue (Navigator, ColorPicker, Slot, ...)

Copy link
Copy Markdown
Member Author

@aduth aduth Jun 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm leaning more towards documenting it:

Yeah, I tend to agree. I'll see about adding a brief description, assuming it's feasible to do so within the current types. It would probably be ideal to standardize the description, and maybe that should happen inside the API docs tool.

The question is: given we may want to add support for React 18 for some time, are we doing this migration now, or should we wait?

My understanding is that this is safe to do inside @wordpress/components or any window.wp script package, because the code that's included in these packages is linked to the version of React in WordPress (i.e. this code will be shipped with WordPress 7.1 / React 19, and older versions of wp.components shipped in earlier versions of WordPress will continue to use forwardRef).

Though it'd be good to have confirmation on this understanding. There's a few related discussions about how wpScript packages do or don't have to support React 18 (example).

And also, should we apply the same "fix" to other components flagged with the same issue (Navigator, ColorPicker, Slot, ...)

The problem with these components is different than needing to refactor forwardRef to use ref-as-prop. In fact, for most of them, the problem is that we haven't written a description at all 😅

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And also, should we apply the same "fix" to other components flagged with the same issue (Navigator, ColorPicker, Slot, ...)

The problem with these components is different than needing to refactor forwardRef to use ref-as-prop. In fact, for most of them, the problem is that we haven't written a description at all 😅

Though it could certainly resurface for those other components, and I think the best way to address this is a pull request that mass-updates forwardRef to ref-as-prop (scoped as needed to keep things sensible).

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm leaning more towards documenting it:

Yeah, I tend to agree. I'll see about adding a brief description, assuming it's feasible to do so within the current types. It would probably be ideal to standardize the description, and maybe that should happen inside the API docs tool.

Looking closer at this, the original implementation by Claude to just shove a type intersection & { ref?: Ref< any > } on the component props destructure wasn't ideal. This is a standard React prop, and we should use standard React utility types to document this, and certainly do better than any. In b889e06 I moved this to types.ts and used React.RefAttributes with the appropriate HTML element generic.

Separately, a couple thoughts:

  • Especially as we continue to refactor components, we might want to replace React.ComponentPropsWithoutRef with React.ComponentPropsWithRef so that this typing comes through WordPressComponentProps instead of per-component. The only question I have there is whether we want the explicit per-component opt-in as an indication that the component does, in fact, forward the ref (or at least does something with it).
  • Note that the changes in b889e06 will once again remove ref from README.md, despite us agreeing above that we should document it. I think this is a question for the API docs tool, which currently filters out all library types. Given this revised approach, ref is a library type, so how should we reconcile that? Do we want to make ref a special case in the props filtering?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In b889e06 I moved this to types.ts and used React.RefAttributes with the appropriate HTML element generic.

This turned out to be a bit more involved to address build errors which emerged after this change. In general, a lot of it stems from additional strictness we get going from plain forwardRef (without generic) to typed Ref values.

A few additional notes:

  • I changed from React.RefAttributes to Ref after seeing that documentation for RefAttributes discourages its use except when needing to handle compatibility with legacy refs.
    • This also brings back the README.md documentation since ref is defined in the component's own types. I added a brief description, although the same question as above still applies if we want to consider handling this centrally in the API docs tooll
  • I did a light exploration of what it looks like to convert WordPressComponentProps to use React.ComponentPropsWithRef and I think the biggest part of this work will be reconciling the handling of refs in contextConnect

@aduth aduth marked this pull request as ready for review May 27, 2026 20:38
@aduth aduth requested review from a team, ajitbohra, gigitux, ntsekouras and oandregal as code owners May 27, 2026 20:38
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 27, 2026

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: aduth <aduth@git.wordpress.org>
Co-authored-by: ciampo <mciampini@git.wordpress.org>
Co-authored-by: jsnajdr <jsnajdr@git.wordpress.org>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@aduth aduth added [Type] Developer Documentation Documentation for developers Storybook Storybook and its stories for components labels May 27, 2026
@aduth
Copy link
Copy Markdown
Member Author

aduth commented May 27, 2026

Updated script with percentage of coverage for descriptions and props on components:

Metric Hosted New Δ Hosted% New% Δ%
Components 63 63 0
With description 48 56 +8 76.2% 88.9% +12.7
With prop data 39 59 +20 61.9% 93.7% +31.7
Total props 245 664 +419
Props with description 215 593 +378 87.8% 89.3% +1.6
Script (AI-produced)
#!/usr/bin/env node
/**
 * Compare a freshly built components manifest against the one currently
 * hosted at `wordpress.github.io/gutenberg/manifests/components.json`,
 * to evaluate how much the upgraded prop extractor recovers compared
 * to what's live today.
 *
 * Usage:
 *   node storybook/scripts/compare-with-hosted-manifest.mjs [path]
 *
 * The local manifest defaults to `storybook/build/manifests/components.json`.
 * The hosted manifest is read from `reactDocgen` (Storybook 10.2 shape).
 * The local manifest is read from `reactComponentMeta` (Storybook 10.4),
 * so the comparison reflects the real engine output rather than the
 * synthesized legacy field added by `inject-legacy-docgen.mjs`.
 *
 * Intended as a one-shot validation aid. Not wired into any build.
 */
import { readFile } from 'node:fs/promises';

const HOSTED_URL =
	'https://wordpress.github.io/gutenberg/manifests/components.json';
const LOCAL_PATH =
	process.argv[ 2 ] ?? 'storybook/build/manifests/components.json';

function getDocgen( component, legacy ) {
	if ( legacy ) {
		return component.reactDocgen;
	}
	return component.reactComponentMeta;
}

function getProps( component, legacy ) {
	return getDocgen( component, legacy )?.props ?? {};
}

function descriptionFor( component, legacy ) {
	return (
		component.description ||
		getDocgen( component, legacy )?.description ||
		''
	).trim();
}

function propDescriptionCount( props ) {
	return Object.values( props ).filter( ( p ) =>
		( p.description ?? '' ).trim()
	).length;
}

function summarize( label, components, legacy ) {
	const entries = Object.values( components );
	let withDescription = 0;
	let withProps = 0;
	let totalProps = 0;
	let propsWithDescription = 0;
	for ( const component of entries ) {
		if ( descriptionFor( component, legacy ) ) {
			withDescription += 1;
		}
		const props = getProps( component, legacy );
		const propCount = Object.keys( props ).length;
		if ( propCount > 0 ) {
			withProps += 1;
		}
		totalProps += propCount;
		propsWithDescription += propDescriptionCount( props );
	}
	return {
		label,
		total: entries.length,
		withDescription,
		withProps,
		totalProps,
		propsWithDescription,
	};
}

function formatSummary( old, fresh ) {
	// Each row: [label, hostedCount, newCount, hostedDenominator, newDenominator].
	// Denominator left undefined when a percentage doesn't apply.
	const rows = [
		[ 'Components', old.total, fresh.total ],
		[
			'With description',
			old.withDescription,
			fresh.withDescription,
			old.total,
			fresh.total,
		],
		[
			'With prop data',
			old.withProps,
			fresh.withProps,
			old.total,
			fresh.total,
		],
		[ 'Total props', old.totalProps, fresh.totalProps ],
		[
			'Props with description',
			old.propsWithDescription,
			fresh.propsWithDescription,
			old.totalProps,
			fresh.totalProps,
		],
	];
	const labelWidth = 24;
	const numWidth = 10;
	const pctWidth = 10;
	const fmtPct = ( num, denom ) =>
		denom > 0 ? `${ ( ( num / denom ) * 100 ).toFixed( 1 ) }%` : '';
	const lines = [
		`${ 'Metric'.padEnd( labelWidth ) }${ 'Hosted'.padStart(
			numWidth
		) }${ 'New'.padStart( numWidth ) }${ 'Δ'.padStart(
			numWidth
		) }${ 'Hosted%'.padStart( pctWidth ) }${ 'New%'.padStart(
			pctWidth
		) }${ 'Δ%'.padStart( pctWidth ) }`,
		'-'.repeat( labelWidth + numWidth * 3 + pctWidth * 3 ),
	];
	for ( const [ name, a, b, denomA, denomB ] of rows ) {
		const delta = b - a;
		const sign = delta > 0 ? '+' : '';
		const pctA = fmtPct( a, denomA );
		const pctB = fmtPct( b, denomB );
		const deltaPct =
			pctA && pctB
				? ( () => {
						const d =
							( b / denomB ) * 100 - ( a / denomA ) * 100;
						return `${ d > 0 ? '+' : '' }${ d.toFixed( 1 ) }`;
				  } )()
				: '';
		lines.push(
			`${ name.padEnd( labelWidth ) }${ String( a ).padStart(
				numWidth
			) }${ String( b ).padStart( numWidth ) }${ (
				sign + delta
			).padStart( numWidth ) }${ pctA.padStart(
				pctWidth
			) }${ pctB.padStart( pctWidth ) }${ deltaPct.padStart(
				pctWidth
			) }`
		);
	}
	return lines.join( '\n' );
}

function listMissingDescriptions( components ) {
	return Object.values( components )
		.filter( ( c ) => {
			if ( ! c.path?.startsWith( '../packages/' ) ) {
				return false;
			}
			const desc = ( c.description ?? '' ).trim();
			const rcmDesc = ( c.reactComponentMeta?.description ?? '' ).trim();
			return ! desc && ! rcmDesc;
		} )
		.map( ( c ) => `${ c.name }${ c.path }` )
		.sort();
}

function indexByKey( components ) {
	const result = new Map();
	for ( const component of Object.values( components ) ) {
		const key = `${ component.path }:${ component.name }`;
		result.set( key, component );
	}
	return result;
}

function diffPerComponent( oldIndex, newIndex ) {
	const findings = {
		descriptionGained: [],
		descriptionLost: [],
		descriptionChanged: [],
		propsGained: [],
		propsLost: [],
		propsCountChanged: [],
		propDescriptionsGained: [],
		propDescriptionsLost: [],
	};

	for ( const [ key, fresh ] of newIndex ) {
		const old = oldIndex.get( key );
		if ( ! old ) {
			continue;
		}
		const oldDesc = descriptionFor( old, true );
		const newDesc = descriptionFor( fresh, false );
		if ( ! oldDesc && newDesc ) {
			findings.descriptionGained.push( { key, newDesc } );
		} else if ( oldDesc && ! newDesc ) {
			findings.descriptionLost.push( { key, oldDesc } );
		} else if ( oldDesc && newDesc && oldDesc !== newDesc ) {
			findings.descriptionChanged.push( { key, oldDesc, newDesc } );
		}

		const oldProps = getProps( old, true );
		const newProps = getProps( fresh, false );
		const oldNames = new Set( Object.keys( oldProps ) );
		const newNames = new Set( Object.keys( newProps ) );
		const added = [ ...newNames ].filter( ( n ) => ! oldNames.has( n ) );
		const removed = [ ...oldNames ].filter( ( n ) => ! newNames.has( n ) );
		if ( added.length ) {
			findings.propsGained.push( { key, names: added } );
		}
		if ( removed.length ) {
			findings.propsLost.push( { key, names: removed } );
		}
		if ( oldNames.size !== newNames.size ) {
			findings.propsCountChanged.push( {
				key,
				before: oldNames.size,
				after: newNames.size,
			} );
		}

		const commonProps = [ ...oldNames ].filter( ( n ) =>
			newNames.has( n )
		);
		const gainedDescriptions = [];
		const lostDescriptions = [];
		for ( const name of commonProps ) {
			const had = ( oldProps[ name ].description ?? '' ).trim();
			const has = ( newProps[ name ].description ?? '' ).trim();
			if ( ! had && has ) {
				gainedDescriptions.push( name );
			} else if ( had && ! has ) {
				lostDescriptions.push( name );
			}
		}
		if ( gainedDescriptions.length ) {
			findings.propDescriptionsGained.push( {
				key,
				names: gainedDescriptions,
			} );
		}
		if ( lostDescriptions.length ) {
			findings.propDescriptionsLost.push( {
				key,
				names: lostDescriptions,
			} );
		}
	}

	return findings;
}

function formatList( title, items, render ) {
	if ( ! items.length ) {
		return '';
	}
	return [
		'',
		`## ${ title } (${ items.length })`,
		'',
		...items.map( render ),
	].join( '\n' );
}

function truncate( text, max = 80 ) {
	const flat = text.replace( /\s+/g, ' ' );
	return flat.length > max ? `${ flat.slice( 0, max - 1 ) }…` : flat;
}

const [ hostedManifest, localRaw ] = await Promise.all( [
	fetch( HOSTED_URL ).then( ( r ) => {
		if ( ! r.ok ) {
			throw new Error( `Failed to fetch ${ HOSTED_URL }: ${ r.status }` );
		}
		return r.json();
	} ),
	readFile( LOCAL_PATH, 'utf8' ).then( JSON.parse ),
] );

const oldIndex = indexByKey( hostedManifest.components ?? {} );
const newIndex = indexByKey( localRaw.components ?? {} );

const oldOnly = [ ...oldIndex.keys() ].filter( ( k ) => ! newIndex.has( k ) );
const newOnly = [ ...newIndex.keys() ].filter( ( k ) => ! oldIndex.has( k ) );

const oldStats = summarize( 'hosted', hostedManifest.components ?? {}, true );
const newStats = summarize( 'new', localRaw.components ?? {}, false );

const findings = diffPerComponent( oldIndex, newIndex );

console.log( '# Manifest comparison' );
console.log( '' );
console.log( `Hosted: ${ HOSTED_URL }` );
console.log( `Local:  ${ LOCAL_PATH }` );
console.log( '' );
console.log( formatSummary( oldStats, newStats ) );

console.log(
	formatList(
		'Components still missing descriptions (new manifest)',
		listMissingDescriptions( localRaw.components ?? {} ),
		( k ) => `- ${ k }`
	)
);
console.log(
	formatList(
		'Components only in hosted manifest',
		oldOnly,
		( k ) => `- ${ k }`
	)
);
console.log(
	formatList(
		'Components only in new manifest',
		newOnly,
		( k ) => `- ${ k }`
	)
);
console.log(
	formatList(
		'Descriptions gained',
		findings.descriptionGained,
		( { key, newDesc } ) => `- ${ key }\n  ${ truncate( newDesc ) }`
	)
);
console.log(
	formatList(
		'Descriptions lost (regressions)',
		findings.descriptionLost,
		( { key, oldDesc } ) => `- ${ key }\n  was: ${ truncate( oldDesc ) }`
	)
);
console.log(
	formatList(
		'Descriptions changed',
		findings.descriptionChanged,
		( { key, oldDesc, newDesc } ) =>
			`- ${ key }\n  - ${ truncate( oldDesc ) }\n  + ${ truncate(
				newDesc
			) }`
	)
);
console.log(
	formatList(
		'Props gained',
		findings.propsGained,
		( { key, names } ) =>
			`- ${ key }: ${ names.slice( 0, 10 ).join( ', ' ) }${
				names.length > 10 ? ` (+${ names.length - 10 } more)` : ''
			}`
	)
);
console.log(
	formatList(
		'Props lost (regressions)',
		findings.propsLost,
		( { key, names } ) =>
			`- ${ key }: ${ names.slice( 0, 10 ).join( ', ' ) }${
				names.length > 10 ? ` (+${ names.length - 10 } more)` : ''
			}`
	)
);
console.log(
	formatList(
		'Prop count changed',
		findings.propsCountChanged,
		( { key, before, after } ) => `- ${ key }: ${ before }${ after }`
	)
);
console.log(
	formatList(
		'Prop descriptions gained',
		findings.propDescriptionsGained,
		( { key, names } ) =>
			`- ${ key }: ${ names.slice( 0, 10 ).join( ', ' ) }${
				names.length > 10 ? ` (+${ names.length - 10 } more)` : ''
			}`
	)
);
console.log(
	formatList(
		'Prop descriptions lost (regressions)',
		findings.propDescriptionsLost,
		( { key, names } ) =>
			`- ${ key }: ${ names.slice( 0, 10 ).join( ', ' ) }${
				names.length > 10 ? ` (+${ names.length - 10 } more)` : ''
			}`
	)
);

Although many of those missing descriptions are because we haven't written them 🙃

Component Root cause
ColorPicker export { LegacyAdapter as ColorPicker } — JSDoc on source symbol, not on the renamed export
CustomSelectControl No JSDoc authored on the function
Navigator JSDoc lives on Object.assign(...), not on the underlying TopLevelNavigator
NumberControl No JSDoc authored on UnforwardedNumberControl
ResizableBox No JSDoc authored on UnforwardedResizableBox
Slot No JSDoc authored on function Slot
Tooltip No JSDoc authored on UnforwardedTooltip

Comment on lines +131 to +135
### `ref`

- Type: `Ref<any>`
- Required: No

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm leaning more towards documenting it:

  • it's now a prop like any other, less custom code to maintain
  • not all components support ref (especially in @wordpress/components), so if we omit it, we'd be hiding that information

The question is: given we may want to add support for React 18 for some time, are we doing this migration now, or should we wait?

Comment on lines +19 to +21
* REMOVEME: This shim can be removed once `@wordpress/design-system-mcp` has
* been published, since installation instructions for the MCP server point to
* the latest version automatically.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Neat!

Comment on lines +131 to +135
### `ref`

- Type: `Ref<any>`
- Required: No

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And also, should we apply the same "fix" to other components flagged with the same issue (Navigator, ColorPicker, Slot, ...)

Comment thread storybook/main.ts Outdated
Comment thread storybook/main.ts Outdated
Comment thread storybook/tsconfig.docgen.json Outdated
Comment thread storybook/scripts/inject-legacy-docgen.mjs Outdated
aduth and others added 3 commits June 1, 2026 13:29
Co-authored-by: Marco Ciampini <marco.ciampo@gmail.com>
routes aren't structured this way with src directory, and there are no stories here currently. This includes pattern should reflect current stories covered
Always passing the argument anyways, and the script is meant to be temporary, meaning we shouldn't optimize for cases that we don't need. The fallback is wrong because the cwd when this script is evaluated is already inside `storybook`, so `storybook/` relative path would not exist.
@aduth
Copy link
Copy Markdown
Member Author

aduth commented Jun 1, 2026

Another side benefit of this change is that the manifest is now "prettified" (tabs and newlines) by default, so linking to https://wordpress.github.io/gutenberg/manifests/components.json won't be as much of a monstrosity for people to try to grok 😅

aduth added 2 commits June 1, 2026 14:27
Defer to React to provide typings, which we previously explicitly omit through `WordPressComponentProps`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Package] Components /packages/components [Package] DataViews /packages/dataviews [Package] Theme /packages/theme [Package] UI /packages/ui Storybook Storybook and its stories for components [Type] Developer Documentation Documentation for developers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants