Files
oscars-pool/public/css/app.css
T

1489 lines
36 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 with a soft fade/slide 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;
/* Light mode & default: muted appearance while i18n loads. */
filter: blur(1.2px) saturate(0.95);
opacity: 0.45;
transform: translateY(-1px);
pointer-events: none;
}
/* Light mode: keep navbar container visible to avoid layout jump. */
html:not([data-theme="dark"]) body:not(.i18n-ready) nav.navbar,
html:not([data-theme="dark"]) body:not(.i18n-ready) .navbar {
opacity: 1;
transform: none;
}
/* Dark mode: keep the original soft blur effect while loading
so the navbar stays visible but its text is obscured. */
html[data-theme="dark"] body:not(.i18n-ready) nav.navbar,
html[data-theme="dark"] body:not(.i18n-ready) .navbar,
html[data-theme="dark"] body:not(.i18n-ready) .navbar .navbar-brand,
html[data-theme="dark"] body:not(.i18n-ready) .navbar .nav-link,
html[data-theme="dark"] body:not(.i18n-ready) .navbar .navbar-text,
html[data-theme="dark"] body:not(.i18n-ready) .navbar .btn {
filter: blur(6px) saturate(0.9) grayscale(0.06);
opacity: 0.85;
}
/* 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;
}
/* Override btn-warning for active state */
.navbar-custom .navbar-nav #admin-control-link.is-current {
background: rgba(255, 255, 255, 0.16) !important;
border-color: rgba(255, 255, 255, 0.55) !important;
}
.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;
}
/* Override btn-warning hover state */
.navbar-custom .navbar-nav #admin-control-link.is-current:hover {
background: rgba(255, 255, 255, 0.22) !important;
border-color: rgba(255, 255, 255, 0.65) !important;
}
/* Admin button current state in light mode - override btn-warning */
.navbar-custom .navbar-nav #admin-control-link.btn-warning.is-current,
.navbar-custom .navbar-nav #admin-control-link.btn-warning.is-current:focus {
background: rgba(255, 255, 255, 0.16) !important;
border-color: rgba(255, 255, 255, 0.55) !important;
}
.navbar-custom .navbar-nav #admin-control-link.btn-warning.is-current:hover,
.navbar-custom .navbar-nav #admin-control-link.btn-warning.is-current:active {
background: rgba(255, 255, 255, 0.22) !important;
border-color: rgba(255, 255, 255, 0.65) !important;
}
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;
}
/* Dark mode: Admin button active state */
html[data-theme="dark"] .navbar-custom .navbar-nav #admin-control-link.is-current {
background: rgba(79, 124, 255, 0.22) !important;
border-color: rgba(79, 124, 255, 0.58) !important;
}
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);
}
/* Admin button current state in dark mode */
html[data-theme="dark"] .navbar-custom .navbar-nav #admin-control-link.is-current {
background-color: #0d6efd;
border-color: #0d6efd;
color: #fff;
}
html[data-theme="dark"] .navbar-custom .navbar-nav #admin-control-link.is-current:hover {
background-color: #0b5ed7;
border-color: #0b5ed7;
color: #fff;
}
/* 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;
}
}