Files
loot-hunt/public/css/style.css
Mike Johnston 2006e3e4f0
All checks were successful
Build Images and Deploy / Update-PROD-Stack (push) Successful in 30s
home page dark mode issue
2026-02-28 17:36:02 -05:00

847 lines
16 KiB
CSS

:root {
--primary: #6c5ce7;
--primary-dark: #5a4bd1;
--accent: #fdcb6e;
--dark: #1a1a2e;
--darker: #16213e;
--light: #f8f9fa;
--success: #00b894;
--danger: #d63031;
--muted: #636e72;
--card-bg: #ffffff;
--body-bg: #f0f2f5;
--text: #2d3436;
--border: #dfe6e9;
--table-hover: rgba(108, 92, 231, 0.03);
--table-border: #eee;
}
[data-theme="dark"] {
--primary: #a29bfe;
--primary-dark: #6c5ce7;
--accent: #fdcb6e;
--dark: #0d1117;
--darker: #161b22;
--light: #c9d1d9;
--success: #2ecc71;
--danger: #e74c3c;
--muted: #8b949e;
--card-bg: #161b22;
--body-bg: #0d1117;
--text: #c9d1d9;
--border: #30363d;
--table-hover: rgba(162, 155, 254, 0.06);
--table-border: #21262d;
}
* {
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', system-ui, -apple-system, sans-serif;
background: var(--body-bg);
color: var(--text);
margin: 0;
min-height: 100vh;
display: flex;
flex-direction: column;
}
/* ─── Navigation ──────────────────────────────────────── */
.navbar {
background: var(--dark);
padding: 0 1.5rem;
display: flex;
align-items: center;
justify-content: space-between;
height: 60px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
position: sticky;
top: 0;
z-index: 100;
}
.navbar-brand {
color: var(--accent);
font-weight: 800;
font-size: 1.4rem;
text-decoration: none;
letter-spacing: -0.5px;
}
.navbar-brand:hover {
color: #fff;
}
/* Hamburger toggle — hidden on desktop */
.nav-toggle {
display: none;
background: none;
border: none;
cursor: pointer;
padding: 6px;
flex-direction: column;
gap: 5px;
}
/* Theme toggle */
.theme-toggle {
background: none;
border: none;
cursor: pointer;
font-size: 1.2rem;
padding: 6px;
line-height: 1;
border-radius: 6px;
transition: background 0.2s;
}
.theme-toggle:hover {
background: rgba(255, 255, 255, 0.1);
}
/* Desktop: hide mobile toggle, show nav toggle */
.mobile-theme-toggle {
display: none;
}
.nav-theme-item {
display: flex;
align-items: center;
}
.nav-toggle span {
display: block;
width: 24px;
height: 2px;
background: #b2bec3;
border-radius: 2px;
transition: all 0.25s;
}
.navbar-nav {
display: flex;
align-items: center;
gap: 0.25rem;
list-style: none;
margin: 0;
padding: 0;
}
.navbar-nav a {
color: #b2bec3;
text-decoration: none;
padding: 0.5rem 0.75rem;
border-radius: 6px;
font-size: 0.9rem;
transition: all 0.2s;
}
.navbar-nav a:hover,
.navbar-nav a.active {
color: #fff;
background: rgba(255, 255, 255, 0.1);
}
/* ─── Layout ──────────────────────────────────────────── */
.container {
max-width: 960px;
margin: 0 auto;
padding: 2rem 1.5rem;
flex: 1;
}
.container-narrow {
max-width: 520px;
margin: 0 auto;
padding: 2rem 1.5rem;
flex: 1;
}
/* ─── Cards ──────────────────────────────────────────── */
.card {
background: var(--card-bg);
border-radius: 12px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
padding: 1.5rem;
margin-bottom: 1rem;
}
.card-header {
font-size: 1.25rem;
font-weight: 700;
margin-bottom: 1rem;
padding-bottom: 0.75rem;
border-bottom: 2px solid var(--border);
}
/* ─── Buttons ─────────────────────────────────────────── */
.btn {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.6rem 1.25rem;
border-radius: 8px;
border: none;
font-size: 0.9rem;
font-weight: 600;
cursor: pointer;
text-decoration: none;
transition: all 0.2s;
}
.btn-primary {
background: var(--primary);
color: #fff;
}
.btn-primary:visited {
color: #fff;
}
.btn-primary:hover {
background: var(--primary-dark);
color: #fff;
}
.btn-success {
background: var(--success);
color: #fff;
}
.btn-success:visited {
color: #fff;
}
.btn-success:hover {
background: #00a381;
}
.btn-outline {
background: transparent;
border: 2px solid var(--primary);
color: var(--primary);
}
.btn-outline:visited {
color: var(--primary);
}
.btn-outline:hover {
background: var(--primary);
color: #fff;
}
.btn-danger {
background: var(--danger);
color: #fff;
}
.btn-sm {
padding: 0.4rem 0.8rem;
font-size: 0.8rem;
box-sizing: border-box;
line-height: 1.2;
}
/* ─── Forms ──────────────────────────────────────────── */
.form-group {
margin-bottom: 1rem;
}
.form-group label {
display: block;
font-weight: 600;
margin-bottom: 0.3rem;
font-size: 0.9rem;
color: var(--muted);
}
.form-control {
width: 100%;
padding: 0.6rem 0.8rem;
border: 2px solid var(--border);
border-radius: 8px;
font-size: 0.95rem;
transition: border-color 0.2s;
font-family: inherit;
background: var(--card-bg);
color: var(--text);
}
.form-control:focus {
outline: none;
border-color: var(--primary);
}
textarea.form-control {
resize: vertical;
min-height: 80px;
}
.form-hint {
font-size: 0.8rem;
color: var(--muted);
margin-top: 0.2rem;
}
/* ─── Alerts ──────────────────────────────────────────── */
.alert {
padding: 0.8rem 1rem;
border-radius: 8px;
margin-bottom: 1rem;
font-size: 0.9rem;
}
.alert-danger {
background: #ffeaa7;
border: 1px solid #fdcb6e;
color: #6c5ce7;
}
.alert-danger.error {
background: #fab1a0;
border: 1px solid #e17055;
color: #2d3436;
}
.alert-success {
background: #dfe6e9;
border: 1px solid var(--success);
color: #00b894;
}
.alert-info {
background: #dfe6e9;
border: 1px solid #74b9ff;
color: #0984e3;
}
/* ─── Points Badge ────────────────────────────────────── */
.points-badge {
display: inline-flex;
align-items: center;
gap: 0.25rem;
background: var(--accent);
color: var(--dark);
font-weight: 800;
padding: 0.4rem 0.8rem;
border-radius: 20px;
font-size: 1.1rem;
}
.points-badge.large {
font-size: 2rem;
padding: 0.5rem 1.5rem;
}
/* ─── Tables ──────────────────────────────────────────── */
.table-wrapper {
overflow-x: auto;
}
table {
width: 100%;
border-collapse: collapse;
}
th, td {
text-align: left;
padding: 0.65rem 0.75rem;
border-bottom: 1px solid var(--table-border);
}
th {
font-weight: 700;
font-size: 0.85rem;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--muted);
}
tr:hover {
background: var(--table-hover);
}
.rank-cell {
font-weight: 800;
font-size: 1.1rem;
color: var(--primary);
width: 50px;
}
.rank-1 { color: #f1c40f; }
.rank-2 { color: #95a5a6; }
.rank-3 { color: #e17055; }
/* ─── Package Grid ────────────────────────────────────── */
.package-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 1rem;
}
.package-card {
background: var(--card-bg);
border-radius: 10px;
padding: 1rem;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
border: 2px solid transparent;
transition: all 0.2s;
text-decoration: none;
color: inherit;
display: block;
}
.package-card:hover {
border-color: var(--primary);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(108, 92, 231, 0.15);
}
.package-card .card-num {
font-size: 1.5rem;
font-weight: 800;
color: var(--primary);
}
.package-card .code {
font-family: 'Courier New', monospace;
font-size: 1rem;
color: var(--muted);
letter-spacing: 1px;
}
.package-card .scan-info {
margin-top: 0.5rem;
font-size: 0.8rem;
color: var(--muted);
}
.package-card.scanned {
border-color: var(--success);
background: linear-gradient(135deg, #fff 0%, #f0fff4 100%);
}
.package-card.unscanned {
opacity: 0.7;
}
/* ─── Scan Result ─────────────────────────────────────── */
.scan-result {
text-align: center;
padding: 2rem 0;
}
.scan-result h1 {
font-size: 2rem;
margin-bottom: 0.5rem;
}
.scan-result .emoji {
font-size: 4rem;
margin-bottom: 1rem;
}
/* ─── Package Profile ─────────────────────────────────── */
.package-hero {
text-align: center;
padding: 2rem 0;
}
.package-hero .card-number {
font-size: 3rem;
font-weight: 800;
color: var(--primary);
}
.package-hero .hunt-name {
font-size: 1.2rem;
color: var(--muted);
}
.package-image {
max-width: 100%;
border-radius: 12px;
margin: 1rem 0;
}
/* ─── Stats Row ───────────────────────────────────────── */
.stats-row {
display: flex;
gap: 1rem;
flex-wrap: wrap;
margin: 1rem 0;
}
.stat-box {
flex: 1;
min-width: 120px;
background: var(--card-bg);
border-radius: 10px;
padding: 1rem;
text-align: center;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
}
.stat-box .value {
font-size: 1.8rem;
font-weight: 800;
color: var(--primary);
}
.stat-box .label {
font-size: 0.8rem;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.5px;
}
/* ─── Hero Section ────────────────────────────────────── */
.hero {
text-align: center;
padding: 3rem 1rem;
}
.hero h1 {
font-size: 2.5rem;
font-weight: 800;
color: var(--text);
margin-bottom: 0.5rem;
}
.hero p {
font-size: 1.1rem;
color: var(--muted);
max-width: 500px;
margin: 0 auto 1.5rem;
}
/* ─── Hunt Cards List ─────────────────────────────────── */
.hunt-card {
display: flex;
align-items: center;
justify-content: space-between;
background: var(--card-bg);
border-radius: 10px;
padding: 1rem 1.25rem;
margin-bottom: 0.75rem;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
text-decoration: none;
color: inherit;
transition: all 0.2s;
}
.hunt-card:hover {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.hunt-card .hunt-info h3 {
margin: 0 0 0.2rem;
font-size: 1.1rem;
}
.hunt-card .hunt-info .meta {
font-size: 0.8rem;
color: var(--muted);
}
.hunt-card .badge {
background: var(--primary);
color: #fff;
padding: 0.3rem 0.7rem;
border-radius: 15px;
font-size: 0.8rem;
font-weight: 600;
white-space: nowrap;
}
.hunt-card .badge.expired {
background: var(--danger);
}
/* ─── Dark Mode Refinements ───────────────────────────── */
[data-theme="dark"] .alert-danger {
background: #3d2e00;
border-color: #fdcb6e;
color: #fdcb6e;
}
[data-theme="dark"] .alert-danger.error {
background: #3d1515;
border-color: #e74c3c;
color: #fab1a0;
}
[data-theme="dark"] .alert-success {
background: #0d3320;
border-color: var(--success);
color: var(--success);
}
[data-theme="dark"] .alert-info {
background: #0d2137;
border-color: #74b9ff;
color: #74b9ff;
}
[data-theme="dark"] .package-card.scanned {
border-color: var(--success);
background: linear-gradient(135deg, var(--card-bg) 0%, #0d2618 100%);
}
[data-theme="dark"] a:not(.btn):not(.scanner-fab) {
color: var(--primary);
}
[data-theme="dark"] .hunt-card {
color: var(--text);
}
[data-theme="dark"] .points-badge {
color: var(--dark);
}
[data-theme="dark"] select.form-control {
background: var(--card-bg);
color: var(--text);
}
/* ─── Footer ──────────────────────────────────────────── */
.footer {
text-align: center;
padding: 1.5rem;
color: var(--muted);
font-size: 0.8rem;
border-top: 1px solid var(--border);
margin-top: auto;
}
/* ─── Responsive ──────────────────────────────────────── */
@media (max-width: 700px) {
/* Hamburger visible on mobile */
.nav-toggle {
display: flex;
}
/* Show mobile theme toggle, hide nav one */
.mobile-theme-toggle {
display: inline-flex;
}
.nav-theme-item {
display: none;
}
.navbar {
padding: 0 0.75rem;
height: 52px;
flex-wrap: wrap;
}
.navbar-brand {
font-size: 1.15rem;
}
/* Dropdown menu */
.navbar-nav {
display: none;
flex-direction: column;
width: 100%;
background: var(--darker);
border-top: 1px solid rgba(255,255,255,0.08);
padding: 0.5rem 0;
gap: 0;
}
.navbar-nav.open {
display: flex;
}
.navbar-nav li {
width: 100%;
}
.navbar-nav a {
display: block;
padding: 0.7rem 1rem;
font-size: 0.95rem;
border-radius: 0;
}
.navbar-nav a:hover {
background: rgba(255,255,255,0.06);
}
/* Layout */
.container,
.container-narrow {
padding: 0.75rem;
}
/* Hero */
.hero {
padding: 1.5rem 0.5rem;
}
.hero h1 {
font-size: 1.6rem;
}
.hero p {
font-size: 0.95rem;
}
/* Cards */
.card {
padding: 1rem;
border-radius: 10px;
}
.card-header {
font-size: 1.05rem;
}
/* Stats */
.stats-row {
gap: 0.5rem;
}
.stat-box {
min-width: 0;
padding: 0.75rem 0.5rem;
}
.stat-box .value {
font-size: 1.3rem;
}
.stat-box .label {
font-size: 0.7rem;
}
/* Package grid */
.package-grid {
grid-template-columns: 1fr;
gap: 0.6rem;
}
.package-card {
padding: 0.75rem;
}
.package-card .card-num {
font-size: 1.2rem;
}
/* Hunt cards */
.hunt-card {
flex-direction: column;
align-items: flex-start;
gap: 0.5rem;
padding: 0.75rem 1rem;
}
/* Scan result */
.scan-result h1 {
font-size: 1.5rem;
}
.scan-result .emoji {
font-size: 3rem;
}
.points-badge.large {
font-size: 1.5rem;
padding: 0.4rem 1rem;
}
.package-hero .card-number {
font-size: 2rem;
}
/* Buttons */
.btn {
padding: 0.5rem 1rem;
font-size: 0.85rem;
}
/* Tables — horizontal scroll on mobile */
table {
font-size: 0.85rem;
}
th, td {
padding: 0.5rem 0.4rem;
}
.points-badge {
font-size: 0.85rem;
padding: 0.25rem 0.5rem;
}
/* Footer */
.footer {
padding: 1rem;
font-size: 0.75rem;
}
/* Touch-friendly form controls */
.form-control {
font-size: 1rem;
padding: 0.7rem 0.8rem;
}
.btn {
min-height: 44px;
}
.btn-sm {
min-height: 36px;
}
}
/* ── Floating QR Scanner FAB ──────────────────────────────── */
.scanner-fab {
position: fixed;
bottom: 1.5rem;
right: 1.5rem;
width: 60px;
height: 60px;
border-radius: 50%;
background: var(--primary);
color: #000;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 14px rgba(0,0,0,0.25);
text-decoration: none;
z-index: 100;
transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.scanner-fab:hover {
transform: scale(1.1);
box-shadow: 0 6px 20px rgba(0,0,0,0.3);
color: #fff;
}
.scanner-fab:active {
transform: scale(0.95);
}
/* ── Scanner disclaimer on home page ─────────────────────── */
.scanner-disclaimer {
background: var(--card-bg);
border: 1px solid var(--border);
border-left: 4px solid var(--primary);
border-radius: 8px;
padding: 1rem;
}
[data-theme="dark"] .scanner-disclaimer {
border-left-color: var(--primary);
}