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:
@@ -0,0 +1,47 @@
|
||||
import { Group, Rect, Line } from 'react-konva';
|
||||
|
||||
interface TvSilhouetteProps {
|
||||
readonly x: number;
|
||||
readonly y: number;
|
||||
readonly width: number;
|
||||
readonly depth: number;
|
||||
readonly rotation: number;
|
||||
readonly color: string;
|
||||
readonly fillColor: string;
|
||||
}
|
||||
|
||||
/** Top-down TV silhouette: thin rectangle with screen indicator. */
|
||||
export function TvSilhouette({ x, y, width, depth, rotation, color, fillColor }: TvSilhouetteProps) {
|
||||
const halfW = width / 2;
|
||||
const halfD = depth / 2;
|
||||
|
||||
return (
|
||||
<Group x={x} y={y} rotation={rotation}>
|
||||
{/* TV body */}
|
||||
<Rect
|
||||
x={-halfW}
|
||||
y={-halfD}
|
||||
width={width}
|
||||
height={depth}
|
||||
stroke={color}
|
||||
strokeWidth={1.5}
|
||||
fill={fillColor}
|
||||
listening={false}
|
||||
/>
|
||||
{/* Screen line */}
|
||||
<Line
|
||||
points={[-halfW + width * 0.05, -halfD * 0.5, halfW - width * 0.05, -halfD * 0.5]}
|
||||
stroke={color}
|
||||
strokeWidth={1}
|
||||
listening={false}
|
||||
/>
|
||||
{/* Stand center mark */}
|
||||
<Line
|
||||
points={[0, halfD * 0.3, 0, halfD]}
|
||||
stroke={color}
|
||||
strokeWidth={1.5}
|
||||
listening={false}
|
||||
/>
|
||||
</Group>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user