feat: complete house plan maker application

Full-featured house/apartment floor plan editor with:

- Turborepo monorepo (React/Vite client, Fastify/Prisma server, shared Zod schemas)
- 2D room editor with walls, doors, windows, furniture, electrical elements
- 3D room preview with Three.js (auto-hide nearest walls, bird's eye default)
- Wall projection views with interactive drag (elevation, position)
- Apartment floor plan view with room positioning
- Copy/paste, alignment tools, measurement tool, annotations
- Item-attached annotations with leader lines (visible on projections)
- Door open direction (LEFT/RIGHT/INWARD/OUTWARD) with swing arc
- Floor type textures (wood, tile, concrete, laminate, herringbone)
- Wall color picker for 3D view
- Furniture: bed, desk, wardrobe, sofa, table, chair, shelf, nightstand, dresser, bookcase, TV (with stand toggle), AC unit
- Furniture elevation support (wall-mounted items)
- Auto-save with dirty state tracking, batch save API
- Rotation-aware collision detection (SAT/OBB) with 3D elevation check
- Rotation-aware hit testing
- i18n (English/Russian) with locale-aware number formatting
- Dark mode with system preference detection
- Undo/redo, keyboard shortcuts, scale bar
- PDF/PNG/JSON export and JSON import
- Focus trap modal, toast notifications, tooltips
- Responsive layout with overlay palettes
This commit is contained in:
2026-04-05 22:34:03 +03:00
parent b84807bbdb
commit af8b9fe00f
188 changed files with 35795 additions and 0 deletions
@@ -0,0 +1,102 @@
-- CreateTable
CREATE TABLE "Apartment" (
"id" TEXT NOT NULL PRIMARY KEY,
"name" TEXT NOT NULL,
"address" TEXT,
"totalArea" REAL,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL
);
-- CreateTable
CREATE TABLE "Room" (
"id" TEXT NOT NULL PRIMARY KEY,
"apartmentId" TEXT NOT NULL,
"name" TEXT NOT NULL,
"shape" TEXT NOT NULL DEFAULT '[]',
"width" REAL,
"height" REAL,
"wallHeight" REAL NOT NULL DEFAULT 2.7,
"plinthHeight" REAL NOT NULL DEFAULT 0.06,
"plinthThickness" REAL NOT NULL DEFAULT 0.01,
"order" INTEGER NOT NULL DEFAULT 0,
"posX" REAL NOT NULL DEFAULT 0,
"posY" REAL NOT NULL DEFAULT 0,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL,
CONSTRAINT "Room_apartmentId_fkey" FOREIGN KEY ("apartmentId") REFERENCES "Apartment" ("id") ON DELETE CASCADE ON UPDATE CASCADE
);
-- CreateTable
CREATE TABLE "Wall" (
"id" TEXT NOT NULL PRIMARY KEY,
"roomId" TEXT NOT NULL,
"startX" REAL NOT NULL,
"startY" REAL NOT NULL,
"endX" REAL NOT NULL,
"endY" REAL NOT NULL,
"thickness" REAL NOT NULL DEFAULT 0.1,
"direction" TEXT NOT NULL DEFAULT 'OTHER',
CONSTRAINT "Wall_roomId_fkey" FOREIGN KEY ("roomId") REFERENCES "Room" ("id") ON DELETE CASCADE ON UPDATE CASCADE
);
-- CreateTable
CREATE TABLE "WallOpening" (
"id" TEXT NOT NULL PRIMARY KEY,
"roomId" TEXT NOT NULL,
"wallId" TEXT NOT NULL,
"type" TEXT NOT NULL,
"positionAlongWall" REAL NOT NULL,
"width" REAL NOT NULL,
"height" REAL NOT NULL,
"elevationFromFloor" REAL NOT NULL DEFAULT 0,
CONSTRAINT "WallOpening_roomId_fkey" FOREIGN KEY ("roomId") REFERENCES "Room" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT "WallOpening_wallId_fkey" FOREIGN KEY ("wallId") REFERENCES "Wall" ("id") ON DELETE CASCADE ON UPDATE CASCADE
);
-- CreateTable
CREATE TABLE "ElectricalItem" (
"id" TEXT NOT NULL PRIMARY KEY,
"roomId" TEXT NOT NULL,
"type" TEXT NOT NULL,
"x" REAL NOT NULL,
"y" REAL NOT NULL,
"wallId" TEXT,
"elevationFromFloor" REAL,
"rotation" REAL NOT NULL DEFAULT 0,
"metadata" TEXT,
CONSTRAINT "ElectricalItem_roomId_fkey" FOREIGN KEY ("roomId") REFERENCES "Room" ("id") ON DELETE CASCADE ON UPDATE CASCADE
);
-- CreateTable
CREATE TABLE "FurnitureItem" (
"id" TEXT NOT NULL PRIMARY KEY,
"roomId" TEXT NOT NULL,
"type" TEXT NOT NULL,
"x" REAL NOT NULL,
"y" REAL NOT NULL,
"width" REAL NOT NULL,
"depth" REAL NOT NULL,
"height" REAL NOT NULL,
"rotation" REAL NOT NULL DEFAULT 0,
"label" TEXT,
CONSTRAINT "FurnitureItem_roomId_fkey" FOREIGN KEY ("roomId") REFERENCES "Room" ("id") ON DELETE CASCADE ON UPDATE CASCADE
);
-- CreateIndex
CREATE INDEX "Room_apartmentId_idx" ON "Room"("apartmentId");
-- CreateIndex
CREATE INDEX "Wall_roomId_idx" ON "Wall"("roomId");
-- CreateIndex
CREATE INDEX "WallOpening_roomId_idx" ON "WallOpening"("roomId");
-- CreateIndex
CREATE INDEX "WallOpening_wallId_idx" ON "WallOpening"("wallId");
-- CreateIndex
CREATE INDEX "ElectricalItem_roomId_idx" ON "ElectricalItem"("roomId");
-- CreateIndex
CREATE INDEX "FurnitureItem_roomId_idx" ON "FurnitureItem"("roomId");
@@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (e.g., Git)
provider = "sqlite"