UNPKG

@wordpress/block-editor

Version:
194 lines (187 loc) 7.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.useBlockProps = useBlockProps; var _clsx = _interopRequireDefault(require("clsx")); var _element = require("@wordpress/element"); var _i18n = require("@wordpress/i18n"); var _blocks = require("@wordpress/blocks"); var _compose = require("@wordpress/compose"); var _warning = _interopRequireDefault(require("@wordpress/warning")); var _useMovingAnimation = _interopRequireDefault(require("../../use-moving-animation")); var _privateBlockContext = require("../private-block-context"); var _useFocusFirstElement = require("./use-focus-first-element"); var _useIsHovered = require("./use-is-hovered"); var _context = require("../../block-edit/context"); var _useFocusHandler = require("./use-focus-handler"); var _useSelectedBlockEventHandlers = require("./use-selected-block-event-handlers"); var _useBlockRefs = require("./use-block-refs"); var _useIntersectionObserver = require("./use-intersection-observer"); var _useScrollIntoView = require("./use-scroll-into-view"); var _useFlashEditableBlocks = require("../../use-flash-editable-blocks"); var _blockBindings = require("../../../utils/block-bindings"); var _useFirefoxDraggableCompatibility = require("./use-firefox-draggable-compatibility"); /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ /** * This hook is used to lightly mark an element as a block element. The element * should be the outermost element of a block. Call this hook and pass the * returned props to the element to mark as a block. If you define a ref for the * element, it is important to pass the ref to this hook, which the hook in turn * will pass to the component through the props it returns. Optionally, you can * also pass any other props through this hook, and they will be merged and * returned. * * Use of this hook on the outermost element of a block is required if using API >= v2. * * @example * ```js * import { useBlockProps } from '@wordpress/block-editor'; * * export default function Edit() { * * const blockProps = useBlockProps( { * className: 'my-custom-class', * style: { * color: '#222222', * backgroundColor: '#eeeeee' * } * } ) * * return ( * <div { ...blockProps }> * * </div> * ) * } * * ``` * * * @param {Object} props Optional. Props to pass to the element. Must contain * the ref if one is defined. * @param {Object} options Options for internal use only. * @param {boolean} options.__unstableIsHtml * * @return {Object} Props to pass to the element to mark as a block. */ function useBlockProps(props = {}, { __unstableIsHtml } = {}) { const { clientId, className, wrapperProps = {}, isAligned, index, mode, name, blockApiVersion, blockTitle, isSelected, isSubtreeDisabled, hasOverlay, initialPosition, blockEditingMode, isHighlighted, isMultiSelected, isPartiallySelected, isReusable, isDragging, hasChildSelected, isEditingDisabled, hasEditableOutline, isTemporarilyEditingAsBlocks, defaultClassName, isSectionBlock, canMove } = (0, _element.useContext)(_privateBlockContext.PrivateBlockContext); // translators: %s: Type of block (i.e. Text, Image etc) const blockLabel = (0, _i18n.sprintf)((0, _i18n.__)('Block: %s'), blockTitle); const htmlSuffix = mode === 'html' && !__unstableIsHtml ? '-visual' : ''; const ffDragRef = (0, _useFirefoxDraggableCompatibility.useFirefoxDraggableCompatibility)(); const mergedRefs = (0, _compose.useMergeRefs)([props.ref, (0, _useFocusFirstElement.useFocusFirstElement)({ clientId, initialPosition }), (0, _useBlockRefs.useBlockRefProvider)(clientId), (0, _useFocusHandler.useFocusHandler)(clientId), (0, _useSelectedBlockEventHandlers.useEventHandlers)({ clientId, isSelected }), (0, _useIsHovered.useIsHovered)({ clientId }), (0, _useIntersectionObserver.useIntersectionObserver)(), (0, _useMovingAnimation.default)({ triggerAnimationOnChange: index, clientId }), (0, _compose.useDisabled)({ isDisabled: !hasOverlay }), (0, _useFlashEditableBlocks.useFlashEditableBlocks)({ clientId, isEnabled: isSectionBlock }), (0, _useScrollIntoView.useScrollIntoView)({ isSelected }), canMove ? ffDragRef : undefined]); const blockEditContext = (0, _context.useBlockEditContext)(); const hasBlockBindings = !!blockEditContext[_context.blockBindingsKey]; const bindingsStyle = hasBlockBindings && (0, _blockBindings.canBindBlock)(name) ? { '--wp-admin-theme-color': 'var(--wp-block-synced-color)', '--wp-admin-theme-color--rgb': 'var(--wp-block-synced-color--rgb)' } : {}; // Ensures it warns only inside the `edit` implementation for the block. if (blockApiVersion < 2 && clientId === blockEditContext.clientId) { globalThis.SCRIPT_DEBUG === true ? (0, _warning.default)(`Block type "${name}" must support API version 2 or higher to work correctly with "useBlockProps" method.`) : void 0; } let hasNegativeMargin = false; if (wrapperProps?.style?.marginTop?.charAt(0) === '-' || wrapperProps?.style?.marginBottom?.charAt(0) === '-' || wrapperProps?.style?.marginLeft?.charAt(0) === '-' || wrapperProps?.style?.marginRight?.charAt(0) === '-') { hasNegativeMargin = true; } return { tabIndex: blockEditingMode === 'disabled' ? -1 : 0, draggable: canMove && !hasChildSelected ? true : undefined, ...wrapperProps, ...props, ref: mergedRefs, id: `block-${clientId}${htmlSuffix}`, role: 'document', 'aria-label': blockLabel, 'data-block': clientId, 'data-type': name, 'data-title': blockTitle, inert: isSubtreeDisabled ? 'true' : undefined, className: (0, _clsx.default)('block-editor-block-list__block', { // The wp-block className is important for editor styles. 'wp-block': !isAligned, 'has-block-overlay': hasOverlay, 'is-selected': isSelected, 'is-highlighted': isHighlighted, 'is-multi-selected': isMultiSelected, 'is-partially-selected': isPartiallySelected, 'is-reusable': isReusable, 'is-dragging': isDragging, 'has-child-selected': hasChildSelected, 'is-editing-disabled': isEditingDisabled, 'has-editable-outline': hasEditableOutline, 'has-negative-margin': hasNegativeMargin, 'is-content-locked-temporarily-editing-as-blocks': isTemporarilyEditingAsBlocks }, className, props.className, wrapperProps.className, defaultClassName), style: { ...wrapperProps.style, ...props.style, ...bindingsStyle } }; } /** * Call within a save function to get the props for the block wrapper. * * @param {Object} props Optional. Props to pass to the element. */ useBlockProps.save = _blocks.__unstableGetBlockProps; //# sourceMappingURL=index.js.map