@charset "UTF-8"; :root { --ground: #171310; --ground-2: #0f0c0a; --surface: #221c16; --surface-2: #2b2319; --gold: #c9a35c; --gold-bright: #e6c789; --gold-dim: #a68b59; --green: #33503f; --green-deep: #203026; --ink: #f1e8d8; --ink-muted: #a89a83; --rule: #42362590; --font-serif: 'Fraunces', Georgia, 'Times New Roman', serif; --font-mono: 'IBM Plex Mono', ui-monospace, Menlo, monospace; --font-sans: 'Karla', ui-sans-serif, system-ui, sans-serif; --danger-bg: rgba(180, 50, 40, 0.15); --danger-text: #ff9d9d; } * { box-sizing: border-box; } html { scroll-behavior: smooth; } @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } } body { margin: 0; background: var(--ground); color: var(--ink); font-family: var(--font-sans); font-size: 1rem; line-height: 1.65; -webkit-font-smoothing: antialiased; } a { color: inherit; } img, svg { display: block; max-width: 100%; } h1, h2, h3 { font-family: var(--font-serif); font-weight: 600; line-height: 1.08; text-wrap: balance; margin: 0; } p { margin: 0; } :focus-visible { outline: 2px solid var(--gold-bright); outline-offset: 3px; } /* ---------- sections ---------- */ section { padding-block: 5.5rem; } /* ---------- wrap-aware separators (JS-toggled, see main.js) ---------- Shared hook used by the announcement banner and hero tagline row: a "·" between two pieces of text that can independently wrap onto separate lines. No CSS selector exists for "am I on the same line as my sibling," so main.js measures and toggles this class instead of a fixed breakpoint. Visible by default so a no-JS visitor always sees the dot (today's behavior), never hidden by default. display, not visibility: a hidden separator must take no space, or it still gets counted when justify-content: center balances its flex line — a lone badge sharing its line with a space-reserving invisible dot renders off-center. Safe from the "text merges together" bug that originally motivated reserving space: both wrap-sep contexts space their siblings with a real flex `gap` (see .announcement-inner, .tagline-row) rather than the separator's own margin, so removing it from flow still leaves normal spacing behind, never a collision. */ .wrap-sep-hidden { display: none; } .container { width: 100%; max-width: 70rem; margin: 0 auto; padding-inline: 1.5rem; } .eyebrow { font-family: var(--font-mono); font-size: 0.72rem; letter-spacing: 0.22em; text-transform: uppercase; color: var(--gold); } .muted { color: var(--ink-muted); } .skip-link { position: absolute; left: 1rem; top: -3rem; background: var(--gold); color: var(--ground-2); padding: 0.6rem 1rem; border-radius: 0.125rem; font-family: var(--font-mono); font-size: 0.85rem; transition: top 0.15s ease; z-index: 100; } .skip-link:focus { top: 1rem; } /* scroll reveal */ .reveal { opacity: 0; transform: translateY(0.875rem); transition: opacity 0.6s ease, transform 0.6s ease; } .reveal.is-visible { opacity: 1; transform: none; } @media (prefers-reduced-motion: reduce) { .reveal { opacity: 1; transform: none; transition: none; } } .font-mono { font-family: var(--font-mono); } /* ---------- knot mark ---------- */ .knot { display: block; width: 1.75rem; height: 1.75rem; object-fit: contain; flex-shrink: 0; } .rule-row .knot { width: 1.375rem; height: 1.375rem; opacity: 0.9; } .footer-brand .knot { width: 1.625rem; height: 1.625rem; } /* ---------- brass rule divider ---------- */ .rule-row { display: flex; align-items: center; gap: 1rem; max-width: 13.75rem; margin-inline: auto; } .rule-row .line { height: 1px; flex: 1; background: linear-gradient(90deg, transparent, var(--gold-dim), transparent); } .hero-ctas { margin-top: 2.5rem; display: flex; justify-content: center; gap: 0.9rem; flex-wrap: wrap; } .btn { display: inline-flex; align-items: center; /* Centers label text horizontally too — matters once a button is stretched wider than its content (e.g. action-stack children filling a fixed-width column) or wraps to multiple lines; a no-op otherwise, so every button gets this instead of one-off overrides per case. */ justify-content: center; gap: 0.5rem; padding: 0.8rem 1.5rem; font-family: var(--font-mono); font-size: 0.8rem; letter-spacing: 0.05em; text-decoration: none; border-radius: 0.125rem; transition: transform 0.15s ease, background 0.15s ease, border-color 0.15s ease; } .btn:hover { transform: translateY(-1px); } .btn:disabled { opacity: 0.35; cursor: not-allowed; transform: none; } /* :where() keeps this native-button reset at zero specificity, so modifier classes like .btn-primary's background can actually win instead of losing to button.btn's higher (0,1,1) specificity */ :where(button.btn) { cursor: pointer; background: transparent; } .btn-primary { background: linear-gradient(180deg, var(--gold-bright), var(--gold)); color: var(--ground-2); font-weight: 500; border: none; } .btn-primary:hover { background: linear-gradient(180deg, var(--gold-bright), var(--gold-bright)); } .btn-outline { border: 1px solid var(--gold-dim); color: var(--gold-bright); } /* .nav-cta mirrors this hover treatment */ .btn-outline:hover, .nav-cta:hover { border-color: var(--gold); background: var(--surface); } .btn-sm { padding: 0.4rem 0.8rem; font-size: 0.75rem; line-height: 1.2; } /* Single-glyph reorder buttons (↑ / ↓) — narrower than .btn-sm's text padding since there's no label to give it room to breathe. */ .btn-icon { padding-inline: 0.55rem; } .btn-danger { background: var(--danger-bg); border: 1px solid rgba(220, 80, 60, 0.5); color: var(--danger-text); } .btn-danger:hover { background: rgba(220, 60, 50, 0.3); border-color: #ff6e6e; color: #fff; } /* shared surface-panel look: also used by .card, .login-card, .panel below */ .stat-card, .card, .login-card, .panel, .menu-category { background: var(--surface); border: 1px solid var(--rule); } .stat-card { margin-top: 2rem; padding: 2rem; border-radius: 0.2rem; } .stat-card .eyebrow { display: block; margin-bottom: 1.1rem; } .stat-big { font-family: var(--font-serif); font-weight: 600; font-style: italic; font-size: 3rem; color: var(--gold-bright); line-height: 1; } .stat-card .stat-label { margin-top: 0.4rem; font-size: 0.92rem; color: var(--ink-muted); } .stat-source { margin-top: 1.5rem; font-family: var(--font-mono); font-size: 0.7rem; color: var(--gold-dim); letter-spacing: 0.05em; } .card { border-radius: 0.2rem; padding: 2.25rem; } .card h3 { font-size: 1.3rem; color: var(--gold-bright); margin-bottom: 1.4rem; } .card .note { margin-top: 1.25rem; font-size: 0.88rem; color: var(--ink-muted); } .card .note strong { color: var(--ink); font-weight: 600; } .panel { border-radius: 0.25rem; padding: 2rem; margin-bottom: 2rem; } .panel h2 { font-size: 1.35rem; color: var(--gold-bright); margin-bottom: 1.25rem; display: flex; align-items: center; gap: 0.6rem; } .panel-head { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; gap: 0.75rem; margin-bottom: 1.5rem; } .status-badge { display: inline-flex; flex-direction: row; align-items: center; gap: 0.4rem; font-family: var(--font-mono); font-size: 0.72rem; letter-spacing: 0.08em; text-transform: uppercase; padding: 0.25rem 0.6rem; border-radius: 0.125rem; white-space: nowrap; line-height: 1.2; } .status-badge.active { background: rgba(51, 80, 63, 0.4); border: 1px solid var(--green); color: #9fe2bf; } .status-badge.inactive { background: rgba(138, 115, 74, 0.2); border: 1px solid var(--rule); color: var(--ink-muted); } /* Both the menu item and announcement status badges double as their own toggle control — a plain