--- name: block-editor-components description: React editor components for WordPress blocks in Oh My Brand! theme. useBlockProps, InspectorControls, MediaUpload, and attributes. Use when writing edit.tsx files. metadata: author: Wesley Smits version: "1.0.0" --- # Block Editor Components React editor components for WordPress blocks in the Oh My Brand! FSE theme. --- ## When to Use - Creating editor UI for WordPress blocks - Adding sidebar controls (InspectorControls) - Implementing media selection (MediaUpload) - Handling block attributes and state --- ## Reference Files | File | Purpose | |------|---------| | [edit-gallery-example.tsx](references/edit-gallery-example.tsx) | Full gallery edit component (~155 lines) | | [edit.tsx](../block-scaffolds/references/edit.tsx) | Edit component scaffold | --- ## Basic Edit Component ```tsx import { __ } from '@wordpress/i18n'; import { useBlockProps, InspectorControls } from '@wordpress/block-editor'; import { PanelBody, RangeControl, ToggleControl } from '@wordpress/components'; import type { BlockEditProps } from '@wordpress/blocks'; interface BlockAttributes { count: number; isEnabled: boolean; } export default function Edit({ attributes, setAttributes, }: BlockEditProps): JSX.Element { const { count, isEnabled } = attributes; const blockProps = useBlockProps(); return ( <> value !== undefined && setAttributes({ count: value })} min={1} max={10} /> setAttributes({ isEnabled: value })} />
{/* Block content */}
); } ``` See [edit-gallery-example.tsx](references/edit-gallery-example.tsx) for a complete implementation with MediaUpload. --- ## useBlockProps ```tsx // Basic usage const blockProps = useBlockProps(); // With additional classes const blockProps = useBlockProps({ className: 'custom-class' }); // With data attributes const blockProps = useBlockProps({ className: 'wp-block-theme-oh-my-brand-gallery', 'data-visible': visibleImages, }); // Apply to wrapper return
Content
; ``` --- ## InspectorControls Add sidebar panel controls: ```tsx setAttributes({ visibleItems: value })} min={1} max={6} /> setAttributes({ enableFeature: value })} /> setAttributes({ layout: value })} options={[ { label: __('Grid', 'theme-oh-my-brand'), value: 'grid' }, { label: __('Carousel', 'theme-oh-my-brand'), value: 'carousel' }, ]} /> setAttributes({ caption: value })} /> ``` --- ## MediaUpload ### Single Image ```tsx setAttributes({ imageId: media.id, imageUrl: media.sizes?.large?.url || media.url, imageAlt: media.alt || '', })} allowedTypes={['image']} value={imageId} render={({ open }) => ( )} /> ``` ### Multiple Images (Gallery) ```tsx { const selected = media.map((item) => ({ id: item.id, url: item.sizes?.large?.url || item.url, alt: item.alt || '', })); setAttributes({ images: selected }); }} allowedTypes={['image']} multiple={true} gallery={true} value={images.map((img) => img.id)} render={({ open }) => ( )} /> ``` --- ## Block Attributes ### Type Definitions ```tsx interface BlockAttributes { title: string; count: number; isEnabled: boolean; images: ImageData[]; } interface ImageData { id: number; url: string; alt: string; } ``` ### Setting Attributes ```tsx // Single attribute setAttributes({ title: 'New Title' }); // Multiple attributes setAttributes({ title: 'New Title', count: 5 }); // Array attribute setAttributes({ images: [...images, newImage] }); ``` ### Attribute Defaults (block.json) ```json "attributes": { "title": { "type": "string", "default": "" }, "count": { "type": "number", "default": 3 }, "isEnabled": { "type": "boolean", "default": true }, "images": { "type": "array", "default": [] } } ``` --- ## Common Patterns ### Placeholder State ```tsx import { Placeholder } from '@wordpress/components'; import { gallery as blockIcon } from '@wordpress/icons'; {!hasContent && ( )} ``` ### Toolbar Controls ```tsx import { BlockControls } from '@wordpress/block-editor'; import { ToolbarGroup, ToolbarButton } from '@wordpress/components'; ``` --- ## Related Skills - [typescript-standards](../typescript-standards/SKILL.md) - TypeScript conventions - [native-block-development](../native-block-development/SKILL.md) - Block structure - [block-scaffolds](../block-scaffolds/SKILL.md) - Edit component template --- ## References - [Block Editor Handbook](https://developer.wordpress.org/block-editor/) - [Component Reference](https://developer.wordpress.org/block-editor/reference-guides/components/) - [@wordpress/block-editor](https://developer.wordpress.org/block-editor/reference-guides/packages/packages-block-editor/)