From 361592a8fb749a95d03c81ed63720070ea8bb5fa Mon Sep 17 00:00:00 2001 From: Dominic Date: Fri, 6 Mar 2026 20:36:37 +0000 Subject: [PATCH] Final pre taxi --- backend/__pycache__/app.cpython-312.pyc | Bin 53734 -> 55559 bytes backend/app.py | 24 +++++--- backend/pyproject.toml | 1 + backend/static/styles.css | 17 +++++- backend/templates/info.html | 30 ++++++---- backend/uv.lock | 71 ++++++++++++++++++++++++ data/db/app.sqlite3 | Bin 53248 -> 53248 bytes 7 files changed, 121 insertions(+), 22 deletions(-) diff --git a/backend/__pycache__/app.cpython-312.pyc b/backend/__pycache__/app.cpython-312.pyc index 2afa598a23c2c2842300b760720a155e2bffbd1d..a477905b59855726c8e074da7c19959b36fc54dd 100644 GIT binary patch delta 16489 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 diff --git a/backend/app.py b/backend/app.py index 881eb46..466b8f0 100644 --- a/backend/app.py +++ b/backend/app.py @@ -272,7 +272,7 @@ TEXTS = { "login": "Login", "group_name": "Benutzername", "group_password": "Passwort", - "login_submit": "Weiter zum Gästebereich", + "login_submit": "Weiter zum Eingangsbereich", "guest_area": "Gästebereich", "hello_guest": "Hallo {name}.", "logout": "Abmelden", @@ -305,6 +305,8 @@ TEXTS = { "location_story_title": "Klostermühle in den Weinbergen", "location_story_text": "Die Klostermühle liegt mitten in den Weinbergen und verbindet ein besonderes Weingut-Ambiente mit saisonaler Küche. Euch erwartet eine entspannte Atmosphäre zwischen Natur, gutem Essen und einem wunderschönen Rahmen für unseren Hochzeitstag.", "route_from_current": "Route ab aktuellem Standort", + "route_location_denied": "Standortfreigabe abgelehnt. Es wurde keine Route mit deinem Standort erstellt.", + "route_location_unavailable": "Standort ist in diesem Browser derzeit nicht verfügbar.", "maps_privacy_notice": "Zur Anzeige der Karte werden Daten an Google übertragen.", "maps_load_button": "Google Maps anzeigen", "privacy": "Datenschutz", @@ -314,7 +316,8 @@ TEXTS = { "hero_headline_with_group": "Willkommen zu unserer Hochzeit, {name}", "hero_text_single": "Wir freuen uns riesig, diesen besonderen Tag am 04.09.26 mit dir zu feiern.", "hero_text_group": "Wir freuen uns riesig, diesen besonderen Tag am 04.09.26 mit euch zu feiern.", - "hero_app_hint": "In dieser Webapp könnt ihr Zu- oder Absagen, Fotos hochladen, die Galerie ansehen und alle wichtigen Infos rund um den Tag finden. Bitte gebt eure Zu- oder Absage möglichst bald ab.", + "hero_app_hint_single": "In dieser Webapp kannst du zu- oder absagen, Fotos hochladen, die Galerie ansehen und alle wichtigen Infos rund um den Tag finden. Bitte gib deine Zu- oder Absage möglichst bald ab.", + "hero_app_hint": "In dieser Webapp könnt ihr zu- oder absagen, Fotos hochladen, die Galerie ansehen und alle wichtigen Infos rund um den Tag finden. Bitte gebt eure Zu- oder Absage möglichst bald ab.", "to_guest_area": "Zum Gästebereich", "schedule_text": "15:00 Trauung, 17:00 Empfang, 19:00 Dinner.", "schedule_intro": "Hier findet ihr den Ablauf für unseren Hochzeitstag.", @@ -350,11 +353,11 @@ TEXTS = { "hotel_weinhaus_engel_desc": "Gemütliches Weinhaus-Hotel in Rauenthal.", "taxi_text": "An einem Taxiservice arbeiten wir noch.", "taxi_sticker_alt": "Bauarbeiter-Sticker: Arbeit in Progress", - "gifts_teaser": "Wir würden uns über Geschenke sehr freuen...", + "gifts_teaser": "Wir würden uns über diese Geschenke sehr freuen...", "gifts_reveal_button": "Wunsch aufdecken", "gifts_image_alt": "Ein großer Haufen Geldscheine", "gifts_caption": "Trommelwirbel... in unserer 70-Quadratmeter-Wohnung ist leider kein Platz mehr für Materielles.", - "gifts_text": "Also: Money! Wir freuen uns über einen finanziellen Beitrag zu unserer Reise nach der Hochzeit.", + "gifts_text": "Also: Money! Ein finanzieller Beitrag zu unserer Reise nach der Hochzeit ist herzlich willkommen.", "gallery_uploaded_by": "von {name}", "gallery_empty": "Noch keine Bilder vorhanden.", "gallery_image_alt": "Upload von {name}", @@ -408,7 +411,7 @@ TEXTS = { "login": "Login", "group_name": "Username", "group_password": "Password", - "login_submit": "Open guest area", + "login_submit": "Continue to entrance area", "guest_area": "Guest Area", "hello_guest": "Hello {name}.", "logout": "Logout", @@ -441,6 +444,8 @@ TEXTS = { "location_story_title": "Klostermuehle in the vineyards", "location_story_text": "Klostermuehle is surrounded by vineyards and combines a unique winery atmosphere with seasonal cuisine. Expect a relaxed setting with nature, great food, and a beautiful backdrop for our wedding day.", "route_from_current": "Route from current location", + "route_location_denied": "Location access was denied. No route with your location was created.", + "route_location_unavailable": "Location is currently unavailable in this browser.", "maps_privacy_notice": "To display the map, data will be transferred to Google.", "maps_load_button": "Show Google Maps", "privacy": "Privacy", @@ -450,6 +455,7 @@ TEXTS = { "hero_headline_with_group": "Welcome to our wedding, {name}", "hero_text_single": "We are incredibly excited to celebrate this special day on 09/04/26 with you.", "hero_text_group": "We are incredibly excited to celebrate this special day on 09/04/26 with all of you.", + "hero_app_hint_single": "In this web app, you can send your RSVP, upload photos, view the gallery, and find all important details for the day. Please submit your RSVP soon.", "hero_app_hint": "In this web app, you can send your RSVP, upload photos, view the gallery, and find all important details for the day. Please submit your RSVP soon.", "to_guest_area": "Open guest area", "schedule_text": "3:00 PM ceremony, 5:00 PM reception, 7:00 PM dinner.", @@ -486,11 +492,11 @@ TEXTS = { "hotel_weinhaus_engel_desc": "Cozy winehouse hotel in Rauenthal.", "taxi_text": "We are still working on a taxi service.", "taxi_sticker_alt": "Construction worker sticker: Work in progress", - "gifts_teaser": "We would be very happy to receive gifts...", + "gifts_teaser": "We would be very happy to receive these gifts...", "gifts_reveal_button": "Reveal wish", "gifts_image_alt": "A big pile of cash", "gifts_caption": "Drum roll... in our 70-square-meter apartment, we sadly have no room left for material things.", - "gifts_text": "So: Money! We would be very happy about a financial contribution to our trip after the wedding.", + "gifts_text": "So: Money! A financial contribution to our trip after the wedding is very welcome.", "gallery_uploaded_by": "by {name}", "gallery_empty": "No photos available yet.", "gallery_image_alt": "Uploaded by {name}", @@ -526,7 +532,7 @@ TEXTS = { "dashboard": "Dashboard", "back": "Back", "countdown_button_label": "Wedding countdown", - "countdown_until": "Starts in", + "countdown_until": "Countdown", "countdown_started": "The celebration has started", "countdown_days": "Days", "countdown_hours": "Hrs", @@ -905,7 +911,7 @@ def welcome(): "welcome.html", welcome_headline=welcome_headline, welcome_text=welcome_text, - welcome_hint=t("hero_app_hint"), + welcome_hint=t("hero_app_hint_single") if is_single_guest else t("hero_app_hint"), ) diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 0be2c9c..9f82ac2 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -7,4 +7,5 @@ requires-python = ">=3.12" dependencies = [ "flask>=3.1.2", "gunicorn>=23.0.0", + "pillow>=12.1.1", ] diff --git a/backend/static/styles.css b/backend/static/styles.css index cb64da8..086d08f 100644 --- a/backend/static/styles.css +++ b/backend/static/styles.css @@ -335,6 +335,7 @@ section.card > p { background: rgba(255, 252, 247, 0.98); box-shadow: 0 14px 34px rgba(0, 0, 0, 0.22); backdrop-filter: blur(4px); + text-align: center; } .login-privacy-title { @@ -642,9 +643,10 @@ input[type="file"]:focus { } .toolbar-timer-popover { - position: absolute; - top: calc(100% + 0.38rem); - right: 0; + position: fixed; + top: 4.4rem; + left: 50%; + transform: translateX(-50%); min-width: 12.4rem; padding: 0.62rem 0.7rem; border-radius: 12px; @@ -658,6 +660,7 @@ input[type="file"]:focus { margin: 0 0 0.35rem; color: rgba(31, 31, 31, 0.72); font-size: 0.76rem; + text-align: center; } .toolbar-timer-grid { @@ -701,6 +704,7 @@ input[type="file"]:focus { margin: 0.42rem 0 0; color: rgba(31, 31, 31, 0.74); font-size: 0.74rem; + text-align: center; } @keyframes countdown-pop { @@ -1191,6 +1195,7 @@ body.has-route-modal { border: 1px solid rgba(31, 58, 47, 0.12); padding: 1rem; background: linear-gradient(155deg, #fff8eb 0%, #f3e6cc 100%); + text-align: center; } .gift-lead { @@ -1235,6 +1240,7 @@ body.has-route-modal { margin: 0.8rem 0 0; font-weight: 700; color: var(--forest); + text-align: center; } .money-rain { @@ -1490,12 +1496,17 @@ body.has-route-modal { .hero-overlay { max-width: 54ch; padding: 2rem; + margin-inline: auto; } .hero-banner { min-height: 78vh; background-position: center 24%; } + + .hero-hint-below { + margin-inline: auto; + } } @media (max-width: 640px) { diff --git a/backend/templates/info.html b/backend/templates/info.html index 6613115..fbe1144 100644 --- a/backend/templates/info.html +++ b/backend/templates/info.html @@ -191,7 +191,12 @@ {% elif page == 'location' %}

{{ t('location_story_title') }}

{{ t('location_story_text') }}

-