# Phase 2 — React UI Components Task Spec
## Context
- Project: web-cad-neu (clean rewrite of web-cad)
- Frontend: /a0/usr/workdir/web-cad-neu/frontend/
- Stack: React 18 + TypeScript + Vite, plain CSS (no Tailwind/styled-components)
- tsconfig: jsx=react-jsx, baseUrl=./src, paths @/* -> .
## Reference Files (READ THESE FIRST)
- Mockup HTML: /a0/usr/workdir/web-cad-neu/mockup/editor.html (1133 lines)
- Mockup theme CSS: /a0/usr/workdir/web-cad-neu/mockup/assets/styles.css (195 lines)
- Mockup layout CSS: /a0/usr/workdir/web-cad-neu/mockup/assets/layout.css (1298 lines)
- Types: /a0/usr/workdir/web-cad-neu/frontend/src/types/cad.types.ts
- Phase 1 engines: /a0/usr/workdir/web-cad-neu/frontend/src/canvas/*.ts, /a0/usr/workdir/web-cad-neu/frontend/src/interaction/index.ts
## Output Directory
/a0/usr/workdir/web-cad-neu/frontend/src/
## Files to Create (15 components + 1 CSS)
### 1. styles.css
- Copy /a0/usr/workdir/web-cad-neu/mockup/assets/styles.css + layout.css content into ONE file at frontend/src/styles.css
- Keep all CSS class names verbatim from mockup
- Keep all CSS variables from styles.css
- Add mobile breakpoint rules from layout.css (<=768px)
### 2. App.tsx
- Root component: imports styles.css
- Layout:
> Topbar + RibbonBar + > LeftSidebar + CanvasArea + RightSidebar + + CommandLine + StatusBar + MobileDrawers
- State: activeTool, activeRibbonTab, activeRightPanel, theme, snapEnabled, orthoEnabled, gridEnabled, selectedElements, layers, cursorPos, commandHistory
- Pass props to children
### 3. components/Topbar.tsx
- class="topbar" with topbar-left (hamburger, logo, app-name, project-name, saved-badge) and topbar-right (undo, redo, divider, versions, share, divider, theme-toggle, help, divider, lang-select, notifications, avatar)
- Copy SVG icons EXACTLY from mockup lines 21-68
- Props: projectName, savedStatus, onUndo, onRedo, onThemeToggle, theme
### 4. components/RibbonBar.tsx
- class="ribbon" with ribbon-tabs (6 tabs: Start/Einfügen/Format/Ansicht/Extras/KI) + ribbon-content
- Start tab groups: Datei (Neu/Öffnen/Speichern), Bearbeiten (Undo/Redo/Kopieren/Einfügen), Ansicht (Zoom Fit/100%/Grid/Layer), Extras (Messen/Suchen/KI/Plugins)
- Copy SVGs from mockup lines 72-191
- Props: activeTab, onTabChange, onAction
### 5. components/LeftSidebar.tsx
- class="leftbar" with header (title + toggle), 4 tool-sections, footer (3 buttons)
- Sections: Auswählen/Anzeigen (Auswahl/Pan/Zoom/Messen), Zeichnen (Linie/Polylinie/Rechteck/Kreis/Bogen/Text/Bemaßung/Schraffur), Bearbeiten (Move/Copy/Rotate/Scale/Mirror/Trim/Offset/Löschen), Bestuhlung (Reihe/Block/Tisch/Bühne)
- 20 tool buttons with data-tool, title, SVG icon, label, kbd shortcut
- Copy SVGs from mockup lines 198-360
- Props: activeTool, onToolChange
- Footer: Plugin/Settings/Help buttons
### 6. components/CanvasArea.tsx
- class="canvas-area" with canvas-coords (X/Y display), canvas-view-tabs (2D/ISO/Front/Top),