Initial TopDeck: self-hosted ranked favorites
A single Go binary with SQLite that serves a public page of the owner's ranked lists (movies, TV, albums, songs, video games, theater) and a login-gated editor. - Lists of 1–65,535 entries (100 recommended), several per category - Search-to-add via TMDB, TheTVDB, IGDB, Deezer/MusicBrainz, Wikipedia; manual entry as a fallback - Theater entries carry a production (Broadway, tour, …), venue and cast - Artwork cached locally; URL override and uploads - Drag, arrow and type-a-rank reordering; paginated for long lists - 12 theme presets plus custom CSS - First-run setup code or env-provided admin; bcrypt, rate-limited login, CSRF-guarded JSON API - Dockerfile and docker-compose.yml Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
commit
e9a75a968a
53 files changed
+7078
No files matched your search
@@ -0,0 +1,231 @@
|
||||
/*
|
||||
* TopDeck theme presets.
|
||||
*
|
||||
* Every color on the site comes from these variables, so a custom theme only
|
||||
* needs to override them (Settings → Appearance → Custom CSS), e.g.
|
||||
*
|
||||
* :root, [data-theme] { --accent: #ff4f81; --bg: #120d14; }
|
||||
*/
|
||||
|
||||
:root,
|
||||
[data-theme="midnight"] {
|
||||
color-scheme: dark;
|
||||
--bg: #0f1117;
|
||||
--surface: #171a22;
|
||||
--surface-2: #1f232e;
|
||||
--border: #2a2f3c;
|
||||
--text: #eceef4;
|
||||
--muted: #9aa1b2;
|
||||
--faint: #636a7c;
|
||||
--accent: #8b7dff;
|
||||
--accent-text: #ffffff;
|
||||
--accent-soft: rgba(139, 125, 255, 0.14);
|
||||
--danger: #ff6b7a;
|
||||
--success: #4fd1a1;
|
||||
--warn: #f5b84b;
|
||||
--gold: #f5c451;
|
||||
--silver: #cfd6e4;
|
||||
--bronze: #d99a6c;
|
||||
--shadow: 0 10px 30px rgba(0, 0, 0, 0.35);
|
||||
--font: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
|
||||
--font-display: var(--font);
|
||||
--radius: 10px;
|
||||
--radius-art: 8px;
|
||||
}
|
||||
|
||||
[data-theme="obsidian"] {
|
||||
color-scheme: dark;
|
||||
--bg: #000000;
|
||||
--surface: #0c0c0c;
|
||||
--surface-2: #161616;
|
||||
--border: #262626;
|
||||
--text: #f5f5f5;
|
||||
--muted: #a3a3a3;
|
||||
--faint: #5f5f5f;
|
||||
--accent: #f5f5f5;
|
||||
--accent-text: #000000;
|
||||
--accent-soft: rgba(255, 255, 255, 0.09);
|
||||
--shadow: 0 10px 30px rgba(0, 0, 0, 0.6);
|
||||
}
|
||||
|
||||
[data-theme="nord"] {
|
||||
color-scheme: dark;
|
||||
--bg: #242933;
|
||||
--surface: #2e3440;
|
||||
--surface-2: #3b4252;
|
||||
--border: #434c5e;
|
||||
--text: #eceff4;
|
||||
--muted: #b4bccb;
|
||||
--faint: #7b8598;
|
||||
--accent: #88c0d0;
|
||||
--accent-text: #1f242d;
|
||||
--accent-soft: rgba(136, 192, 208, 0.15);
|
||||
--danger: #bf616a;
|
||||
--success: #a3be8c;
|
||||
--warn: #ebcb8b;
|
||||
}
|
||||
|
||||
[data-theme="dracula"] {
|
||||
color-scheme: dark;
|
||||
--bg: #21222c;
|
||||
--surface: #282a36;
|
||||
--surface-2: #343746;
|
||||
--border: #44475a;
|
||||
--text: #f8f8f2;
|
||||
--muted: #b6b9cf;
|
||||
--faint: #6272a4;
|
||||
--accent: #ff79c6;
|
||||
--accent-text: #21222c;
|
||||
--accent-soft: rgba(255, 121, 198, 0.14);
|
||||
--danger: #ff5555;
|
||||
--success: #50fa7b;
|
||||
--warn: #f1fa8c;
|
||||
}
|
||||
|
||||
[data-theme="mocha"] {
|
||||
color-scheme: dark;
|
||||
--bg: #181825;
|
||||
--surface: #1e1e2e;
|
||||
--surface-2: #313244;
|
||||
--border: #45475a;
|
||||
--text: #cdd6f4;
|
||||
--muted: #a6adc8;
|
||||
--faint: #6c7086;
|
||||
--accent: #cba6f7;
|
||||
--accent-text: #1e1e2e;
|
||||
--accent-soft: rgba(203, 166, 247, 0.14);
|
||||
--danger: #f38ba8;
|
||||
--success: #a6e3a1;
|
||||
--warn: #f9e2af;
|
||||
}
|
||||
|
||||
[data-theme="rose-pine"] {
|
||||
color-scheme: dark;
|
||||
--bg: #191724;
|
||||
--surface: #1f1d2e;
|
||||
--surface-2: #26233a;
|
||||
--border: #393552;
|
||||
--text: #e0def4;
|
||||
--muted: #a8a4c4;
|
||||
--faint: #6e6a86;
|
||||
--accent: #ebbcba;
|
||||
--accent-text: #191724;
|
||||
--accent-soft: rgba(235, 188, 186, 0.14);
|
||||
--danger: #eb6f92;
|
||||
--success: #9ccfd8;
|
||||
--warn: #f6c177;
|
||||
}
|
||||
|
||||
[data-theme="gruvbox"] {
|
||||
color-scheme: dark;
|
||||
--bg: #1d2021;
|
||||
--surface: #282828;
|
||||
--surface-2: #32302f;
|
||||
--border: #45403d;
|
||||
--text: #ebdbb2;
|
||||
--muted: #bdae93;
|
||||
--faint: #7c6f64;
|
||||
--accent: #fe8019;
|
||||
--accent-text: #1d2021;
|
||||
--accent-soft: rgba(254, 128, 25, 0.14);
|
||||
--danger: #fb4934;
|
||||
--success: #b8bb26;
|
||||
--warn: #fabd2f;
|
||||
}
|
||||
|
||||
[data-theme="forest"] {
|
||||
color-scheme: dark;
|
||||
--bg: #0f1612;
|
||||
--surface: #151f19;
|
||||
--surface-2: #1c2921;
|
||||
--border: #29392f;
|
||||
--text: #e4efe7;
|
||||
--muted: #9fb5a6;
|
||||
--faint: #62786a;
|
||||
--accent: #7fd49b;
|
||||
--accent-text: #0f1612;
|
||||
--accent-soft: rgba(127, 212, 155, 0.13);
|
||||
}
|
||||
|
||||
[data-theme="synthwave"] {
|
||||
color-scheme: dark;
|
||||
--bg: #140b24;
|
||||
--surface: #1d1133;
|
||||
--surface-2: #281846;
|
||||
--border: #3b2663;
|
||||
--text: #f4eaff;
|
||||
--muted: #bca8dc;
|
||||
--faint: #7a649e;
|
||||
--accent: #ff4fd8;
|
||||
--accent-text: #140b24;
|
||||
--accent-soft: rgba(255, 79, 216, 0.15);
|
||||
--warn: #ffd166;
|
||||
--success: #36f1cd;
|
||||
--shadow: 0 10px 40px rgba(255, 79, 216, 0.12);
|
||||
}
|
||||
|
||||
[data-theme="daylight"] {
|
||||
color-scheme: light;
|
||||
--bg: #f6f7f9;
|
||||
--surface: #ffffff;
|
||||
--surface-2: #eef0f4;
|
||||
--border: #e0e3ea;
|
||||
--text: #15171c;
|
||||
--muted: #5d6475;
|
||||
--faint: #9299a8;
|
||||
--accent: #5b4ef0;
|
||||
--accent-text: #ffffff;
|
||||
--accent-soft: rgba(91, 78, 240, 0.1);
|
||||
--danger: #d93a4b;
|
||||
--success: #17915f;
|
||||
--warn: #b7791f;
|
||||
--gold: #d69e1a;
|
||||
--silver: #8f98a8;
|
||||
--bronze: #b8734a;
|
||||
--shadow: 0 10px 30px rgba(20, 24, 40, 0.1);
|
||||
}
|
||||
|
||||
[data-theme="paper"] {
|
||||
color-scheme: light;
|
||||
--bg: #f4efe6;
|
||||
--surface: #fbf8f2;
|
||||
--surface-2: #ece5d8;
|
||||
--border: #ddd3c2;
|
||||
--text: #2b2520;
|
||||
--muted: #6e6457;
|
||||
--faint: #a2978a;
|
||||
--accent: #b5452f;
|
||||
--accent-text: #fbf8f2;
|
||||
--accent-soft: rgba(181, 69, 47, 0.1);
|
||||
--danger: #b5452f;
|
||||
--success: #3f7d4f;
|
||||
--warn: #a8741a;
|
||||
--gold: #b88a1b;
|
||||
--silver: #8a8a8a;
|
||||
--bronze: #a0623b;
|
||||
--shadow: 0 10px 30px rgba(60, 40, 20, 0.1);
|
||||
--font-display: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, ui-serif, serif;
|
||||
--radius: 4px;
|
||||
--radius-art: 3px;
|
||||
}
|
||||
|
||||
[data-theme="latte"] {
|
||||
color-scheme: light;
|
||||
--bg: #eff1f5;
|
||||
--surface: #ffffff;
|
||||
--surface-2: #e6e9ef;
|
||||
--border: #ccd0da;
|
||||
--text: #4c4f69;
|
||||
--muted: #6c6f85;
|
||||
--faint: #9ca0b0;
|
||||
--accent: #8839ef;
|
||||
--accent-text: #ffffff;
|
||||
--accent-soft: rgba(136, 57, 239, 0.1);
|
||||
--danger: #d20f39;
|
||||
--success: #40a02b;
|
||||
--warn: #df8e1d;
|
||||
--gold: #df8e1d;
|
||||
--silver: #8c8fa1;
|
||||
--bronze: #c06d3a;
|
||||
--shadow: 0 10px 30px rgba(76, 79, 105, 0.12);
|
||||
}
|
||||
Reference in new issue
Block a user