Files
oscars-pool/public/css/app.css
T
Mathieu Moran 4308d6babf Implement en/fr localization across admin and user UIs
Introduce client-side localization helper and en/fr locale bundles.

Route admin control, picks, movies, stats, winners and settings UIs through i18n keys instead of hardcoded text.

Remove French text from the English UI and standardize shared messages (saving, network errors, confirmations).

Update .gitignore to ignore editor metadata and localization helper artifacts.
2026-02-01 20:20:02 -05:00

1425 lines
33 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
footer {
margin-top: auto;
padding: 20px 25px;
/* Light mode: keep the original light gray footer */
background-color: #f8f9fa;
color: var(--app-text);
text-align: center;
width: min(100%, calc(1320px - 24px));
margin-left: auto;
margin-right: auto;
}
#footer-text {
margin: 6px 0 0;
font-family:monospace;
font-size: small;
}
#footer-copy {
margin: 0;
font-family:monospace;
font-size: smaller;
padding-top: 0;
}
#copy {
text-decoration: none;
}
#copy::after {
content: " 🐴";
}
/* Simple, clean loading indicator (no spinner spam) */
.loading-indicator {
display: flex;
justify-content: center;
align-items: center;
gap: 0.35rem;
padding: 2rem 0;
}
.loading-dots {
display: inline-flex;
gap: 0.15rem;
}
.loading-dots span {
display: inline-block;
opacity: 0.2;
transform: translateY(-1px);
animation: loading-dot 1.1s infinite ease-in-out;
}
.loading-dots span:nth-child(2) { animation-delay: 0.15s; }
.loading-dots span:nth-child(3) { animation-delay: 0.30s; }
@keyframes loading-dot {
0%, 80%, 100% { opacity: 0.2; }
40% { opacity: 1; }
}
/* Full-page loader overlay (blur + progress bar) */
body.page-loading {
overflow: hidden;
}
.page-loader-overlay {
position: fixed;
top: var(--page-loader-top, 0px);
left: 0;
right: 0;
bottom: 0;
z-index: 2000;
display: flex;
align-items: center;
justify-content: center;
padding: 24px;
background: rgba(255, 255, 255, 0.55);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
transition: opacity 200ms ease;
opacity: 1;
}
/* Avoid initial navbar "blur flash" before JS computes the exact height. */
body.page-loading .page-loader-overlay {
top: var(--page-loader-top, 72px);
}
/* Reserve space for username so it doesn't "pop" the layout. */
#user-name {
display: inline-block;
min-width: 8ch;
white-space: nowrap;
}
/*
Reserve space for the Admin button even when hidden.
This prevents a visible re-layout when we discover admin status from the token.
*/
@media (min-width: 992px) {
nav.navbar #admin-control-link.d-none {
display: inline-block !important;
visibility: hidden !important;
pointer-events: none;
}
}
.page-loader-overlay.page-loader-hide {
opacity: 0;
pointer-events: none;
}
.page-loader-card {
width: min(520px, 92vw);
background: rgba(255, 255, 255, 0.9);
border: 1px solid rgba(0, 0, 0, 0.08);
border-radius: 16px;
padding: 18px 18px 14px;
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.12);
}
.page-loader-card.page-loader-card--baronly {
width: min(420px, 90vw);
padding: 14px;
}
.page-loader-title {
margin: 0 0 10px 0;
font-weight: 700;
font-size: 1rem;
color: #111;
}
.page-loader-subtitle {
margin: 0 0 12px 0;
font-size: 0.9rem;
color: rgba(0, 0, 0, 0.7);
}
.page-loader-progress {
height: 10px;
border-radius: 999px;
overflow: hidden;
background: rgba(0, 0, 0, 0.08);
}
.page-loader-bar {
height: 100%;
width: 0%;
border-radius: 999px;
background: #111;
transition: width 220ms ease;
}
.page-loader-actions {
margin-top: 12px;
display: flex;
justify-content: flex-end;
gap: 10px;
}
/* Admin → Version: keep history rows clean and readable */
.app-version-list .list-group-item {
border-left: 0;
border-right: 0;
}
.app-version-list .list-group-item:first-child {
border-top: 0;
}
.app-version-list .list-group-item:last-child {
border-bottom: 0;
}
/* Admin: compact "sub tabs" used inside panels */
.admin-subtabs {
gap: 0.5rem;
}
.admin-subtabs .nav-item {
margin: 0;
}
.admin-subtabs.nav-pills .nav-link {
border: 1px solid rgba(0, 0, 0, 0.12);
background: #fff;
color: #111;
font-weight: 600;
padding: 0.45rem 0.8rem;
border-radius: 10px;
}
.admin-subtabs.nav-pills .nav-link:hover {
background: rgba(0, 0, 0, 0.03);
}
.admin-subtabs.nav-pills .nav-link.active {
background: #111;
border-color: #111;
color: #fff;
}
/* Admin → Version preview: keep it compact */
.app-version-preview {
white-space: pre-wrap;
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 0.92rem;
}
/* Movies page helpers (Bootstrap-first, minimal custom) */
.movie-poster {
width: 100%;
max-height: 360px;
object-fit: contain;
}
.movie-rating-block {
display: flex;
flex-direction: column;
align-items: flex-start;
text-align: left;
gap: 2px;
font-size: 0.72rem;
line-height: 1.15;
color: rgba(0,0,0,0.6);
}
/* (reserved) */
.movie-imdb-block {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 0.75rem;
line-height: 1.1;
color: rgba(0,0,0,0.7);
white-space: nowrap;
}
.movie-rating-sub {
font-size: 0.7rem;
color: rgba(0,0,0,0.55);
}
.movie-rating-avg {
display: block;
min-height: 0.9rem;
margin-bottom: 5px;
}
.movie-rating-sub--empty {
visibility: hidden;
}
.movie-rating-block .imdb-icon {
height: 18px;
padding: 0 5px;
margin-left: 4px;
font-size: 10px;
}
.movie-imdb-wrap {
display: flex;
flex-direction: column;
align-items: flex-end;
gap: 4px;
}
.movie-imdb-wrap .movie-rating-stars {
margin-top: 1px;
}
.movie-rating-stars {
display: inline-flex;
align-items: center;
justify-content: flex-end;
gap: 2px;
}
.movie-star {
border: 0;
background: transparent;
color: rgba(0, 0, 0, 0.5);
font-size: 0.9rem;
line-height: 1;
padding: 0 1px;
}
.movie-star.is-active {
color: #f4b400;
}
.movie-info-box {
margin-top: 6px;
margin-bottom: 10px;
padding: 2px 10px 8px;
border-radius: 10px;
background: rgba(0, 0, 0, 0.03);
border: 1px solid rgba(0, 0, 0, 0.06);
}
.movie-info-categories {
margin: 0 0 2px 0;
}
.movie-info-summary {
display: inline-flex;
align-items: center;
gap: 6px;
cursor: pointer;
user-select: none;
list-style: none;
color: rgba(0, 0, 0, 0.65);
font-size: 0.78rem;
font-weight: 600;
}
.movie-info-summary::-webkit-details-marker {
display: none;
}
.movie-info-summary-arrow {
display: inline-block;
transition: transform 120ms ease;
}
.movie-info-categories[open] .movie-info-summary-arrow {
transform: rotate(180deg);
}
.movie-info-category {
font-size: 0.78rem;
color: rgba(0, 0, 0, 0.65);
font-weight: 600;
margin-bottom: 6px;
margin-top: 6px;
}
.movie-info-desc {
margin: 0;
font-size: 0.82rem;
line-height: 1.35;
color: rgba(0, 0, 0, 0.75);
}
.imdb-icon {
height: 18px;
padding: 0 6px;
vertical-align: middle;
margin-left: 6px;
display: inline-flex;
align-items: center;
justify-content: center;
background: #f5c518;
color: #111;
border-radius: 4px;
font-family: "Arial Black", Arial, sans-serif;
font-size: 11px;
font-weight: 900;
letter-spacing: -0.4px;
line-height: 1;
text-transform: none;
white-space: nowrap;
}
.watched-badge {
z-index: 2;
}
.cam-badge {
z-index: 2;
}
/* Stats → "Films regardés" modal */
.stats-movies-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 12px;
}
.stats-movie-item {
display: flex;
gap: 12px;
padding: 12px;
background: #fff;
border: 1px solid rgba(0, 0, 0, 0.08);
border-radius: 14px;
}
.stats-movie-item--clickable {
cursor: pointer;
}
.stats-movie-item--clickable:hover {
background: rgba(0, 0, 0, 0.02);
border-color: rgba(0, 0, 0, 0.14);
}
/* Smooth navbar transition while i18n loads
- Keep navbar visible but subtly blurred/faded to avoid abrupt disappearance.
- Make elements non-interactive until translations are applied. */
body:not(.i18n-ready) nav.navbar,
body:not(.i18n-ready) .navbar,
body:not(.i18n-ready) .navbar .navbar-brand,
body:not(.i18n-ready) .navbar .nav-link,
body:not(.i18n-ready) .navbar .navbar-text,
body:not(.i18n-ready) .navbar .btn {
transition: filter 220ms ease, opacity 220ms ease, transform 220ms ease;
filter: blur(6px) saturate(0.9) grayscale(0.06);
opacity: 0.85;
transform: translateY(-2px);
pointer-events: none;
}
/* When translations are ready, restore full clarity and interactivity */
body.i18n-ready nav.navbar,
body.i18n-ready .navbar,
body.i18n-ready .navbar .navbar-brand,
body.i18n-ready .navbar .nav-link,
body.i18n-ready .navbar .navbar-text,
body.i18n-ready .navbar .btn {
filter: none;
opacity: 1;
transform: translateY(0);
pointer-events: auto;
}
.stats-movie-poster {
width: 56px;
height: 84px;
border-radius: 10px;
object-fit: cover;
background: rgba(0, 0, 0, 0.06);
flex: 0 0 auto;
}
.stats-movie-poster.stats-movie-poster--empty {
background: linear-gradient(135deg, rgba(0,0,0,0.08), rgba(0,0,0,0.03));
}
.stats-movie-title {
font-weight: 700;
line-height: 1.2;
margin: 0;
}
.stats-movie-meta {
margin-top: 6px;
display: flex;
flex-wrap: wrap;
gap: 6px 10px;
align-items: center;
font-size: 0.875rem;
}
.stats-movie-details {
margin-top: 6px;
}
.stats-movie-details summary {
cursor: pointer;
user-select: none;
font-size: 0.85rem;
color: rgba(0, 0, 0, 0.6);
list-style: none;
}
.stats-movie-details summary::-webkit-details-marker {
display: none;
}
.stats-movie-details summary::before {
content: "›";
display: inline-block;
margin-right: 6px;
transform: rotate(0deg);
transition: transform 120ms ease;
}
.stats-movie-details[open] summary::before {
transform: rotate(90deg);
}
.stats-movie-details-body {
margin-top: 6px;
padding-left: 14px;
line-height: 1.25rem;
overflow-wrap: anywhere;
}
.stats-movie-imdb {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 0.2rem 0.45rem;
line-height: 1.1;
}
.stats-movie-imdb.btn {
border: 0;
background: transparent;
padding: 0;
box-shadow: none;
}
.stats-movie-imdb.btn:hover,
.stats-movie-imdb.btn:focus {
border: 0;
background: transparent;
box-shadow: none;
}
.stats-movie-imdb .imdb-icon {
height: 18px;
padding: 0 5px;
margin-left: 0;
font-size: 10px;
}
/* Admin → Settings: keep controls compact */
.admin-settings-narrow {
max-width: 520px;
}
@media (max-width: 576px) {
.admin-settings-narrow {
max-width: 100%;
}
}
:root {
--app-bg: #f5f6fb;
--app-surface: #ffffff;
--app-surface-alt: #f1f3f9;
--app-text: #111827;
--app-text-muted: rgba(17, 24, 39, 0.6);
--app-border: rgba(15, 23, 42, 0.12);
--app-ring: rgba(37, 99, 235, 0.35);
--app-shadow: 0 12px 30px rgba(15, 23, 42, 0.12);
--app-overlay: rgba(246, 247, 251, 0.7);
--app-loader-card: rgba(255, 255, 255, 0.9);
--app-navbar: #0a0b0d;
--app-navbar-border: rgba(255, 255, 255, 0.08);
--app-link: #1d4ed8;
--app-link-hover: #1e40af;
}
html[data-theme="dark"] {
color-scheme: dark;
/* Darker overall background + slightly deeper surfaces */
--app-bg: #05070b;
--app-surface: #0b1017;
--app-surface-alt: #101825;
--app-text: #e6e9f0;
--app-text-muted: rgba(230, 233, 240, 0.7);
--app-border: rgba(255, 255, 255, 0.11);
--app-ring: rgba(96, 165, 250, 0.45);
--app-shadow: 0 18px 38px rgba(0, 0, 0, 0.45);
--app-overlay: rgba(4, 6, 10, 0.78);
--app-loader-card: rgba(18, 22, 33, 0.9);
--app-navbar: #0b0d12;
--app-navbar-border: rgba(255, 255, 255, 0.1);
--app-link: #8ab4ff;
--app-link-hover: #b1ccff;
}
body {
background: var(--app-bg);
color: var(--app-text);
min-height: 100vh;
display: flex;
flex-direction: column;
}
body > .container {
flex: 1 0 auto;
}
body > footer {
margin-top: auto;
}
a {
color: var(--app-link);
}
a:hover {
color: var(--app-link-hover);
}
/* Tabs (light mode): keep it neutral (no bright blue) */
.nav-tabs .nav-link {
color: rgba(17, 24, 39, 0.72);
font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
font-size: 0.9rem;
font-weight: 500;
letter-spacing: 0.1px;
padding: 0.45rem 0.8rem;
}
.nav-tabs .nav-link:hover {
color: rgba(17, 24, 39, 0.9);
}
.nav-tabs .nav-link.active {
color: #111827;
}
/* Admin tabs: visually connect tabs with their content */
#adminTabs {
border-bottom: 0;
gap: 0.35rem;
padding-bottom: 0;
}
#adminTabs .nav-link {
background-color: var(--app-surface);
border: 1px solid var(--app-border);
}
#adminTabs .nav-link:hover {
background-color: var(--app-surface);
}
#adminTabs .nav-link.active {
background-color: var(--app-surface);
border-color: var(--app-border);
border-bottom-color: transparent;
position: relative;
top: 1px;
z-index: 2;
}
#adminTabs .nav-link.active::after {
content: "";
position: absolute;
left: 1px;
right: 1px;
bottom: -3px;
height: 3px;
background: var(--app-surface);
}
#adminTabs .nav-link:not(.active) {
border-color: var(--app-border);
}
#adminTabs + .admin-tabs-content {
background-color: transparent;
border: 0;
border-radius: 0;
padding: 0;
margin-top: -1px;
padding-top: 0 !important;
border-top: 1px solid var(--app-border);
}
/* Hide top border under the active admin tab */
#adminTabs + .admin-tabs-content > .tab-pane.active {
position: relative;
}
#adminTabs + .admin-tabs-content > .tab-pane.active::before {
content: "";
position: absolute;
top: 0;
left: 0;
height: 2px;
width: calc(100% + 2px);
margin-left: -1px;
background: var(--app-surface);
pointer-events: none;
}
#adminTabs + .admin-tabs-content > .tab-pane.fade::before {
background: transparent;
}
#adminTabs + .admin-tabs-content .tab-pane .card:first-of-type {
border-top-color: transparent;
}
body.bg-light {
background-color: var(--app-bg) !important;
}
.bg-light {
background-color: var(--app-surface-alt) !important;
}
.text-dark {
color: var(--app-text) !important;
}
.text-muted {
color: var(--app-text-muted) !important;
}
html[data-theme="dark"] .logo-invert {
filter: invert(1) brightness(1.05);
}
/* Dark mode: footer matches tiles/cards */
html[data-theme="dark"] footer {
background-color: var(--app-surface);
color: var(--app-text);
}
footer.footer--plain {
background-color: transparent;
border: 0;
box-shadow: none;
}
footer.footer--player {
width: min(100%, calc(1100px - 24px));
}
footer.footer--auth {
width: min(100%, 400px);
}
.card,
.modal-content,
.list-group-item,
.dropdown-menu {
background-color: var(--app-surface);
color: var(--app-text);
border-color: var(--app-border);
box-shadow: var(--app-shadow);
}
.modal-header,
.modal-footer {
border-color: var(--app-border);
}
/* Bootstrap modal close (X) visibility in dark mode */
html[data-theme="dark"] .modal-header .btn-close {
filter: invert(1) grayscale(100%);
opacity: 0.85;
}
html[data-theme="dark"] .modal-header .btn-close:hover {
opacity: 1;
}
html[data-theme="dark"] .modal-header .btn-close:focus {
box-shadow: 0 0 0 0.2rem rgba(96, 165, 250, 0.25);
}
.table {
--bs-table-color: var(--app-text);
--bs-table-bg: transparent;
--bs-table-striped-bg: rgba(15, 23, 42, 0.05);
--bs-table-hover-bg: rgba(15, 23, 42, 0.08);
--bs-table-border-color: var(--app-border);
}
html[data-theme="dark"] .table {
--bs-table-striped-bg: rgba(255, 255, 255, 0.04);
--bs-table-hover-bg: rgba(255, 255, 255, 0.06);
}
html[data-theme="dark"] .progress {
background-color: rgba(255, 255, 255, 0.10);
}
html[data-theme="dark"] .progress-bar {
background-color: #60a5fa;
}
.page-loader-overlay {
background: var(--app-overlay);
}
.page-loader-card {
background: var(--app-loader-card);
border-color: var(--app-border);
box-shadow: var(--app-shadow);
}
.page-loader-title,
.page-loader-subtitle {
color: var(--app-text);
}
.page-loader-progress {
background: rgba(0, 0, 0, 0.08);
}
html[data-theme="dark"] .page-loader-progress {
background: rgba(255, 255, 255, 0.1);
}
.page-loader-bar {
background: var(--app-text);
}
.navbar-custom {
background-color: var(--app-navbar);
border-bottom: 1px solid var(--app-navbar-border);
}
/* Navbar: show current page state */
.navbar-custom .navbar-nav .nav-link.btn.is-current {
background: rgba(255, 255, 255, 0.16);
border-color: rgba(255, 255, 255, 0.55);
color: #fff;
}
.navbar-custom .navbar-nav .nav-link.btn.is-current:hover {
background: rgba(255, 255, 255, 0.22);
border-color: rgba(255, 255, 255, 0.65);
color: #fff;
}
html[data-theme="dark"] .navbar-custom .navbar-nav .nav-link.btn.is-current {
background: rgba(79, 124, 255, 0.22);
border-color: rgba(79, 124, 255, 0.58);
color: #fff;
}
html[data-theme="dark"] .navbar-custom .navbar-nav .nav-link.btn.is-current:hover {
background: rgba(79, 124, 255, 0.28);
border-color: rgba(79, 124, 255, 0.7);
}
/* The logo image has a bit of built-in left whitespace; nudge it back to align with page titles. */
.navbar-custom .navbar-brand img {
margin-left: -9px;
}
/* Mobile navbar: add vertical gaps + clean user row */
@media (max-width: 991.98px) {
.navbar-custom .navbar-nav {
gap: 0.5rem;
}
.navbar-custom .navbar-nav .nav-link.btn {
width: 100%;
text-align: center;
margin-right: 0 !important; /* overrides me-2 on mobile */
}
.navbar-custom .navbar-user {
width: 100%;
margin-top: 0.85rem !important;
padding-top: 0.85rem;
/* Mobile divider between nav buttons and user row */
border-top: 1px solid rgba(255, 255, 255, 0.18);
}
.navbar-custom .navbar-user-name-mobile {
display: none;
}
.navbar-custom .navbar-user {
display: grid !important;
grid-template-columns: auto 1fr auto;
grid-template-areas: "toggle name logout";
align-items: center;
align-content: center;
justify-content: stretch;
justify-items: stretch;
column-gap: 0.5rem;
}
.navbar-custom .navbar-user #user-name {
display: inline-flex;
min-width: 0;
width: 100%;
max-width: 45vw;
font-size: clamp(0.75rem, 3.2vw, 0.95rem);
text-align: center;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
justify-self: stretch;
grid-area: name;
}
.navbar-custom .navbar-user .theme-toggle {
margin-right: 0 !important;
justify-self: start;
grid-area: toggle;
}
.navbar-custom .navbar-user #log-off {
justify-self: end;
grid-area: logout;
}
}
html[data-theme="dark"] .navbar-custom .btn-outline-light {
color: rgba(255, 255, 255, 0.9);
border-color: rgba(255, 255, 255, 0.25);
}
html[data-theme="dark"] .navbar-custom .btn-outline-light:hover {
background: rgba(255, 255, 255, 0.12);
}
html[data-theme="dark"] .btn-outline-dark {
color: var(--app-text);
border-color: var(--app-border);
}
html[data-theme="dark"] .btn-outline-dark:hover {
background: rgba(255, 255, 255, 0.08);
}
html[data-theme="dark"] .badge.bg-warning.text-dark {
color: #1f2937 !important;
}
/* Use a consistent "admin" blue instead of Bootstrap warning yellow. */
.btn-warning {
background-color: #1d4ed8;
border-color: #1d4ed8;
color: #fff;
}
.btn-warning:hover {
background-color: #1e40af;
border-color: #1e40af;
color: #fff;
}
.btn-warning:focus,
.btn-warning:focus-visible {
box-shadow: 0 0 0 0.2rem rgba(29, 78, 216, 0.35);
outline: none;
}
.btn-warning:active,
.btn-warning.active,
.btn-warning:active:focus {
background-color: #1e40af;
border-color: #1e40af;
color: #fff;
box-shadow: none;
outline: none;
}
.btn-warning:focus:not(:focus-visible) {
box-shadow: none;
outline: none;
}
html[data-theme="dark"] .badge.bg-light {
background-color: var(--app-surface-alt) !important;
color: var(--app-text) !important;
}
html[data-theme="dark"] .badge.bg-dark {
background-color: #0f172a !important;
}
.movie-info-box {
background: var(--app-surface-alt);
border-color: var(--app-border);
}
.movie-rating-block,
.movie-imdb-block,
.movie-rating-sub,
.movie-info-summary,
.movie-info-category,
.movie-info-desc,
.stats-movie-details summary {
color: var(--app-text-muted);
}
html[data-theme="dark"] .movie-star {
color: rgba(255, 255, 255, 0.55);
}
html[data-theme="dark"] .movie-star.is-active {
color: #f4b400;
}
html[data-theme="dark"] .stats-movie-item {
background: var(--app-surface);
border-color: var(--app-border);
}
html[data-theme="dark"] .stats-movie-item--clickable:hover {
background: rgba(255, 255, 255, 0.04);
}
html[data-theme="dark"] .admin-subtabs.nav-pills .nav-link {
background: var(--app-surface);
border-color: var(--app-border);
color: var(--app-text);
}
html[data-theme="dark"] .admin-subtabs.nav-pills .nav-link:hover {
background: rgba(255, 255, 255, 0.06);
}
html[data-theme="dark"] .admin-subtabs.nav-pills .nav-link.active {
background: #4f7cff;
border-color: #4f7cff;
color: #fff;
}
html[data-theme="dark"] .nominee-option:hover {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.45);
}
html[data-theme="dark"] .nominee-option.selected {
box-shadow: 0 2px 8px rgba(79, 124, 255, 0.35);
}
html[data-theme="dark"] .nominee-checkmark {
background-color: rgba(255, 255, 255, 0.18);
color: #cfe1ff;
}
html[data-theme="dark"] .nominee-option.selected .nominee-checkmark {
background-color: rgba(255, 255, 255, 0.9);
color: #1d4ed8;
}
html[data-theme="dark"] .picks-table tbody tr:hover {
background-color: rgba(99, 102, 241, 0.12);
}
html[data-theme="dark"] .picks-table tbody tr.has-selection {
background-color: rgba(99, 102, 241, 0.18);
border-left-color: #6ea8fe;
}
html[data-theme="dark"] .pick-item {
border-bottom-color: rgba(255, 255, 255, 0.12);
}
html[data-theme="dark"] .correct-pick {
background-color: rgba(16, 185, 129, 0.18);
}
html[data-theme="dark"] .incorrect-pick {
background-color: rgba(248, 113, 113, 0.18);
}
html[data-theme="dark"] .meta-muted {
color: var(--app-text-muted);
}
html[data-theme="dark"] .player-surface {
border-color: rgba(255, 255, 255, 0.12);
}
html[data-theme="dark"] .quality-toggle {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.18);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
}
html[data-theme="dark"] .quality-label {
color: var(--app-text-muted);
}
html[data-theme="dark"] .quality-pill {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.15);
}
html[data-theme="dark"] .quality-btn {
color: rgba(255, 255, 255, 0.7);
}
html[data-theme="dark"] .quality-btn.is-active {
background: #f8fafc;
color: #0f172a;
}
html[data-theme="dark"] .movie-table thead th,
html[data-theme="dark"] .user-table thead th {
color: rgba(255, 255, 255, 0.85);
}
html[data-theme="dark"] .user-table tbody td:first-child,
html[data-theme="dark"] .user-table tbody td:nth-child(3) {
color: rgba(255, 255, 255, 0.82);
}
html[data-theme="dark"] .stats-tabs .nav-link {
color: rgba(255, 255, 255, 0.7);
border-color: transparent;
}
html[data-theme="dark"] .stats-tabs .nav-link:hover {
color: #fff;
background: rgba(255, 255, 255, 0.06);
}
html[data-theme="dark"] .stats-tabs .nav-link.active {
color: #fff;
background: rgba(79, 124, 255, 0.18);
border-color: rgba(79, 124, 255, 0.4);
}
.user-table,
#pane-winners .table,
#pane-completion .table {
font-size: 1rem;
font-family: inherit;
}
html[data-theme="dark"] #pane-winners .table,
html[data-theme="dark"] #pane-completion .table {
color: var(--app-text);
}
html[data-theme="dark"] #pane-winners .table thead th,
html[data-theme="dark"] #pane-winners .table tbody td,
html[data-theme="dark"] #pane-completion .table thead th,
html[data-theme="dark"] #pane-completion .table tbody td {
color: rgba(255, 255, 255, 0.88);
}
html[data-theme="dark"] .user-table a {
color: #b9e3ff;
}
html[data-theme="dark"] .user-table a:hover {
color: #d7efff;
}
html[data-theme="dark"] #picksTabs .nav-link {
color: rgba(255, 255, 255, 0.7);
border-color: transparent;
}
html[data-theme="dark"] #picksTabs .nav-link:hover {
color: #fff;
background: rgba(255, 255, 255, 0.06);
}
html[data-theme="dark"] #picksTabs .nav-link.active {
color: #fff;
background: rgba(79, 124, 255, 0.18);
border-color: rgba(79, 124, 255, 0.4);
}
html[data-theme="dark"] #picksTabsContent .table {
--bs-table-color: var(--app-text);
--bs-table-striped-color: var(--app-text);
}
html[data-theme="dark"] #picksTabsContent .table thead th {
background-color: var(--app-surface-alt);
color: var(--app-text);
border-color: var(--app-border);
}
html[data-theme="dark"] #picksTabsContent .table tbody td {
color: rgba(230, 235, 245, 0.92);
}
html[data-theme="dark"] #picksTabsContent .table .table-success {
--bs-table-bg: rgba(96, 165, 250, 0.14);
--bs-table-striped-bg: rgba(96, 165, 250, 0.1);
--bs-table-hover-bg: rgba(96, 165, 250, 0.18);
color: rgba(230, 235, 245, 0.92);
}
html[data-theme="dark"] .bg-white {
background-color: var(--app-surface) !important;
color: var(--app-text);
}
html[data-theme="dark"] .border {
border-color: var(--app-border) !important;
}
html[data-theme="dark"] #adminTabs,
html[data-theme="dark"] #editMovieTabs {
border-bottom-color: var(--app-border);
}
html[data-theme="dark"] #adminTabs .nav-link,
html[data-theme="dark"] #editMovieTabs .nav-link {
color: rgba(255, 255, 255, 0.7);
border-color: transparent;
}
html[data-theme="dark"] #adminTabs .nav-link:hover,
html[data-theme="dark"] #editMovieTabs .nav-link:hover {
color: #fff;
background: rgba(255, 255, 255, 0.06);
}
html[data-theme="dark"] #adminTabs .nav-link.active,
html[data-theme="dark"] #editMovieTabs .nav-link.active {
color: #fff;
background: rgba(79, 124, 255, 0.18);
border-color: rgba(79, 124, 255, 0.4);
border-bottom-color: transparent;
}
html[data-theme="dark"] #adminTabs .nav-link:not(.active) {
border-color: var(--app-border);
}
html[data-theme="dark"] #adminTabs .nav-link.active::after,
html[data-theme="dark"] #editMovieTabs .nav-link.active::after {
background: var(--app-surface);
bottom: -3px;
height: 3px;
}
html[data-theme="dark"] #adminTabsContent .table,
html[data-theme="dark"] #adminTabs + .tab-content .table {
--bs-table-color: var(--app-text);
--bs-table-striped-color: var(--app-text);
}
html[data-theme="dark"] #adminTabsContent .table thead th,
html[data-theme="dark"] #adminTabs + .tab-content .table thead th {
background-color: var(--app-surface-alt);
color: var(--app-text);
border-color: var(--app-border);
}
html[data-theme="dark"] #adminTabsContent .table tbody td,
html[data-theme="dark"] #adminTabs + .tab-content .table tbody td {
color: rgba(230, 235, 245, 0.92);
}
html[data-theme="dark"] #adminTabsContent .table .text-muted,
html[data-theme="dark"] #adminTabs + .tab-content .table .text-muted {
color: rgba(230, 235, 245, 0.65) !important;
}
html[data-theme="dark"] #adminTabsContent .table a,
html[data-theme="dark"] #adminTabsContent .table .btn-link,
html[data-theme="dark"] #adminTabs + .tab-content .table a,
html[data-theme="dark"] #adminTabs + .tab-content .table .btn-link {
color: rgba(230, 235, 245, 0.92);
}
html[data-theme="dark"] #adminTabsContent .admin-movies-table td,
html[data-theme="dark"] #adminTabsContent .admin-movies-table th,
html[data-theme="dark"] #adminTabsContent .admin-movies-table .text-muted,
html[data-theme="dark"] #adminTabs + .tab-content .admin-movies-table td,
html[data-theme="dark"] #adminTabs + .tab-content .admin-movies-table th,
html[data-theme="dark"] #adminTabs + .tab-content .admin-movies-table .text-muted {
color: rgba(230, 235, 245, 0.92) !important;
}
html[data-theme="dark"] #picksTabsContent .btn-outline-primary {
color: rgba(226, 232, 240, 0.95);
border-color: rgba(148, 163, 184, 0.6);
background: rgba(15, 23, 42, 0.2);
}
html[data-theme="dark"] #picksTabsContent .btn-outline-primary:hover {
color: #fff;
border-color: rgba(148, 163, 184, 0.85);
background: rgba(148, 163, 184, 0.18);
}
html[data-theme="dark"] .movie-table .table-success {
--bs-table-bg: rgba(96, 165, 250, 0.14);
--bs-table-striped-bg: rgba(96, 165, 250, 0.1);
--bs-table-hover-bg: rgba(96, 165, 250, 0.18);
color: var(--app-text);
}
html[data-theme="dark"] .movie-table .table-success td {
border-color: rgba(96, 165, 250, 0.22);
}
html[data-theme="dark"] .movie-table .table-danger {
--bs-table-bg: rgba(148, 163, 184, 0.12);
--bs-table-striped-bg: rgba(148, 163, 184, 0.09);
--bs-table-hover-bg: rgba(148, 163, 184, 0.16);
color: var(--app-text);
}
html[data-theme="dark"] .movie-table .table-danger td {
border-color: rgba(148, 163, 184, 0.2);
}
html[data-theme="dark"] .movie-table {
--bs-table-color: var(--app-text);
--bs-table-striped-color: var(--app-text);
}
html[data-theme="dark"] .movie-table tbody td {
color: var(--app-text);
}
html[data-theme="dark"] .form-control,
html[data-theme="dark"] .form-select,
html[data-theme="dark"] .form-check-input {
background-color: var(--app-surface);
border-color: var(--app-border);
color: var(--app-text);
}
html[data-theme="dark"] .form-control::placeholder {
color: rgba(255, 255, 255, 0.5);
}
html[data-theme="dark"] .form-control:focus,
html[data-theme="dark"] .form-select:focus,
html[data-theme="dark"] .form-check-input:focus {
border-color: rgba(96, 165, 250, 0.6);
box-shadow: 0 0 0 0.2rem rgba(96, 165, 250, 0.25);
}
/* Dark mode: form-switch toggle visibility */
html[data-theme="dark"] .form-switch .form-check-input {
background-color: rgba(255, 255, 255, 0.15);
border-color: rgba(255, 255, 255, 0.25);
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.7%29'/%3e%3c/svg%3e");
}
html[data-theme="dark"] .form-switch .form-check-input:checked {
background-color: #0d6efd;
border-color: #0d6efd;
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");
}
/* Ensure form-check/form-switch has no background (inherits from parent container) */
.form-check,
.form-switch {
background: transparent;
}
.theme-toggle {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
width: 56px;
height: 30px;
border-radius: 999px;
border: 1px solid var(--app-border);
background: var(--app-surface-alt);
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.3);
transition: background 160ms ease, border-color 160ms ease, box-shadow 160ms ease;
}
/* Make spacing between toggle and logout feel equal to username→toggle */
nav.navbar .theme-toggle {
margin-right: 0.45rem;
}
.theme-toggle:focus-visible {
outline: none;
box-shadow: 0 0 0 3px var(--app-ring);
}
.theme-toggle-icon {
position: absolute;
width: 16px;
height: 16px;
color: var(--app-text-muted);
transition: color 160ms ease;
top: 50%;
transform: translateY(-50%);
display: flex;
align-items: center;
justify-content: center;
}
.theme-toggle-icon svg {
display: block;
}
.theme-toggle-icon-sun {
left: 8px;
}
.theme-toggle-icon-moon {
right: 8px;
}
.theme-toggle-thumb {
position: absolute;
width: 22px;
height: 22px;
border-radius: 50%;
background: var(--app-text);
transform: translateX(-12px);
transition: transform 180ms ease, background 160ms ease;
}
html[data-theme="dark"] .theme-toggle {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 255, 255, 0.2);
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.4);
}
html[data-theme="dark"] .theme-toggle-icon {
color: rgba(255, 255, 255, 0.65);
}
html[data-theme="dark"] .theme-toggle-thumb {
transform: translateX(12px);
background: #f8fafc;
}
.theme-toggle--floating {
position: fixed;
top: 16px;
right: 16px;
z-index: 1060;
}
@media (max-width: 576px) {
.theme-toggle--floating {
top: 12px;
right: 12px;
}
}