У каждого прямоугольника есть минимальная и полная ширина / высота. Когда наводим мышу на один из прямоугольников он начинает ресайзится вправо (если нужно) по ширине и вниз (если нужно) по высоте. Дальше проверяем всe прямоугольники находящиеся в том же ряду / в той же строке и ресайзим / передвигаем их соответственно. Очень похоже на судоку

Главное изначально не создавать ряд / строку, в которой набор из максимально раскрытого прямоугольника и всех остальных максимально закрытх превысит общую высоту / ширину.