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