: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; } /* ─── Loot Teaser Page ────────────────────────────────── */ .teaser-page { text-align: center; padding: 3rem 1rem; max-width: 480px; margin: 0 auto; } .teaser-emoji { font-size: 5rem; margin-bottom: 0.5rem; } .teaser-headline { font-size: 2.4rem; font-weight: 800; margin: 0 0 0.5rem; color: var(--text); } .teaser-subtext { font-size: 1.1rem; color: var(--muted); margin: 0 0 0.25rem; } .teaser-points { font-size: 3.5rem; font-weight: 900; color: var(--primary); margin: 0.25rem 0 1rem; line-height: 1; } .teaser-points span { font-size: 1.4rem; font-weight: 600; } .teaser-cta { font-size: 1.05rem; color: var(--text); margin-bottom: 1.5rem; } .teaser-buttons { display: flex; gap: 1rem; justify-content: center; flex-wrap: wrap; margin-bottom: 2rem; } .teaser-buttons .btn-lg { padding: 0.75rem 2rem; font-size: 1.1rem; } .teaser-hunt-info { font-size: 0.85rem; color: var(--muted); font-family: monospace; } /* ─── Package Profile ─────────────────────────────────── */ .package-hero { text-align: center; padding: 2rem 0; } .package-hero .card-number { font-size: 3rem; font-weight: 800; color: var(--primary); } .hunt-title { min-width: 24em; } .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; } /* Manage hunt: on mobile, show Total Scans, Discovery Rate, Starts, Expires */ .manage-stats { display: flex; flex-direction: column; } .manage-stats-row-1 { order: 2; } .manage-stats-row-2 { order: 1; } .manage-stats-row-1 .stat-box:nth-child(1), .manage-stats-row-1 .stat-box:nth-child(2) { display: none; } .hide-mobile { display: none !important; } /* Loot detail: stack stats vertically on mobile */ .loot-stats { flex-direction: column; } .hunt-title { min-width: 10em; } /* 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; } /* Teaser */ .teaser-page { padding: 2rem 0.5rem; } .teaser-emoji { font-size: 3.5rem; } .teaser-headline { font-size: 1.8rem; } .teaser-points { font-size: 2.8rem; } .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); }