diff --git a/GUESTS.md b/GUESTS.md index 71b10dc..6aa2681 100644 --- a/GUESTS.md +++ b/GUESTS.md @@ -2,7 +2,7 @@ Aktueller Stand der Login-Gruppen aus `backend/app.py` (`DEFAULT_INVITATION_GROUPS`). -Anzahl Gruppen: **39** +Anzahl Gruppen: **41** | Username | Rolle | Passwort | Members | |---|---|---|---| @@ -45,5 +45,7 @@ Anzahl Gruppen: **39** | Alfred & Nadia | guest | `Alfr&Nad24!#` | Alfred, Nadia | | Anne-Marie & Erny | guest | `Anne&Ern24!#` | Anne-Marie, Erny | | Familie Kieffer | guest | `Kief!Fest24#` | Anny, John, Jana | +| Peter | guest | `Peter!Fest26#` | Peter | +| Johanna | guest | `Joha!Fest26#` | Johanna | Hinweis: Diese Datei enthält Klartext-Passwörter und sollte nicht öffentlich geteilt werden. diff --git a/backend/__pycache__/app.cpython-312.pyc b/backend/__pycache__/app.cpython-312.pyc index a477905..0ef5d57 100644 Binary files a/backend/__pycache__/app.cpython-312.pyc and b/backend/__pycache__/app.cpython-312.pyc differ diff --git a/backend/app.py b/backend/app.py index 466b8f0..191f4cb 100644 --- a/backend/app.py +++ b/backend/app.py @@ -207,6 +207,8 @@ DEFAULT_INVITATION_GROUPS = [ "role": "guest", "members": ["Anny", "John", "Jana"], }, + {"name": "Peter", "password": "Peter!Fest26#", "role": "guest", "members": ["Peter"]}, + {"name": "Johanna", "password": "Joha!Fest26#", "role": "guest", "members": ["Johanna"]}, ] AGE_REQUIRED_NAMES = {"Lena", "Finn", "Fin", "Bruno"} @@ -272,6 +274,8 @@ TEXTS = { "login": "Login", "group_name": "Benutzername", "group_password": "Passwort", + "show_password": "Passwort anzeigen", + "hide_password": "Passwort verbergen", "login_submit": "Weiter zum Eingangsbereich", "guest_area": "Gästebereich", "hello_guest": "Hallo {name}.", @@ -411,6 +415,8 @@ TEXTS = { "login": "Login", "group_name": "Username", "group_password": "Password", + "show_password": "Show password", + "hide_password": "Hide password", "login_submit": "Continue to entrance area", "guest_area": "Guest Area", "hello_guest": "Hello {name}.", diff --git a/backend/app.sqlite3 b/backend/app.sqlite3 index d5cd24b..3cbef9a 100644 Binary files a/backend/app.sqlite3 and b/backend/app.sqlite3 differ diff --git a/backend/static/styles.css b/backend/static/styles.css index ec7b111..d8b3ce7 100644 --- a/backend/static/styles.css +++ b/backend/static/styles.css @@ -296,6 +296,80 @@ section.card > p { background: rgba(255, 255, 255, 0.96); } +.password-input-wrap { + position: relative; +} + +.password-input-wrap input[type="password"], +.password-input-wrap input[type="text"] { + padding-right: 3.1rem; +} + +.password-input-wrap input[type="password"]::-ms-reveal, +.password-input-wrap input[type="password"]::-ms-clear { + display: none; +} + +.password-input-wrap input[type="password"]::-webkit-credentials-auto-fill-button, +.password-input-wrap input[type="password"]::-webkit-contacts-auto-fill-button { + visibility: hidden; + display: none !important; + pointer-events: none; +} + +.password-toggle { + position: absolute; + right: 0.5rem; + top: 50%; + transform: translateY(-50%); + width: 2rem; + height: 2rem; + border: 0; + border-radius: 999px; + background: transparent; + display: grid; + place-items: center; + cursor: pointer; + color: rgba(122, 47, 63, 0.72); + opacity: 0; + pointer-events: none; + transition: opacity 0.18s ease, color 0.18s ease, background-color 0.18s ease; +} + +.password-toggle.is-visible { + opacity: 1; + pointer-events: auto; +} + +.password-toggle:hover, +.password-toggle:focus-visible { + color: rgba(122, 47, 63, 0.95); + background: rgba(178, 137, 70, 0.16); + outline: none; +} + +.password-toggle .icon-eye { + width: 1.1rem; + height: 1.1rem; + fill: none; + stroke: currentColor; + stroke-width: 1.9; + stroke-linecap: round; + stroke-linejoin: round; +} + +.password-toggle .icon-eye-closed { + display: none; +} + +.password-toggle.is-active .icon-eye-open { + display: none; +} + +.password-toggle.is-active .icon-eye-closed { + display: block; +} + .login-shell input[type="text"]:focus, .login-shell input[type="password"]:focus { border-color: rgba(122, 47, 63, 0.58); diff --git a/backend/templates/login.html b/backend/templates/login.html index 4e7e932..9583475 100644 --- a/backend/templates/login.html +++ b/backend/templates/login.html @@ -16,7 +16,28 @@ @@ -35,16 +56,48 @@ (() => { const banner = document.querySelector("[data-login-privacy-banner]"); const acceptBtn = document.querySelector("[data-login-privacy-accept]"); - if (!banner || !acceptBtn) return; - const storageKey = "login_privacy_banner_v1_ack"; - if (localStorage.getItem(storageKey) === "1") { - banner.hidden = true; - return; + if (banner && acceptBtn) { + const storageKey = "login_privacy_banner_v1_ack"; + if (localStorage.getItem(storageKey) === "1") { + banner.hidden = true; + } else { + acceptBtn.addEventListener("click", () => { + localStorage.setItem(storageKey, "1"); + banner.hidden = true; + }); + } } - acceptBtn.addEventListener("click", () => { - localStorage.setItem(storageKey, "1"); - banner.hidden = true; + + const passwordInput = document.querySelector("[data-password-input]"); + const passwordToggle = document.querySelector("[data-password-toggle]"); + if (!passwordInput || !passwordToggle) return; + + const labelShow = "{{ t('show_password') }}"; + const labelHide = "{{ t('hide_password') }}"; + + const syncState = () => { + const hasValue = passwordInput.value.length > 0; + passwordToggle.hidden = !hasValue; + passwordToggle.classList.toggle("is-visible", hasValue); + if (!hasValue) { + passwordInput.type = "password"; + passwordToggle.setAttribute("aria-label", labelShow); + passwordToggle.setAttribute("title", labelShow); + passwordToggle.classList.remove("is-active"); + } + }; + + passwordToggle.addEventListener("click", () => { + const showPassword = passwordInput.type === "password"; + passwordInput.type = showPassword ? "text" : "password"; + const label = showPassword ? labelHide : labelShow; + passwordToggle.setAttribute("aria-label", label); + passwordToggle.setAttribute("title", label); + passwordToggle.classList.toggle("is-active", showPassword); }); + + passwordInput.addEventListener("input", syncState); + syncState(); })(); {% endblock %} diff --git a/data/db/app.sqlite3 b/data/db/app.sqlite3 index 6d8ead1..db8544d 100644 Binary files a/data/db/app.sqlite3 and b/data/db/app.sqlite3 differ