diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..0fe1acd
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,9 @@
+{
+ "recommendations": [
+ "mikestead.dotenv",
+ "EditorConfig.EditorConfig",
+ "leonzalion.vscode-ejs",
+ "dbaeumer.vscode-eslint",
+ "stylelint.vscode-stylelint"
+ ]
+}
diff --git a/public/css/auth/login.css b/public/css/auth/login.css
index 84f7c26..ae96ca0 100644
--- a/public/css/auth/login.css
+++ b/public/css/auth/login.css
@@ -116,6 +116,37 @@
width: 100%;
}
+.password-group {
+ position: relative;
+ width: 100%;
+}
+
+.password-wrapper {
+ position: relative;
+ width: 100%;
+}
+
+.password-wrapper input {
+ width: 100%;
+ padding-right: 2rem;
+}
+
+.toggle-password {
+ position: absolute;
+ right: 10px;
+ top: 50%;
+ transform: translateY(-50%);
+ cursor: pointer;
+ width: 20px;
+ height: 20px;
+ fill: var(--text-secondary);
+ transition: fill 0.2s;
+}
+
+.toggle-password:hover {
+ fill: var(--accent);
+}
+
.error-message {
color: var(--error);
background-color: rgb(237 66 69 / 10%);
diff --git a/public/js/auth/login.js b/public/js/auth/login.js
index b95dec2..b107efe 100644
--- a/public/js/auth/login.js
+++ b/public/js/auth/login.js
@@ -35,3 +35,18 @@ if (loginForm) {
}
});
}
+
+const passwordInput = document.getElementById("password");
+const togglePassword = document.getElementById("toggle-password");
+
+togglePassword.addEventListener("click", () => {
+ if (passwordInput.type === "password") {
+ passwordInput.type = "text";
+ togglePassword.innerHTML =
+ '';
+ } else {
+ passwordInput.type = "password";
+ togglePassword.innerHTML =
+ '';
+ }
+});
diff --git a/src/routes/auth/login.ts b/src/routes/auth/login.ts
index 74cf330..0c24f39 100644
--- a/src/routes/auth/login.ts
+++ b/src/routes/auth/login.ts
@@ -7,7 +7,9 @@ const routeDef: RouteDef = {
returns: "text/html",
};
-async function handler(): Promise {
+async function handler(request: ExtendedRequest): Promise {
+ if (request.session) return Response.redirect("/");
+
const instanceName: string =
(await getSetting("instance_name")) || "Unnamed Instance";
diff --git a/src/views/auth/login.ejs b/src/views/auth/login.ejs
index 252f932..7776779 100644
--- a/src/views/auth/login.ejs
+++ b/src/views/auth/login.ejs
@@ -30,9 +30,14 @@
-