diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 0a60347..d6b7d96 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -228,38 +228,107 @@ export default function App() { ] : []; - const PlaceholderCard = ({ title, hint, compact = false }) => ( -
-
- {title} -
- {hint ? ( -
- {hint} + /** + * ✅ Unified Placeholder system + * Variants: + * - "compact": small top / dice (low height) + * - "tile": normal cards (HUD, decks, etc.) + * - "panel": large container (Board) + */ + const PlaceholderCard = ({ + title, + subtitle = "(placeholder)", + variant = "tile", + icon = null, + children = null, + }) => { + const v = variant; + + const pad = v === "compact" ? 10 : v === "panel" ? 14 : 12; + const titleSize = v === "compact" ? 12.5 : v === "panel" ? 14.5 : 13; + const subSize = v === "compact" ? 11.5 : 12; + const dashHeight = v === "compact" ? 46 : v === "panel" ? null : 64; + + const base = { + borderRadius: 18, + border: `1px solid ${stylesTokens.panelBorder}`, + background: stylesTokens.panelBg, + boxShadow: v === "panel" ? "0 20px 70px rgba(0,0,0,0.45)" : "0 12px 30px rgba(0,0,0,0.35)", + backdropFilter: "blur(10px)", + padding: pad, + overflow: "hidden", + minWidth: 0, + position: "relative", + }; + + const headerRow = { + display: "flex", + alignItems: "center", + justifyContent: "space-between", + gap: 10, + }; + + const titleStyle = { + fontWeight: 900, + color: stylesTokens.textMain, + fontSize: titleSize, + letterSpacing: 0.2, + lineHeight: 1.15, + }; + + const subStyle = { + marginTop: 6, + color: stylesTokens.textDim, + fontSize: subSize, + opacity: 0.95, + lineHeight: 1.25, + }; + + const dashStyle = { + marginTop: v === "compact" ? 8 : 10, + height: dashHeight, + borderRadius: 14, + border: `1px dashed ${stylesTokens.panelBorder}`, + opacity: 0.75, + }; + + const glowLine = v === "panel" + ? { + content: '""', + position: "absolute", + inset: 0, + background: `linear-gradient(90deg, transparent, ${stylesTokens.goldLine}, transparent)`, + opacity: 0.18, + pointerEvents: "none", + } + : null; + + return ( +
+ {v === "panel" ?
: null} + +
+
+
+ {icon ?
{icon}
: null} +
+ {title} +
+
+
+ + {subtitle ?
{subtitle}
: null} + + {/* Content area */} + {children ? ( +
{children}
+ ) : v === "panel" ? null : ( +
+ )}
- ) : null} -
-
- ); +
+ ); + }; // Player rail placeholder (rechts vom Board, vor Notizen) const players = [ @@ -303,69 +372,44 @@ export default function App() {
{/* Top: User + Settings adjacent */}
- - + +
{/* Main: Tools | Board | Player Rail */}
- {/* Left of board: Hilfskarten-Deck + Dunkles Deck (Board decks) */} + {/* Left of board: Board decks */}
- - + +
{/* Board: big */} -
-
- -
-
- 3D Board / Game View -
-
- Platzhalter – hier kommt später das Board + Figuren rein. -
- +
+
-
- - {/* Dice: under the board slightly right (overlay) */} -
- -
+ {/* Dice overlay: under the board slightly right */} +
+ +
+
- {/* Right of board: player rail, directly before notes */} + {/* Right of board: player rail */}
Spieler
@@ -376,24 +420,20 @@ export default function App() {
- {/* Bottom: Player HUD - Left: user card - Middle: secret cards + player's help-card slot next to it - Right: points - */} + {/* Bottom: Player HUD */}
- +
- - + +
- +
- {/* RIGHT: Notes Panel (scroll only here) */} + {/* RIGHT: Notes Panel */}