diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 18d87dc..7925ec8 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,3 +1,4 @@ +// frontend/src/App.jsx import React, { useEffect, useRef, useState } from "react"; import { api } from "./api/client"; @@ -241,6 +242,7 @@ export default function App() { variant = "tile", icon = null, children = null, + overflow = "hidden", // ✅ FIX: allow some tiles to not clip neighbors }) => { const v = variant; @@ -256,7 +258,7 @@ export default function App() { 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", + overflow, // ✅ FIX: default hidden, but can be visible where needed minWidth: 0, position: "relative", }; @@ -292,16 +294,17 @@ export default function App() { 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; + const glowLine = + v === "panel" + ? { + content: '""', + position: "absolute", + inset: 0, + background: `linear-gradient(90deg, transparent, ${stylesTokens.goldLine}, transparent)`, + opacity: 0.18, + pointerEvents: "none", + } + : null; return (
@@ -424,306 +427,295 @@ export default function App() { }; const HogwartsPointsCard = ({ value = 0 }) => { - const GOLD = "#f2d27a"; + const GOLD = "#f2d27a"; - return ( -
- {/* Dünnes Pergament */} -
- {/* Papier-Flecken */} -
- - {/* Innere Goldlinie */} -
- - {/* Wert */} -
-
- {value} -
- -
- HP -
-
- - {/* Siegel */} -
- SCORE -
-
-
- ); -}; - - const PlayerIdentityCard = ({ - name = "Harry Potter", - houseLabel = "Gryffindor", - borderColor = "#7c4dff", - img = "/player_cards/harry.png", -}) => { - return ( -
- {/* Slot-Container: bleibt ruhig, Karte darf drüber schauen */} + return (
- {/* Die Karte selbst (kleiner als Container) */}
{ - // einfacher Tilt ohne extra libs - const rect = e.currentTarget.getBoundingClientRect(); - const x = (e.clientX - rect.left) / rect.width; // 0..1 - const y = (e.clientY - rect.top) / rect.height; // 0..1 - const rx = (0.5 - y) * 6; // tilt range - const ry = (x - 0.5) * 8; - - e.currentTarget.style.transform = `translateY(-16px) rotate(-0.6deg) perspective(700px) rotateX(${rx}deg) rotateY(${ry}deg)`; - }} - onMouseLeave={(e) => { - e.currentTarget.style.transform = "translateY(-10px) rotate(-0.6deg)"; - }} - onMouseEnter={(e) => { - e.currentTarget.style.transform = "translateY(-18px) rotate(-0.6deg)"; - e.currentTarget.style.boxShadow = `0 26px 70px rgba(0,0,0,0.62), 0 0 34px ${borderColor}`; + overflow: "hidden", + display: "grid", + placeItems: "center", + padding: "14px 16px", }} > - {/* Image */} - {name} - - {/* Gloss */}
- {/* Bottom label glass */}
+ /> + +
- {name} + {value}
- - {houseLabel} + HP
- {/* Corner tag */}
- Identity + SCORE
-
- ); -}; + ); + }; + const PlayerIdentityCard = ({ + name = "Harry Potter", + houseLabel = "Gryffindor", + borderColor = "#7c4dff", + img = "/player_cards/harry.png", + }) => { + return ( +
+
+
{ + const rect = e.currentTarget.getBoundingClientRect(); + const x = (e.clientX - rect.left) / rect.width; + const y = (e.clientY - rect.top) / rect.height; + const rx = (0.5 - y) * 6; + const ry = (x - 0.5) * 8; + e.currentTarget.style.transform = `translateY(-16px) rotate(-0.6deg) perspective(700px) rotateX(${rx}deg) rotateY(${ry}deg)`; + }} + onMouseLeave={(e) => { + e.currentTarget.style.transform = "translateY(-10px) rotate(-0.6deg)"; + e.currentTarget.style.boxShadow = `0 18px 55px rgba(0,0,0,0.55), 0 0 26px rgba(124,77,255,0.22)`; + }} + onMouseEnter={(e) => { + e.currentTarget.style.transform = "translateY(-18px) rotate(-0.6deg)"; + e.currentTarget.style.boxShadow = `0 26px 70px rgba(0,0,0,0.62), 0 0 34px ${borderColor}`; + }} + > + {name} + +
+ +
+
+ {name} +
+ +
+ + {houseLabel} +
+
+ +
+ Identity +
+
+
+
+ ); + }; return (
@@ -757,7 +749,6 @@ export default function App() { subtitle="Platzhalter – hier kommt später das Board + Figuren rein." variant="panel" > - {/* 👇 DAS ist neu */}
- {/* Dice overlay bleibt gleich */}
@@ -799,8 +789,9 @@ export default function App() { />
- - + {/* ✅ FIX: these were clipping your hovering/overlapping player card */} + +
@@ -820,9 +811,7 @@ export default function App() { }} >
-
- Notizen -
+
Notizen
Nur die 3 Tabellen (Verdächtige / Gegenstände / Orte).
@@ -846,11 +835,7 @@ export default function App() {
- +
); } diff --git a/frontend/src/AppLayout.css b/frontend/src/AppLayout.css index 6ecb1a1..efbf971 100644 --- a/frontend/src/AppLayout.css +++ b/frontend/src/AppLayout.css @@ -1,3 +1,4 @@ +/* frontend/src/AppLayout.css */ html, body, #root { height: 100%; } @@ -100,14 +101,14 @@ body { justify-items: center; gap: 10px; - overflow: visible; /* 🔥 wichtig */ + overflow: visible; } .playerRailInner { width: 100%; height: 100%; - overflow: visible; /* hier wird wieder sauber gecropped */ - border-radius: 18px; /* etwas kleiner als außen */ + overflow: visible; + border-radius: 18px; display: grid; justify-items: center; }