Files
house-plan-maker/apps/client/src/components/editor/symbols/furniture/TvSilhouette.tsx
T
alexei.dolgolyov af8b9fe00f 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
2026-04-05 22:34:03 +03:00

48 lines
1.1 KiB
TypeScript

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>
);
}