react-grid-layout 2.0.0 → 2.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/README.md +97 -25
- package/css/styles.css +0 -1
- package/dist/{ResponsiveGridLayout-D6lFRE3f.d.mts → ResponsiveGridLayout-BkHF9YHa.d.mts} +10 -1
- package/dist/{ResponsiveGridLayout-CH4s0tKj.d.ts → ResponsiveGridLayout-CLn16-X3.d.ts} +10 -1
- package/dist/{calculate-CwYDW8na.d.mts → calculate-DsVTldEE.d.ts} +30 -2
- package/dist/{calculate-mgLpNJ5O.d.ts → calculate-DwbL1D06.d.mts} +30 -2
- package/dist/{chunk-4HNUMWQK.mjs → chunk-2O3ZME4Q.mjs} +178 -297
- package/dist/chunk-2O3ZME4Q.mjs.map +1 -0
- package/dist/chunk-526JND3R.mjs +3 -0
- package/dist/{chunk-ZWN22PS2.mjs.map → chunk-526JND3R.mjs.map} +1 -1
- package/dist/chunk-7ELO5FRW.js +4 -0
- package/dist/{chunk-PBQSHIID.js.map → chunk-7ELO5FRW.js.map} +1 -1
- package/dist/chunk-AWM66AWF.mjs +422 -0
- package/dist/chunk-AWM66AWF.mjs.map +1 -0
- package/dist/chunk-BJFPTW5Q.js +449 -0
- package/dist/chunk-BJFPTW5Q.js.map +1 -0
- package/dist/{chunk-3WO4SAYB.js → chunk-FN6MIZ24.js} +221 -345
- package/dist/chunk-FN6MIZ24.js.map +1 -0
- package/dist/{chunk-H5KMDLY3.js → chunk-GPZBANOK.js} +40 -39
- package/dist/chunk-GPZBANOK.js.map +1 -0
- package/dist/{chunk-ZCXE6SR5.mjs → chunk-LWF5EYMO.mjs} +4 -3
- package/dist/chunk-LWF5EYMO.mjs.map +1 -0
- package/dist/{chunk-R35HZZTA.mjs → chunk-MXXN7GUE.mjs} +170 -62
- package/dist/chunk-MXXN7GUE.mjs.map +1 -0
- package/dist/{chunk-BFTKGAP3.js → chunk-QRW3ND4U.js} +230 -122
- package/dist/chunk-QRW3ND4U.js.map +1 -0
- package/dist/core.d.mts +159 -6
- package/dist/core.d.ts +159 -6
- package/dist/core.js +141 -85
- package/dist/core.mjs +3 -3
- package/dist/extras.d.mts +133 -3
- package/dist/extras.d.ts +133 -3
- package/dist/extras.js +373 -2
- package/dist/extras.js.map +1 -1
- package/dist/extras.mjs +367 -2
- 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 +64 -64
- package/dist/index.mjs +5 -5
- package/dist/legacy.d.mts +2 -2
- package/dist/legacy.d.ts +2 -2
- package/dist/legacy.js +26 -25
- package/dist/legacy.js.map +1 -1
- package/dist/legacy.mjs +16 -15
- package/dist/legacy.mjs.map +1 -1
- package/dist/{position-Dk2b4ZMS.d.ts → position-C8a5g6bb.d.mts} +11 -6
- package/dist/{position-BmN1z36J.d.mts → position-H8tBL91b.d.ts} +11 -6
- package/dist/react.d.mts +11 -5
- package/dist/react.d.ts +11 -5
- package/dist/react.js +38 -38
- package/dist/react.mjs +5 -5
- package/dist/{responsive-CJxefsYw.d.mts → responsive-BB5d98xz.d.mts} +1 -1
- package/dist/{responsive-C4L1ESlm.d.ts → responsive-BXI-GCXG.d.ts} +1 -1
- package/dist/{types-Cxf4nHNr.d.mts → types-CokovIMH.d.mts} +98 -4
- package/dist/{types-Cxf4nHNr.d.ts → types-CokovIMH.d.ts} +98 -4
- package/index-dev.js +16 -0
- package/package.json +2 -1
- package/dist/chunk-2KUHNJXF.mjs +0 -90
- package/dist/chunk-2KUHNJXF.mjs.map +0 -1
- package/dist/chunk-3WO4SAYB.js.map +0 -1
- package/dist/chunk-4HNUMWQK.mjs.map +0 -1
- package/dist/chunk-BFTKGAP3.js.map +0 -1
- package/dist/chunk-F6NQPYKT.js +0 -98
- package/dist/chunk-F6NQPYKT.js.map +0 -1
- package/dist/chunk-H5KMDLY3.js.map +0 -1
- package/dist/chunk-PBQSHIID.js +0 -4
- package/dist/chunk-R35HZZTA.mjs.map +0 -1
- package/dist/chunk-ZCXE6SR5.mjs.map +0 -1
- package/dist/chunk-ZWN22PS2.mjs +0 -3
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/position.ts","../src/core/types.ts","../src/core/collision.ts","../src/core/sort.ts","../src/core/layout.ts","../src/core/compact-compat.ts","../src/core/compactors.ts","../src/core/responsive.ts"],"names":["getStatics","resolveCompactionCollision"],"mappings":"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","file":"chunk-4HNUMWQK.mjs","sourcesContent":["/**\n * Position calculation utilities.\n *\n * These functions convert between grid units and pixel positions,\n * and generate CSS styles for grid items.\n */\n\nimport type {\n Position,\n PartialPosition,\n ResizeHandleAxis,\n PositionStrategy\n} from \"./types.js\";\n\n// ============================================================================\n// CSS Style Generation\n// ============================================================================\n\n/**\n * Generate CSS transform-based positioning styles.\n *\n * Using transforms is more performant than top/left positioning\n * because it doesn't trigger layout recalculations.\n *\n * @param position - Position in pixels\n * @returns CSS style object\n */\nexport function setTransform({\n top,\n left,\n width,\n height\n}: Position): Record<string, string> {\n const translate = `translate(${left}px,${top}px)`;\n return {\n transform: translate,\n WebkitTransform: translate,\n MozTransform: translate,\n msTransform: translate,\n OTransform: translate,\n width: `${width}px`,\n height: `${height}px`,\n position: \"absolute\"\n };\n}\n\n/**\n * Generate CSS top/left positioning styles.\n *\n * Use this when transforms are not suitable (e.g., for printing\n * or when transform causes issues with child elements).\n *\n * @param position - Position in pixels\n * @returns CSS style object\n */\nexport function setTopLeft({\n top,\n left,\n width,\n height\n}: Position): Record<string, string> {\n return {\n top: `${top}px`,\n left: `${left}px`,\n width: `${width}px`,\n height: `${height}px`,\n position: \"absolute\"\n };\n}\n\n/**\n * Convert a number to a percentage string.\n *\n * @param num - Number to convert (0-1 range typically)\n * @returns Percentage string (e.g., \"50%\")\n */\nexport function perc(num: number): string {\n return num * 100 + \"%\";\n}\n\n// ============================================================================\n// Resize Direction Handling\n// ============================================================================\n\n/**\n * Constrain width to not overflow container.\n */\nfunction constrainWidth(\n left: number,\n currentWidth: number,\n newWidth: number,\n containerWidth: number\n): number {\n return left + newWidth > containerWidth ? currentWidth : newWidth;\n}\n\n/**\n * Constrain height to not go above container (negative top).\n */\nfunction constrainHeight(\n top: number,\n currentHeight: number,\n newHeight: number\n): number {\n return top < 0 ? currentHeight : newHeight;\n}\n\n/**\n * Constrain left to not be negative.\n */\nfunction constrainLeft(left: number): number {\n return Math.max(0, left);\n}\n\n/**\n * Constrain top to not be negative.\n */\nfunction constrainTop(top: number): number {\n return Math.max(0, top);\n}\n\n// Direction handlers\ntype ResizeHandler = (\n currentSize: Position,\n newSize: Position,\n containerWidth: number\n) => Position;\n\nconst resizeNorth: ResizeHandler = (currentSize, newSize, _containerWidth) => {\n const { left, height, width } = newSize;\n const top = currentSize.top - (height - currentSize.height);\n\n return {\n left,\n width,\n height: constrainHeight(top, currentSize.height, height),\n top: constrainTop(top)\n };\n};\n\nconst resizeEast: ResizeHandler = (currentSize, newSize, containerWidth) => {\n const { top, left, height, width } = newSize;\n return {\n top,\n height,\n width: constrainWidth(\n currentSize.left,\n currentSize.width,\n width,\n containerWidth\n ),\n left: constrainLeft(left)\n };\n};\n\nconst resizeWest: ResizeHandler = (currentSize, newSize, _containerWidth) => {\n const { top, height, width } = newSize;\n const left = currentSize.left + currentSize.width - width;\n\n if (left < 0) {\n return {\n height,\n width: currentSize.left + currentSize.width,\n top: constrainTop(top),\n left: 0\n };\n }\n\n return {\n height,\n width,\n top: constrainTop(top),\n left\n };\n};\n\nconst resizeSouth: ResizeHandler = (currentSize, newSize, _containerWidth) => {\n const { top, left, height, width } = newSize;\n return {\n width,\n left,\n height: constrainHeight(top, currentSize.height, height),\n top: constrainTop(top)\n };\n};\n\n// Compound directions (corners)\nconst resizeNorthEast: ResizeHandler = (currentSize, newSize, containerWidth) =>\n resizeNorth(\n currentSize,\n resizeEast(currentSize, newSize, containerWidth),\n containerWidth\n );\n\nconst resizeNorthWest: ResizeHandler = (currentSize, newSize, containerWidth) =>\n resizeNorth(\n currentSize,\n resizeWest(currentSize, newSize, containerWidth),\n containerWidth\n );\n\nconst resizeSouthEast: ResizeHandler = (currentSize, newSize, containerWidth) =>\n resizeSouth(\n currentSize,\n resizeEast(currentSize, newSize, containerWidth),\n containerWidth\n );\n\nconst resizeSouthWest: ResizeHandler = (currentSize, newSize, containerWidth) =>\n resizeSouth(\n currentSize,\n resizeWest(currentSize, newSize, containerWidth),\n containerWidth\n );\n\nconst resizeHandlerMap: Record<ResizeHandleAxis, ResizeHandler> = {\n n: resizeNorth,\n ne: resizeNorthEast,\n e: resizeEast,\n se: resizeSouthEast,\n s: resizeSouth,\n sw: resizeSouthWest,\n w: resizeWest,\n nw: resizeNorthWest\n};\n\n/**\n * Resize an item in a specific direction, clamping to container bounds.\n *\n * This handles the complex logic of resizing from different edges/corners,\n * ensuring the item doesn't overflow the container.\n *\n * @param direction - Which edge/corner is being dragged\n * @param currentSize - Current position and size\n * @param newSize - Requested new position and size\n * @param containerWidth - Width of the container\n * @returns Constrained position and size\n */\nexport function resizeItemInDirection(\n direction: ResizeHandleAxis,\n currentSize: Position,\n newSize: Position,\n containerWidth: number\n): Position {\n const handler = resizeHandlerMap[direction];\n\n // Fallback if direction not found (shouldn't happen with proper types)\n if (!handler) {\n return newSize;\n }\n\n return handler(currentSize, { ...currentSize, ...newSize }, containerWidth);\n}\n\n// ============================================================================\n// Position Strategies (v2 Composable Interface)\n// ============================================================================\n\n/**\n * CSS transform-based positioning strategy.\n *\n * Uses CSS transforms for positioning, which is more performant\n * as it doesn't trigger layout recalculations.\n *\n * This is the default strategy.\n */\nexport const transformStrategy: PositionStrategy = {\n type: \"transform\",\n scale: 1,\n\n calcStyle(pos: Position): React.CSSProperties {\n return setTransform(pos) as React.CSSProperties;\n },\n\n calcDragPosition(\n clientX: number,\n clientY: number,\n offsetX: number,\n offsetY: number\n ): PartialPosition {\n return {\n left: clientX - offsetX,\n top: clientY - offsetY\n };\n }\n};\n\n/**\n * Absolute (top/left) positioning strategy.\n *\n * Uses CSS top/left for positioning. Use this when CSS transforms\n * cause issues (e.g., printing, certain child element positioning).\n */\nexport const absoluteStrategy: PositionStrategy = {\n type: \"absolute\",\n scale: 1,\n\n calcStyle(pos: Position): React.CSSProperties {\n return setTopLeft(pos) as React.CSSProperties;\n },\n\n calcDragPosition(\n clientX: number,\n clientY: number,\n offsetX: number,\n offsetY: number\n ): PartialPosition {\n return {\n left: clientX - offsetX,\n top: clientY - offsetY\n };\n }\n};\n\n/**\n * Create a scaled transform strategy.\n *\n * Use this when the grid container is inside a scaled element\n * (e.g., `transform: scale(0.5)`). The scale factor adjusts\n * drag/resize calculations to account for the parent transform.\n *\n * @param scale - Scale factor (e.g., 0.5 for half size)\n * @returns Position strategy with scaled calculations\n *\n * @example\n * ```tsx\n * <div style={{ transform: 'scale(0.5)' }}>\n * <GridLayout positionStrategy={createScaledStrategy(0.5)} />\n * </div>\n * ```\n */\nexport function createScaledStrategy(scale: number): PositionStrategy {\n return {\n type: \"transform\",\n scale,\n\n calcStyle(pos: Position): React.CSSProperties {\n return setTransform(pos) as React.CSSProperties;\n },\n\n calcDragPosition(\n clientX: number,\n clientY: number,\n offsetX: number,\n offsetY: number\n ): PartialPosition {\n return {\n left: (clientX - offsetX) / scale,\n top: (clientY - offsetY) / scale\n };\n }\n };\n}\n\n/** Default position strategy (transform-based) */\nexport const defaultPositionStrategy = transformStrategy;\n","/**\n * Core types for react-grid-layout v2\n *\n * These types are framework-agnostic and define the data structures\n * used by the layout algorithms.\n */\n\n// ============================================================================\n// Resize Handle Types\n// ============================================================================\n\n/**\n * Axis identifiers for resize handles.\n * - Cardinal: 'n', 's', 'e', 'w' (north, south, east, west)\n * - Diagonal: 'ne', 'nw', 'se', 'sw'\n */\nexport type ResizeHandleAxis =\n | \"s\"\n | \"w\"\n | \"e\"\n | \"n\"\n | \"sw\"\n | \"nw\"\n | \"se\"\n | \"ne\";\n\n// ============================================================================\n// Layout Item Types\n// ============================================================================\n\n/**\n * A single item in the grid layout.\n *\n * Position (x, y) is in grid units, not pixels.\n * Size (w, h) is in grid units.\n */\nexport interface LayoutItem {\n /** Unique identifier for this item */\n i: string;\n\n /** X position in grid units (0-indexed from left) */\n x: number;\n\n /** Y position in grid units (0-indexed from top) */\n y: number;\n\n /** Width in grid units */\n w: number;\n\n /** Height in grid units */\n h: number;\n\n /** Minimum width in grid units */\n minW?: number;\n\n /** Minimum height in grid units */\n minH?: number;\n\n /** Maximum width in grid units */\n maxW?: number;\n\n /** Maximum height in grid units */\n maxH?: number;\n\n /**\n * If true, item cannot be dragged or resized, and other items\n * will move around it during compaction.\n */\n static?: boolean;\n\n /**\n * If false, item cannot be dragged (but may still be resizable).\n * Overrides grid-level isDraggable for this item.\n */\n isDraggable?: boolean;\n\n /**\n * If false, item cannot be resized (but may still be draggable).\n * Overrides grid-level isResizable for this item.\n */\n isResizable?: boolean;\n\n /**\n * Which resize handles to show for this item.\n * Overrides grid-level resizeHandles for this item.\n */\n resizeHandles?: ResizeHandleAxis[];\n\n /**\n * If true, item is constrained to the grid container bounds.\n * Overrides grid-level isBounded for this item.\n */\n isBounded?: boolean;\n\n /**\n * Internal flag set during drag/resize operations to indicate\n * the item has moved from its original position.\n * @internal\n */\n moved?: boolean;\n}\n\n/**\n * A layout is a readonly array of layout items.\n * Layouts should be treated as immutable.\n */\nexport type Layout = readonly LayoutItem[];\n\n// ============================================================================\n// Position & Size Types\n// ============================================================================\n\n/**\n * Pixel position and size of an element.\n */\nexport interface Position {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/**\n * Partial position (just coordinates, no size).\n */\nexport interface PartialPosition {\n left: number;\n top: number;\n}\n\n/**\n * Size in pixels.\n */\nexport interface Size {\n width: number;\n height: number;\n}\n\n/**\n * Position when dropping an external element onto the grid.\n */\nexport interface DroppingPosition {\n left: number;\n top: number;\n e: Event;\n}\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\n/**\n * Data provided by react-draggable during drag operations.\n */\nexport interface ReactDraggableCallbackData {\n node: HTMLElement;\n x?: number;\n y?: number;\n deltaX: number;\n deltaY: number;\n lastX?: number;\n lastY?: number;\n}\n\n/**\n * Grid-level drag event data.\n */\nexport interface GridDragEvent {\n e: Event;\n node: HTMLElement;\n newPosition: PartialPosition;\n}\n\n/**\n * Grid-level resize event data.\n */\nexport interface GridResizeEvent {\n e: Event;\n node: HTMLElement;\n size: Size;\n handle: ResizeHandleAxis;\n}\n\n/**\n * Drag-over event with layer coordinates.\n */\nexport interface DragOverEvent extends MouseEvent {\n nativeEvent: Event & {\n layerX: number;\n layerY: number;\n };\n}\n\n// ============================================================================\n// Compaction Types\n// ============================================================================\n\n/**\n * Type of compaction to apply to the layout.\n * - 'vertical': Items compact upward (default)\n * - 'horizontal': Items compact leftward\n * - null: No compaction (free-form positioning)\n */\nexport type CompactType = \"horizontal\" | \"vertical\" | null;\n\n// ============================================================================\n// Callback Types\n// ============================================================================\n\n/**\n * Standard callback signature for layout change events.\n *\n * @param layout - The current layout after the change\n * @param oldItem - The item before the change (null if not applicable)\n * @param newItem - The item after the change (null if not applicable)\n * @param placeholder - The placeholder item during drag/resize (null at start)\n * @param event - The DOM event that triggered the change\n * @param element - The DOM element being manipulated (null if not applicable)\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 | null\n) => void;\n\n/**\n * Callback when layout changes for any reason.\n */\nexport type OnLayoutChangeCallback = (layout: Layout) => void;\n\n// ============================================================================\n// Composable Interfaces (v2 API)\n// ============================================================================\n\n/**\n * Interface for layout compaction strategies.\n *\n * Implement this interface to create custom compaction algorithms.\n *\n * @example\n * ```typescript\n * const myCompactor: Compactor = {\n * type: 'vertical',\n * allowOverlap: false,\n * compact(layout, cols) {\n * // Custom compaction logic\n * return compactedLayout;\n * },\n * onMove(layout, item, x, y, cols) {\n * // Handle item movement\n * return updatedLayout;\n * }\n * };\n * ```\n */\nexport interface Compactor {\n /** Compaction type identifier */\n readonly type: CompactType;\n\n /** Whether overlapping items are allowed */\n readonly allowOverlap: boolean;\n\n /** Whether to prevent collisions instead of pushing items */\n readonly preventCollision?: boolean;\n\n /**\n * Compact the layout.\n *\n * @param layout - The layout to compact\n * @param cols - Number of columns in the grid\n * @returns The compacted layout\n */\n compact(layout: Layout, cols: number): Layout;\n\n /**\n * Handle item movement, returning the updated layout.\n *\n * @param layout - Current layout\n * @param item - The item being moved\n * @param x - New x position\n * @param y - New y position\n * @param cols - Number of columns\n * @returns Updated layout after the move\n */\n onMove(\n layout: Layout,\n item: LayoutItem,\n x: number,\n y: number,\n cols: number\n ): Layout;\n}\n\n/**\n * Interface for CSS positioning strategies.\n *\n * Implement this interface to customize how items are positioned in the DOM.\n * Built-in strategies: transformStrategy, absoluteStrategy.\n *\n * @example\n * ```typescript\n * // Use transform-based positioning (default, better performance)\n * <GridLayout positionStrategy={transformStrategy} />\n *\n * // Use top/left positioning (for environments where transforms cause issues)\n * <GridLayout positionStrategy={absoluteStrategy} />\n *\n * // Use scaled transforms (for scaled containers)\n * <GridLayout positionStrategy={createScaledStrategy(0.5)} />\n * ```\n */\nexport interface PositionStrategy {\n /** Strategy type identifier */\n readonly type: \"transform\" | \"absolute\";\n\n /** Scale factor for drag/resize calculations */\n readonly scale: number;\n\n /**\n * Convert pixel position to CSS style object.\n *\n * @param pos - Position in pixels\n * @returns CSS properties for positioning the element\n */\n calcStyle(pos: Position): React.CSSProperties;\n\n /**\n * Calculate position during drag operations, accounting for transforms and scale.\n *\n * @param clientX - Mouse client X position\n * @param clientY - Mouse client Y position\n * @param offsetX - Offset from element origin X\n * @param offsetY - Offset from element origin Y\n * @returns Adjusted left/top position\n */\n calcDragPosition(\n clientX: number,\n clientY: number,\n offsetX: number,\n offsetY: number\n ): PartialPosition;\n}\n\n// ============================================================================\n// Grid Configuration Types (v2 Composable Interfaces)\n// ============================================================================\n\n/**\n * Grid measurement configuration.\n * Groups all grid metrics (columns, row height, margins).\n */\nexport interface GridConfig {\n /** Number of columns in the grid (default: 12) */\n cols: number;\n\n /** Height of a single row in pixels (default: 150) */\n rowHeight: number;\n\n /** [horizontal, vertical] margin between items in pixels (default: [10, 10]) */\n margin: readonly [number, number];\n\n /** [horizontal, vertical] padding inside the container (default: null, uses margin) */\n containerPadding: readonly [number, number] | null;\n\n /** Maximum number of rows (default: Infinity) */\n maxRows: number;\n}\n\n/** Default grid configuration */\nexport const defaultGridConfig: GridConfig = {\n cols: 12,\n rowHeight: 150,\n margin: [10, 10],\n containerPadding: null,\n maxRows: Infinity\n};\n\n/**\n * Drag behavior configuration.\n * Groups all drag-related settings.\n */\nexport interface DragConfig {\n /** Whether items can be dragged (default: true) */\n enabled: boolean;\n\n /** Whether items are bounded to the container (default: false) */\n bounded: boolean;\n\n /** CSS selector for drag handle (e.g., '.drag-handle') */\n handle?: string;\n\n /** CSS selector for elements that should not trigger drag */\n cancel?: string;\n\n /**\n * Minimum pixels to move before drag starts.\n * Helps distinguish click from drag (fixes #1341, #1401).\n * @default 3\n */\n threshold: number;\n}\n\n/** Default drag configuration */\nexport const defaultDragConfig: DragConfig = {\n enabled: true,\n bounded: false,\n threshold: 3\n};\n\n/**\n * Resize behavior configuration.\n * Groups all resize-related settings.\n */\nexport interface ResizeConfig {\n /** Whether items can be resized (default: true) */\n enabled: boolean;\n\n /** Which resize handles to show (default: ['se']) */\n handles: readonly ResizeHandleAxis[];\n\n /**\n * Custom resize handle component.\n * Can be a React node or a function that receives the axis.\n */\n handleComponent?:\n | React.ReactNode\n | ((\n axis: ResizeHandleAxis,\n ref: React.Ref<HTMLElement>\n ) => React.ReactNode);\n}\n\n/** Default resize configuration */\nexport const defaultResizeConfig: ResizeConfig = {\n enabled: true,\n handles: [\"se\"]\n};\n\n/**\n * Drop configuration (for dropping external elements).\n * Groups all drop-related settings.\n */\nexport interface DropConfig {\n /** Whether external elements can be dropped on the grid (default: false) */\n enabled: boolean;\n\n /** Default size for dropped items (default: { w: 1, h: 1 }) */\n defaultItem: { w: number; h: number };\n\n /**\n * Called when dragging over the grid.\n * Return dimensions to override defaultItem, or false to reject the drop.\n */\n onDragOver?: (e: DragEvent) => { w?: number; h?: number } | false | void;\n}\n\n/** Default drop configuration */\nexport const defaultDropConfig: DropConfig = {\n enabled: false,\n defaultItem: { w: 1, h: 1 }\n};\n\n// ============================================================================\n// Responsive Types\n// ============================================================================\n\n/**\n * Breakpoint name (e.g., 'lg', 'md', 'sm', 'xs', 'xxs').\n */\nexport type Breakpoint = string;\n\n/**\n * Map of breakpoint name to pixel width.\n * Generic type B allows custom breakpoint strings.\n */\nexport type Breakpoints<B extends Breakpoint = Breakpoint> = Record<B, number>;\n\n/**\n * Map of breakpoint name to number of columns.\n * Generic type B allows custom breakpoint strings.\n */\nexport type BreakpointCols<B extends Breakpoint = Breakpoint> = Record<\n B,\n number\n>;\n\n/**\n * Map of breakpoint name to layout.\n * Generic type B allows custom breakpoint strings.\n */\nexport type ResponsiveLayouts<B extends Breakpoint = Breakpoint> = Partial<\n Record<B, Layout>\n>;\n\n/**\n * Callback when breakpoint changes.\n */\nexport type OnBreakpointChangeCallback<B extends Breakpoint = Breakpoint> = (\n newBreakpoint: B,\n cols: number\n) => void;\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Makes all properties in T mutable (removes readonly).\n */\nexport type Mutable<T> = {\n -readonly [P in keyof T]: T[P];\n};\n\n/**\n * Deep partial - all properties and nested properties are optional.\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n/**\n * Extract the element type from an array type.\n */\nexport type ArrayElement<T> = T extends readonly (infer U)[] ? U : never;\n","/**\n * Collision detection utilities for grid layouts.\n *\n * These functions determine if and where layout items overlap.\n */\n\nimport type { Layout, LayoutItem } from \"./types.js\";\n\n/**\n * Check if two layout items collide (overlap).\n *\n * Two items collide if their bounding boxes overlap and they are\n * not the same item.\n *\n * @param l1 - First layout item\n * @param l2 - Second layout item\n * @returns true if the items collide\n */\nexport function collides(l1: LayoutItem, l2: LayoutItem): boolean {\n // Same element - can't collide with itself\n if (l1.i === l2.i) return false;\n\n // Check if bounding boxes don't overlap (any gap means no collision)\n if (l1.x + l1.w <= l2.x) return false; // l1 is completely left of l2\n if (l1.x >= l2.x + l2.w) return false; // l1 is completely right of l2\n if (l1.y + l1.h <= l2.y) return false; // l1 is completely above l2\n if (l1.y >= l2.y + l2.h) return false; // l1 is completely below l2\n\n // Bounding boxes overlap\n return true;\n}\n\n/**\n * Find the first item in the layout that collides with the given item.\n *\n * @param layout - Layout to search\n * @param layoutItem - Item to check for collisions\n * @returns The first colliding item, or undefined if none\n */\nexport function getFirstCollision(\n layout: Layout,\n layoutItem: LayoutItem\n): LayoutItem | undefined {\n for (let i = 0; i < layout.length; i++) {\n const item = layout[i];\n if (item !== undefined && collides(item, layoutItem)) {\n return item;\n }\n }\n return undefined;\n}\n\n/**\n * Find all items in the layout that collide with the given item.\n *\n * @param layout - Layout to search\n * @param layoutItem - Item to check for collisions\n * @returns Array of all colliding items (may be empty)\n */\nexport function getAllCollisions(\n layout: Layout,\n layoutItem: LayoutItem\n): LayoutItem[] {\n return layout.filter((l): l is LayoutItem => collides(l, layoutItem));\n}\n","/**\n * Sorting utilities for grid layouts.\n *\n * These functions sort layout items for compaction and iteration.\n */\n\nimport type { CompactType, Layout, LayoutItem } from \"./types.js\";\n\n/**\n * Sort layout items based on the compaction type.\n *\n * - Vertical compaction: sort by row (y) then column (x)\n * - Horizontal compaction: sort by column (x) then row (y)\n * - No compaction (null): return original order\n *\n * Does not modify the original layout.\n *\n * @param layout - Layout to sort\n * @param compactType - Type of compaction\n * @returns Sorted layout\n */\nexport function sortLayoutItems(\n layout: Layout,\n compactType: CompactType\n): LayoutItem[] {\n if (compactType === \"horizontal\") {\n return sortLayoutItemsByColRow(layout);\n }\n if (compactType === \"vertical\") {\n return sortLayoutItemsByRowCol(layout);\n }\n // No compaction - return a copy to maintain immutability\n return [...layout];\n}\n\n/**\n * Sort layout items by row ascending, then column ascending.\n *\n * Items are ordered from top-left to bottom-right, row by row.\n * This is the natural reading order for vertical compaction.\n *\n * Does not modify the original layout.\n *\n * @param layout - Layout to sort\n * @returns Sorted array of layout items\n */\nexport function sortLayoutItemsByRowCol(layout: Layout): LayoutItem[] {\n return [...layout].sort((a, b) => {\n // Primary sort by row (y)\n if (a.y !== b.y) {\n return a.y - b.y;\n }\n // Secondary sort by column (x)\n return a.x - b.x;\n });\n}\n\n/**\n * Sort layout items by column ascending, then row ascending.\n *\n * Items are ordered from top-left to bottom-right, column by column.\n * This is the natural order for horizontal compaction.\n *\n * Does not modify the original layout.\n *\n * @param layout - Layout to sort\n * @returns Sorted array of layout items\n */\nexport function sortLayoutItemsByColRow(layout: Layout): LayoutItem[] {\n return [...layout].sort((a, b) => {\n // Primary sort by column (x)\n if (a.x !== b.x) {\n return a.x - b.x;\n }\n // Secondary sort by row (y)\n return a.y - b.y;\n });\n}\n","/**\n * Core layout manipulation utilities.\n *\n * These functions create, modify, and query grid layouts.\n * All functions treat layouts as immutable - they return new arrays/objects.\n */\n\nimport type { CompactType, Layout, LayoutItem, Mutable } from \"./types.js\";\nimport { getAllCollisions, getFirstCollision } from \"./collision.js\";\nimport { sortLayoutItems } from \"./sort.js\";\n\n// ============================================================================\n// Layout Queries\n// ============================================================================\n\n/**\n * Get the bottom-most Y coordinate of the layout.\n *\n * This is the Y position plus height of the lowest item.\n *\n * @param layout - Layout to measure\n * @returns The bottom Y coordinate (0 if layout is empty)\n */\nexport function bottom(layout: Layout): number {\n let max = 0;\n for (let i = 0; i < layout.length; i++) {\n const item = layout[i];\n if (item !== undefined) {\n const bottomY = item.y + item.h;\n if (bottomY > max) max = bottomY;\n }\n }\n return max;\n}\n\n/**\n * Get a layout item by its ID.\n *\n * @param layout - Layout to search\n * @param id - Item ID to find\n * @returns The layout item, or undefined if not found\n */\nexport function getLayoutItem(\n layout: Layout,\n id: string\n): LayoutItem | undefined {\n for (let i = 0; i < layout.length; i++) {\n const item = layout[i];\n if (item !== undefined && item.i === id) {\n return item;\n }\n }\n return undefined;\n}\n\n/**\n * Get all static items from the layout.\n *\n * Static items cannot be moved or resized by the user.\n *\n * @param layout - Layout to filter\n * @returns Array of static layout items\n */\nexport function getStatics(layout: Layout): LayoutItem[] {\n return layout.filter((l): l is LayoutItem => l.static === true);\n}\n\n// ============================================================================\n// Layout Cloning\n// ============================================================================\n\n/**\n * Clone a layout item.\n *\n * Creates a shallow copy with all properties preserved.\n * Boolean properties are normalized (undefined becomes false).\n *\n * @param layoutItem - Item to clone\n * @returns A new layout item with the same properties\n */\nexport function cloneLayoutItem(layoutItem: LayoutItem): LayoutItem {\n return {\n i: layoutItem.i,\n x: layoutItem.x,\n y: layoutItem.y,\n w: layoutItem.w,\n h: layoutItem.h,\n minW: layoutItem.minW,\n maxW: layoutItem.maxW,\n minH: layoutItem.minH,\n maxH: layoutItem.maxH,\n moved: Boolean(layoutItem.moved),\n static: Boolean(layoutItem.static),\n isDraggable: layoutItem.isDraggable,\n isResizable: layoutItem.isResizable,\n resizeHandles: layoutItem.resizeHandles,\n isBounded: layoutItem.isBounded\n };\n}\n\n/**\n * Clone an entire layout.\n *\n * Creates a new array with cloned items.\n *\n * @param layout - Layout to clone\n * @returns A new layout with cloned items\n */\nexport function cloneLayout(layout: Layout): LayoutItem[] {\n const newLayout: LayoutItem[] = new Array(layout.length);\n for (let i = 0; i < layout.length; i++) {\n const item = layout[i];\n if (item !== undefined) {\n newLayout[i] = cloneLayoutItem(item);\n }\n }\n return newLayout;\n}\n\n// ============================================================================\n// Layout Modification\n// ============================================================================\n\n/**\n * Replace a layout item in a layout.\n *\n * Returns a new layout with the item replaced. Other items are not cloned.\n *\n * @param layout - Layout to modify\n * @param layoutItem - New item (matched by `i` property)\n * @returns New layout with the item replaced\n */\nexport function modifyLayout(\n layout: Layout,\n layoutItem: LayoutItem\n): LayoutItem[] {\n const newLayout: LayoutItem[] = new Array(layout.length);\n for (let i = 0; i < layout.length; i++) {\n const item = layout[i];\n if (item !== undefined) {\n if (layoutItem.i === item.i) {\n newLayout[i] = layoutItem;\n } else {\n newLayout[i] = item;\n }\n }\n }\n return newLayout;\n}\n\n/**\n * Apply a transformation to a layout item.\n *\n * Finds the item by key, clones it, applies the callback, and returns\n * a new layout with the modified item.\n *\n * @param layout - Layout to modify\n * @param itemKey - Key of the item to modify\n * @param cb - Callback that receives the cloned item and returns the modified item\n * @returns Tuple of [new layout, modified item or null if not found]\n */\nexport function withLayoutItem(\n layout: Layout,\n itemKey: string,\n cb: (item: LayoutItem) => LayoutItem\n): [LayoutItem[], LayoutItem | null] {\n let item = getLayoutItem(layout, itemKey);\n if (!item) {\n return [[...layout], null];\n }\n\n // Clone, then modify via callback\n item = cb(cloneLayoutItem(item));\n const newLayout = modifyLayout(layout, item);\n\n return [newLayout, item];\n}\n\n// ============================================================================\n// Bounds Correction\n// ============================================================================\n\n/**\n * Ensure all layout items fit within the grid bounds.\n *\n * - Items overflowing right are moved left\n * - Items overflowing left are moved to x=0 and clamped to grid width\n * - Static items that collide with other statics are moved down\n *\n * **IMPORTANT**: This function mutates the layout items in place for performance.\n * The type signature uses `Mutable<LayoutItem>[]` to make this explicit.\n * Clone the layout first (e.g., with `cloneLayout()`) if you need immutability.\n *\n * @param layout - Layout to correct (items WILL be mutated)\n * @param bounds - Grid bounds\n * @returns The same layout array (for chaining)\n */\nexport function correctBounds(\n layout: Mutable<LayoutItem>[],\n bounds: { cols: number }\n): LayoutItem[] {\n const collidesWith = getStatics(layout);\n\n for (let i = 0; i < layout.length; i++) {\n const l = layout[i];\n if (l === undefined) continue;\n\n // Overflows right\n if (l.x + l.w > bounds.cols) {\n l.x = bounds.cols - l.w;\n }\n\n // Overflows left\n if (l.x < 0) {\n l.x = 0;\n l.w = bounds.cols;\n }\n\n if (!l.static) {\n collidesWith.push(l);\n } else {\n // Static items that collide with other statics must be moved down\n while (getFirstCollision(collidesWith, l)) {\n l.y++;\n }\n }\n }\n\n return layout;\n}\n\n// ============================================================================\n// Move Operations\n// ============================================================================\n\n/**\n * Move a layout element to a new position.\n *\n * Handles collision detection and cascading movements.\n * Does not compact the layout - call `compact()` separately.\n *\n * **Note**: This function mutates the `l` parameter directly for performance.\n * The item's x, y, and moved properties will be modified. Callers should\n * ideally pass a cloned item if they need to preserve the original.\n *\n * @param layout - Full layout\n * @param l - Item to move (will be mutated)\n * @param x - New X position (or undefined to keep current)\n * @param y - New Y position (or undefined to keep current)\n * @param isUserAction - True if this is a direct user action (affects collision resolution)\n * @param preventCollision - True to prevent movement if it causes collision\n * @param compactType - Compaction type for collision resolution\n * @param cols - Number of columns in the grid\n * @param allowOverlap - True to allow items to overlap\n * @returns The updated layout\n */\nexport function moveElement(\n layout: Layout,\n l: LayoutItem,\n x: number | undefined,\n y: number | undefined,\n isUserAction: boolean | undefined,\n preventCollision: boolean | undefined,\n compactType: CompactType,\n cols: number,\n allowOverlap?: boolean\n): LayoutItem[] {\n // Static items can't be moved unless explicitly draggable\n if (l.static && l.isDraggable !== true) {\n return [...layout];\n }\n\n // Short-circuit if position unchanged\n if (l.y === y && l.x === x) {\n return [...layout];\n }\n\n const oldX = l.x;\n const oldY = l.y;\n\n // Update position (mutates l directly - see JSDoc note)\n if (typeof x === \"number\") (l as Mutable<LayoutItem>).x = x;\n if (typeof y === \"number\") (l as Mutable<LayoutItem>).y = y;\n (l as Mutable<LayoutItem>).moved = true;\n\n // Sort for proper collision detection order\n let sorted = sortLayoutItems(layout, compactType);\n const movingUp =\n compactType === \"vertical\" && typeof y === \"number\"\n ? oldY >= y\n : compactType === \"horizontal\" && typeof x === \"number\"\n ? oldX >= x\n : false;\n\n if (movingUp) {\n sorted = sorted.reverse();\n }\n\n const collisions = getAllCollisions(sorted, l);\n const hasCollisions = collisions.length > 0;\n\n // Handle overlap mode - just clone and return\n if (hasCollisions && allowOverlap) {\n return cloneLayout(layout);\n }\n\n // Handle prevent collision mode - revert position\n // Return same reference to signal no change occurred\n if (hasCollisions && preventCollision) {\n (l as Mutable<LayoutItem>).x = oldX;\n (l as Mutable<LayoutItem>).y = oldY;\n (l as Mutable<LayoutItem>).moved = false;\n return layout as LayoutItem[];\n }\n\n // Resolve collisions by moving other items\n let resultLayout: LayoutItem[] = [...layout];\n for (let i = 0; i < collisions.length; i++) {\n const collision = collisions[i];\n if (collision === undefined) continue;\n\n // Skip already-moved items to prevent infinite loops\n if (collision.moved) continue;\n\n // Static items can't be moved - move the dragged item instead\n if (collision.static) {\n resultLayout = moveElementAwayFromCollision(\n resultLayout,\n collision,\n l,\n isUserAction,\n compactType,\n cols\n );\n } else {\n resultLayout = moveElementAwayFromCollision(\n resultLayout,\n l,\n collision,\n isUserAction,\n compactType,\n cols\n );\n }\n }\n\n return resultLayout;\n}\n\n/**\n * Move an item away from a collision.\n *\n * Attempts to move the item up/left first if there's room,\n * otherwise moves it down/right.\n *\n * @param layout - Full layout\n * @param collidesWith - The item being collided with\n * @param itemToMove - The item to move away\n * @param isUserAction - True if this is a direct user action\n * @param compactType - Compaction type\n * @param cols - Number of columns\n * @returns Updated layout\n */\nexport function moveElementAwayFromCollision(\n layout: Layout,\n collidesWith: LayoutItem,\n itemToMove: LayoutItem,\n isUserAction: boolean | undefined,\n compactType: CompactType,\n cols: number\n): LayoutItem[] {\n const compactH = compactType === \"horizontal\";\n const compactV = compactType === \"vertical\";\n const preventCollision = collidesWith.static;\n\n // Try to move up/left first (only on primary collision from user action)\n if (isUserAction) {\n isUserAction = false; // Only try this once\n\n // Create a fake item to test if there's room above/left\n const fakeItem: LayoutItem = {\n x: compactH ? Math.max(collidesWith.x - itemToMove.w, 0) : itemToMove.x,\n y: compactV ? Math.max(collidesWith.y - itemToMove.h, 0) : itemToMove.y,\n w: itemToMove.w,\n h: itemToMove.h,\n i: \"-1\"\n };\n\n const firstCollision = getFirstCollision(layout, fakeItem);\n const collisionNorth =\n firstCollision !== undefined &&\n firstCollision.y + firstCollision.h > collidesWith.y;\n const collisionWest =\n firstCollision !== undefined &&\n collidesWith.x + collidesWith.w > firstCollision.x;\n\n // No collision above/left - we can move there\n if (!firstCollision) {\n return moveElement(\n layout,\n itemToMove,\n compactH ? fakeItem.x : undefined,\n compactV ? fakeItem.y : undefined,\n isUserAction,\n preventCollision,\n compactType,\n cols\n );\n }\n\n // Handle specific collision cases\n if (collisionNorth && compactV) {\n return moveElement(\n layout,\n itemToMove,\n undefined,\n itemToMove.y + 1,\n isUserAction,\n preventCollision,\n compactType,\n cols\n );\n }\n\n if (collisionNorth && compactType === null) {\n // Swap positions in free-form mode\n (collidesWith as Mutable<LayoutItem>).y = itemToMove.y;\n (itemToMove as Mutable<LayoutItem>).y = itemToMove.y + itemToMove.h;\n return [...layout];\n }\n\n if (collisionWest && compactH) {\n return moveElement(\n layout,\n collidesWith,\n itemToMove.x,\n undefined,\n isUserAction,\n preventCollision,\n compactType,\n cols\n );\n }\n }\n\n // Default: move down/right by 1\n const newX = compactH ? itemToMove.x + 1 : undefined;\n const newY = compactV ? itemToMove.y + 1 : undefined;\n\n if (newX === undefined && newY === undefined) {\n return [...layout];\n }\n\n return moveElement(\n layout,\n itemToMove,\n newX,\n newY,\n isUserAction,\n preventCollision,\n compactType,\n cols\n );\n}\n\n// ============================================================================\n// Validation\n// ============================================================================\n\n/**\n * Validate that a layout has the required properties.\n *\n * @param layout - Layout to validate\n * @param contextName - Name for error messages\n * @throws Error if layout is invalid\n */\nexport function validateLayout(\n layout: Layout,\n contextName: string = \"Layout\"\n): void {\n const requiredProps = [\"x\", \"y\", \"w\", \"h\"] as const;\n\n if (!Array.isArray(layout)) {\n throw new Error(`${contextName} must be an array!`);\n }\n\n for (let i = 0; i < layout.length; i++) {\n const item = layout[i];\n if (item === undefined) continue;\n\n for (const key of requiredProps) {\n const value = item[key];\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n throw new Error(\n `ReactGridLayout: ${contextName}[${i}].${key} must be a number! ` +\n `Received: ${String(value)} (${typeof value})`\n );\n }\n }\n\n if (item.i !== undefined && typeof item.i !== \"string\") {\n throw new Error(\n `ReactGridLayout: ${contextName}[${i}].i must be a string! ` +\n `Received: ${String(item.i)} (${typeof item.i})`\n );\n }\n }\n}\n","/**\n * Legacy compaction API - backwards compatibility layer.\n *\n * This file implements the exact v1 compaction algorithm for backwards compatibility.\n * The algorithm matches lib/utils.js compact/compactItem functions exactly.\n */\n\nimport type { CompactType, Layout, LayoutItem, Mutable } from \"./types.js\";\nimport { cloneLayoutItem, bottom } from \"./layout.js\";\nimport { getFirstCollision, collides } from \"./collision.js\";\nimport { sortLayoutItems } from \"./sort.js\";\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get all static items from a layout\n */\nfunction getStatics(layout: Layout): LayoutItem[] {\n return layout.filter(l => l.static);\n}\n\nconst heightWidth: { x: \"w\"; y: \"h\" } = { x: \"w\", y: \"h\" };\n\n/**\n * Before moving item down/right, check if movement will cause collisions\n * and move those items first. This is the recursive collision resolver.\n */\nfunction resolveCompactionCollision(\n layout: Layout,\n item: LayoutItem,\n moveToCoord: number,\n axis: \"x\" | \"y\"\n): void {\n const sizeProp = heightWidth[axis];\n (item as Mutable<LayoutItem>)[axis] += 1;\n\n const itemIndex = layout.findIndex(l => l.i === item.i);\n\n // Go through each item we collide with\n for (let i = itemIndex + 1; i < layout.length; i++) {\n const otherItem = layout[i];\n if (otherItem === undefined) continue;\n\n // Ignore static items\n if (otherItem.static) continue;\n\n // Optimization: we can break early if we know we're past this element\n // We can do this because it's a sorted layout\n if (otherItem.y > item.y + item.h) break;\n\n if (collides(item, otherItem)) {\n resolveCompactionCollision(\n layout,\n otherItem,\n moveToCoord + item[sizeProp],\n axis\n );\n }\n }\n\n (item as Mutable<LayoutItem>)[axis] = moveToCoord;\n}\n\n/**\n * Compact a single item in the layout.\n *\n * This is the exact algorithm from lib/utils.js compactItem.\n */\nfunction compactItemInternal(\n compareWith: Layout,\n l: LayoutItem,\n compactType: CompactType,\n cols: number,\n fullLayout: Layout,\n allowOverlap: boolean | undefined,\n b: number | undefined\n): LayoutItem {\n const compactV = compactType === \"vertical\";\n const compactH = compactType === \"horizontal\";\n\n if (compactV) {\n // Bottom 'y' possible is the bottom of the layout.\n // This allows you to do nice stuff like specify {y: Infinity}\n if (typeof b === \"number\") {\n (l as Mutable<LayoutItem>).y = Math.min(b, l.y);\n } else {\n (l as Mutable<LayoutItem>).y = Math.min(bottom(compareWith), l.y);\n }\n // Move the element up as far as it can go without colliding.\n while (l.y > 0 && !getFirstCollision(compareWith, l)) {\n (l as Mutable<LayoutItem>).y--;\n }\n } else if (compactH) {\n // Move the element left as far as it can go without colliding.\n while (l.x > 0 && !getFirstCollision(compareWith, l)) {\n (l as Mutable<LayoutItem>).x--;\n }\n }\n\n // Move it down/right, and keep moving if it's colliding.\n let collision: LayoutItem | undefined;\n // Checking the compactType null value to avoid breaking the layout when overlapping is allowed.\n while (\n (collision = getFirstCollision(compareWith, l)) !== undefined &&\n !(compactType === null && allowOverlap)\n ) {\n if (compactH) {\n resolveCompactionCollision(fullLayout, l, collision.x + collision.w, \"x\");\n } else {\n resolveCompactionCollision(fullLayout, l, collision.y + collision.h, \"y\");\n }\n\n // Since we can't grow without bounds horizontally, if we've overflown,\n // let's move it down and try again.\n if (compactH && l.x + l.w > cols) {\n (l as Mutable<LayoutItem>).x = cols - l.w;\n (l as Mutable<LayoutItem>).y++;\n // Also move element as left as we can\n while (l.x > 0 && !getFirstCollision(compareWith, l)) {\n (l as Mutable<LayoutItem>).x--;\n }\n }\n }\n\n // Ensure that there are no negative positions\n (l as Mutable<LayoutItem>).y = Math.max(l.y, 0);\n (l as Mutable<LayoutItem>).x = Math.max(l.x, 0);\n\n return l;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Compact a layout by removing gaps between items.\n *\n * This is the exact algorithm from lib/utils.js compact function.\n *\n * @param layout - Layout to compact\n * @param compactType - 'vertical', 'horizontal', or null\n * @param cols - Number of columns in the grid\n * @param allowOverlap - If true, overlapping is allowed\n * @returns Compacted layout\n */\nexport function compact(\n layout: Layout,\n compactType: CompactType,\n cols: number,\n allowOverlap?: boolean\n): LayoutItem[] {\n // Statics go in the compareWith array right away so items flow around them.\n const compareWith = getStatics(layout);\n // We keep track of the bottom position.\n let b = bottom(compareWith);\n // We go through the items by row and column (or col and row for horizontal).\n const sorted = sortLayoutItems(layout, compactType);\n // Holding for new items.\n const out: LayoutItem[] = new Array(layout.length);\n\n for (let i = 0; i < sorted.length; i++) {\n const sortedItem = sorted[i];\n if (sortedItem === undefined) continue;\n\n let l = cloneLayoutItem(sortedItem);\n\n // Don't move static elements\n if (!l.static) {\n l = compactItemInternal(\n compareWith,\n l,\n compactType,\n cols,\n sorted,\n allowOverlap,\n b\n );\n b = Math.max(b, l.y + l.h);\n\n // Add to comparison array. We only collide with items before this one.\n // Statics are already in this array.\n compareWith.push(l);\n }\n\n // Add to output array to make sure they still come out in the right order.\n const originalIndex = layout.indexOf(sortedItem);\n out[originalIndex] = l;\n\n // Clear moved flag, if it exists.\n (l as Mutable<LayoutItem>).moved = false;\n }\n\n return out;\n}\n\n/**\n * Compact a single item within the layout.\n *\n * @deprecated Use compact() instead, which handles the full layout.\n */\nexport function compactItem(\n compareWith: Layout,\n l: LayoutItem,\n compactType: CompactType,\n cols: number,\n fullLayout: Layout,\n allowOverlap: boolean | undefined,\n maxY: number | undefined\n): LayoutItem {\n return compactItemInternal(\n compareWith,\n cloneLayoutItem(l),\n compactType,\n cols,\n fullLayout,\n allowOverlap,\n maxY\n );\n}\n","/**\n * Compactor implementations.\n *\n * Compactors are pluggable strategies for removing gaps between grid items.\n * Use the Compactor interface to create custom compaction algorithms.\n */\n\nimport type { Compactor, Layout, LayoutItem, Mutable } from \"./types.js\";\nimport { getFirstCollision } from \"./collision.js\";\nimport { sortLayoutItemsByRowCol, sortLayoutItemsByColRow } from \"./sort.js\";\nimport { bottom, cloneLayoutItem, getStatics, cloneLayout } from \"./layout.js\";\nimport { collides } from \"./collision.js\";\n\n// ============================================================================\n// Helpers for Custom Compactors\n// ============================================================================\n\n/**\n * Resolve a compaction collision by moving items.\n *\n * Before moving an item to a position, checks if that movement would\n * cause collisions and recursively moves those items first.\n *\n * Useful for implementing custom compactors.\n *\n * @param layout - Full layout (must be sorted for optimization)\n * @param item - Item being moved (will be mutated)\n * @param moveToCoord - Target coordinate\n * @param axis - Which axis to move on ('x' or 'y')\n */\nexport function resolveCompactionCollision(\n layout: Layout,\n item: LayoutItem,\n moveToCoord: number,\n axis: \"x\" | \"y\"\n): void {\n const sizeProp = axis === \"x\" ? \"w\" : \"h\";\n\n // Temporarily increment position to check for collisions\n (item as Mutable<LayoutItem>)[axis] += 1;\n\n const itemIndex = layout.findIndex(l => l.i === item.i);\n\n for (let i = itemIndex + 1; i < layout.length; i++) {\n const otherItem = layout[i];\n if (otherItem === undefined) continue;\n if (otherItem.static) continue;\n if (otherItem.y > item.y + item.h) break;\n\n if (collides(item, otherItem)) {\n resolveCompactionCollision(\n layout,\n otherItem,\n moveToCoord + item[sizeProp],\n axis\n );\n }\n }\n\n (item as Mutable<LayoutItem>)[axis] = moveToCoord;\n}\n\n/**\n * Compact a single item vertically (move up).\n *\n * Moves the item as far up as possible without colliding.\n * Useful for implementing custom vertical compactors.\n *\n * @param compareWith - Items to check for collisions\n * @param l - Item to compact (will be mutated)\n * @param fullLayout - Full layout for collision resolution\n * @param maxY - Maximum Y to start from\n * @returns The compacted item\n */\nexport function compactItemVertical(\n compareWith: Layout,\n l: LayoutItem,\n fullLayout: Layout,\n maxY: number\n): LayoutItem {\n // Limit Y to the current bottom\n (l as Mutable<LayoutItem>).y = Math.min(maxY, l.y);\n\n // Move up as far as possible\n while (l.y > 0 && !getFirstCollision(compareWith, l)) {\n (l as Mutable<LayoutItem>).y--;\n }\n\n // Resolve collisions by moving down\n let collision: LayoutItem | undefined;\n while ((collision = getFirstCollision(compareWith, l)) !== undefined) {\n resolveCompactionCollision(fullLayout, l, collision.y + collision.h, \"y\");\n }\n\n (l as Mutable<LayoutItem>).y = Math.max(l.y, 0);\n return l;\n}\n\n/**\n * Compact a single item horizontally (move left).\n *\n * Moves the item as far left as possible without colliding.\n * Wraps to the next row if it overflows.\n * Useful for implementing custom horizontal compactors.\n *\n * @param compareWith - Items to check for collisions\n * @param l - Item to compact (will be mutated)\n * @param cols - Number of columns in the grid\n * @param fullLayout - Full layout for collision resolution\n * @returns The compacted item\n */\nexport function compactItemHorizontal(\n compareWith: Layout,\n l: LayoutItem,\n cols: number,\n fullLayout: Layout\n): LayoutItem {\n // Move left as far as possible\n while (l.x > 0 && !getFirstCollision(compareWith, l)) {\n (l as Mutable<LayoutItem>).x--;\n }\n\n // Resolve collisions\n let collision: LayoutItem | undefined;\n while ((collision = getFirstCollision(compareWith, l)) !== undefined) {\n resolveCompactionCollision(fullLayout, l, collision.x + collision.w, \"x\");\n\n // Horizontal overflow: wrap to next row\n if (l.x + l.w > cols) {\n (l as Mutable<LayoutItem>).x = cols - l.w;\n (l as Mutable<LayoutItem>).y++;\n\n while (l.x > 0 && !getFirstCollision(compareWith, l)) {\n (l as Mutable<LayoutItem>).x--;\n }\n }\n }\n\n (l as Mutable<LayoutItem>).x = Math.max(l.x, 0);\n return l;\n}\n\n// ============================================================================\n// Vertical Compactor\n// ============================================================================\n\n/**\n * Vertical compactor - moves items up to fill gaps.\n *\n * Items are sorted by row then column, and each item is moved\n * as far up as possible without overlapping other items.\n *\n * This is the default compaction mode for react-grid-layout.\n */\nexport const verticalCompactor: Compactor = {\n type: \"vertical\",\n allowOverlap: false,\n\n compact(layout: Layout, _cols: number): Layout {\n const compareWith = getStatics(layout);\n let maxY = bottom(compareWith);\n const sorted = sortLayoutItemsByRowCol(layout);\n const out: LayoutItem[] = new Array(layout.length);\n\n for (let i = 0; i < sorted.length; i++) {\n const sortedItem = sorted[i];\n if (sortedItem === undefined) continue;\n\n let l = cloneLayoutItem(sortedItem);\n\n if (!l.static) {\n l = compactItemVertical(compareWith, l, sorted, maxY);\n maxY = Math.max(maxY, l.y + l.h);\n compareWith.push(l);\n }\n\n const originalIndex = layout.indexOf(sortedItem);\n out[originalIndex] = l;\n l.moved = false;\n }\n\n return out;\n },\n\n onMove(\n layout: Layout,\n item: LayoutItem,\n x: number,\n y: number,\n _cols: number\n ): Layout {\n // Simple move - compact() will be called after\n const newLayout = cloneLayout(layout);\n const movedItem = newLayout.find(l => l.i === item.i);\n if (movedItem) {\n movedItem.x = x;\n movedItem.y = y;\n movedItem.moved = true;\n }\n return newLayout;\n }\n};\n\n// ============================================================================\n// Horizontal Compactor\n// ============================================================================\n\n/**\n * Horizontal compactor - moves items left to fill gaps.\n *\n * Items are sorted by column then row, and each item is moved\n * as far left as possible without overlapping other items.\n */\nexport const horizontalCompactor: Compactor = {\n type: \"horizontal\",\n allowOverlap: false,\n\n compact(layout: Layout, cols: number): Layout {\n const compareWith = getStatics(layout);\n const sorted = sortLayoutItemsByColRow(layout);\n const out: LayoutItem[] = new Array(layout.length);\n\n for (let i = 0; i < sorted.length; i++) {\n const sortedItem = sorted[i];\n if (sortedItem === undefined) continue;\n\n let l = cloneLayoutItem(sortedItem);\n\n if (!l.static) {\n l = compactItemHorizontal(compareWith, l, cols, sorted);\n compareWith.push(l);\n }\n\n const originalIndex = layout.indexOf(sortedItem);\n out[originalIndex] = l;\n l.moved = false;\n }\n\n return out;\n },\n\n onMove(\n layout: Layout,\n item: LayoutItem,\n x: number,\n y: number,\n _cols: number\n ): Layout {\n const newLayout = cloneLayout(layout);\n const movedItem = newLayout.find(l => l.i === item.i);\n if (movedItem) {\n movedItem.x = x;\n movedItem.y = y;\n movedItem.moved = true;\n }\n return newLayout;\n }\n};\n\n// ============================================================================\n// No Compaction\n// ============================================================================\n\n/**\n * No compaction - items stay where placed.\n *\n * Use this for free-form layouts where items can be placed anywhere.\n * Items will not automatically move to fill gaps.\n */\nexport const noCompactor: Compactor = {\n type: null,\n allowOverlap: false,\n\n compact(layout: Layout, _cols: number): Layout {\n // No compaction - just clone to maintain immutability\n return cloneLayout(layout);\n },\n\n onMove(\n layout: Layout,\n item: LayoutItem,\n x: number,\n y: number,\n _cols: number\n ): Layout {\n const newLayout = cloneLayout(layout);\n const movedItem = newLayout.find(l => l.i === item.i);\n if (movedItem) {\n movedItem.x = x;\n movedItem.y = y;\n movedItem.moved = true;\n }\n return newLayout;\n }\n};\n\n// ============================================================================\n// Overlap-Allowing Variants\n// ============================================================================\n\n/**\n * Vertical compactor that allows overlapping items.\n *\n * Items compact upward but are allowed to overlap each other.\n * Useful for layered layouts or when collision detection is handled externally.\n */\nexport const verticalOverlapCompactor: Compactor = {\n ...verticalCompactor,\n allowOverlap: true,\n\n compact(layout: Layout, _cols: number): Layout {\n // With overlap allowed, just clone without moving\n return cloneLayout(layout);\n }\n};\n\n/**\n * Horizontal compactor that allows overlapping items.\n */\nexport const horizontalOverlapCompactor: Compactor = {\n ...horizontalCompactor,\n allowOverlap: true,\n\n compact(layout: Layout, _cols: number): Layout {\n return cloneLayout(layout);\n }\n};\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Get a compactor by type.\n *\n * This is a convenience function for backwards compatibility with the\n * string-based compactType API.\n *\n * @param compactType - 'vertical', 'horizontal', or null\n * @param allowOverlap - Whether to allow overlapping items\n * @returns The appropriate Compactor\n */\nexport function getCompactor(\n compactType: \"vertical\" | \"horizontal\" | null,\n allowOverlap: boolean = false,\n preventCollision: boolean = false\n): Compactor {\n let baseCompactor: Compactor;\n\n if (allowOverlap) {\n if (compactType === \"vertical\") baseCompactor = verticalOverlapCompactor;\n else if (compactType === \"horizontal\")\n baseCompactor = horizontalOverlapCompactor;\n else baseCompactor = noCompactor;\n } else {\n if (compactType === \"vertical\") baseCompactor = verticalCompactor;\n else if (compactType === \"horizontal\") baseCompactor = horizontalCompactor;\n else baseCompactor = noCompactor;\n }\n\n // Return with preventCollision if specified\n if (preventCollision) {\n return { ...baseCompactor, preventCollision };\n }\n return baseCompactor;\n}\n","/**\n * Responsive layout utilities.\n *\n * Functions for handling responsive breakpoints and layout generation.\n */\n\nimport type {\n Breakpoint,\n Breakpoints,\n CompactType,\n Layout,\n ResponsiveLayouts\n} from \"./types.js\";\nimport { cloneLayout, correctBounds } from \"./layout.js\";\nimport { compact } from \"./compact-compat.js\";\n\n// ============================================================================\n// Breakpoint Utilities\n// ============================================================================\n\n/**\n * Sort breakpoints by width (ascending).\n *\n * Returns an array of breakpoint names sorted from smallest to largest.\n * E.g., ['xxs', 'xs', 'sm', 'md', 'lg']\n *\n * @param breakpoints - Map of breakpoint names to widths\n * @returns Sorted array of breakpoint names\n */\nexport function sortBreakpoints<B extends Breakpoint>(\n breakpoints: Breakpoints<B>\n): B[] {\n const keys = Object.keys(breakpoints) as B[];\n return keys.sort((a, b) => breakpoints[a] - breakpoints[b]);\n}\n\n/**\n * Get the active breakpoint for a given width.\n *\n * Returns the highest breakpoint that is valid for the width (width > breakpoint).\n *\n * @param breakpoints - Map of breakpoint names to widths\n * @param width - Container width in pixels\n * @returns Active breakpoint name\n */\nexport function getBreakpointFromWidth<B extends Breakpoint>(\n breakpoints: Breakpoints<B>,\n width: number\n): B {\n const sorted = sortBreakpoints(breakpoints);\n let matching = sorted[0];\n\n if (matching === undefined) {\n throw new Error(\"No breakpoints defined\");\n }\n\n for (let i = 1; i < sorted.length; i++) {\n const breakpointName = sorted[i];\n if (breakpointName === undefined) continue;\n\n const breakpointWidth = breakpoints[breakpointName];\n if (width > breakpointWidth) {\n matching = breakpointName;\n }\n }\n\n return matching;\n}\n\n/**\n * Get the column count for a breakpoint.\n *\n * @param breakpoint - Breakpoint name\n * @param cols - Map of breakpoint names to column counts\n * @returns Number of columns for the breakpoint\n * @throws Error if breakpoint is not defined in cols\n */\nexport function getColsFromBreakpoint<B extends Breakpoint>(\n breakpoint: B,\n cols: Breakpoints<B>\n): number {\n const colCount = cols[breakpoint];\n if (colCount === undefined) {\n throw new Error(\n `ResponsiveReactGridLayout: \\`cols\\` entry for breakpoint ${String(breakpoint)} is missing!`\n );\n }\n return colCount;\n}\n\n// ============================================================================\n// Layout Generation\n// ============================================================================\n\n/**\n * Find or generate a layout for a breakpoint.\n *\n * If a layout exists for the breakpoint, returns a clone.\n * Otherwise, generates a new layout from the nearest larger breakpoint.\n *\n * @param layouts - Existing layouts by breakpoint\n * @param breakpoints - Breakpoint definitions\n * @param breakpoint - Target breakpoint\n * @param lastBreakpoint - Previous breakpoint (for fallback)\n * @param cols - Column count for the target breakpoint\n * @param compactType - Compaction type\n * @returns Layout for the breakpoint\n */\nexport function findOrGenerateResponsiveLayout<B extends Breakpoint>(\n layouts: ResponsiveLayouts<B>,\n breakpoints: Breakpoints<B>,\n breakpoint: B,\n lastBreakpoint: B,\n cols: number,\n compactType: CompactType\n): Layout {\n // If it already exists, just return it\n const existingLayout = layouts[breakpoint];\n if (existingLayout) {\n return cloneLayout(existingLayout);\n }\n\n // Find or generate the next layout\n let layout = layouts[lastBreakpoint];\n\n // Look for layouts at larger breakpoints\n const breakpointsSorted = sortBreakpoints(breakpoints);\n const breakpointsAbove = breakpointsSorted.slice(\n breakpointsSorted.indexOf(breakpoint)\n );\n\n for (let i = 0; i < breakpointsAbove.length; i++) {\n const b = breakpointsAbove[i];\n if (b === undefined) continue;\n\n const layoutForBreakpoint = layouts[b];\n if (layoutForBreakpoint) {\n layout = layoutForBreakpoint;\n break;\n }\n }\n\n // Clone layout so we don't modify existing items\n const clonedLayout = cloneLayout(layout || []);\n\n // Correct bounds and compact\n return compact(correctBounds(clonedLayout, { cols }), compactType, cols);\n}\n\n// ============================================================================\n// Margin/Padding Helpers\n// ============================================================================\n\ntype IndentationValue<B extends Breakpoint> =\n | readonly [number, number]\n | Partial<Record<B, readonly [number, number]>>;\n\n/**\n * Get margin or padding value for a breakpoint.\n *\n * Supports both fixed values ([x, y]) and breakpoint-specific values\n * ({ lg: [x, y], md: [x, y], ... }).\n *\n * @param value - Fixed value or breakpoint-specific map\n * @param breakpoint - Current breakpoint\n * @returns Margin/padding tuple [x, y]\n */\nexport function getIndentationValue<B extends Breakpoint>(\n value: IndentationValue<B>,\n breakpoint: B\n): readonly [number, number] {\n // If it's a tuple (array), return it directly\n if (Array.isArray(value)) {\n return value as readonly [number, number];\n }\n\n // It's a breakpoint map - find the value\n const breakpointMap = value as Partial<Record<B, readonly [number, number]>>;\n const breakpointValue = breakpointMap[breakpoint];\n if (breakpointValue !== undefined) {\n return breakpointValue;\n }\n\n // Fallback to first defined value\n const keys = Object.keys(breakpointMap) as B[];\n for (const key of keys) {\n const v = breakpointMap[key];\n if (v !== undefined) {\n return v;\n }\n }\n\n // Default fallback\n return [10, 10];\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react/components/GridItem.tsx","../src/react/components/GridLayout.tsx","../src/react/components/ResponsiveGridLayout.tsx"],"names":["useState","useRef","useMemo","useCallback","pos","setTransform","setTopLeft","perc","calcXY","calcGridItemWHPx","clamp","calcGridColWidth","resizeHandle","resizeItemInDirection","calcWH","calcGridItemPosition","useEffect","React","clsx","jsx","Resizable","DraggableCore","cloneLayoutItem","bottom","correctBounds","compact","defaultPositionStrategy","defaultGridConfig","defaultDragConfig","defaultResizeConfig","defaultDropConfig","getCompactor","deepEqual","getLayoutItem","moveElement","withLayoutItem","getAllCollisions","jsxs","noop","synchronizeLayoutWithChildren","getBreakpointFromWidth","getColsFromBreakpoint","findOrGenerateResponsiveLayout","cloneLayout","currentMargin","getIndentationValue"],"mappings":"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","file":"chunk-BFTKGAP3.js","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} from \"../../core/types.js\";\nimport type { PositionParams } from \"../../core/calculate.js\";\nimport {\n calcGridItemPosition,\n calcGridItemWHPx,\n calcGridColWidth,\n calcXY,\n calcWH,\n clamp\n} from \"../../core/calculate.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 /** 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 /** 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 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 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 // 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 // ============================================================================\n // Style Creation\n // ============================================================================\n\n const createStyle = useCallback(\n (pos: Position): CSSProperties => {\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 [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 const newPosition: PartialPosition = {\n left: cLeft - pLeft + offsetParent.scrollLeft,\n top: cTop - pTop + offsetParent.scrollTop\n };\n\n dragPositionRef.current = newPosition;\n setDragging(true);\n\n const { x: newX, y: newY } = calcXY(\n positionParams,\n newPosition.top,\n newPosition.left,\n w,\n h\n );\n\n onDragStartProp(i, newX, newY, {\n e: e as unknown as Event,\n node,\n newPosition\n });\n },\n [onDragStartProp, transformScale, positionParams, w, h, i]\n );\n\n const onDrag: DraggableEventHandler = useCallback(\n (e, { node, deltaX, deltaY }) => {\n if (!onDragProp || !dragging) return;\n\n let top = dragPositionRef.current.top + deltaY;\n let left = dragPositionRef.current.left + deltaX;\n\n // Boundary calculations\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 const { x: newX, y: newY } = calcXY(positionParams, top, left, w, h);\n onDragProp(i, newX, newY, {\n e: e as unknown as Event,\n node,\n newPosition\n });\n },\n [\n onDragProp,\n dragging,\n isBounded,\n h,\n rowHeight,\n margin,\n positionParams,\n containerWidth,\n w,\n i\n ]\n );\n\n const onDragStop: DraggableEventHandler = useCallback(\n (e, { node }) => {\n if (!onDragStopProp || !dragging) return;\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 const { x: newX, y: newY } = calcXY(positionParams, top, left, w, h);\n onDragStopProp(i, newX, newY, {\n e: e as unknown as Event,\n node,\n newPosition\n });\n },\n [onDragStopProp, dragging, positionParams, w, h, i]\n );\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 new grid dimensions\n let { w: newW, h: newH } = calcWH(\n positionParams,\n updatedSize.width,\n updatedSize.height,\n x,\n y,\n resizeHandle\n );\n\n // Min/max capping\n newW = clamp(newW, Math.max(minW, 1), maxW);\n newH = clamp(newH, minH, maxH);\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 x,\n y,\n minW,\n maxW,\n minH,\n maxH,\n i\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 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 onDragStart(droppingPosition.e as unknown as MouseEvent, fakeData);\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 onDrag(droppingPosition.e as unknown as MouseEvent, fakeData);\n }\n\n prevDroppingPositionRef.current = droppingPosition;\n }, [droppingPosition, dragging, onDragStart, onDrag]);\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 const maxWidth = calcGridItemPosition(positionParams, 0, 0, cols, 0).width;\n const mins = calcGridItemPosition(positionParams, 0, 0, minW, minH);\n const maxes = calcGridItemPosition(positionParams, 0, 0, maxW, maxH);\n const minConstraints: [number, number] = [mins.width, mins.height];\n const maxConstraints: [number, number] = [\n Math.min(maxes.width, maxWidth),\n Math.min(maxes.height, Infinity)\n ];\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} 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\";\nimport { compact } from \"../../core/compact-compat.js\";\nimport { getCompactor } from \"../../core/compactors.js\";\nimport { calcXY } from \"../../core/calculate.js\";\nimport { defaultPositionStrategy } from \"../../core/position.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 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 ) => { w?: number; h?: number } | false | 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 compactType: CompactType,\n allowOverlap: boolean\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\n const corrected = correctBounds(layout, { cols });\n return compact(corrected, compactType, cols, allowOverlap);\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\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 } = dragConfig;\n const {\n enabled: isResizable,\n handles: resizeHandles,\n handleComponent: resizeHandle\n } = resizeConfig;\n const { enabled: isDroppable, defaultItem: defaultDropItem } = 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(\n propsLayout,\n children,\n cols,\n compactType,\n allowOverlap\n )\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 // 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\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 compactType,\n allowOverlap\n );\n setLayout(newLayout);\n }\n\n prevPropsLayoutRef.current = propsLayout;\n prevChildrenRef.current = children;\n prevCompactTypeRef.current = compactType;\n }, [\n propsLayout,\n children,\n cols,\n compactType,\n allowOverlap,\n activeDrag,\n layout\n ]);\n\n // Layout change callback\n useEffect(() => {\n if (!activeDrag && !deepEqual(layout, prevLayoutRef.current)) {\n prevLayoutRef.current = layout;\n onLayoutChange(layout);\n }\n }, [layout, activeDrag, onLayoutChange]);\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 l = getLayoutItem(layout, 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 = layout;\n setActiveDrag(placeholder);\n\n onDragStartProp(layout, l, l, null, data.e, data.node);\n },\n [layout, onDragStartProp]\n );\n\n const onDrag = useCallback(\n (i: string, x: number, y: number, data: GridDragEvent) => {\n const oldDragItem = oldDragItemRef.current;\n const l = getLayoutItem(layout, 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 layout,\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 setLayout(\n allowOverlap ? newLayout : compact(newLayout, compactType, cols)\n );\n setActiveDrag(placeholder);\n },\n [layout, preventCollision, compactType, cols, allowOverlap, onDragProp]\n );\n\n const onDragStop = useCallback(\n (i: string, x: number, y: number, data: GridDragEvent) => {\n if (!activeDrag) return;\n\n const oldDragItem = oldDragItemRef.current;\n const l = getLayoutItem(layout, i);\n if (!l) return;\n\n const newLayout = moveElement(\n layout,\n l,\n x,\n y,\n true,\n preventCollision,\n compactType,\n cols,\n allowOverlap\n );\n\n const finalLayout = allowOverlap\n ? newLayout\n : compact(newLayout, compactType, 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 layout,\n preventCollision,\n compactType,\n cols,\n allowOverlap,\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 l = getLayoutItem(layout, i);\n if (!l) return;\n\n oldResizeItemRef.current = cloneLayoutItem(l);\n oldLayoutRef.current = layout;\n setResizing(true);\n\n onResizeStartProp(layout, l, l, null, data.e, data.node);\n },\n [layout, onResizeStartProp]\n );\n\n const onResize = useCallback(\n (i: string, w: number, h: number, data: GridResizeEvent) => {\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(layout, 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(layout, {\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 setLayout(\n allowOverlap ? finalLayout : compact(finalLayout, compactType, cols)\n );\n setActiveDrag(placeholder);\n },\n [layout, preventCollision, allowOverlap, compactType, cols, onResizeProp]\n );\n\n const onResizeStop = useCallback(\n (i: string, _w: number, _h: number, data: GridResizeEvent) => {\n const oldResizeItem = oldResizeItemRef.current;\n const l = getLayoutItem(layout, i);\n\n const finalLayout = allowOverlap\n ? layout\n : compact(layout, compactType, 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 [layout, allowOverlap, compactType, cols, onResizeStopProp, onLayoutChange]\n );\n\n // ============================================================================\n // Drop Handlers\n // ============================================================================\n\n const removeDroppingPlaceholder = useCallback(() => {\n const newLayout = compact(\n layout.filter(l => l.i !== droppingItem.i),\n compactType,\n cols,\n allowOverlap\n );\n\n setLayout(newLayout);\n setDroppingDOMNode(null);\n setActiveDrag(null);\n setDroppingPosition(undefined);\n }, [layout, droppingItem.i, compactType, cols, allowOverlap]);\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 const onDragOverResult = onDropDragOverProp(e);\n if (onDragOverResult === false) {\n if (droppingDOMNode) {\n removeDroppingPlaceholder();\n }\n return false;\n }\n\n const finalDroppingItem = { ...droppingItem, ...onDragOverResult };\n const gridRect = e.currentTarget.getBoundingClientRect();\n const layerX = e.clientX - gridRect.left;\n const layerY = e.clientY - gridRect.top;\n\n const newDroppingPosition: DroppingPosition = {\n left: layerX / transformScale,\n top: layerY / transformScale,\n e: e.nativeEvent\n };\n\n if (!droppingDOMNode) {\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 const calculatedPosition = calcXY(\n positionParams,\n layerY,\n layerX,\n finalDroppingItem.w,\n finalDroppingItem.h\n );\n\n setDroppingDOMNode(<div key={finalDroppingItem.i} />);\n setDroppingPosition(newDroppingPosition);\n setLayout([\n ...layout,\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 !== layerX || droppingPosition.top !== layerY;\n if (shouldUpdate) {\n setDroppingPosition(newDroppingPosition);\n }\n }\n },\n [\n droppingDOMNode,\n droppingPosition,\n droppingItem,\n onDropDragOverProp,\n removeDroppingPlaceholder,\n transformScale,\n cols,\n margin,\n maxRows,\n rowHeight,\n width,\n effectiveContainerPadding,\n layout\n ]\n );\n\n const handleDragLeave = useCallback(\n (e: ReactDragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragEnterCounterRef.current--;\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 item = layout.find(l => l.i === droppingItem.i);\n dragEnterCounterRef.current = 0;\n removeDroppingPlaceholder();\n onDropProp(layout, item, e.nativeEvent);\n },\n [layout, 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 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 >\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 droppingPosition,\n resizeHandles,\n resizeHandle\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 >\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 CompactType,\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 { compact } from \"../../core/compact-compat.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\n */\nfunction synchronizeLayoutWithChildren(\n initialLayout: Layout,\n children: React.ReactNode,\n cols: number,\n compactType: CompactType,\n allowOverlap: boolean\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\n const corrected = correctBounds(layout, { cols });\n return compact(corrected, compactType, cols, allowOverlap);\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 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 // Sync layouts from props\n useEffect(() => {\n if (!deepEqual(propsLayouts, prevLayoutsRef.current)) {\n const newLayout = findOrGenerateResponsiveLayout(\n propsLayouts,\n breakpoints,\n breakpoint,\n breakpoint,\n cols,\n compactType\n );\n setLayout(newLayout);\n setLayouts(propsLayouts);\n prevLayoutsRef.current = propsLayouts;\n }\n }, [propsLayouts, breakpoints, breakpoint, cols, compactType]);\n\n // Handle compactType changes\n useEffect(() => {\n if (compactType !== prevCompactTypeRef.current) {\n // Re-compact the current layout with the new compactType\n const newLayout = compact(\n cloneLayout(layout),\n compactType,\n cols,\n allowOverlap\n );\n const newLayouts = {\n ...layouts,\n [breakpoint]: newLayout\n } as ResponsiveLayouts<B>;\n\n setLayout(newLayout);\n setLayouts(newLayouts);\n onLayoutChange(newLayout, newLayouts);\n prevCompactTypeRef.current = compactType;\n }\n }, [\n compactType,\n layout,\n cols,\n allowOverlap,\n layouts,\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 = { ...layouts } 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\n let newLayout = findOrGenerateResponsiveLayout(\n newLayouts,\n breakpoints,\n newBreakpoint,\n lastBreakpoint,\n newCols,\n compactType\n );\n\n // Sync with children\n newLayout = synchronizeLayoutWithChildren(\n newLayout,\n children,\n newCols,\n compactType,\n allowOverlap\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\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 layouts,\n children,\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 const newLayouts = {\n ...layouts,\n [breakpoint]: newLayout\n } as ResponsiveLayouts<B>;\n\n setLayout(newLayout);\n setLayouts(newLayouts);\n onLayoutChange(newLayout, newLayouts);\n },\n [layouts, 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={layout}\n >\n {children}\n </GridLayout>\n );\n}\n\nexport default ResponsiveGridLayout;\n"]}
|
package/dist/chunk-F6NQPYKT.js
DELETED
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// src/core/calculate.ts
|
|
4
|
-
function calcGridColWidth(positionParams) {
|
|
5
|
-
const { margin, containerPadding, containerWidth, cols } = positionParams;
|
|
6
|
-
return (containerWidth - margin[0] * (cols - 1) - containerPadding[0] * 2) / cols;
|
|
7
|
-
}
|
|
8
|
-
function calcGridItemWHPx(gridUnits, colOrRowSize, marginPx) {
|
|
9
|
-
if (!Number.isFinite(gridUnits)) return gridUnits;
|
|
10
|
-
return Math.round(
|
|
11
|
-
colOrRowSize * gridUnits + Math.max(0, gridUnits - 1) * marginPx
|
|
12
|
-
);
|
|
13
|
-
}
|
|
14
|
-
function calcGridItemPosition(positionParams, x, y, w, h, dragPosition, resizePosition) {
|
|
15
|
-
const { margin, containerPadding, rowHeight } = positionParams;
|
|
16
|
-
const colWidth = calcGridColWidth(positionParams);
|
|
17
|
-
let width;
|
|
18
|
-
let height;
|
|
19
|
-
let top;
|
|
20
|
-
let left;
|
|
21
|
-
if (resizePosition) {
|
|
22
|
-
width = Math.round(resizePosition.width);
|
|
23
|
-
height = Math.round(resizePosition.height);
|
|
24
|
-
} else {
|
|
25
|
-
width = calcGridItemWHPx(w, colWidth, margin[0]);
|
|
26
|
-
height = calcGridItemWHPx(h, rowHeight, margin[1]);
|
|
27
|
-
}
|
|
28
|
-
if (dragPosition) {
|
|
29
|
-
top = Math.round(dragPosition.top);
|
|
30
|
-
left = Math.round(dragPosition.left);
|
|
31
|
-
} else if (resizePosition) {
|
|
32
|
-
top = Math.round(resizePosition.top);
|
|
33
|
-
left = Math.round(resizePosition.left);
|
|
34
|
-
} else {
|
|
35
|
-
top = Math.round((rowHeight + margin[1]) * y + containerPadding[1]);
|
|
36
|
-
left = Math.round((colWidth + margin[0]) * x + containerPadding[0]);
|
|
37
|
-
}
|
|
38
|
-
return { top, left, width, height };
|
|
39
|
-
}
|
|
40
|
-
function calcXY(positionParams, top, left, w, h) {
|
|
41
|
-
const { margin, containerPadding, cols, rowHeight, maxRows } = positionParams;
|
|
42
|
-
const colWidth = calcGridColWidth(positionParams);
|
|
43
|
-
let x = Math.round((left - containerPadding[0]) / (colWidth + margin[0]));
|
|
44
|
-
let y = Math.round((top - containerPadding[1]) / (rowHeight + margin[1]));
|
|
45
|
-
x = clamp(x, 0, cols - w);
|
|
46
|
-
y = clamp(y, 0, maxRows - h);
|
|
47
|
-
return { x, y };
|
|
48
|
-
}
|
|
49
|
-
function calcWH(positionParams, width, height, x, y, handle) {
|
|
50
|
-
const { margin, maxRows, cols, rowHeight } = positionParams;
|
|
51
|
-
const colWidth = calcGridColWidth(positionParams);
|
|
52
|
-
const w = Math.round((width + margin[0]) / (colWidth + margin[0]));
|
|
53
|
-
const h = Math.round((height + margin[1]) / (rowHeight + margin[1]));
|
|
54
|
-
let _w = clamp(w, 0, cols - x);
|
|
55
|
-
let _h = clamp(h, 0, maxRows - y);
|
|
56
|
-
if (handle === "sw" || handle === "w" || handle === "nw") {
|
|
57
|
-
_w = clamp(w, 0, cols);
|
|
58
|
-
}
|
|
59
|
-
if (handle === "nw" || handle === "n" || handle === "ne") {
|
|
60
|
-
_h = clamp(h, 0, maxRows);
|
|
61
|
-
}
|
|
62
|
-
return { w: _w, h: _h };
|
|
63
|
-
}
|
|
64
|
-
function clamp(num, lowerBound, upperBound) {
|
|
65
|
-
return Math.max(Math.min(num, upperBound), lowerBound);
|
|
66
|
-
}
|
|
67
|
-
function calcGridCellDimensions(config) {
|
|
68
|
-
const {
|
|
69
|
-
width,
|
|
70
|
-
cols,
|
|
71
|
-
rowHeight,
|
|
72
|
-
margin = [10, 10],
|
|
73
|
-
containerPadding
|
|
74
|
-
} = config;
|
|
75
|
-
const padding = containerPadding ?? margin;
|
|
76
|
-
const cellWidth = (width - padding[0] * 2 - margin[0] * (cols - 1)) / cols;
|
|
77
|
-
const cellHeight = rowHeight;
|
|
78
|
-
return {
|
|
79
|
-
cellWidth,
|
|
80
|
-
cellHeight,
|
|
81
|
-
offsetX: padding[0],
|
|
82
|
-
offsetY: padding[1],
|
|
83
|
-
gapX: margin[0],
|
|
84
|
-
gapY: margin[1],
|
|
85
|
-
cols,
|
|
86
|
-
containerWidth: width
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
exports.calcGridCellDimensions = calcGridCellDimensions;
|
|
91
|
-
exports.calcGridColWidth = calcGridColWidth;
|
|
92
|
-
exports.calcGridItemPosition = calcGridItemPosition;
|
|
93
|
-
exports.calcGridItemWHPx = calcGridItemWHPx;
|
|
94
|
-
exports.calcWH = calcWH;
|
|
95
|
-
exports.calcXY = calcXY;
|
|
96
|
-
exports.clamp = clamp;
|
|
97
|
-
//# sourceMappingURL=chunk-F6NQPYKT.js.map
|
|
98
|
-
//# sourceMappingURL=chunk-F6NQPYKT.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/calculate.ts"],"names":[],"mappings":"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","file":"chunk-F6NQPYKT.js","sourcesContent":["/**\n * Grid calculation utilities.\n *\n * These functions convert between grid units and pixel positions.\n */\n\nimport type { Position, ResizeHandleAxis } from \"./types.js\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Parameters needed for position calculations.\n */\nexport interface PositionParams {\n readonly margin: readonly [number, number];\n readonly containerPadding: readonly [number, number];\n readonly containerWidth: number;\n readonly cols: number;\n readonly rowHeight: number;\n readonly maxRows: number;\n}\n\n// ============================================================================\n// Grid Column/Row Calculations\n// ============================================================================\n\n/**\n * Calculate the width of a single grid column in pixels.\n *\n * @param positionParams - Grid parameters\n * @returns Column width in pixels\n */\nexport function calcGridColWidth(positionParams: PositionParams): number {\n const { margin, containerPadding, containerWidth, cols } = positionParams;\n return (\n (containerWidth - margin[0] * (cols - 1) - containerPadding[0] * 2) / cols\n );\n}\n\n/**\n * Calculate the pixel size for a grid unit dimension (width or height).\n *\n * Can be called as:\n * - calcGridItemWHPx(w, colWidth, margin[0]) for width\n * - calcGridItemWHPx(h, rowHeight, margin[1]) for height\n *\n * @param gridUnits - Size in grid units\n * @param colOrRowSize - Column width or row height in pixels\n * @param marginPx - Margin between items in pixels\n * @returns Size in pixels\n */\nexport function calcGridItemWHPx(\n gridUnits: number,\n colOrRowSize: number,\n marginPx: number\n): number {\n // 0 * Infinity === NaN, which causes problems with resize constraints\n if (!Number.isFinite(gridUnits)) return gridUnits;\n return Math.round(\n colOrRowSize * gridUnits + Math.max(0, gridUnits - 1) * marginPx\n );\n}\n\n// ============================================================================\n// Position Calculations\n// ============================================================================\n\n/**\n * Calculate pixel position for a grid item.\n *\n * Returns left, top, width, height in pixels.\n *\n * @param positionParams - Grid parameters\n * @param x - X coordinate in grid units\n * @param y - Y coordinate in grid units\n * @param w - Width in grid units\n * @param h - Height in grid units\n * @param dragPosition - If present, use exact left/top from drag callbacks\n * @param resizePosition - If present, use exact dimensions from resize callbacks\n * @returns Position in pixels\n */\nexport function calcGridItemPosition(\n positionParams: PositionParams,\n x: number,\n y: number,\n w: number,\n h: number,\n dragPosition?: { top: number; left: number } | null,\n resizePosition?: {\n top: number;\n left: number;\n height: number;\n width: number;\n } | null\n): Position {\n const { margin, containerPadding, rowHeight } = positionParams;\n const colWidth = calcGridColWidth(positionParams);\n\n let width: number;\n let height: number;\n let top: number;\n let left: number;\n\n // If resizing, use the exact width and height from resize callbacks\n if (resizePosition) {\n width = Math.round(resizePosition.width);\n height = Math.round(resizePosition.height);\n } else {\n // Calculate from grid units\n width = calcGridItemWHPx(w, colWidth, margin[0]);\n height = calcGridItemWHPx(h, rowHeight, margin[1]);\n }\n\n // If dragging, use the exact left/top from drag callbacks\n if (dragPosition) {\n top = Math.round(dragPosition.top);\n left = Math.round(dragPosition.left);\n } else if (resizePosition) {\n // If resizing, use the exact left/top from resize position\n top = Math.round(resizePosition.top);\n left = Math.round(resizePosition.left);\n } else {\n // Calculate from grid units\n top = Math.round((rowHeight + margin[1]) * y + containerPadding[1]);\n left = Math.round((colWidth + margin[0]) * x + containerPadding[0]);\n }\n\n return { top, left, width, height };\n}\n\n/**\n * Translate pixel coordinates to grid units.\n *\n * @param positionParams - Grid parameters\n * @param top - Top position in pixels (relative to parent)\n * @param left - Left position in pixels (relative to parent)\n * @param w - Width in grid units (for clamping)\n * @param h - Height in grid units (for clamping)\n * @returns x and y in grid units\n */\nexport function calcXY(\n positionParams: PositionParams,\n top: number,\n left: number,\n w: number,\n h: number\n): { x: number; y: number } {\n const { margin, containerPadding, cols, rowHeight, maxRows } = positionParams;\n const colWidth = calcGridColWidth(positionParams);\n\n // left = containerPaddingX + x * (colWidth + marginX)\n // x = (left - containerPaddingX) / (colWidth + marginX)\n let x = Math.round((left - containerPadding[0]) / (colWidth + margin[0]));\n let y = Math.round((top - containerPadding[1]) / (rowHeight + margin[1]));\n\n // Clamp to grid bounds\n x = clamp(x, 0, cols - w);\n y = clamp(y, 0, maxRows - h);\n\n return { x, y };\n}\n\n/**\n * Calculate grid units from pixel dimensions.\n *\n * @param positionParams - Grid parameters\n * @param width - Width in pixels\n * @param height - Height in pixels\n * @param x - X coordinate in grid units (for clamping)\n * @param y - Y coordinate in grid units (for clamping)\n * @param handle - Resize handle being used\n * @returns w, h in grid units\n */\nexport function calcWH(\n positionParams: PositionParams,\n width: number,\n height: number,\n x: number,\n y: number,\n handle: ResizeHandleAxis\n): { w: number; h: number } {\n const { margin, maxRows, cols, rowHeight } = positionParams;\n const colWidth = calcGridColWidth(positionParams);\n\n // width = colWidth * w - (margin * (w - 1))\n // w = (width + margin) / (colWidth + margin)\n const w = Math.round((width + margin[0]) / (colWidth + margin[0]));\n const h = Math.round((height + margin[1]) / (rowHeight + margin[1]));\n\n // Clamp based on resize handle direction\n let _w = clamp(w, 0, cols - x);\n let _h = clamp(h, 0, maxRows - y);\n\n // West handles can resize to full width\n if (handle === \"sw\" || handle === \"w\" || handle === \"nw\") {\n _w = clamp(w, 0, cols);\n }\n\n // North handles can resize to full height\n if (handle === \"nw\" || handle === \"n\" || handle === \"ne\") {\n _h = clamp(h, 0, maxRows);\n }\n\n return { w: _w, h: _h };\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Clamp a number between bounds.\n *\n * @param num - Number to clamp\n * @param lowerBound - Minimum value\n * @param upperBound - Maximum value\n * @returns Clamped value\n */\nexport function clamp(\n num: number,\n lowerBound: number,\n upperBound: number\n): number {\n return Math.max(Math.min(num, upperBound), lowerBound);\n}\n\n// ============================================================================\n// Grid Background Calculations\n// ============================================================================\n\n/**\n * Grid cell dimension information for rendering backgrounds or overlays.\n */\nexport interface GridCellDimensions {\n /** Width of a single cell in pixels */\n readonly cellWidth: number;\n /** Height of a single cell in pixels */\n readonly cellHeight: number;\n /** Horizontal offset from container edge to first cell */\n readonly offsetX: number;\n /** Vertical offset from container edge to first cell */\n readonly offsetY: number;\n /** Horizontal gap between cells */\n readonly gapX: number;\n /** Vertical gap between cells */\n readonly gapY: number;\n /** Number of columns */\n readonly cols: number;\n /** Total container width */\n readonly containerWidth: number;\n}\n\n/**\n * Configuration for grid cell dimension calculation.\n */\nexport interface GridCellConfig {\n /** Container width in pixels */\n width: number;\n /** Number of columns */\n cols: number;\n /** Row height in pixels */\n rowHeight: number;\n /** Margin between items [x, y] */\n margin?: readonly [number, number];\n /** Container padding [x, y], defaults to margin if not specified */\n containerPadding?: readonly [number, number] | null;\n}\n\n/**\n * Calculate grid cell dimensions for rendering backgrounds or overlays.\n *\n * This function provides all the measurements needed to render a visual\n * grid background that aligns with the actual grid cells.\n *\n * @param config - Grid configuration\n * @returns Cell dimensions and offsets\n *\n * @example\n * ```tsx\n * import { calcGridCellDimensions } from 'react-grid-layout/core';\n *\n * const dims = calcGridCellDimensions({\n * width: 1200,\n * cols: 12,\n * rowHeight: 30,\n * margin: [10, 10],\n * containerPadding: [10, 10]\n * });\n *\n * // dims.cellWidth = 88.33...\n * // dims.cellHeight = 30\n * // dims.offsetX = 10 (containerPadding[0])\n * // dims.offsetY = 10 (containerPadding[1])\n * // dims.gapX = 10 (margin[0])\n * // dims.gapY = 10 (margin[1])\n * ```\n */\nexport function calcGridCellDimensions(\n config: GridCellConfig\n): GridCellDimensions {\n const {\n width,\n cols,\n rowHeight,\n margin = [10, 10],\n containerPadding\n } = config;\n\n // Container padding defaults to margin if not specified\n const padding = containerPadding ?? margin;\n\n // Calculate cell width: total width minus padding and gaps, divided by columns\n // Formula: width = 2*padding + cols*cellWidth + (cols-1)*gap\n // Solving for cellWidth: cellWidth = (width - 2*padding - (cols-1)*gap) / cols\n const cellWidth = (width - padding[0] * 2 - margin[0] * (cols - 1)) / cols;\n const cellHeight = rowHeight;\n\n return {\n cellWidth,\n cellHeight,\n offsetX: padding[0],\n offsetY: padding[1],\n gapX: margin[0],\n gapY: margin[1],\n cols,\n containerWidth: width\n };\n}\n"]}
|