From 1f11a4ecabf99c1d9ee859e981481ac1f510c0b2 Mon Sep 17 00:00:00 2001 From: Theis Date: Sun, 24 May 2026 13:50:41 +0200 Subject: [PATCH] added page footer --- frontend/src/App.css | 4 ++ frontend/src/App.tsx | 18 ++++++--- frontend/src/assets/Portfolio-QR-Code.png | Bin 0 -> 4277 bytes frontend/src/components/PageFooter.tsx | 42 +++++++++++++++++++++ frontend/src/pages/MainForm.tsx | 2 +- frontend/src/pages/SuccessPage.tsx | 7 +++- frontend/src/utils/i18n/locales/de/de.json | 3 +- frontend/src/utils/i18n/locales/en/en.json | 3 +- 8 files changed, 69 insertions(+), 10 deletions(-) create mode 100644 frontend/src/assets/Portfolio-QR-Code.png create mode 100644 frontend/src/components/PageFooter.tsx diff --git a/frontend/src/App.css b/frontend/src/App.css index 7b53bf9..33d3253 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -6,3 +6,7 @@ body, height: 100%; margin: 0; } + +body.success-bg { + background: linear-gradient(135deg, #0f172a, #111827); +} diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index b14f593..ece00e3 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -2,15 +2,21 @@ import "./App.css"; import { BrowserRouter, Route, Routes } from "react-router-dom"; import { MainForm } from "./pages/MainForm"; import { SuccessPage } from "./pages/SuccessPage"; +import { PageFooter } from "./components/PageFooter"; function App() { return ( - - - } /> - } /> - - +
+ +
+ + } /> + } /> + +
+
+ +
); } diff --git a/frontend/src/assets/Portfolio-QR-Code.png b/frontend/src/assets/Portfolio-QR-Code.png new file mode 100644 index 0000000000000000000000000000000000000000..f3feb298f55d08eaa3a92f4ae28025e46a72399a GIT binary patch literal 4277 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 literal 0 HcmV?d00001 diff --git a/frontend/src/components/PageFooter.tsx b/frontend/src/components/PageFooter.tsx new file mode 100644 index 0000000..27af4be --- /dev/null +++ b/frontend/src/components/PageFooter.tsx @@ -0,0 +1,42 @@ +import { Link, Sheet, Typography } from "@mui/joy"; +import { useTranslation } from "react-i18next"; +import qrCode from "../assets/Portfolio-QR-Code.png"; + +export const PageFooter = () => { + const { t } = useTranslation(); + + return ( +
+ +
+
+ + {t("footer-headline")} + + portfolio-theis.de + + + + https://portfolio-theis.de/ + +
+
+
+
+ ); +}; diff --git a/frontend/src/pages/MainForm.tsx b/frontend/src/pages/MainForm.tsx index 2c86891..36a5df2 100644 --- a/frontend/src/pages/MainForm.tsx +++ b/frontend/src/pages/MainForm.tsx @@ -184,7 +184,7 @@ export const MainForm = () => { -
+
{ setTickets(parseInt(params.get("tickets") ?? "0", 10)); // Small delay so the CSS transition actually plays setTimeout(() => setAnimate(true), 100); + + document.body.classList.add("success-bg"); + return () => { + document.body.classList.remove("success-bg"); + }; }, []); useEffect(() => { @@ -36,7 +41,7 @@ export const SuccessPage = () => { }); return ( -
+