'use client' import React, { useState } from 'react' import { GridItem } from './components/GridItem' import styles from './styles.module.css' export const Gridstack = () => { const [items, setItems] = useState([ { id: 1, x: 0, y: 0, w: 2, h: 2 }, { id: 2, x: 2, y: 0, w: 2, h: 3 } ]) const gridSize = 50 // Mover item y detectar colisión const moveItem = (movingItem: any, deltaX: number, deltaY: number) => { const newX = movingItem.x + Math.round(deltaX / gridSize) const newY = movingItem.y + Math.round(deltaY / gridSize) let newItems = [...items] // Actualizamos la posición del que movemos movingItem.x = newX movingItem.y = newY // Detectar si colisiona let collision = newItems.find( i => i.id !== movingItem.id && isOverlapping(movingItem, i) ) if (collision) { // Si hay colisión, mover el item colisionado hacia abajo collision.y = movingItem.y + movingItem.h } return newItems } // Maneja el evento de drag (arrastre) const handleDrag = (id: number, deltaX: number, deltaY: number) => { setItems(prev => { const movingItem = prev.find(item => item.id === id) if (!movingItem) return prev return moveItem({ ...movingItem }, deltaX, deltaY) }) } // Maneja el evento de resize (redimensionar) const handleResize = (id: number, deltaX: number, deltaY: number) => { setItems(prev => prev.map(item => item.id === id ? { ...item, w: Math.max(1, item.w + Math.round(deltaX / gridSize)), h: Math.max(1, item.h + Math.round(deltaY / gridSize)) } : item ) ) } // Función para detectar si dos items se superponen const isOverlapping = ( a: { x: number; y: number; w: number; h: number }, b: { x: number; y: number; w: number; h: number } ) => { return ( a.x < b.x + b.w && a.x + a.w > b.x && a.y < b.y + b.h && a.y + a.h > b.y ) } return (