diff --git a/backlogger/static/backlogger/style.css b/backlogger/static/backlogger/style.css
new file mode 100644
index 0000000..a53aeec
--- /dev/null
+++ b/backlogger/static/backlogger/style.css
@@ -0,0 +1,104 @@
+/* ── Reset ─────────────────────────────────────────────────────── */
+*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
+
+/* ── Base ──────────────────────────────────────────────────────── */
+body {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
+ background: #0f172a;
+ color: #e2e8f0;
+ min-height: 100vh;
+}
+a { color: inherit; text-decoration: none; }
+
+/* ── Site header ───────────────────────────────────────────────── */
+.site-header {
+ background: #0a0f1e;
+ border-bottom: 1px solid #1e293b;
+ padding: 0.75rem 2rem;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+.site-header .brand { color: #38bdf8; font-weight: 600; font-size: 0.95rem; }
+.site-header nav { display: flex; gap: 1.5rem; align-items: center; }
+.site-header nav a { color: #64748b; font-size: 0.85rem; }
+.site-header nav a:hover { color: #e2e8f0; }
+
+/* ── Buttons ───────────────────────────────────────────────────── */
+.btn {
+ display: inline-block;
+ padding: 0.45rem 1rem;
+ border-radius: 6px;
+ font-size: 0.85rem;
+ cursor: pointer;
+ border: none;
+ transition: opacity 0.15s;
+ font-family: inherit;
+}
+.btn:hover { opacity: 0.85; }
+.btn-primary { background: #38bdf8; color: #0f172a; font-weight: 600; }
+.btn-sm { padding: 0.3rem 0.65rem; font-size: 0.78rem; }
+.btn-outline { background: transparent; color: #94a3b8; border: 1px solid #334155; }
+.btn-danger { background: transparent; color: #f87171; border: 1px solid #f87171; padding: 0.3rem 0.65rem; font-size: 0.78rem; }
+.btn-danger:hover { background: #f87171; color: #0f172a; opacity: 1; }
+.btn-done { background: transparent; color: #34d399; border: 1px solid #34d399; padding: 0.3rem 0.65rem; font-size: 0.78rem; }
+.btn-done:hover { background: #34d399; color: #0f172a; opacity: 1; }
+.btn-abandon { background: transparent; color: #fb923c; border: 1px solid #fb923c; padding: 0.3rem 0.65rem; font-size: 0.78rem; }
+.btn-abandon:hover { background: #fb923c; color: #0f172a; opacity: 1; }
+.btn-ghost { background: transparent; color: #64748b; border: 1px solid #334155; }
+.btn-ghost:hover { color: #e2e8f0; opacity: 1; }
+.btn-text { background: none; border: none; color: #64748b; font-size: 0.8rem; cursor: pointer; font-family: inherit; padding: 0; }
+.btn-text:hover { color: #e2e8f0; }
+
+/* ── Form fields ───────────────────────────────────────────────── */
+.field { margin-bottom: 1.1rem; }
+.field label {
+ display: block;
+ font-size: 0.78rem;
+ color: #94a3b8;
+ text-transform: uppercase;
+ letter-spacing: 0.07em;
+ margin-bottom: 0.4rem;
+}
+.field input[type="text"],
+.field input[type="number"],
+.field input[type="password"],
+.field select {
+ width: 100%;
+ background: #1e293b;
+ border: 1px solid #334155;
+ border-radius: 6px;
+ color: #e2e8f0;
+ padding: 0.6rem 0.75rem;
+ font-size: 0.9rem;
+ font-family: inherit;
+}
+.field input:focus,
+.field select:focus { outline: none; border-color: #38bdf8; }
+
+/* ── Errors ────────────────────────────────────────────────────── */
+.errorlist { list-style: none; color: #f87171; font-size: 0.8rem; margin-top: 0.3rem; }
+.error-banner {
+ background: #450a0a;
+ border: 1px solid #f87171;
+ border-radius: 8px;
+ color: #fca5a5;
+ padding: 0.85rem 1.1rem;
+ margin-bottom: 1.5rem;
+}
+
+/* ── Light theme ───────────────────────────────────────────────── */
+body[data-theme="light"] { background: #f8fafc; color: #0f172a; }
+body[data-theme="light"] .site-header { background: #ffffff; border-color: #e2e8f0; }
+body[data-theme="light"] .site-header .brand { color: #0284c7; }
+body[data-theme="light"] .site-header nav a { color: #64748b; }
+body[data-theme="light"] .btn-primary { background: #0284c7; }
+body[data-theme="light"] .btn-outline { color: #64748b; border-color: #cbd5e1; }
+body[data-theme="light"] .field input[type="text"],
+body[data-theme="light"] .field input[type="number"],
+body[data-theme="light"] .field input[type="password"],
+body[data-theme="light"] .field select {
+ background: #f1f5f9;
+ color: #0f172a;
+ border-color: #cbd5e1;
+}
diff --git a/backlogger/templates/backlogger/base.html b/backlogger/templates/backlogger/base.html
new file mode 100644
index 0000000..6d886c1
--- /dev/null
+++ b/backlogger/templates/backlogger/base.html
@@ -0,0 +1,22 @@
+{% load static %}
+
+
+
+
+
+ {% block title %}Backlogger{% endblock %}
+
+ {% block styles %}{% endblock %}
+
+
+
+
+
+{% block content %}{% endblock %}
+
+{% block scripts %}{% endblock %}
+
+
diff --git a/backlogger/templates/backlogger/base_auth.html b/backlogger/templates/backlogger/base_auth.html
new file mode 100644
index 0000000..2b90dd0
--- /dev/null
+++ b/backlogger/templates/backlogger/base_auth.html
@@ -0,0 +1,39 @@
+{% load static %}
+
+
+
+
+
+ {% block title %}Backlogger{% endblock %}
+
+
+ {% block styles %}{% endblock %}
+
+
+{% block content %}{% endblock %}
+
+
diff --git a/backlogger/templates/backlogger/item_form.html b/backlogger/templates/backlogger/item_form.html
index fce87bb..216d622 100644
--- a/backlogger/templates/backlogger/item_form.html
+++ b/backlogger/templates/backlogger/item_form.html
@@ -1,144 +1,39 @@
-
-
-
-
-
- {{ action }} Item — Backlogger
-
+{% endblock %}
- .two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }
-
- .actions {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-top: 2rem;
- }
- .btn {
- display: inline-block;
- padding: 0.5rem 1.25rem;
- border-radius: 6px;
- font-size: 0.875rem;
- cursor: pointer;
- border: none;
- }
- .btn-primary { background: #38bdf8; color: #0f172a; font-weight: 600; }
- .btn-primary:hover { opacity: 0.88; }
- .btn-ghost { background: transparent; color: #64748b; border: 1px solid #334155; text-decoration: none; padding: 0.5rem 1.25rem; }
- .btn-ghost:hover { color: #e2e8f0; }
-
- .errorlist { list-style: none; color: #f87171; font-size: 0.8rem; margin-top: 0.3rem; }
-
-
-
-
-
+{% block nav %}
+← Back to backlogger
+{% endblock %}
+{% block content %}
{{ action }} item
@@ -174,7 +69,6 @@
-
-
Books
@@ -218,12 +111,11 @@
-
Films
-
+
{{ form.watched }}
Watched
@@ -244,7 +136,9 @@
+{% endblock %}
+{% block scripts %}
-
-
-
+{% endblock %}
diff --git a/backlogger/templates/backlogger/list.html b/backlogger/templates/backlogger/list.html
index 75b8490..15d8dcf 100644
--- a/backlogger/templates/backlogger/list.html
+++ b/backlogger/templates/backlogger/list.html
@@ -1,200 +1,73 @@
-
-
-
-
-
-
Backlogger — k-boris.tech
-
+{% endblock %}
- .empty {
- text-align: center;
- padding: 5rem 2rem;
- color: #64748b;
- }
- .empty a { color: #38bdf8; }
-
- /* Light theme overrides */
- body[data-theme="light"] { background: #f8fafc; color: #0f172a; }
- body[data-theme="light"] .site-header { background: #ffffff; border-color: #e2e8f0; }
- body[data-theme="light"] .site-header .brand { color: #0284c7; }
- body[data-theme="light"] .card { background: #ffffff; border-color: #e2e8f0; }
- body[data-theme="light"] .progress-bar { background: #e2e8f0; }
- body[data-theme="light"] .progress-fill { background: #0284c7; }
- body[data-theme="light"] .card-stat { color: #0284c7; }
- body[data-theme="light"] .filter-bar { border-color: #e2e8f0; }
- body[data-theme="light"] .tab-sep { background: #e2e8f0; }
- body[data-theme="light"] .tab.active { color: #0284c7; border-bottom-color: #0284c7; }
- body[data-theme="light"] .sort-wrap select { background: #f1f5f9; color: #0f172a; border-color: #cbd5e1; }
- body[data-theme="light"] .btn-outline { color: #64748b; border-color: #cbd5e1; }
- body[data-theme="light"] .btn-primary { background: #0284c7; }
- body[data-theme="light"] .site-header nav a { color: #64748b; }
- body[data-theme="light"] .empty a { color: #0284c7; }
-
-
-
-
-
+{% block nav %}
+
{{ request.user.profile.display_name|default:request.user.username }}
+
+{% endblock %}
+{% block content %}
Backlogger {{ items|length }}
@@ -242,7 +115,7 @@
Newest first
Oldest first
Most complete
- Recently updated
+ Recently updated
@@ -327,12 +200,13 @@
{% endif %}
+{% endblock %}
+{% block scripts %}
-
-
-
+{% endblock %}
diff --git a/backlogger/templates/backlogger/login.html b/backlogger/templates/backlogger/login.html
index 19c5e9b..c0c8d28 100644
--- a/backlogger/templates/backlogger/login.html
+++ b/backlogger/templates/backlogger/login.html
@@ -1,123 +1,41 @@
-
-
-
-
-
-
Log in — k-boris.tech
-
-
-
-
-
k-boris.tech
-
Backlogger
+{% extends 'backlogger/base_auth.html' %}
- {% if form.non_field_errors %}
- {% for error in form.non_field_errors %}
- {% if 'inactive' in error|lower or 'active' in error|lower %}
-
Your account is pending approval. You'll be able to log in once it's activated.
- {% else %}
-
Invalid username or password.
- {% endif %}
- {% endfor %}
- {% endif %}
+{% block title %}Log in — k-boris.tech{% endblock %}
-
+
+ No account? Sign up
+
+
+{% endblock %}
diff --git a/backlogger/templates/backlogger/profile.html b/backlogger/templates/backlogger/profile.html
index 429ef50..d41fcc2 100644
--- a/backlogger/templates/backlogger/profile.html
+++ b/backlogger/templates/backlogger/profile.html
@@ -1,112 +1,45 @@
-
-
-
-
-
-
Profile — Backlogger
-
-
-
+ .saved-msg { font-size: 0.82rem; color: #34d399; display: none; }
+ .saved-msg.show { display: inline; }
-
+ body[data-theme="light"] .card { background: #ffffff; border-color: #e2e8f0; }
+ body[data-theme="light"] .field input[type="text"],
+ body[data-theme="light"] .field select { background: #f8fafc; color: #0f172a; border-color: #cbd5e1; }
+ body[data-theme="light"] .divider { border-color: #e2e8f0; }
+
+{% endblock %}
+{% block nav %}
+
Backlog
+
Profile
+
+{% endblock %}
+
+{% block content %}
Profile
@{{ request.user.username }}{% if request.user.date_joined %} · member since {{ request.user.date_joined|date:"N Y" }}{% endif %}
@@ -134,6 +67,4 @@
-
-
-
+{% endblock %}
diff --git a/backlogger/templates/backlogger/signup.html b/backlogger/templates/backlogger/signup.html
index ac7b90d..3f90bd6 100644
--- a/backlogger/templates/backlogger/signup.html
+++ b/backlogger/templates/backlogger/signup.html
@@ -1,117 +1,46 @@
-
-
-
-
-
- Sign up — Backlogger
-
-
-
-
-
killmybacklog.com
-
Create an account
+{% extends 'backlogger/base_auth.html' %}
-
+
+ Already have an account? Log in
+
+
+{% endblock %}
diff --git a/backlogger/templates/backlogger/signup_pending.html b/backlogger/templates/backlogger/signup_pending.html
index 65a450b..25a2bae 100644
--- a/backlogger/templates/backlogger/signup_pending.html
+++ b/backlogger/templates/backlogger/signup_pending.html
@@ -1,51 +1,23 @@
-
-
-
-
-
- Account requested — Backlogger
-
-
-
-
-
-
+{% extends 'backlogger/base_auth.html' %}
+
+{% block title %}Account requested — Backlogger{% endblock %}
+
+{% block styles %}
+
+{% endblock %}
+
+{% block content %}
+
+{% endblock %}
diff --git a/backlogger/templates/backlogger/steam_import.html b/backlogger/templates/backlogger/steam_import.html
index 1b43c4c..a29b1b2 100644
--- a/backlogger/templates/backlogger/steam_import.html
+++ b/backlogger/templates/backlogger/steam_import.html
@@ -1,154 +1,52 @@
-
-
-
-
-
- Import from Steam — Backlogger
-
-
-
+ .empty { text-align: center; padding: 4rem 2rem; color: #475569; }
-
+ .steam-btn { display: inline-flex; align-items: center; gap: 0.6rem; background: #1b2838; border: 1px solid #2a475e; color: #c7d5e0; font-weight: 600; border-radius: 6px; padding: 0.6rem 1.1rem; font-size: 0.9rem; cursor: pointer; transition: background 0.15s; }
+ .steam-btn:hover { background: #2a475e; }
+ .steam-logo { width: 20px; height: 20px; }
+
+{% endblock %}
+{% block nav %}
+← Back to backlog
+{% endblock %}
+
+{% block content %}
{% if error %}
@@ -219,7 +117,7 @@
{% else %}
Import from Steam
+{% endblock %}
+{% block scripts %}
-
-
+{% endblock %}