@wordpress/grid 0.1.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 +33 -0
- package/LICENSE.md +788 -0
- package/README.md +534 -0
- package/build/dashboard-grid/grid-item.cjs +308 -0
- package/build/dashboard-grid/grid-item.cjs.map +7 -0
- package/build/dashboard-grid/index.cjs +591 -0
- package/build/dashboard-grid/index.cjs.map +7 -0
- package/build/dashboard-grid/resolve-fill-widths.cjs +189 -0
- package/build/dashboard-grid/resolve-fill-widths.cjs.map +7 -0
- package/build/dashboard-grid/types.cjs +19 -0
- package/build/dashboard-grid/types.cjs.map +7 -0
- package/build/dashboard-lanes/index.cjs +558 -0
- package/build/dashboard-lanes/index.cjs.map +7 -0
- package/build/dashboard-lanes/lane-placement.cjs +110 -0
- package/build/dashboard-lanes/lane-placement.cjs.map +7 -0
- package/build/dashboard-lanes/lanes-item.cjs +295 -0
- package/build/dashboard-lanes/lanes-item.cjs.map +7 -0
- package/build/dashboard-lanes/types.cjs +19 -0
- package/build/dashboard-lanes/types.cjs.map +7 -0
- package/build/dashboard-lanes/use-lane-placement.cjs +206 -0
- package/build/dashboard-lanes/use-lane-placement.cjs.map +7 -0
- package/build/index.cjs +34 -0
- package/build/index.cjs.map +7 -0
- package/build/shared/drag-overlay-drop-animation.cjs +70 -0
- package/build/shared/drag-overlay-drop-animation.cjs.map +7 -0
- package/build/shared/grid-item-key.cjs +31 -0
- package/build/shared/grid-item-key.cjs.map +7 -0
- package/build/shared/grid-overlay.cjs +187 -0
- package/build/shared/grid-overlay.cjs.map +7 -0
- package/build/shared/item-exit-overlay.cjs +150 -0
- package/build/shared/item-exit-overlay.cjs.map +7 -0
- package/build/shared/resize-handle.cjs +224 -0
- package/build/shared/resize-handle.cjs.map +7 -0
- package/build/shared/resize-snap.cjs +47 -0
- package/build/shared/resize-snap.cjs.map +7 -0
- package/build/shared/types.cjs +19 -0
- package/build/shared/types.cjs.map +7 -0
- package/build/shared/use-item-exit-animation.cjs +148 -0
- package/build/shared/use-item-exit-animation.cjs.map +7 -0
- package/build/shared/use-layout-shift-animation.cjs +167 -0
- package/build/shared/use-layout-shift-animation.cjs.map +7 -0
- package/build-module/dashboard-grid/grid-item.mjs +273 -0
- package/build-module/dashboard-grid/grid-item.mjs.map +7 -0
- package/build-module/dashboard-grid/index.mjs +579 -0
- package/build-module/dashboard-grid/index.mjs.map +7 -0
- package/build-module/dashboard-grid/resolve-fill-widths.mjs +164 -0
- package/build-module/dashboard-grid/resolve-fill-widths.mjs.map +7 -0
- package/build-module/dashboard-grid/types.mjs +1 -0
- package/build-module/dashboard-grid/types.mjs.map +7 -0
- package/build-module/dashboard-lanes/index.mjs +547 -0
- package/build-module/dashboard-lanes/index.mjs.map +7 -0
- package/build-module/dashboard-lanes/lane-placement.mjs +85 -0
- package/build-module/dashboard-lanes/lane-placement.mjs.map +7 -0
- package/build-module/dashboard-lanes/lanes-item.mjs +260 -0
- package/build-module/dashboard-lanes/lanes-item.mjs.map +7 -0
- package/build-module/dashboard-lanes/types.mjs +1 -0
- package/build-module/dashboard-lanes/types.mjs.map +7 -0
- package/build-module/dashboard-lanes/use-lane-placement.mjs +181 -0
- package/build-module/dashboard-lanes/use-lane-placement.mjs.map +7 -0
- package/build-module/index.mjs +8 -0
- package/build-module/index.mjs.map +7 -0
- package/build-module/shared/drag-overlay-drop-animation.mjs +47 -0
- package/build-module/shared/drag-overlay-drop-animation.mjs.map +7 -0
- package/build-module/shared/grid-item-key.mjs +6 -0
- package/build-module/shared/grid-item-key.mjs.map +7 -0
- package/build-module/shared/grid-overlay.mjs +152 -0
- package/build-module/shared/grid-overlay.mjs.map +7 -0
- package/build-module/shared/item-exit-overlay.mjs +125 -0
- package/build-module/shared/item-exit-overlay.mjs.map +7 -0
- package/build-module/shared/resize-handle.mjs +193 -0
- package/build-module/shared/resize-handle.mjs.map +7 -0
- package/build-module/shared/resize-snap.mjs +21 -0
- package/build-module/shared/resize-snap.mjs.map +7 -0
- package/build-module/shared/types.mjs +1 -0
- package/build-module/shared/types.mjs.map +7 -0
- package/build-module/shared/use-item-exit-animation.mjs +128 -0
- package/build-module/shared/use-item-exit-animation.mjs.map +7 -0
- package/build-module/shared/use-layout-shift-animation.mjs +140 -0
- package/build-module/shared/use-layout-shift-animation.mjs.map +7 -0
- package/build-types/dashboard-grid/grid-item.d.ts +3 -0
- package/build-types/dashboard-grid/grid-item.d.ts.map +1 -0
- package/build-types/dashboard-grid/index.d.ts +35 -0
- package/build-types/dashboard-grid/index.d.ts.map +1 -0
- package/build-types/dashboard-grid/resolve-fill-widths.d.ts +26 -0
- package/build-types/dashboard-grid/resolve-fill-widths.d.ts.map +1 -0
- package/build-types/dashboard-grid/stories/index.story.d.ts +98 -0
- package/build-types/dashboard-grid/stories/index.story.d.ts.map +1 -0
- package/build-types/dashboard-grid/types.d.ts +232 -0
- package/build-types/dashboard-grid/types.d.ts.map +1 -0
- package/build-types/dashboard-lanes/index.d.ts +40 -0
- package/build-types/dashboard-lanes/index.d.ts.map +1 -0
- package/build-types/dashboard-lanes/lane-placement.d.ts +126 -0
- package/build-types/dashboard-lanes/lane-placement.d.ts.map +1 -0
- package/build-types/dashboard-lanes/lanes-item.d.ts +52 -0
- package/build-types/dashboard-lanes/lanes-item.d.ts.map +1 -0
- package/build-types/dashboard-lanes/stories/index.story.d.ts +64 -0
- package/build-types/dashboard-lanes/stories/index.story.d.ts.map +1 -0
- package/build-types/dashboard-lanes/types.d.ts +151 -0
- package/build-types/dashboard-lanes/types.d.ts.map +1 -0
- package/build-types/dashboard-lanes/use-lane-placement.d.ts +74 -0
- package/build-types/dashboard-lanes/use-lane-placement.d.ts.map +1 -0
- package/build-types/index.d.ts +6 -0
- package/build-types/index.d.ts.map +1 -0
- package/build-types/shared/drag-overlay-drop-animation.d.ts +13 -0
- package/build-types/shared/drag-overlay-drop-animation.d.ts.map +1 -0
- package/build-types/shared/grid-item-key.d.ts +6 -0
- package/build-types/shared/grid-item-key.d.ts.map +1 -0
- package/build-types/shared/grid-overlay.d.ts +19 -0
- package/build-types/shared/grid-overlay.d.ts.map +1 -0
- package/build-types/shared/item-exit-overlay.d.ts +20 -0
- package/build-types/shared/item-exit-overlay.d.ts.map +1 -0
- package/build-types/shared/resize-handle.d.ts +23 -0
- package/build-types/shared/resize-handle.d.ts.map +1 -0
- package/build-types/shared/resize-snap.d.ts +41 -0
- package/build-types/shared/resize-snap.d.ts.map +1 -0
- package/build-types/shared/types.d.ts +144 -0
- package/build-types/shared/types.d.ts.map +1 -0
- package/build-types/shared/use-item-exit-animation.d.ts +37 -0
- package/build-types/shared/use-item-exit-animation.d.ts.map +1 -0
- package/build-types/shared/use-layout-shift-animation.d.ts +77 -0
- package/build-types/shared/use-layout-shift-animation.d.ts.map +1 -0
- package/package.json +80 -0
- package/src/dashboard-grid/grid-item.module.css +94 -0
- package/src/dashboard-grid/grid-item.tsx +205 -0
- package/src/dashboard-grid/grid.module.css +134 -0
- package/src/dashboard-grid/index.tsx +713 -0
- package/src/dashboard-grid/resolve-fill-widths.ts +224 -0
- package/src/dashboard-grid/stories/index.story.tsx +930 -0
- package/src/dashboard-grid/test/keyboard-activation.test.tsx +76 -0
- package/src/dashboard-grid/test/resolve-fill-widths.test.ts +250 -0
- package/src/dashboard-grid/types.ts +271 -0
- package/src/dashboard-lanes/index.tsx +629 -0
- package/src/dashboard-lanes/lane-placement.ts +245 -0
- package/src/dashboard-lanes/lanes-item.module.css +93 -0
- package/src/dashboard-lanes/lanes-item.tsx +236 -0
- package/src/dashboard-lanes/lanes.module.css +152 -0
- package/src/dashboard-lanes/stories/index.story.tsx +518 -0
- package/src/dashboard-lanes/test/keyboard-activation.test.tsx +71 -0
- package/src/dashboard-lanes/test/lane-placement.test.ts +442 -0
- package/src/dashboard-lanes/test/use-lane-placement.test.tsx +358 -0
- package/src/dashboard-lanes/types.ts +176 -0
- package/src/dashboard-lanes/use-lane-placement.ts +313 -0
- package/src/index.ts +17 -0
- package/src/shared/actionable-area-slot.module.css +16 -0
- package/src/shared/drag-overlay-drop-animation.ts +66 -0
- package/src/shared/grid-item-key.ts +5 -0
- package/src/shared/grid-overlay.module.css +82 -0
- package/src/shared/grid-overlay.tsx +93 -0
- package/src/shared/item-exit-animation.module.css +49 -0
- package/src/shared/item-exit-overlay.tsx +57 -0
- package/src/shared/layout-shift-animation.module.css +16 -0
- package/src/shared/resize-handle.module.css +88 -0
- package/src/shared/resize-handle.tsx +163 -0
- package/src/shared/resize-snap.ts +63 -0
- package/src/shared/test/resize-snap.test.ts +35 -0
- package/src/shared/types.ts +164 -0
- package/src/shared/use-item-exit-animation.ts +199 -0
- package/src/shared/use-layout-shift-animation.ts +284 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/dashboard-grid/index.tsx", "../../../style-runtime/src/index.ts", "../../src/shared/layout-shift-animation.module.css", "../../src/dashboard-grid/grid.module.css"],
|
|
4
|
+
"sourcesContent": ["/**\n * External dependencies\n */\nimport {\n\tDndContext,\n\tDragOverlay,\n\tKeyboardSensor,\n\tPointerSensor,\n\tuseSensor,\n\tuseSensors,\n} from '@dnd-kit/core';\nimport {\n\tarrayMove,\n\tSortableContext,\n\tsortableKeyboardCoordinates,\n} from '@dnd-kit/sortable';\nimport type { DragMoveEvent, DragStartEvent } from '@dnd-kit/core';\nimport clsx from 'clsx';\n\n/**\n * WordPress dependencies\n */\nimport { useResizeObserver, useEvent, useMergeRefs } from '@wordpress/compose';\nimport {\n\tforwardRef,\n\tuseMemo,\n\tChildren,\n\tcloneElement,\n\tisValidElement,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState,\n} from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport { GridItem } from './grid-item';\nimport { GridOverlay } from '../shared/grid-overlay';\nimport { gridSpanToPixelSize } from '../shared/resize-snap';\nimport layoutAnimationStyles from '../shared/layout-shift-animation.module.css';\nimport { ItemExitOverlay } from '../shared/item-exit-overlay';\nimport {\n\tgetLayoutFingerprint,\n\tuseLayoutShiftAnimation,\n} from '../shared/use-layout-shift-animation';\nimport { useItemExitAnimation } from '../shared/use-item-exit-animation';\nimport { resolveFillWidths } from './resolve-fill-widths';\nimport type { DashboardGridLayoutItem, DashboardGridProps } from './types';\nimport type { ResizeSnapSize } from '../shared/resize-snap';\nimport type { ResizeDelta } from '../shared/types';\nimport { createDashboardDragDropAnimation } from '../shared/drag-overlay-drop-animation';\nimport styles from './grid.module.css';\n\nconst dashboardDragDropAnimation = createDashboardDragDropAnimation(\n\tstyles[ 'drag-preview-frame' ],\n\tstyles.dragPreviewFrameExiting\n);\n\n// Fallback gap in pixels for math that runs before the computed gap\n// can be read from the DOM. Matches the `'xl'` step the surface\n// resolves to in CSS (`--wpds-dimension-gap-xl`); the next layout\n// effect overwrites this with the actual computed value.\nconst FALLBACK_GAP_PX = 24;\n\n// Default column cap when no explicit `columns` or `minColumnWidth` is\n// supplied. Layered semantics: `columns` acts as a cap and\n// `minColumnWidth` as a per-tile floor; if neither is set we still\n// need a finite count to render against.\nconst DEFAULT_COLUMNS = 6;\n\n// Reorder is driven by `temporaryLayout` + CSS Grid, not by dnd-kit\n// transforms. Hoist the no-op strategy outside the component so its\n// reference is stable across renders — passing a fresh `() => null`\n// to `<SortableContext>` updates its context value and triggers all\n// `useSortable` subscribers to re-render every frame.\nconst NO_SORT_STRATEGY = () => null;\n\n/**\n * 2D packed dashboard grid with drag-to-reorder and resize handles.\n * Supports fixed-column and responsive modes, `number | 'fill' | 'full'`\n * widths, and multi-row tiles.\n *\n * Each child's `key` must match an entry in the `layout` array;\n * children without a match render at the end of the grid without\n * explicit placement and fall through CSS Grid's auto-flow.\n *\n * @example\n * ```jsx\n * const layout = [\n * { key: 'a', width: 2 },\n * { key: 'b', width: 'fill' },\n * { key: 'c', width: 'full' },\n * ];\n *\n * <DashboardGrid\n * layout={ layout }\n * columns={ 6 }\n * editMode\n * onChangeLayout={ setLayout }\n * >\n * <div key=\"a\">A</div>\n * <div key=\"b\">B</div>\n * <div key=\"c\">C</div>\n * </DashboardGrid>\n * ```\n *\n * @param props Component props.\n * @param ref Forwarded to the grid's root `<div>`.\n */\nexport const DashboardGrid = forwardRef< HTMLDivElement, DashboardGridProps >(\n\tfunction DashboardGrid( props, ref ) {\n\t\tconst {\n\t\t\tlayout,\n\t\t\tcolumns,\n\t\t\tchildren,\n\t\t\tclassName,\n\t\t\tstyle,\n\t\t\trowHeight = 'auto',\n\t\t\tminColumnWidth,\n\t\t\teditMode = false,\n\t\t\tonChangeLayout,\n\t\t\tonPreviewLayout,\n\t\t\trenderResizeHandle,\n\t\t\trenderDragPreview,\n\t\t\trenderGridOverlay,\n\t\t\t...divProps\n\t\t} = props;\n\t\t// Preview layout applied during drag/resize before committing.\n\t\tconst [ temporaryLayout, setTemporaryLayout ] = useState<\n\t\t\tDashboardGridLayoutItem[] | undefined\n\t\t>();\n\t\t// Drives `<DragOverlay>` content while a drag is in progress.\n\t\tconst [ activeId, setActiveId ] = useState< string | null >( null );\n\t\t// True while any tile is being resized. Combined with `activeId`,\n\t\t// it drives the grid-wide `inert` flag on actionable areas so\n\t\t// hovering over another tile's buttons can't steal the gesture.\n\t\tconst [ isResizing, setIsResizing ] = useState( false );\n\t\t// Snapped span in pixels for the resize-preview outline on the\n\t\t// active tile. The tile content follows the cursor continuously;\n\t\t// this preview shows the grid size that will commit on release.\n\t\tconst [ resizeSnapPreview, setResizeSnapPreview ] = useState< {\n\t\t\tid: string;\n\t\t\tsnap: ResizeSnapSize;\n\t\t} | null >( null );\n\t\t// Mirror of `temporaryLayout` read synchronously on drag end —\n\t\t// the state update from `handleDragMove` may still be batched.\n\t\tconst latestLayoutRef = useRef<\n\t\t\tDashboardGridLayoutItem[] | undefined\n\t\t>();\n\t\t// Cursor center at the last applied reorder. Used to skip the\n\t\t// cascade of re-measured `onDragMove` events after a layout\n\t\t// change, when the cursor has not actually moved.\n\t\tconst lastReorderCursorRef = useRef< {\n\t\t\tx: number;\n\t\t\ty: number;\n\t\t} | null >( null );\n\t\t// Width/height snapshot at the start of a resize session. The\n\t\t// resize handle reports `delta` absolute from the gesture start,\n\t\t// so the baseline must stay frozen — reading from the already\n\t\t// mutated `activeLayout` would compound the delta each frame.\n\t\tconst resizeBaselineRef = useRef< {\n\t\t\twidth: number;\n\t\t\theight: number;\n\t\t} | null >( null );\n\t\tconst captureLayoutSnapshotRef = useRef< () => void >( () => {} );\n\t\tconst childrenCacheRef = useRef< Map< string, React.ReactElement > >(\n\t\t\tnew Map()\n\t\t);\n\t\tconst activeLayout = temporaryLayout ?? layout;\n\n\t\tconst [ gridRoot, setGridRoot ] = useState< HTMLDivElement | null >(\n\t\t\tnull\n\t\t);\n\t\tconst [ containerWidth, setContainerWidth ] = useState( 0 );\n\t\tconst [ containerHeight, setContainerHeight ] = useState( 0 );\n\t\tconst [ gapPx, setGapPx ] = useState( FALLBACK_GAP_PX );\n\t\tconst resizeObserverRef = useResizeObserver(\n\t\t\t( [ { contentRect } ] ) => {\n\t\t\t\tsetContainerWidth( contentRect.width );\n\t\t\t\tsetContainerHeight( contentRect.height );\n\t\t\t}\n\t\t);\n\t\tconst mergedGridRef = useMergeRefs( [\n\t\t\tsetGridRoot,\n\t\t\tresizeObserverRef,\n\t\t\tref,\n\t\t] );\n\n\t\t// Measure before paint to avoid a single-column flash in\n\t\t// responsive mode; `useResizeObserver` delivers async. The\n\t\t// computed `column-gap` is read from the resolved CSS so the\n\t\t// math tracks the design-system token under any density.\n\t\tuseLayoutEffect( () => {\n\t\t\tif ( ! gridRoot ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst { width, height } = gridRoot.getBoundingClientRect();\n\t\t\tif ( width > 0 ) {\n\t\t\t\tsetContainerWidth( width );\n\t\t\t}\n\t\t\tif ( height > 0 ) {\n\t\t\t\tsetContainerHeight( height );\n\t\t\t}\n\t\t\tconst parsed = Number.parseFloat(\n\t\t\t\twindow.getComputedStyle( gridRoot ).columnGap\n\t\t\t);\n\t\t\tif ( Number.isFinite( parsed ) && parsed > 0 ) {\n\t\t\t\tsetGapPx( parsed );\n\t\t\t}\n\t\t}, [ gridRoot ] );\n\t\tconst effectiveColumns = useMemo( () => {\n\t\t\tif ( ! minColumnWidth ) {\n\t\t\t\treturn columns ?? DEFAULT_COLUMNS;\n\t\t\t}\n\n\t\t\tconst totalWidthPerColumn = minColumnWidth + gapPx;\n\t\t\tconst maxFit = Math.max(\n\t\t\t\t1,\n\t\t\t\tMath.floor( ( containerWidth + gapPx ) / totalWidthPerColumn )\n\t\t\t);\n\t\t\treturn columns !== undefined ? Math.min( columns, maxFit ) : maxFit;\n\t\t}, [ minColumnWidth, gapPx, containerWidth, columns ] );\n\t\tconst columnWidth =\n\t\t\t( containerWidth - ( effectiveColumns - 1 ) * gapPx ) /\n\t\t\teffectiveColumns;\n\t\tconst minResizeWidthPx = gridSpanToPixelSize(\n\t\t\t1,\n\t\t\t1,\n\t\t\tcolumnWidth,\n\t\t\tgapPx,\n\t\t\tnull\n\t\t).widthPx;\n\t\tconst rowHeightPx = typeof rowHeight === 'number' ? rowHeight : null;\n\t\tconst minResizeHeightPx =\n\t\t\trowHeightPx === null\n\t\t\t\t? undefined\n\t\t\t\t: gridSpanToPixelSize( 1, 1, columnWidth, gapPx, rowHeightPx )\n\t\t\t\t\t\t.heightPx ?? undefined;\n\n\t\tconst layoutMap = useMemo( () => {\n\t\t\tconst map = new Map< string, DashboardGridLayoutItem >();\n\t\t\tactiveLayout.forEach( ( item ) => map.set( item.key, item ) );\n\t\t\treturn map;\n\t\t}, [ activeLayout ] );\n\n\t\t// Stable-identity key set, preserved across renders whenever the\n\t\t// *contents* of the key set are unchanged — even if the consumer\n\t\t// passes a fresh `layout` array reference (common when `layout`\n\t\t// is derived inline from state). Without this, downstream memos\n\t\t// would invalidate on every parent re-render and the children\n\t\t// walk skip during gestures wouldn't hold.\n\t\tconst layoutKeys = useMemo(\n\t\t\t() => new Set( layout.map( ( item ) => item.key ) ),\n\t\t\t[ layout ]\n\t\t);\n\n\t\t// Sorted item keys, identity-stable when the resulting sequence is\n\t\t// unchanged. Avoids producing a fresh `items` array on every parent\n\t\t// re-render so `<SortableContext>` doesn't update its context value\n\t\t// and notify every `useSortable` subscriber unnecessarily.\n\t\tconst sortedItems = useMemo(\n\t\t\t() =>\n\t\t\t\tactiveLayout\n\t\t\t\t\t.map( ( item, index ) => ( { item, index } ) )\n\t\t\t\t\t.sort(\n\t\t\t\t\t\t( a, b ) =>\n\t\t\t\t\t\t\t( a.item.order ?? a.index ) -\n\t\t\t\t\t\t\t( b.item.order ?? b.index )\n\t\t\t\t\t)\n\t\t\t\t\t.map( ( { item } ) => item.key ),\n\t\t\t[ activeLayout ]\n\t\t);\n\t\tconst items = sortedItems;\n\n\t\t// Resolve `width: 'fill'` items to concrete column spans.\n\t\tconst resolvedItemMap = useMemo( () => {\n\t\t\tconst fillWidths = resolveFillWidths(\n\t\t\t\titems,\n\t\t\t\tlayoutMap,\n\t\t\t\teffectiveColumns\n\t\t\t);\n\t\t\tif ( fillWidths.size === 0 ) {\n\t\t\t\treturn layoutMap;\n\t\t\t}\n\t\t\tconst map = new Map< string, DashboardGridLayoutItem >();\n\t\t\tfor ( const [ key, item ] of layoutMap ) {\n\t\t\t\tconst fillW = fillWidths.get( key );\n\t\t\t\tmap.set(\n\t\t\t\t\tkey,\n\t\t\t\t\tfillW !== undefined ? { ...item, width: fillW } : item\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn map;\n\t\t}, [ items, layoutMap, effectiveColumns ] );\n\n\t\tconst [ childrenMap, actionableAreaMap, remaining, renderedByKey ] =\n\t\t\tuseMemo( () => {\n\t\t\t\tconst childMap = new Map< string, React.ReactElement >();\n\t\t\t\tconst actionableMap = new Map< string, React.ReactNode >();\n\t\t\t\tconst rest: React.ReactNode[] = [];\n\t\t\t\tconst byKey = new Map< string, React.ReactElement >();\n\n\t\t\t\tChildren.forEach( children, ( child ) => {\n\t\t\t\t\tif ( ! isValidElement( child ) ) {\n\t\t\t\t\t\trest.push( child );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst key = child.key?.toString();\n\t\t\t\t\tif ( ! key ) {\n\t\t\t\t\t\trest.push( child );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Strip `actionableArea` so it does not leak to the DOM;\n\t\t\t\t\t// the grid lifts it to a slot separately.\n\t\t\t\t\tconst { actionableArea } = child.props;\n\t\t\t\t\tconst stripped =\n\t\t\t\t\t\tactionableArea !== undefined\n\t\t\t\t\t\t\t? cloneElement( child, {\n\t\t\t\t\t\t\t\t\tactionableArea: undefined,\n\t\t\t\t\t\t\t } )\n\t\t\t\t\t\t\t: child;\n\n\t\t\t\t\tbyKey.set( key, stripped );\n\n\t\t\t\t\tif ( layoutKeys.has( key ) ) {\n\t\t\t\t\t\tif ( actionableArea !== undefined ) {\n\t\t\t\t\t\t\tactionableMap.set( key, actionableArea );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tchildMap.set( key, stripped );\n\t\t\t\t\t} else {\n\t\t\t\t\t\trest.push( child );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\treturn [ childMap, actionableMap, rest, byKey ];\n\t\t\t}, [ children, layoutKeys ] );\n\n\t\t// Persist the latest rendered children so a removed tile's content\n\t\t// is still available for its exit overlay. Filled from an effect so a\n\t\t// discarded render never writes to the cache.\n\t\tuseLayoutEffect( () => {\n\t\t\tfor ( const [ key, child ] of renderedByKey ) {\n\t\t\t\tchildrenCacheRef.current.set( key, child );\n\t\t\t}\n\t\t}, [ renderedByKey ] );\n\n\t\tconst sensors = useSensors(\n\t\t\tuseSensor( PointerSensor ),\n\t\t\tuseSensor( KeyboardSensor, {\n\t\t\t\tcoordinateGetter: sortableKeyboardCoordinates,\n\t\t\t} )\n\t\t);\n\n\t\tconst handleDragStart = useEvent( ( event: DragStartEvent ) => {\n\t\t\tsetActiveId( String( event.active.id ) );\n\t\t\tlastReorderCursorRef.current = null;\n\t\t} );\n\n\t\tconst handleDragCancel = useEvent( () => {\n\t\t\tsetActiveId( null );\n\t\t\tlatestLayoutRef.current = undefined;\n\t\t\tlastReorderCursorRef.current = null;\n\t\t\tresizeBaselineRef.current = null;\n\t\t\tsetIsResizing( false );\n\t\t\tsetResizeSnapPreview( null );\n\t\t\tsetTemporaryLayout( undefined );\n\t\t} );\n\n\t\t// Re-evaluate the insertion slot on every pointer move, not\n\t\t// just when `over.id` changes — otherwise a \"swap back\" with\n\t\t// the cursor still on the same tile would never fire.\n\t\tconst handleDragMove = useEvent( ( event: DragMoveEvent ) => {\n\t\t\tconst { active, over } = event;\n\t\t\tif ( ! over || active.id === over.id ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst activeRect = active.rect.current.translated;\n\t\t\tif ( ! activeRect ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst activeCenterX = activeRect.left + activeRect.width / 2;\n\t\t\tconst activeCenterY = activeRect.top + activeRect.height / 2;\n\n\t\t\t// Skip re-measured events after a layout change: require\n\t\t\t// meaningful cursor movement between reorders.\n\t\t\tconst lastCursor = lastReorderCursorRef.current;\n\t\t\tif ( lastCursor ) {\n\t\t\t\tconst dx = activeCenterX - lastCursor.x;\n\t\t\t\tconst dy = activeCenterY - lastCursor.y;\n\t\t\t\tif ( dx * dx + dy * dy < 100 ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst overCenterX = over.rect.left + over.rect.width / 2;\n\t\t\tconst insertAfter = activeCenterX > overCenterX;\n\n\t\t\tconst currentIndex = items.indexOf( String( active.id ) );\n\t\t\tconst overIndex = items.indexOf( String( over.id ) );\n\t\t\tlet newIndex: number;\n\t\t\tif ( insertAfter ) {\n\t\t\t\tnewIndex = currentIndex > overIndex ? overIndex + 1 : overIndex;\n\t\t\t} else {\n\t\t\t\tnewIndex = currentIndex > overIndex ? overIndex : overIndex - 1;\n\t\t\t}\n\t\t\tnewIndex = Math.max( 0, Math.min( newIndex, items.length - 1 ) );\n\n\t\t\tif ( newIndex === currentIndex ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst updatedItems = arrayMove( items, currentIndex, newIndex );\n\t\t\tconst updatedLayout = activeLayout.map( ( item ) => ( {\n\t\t\t\t...item,\n\t\t\t\torder: updatedItems.indexOf( item.key ),\n\t\t\t} ) );\n\n\t\t\tlastReorderCursorRef.current = {\n\t\t\t\tx: activeCenterX,\n\t\t\t\ty: activeCenterY,\n\t\t\t};\n\t\t\tlatestLayoutRef.current = updatedLayout;\n\t\t\tcaptureLayoutSnapshotRef.current();\n\t\t\tsetTemporaryLayout( updatedLayout );\n\t\t\tonPreviewLayout?.( updatedLayout );\n\t\t} );\n\n\t\t// Commit the latest temporary layout and clear local state.\n\t\t// Reads from the ref to bypass React's state batching.\n\t\tconst persistTemporaryLayout = useEvent( () => {\n\t\t\tconst latest = latestLayoutRef.current;\n\t\t\tlatestLayoutRef.current = undefined;\n\t\t\tresizeBaselineRef.current = null;\n\t\t\tsetIsResizing( false );\n\t\t\tsetResizeSnapPreview( null );\n\t\t\tif ( ! onChangeLayout || ! latest ) {\n\t\t\t\tsetTemporaryLayout( undefined );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tonChangeLayout( latest );\n\t\t\tsetTemporaryLayout( undefined );\n\t\t} );\n\n\t\tconst handleResize = useEvent( ( id: string, delta: ResizeDelta ) => {\n\t\t\tif ( ! editMode ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( ! isResizing ) {\n\t\t\t\tsetIsResizing( true );\n\t\t\t}\n\n\t\t\tconst relativeDelta = {\n\t\t\t\twidth: Math.round( delta.width / ( columnWidth + gapPx ) ),\n\t\t\t\theight:\n\t\t\t\t\trowHeight === 'auto'\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: Math.round( delta.height / ( rowHeight + gapPx ) ),\n\t\t\t};\n\n\t\t\t// Snapshot the baseline once at gesture start. The handle's\n\t\t\t// `delta` is absolute from the gesture start, so summing it\n\t\t\t// with the live (already mutated) `activeLayout` width would\n\t\t\t// compound and oscillate — and stepping back through the\n\t\t\t// zero-delta zone would never restore the original size.\n\t\t\tif ( ! resizeBaselineRef.current ) {\n\t\t\t\tconst baseItem = activeLayout.find(\n\t\t\t\t\t( item ) => item.key === id\n\t\t\t\t);\n\t\t\t\tconst resolvedItem = resolvedItemMap.get( id );\n\t\t\t\t// `'fill'`/`'full'` resize from the rendered span\n\t\t\t\t// and convert to a numeric width.\n\t\t\t\tlet baseWidth: number;\n\t\t\t\tif ( baseItem?.width === 'full' ) {\n\t\t\t\t\tbaseWidth = effectiveColumns;\n\t\t\t\t} else if ( baseItem?.width === 'fill' ) {\n\t\t\t\t\tbaseWidth =\n\t\t\t\t\t\ttypeof resolvedItem?.width === 'number'\n\t\t\t\t\t\t\t? resolvedItem.width\n\t\t\t\t\t\t\t: 1;\n\t\t\t\t} else {\n\t\t\t\t\tbaseWidth = baseItem?.width ?? 1;\n\t\t\t\t}\n\t\t\t\tresizeBaselineRef.current = {\n\t\t\t\t\twidth: baseWidth,\n\t\t\t\t\theight: baseItem?.height ?? 1,\n\t\t\t\t};\n\t\t\t}\n\t\t\tconst baseline = resizeBaselineRef.current;\n\t\t\tconst newWidth = Math.max(\n\t\t\t\t1,\n\t\t\t\tMath.min(\n\t\t\t\t\tbaseline.width + relativeDelta.width,\n\t\t\t\t\teffectiveColumns\n\t\t\t\t)\n\t\t\t);\n\t\t\tconst newHeight = Math.max(\n\t\t\t\t1,\n\t\t\t\tbaseline.height + relativeDelta.height\n\t\t\t);\n\n\t\t\tsetResizeSnapPreview( {\n\t\t\t\tid,\n\t\t\t\tsnap: gridSpanToPixelSize(\n\t\t\t\t\tnewWidth,\n\t\t\t\t\tnewHeight,\n\t\t\t\t\tcolumnWidth,\n\t\t\t\t\tgapPx,\n\t\t\t\t\trowHeightPx\n\t\t\t\t),\n\t\t\t} );\n\n\t\t\t// Bail when the snapped size matches the layout already\n\t\t\t// staged for commit. The tile still tracks the cursor\n\t\t\t// continuously; only the preview outline and pending commit\n\t\t\t// need updating when the snap target changes.\n\t\t\tconst pendingItem = latestLayoutRef.current?.find(\n\t\t\t\t( item ) => item.key === id\n\t\t\t);\n\t\t\tconst currentItem =\n\t\t\t\tpendingItem ?? activeLayout.find( ( item ) => item.key === id );\n\t\t\tif (\n\t\t\t\tcurrentItem &&\n\t\t\t\tcurrentItem.width === newWidth &&\n\t\t\t\t( currentItem.height ?? 1 ) === newHeight\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst updatedLayout = activeLayout.map( ( item ) =>\n\t\t\t\titem.key === id\n\t\t\t\t\t? { ...item, width: newWidth, height: newHeight }\n\t\t\t\t\t: item\n\t\t\t);\n\n\t\t\tlatestLayoutRef.current = updatedLayout;\n\t\t\tcaptureLayoutSnapshotRef.current();\n\t\t\tsetTemporaryLayout( updatedLayout );\n\t\t\tonPreviewLayout?.( updatedLayout );\n\t\t} );\n\n\t\t// Drag-overlay clone composition: the surface always wraps with a\n\t\t// thin functional frame (lift, cursor, pointer pass-through). When\n\t\t// `renderDragPreview` is supplied, the consumer's wrapper sits\n\t\t// inside the frame around the cloned children; otherwise the\n\t\t// cloned children render directly so any persistent chrome on\n\t\t// them carries through unchanged.\n\t\tconst activeClone = activeId ? childrenMap.get( activeId ) : null;\n\t\tconst DragPreview = renderDragPreview;\n\t\tconst dragOverlayContent =\n\t\t\tactiveId && activeClone ? (\n\t\t\t\t<div className={ styles[ 'drag-preview-frame' ] }>\n\t\t\t\t\t<div className={ styles[ 'drag-preview-frame__lift' ] }>\n\t\t\t\t\t\t{ DragPreview ? (\n\t\t\t\t\t\t\t<DragPreview itemId={ activeId }>\n\t\t\t\t\t\t\t\t{ activeClone }\n\t\t\t\t\t\t\t</DragPreview>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tactiveClone\n\t\t\t\t\t\t) }\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t) : null;\n\n\t\t// Edit-mode background. Rendered unconditionally so it can\n\t\t// cross-fade on edit-mode toggles (`isActive` drives the\n\t\t// transition); memoized so drag/resize re-renders skip it while\n\t\t// inputs are stable. A numeric `rowHeight` adds row markers;\n\t\t// `'auto'` collapses to `undefined` and omits them.\n\t\tconst Overlay = renderGridOverlay ?? GridOverlay;\n\t\tconst overlayRowHeight =\n\t\t\ttypeof rowHeight === 'number' ? rowHeight : undefined;\n\t\tconst overlayRows = useMemo( () => {\n\t\t\tif ( overlayRowHeight === undefined || containerHeight <= 0 ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst rowTile = overlayRowHeight + gapPx;\n\t\t\treturn Math.max(\n\t\t\t\t1,\n\t\t\t\tMath.floor( ( containerHeight + gapPx ) / rowTile )\n\t\t\t);\n\t\t}, [ overlayRowHeight, containerHeight, gapPx ] );\n\t\tconst gridOverlay = useMemo(\n\t\t\t() => (\n\t\t\t\t<Overlay\n\t\t\t\t\tcolumns={ effectiveColumns }\n\t\t\t\t\trowHeight={ overlayRowHeight }\n\t\t\t\t\trows={ overlayRows }\n\t\t\t\t\tisActive={ editMode }\n\t\t\t\t/>\n\t\t\t),\n\t\t\t[\n\t\t\t\tOverlay,\n\t\t\t\teditMode,\n\t\t\t\teffectiveColumns,\n\t\t\t\toverlayRowHeight,\n\t\t\t\toverlayRows,\n\t\t\t]\n\t\t);\n\n\t\tconst layoutFingerprint = useMemo(\n\t\t\t() => getLayoutFingerprint( [ ...resolvedItemMap.values() ] ),\n\t\t\t[ resolvedItemMap ]\n\t\t);\n\t\tconst excludeLayoutAnimationKey =\n\t\t\tactiveId ?? ( isResizing ? resizeSnapPreview?.id : null );\n\t\tconst { captureLayoutSnapshot, getPositionsBeforeLastChange } =\n\t\t\tuseLayoutShiftAnimation( {\n\t\t\t\tcontainer: gridRoot,\n\t\t\t\tenabled: editMode,\n\t\t\t\tlayoutFingerprint,\n\t\t\t\texcludeItemKey: excludeLayoutAnimationKey,\n\t\t\t} );\n\t\tconst { exitingItems, clearExitingItem } = useItemExitAnimation( {\n\t\t\tcontainer: gridRoot,\n\t\t\tenabled: editMode,\n\t\t\tlayoutKeys,\n\t\t\tgetPositionsBeforeLastChange,\n\t\t\tchildrenCacheRef,\n\t\t} );\n\t\t// Transform transitions on tiles for FLIP (drag, resize, removal).\n\t\tconst layoutAnimating = editMode;\n\t\tuseLayoutEffect( () => {\n\t\t\tcaptureLayoutSnapshotRef.current = captureLayoutSnapshot;\n\t\t}, [ captureLayoutSnapshot ] );\n\n\t\treturn (\n\t\t\t<DndContext\n\t\t\t\tsensors={ sensors }\n\t\t\t\tonDragStart={ handleDragStart }\n\t\t\t\tonDragCancel={ handleDragCancel }\n\t\t\t\tonDragMove={ handleDragMove }\n\t\t\t\tonDragEnd={ () => {\n\t\t\t\t\tpersistTemporaryLayout();\n\t\t\t\t\tlastReorderCursorRef.current = null;\n\t\t\t\t\tsetActiveId( null );\n\t\t\t\t} }\n\t\t\t>\n\t\t\t\t{ /* No-op strategy: reorder comes from `temporaryLayout`\n\t\t\t\t + CSS Grid, not dnd-kit transforms. */ }\n\t\t\t\t<SortableContext items={ items } strategy={ NO_SORT_STRATEGY }>\n\t\t\t\t\t<div\n\t\t\t\t\t\t{ ...divProps }\n\t\t\t\t\t\tref={ mergedGridRef }\n\t\t\t\t\t\tclassName={ clsx(\n\t\t\t\t\t\t\tstyles.grid,\n\t\t\t\t\t\t\tlayoutAnimating &&\n\t\t\t\t\t\t\t\tlayoutAnimationStyles[ 'layout-animating' ],\n\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t) }\n\t\t\t\t\t\tdata-wp-grid-dragging={ activeId || undefined }\n\t\t\t\t\t\tdata-wp-grid-resizing={ isResizing || undefined }\n\t\t\t\t\t\tstyle={ {\n\t\t\t\t\t\t\t...style,\n\t\t\t\t\t\t\tgridTemplateColumns: `repeat(${ effectiveColumns }, minmax(0, 1fr))`,\n\t\t\t\t\t\t\tgridAutoRows: rowHeight,\n\t\t\t\t\t\t} }\n\t\t\t\t\t>\n\t\t\t\t\t\t{ gridOverlay }\n\t\t\t\t\t\t{ items.map( ( id ) => (\n\t\t\t\t\t\t\t<GridItem\n\t\t\t\t\t\t\t\tkey={ id }\n\t\t\t\t\t\t\t\titem={\n\t\t\t\t\t\t\t\t\tresolvedItemMap.get(\n\t\t\t\t\t\t\t\t\t\tid\n\t\t\t\t\t\t\t\t\t) as DashboardGridLayoutItem\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tmaxColumns={ effectiveColumns }\n\t\t\t\t\t\t\t\tdisabled={ ! editMode }\n\t\t\t\t\t\t\t\tverticalResizable={ rowHeight !== 'auto' }\n\t\t\t\t\t\t\t\tinteracting={ activeId !== null || isResizing }\n\t\t\t\t\t\t\t\tdragging={ activeId !== null }\n\t\t\t\t\t\t\t\tonResize={ handleResize }\n\t\t\t\t\t\t\t\tonResizeEnd={ persistTemporaryLayout }\n\t\t\t\t\t\t\t\tresizeSnapPreview={\n\t\t\t\t\t\t\t\t\tresizeSnapPreview?.id === id\n\t\t\t\t\t\t\t\t\t\t? resizeSnapPreview.snap\n\t\t\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tminResizeWidthPx={ minResizeWidthPx }\n\t\t\t\t\t\t\t\tminResizeHeightPx={ minResizeHeightPx }\n\t\t\t\t\t\t\t\tactionableArea={ actionableAreaMap.get( id ) }\n\t\t\t\t\t\t\t\trenderResizeHandle={ renderResizeHandle }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ childrenMap.get( id ) }\n\t\t\t\t\t\t\t</GridItem>\n\t\t\t\t\t\t) ) }\n\t\t\t\t\t\t{ remaining }\n\t\t\t\t\t\t{ exitingItems.map( ( { key, rect, child } ) => (\n\t\t\t\t\t\t\t<ItemExitOverlay\n\t\t\t\t\t\t\t\tkey={ `exiting-${ key }` }\n\t\t\t\t\t\t\t\titemKey={ key }\n\t\t\t\t\t\t\t\trect={ rect }\n\t\t\t\t\t\t\t\tonAnimationEnd={ () => clearExitingItem( key ) }\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ child }\n\t\t\t\t\t\t\t</ItemExitOverlay>\n\t\t\t\t\t\t) ) }\n\t\t\t\t\t</div>\n\t\t\t\t</SortableContext>\n\t\t\t\t<DragOverlay dropAnimation={ dashboardDragDropAnimation }>\n\t\t\t\t\t{ dragOverlayContent }\n\t\t\t\t</DragOverlay>\n\t\t\t</DndContext>\n\t\t);\n\t}\n);\n", "type GlobalScopeWithStyleRuntime = typeof globalThis & {\n\t// This global is shared by separately bundled copies of this package.\n\t// Keep its shape backward compatible after release.\n\t__wpStyleRuntime?: {\n\t\tdocuments: Map< Document, number >;\n\t\tstyles: Map< string, string >;\n\t\tinjectedStyles: WeakMap< Document, Set< string > >;\n\t};\n};\n\nconst STYLE_HASH_ATTRIBUTE = 'data-wp-hash';\n\n/**\n * Returns the shared style runtime registry.\n *\n * The registry is stored on `globalThis` so separately bundled copies of this\n * package can coordinate through the same document and style maps.\n *\n * @return The shared runtime registry.\n */\nfunction getRuntime() {\n\tconst globalScope = globalThis as GlobalScopeWithStyleRuntime;\n\n\tif ( globalScope.__wpStyleRuntime ) {\n\t\treturn globalScope.__wpStyleRuntime;\n\t}\n\n\tglobalScope.__wpStyleRuntime = {\n\t\tdocuments: new Map(),\n\t\tstyles: new Map(),\n\t\tinjectedStyles: new WeakMap(),\n\t};\n\n\tif ( typeof document !== 'undefined' ) {\n\t\tregisterDocument( document );\n\t}\n\n\treturn globalScope.__wpStyleRuntime;\n}\n\n/**\n * Checks whether a document already contains a style tag for a hash.\n *\n * @param targetDocument Document to inspect.\n * @param hash Stable hash for the transformed CSS.\n *\n * @return Whether the style hash already exists in the document.\n */\nfunction documentContainsStyleHash(\n\ttargetDocument: Document,\n\thash: string\n): boolean {\n\tif ( ! targetDocument.head ) {\n\t\treturn false;\n\t}\n\n\tfor ( const style of targetDocument.head.querySelectorAll(\n\t\t`style[${ STYLE_HASH_ATTRIBUTE }]`\n\t) ) {\n\t\tif ( style.getAttribute( STYLE_HASH_ATTRIBUTE ) === hash ) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n}\n\n/**\n * Injects a registered style into a document, unless that document already\n * contains a style tag for the same hash.\n *\n * @param targetDocument Document to inject the style into.\n * @param hash Stable hash for the transformed CSS.\n * @param css CSS text to inject.\n */\nfunction injectStyle( targetDocument: Document, hash: string, css: string ) {\n\tif ( ! targetDocument.head ) {\n\t\treturn;\n\t}\n\n\tconst runtime = getRuntime();\n\tlet injectedStyles = runtime.injectedStyles.get( targetDocument );\n\n\tif ( ! injectedStyles ) {\n\t\tinjectedStyles = new Set();\n\t\truntime.injectedStyles.set( targetDocument, injectedStyles );\n\t}\n\n\tif ( injectedStyles.has( hash ) ) {\n\t\treturn;\n\t}\n\n\t// Older generated CSS module output can still inject matching style tags\n\t// after this document's cache is created, so keep the DOM as the fallback\n\t// source of truth on cache misses.\n\tif ( documentContainsStyleHash( targetDocument, hash ) ) {\n\t\tinjectedStyles.add( hash );\n\t\treturn;\n\t}\n\n\tconst style = targetDocument.createElement( 'style' );\n\tstyle.setAttribute( STYLE_HASH_ATTRIBUTE, hash );\n\tstyle.appendChild( targetDocument.createTextNode( css ) );\n\ttargetDocument.head.appendChild( style );\n\tinjectedStyles.add( hash );\n}\n\n/**\n * Registers a document as a style injection target.\n *\n * Existing registered styles are replayed into the document immediately.\n * Documents are reference-counted so multiple providers can safely register the\n * same document without one cleanup removing it while another registration is\n * still active.\n *\n * @param targetDocument Document to receive registered styles.\n * @return Cleanup function that unregisters this document registration.\n */\nexport function registerDocument( targetDocument: Document ) {\n\tconst runtime = getRuntime();\n\n\truntime.documents.set(\n\t\ttargetDocument,\n\t\t( runtime.documents.get( targetDocument ) ?? 0 ) + 1\n\t);\n\n\tfor ( const [ hash, css ] of runtime.styles ) {\n\t\tinjectStyle( targetDocument, hash, css );\n\t}\n\n\treturn () => {\n\t\tconst count = runtime.documents.get( targetDocument );\n\n\t\tif ( count === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( count <= 1 ) {\n\t\t\truntime.documents.delete( targetDocument );\n\t\t\treturn;\n\t\t}\n\n\t\truntime.documents.set( targetDocument, count - 1 );\n\t};\n}\n\n/**\n * Registers a style and injects it into all registered documents.\n *\n * The hash is used as the deduplication key, so calling this repeatedly with\n * the same hash will not add duplicate style tags to a document.\n * Registered styles are retained for the lifetime of the page so they can be\n * replayed into documents that are registered later.\n *\n * @param hash Stable hash for the transformed CSS.\n * @param css CSS text to inject.\n */\nexport function registerStyle( hash: string, css: string ) {\n\tconst runtime = getRuntime();\n\n\truntime.styles.set( hash, css );\n\n\tfor ( const targetDocument of runtime.documents.keys() ) {\n\t\tinjectStyle( targetDocument, hash, css );\n\t}\n}\n", "import { registerStyle } from '@wordpress/style-runtime';\nif (typeof process === 'undefined' || process.env.NODE_ENV !== 'test') {\n\tregisterStyle(\"9e5573e51f\", \"._2db63116caa90ae9__layout-animating [data-wp-grid-item-key]{transition:transform var(--wpds-motion-duration-md,.2s) var(--wpds-motion-easing-balanced,cubic-bezier(.4,0,.2,1))}@media (prefers-reduced-motion:reduce){._2db63116caa90ae9__layout-animating [data-wp-grid-item-key]{transition:none}}\");\n}\nexport default {\"layout-animating\":\"_2db63116caa90ae9__layout-animating\"};\n", "import { registerStyle } from '@wordpress/style-runtime';\nif (typeof process === 'undefined' || process.env.NODE_ENV !== 'test') {\n\tregisterStyle(\"52d51e7d5c\", \"._960c435c33759f46__grid{display:grid;gap:var(--wp-grid-gap,var(--wpds-dimension-gap-xl,24px));position:relative}._48e8cd4225dcb813__drag-preview-frame{border-radius:var(--wp-grid-drag-preview-radius,0);box-shadow:var(--wpds-elevation-md,0 2px 3px 0 #0000000d,0 4px 5px 0 #0000000a,0 12px 12px 0 #00000008,0 16px 16px 0 #00000005);cursor:grabbing;height:100%;pointer-events:none}._4b471bf24f891d2d__drag-preview-frame__lift{height:100%;transform:scale(var(--wp-grid-drag-preview-scale,1.05));transform-origin:center}@media not (prefers-reduced-motion:reduce){._48e8cd4225dcb813__drag-preview-frame{animation:_08fdf90ef86c4706__wp-grid-drag-preview-shadow-enter var(--wpds-motion-duration-sm,.1s) var(--wpds-motion-easing-balanced,cubic-bezier(.4,0,.2,1)) both}._4b471bf24f891d2d__drag-preview-frame__lift{animation:_8aaeb335436989f9__wp-grid-drag-preview-scale-enter var(--wpds-motion-duration-sm,.1s) var(--wpds-motion-easing-balanced,cubic-bezier(.4,0,.2,1)) both}}@media not (prefers-reduced-motion:reduce){@keyframes _08fdf90ef86c4706__wp-grid-drag-preview-shadow-enter{0%{box-shadow:var(--wpds-elevation-xs,0 1px 1px 0 #00000008,0 1px 2px 0 #00000005,0 3px 3px 0 #00000005,0 4px 4px 0 #00000003)}to{box-shadow:var(--wpds-elevation-md,0 2px 3px 0 #0000000d,0 4px 5px 0 #0000000a,0 12px 12px 0 #00000008,0 16px 16px 0 #00000005)}}@keyframes _8aaeb335436989f9__wp-grid-drag-preview-scale-enter{0%{transform:scale(1)}to{transform:scale(var(--wp-grid-drag-preview-scale,1.05))}}}@media not (prefers-reduced-motion:reduce){._48e8cd4225dcb813__drag-preview-frame._66b0aefb2bc02eb9__dragPreviewFrameExiting{animation:a7ead84bfd25ff8a__wp-grid-drag-preview-shadow-exit var(--wpds-motion-duration-md,.2s) var(--wpds-motion-easing-balanced,cubic-bezier(.4,0,.2,1)) forwards}._48e8cd4225dcb813__drag-preview-frame._66b0aefb2bc02eb9__dragPreviewFrameExiting ._4b471bf24f891d2d__drag-preview-frame__lift{animation:_234ccad5c20d49f8__wp-grid-drag-preview-scale-exit var(--wpds-motion-duration-md,.2s) var(--wpds-motion-easing-balanced,cubic-bezier(.4,0,.2,1)) forwards}@keyframes a7ead84bfd25ff8a__wp-grid-drag-preview-shadow-exit{0%{box-shadow:var(--wpds-elevation-md,0 2px 3px 0 #0000000d,0 4px 5px 0 #0000000a,0 12px 12px 0 #00000008,0 16px 16px 0 #00000005)}to{box-shadow:var(--wpds-elevation-xs,0 1px 1px 0 #00000008,0 1px 2px 0 #00000005,0 3px 3px 0 #00000005,0 4px 4px 0 #00000003)}}@keyframes _234ccad5c20d49f8__wp-grid-drag-preview-scale-exit{0%{transform:scale(var(--wp-grid-drag-preview-scale,1.05))}to{transform:scale(1)}}}._48e8cd4225dcb813__drag-preview-frame._66b0aefb2bc02eb9__dragPreviewFrameExiting{box-shadow:var(--wpds-elevation-xs,0 1px 1px 0 #00000008,0 1px 2px 0 #00000005,0 3px 3px 0 #00000005,0 4px 4px 0 #00000003)}._48e8cd4225dcb813__drag-preview-frame._66b0aefb2bc02eb9__dragPreviewFrameExiting ._4b471bf24f891d2d__drag-preview-frame__lift{transform:scale(1)}@media (prefers-reduced-motion:reduce){._48e8cd4225dcb813__drag-preview-frame{box-shadow:var(--wpds-elevation-md,0 2px 3px 0 #0000000d,0 4px 5px 0 #0000000a,0 12px 12px 0 #00000008,0 16px 16px 0 #00000005)}._4b471bf24f891d2d__drag-preview-frame__lift{transform:none}._48e8cd4225dcb813__drag-preview-frame._66b0aefb2bc02eb9__dragPreviewFrameExiting{box-shadow:var(--wpds-elevation-xs,0 1px 1px 0 #00000008,0 1px 2px 0 #00000005,0 3px 3px 0 #00000005,0 4px 4px 0 #00000003);transition:none}._48e8cd4225dcb813__drag-preview-frame._66b0aefb2bc02eb9__dragPreviewFrameExiting ._4b471bf24f891d2d__drag-preview-frame__lift{transition:none}}\");\n}\nexport default {\"grid\":\"_960c435c33759f46__grid\",\"drag-preview-frame\":\"_48e8cd4225dcb813__drag-preview-frame\",\"drag-preview-frame__lift\":\"_4b471bf24f891d2d__drag-preview-frame__lift\",\"wp-grid-drag-preview-shadow-enter\":\"_08fdf90ef86c4706__wp-grid-drag-preview-shadow-enter\",\"wp-grid-drag-preview-scale-enter\":\"_8aaeb335436989f9__wp-grid-drag-preview-scale-enter\",\"dragPreviewFrameExiting\":\"_66b0aefb2bc02eb9__dragPreviewFrameExiting\",\"wp-grid-drag-preview-shadow-exit\":\"a7ead84bfd25ff8a__wp-grid-drag-preview-shadow-exit\",\"wp-grid-drag-preview-scale-exit\":\"_234ccad5c20d49f8__wp-grid-drag-preview-scale-exit\"};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["DashboardGrid", "clsx"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// packages/grid/src/dashboard-grid/resolve-fill-widths.ts
|
|
21
|
+
var resolve_fill_widths_exports = {};
|
|
22
|
+
__export(resolve_fill_widths_exports, {
|
|
23
|
+
resolveFillWidths: () => resolveFillWidths
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(resolve_fill_widths_exports);
|
|
26
|
+
function resolveFillWidths(sortedKeys, layoutMap, maxColumns) {
|
|
27
|
+
const resolved = /* @__PURE__ */ new Map();
|
|
28
|
+
const n = sortedKeys.length;
|
|
29
|
+
const items = new Array(n);
|
|
30
|
+
const widths = new Array(n);
|
|
31
|
+
const heights = new Array(n);
|
|
32
|
+
let hasFill = false;
|
|
33
|
+
let hasMultiRow = false;
|
|
34
|
+
let totalRows = 0;
|
|
35
|
+
for (let i = 0; i < n; i++) {
|
|
36
|
+
const item = layoutMap.get(sortedKeys[i]);
|
|
37
|
+
items[i] = item;
|
|
38
|
+
widths[i] = item && typeof item.width === "number" ? Math.min(item.width, maxColumns) : 1;
|
|
39
|
+
const h = Math.max(1, Math.floor(item?.height ?? 1));
|
|
40
|
+
heights[i] = h;
|
|
41
|
+
if (item?.width === "fill") {
|
|
42
|
+
hasFill = true;
|
|
43
|
+
}
|
|
44
|
+
if (h > 1) {
|
|
45
|
+
hasMultiRow = true;
|
|
46
|
+
}
|
|
47
|
+
totalRows += h;
|
|
48
|
+
}
|
|
49
|
+
if (!hasFill) {
|
|
50
|
+
return resolved;
|
|
51
|
+
}
|
|
52
|
+
if (!hasMultiRow) {
|
|
53
|
+
let currentCol = 0;
|
|
54
|
+
for (let i = 0; i < n; i++) {
|
|
55
|
+
const item = items[i];
|
|
56
|
+
if (!item) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (item.width === "full") {
|
|
60
|
+
currentCol = 0;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (item.width === "fill") {
|
|
64
|
+
let reserved = 0;
|
|
65
|
+
for (let j = i + 1; j < n; j++) {
|
|
66
|
+
const next = items[j];
|
|
67
|
+
if (!next || next.width === "full" || next.width === "fill") {
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
const nextW = widths[j];
|
|
71
|
+
if (currentCol + 1 + reserved + nextW <= maxColumns) {
|
|
72
|
+
reserved += nextW;
|
|
73
|
+
} else {
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const fillCols = Math.max(
|
|
78
|
+
1,
|
|
79
|
+
maxColumns - currentCol - reserved
|
|
80
|
+
);
|
|
81
|
+
resolved.set(item.key, fillCols);
|
|
82
|
+
currentCol += fillCols;
|
|
83
|
+
} else {
|
|
84
|
+
const w = widths[i];
|
|
85
|
+
if (currentCol + w > maxColumns) {
|
|
86
|
+
currentCol = 0;
|
|
87
|
+
}
|
|
88
|
+
currentCol += w;
|
|
89
|
+
}
|
|
90
|
+
if (currentCol >= maxColumns) {
|
|
91
|
+
currentCol = 0;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return resolved;
|
|
95
|
+
}
|
|
96
|
+
const rowOccupancy = new Array(maxColumns).fill(0);
|
|
97
|
+
let cursorRow = 0;
|
|
98
|
+
let cursorCol = 0;
|
|
99
|
+
for (let i = 0; i < n; i++) {
|
|
100
|
+
const item = items[i];
|
|
101
|
+
if (!item) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const h = heights[i];
|
|
105
|
+
if (item.width === "full") {
|
|
106
|
+
let r2 = cursorRow;
|
|
107
|
+
for (let c2 = 0; c2 < maxColumns; c2++) {
|
|
108
|
+
if (rowOccupancy[c2] > r2) {
|
|
109
|
+
r2 = rowOccupancy[c2];
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
for (let c2 = 0; c2 < maxColumns; c2++) {
|
|
113
|
+
rowOccupancy[c2] = r2 + h;
|
|
114
|
+
}
|
|
115
|
+
cursorRow = r2 + h;
|
|
116
|
+
cursorCol = 0;
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
if (item.width === "fill") {
|
|
120
|
+
let r2 = cursorRow;
|
|
121
|
+
let c2 = cursorCol;
|
|
122
|
+
scan: for (; r2 <= totalRows; r2++) {
|
|
123
|
+
const start = r2 === cursorRow ? cursorCol : 0;
|
|
124
|
+
for (c2 = start; c2 < maxColumns; c2++) {
|
|
125
|
+
if (rowOccupancy[c2] <= r2) {
|
|
126
|
+
break scan;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const fillStartRow = r2;
|
|
131
|
+
const fillStartCol = c2;
|
|
132
|
+
let runLength = 0;
|
|
133
|
+
while (fillStartCol + runLength < maxColumns && rowOccupancy[fillStartCol + runLength] <= fillStartRow) {
|
|
134
|
+
runLength++;
|
|
135
|
+
}
|
|
136
|
+
let reserved = 0;
|
|
137
|
+
for (let j = i + 1; j < n; j++) {
|
|
138
|
+
const next = items[j];
|
|
139
|
+
if (!next || next.width === "full" || next.width === "fill") {
|
|
140
|
+
break;
|
|
141
|
+
}
|
|
142
|
+
const nextW = widths[j];
|
|
143
|
+
if (1 + reserved + nextW <= runLength) {
|
|
144
|
+
reserved += nextW;
|
|
145
|
+
} else {
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
const fillCols = Math.max(1, runLength - reserved);
|
|
150
|
+
resolved.set(item.key, fillCols);
|
|
151
|
+
for (let k = 0; k < fillCols; k++) {
|
|
152
|
+
rowOccupancy[fillStartCol + k] = fillStartRow + h;
|
|
153
|
+
}
|
|
154
|
+
cursorRow = fillStartRow;
|
|
155
|
+
cursorCol = fillStartCol + fillCols;
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const w = widths[i];
|
|
159
|
+
let r = cursorRow;
|
|
160
|
+
let c = cursorCol;
|
|
161
|
+
place: for (; r <= totalRows; r++) {
|
|
162
|
+
c = r === cursorRow ? cursorCol : 0;
|
|
163
|
+
while (c + w <= maxColumns) {
|
|
164
|
+
let blocked = -1;
|
|
165
|
+
for (let k = 0; k < w; k++) {
|
|
166
|
+
if (rowOccupancy[c + k] > r) {
|
|
167
|
+
blocked = c + k;
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (blocked === -1) {
|
|
172
|
+
break place;
|
|
173
|
+
}
|
|
174
|
+
c = blocked + 1;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
for (let k = 0; k < w; k++) {
|
|
178
|
+
rowOccupancy[c + k] = r + h;
|
|
179
|
+
}
|
|
180
|
+
cursorRow = r;
|
|
181
|
+
cursorCol = c + w;
|
|
182
|
+
}
|
|
183
|
+
return resolved;
|
|
184
|
+
}
|
|
185
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
186
|
+
0 && (module.exports = {
|
|
187
|
+
resolveFillWidths
|
|
188
|
+
});
|
|
189
|
+
//# sourceMappingURL=resolve-fill-widths.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/dashboard-grid/resolve-fill-widths.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Internal dependencies\n */\nimport type { DashboardGridLayoutItem } from './types';\n\n/**\n * Resolves items with `width: 'fill'` by computing how many columns they\n * should span. Simulates CSS Grid's row-sparse auto-flow placement so the\n * resolved span matches the free run that CSS Grid will actually use.\n *\n * Two paths:\n * - Fast path (no `height > 1` items): single-row column tracker, O(n).\n * Each fixed item between two fills is visited at most once by a fill's\n * look-ahead.\n * - Multi-row path (any item with `height > 1`): per-column skyline that\n * tracks shadow occupation of tall tiles. Placement scans rows in\n * row-major order, so worst-case cost depends on both columns and rows\n * scanned (rows bounded by the sum of item heights), not only on\n * `maxColumns`.\n *\n * @param sortedKeys - Item keys in display order.\n * @param layoutMap - Map of key to DashboardGridLayoutItem.\n * @param maxColumns - Total columns in the grid.\n * @return Map of fill item keys to their resolved column spans.\n */\nexport function resolveFillWidths(\n\tsortedKeys: string[],\n\tlayoutMap: Map< string, DashboardGridLayoutItem >,\n\tmaxColumns: number\n): Map< string, number > {\n\tconst resolved = new Map< string, number >();\n\tconst n = sortedKeys.length;\n\n\t// Pre-extract items, clamp widths and heights, detect which path to take.\n\tconst items = new Array< DashboardGridLayoutItem | undefined >( n );\n\tconst widths = new Array< number >( n );\n\tconst heights = new Array< number >( n );\n\tlet hasFill = false;\n\tlet hasMultiRow = false;\n\tlet totalRows = 0;\n\n\tfor ( let i = 0; i < n; i++ ) {\n\t\tconst item = layoutMap.get( sortedKeys[ i ] );\n\t\titems[ i ] = item;\n\t\twidths[ i ] =\n\t\t\titem && typeof item.width === 'number'\n\t\t\t\t? Math.min( item.width, maxColumns )\n\t\t\t\t: 1;\n\t\t// Clamp to a positive integer so `0`, fractional, or negative\n\t\t// values match the `|| 1` defaulting used in GridItem styles.\n\t\tconst h = Math.max( 1, Math.floor( item?.height ?? 1 ) );\n\t\theights[ i ] = h;\n\t\tif ( item?.width === 'fill' ) {\n\t\t\thasFill = true;\n\t\t}\n\t\tif ( h > 1 ) {\n\t\t\thasMultiRow = true;\n\t\t}\n\t\ttotalRows += h;\n\t}\n\n\tif ( ! hasFill ) {\n\t\treturn resolved;\n\t}\n\n\tif ( ! hasMultiRow ) {\n\t\tlet currentCol = 0;\n\n\t\tfor ( let i = 0; i < n; i++ ) {\n\t\t\tconst item = items[ i ];\n\t\t\tif ( ! item ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( item.width === 'full' ) {\n\t\t\t\tcurrentCol = 0;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( item.width === 'fill' ) {\n\t\t\t\tlet reserved = 0;\n\t\t\t\tfor ( let j = i + 1; j < n; j++ ) {\n\t\t\t\t\tconst next = items[ j ];\n\t\t\t\t\tif (\n\t\t\t\t\t\t! next ||\n\t\t\t\t\t\tnext.width === 'full' ||\n\t\t\t\t\t\tnext.width === 'fill'\n\t\t\t\t\t) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tconst nextW = widths[ j ];\n\t\t\t\t\tif ( currentCol + 1 + reserved + nextW <= maxColumns ) {\n\t\t\t\t\t\treserved += nextW;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst fillCols = Math.max(\n\t\t\t\t\t1,\n\t\t\t\t\tmaxColumns - currentCol - reserved\n\t\t\t\t);\n\t\t\t\tresolved.set( item.key, fillCols );\n\t\t\t\tcurrentCol += fillCols;\n\t\t\t} else {\n\t\t\t\tconst w = widths[ i ];\n\t\t\t\tif ( currentCol + w > maxColumns ) {\n\t\t\t\t\tcurrentCol = 0;\n\t\t\t\t}\n\t\t\t\tcurrentCol += w;\n\t\t\t}\n\n\t\t\tif ( currentCol >= maxColumns ) {\n\t\t\t\tcurrentCol = 0;\n\t\t\t}\n\t\t}\n\n\t\treturn resolved;\n\t}\n\n\t// `rowOccupancy[ col ]` is the index of the next free row at that\n\t// column; rows below it are taken by previously placed items. This\n\t// captures the \"shadow\" of tall tiles into the rows they span.\n\tconst rowOccupancy = new Array< number >( maxColumns ).fill( 0 );\n\tlet cursorRow = 0;\n\tlet cursorCol = 0;\n\n\tfor ( let i = 0; i < n; i++ ) {\n\t\tconst item = items[ i ];\n\t\tif ( ! item ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst h = heights[ i ];\n\n\t\tif ( item.width === 'full' ) {\n\t\t\tlet r = cursorRow;\n\t\t\tfor ( let c = 0; c < maxColumns; c++ ) {\n\t\t\t\tif ( rowOccupancy[ c ] > r ) {\n\t\t\t\t\tr = rowOccupancy[ c ];\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor ( let c = 0; c < maxColumns; c++ ) {\n\t\t\t\trowOccupancy[ c ] = r + h;\n\t\t\t}\n\t\t\tcursorRow = r + h;\n\t\t\tcursorCol = 0;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ( item.width === 'fill' ) {\n\t\t\tlet r = cursorRow;\n\t\t\tlet c = cursorCol;\n\t\t\tscan: for ( ; r <= totalRows; r++ ) {\n\t\t\t\tconst start = r === cursorRow ? cursorCol : 0;\n\t\t\t\tfor ( c = start; c < maxColumns; c++ ) {\n\t\t\t\t\tif ( rowOccupancy[ c ] <= r ) {\n\t\t\t\t\t\tbreak scan;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst fillStartRow = r;\n\t\t\tconst fillStartCol = c;\n\t\t\tlet runLength = 0;\n\t\t\twhile (\n\t\t\t\tfillStartCol + runLength < maxColumns &&\n\t\t\t\trowOccupancy[ fillStartCol + runLength ] <= fillStartRow\n\t\t\t) {\n\t\t\t\trunLength++;\n\t\t\t}\n\t\t\tlet reserved = 0;\n\t\t\tfor ( let j = i + 1; j < n; j++ ) {\n\t\t\t\tconst next = items[ j ];\n\t\t\t\tif (\n\t\t\t\t\t! next ||\n\t\t\t\t\tnext.width === 'full' ||\n\t\t\t\t\tnext.width === 'fill'\n\t\t\t\t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tconst nextW = widths[ j ];\n\t\t\t\tif ( 1 + reserved + nextW <= runLength ) {\n\t\t\t\t\treserved += nextW;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst fillCols = Math.max( 1, runLength - reserved );\n\t\t\tresolved.set( item.key, fillCols );\n\t\t\tfor ( let k = 0; k < fillCols; k++ ) {\n\t\t\t\trowOccupancy[ fillStartCol + k ] = fillStartRow + h;\n\t\t\t}\n\t\t\tcursorRow = fillStartRow;\n\t\t\tcursorCol = fillStartCol + fillCols;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst w = widths[ i ];\n\t\tlet r = cursorRow;\n\t\tlet c = cursorCol;\n\t\tplace: for ( ; r <= totalRows; r++ ) {\n\t\t\tc = r === cursorRow ? cursorCol : 0;\n\t\t\twhile ( c + w <= maxColumns ) {\n\t\t\t\tlet blocked = -1;\n\t\t\t\tfor ( let k = 0; k < w; k++ ) {\n\t\t\t\t\tif ( rowOccupancy[ c + k ] > r ) {\n\t\t\t\t\t\tblocked = c + k;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif ( blocked === -1 ) {\n\t\t\t\t\tbreak place;\n\t\t\t\t}\n\t\t\t\tc = blocked + 1;\n\t\t\t}\n\t\t}\n\t\tfor ( let k = 0; k < w; k++ ) {\n\t\t\trowOccupancy[ c + k ] = r + h;\n\t\t}\n\t\tcursorRow = r;\n\t\tcursorCol = c + w;\n\t}\n\n\treturn resolved;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["r", "c"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
|
|
16
|
+
// packages/grid/src/dashboard-grid/types.ts
|
|
17
|
+
var types_exports = {};
|
|
18
|
+
module.exports = __toCommonJS(types_exports);
|
|
19
|
+
//# sourceMappingURL=types.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/dashboard-grid/types.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Internal dependencies\n */\nimport type {\n\tDragPreviewRenderProps,\n\tGridOverlayRenderProps,\n\tResizeDelta,\n\tResizeHandleRenderProps,\n} from '../shared/types';\nimport type { ResizeSnapSize } from '../shared/resize-snap';\n\n/**\n * Dashboard grid layout item definition.\n *\n * `width` accepts either a numeric column span or a discriminated string:\n * - `number` spans that many columns (clamped to the grid's column count).\n * - `'fill'` spans the remaining columns in the current row.\n * - `'full'` spans all columns (`grid-column: 1 / -1`).\n */\nexport type DashboardGridLayoutItem = {\n\t/**\n\t * Unique key that matches a child component key.\n\t */\n\tkey: string;\n\n\t/**\n\t * Number of columns this item spans, or a string discriminator\n\t * (`'fill'` or `'full'`).\n\t */\n\twidth?: number | 'fill' | 'full';\n\n\t/**\n\t * Number of rows this item spans.\n\t *\n\t * @default 1\n\t */\n\theight?: number;\n\n\t/**\n\t * Display order for the item. Lower values render first. When\n\t * omitted, the item falls back to its index in the `layout` array.\n\t */\n\torder?: number;\n};\n\n/**\n * Props for the internal `<GridItem />` wrapper.\n */\nexport type GridItemProps = {\n\t/**\n\t * The layout item containing grid positioning information.\n\t */\n\titem: DashboardGridLayoutItem;\n\n\t/**\n\t * The maximum number of columns in the grid.\n\t */\n\tmaxColumns: number;\n\n\t/**\n\t * Whether drag and resize interactions are disabled.\n\t *\n\t * @default false\n\t */\n\tdisabled?: boolean;\n\n\t/**\n\t * Whether the item can be resized vertically. Disabled when the\n\t * grid uses `rowHeight: 'auto'`, where row height is driven by\n\t * content rather than by the user.\n\t *\n\t * @default true\n\t */\n\tverticalResizable?: boolean;\n\n\t/**\n\t * Whether any tile in the grid is currently being dragged or\n\t * resized. Drives the drag activator cursor.\n\t *\n\t * @default false\n\t */\n\tinteracting?: boolean;\n\n\t/**\n\t * Whether a tile drag is in progress. Mutes each tile's\n\t * `actionableArea` with `inert` so hovers on other tiles' controls\n\t * do not steal the gesture.\n\t *\n\t * @default false\n\t */\n\tdragging?: boolean;\n\n\t/**\n\t * The content to be displayed within the grid item.\n\t */\n\tchildren: React.ReactNode;\n\n\t/**\n\t * Content rendered above the draggable area that stays interactive\n\t * in edit mode, typically action buttons, menus, or links. While\n\t * a tile drag is in progress, this content is set `inert` so hovers\n\t * on other tiles can't steal the gesture. During resize, visibility\n\t * is controlled by grid-level CSS hooks.\n\t */\n\tactionableArea?: React.ReactNode;\n\n\t/**\n\t * Callback fired while the item is being resized. Receives the\n\t * item's `key` plus the cursor offset from the gesture start in\n\t * pixels. The grid derives snapped spans from the delta and passes\n\t * them back through `resizeSnapPreview`.\n\t */\n\tonResize: ( id: string, delta: ResizeDelta ) => void;\n\n\t/**\n\t * Snapped grid size in pixels for the resize-preview outline. The\n\t * tile content resizes continuously with the cursor; this outline\n\t * shows the span the layout will commit to on release.\n\t */\n\tresizeSnapPreview?: ResizeSnapSize | null;\n\n\t/**\n\t * Minimum tile width while resizing, in pixels (one column track).\n\t */\n\tminResizeWidthPx: number;\n\n\t/**\n\t * Minimum tile height while resizing, in pixels (one row track).\n\t * Omitted when vertical resize is disabled.\n\t */\n\tminResizeHeightPx?: number;\n\n\t/**\n\t * Callback fired when the resize gesture ends.\n\t */\n\tonResizeEnd: () => void;\n\n\t/**\n\t * Component forwarded to `<ResizeHandle />` to override the default\n\t * corner triangle. See `DashboardGridProps.renderResizeHandle`.\n\t */\n\trenderResizeHandle?: React.ComponentType< ResizeHandleRenderProps >;\n};\n\n/**\n * Props for `DashboardGrid`. Extends the standard div props so consumers\n * can pass `id`, `aria-*`, `data-*`, event handlers, etc., directly on\n * the grid root.\n *\n * `columns` and `minColumnWidth` compose as a layered model:\n * - `columns` alone: fixed N columns; each tile scales with the container.\n * - `minColumnWidth` alone: column count derives from container width,\n * floored by the per-tile minimum, down to 1 column.\n * - Both together: `columns` caps the count, `minColumnWidth` enforces a\n * per-tile width floor that can reduce the count below the cap on\n * narrow containers (\"up to N columns, but never narrower than W px\").\n */\nexport interface DashboardGridProps\n\textends Omit<\n\t\tReact.ComponentPropsWithoutRef< 'div' >,\n\t\t'children' | 'className' | 'style'\n\t> {\n\t/**\n\t * Array of layout items.\n\t */\n\tlayout: DashboardGridLayoutItem[];\n\n\t/**\n\t * Grid children. Each child must carry a `key` that matches an\n\t * entry in `layout`; children without a match render at the end\n\t * of the grid without explicit placement and fall through CSS\n\t * Grid's auto-flow.\n\t */\n\tchildren: React.ReactNode;\n\n\t/**\n\t * Additional CSS class on the grid root.\n\t */\n\tclassName?: string;\n\n\t/**\n\t * Inline styles applied to the grid root. Merged underneath the\n\t * grid's own layout styles, so the layout (`gridTemplateColumns`,\n\t * `gridAutoRows`) always wins. The gap between tiles is owned by\n\t * the design-system gap token and is not configurable per\n\t * instance; override it via a theme or density change.\n\t */\n\tstyle?: React.CSSProperties;\n\n\t/**\n\t * Height of each row in pixels, or `'auto'` to let the tallest\n\t * tile in the row size it.\n\t *\n\t * @default 'auto'\n\t */\n\trowHeight?: number | 'auto';\n\n\t/**\n\t * Whether the grid is in edit mode (allows dragging and\n\t * repositioning items).\n\t *\n\t * @default false\n\t */\n\teditMode?: boolean;\n\n\t/**\n\t * Callback fired when the user commits a drag or resize. Receives\n\t * the resulting layout.\n\t */\n\tonChangeLayout?: ( newLayout: DashboardGridLayoutItem[] ) => void;\n\n\t/**\n\t * Callback fired continuously during a drag or resize interaction\n\t * with the in-progress layout. Useful for live feedback in the\n\t * surface (e.g., displaying the current width/position). The final\n\t * committed layout is still emitted via `onChangeLayout`.\n\t */\n\tonPreviewLayout?: ( previewLayout: DashboardGridLayoutItem[] ) => void;\n\n\t/**\n\t * Override the default corner-triangle resize handle with a custom\n\t * component. The grid still owns the gesture (dnd-kit `<DndContext>`,\n\t * throttled delta loop) and passes the wiring to the consumer:\n\t * spread `listeners` and `attributes` and assign `ref` on the\n\t * element that should receive the gesture. Use `disabled` and\n\t * `verticalResizable` to adapt the visual to context.\n\t */\n\trenderResizeHandle?: React.ComponentType< ResizeHandleRenderProps >;\n\n\t/**\n\t * Custom wrapper for the dragged-clone visual mounted inside\n\t * `<DragOverlay>`. The surface always wraps the clone with a thin\n\t * functional frame (lift scale, grabbing cursor, pointer pass-\n\t * through) and mounts this component inside it; the consumer\n\t * owns the visual chrome (shadow, radius, padding).\n\t *\n\t * When omitted, the cloned children render directly inside the\n\t * functional frame so any chrome the consumer applied to the\n\t * persistent tile carries through unchanged.\n\t *\n\t * Token-only adjustments (lift scale, placeholder opacity,\n\t * outline color, placeholder radius) flow through CSS custom\n\t * properties documented in the README.\n\t */\n\trenderDragPreview?: React.ComponentType< DragPreviewRenderProps >;\n\n\t/**\n\t * Override the default edit-mode overlay (row-marker tiles per\n\t * column) with a custom component. The grid supplies the resolved\n\t * column count, row height, and row count; the consumer is\n\t * responsible for the visual.\n\t *\n\t * The overlay only renders when `editMode` is true. When omitted,\n\t * the package's default visual is used.\n\t */\n\trenderGridOverlay?: React.ComponentType< GridOverlayRenderProps >;\n\n\t/**\n\t * Target column count, used as a cap. Defaults to six when neither\n\t * `columns` nor `minColumnWidth` is set; with `minColumnWidth` set\n\t * it can resolve lower on narrow containers.\n\t */\n\tcolumns?: number;\n\n\t/**\n\t * Per-tile minimum width in pixels. Enables responsive mode: the\n\t * column count derives from container width, floored by this value,\n\t * down to 1.\n\t */\n\tminColumnWidth?: number;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|