multi-user: users, per-user profiles/filters/notifications, tab UI, apply forensics
* DB: users + user_profiles/filters/notifications/preferences; applications gets user_id + forensics_json + profile_snapshot_json; new errors table with 14d retention; schema versioning via MIGRATIONS list * auth: password hashes in DB (argon2); env vars seed first admin; per-user sessions; CSRF bound to user id * apply: personal info/WBS moved out of env into the request body; providers take an ApplyContext with Profile + submit_forms; full Playwright recorder (step log, console, page errors, network, screenshots, final HTML) * web: five top-level tabs (Wohnungen/Bewerbungen/Logs/Fehler/Einstellungen); settings sub-tabs profil/filter/benachrichtigungen/account/benutzer; per-user matching, auto-apply and notifications (UI/Telegram/SMTP); red auto-apply switch on Wohnungen tab; forensics detail view for bewerbungen and fehler; retention background thread Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
e663386a19
commit
c630b500ef
36 changed files with 2763 additions and 1113 deletions
|
|
@ -9,19 +9,13 @@
|
|||
<script src="https://unpkg.com/htmx.org@2.0.3"></script>
|
||||
<style>
|
||||
:root {
|
||||
--bg-from: #e4f0fb;
|
||||
--bg-to: #f7fbfe;
|
||||
--surface: #ffffff;
|
||||
--border: #d8e6f3;
|
||||
--text: #10253f;
|
||||
--muted: #667d98;
|
||||
--primary: #2f8ae0;
|
||||
--primary-hover: #1f74c8;
|
||||
--danger: #e05a6a;
|
||||
--danger-hover: #c44a59;
|
||||
--ghost: #eaf2fb;
|
||||
--ghost-hover: #d5e5f4;
|
||||
--accent: #fbd76b;
|
||||
--bg-from: #e4f0fb; --bg-to: #f7fbfe;
|
||||
--surface: #ffffff; --border: #d8e6f3;
|
||||
--text: #10253f; --muted: #667d98;
|
||||
--primary: #2f8ae0; --primary-hover: #1f74c8;
|
||||
--danger: #e05a6a; --danger-hover: #c44a59;
|
||||
--ghost: #eaf2fb; --ghost-hover: #d5e5f4;
|
||||
--accent: #fbd76b;
|
||||
}
|
||||
html { color-scheme: light; }
|
||||
body {
|
||||
|
|
@ -30,33 +24,24 @@
|
|||
color: var(--text);
|
||||
font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Inter, sans-serif;
|
||||
}
|
||||
.card {
|
||||
background: var(--surface);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 14px;
|
||||
box-shadow: 0 1px 2px rgba(16, 37, 63, 0.04);
|
||||
}
|
||||
.card { background: var(--surface); border: 1px solid var(--border); border-radius: 14px;
|
||||
box-shadow: 0 1px 2px rgba(16, 37, 63, 0.04); }
|
||||
.border-soft { border-color: var(--border) !important; }
|
||||
.divide-soft > :not([hidden]) ~ :not([hidden]) { border-color: var(--border) !important; }
|
||||
.btn { border-radius: 9px; padding: 0.45rem 0.95rem; font-weight: 500; transition: background 0.15s, box-shadow 0.15s, transform 0.05s; }
|
||||
.btn { border-radius: 9px; padding: 0.45rem 0.95rem; font-weight: 500;
|
||||
transition: background 0.15s, box-shadow 0.15s, transform 0.05s; display: inline-block; }
|
||||
.btn:active { transform: translateY(1px); }
|
||||
.btn-primary { background: var(--primary); color: white; box-shadow: 0 1px 2px rgba(47, 138, 224, 0.25); }
|
||||
.btn-primary { background: var(--primary); color: white; box-shadow: 0 1px 2px rgba(47,138,224,.25); }
|
||||
.btn-primary:hover { background: var(--primary-hover); }
|
||||
.btn-danger { background: var(--danger); color: white; }
|
||||
.btn-danger:hover { background: var(--danger-hover); }
|
||||
.btn-ghost { background: var(--ghost); color: var(--text); border: 1px solid var(--border); }
|
||||
.btn-ghost:hover { background: var(--ghost-hover); }
|
||||
.input {
|
||||
background: var(--surface);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 10px;
|
||||
padding: 0.55rem 0.8rem;
|
||||
width: 100%;
|
||||
color: var(--text);
|
||||
transition: border-color 0.15s, box-shadow 0.15s;
|
||||
}
|
||||
.input:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(47, 138, 224, 0.18); }
|
||||
.chip { padding: 0.2rem 0.7rem; border-radius: 999px; font-size: 0.75rem; font-weight: 500; display: inline-block; }
|
||||
.input { background: var(--surface); border: 1px solid var(--border); border-radius: 10px;
|
||||
padding: 0.55rem 0.8rem; width: 100%; color: var(--text);
|
||||
transition: border-color .15s, box-shadow .15s; }
|
||||
.input:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(47,138,224,.18); }
|
||||
.chip { padding: .2rem .7rem; border-radius: 999px; font-size: .75rem; font-weight: 500; display: inline-block; }
|
||||
.chip-ok { background: #e4f6ec; color: #1f8a4a; border: 1px solid #b7e4c7; }
|
||||
.chip-warn { background: #fff4dd; color: #a36a1f; border: 1px solid #f5d48b; }
|
||||
.chip-bad { background: #fde6e9; color: #b8404e; border: 1px solid #f5b5bf; }
|
||||
|
|
@ -68,9 +53,27 @@
|
|||
}
|
||||
a { color: var(--primary); }
|
||||
a:hover { text-decoration: underline; }
|
||||
|
||||
/* tab nav */
|
||||
.tab { padding: 0.7rem 0.2rem; color: var(--muted); border-bottom: 2px solid transparent;
|
||||
margin-right: 1.5rem; font-weight: 500; }
|
||||
.tab.active { color: var(--text); border-color: var(--primary); }
|
||||
.tab:hover { color: var(--text); text-decoration: none; }
|
||||
|
||||
/* auto-apply hot button */
|
||||
.btn-hot { background: linear-gradient(135deg, #ff7a85 0%, #e14a56 100%); color: white;
|
||||
box-shadow: 0 2px 6px rgba(225, 74, 86, 0.35); font-weight: 600; }
|
||||
.btn-hot:hover { filter: brightness(1.05); }
|
||||
.btn-hot.off { background: linear-gradient(135deg, #cfd9e6 0%, #99abc2 100%);
|
||||
box-shadow: 0 1px 2px rgba(16, 37, 63, 0.15); }
|
||||
|
||||
/* forensic JSON tree */
|
||||
.mono { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 12px; }
|
||||
details > summary { cursor: pointer; user-select: none; }
|
||||
details > summary::marker { color: var(--muted); }
|
||||
</style>
|
||||
</head>
|
||||
<body class="min-h-screen">
|
||||
{% block body %}{% endblock %}
|
||||
{% block body %}{% endblock %}
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue