core/frontend/login.html
enzo 97212b7ffa feat: sessions management, web manifest, square icon-only buttons, remove lang select
- Backend: migration 002 adds user_agent/ip/last_used_at to refresh_tokens
- Backend: GET /api/auth/sessions + DELETE /api/auth/sessions/{id} endpoints
- Frontend: profile page — sessions section (browser, IP, datetime, revoke)
- Frontend: web manifest + SVG icon for PWA support
- Frontend: remove language selector from all navbars (moved to profile page)
- Frontend: neu-btn--icon-sm class for square icon-only buttons (theme/logout/edit)
- Frontend: manifest link added to all 9 HTML pages

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-21 20:14:11 +01:00

64 lines
2.2 KiB
HTML

<!DOCTYPE html>
<html lang="fr">
<head>
<script>(function(){document.documentElement.setAttribute("data-theme",localStorage.getItem("pxp_theme")||"dark")})()</script>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>ProxmoxPanel — Connexion</title>
<link rel="stylesheet" href="/css/neu.css" />
<link rel="stylesheet" href="/css/dark.css" />
<link rel="stylesheet" href="/css/light.css" />
<link rel="stylesheet" href="/css/pages.css" />
<link rel="stylesheet" href="/css/lineicons-duotone.css" />
<link rel="manifest" href="/manifest.json" />
<script src="/js/vendors/htmx.min.js"></script>
<script src="/js/vendors/swup.iife.js"></script>
<script src="/js/app.js"></script>
<script src="/js/vendors/alpine.min.js" defer></script>
</head>
<body x-data>
<div class="auth-layout" x-data="loginPage()" x-cloak>
<div class="auth-card neu-card">
<div class="auth-logo">
<i class="logo-icon lnid-layout-1"></i>
<h1 class="auth-title">ProxmoxPanel</h1>
<p class="auth-subtitle" x-text="t('login.subtitle')"></p>
</div>
<form @submit.prevent="submit" class="auth-form">
<div class="form-group">
<label class="form-label" x-text="t('login.username')"></label>
<input
class="neu-input"
type="text"
x-model="username"
:placeholder="t('login.usernamePlaceholder')"
autocomplete="username"
required
/>
</div>
<div class="form-group">
<label class="form-label" x-text="t('login.password')"></label>
<input
class="neu-input"
type="password"
x-model="password"
:placeholder="t('login.passwordPlaceholder')"
autocomplete="current-password"
required
/>
</div>
<div class="form-error" x-show="error" x-text="error" role="alert"></div>
<button class="neu-btn neu-btn--primary auth-submit" type="submit" :disabled="loading">
<span x-show="!loading" x-text="t('login.submit')"></span>
<span x-show="loading" class="spinner"></span>
</button>
</form>
</div>
</div>
</body>
</html>