@wordpress/block-editor 13.1.0 → 13.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -17
- package/README.md +1 -1
- package/build/components/block-lock/modal.js +67 -67
- package/build/components/block-lock/modal.js.map +1 -1
- package/build/components/block-mover/index.js +12 -6
- package/build/components/block-mover/index.js.map +1 -1
- package/build/components/block-toolbar/shuffle.js +3 -1
- package/build/components/block-toolbar/shuffle.js.map +1 -1
- package/build/components/child-layout-control/index.js +185 -127
- package/build/components/child-layout-control/index.js.map +1 -1
- package/build/components/global-styles/use-global-styles-output.js +4 -3
- package/build/components/global-styles/use-global-styles-output.js.map +1 -1
- package/build/components/grid/grid-item-movers.js +97 -0
- package/build/components/grid/grid-item-movers.js.map +1 -0
- package/build/components/{grid-visualizer → grid}/grid-item-resizer.js +18 -56
- package/build/components/grid/grid-item-resizer.js.map +1 -0
- package/build/components/grid/grid-visualizer.js +225 -0
- package/build/components/grid/grid-visualizer.js.map +1 -0
- package/build/components/{grid-visualizer → grid}/index.js +14 -0
- package/build/components/grid/index.js.map +1 -0
- package/build/components/grid/use-get-number-of-blocks-before-cell.js +40 -0
- package/build/components/grid/use-get-number-of-blocks-before-cell.js.map +1 -0
- package/build/components/grid/use-grid-layout-sync.js +162 -0
- package/build/components/grid/use-grid-layout-sync.js.map +1 -0
- package/build/components/grid/utils.js +145 -0
- package/build/components/grid/utils.js.map +1 -0
- package/build/components/image-editor/aspect-ratio-dropdown.js +0 -1
- package/build/components/image-editor/aspect-ratio-dropdown.js.map +1 -1
- package/build/components/inner-blocks/index.js +1 -1
- package/build/components/inner-blocks/index.js.map +1 -1
- package/build/components/rich-text/event-listeners/input-rules.js +1 -0
- package/build/components/rich-text/event-listeners/input-rules.js.map +1 -1
- package/build/components/rich-text/index.native.js +10 -4
- package/build/components/rich-text/index.native.js.map +1 -1
- package/build/components/rich-text/native/index.native.js +14 -0
- package/build/components/rich-text/native/index.native.js.map +1 -1
- package/build/hooks/block-style-variation.js +26 -7
- package/build/hooks/block-style-variation.js.map +1 -1
- package/build/hooks/layout-child.js +29 -21
- package/build/hooks/layout-child.js.map +1 -1
- package/build/hooks/utils.js +3 -2
- package/build/hooks/utils.js.map +1 -1
- package/build/layouts/grid.js +24 -47
- package/build/layouts/grid.js.map +1 -1
- package/build/lock-unlock.js +1 -1
- package/build/lock-unlock.js.map +1 -1
- package/build/store/actions.js +17 -1
- package/build/store/actions.js.map +1 -1
- package/build-module/components/block-lock/modal.js +67 -67
- package/build-module/components/block-lock/modal.js.map +1 -1
- package/build-module/components/block-mover/index.js +12 -6
- package/build-module/components/block-mover/index.js.map +1 -1
- package/build-module/components/block-toolbar/shuffle.js +3 -1
- package/build-module/components/block-toolbar/shuffle.js.map +1 -1
- package/build-module/components/child-layout-control/index.js +185 -127
- package/build-module/components/child-layout-control/index.js.map +1 -1
- package/build-module/components/global-styles/use-global-styles-output.js +4 -3
- package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
- package/build-module/components/grid/grid-item-movers.js +90 -0
- package/build-module/components/grid/grid-item-movers.js.map +1 -0
- package/build-module/components/{grid-visualizer → grid}/grid-item-resizer.js +13 -51
- package/build-module/components/grid/grid-item-resizer.js.map +1 -0
- package/build-module/components/grid/grid-visualizer.js +217 -0
- package/build-module/components/grid/grid-visualizer.js.map +1 -0
- package/build-module/components/grid/index.js +5 -0
- package/build-module/components/grid/index.js.map +1 -0
- package/build-module/components/grid/use-get-number-of-blocks-before-cell.js +33 -0
- package/build-module/components/grid/use-get-number-of-blocks-before-cell.js.map +1 -0
- package/build-module/components/grid/use-grid-layout-sync.js +155 -0
- package/build-module/components/grid/use-grid-layout-sync.js.map +1 -0
- package/build-module/components/grid/utils.js +131 -0
- package/build-module/components/grid/utils.js.map +1 -0
- package/build-module/components/image-editor/aspect-ratio-dropdown.js +0 -1
- package/build-module/components/image-editor/aspect-ratio-dropdown.js.map +1 -1
- package/build-module/components/inner-blocks/index.js +1 -1
- package/build-module/components/inner-blocks/index.js.map +1 -1
- package/build-module/components/rich-text/event-listeners/input-rules.js +1 -1
- package/build-module/components/rich-text/event-listeners/input-rules.js.map +1 -1
- package/build-module/components/rich-text/index.native.js +11 -5
- package/build-module/components/rich-text/index.native.js.map +1 -1
- package/build-module/components/rich-text/native/index.native.js +14 -0
- package/build-module/components/rich-text/native/index.native.js.map +1 -1
- package/build-module/hooks/block-style-variation.js +25 -7
- package/build-module/hooks/block-style-variation.js.map +1 -1
- package/build-module/hooks/layout-child.js +27 -19
- package/build-module/hooks/layout-child.js.map +1 -1
- package/build-module/hooks/utils.js +3 -2
- package/build-module/hooks/utils.js.map +1 -1
- package/build-module/layouts/grid.js +24 -47
- package/build-module/layouts/grid.js.map +1 -1
- package/build-module/lock-unlock.js +1 -1
- package/build-module/lock-unlock.js.map +1 -1
- package/build-module/store/actions.js +17 -1
- package/build-module/store/actions.js.map +1 -1
- package/build-style/style-rtl.css +39 -18
- package/build-style/style.css +39 -18
- package/package.json +31 -31
- package/src/components/block-lock/modal.js +95 -82
- package/src/components/block-lock/style.scss +11 -1
- package/src/components/block-mover/index.js +37 -24
- package/src/components/block-toolbar/shuffle.js +3 -1
- package/src/components/child-layout-control/index.js +224 -159
- package/src/components/global-styles/test/use-global-styles-output.js +38 -3
- package/src/components/global-styles/use-global-styles-output.js +4 -3
- package/src/components/grid/grid-item-movers.js +128 -0
- package/src/components/{grid-visualizer → grid}/grid-item-resizer.js +14 -52
- package/src/components/grid/grid-visualizer.js +267 -0
- package/src/components/grid/index.js +4 -0
- package/src/components/grid/style.scss +63 -0
- package/src/components/grid/use-get-number-of-blocks-before-cell.js +30 -0
- package/src/components/grid/use-grid-layout-sync.js +167 -0
- package/src/components/grid/utils.js +178 -0
- package/src/components/image-editor/aspect-ratio-dropdown.js +0 -1
- package/src/components/inner-blocks/index.js +3 -1
- package/src/components/rich-text/event-listeners/input-rules.js +1 -1
- package/src/components/rich-text/index.native.js +10 -8
- package/src/components/rich-text/native/index.native.js +17 -0
- package/src/hooks/block-style-variation.js +24 -6
- package/src/hooks/layout-child.js +34 -14
- package/src/hooks/utils.js +3 -1
- package/src/layouts/grid.js +54 -62
- package/src/lock-unlock.js +1 -1
- package/src/store/actions.js +21 -1
- package/src/style.scss +1 -1
- package/build/components/grid-visualizer/grid-item-resizer.js.map +0 -1
- package/build/components/grid-visualizer/grid-visualizer.js +0 -92
- package/build/components/grid-visualizer/grid-visualizer.js.map +0 -1
- package/build/components/grid-visualizer/index.js.map +0 -1
- package/build/components/grid-visualizer/utils.js +0 -10
- package/build/components/grid-visualizer/utils.js.map +0 -1
- package/build-module/components/grid-visualizer/grid-item-resizer.js.map +0 -1
- package/build-module/components/grid-visualizer/grid-visualizer.js +0 -84
- package/build-module/components/grid-visualizer/grid-visualizer.js.map +0 -1
- package/build-module/components/grid-visualizer/index.js +0 -3
- package/build-module/components/grid-visualizer/index.js.map +0 -1
- package/build-module/components/grid-visualizer/utils.js +0 -4
- package/build-module/components/grid-visualizer/utils.js.map +0 -1
- package/src/components/grid-visualizer/grid-visualizer.js +0 -101
- package/src/components/grid-visualizer/index.js +0 -2
- package/src/components/grid-visualizer/style.scss +0 -34
- package/src/components/grid-visualizer/utils.js +0 -5
- /package/src/components/font-sizes/{README.MD → README.md} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ResizableBox","useState","useEffect","__unstableUseBlockElement","useBlockElement","BlockPopoverCover","getComputedCSS","getGridTracks","getClosestTrack","jsx","_jsx","GridItemResizer","clientId","bounds","onChange","parentLayout","blockElement","rootBlockElement","parentElement","columnCount","GridItemResizerInner","isManualGrid","window","__experimentalEnableGridInteractivity","resizeDirection","setResizeDirection","enableSide","setEnableSide","top","bottom","left","right","observer","ResizeObserver","blockClientRect","getBoundingClientRect","rootBlockClientRect","observe","disconnect","justification","alignment","styles","display","justifyContent","alignItems","className","__unstablePopoverSlot","additionalStyles","children","size","width","height","enable","bottomLeft","bottomRight","topLeft","topRight","boundsByDirection","onResizeStart","event","direction","ownerDocument","addEventListener","target","dispatchEvent","Event","bubbles","once","onResizeStop","boxElement","columnGap","parseFloat","rowGap","gridColumnTracks","gridRowTracks","rect","DOMRect","offsetLeft","offsetTop","offsetWidth","offsetHeight","columnStart","rowStart","columnEnd","rowEnd","columnSpan","rowSpan","undefined"],"sources":["@wordpress/block-editor/src/components/grid/grid-item-resizer.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { ResizableBox } from '@wordpress/components';\nimport { useState, useEffect } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { __unstableUseBlockElement as useBlockElement } from '../block-list/use-block-props/use-block-refs';\nimport BlockPopoverCover from '../block-popover/cover';\nimport { getComputedCSS, getGridTracks, getClosestTrack } from './utils';\n\nexport function GridItemResizer( {\n\tclientId,\n\tbounds,\n\tonChange,\n\tparentLayout,\n} ) {\n\tconst blockElement = useBlockElement( clientId );\n\tconst rootBlockElement = blockElement?.parentElement;\n\tconst { columnCount } = parentLayout;\n\n\tif ( ! blockElement || ! rootBlockElement ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<GridItemResizerInner\n\t\t\tclientId={ clientId }\n\t\t\tbounds={ bounds }\n\t\t\tblockElement={ blockElement }\n\t\t\trootBlockElement={ rootBlockElement }\n\t\t\tonChange={ onChange }\n\t\t\tisManualGrid={\n\t\t\t\t!! columnCount && window.__experimentalEnableGridInteractivity\n\t\t\t}\n\t\t/>\n\t);\n}\n\nfunction GridItemResizerInner( {\n\tclientId,\n\tbounds,\n\tblockElement,\n\trootBlockElement,\n\tonChange,\n\tisManualGrid,\n} ) {\n\tconst [ resizeDirection, setResizeDirection ] = useState( null );\n\tconst [ enableSide, setEnableSide ] = useState( {\n\t\ttop: false,\n\t\tbottom: false,\n\t\tleft: false,\n\t\tright: false,\n\t} );\n\n\tuseEffect( () => {\n\t\tconst observer = new window.ResizeObserver( () => {\n\t\t\tconst blockClientRect = blockElement.getBoundingClientRect();\n\t\t\tconst rootBlockClientRect =\n\t\t\t\trootBlockElement.getBoundingClientRect();\n\t\t\tsetEnableSide( {\n\t\t\t\ttop: blockClientRect.top > rootBlockClientRect.top,\n\t\t\t\tbottom: blockClientRect.bottom < rootBlockClientRect.bottom,\n\t\t\t\tleft: blockClientRect.left > rootBlockClientRect.left,\n\t\t\t\tright: blockClientRect.right < rootBlockClientRect.right,\n\t\t\t} );\n\t\t} );\n\t\tobserver.observe( blockElement );\n\t\treturn () => observer.disconnect();\n\t}, [ blockElement, rootBlockElement ] );\n\n\tconst justification = {\n\t\tright: 'flex-start',\n\t\tleft: 'flex-end',\n\t};\n\n\tconst alignment = {\n\t\ttop: 'flex-end',\n\t\tbottom: 'flex-start',\n\t};\n\n\tconst styles = {\n\t\tdisplay: 'flex',\n\t\tjustifyContent: 'center',\n\t\talignItems: 'center',\n\t\t...( justification[ resizeDirection ] && {\n\t\t\tjustifyContent: justification[ resizeDirection ],\n\t\t} ),\n\t\t...( alignment[ resizeDirection ] && {\n\t\t\talignItems: alignment[ resizeDirection ],\n\t\t} ),\n\t};\n\n\treturn (\n\t\t<BlockPopoverCover\n\t\t\tclassName=\"block-editor-grid-item-resizer\"\n\t\t\tclientId={ clientId }\n\t\t\t__unstablePopoverSlot=\"block-toolbar\"\n\t\t\tadditionalStyles={ styles }\n\t\t>\n\t\t\t<ResizableBox\n\t\t\t\tclassName=\"block-editor-grid-item-resizer__box\"\n\t\t\t\tsize={ {\n\t\t\t\t\twidth: '100%',\n\t\t\t\t\theight: '100%',\n\t\t\t\t} }\n\t\t\t\tenable={ {\n\t\t\t\t\tbottom: enableSide.bottom,\n\t\t\t\t\tbottomLeft: false,\n\t\t\t\t\tbottomRight: false,\n\t\t\t\t\tleft: enableSide.left,\n\t\t\t\t\tright: enableSide.right,\n\t\t\t\t\ttop: enableSide.top,\n\t\t\t\t\ttopLeft: false,\n\t\t\t\t\ttopRight: false,\n\t\t\t\t} }\n\t\t\t\tbounds={ bounds }\n\t\t\t\tboundsByDirection\n\t\t\t\tonResizeStart={ ( event, direction ) => {\n\t\t\t\t\t/*\n\t\t\t\t\t * The container justification and alignment need to be set\n\t\t\t\t\t * according to the direction the resizer is being dragged in,\n\t\t\t\t\t * so that it resizes in the right direction.\n\t\t\t\t\t */\n\t\t\t\t\tsetResizeDirection( direction );\n\n\t\t\t\t\t/*\n\t\t\t\t\t * The mouseup event on the resize handle doesn't trigger if the mouse\n\t\t\t\t\t * isn't directly above the handle, so we try to detect if it happens\n\t\t\t\t\t * outside the grid and dispatch a mouseup event on the handle.\n\t\t\t\t\t */\n\t\t\t\t\tblockElement.ownerDocument.addEventListener(\n\t\t\t\t\t\t'mouseup',\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tevent.target.dispatchEvent(\n\t\t\t\t\t\t\t\tnew Event( 'mouseup', { bubbles: true } )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ once: true }\n\t\t\t\t\t);\n\t\t\t\t} }\n\t\t\t\tonResizeStop={ ( event, direction, boxElement ) => {\n\t\t\t\t\tconst columnGap = parseFloat(\n\t\t\t\t\t\tgetComputedCSS( rootBlockElement, 'column-gap' )\n\t\t\t\t\t);\n\t\t\t\t\tconst rowGap = parseFloat(\n\t\t\t\t\t\tgetComputedCSS( rootBlockElement, 'row-gap' )\n\t\t\t\t\t);\n\t\t\t\t\tconst gridColumnTracks = getGridTracks(\n\t\t\t\t\t\tgetComputedCSS(\n\t\t\t\t\t\t\trootBlockElement,\n\t\t\t\t\t\t\t'grid-template-columns'\n\t\t\t\t\t\t),\n\t\t\t\t\t\tcolumnGap\n\t\t\t\t\t);\n\t\t\t\t\tconst gridRowTracks = getGridTracks(\n\t\t\t\t\t\tgetComputedCSS(\n\t\t\t\t\t\t\trootBlockElement,\n\t\t\t\t\t\t\t'grid-template-rows'\n\t\t\t\t\t\t),\n\t\t\t\t\t\trowGap\n\t\t\t\t\t);\n\t\t\t\t\tconst rect = new window.DOMRect(\n\t\t\t\t\t\tblockElement.offsetLeft + boxElement.offsetLeft,\n\t\t\t\t\t\tblockElement.offsetTop + boxElement.offsetTop,\n\t\t\t\t\t\tboxElement.offsetWidth,\n\t\t\t\t\t\tboxElement.offsetHeight\n\t\t\t\t\t);\n\t\t\t\t\tconst columnStart =\n\t\t\t\t\t\tgetClosestTrack( gridColumnTracks, rect.left ) + 1;\n\t\t\t\t\tconst rowStart =\n\t\t\t\t\t\tgetClosestTrack( gridRowTracks, rect.top ) + 1;\n\t\t\t\t\tconst columnEnd =\n\t\t\t\t\t\tgetClosestTrack( gridColumnTracks, rect.right, 'end' ) +\n\t\t\t\t\t\t1;\n\t\t\t\t\tconst rowEnd =\n\t\t\t\t\t\tgetClosestTrack( gridRowTracks, rect.bottom, 'end' ) +\n\t\t\t\t\t\t1;\n\t\t\t\t\tonChange( {\n\t\t\t\t\t\tcolumnSpan: columnEnd - columnStart + 1,\n\t\t\t\t\t\trowSpan: rowEnd - rowStart + 1,\n\t\t\t\t\t\tcolumnStart: isManualGrid ? columnStart : undefined,\n\t\t\t\t\t\trowStart: isManualGrid ? rowStart : undefined,\n\t\t\t\t\t} );\n\t\t\t\t} }\n\t\t\t/>\n\t\t</BlockPopoverCover>\n\t);\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External dependencies
|
|
3
|
+
*/
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* WordPress dependencies
|
|
8
|
+
*/
|
|
9
|
+
import { useState, useEffect, forwardRef } from '@wordpress/element';
|
|
10
|
+
import { useSelect, useDispatch } from '@wordpress/data';
|
|
11
|
+
import { __experimentalUseDropZone as useDropZone } from '@wordpress/compose';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Internal dependencies
|
|
15
|
+
*/
|
|
16
|
+
import { __unstableUseBlockElement as useBlockElement } from '../block-list/use-block-props/use-block-refs';
|
|
17
|
+
import BlockPopoverCover from '../block-popover/cover';
|
|
18
|
+
import { range, GridRect, getGridInfo } from './utils';
|
|
19
|
+
import { store as blockEditorStore } from '../../store';
|
|
20
|
+
import { useGetNumberOfBlocksBeforeCell } from './use-get-number-of-blocks-before-cell';
|
|
21
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
22
|
+
export function GridVisualizer({
|
|
23
|
+
clientId,
|
|
24
|
+
contentRef,
|
|
25
|
+
parentLayout
|
|
26
|
+
}) {
|
|
27
|
+
const isDistractionFree = useSelect(select => select(blockEditorStore).getSettings().isDistractionFree, []);
|
|
28
|
+
const gridElement = useBlockElement(clientId);
|
|
29
|
+
if (isDistractionFree || !gridElement) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
const isManualGrid = parentLayout?.columnCount && window.__experimentalEnableGridInteractivity;
|
|
33
|
+
return /*#__PURE__*/_jsx(GridVisualizerGrid, {
|
|
34
|
+
clientId: clientId,
|
|
35
|
+
gridElement: gridElement,
|
|
36
|
+
isManualGrid: isManualGrid,
|
|
37
|
+
ref: contentRef
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
const GridVisualizerGrid = forwardRef(({
|
|
41
|
+
clientId,
|
|
42
|
+
gridElement,
|
|
43
|
+
isManualGrid
|
|
44
|
+
}, ref) => {
|
|
45
|
+
const [gridInfo, setGridInfo] = useState(() => getGridInfo(gridElement));
|
|
46
|
+
const [isDroppingAllowed, setIsDroppingAllowed] = useState(false);
|
|
47
|
+
const [highlightedRect, setHighlightedRect] = useState(null);
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
const observers = [];
|
|
50
|
+
for (const element of [gridElement, ...gridElement.children]) {
|
|
51
|
+
const observer = new window.ResizeObserver(() => {
|
|
52
|
+
setGridInfo(getGridInfo(gridElement));
|
|
53
|
+
});
|
|
54
|
+
observer.observe(element);
|
|
55
|
+
observers.push(observer);
|
|
56
|
+
}
|
|
57
|
+
return () => {
|
|
58
|
+
for (const observer of observers) {
|
|
59
|
+
observer.disconnect();
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}, [gridElement]);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
function onGlobalDrag() {
|
|
65
|
+
setIsDroppingAllowed(true);
|
|
66
|
+
}
|
|
67
|
+
function onGlobalDragEnd() {
|
|
68
|
+
setIsDroppingAllowed(false);
|
|
69
|
+
}
|
|
70
|
+
document.addEventListener('drag', onGlobalDrag);
|
|
71
|
+
document.addEventListener('dragend', onGlobalDragEnd);
|
|
72
|
+
return () => {
|
|
73
|
+
document.removeEventListener('drag', onGlobalDrag);
|
|
74
|
+
document.removeEventListener('dragend', onGlobalDragEnd);
|
|
75
|
+
};
|
|
76
|
+
}, []);
|
|
77
|
+
return /*#__PURE__*/_jsx(BlockPopoverCover, {
|
|
78
|
+
className: clsx('block-editor-grid-visualizer', {
|
|
79
|
+
'is-dropping-allowed': isDroppingAllowed
|
|
80
|
+
}),
|
|
81
|
+
clientId: clientId,
|
|
82
|
+
__unstablePopoverSlot: "block-toolbar",
|
|
83
|
+
children: /*#__PURE__*/_jsx("div", {
|
|
84
|
+
ref: ref,
|
|
85
|
+
className: "block-editor-grid-visualizer__grid",
|
|
86
|
+
style: gridInfo.style,
|
|
87
|
+
children: isManualGrid ? range(1, gridInfo.numRows).map(row => range(1, gridInfo.numColumns).map(column => /*#__PURE__*/_jsx(GridVisualizerCell, {
|
|
88
|
+
color: gridInfo.currentColor,
|
|
89
|
+
children: /*#__PURE__*/_jsx(GridVisualizerDropZone, {
|
|
90
|
+
column: column,
|
|
91
|
+
row: row,
|
|
92
|
+
gridClientId: clientId,
|
|
93
|
+
gridInfo: gridInfo,
|
|
94
|
+
highlightedRect: highlightedRect,
|
|
95
|
+
setHighlightedRect: setHighlightedRect
|
|
96
|
+
})
|
|
97
|
+
}, `${row}-${column}`))) : Array.from({
|
|
98
|
+
length: gridInfo.numItems
|
|
99
|
+
}, (_, i) => /*#__PURE__*/_jsx(GridVisualizerCell, {
|
|
100
|
+
color: gridInfo.currentColor
|
|
101
|
+
}, i))
|
|
102
|
+
})
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
function GridVisualizerCell({
|
|
106
|
+
color,
|
|
107
|
+
children
|
|
108
|
+
}) {
|
|
109
|
+
return /*#__PURE__*/_jsx("div", {
|
|
110
|
+
className: "block-editor-grid-visualizer__cell",
|
|
111
|
+
style: {
|
|
112
|
+
boxShadow: `inset 0 0 0 1px color-mix(in srgb, ${color} 20%, #0000)`
|
|
113
|
+
},
|
|
114
|
+
children: children
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
function GridVisualizerDropZone({
|
|
118
|
+
column,
|
|
119
|
+
row,
|
|
120
|
+
gridClientId,
|
|
121
|
+
gridInfo,
|
|
122
|
+
highlightedRect,
|
|
123
|
+
setHighlightedRect
|
|
124
|
+
}) {
|
|
125
|
+
var _highlightedRect$cont;
|
|
126
|
+
const {
|
|
127
|
+
getBlockAttributes
|
|
128
|
+
} = useSelect(blockEditorStore);
|
|
129
|
+
const {
|
|
130
|
+
updateBlockAttributes,
|
|
131
|
+
moveBlocksToPosition,
|
|
132
|
+
__unstableMarkNextChangeAsNotPersistent
|
|
133
|
+
} = useDispatch(blockEditorStore);
|
|
134
|
+
const getNumberOfBlocksBeforeCell = useGetNumberOfBlocksBeforeCell(gridClientId, gridInfo.numColumns);
|
|
135
|
+
const ref = useDropZoneWithValidation({
|
|
136
|
+
validateDrag(srcClientId) {
|
|
137
|
+
const attributes = getBlockAttributes(srcClientId);
|
|
138
|
+
const rect = new GridRect({
|
|
139
|
+
columnStart: column,
|
|
140
|
+
rowStart: row,
|
|
141
|
+
columnSpan: attributes.style?.layout?.columnSpan,
|
|
142
|
+
rowSpan: attributes.style?.layout?.rowSpan
|
|
143
|
+
});
|
|
144
|
+
const isInBounds = new GridRect({
|
|
145
|
+
columnSpan: gridInfo.numColumns,
|
|
146
|
+
rowSpan: gridInfo.numRows
|
|
147
|
+
}).containsRect(rect);
|
|
148
|
+
return isInBounds;
|
|
149
|
+
},
|
|
150
|
+
onDragEnter(srcClientId) {
|
|
151
|
+
const attributes = getBlockAttributes(srcClientId);
|
|
152
|
+
setHighlightedRect(new GridRect({
|
|
153
|
+
columnStart: column,
|
|
154
|
+
rowStart: row,
|
|
155
|
+
columnSpan: attributes.style?.layout?.columnSpan,
|
|
156
|
+
rowSpan: attributes.style?.layout?.rowSpan
|
|
157
|
+
}));
|
|
158
|
+
},
|
|
159
|
+
onDragLeave() {
|
|
160
|
+
// onDragEnter can be called before onDragLeave if the user moves
|
|
161
|
+
// their mouse quickly, so only clear the highlight if it was set
|
|
162
|
+
// by this cell.
|
|
163
|
+
setHighlightedRect(prevHighlightedRect => prevHighlightedRect?.columnStart === column && prevHighlightedRect?.rowStart === row ? null : prevHighlightedRect);
|
|
164
|
+
},
|
|
165
|
+
onDrop(srcClientId) {
|
|
166
|
+
setHighlightedRect(null);
|
|
167
|
+
const attributes = getBlockAttributes(srcClientId);
|
|
168
|
+
updateBlockAttributes(srcClientId, {
|
|
169
|
+
style: {
|
|
170
|
+
...attributes.style,
|
|
171
|
+
layout: {
|
|
172
|
+
...attributes.style?.layout,
|
|
173
|
+
columnStart: column,
|
|
174
|
+
rowStart: row
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
__unstableMarkNextChangeAsNotPersistent();
|
|
179
|
+
moveBlocksToPosition([srcClientId], gridClientId, gridClientId, getNumberOfBlocksBeforeCell(column, row));
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
const isHighlighted = (_highlightedRect$cont = highlightedRect?.contains(column, row)) !== null && _highlightedRect$cont !== void 0 ? _highlightedRect$cont : false;
|
|
183
|
+
return /*#__PURE__*/_jsx("div", {
|
|
184
|
+
ref: ref,
|
|
185
|
+
className: clsx('block-editor-grid-visualizer__drop-zone', {
|
|
186
|
+
'is-highlighted': isHighlighted
|
|
187
|
+
})
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
function useDropZoneWithValidation({
|
|
191
|
+
validateDrag,
|
|
192
|
+
onDragEnter,
|
|
193
|
+
onDragLeave,
|
|
194
|
+
onDrop
|
|
195
|
+
}) {
|
|
196
|
+
const {
|
|
197
|
+
getDraggedBlockClientIds
|
|
198
|
+
} = useSelect(blockEditorStore);
|
|
199
|
+
return useDropZone({
|
|
200
|
+
onDragEnter() {
|
|
201
|
+
const [srcClientId] = getDraggedBlockClientIds();
|
|
202
|
+
if (srcClientId && validateDrag(srcClientId)) {
|
|
203
|
+
onDragEnter(srcClientId);
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
onDragLeave() {
|
|
207
|
+
onDragLeave();
|
|
208
|
+
},
|
|
209
|
+
onDrop() {
|
|
210
|
+
const [srcClientId] = getDraggedBlockClientIds();
|
|
211
|
+
if (srcClientId && validateDrag(srcClientId)) {
|
|
212
|
+
onDrop(srcClientId);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=grid-visualizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["clsx","useState","useEffect","forwardRef","useSelect","useDispatch","__experimentalUseDropZone","useDropZone","__unstableUseBlockElement","useBlockElement","BlockPopoverCover","range","GridRect","getGridInfo","store","blockEditorStore","useGetNumberOfBlocksBeforeCell","jsx","_jsx","GridVisualizer","clientId","contentRef","parentLayout","isDistractionFree","select","getSettings","gridElement","isManualGrid","columnCount","window","__experimentalEnableGridInteractivity","GridVisualizerGrid","ref","gridInfo","setGridInfo","isDroppingAllowed","setIsDroppingAllowed","highlightedRect","setHighlightedRect","observers","element","children","observer","ResizeObserver","observe","push","disconnect","onGlobalDrag","onGlobalDragEnd","document","addEventListener","removeEventListener","className","__unstablePopoverSlot","style","numRows","map","row","numColumns","column","GridVisualizerCell","color","currentColor","GridVisualizerDropZone","gridClientId","Array","from","length","numItems","_","i","boxShadow","_highlightedRect$cont","getBlockAttributes","updateBlockAttributes","moveBlocksToPosition","__unstableMarkNextChangeAsNotPersistent","getNumberOfBlocksBeforeCell","useDropZoneWithValidation","validateDrag","srcClientId","attributes","rect","columnStart","rowStart","columnSpan","layout","rowSpan","isInBounds","containsRect","onDragEnter","onDragLeave","prevHighlightedRect","onDrop","isHighlighted","contains","getDraggedBlockClientIds"],"sources":["@wordpress/block-editor/src/components/grid/grid-visualizer.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { useState, useEffect, forwardRef } from '@wordpress/element';\nimport { useSelect, useDispatch } from '@wordpress/data';\nimport { __experimentalUseDropZone as useDropZone } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport { __unstableUseBlockElement as useBlockElement } from '../block-list/use-block-props/use-block-refs';\nimport BlockPopoverCover from '../block-popover/cover';\nimport { range, GridRect, getGridInfo } from './utils';\nimport { store as blockEditorStore } from '../../store';\nimport { useGetNumberOfBlocksBeforeCell } from './use-get-number-of-blocks-before-cell';\n\nexport function GridVisualizer( { clientId, contentRef, parentLayout } ) {\n\tconst isDistractionFree = useSelect(\n\t\t( select ) =>\n\t\t\tselect( blockEditorStore ).getSettings().isDistractionFree,\n\t\t[]\n\t);\n\tconst gridElement = useBlockElement( clientId );\n\n\tif ( isDistractionFree || ! gridElement ) {\n\t\treturn null;\n\t}\n\n\tconst isManualGrid =\n\t\tparentLayout?.columnCount &&\n\t\twindow.__experimentalEnableGridInteractivity;\n\treturn (\n\t\t<GridVisualizerGrid\n\t\t\tclientId={ clientId }\n\t\t\tgridElement={ gridElement }\n\t\t\tisManualGrid={ isManualGrid }\n\t\t\tref={ contentRef }\n\t\t/>\n\t);\n}\n\nconst GridVisualizerGrid = forwardRef(\n\t( { clientId, gridElement, isManualGrid }, ref ) => {\n\t\tconst [ gridInfo, setGridInfo ] = useState( () =>\n\t\t\tgetGridInfo( gridElement )\n\t\t);\n\t\tconst [ isDroppingAllowed, setIsDroppingAllowed ] = useState( false );\n\t\tconst [ highlightedRect, setHighlightedRect ] = useState( null );\n\n\t\tuseEffect( () => {\n\t\t\tconst observers = [];\n\t\t\tfor ( const element of [ gridElement, ...gridElement.children ] ) {\n\t\t\t\tconst observer = new window.ResizeObserver( () => {\n\t\t\t\t\tsetGridInfo( getGridInfo( gridElement ) );\n\t\t\t\t} );\n\t\t\t\tobserver.observe( element );\n\t\t\t\tobservers.push( observer );\n\t\t\t}\n\t\t\treturn () => {\n\t\t\t\tfor ( const observer of observers ) {\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t}\n\t\t\t};\n\t\t}, [ gridElement ] );\n\n\t\tuseEffect( () => {\n\t\t\tfunction onGlobalDrag() {\n\t\t\t\tsetIsDroppingAllowed( true );\n\t\t\t}\n\t\t\tfunction onGlobalDragEnd() {\n\t\t\t\tsetIsDroppingAllowed( false );\n\t\t\t}\n\t\t\tdocument.addEventListener( 'drag', onGlobalDrag );\n\t\t\tdocument.addEventListener( 'dragend', onGlobalDragEnd );\n\t\t\treturn () => {\n\t\t\t\tdocument.removeEventListener( 'drag', onGlobalDrag );\n\t\t\t\tdocument.removeEventListener( 'dragend', onGlobalDragEnd );\n\t\t\t};\n\t\t}, [] );\n\n\t\treturn (\n\t\t\t<BlockPopoverCover\n\t\t\t\tclassName={ clsx( 'block-editor-grid-visualizer', {\n\t\t\t\t\t'is-dropping-allowed': isDroppingAllowed,\n\t\t\t\t} ) }\n\t\t\t\tclientId={ clientId }\n\t\t\t\t__unstablePopoverSlot=\"block-toolbar\"\n\t\t\t>\n\t\t\t\t<div\n\t\t\t\t\tref={ ref }\n\t\t\t\t\tclassName=\"block-editor-grid-visualizer__grid\"\n\t\t\t\t\tstyle={ gridInfo.style }\n\t\t\t\t>\n\t\t\t\t\t{ isManualGrid\n\t\t\t\t\t\t? range( 1, gridInfo.numRows ).map( ( row ) =>\n\t\t\t\t\t\t\t\trange( 1, gridInfo.numColumns ).map(\n\t\t\t\t\t\t\t\t\t( column ) => (\n\t\t\t\t\t\t\t\t\t\t<GridVisualizerCell\n\t\t\t\t\t\t\t\t\t\t\tkey={ `${ row }-${ column }` }\n\t\t\t\t\t\t\t\t\t\t\tcolor={ gridInfo.currentColor }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<GridVisualizerDropZone\n\t\t\t\t\t\t\t\t\t\t\t\tcolumn={ column }\n\t\t\t\t\t\t\t\t\t\t\t\trow={ row }\n\t\t\t\t\t\t\t\t\t\t\t\tgridClientId={ clientId }\n\t\t\t\t\t\t\t\t\t\t\t\tgridInfo={ gridInfo }\n\t\t\t\t\t\t\t\t\t\t\t\thighlightedRect={\n\t\t\t\t\t\t\t\t\t\t\t\t\thighlightedRect\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tsetHighlightedRect={\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetHighlightedRect\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</GridVisualizerCell>\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t )\n\t\t\t\t\t\t: Array.from(\n\t\t\t\t\t\t\t\t{ length: gridInfo.numItems },\n\t\t\t\t\t\t\t\t( _, i ) => (\n\t\t\t\t\t\t\t\t\t<GridVisualizerCell\n\t\t\t\t\t\t\t\t\t\tkey={ i }\n\t\t\t\t\t\t\t\t\t\tcolor={ gridInfo.currentColor }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t ) }\n\t\t\t\t</div>\n\t\t\t</BlockPopoverCover>\n\t\t);\n\t}\n);\n\nfunction GridVisualizerCell( { color, children } ) {\n\treturn (\n\t\t<div\n\t\t\tclassName=\"block-editor-grid-visualizer__cell\"\n\t\t\tstyle={ {\n\t\t\t\tboxShadow: `inset 0 0 0 1px color-mix(in srgb, ${ color } 20%, #0000)`,\n\t\t\t} }\n\t\t>\n\t\t\t{ children }\n\t\t</div>\n\t);\n}\n\nfunction GridVisualizerDropZone( {\n\tcolumn,\n\trow,\n\tgridClientId,\n\tgridInfo,\n\thighlightedRect,\n\tsetHighlightedRect,\n} ) {\n\tconst { getBlockAttributes } = useSelect( blockEditorStore );\n\tconst {\n\t\tupdateBlockAttributes,\n\t\tmoveBlocksToPosition,\n\t\t__unstableMarkNextChangeAsNotPersistent,\n\t} = useDispatch( blockEditorStore );\n\n\tconst getNumberOfBlocksBeforeCell = useGetNumberOfBlocksBeforeCell(\n\t\tgridClientId,\n\t\tgridInfo.numColumns\n\t);\n\n\tconst ref = useDropZoneWithValidation( {\n\t\tvalidateDrag( srcClientId ) {\n\t\t\tconst attributes = getBlockAttributes( srcClientId );\n\t\t\tconst rect = new GridRect( {\n\t\t\t\tcolumnStart: column,\n\t\t\t\trowStart: row,\n\t\t\t\tcolumnSpan: attributes.style?.layout?.columnSpan,\n\t\t\t\trowSpan: attributes.style?.layout?.rowSpan,\n\t\t\t} );\n\t\t\tconst isInBounds = new GridRect( {\n\t\t\t\tcolumnSpan: gridInfo.numColumns,\n\t\t\t\trowSpan: gridInfo.numRows,\n\t\t\t} ).containsRect( rect );\n\t\t\treturn isInBounds;\n\t\t},\n\t\tonDragEnter( srcClientId ) {\n\t\t\tconst attributes = getBlockAttributes( srcClientId );\n\t\t\tsetHighlightedRect(\n\t\t\t\tnew GridRect( {\n\t\t\t\t\tcolumnStart: column,\n\t\t\t\t\trowStart: row,\n\t\t\t\t\tcolumnSpan: attributes.style?.layout?.columnSpan,\n\t\t\t\t\trowSpan: attributes.style?.layout?.rowSpan,\n\t\t\t\t} )\n\t\t\t);\n\t\t},\n\t\tonDragLeave() {\n\t\t\t// onDragEnter can be called before onDragLeave if the user moves\n\t\t\t// their mouse quickly, so only clear the highlight if it was set\n\t\t\t// by this cell.\n\t\t\tsetHighlightedRect( ( prevHighlightedRect ) =>\n\t\t\t\tprevHighlightedRect?.columnStart === column &&\n\t\t\t\tprevHighlightedRect?.rowStart === row\n\t\t\t\t\t? null\n\t\t\t\t\t: prevHighlightedRect\n\t\t\t);\n\t\t},\n\t\tonDrop( srcClientId ) {\n\t\t\tsetHighlightedRect( null );\n\t\t\tconst attributes = getBlockAttributes( srcClientId );\n\t\t\tupdateBlockAttributes( srcClientId, {\n\t\t\t\tstyle: {\n\t\t\t\t\t...attributes.style,\n\t\t\t\t\tlayout: {\n\t\t\t\t\t\t...attributes.style?.layout,\n\t\t\t\t\t\tcolumnStart: column,\n\t\t\t\t\t\trowStart: row,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t} );\n\t\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\t\tmoveBlocksToPosition(\n\t\t\t\t[ srcClientId ],\n\t\t\t\tgridClientId,\n\t\t\t\tgridClientId,\n\t\t\t\tgetNumberOfBlocksBeforeCell( column, row )\n\t\t\t);\n\t\t},\n\t} );\n\n\tconst isHighlighted = highlightedRect?.contains( column, row ) ?? false;\n\n\treturn (\n\t\t<div\n\t\t\tref={ ref }\n\t\t\tclassName={ clsx( 'block-editor-grid-visualizer__drop-zone', {\n\t\t\t\t'is-highlighted': isHighlighted,\n\t\t\t} ) }\n\t\t/>\n\t);\n}\n\nfunction useDropZoneWithValidation( {\n\tvalidateDrag,\n\tonDragEnter,\n\tonDragLeave,\n\tonDrop,\n} ) {\n\tconst { getDraggedBlockClientIds } = useSelect( blockEditorStore );\n\treturn useDropZone( {\n\t\tonDragEnter() {\n\t\t\tconst [ srcClientId ] = getDraggedBlockClientIds();\n\t\t\tif ( srcClientId && validateDrag( srcClientId ) ) {\n\t\t\t\tonDragEnter( srcClientId );\n\t\t\t}\n\t\t},\n\t\tonDragLeave() {\n\t\t\tonDragLeave();\n\t\t},\n\t\tonDrop() {\n\t\t\tconst [ srcClientId ] = getDraggedBlockClientIds();\n\t\t\tif ( srcClientId && validateDrag( srcClientId ) ) {\n\t\t\t\tonDrop( srcClientId );\n\t\t\t}\n\t\t},\n\t} );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["GridVisualizer","GridItemResizer","GridItemMovers","useGridLayoutSync"],"sources":["@wordpress/block-editor/src/components/grid/index.js"],"sourcesContent":["export { GridVisualizer } from './grid-visualizer';\nexport { GridItemResizer } from './grid-item-resizer';\nexport { GridItemMovers } from './grid-item-movers';\nexport { useGridLayoutSync } from './use-grid-layout-sync';\n"],"mappings":"AAAA,SAASA,cAAc,QAAQ,mBAAmB;AAClD,SAASC,eAAe,QAAQ,qBAAqB;AACrD,SAASC,cAAc,QAAQ,oBAAoB;AACnD,SAASC,iBAAiB,QAAQ,wBAAwB","ignoreList":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { useSelect } from '@wordpress/data';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Internal dependencies
|
|
8
|
+
*/
|
|
9
|
+
import { store as blockEditorStore } from '../../store';
|
|
10
|
+
export function useGetNumberOfBlocksBeforeCell(gridClientId, numColumns) {
|
|
11
|
+
const {
|
|
12
|
+
getBlockOrder,
|
|
13
|
+
getBlockAttributes
|
|
14
|
+
} = useSelect(blockEditorStore);
|
|
15
|
+
const getNumberOfBlocksBeforeCell = (column, row) => {
|
|
16
|
+
const targetIndex = (row - 1) * numColumns + column - 1;
|
|
17
|
+
let count = 0;
|
|
18
|
+
for (const clientId of getBlockOrder(gridClientId)) {
|
|
19
|
+
var _getBlockAttributes$s;
|
|
20
|
+
const {
|
|
21
|
+
columnStart,
|
|
22
|
+
rowStart
|
|
23
|
+
} = (_getBlockAttributes$s = getBlockAttributes(clientId).style?.layout) !== null && _getBlockAttributes$s !== void 0 ? _getBlockAttributes$s : {};
|
|
24
|
+
const cellIndex = (rowStart - 1) * numColumns + columnStart - 1;
|
|
25
|
+
if (cellIndex < targetIndex) {
|
|
26
|
+
count++;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return count;
|
|
30
|
+
};
|
|
31
|
+
return getNumberOfBlocksBeforeCell;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=use-get-number-of-blocks-before-cell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useSelect","store","blockEditorStore","useGetNumberOfBlocksBeforeCell","gridClientId","numColumns","getBlockOrder","getBlockAttributes","getNumberOfBlocksBeforeCell","column","row","targetIndex","count","clientId","_getBlockAttributes$s","columnStart","rowStart","style","layout","cellIndex"],"sources":["@wordpress/block-editor/src/components/grid/use-get-number-of-blocks-before-cell.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useSelect } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\n\nexport function useGetNumberOfBlocksBeforeCell( gridClientId, numColumns ) {\n\tconst { getBlockOrder, getBlockAttributes } = useSelect( blockEditorStore );\n\n\tconst getNumberOfBlocksBeforeCell = ( column, row ) => {\n\t\tconst targetIndex = ( row - 1 ) * numColumns + column - 1;\n\n\t\tlet count = 0;\n\t\tfor ( const clientId of getBlockOrder( gridClientId ) ) {\n\t\t\tconst { columnStart, rowStart } =\n\t\t\t\tgetBlockAttributes( clientId ).style?.layout ?? {};\n\t\t\tconst cellIndex = ( rowStart - 1 ) * numColumns + columnStart - 1;\n\t\t\tif ( cellIndex < targetIndex ) {\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\t\treturn count;\n\t};\n\n\treturn getNumberOfBlocksBeforeCell;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,SAAS,QAAQ,iBAAiB;;AAE3C;AACA;AACA;AACA,SAASC,KAAK,IAAIC,gBAAgB,QAAQ,aAAa;AAEvD,OAAO,SAASC,8BAA8BA,CAAEC,YAAY,EAAEC,UAAU,EAAG;EAC1E,MAAM;IAAEC,aAAa;IAAEC;EAAmB,CAAC,GAAGP,SAAS,CAAEE,gBAAiB,CAAC;EAE3E,MAAMM,2BAA2B,GAAGA,CAAEC,MAAM,EAAEC,GAAG,KAAM;IACtD,MAAMC,WAAW,GAAG,CAAED,GAAG,GAAG,CAAC,IAAKL,UAAU,GAAGI,MAAM,GAAG,CAAC;IAEzD,IAAIG,KAAK,GAAG,CAAC;IACb,KAAM,MAAMC,QAAQ,IAAIP,aAAa,CAAEF,YAAa,CAAC,EAAG;MAAA,IAAAU,qBAAA;MACvD,MAAM;QAAEC,WAAW;QAAEC;MAAS,CAAC,IAAAF,qBAAA,GAC9BP,kBAAkB,CAAEM,QAAS,CAAC,CAACI,KAAK,EAAEC,MAAM,cAAAJ,qBAAA,cAAAA,qBAAA,GAAI,CAAC,CAAC;MACnD,MAAMK,SAAS,GAAG,CAAEH,QAAQ,GAAG,CAAC,IAAKX,UAAU,GAAGU,WAAW,GAAG,CAAC;MACjE,IAAKI,SAAS,GAAGR,WAAW,EAAG;QAC9BC,KAAK,EAAE;MACR;IACD;IACA,OAAOA,KAAK;EACb,CAAC;EAED,OAAOJ,2BAA2B;AACnC","ignoreList":[]}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WordPress dependencies
|
|
3
|
+
*/
|
|
4
|
+
import { useDispatch, useSelect } from '@wordpress/data';
|
|
5
|
+
import { useEffect } from '@wordpress/element';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Internal dependencies
|
|
9
|
+
*/
|
|
10
|
+
import { store as blockEditorStore } from '../../store';
|
|
11
|
+
import { GridRect } from './utils';
|
|
12
|
+
export function useGridLayoutSync({
|
|
13
|
+
clientId: gridClientId
|
|
14
|
+
}) {
|
|
15
|
+
const {
|
|
16
|
+
gridLayout,
|
|
17
|
+
blockOrder
|
|
18
|
+
} = useSelect(select => {
|
|
19
|
+
var _getBlockAttributes$l;
|
|
20
|
+
const {
|
|
21
|
+
getBlockAttributes,
|
|
22
|
+
getBlockOrder
|
|
23
|
+
} = select(blockEditorStore);
|
|
24
|
+
return {
|
|
25
|
+
gridLayout: (_getBlockAttributes$l = getBlockAttributes(gridClientId).layout) !== null && _getBlockAttributes$l !== void 0 ? _getBlockAttributes$l : {},
|
|
26
|
+
blockOrder: getBlockOrder(gridClientId)
|
|
27
|
+
};
|
|
28
|
+
}, [gridClientId]);
|
|
29
|
+
const {
|
|
30
|
+
getBlockAttributes
|
|
31
|
+
} = useSelect(blockEditorStore);
|
|
32
|
+
const {
|
|
33
|
+
updateBlockAttributes,
|
|
34
|
+
__unstableMarkNextChangeAsNotPersistent
|
|
35
|
+
} = useDispatch(blockEditorStore);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
const updates = {};
|
|
38
|
+
const {
|
|
39
|
+
columnCount,
|
|
40
|
+
rowCount = 2
|
|
41
|
+
} = gridLayout;
|
|
42
|
+
const isManualGrid = !!columnCount;
|
|
43
|
+
if (isManualGrid) {
|
|
44
|
+
const rects = [];
|
|
45
|
+
let cellsTaken = 0;
|
|
46
|
+
|
|
47
|
+
// Respect the position of blocks that already have a columnStart and rowStart value.
|
|
48
|
+
for (const clientId of blockOrder) {
|
|
49
|
+
const attributes = getBlockAttributes(clientId);
|
|
50
|
+
const {
|
|
51
|
+
columnStart,
|
|
52
|
+
rowStart,
|
|
53
|
+
columnSpan = 1,
|
|
54
|
+
rowSpan = 1
|
|
55
|
+
} = attributes.style?.layout || {};
|
|
56
|
+
cellsTaken += columnSpan * rowSpan;
|
|
57
|
+
if (!columnStart || !rowStart) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
rects.push(new GridRect({
|
|
61
|
+
columnStart,
|
|
62
|
+
rowStart,
|
|
63
|
+
columnSpan,
|
|
64
|
+
rowSpan
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Ensure there's enough rows to fit all blocks.
|
|
69
|
+
const minimumNeededRows = Math.ceil(cellsTaken / columnCount);
|
|
70
|
+
if (rowCount < minimumNeededRows) {
|
|
71
|
+
updates[gridClientId] = {
|
|
72
|
+
layout: {
|
|
73
|
+
...gridLayout,
|
|
74
|
+
rowCount: minimumNeededRows
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// When in manual mode, ensure that every block has a columnStart and rowStart value.
|
|
80
|
+
for (const clientId of blockOrder) {
|
|
81
|
+
const attributes = getBlockAttributes(clientId);
|
|
82
|
+
const {
|
|
83
|
+
columnStart,
|
|
84
|
+
rowStart,
|
|
85
|
+
columnSpan,
|
|
86
|
+
rowSpan
|
|
87
|
+
} = attributes.style?.layout || {};
|
|
88
|
+
if (columnStart && rowStart) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const [newColumnStart, newRowStart] = getFirstEmptyCell(rects, columnCount, minimumNeededRows, columnSpan, rowSpan);
|
|
92
|
+
rects.push(new GridRect({
|
|
93
|
+
columnStart: newColumnStart,
|
|
94
|
+
rowStart: newRowStart,
|
|
95
|
+
columnSpan,
|
|
96
|
+
rowSpan
|
|
97
|
+
}));
|
|
98
|
+
updates[clientId] = {
|
|
99
|
+
style: {
|
|
100
|
+
...attributes.style,
|
|
101
|
+
layout: {
|
|
102
|
+
...attributes.style?.layout,
|
|
103
|
+
columnStart: newColumnStart,
|
|
104
|
+
rowStart: newRowStart
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
} else {
|
|
110
|
+
// When in auto mode, remove all of the columnStart and rowStart values.
|
|
111
|
+
for (const clientId of blockOrder) {
|
|
112
|
+
const attributes = getBlockAttributes(clientId);
|
|
113
|
+
const {
|
|
114
|
+
columnStart,
|
|
115
|
+
rowStart,
|
|
116
|
+
...layout
|
|
117
|
+
} = attributes.style?.layout || {};
|
|
118
|
+
// Only update attributes if columnStart or rowStart are set.
|
|
119
|
+
if (columnStart || rowStart) {
|
|
120
|
+
updates[clientId] = {
|
|
121
|
+
style: {
|
|
122
|
+
...attributes.style,
|
|
123
|
+
layout
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (Object.keys(updates).length) {
|
|
130
|
+
__unstableMarkNextChangeAsNotPersistent();
|
|
131
|
+
updateBlockAttributes(Object.keys(updates), updates, /* uniqueByBlock: */true);
|
|
132
|
+
}
|
|
133
|
+
}, [
|
|
134
|
+
// Actual deps to sync:
|
|
135
|
+
gridClientId, gridLayout, blockOrder,
|
|
136
|
+
// Needed for linter:
|
|
137
|
+
__unstableMarkNextChangeAsNotPersistent, getBlockAttributes, updateBlockAttributes]);
|
|
138
|
+
}
|
|
139
|
+
function getFirstEmptyCell(rects, columnCount, rowCount, columnSpan = 1, rowSpan = 1) {
|
|
140
|
+
for (let row = 1; row <= rowCount; row++) {
|
|
141
|
+
for (let column = 1; column <= columnCount; column++) {
|
|
142
|
+
const rect = new GridRect({
|
|
143
|
+
columnStart: column,
|
|
144
|
+
rowStart: row,
|
|
145
|
+
columnSpan,
|
|
146
|
+
rowSpan
|
|
147
|
+
});
|
|
148
|
+
if (!rects.some(r => r.intersectsRect(rect))) {
|
|
149
|
+
return [column, row];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return [1, 1];
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=use-grid-layout-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useDispatch","useSelect","useEffect","store","blockEditorStore","GridRect","useGridLayoutSync","clientId","gridClientId","gridLayout","blockOrder","select","_getBlockAttributes$l","getBlockAttributes","getBlockOrder","layout","updateBlockAttributes","__unstableMarkNextChangeAsNotPersistent","updates","columnCount","rowCount","isManualGrid","rects","cellsTaken","attributes","columnStart","rowStart","columnSpan","rowSpan","style","push","minimumNeededRows","Math","ceil","newColumnStart","newRowStart","getFirstEmptyCell","Object","keys","length","row","column","rect","some","r","intersectsRect"],"sources":["@wordpress/block-editor/src/components/grid/use-grid-layout-sync.js"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { useEffect } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { store as blockEditorStore } from '../../store';\nimport { GridRect } from './utils';\n\nexport function useGridLayoutSync( { clientId: gridClientId } ) {\n\tconst { gridLayout, blockOrder } = useSelect(\n\t\t( select ) => {\n\t\t\tconst { getBlockAttributes, getBlockOrder } =\n\t\t\t\tselect( blockEditorStore );\n\t\t\treturn {\n\t\t\t\tgridLayout: getBlockAttributes( gridClientId ).layout ?? {},\n\t\t\t\tblockOrder: getBlockOrder( gridClientId ),\n\t\t\t};\n\t\t},\n\t\t[ gridClientId ]\n\t);\n\n\tconst { getBlockAttributes } = useSelect( blockEditorStore );\n\tconst { updateBlockAttributes, __unstableMarkNextChangeAsNotPersistent } =\n\t\tuseDispatch( blockEditorStore );\n\n\tuseEffect( () => {\n\t\tconst updates = {};\n\n\t\tconst { columnCount, rowCount = 2 } = gridLayout;\n\t\tconst isManualGrid = !! columnCount;\n\n\t\tif ( isManualGrid ) {\n\t\t\tconst rects = [];\n\t\t\tlet cellsTaken = 0;\n\n\t\t\t// Respect the position of blocks that already have a columnStart and rowStart value.\n\t\t\tfor ( const clientId of blockOrder ) {\n\t\t\t\tconst attributes = getBlockAttributes( clientId );\n\t\t\t\tconst {\n\t\t\t\t\tcolumnStart,\n\t\t\t\t\trowStart,\n\t\t\t\t\tcolumnSpan = 1,\n\t\t\t\t\trowSpan = 1,\n\t\t\t\t} = attributes.style?.layout || {};\n\t\t\t\tcellsTaken += columnSpan * rowSpan;\n\t\t\t\tif ( ! columnStart || ! rowStart ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\trects.push(\n\t\t\t\t\tnew GridRect( {\n\t\t\t\t\t\tcolumnStart,\n\t\t\t\t\t\trowStart,\n\t\t\t\t\t\tcolumnSpan,\n\t\t\t\t\t\trowSpan,\n\t\t\t\t\t} )\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Ensure there's enough rows to fit all blocks.\n\t\t\tconst minimumNeededRows = Math.ceil( cellsTaken / columnCount );\n\t\t\tif ( rowCount < minimumNeededRows ) {\n\t\t\t\tupdates[ gridClientId ] = {\n\t\t\t\t\tlayout: {\n\t\t\t\t\t\t...gridLayout,\n\t\t\t\t\t\trowCount: minimumNeededRows,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// When in manual mode, ensure that every block has a columnStart and rowStart value.\n\t\t\tfor ( const clientId of blockOrder ) {\n\t\t\t\tconst attributes = getBlockAttributes( clientId );\n\t\t\t\tconst { columnStart, rowStart, columnSpan, rowSpan } =\n\t\t\t\t\tattributes.style?.layout || {};\n\t\t\t\tif ( columnStart && rowStart ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst [ newColumnStart, newRowStart ] = getFirstEmptyCell(\n\t\t\t\t\trects,\n\t\t\t\t\tcolumnCount,\n\t\t\t\t\tminimumNeededRows,\n\t\t\t\t\tcolumnSpan,\n\t\t\t\t\trowSpan\n\t\t\t\t);\n\t\t\t\trects.push(\n\t\t\t\t\tnew GridRect( {\n\t\t\t\t\t\tcolumnStart: newColumnStart,\n\t\t\t\t\t\trowStart: newRowStart,\n\t\t\t\t\t\tcolumnSpan,\n\t\t\t\t\t\trowSpan,\n\t\t\t\t\t} )\n\t\t\t\t);\n\t\t\t\tupdates[ clientId ] = {\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\t...attributes.style,\n\t\t\t\t\t\tlayout: {\n\t\t\t\t\t\t\t...attributes.style?.layout,\n\t\t\t\t\t\t\tcolumnStart: newColumnStart,\n\t\t\t\t\t\t\trowStart: newRowStart,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t} else {\n\t\t\t// When in auto mode, remove all of the columnStart and rowStart values.\n\t\t\tfor ( const clientId of blockOrder ) {\n\t\t\t\tconst attributes = getBlockAttributes( clientId );\n\t\t\t\tconst { columnStart, rowStart, ...layout } =\n\t\t\t\t\tattributes.style?.layout || {};\n\t\t\t\t// Only update attributes if columnStart or rowStart are set.\n\t\t\t\tif ( columnStart || rowStart ) {\n\t\t\t\t\tupdates[ clientId ] = {\n\t\t\t\t\t\tstyle: {\n\t\t\t\t\t\t\t...attributes.style,\n\t\t\t\t\t\t\tlayout,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( Object.keys( updates ).length ) {\n\t\t\t__unstableMarkNextChangeAsNotPersistent();\n\t\t\tupdateBlockAttributes(\n\t\t\t\tObject.keys( updates ),\n\t\t\t\tupdates,\n\t\t\t\t/* uniqueByBlock: */ true\n\t\t\t);\n\t\t}\n\t}, [\n\t\t// Actual deps to sync:\n\t\tgridClientId,\n\t\tgridLayout,\n\t\tblockOrder,\n\t\t// Needed for linter:\n\t\t__unstableMarkNextChangeAsNotPersistent,\n\t\tgetBlockAttributes,\n\t\tupdateBlockAttributes,\n\t] );\n}\n\nfunction getFirstEmptyCell(\n\trects,\n\tcolumnCount,\n\trowCount,\n\tcolumnSpan = 1,\n\trowSpan = 1\n) {\n\tfor ( let row = 1; row <= rowCount; row++ ) {\n\t\tfor ( let column = 1; column <= columnCount; column++ ) {\n\t\t\tconst rect = new GridRect( {\n\t\t\t\tcolumnStart: column,\n\t\t\t\trowStart: row,\n\t\t\t\tcolumnSpan,\n\t\t\t\trowSpan,\n\t\t\t} );\n\t\t\tif ( ! rects.some( ( r ) => r.intersectsRect( rect ) ) ) {\n\t\t\t\treturn [ column, row ];\n\t\t\t}\n\t\t}\n\t}\n\treturn [ 1, 1 ];\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
export function range(start, length) {
|
|
2
|
+
return Array.from({
|
|
3
|
+
length
|
|
4
|
+
}, (_, i) => start + i);
|
|
5
|
+
}
|
|
6
|
+
export class GridRect {
|
|
7
|
+
constructor({
|
|
8
|
+
columnStart,
|
|
9
|
+
rowStart,
|
|
10
|
+
columnEnd,
|
|
11
|
+
rowEnd,
|
|
12
|
+
columnSpan,
|
|
13
|
+
rowSpan
|
|
14
|
+
} = {}) {
|
|
15
|
+
this.columnStart = columnStart !== null && columnStart !== void 0 ? columnStart : 1;
|
|
16
|
+
this.rowStart = rowStart !== null && rowStart !== void 0 ? rowStart : 1;
|
|
17
|
+
if (columnSpan !== undefined) {
|
|
18
|
+
this.columnEnd = this.columnStart + columnSpan - 1;
|
|
19
|
+
} else {
|
|
20
|
+
this.columnEnd = columnEnd !== null && columnEnd !== void 0 ? columnEnd : this.columnStart;
|
|
21
|
+
}
|
|
22
|
+
if (rowSpan !== undefined) {
|
|
23
|
+
this.rowEnd = this.rowStart + rowSpan - 1;
|
|
24
|
+
} else {
|
|
25
|
+
this.rowEnd = rowEnd !== null && rowEnd !== void 0 ? rowEnd : this.rowStart;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
get columnSpan() {
|
|
29
|
+
return this.columnEnd - this.columnStart + 1;
|
|
30
|
+
}
|
|
31
|
+
get rowSpan() {
|
|
32
|
+
return this.rowEnd - this.rowStart + 1;
|
|
33
|
+
}
|
|
34
|
+
contains(column, row) {
|
|
35
|
+
return column >= this.columnStart && column <= this.columnEnd && row >= this.rowStart && row <= this.rowEnd;
|
|
36
|
+
}
|
|
37
|
+
containsRect(rect) {
|
|
38
|
+
return this.contains(rect.columnStart, rect.rowStart) && this.contains(rect.columnEnd, rect.rowEnd);
|
|
39
|
+
}
|
|
40
|
+
intersectsRect(rect) {
|
|
41
|
+
return this.columnStart <= rect.columnEnd && this.columnEnd >= rect.columnStart && this.rowStart <= rect.rowEnd && this.rowEnd >= rect.rowStart;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function getComputedCSS(element, property) {
|
|
45
|
+
return element.ownerDocument.defaultView.getComputedStyle(element).getPropertyValue(property);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Given a grid-template-columns or grid-template-rows CSS property value, gets the start and end
|
|
50
|
+
* position in pixels of each grid track.
|
|
51
|
+
*
|
|
52
|
+
* https://css-tricks.com/snippets/css/complete-guide-grid/#aa-grid-track
|
|
53
|
+
*
|
|
54
|
+
* @param {string} template The grid-template-columns or grid-template-rows CSS property value.
|
|
55
|
+
* Only supports fixed sizes in pixels.
|
|
56
|
+
* @param {number} gap The gap between grid tracks in pixels.
|
|
57
|
+
*
|
|
58
|
+
* @return {Array<{start: number, end: number}>} An array of objects with the start and end
|
|
59
|
+
* position in pixels of each grid track.
|
|
60
|
+
*/
|
|
61
|
+
export function getGridTracks(template, gap) {
|
|
62
|
+
const tracks = [];
|
|
63
|
+
for (const size of template.split(' ')) {
|
|
64
|
+
const previousTrack = tracks[tracks.length - 1];
|
|
65
|
+
const start = previousTrack ? previousTrack.end + gap : 0;
|
|
66
|
+
const end = start + parseFloat(size);
|
|
67
|
+
tracks.push({
|
|
68
|
+
start,
|
|
69
|
+
end
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return tracks;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Given an array of grid tracks and a position in pixels, gets the index of the closest track to
|
|
77
|
+
* that position.
|
|
78
|
+
*
|
|
79
|
+
* https://css-tricks.com/snippets/css/complete-guide-grid/#aa-grid-track
|
|
80
|
+
*
|
|
81
|
+
* @param {Array<{start: number, end: number}>} tracks An array of objects with the start and end
|
|
82
|
+
* position in pixels of each grid track.
|
|
83
|
+
* @param {number} position The position in pixels.
|
|
84
|
+
* @param {string} edge The edge of the track to compare the
|
|
85
|
+
* position to. Either 'start' or 'end'.
|
|
86
|
+
*
|
|
87
|
+
* @return {number} The index of the closest track to the position. 0-based, unlike CSS grid which
|
|
88
|
+
* is 1-based.
|
|
89
|
+
*/
|
|
90
|
+
export function getClosestTrack(tracks, position, edge = 'start') {
|
|
91
|
+
return tracks.reduce((closest, track, index) => Math.abs(track[edge] - position) < Math.abs(tracks[closest][edge] - position) ? index : closest, 0);
|
|
92
|
+
}
|
|
93
|
+
export function getGridRect(gridElement, rect) {
|
|
94
|
+
const columnGap = parseFloat(getComputedCSS(gridElement, 'column-gap'));
|
|
95
|
+
const rowGap = parseFloat(getComputedCSS(gridElement, 'row-gap'));
|
|
96
|
+
const gridColumnTracks = getGridTracks(getComputedCSS(gridElement, 'grid-template-columns'), columnGap);
|
|
97
|
+
const gridRowTracks = getGridTracks(getComputedCSS(gridElement, 'grid-template-rows'), rowGap);
|
|
98
|
+
const columnStart = getClosestTrack(gridColumnTracks, rect.left) + 1;
|
|
99
|
+
const rowStart = getClosestTrack(gridRowTracks, rect.top) + 1;
|
|
100
|
+
const columnEnd = getClosestTrack(gridColumnTracks, rect.right, 'end') + 1;
|
|
101
|
+
const rowEnd = getClosestTrack(gridRowTracks, rect.bottom, 'end') + 1;
|
|
102
|
+
return new GridRect({
|
|
103
|
+
columnStart,
|
|
104
|
+
columnEnd,
|
|
105
|
+
rowStart,
|
|
106
|
+
rowEnd
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
export function getGridItemRect(gridItemElement) {
|
|
110
|
+
return getGridRect(gridItemElement.parentElement, new window.DOMRect(gridItemElement.offsetLeft, gridItemElement.offsetTop, gridItemElement.offsetWidth, gridItemElement.offsetHeight));
|
|
111
|
+
}
|
|
112
|
+
export function getGridInfo(gridElement) {
|
|
113
|
+
const gridTemplateColumns = getComputedCSS(gridElement, 'grid-template-columns');
|
|
114
|
+
const gridTemplateRows = getComputedCSS(gridElement, 'grid-template-rows');
|
|
115
|
+
const numColumns = gridTemplateColumns.split(' ').length;
|
|
116
|
+
const numRows = gridTemplateRows.split(' ').length;
|
|
117
|
+
const numItems = numColumns * numRows;
|
|
118
|
+
return {
|
|
119
|
+
numColumns,
|
|
120
|
+
numRows,
|
|
121
|
+
numItems,
|
|
122
|
+
currentColor: getComputedCSS(gridElement, 'color'),
|
|
123
|
+
style: {
|
|
124
|
+
gridTemplateColumns,
|
|
125
|
+
gridTemplateRows,
|
|
126
|
+
gap: getComputedCSS(gridElement, 'gap'),
|
|
127
|
+
padding: getComputedCSS(gridElement, 'padding')
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=utils.js.map
|