@wordpress/block-editor
Version:
232 lines (231 loc) • 6.37 kB
JavaScript
// 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