UNPKG

@wordpress/block-editor

Version:
232 lines (231 loc) 6.37 kB
// packages/block-editor/src/hooks/layout-child.js import { useInstanceId } from "@wordpress/compose"; import { useSelect } from "@wordpress/data"; import { useState } from "@wordpress/element"; import { store as blockEditorStore } from "../store"; import { useStyleOverride } from "./utils"; import { useLayout } from "../components/block-list/layout"; import { GridVisualizer, GridItemResizer, GridItemMovers } from "../components/grid"; import { Fragment, jsx, jsxs } from "react/jsx-runtime"; var LAYOUT_CHILD_BLOCK_PROPS_REFERENCE = {}; function useBlockPropsChildLayoutStyles({ style }) { const shouldRenderChildLayoutStyles = useSelect((select) => { return !select(blockEditorStore).getSettings().disableLayoutStyles; }); const layout = style?.layout ?? {}; const { selfStretch, flexSize, columnStart, rowStart, columnSpan, rowSpan } = layout; const parentLayout = useLayout() || {}; const { columnCount, minimumColumnWidth } = parentLayout; const id = useInstanceId(LAYOUT_CHILD_BLOCK_PROPS_REFERENCE); const selector = `.wp-container-content-${id}`; if (process.env.NODE_ENV === "development") { if (columnStart && typeof columnStart !== "number") { throw new Error("columnStart must be a number"); } if (rowStart && typeof rowStart !== "number") { throw new Error("rowStart must be a number"); } if (columnSpan && typeof columnSpan !== "number") { throw new Error("columnSpan must be a number"); } if (rowSpan && typeof rowSpan !== "number") { throw new Error("rowSpan must be a number"); } } let css = ""; if (shouldRenderChildLayoutStyles) { if (selfStretch === "fixed" && flexSize) { css = `${selector} { flex-basis: ${flexSize}; box-sizing: border-box; }`; } else if (selfStretch === "fill") { css = `${selector} { flex-grow: 1; }`; } else if (columnStart && columnSpan) { css = `${selector} { grid-column: ${columnStart} / span ${columnSpan}; }`; } else if (columnStart) { css = `${selector} { grid-column: ${columnStart}; }`; } else if (columnSpan) { css = `${selector} { grid-column: span ${columnSpan}; }`; } if (rowStart && rowSpan) { css += `${selector} { grid-row: ${rowStart} / span ${rowSpan}; }`; } else if (rowStart) { css += `${selector} { grid-row: ${rowStart}; }`; } else if (rowSpan) { css += `${selector} { grid-row: span ${rowSpan}; }`; } if ((columnSpan || columnStart) && (minimumColumnWidth || !columnCount)) { let parentColumnValue = parseFloat(minimumColumnWidth); if (isNaN(parentColumnValue)) { parentColumnValue = 12; } let parentColumnUnit = minimumColumnWidth?.replace( parentColumnValue, "" ); if (!["px", "rem", "em"].includes(parentColumnUnit)) { parentColumnUnit = "rem"; } let numColsToBreakAt = 2; if (columnSpan && columnStart) { numColsToBreakAt = columnSpan + columnStart - 1; } else if (columnSpan) { numColsToBreakAt = columnSpan; } else { numColsToBreakAt = columnStart; } const defaultGapValue = parentColumnUnit === "px" ? 24 : 1.5; const containerQueryValue = numColsToBreakAt * parentColumnValue + (numColsToBreakAt - 1) * defaultGapValue; const minimumContainerQueryValue = parentColumnValue * 2 + defaultGapValue - 1; const gridColumnValue = columnSpan && columnSpan > 1 ? "1/-1" : "auto"; css += `@container (max-width: ${Math.max( containerQueryValue, minimumContainerQueryValue )}${parentColumnUnit}) { ${selector} { grid-column: ${gridColumnValue}; grid-row: auto; } }`; } } useStyleOverride({ css }); if (!css) { return; } return { className: `wp-container-content-${id}` }; } function ChildLayoutControlsPure({ clientId, style, setAttributes }) { const parentLayout = useLayout() || {}; const { type: parentLayoutType = "default", allowSizingOnChildren = false, isManualPlacement } = parentLayout; if (parentLayoutType !== "grid") { return null; } return /* @__PURE__ */ jsx( GridTools, { clientId, style, setAttributes, allowSizingOnChildren, isManualPlacement, parentLayout } ); } function GridTools({ clientId, style, setAttributes, allowSizingOnChildren, isManualPlacement, parentLayout }) { const { rootClientId, isVisible } = useSelect( (select) => { const { getBlockRootClientId, getBlockEditingMode, getTemplateLock } = select(blockEditorStore); const _rootClientId = getBlockRootClientId(clientId); if (getTemplateLock(_rootClientId) || getBlockEditingMode(_rootClientId) !== "default") { return { rootClientId: _rootClientId, isVisible: false }; } return { rootClientId: _rootClientId, isVisible: true }; }, [clientId] ); const [resizerBounds, setResizerBounds] = useState(); if (!isVisible) { return null; } function updateLayout(layout) { setAttributes({ style: { ...style, layout: { ...style?.layout, ...layout } } }); } return /* @__PURE__ */ jsxs(Fragment, { children: [ /* @__PURE__ */ jsx( GridVisualizer, { clientId: rootClientId, contentRef: setResizerBounds, parentLayout } ), allowSizingOnChildren && /* @__PURE__ */ jsx( GridItemResizer, { clientId, bounds: resizerBounds, onChange: updateLayout, parentLayout } ), isManualPlacement && window.__experimentalEnableGridInteractivity && /* @__PURE__ */ jsx( GridItemMovers, { layout: style?.layout, parentLayout, onChange: updateLayout, gridClientId: rootClientId, blockClientId: clientId } ) ] }); } var layout_child_default = { useBlockProps: useBlockPropsChildLayoutStyles, edit: ChildLayoutControlsPure, attributeKeys: ["style"], hasSupport() { return true; } }; export { layout_child_default as default }; //# sourceMappingURL=layout-child.js.map