diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx
index c1b1dd6..5bf26a6 100644
--- a/frontend/src/App.jsx
+++ b/frontend/src/App.jsx
@@ -19,11 +19,15 @@ function cycleTag(tag) {
return null;
}
+/**
+ * PaperCard: wrapper, der oben + unten einen "torn paper edge" drauflegt.
+ * Wichtig: Edge braucht zIndex > children, sonst verschwindet er unter dem Header.
+ */
function PaperCard({ children, style }) {
return (
%20 etc.) damit es zuverlässig als data-uri läuft.
+const PAPER_EDGE_SVG =
+ "data:image/svg+xml;utf8," +
+ encodeURIComponent(`
+
+`);
+
const styles = {
page: {
minHeight: "100dvh",
margin: 0,
padding: 0,
- // ⚡ PERFORMANCE: gröberes Pattern (weniger Repaints)
background: `
radial-gradient(circle at 12% 18%, rgba(120,80,30,0.18), rgba(0,0,0,0) 38%),
radial-gradient(circle at 85% 22%, rgba(120,80,30,0.12), rgba(0,0,0,0) 42%),
@@ -779,9 +799,8 @@ const styles = {
),
linear-gradient(180deg, #f1e2c2, #e3c996)
`,
- // ✅ FIX: "fixed" raus → Mobile scrollt deutlich smoother
- // backgroundAttachment: "fixed",
},
+
shell: {
fontFamily: '"IM Fell English", system-ui',
padding: 16,
@@ -802,7 +821,7 @@ const styles = {
backdropFilter: "blur(4px)",
},
- // === Paper card base (replaces `card` visually) ===
+ // ===== PAPER CARD =====
paperCard: {
position: "relative",
borderRadius: 16,
@@ -810,93 +829,39 @@ const styles = {
border: "1px solid rgba(0,0,0,0.18)",
background: "rgba(255,255,255,0.35)",
boxShadow: "0 10px 24px rgba(0,0,0,0.12)",
- transition: "transform 180ms ease, box-shadow 180ms ease",
},
-
- // Fallback (kept, in case you still use it somewhere)
- card: {
- borderRadius: 16,
- overflow: "hidden",
- border: "1px solid rgba(0,0,0,0.18)",
- background: "rgba(255,255,255,0.35)",
- boxShadow: "0 10px 24px rgba(0,0,0,0.12)",
- transition: "transform 180ms ease, box-shadow 180ms ease",
+ paperInner: {
+ position: "relative",
+ zIndex: 1, // content below edges
},
-
- // Paper edges (top + bottom) — mask-based, lightweight, no heavy blur/filters
paperEdgeTop: {
position: "absolute",
- left: 0,
- right: 0,
- top: 0,
+ left: -2,
+ right: -2,
+ top: -1,
height: 18,
+ zIndex: 3,
pointerEvents: "none",
- background:
- "linear-gradient(180deg, rgba(255,255,255,0.62), rgba(255,255,255,0.0))",
+ backgroundImage: `url("${PAPER_EDGE_SVG}")`,
+ backgroundRepeat: "repeat-x",
+ backgroundSize: "220px 18px",
opacity: 0.95,
-
- WebkitMaskImage:
- "radial-gradient(10px 8px at 6% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(12px 9px at 14% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(9px 7px at 24% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(13px 10px at 36% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(10px 8px at 49% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(12px 9px at 62% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(9px 7px at 74% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(13px 10px at 86% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(10px 8px at 94% 100%, #000 98%, transparent 102%)," +
- "linear-gradient(#000, #000)",
- maskImage:
- "radial-gradient(10px 8px at 6% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(12px 9px at 14% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(9px 7px at 24% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(13px 10px at 36% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(10px 8px at 49% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(12px 9px at 62% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(9px 7px at 74% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(13px 10px at 86% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(10px 8px at 94% 100%, #000 98%, transparent 102%)," +
- "linear-gradient(#000, #000)",
-
- filter: "drop-shadow(0 1px 0 rgba(0,0,0,0.14))",
- animation: "paperEdgeDrift 8s ease-in-out infinite",
+ mixBlendMode: "multiply",
},
-
paperEdgeBottom: {
position: "absolute",
- left: 0,
- right: 0,
- bottom: 0,
- height: 20,
+ left: -2,
+ right: -2,
+ bottom: -1,
+ height: 18,
+ zIndex: 3,
pointerEvents: "none",
- background:
- "linear-gradient(0deg, rgba(255,255,255,0.62), rgba(255,255,255,0.0))",
+ backgroundImage: `url("${PAPER_EDGE_SVG}")`,
+ backgroundRepeat: "repeat-x",
+ backgroundSize: "220px 18px",
opacity: 0.95,
+ mixBlendMode: "multiply",
transform: "scaleY(-1)",
- WebkitMaskImage:
- "radial-gradient(10px 8px at 6% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(12px 9px at 14% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(9px 7px at 24% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(13px 10px at 36% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(10px 8px at 49% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(12px 9px at 62% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(9px 7px at 74% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(13px 10px at 86% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(10px 8px at 94% 100%, #000 98%, transparent 102%)," +
- "linear-gradient(#000, #000)",
- maskImage:
- "radial-gradient(10px 8px at 6% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(12px 9px at 14% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(9px 7px at 24% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(13px 10px at 36% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(10px 8px at 49% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(12px 9px at 62% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(9px 7px at 74% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(13px 10px at 86% 100%, #000 98%, transparent 102%)," +
- "radial-gradient(10px 8px at 94% 100%, #000 98%, transparent 102%)," +
- "linear-gradient(#000, #000)",
- filter: "drop-shadow(0 1px 0 rgba(0,0,0,0.14))",
- animation: "paperEdgeDrift 8s ease-in-out infinite",
},
sectionHeader: {
@@ -938,8 +903,7 @@ const styles = {
fontWeight: 1000,
borderRadius: 10,
border: "1px solid rgba(0,0,0,0.25)",
- background:
- "linear-gradient(180deg, rgba(255,255,255,0.55), rgba(0,0,0,0.06))",
+ background: "linear-gradient(180deg, rgba(255,255,255,0.55), rgba(0,0,0,0.06))",
cursor: "pointer",
},
@@ -947,8 +911,7 @@ const styles = {
padding: "10px 12px",
borderRadius: 12,
border: "1px solid rgba(0,0,0,0.25)",
- background:
- "linear-gradient(180deg, rgba(255,255,255,0.75), rgba(0,0,0,0.06))",
+ background: "linear-gradient(180deg, rgba(255,255,255,0.75), rgba(0,0,0,0.06))",
fontWeight: 1000,
cursor: "pointer",
whiteSpace: "nowrap",
@@ -961,7 +924,7 @@ const styles = {
border: "1px solid rgba(0,0,0,0.25)",
background: "rgba(255,255,255,0.55)",
outline: "none",
- fontSize: 16, // ✅ iOS: verhindert Zoom
+ fontSize: 16,
},
primaryBtn: {
@@ -978,8 +941,7 @@ const styles = {
padding: "10px 12px",
borderRadius: 12,
border: "1px solid rgba(0,0,0,0.25)",
- background:
- "linear-gradient(180deg, rgba(255,255,255,0.75), rgba(0,0,0,0.05))",
+ background: "linear-gradient(180deg, rgba(255,255,255,0.75), rgba(0,0,0,0.05))",
fontWeight: 900,
cursor: "pointer",
transition: "transform 140ms ease, box-shadow 140ms ease",
@@ -1024,8 +986,7 @@ const styles = {
maxWidth: 560,
borderRadius: 18,
border: "1px solid rgba(0,0,0,0.25)",
- background:
- "linear-gradient(180deg, rgba(255,255,255,0.72), rgba(255,255,255,0.42))",
+ background: "linear-gradient(180deg, rgba(255,255,255,0.72), rgba(255,255,255,0.42))",
boxShadow: "0 18px 50px rgba(0,0,0,0.35)",
padding: 14,
backdropFilter: "blur(6px)",
@@ -1042,15 +1003,13 @@ const styles = {
height: 38,
borderRadius: 12,
border: "1px solid rgba(0,0,0,0.25)",
- background:
- "linear-gradient(180deg, rgba(255,255,255,0.85), rgba(0,0,0,0.06))",
+ background: "linear-gradient(180deg, rgba(255,255,255,0.85), rgba(0,0,0,0.06))",
fontWeight: 1000,
cursor: "pointer",
lineHeight: "38px",
textAlign: "center",
},
- // Help modal content
helpBody: {
marginTop: 10,
paddingTop: 4,
@@ -1116,7 +1075,6 @@ const styles = {
position: "relative",
overflow: "hidden",
padding: 20,
- // ⚡ Performance: gröberes Pattern
background: `
radial-gradient(circle at 12% 18%, rgba(120,80,30,0.18), rgba(0,0,0,0) 38%),
radial-gradient(circle at 85% 22%, rgba(120,80,30,0.12), rgba(0,0,0,0) 42%),
@@ -1133,10 +1091,7 @@ const styles = {
width: "100%",
maxWidth: 420,
padding: 26,
- borderRadius: 22, // paperCard uses 16; this overrides for login
- position: "relative",
- zIndex: 2,
- // border/background/boxShadow handled by PaperCard base
+ borderRadius: 22,
animation: "popIn 240ms ease-out",
},
loginTitle: {
@@ -1166,7 +1121,7 @@ const styles = {
border: "1px solid rgba(0,0,0,0.25)",
background: "rgba(255,255,255,0.55)",
outline: "none",
- fontSize: 16, // ✅ iOS: verhindert Zoom
+ fontSize: 16,
},
loginBtn: {
padding: "12px 14px",
@@ -1212,7 +1167,7 @@ const styles = {
background: "rgba(255,255,255,0.55)",
outline: "none",
minWidth: 0,
- fontSize: 16, // ✅ iOS: verhindert Zoom
+ fontSize: 16,
},
pwToggleBtn: {
width: 48,
@@ -1222,8 +1177,7 @@ const styles = {
borderRadius: "0 12px 12px 0",
border: "1px solid rgba(0,0,0,0.25)",
borderLeft: "none",
- background:
- "linear-gradient(180deg, rgba(255,255,255,0.85), rgba(0,0,0,0.06))",
+ background: "linear-gradient(180deg, rgba(255,255,255,0.85), rgba(0,0,0,0.06))",
cursor: "pointer",
fontWeight: 900,
padding: 0,