react-grid-layout 2.2.0 → 2.2.2
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/README.md +14 -55
- package/dist/{ResponsiveGridLayout-BkHF9YHa.d.mts → ResponsiveGridLayout-DqK__izz.d.mts} +1 -1
- package/dist/{ResponsiveGridLayout-CLn16-X3.d.ts → ResponsiveGridLayout-MbDNfJ8M.d.ts} +1 -1
- package/dist/{calculate-DsVTldEE.d.ts → calculate-9RxGrt-U.d.ts} +1 -1
- package/dist/{calculate-DwbL1D06.d.mts → calculate-FbCWy8x1.d.mts} +1 -1
- package/dist/{chunk-2TEFHZC4.js → chunk-2DDROKB2.js} +10 -153
- package/dist/chunk-2DDROKB2.js.map +1 -0
- package/dist/{chunk-NQUM7RXX.js → chunk-KEM2G3LX.js} +71 -52
- package/dist/chunk-KEM2G3LX.js.map +1 -0
- package/dist/chunk-PBQSHIID.js +4 -0
- package/dist/{chunk-7ELO5FRW.js.map → chunk-PBQSHIID.js.map} +1 -1
- package/dist/{chunk-43GDBEG4.js → chunk-QGXQSZII.js} +34 -39
- package/dist/chunk-QGXQSZII.js.map +1 -0
- package/dist/{chunk-OWK47QTG.mjs → chunk-XM2M6TC6.mjs} +41 -22
- package/dist/chunk-XM2M6TC6.mjs.map +1 -0
- package/dist/{chunk-OH26KG7Y.mjs → chunk-XYPIYYYQ.mjs} +12 -153
- package/dist/chunk-XYPIYYYQ.mjs.map +1 -0
- package/dist/{chunk-MUNIXYTV.mjs → chunk-YFVX5RDK.mjs} +27 -32
- package/dist/chunk-YFVX5RDK.mjs.map +1 -0
- package/dist/chunk-ZWN22PS2.mjs +3 -0
- package/dist/{chunk-526JND3R.mjs.map → chunk-ZWN22PS2.mjs.map} +1 -1
- package/dist/core.d.mts +6 -32
- package/dist/core.d.ts +6 -32
- package/dist/core.js +41 -49
- package/dist/core.mjs +2 -2
- package/dist/extras.d.mts +2 -2
- package/dist/extras.d.ts +2 -2
- package/dist/extras.js +0 -72
- package/dist/extras.js.map +1 -1
- package/dist/extras.mjs +0 -72
- package/dist/extras.mjs.map +1 -1
- package/dist/index.d.mts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +24 -24
- package/dist/index.mjs +4 -4
- package/dist/legacy.d.mts +2 -2
- package/dist/legacy.d.ts +2 -2
- package/dist/legacy.js +13 -13
- package/dist/legacy.mjs +2 -2
- package/dist/{position-CXNzFxI0.d.mts → position-CetgOHhD.d.mts} +1 -1
- package/dist/{position-Dk0FRWA9.d.ts → position-DhZqWO1-.d.ts} +1 -1
- package/dist/react.d.mts +11 -14
- package/dist/react.d.ts +11 -14
- package/dist/react.js +18 -18
- package/dist/react.mjs +4 -4
- package/dist/{responsive-BB5d98xz.d.mts → responsive-DLRtE8v8.d.ts} +3 -3
- package/dist/{responsive-BXI-GCXG.d.ts → responsive-T0N0GmBB.d.mts} +3 -3
- package/dist/{types-CokovIMH.d.mts → types-BiXsdXr7.d.mts} +5 -16
- package/dist/{types-CokovIMH.d.ts → types-BiXsdXr7.d.ts} +5 -16
- package/index-dev.js +2 -3
- package/package.json +1 -1
- package/dist/chunk-2TEFHZC4.js.map +0 -1
- package/dist/chunk-43GDBEG4.js.map +0 -1
- package/dist/chunk-526JND3R.mjs +0 -3
- package/dist/chunk-7ELO5FRW.js +0 -4
- package/dist/chunk-MUNIXYTV.mjs.map +0 -1
- package/dist/chunk-NQUM7RXX.js.map +0 -1
- package/dist/chunk-OH26KG7Y.mjs.map +0 -1
- package/dist/chunk-OWK47QTG.mjs.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defaultConstraints, setTransform, setTopLeft, perc, applyPositionConstraints, resizeItemInDirection, applySizeConstraints, defaultPositionStrategy, defaultGridConfig, defaultDragConfig, defaultResizeConfig, defaultDropConfig, getCompactor, getBreakpointFromWidth, getColsFromBreakpoint, findOrGenerateResponsiveLayout,
|
|
1
|
+
import { defaultConstraints, setTransform, setTopLeft, perc, applyPositionConstraints, resizeItemInDirection, applySizeConstraints, defaultPositionStrategy, defaultGridConfig, defaultDragConfig, defaultResizeConfig, defaultDropConfig, getCompactor, getBreakpointFromWidth, getColsFromBreakpoint, findOrGenerateResponsiveLayout, getIndentationValue } from './chunk-XYPIYYYQ.mjs';
|
|
2
2
|
import { calcXYRaw, calcGridItemWHPx, clamp, calcGridColWidth, calcWHRaw, calcGridItemPosition, bottom, getLayoutItem, cloneLayoutItem, moveElement, withLayoutItem, getAllCollisions, calcXY, cloneLayout, correctBounds } from './chunk-AWM66AWF.mjs';
|
|
3
3
|
import React2, { useState, useRef, useMemo, useCallback, useEffect } from 'react';
|
|
4
4
|
import { DraggableCore } from 'react-draggable';
|
|
@@ -66,6 +66,8 @@ function GridItem(props) {
|
|
|
66
66
|
);
|
|
67
67
|
const layoutRef = useRef(layout);
|
|
68
68
|
layoutRef.current = layout;
|
|
69
|
+
const onDragStartRef = useRef(null);
|
|
70
|
+
const onDragRef = useRef(null);
|
|
69
71
|
const dragPendingRef = useRef(false);
|
|
70
72
|
const initialDragClientRef = useRef({ x: 0, y: 0 });
|
|
71
73
|
const thresholdExceededRef = useRef(false);
|
|
@@ -324,6 +326,8 @@ function GridItem(props) {
|
|
|
324
326
|
i
|
|
325
327
|
]
|
|
326
328
|
);
|
|
329
|
+
onDragStartRef.current = onDragStart;
|
|
330
|
+
onDragRef.current = onDrag;
|
|
327
331
|
const onResizeHandler = useCallback(
|
|
328
332
|
(e, { node, size, handle: resizeHandle2 }, position, handlerName) => {
|
|
329
333
|
const handler = handlerName === "onResizeStart" ? onResizeStartProp : handlerName === "onResize" ? onResizeProp : onResizeStopProp;
|
|
@@ -431,7 +435,10 @@ function GridItem(props) {
|
|
|
431
435
|
x: droppingPosition.left,
|
|
432
436
|
y: droppingPosition.top
|
|
433
437
|
};
|
|
434
|
-
|
|
438
|
+
onDragStartRef.current?.(
|
|
439
|
+
droppingPosition.e,
|
|
440
|
+
fakeData
|
|
441
|
+
);
|
|
435
442
|
} else if (shouldDrag) {
|
|
436
443
|
const deltaX = droppingPosition.left - dragPositionRef.current.left;
|
|
437
444
|
const deltaY = droppingPosition.top - dragPositionRef.current.top;
|
|
@@ -444,10 +451,13 @@ function GridItem(props) {
|
|
|
444
451
|
x: droppingPosition.left,
|
|
445
452
|
y: droppingPosition.top
|
|
446
453
|
};
|
|
447
|
-
|
|
454
|
+
onDragRef.current?.(
|
|
455
|
+
droppingPosition.e,
|
|
456
|
+
fakeData
|
|
457
|
+
);
|
|
448
458
|
}
|
|
449
459
|
prevDroppingPositionRef.current = droppingPosition;
|
|
450
|
-
}, [droppingPosition, dragging,
|
|
460
|
+
}, [droppingPosition, dragging, i]);
|
|
451
461
|
const pos = calcGridItemPosition(
|
|
452
462
|
positionParams,
|
|
453
463
|
x,
|
|
@@ -701,7 +711,9 @@ function GridLayout(props) {
|
|
|
701
711
|
cols,
|
|
702
712
|
compactor
|
|
703
713
|
);
|
|
704
|
-
|
|
714
|
+
if (!deepEqual(newLayout, layout)) {
|
|
715
|
+
setLayout(newLayout);
|
|
716
|
+
}
|
|
705
717
|
}
|
|
706
718
|
prevPropsLayoutRef.current = propsLayout;
|
|
707
719
|
prevChildrenRef.current = children;
|
|
@@ -719,9 +731,10 @@ function GridLayout(props) {
|
|
|
719
731
|
useEffect(() => {
|
|
720
732
|
if (!activeDrag && !deepEqual(layout, prevLayoutRef.current)) {
|
|
721
733
|
prevLayoutRef.current = layout;
|
|
722
|
-
|
|
734
|
+
const publicLayout = layout.filter((l) => l.i !== droppingItem.i);
|
|
735
|
+
onLayoutChange(publicLayout);
|
|
723
736
|
}
|
|
724
|
-
}, [layout, activeDrag, onLayoutChange]);
|
|
737
|
+
}, [layout, activeDrag, onLayoutChange, droppingItem.i]);
|
|
725
738
|
const containerHeight = useMemo(() => {
|
|
726
739
|
if (!autoSize) return void 0;
|
|
727
740
|
const nbRow = bottom(layout);
|
|
@@ -937,6 +950,13 @@ function GridLayout(props) {
|
|
|
937
950
|
);
|
|
938
951
|
const removeDroppingPlaceholder = useCallback(() => {
|
|
939
952
|
const currentLayout = layoutRef.current;
|
|
953
|
+
const hasDroppingItem = currentLayout.some((l) => l.i === droppingItem.i);
|
|
954
|
+
if (!hasDroppingItem) {
|
|
955
|
+
setDroppingDOMNode(null);
|
|
956
|
+
setActiveDrag(null);
|
|
957
|
+
setDroppingPosition(void 0);
|
|
958
|
+
return;
|
|
959
|
+
}
|
|
940
960
|
const newLayout = compactor.compact(
|
|
941
961
|
currentLayout.filter((l) => l.i !== droppingItem.i),
|
|
942
962
|
cols
|
|
@@ -1047,6 +1067,9 @@ function GridLayout(props) {
|
|
|
1047
1067
|
e.preventDefault();
|
|
1048
1068
|
e.stopPropagation();
|
|
1049
1069
|
dragEnterCounterRef.current--;
|
|
1070
|
+
if (dragEnterCounterRef.current < 0) {
|
|
1071
|
+
dragEnterCounterRef.current = 0;
|
|
1072
|
+
}
|
|
1050
1073
|
if (dragEnterCounterRef.current === 0) {
|
|
1051
1074
|
removeDroppingPlaceholder();
|
|
1052
1075
|
}
|
|
@@ -1226,7 +1249,7 @@ var DEFAULT_COLS = {
|
|
|
1226
1249
|
};
|
|
1227
1250
|
var noop2 = () => {
|
|
1228
1251
|
};
|
|
1229
|
-
function synchronizeLayoutWithChildren2(initialLayout, children, cols,
|
|
1252
|
+
function synchronizeLayoutWithChildren2(initialLayout, children, cols, compactor) {
|
|
1230
1253
|
const layout = [];
|
|
1231
1254
|
React2.Children.forEach(children, (child) => {
|
|
1232
1255
|
if (!React2.isValidElement(child) || child.key === null) return;
|
|
@@ -1269,7 +1292,7 @@ function synchronizeLayoutWithChildren2(initialLayout, children, cols, compactTy
|
|
|
1269
1292
|
}
|
|
1270
1293
|
});
|
|
1271
1294
|
const corrected = correctBounds(layout, { cols });
|
|
1272
|
-
return compact(corrected,
|
|
1295
|
+
return compactor.compact(corrected, cols);
|
|
1273
1296
|
}
|
|
1274
1297
|
function ResponsiveGridLayout(props) {
|
|
1275
1298
|
const {
|
|
@@ -1330,11 +1353,11 @@ function ResponsiveGridLayout(props) {
|
|
|
1330
1353
|
breakpoint,
|
|
1331
1354
|
breakpoint,
|
|
1332
1355
|
cols,
|
|
1333
|
-
|
|
1356
|
+
compactor
|
|
1334
1357
|
);
|
|
1335
1358
|
}
|
|
1336
1359
|
return null;
|
|
1337
|
-
}, [propsLayouts, breakpoints, breakpoint, cols,
|
|
1360
|
+
}, [propsLayouts, breakpoints, breakpoint, cols, compactor]);
|
|
1338
1361
|
const effectiveLayout = derivedLayout ?? layout;
|
|
1339
1362
|
useEffect(() => {
|
|
1340
1363
|
if (derivedLayout !== null) {
|
|
@@ -1346,12 +1369,7 @@ function ResponsiveGridLayout(props) {
|
|
|
1346
1369
|
}, [derivedLayout, propsLayouts]);
|
|
1347
1370
|
useEffect(() => {
|
|
1348
1371
|
if (compactType !== prevCompactTypeRef.current) {
|
|
1349
|
-
const newLayout = compact(
|
|
1350
|
-
cloneLayout(effectiveLayout),
|
|
1351
|
-
compactType,
|
|
1352
|
-
cols,
|
|
1353
|
-
allowOverlap
|
|
1354
|
-
);
|
|
1372
|
+
const newLayout = compactor.compact(cloneLayout(effectiveLayout), cols);
|
|
1355
1373
|
const newLayouts = {
|
|
1356
1374
|
...layoutsRef.current,
|
|
1357
1375
|
[breakpoint]: newLayout
|
|
@@ -1364,6 +1382,7 @@ function ResponsiveGridLayout(props) {
|
|
|
1364
1382
|
}
|
|
1365
1383
|
}, [
|
|
1366
1384
|
compactType,
|
|
1385
|
+
compactor,
|
|
1367
1386
|
effectiveLayout,
|
|
1368
1387
|
cols,
|
|
1369
1388
|
allowOverlap,
|
|
@@ -1393,14 +1412,13 @@ function ResponsiveGridLayout(props) {
|
|
|
1393
1412
|
newBreakpoint,
|
|
1394
1413
|
lastBreakpoint,
|
|
1395
1414
|
newCols,
|
|
1396
|
-
|
|
1415
|
+
compactor
|
|
1397
1416
|
);
|
|
1398
1417
|
newLayout = synchronizeLayoutWithChildren2(
|
|
1399
1418
|
newLayout,
|
|
1400
1419
|
children,
|
|
1401
1420
|
newCols,
|
|
1402
|
-
|
|
1403
|
-
allowOverlap
|
|
1421
|
+
compactor
|
|
1404
1422
|
);
|
|
1405
1423
|
newLayouts[newBreakpoint] = newLayout;
|
|
1406
1424
|
setBreakpoint(newBreakpoint);
|
|
@@ -1434,6 +1452,7 @@ function ResponsiveGridLayout(props) {
|
|
|
1434
1452
|
cols,
|
|
1435
1453
|
layout,
|
|
1436
1454
|
children,
|
|
1455
|
+
compactor,
|
|
1437
1456
|
compactType,
|
|
1438
1457
|
allowOverlap,
|
|
1439
1458
|
propMargin,
|
|
@@ -1494,5 +1513,5 @@ function ResponsiveGridLayout(props) {
|
|
|
1494
1513
|
}
|
|
1495
1514
|
|
|
1496
1515
|
export { GridItem, GridLayout, ResponsiveGridLayout };
|
|
1497
|
-
//# sourceMappingURL=chunk-
|
|
1498
|
-
//# sourceMappingURL=chunk-
|
|
1516
|
+
//# sourceMappingURL=chunk-XM2M6TC6.mjs.map
|
|
1517
|
+
//# sourceMappingURL=chunk-XM2M6TC6.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/react/components/GridItem.tsx","../src/react/components/GridLayout.tsx","../src/react/components/ResponsiveGridLayout.tsx"],"names":["pos","rawPos","resizeHandle","React","useMemo","useState","useRef","useEffect","useCallback","jsx","clsx","noop","synchronizeLayoutWithChildren","deepEqual","currentMargin"],"mappings":"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","file":"chunk-XM2M6TC6.mjs","sourcesContent":["/**\n * GridItem component\n *\n * An individual item within a grid layout. Handles dragging and resizing.\n */\n\nimport React, {\n useRef,\n useState,\n useCallback,\n useEffect,\n useMemo,\n type ReactElement,\n type CSSProperties\n} from \"react\";\nimport { DraggableCore, type DraggableEventHandler } from \"react-draggable\";\nimport { Resizable } from \"react-resizable\";\nimport clsx from \"clsx\";\n\nimport type {\n Position,\n DroppingPosition,\n ResizeHandleAxis,\n GridDragEvent,\n GridResizeEvent,\n LayoutConstraint,\n ConstraintContext,\n Layout,\n LayoutItem as LayoutItemType,\n PositionStrategy\n} from \"../../core/types.js\";\nimport type { PositionParams } from \"../../core/calculate.js\";\nimport {\n calcGridItemPosition,\n calcGridItemWHPx,\n calcGridColWidth,\n calcXYRaw,\n calcWHRaw,\n clamp\n} from \"../../core/calculate.js\";\nimport {\n applyPositionConstraints,\n applySizeConstraints,\n defaultConstraints\n} from \"../../core/constraints.js\";\nimport {\n setTransform,\n setTopLeft,\n perc,\n resizeItemInDirection\n} from \"../../core/position.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\ntype PartialPosition = { top: number; left: number };\n\nexport type GridItemCallback<Data extends GridDragEvent | GridResizeEvent> = (\n i: string,\n w: number,\n h: number,\n data: Data\n) => void;\n\nexport type ResizeHandle =\n | ReactElement\n | ((\n resizeHandleAxis: ResizeHandleAxis,\n ref: React.Ref<HTMLElement>\n ) => ReactElement);\n\n// Internal callback data type with typed handle\ninterface ResizeCallbackData {\n node: HTMLElement;\n size: { width: number; height: number };\n handle: ResizeHandleAxis;\n}\n\n// react-resizable callback type (handle is string)\ntype ReactResizableCallback = (\n e: React.SyntheticEvent,\n data: {\n node: HTMLElement;\n size: { width: number; height: number };\n handle: string;\n }\n) => void;\n\nexport interface GridItemProps {\n /** Child element to render */\n children: ReactElement;\n /** Number of columns in the grid */\n cols: number;\n /** Width of the container in pixels */\n containerWidth: number;\n /** Margin between items [x, y] */\n margin: readonly [number, number];\n /** Padding inside the container [x, y] */\n containerPadding: readonly [number, number];\n /** Height of each row in pixels */\n rowHeight: number;\n /** Maximum number of rows */\n maxRows: number;\n /** Whether the item can be dragged */\n isDraggable: boolean;\n /** Whether the item can be resized */\n isResizable: boolean;\n /** Whether the item is bounded within the container */\n isBounded: boolean;\n /** Whether the item is static (can't be moved/resized) */\n static?: boolean;\n /** Use CSS transforms instead of top/left */\n useCSSTransforms?: boolean;\n /** Use percentage widths for server rendering */\n usePercentages?: boolean;\n /** Scale factor for transforms */\n transformScale?: number;\n /** Position strategy for custom positioning (#2217) */\n positionStrategy?: PositionStrategy;\n /** Drag threshold in pixels before drag starts (#2217) */\n dragThreshold?: number;\n /** Current position of a dropping element */\n droppingPosition?: DroppingPosition;\n\n /** Additional class name */\n className?: string;\n /** Additional styles */\n style?: CSSProperties;\n\n /** CSS selector for draggable handle */\n handle?: string;\n /** CSS selector for cancel handle */\n cancel?: string;\n\n /** X position in grid units */\n x: number;\n /** Y position in grid units */\n y: number;\n /** Width in grid units */\n w: number;\n /** Height in grid units */\n h: number;\n\n /** Minimum width in grid units */\n minW?: number;\n /** Maximum width in grid units */\n maxW?: number;\n /** Minimum height in grid units */\n minH?: number;\n /** Maximum height in grid units */\n maxH?: number;\n\n /** Unique identifier */\n i: string;\n\n /** Which resize handles to show */\n resizeHandles?: ResizeHandleAxis[];\n /** Custom resize handle */\n resizeHandle?: ResizeHandle;\n\n /** Layout constraints for position/size limiting */\n constraints?: LayoutConstraint[];\n\n /** The layout item data (for per-item constraints) */\n layoutItem?: LayoutItemType;\n\n /** Current layout (for constraint context) */\n layout?: Layout;\n\n /** Called when drag starts */\n onDragStart?: GridItemCallback<GridDragEvent>;\n /** Called during drag */\n onDrag?: GridItemCallback<GridDragEvent>;\n /** Called when drag stops */\n onDragStop?: GridItemCallback<GridDragEvent>;\n /** Called when resize starts */\n onResizeStart?: GridItemCallback<GridResizeEvent>;\n /** Called during resize */\n onResize?: GridItemCallback<GridResizeEvent>;\n /** Called when resize stops */\n onResizeStop?: GridItemCallback<GridResizeEvent>;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * GridItem - An individual item within a grid layout.\n *\n * Wraps a child element with drag and resize functionality.\n */\nexport function GridItem(props: GridItemProps): ReactElement {\n const {\n children,\n cols,\n containerWidth,\n margin,\n containerPadding,\n rowHeight,\n maxRows,\n isDraggable,\n isResizable,\n isBounded,\n static: isStatic,\n useCSSTransforms = true,\n usePercentages = false,\n transformScale = 1,\n positionStrategy,\n dragThreshold = 0,\n droppingPosition,\n className = \"\",\n style,\n handle = \"\",\n cancel = \"\",\n x,\n y,\n w,\n h,\n minW = 1,\n maxW = Infinity,\n minH = 1,\n maxH = Infinity,\n i,\n resizeHandles,\n resizeHandle,\n constraints = defaultConstraints,\n layoutItem,\n layout = [],\n onDragStart: onDragStartProp,\n onDrag: onDragProp,\n onDragStop: onDragStopProp,\n onResizeStart: onResizeStartProp,\n onResize: onResizeProp,\n onResizeStop: onResizeStopProp\n } = props;\n\n // State\n const [dragging, setDragging] = useState(false);\n const [resizing, setResizing] = useState(false);\n\n // Refs for position tracking (avoid state for React 18 batching)\n const elementRef = useRef<HTMLDivElement>(null);\n const dragPositionRef = useRef<PartialPosition>({ left: 0, top: 0 });\n const resizePositionRef = useRef<Position>({\n top: 0,\n left: 0,\n width: 0,\n height: 0\n });\n\n // Previous dropping position for comparison\n const prevDroppingPositionRef = useRef<DroppingPosition | undefined>(\n undefined\n );\n\n // Ref to current layout - Critical for preventing infinite update loops (#2210).\n // The dropping item effect depends on onDrag, which needs layout for constraints.\n // If we included layout directly, onDrag would be recreated on every layout change,\n // causing the effect to re-run and update layout again, creating an infinite loop.\n const layoutRef = useRef<Layout>(layout);\n layoutRef.current = layout;\n\n // Refs to callbacks for use in dropping item effect (#2210).\n // The dropping item effect must NOT depend on onDragStart/onDrag callbacks because:\n // 1. When dragging state changes, onDrag callback is recreated\n // 2. When layout changes, effectiveLayoutItem changes, causing callbacks to recreate\n // Using refs allows us to call the latest callback without the effect re-running.\n const onDragStartRef = useRef<DraggableEventHandler | null>(null);\n const onDragRef = useRef<DraggableEventHandler | null>(null);\n\n // Drag threshold tracking (#2217)\n // Tracks whether we're waiting to exceed the threshold before starting the drag\n const dragPendingRef = useRef(false);\n const initialDragClientRef = useRef<{ x: number; y: number }>({ x: 0, y: 0 });\n const thresholdExceededRef = useRef(false);\n\n // Position parameters\n const positionParams: PositionParams = useMemo(\n () => ({\n cols,\n containerPadding: containerPadding as [number, number],\n containerWidth,\n margin: margin as [number, number],\n maxRows,\n rowHeight\n }),\n [cols, containerPadding, containerWidth, margin, maxRows, rowHeight]\n );\n\n // Constraint context for applying constraints\n // Note: This does NOT include layout in its dependencies to prevent infinite loops (#2210).\n // The layout is accessed via layoutRef.current inside the callbacks that use this context.\n const constraintContext: ConstraintContext = useMemo(\n () => ({\n cols,\n maxRows,\n containerWidth,\n containerHeight: 0, // Auto-height grids don't have a fixed container height\n rowHeight,\n margin,\n // Use empty layout here - the actual layout will be accessed via layoutRef when needed\n // This prevents the context from changing when layout changes, avoiding callback recreation\n layout: []\n }),\n [cols, maxRows, containerWidth, rowHeight, margin]\n );\n\n // Create a getter for constraint context with current layout\n // This is called inside callbacks to get fresh layout data without causing re-renders\n const getConstraintContext = useCallback(\n (): ConstraintContext => ({\n ...constraintContext,\n layout: layoutRef.current\n }),\n [constraintContext]\n );\n\n // Effective layout item (use provided or create from props)\n const effectiveLayoutItem: LayoutItemType = useMemo(\n () =>\n layoutItem ?? {\n i,\n x,\n y,\n w,\n h,\n minW,\n maxW,\n minH,\n maxH\n },\n [layoutItem, i, x, y, w, h, minW, maxW, minH, maxH]\n );\n\n // ============================================================================\n // Style Creation\n // ============================================================================\n\n const createStyle = useCallback(\n (pos: Position): CSSProperties => {\n // Use custom positionStrategy.calcStyle() if provided (#2217)\n if (positionStrategy?.calcStyle) {\n return positionStrategy.calcStyle(pos);\n }\n\n // Default positioning based on useCSSTransforms\n if (useCSSTransforms) {\n return setTransform(pos) as CSSProperties;\n }\n\n const styleObj = setTopLeft(pos) as CSSProperties;\n\n if (usePercentages) {\n return {\n ...styleObj,\n left: perc(pos.left / containerWidth),\n width: perc(pos.width / containerWidth)\n };\n }\n\n return styleObj;\n },\n [positionStrategy, useCSSTransforms, usePercentages, containerWidth]\n );\n\n // ============================================================================\n // Drag Handlers\n // ============================================================================\n\n const onDragStart: DraggableEventHandler = useCallback(\n (e, { node }) => {\n if (!onDragStartProp) return;\n\n const { offsetParent } = node;\n if (!offsetParent) return;\n\n const parentRect = offsetParent.getBoundingClientRect();\n const clientRect = node.getBoundingClientRect();\n\n const cLeft = clientRect.left / transformScale;\n const pLeft = parentRect.left / transformScale;\n const cTop = clientRect.top / transformScale;\n const pTop = parentRect.top / transformScale;\n\n // Use custom positionStrategy.calcDragPosition() if provided (#2217)\n let newPosition: PartialPosition;\n if (positionStrategy?.calcDragPosition) {\n const mouseEvent = e as unknown as MouseEvent;\n newPosition = positionStrategy.calcDragPosition(\n mouseEvent.clientX,\n mouseEvent.clientY,\n mouseEvent.clientX - clientRect.left,\n mouseEvent.clientY - clientRect.top\n );\n } else {\n newPosition = {\n left: cLeft - pLeft + offsetParent.scrollLeft,\n top: cTop - pTop + offsetParent.scrollTop\n };\n }\n\n dragPositionRef.current = newPosition;\n\n // Threshold support (#2217) - if threshold is set, delay calling onDragStartProp\n // until the mouse has moved at least `dragThreshold` pixels\n if (dragThreshold > 0) {\n const mouseEvent = e as unknown as MouseEvent;\n initialDragClientRef.current = {\n x: mouseEvent.clientX,\n y: mouseEvent.clientY\n };\n dragPendingRef.current = true;\n thresholdExceededRef.current = false;\n setDragging(true);\n return; // Don't call onDragStartProp yet\n }\n\n setDragging(true);\n\n // Calculate raw position and apply constraints\n const rawPos = calcXYRaw(\n positionParams,\n newPosition.top,\n newPosition.left\n );\n const { x: newX, y: newY } = applyPositionConstraints(\n constraints,\n effectiveLayoutItem,\n rawPos.x,\n rawPos.y,\n getConstraintContext()\n );\n\n onDragStartProp(i, newX, newY, {\n e: e as unknown as Event,\n node,\n newPosition\n });\n },\n [\n onDragStartProp,\n transformScale,\n positionParams,\n positionStrategy,\n dragThreshold,\n constraints,\n effectiveLayoutItem,\n getConstraintContext,\n i\n ]\n );\n\n const onDrag: DraggableEventHandler = useCallback(\n (e, { node, deltaX, deltaY }) => {\n if (!onDragProp || !dragging) return;\n\n const mouseEvent = e as unknown as MouseEvent;\n\n // Threshold support (#2217) - check if we've exceeded the threshold\n if (dragPendingRef.current && !thresholdExceededRef.current) {\n const dx = mouseEvent.clientX - initialDragClientRef.current.x;\n const dy = mouseEvent.clientY - initialDragClientRef.current.y;\n const distance = Math.hypot(dx, dy);\n\n if (distance < dragThreshold) {\n // Haven't exceeded threshold yet, don't trigger drag\n return;\n }\n\n // Threshold exceeded! Call onDragStartProp first, then continue with onDrag\n thresholdExceededRef.current = true;\n dragPendingRef.current = false;\n\n // Call onDragStartProp now that threshold is exceeded\n if (onDragStartProp) {\n const rawPos = calcXYRaw(\n positionParams,\n dragPositionRef.current.top,\n dragPositionRef.current.left\n );\n const { x: startX, y: startY } = applyPositionConstraints(\n constraints,\n effectiveLayoutItem,\n rawPos.x,\n rawPos.y,\n getConstraintContext()\n );\n onDragStartProp(i, startX, startY, {\n e: e as unknown as Event,\n node,\n newPosition: dragPositionRef.current\n });\n }\n }\n\n let top = dragPositionRef.current.top + deltaY;\n let left = dragPositionRef.current.left + deltaX;\n\n // Pixel-level boundary calculations (isBounded affects pixel position)\n if (isBounded) {\n const { offsetParent } = node;\n if (offsetParent) {\n const bottomBoundary =\n offsetParent.clientHeight -\n calcGridItemWHPx(h, rowHeight, margin[1]);\n top = clamp(top, 0, bottomBoundary);\n\n const colWidth = calcGridColWidth(positionParams);\n const rightBoundary =\n containerWidth - calcGridItemWHPx(w, colWidth, margin[0]);\n left = clamp(left, 0, rightBoundary);\n }\n }\n\n const newPosition: PartialPosition = { top, left };\n dragPositionRef.current = newPosition;\n\n // Calculate raw position and apply constraints\n const rawPos = calcXYRaw(positionParams, top, left);\n const { x: newX, y: newY } = applyPositionConstraints(\n constraints,\n effectiveLayoutItem,\n rawPos.x,\n rawPos.y,\n getConstraintContext()\n );\n\n onDragProp(i, newX, newY, {\n e: e as unknown as Event,\n node,\n newPosition\n });\n },\n [\n onDragProp,\n onDragStartProp,\n dragging,\n dragThreshold,\n isBounded,\n h,\n rowHeight,\n margin,\n positionParams,\n containerWidth,\n w,\n i,\n constraints,\n effectiveLayoutItem,\n getConstraintContext\n ]\n );\n\n const onDragStop: DraggableEventHandler = useCallback(\n (e, { node }) => {\n if (!onDragStopProp || !dragging) return;\n\n // Reset threshold tracking (#2217)\n const wasPending = dragPendingRef.current;\n dragPendingRef.current = false;\n thresholdExceededRef.current = false;\n initialDragClientRef.current = { x: 0, y: 0 };\n\n // If threshold was never exceeded, don't call onDragStopProp\n // since onDragStartProp was never called\n if (wasPending) {\n setDragging(false);\n dragPositionRef.current = { left: 0, top: 0 };\n return;\n }\n\n const { left, top } = dragPositionRef.current;\n const newPosition: PartialPosition = { top, left };\n\n setDragging(false);\n dragPositionRef.current = { left: 0, top: 0 };\n\n // Calculate raw position and apply constraints\n const rawPos = calcXYRaw(positionParams, top, left);\n const { x: newX, y: newY } = applyPositionConstraints(\n constraints,\n effectiveLayoutItem,\n rawPos.x,\n rawPos.y,\n getConstraintContext()\n );\n\n onDragStopProp(i, newX, newY, {\n e: e as unknown as Event,\n node,\n newPosition\n });\n },\n [\n onDragStopProp,\n dragging,\n positionParams,\n constraints,\n effectiveLayoutItem,\n getConstraintContext,\n i\n ]\n );\n\n // Update callback refs for use in dropping item effect (#2210)\n onDragStartRef.current = onDragStart;\n onDragRef.current = onDrag;\n\n // ============================================================================\n // Resize Handlers\n // ============================================================================\n\n const onResizeHandler = useCallback(\n (\n e: React.SyntheticEvent,\n { node, size, handle: resizeHandle }: ResizeCallbackData,\n position: Position,\n handlerName: \"onResizeStart\" | \"onResize\" | \"onResizeStop\"\n ) => {\n const handler =\n handlerName === \"onResizeStart\"\n ? onResizeStartProp\n : handlerName === \"onResize\"\n ? onResizeProp\n : onResizeStopProp;\n\n if (!handler) return;\n\n // Sizing based on resize direction\n let updatedSize: Position;\n if (node) {\n updatedSize = resizeItemInDirection(\n resizeHandle,\n position,\n size as Position,\n containerWidth\n );\n } else {\n updatedSize = {\n ...size,\n top: position.top,\n left: position.left\n } as Position;\n }\n\n resizePositionRef.current = updatedSize;\n\n // Calculate raw grid dimensions and apply constraints\n const rawSize = calcWHRaw(\n positionParams,\n updatedSize.width,\n updatedSize.height\n );\n const { w: newW, h: newH } = applySizeConstraints(\n constraints,\n effectiveLayoutItem,\n rawSize.w,\n rawSize.h,\n resizeHandle,\n getConstraintContext()\n );\n\n handler(i, newW, newH, {\n e: e.nativeEvent,\n node,\n size: updatedSize,\n handle: resizeHandle\n });\n },\n [\n onResizeStartProp,\n onResizeProp,\n onResizeStopProp,\n containerWidth,\n positionParams,\n i,\n constraints,\n effectiveLayoutItem,\n getConstraintContext\n ]\n );\n\n const handleResizeStart: ReactResizableCallback = useCallback(\n (e, data) => {\n setResizing(true);\n const pos = calcGridItemPosition(positionParams, x, y, w, h);\n const typedData: ResizeCallbackData = {\n ...data,\n handle: data.handle as ResizeHandleAxis\n };\n onResizeHandler(e, typedData, pos, \"onResizeStart\");\n },\n [onResizeHandler, positionParams, x, y, w, h]\n );\n\n const handleResize: ReactResizableCallback = useCallback(\n (e, data) => {\n const pos = calcGridItemPosition(positionParams, x, y, w, h);\n const typedData: ResizeCallbackData = {\n ...data,\n handle: data.handle as ResizeHandleAxis\n };\n onResizeHandler(e, typedData, pos, \"onResize\");\n },\n [onResizeHandler, positionParams, x, y, w, h]\n );\n\n const handleResizeStop: ReactResizableCallback = useCallback(\n (e, data) => {\n setResizing(false);\n resizePositionRef.current = { top: 0, left: 0, width: 0, height: 0 };\n const pos = calcGridItemPosition(positionParams, x, y, w, h);\n const typedData: ResizeCallbackData = {\n ...data,\n handle: data.handle as ResizeHandleAxis\n };\n onResizeHandler(e, typedData, pos, \"onResizeStop\");\n },\n [onResizeHandler, positionParams, x, y, w, h]\n );\n\n // ============================================================================\n // Dropping Item Support\n // ============================================================================\n\n // Dropping Item Support - uses refs to avoid callback dependency changes (#2210)\n // The effect only depends on droppingPosition and dragging state.\n // Callbacks are accessed via refs to get the latest version without triggering re-runs.\n useEffect(() => {\n if (!droppingPosition) return;\n\n const node = elementRef.current;\n if (!node) return;\n\n const prevDroppingPosition = prevDroppingPositionRef.current || {\n left: 0,\n top: 0\n };\n\n const shouldDrag =\n dragging &&\n (droppingPosition.left !== prevDroppingPosition.left ||\n droppingPosition.top !== prevDroppingPosition.top);\n\n if (!dragging) {\n // Start drag - simulate the draggable callback data\n const fakeData = {\n node,\n deltaX: droppingPosition.left,\n deltaY: droppingPosition.top,\n lastX: 0,\n lastY: 0,\n x: droppingPosition.left,\n y: droppingPosition.top\n };\n // Use ref to get latest callback without dependency\n onDragStartRef.current?.(\n droppingPosition.e as unknown as MouseEvent,\n fakeData\n );\n } else if (shouldDrag) {\n // Continue drag\n const deltaX = droppingPosition.left - dragPositionRef.current.left;\n const deltaY = droppingPosition.top - dragPositionRef.current.top;\n\n const fakeData = {\n node,\n deltaX,\n deltaY,\n lastX: dragPositionRef.current.left,\n lastY: dragPositionRef.current.top,\n x: droppingPosition.left,\n y: droppingPosition.top\n };\n // Use ref to get latest callback without dependency\n onDragRef.current?.(\n droppingPosition.e as unknown as MouseEvent,\n fakeData\n );\n }\n\n prevDroppingPositionRef.current = droppingPosition;\n }, [droppingPosition, dragging, i]);\n\n // ============================================================================\n // Render\n // ============================================================================\n\n const pos = calcGridItemPosition(\n positionParams,\n x,\n y,\n w,\n h,\n dragging ? dragPositionRef.current : null,\n resizing ? resizePositionRef.current : null\n );\n\n const child = React.Children.only(children);\n\n // Calculate constraints for resizing\n // Note: We use wide-open constraints for react-resizable and let our pluggable\n // constraint system handle the actual limits. This allows constraints to be\n // fully controllable via the constraints prop.\n const minGridUnit = calcGridItemPosition(positionParams, 0, 0, 1, 1);\n const minConstraints: [number, number] = [\n minGridUnit.width,\n minGridUnit.height\n ];\n const maxConstraints: [number, number] = [Infinity, Infinity];\n\n // Get child props safely\n const childProps = (child as ReactElement<Record<string, unknown>>).props;\n const childClassName = childProps[\"className\"] as string | undefined;\n const childStyle = childProps[\"style\"] as CSSProperties | undefined;\n\n // Create the child element with updated props\n let newChild: ReactElement = React.cloneElement(child, {\n ref: elementRef,\n className: clsx(\"react-grid-item\", childClassName, className, {\n static: isStatic,\n resizing,\n \"react-draggable\": isDraggable,\n \"react-draggable-dragging\": dragging,\n dropping: Boolean(droppingPosition),\n cssTransforms: useCSSTransforms\n }),\n style: {\n ...style,\n ...childStyle,\n ...createStyle(pos)\n }\n } as Record<string, unknown>);\n\n // Wrap with Resizable\n // Cast resizeHandle to match react-resizable's expected type (string instead of ResizeHandleAxis)\n const resizableHandle = resizeHandle as\n | ReactElement\n | ((axis: string, ref: React.Ref<HTMLElement>) => ReactElement)\n | undefined;\n\n newChild = (\n <Resizable\n draggableOpts={{ disabled: !isResizable }}\n className={isResizable ? undefined : \"react-resizable-hide\"}\n width={pos.width}\n height={pos.height}\n minConstraints={minConstraints}\n maxConstraints={maxConstraints}\n onResizeStart={handleResizeStart}\n onResize={handleResize}\n onResizeStop={handleResizeStop}\n transformScale={transformScale}\n resizeHandles={resizeHandles}\n handle={resizableHandle}\n >\n {newChild}\n </Resizable>\n );\n\n // Wrap with DraggableCore\n newChild = (\n <DraggableCore\n disabled={!isDraggable}\n onStart={onDragStart}\n onDrag={onDrag}\n onStop={onDragStop}\n handle={handle}\n cancel={\".react-resizable-handle\" + (cancel ? \",\" + cancel : \"\")}\n scale={transformScale}\n nodeRef={elementRef}\n >\n {newChild}\n </DraggableCore>\n );\n\n return newChild;\n}\n\nexport default GridItem;\n","/**\n * GridLayout component\n *\n * A reactive, fluid grid layout with draggable, resizable components.\n */\n\nimport React, {\n useState,\n useCallback,\n useEffect,\n useRef,\n useMemo,\n type ReactElement,\n type CSSProperties,\n type DragEvent as ReactDragEvent\n} from \"react\";\nimport { deepEqual } from \"fast-equals\";\nimport clsx from \"clsx\";\n\nimport type {\n Layout,\n LayoutItem,\n CompactType,\n DroppingPosition,\n GridDragEvent,\n GridResizeEvent,\n Mutable,\n GridConfig,\n DragConfig,\n ResizeConfig,\n DropConfig,\n PositionStrategy,\n Compactor,\n LayoutConstraint\n} from \"../../core/types.js\";\nimport {\n defaultGridConfig,\n defaultDragConfig,\n defaultResizeConfig,\n defaultDropConfig\n} from \"../../core/types.js\";\nimport type { PositionParams } from \"../../core/calculate.js\";\nimport {\n bottom,\n cloneLayoutItem,\n getLayoutItem,\n moveElement,\n withLayoutItem,\n correctBounds\n} from \"../../core/layout.js\";\nimport { getAllCollisions } from \"../../core/collision.js\";\n// Note: compact from compact-compat.js is NOT used - we use compactor.compact() instead (#2213)\nimport { getCompactor } from \"../../core/compactors.js\";\nimport {\n calcXY,\n calcGridColWidth,\n calcGridItemWHPx\n} from \"../../core/calculate.js\";\nimport { defaultPositionStrategy } from \"../../core/position.js\";\nimport { defaultConstraints } from \"../../core/constraints.js\";\n\nimport { GridItem, type ResizeHandle } from \"./GridItem.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type EventCallback = (\n layout: Layout,\n oldItem: LayoutItem | null,\n newItem: LayoutItem | null,\n placeholder: LayoutItem | null,\n event: Event,\n element?: HTMLElement\n) => void;\n\nexport interface GridLayoutProps {\n // ===========================================================================\n // Required Props\n // ===========================================================================\n\n /** Child elements to render in the grid */\n children: React.ReactNode;\n\n /** Width of the container in pixels */\n width: number;\n\n // ===========================================================================\n // Composable Configuration Interfaces (v2 API)\n // ===========================================================================\n\n /**\n * Grid measurement configuration.\n * @see GridConfig\n */\n gridConfig?: Partial<GridConfig>;\n\n /**\n * Drag behavior configuration.\n * @see DragConfig\n */\n dragConfig?: Partial<DragConfig>;\n\n /**\n * Resize behavior configuration.\n * @see ResizeConfig\n */\n resizeConfig?: Partial<ResizeConfig>;\n\n /**\n * External drop configuration.\n * @see DropConfig\n */\n dropConfig?: Partial<DropConfig>;\n\n /**\n * CSS positioning strategy.\n * Use transformStrategy (default), absoluteStrategy, or createScaledStrategy(scale).\n * @see PositionStrategy\n */\n positionStrategy?: PositionStrategy;\n\n /**\n * Layout compaction strategy.\n * Use verticalCompactor (default), horizontalCompactor, or noCompactor.\n * @see Compactor\n */\n compactor?: Compactor;\n\n /**\n * Layout constraints for position and size limiting.\n * Applied during drag/resize operations.\n * Default: [gridBounds, minMaxSize]\n * @see LayoutConstraint\n */\n constraints?: LayoutConstraint[];\n\n // ===========================================================================\n // Layout Data\n // ===========================================================================\n\n /** Layout definition */\n layout?: Layout;\n\n /** Item to use when dropping from outside */\n droppingItem?: LayoutItem;\n\n // ===========================================================================\n // Container Props\n // ===========================================================================\n\n /** Whether to auto-size the container height */\n autoSize?: boolean;\n\n /** Additional class name */\n className?: string;\n\n /** Additional styles */\n style?: CSSProperties;\n\n /** Ref to the container element */\n innerRef?: React.Ref<HTMLDivElement>;\n\n // ===========================================================================\n // Callbacks\n // ===========================================================================\n\n /** Called when layout changes */\n onLayoutChange?: (layout: Layout) => void;\n\n /** Called when drag starts */\n onDragStart?: EventCallback;\n\n /** Called during drag */\n onDrag?: EventCallback;\n\n /** Called when drag stops */\n onDragStop?: EventCallback;\n\n /** Called when resize starts */\n onResizeStart?: EventCallback;\n\n /** Called during resize */\n onResize?: EventCallback;\n\n /** Called when resize stops */\n onResizeStop?: EventCallback;\n\n /** Called when an item is dropped from outside */\n onDrop?: (layout: Layout, item: LayoutItem | undefined, e: Event) => void;\n\n /** Called when dragging over the grid */\n onDropDragOver?: (\n e: ReactDragEvent\n ) =>\n | { w?: number; h?: number; dragOffsetX?: number; dragOffsetY?: number }\n | false\n | void;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\nconst noop = () => {};\n\nconst layoutClassName = \"react-grid-layout\";\n\n// Check for Firefox\nlet isFirefox = false;\ntry {\n isFirefox = /firefox/i.test(navigator.userAgent);\n} catch {\n /* Ignore */\n}\n\n/**\n * Compare children arrays for equality\n */\nfunction childrenEqual(a: React.ReactNode, b: React.ReactNode): boolean {\n const aArr = React.Children.toArray(a);\n const bArr = React.Children.toArray(b);\n\n if (aArr.length !== bArr.length) return false;\n\n for (let i = 0; i < aArr.length; i++) {\n const aChild = aArr[i] as ReactElement;\n const bChild = bArr[i] as ReactElement;\n if (aChild?.key !== bChild?.key) return false;\n }\n\n return true;\n}\n\n/**\n * Synchronize layout with children\n */\nfunction synchronizeLayoutWithChildren(\n initialLayout: Layout,\n children: React.ReactNode,\n cols: number,\n compactor: Compactor\n): Layout {\n const layout: LayoutItem[] = [];\n const childKeys = new Set<string>();\n\n React.Children.forEach(children, child => {\n if (!React.isValidElement(child) || child.key === null) return;\n const key = String(child.key);\n childKeys.add(key);\n\n // Find existing layout item\n const existingItem = initialLayout.find(l => l.i === key);\n\n if (existingItem) {\n layout.push(cloneLayoutItem(existingItem));\n } else {\n // Create new layout item from child data-grid prop\n const childProps = child.props as { \"data-grid\"?: Partial<LayoutItem> };\n const dataGrid = childProps[\"data-grid\"];\n\n if (dataGrid) {\n layout.push({\n i: key,\n x: dataGrid.x ?? 0,\n y: dataGrid.y ?? 0,\n w: dataGrid.w ?? 1,\n h: dataGrid.h ?? 1,\n minW: dataGrid.minW,\n maxW: dataGrid.maxW,\n minH: dataGrid.minH,\n maxH: dataGrid.maxH,\n static: dataGrid.static,\n isDraggable: dataGrid.isDraggable,\n isResizable: dataGrid.isResizable,\n resizeHandles: dataGrid.resizeHandles,\n isBounded: dataGrid.isBounded\n });\n } else {\n // Create default layout item\n layout.push({\n i: key,\n x: 0,\n y: bottom(layout),\n w: 1,\n h: 1\n });\n }\n }\n });\n\n // Correct bounds and compact using the compactor's compact method (#2213)\n const corrected = correctBounds(layout, { cols });\n return compactor.compact(corrected, cols);\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * GridLayout - A reactive, fluid grid layout with draggable, resizable components.\n */\nexport function GridLayout(props: GridLayoutProps): ReactElement {\n const {\n // Required\n children,\n width,\n\n // Composable config interfaces\n gridConfig: gridConfigProp,\n dragConfig: dragConfigProp,\n resizeConfig: resizeConfigProp,\n dropConfig: dropConfigProp,\n positionStrategy = defaultPositionStrategy,\n compactor: compactorProp,\n constraints = defaultConstraints,\n\n // Layout data\n layout: propsLayout = [],\n droppingItem: droppingItemProp,\n\n // Container props\n autoSize = true,\n className = \"\",\n style = {},\n innerRef,\n\n // Callbacks\n onLayoutChange = noop,\n onDragStart: onDragStartProp = noop,\n onDrag: onDragProp = noop,\n onDragStop: onDragStopProp = noop,\n onResizeStart: onResizeStartProp = noop,\n onResize: onResizeProp = noop,\n onResizeStop: onResizeStopProp = noop,\n onDrop: onDropProp = noop,\n onDropDragOver: onDropDragOverProp = noop\n } = props;\n\n // Resolve config interfaces with defaults\n const gridConfig: GridConfig = useMemo(\n () => ({ ...defaultGridConfig, ...gridConfigProp }),\n [gridConfigProp]\n );\n const dragConfig: DragConfig = useMemo(\n () => ({ ...defaultDragConfig, ...dragConfigProp }),\n [dragConfigProp]\n );\n const resizeConfig: ResizeConfig = useMemo(\n () => ({ ...defaultResizeConfig, ...resizeConfigProp }),\n [resizeConfigProp]\n );\n const dropConfig: DropConfig = useMemo(\n () => ({ ...defaultDropConfig, ...dropConfigProp }),\n [dropConfigProp]\n );\n\n // Destructure resolved configs for convenience\n const { cols, rowHeight, maxRows, margin, containerPadding } = gridConfig;\n const {\n enabled: isDraggable,\n bounded: isBounded,\n handle: draggableHandle,\n cancel: draggableCancel,\n threshold: dragThreshold\n } = dragConfig;\n const {\n enabled: isResizable,\n handles: resizeHandles,\n handleComponent: resizeHandle\n } = resizeConfig;\n const {\n enabled: isDroppable,\n defaultItem: defaultDropItem,\n onDragOver: dropConfigOnDragOver\n } = dropConfig;\n\n // Get compactor (use provided or get from type)\n const compactor = compactorProp ?? getCompactor(\"vertical\");\n const compactType = compactor.type;\n const allowOverlap = compactor.allowOverlap;\n const preventCollision = compactor.preventCollision ?? false;\n\n // Resolve dropping item - memoized to avoid unstable reference in useCallback dependencies\n const droppingItem = useMemo(\n () =>\n droppingItemProp ?? {\n i: \"__dropping-elem__\",\n ...defaultDropItem\n },\n [droppingItemProp, defaultDropItem]\n );\n\n // Position strategy values\n const useCSSTransforms = positionStrategy.type === \"transform\";\n const transformScale = positionStrategy.scale;\n\n const effectiveContainerPadding = containerPadding ?? margin;\n\n // State\n const [mounted, setMounted] = useState(false);\n const [layout, setLayout] = useState<Layout>(() =>\n synchronizeLayoutWithChildren(propsLayout, children, cols, compactor)\n );\n const [activeDrag, setActiveDrag] = useState<LayoutItem | null>(null);\n const [resizing, setResizing] = useState(false);\n const [droppingDOMNode, setDroppingDOMNode] = useState<ReactElement | null>(\n null\n );\n const [droppingPosition, setDroppingPosition] = useState<\n DroppingPosition | undefined\n >();\n\n // Refs for tracking previous state\n const oldDragItemRef = useRef<LayoutItem | null>(null);\n const oldResizeItemRef = useRef<LayoutItem | null>(null);\n const oldLayoutRef = useRef<Layout | null>(null);\n const dragEnterCounterRef = useRef(0);\n const prevLayoutRef = useRef<Layout>(layout);\n const prevPropsLayoutRef = useRef<Layout>(propsLayout);\n const prevChildrenRef = useRef<React.ReactNode>(children);\n const prevCompactTypeRef = useRef<CompactType>(compactType);\n\n // Ref to current layout - Critical for preventing infinite update loops (#2204).\n // This allows callbacks to access the latest layout without including `layout`\n // in dependency arrays, which would cause callbacks to be recreated on every\n // layout change and trigger infinite re-renders via GridItem's useEffect.\n const layoutRef = useRef<Layout>(layout);\n layoutRef.current = layout;\n\n // Mount effect - call onLayoutChange with initial layout if it differs from props\n useEffect(() => {\n setMounted(true);\n // Possibly call back with layout on mount. This should be done after correcting the layout width\n // to ensure we don't rerender with the wrong width.\n if (!deepEqual(layout, propsLayout)) {\n onLayoutChange(layout);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // Only run on mount\n\n // Sync layout from props\n useEffect(() => {\n if (activeDrag) return; // Don't update during drag\n if (droppingDOMNode) return; // Don't update during drop from outside\n\n const layoutChanged = !deepEqual(propsLayout, prevPropsLayoutRef.current);\n const childrenChanged = !childrenEqual(children, prevChildrenRef.current);\n const compactTypeChanged = compactType !== prevCompactTypeRef.current;\n\n if (layoutChanged || childrenChanged || compactTypeChanged) {\n const baseLayout = layoutChanged ? propsLayout : layout;\n const newLayout = synchronizeLayoutWithChildren(\n baseLayout,\n children,\n cols,\n compactor\n );\n // Only update if the layout actually changed (#2210)\n // This prevents infinite loops when controlled state updates trigger\n // sync effects that produce the same layout\n if (!deepEqual(newLayout, layout)) {\n setLayout(newLayout);\n }\n }\n\n prevPropsLayoutRef.current = propsLayout;\n prevChildrenRef.current = children;\n prevCompactTypeRef.current = compactType;\n }, [\n propsLayout,\n children,\n cols,\n compactType,\n compactor,\n activeDrag,\n droppingDOMNode,\n layout\n ]);\n\n // Layout change callback\n useEffect(() => {\n if (!activeDrag && !deepEqual(layout, prevLayoutRef.current)) {\n prevLayoutRef.current = layout;\n // Filter out dropping placeholder - it's transient internal state only (#2210)\n // The dropping item should not be exposed to users until the actual drop happens.\n // This prevents infinite loops in controlled state patterns where children derive\n // from layout (e.g., children = layouts.map(...) with onLayoutChange={setLayouts}).\n const publicLayout = layout.filter(l => l.i !== droppingItem.i);\n onLayoutChange(publicLayout);\n }\n }, [layout, activeDrag, onLayoutChange, droppingItem.i]);\n\n // ============================================================================\n // Container Height\n // ============================================================================\n\n const containerHeight = useMemo((): string | undefined => {\n if (!autoSize) return undefined;\n const nbRow = bottom(layout);\n const containerPaddingY = effectiveContainerPadding[1];\n return (\n nbRow * rowHeight + (nbRow - 1) * margin[1] + containerPaddingY * 2 + \"px\"\n );\n }, [autoSize, layout, rowHeight, margin, effectiveContainerPadding]);\n\n // ============================================================================\n // Drag Handlers\n // ============================================================================\n\n const onDragStart = useCallback(\n (i: string, _x: number, _y: number, data: GridDragEvent) => {\n const currentLayout = layoutRef.current;\n const l = getLayoutItem(currentLayout, i);\n if (!l) return;\n\n const placeholder: LayoutItem = {\n w: l.w,\n h: l.h,\n x: l.x,\n y: l.y,\n i\n };\n\n oldDragItemRef.current = cloneLayoutItem(l);\n oldLayoutRef.current = currentLayout;\n setActiveDrag(placeholder);\n\n onDragStartProp(currentLayout, l, l, null, data.e, data.node);\n },\n [onDragStartProp]\n );\n\n const onDrag = useCallback(\n (i: string, x: number, y: number, data: GridDragEvent) => {\n const currentLayout = layoutRef.current;\n const oldDragItem = oldDragItemRef.current;\n const l = getLayoutItem(currentLayout, i);\n if (!l) return;\n\n const placeholder: LayoutItem = {\n w: l.w,\n h: l.h,\n x: l.x,\n y: l.y,\n i\n };\n\n // Move the element\n const newLayout = moveElement(\n currentLayout,\n l,\n x,\n y,\n true,\n preventCollision,\n compactType,\n cols,\n allowOverlap\n );\n\n onDragProp(newLayout, oldDragItem, l, placeholder, data.e, data.node);\n\n // Use compactor.compact() - it handles allowOverlap internally (#2213)\n setLayout(compactor.compact(newLayout, cols));\n setActiveDrag(placeholder);\n },\n [preventCollision, compactType, cols, allowOverlap, compactor, onDragProp]\n );\n\n const onDragStop = useCallback(\n (i: string, x: number, y: number, data: GridDragEvent) => {\n if (!activeDrag) return;\n\n const currentLayout = layoutRef.current;\n const oldDragItem = oldDragItemRef.current;\n const l = getLayoutItem(currentLayout, i);\n if (!l) return;\n\n const newLayout = moveElement(\n currentLayout,\n l,\n x,\n y,\n true,\n preventCollision,\n compactType,\n cols,\n allowOverlap\n );\n\n // Use compactor.compact() - it handles allowOverlap internally (#2213)\n const finalLayout = compactor.compact(newLayout, cols);\n\n onDragStopProp(finalLayout, oldDragItem, l, null, data.e, data.node);\n\n const oldLayout = oldLayoutRef.current;\n oldDragItemRef.current = null;\n oldLayoutRef.current = null;\n setActiveDrag(null);\n setLayout(finalLayout);\n\n if (oldLayout && !deepEqual(oldLayout, finalLayout)) {\n onLayoutChange(finalLayout);\n }\n },\n [\n activeDrag,\n preventCollision,\n compactType,\n cols,\n allowOverlap,\n compactor,\n onDragStopProp,\n onLayoutChange\n ]\n );\n\n // ============================================================================\n // Resize Handlers\n // ============================================================================\n\n const onResizeStart = useCallback(\n (i: string, _w: number, _h: number, data: GridResizeEvent) => {\n const currentLayout = layoutRef.current;\n const l = getLayoutItem(currentLayout, i);\n if (!l) return;\n\n oldResizeItemRef.current = cloneLayoutItem(l);\n oldLayoutRef.current = currentLayout;\n setResizing(true);\n\n onResizeStartProp(currentLayout, l, l, null, data.e, data.node);\n },\n [onResizeStartProp]\n );\n\n const onResize = useCallback(\n (i: string, w: number, h: number, data: GridResizeEvent) => {\n const currentLayout = layoutRef.current;\n const oldResizeItem = oldResizeItemRef.current;\n const { handle } = data;\n\n let shouldMoveItem = false;\n let newX: number | undefined;\n let newY: number | undefined;\n\n const [newLayout, l] = withLayoutItem(currentLayout, i, item => {\n newX = item.x;\n newY = item.y;\n\n // Handle corner/edge resizing that affects position\n if ([\"sw\", \"w\", \"nw\", \"n\", \"ne\"].includes(handle)) {\n if ([\"sw\", \"nw\", \"w\"].includes(handle)) {\n newX = item.x + (item.w - w);\n w = item.x !== newX && newX < 0 ? item.w : w;\n newX = newX < 0 ? 0 : newX;\n }\n\n if ([\"ne\", \"n\", \"nw\"].includes(handle)) {\n newY = item.y + (item.h - h);\n h = item.y !== newY && newY < 0 ? item.h : h;\n newY = newY < 0 ? 0 : newY;\n }\n\n shouldMoveItem = true;\n }\n\n // Check for collisions if preventCollision is enabled\n if (preventCollision && !allowOverlap) {\n const collisions = getAllCollisions(currentLayout, {\n ...item,\n w,\n h,\n x: newX ?? item.x,\n y: newY ?? item.y\n }).filter(layoutItem => layoutItem.i !== item.i);\n\n if (collisions.length > 0) {\n newY = item.y;\n h = item.h;\n newX = item.x;\n w = item.w;\n shouldMoveItem = false;\n }\n }\n\n (item as Mutable<LayoutItem>).w = w;\n (item as Mutable<LayoutItem>).h = h;\n\n return item;\n });\n\n if (!l) return;\n\n let finalLayout = newLayout;\n if (shouldMoveItem && newX !== undefined && newY !== undefined) {\n finalLayout = moveElement(\n newLayout,\n l,\n newX,\n newY,\n true,\n preventCollision,\n compactType,\n cols,\n allowOverlap\n );\n }\n\n const placeholder: LayoutItem = {\n w: l.w,\n h: l.h,\n x: l.x,\n y: l.y,\n i,\n static: true\n };\n\n onResizeProp(\n finalLayout,\n oldResizeItem,\n l,\n placeholder,\n data.e,\n data.node\n );\n\n // Use compactor.compact() - it handles allowOverlap internally (#2213)\n setLayout(compactor.compact(finalLayout, cols));\n setActiveDrag(placeholder);\n },\n [preventCollision, compactType, cols, allowOverlap, compactor, onResizeProp]\n );\n\n const onResizeStop = useCallback(\n (i: string, _w: number, _h: number, data: GridResizeEvent) => {\n const currentLayout = layoutRef.current;\n const oldResizeItem = oldResizeItemRef.current;\n const l = getLayoutItem(currentLayout, i);\n\n // Use compactor.compact() - it handles allowOverlap internally (#2213)\n const finalLayout = compactor.compact(currentLayout, cols);\n\n onResizeStopProp(\n finalLayout,\n oldResizeItem,\n l ?? null,\n null,\n data.e,\n data.node\n );\n\n const oldLayout = oldLayoutRef.current;\n oldResizeItemRef.current = null;\n oldLayoutRef.current = null;\n setActiveDrag(null);\n setResizing(false);\n setLayout(finalLayout);\n\n if (oldLayout && !deepEqual(oldLayout, finalLayout)) {\n onLayoutChange(finalLayout);\n }\n },\n [cols, compactor, onResizeStopProp, onLayoutChange]\n );\n\n // ============================================================================\n // Drop Handlers\n // ============================================================================\n\n const removeDroppingPlaceholder = useCallback(() => {\n // Guard against being called when there's no dropping item (#2210)\n // This makes the function idempotent and safe to call multiple times\n const currentLayout = layoutRef.current;\n const hasDroppingItem = currentLayout.some(l => l.i === droppingItem.i);\n if (!hasDroppingItem) {\n // Nothing to remove, just ensure state is clean\n setDroppingDOMNode(null);\n setActiveDrag(null);\n setDroppingPosition(undefined);\n return;\n }\n\n // Use compactor.compact() - it handles allowOverlap internally (#2213)\n const newLayout = compactor.compact(\n currentLayout.filter(l => l.i !== droppingItem.i),\n cols\n );\n\n setLayout(newLayout);\n setDroppingDOMNode(null);\n setActiveDrag(null);\n setDroppingPosition(undefined);\n }, [droppingItem.i, cols, compactor]);\n\n const handleDragOver = useCallback(\n (e: ReactDragEvent): void | false => {\n e.preventDefault();\n e.stopPropagation();\n\n // Firefox hack\n if (\n isFirefox &&\n !(e.nativeEvent.target as HTMLElement)?.classList.contains(\n layoutClassName\n )\n ) {\n return false;\n }\n\n // Use dropConfig.onDragOver if provided, otherwise fall back to onDropDragOver prop (#2212)\n // dropConfig.onDragOver uses native DragEvent, onDropDragOver uses React's DragEvent\n const rawResult = dropConfigOnDragOver\n ? dropConfigOnDragOver(e.nativeEvent as DragEvent)\n : onDropDragOverProp(e);\n if (rawResult === false) {\n if (droppingDOMNode) {\n removeDroppingPlaceholder();\n }\n return false;\n }\n const {\n dragOffsetX = 0,\n dragOffsetY = 0,\n ...onDragOverResult\n } = rawResult ?? {};\n\n const finalDroppingItem = { ...droppingItem, ...onDragOverResult };\n const gridRect = e.currentTarget.getBoundingClientRect();\n\n // Calculate position params for proper column width calculation\n const positionParams: PositionParams = {\n cols,\n margin: margin as [number, number],\n maxRows,\n rowHeight,\n containerWidth: width,\n containerPadding: effectiveContainerPadding as [number, number]\n };\n\n // Calculate actual column width accounting for margins and padding\n const actualColWidth = calcGridColWidth(positionParams);\n\n // Calculate item dimensions in pixels including margins between cells\n const itemPixelWidth = calcGridItemWHPx(\n finalDroppingItem.w,\n actualColWidth,\n (margin as [number, number])[0]\n );\n const itemPixelHeight = calcGridItemWHPx(\n finalDroppingItem.h,\n rowHeight,\n (margin as [number, number])[1]\n );\n\n // Center the dropping item by offsetting by half its size\n const itemCenterOffsetX = itemPixelWidth / 2;\n const itemCenterOffsetY = itemPixelHeight / 2;\n\n // Calculate mouse position relative to grid, accounting for drag offset and item centering\n const rawGridX =\n e.clientX - gridRect.left + dragOffsetX - itemCenterOffsetX;\n const rawGridY =\n e.clientY - gridRect.top + dragOffsetY - itemCenterOffsetY;\n\n // Clamp to prevent negative positions (calcXY handles upper bound clamping)\n const clampedGridX = Math.max(0, rawGridX);\n const clampedGridY = Math.max(0, rawGridY);\n\n const newDroppingPosition: DroppingPosition = {\n left: clampedGridX / transformScale,\n top: clampedGridY / transformScale,\n e: e.nativeEvent\n };\n\n if (!droppingDOMNode) {\n const calculatedPosition = calcXY(\n positionParams,\n clampedGridY,\n clampedGridX,\n finalDroppingItem.w,\n finalDroppingItem.h\n );\n\n setDroppingDOMNode(<div key={finalDroppingItem.i} />);\n setDroppingPosition(newDroppingPosition);\n setLayout([\n ...layoutRef.current,\n {\n ...finalDroppingItem,\n x: calculatedPosition.x,\n y: calculatedPosition.y,\n static: false,\n isDraggable: true\n }\n ]);\n } else if (droppingPosition) {\n const shouldUpdate =\n droppingPosition.left !== newDroppingPosition.left ||\n droppingPosition.top !== newDroppingPosition.top;\n if (shouldUpdate) {\n setDroppingPosition(newDroppingPosition);\n }\n }\n },\n [\n droppingDOMNode,\n droppingPosition,\n droppingItem,\n dropConfigOnDragOver,\n onDropDragOverProp,\n removeDroppingPlaceholder,\n transformScale,\n cols,\n margin,\n maxRows,\n rowHeight,\n width,\n effectiveContainerPadding\n ]\n );\n\n const handleDragLeave = useCallback(\n (e: ReactDragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragEnterCounterRef.current--;\n\n // Guard against negative counter (#2210)\n // This can happen in edge cases with event timing or bubbling\n if (dragEnterCounterRef.current < 0) {\n dragEnterCounterRef.current = 0;\n }\n\n if (dragEnterCounterRef.current === 0) {\n removeDroppingPlaceholder();\n }\n },\n [removeDroppingPlaceholder]\n );\n\n const handleDragEnter = useCallback((e: ReactDragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragEnterCounterRef.current++;\n }, []);\n\n const handleDrop = useCallback(\n (e: ReactDragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n const currentLayout = layoutRef.current;\n const item = currentLayout.find(l => l.i === droppingItem.i);\n dragEnterCounterRef.current = 0;\n removeDroppingPlaceholder();\n onDropProp(currentLayout, item, e.nativeEvent);\n },\n [droppingItem.i, removeDroppingPlaceholder, onDropProp]\n );\n\n // ============================================================================\n // Render Helpers\n // ============================================================================\n\n const processGridItem = useCallback(\n (\n child: ReactElement,\n isDroppingItem?: boolean\n ): ReactElement | null | undefined => {\n if (!child || !child.key) return null;\n\n const l = getLayoutItem(layout, String(child.key));\n if (!l) return null;\n\n const draggable =\n typeof l.isDraggable === \"boolean\"\n ? l.isDraggable\n : !l.static && isDraggable;\n const resizable =\n typeof l.isResizable === \"boolean\"\n ? l.isResizable\n : !l.static && isResizable;\n const resizeHandlesOptions = l.resizeHandles || [...resizeHandles];\n const bounded = draggable && isBounded && l.isBounded !== false;\n\n // Cast resize handle to expected type (function signature is compatible)\n const resizeHandleElement = resizeHandle as ResizeHandle | undefined;\n\n return (\n <GridItem\n key={l.i}\n containerWidth={width}\n cols={cols}\n margin={margin}\n containerPadding={effectiveContainerPadding}\n maxRows={maxRows}\n rowHeight={rowHeight}\n cancel={draggableCancel}\n handle={draggableHandle}\n onDragStart={onDragStart}\n onDrag={onDrag}\n onDragStop={onDragStop}\n onResizeStart={onResizeStart}\n onResize={onResize}\n onResizeStop={onResizeStop}\n isDraggable={draggable}\n isResizable={resizable}\n isBounded={bounded}\n useCSSTransforms={useCSSTransforms && mounted}\n usePercentages={!mounted}\n transformScale={transformScale}\n positionStrategy={positionStrategy}\n dragThreshold={dragThreshold}\n w={l.w}\n h={l.h}\n x={l.x}\n y={l.y}\n i={l.i}\n minH={l.minH}\n minW={l.minW}\n maxH={l.maxH}\n maxW={l.maxW}\n static={l.static}\n droppingPosition={isDroppingItem ? droppingPosition : undefined}\n resizeHandles={resizeHandlesOptions}\n resizeHandle={resizeHandleElement}\n constraints={constraints}\n layoutItem={l}\n layout={layout}\n >\n {child}\n </GridItem>\n );\n },\n [\n layout,\n width,\n cols,\n margin,\n effectiveContainerPadding,\n maxRows,\n rowHeight,\n draggableCancel,\n draggableHandle,\n onDragStart,\n onDrag,\n onDragStop,\n onResizeStart,\n onResize,\n onResizeStop,\n isDraggable,\n isResizable,\n isBounded,\n useCSSTransforms,\n mounted,\n transformScale,\n positionStrategy,\n dragThreshold,\n droppingPosition,\n resizeHandles,\n resizeHandle,\n constraints\n ]\n );\n\n const renderPlaceholder = (): ReactElement | null => {\n if (!activeDrag) return null;\n\n return (\n <GridItem\n w={activeDrag.w}\n h={activeDrag.h}\n x={activeDrag.x}\n y={activeDrag.y}\n i={activeDrag.i}\n className={`react-grid-placeholder ${resizing ? \"placeholder-resizing\" : \"\"}`}\n containerWidth={width}\n cols={cols}\n margin={margin}\n containerPadding={effectiveContainerPadding}\n maxRows={maxRows}\n rowHeight={rowHeight}\n isDraggable={false}\n isResizable={false}\n isBounded={false}\n useCSSTransforms={useCSSTransforms}\n transformScale={transformScale}\n constraints={constraints}\n layout={layout}\n >\n <div />\n </GridItem>\n );\n };\n\n // ============================================================================\n // Render\n // ============================================================================\n\n const mergedClassName = clsx(layoutClassName, className);\n const mergedStyle: CSSProperties = {\n height: containerHeight,\n ...style\n };\n\n return (\n <div\n ref={innerRef}\n className={mergedClassName}\n style={mergedStyle}\n onDrop={isDroppable ? handleDrop : undefined}\n onDragLeave={isDroppable ? handleDragLeave : undefined}\n onDragEnter={isDroppable ? handleDragEnter : undefined}\n onDragOver={isDroppable ? handleDragOver : undefined}\n >\n {React.Children.map(children, child => {\n if (!React.isValidElement(child)) return null;\n return processGridItem(child);\n })}\n {isDroppable && droppingDOMNode && processGridItem(droppingDOMNode, true)}\n {renderPlaceholder()}\n </div>\n );\n}\n\nexport default GridLayout;\n","/**\n * ResponsiveGridLayout component\n *\n * A responsive grid layout that automatically adjusts to container width.\n */\n\nimport React, {\n useState,\n useEffect,\n useRef,\n useMemo,\n useCallback,\n type ReactElement\n} from \"react\";\nimport { deepEqual } from \"fast-equals\";\n\nimport type {\n Layout,\n LayoutItem,\n Breakpoint,\n Breakpoints,\n ResponsiveLayouts,\n Compactor\n} from \"../../core/types.js\";\nimport { cloneLayout, correctBounds } from \"../../core/layout.js\";\nimport {\n getBreakpointFromWidth,\n getColsFromBreakpoint,\n findOrGenerateResponsiveLayout,\n getIndentationValue\n} from \"../../core/responsive.js\";\nimport { getCompactor } from \"../../core/compactors.js\";\nimport { bottom } from \"../../core/layout.js\";\n\nimport { GridLayout, type GridLayoutProps } from \"./GridLayout.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ResponsiveGridLayoutProps<\n B extends Breakpoint = string\n> extends Omit<GridLayoutProps, \"gridConfig\" | \"layout\" | \"onLayoutChange\"> {\n /** Current breakpoint (optional, auto-detected from width) */\n breakpoint?: B;\n /** Breakpoint definitions (name → min-width) */\n breakpoints?: Breakpoints<B>;\n /** Column counts per breakpoint */\n cols?: Breakpoints<B>;\n /** Layouts for each breakpoint */\n layouts?: ResponsiveLayouts<B>;\n /** Row height (default: 150) */\n rowHeight?: number;\n /** Maximum rows (default: Infinity) */\n maxRows?: number;\n /** Margin between items - can be fixed or per-breakpoint */\n margin?:\n | readonly [number, number]\n | Partial<Record<B, readonly [number, number]>>;\n /** Container padding - can be fixed or per-breakpoint */\n containerPadding?:\n | readonly [number, number]\n | Partial<Record<B, readonly [number, number] | null>>\n | null;\n /** Compactor for layout compaction */\n compactor?: Compactor;\n /** Called when breakpoint changes */\n onBreakpointChange?: (newBreakpoint: B, cols: number) => void;\n /** Called when layout changes */\n onLayoutChange?: (layout: Layout, layouts: ResponsiveLayouts<B>) => void;\n /** Called when width changes */\n onWidthChange?: (\n containerWidth: number,\n margin: readonly [number, number],\n cols: number,\n containerPadding: readonly [number, number] | null\n ) => void;\n}\n\n// ============================================================================\n// Default Values\n// ============================================================================\n\nconst DEFAULT_BREAKPOINTS: Breakpoints<string> = {\n lg: 1200,\n md: 996,\n sm: 768,\n xs: 480,\n xxs: 0\n};\n\nconst DEFAULT_COLS: Breakpoints<string> = {\n lg: 12,\n md: 10,\n sm: 6,\n xs: 4,\n xxs: 2\n};\n\nconst noop = () => {};\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Synchronize layout with children - use compactor.compact() (#2213)\n */\nfunction synchronizeLayoutWithChildren(\n initialLayout: Layout,\n children: React.ReactNode,\n cols: number,\n compactor: Compactor\n): Layout {\n const layout: LayoutItem[] = [];\n\n React.Children.forEach(children, child => {\n if (!React.isValidElement(child) || child.key === null) return;\n const key = String(child.key);\n\n // Find existing layout item\n const existingItem = initialLayout.find(l => l.i === key);\n\n if (existingItem) {\n layout.push({\n ...existingItem,\n i: key\n });\n } else {\n // Create new layout item from child data-grid prop\n const childProps = child.props as { \"data-grid\"?: Partial<LayoutItem> };\n const dataGrid = childProps[\"data-grid\"];\n\n if (dataGrid) {\n layout.push({\n i: key,\n x: dataGrid.x ?? 0,\n y: dataGrid.y ?? 0,\n w: dataGrid.w ?? 1,\n h: dataGrid.h ?? 1,\n minW: dataGrid.minW,\n maxW: dataGrid.maxW,\n minH: dataGrid.minH,\n maxH: dataGrid.maxH,\n static: dataGrid.static,\n isDraggable: dataGrid.isDraggable,\n isResizable: dataGrid.isResizable,\n resizeHandles: dataGrid.resizeHandles,\n isBounded: dataGrid.isBounded\n });\n } else {\n // Create default layout item\n layout.push({\n i: key,\n x: 0,\n y: bottom(layout),\n w: 1,\n h: 1\n });\n }\n }\n });\n\n // Correct bounds and compact - use compactor.compact() (#2213)\n const corrected = correctBounds(layout, { cols });\n return compactor.compact(corrected, cols);\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * ResponsiveGridLayout - A responsive grid layout that adjusts to container width.\n */\nexport function ResponsiveGridLayout<B extends Breakpoint = string>(\n props: ResponsiveGridLayoutProps<B>\n): ReactElement {\n const {\n children,\n width,\n breakpoint: propBreakpoint,\n breakpoints = DEFAULT_BREAKPOINTS as Breakpoints<B>,\n cols: colsConfig = DEFAULT_COLS as Breakpoints<B>,\n layouts: propsLayouts = {} as ResponsiveLayouts<B>,\n rowHeight = 150,\n maxRows = Infinity,\n margin: propMargin = [10, 10] as readonly [number, number],\n containerPadding: propContainerPadding = null,\n compactor: compactorProp,\n onBreakpointChange = noop,\n onLayoutChange = noop,\n onWidthChange = noop,\n ...restProps\n } = props;\n\n // Get compactor (use provided or default to vertical)\n const compactor = compactorProp ?? getCompactor(\"vertical\");\n const compactType = compactor.type;\n const allowOverlap = compactor.allowOverlap;\n\n // Calculate initial state\n const initialBreakpoint = useMemo(() => {\n return propBreakpoint ?? getBreakpointFromWidth(breakpoints, width);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n const initialCols = useMemo(() => {\n return getColsFromBreakpoint(initialBreakpoint, colsConfig);\n }, [initialBreakpoint, colsConfig]);\n\n // Use compactType for initial layout as compactor reference isn't stable here\n // findOrGenerateResponsiveLayout accepts both CompactType and Compactor (#2213)\n const initialLayout = useMemo(() => {\n return findOrGenerateResponsiveLayout(\n propsLayouts,\n breakpoints,\n initialBreakpoint,\n initialBreakpoint,\n initialCols,\n compactType\n );\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // State\n const [breakpoint, setBreakpoint] = useState<B>(initialBreakpoint);\n const [cols, setCols] = useState<number>(initialCols);\n const [layout, setLayout] = useState<Layout>(initialLayout);\n const [layouts, setLayouts] = useState<ResponsiveLayouts<B>>(propsLayouts);\n\n // Refs for tracking changes\n const prevWidthRef = useRef(width);\n const prevBreakpointRef = useRef(propBreakpoint);\n const prevBreakpointsRef = useRef(breakpoints);\n const prevColsRef = useRef(colsConfig);\n const prevLayoutsRef = useRef(propsLayouts);\n const prevCompactTypeRef = useRef(compactType);\n\n // Ref to always have current layouts value (avoids stale closure in callbacks)\n const layoutsRef = useRef(layouts);\n\n // Keep layoutsRef in sync with layouts state\n useEffect(() => {\n layoutsRef.current = layouts;\n }, [layouts]);\n\n // Derive layout synchronously from props during render (not in useEffect which runs after render)\n // This prevents the timing issue where GridLayout sees children before the layout is updated\n // Use compactor directly (#2213)\n const derivedLayout: Layout | null = useMemo(() => {\n if (!deepEqual(propsLayouts, prevLayoutsRef.current)) {\n // Props changed, derive new layout synchronously\n return findOrGenerateResponsiveLayout(\n propsLayouts,\n breakpoints,\n breakpoint,\n breakpoint,\n cols,\n compactor\n );\n }\n return null; // No change needed\n }, [propsLayouts, breakpoints, breakpoint, cols, compactor]);\n\n // The effective layout to pass to GridLayout - use derived if available, else state\n const effectiveLayout = derivedLayout ?? layout;\n\n // Update state and refs in effect (for consistency on future renders)\n useEffect(() => {\n if (derivedLayout !== null) {\n setLayout(derivedLayout);\n setLayouts(propsLayouts);\n layoutsRef.current = propsLayouts;\n prevLayoutsRef.current = propsLayouts;\n }\n }, [derivedLayout, propsLayouts]);\n\n // Handle compactType changes - use compactor.compact() (#2213)\n useEffect(() => {\n if (compactType !== prevCompactTypeRef.current) {\n // Re-compact the current layout with the new compactType\n // Use effectiveLayout to avoid stale data when layouts are being synced\n const newLayout = compactor.compact(cloneLayout(effectiveLayout), cols);\n const newLayouts = {\n ...layoutsRef.current,\n [breakpoint]: newLayout\n } as ResponsiveLayouts<B>;\n\n setLayout(newLayout);\n setLayouts(newLayouts);\n layoutsRef.current = newLayouts;\n onLayoutChange(newLayout, newLayouts);\n prevCompactTypeRef.current = compactType;\n }\n }, [\n compactType,\n compactor,\n effectiveLayout,\n cols,\n allowOverlap,\n breakpoint,\n onLayoutChange\n ]);\n\n // Handle width changes\n useEffect(() => {\n const widthChanged = width !== prevWidthRef.current;\n const breakpointPropChanged = propBreakpoint !== prevBreakpointRef.current;\n const breakpointsChanged = !deepEqual(\n breakpoints,\n prevBreakpointsRef.current\n );\n const colsChanged = !deepEqual(colsConfig, prevColsRef.current);\n\n if (\n widthChanged ||\n breakpointPropChanged ||\n breakpointsChanged ||\n colsChanged\n ) {\n const newBreakpoint =\n propBreakpoint ?? getBreakpointFromWidth(breakpoints, width);\n const newCols = getColsFromBreakpoint(newBreakpoint, colsConfig);\n const lastBreakpoint = breakpoint;\n\n // Breakpoint change\n if (\n lastBreakpoint !== newBreakpoint ||\n breakpointsChanged ||\n colsChanged\n ) {\n const newLayouts = { ...layoutsRef.current } as ResponsiveLayouts<B>;\n\n // Preserve current layout if not in new layouts\n if (!newLayouts[lastBreakpoint]) {\n (newLayouts as Record<B, Layout>)[lastBreakpoint] =\n cloneLayout(layout);\n }\n\n // Find or generate new layout - use compactor (#2213)\n let newLayout = findOrGenerateResponsiveLayout(\n newLayouts,\n breakpoints,\n newBreakpoint,\n lastBreakpoint,\n newCols,\n compactor\n );\n\n // Sync with children - use compactor (#2213)\n newLayout = synchronizeLayoutWithChildren(\n newLayout,\n children,\n newCols,\n compactor\n );\n\n // Store new layout\n (newLayouts as Record<B, Layout>)[newBreakpoint] = newLayout;\n\n // Update state\n setBreakpoint(newBreakpoint);\n setCols(newCols);\n setLayout(newLayout);\n setLayouts(newLayouts);\n layoutsRef.current = newLayouts;\n\n // Callbacks\n onBreakpointChange(newBreakpoint, newCols);\n onLayoutChange(newLayout, newLayouts);\n }\n\n // Get margin and padding for callback\n const currentMargin = getIndentationValue(\n propMargin as Parameters<typeof getIndentationValue>[0],\n newBreakpoint\n );\n const currentPadding = propContainerPadding\n ? getIndentationValue(\n propContainerPadding as Parameters<typeof getIndentationValue>[0],\n newBreakpoint\n )\n : null;\n\n // Width change callback\n onWidthChange(width, currentMargin, newCols, currentPadding);\n\n // Update refs\n prevWidthRef.current = width;\n prevBreakpointRef.current = propBreakpoint;\n prevBreakpointsRef.current = breakpoints;\n prevColsRef.current = colsConfig;\n }\n }, [\n width,\n propBreakpoint,\n breakpoints,\n colsConfig,\n breakpoint,\n cols,\n layout,\n children,\n compactor,\n compactType,\n allowOverlap,\n propMargin,\n propContainerPadding,\n onBreakpointChange,\n onLayoutChange,\n onWidthChange\n ]);\n\n // Handle layout change from GridLayout\n const handleLayoutChange = useCallback(\n (newLayout: Layout) => {\n // Use layoutsRef.current to avoid stale closure issues\n const currentLayouts = layoutsRef.current;\n const newLayouts = {\n ...currentLayouts,\n [breakpoint]: newLayout\n } as ResponsiveLayouts<B>;\n\n setLayout(newLayout);\n setLayouts(newLayouts);\n layoutsRef.current = newLayouts;\n onLayoutChange(newLayout, newLayouts);\n },\n [breakpoint, onLayoutChange]\n );\n\n // Get margin and padding for current breakpoint\n const currentMargin = useMemo(() => {\n return getIndentationValue(\n propMargin as Parameters<typeof getIndentationValue>[0],\n breakpoint\n );\n }, [propMargin, breakpoint]);\n\n const currentContainerPadding = useMemo(() => {\n if (propContainerPadding === null) return null;\n return getIndentationValue(\n propContainerPadding as Parameters<typeof getIndentationValue>[0],\n breakpoint\n );\n }, [propContainerPadding, breakpoint]);\n\n // Build grid config for current breakpoint\n const gridConfig = useMemo(\n () => ({\n cols,\n rowHeight,\n maxRows,\n margin: currentMargin,\n containerPadding: currentContainerPadding\n }),\n [cols, rowHeight, maxRows, currentMargin, currentContainerPadding]\n );\n\n return (\n <GridLayout\n {...restProps}\n width={width}\n gridConfig={gridConfig}\n compactor={compactor}\n onLayoutChange={handleLayoutChange}\n layout={effectiveLayout}\n >\n {children}\n </GridLayout>\n );\n}\n\nexport default ResponsiveGridLayout;\n"]}
|