Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Storybook: Add BlockCanvas Component #68589

Open
wants to merge 3 commits into
base: trunk
Choose a base branch
from

Conversation

Rishit30G
Copy link
Contributor

@Rishit30G Rishit30G commented Jan 10, 2025

Part of #67165

What?

This PR adds Story for Block Canvas Component

Testing Instructions

Screenshots or screencast

image

@Rishit30G Rishit30G marked this pull request as ready for review January 10, 2025 09:29
@Rishit30G Rishit30G requested a review from ellatrix as a code owner January 10, 2025 09:29
Copy link

github-actions bot commented Jan 10, 2025

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: Rishit30G <rishit30g@git.wordpress.org>
Co-authored-by: stokesman <presstoke@git.wordpress.org>
Co-authored-by: t-hamano <wildworks@git.wordpress.org>

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

@t-hamano t-hamano added [Type] Developer Documentation Documentation for developers Storybook Storybook and its stories for components labels Jan 11, 2025
Comment on lines 50 to 53
styles: {
border: '1px solid #ccc',
backgroundColor: '#f9f9f9',
},
Copy link
Contributor

@stokesman stokesman Jan 11, 2025

Choose a reason for hiding this comment

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

styles is an array of objects and the actual CSS is a string. A basic example is the variable used in the playground stories.

As for the type, I'm not sure how thoroughly it can/should be documented so maybe for now Array suffices. The full type would be something like: { css?: string; assets?: string; isGlobalStyles?: boolean; __unstableType: string; }[]. Example usage is here and you can see how it’s consumed in EditorStyles

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Thanks for sharing the feedback and resources @stokesman

Here is the updated code snippet:

meta object:

styles: {
	control: 'object',
	description: 'The styles to apply to the canvas.',
	table: {
	  type: {
	    summary:
	      '[{ css?: string; assets?: string; isGlobalStyles?: boolean; __unstableType: string; }]',
	   },
	 },
      },

Default object:

export const Default = {
	args: {
		height: '100px',
		styles: [ { css: `body{font-size: 16px;}` } ],
		children: <BlockList />,
	},
	render: function Template( args ) {
		return (
			<BlockCanvas { ...args } />
		);
	},
};

Screenshot of the storybook

image

Let me know if this looks good, I'll update the PR accordingly 🙇🏻

Copy link
Contributor

@stokesman stokesman Jan 21, 2025

Choose a reason for hiding this comment

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

Thanks! The change to Default looks good to me.

For the styles prop’s type summary, I'm not sure because I haven’t see guidance on how specific it should be. Most other examples I have seen are pretty generic. So perhaps just Array, or Array<{}>. If it’s better to fully specify the type then the last update you posted isn’t quite right—I’ll take some responsibility—and it should be:

{ css?: string; assets?: string; isGlobalStyles?: boolean; __unstableType?: string; }[]

or alternatively using the Array generic:

Array<{ css?: string; assets?: string; isGlobalStyles?: boolean; __unstableType?: string; }>

I’ll ping @WordPress/gutenberg-components and @t-hamano in case they know the guidance around this (and if not maybe we can establish it). One argument in favor of a more general type here would be easier maintenance I think 🤷‍♂️. It’s also notable EditorStyles is where the type is actually important as this component just passes it through.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Got it, thanks for sharing the updates and feedback! 🙇🏻
I have updated the PR ✅

Copy link
Contributor

Choose a reason for hiding this comment

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

There are no strict rules for now 😅 Personally, I think a simple array type is fine, following the JSDoc here:

* @param {Object} props Component props.
* @param {string} props.height Canvas height, defaults to 300px.
* @param {Array} props.styles Content styles to inject into the iframe.
* @param {Element} props.children Content of the canvas, defaults to the BlockList component.
* @return {Element} Block Breadcrumb.

@Rishit30G Rishit30G requested a review from stokesman January 22, 2025 11:12
Copy link
Contributor

@t-hamano t-hamano left a comment

Choose a reason for hiding this comment

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

Thanks for the PR!

The BlockCanvas component doesn't draw anything visually by itself, so exposing it to Storybook may not be useful.

Generally, this component is expected to render blocks based on the data from a provider. Therefore, how about wrapping it in a provider and managing the blocks as a state?

Example (Quotation from this document):

function MyEditorComponent() {
	const [ blocks, updateBlocks ] = useState( [] );

	return (
		<BlockEditorProvider
			value={ blocks }
			onInput={ ( blocks ) => updateBlocks( blocks ) }
			onChange={ ( blocks ) => updateBlocks( blocks ) }
		>
			<BlockCanvas />
		</BlockEditorProvider>
	);
}

Comment on lines 51 to 55
args: {
height: '100px',
styles: [ { css: `body{font-size: 16px;}` } ],
children: <BlockList />,
},
Copy link
Contributor

Choose a reason for hiding this comment

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

I don't think these args are necessary, as this component should work fine with the default props.

@Rishit30G
Copy link
Contributor Author

Thanks for the feedback and resources @t-hamano! 🙇🏻
I have updated the code as per the feedback and now the component looks like this:

Screen.Recording.2025-01-28.at.1.28.36.PM.mov

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
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