/* =============================================================================
   CryptoGames.gg Design System
   Phase 6 — Plugin stylesheet (scoped to CPT pages only)
   Source of truth: .planning/phases/06-redesign/06-UI-SPEC.md
   ============================================================================= */

/* Section 1 — Fonts
   The TEXT faces (Space Grotesk, Inter) used to be `@import` rules right here.
   An @import cannot begin downloading until the stylesheet containing it has
   itself been fetched AND parsed, so they arrived on a third serialised round
   trip — measured landing at ~1,980ms on /games/. They are enqueued from PHP
   now (utils/functions.php). Do not put them back here.

   The ICON face is not here either, and it is not here on purpose. We serve it
   ourselves, and its @font-face plus the `.material-symbols-outlined` rule now
   live in **assets/css/icons.css**, printed inline in <head> on EVERY page by
   Assets\IconFace.

   ⛔ DO NOT MOVE THEM BACK. This stylesheet is scoped to CPT singulars and CPT
   archives, because its body reset, sidebar rules and main-content offset would
   fight the theme on an ordinary page template. `/investors/`, `/guilds/` and
   `/calendar/` are ordinary WordPress Pages hosting our shortcodes, so they
   never load this file — and while the face lived here, `/investors/` rendered
   its 12 icons AS THE WORD. A second copy here would be the copy that goes
   stale. */

/* Section 2 — CSS custom properties */
:root {
  /* Surface hierarchy */
  --color-surface: #131314;
  --color-surface-dim: #131314;
  --color-surface-container-lowest: #0e0e0f;
  --color-surface-container-low: #1c1b1c;
  --color-surface-container: #201f20;
  --color-surface-container-high: #2a2a2b;
  --color-surface-container-highest: #353436;
  --color-surface-variant: #353436;
  --color-surface-bright: #3a393a;
  --color-background: #131314;
  /* Borders */
  --color-outline: #849495;
  --color-outline-variant: #3b494b;
  /* Text */
  --color-on-surface: #e5e2e3;
  --color-on-surface-variant: #b9cacb;
  --color-on-primary-container: #006970;
  --color-on-tertiary-container: #506600;
  --color-on-secondary-container: #480063;
  /* Accents */
  --color-primary-container: #00f0ff;
  --color-primary-fixed-dim: #00dbe9;
  --color-primary-fixed: #7df4ff;
  --color-primary: #dbfcff;
  --color-secondary-container: #cf5cff;
  --color-secondary-fixed-dim: #ecb2ff;
  --color-secondary: #ecb2ff;
  --color-tertiary-container: #bbea00;
  --color-tertiary-fixed-dim: #abd600;
  --color-tertiary: #e9ffa8;
  /* Semantic */
  --color-error: #ffb4ab;
  --color-error-container: #93000a;
  /* Typography */
  --font-headline: 'Space Grotesk', sans-serif;
  --font-body: 'Inter', sans-serif;
  --font-label: 'Inter', sans-serif;
  /* Spacing */
  --space-xs: 4px;
  --space-sm: 8px;
  --space-md: 16px;
  --space-lg: 24px;
  --space-xl: 32px;
  --space-2xl: 48px;
  --space-3xl: 64px;
}

/* Section 3 — Base reset and body */

/*
 * ⛔⛔⛔ THESE FOUR RULES ARE THE ONLY ONES IN THIS FILE THAT CAN ESCAPE OUR OWN
 * PAGES, AND THEY MUST NOT. Measured 2026-08-18 across the whole file: of 1,004
 * top-level rules, exactly four selectors were unscoped — the `*` reset below,
 * `body`, `a` and `img`. Everything else already anchors on `.cg…`, `.dapp-…`
 * or `body.cg-layout`.
 *
 * ⭐⭐⭐ WHY IT MATTERS EVEN THOUGH NOTHING IS BROKEN TODAY. Every one of the 11
 * Elementor widgets declares `cryptogames-css` in `Base::get_style_depends()`,
 * so Elementor enqueues this file WHEREVER a widget lands — editor included.
 * A widget dropped on an ordinary Foxiz page therefore brings this file to a
 * page whose <body> has no `cg-layout`, and a bare `*{margin:0;padding:0}`
 * plus `a{color:inherit}` would strip the spacing and every link colour off
 * the theme's header, nav and footer. Latent, not firing: no page hosts a
 * widget yet. That is precisely why it is cheap to fix now.
 *
 * ⭐⭐⭐ `:where()` CONTRIBUTES ZERO SPECIFICITY — that is the whole point of
 * using it here rather than plain `body.cg-layout …`. Each selector below keeps
 * the exact weight it had as a bare `*` / `body` / `a` / `img`, so on every page
 * where these already applied, the same declaration still wins. Scoping with a
 * plain class would have raised `body` from (0,0,1) to (0,1,1) and could have
 * taken the font or background off Foxiz on seven live page types.
 *
 * Measured the same day: all seven page types that load this file — /games/,
 * a game singular, /tokens/, a token singular, /dashboard/, /guilds/,
 * /investors/ — carry `cg-layout` on <body>; the two that do not (/ and
 * /calendar/) do not load the file at all. The scope is exact, not a guess.
 *
 * `.cg-scope` is the wrapper `Base::render()` puts around every widget, so a
 * widget keeps its own reset on a foreign page. ⛔ ONE LIST, not a list of root
 * classes to keep in sync — see the s182 header-vs-cell drift.
 */
:where(body.cg-layout, .cg-scope) *,
:where(body.cg-layout, .cg-scope) *::before,
:where(body.cg-layout, .cg-scope) *::after,
.cg-scope { box-sizing: border-box; margin: 0; padding: 0; }
body:where(.cg-layout),
.cg-scope { background: var(--color-background); color: var(--color-on-surface); font-family: var(--font-body); }

/*
 * ⛔⛔ THE LINE ABOVE HAS NEVER APPLIED, AND ITS BEING CORRECT IS WHY NOBODY
 * LOOKED. Foxiz's `main.css` carries `body { color: var(--body-fcolor) }`
 * — the same bare `body` selector, i.e. the SAME SPECIFICITY (0,0,1) — and it
 * is enqueued AFTER ours, so source order hands the theme the win on every
 * page we own. `--body-fcolor` is the theme's LIGHT-mode ink, `#333333`, and
 * our surfaces are `#131314`: a measured 1.47:1 against a 4.5 requirement.
 *
 * ⭐⭐⭐ So our dark pages have only ever been dark in the BACKGROUND. Anything
 * carrying its own explicit colour looked right, which is nearly everything —
 * and every element somebody forgot to colour inherited the light theme's ink
 * and went invisible in a way that produces no error, no console message and a
 * plausible-looking page. Measured casualties: the whole FAQ block on every
 * game page (question AND answer), the editorial-assessment note, and
 * `/tokens/`'s pagination label and search icon.
 *
 * ⭐ The fix is the SELECTOR, not the value. `.cg-layout` is our own class on
 * <body>, so `body.cg-layout` is (0,1,1) and outranks a bare `body` no matter
 * which stylesheet loads last — the failure mode here was never about which
 * colour we asked for.
 */
body.cg-layout { color: var(--color-on-surface); }
:where(body.cg-layout, .cg-scope) a { color: inherit; text-decoration: none; }
:where(body.cg-layout, .cg-scope) img { max-width: 100%; height: auto; }
/* The `.material-symbols-outlined` rule that used to sit here — the one whose
   `width: 1em` turns the icon face's arrival into a repaint instead of an
   0.0841 layout shift — has moved to assets/css/icons.css, beside the
   @font-face it depends on. It is printed inline in <head> on every page.
   ⛔ Do not re-add it here; see Section 1. */

/* The same failure one storey down, and much bigger. The /games/ PHP fallback —
   the crawler / no-JS list that React later throws away — puts ~40 inline
   curated-facet links ABOVE ~2,400px of card markup. The theme's stack is
   `Jost, Verdana, Geneva, sans-serif`, and Jost is the narrower face: when it
   lands the block re-wraps from 723px to 641px, two wrapped lines fewer, and
   every card below it jumps up 82px. Measured 0.2921 CLS on /games/, on five
   loads in six.
   ⭐ It is the FALLBACK'S OWN reflow, not the React takeover: with the bundle
   blocked the shift still scores 0.2921 on 4 runs of 4, and with webfonts
   blocked it disappears entirely. Those two experiments are what identified it;
   a CLS summary had blamed the hero for two sessions.
   Pinning to the NON-WEBFONT half of the stack the theme already declares is
   what makes first paint final: the block renders exactly as it does today and
   there is simply no second state for it to shift into. This markup is deleted
   for every visitor who has JavaScript, so its typography is worth nothing and
   its stability is worth 0.29 of CLS. `!important` is the point of the rule,
   not sloppiness — nothing may re-type this block. */
.cg-facet-nav,
.cg-facet-nav * {
  font-family: Verdana, Geneva, sans-serif !important;
}

/* Section 4 — Page layout shell */
.cg-layout { min-height: 100vh; background: var(--color-background); }
/* ⭐⭐⭐ s249 — THE HEADER IS THE THEME'S, ON EVERY PAGE. partials/nav.php now
   calls foxiz_render_header() (Theme\ThemeHeader), exactly as the homepage
   does, so the logo, the menu, the toggle and the Telegram button are the
   same because they are one thing. Foxiz's header is ~60px and sits in NORMAL
   FLOW, taking its own space; it goes sticky on scroll at that same height.

   ⚠️ `.cg-top-nav`, the plugin's own bar, is now the FALLBACK — rendered only
   where the theme has no header to lend (egamers.io runs Pixwell). It is a
   64px bar FIXED to the viewport, so everything after it needs pushing down.
   The two variables say which case we are in, and the bar's own sibling rule
   flips them — the shell never has to know which theme it is on:
     --cg-hd      the height of whatever is stuck to the top when scrolled;
                  sticky/fixed children (rail, tab navs) start below it.
     --cg-hd-pad  the top padding the content needs to clear a FIXED bar at
                  load: nothing under a header in flow, the bar's height
                  under the fallback. */
.cg-layout { --cg-hd: 60px; --cg-hd-pad: 0px; }
.cg-top-nav ~ .cg-main,
.cg-top-nav ~ .cg-sidebar { --cg-hd: 64px; --cg-hd-pad: 64px; }

.cg-main { margin-left: 256px; padding-top: var(--cg-hd-pad); min-height: 100vh; background: var(--color-background); }

/* /games/ archive owns its own filter sidebar — no left nav offset. */
.cg-layout--games-archive .cg-main { margin-left: 0; }

/* Top nav */
.cg-top-nav {
  position: fixed; top: 0; width: 100%; z-index: 50;
  height: 64px; background: #131314;
  box-shadow: 0 0 20px rgba(0,240,255,0.08);
  font-family: var(--font-headline);
  display: flex; align-items: center; justify-content: space-between;
  padding: 0 32px;
}
.cg-nav-logo { font-size: 24px; font-weight: 700; letter-spacing: -0.05em; color: #00dbe9; }
.cg-nav-links { display: flex; align-items: center; gap: 32px; }
.cg-nav-link { color: #b9cacb; font-size: 14px; transition: color 150ms ease; }
.cg-nav-link:hover { color: #e5e2e3; }
.cg-nav-link.active { color: #00dbe9; border-bottom: 2px solid #00dbe9; padding-bottom: 4px; }
.cg-nav-icon-btn { padding: 8px; border-radius: 9999px; background: transparent; border: none; cursor: pointer; color: #b9cacb; }
.cg-nav-icon-btn:hover { background: rgba(58,57,58,0.4); backdrop-filter: blur(24px); }
.cg-nav-actions { display: flex; align-items: center; gap: 8px; }

/* Sidebar */
.cg-sidebar {
  width: 256px; position: fixed; left: 0; top: var(--cg-hd);
  background: #1c1b1c; display: flex; flex-direction: column;
  padding: 24px 0; gap: 4px; z-index: 40;
  font-family: var(--font-headline); font-size: 14px;
  letter-spacing: 0.025em; height: calc(100vh - var(--cg-hd));
  overflow-y: auto;
}
.cg-sidebar-section-label {
  padding: 8px 24px 4px; font-size: 10px; font-weight: 700;
  letter-spacing: 0.1em; text-transform: uppercase; color: #849495;
}
.cg-sidebar-nav-item {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 24px; color: #b9cacb; opacity: 0.8;
  transition: all 300ms ease; text-decoration: none;
  border-left: 4px solid transparent;
}
.cg-sidebar-nav-item:hover {
  background: #201f20; color: #e5e2e3; opacity: 1;
  transform: translateX(4px);
}
.cg-sidebar-nav-item.active {
  background: linear-gradient(to right, rgba(0,240,255,0.1), transparent);
  border-left: 4px solid #00dbe9; color: #00dbe9;
  font-weight: 700; opacity: 1;
  box-shadow: inset 0 0 10px rgba(0,240,255,0.1);
}
.cg-sidebar-play-btn {
  width: calc(100% - 48px); margin: 0 24px;
  background: #2a2a2b; color: #00dbe9;
  border: 1px solid rgba(59,73,75,0.2); border-radius: 2px;
  font-weight: 700; padding: 12px 24px; font-family: var(--font-headline);
  font-size: 14px; cursor: pointer; text-align: center; display: block;
}
.cg-sidebar-footer { margin-top: auto; padding: 16px 0; border-top: 1px solid rgba(59,73,75,0.1); }

/* Section 5 — Buttons */
.cg-cta-primary {
  background: linear-gradient(to right, #00f0ff, #00dbe9);
  color: #006970; font-weight: 700; border-radius: 2px;
  box-shadow: 0 0 15px rgba(0,219,233,0.3);
  transition: all 150ms ease; border: none; cursor: pointer;
  padding: 12px 24px; font-family: var(--font-headline); font-size: 14px;
  display: inline-block; text-align: center;
}
.cg-cta-primary:active { transform: scale(0.95); }
.cg-btn-ghost {
  background: #201f20; border: 1px solid rgba(59,73,75,0.2);
  color: #e5e2e3; border-radius: 2px; padding: 12px 24px;
  font-family: var(--font-headline); font-size: 14px; cursor: pointer;
  transition: background 150ms ease;
}
.cg-btn-ghost:hover { background: #2a2a2b; }
.cg-btn-ghost-cyan {
  background: rgba(0,240,255,0.1); border: 1px solid rgba(0,240,255,0.2);
  color: #00f0ff; border-radius: 2px; font-weight: 700;
  padding: 12px 24px; font-family: var(--font-headline); font-size: 14px;
  cursor: pointer; transition: all 150ms ease;
}
.cg-btn-ghost-cyan:hover { background: #00f0ff; color: #006970; }
.cg-fab {
  position: fixed; bottom: 32px; right: 32px;
  width: 56px; height: 56px; border-radius: 9999px;
  background: linear-gradient(135deg, #00f0ff, #00dbe9);
  color: #006970; border: none; cursor: pointer; z-index: 60;
  box-shadow: 0 8px 32px rgba(0,219,233,0.3);
  display: flex; align-items: center; justify-content: center;
  font-size: 24px; transition: all 150ms ease;
}
.cg-fab:hover { transform: scale(1.1); }
.cg-fab:active { transform: scale(0.9); }

/* View toggle pills */
.cg-view-toggle { background: #1c1b1c; padding: 4px; border-radius: 8px; display: inline-flex; }
.cg-view-toggle-active { padding: 6px 16px; background: #201f20; color: #00dbe9; border-radius: 6px; }
.cg-view-toggle-inactive { padding: 6px 16px; color: #b9cacb; cursor: pointer; }
.cg-view-toggle-inactive:hover { color: #e5e2e3; }

/* Section 6 — Cards and containers */
.cg-card {
  background: #201f20; border-radius: 8px;
  border: 1px solid rgba(59,73,75,0.1);
  transition: all 300ms ease;
}
.cg-card:hover { border-color: rgba(0,219,233,0.3); background: #2a2a2b; }
.cg-card-low { background: #1c1b1c; border-radius: 8px; border: 1px solid rgba(59,73,75,0.1); }
.cg-metric-card {
  background: #1c1b1c; padding: 24px; border-radius: 8px;
  border: 1px solid rgba(59,73,75,0.1);
}
.cg-metric-label { font-family: var(--font-label); font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; color: #b9cacb; margin-bottom: 4px; }
.cg-metric-value { font-family: var(--font-headline); font-size: 30px; font-weight: 700; color: #e5e2e3; }
.cg-metric-delta-pos { font-family: var(--font-body); font-size: 14px; font-weight: 700; color: #bbea00; }
.cg-metric-delta-neg { font-family: var(--font-body); font-size: 14px; font-weight: 700; color: #ffb4ab; }
.cg-glass-panel, .cg-glass-card {
  background: rgba(58,57,58,0.4); backdrop-filter: blur(24px);
}
.cg-neon-glow:hover { box-shadow: 0 0 15px rgba(0,219,233,0.2); }

/* Event card */
.cg-event-card {
  display: flex; flex-direction: column;
  background: #1c1b1c; border-radius: 8px; padding: 16px; gap: 24px;
  border: 1px solid transparent; transition: all 150ms ease;
}
.cg-event-card:hover { border-color: rgba(0,240,255,0.2); background: #2a2a2b; }
@media (min-width: 768px) { .cg-event-card { flex-direction: row; } }
.cg-event-card-image {
  width: 100%; height: 128px; border-radius: 8px; object-fit: cover;
  transition: transform 500ms ease;
}
@media (min-width: 768px) { .cg-event-card-image { width: 192px; } }
.cg-event-card:hover .cg-event-card-image { transform: scale(1.05); }
.cg-event-countdown { font-family: var(--font-headline); font-size: 18px; font-weight: 700; color: #00dbe9; }

/* Guild card */
.cg-guild-card {
  display: flex; flex-direction: column;
  background: #201f20; border-radius: 8px; overflow: hidden;
  border: 1px solid rgba(59,73,75,0.1); transition: all 300ms ease;
}
.cg-guild-card:hover { border-color: rgba(0,219,233,0.3); background: #2a2a2b; }
.cg-guild-card-banner { height: 128px; overflow: hidden; }
.cg-guild-card-banner img { opacity: 0.5; width: 100%; height: 100%; object-fit: cover; transition: transform 300ms ease; }
.cg-guild-card:hover .cg-guild-card-banner img { transform: scale(1.05); }
.cg-guild-logo { width: 48px; height: 48px; border-radius: 8px; background: #131314; border: 2px solid #00dbe9; }
.cg-guild-card-body { padding: 24px; }
.cg-guild-stat-label { font-size: 10px; text-transform: uppercase; letter-spacing: -0.025em; color: #b9cacb; }
.cg-guild-stat-value { font-size: 14px; font-weight: 700; }
.cg-guild-tag { padding: 4px 8px; background: #0e0e0f; border-radius: 2px; font-size: 10px; border: 1px solid rgba(59,73,75,0.2); }

/* Investor card */
.cg-investor-card {
  display: block; background: #201f20; border-radius: 8px; padding: 24px;
  border: 1px solid rgba(59,73,75,0.05); transition: all 150ms ease;
}
.cg-investor-card:hover { border-color: rgba(0,219,233,0.3); transform: translateY(-4px); }
.cg-investor-logo { width: 64px; height: 64px; border-radius: 8px; background: #2a2a2b; }
.cg-investor-role { color: #cf5cff; font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; }
.cg-investor-series { color: #bbea00; font-size: 10px; font-weight: 700; text-transform: uppercase; }
.cg-investor-footer { border-top: 1px solid rgba(59,73,75,0.1); padding-top: 16px; margin-top: 16px; display: flex; justify-content: space-between; align-items: center; }

/* Section 7 — Data table */
.cg-data-table-wrap {
  background: #201f20; border-radius: 16px;
  border: 1px solid rgba(59,73,75,0.15); overflow: hidden;
}
.cg-data-table-header { padding: 24px; border-bottom: 1px solid rgba(59,73,75,0.1); display: flex; justify-content: space-between; align-items: center; }
.cg-data-table-header-title { font-family: var(--font-headline); font-size: 20px; font-weight: 700; }
.cg-data-table-action { font-size: 10px; font-weight: 700; text-transform: uppercase; color: #00f0ff; }
.cg-data-table-action:hover { text-decoration: underline; }
.cg-data-table { width: 100%; border-collapse: collapse; }
.cg-data-table thead { background: rgba(28,27,28,0.5); }
.cg-data-table th { padding: 16px 24px; font-size: 10px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.1em; color: #b9cacb; text-align: left; }
.cg-data-table td { padding: 16px 24px; border-top: 1px solid rgba(59,73,75,0.05); font-size: 14px; }
.cg-data-table tbody tr:hover { background: rgba(58,57,58,0.05); }

/* Section 7b — Games table (the Elementor widget / [cryptogames_games_table])
 *
 * A table is the one block that cannot reflow: on a phone the columns have to
 * scroll sideways rather than wrap into unreadable stacks. The wrap above sets
 * overflow:hidden for its rounded corners, so the scroller is a layer inside
 * it. -webkit-overflow-scrolling keeps it from feeling stuck on iOS.
 *
 * Colours are literal, not Foxiz custom properties: this widget can be dropped
 * on an Elementor Canvas page where the theme never loads, and a var() that
 * falls back to its light-page default renders #333 on #201f20. */
.cg-games-table .cg-dt-scroll, .cg-tokens-table .cg-dt-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }

/* ⭐⭐⭐ THE SWIPE SHADOW — the scroll was real, the invitation was not.
 * MEASURED at 390px, s191: the table is 969px inside a 279px window, so 71%
 * of it — genre, chain, device, market cap and the 7d sparkline — is one swipe
 * away. s181 made that swipe POSSIBLE (`.cg-mod.cg-band{min-width:0}`); nothing
 * ever said it was there. Desktop Chrome paints a 15px scrollbar here and looks
 * fine, which is why this survived: every phone browser uses an OVERLAY
 * scrollbar that is invisible until you already scrolled.
 *
 * ⭐⭐ IT COSTS NO MEDIA QUERY BECAUSE IT CANNOT LIE. Two `local` covers scroll
 * with the content, two `scroll` shadows are pinned to the box. With no
 * overflow the covers sit exactly on the shadows and nothing paints; at the
 * left end the left shadow is covered, at the right end the right one is.
 * VERIFIED in all three states: 1440 (overflow 0) paints neither edge, 390 at
 * scrollLeft 0 paints only the right, 390 at scrollLeft 690 only the left.
 *
 * ⚠️ THE COVER COLOUR IS LOAD-BEARING AND MUST EQUAL THE WRAP'S BACKGROUND.
 * `.cg-data-table-wrap` is `#201f20`, declared once at the top of this section
 * and overridden in no stylesheet — a cover that does not match reads as a
 * grey bar welded to the edge, not as an absence. Literal for the same reason
 * the rest of this section is: an Elementor Canvas page never loads the theme.
 *
 * ⚠️ Painted BEHIND the rows, which are a 9.4%-alpha zebra, so the fade reads
 * at ~90% over a striped row. That is why the shadow is .60 and not .35. */
/* ⭐ THE SWIPE SHADOW for this table now lives with the other two that need
 * it, at the END of this file — see "CROSS-CUTTING: THE SWIPE AFFORDANCE".
 * It had to move: `.cg-tab-nav-sticky` declares its own `background` at line
 * ~2231, so a shared rule up here would lose the cascade to it and paint
 * nothing, on the one caller whose scroll hides the most. */
.cg-games-table .cg-data-table-header-title, .cg-tokens-table .cg-data-table-header-title { color: #e5e2e3; }
/* The counter tiles are links now (CatalogCounts), and a link's children are
 * inline — without this the label and the value sit on one line. */
.cg-metric-card .cg-metric-label, .cg-metric-card .cg-metric-value { display: block; }
.cg-metric-link { display: block; text-decoration: none; transition: border-color .18s ease, transform .18s ease; }
.cg-metric-link:hover { border-color: rgba(0,219,233,0.35); transform: translateY(-2px); }
.cg-games-table .cg-data-table-action, .cg-tokens-table .cg-data-table-action { text-decoration: none; }
.cg-games-table .cg-badge-f2p, .cg-tokens-table .cg-badge-f2p { background: rgba(34,197,94,0.14); color: #6ee7a0; }
.cg-games-table .cg-data-table, .cg-tokens-table .cg-data-table { min-width: 640px; }
.cg-games-table .cg-data-table td, .cg-tokens-table .cg-data-table td { color: #b9cacb; vertical-align: middle; }
.cg-games-table .cg-dt-num, .cg-tokens-table .cg-dt-num { text-align: right; white-space: nowrap; }
.cg-games-table th.cg-dt-num, .cg-tokens-table th.cg-dt-num { text-align: right; }
.cg-games-table .cg-dt-rank, .cg-tokens-table .cg-dt-rank { color: #7c8c8d; font-variant-numeric: tabular-nums; width: 1%; }
.cg-games-table .cg-dt-link, .cg-tokens-table .cg-dt-link { display: flex; align-items: center; gap: 12px; text-decoration: none; }
.cg-games-table .cg-dt-icon, .cg-tokens-table .cg-dt-icon { width: 32px; height: 32px; border-radius: 8px; object-fit: cover; flex-shrink: 0; }
.cg-games-table .cg-dt-icon-blank, .cg-tokens-table .cg-dt-icon-blank { display: block; background: #2a2a2b; }
.cg-games-table .cg-dt-name, .cg-tokens-table .cg-dt-name { font-weight: 700; color: #e5e2e3; }
.cg-games-table .cg-dt-link:hover .cg-dt-name, .cg-tokens-table .cg-dt-link:hover .cg-dt-name { color: #00dbe9; }
.cg-games-table .cg-dt-mcap, .cg-tokens-table .cg-dt-mcap { display: block; color: #e5e2e3; font-weight: 600; font-variant-numeric: tabular-nums; }
/* A dated reading still prints — labelled, never hidden — but it must not read
 * as current, so the date sits under the number in the quiet colour. */
.cg-games-table .cg-dt-asof, .cg-tokens-table .cg-dt-asof { display: block; font-size: 11px; color: #7c8c8d; }
.cg-games-table .cg-dt-empty, .cg-tokens-table .cg-dt-empty { color: #5f6b6c; }
.cg-games-table .cg-dt-caption, .cg-tokens-table .cg-dt-caption { margin: 10px 2px 0; font-size: 12px; color: #7c8c8d; }

/* ⭐ THE TOKEN TABLE'S OWN FOUR CLASSES — everything else it renders is shared
 * with .cg-games-table above, widened rather than copied. These exist because
 * /tokens/ sorts from its header row and /games/ does not.
 *
 * ⚠️ THE SORT CONTROL IS A <button> BECAUSE IT DOES SOMETHING. It has to keep
 * a real focus ring and a pointer, but must not look like a form control
 * dropped into a header — hence a button reset that inherits the th's own type
 * and colour rather than restating them. */
.cg-tokens-table .cg-dt-sort {
  -webkit-appearance: none; appearance: none;
  background: none; border: 0; padding: 0; margin: 0;
  font: inherit; color: inherit; letter-spacing: inherit; text-transform: inherit;
  cursor: pointer;
}
.cg-tokens-table .cg-dt-sort:hover { color: #00dbe9; }
.cg-tokens-table .cg-dt-sort--active { color: #e5e2e3; font-weight: 700; }
/* A numeric header right-aligns its label, so the button has to fill the cell
 * or the click target drifts away from the text the visitor aimed at. */
.cg-tokens-table th.cg-dt-num .cg-dt-sort { width: 100%; text-align: right; }
.cg-tokens-table .cg-dt-symbol { color: #7c8c8d; font-size: 12px; letter-spacing: .04em; white-space: nowrap; }
.cg-tokens-table .cg-dt-price { color: #e5e2e3; font-variant-numeric: tabular-nums; }
.cg-tokens-table .cg-dt-chg { font-variant-numeric: tabular-nums; white-space: nowrap; }
.cg-tokens-table .cg-dt-gamelink { color: #b9cacb; text-decoration: none; }
.cg-tokens-table .cg-dt-gamelink:hover { color: #00dbe9; }
/* "No market" — a fact about the token, muted so it reads as a footnote beside
   the name rather than as a warning. Deliberately NOT the delta red: nothing
   has gone wrong, and a red mark would say the opposite. */
.cg-tokens-table .cg-dt-nomarket {
	display: inline-block;
	margin-top: 3px;
	padding: 1px 6px;
	border: 1px solid #2f3a3b;
	border-radius: 999px;
	font-size: 10px;
	letter-spacing: .04em;
	text-transform: uppercase;
	color: #7c8c8d;
	white-space: nowrap;
}
@media (max-width: 600px) {
  .cg-games-table .cg-data-table th, .cg-tokens-table .cg-data-table th, .cg-games-table .cg-data-table td, .cg-tokens-table .cg-data-table td { padding: 12px 16px; }
  .cg-games-table .cg-data-table-header, .cg-tokens-table .cg-data-table-header { padding: 18px 16px; }
}

/* Section 8 — Badges and status chips */
.cg-badge {
  display: inline-block; font-size: 10px; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.1em;
  padding: 2px 8px; border-radius: 2px;
}
.cg-badge-live { background: #bbea00; color: #506600; }
.cg-badge-upcoming { background: #cf5cff; color: #480063; }
.cg-badge-past { background: #353436; color: #b9cacb; opacity: 0.8; filter: grayscale(0.5); }
.cg-badge-rank { background: #353436; color: #b9cacb; }
.cg-badge-platinum { background: rgba(0,240,255,0.1); color: #00dbe9; border: 1px solid rgba(0,219,233,0.2); }
.cg-chip-platform {
  display: inline-block; padding: 4px 12px; border-radius: 9999px;
  background: rgba(0,240,255,0.2); color: #00dbe9;
  border: 1px solid rgba(0,240,255,0.3); font-size: 12px; font-weight: 700;
}
.cg-badge-tier {
  display: inline-block; font-size: 10px; font-weight: 700; text-transform: uppercase;
  letter-spacing: 0.1em; padding: 2px 8px; border-radius: 2px;
  background: rgba(0,240,255,0.1); color: #00dbe9; border: 1px solid rgba(0,219,233,0.2);
}
.cg-badge-hot { background: #bbea00; color: #506600; font-size: 10px; font-weight: 700; text-transform: uppercase; padding: 2px 8px; border-radius: 2px; }
.cg-delta-pos { font-size: 14px; font-weight: 700; color: #bbea00; }
.cg-delta-neg { font-size: 14px; font-weight: 700; color: #ffb4ab; }
.cg-confidence-high { color: #bbea00; }
.cg-confidence-medium { color: #cf5cff; }
.cg-confidence-low { color: #ffb4ab; }

/* Section 9 — Hero sections */
.cg-hero {
  position: relative; width: 100%; overflow: hidden;
}
.cg-hero-game { height: 500px; }
.cg-hero-event, .cg-hero-token, .cg-hero-calendar { height: 256px; }
.cg-hero-guild { height: 300px; }
.cg-hero-overlay {
  position: absolute; inset: 0;
  background: linear-gradient(to top, #131314, rgba(19,19,20,0.4), transparent);
}
.cg-hero-overlay-side {
  position: absolute; inset: 0;
  background: linear-gradient(to right, #131314, rgba(19,19,20,0.8), transparent);
}
.cg-hero-content { position: absolute; bottom: 32px; left: 32px; right: 32px; }
.cg-hero-game-logo {
  width: 128px; height: 128px; border-radius: 8px;
  border: 4px solid #131314; background: #201f20; object-fit: cover;
}
@media (min-width: 768px) {
  .cg-hero-game-logo { width: 176px; height: 176px; }
}
.cg-hero-title {
  font-family: var(--font-headline); font-size: 48px; font-weight: 800;
  letter-spacing: -0.05em; color: #e5e2e3; line-height: 1.1;
}
@media (min-width: 768px) { .cg-hero-title { font-size: 72px; } }
.cg-quick-stats-bar {
  padding: 32px; border-top: 1px solid rgba(59,73,75,0.1);
  border-bottom: 1px solid rgba(59,73,75,0.1); background: #1c1b1c;
  display: grid; grid-template-columns: repeat(2, 1fr); gap: 24px;
}
@media (min-width: 768px) { .cg-quick-stats-bar { grid-template-columns: repeat(4, 1fr); } }
.cg-quick-stat-label { font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; color: #b9cacb; }
.cg-quick-stat-value { font-family: var(--font-headline); font-size: 20px; font-weight: 700; color: #e5e2e3; margin-top: 4px; }
/* The age of a collected figure. Quiet on purpose — it qualifies the number
   above it and must never compete with it for attention. Contrast is checked
   against the panel ink rather than assumed: s116's whole lesson was a colour
   that was correct and never applied. */
.cg-quick-stat-note { font-size: 11px; color: #9aa9aa; margin-top: 3px; }
.cg-quick-stat-note time { border-bottom: 1px dotted rgba(154,169,170,.45); }

/* Section 10 — Review score card */
.cg-review-score-card {
  background: #1c1b1c; padding: 32px; border-radius: 8px;
  border: 1px solid rgba(59,73,75,0.05);
}
.cg-score-display {
  font-family: var(--font-headline); font-size: 96px; font-weight: 800;
  color: #00dbe9; letter-spacing: -0.05em; line-height: 1;
}
.cg-score-label { color: #b9cacb; font-size: 14px; margin-top: 4px; }
.cg-rating-bar-track { height: 6px; background: #0e0e0f; border-radius: 9999px; overflow: hidden; margin: 4px 0; }
.cg-rating-bar-fill { height: 100%; background: #7df4ff; border-radius: 9999px; }
.cg-rating-bar-label { font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: -0.025em; color: #b9cacb; }

/* Section 11 — Pros/Cons block */
.cg-pros-block {
  background: rgba(187,234,0,0.05); border-left: 4px solid #bbea00;
  padding: 24px; border-radius: 0 8px 8px 0;
}
.cg-pros-heading { color: #bbea00; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; font-size: 14px; display: flex; align-items: center; gap: 8px; margin-bottom: 12px; }
.cg-cons-block {
  background: rgba(147,0,10,0.05); border-left: 4px solid #ffb4ab;
  padding: 24px; border-radius: 0 8px 8px 0;
}
.cg-cons-heading { color: #ffb4ab; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; font-size: 14px; display: flex; align-items: center; gap: 8px; margin-bottom: 12px; }

/* Section 12 — Tab navigation */
.cg-tab-nav {
  position: sticky; top: var(--cg-hd); z-index: 30;
  padding: 0 32px; background: #131314;
  border-bottom: 1px solid rgba(59,73,75,0.1);
  display: flex; gap: 32px;
}
.cg-tab-nav a { padding: 16px 0; font-size: 14px; font-weight: 500; color: #b9cacb; display: block; }
.cg-tab-nav a:hover { color: #e5e2e3; transition: color 150ms; }
.cg-tab-nav a.active { color: #00f0ff; font-weight: 700; border-bottom: 2px solid #00f0ff; }

/* Section 13 — Form/input patterns */
.cg-search-input {
  background: #0e0e0f; border: none;
  box-shadow: 0 0 0 1px rgba(59,73,75,0.3);
  border-radius: 9999px; padding: 12px 24px 12px 40px;
  color: #e5e2e3; font-family: var(--font-body); font-size: 14px;
  width: 100%;
}
.cg-search-input:focus { outline: none; box-shadow: 0 0 0 2px #00dbe9; }
.cg-filter-btn {
  display: flex; align-items: center; gap: 8px; padding: 8px 16px;
  background: #201f20; border: 1px solid rgba(59,73,75,0.1);
  border-radius: 2px; font-size: 14px; cursor: pointer; color: #e5e2e3;
}
.cg-filter-btn:hover { border-color: rgba(0,240,255,0.3); }
.cg-filter-btn-label { font-size: 12px; text-transform: uppercase; color: #b9cacb; }

/* Section 14 — Data visualisation bars */
.cg-bar-track { width: 100%; background: #0e0e0f; height: 8px; border-radius: 9999px; overflow: hidden; }
.cg-bar-fill-cyan { background: #00f0ff; height: 100%; }
.cg-bar-fill-lime { background: #bbea00; height: 100%; }
.cg-bar-fill-purple { background: #cf5cff; height: 100%; }
.cg-bar-fill-error { background: #ffb4ab; height: 100%; }
.cg-sentiment-track { width: 100%; background: #353436; height: 8px; border-radius: 9999px; overflow: hidden; display: flex; }
.cg-sentiment-pos { background: #abd600; }
.cg-sentiment-neg { background: #ffb4ab; }

/* Bar chart (simulated flex bars) */
.cg-bar-chart-wrap { display: flex; align-items: flex-end; gap: 8px; }
.cg-bar { flex: 1; background: #1c1b1c; border-radius: 2px 2px 0 0; position: relative; }
.cg-bar.active { background: rgba(207,92,255,0.4); }
.cg-bar-hover-overlay { position: absolute; inset: 0; background: #cf5cff; opacity: 0.2; }
.cg-bar:hover .cg-bar-hover-overlay { opacity: 0.4; }

/* Section 15 — Grids */
.cg-metrics-grid { display: grid; grid-template-columns: 1fr; gap: 16px; }
@media (min-width: 768px) { .cg-metrics-grid { grid-template-columns: repeat(4, 1fr); } }
.cg-cards-grid-2 { display: grid; grid-template-columns: 1fr; gap: 24px; }
@media (min-width: 768px) { .cg-cards-grid-2 { grid-template-columns: repeat(2, 1fr); } }
.cg-cards-grid-3 { display: grid; grid-template-columns: 1fr; gap: 24px; }
@media (min-width: 768px) { .cg-cards-grid-3 { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1280px) { .cg-cards-grid-3 { grid-template-columns: repeat(3, 1fr); } }
.cg-cards-grid-4 { display: grid; grid-template-columns: 1fr; gap: 24px; }
@media (min-width: 640px) { .cg-cards-grid-4 { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1024px) { .cg-cards-grid-4 { grid-template-columns: repeat(4, 1fr); } }
.cg-content-area { padding: 32px; max-width: 1400px; margin: 0 auto; }

/* Section 16 — Scrollbar and utility */
.cg-custom-scrollbar::-webkit-scrollbar { width: 4px; }
.cg-custom-scrollbar::-webkit-scrollbar-track { background: #131314; }
.cg-custom-scrollbar::-webkit-scrollbar-thumb { background: #3b494b; }
.cg-section-heading { font-family: var(--font-headline); font-size: 30px; font-weight: 700; color: #e5e2e3; margin-bottom: 24px; }
.cg-muted { color: #b9cacb; }
.cg-accent-text { color: #00dbe9; }
.cg-error-state { color: #b9cacb; font-size: 14px; font-style: italic; }

/* Community thread article */
.cg-thread-article {
  background: #1c1b1c; border-radius: 8px; padding: 24px;
  border-left: 2px solid transparent;
}
.cg-thread-article.active { border-left-color: #00dbe9; }
.cg-thread-article:hover { background: rgba(28,27,28,0.8); }
.cg-thread-avatar { width: 48px; height: 48px; border-radius: 9999px; }
.cg-thread-avatar.active { box-shadow: 0 0 0 2px rgba(0,240,255,0.2); }
.cg-thread-username { font-weight: 700; color: #e5e2e3; }
.cg-thread-timestamp { font-size: 12px; color: rgba(185,202,203,0.6); }
.cg-thread-badge { background: rgba(207,92,255,0.1); color: #ecb2ff; font-size: 10px; text-transform: uppercase; padding: 2px 6px; border-radius: 2px; }
.cg-reply-indent { padding-left: 32px; border-left: 1px solid rgba(59,73,75,0.2); }
.cg-reply-avatar { width: 32px; height: 32px; border-radius: 9999px; }

/* Pagination */
.cg-pagination { display: flex; align-items: center; gap: 8px; }
.cg-pagination-btn { padding: 8px 12px; border-radius: 2px; font-size: 14px; cursor: pointer; border: none; transition: all 150ms ease; }
.cg-pagination-btn.active { background: #00f0ff; color: #006970; font-weight: 700; }
.cg-pagination-btn.inactive { color: #b9cacb; background: transparent; }
.cg-pagination-btn.inactive:hover { color: #e5e2e3; }

/* Investment thesis blockquote */
.cg-thesis { border-left: 4px solid #00dbe9; padding-left: 24px; font-style: italic; color: #b9cacb; font-size: 18px; }

/* Responsive: collapse sidebar below lg */
@media (max-width: 1023px) {
  .cg-sidebar { display: none; }
  .cg-main { margin-left: 0; }
}

/* === Phase 8: Submit Form (EXT-02) === */
.cg-submit-content {
  max-width: 800px;
  margin: 0 auto;
  padding: 48px 32px;
}
.cg-form-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
}
@media (max-width: 767px) {
  .cg-form-grid { grid-template-columns: 1fr; }
}
.cg-form-label {
  display: block;
  font-family: var(--font-label);
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: #b9cacb;
  margin-bottom: 8px;
}
.cg-form-input {
  width: 100%;
  height: 48px;
  background: #0e0e0f !important;
  border: 1px solid rgba(59,73,75,0.2) !important;
  border-radius: 4px;
  color: #ffffff !important;
  -webkit-text-fill-color: #ffffff !important;
  font-family: var(--font-body);
  font-size: 14px;
  padding: 0 16px;
  box-sizing: border-box;
  transition: border-color 150ms ease;
  color-scheme: dark;
}
.cg-form-input:-webkit-autofill,
.cg-form-input:-webkit-autofill:hover,
.cg-form-input:-webkit-autofill:focus {
  -webkit-text-fill-color: #ffffff !important;
  -webkit-box-shadow: 0 0 0 1000px #0e0e0f inset !important;
  box-shadow: 0 0 0 1000px #0e0e0f inset !important;
}
.cg-form-input option {
  background: #0e0e0f;
  color: #ffffff;
}
.cg-form-input:focus {
  outline: none;
  border-color: #00dbe9;
  box-shadow: 0 0 0 2px rgba(0,219,233,0.15);
}
.cg-form-input.error {
  border-color: #ffb4ab;
}
.cg-form-textarea {
  height: auto;
  min-height: 120px;
  padding: 12px 16px;
  resize: vertical;
}
.cg-form-error {
  font-size: 12px;
  font-weight: 700;
  color: #ffb4ab;
  margin-top: 4px;
}
.cg-form-upload {
  border: 2px dashed rgba(59,73,75,0.4);
  border-radius: 8px;
  padding: 32px;
  text-align: center;
  cursor: pointer;
  transition: border-color 150ms ease;
}
.cg-form-upload:hover {
  border-color: #00dbe9;
}
.cg-form-footer {
  display: flex;
  justify-content: flex-end;
  gap: 16px;
  margin-top: 32px;
  padding-top: 32px;
  border-top: 1px solid rgba(59,73,75,0.1);
}
@media (max-width: 767px) {
  .cg-submit-content { padding: 24px 16px; }
  .cg-form-footer {
    flex-direction: column;
  }
  .cg-form-footer button { width: 100%; }
}
.cg-submit-tab {
  background: none;
  border: none;
  border-bottom: 2px solid transparent;
  color: #b9cacb;
  font-family: var(--font-label);
  font-size: 14px;
  font-weight: 700;
  padding: 8px 4px 12px;
  cursor: pointer;
  transition: color 150ms ease, border-color 150ms ease;
}
.cg-submit-tab:hover { color: #e5e2e3; }
.cg-submit-tab.active {
  color: #00dbe9;
  border-bottom-color: #00dbe9;
}


/* =============================================================================
   Section 19 — /games/ Sidebar + Hero Layout (v2)
   Design contract: games-redesign-preview.html + scripts/build_games_preview.py.
   Source of truth: scripts/build_games_preview.py (the approved preview).
   ============================================================================= */

/* Break out of the Foxiz-theme container chrome: the outer .cg-content-area
   has padding + max-width that gives the /games/ page a "boxed" look against
   the body background. On archive-dapp pages, dissolve that chrome entirely
   so Hero → genre chips → card grid read as one seamless page. */
body.cg-layout--games-archive main.cg-main,
body.cg-layout--games-archive .cg-content-area{
  background: #07080c;
  max-width: 100%;
  padding-left: 0;
  padding-right: 0;
  padding-top: 0;
}
body.cg-layout--games-archive{ background: #07080c; }

.cg-games-page-v2{
  --cg-gp-bg: #07080c;
  --cg-gp-elev: #0f1219;
  --cg-gp-card: #141823;
  --cg-gp-hover: #1a1f2e;
  --cg-gp-border: #1f2433;
  --cg-gp-border-strong: #2a3144;
  --cg-gp-text: #ecedf3;
  --cg-gp-text-dim: #8a90a5;
  --cg-gp-text-faint: #5d6378;
  --cg-gp-accent: #ff6a00;
  --cg-gp-accent-hover: #ff8533;
  --cg-gp-radius: 12px;
  --cg-gp-radius-sm: 8px;
  --cg-gp-shell: 1320px;

  color: var(--cg-gp-text);
  background: var(--cg-gp-bg);
  font-family: 'Inter', -apple-system, sans-serif;
  line-height: 1.5;
  min-height: 100vh;
}
.cg-games-page-v2 *, .cg-games-page-v2 *::before, .cg-games-page-v2 *::after{ box-sizing: border-box; }
.cg-games-page-v2 a{ color: inherit; text-decoration: none; }
.cg-games-page-v2 button{ font-family: inherit; }

.cg-games-page-v2 .cg-shell{ max-width: var(--cg-gp-shell); margin: 0 auto; padding: 0 24px; }

/* ---------- Zone 1 — HERO ---------- */
.cg-games-page-v2 .cg-hero{
  position: relative;
  min-height: 360px;
  overflow: hidden;
  background:
    radial-gradient(ellipse at 20% 20%, rgba(255,106,0,0.16), transparent 55%),
    radial-gradient(ellipse at 80% 80%, rgba(123,58,237,0.10), transparent 60%),
    linear-gradient(180deg, #0a0c13, #07080c);
}
.cg-games-page-v2 .cg-hero-art{
  position: absolute; inset: 0;
  display: grid;
  grid-template-columns: repeat(6, 1fr);
  grid-template-rows: 1fr;
  opacity: 0.22;
  filter: saturate(1.1);
  pointer-events: none;
}
.cg-games-page-v2 .cg-hero-art > div{
  background-size: cover;
  background-position: center;
  transform: skewX(-6deg) translateX(-10px);
  margin-left: -6px;
  border-right: 1px solid rgba(255,255,255,0.03);
}
/* Smooth fade: hero mosaic → page background, no visible seam into the grid. */
.cg-games-page-v2 .cg-hero::after{
  content: '';
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(7,8,12,0.05) 0%, rgba(7,8,12,0.55) 55%, #07080c 100%);
  pointer-events: none;
}
.cg-games-page-v2 .cg-hero-inner{
  position: relative;
  min-height: 360px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 14px;
  /* s249: the bar's clearance, only where the bar is. */
  padding: calc(var(--cg-hd-pad) + 40px) 24px 40px;
  max-width: var(--cg-gp-shell);
  margin: 0 auto;
  z-index: 1;
}
/* Small transparent genre chips — docked inside the hero, underneath the title. */
.cg-games-page-v2 .cg-hero-chips{
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 10px;
}
.cg-games-page-v2 .cg-hero-chip{
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  background: rgba(255,255,255,0.06);
  border: 1px solid rgba(255,255,255,0.12);
  border-radius: 999px;
  color: #e5e7f0;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.02em;
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  cursor: pointer;
  transition: background .15s, border-color .15s, color .15s, transform .15s;
  font-family: inherit;
  /* These became <a> when they were given the curated page as an href. A button
     never needed this; an anchor inherits the theme's underline. */
  text-decoration: none;
}
.cg-games-page-v2 .cg-hero-chip .material-symbols-outlined{ font-size: 15px; opacity: .85; }
.cg-games-page-v2 .cg-hero-chip:hover{
  background: rgba(255,255,255,0.11);
  border-color: rgba(255,255,255,0.24);
  color: #fff;
  transform: translateY(-1px);
}
.cg-games-page-v2 .cg-hero-chip.is-active{
  background: rgba(255,106,0,0.18);
  border-color: var(--cg-gp-accent);
  color: #fff;
  box-shadow: 0 0 0 1px var(--cg-gp-accent) inset;
}
.cg-games-page-v2 .cg-hero-chip.is-active .material-symbols-outlined{ color: #ffb180; opacity: 1; }
.cg-games-page-v2 .cg-hero-breadcrumb{
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--cg-gp-text-dim);
}
.cg-games-page-v2 .cg-hero-breadcrumb .material-symbols-outlined{ font-size: 14px; opacity: 0.6; }
.cg-games-page-v2 .cg-hero-breadcrumb a:hover{ color: var(--cg-gp-accent); }
.cg-games-page-v2 .cg-hero-title{
  font-family: 'Space Grotesk', sans-serif;
  font-weight: 700;
  font-size: clamp(36px, 6vw, 72px);
  line-height: 1.02;
  letter-spacing: -0.03em;
  margin: 0;
  background: linear-gradient(135deg, #fff 0%, #a0a6bd 100%);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}
.cg-games-page-v2 .cg-hero-title em{
  font-style: normal;
  background: linear-gradient(135deg, #ff8533 0%, #ff6a00 100%);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
  background-clip: text;
}
.cg-games-page-v2 .cg-hero-sub{
  max-width: 620px;
  font-size: 15px;
  color: var(--cg-gp-text-dim);
  margin: 0;
}

/* ---------- Zone 2 — (removed) GENRE STRIP; genre chips now live in Hero ---------- */
.cg-games-page-v2 .cg-genre-strip-wrap{ display: none; }
.cg-games-page-v2 .cg-genre-strip-wrap-legacy-keep{ padding: 28px 0 12px; }
.cg-games-page-v2 .cg-section-heading{
  display: flex;
  align-items: center;
  justify-content: space-between;
  font-family: 'Space Grotesk', sans-serif;
  font-size: 13px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: var(--cg-gp-text-dim);
  margin: 0 0 14px;
}
.cg-games-page-v2 .cg-section-heading span:first-child::before{
  content: '';
  display: inline-block;
  width: 3px; height: 12px;
  background: var(--cg-gp-accent);
  margin-right: 10px;
  vertical-align: -1px;
  border-radius: 1px;
}
.cg-games-page-v2 .cg-strip-nav{ display: inline-flex; gap: 6px; }
.cg-games-page-v2 .cg-strip-arrow{
  width: 32px; height: 32px;
  border-radius: 50%;
  background: var(--cg-gp-elev);
  border: 1px solid var(--cg-gp-border);
  color: var(--cg-gp-text-dim);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: all .15s;
}
.cg-games-page-v2 .cg-strip-arrow:hover{
  color: var(--cg-gp-accent);
  border-color: var(--cg-gp-accent);
  background: rgba(255,106,0,0.08);
}
.cg-games-page-v2 .cg-strip-arrow .material-symbols-outlined{ font-size: 18px; }

.cg-games-page-v2 .cg-genre-strip{
  display: flex;
  gap: 12px;
  overflow-x: auto;
  padding-bottom: 8px;
  scroll-snap-type: x mandatory;
  scrollbar-width: thin;
  scrollbar-color: var(--cg-gp-border-strong) transparent;
}
.cg-games-page-v2 .cg-genre-strip::-webkit-scrollbar{ height: 6px; }
.cg-games-page-v2 .cg-genre-strip::-webkit-scrollbar-track{ background: transparent; }
.cg-games-page-v2 .cg-genre-strip::-webkit-scrollbar-thumb{ background: var(--cg-gp-border-strong); border-radius: 3px; }

.cg-games-page-v2 .cg-genre-tile-v2{
  position: relative;
  flex: 0 0 280px;
  height: 105px;
  border-radius: var(--cg-gp-radius);
  overflow: hidden;
  scroll-snap-align: start;
  cursor: pointer;
  border: 1px solid var(--cg-gp-border);
  transition: transform .2s, border-color .2s, box-shadow .2s;
  background: #1a1d29;
}
.cg-games-page-v2 .cg-genre-tile-v2:hover{
  transform: translateY(-3px);
  border-color: var(--cg-gp-accent);
  box-shadow: 0 8px 24px rgba(255,106,0,0.18);
}
.cg-games-page-v2 .cg-genre-tile-img{
  position: absolute;
  inset: 0;
  background-size: cover;
  background-position: center;
  transition: transform .4s;
}
.cg-games-page-v2 .cg-genre-tile-v2:hover .cg-genre-tile-img{ transform: scale(1.06); }
.cg-games-page-v2 .cg-genre-tile-overlay{
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(7,8,12,0.05) 0%, rgba(7,8,12,0.85) 100%);
}
.cg-games-page-v2 .cg-genre-tile-label{
  position: absolute;
  bottom: 10px;
  left: 12px;
  right: 12px;
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 8px;
}
.cg-games-page-v2 .cg-genre-tile-name{
  font-family: 'Space Grotesk', sans-serif;
  font-size: 18px;
  font-weight: 700;
  color: #fff;
  letter-spacing: -0.01em;
  text-shadow: 0 2px 8px rgba(0,0,0,0.6);
}
.cg-games-page-v2 .cg-genre-tile-count{
  font-size: 11px;
  font-weight: 600;
  color: rgba(255,255,255,0.85);
  padding: 2px 7px;
  background: rgba(0,0,0,0.45);
  backdrop-filter: blur(6px);
  border-radius: 10px;
  letter-spacing: 0.02em;
}
.cg-games-page-v2 .cg-genre-tile-v2.is-active{
  border-color: var(--cg-gp-accent);
  box-shadow: 0 0 0 1px var(--cg-gp-accent), 0 6px 18px rgba(255,106,0,0.22);
}
.cg-games-page-v2 .cg-genre-tile-v2.is-active .cg-genre-tile-overlay{
  background: linear-gradient(180deg, rgba(255,106,0,0.18) 0%, rgba(7,8,12,0.75) 100%);
}

/* ---------- Zone 3 — TOGGLE CHIP BAR ---------- */
.cg-games-page-v2 .cg-chip-bar{
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 22px 0 18px;
  flex-wrap: nowrap;
  overflow-x: auto;
  scrollbar-width: none;
  border-bottom: 1px solid var(--cg-gp-border);
  margin-bottom: 24px;
}
.cg-games-page-v2 .cg-chip-toggle-icon{
  font-size: 16px !important;
  opacity: .85;
}
.cg-games-page-v2 .cg-chip-toggle-active .cg-chip-toggle-icon{
  color: #ffb180; opacity: 1;
}
.cg-games-page-v2 .cg-chip-bar::-webkit-scrollbar{ display: none; }
.cg-games-page-v2 .cg-chip-toggle{
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 9px 14px;
  background: var(--cg-gp-elev);
  border: 1px solid var(--cg-gp-border);
  border-radius: 999px;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--cg-gp-text-dim);
  cursor: pointer;
  transition: all .15s;
}
.cg-games-page-v2 .cg-chip-toggle:hover{
  color: var(--cg-gp-text);
  border-color: var(--cg-gp-border-strong);
  background: var(--cg-gp-hover);
}
.cg-games-page-v2 .cg-chip-toggle-active{
  color: #fff;
  border-color: var(--cg-gp-accent);
  background: linear-gradient(135deg, rgba(255,106,0,0.22), rgba(255,106,0,0.08));
  box-shadow: 0 0 0 1px var(--cg-gp-accent) inset;
}
.cg-games-page-v2 .cg-chip-toggle-active::before{
  content: '✓';
  font-size: 11px;
  font-weight: 800;
}

.cg-games-page-v2 .cg-chip-bar-spacer{ flex: 1; }
.cg-games-page-v2 .cg-sort-pill{
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 9px 14px;
  background: var(--cg-gp-elev);
  border: 1px solid var(--cg-gp-border);
  border-radius: 999px;
  color: var(--cg-gp-text);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  cursor: pointer;
}
.cg-games-page-v2 .cg-sort-pill .material-symbols-outlined{ font-size: 16px; opacity: 0.75; }
.cg-games-page-v2 .cg-sort-pill strong{ color: var(--cg-gp-accent); font-weight: 700; }

/* ---------- Zone 4 — SIDEBAR + MAIN ----------
 * Visual language matches games.gg/games — semi-transparent dark surface,
 * sentence-case section headers, row state shown by background tint
 * (no visible checkbox square), inline "Show More" link in the header row.
 */
.cg-games-page-v2 .cg-layout-split{
  display: grid;
  grid-template-columns: 288px 1fr;
  gap: 28px;
  padding-bottom: 48px;
}
.cg-games-page-v2 .cg-sidebar{
  position: sticky;
  top: 16px;
  align-self: start;
  max-height: calc(100vh - 32px);
  overflow-y: auto;
  padding: 16px 12px 20px;
  background: rgba(15,18,25,.92);
  border: 1px solid rgba(255,255,255,0.04);
  border-radius: var(--cg-gp-radius);
  scrollbar-width: thin;
  scrollbar-color: var(--cg-gp-border-strong) transparent;
}
.cg-games-page-v2 .cg-sidebar::-webkit-scrollbar{ width: 6px; }
.cg-games-page-v2 .cg-sidebar::-webkit-scrollbar-thumb{ background: var(--cg-gp-border-strong); border-radius: 3px; }

.cg-games-page-v2 .cg-sidebar-search{
  position: relative;
  margin-bottom: 24px;
}
.cg-games-page-v2 .cg-sidebar-search .material-symbols-outlined{
  position: absolute;
  left: 12px;
  top: 50%;
  transform: translateY(-50%);
  color: var(--cg-gp-text-dim);
  font-size: 18px;
  pointer-events: none;
}
.cg-games-page-v2 .cg-sidebar-search input{
  width: 100%;
  padding: 12px 12px 12px 38px;
  background: var(--cg-gp-card);
  border: 1px solid rgba(74,82,96,0.6);
  border-radius: 6px;
  color: var(--cg-gp-text);
  font-size: 14px;
  font-weight: 500;
  font-family: inherit;
  transition: border-color .2s, background .2s;
}
.cg-games-page-v2 .cg-sidebar-search input:focus{
  outline: none;
  border-color: rgba(255,255,255,0.22);
}
.cg-games-page-v2 .cg-sidebar-search input::placeholder{ color: var(--cg-gp-text-dim); }

.cg-games-page-v2 .cg-sidebar-section{ margin-bottom: 24px; }
.cg-games-page-v2 .cg-sidebar-section:last-child{ margin-bottom: 0; }
.cg-games-page-v2 .cg-sidebar-section-head{
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 8px 6px;
  cursor: pointer;
  user-select: none;
}
.cg-games-page-v2 .cg-sidebar-section-head h3{
  margin: 0;
  font-family: inherit;
  font-size: 16px;
  font-weight: 600;
  line-height: 24px;
  letter-spacing: 0;
  text-transform: none;
  color: var(--cg-gp-text);
}
/* Section icon + chevron retired — kept as no-op selectors so any leftover
   markup in cached bundles doesn't render an orphan empty span. */
.cg-games-page-v2 .cg-sidebar-section-icon{ display: none; }
.cg-games-page-v2 .cg-sidebar-section-head > .material-symbols-outlined{ display: none; }

.cg-games-page-v2 .cg-sidebar-row-icon{
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 18px; height: 18px;
  flex-shrink: 0;
  color: var(--cg-gp-text-dim);
}
.cg-games-page-v2 .cg-sidebar-row-icon .material-symbols-outlined{
  font-size: 16px;
}
.cg-games-page-v2 .cg-sidebar-list-item.is-checked .cg-sidebar-row-icon{ color: var(--cg-gp-text); }
.cg-games-page-v2 .cg-sidebar-section.is-collapsed .cg-sidebar-list,
.cg-games-page-v2 .cg-sidebar-section.is-collapsed .cg-sidebar-showmore,
.cg-games-page-v2 .cg-sidebar-section.is-collapsed .cg-rating-slider-wrap{ display: none; }

.cg-games-page-v2 .cg-sidebar-list{
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 4px 0 0;
  margin: 0;
  list-style: none;
}
.cg-games-page-v2 .cg-sidebar-list-item{
  display: flex;
  align-items: center;
  gap: 10px;
  height: 36px;
  padding: 0 10px;
  border-radius: 6px;
  cursor: pointer;
  color: var(--cg-gp-text-dim);
  font-size: 14px;
  font-weight: 500;
  transition: background .2s, color .2s;
}
.cg-games-page-v2 .cg-sidebar-list-item:hover{
  background: rgba(31,41,55,0.32);
  color: var(--cg-gp-text);
}
.cg-games-page-v2 .cg-sidebar-list-item.is-checked{
  background: rgba(31,41,55,0.7);
  color: var(--cg-gp-text);
}
.cg-games-page-v2 .cg-sidebar-list-item.is-checked:hover{
  background: rgba(31,41,55,0.78);
}
/* Row state is conveyed by the bg tint — the literal checkbox square is hidden. */
.cg-games-page-v2 .cg-sidebar-list-item input[type="checkbox"]{
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0,0,0,0);
  white-space: nowrap; border: 0;
}
.cg-games-page-v2 .cg-sidebar-list-label{ flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cg-games-page-v2 .cg-sidebar-count{
  font-size: 12px;
  font-weight: 500;
  color: var(--cg-gp-text-dim);
  font-variant-numeric: tabular-nums;
  transition: color .2s;
}
.cg-games-page-v2 .cg-sidebar-list-item.is-checked .cg-sidebar-count{ color: var(--cg-gp-accent); }

/* "Show More" lives inside the section-head action slot — small text link, no chrome. */
.cg-games-page-v2 .cg-sidebar-section-action{
  display: inline-flex;
  align-items: center;
}
.cg-games-page-v2 .cg-sidebar-showmore{
  background: none;
  border: none;
  color: var(--cg-gp-accent);
  font-size: 13px;
  font-weight: 500;
  cursor: pointer;
  padding: 0;
  margin: 0;
  font-family: inherit;
  line-height: 24px;
}
.cg-games-page-v2 .cg-sidebar-showmore:hover{ color: var(--cg-gp-accent-hover); }

.cg-games-page-v2 .cg-rating-slider-wrap{
  padding: 10px 4px 4px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.cg-games-page-v2 .cg-rating-slider-values{
  display: flex;
  justify-content: space-between;
  font-size: 11px;
  color: var(--cg-gp-text-faint);
  font-variant-numeric: tabular-nums;
}
.cg-games-page-v2 .cg-rating-slider-values strong{ color: var(--cg-gp-accent); font-weight: 700; font-size: 13px; }
.cg-games-page-v2 .cg-rating-slider{
  -webkit-appearance: none;
  width: 100%;
  height: 4px;
  background: var(--cg-gp-border);
  border-radius: 2px;
  outline: none;
}
.cg-games-page-v2 .cg-rating-slider::-webkit-slider-thumb{
  -webkit-appearance: none;
  width: 16px; height: 16px;
  border-radius: 50%;
  background: var(--cg-gp-accent);
  cursor: pointer;
  border: 2px solid var(--cg-gp-bg);
  box-shadow: 0 0 0 1px var(--cg-gp-accent);
}

.cg-games-page-v2 .cg-main{ min-width: 0; }
.cg-games-page-v2 .cg-stats-row{
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  margin-bottom: 16px;
}
.cg-games-page-v2 .cg-stats-title{
  font-family: 'Space Grotesk', sans-serif;
  font-size: 20px;
  font-weight: 700;
  margin: 0;
  letter-spacing: -0.01em;
}
.cg-games-page-v2 .cg-stats-count{
  color: var(--cg-gp-text-dim);
  font-size: 13px;
}
.cg-games-page-v2 .cg-stats-count strong{
  color: var(--cg-gp-accent);
  font-weight: 700;
  font-size: 14px;
}

.cg-games-page-v2 .cg-active-filters{
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 18px;
  min-height: 28px;
  align-items: center;
}
.cg-games-page-v2 .cg-active-chip{
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 4px 6px 4px 10px;
  background: var(--cg-gp-card);
  border: 1px solid var(--cg-gp-border-strong);
  border-radius: 20px;
  font-size: 12px;
}
.cg-games-page-v2 .cg-active-chip-key{ color: var(--cg-gp-text-faint); margin-right: 4px; font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em; }
.cg-games-page-v2 .cg-active-chip button{
  background: none;
  border: none;
  color: var(--cg-gp-text-dim);
  cursor: pointer;
  padding: 2px;
  border-radius: 50%;
  display: inline-flex;
}
.cg-games-page-v2 .cg-active-chip button:hover{ color: #ef4444; background: rgba(239,68,68,0.12); }
.cg-games-page-v2 .cg-active-chip .material-symbols-outlined{ font-size: 14px; }
.cg-games-page-v2 .cg-active-chip-clear{
  background: none;
  border: none;
  color: var(--cg-gp-accent);
  font-size: 12px;
  font-weight: 600;
  cursor: pointer;
  padding: 4px 8px;
  font-family: inherit;
  margin-left: auto;
}

/* Card grid */
.cg-games-page-v2 .cg-card-grid{
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 16px;
  margin-bottom: 32px;
}
.cg-games-page-v2 .cg-game-card{
  background: var(--cg-gp-card);
  border: 1px solid var(--cg-gp-border);
  border-radius: var(--cg-gp-radius);
  overflow: hidden;
  display: flex;
  flex-direction: column;
  transition: border-color .2s, transform .2s, box-shadow .2s;
  position: relative;
  cursor: pointer;
}
.cg-games-page-v2 .cg-game-card:hover{
  border-color: var(--cg-gp-accent);
  transform: translateY(-3px);
  box-shadow: 0 10px 32px rgba(255,106,0,0.14);
}
.cg-games-page-v2 .cg-card-cover{
  position: relative;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background: linear-gradient(135deg, #1f2433, #0f1219);
}
.cg-games-page-v2 .cg-card-cover-img{
  width: 100%; height: 100%;
  background-size: cover;
  background-position: center;
  transition: transform .4s;
}
.cg-games-page-v2 .cg-game-card:hover .cg-card-cover-img{ transform: scale(1.05); }

/* The React card renders a bare <img>, so the rule above (written for the old
   background-image div) never applied: the image kept its intrinsic size and a
   150×150 logo left a black gap down the right of a 16:9 card. Size the element
   itself, and match on the tag so no future markup change can silently undo it. */
.cg-games-page-v2 .cg-card-cover > img{
  display: block;
  width: 100%; height: 100%;
  object-fit: cover;
  object-position: center;
  transition: transform .4s;
}
.cg-games-page-v2 .cg-game-card:hover .cg-card-cover > img{ transform: scale(1.05); }

/* Logo-only games (most of the catalog) must not be stretched to fill: show the
   logo at its own proportions, centred, over a blurred copy of itself so the
   card still reads as full-bleed. */
.cg-games-page-v2 .cg-card-cover--logo{
  display: flex; align-items: center; justify-content: center;
}
.cg-games-page-v2 .cg-card-cover--logo::before{
  content: '';
  position: absolute; inset: -20%;
  background-image: inherit;
  background-size: cover;
  background-position: center;
  filter: blur(18px) saturate(1.25) brightness(.55);
  transform: scale(1.1);
}
.cg-games-page-v2 .cg-card-cover--logo > img{
  position: relative;
  width: auto; height: 78%;
  max-width: 78%;
  object-fit: contain;
  filter: drop-shadow(0 4px 14px rgba(0,0,0,.55));
}

/* Same problem, same answer, on the single-game hero: a 150px logo blown up to
   978×500 was the blur the owner reported. Blur it on purpose instead, on a
   layer beneath the title rather than on the section (which would blur text). */
.cg-hero-game--logo::before{
  content: '';
  position: absolute; inset: 0;
  backdrop-filter: blur(26px) saturate(1.2);
  -webkit-backdrop-filter: blur(26px) saturate(1.2);
  background: rgba(19,19,20,0.25);
  z-index: 0;
}
.cg-hero-game--logo .cg-hero-overlay,
.cg-hero-game--logo .cg-hero-content{ z-index: 1; }

.cg-games-page-v2 .cg-status-badge{
  position: absolute;
  top: 10px; left: 10px;
  padding: 3px 8px;
  border-radius: 4px;
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  backdrop-filter: blur(8px);
  display: inline-flex;
  align-items: center;
  gap: 4px;
}
.cg-games-page-v2 .cg-status-badge::before{
  content: '';
  width: 6px; height: 6px;
  border-radius: 50%;
  background: currentColor;
}
.cg-games-page-v2 .cg-status-live{ background: rgba(34,197,94,0.22);  color: #6ee7a0; }
.cg-games-page-v2 .cg-status-beta{ background: rgba(59,130,246,0.22); color: #93c5fd; }
.cg-games-page-v2 .cg-status-alpha{ background: rgba(168,85,247,0.22); color: #d8b4fe; }
.cg-games-page-v2 .cg-status-dev{ background: rgba(107,114,128,0.28); color: #b4bac8; }
.cg-games-page-v2 .cg-status-presale{ background: rgba(245,158,11,0.22); color: #fcd34d; }

/* Dead — deliberately the loudest badge on the card. A visitor scanning the
   grid has to be able to tell at a glance that this one is not worth a click,
   so it reads red and sits full-strength while the rest of the card fades. */
.cg-games-page-v2 .cg-status-dead{ background: rgba(220,38,38,0.28); color: #fca5a5; }

/* Delisted — an editorial exclusion, not a verdict about the game. Deliberately
   NOT red: red says "this is broken", and these are usually live businesses we
   simply do not list. Slate reads as "not applicable here" without making a
   claim about them. The card still fades, because it still is not clickable. */
.cg-games-page-v2 .cg-status-delisted{ background: rgba(100,116,139,0.30); color: #cbd5e1; }
.cg-games-page-v2 .cg-game-card--dead .cg-card-cover img{ filter: grayscale(1); opacity: 0.55; }
.cg-games-page-v2 .cg-game-card--dead .cg-card-title,
.cg-games-page-v2 .cg-game-card--dead .cg-card-desc{ opacity: 0.7; }
.cg-games-page-v2 .cg-game-card--dead:hover .cg-card-cover img{ opacity: 0.7; }

/* Upcoming — amber, and deliberately NOT paired with the card fade above. A
   game still in development is worth a click; a dead one is not. */
.cg-games-page-v2 .cg-status-upcoming{ background: rgba(217,119,6,0.28); color: #fcd34d; }

/* Static crawler-facing card (Dapp::php_fallback_dapps_list). */
.dapp-dead-label{
  display: inline-block;
  margin-top: 4px;
  padding: 2px 7px;
  border-radius: 4px;
  background: rgba(220,38,38,0.28);
  color: #fca5a5;
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
}

/* Upcoming — same shape as the dead badge so the eye reads them as one family,
   amber rather than red because "not yet" is not "never". */
.dapp-upcoming-label{
  display: inline-block;
  margin-top: 4px;
  padding: 2px 7px;
  border-radius: 4px;
  background: rgba(217,119,6,0.28);
  color: #fcd34d;
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
}

/* The catalogue's own position and score, on the crawler-facing card
   (Dapp::php_fallback_dapps_list). s207 found the list correctly rank-ordered
   and the ordering invisible — no badge, no number, no sort control in the
   HTML. Same shape as the two labels above so the eye reads all three as one
   family; the brand cyan rather than a status colour, because a position is
   not a warning.

   ⚠️ NO `position: absolute` HERE. `.cg-rating-badge` below can be positioned
   because `.cg-games-page-v2` gives it a positioned ancestor; `.dapp-card-static`
   has no CSS of its own at all — it is a bare div that React replaces — so an
   absolutely positioned child would escape it and land on the page. Inline
   flow is what this markup can actually support. */
.dapp-rank-badge{
  display: inline-flex;
  align-items: center;
  gap: 5px;
  margin-bottom: 4px;
  padding: 2px 7px;
  border-radius: 4px;
  background: rgba(0,219,233,0.16);
  color: #00dbe9;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.04em;
}

/* The score, separated from the position by a rule rather than by a middot so
   the two numbers cannot be misread as one. */
.dapp-rank-score{
  padding-left: 5px;
  border-left: 1px solid rgba(0,219,233,0.4);
  color: #e5e2e3;
  font-weight: 700;
}

.cg-games-page-v2 .cg-rating-badge{
  position: absolute;
  top: 10px; right: 10px;
  background: rgba(0,0,0,0.7);
  backdrop-filter: blur(8px);
  padding: 3px 7px;
  border-radius: 4px;
  font-size: 11px;
  font-weight: 700;
  display: inline-flex;
  align-items: center;
  gap: 3px;
  color: #fbbf24;
}
.cg-games-page-v2 .cg-rating-badge .material-symbols-outlined{
  font-size: 12px;
  font-variation-settings: 'FILL' 1;
}
/* Rank + movement. Bottom-LEFT is the only free corner on the cover: status
   holds top-left, rating top-right, the chain stack bottom-right. */
.cg-games-page-v2 .cg-rank-badge{
  position: absolute;
  bottom: 10px; left: 10px;
  background: rgba(0,0,0,0.7);
  backdrop-filter: blur(8px);
  padding: 3px 7px;
  border-radius: 4px;
  font-size: 11px;
  font-weight: 700;
  color: #e5e7eb;
  display: inline-flex;
  align-items: center;
  gap: 2px;
  font-variant-numeric: tabular-nums;
}
/* The score beside the position, on the React card. Mirrors .dapp-rank-score
   on the SSR card: a rule rather than a middot, so the two numbers cannot be
   misread as one. Only rendered when it rounds to 1 or more — see GameCard. */
.cg-games-page-v2 .cg-rank-score{
  padding-left: 5px;
  border-left: 1px solid rgba(229,231,235,0.4);
  font-weight: 700;
}

/* Token market cap, shown only when the list is ORDERED by it (GameCard's
   `showMcap`). It takes the same bottom-left corner as the rank badge on
   purpose: the two are mutually exclusive by construction — `showRank` is the
   `rank` sort and `showMcap` is the `market_cap` sort — so they can never
   collide, and a visitor finds the sorted-by figure in one fixed place.
   ⭐ It states its own `color`. A bare inherited ink is how the whole FAQ block
   stayed invisible for fifteen sessions: Foxiz's main.css carries the same bare
   `body` selector and loads after ours (session 116). */
.cg-games-page-v2 .cg-mcap-badge{
  position: absolute;
  bottom: 10px; left: 10px;
  background: rgba(0,0,0,0.7);
  backdrop-filter: blur(8px);
  padding: 3px 7px;
  border-radius: 4px;
  font-size: 11px;
  font-weight: 700;
  color: #e5e7eb;
  display: inline-flex;
  align-items: center;
  gap: 2px;
  font-variant-numeric: tabular-nums;
}
/* NFT owners, shown only when the list is ORDERED by it (GameCard's `showNft`).
   Third occupant of the same bottom-left corner, and still mutually exclusive
   by construction: each of the three is tied to a different sort.
   ⭐ States its own `color` for the session-116 reason — Foxiz's main.css
   carries a bare `body` selector and loads after ours. */
.cg-games-page-v2 .cg-nft-badge{
  position: absolute;
  bottom: 10px; left: 10px;
  background: rgba(0,0,0,0.7);
  backdrop-filter: blur(8px);
  padding: 3px 7px;
  border-radius: 4px;
  font-size: 11px;
  font-weight: 700;
  color: #e5e7eb;
  display: inline-flex;
  align-items: center;
  gap: 3px;
  font-variant-numeric: tabular-nums;
}
.cg-games-page-v2 .cg-nft-badge .material-symbols-outlined{
  font-size: 13px;
  line-height: 1;
}
/* ⭐⭐⭐ A HISTORICAL READING IS DIMMED AND DATED, NEVER REMOVED (his call,
   2026-08-10). Amber rather than grey: grey reads as "disabled", and this is a
   real measurement that simply stopped being refreshed. Contrast checked
   against the 70 %-black plate, not against the card. */
.cg-games-page-v2 .cg-nft-badge--historical{
  color: #fcd34d;
  border: 1px solid rgba(252,211,77,0.35);
}
/* ⚠️ THE CAPTION IS ON EVERY BADGE NOW, NOT ONLY THE STALE ONES, so it can no
   longer be assumed short. "UPDATED 22 MINUTES AGO" is wider than the card is
   on a two-column phone, and the badge is absolutely positioned with nothing on
   its right to stop it. Bounded and allowed to wrap onto its own line rather
   than truncated — a half-printed date is worse than a taller badge. */
.cg-games-page-v2 .cg-nft-badge{
  flex-wrap: wrap;
  max-width: calc(100% - 20px);
}
.cg-games-page-v2 .cg-nft-asof{
  font-size: 9px;
  font-weight: 600;
  letter-spacing: 0.02em;
  text-transform: uppercase;
  opacity: 0.85;
  margin-left: 1px;
}
/* The arrow is the thing being read at a glance, so it carries the colour and
   the rank stays neutral — two coloured numbers side by side and neither wins.
   Green up / red down, matching the price deltas elsewhere on the site. */
.cg-games-page-v2 .cg-rank-move{
  display: inline-flex;
  align-items: center;
  gap: 0;
  margin-left: 2px;
}
.cg-games-page-v2 .cg-rank-move--up{ color: #6ee7a0; }
.cg-games-page-v2 .cg-rank-move--down{ color: #fca5a5; }
.cg-games-page-v2 .cg-rank-move .material-symbols-outlined{
  font-size: 16px;
  /* The drop arrows carry their own generous padding; without this the badge
     grows ~4px taller than the rating badge opposite it and the two corners
     stop lining up. */
  margin: -4px -2px -4px -4px;
}

.cg-games-page-v2 .cg-chain-stack{
  position: absolute;
  bottom: 10px;
  right: 10px;
  display: flex;
}
.cg-games-page-v2 .cg-chain-icon{
  width: 22px; height: 22px;
  border-radius: 50%;
  border: 2px solid var(--cg-gp-card);
  background: #333;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 9px;
  font-weight: 700;
  color: #fff;
  margin-left: -6px;
}
.cg-games-page-v2 .cg-chain-icon:first-child{ margin-left: 0; }
.cg-games-page-v2 .cg-chain-eth{ background: linear-gradient(135deg, #627eea, #3c5ce0); }
.cg-games-page-v2 .cg-chain-sol{ background: linear-gradient(135deg, #9945ff, #14f195); }
.cg-games-page-v2 .cg-chain-poly{ background: linear-gradient(135deg, #8247e5, #a66ef0); }
.cg-games-page-v2 .cg-chain-bnb{ background: linear-gradient(135deg, #f3ba2f, #e0a820); color: #1a1a1a; }
.cg-games-page-v2 .cg-chain-ronin{ background: linear-gradient(135deg, #1273ea, #0c5bc7); }
.cg-games-page-v2 .cg-chain-base{ background: linear-gradient(135deg, #0052ff, #0040c7); }
.cg-games-page-v2 .cg-chain-imx{ background: linear-gradient(135deg, #00d9f5, #00a8c4); color: #1a1a1a; }
.cg-games-page-v2 .cg-chain-avax{ background: linear-gradient(135deg, #e84142, #c13031); }
.cg-games-page-v2 .cg-chain-arb{ background: linear-gradient(135deg, #2d374b, #28a0f0); }
.cg-games-page-v2 .cg-chain-sui{ background: linear-gradient(135deg, #4da2ff, #1565c0); }
.cg-games-page-v2 .cg-chain-more{ background: rgba(0,0,0,0.75); color: #fff; font-size: 10px; }

.cg-games-page-v2 .cg-card-body{
  padding: 14px;
  flex: 1;
  display: flex;
  flex-direction: column;
}
.cg-games-page-v2 .cg-card-title-row{
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 6px;
}
.cg-games-page-v2 .cg-card-icon{
  width: 32px; height: 32px;
  border-radius: 6px;
  flex-shrink: 0;
  margin-top: -26px;
  background-color: #1f2433;
  border: 2px solid var(--cg-gp-card);
  background-size: cover;
  background-position: center;
}
.cg-games-page-v2 .cg-card-title{
  font-family: 'Space Grotesk', sans-serif;
  font-size: 15px;
  font-weight: 700;
  color: var(--cg-gp-text);
  margin: 0;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  min-width: 0;
  flex: 1;
  letter-spacing: -0.01em;
}
.cg-games-page-v2 .cg-card-desc{
  color: var(--cg-gp-text-dim);
  font-size: 12.5px;
  line-height: 1.5;
  margin: 0 0 10px;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  min-height: 2.8em;
}
.cg-games-page-v2 .cg-card-meta{
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  margin-top: auto;
}
.cg-games-page-v2 .cg-badge{
  font-size: 9.5px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  padding: 3px 6px;
  border-radius: 4px;
  display: inline-flex;
  align-items: center;
}
.cg-games-page-v2 .cg-badge-f2p{ background: rgba(34,197,94,0.14); color: #6ee7a0; }
.cg-games-page-v2 .cg-badge-p2e{ background: rgba(255,106,0,0.16); color: #ffa066; }
.cg-games-page-v2 .cg-badge-nft{ background: rgba(168,85,247,0.14); color: #d8b4fe; }
.cg-games-page-v2 .cg-badge-token{ background: rgba(59,130,246,0.14); color: #93c5fd; }
.cg-games-page-v2 .cg-badge-genre{
  background: var(--cg-gp-hover);
  color: var(--cg-gp-text-dim);
  text-transform: none;
  letter-spacing: normal;
  font-weight: 500;
  font-size: 10.5px;
}
.cg-games-page-v2 .cg-device-icons{
  display: flex;
  gap: 4px;
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px solid var(--cg-gp-border);
}
.cg-games-page-v2 .cg-device-icon{
  width: 22px; height: 22px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--cg-gp-text-faint);
  background: var(--cg-gp-bg);
  border-radius: 4px;
}
.cg-games-page-v2 .cg-device-icon .material-symbols-outlined{ font-size: 13px; }
.cg-games-page-v2 .cg-device-supported{ color: #6ee7a0; background: rgba(34,197,94,0.12); }

/* ---------- Zone 5 — PAGINATION ---------- */
.cg-games-page-v2 .cg-pagination{
  display: flex;
  justify-content: center;
  gap: 6px;
  padding: 8px 0 24px;
  flex-wrap: wrap;
}
.cg-games-page-v2 .cg-page-btn{
  min-width: 38px;
  height: 38px;
  padding: 0 12px;
  border-radius: 8px;
  background: var(--cg-gp-elev);
  border: 1px solid var(--cg-gp-border);
  color: var(--cg-gp-text-dim);
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: all .15s;
  font-family: inherit;
}
.cg-games-page-v2 .cg-page-btn:hover{
  color: var(--cg-gp-text);
  border-color: var(--cg-gp-border-strong);
  background: var(--cg-gp-hover);
}
.cg-games-page-v2 .cg-page-btn-active{
  color: #fff;
  background: var(--cg-gp-accent);
  border-color: var(--cg-gp-accent);
  cursor: default;
}
.cg-games-page-v2 .cg-page-btn-active:hover{ background: var(--cg-gp-accent); border-color: var(--cg-gp-accent); }
.cg-games-page-v2 .cg-page-btn-ellipsis{
  color: var(--cg-gp-text-faint);
  cursor: default;
  background: transparent;
  border-color: transparent;
}
.cg-games-page-v2 .cg-page-btn-ellipsis:hover{ background: transparent; border-color: transparent; color: var(--cg-gp-text-faint); }
.cg-games-page-v2 .cg-page-btn .material-symbols-outlined{ font-size: 18px; }

/*
 * ⛔ Pagination outside /games/ had NO styling at all. `Pagination.tsx` renders
 * its legacy mode on /tokens/ and /calendar/ too, but every rule above is
 * scoped to `.cg-games-page-v2`, so those pages shipped raw browser <button>s —
 * on the UA's light `ButtonFace`, which is why they were legible while the
 * theme's light ink was leaking in and went invisible the moment it was fixed.
 * ⭐⭐⭐ An element that is readable BECAUSE of a bug is not a working element;
 * it is a second defect standing on the first, and only fixing the first can
 * ever reveal it. Found by re-measuring the rendered page after deploying.
 *
 * Scoped to `.cg-pagination` so the /games/ rules above — one class more
 * specific — keep winning there and this changes nothing on that page.
 */
.cg-pagination {
  display: flex; align-items: center; justify-content: center;
  gap: 10px; flex-wrap: wrap;
  padding: 8px 0 24px;
}
.cg-pagination .cg-page-btn {
  min-width: 38px; height: 38px; padding: 0 14px;
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  border-radius: 8px;
  background: var(--color-surface-container, #201f20);
  border: 1px solid rgba(132,148,149,0.22);
  color: #b9cacb;
  font-family: inherit; font-size: 13px; font-weight: 600;
  cursor: pointer;
  transition: color .15s, border-color .15s, background .15s;
}
.cg-pagination .cg-page-btn:hover:not(:disabled) {
  color: var(--color-on-surface, #e5e2e3);
  border-color: rgba(0,219,233,0.4);
  background: #2a2a2b;
}
.cg-pagination .cg-page-btn:focus-visible { outline: 2px solid #00dbe9; outline-offset: 2px; }
.cg-pagination .cg-page-btn:disabled { opacity: 0.4; cursor: default; }
.cg-pagination .cg-page-btn .material-symbols-outlined { font-size: 18px; }
.cg-pagination-legacy-label {
  font-size: 13px; font-weight: 600;
  color: var(--color-on-surface, #e5e2e3);
  padding: 0 4px;
}

/* ---------- Mobile filter drawer trigger ---------- */
.cg-games-page-v2 .cg-filter-drawer-trigger{
  display: none;
  position: fixed;
  bottom: 20px;
  left: 50%;
  transform: translateX(-50%);
  padding: 12px 22px;
  background: var(--cg-gp-accent);
  color: #fff;
  border: none;
  border-radius: 999px;
  font-weight: 700;
  font-size: 13px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  box-shadow: 0 10px 30px rgba(255,106,0,0.4), 0 0 0 4px rgba(255,106,0,0.15);
  z-index: 50;
  cursor: pointer;
  align-items: center;
  gap: 8px;
  font-family: inherit;
}
.cg-games-page-v2 .cg-filter-drawer-trigger .cg-drawer-count{
  background: rgba(0,0,0,0.25);
  padding: 2px 7px;
  border-radius: 10px;
  font-size: 11px;
}

/* ======== Responsive breakpoints ======== */

/* 780–1100: sidebar narrows to 264 / grid → 3 cols */
@media (max-width: 1100px) {
  .cg-games-page-v2 .cg-layout-split{ grid-template-columns: 264px 1fr; gap: 22px; }
  .cg-games-page-v2 .cg-card-grid{ grid-template-columns: repeat(3, 1fr); }
  .cg-games-page-v2 .cg-hero{ height: 280px; }
}

/* 480–780: sidebar → bottom drawer / grid → 2 cols */
@media (max-width: 780px) {
  .cg-games-page-v2 .cg-shell{ padding: 0 16px; }
  .cg-games-page-v2 .cg-hero{ height: 240px; }
  .cg-games-page-v2 .cg-hero-inner{ padding: 0 16px; }
  .cg-games-page-v2 .cg-layout-split{ grid-template-columns: 1fr; gap: 0; }
  .cg-games-page-v2 .cg-sidebar{ display: none; }
  .cg-games-page-v2 .cg-card-grid{ grid-template-columns: repeat(2, 1fr); gap: 12px; }
  .cg-games-page-v2 .cg-filter-drawer-trigger{ display: inline-flex; }
  .cg-games-page-v2 .cg-chip-bar{ padding-bottom: 6px; }
  .cg-games-page-v2 .cg-genre-tile-v2{ flex-basis: 220px; height: 90px; }
  .cg-games-page-v2 .cg-genre-tile-name{ font-size: 16px; }
  .cg-games-page-v2 .cg-stats-title{ font-size: 18px; }
  /* s229 audit item 6. The quick-filter bar hid 32% of itself at 390px behind
     a scrollbar it also hides (scrollWidth 504 vs clientWidth 343). Wrapping
     shows every chip; the spacer stops pushing the sort pill off-screen. */
  .cg-games-page-v2 .cg-chip-bar{ flex-wrap: wrap; overflow-x: visible; row-gap: 8px; }
  .cg-games-page-v2 .cg-chip-bar-spacer{ flex: 0 0 0; }
  /* The FILTERS pill floated over a card's cover art. As a full-width bottom
     bar it owns its own strip and the page reserves that strip below the last
     card, so nothing sits under it. */
  .cg-games-page-v2 .cg-filter-drawer-trigger{
    left: 0; right: 0; bottom: 0; transform: none;
    width: 100%; justify-content: center;
    border-radius: 0;
    padding: 14px 22px calc(14px + env(safe-area-inset-bottom));
    box-shadow: 0 -8px 24px rgba(0,0,0,0.35);
  }
  .cg-games-page-v2{ padding-bottom: calc(64px + env(safe-area-inset-bottom)); }
}

/* <480: grid → 1 col */
@media (max-width: 480px) {
  .cg-games-page-v2 .cg-hero{ height: 220px; }
  .cg-games-page-v2 .cg-card-grid{ grid-template-columns: 1fr; }
  .cg-games-page-v2 .cg-genre-tile-v2{ flex-basis: 200px; height: 84px; }
  .cg-games-page-v2 .cg-hero-title{ font-size: 40px; }
}

/* Drawer styles (mobile) — part of Section 19 */
.cg-games-page-v2 .cg-filter-drawer-backdrop{
  position: fixed; inset: 0;
  background: rgba(0,0,0,0.6);
  z-index: 90;
  display: flex;
  align-items: flex-end;
}
.cg-games-page-v2 .cg-filter-drawer-sheet{
  background: var(--cg-gp-elev);
  border-top-left-radius: 16px;
  border-top-right-radius: 16px;
  max-height: 85vh;
  width: 100%;
  display: flex;
  flex-direction: column;
  padding: 16px 16px 24px;
  animation: cgSlideUp .2s ease;
}
@keyframes cgSlideUp {
  from{ transform: translateY(100%); }
  to{ transform: translateY(0); }
}
.cg-games-page-v2 .cg-filter-drawer-header{
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 8px;
}
.cg-games-page-v2 .cg-filter-drawer-header h2{
  font-family: 'Space Grotesk', sans-serif;
  font-size: 18px;
  font-weight: 700;
  margin: 0;
}
.cg-games-page-v2 .cg-filter-drawer-header button{
  background: none; border: none; color: var(--cg-gp-text-dim); cursor: pointer; padding: 4px;
}
.cg-games-page-v2 .cg-filter-drawer-body{
  flex: 1;
  overflow-y: auto;
}
.cg-games-page-v2 .cg-filter-drawer-body .cg-sidebar{
  display: block !important; /* override the <780px rule that hides .cg-sidebar */
  position: static;
  max-height: none;
}
.cg-games-page-v2 .cg-filter-drawer-footer{
  padding-top: 12px;
  border-top: 1px solid var(--cg-gp-border);
  margin-top: 12px;
}
.cg-games-page-v2 .cg-filter-drawer-primary{
  width: 100%;
  background: var(--cg-gp-accent);
  color: #fff;
  border: none;
  padding: 14px;
  border-radius: 999px;
  font-weight: 700;
  font-size: 14px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  cursor: pointer;
  font-family: inherit;
}

/* =============================================================
 * Single Game (dapp) page — Stitch "Sandbox Overview Reordered Nav"
 * ============================================================= */

/* Hero overlay + content layout */
.cg-layout--dapp .cg-hero-overlay {
  background: linear-gradient(to top, var(--color-background, #131314) 0%, rgba(19,19,20,0.55) 40%, transparent 100%);
}
.cg-dapp-hero {
  display: flex;
  align-items: flex-end;
  gap: 32px;
  flex-wrap: wrap;
}
.cg-dapp-hero-info {
  flex: 1;
  min-width: 0;
}
.cg-dapp-hero-cta { flex-shrink: 0; padding-bottom: 6px; }

.cg-dapp-hero-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-bottom: 12px;
}
.cg-dapp-chip {
  padding: 4px 12px;
  border-radius: 9999px;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  border: 1px solid rgba(0,219,233,0.3);
  background: rgba(0,219,233,0.12);
  color: #00dbe9;
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.cg-dapp-chip-category { background: rgba(207,92,255,0.12); color: #ecb2ff; border-color: rgba(207,92,255,0.3); }
.cg-dapp-chip-p2e { background: rgba(187,234,0,0.14); color: #abd600; border-color: rgba(187,234,0,0.3); }
.cg-dapp-chip-f2p { background: rgba(0,255,166,0.14); color: #00ffaa; border-color: rgba(0,255,166,0.3); }
.cg-dapp-chip-status {
  background: #353436;
  color: #e5e2e3;
  border-color: rgba(132,148,149,0.3);
}
.cg-dapp-status-dot {
  width: 8px; height: 8px; border-radius: 50%;
  background: #abd600; display: inline-block;
  box-shadow: 0 0 8px rgba(171,214,0,0.6);
}

/* Dead game: the status chip stops looking like a healthy one, and the dot
   stops glowing green next to the word "Dead". */
.cg-dapp-chip-dead {
  background: rgba(220,38,38,0.16);
  color: #fca5a5;
  border-color: rgba(220,38,38,0.42);
}
.cg-dapp-chip-dead .cg-dapp-status-dot {
  background: #ef4444;
  box-shadow: none;
}

/* Delisted: slate, for the same reason the notice below it is slate. Red on
   this chip is a claim that something is wrong with the game, and a delisted
   row is usually a live business we simply decline to list. The dot does not
   glow green either — the visitor still cannot follow a link from here. */
.cg-dapp-chip-delisted {
  background: rgba(100,116,139,0.16);
  color: #cbd5e1;
  border-color: rgba(100,116,139,0.42);
}
.cg-dapp-chip-delisted .cg-dapp-status-dot {
  background: #94a3b8;
  box-shadow: none;
}

/* The notice that replaces the links we removed. Sits directly under the hero
   so nobody reaches the stats before learning the game is gone. */
.cg-dead-notice {
  display: flex;
  gap: 14px;
  align-items: flex-start;
  margin: 0 auto 20px;
  max-width: 1280px;
  padding: 16px 18px;
  border: 1px solid rgba(220,38,38,0.35);
  border-left-width: 4px;
  border-radius: 10px;
  background: rgba(220,38,38,0.08);
}
.cg-dead-notice-icon { color: #ef4444; font-size: 24px; line-height: 1; flex: 0 0 auto; }
.cg-dead-notice-body { min-width: 0; }

/* Delisted reuses the notice SHAPE but none of its alarm. Red here would be a
   claim that something is wrong with the game, and these are usually live
   businesses we simply decline to list — the same reasoning as the card badge.
   Slate says "this does not apply here" without asserting anything about them. */
.cg-dead-notice--delisted {
  border-color: rgba(100,116,139,0.40);
  background: rgba(100,116,139,0.08);
}
.cg-dead-notice--delisted .cg-dead-notice-icon { color: #94a3b8; }
.cg-dead-notice--delisted .cg-dead-notice-title { color: #cbd5e1; }
.cg-dead-notice-title {
  display: block;
  color: #fca5a5;
  font-size: 15px;
  letter-spacing: 0.01em;
  margin-bottom: 4px;
}
.cg-dead-notice-text {
  margin: 0;
  color: #c9c6c7;
  font-size: 14px;
  line-height: 1.55;
}
.cg-dead-domain {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  color: #e5e2e3;
}
@media (max-width: 640px) {
  .cg-dead-notice { margin: 0 12px 16px; padding: 14px; }
}

/* Upcoming: the same two components in amber. Not-yet and never both mean the
   visitor cannot play today, so they share a shape; the colour carries the
   difference, and the dot does not glow green next to "Upcoming" either. */
.cg-dapp-chip-upcoming {
  background: rgba(217,119,6,0.16);
  color: #fcd34d;
  border-color: rgba(217,119,6,0.42);
}
.cg-dapp-chip-upcoming .cg-dapp-status-dot {
  background: #f59e0b;
  box-shadow: none;
}

.cg-upcoming-notice {
  display: flex;
  gap: 14px;
  align-items: flex-start;
  margin: 0 auto 20px;
  max-width: 1280px;
  padding: 16px 18px;
  border: 1px solid rgba(217,119,6,0.35);
  border-left-width: 4px;
  border-radius: 10px;
  background: rgba(217,119,6,0.08);
}
.cg-upcoming-notice-icon { color: #f59e0b; font-size: 24px; line-height: 1; flex: 0 0 auto; }
.cg-upcoming-notice-body { min-width: 0; }
.cg-upcoming-notice-title {
  display: block;
  color: #fcd34d;
  font-size: 15px;
  letter-spacing: 0.01em;
  margin-bottom: 4px;
}
.cg-upcoming-notice-text {
  margin: 0;
  color: #c9c6c7;
  font-size: 14px;
  line-height: 1.55;
}
@media (max-width: 640px) {
  .cg-upcoming-notice { margin: 0 12px 16px; padding: 14px; }
}

.cg-dapp-hero-title {
  margin: 0 0 12px 0 !important;
}

.cg-dapp-hero-meta {
  display: flex;
  align-items: center;
  gap: 24px;
  flex-wrap: wrap;
}
.cg-dapp-hero-chains {
  display: flex; gap: 6px; flex-wrap: wrap;
}
.cg-dapp-chain-pill {
  padding: 4px 10px;
  border-radius: 9999px;
  background: rgba(255,255,255,0.06);
  border: 1px solid rgba(255,255,255,0.1);
  color: #b9cacb;
  font-size: 12px;
  font-weight: 500;
}
.cg-dapp-hero-rating {
  display: inline-flex; align-items: center; gap: 8px;
  background: rgba(0,219,233,0.1);
  border: 1px solid rgba(0,219,233,0.4);
  border-radius: 8px;
  padding: 6px 14px;
}
.cg-dapp-hero-rating .cg-star { color: #fbbf24; font-size: 18px; }
.cg-dapp-hero-rating .cg-rating-num { font-size: 22px; font-weight: 700; color: #00dbe9; line-height: 1; }
.cg-dapp-hero-rating .cg-rating-suf { font-size: 12px; color: #b9cacb; }
.cg-dapp-hero-rating .cg-rating-count { font-size: 11px; color: #7a8a8b; border-left: 1px solid rgba(185,202,203,0.3); padding-left: 10px; }

/* ── "Be the first to review" ──────────────────────────────────────────────
 *
 * The zero-review state of the two places a score lives. Both are DELIBERATELY
 * quieter than the real thing: a gold star and a cyan number are a rating, and
 * this is an empty slot asking to be filled. The star is an outline (&#9734;)
 * in muted grey for the same reason — a filled gold one would read, at a
 * glance, as a score somebody gave.
 */
.cg-dapp-hero-rating--ask {
  font: inherit;
  color: inherit;
  cursor: pointer;
  background: rgba(185,202,203,0.06);
  border: 1px dashed rgba(185,202,203,0.35);
  transition: background 150ms, border-color 150ms;
}
.cg-dapp-hero-rating--ask:hover,
.cg-dapp-hero-rating--ask:focus-visible {
  background: rgba(0,219,233,0.1);
  border-color: rgba(0,219,233,0.5);
}
.cg-dapp-hero-rating--ask .cg-star--empty { color: #b9cacb; font-size: 18px; }
.cg-dapp-hero-rating--ask .cg-rating-ask-text {
  font-size: 13px; font-weight: 600; color: #b9cacb; letter-spacing: 0.02em;
}
.cg-dapp-hero-rating--ask:hover .cg-star--empty,
.cg-dapp-hero-rating--ask:hover .cg-rating-ask-text { color: #7df4ff; }

/* The score card at zero. A 96px glyph would shout; the ask is the message. */
.cg-reviews-score-block--empty .cg-score-display {
  font-size: 44px; color: #b9cacb; opacity: 0.55;
}
.cg-reviews-score-block--empty .cg-score-label {
  font-size: 15px; font-weight: 600; color: #e5e2e3; margin-top: 8px;
}
.cg-reviews-empty-ask {
  margin: 10px 0 16px; font-size: 13px; line-height: 1.5; color: #b9cacb;
}
.cg-write-review-btn--empty { width: 100%; justify-content: center; }

.cg-btn-play-now {
  display: inline-block;
  padding: 14px 36px;
  background: linear-gradient(135deg, #00f0ff, #00dbe9);
  color: #003237;
  font-weight: 900;
  font-size: 18px;
  letter-spacing: 0.04em;
  border-radius: 8px;
  text-decoration: none;
  box-shadow: 0 0 24px rgba(0,219,233,0.4);
  transition: transform 150ms ease, box-shadow 150ms ease;
}
.cg-btn-play-now:hover { transform: scale(1.04); box-shadow: 0 0 32px rgba(0,219,233,0.6); color: #003237; }

/* Quick stats — auto-fit so we adapt to whatever number of real stats we have */
.cg-quick-stats-bar { grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); }
.cg-stat-delta { font-size: 12px; margin-left: 6px; display: inline-flex; align-items: center; }
.cg-stat-delta-icon { font-size: 16px; vertical-align: middle; }
.cg-metric-delta-pos { color: #abd600; }
.cg-metric-delta-neg { color: #ffb4ab; }
.cg-stat-cyan { color: #00dbe9; }

/* Sticky tab nav */
.cg-tab-nav-sticky {
  position: sticky;
  top: var(--cg-hd);
  z-index: 30;
  background: var(--color-background, #131314);
  border-bottom: 1px solid rgba(59,73,75,0.15);
  padding: 0 32px;
}

/* 8/4 grid */
.cg-dapp-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 48px;
}
@media (min-width: 1024px) {
  .cg-dapp-grid { grid-template-columns: minmax(0, 8fr) minmax(0, 4fr); gap: 48px; }
}
.cg-dapp-col-main { display: flex; flex-direction: column; gap: 64px; min-width: 0; }
.cg-dapp-col-side { display: flex; flex-direction: column; gap: 24px; min-width: 0; }
.cg-dapp-section { scroll-margin-top: 130px; }

/*
 * FAQ — an accordion that shipped with markup and NO stylesheet at all, so it
 * rendered as bare <details> in the theme's inherited light-mode ink. The base
 * ink fix above makes it legible; these rules make it look built. The question
 * is the affordance, so it gets the readable weight and its own hit area — a
 * `summary` is the click target whether or not it looks like one.
 */
.cg-dapp-faq-list { display: flex; flex-direction: column; gap: 10px; }
.cg-dapp-faq-item {
  background: var(--color-surface-container, #201f20);
  border: 1px solid rgba(132,148,149,0.18);
  border-radius: 12px;
  overflow: hidden;
  transition: border-color 0.18s ease, background 0.18s ease;
}
.cg-dapp-faq-item:hover { border-color: rgba(0,219,233,0.35); }
.cg-dapp-faq-item[open] { border-color: rgba(0,219,233,0.28); background: #252425; }
.cg-dapp-faq-q {
  display: flex; align-items: center; gap: 12px;
  padding: 16px 20px;
  font-size: 15px; font-weight: 600; line-height: 1.4;
  color: var(--color-on-surface, #e5e2e3);
  cursor: pointer;
  list-style: none;               /* Firefox */
}
/* The default disclosure triangle is replaced by a chevron we can colour and
   rotate; both vendor forms are needed or Safari keeps drawing its own. */
.cg-dapp-faq-q::-webkit-details-marker { display: none; }
.cg-dapp-faq-q::marker { content: ''; }
.cg-dapp-faq-q::after {
  content: '';
  margin-left: auto; flex-shrink: 0;
  width: 9px; height: 9px;
  border-right: 2px solid #00dbe9; border-bottom: 2px solid #00dbe9;
  transform: rotate(45deg) translate(-2px, -2px);
  transition: transform 0.2s ease;
}
.cg-dapp-faq-item[open] .cg-dapp-faq-q::after {
  transform: rotate(-135deg) translate(-2px, -2px);
}
.cg-dapp-faq-q:focus-visible { outline: 2px solid #00dbe9; outline-offset: -2px; }
.cg-dapp-faq-a {
  padding: 0 20px 18px 20px;
  font-size: 14px; line-height: 1.65;
  color: #b9cacb;
  max-width: 78ch;
}

/* The verdict note is an aside, so it is quieter than body copy — but "quieter"
   has a floor, and inheriting the theme's #333 put it below the floor. */
.cg-dapp-verdict-note { margin-top: 14px; font-size: 13px; color: #8f9fa0; }

/* Full-width wrapper for sections that should escape the 8/4 grid
 * (Tokens, NFT Data, Reviews, Events, Investors, Guilds, Community).
 * The right sidebar runs out of content earlier, so these breathe wider. */
.cg-dapp-fullwidth {
  display: flex;
  flex-direction: column;
  gap: 64px;
  min-width: 0;
  margin-top: 64px;
}
@media (max-width: 1023px) {
  .cg-dapp-fullwidth { margin-top: 48px; }
}

/* Section heading with cyan border-left bar */
.cg-section-heading-bar {
  border-left: 4px solid #00dbe9;
  padding-left: 18px;
  margin-bottom: 20px;
}

/* Gallery — 1 hero + 4 thumbs */
.cg-dapp-gallery-hero {
  width: 100%;
  aspect-ratio: 16/9;
  border-radius: 12px;
  overflow: hidden;
  background: #1c1b1c;
  position: relative;
}
.cg-dapp-gallery-hero img,
.cg-dapp-gallery-hero iframe {
  width: 100%; height: 100%;
  object-fit: cover;
  border: 0;
  display: block;
}
.cg-dapp-gallery-thumbs {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 12px;
  margin-top: 12px;
}
.cg-dapp-thumb {
  aspect-ratio: 16/9;
  border-radius: 8px;
  overflow: hidden;
  border: 1px solid rgba(59,73,75,0.2);
  position: relative;
  cursor: pointer;
  opacity: 0.7;
  transition: opacity 200ms ease, transform 200ms ease;
  background: #1c1b1c;
}
.cg-dapp-thumb:first-child { opacity: 1; border-color: #00dbe9; box-shadow: 0 0 0 4px rgba(0,219,233,0.18); }
.cg-dapp-thumb:hover { opacity: 1; }
.cg-dapp-thumb img { width: 100%; height: 100%; object-fit: cover; }
.cg-dapp-thumb-play {
  position: absolute; inset: 0;
  display: flex; align-items: center; justify-content: center;
  background: rgba(19,19,20,0.4);
  color: #fff;
}
.cg-dapp-thumb-play .material-symbols-outlined { font-size: 36px; }
.cg-dapp-thumb-more-overlay {
  position: absolute; inset: 0;
  background: rgba(19,19,20,0.7);
  display: flex; align-items: center; justify-content: center;
  font-size: 13px; font-weight: 700; color: #e5e2e3;
}

/* Description */
.cg-dapp-description-body {
  color: #b9cacb;
  font-size: 17px;
  line-height: 1.7;
  max-width: 760px;
}
.cg-dapp-description-body p { margin: 0 0 1em 0; }
.cg-dapp-description-body p:last-child { margin-bottom: 0; }
.cg-dapp-taglist {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 18px;
}
.cg-dapp-tag {
  font-size: 12px;
  color: #7a8a8b;
  background: rgba(255,255,255,0.04);
  padding: 4px 10px;
  border-radius: 9999px;
}

/* Pros & Cons */
.cg-dapp-pros-cons {
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;
}
@media (min-width: 768px) { .cg-dapp-pros-cons { grid-template-columns: 1fr 1fr; } }
.cg-pros-block, .cg-cons-block {
  background: #1c1b1c;
  border: 1px solid rgba(59,73,75,0.2);
  border-radius: 10px;
  padding: 16px 18px;
}
.cg-pros-heading, .cg-cons-heading {
  display: flex; align-items: center; gap: 8px;
  font-weight: 700; font-size: 14px;
  text-transform: uppercase; letter-spacing: 0.06em;
  margin-bottom: 8px;
}
.cg-pros-heading { color: #abd600; }
.cg-cons-heading { color: #ffb4ab; }
.cg-pros-icon, .cg-cons-icon { font-size: 18px; font-variation-settings: 'FILL' 1; }
.cg-pros-body, .cg-cons-body { font-size: 14px; color: #e5e2e3; }

/* Stores row */
.cg-dapp-stores-row {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}
.cg-dapp-store-btn {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 10px 18px;
  background: #2a2a2b;
  border: 1px solid rgba(59,73,75,0.3);
  border-radius: 8px;
  color: #e5e2e3;
  font-weight: 600;
  font-size: 14px;
  text-decoration: none;
  transition: background 150ms ease, border-color 150ms ease;
}
.cg-dapp-store-btn:hover { background: #3a393a; border-color: rgba(0,219,233,0.4); color: #00dbe9; }
.cg-dapp-store-btn .material-symbols-outlined { font-size: 18px; }

/* Token / NFT cards (within main col) */
.cg-dapp-token-card, .cg-dapp-nft-card {
  padding: 24px;
  background: #1c1b1c;
  border: 1px solid rgba(59,73,75,0.2);
  border-radius: 12px;
}
.cg-dapp-token-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 16px;
}
.cg-dapp-token-symbol {
  font-family: var(--font-headline, 'Space Grotesk');
  font-size: 22px; font-weight: 800; color: #e5e2e3;
}
.cg-dapp-token-price { font-size: 16px; color: #b9cacb; margin-top: 4px; }
.cg-dapp-token-actions { display: flex; gap: 10px; flex-wrap: wrap; }
.cg-dapp-nft-actions { margin-top: 12px; }

/* Reviews head */
.cg-dapp-reviews-head {
  display: flex; align-items: center; justify-content: space-between;
  flex-wrap: wrap; gap: 16px; margin-bottom: 20px;
}
.cg-already-reviewed {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 13px; color: #b9cacb;
  padding: 8px 14px; border-radius: 9999px;
  background: rgba(187,234,0,0.06); border: 1px solid rgba(187,234,0,0.2);
}
.cg-already-reviewed .material-symbols-outlined { font-size: 16px; color: #bbea00; }
.cg-reviews-count { font-size: 14px; color: #b9cacb; margin-top: 8px; }
.cg-no-reviews { color: #b9cacb; font-size: 15px; margin: 0; }
.cg-rating-bar-wrap { margin-top: 24px; }
.cg-rating-bar-row { display: flex; justify-content: space-between; margin-bottom: 4px; }
.cg-cat-rating-val { font-size: 12px; color: #9ca3af; margin-left: 8px; }

/* Reviews — Stitch redesign (Score card + categories + review cards) */
.cg-write-review-btn {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 10px 18px;
  background: linear-gradient(90deg, #00f0ff, #00dbe9);
  color: #006970; font-weight: 700; font-size: 13px;
  text-transform: uppercase; letter-spacing: 0.06em;
  border: none; border-radius: 6px; cursor: pointer;
  box-shadow: 0 0 15px rgba(0,219,233,0.3);
  transition: transform 150ms, box-shadow 150ms;
}
.cg-write-review-btn:hover {
  transform: translateY(-1px);
  box-shadow: 0 0 22px rgba(0,219,233,0.45);
}
.cg-write-review-btn .material-symbols-outlined { font-size: 18px; }

.cg-reviews-summary {
  display: grid; grid-template-columns: 1fr; gap: 16px;
  margin-bottom: 24px;
}
@media (min-width: 768px) {
  .cg-reviews-summary { grid-template-columns: minmax(260px, 320px) 1fr; }
}
.cg-reviews-score-block .cg-score-row {
  display: flex; align-items: baseline; gap: 8px;
}
.cg-score-suffix {
  font-family: var(--font-headline);
  font-size: 22px; font-weight: 600; color: #b9cacb;
}

.cg-review-categories-card {
  background: #1c1b1c; padding: 28px;
  border: 1px solid rgba(59,73,75,0.05); border-radius: 8px;
}
.cg-rev-cat-title {
  font-family: var(--font-headline); font-size: 18px; font-weight: 700;
  color: #e5e2e3; margin: 0 0 18px 0;
}
.cg-rev-cat-list { display: flex; flex-direction: column; gap: 16px; }
.cg-rev-cat-head {
  display: flex; justify-content: space-between; align-items: baseline;
  margin-bottom: 6px;
}
.cg-rev-cat-name {
  font-size: 12px; font-weight: 600; color: #e5e2e3;
  text-transform: uppercase; letter-spacing: 0.08em;
}
.cg-rev-cat-pct {
  font-family: var(--font-headline); font-size: 14px; font-weight: 700; color: #00dbe9;
}
.cg-rev-cat-meta {
  font-size: 11px; color: #b9cacb; margin-top: 4px;
}
.cg-review-categories-empty .cg-no-data { margin: 0; }

.cg-no-reviews-block {
  background: #1c1b1c; padding: 40px;
  border: 1px dashed rgba(59,73,75,0.5); border-radius: 12px;
  display: flex; flex-direction: column; align-items: center; gap: 12px;
}
.cg-no-reviews-block .material-symbols-outlined {
  font-size: 38px; color: #3b494b;
}

.cg-reviews-list-v2 { display: flex; flex-direction: column; gap: 14px; }
.cg-review-item {
  background: #1c1b1c; padding: 22px;
  border: 1px solid rgba(59,73,75,0.1); border-radius: 12px;
  border-left: 3px solid rgba(0,219,233,0.6);
  transition: border-color 150ms, background 150ms;
}
.cg-review-item:hover {
  background: #201f20;
  border-left-color: #00dbe9;
}
.cg-review-item-head {
  display: flex; justify-content: space-between; align-items: center;
  gap: 16px; margin-bottom: 14px;
}
.cg-review-author { display: flex; align-items: center; gap: 12px; }
.cg-review-avatar {
  width: 44px; height: 44px; border-radius: 9999px;
  background: linear-gradient(135deg, #00dbe9, #cf5cff);
  color: #131314; font-weight: 800; font-family: var(--font-headline); font-size: 18px;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 0 0 2px rgba(0,219,233,0.2);
  flex-shrink: 0;
}
.cg-review-author-name { font-weight: 700; color: #e5e2e3; font-size: 15px; }
.cg-review-author-date { font-size: 11px; color: #b9cacb; margin-top: 2px; }
.cg-review-score-pill {
  display: inline-flex; align-items: baseline; gap: 4px;
  padding: 6px 14px; border-radius: 9999px;
  background: rgba(0,219,233,0.1); border: 1px solid rgba(0,219,233,0.25);
  flex-shrink: 0;
}
.cg-review-score-num {
  font-family: var(--font-headline); font-size: 22px; font-weight: 800; color: #00dbe9;
  line-height: 1;
}
.cg-review-score-denom { font-size: 12px; color: #b9cacb; }
.cg-review-text {
  color: #e5e2e3; font-size: 15px; line-height: 1.65;
  margin: 0 0 14px 0; white-space: pre-wrap;
}
.cg-review-cats {
  display: flex; flex-wrap: wrap; gap: 6px;
  padding-top: 12px;
  border-top: 1px solid rgba(59,73,75,0.15);
}
.cg-review-cat-chip {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 10px; border-radius: 9999px;
  font-size: 11px; font-weight: 600;
  border: 1px solid;
}
.cg-review-cat-chip-label {
  text-transform: uppercase; letter-spacing: 0.06em; color: #b9cacb;
}
.cg-review-cat-chip-val { font-weight: 700; }
.cg-review-cat-tone-pos {
  background: rgba(187,234,0,0.08); border-color: rgba(187,234,0,0.25);
}
.cg-review-cat-tone-pos .cg-review-cat-chip-val { color: #bbea00; }
.cg-review-cat-tone-neg {
  background: rgba(255,180,171,0.08); border-color: rgba(255,180,171,0.25);
}
.cg-review-cat-tone-neg .cg-review-cat-chip-val { color: #ffb4ab; }
.cg-review-cat-tone-neu {
  background: rgba(125,244,255,0.06); border-color: rgba(125,244,255,0.18);
}
.cg-review-cat-tone-neu .cg-review-cat-chip-val { color: #7df4ff; }

/* Events / generic small chips */
.cg-chip-sm { font-size: 11px; padding: 3px 9px; }
.cg-dapp-event-card { padding: 18px; }
.cg-dapp-event-title { font-family: var(--font-headline, 'Space Grotesk'); font-size: 15px; font-weight: 700; color: #e5e2e3; margin-bottom: 8px; }
.cg-dapp-event-date { font-size: 12px; color: #b9cacb; margin-top: 8px; }
.cg-dapp-event-prize { font-size: 12px; color: #00dbe9; margin-top: 4px; }

/* Events — Stitch redesign (horizontal cards w/ status & countdown) */
.cg-dapp-section-head {
  display: flex; align-items: center; justify-content: space-between;
  flex-wrap: wrap; gap: 12px; margin-bottom: 20px;
}
.cg-event-tally { display: flex; gap: 6px; flex-wrap: wrap; }
.cg-event-tally-chip {
  font-size: 11px; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.06em;
  padding: 4px 10px; border-radius: 9999px;
  border: 1px solid;
}
.cg-event-tally-live {
  background: rgba(187,234,0,0.1); border-color: rgba(187,234,0,0.35); color: #bbea00;
}
.cg-event-tally-upcoming {
  background: rgba(207,92,255,0.1); border-color: rgba(207,92,255,0.35); color: #ecb2ff;
}
.cg-event-tally-past {
  background: rgba(53,52,54,0.6); border-color: rgba(132,148,149,0.2); color: #b9cacb;
}

.cg-events-list {
  display: flex; flex-direction: column; gap: 12px;
}
.cg-event-card {
  display: flex; flex-direction: column;
  background: #1c1b1c; border-radius: 12px; padding: 16px;
  border: 1px solid rgba(59,73,75,0.15);
  gap: 16px;
  transition: border-color 150ms, background 150ms, transform 150ms;
  position: relative;
}
@media (min-width: 768px) {
  .cg-event-card { flex-direction: row; align-items: stretch; }
}
.cg-event-card:hover {
  background: #201f20;
  border-color: rgba(0,219,233,0.3);
}
.cg-event-card-past { opacity: 0.78; filter: saturate(0.7); }
.cg-event-card-past:hover { opacity: 1; filter: none; }

.cg-event-thumb {
  position: relative;
  width: 100%; height: 160px;
  border-radius: 10px; overflow: hidden;
  background: #0e0e0f;
  flex-shrink: 0;
}
@media (min-width: 768px) {
  .cg-event-thumb { width: 200px; height: auto; min-height: 130px; }
}
.cg-event-thumb img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  transition: transform 300ms;
}
.cg-event-card:hover .cg-event-thumb img { transform: scale(1.05); }
.cg-event-thumb-placeholder {
  display: flex; align-items: center; justify-content: center;
  background: linear-gradient(135deg, #1c1b1c, #2a2a2b);
}
.cg-event-thumb-placeholder .material-symbols-outlined {
  font-size: 42px; color: #3b494b;
}

.cg-event-status {
  position: absolute; top: 8px; left: 8px; z-index: 1;
  font-size: 10px; font-weight: 800;
  text-transform: uppercase; letter-spacing: 0.08em;
  padding: 4px 10px; border-radius: 4px;
  display: inline-flex; align-items: center; gap: 4px;
}
.cg-event-status-live    { background: #bbea00; color: #506600; }
.cg-event-status-upcoming { background: #cf5cff; color: #480063; }
.cg-event-status-past     { background: #353436; color: #b9cacb; }

.cg-event-body {
  flex: 1; display: flex; flex-direction: column; gap: 8px; min-width: 0;
}
.cg-event-meta-top {
  display: flex; flex-wrap: wrap; align-items: center; gap: 10px;
  font-size: 11px; color: #b9cacb;
}
.cg-event-type {
  font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em;
  color: #00dbe9;
}
.cg-event-dates { color: #b9cacb; }
.cg-event-title {
  margin: 0; font-family: var(--font-headline, 'Space Grotesk');
  font-size: 18px; font-weight: 700; line-height: 1.25;
}
.cg-event-title a {
  color: #e5e2e3; text-decoration: none;
}
.cg-event-title a:hover { color: #00dbe9; }
.cg-event-foot {
  display: flex; flex-wrap: wrap; align-items: center; gap: 16px;
  margin-top: auto;
  padding-top: 8px;
}
.cg-event-countdown {
  display: inline-flex; align-items: center; gap: 6px;
  font-family: var(--font-headline, 'Space Grotesk');
  font-size: 14px; font-weight: 700;
}
.cg-event-countdown .material-symbols-outlined { font-size: 16px; }
.cg-event-countdown-live    { color: #bbea00; }
.cg-event-countdown-upcoming { color: #00dbe9; }
.cg-event-countdown-past     { color: #b9cacb; }
.cg-event-prize {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 13px; font-weight: 600; color: #ecb2ff;
}
.cg-event-prize .material-symbols-outlined { font-size: 16px; }

.cg-event-cta {
  display: inline-flex; align-items: center; gap: 6px;
  align-self: center;
  padding: 10px 18px; border-radius: 6px;
  background: rgba(0,240,255,0.08);
  border: 1px solid rgba(0,240,255,0.25);
  color: #00f0ff;
  font-size: 12px; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.06em;
  text-decoration: none;
  white-space: nowrap;
  transition: background 150ms, color 150ms;
}
.cg-event-cta:hover {
  background: #00f0ff; color: #006970;
}
.cg-event-cta .material-symbols-outlined { font-size: 16px; }
@media (max-width: 767px) {
  .cg-event-cta { align-self: stretch; justify-content: center; }
}

/* News list on the game single — the visual sibling of the events list,
   one size down: a news row carries a title and a date, not a status
   machine, so the thumb and type row shrink accordingly. */
.cg-news-list {
  display: flex; flex-direction: column; gap: 12px;
}
.cg-news-card {
  display: flex; flex-direction: row; align-items: center;
  background: #1c1b1c; border-radius: 12px; padding: 12px;
  border: 1px solid rgba(59,73,75,0.15);
  gap: 16px;
  transition: border-color 150ms, background 150ms;
}
.cg-news-card:hover {
  background: #201f20;
  border-color: rgba(0,219,233,0.3);
}
.cg-news-thumb {
  width: 96px; height: 64px;
  border-radius: 8px; overflow: hidden;
  background: #0e0e0f;
  flex-shrink: 0;
  display: block;
}
.cg-news-thumb img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  transition: transform 300ms;
}
.cg-news-card:hover .cg-news-thumb img { transform: scale(1.05); }
.cg-news-thumb-placeholder {
  display: flex; align-items: center; justify-content: center;
  background: linear-gradient(135deg, #1c1b1c, #2a2a2b);
}
.cg-news-thumb-placeholder .material-symbols-outlined {
  font-size: 28px; color: #3b494b;
}
.cg-news-body {
  flex: 1; display: flex; flex-direction: column; gap: 4px; min-width: 0;
}
.cg-news-title {
  margin: 0; font-family: var(--font-headline, 'Space Grotesk');
  font-size: 16px; font-weight: 700; line-height: 1.3;
}
.cg-news-title a { color: #e5e2e3; text-decoration: none; }
.cg-news-title a:hover { color: #00dbe9; }
.cg-news-meta { font-size: 12px; color: #b9cacb; }
.cg-news-cta {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 8px 14px; border-radius: 6px;
  background: rgba(0,240,255,0.08);
  border: 1px solid rgba(0,240,255,0.25);
  color: #00f0ff;
  font-size: 12px; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.06em;
  text-decoration: none;
  white-space: nowrap;
  transition: background 150ms, color 150ms;
}
.cg-news-cta:hover { background: #00f0ff; color: #006970; }
.cg-news-cta .material-symbols-outlined { font-size: 16px; }
@media (max-width: 480px) {
  .cg-news-cta { display: none; }
}

/* Investor / Guild small cards (legacy — still used in right sidebar) */
.cg-dapp-rel-card { display: flex; align-items: center; gap: 12px; padding: 16px; }
.cg-dapp-rel-icon { width: 40px; height: 40px; border-radius: 6px; object-fit: cover; }
.cg-dapp-rel-name { font-family: var(--font-headline, 'Space Grotesk'); font-size: 15px; font-weight: 700; color: #e5e2e3; }

/* Section sub-heading text */
.cg-dapp-section-sub {
  margin: 6px 0 0 0;
  font-size: 13px; color: #b9cacb;
  max-width: 60ch;
}

/* Investors — Stitch Entity Card pattern */
.cg-investor-grid {
  display: grid; grid-template-columns: 1fr; gap: 16px;
}
@media (min-width: 640px) { .cg-investor-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1024px) { .cg-investor-grid { grid-template-columns: repeat(4, 1fr); } }
.cg-investor-card {
  display: flex; flex-direction: column; gap: 14px;
  padding: 22px;
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.1); border-radius: 12px;
  text-decoration: none;
  transition: border-color 200ms, transform 200ms, background 200ms;
}
.cg-investor-card:hover {
  border-color: rgba(0,219,233,0.35);
  background: #2a2a2b;
  transform: translateY(-2px);
}
.cg-investor-head {
  display: flex; justify-content: space-between; align-items: flex-start;
}
.cg-investor-logo {
  width: 56px; height: 56px;
  border-radius: 10px;
  object-fit: cover;
  background: #353436;
}
.cg-investor-logo-placeholder {
  display: flex; align-items: center; justify-content: center;
  font-family: var(--font-headline); font-weight: 800; font-size: 22px;
  color: #00dbe9;
}
.cg-investor-arrow {
  font-size: 18px !important; color: #b9cacb;
  transition: color 150ms, transform 150ms;
}
.cg-investor-card:hover .cg-investor-arrow {
  color: #00dbe9; transform: translate(2px, -2px);
}
.cg-investor-name {
  margin: 0;
  font-family: var(--font-headline, 'Space Grotesk');
  font-size: 17px; font-weight: 700; color: #e5e2e3;
  line-height: 1.25;
}
.cg-investor-foot {
  display: flex; justify-content: space-between; align-items: center;
  padding-top: 12px;
  border-top: 1px solid rgba(59,73,75,0.15);
  font-size: 11px;
}
.cg-investor-role {
  text-transform: uppercase; letter-spacing: 0.08em; font-weight: 700;
  color: #ecb2ff;
}
.cg-investor-portfolio {
  display: inline-flex; align-items: center; gap: 4px;
  color: #b9cacb;
}
.cg-investor-portfolio .material-symbols-outlined {
  font-size: 14px;
}

/* Guilds — Stitch Entity Card with banner + logo */
.cg-guild-grid {
  display: grid; grid-template-columns: 1fr; gap: 18px;
}
@media (min-width: 768px) { .cg-guild-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1280px) { .cg-guild-grid { grid-template-columns: repeat(3, 1fr); } }
.cg-guild-card {
  display: flex; flex-direction: column;
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.1); border-radius: 14px;
  overflow: hidden;
  text-decoration: none;
  transition: border-color 200ms, background 200ms, transform 200ms;
}
.cg-guild-card:hover {
  border-color: rgba(0,219,233,0.35);
  background: #2a2a2b;
  transform: translateY(-2px);
}
.cg-guild-banner {
  position: relative;
  height: 110px; overflow: hidden;
  background: linear-gradient(135deg, #1c1b1c, #353436);
}
.cg-guild-banner-img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  opacity: 0.55;
  transition: transform 300ms, opacity 300ms;
}
.cg-guild-card:hover .cg-guild-banner-img {
  transform: scale(1.05);
  opacity: 0.7;
}
.cg-guild-banner-veil {
  position: absolute; inset: 0;
  background: linear-gradient(to top, #201f20 0%, rgba(32,31,32,0.4) 60%, transparent 100%);
  pointer-events: none;
}
.cg-guild-tier {
  position: absolute; top: 10px; right: 10px; z-index: 1;
  font-size: 10px; font-weight: 800;
  text-transform: uppercase; letter-spacing: 0.08em;
  padding: 4px 10px; border-radius: 4px;
  background: rgba(0,240,255,0.1);
  border: 1px solid rgba(0,219,233,0.3);
  color: #00dbe9;
}
.cg-guild-body {
  padding: 18px 22px 22px;
  display: flex; flex-direction: column; gap: 14px;
  flex: 1;
}
.cg-guild-logo-row {
  display: flex; align-items: center; gap: 12px;
  margin-top: -36px;
}
.cg-guild-logo {
  width: 48px; height: 48px;
  border-radius: 10px;
  object-fit: cover;
  background: #131314;
  border: 2px solid #00dbe9;
  box-shadow: 0 0 0 2px #201f20;
  flex-shrink: 0;
}
.cg-guild-card:hover .cg-guild-logo {
  box-shadow: 0 0 0 2px #2a2a2b;
}
.cg-guild-logo-placeholder {
  display: flex; align-items: center; justify-content: center;
  font-family: var(--font-headline); font-weight: 800; font-size: 20px;
  color: #00dbe9;
}
.cg-guild-name {
  margin: 0;
  font-family: var(--font-headline, 'Space Grotesk');
  font-size: 18px; font-weight: 700; color: #e5e2e3;
  line-height: 1.2; padding-top: 24px;
}
.cg-guild-stats {
  display: flex; gap: 18px;
  padding-top: 10px;
  border-top: 1px solid rgba(59,73,75,0.15);
}
.cg-guild-stat-label {
  font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em;
  color: #b9cacb;
}
.cg-guild-stat-val {
  font-family: var(--font-headline, 'Space Grotesk');
  font-size: 16px; font-weight: 700; color: #e5e2e3;
  margin-top: 2px;
}

/* Community grid (legacy small tiles — still referenced elsewhere) */
.cg-dapp-community-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
  gap: 10px;
}
.cg-dapp-community-tile {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 12px 14px;
  background: #1c1b1c;
  border: 1px solid rgba(59,73,75,0.2);
  border-radius: 8px;
  color: #e5e2e3;
  text-decoration: none;
  font-size: 13px;
  font-weight: 600;
  transition: border-color 150ms, color 150ms;
}
.cg-dapp-community-tile:hover { border-color: rgba(0,219,233,0.4); color: #00dbe9; }
.cg-dapp-community-tile .material-symbols-outlined { font-size: 18px; }
.cg-no-data { color: #b9cacb; font-size: 14px; margin: 0; }

/* Community — Stitch redesign (hero + branded channel cards) */
.cg-community-hero {
  display: flex; flex-direction: column;
  gap: 18px;
  padding: 28px;
  margin-bottom: 20px;
  background:
    radial-gradient(circle at top right, rgba(0,219,233,0.08) 0%, transparent 60%),
    radial-gradient(circle at bottom left, rgba(207,92,255,0.06) 0%, transparent 60%),
    #1c1b1c;
  border: 1px solid rgba(0,219,233,0.15);
  border-radius: 16px;
  overflow: hidden;
  position: relative;
}
@media (min-width: 768px) {
  .cg-community-hero {
    flex-direction: row; align-items: center; justify-content: space-between;
  }
}
.cg-community-hero-eyebrow {
  font-size: 11px; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.12em;
  color: #00dbe9;
  margin-bottom: 6px;
}
.cg-community-hero-title {
  margin: 0;
  font-family: var(--font-headline, 'Space Grotesk');
  font-size: 22px; font-weight: 700;
  color: #e5e2e3;
  line-height: 1.2;
}
@media (min-width: 768px) {
  .cg-community-hero-title { font-size: 26px; }
}
.cg-community-hero-sub {
  margin: 8px 0 0 0;
  font-size: 13px; color: #b9cacb;
}
.cg-community-hero-actions {
  display: flex; flex-wrap: wrap; gap: 10px;
  flex-shrink: 0;
}
.cg-community-hero-ghost {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 10px 18px;
  background: #2a2a2b;
  border: 1px solid rgba(59,73,75,0.3);
  border-radius: 6px;
  color: #e5e2e3;
  font-size: 13px; font-weight: 700;
  text-transform: uppercase; letter-spacing: 0.06em;
  text-decoration: none;
  transition: background 150ms, border-color 150ms, color 150ms;
}
.cg-community-hero-ghost:hover {
  background: #3a393a;
  border-color: rgba(0,219,233,0.4);
  color: #00dbe9;
}
.cg-community-hero-ghost .material-symbols-outlined { font-size: 18px; }

.cg-community-channels {
  display: grid;
  grid-template-columns: 1fr;
  gap: 12px;
}
@media (min-width: 640px) { .cg-community-channels { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1024px) { .cg-community-channels { grid-template-columns: repeat(3, 1fr); } }
.cg-community-card {
  display: flex; align-items: center; gap: 14px;
  padding: 16px;
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 10px;
  text-decoration: none;
  transition: border-color 200ms, background 200ms, transform 200ms;
}
.cg-community-card:hover {
  background: #2a2a2b;
  border-color: var(--cg-brand, rgba(0,219,233,0.4));
  transform: translateY(-1px);
}
.cg-community-icon-wrap {
  width: 44px; height: 44px;
  border-radius: 10px;
  display: flex; align-items: center; justify-content: center;
  flex-shrink: 0;
}
.cg-community-icon-wrap .material-symbols-outlined { font-size: 22px; }
.cg-community-card-body { flex: 1; min-width: 0; }
.cg-community-card-name {
  font-family: var(--font-headline, 'Space Grotesk');
  font-size: 15px; font-weight: 700; color: #e5e2e3;
}
.cg-community-card-desc {
  font-size: 12px; color: #b9cacb; margin-top: 2px;
}
.cg-community-card-arrow {
  font-size: 18px !important; color: #b9cacb;
  transition: color 150ms, transform 150ms;
}
.cg-community-card:hover .cg-community-card-arrow {
  color: var(--cg-brand, #00dbe9);
  transform: translate(2px, -2px);
}

/* =================== RIGHT SIDEBAR =================== */
.cg-dapp-info-card,
.cg-dapp-side-block {
  padding: 24px;
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 16px;
}
.cg-dapp-info-card-title {
  font-family: var(--font-headline, 'Space Grotesk');
  font-size: 18px;
  font-weight: 700;
  color: #e5e2e3;
  margin: 0 0 18px 0;
}
.cg-dapp-info-rows { display: flex; flex-direction: column; }
.cg-dapp-info-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 12px;
  padding: 10px 0;
  border-bottom: 1px solid rgba(59,73,75,0.15);
}
.cg-dapp-info-row:last-child { border-bottom: none; }
.cg-dapp-info-key { color: #b9cacb; font-size: 13px; }
.cg-dapp-info-val { color: #e5e2e3; font-size: 13px; font-weight: 600; text-align: right; }
.cg-dapp-info-val-cyan { color: #00dbe9; font-weight: 700; }

.cg-dapp-info-card-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 18px;
}
.cg-dapp-info-btn {
  flex: 1 0 calc(50% - 4px);
  padding: 10px 14px;
  background: #2a2a2b;
  border: 1px solid rgba(59,73,75,0.3);
  border-radius: 6px;
  color: #e5e2e3;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  text-align: center;
  text-decoration: none;
  transition: background 150ms, color 150ms, border-color 150ms;
}
.cg-dapp-info-btn:hover { background: #3a393a; border-color: rgba(0,219,233,0.4); color: #00dbe9; }

.cg-dapp-info-card-socials {
  display: flex;
  justify-content: center;
  gap: 14px;
  margin-top: 16px;
  padding-top: 14px;
  border-top: 1px solid rgba(59,73,75,0.15);
  color: #b9cacb;
}
/* ⚠️ A bare inline <a> around a 22px glyph measures 22×19 — under the 24×24
 * WCAG 2.5.8 minimum, MEASURED at 390px in the s193 sweep. inline-flex with a
 * min box grows the target; the icon is centred so nothing moves visually. */
.cg-dapp-info-card-socials a {
  color: inherit; transition: color 150ms;
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 24px; min-height: 24px;
}
.cg-dapp-info-card-socials a:hover { color: #00dbe9; }
.cg-dapp-info-card-socials .material-symbols-outlined { font-size: 22px; }

/* Related Games (right sidebar list) */
.cg-dapp-rel-list { display: flex; flex-direction: column; gap: 6px; }
.cg-dapp-rel-row {
  display: flex;
  gap: 14px;
  padding: 10px;
  border-radius: 12px;
  text-decoration: none;
  transition: background 150ms;
}
.cg-dapp-rel-row:hover { background: #2a2a2b; }
.cg-dapp-rel-row-icon {
  width: 56px; height: 56px;
  border-radius: 10px;
  object-fit: cover;
  border: 1px solid rgba(59,73,75,0.15);
  flex-shrink: 0;
}
.cg-dapp-rel-row-info { display: flex; flex-direction: column; justify-content: center; min-width: 0; }
.cg-dapp-rel-row-name { font-weight: 700; font-size: 14px; color: #e5e2e3; }
.cg-dapp-rel-row:hover .cg-dapp-rel-row-name { color: #00dbe9; }
.cg-dapp-rel-row-genre { font-size: 10px; color: #b9cacb; text-transform: uppercase; letter-spacing: 0.08em; margin-top: 2px; }
.cg-dapp-rel-row-rating { display: flex; align-items: center; gap: 4px; margin-top: 4px; font-size: 11px; font-weight: 700; color: #e5e2e3; }
.cg-dapp-star { font-size: 14px !important; color: #fbbf24; font-variation-settings: 'FILL' 1; }

/* Mobile tweaks */
@media (max-width: 1023px) {
  .cg-dapp-hero { gap: 18px; }
  .cg-dapp-hero-cta { width: 100%; }
  .cg-btn-play-now { display: block; text-align: center; }
  .cg-tab-nav-sticky { padding: 0 16px; overflow-x: auto; white-space: nowrap; }
}
@media (max-width: 640px) {
  .cg-dapp-gallery-thumbs { grid-template-columns: repeat(2, 1fr); }
  .cg-dapp-info-btn { flex: 1 0 100%; }
}

/* =============================================================
 * Tokens tab — Stitch "The Sandbox - Tokens Tab - Reordered Nav"
 * ============================================================= */
.cg-tok-card {
  background: #1c1b1c;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 14px;
  overflow: hidden;
  box-shadow: 0 4px 24px rgba(0,0,0,0.3);
}
.cg-tok-card-head {
  padding: 28px;
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  flex-wrap: wrap;
  gap: 24px;
}
.cg-tok-symbol-block { display: flex; align-items: center; gap: 16px; }
.cg-tok-symbol-icon {
  width: 56px; height: 56px;
  border-radius: 50%;
  background: rgba(0,219,233,0.1);
  border: 1px solid rgba(0,219,233,0.2);
  display: flex; align-items: center; justify-content: center;
  color: #00dbe9;
}
.cg-tok-symbol-icon .material-symbols-outlined { font-size: 30px; }
.cg-tok-symbol-img { width: 56px; height: 56px; border-radius: 50%; object-fit: cover; }
.cg-tok-symbol-row { display: flex; align-items: center; gap: 10px; }
.cg-tok-symbol {
  font-family: var(--font-headline, 'Space Grotesk');
  font-size: 26px;
  font-weight: 800;
  color: #e5e2e3;
  margin: 0;
}
.cg-tok-rank-badge {
  background: #353436;
  color: #b9cacb;
  font-size: 10px;
  font-weight: 700;
  padding: 2px 8px;
  border-radius: 4px;
  letter-spacing: 0.04em;
}
.cg-tok-symbol-sub { color: #b9cacb; font-size: 13px; margin: 4px 0 0 0; }
.cg-tok-price-block { text-align: right; }
.cg-tok-price-big {
  font-family: var(--font-headline, 'Space Grotesk');
  font-size: 38px;
  font-weight: 800;
  color: #e5e2e3;
  line-height: 1;
}
.cg-tok-price-delta {
  display: inline-flex;
  align-items: center;
  font-size: 14px;
  font-weight: 700;
  margin-top: 6px;
}
.cg-tok-stats-grid {
  padding: 0 28px 24px;
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 24px;
}
@media (min-width: 768px) { .cg-tok-stats-grid { grid-template-columns: repeat(4, 1fr); } }
.cg-tok-stat-label {
  font-size: 10px;
  font-weight: 700;
  color: #b9cacb;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  margin-bottom: 6px;
}
.cg-tok-stat-val { font-size: 16px; font-weight: 600; color: #e5e2e3; }
.cg-tok-card-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0;
  border-top: 1px solid rgba(59,73,75,0.15);
  background: #201f20;
}
.cg-tok-action {
  flex: 1 1 33%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 16px;
  font-size: 13px;
  font-weight: 700;
  color: #e5e2e3;
  text-decoration: none;
  border-right: 1px solid rgba(59,73,75,0.15);
  transition: background 150ms, color 150ms;
}
.cg-tok-action:last-child { border-right: 0; }
.cg-tok-action:hover { background: #2a2a2b; color: #00dbe9; }
.cg-tok-action .material-symbols-outlined { font-size: 18px; }
.cg-tok-action-buy { color: #00dbe9; background: rgba(0,219,233,0.06); }
.cg-tok-action-buy:hover { background: rgba(0,219,233,0.14); }
@media (max-width: 640px) {
  .cg-tok-action { flex: 1 1 100%; border-right: 0; border-bottom: 1px solid rgba(59,73,75,0.15); }
  .cg-tok-action:last-child { border-bottom: 0; }
  .cg-tok-card-head { padding: 20px; }
  .cg-tok-stats-grid { padding: 0 20px 20px; }
  .cg-tok-price-block { text-align: left; }
}

/* =============================================================
 * NFT Data tab — Stitch "The Sandbox - NFT Data Tab - Reordered Nav"
 * ============================================================= */
.cg-nft-tiles {
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;
}
@media (min-width: 640px) { .cg-nft-tiles { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1024px) { .cg-nft-tiles { grid-template-columns: repeat(4, 1fr); } }
.cg-nft-tile {
  background: #1c1b1c;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 12px;
  padding: 22px;
}
.cg-nft-tile-label {
  font-size: 10px;
  color: #b9cacb;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  font-weight: 700;
  margin-bottom: 8px;
}
.cg-nft-tile-val {
  font-family: var(--font-headline, 'Space Grotesk');
  font-size: 26px;
  font-weight: 800;
  color: #e5e2e3;
  display: flex;
  align-items: baseline;
  gap: 10px;
  flex-wrap: wrap;
}
.cg-nft-tile-delta {
  font-size: 13px;
  font-weight: 700;
  font-family: 'Inter', sans-serif;
}

.cg-nft-intervals {
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;
  margin-top: 24px;
}
@media (min-width: 768px) { .cg-nft-intervals { grid-template-columns: repeat(3, 1fr); } }
.cg-nft-interval {
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 12px;
  padding: 18px 20px;
}
.cg-nft-interval-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 12px;
}
.cg-nft-interval-label {
  font-size: 12px;
  font-weight: 800;
  color: #00dbe9;
  text-transform: uppercase;
  letter-spacing: 0.1em;
}
.cg-nft-interval-rows { display: flex; flex-direction: column; gap: 8px; }
.cg-nft-interval-row {
  display: flex;
  justify-content: space-between;
  font-size: 13px;
}
.cg-nft-interval-row > span:first-child { color: #b9cacb; }
.cg-nft-interval-row > span:last-child { color: #e5e2e3; font-weight: 700; }

.cg-nft-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 24px;
}
.cg-nft-actions .cg-tok-action {
  flex: 0 1 auto;
  border: 1px solid rgba(59,73,75,0.3);
  border-radius: 8px;
  padding: 12px 20px;
}
.cg-nft-actions .cg-tok-action:hover { border-color: rgba(0,219,233,0.4); }

/* ---------- Multi-collection NFT Data section (rebuild) ---------- */
.cg-nft-section { /* full-width inside .cg-dapp-fullwidth wrapper */ }

/* Tab strip — only visible when 2+ collections */
.cg-nft-tabstrip {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin: 14px 0 18px;
  padding-bottom: 4px;
  overflow-x: auto;
}
.cg-nft-tab-btn {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 8px 14px;
  background: #1c1b1c;
  border: 1px solid rgba(59,73,75,0.25);
  border-radius: 999px;
  color: #b9cacb;
  font-family: var(--font-headline, 'Space Grotesk');
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.01em;
  cursor: pointer;
  transition: border-color 150ms, color 150ms, background 150ms;
}
.cg-nft-tab-btn:hover { border-color: rgba(0,219,233,0.4); color: #e5e2e3; }
.cg-nft-tab-btn.is-active {
  background: rgba(0,219,233,0.08);
  border-color: rgba(0,219,233,0.5);
  color: #00dbe9;
}
.cg-nft-tab-logo {
  width: 22px; height: 22px;
  border-radius: 50%;
  object-fit: cover;
  flex-shrink: 0;
}
.cg-nft-tab-name { white-space: nowrap; }

/* Chain badge — used in tab strip and card meta */
.cg-nft-chain-badge {
  display: inline-flex;
  align-items: center;
  padding: 2px 8px;
  background: rgba(0,219,233,0.08);
  color: #00dbe9;
  border-radius: 999px;
  font-size: 10px;
  font-weight: 800;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  white-space: nowrap;
}

/* Panels — only the active one renders */
.cg-nft-panels { position: relative; }
.cg-nft-panel { display: none; }
.cg-nft-panel.is-active { display: block; }

/* Banner — slim hero on top of each card */
.cg-nft-banner {
  height: 140px;
  background-size: cover;
  background-position: center;
  border-radius: 14px 14px 0 0;
  margin-bottom: -56px;
  position: relative;
  z-index: 0;
}

/* Card head: avatar + title + meta */
.cg-nft-card-head {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 18px 20px;
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 14px;
  position: relative;
  z-index: 1;
}
.cg-nft-card-head-on-banner {
  border-top-left-radius: 0;
  border-top-right-radius: 0;
  border-top: 0;
  margin-top: 0;
  padding-left: 92px;
  position: relative;
}
.cg-nft-card-head-on-banner .cg-nft-card-logo {
  position: absolute;
  left: 16px;
  bottom: 12px;
  width: 64px;
  height: 64px;
  border: 3px solid #201f20;
}
.cg-nft-card-logo {
  width: 56px;
  height: 56px;
  border-radius: 12px;
  object-fit: cover;
  flex-shrink: 0;
  background: #1c1b1c;
}
.cg-nft-card-title-block { min-width: 0; flex: 1; }
.cg-nft-card-title {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin: 0 0 4px 0;
  font-family: var(--font-headline, 'Space Grotesk');
  font-size: 22px;
  font-weight: 800;
  color: #e5e2e3;
  line-height: 1.15;
}
.cg-nft-verified {
  font-size: 18px !important;
  color: #00dbe9;
}
.cg-nft-card-meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  font-size: 12px;
  color: #b9cacb;
}
.cg-nft-card-meta-sep { color: rgba(185,202,203,0.45); margin: 0 2px; }

/* Action button row */
.cg-nft-card-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin: 14px 0 0;
}
.cg-nft-card-actions .cg-tok-action {
  flex: 0 1 auto;
  border: 1px solid rgba(59,73,75,0.3);
  border-radius: 8px;
  padding: 10px 16px;
  font-size: 13px;
}
.cg-nft-card-actions .cg-tok-action:hover { border-color: rgba(0,219,233,0.4); }

/* Description — collapsible when long */
.cg-nft-card-desc {
  margin: 16px 0 0;
  font-size: 14px;
  color: #c8d3d4;
  line-height: 1.55;
}
.cg-nft-card-desc summary {
  cursor: pointer;
  list-style: none;
}
.cg-nft-card-desc summary::-webkit-details-marker { display: none; }
.cg-nft-readmore {
  display: inline-block;
  margin-left: 4px;
  color: #00dbe9;
  font-weight: 700;
  font-size: 12px;
}
.cg-nft-card-desc details[open] summary { display: none; }
.cg-nft-card-desc p { margin: 0; }

/* Slot the card sub-blocks together with consistent spacing */
.cg-nft-panel > .cg-nft-tiles,
.cg-nft-panel > .cg-nft-intervals,
.cg-nft-panel > .cg-nft-items,
.cg-nft-panel > .cg-nft-payments,
.cg-nft-panel > .cg-nft-contracts {
  margin-top: 18px;
}

/* Flag pill: NSFW / "Trait offers" / "Collection offers" */
.cg-nft-flag {
  display: inline-block;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: 10px;
  font-weight: 800;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  vertical-align: middle;
}
.cg-nft-flag-nsfw { background: rgba(255,90,90,0.15); color: #ff8a8a; margin-left: 4px; }
.cg-nft-flag-on   { background: rgba(0,219,233,0.08); color: #00dbe9; }

/* Featured items grid */
.cg-nft-items {
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 14px;
  padding: 18px 20px;
}
.cg-nft-items-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 12px;
}
.cg-nft-items-label {
  font-family: var(--font-headline, 'Space Grotesk');
  font-weight: 800;
  font-size: 14px;
  color: #e5e2e3;
  letter-spacing: 0.02em;
}
.cg-nft-items-all {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  color: #00dbe9;
  font-size: 12px;
  font-weight: 700;
  text-decoration: none;
}
.cg-nft-items-all .material-symbols-outlined { font-size: 14px; }
.cg-nft-items-all:hover { text-decoration: underline; }
.cg-nft-items-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 10px;
}
@media (min-width: 480px) { .cg-nft-items-grid { grid-template-columns: repeat(4, 1fr); } }
@media (min-width: 1024px) { .cg-nft-items-grid { grid-template-columns: repeat(8, 1fr); } }
.cg-nft-item {
  display: block;
  text-decoration: none;
  color: #e5e2e3;
  background: #1c1b1c;
  border: 1px solid rgba(59,73,75,0.2);
  border-radius: 10px;
  overflow: hidden;
  transition: border-color 150ms, transform 150ms;
}
a.cg-nft-item:hover { border-color: rgba(0,219,233,0.4); transform: translateY(-2px); }
.cg-nft-item-img {
  width: 100%;
  aspect-ratio: 1 / 1;
  background-size: cover;
  background-position: center;
  background-color: #161516;
}
.cg-nft-item-name {
  padding: 6px 8px;
  font-size: 11px;
  font-weight: 700;
  color: #b9cacb;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Payment tokens row */
.cg-nft-payments {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 10px;
  padding: 12px 14px;
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 12px;
}
.cg-nft-payments-label {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #b9cacb;
}
.cg-nft-payments-list {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}
.cg-nft-payment-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px 4px 4px;
  background: #1c1b1c;
  border: 1px solid rgba(59,73,75,0.25);
  border-radius: 999px;
  font-size: 11px;
  font-weight: 700;
  color: #e5e2e3;
  letter-spacing: 0.04em;
}
.cg-nft-payment-chip img {
  width: 18px; height: 18px;
  border-radius: 50%;
  background: #0d0c0d;
}

/* ---------- Sub-tabs: Overview / Items / Activity / Holders / Analytics ---------- */
.cg-nft-subtabstrip {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  margin: 18px 0 14px;
  padding: 4px;
  background: #1a191a;
  border: 1px solid rgba(59,73,75,0.2);
  border-radius: 12px;
}
.cg-nft-subtab-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 8px 14px;
  background: transparent;
  border: 0;
  border-radius: 8px;
  color: #b9cacb;
  font-family: var(--font-headline, 'Space Grotesk');
  font-size: 13px;
  font-weight: 700;
  cursor: pointer;
  transition: background 150ms, color 150ms;
}
.cg-nft-subtab-btn:hover { color: #e5e2e3; }
.cg-nft-subtab-btn.is-active {
  background: rgba(0,219,233,0.1);
  color: #00dbe9;
}
.cg-nft-subtab-btn .material-symbols-outlined { font-size: 16px; }

.cg-nft-subpanel { display: none; }
.cg-nft-subpanel.is-active { display: flex; flex-direction: column; gap: 18px; }

/* ---------- Activity table ---------- */
.cg-nft-activity {
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 14px;
  overflow: hidden;
}
.cg-nft-activity-head,
.cg-nft-activity-row {
  display: grid;
  grid-template-columns: 24px 80px minmax(160px, 1.6fr) 100px 110px 110px 80px;
  gap: 10px;
  align-items: center;
  padding: 10px 16px;
  font-size: 12px;
}
.cg-nft-activity-head {
  background: #1a191a;
  color: #b9cacb;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  font-size: 10px;
  border-bottom: 1px solid rgba(59,73,75,0.2);
}
.cg-nft-activity-row + .cg-nft-activity-row { border-top: 1px solid rgba(59,73,75,0.1); }
.cg-nft-activity-row:hover { background: #25232425; }
.cg-nft-activity-icon { color: #00dbe9; font-size: 18px !important; }
.cg-nft-activity-sale { color: #abd600; }
.cg-nft-activity-type { color: #e5e2e3; font-weight: 700; }
.cg-nft-activity-item {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  text-decoration: none;
  color: #e5e2e3;
  min-width: 0;
}
.cg-nft-activity-thumb {
  width: 28px; height: 28px;
  background-size: cover;
  background-position: center;
  border-radius: 6px;
  flex-shrink: 0;
  background-color: #161516;
}
.cg-nft-activity-name {
  font-weight: 700;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
a.cg-nft-activity-item:hover .cg-nft-activity-name { color: #00dbe9; }
.cg-nft-activity-price { color: #e5e2e3; font-weight: 800; font-family: 'JetBrains Mono', ui-monospace, monospace; }
.cg-nft-activity-addr { color: #b9cacb; font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 11px; }
.cg-nft-activity-time { color: #b9cacb; font-size: 11px; text-align: right; }

@media (max-width: 760px) {
  .cg-nft-activity-head { display: none; }
  .cg-nft-activity-row {
    grid-template-columns: 24px 1fr auto;
    grid-template-areas:
      "icon item price"
      ". meta time";
    row-gap: 4px;
  }
  .cg-nft-activity-icon { grid-area: icon; }
  .cg-nft-activity-type { display: none; }
  .cg-nft-activity-item { grid-area: item; }
  .cg-nft-activity-price { grid-area: price; text-align: right; }
  .cg-nft-activity-addr:first-of-type,
  .cg-nft-activity-addr:nth-of-type(2) { grid-area: meta; }
  .cg-nft-activity-addr:nth-of-type(2) { display: none; }
  .cg-nft-activity-time { grid-area: time; text-align: right; }
}

/* ---------- Holders list ---------- */
.cg-nft-holders {
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 14px;
  overflow: hidden;
}
.cg-nft-holders-head,
.cg-nft-holder-row {
  display: grid;
  grid-template-columns: minmax(200px, 2fr) 90px 90px 100px;
  gap: 12px;
  align-items: center;
  padding: 10px 16px;
  font-size: 12px;
}
.cg-nft-holders-head {
  background: #1a191a;
  color: #b9cacb;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  font-size: 10px;
  border-bottom: 1px solid rgba(59,73,75,0.2);
}
.cg-nft-holder-row + .cg-nft-holder-row { border-top: 1px solid rgba(59,73,75,0.1); }
.cg-nft-holder-addr {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  text-decoration: none;
  color: #e5e2e3;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 12px;
  padding: 4px 8px;
  border-radius: 6px;
  overflow: hidden;
  z-index: 0;
}
.cg-nft-holder-bar {
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, rgba(0,219,233,0.18), rgba(0,219,233,0.04));
  z-index: -1;
  border-radius: 6px;
}
.cg-nft-holder-rank { color: #b9cacb; font-weight: 700; min-width: 28px; }
.cg-nft-holder-hash { font-weight: 700; }
a.cg-nft-holder-addr:hover .cg-nft-holder-hash { color: #00dbe9; }
.cg-nft-holder-tokens { color: #e5e2e3; font-weight: 800; }
.cg-nft-holder-listed,
.cg-nft-holder-pct { color: #b9cacb; }
.cg-nft-holders-foot {
  padding: 10px 16px;
  font-size: 11px;
  color: #7a8a8b;
  background: #1a191a;
  border-top: 1px solid rgba(59,73,75,0.2);
}

/* ---------- Analytics tab — KPI + table + line chart ---------- */

/* Headline: big floor price + 24h delta */
.cg-nft-an-headline {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 18px 22px;
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 14px;
}
.cg-nft-an-headline-label {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #b9cacb;
}
.cg-nft-an-headline-row {
  display: flex;
  align-items: baseline;
  gap: 18px;
  flex-wrap: wrap;
}
.cg-nft-an-headline-val {
  font-family: var(--font-headline, 'Space Grotesk');
  font-weight: 800;
  font-size: 32px;
  color: #e5e2e3;
  letter-spacing: -0.01em;
  line-height: 1.05;
}
.cg-nft-an-headline-delta {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 14px;
  font-weight: 800;
}
.cg-nft-an-headline-delta .material-symbols-outlined { font-size: 18px; }
.cg-nft-an-headline-delta-period {
  margin-left: 6px;
  color: #7a8a8b;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

/* Activity table */
.cg-nft-an-table {
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 14px;
  padding: 18px 20px 14px;
}
.cg-nft-an-table-title {
  font-family: var(--font-headline, 'Space Grotesk');
  font-weight: 800;
  font-size: 13px;
  color: #e5e2e3;
  margin-bottom: 14px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}
.cg-nft-an-table-grid {
  display: grid;
  grid-template-columns: 60px repeat(5, minmax(0, 1fr));
  gap: 8px 16px;
  align-items: center;
}
.cg-nft-an-table-head {
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: #7a8a8b;
  padding-bottom: 8px;
  border-bottom: 1px solid rgba(59,73,75,0.18);
}
.cg-nft-an-table-period {
  font-family: var(--font-headline, 'Space Grotesk');
  font-weight: 800;
  font-size: 14px;
  color: #00dbe9;
  letter-spacing: 0.04em;
  padding: 8px 0;
}
.cg-nft-an-table-cell {
  font-size: 13px;
  color: #e5e2e3;
  font-weight: 600;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  padding: 8px 0;
}
.cg-nft-an-table-rate { color: #abd600; font-weight: 800; }
.cg-nft-an-table-foot {
  margin-top: 12px;
  padding-top: 12px;
  border-top: 1px solid rgba(59,73,75,0.18);
  font-size: 11px;
  color: #7a8a8b;
  line-height: 1.5;
  font-style: italic;
}
@media (max-width: 760px) {
  .cg-nft-an-table-grid {
    grid-template-columns: 60px 1fr 1fr;
  }
  .cg-nft-an-table-grid > .cg-nft-an-table-head:nth-child(n+4),
  .cg-nft-an-table-grid > .cg-nft-an-table-cell:nth-of-type(n+3) { display: none; }
}

/* Momentum bars — horizontal, all in same units (X / day) */
.cg-nft-an-momentum {
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 14px;
  padding: 18px 20px;
}
.cg-nft-an-momentum-title {
  font-family: var(--font-headline, 'Space Grotesk');
  font-weight: 800;
  font-size: 13px;
  color: #e5e2e3;
  margin-bottom: 14px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}
.cg-nft-an-momentum-bars {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.cg-nft-an-momentum-bar {
  display: grid;
  grid-template-columns: 50px 1fr;
  gap: 12px;
  align-items: center;
}
.cg-nft-an-momentum-bar-label {
  font-family: var(--font-headline, 'Space Grotesk');
  font-weight: 800;
  font-size: 13px;
  color: #00dbe9;
  letter-spacing: 0.04em;
}
.cg-nft-an-momentum-bar-track {
  position: relative;
  height: 28px;
  background: #1c1b1c;
  border-radius: 6px;
  overflow: hidden;
}
.cg-nft-an-momentum-bar-fill {
  height: 100%;
  background: linear-gradient(90deg, rgba(0,219,233,0.35), #00dbe9);
  border-radius: 6px;
  transition: width 350ms;
}
.cg-nft-an-momentum-bar-val {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  padding-left: 10px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 12px;
  font-weight: 800;
  color: #e5e2e3;
}

/* Floor price line chart (SVG) */
.cg-nft-an-chart {
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 14px;
  padding: 18px 20px;
}
.cg-nft-an-chart-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 12px;
  flex-wrap: wrap;
  gap: 8px;
}
.cg-nft-an-chart-title {
  font-family: var(--font-headline, 'Space Grotesk');
  font-weight: 800;
  font-size: 13px;
  color: #e5e2e3;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}
.cg-nft-an-chart-range {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  color: #b9cacb;
  font-weight: 700;
}
.cg-nft-an-chart-sep { color: #7a8a8b; margin: 0 6px; }
.cg-nft-an-chart-svg {
  width: 100%;
  height: auto;
  display: block;
}
.cg-nft-an-chart-foot {
  margin-top: 8px;
  font-size: 10px;
  color: #7a8a8b;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

/* Contracts (multi-chain) chips */
.cg-nft-contracts {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 14px 16px;
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 12px;
}
.cg-nft-contracts-label {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: #b9cacb;
}
.cg-nft-contracts-list {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.cg-nft-contract-chip {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 6px 10px;
  background: #1c1b1c;
  border: 1px solid rgba(59,73,75,0.25);
  border-radius: 999px;
  font-size: 12px;
  text-decoration: none;
  color: #e5e2e3;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  transition: border-color 150ms;
}
a.cg-nft-contract-chip:hover { border-color: rgba(0,219,233,0.4); color: #00dbe9; }
.cg-nft-contract-addr { letter-spacing: 0.02em; }
.cg-nft-contract-ext { font-size: 14px !important; opacity: 0.6; }
a.cg-nft-contract-chip:hover .cg-nft-contract-ext { opacity: 1; }

/* When a panel has multiple sibling cards (banner + head merged), add gap-recovery */
.cg-nft-panel { padding: 0; }

/* Mobile tweaks */
@media (max-width: 640px) {
  .cg-nft-banner { margin-bottom: -40px; height: 100px; }
  .cg-nft-card-head-on-banner { padding-left: 80px; }
  .cg-nft-card-head-on-banner .cg-nft-card-logo {
    width: 56px; height: 56px; bottom: 10px;
  }
  .cg-nft-card-title { font-size: 18px; }
}

/* 7D / 30D / 1Y change strip on token card */
.cg-tok-change-row {
  display: flex;
  border-top: 1px solid rgba(59,73,75,0.15);
  background: #201f20;
}
.cg-tok-change-cell {
  flex: 1;
  text-align: center;
  padding: 12px 8px;
  border-right: 1px solid rgba(59,73,75,0.15);
}
.cg-tok-change-cell:last-child { border-right: 0; }
.cg-tok-change-label {
  font-size: 10px;
  font-weight: 700;
  color: #b9cacb;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  margin-bottom: 4px;
}
.cg-tok-change-val { font-size: 14px; font-weight: 700; }

/* Token Box: native chain + linked games */
.cg-token-box {
  margin-top: 20px;
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 14px;
  overflow: hidden;
}
.cg-token-box-rows {
  padding: 18px 24px;
  display: flex;
  flex-direction: column;
}
.cg-token-box-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 12px;
  padding: 8px 0;
  font-size: 13px;
  border-bottom: 1px solid rgba(59,73,75,0.12);
}
.cg-token-box-row:last-child { border-bottom: 0; }
.cg-token-box-key { color: #b9cacb; font-weight: 500; }
.cg-token-box-val { color: #e5e2e3; font-weight: 700; text-align: right; }
.cg-token-box-val-mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; }
.cg-token-box-val a { color: #00dbe9; text-decoration: none; }
.cg-token-box-val a:hover { text-decoration: underline; }

.cg-token-box-games {
  border-top: 1px solid rgba(59,73,75,0.15);
  padding: 18px 24px;
  background: #1c1b1c;
}
.cg-token-box-games-title {
  font-size: 11px;
  font-weight: 800;
  color: #00dbe9;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  margin-bottom: 12px;
}
.cg-token-box-games-list {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.cg-token-box-game {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 8px 14px 8px 8px;
  background: #2a2a2b;
  border: 1px solid rgba(59,73,75,0.2);
  border-radius: 9999px;
  text-decoration: none;
  color: #e5e2e3;
  font-size: 13px;
  font-weight: 600;
  transition: border-color 150ms, color 150ms, background 150ms;
}
.cg-token-box-game:hover { border-color: rgba(0,219,233,0.4); color: #00dbe9; }
.cg-token-box-game.is-current {
  background: rgba(0,219,233,0.1);
  border-color: rgba(0,219,233,0.4);
  color: #00dbe9;
  pointer-events: none;
}
.cg-token-box-game-icon {
  width: 24px; height: 24px;
  border-radius: 50%;
  object-fit: cover;
  flex-shrink: 0;
}
/* Token price chart */
.cg-tok-chart {
  border-top: 1px solid rgba(59,73,75,0.15);
  background: #1c1b1c;
  padding: 18px 24px 16px;
}
.cg-tok-chart-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 12px;
  margin-bottom: 12px;
}
.cg-tok-chart-title {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-headline, 'Space Grotesk');
  font-weight: 700;
  color: #e5e2e3;
  font-size: 15px;
}
.cg-tok-chart-title .material-symbols-outlined { font-size: 18px; color: #00dbe9; }
.cg-tok-chart-range-pct { font-size: 13px; font-weight: 700; margin-left: 6px; }
.cg-tok-chart-ranges {
  display: inline-flex;
  background: #2a2a2b;
  border: 1px solid rgba(59,73,75,0.2);
  border-radius: 6px;
  padding: 2px;
  gap: 2px;
}
.cg-tok-chart-range {
  background: transparent;
  border: 0;
  color: #b9cacb;
  font-family: inherit;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.06em;
  padding: 6px 12px;
  border-radius: 4px;
  cursor: pointer;
  transition: background 120ms, color 120ms;
}
.cg-tok-chart-range:hover { color: #e5e2e3; }
.cg-tok-chart-range.is-active {
  background: rgba(0,219,233,0.18);
  color: #00dbe9;
}
.cg-tok-chart-canvas {
  position: relative;
  height: 200px;
  width: 100%;
  background: linear-gradient(180deg, transparent 0%, rgba(0,219,233,0.03) 100%);
  border-radius: 8px;
  overflow: hidden;
}
.cg-tok-chart-svg {
  width: 100%;
  height: 100%;
  display: block;
  filter: drop-shadow(0 0 6px rgba(0,219,233,0.25));
}
.cg-tok-chart-loading,
.cg-tok-chart-error {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 12px;
  color: #b9cacb;
  background: rgba(28,27,28,0.85);
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}
.cg-tok-chart-error { color: #ffb4ab; }
.cg-tok-chart-foot {
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 10px;
  font-size: 11px;
  color: #7a8a8b;
  font-weight: 600;
  letter-spacing: 0.04em;
}
.cg-tok-chart-foot-min { color: #ffb4ab; }
.cg-tok-chart-foot-max { color: #abd600; }

/* Tokens-tab side-by-side grid: Where to Buy (left) | Community + Developer Activity (right) */
.cg-tok-grid {
  margin-top: 20px;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
  align-items: start;
}
.cg-tok-grid-left,
.cg-tok-grid-right {
  display: flex;
  flex-direction: column;
  gap: 16px;
  min-width: 0;
}
.cg-tok-grid .cg-tok-exch,
.cg-tok-grid .cg-tok-community,
.cg-tok-grid .cg-tok-dev { margin-top: 0; }
@media (max-width: 900px) {
  .cg-tok-grid { grid-template-columns: 1fr; }
}

/* Affiliate marker on Where-to-Buy rows */
.cg-tok-exch-aff {
  display: inline-block;
  margin-left: 6px;
  color: #00dbe9;
  font-size: 11px;
  vertical-align: middle;
  line-height: 1;
}
.cg-tok-exch-row-aff { background: linear-gradient(90deg, rgba(0,219,233,0.05), transparent 70%); }

/* Where to Buy — exchange tickers */
.cg-tok-exch {
  margin-top: 20px;
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 14px;
  padding: 22px 24px;
}
.cg-tok-exch-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 14px;
}
.cg-tok-exch-title {
  font-family: var(--font-headline, 'Space Grotesk');
  font-weight: 800;
  font-size: 18px;
  color: #e5e2e3;
  margin: 0;
}
.cg-tok-exch-all {
  color: #00dbe9;
  font-size: 12px;
  font-weight: 700;
  text-decoration: none;
}
.cg-tok-exch-all:hover { text-decoration: underline; }
.cg-tok-exch-list {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.cg-tok-exch-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 12px;
  padding: 10px 12px;
  border-radius: 10px;
  text-decoration: none;
  color: inherit;
  transition: background 150ms;
}
a.cg-tok-exch-row:hover { background: #2a2a2b; }
.cg-tok-exch-left { display: flex; align-items: center; gap: 12px; min-width: 0; }
.cg-tok-exch-init {
  width: 32px; height: 32px;
  border-radius: 50%;
  background: rgba(0,219,233,0.1);
  color: #00dbe9;
  display: flex; align-items: center; justify-content: center;
  font-size: 11px;
  font-weight: 800;
  letter-spacing: 0.04em;
  flex-shrink: 0;
}
.cg-tok-exch-name { font-size: 14px; font-weight: 700; color: #e5e2e3; }
.cg-tok-exch-pair { font-size: 11px; color: #b9cacb; margin-top: 2px; }
.cg-tok-exch-right { text-align: right; min-width: 0; }
.cg-tok-exch-price { font-size: 13px; font-weight: 700; color: #e5e2e3; }
.cg-tok-exch-liq { display: inline-flex; align-items: center; gap: 8px; font-size: 11px; color: #b9cacb; margin-top: 2px; }
.cg-tok-exch-vol { font-weight: 600; }
.cg-tok-exch-trust { display: inline-flex; align-items: center; gap: 4px; font-weight: 700; }
.cg-tok-exch-dot { width: 6px; height: 6px; border-radius: 50%; display: inline-block; }
.cg-liq-high { color: #abd600; }
.cg-liq-high .cg-tok-exch-dot { background: #abd600; }
.cg-liq-mod  { color: #ecb2ff; }
.cg-liq-mod  .cg-tok-exch-dot { background: #ecb2ff; }
.cg-liq-low  { color: #ffb4ab; }
.cg-liq-low  .cg-tok-exch-dot { background: #ffb4ab; }

/* Community + Developer shared tile pattern */
.cg-tok-community,
.cg-tok-dev {
  margin-top: 20px;
  background: #201f20;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 14px;
  padding: 22px 24px;
}
.cg-tok-community-title {
  font-family: var(--font-headline, 'Space Grotesk');
  font-weight: 800;
  font-size: 18px;
  color: #e5e2e3;
  margin: 0 0 16px 0;
}
.cg-tok-community-tiles {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
  gap: 12px;
}
.cg-tok-community-tile {
  display: flex;
  align-items: center;
  gap: 12px;
  background: #1c1b1c;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 10px;
  padding: 14px 16px;
}
.cg-tok-community-tile-icon {
  font-size: 22px !important;
  color: #00dbe9;
  background: rgba(0,219,233,0.08);
  width: 36px; height: 36px;
  display: flex; align-items: center; justify-content: center;
  border-radius: 50%;
  flex-shrink: 0;
}
.cg-tok-community-tile-val {
  font-family: var(--font-headline, 'Space Grotesk');
  font-size: 18px;
  font-weight: 800;
  color: #e5e2e3;
  line-height: 1;
}
.cg-tok-community-tile-label {
  font-size: 11px;
  color: #b9cacb;
  margin-top: 4px;
  letter-spacing: 0.04em;
}

/* Sentiment bar */
.cg-tok-sentiment {
  margin-top: 14px;
  background: #1c1b1c;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 10px;
  padding: 14px 16px;
}
.cg-tok-sentiment-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 8px;
  font-size: 12px;
  margin-bottom: 8px;
}
.cg-tok-sentiment-label { color: #b9cacb; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; }
.cg-tok-sentiment-pcts { display: inline-flex; gap: 14px; font-size: 12px; font-weight: 700; }
.cg-tok-sentiment-bar {
  height: 6px;
  background: rgba(255,180,171,0.18);
  border-radius: 999px;
  overflow: hidden;
}
.cg-tok-sentiment-up {
  height: 100%;
  background: linear-gradient(90deg, #abd600, #00dbe9);
}

/* Community / dev links row */
.cg-tok-community-links {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 14px;
}
.cg-tok-community-link {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 8px 14px;
  background: #1c1b1c;
  border: 1px solid rgba(59,73,75,0.2);
  border-radius: 999px;
  text-decoration: none;
  color: #e5e2e3;
  font-size: 12px;
  font-weight: 600;
  transition: border-color 150ms, color 150ms;
}
.cg-tok-community-link:hover { border-color: rgba(0,219,233,0.4); color: #00dbe9; }
.cg-tok-community-link .material-symbols-outlined { font-size: 16px; }

/* Updated chip — neutral, alongside social pills */
.cg-tok-community-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  background: transparent;
  border: 1px dashed rgba(185,202,203,0.25);
  border-radius: 999px;
  color: #b9cacb;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.02em;
  cursor: default;
}
.cg-tok-community-chip .material-symbols-outlined { font-size: 14px; }

/* Explorer dropdown (native <details>/<summary>) */
.cg-tok-explorer-dd {
  position: relative;
  display: inline-block;
}
.cg-tok-explorer-summary {
  cursor: pointer;
  list-style: none;
  user-select: none;
}
.cg-tok-explorer-summary::-webkit-details-marker { display: none; }
.cg-tok-explorer-summary::marker { content: ''; }
.cg-tok-dd-caret {
  font-size: 10px;
  color: #b9cacb;
  margin-left: 2px;
  transition: transform 150ms;
}
.cg-tok-explorer-dd[open] .cg-tok-explorer-summary {
  border-color: rgba(0,219,233,0.4);
  color: #00dbe9;
}
.cg-tok-explorer-dd[open] .cg-tok-dd-caret { transform: rotate(180deg); color: #00dbe9; }
.cg-tok-explorer-list {
  position: absolute;
  top: calc(100% + 6px);
  left: 0;
  z-index: 30;
  min-width: 200px;
  display: flex;
  flex-direction: column;
  background: #1c1b1c;
  border: 1px solid rgba(59,73,75,0.4);
  border-radius: 10px;
  padding: 6px;
  box-shadow: 0 8px 28px rgba(0,0,0,0.45);
}
.cg-tok-explorer-list a {
  display: block;
  padding: 8px 12px;
  color: #e5e2e3;
  text-decoration: none;
  font-size: 12px;
  font-weight: 600;
  border-radius: 6px;
}
.cg-tok-explorer-list a:hover { background: rgba(0,219,233,0.08); color: #00dbe9; }

/* Token Facts mini-row */
.cg-tok-facts {
  margin-top: 20px;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
  gap: 12px;
}
.cg-tok-fact {
  display: flex;
  flex-direction: column;
  background: #1c1b1c;
  border: 1px solid rgba(59,73,75,0.15);
  border-radius: 10px;
  padding: 12px 14px;
}
.cg-tok-fact-key {
  font-size: 10px;
  font-weight: 700;
  color: #b9cacb;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  margin-bottom: 4px;
}
.cg-tok-fact-val {
  font-size: 13px;
  font-weight: 700;
  color: #e5e2e3;
  text-decoration: none;
  word-break: break-word;
}
a.cg-tok-fact-val:hover { color: #00dbe9; }

.cg-token-box-game-tag {
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: #00dbe9;
  background: rgba(0,219,233,0.15);
  padding: 2px 6px;
  border-radius: 4px;
  margin-left: 4px;
}

/* =========================================================================
   SIMILAR GAMES — the full-width "more like this" row on a single game page.

   Uses the page's existing tokens on purpose (panel #232324, hairline #3a3a3c,
   cyan #00dbe9, Space Grotesk headings) so it reads as part of the page rather
   than as a bolted-on widget. The rail version above it keeps its own
   .cg-dapp-rel-* rules — this is only the grid.
   ========================================================================= */
.cg-similar-section { margin-top: 8px; }

/* s228: the editorial ranking's link under the similar-games row. */
.cg-editorial-pick-wrap { margin: 24px 0 0; }
.cg-editorial-pick {
	display: inline-block;
	font-size: 14px;
	font-weight: 600;
	color: var(--cg-accent, #00dbe9);
	text-decoration: none;
	border-bottom: 1px solid currentColor;
}
.cg-editorial-pick:hover { opacity: .85; }
.cg-similar-sub {
  margin: -6px 0 18px;
  font-size: 13px;
  line-height: 1.6;
  color: #b9cacb;
  max-width: 70ch;
}

.cg-similar-grid {
  display: grid;
  /* auto-fill, not auto-fit: with fewer cards than columns auto-fit stretches
     them to full width and one lonely recommendation becomes a banner. */
  grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
  gap: 16px;
}

.cg-similar-card {
  display: flex;
  flex-direction: column;
  background: #232324;
  border: 1px solid #3a3a3c;
  border-radius: 10px;
  overflow: hidden;
  text-decoration: none;
  transition: border-color .18s ease, transform .18s ease;
}
.cg-similar-card:hover { border-color: #00dbe9; transform: translateY(-2px); }

.cg-similar-art {
  position: relative;
  aspect-ratio: 16 / 9;
  background: #1a1a1b;
  overflow: hidden;
}
.cg-similar-art img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
/* Most games only have a scraped 150x150 logo. Stretching one across a 16:9
   card is the blur the owner reported on the hero, so a logo is CONTAINED and
   sat on a backdrop instead of being upscaled. Same decision as .cg-hero-game--logo. */
.cg-similar-art--logo img { object-fit: contain; padding: 18px; }

/* ⭐⭐⭐ `.cg-similar-art img.cg-similar-badge`, NOT `.cg-similar-badge`.
   The badge is an <img> inside .cg-similar-art, so `.cg-similar-art img`
   above (0,1,1) outranked a bare `.cg-similar-badge` (0,1,0) and its
   `width:100%;height:100%` won. The 32px corner badge was therefore drawn
   FULL BLEED over the cover art on every non-logo card — the artwork was
   fetched, decoded, and then completely covered by the game's logo. Nothing
   reported it because both images loaded fine; only measuring the rendered
   box (209 CSS px where the rule says 32) showed it.
   The fix is specificity, not !important, and not narrowing the rule above:
   ShortPixel wraps SOME of these images in a <picture>, so a child
   combinator would stop matching on exactly the cards it rewrote. */
.cg-similar-art img.cg-similar-badge {
  position: absolute;
  left: 8px;
  bottom: 8px;
  width: 32px;
  height: 32px;
  border-radius: 6px;
  border: 1px solid rgba(255,255,255,0.18);
  object-fit: cover;
  background: #1a1a1b;
}
/* The badge repeats the logo when the art IS the logo — hide it there. */
.cg-similar-art--logo .cg-similar-badge { display: none; }

.cg-similar-body { padding: 12px 12px 14px; display: flex; flex-direction: column; gap: 8px; }

.cg-similar-name {
  font-family: var(--font-headline, 'Space Grotesk'), sans-serif;
  font-size: 15px;
  font-weight: 700;
  line-height: 1.3;
  color: #e5e2e3;
}
.cg-similar-card:hover .cg-similar-name { color: #00dbe9; }

.cg-similar-why { display: flex; flex-wrap: wrap; gap: 6px; }
.cg-similar-chip {
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: #b9cacb;
  background: rgba(255,255,255,0.06);
  border-radius: 4px;
  padding: 3px 7px;
}
.cg-similar-chip--chain { color: #00dbe9; background: rgba(0,219,233,0.12); }

.cg-similar-rating {
  display: flex;
  align-items: center;
  gap: 4px;
  font-size: 12px;
  font-weight: 700;
  color: #e5e2e3;
}

@media (max-width: 560px) {
  .cg-similar-grid { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 12px; }
  .cg-similar-name { font-size: 14px; }
}

/* Directory modules embedded in a cg-layout page (the database homepage).
 * modules.css deliberately reads the FOXIZ theme's custom properties
 * (--body-fcolor, --meta-fcolor, --g-color) so the strip matches the magazine
 * — but Foxiz's stylesheet never loads on a plugin-rendered cg-layout page,
 * so every var fell back to its light-page default and the movers and tiles
 * rendered #333-on-black. Re-point the module palette at the cg design
 * system where the shell is ours. */
.cg-layout .cg-mod {
  --cg-accent: #00dbe9;
  --cg-ink: #e5e2e3;
  --cg-muted: #b9cacb;
  --cg-hair: rgba(185, 202, 203, 0.15);
  --cg-surface: #1c1b1c;
  font-family: var(--font-body);
}

/* Database homepage (src/tpl/home/database-home.php) — the cg-dbhome layer.
 * Scoped additions only; the base components stay untouched for every other
 * cg-layout page. */
.cg-dbhome-hero { position: relative; padding-top: 16px; }
.cg-dbhome-hero::before {
  content: '';
  position: absolute;
  inset: -140px -120px 0 -120px;
  background:
    radial-gradient(640px 320px at 18% 0%, rgba(0, 219, 233, 0.13), transparent 70%),
    radial-gradient(520px 280px at 78% 8%, rgba(207, 92, 255, 0.09), transparent 70%);
  pointer-events: none;
}
.cg-dbhome-hero > * { position: relative; }
.cg-dbhome-eyebrow {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: var(--font-label); font-size: 12px; font-weight: 700;
  letter-spacing: 0.14em; text-transform: uppercase; color: #00dbe9;
  margin-bottom: 14px;
}
.cg-dbhome-dot {
  width: 8px; height: 8px; border-radius: 50%; background: #bbea00;
  box-shadow: 0 0 10px rgba(187, 234, 0, 0.8);
  animation: cg-dbhome-pulse 2s ease-in-out infinite;
}
@keyframes cg-dbhome-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.35; } }
.cg-dbhome-title {
  font-family: var(--font-headline);
  font-size: clamp(40px, 5.2vw, 64px);
  font-weight: 800; line-height: 1.05; letter-spacing: -0.03em; color: #e5e2e3;
}
.cg-dbhome-title .cg-dbhome-grad {
  background: linear-gradient(92deg, #00f0ff 0%, #6ee7f5 45%, #cf5cff 100%);
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
.cg-dbhome-sub { font-size: 18px; font-weight: 300; color: #b9cacb; margin-top: 14px; max-width: 640px; }
.cg-dbhome-ctas { display: flex; gap: 12px; margin-top: 28px; flex-wrap: wrap; }
.cg-dbhome-btn-primary {
  display: inline-block; text-decoration: none;
  background: linear-gradient(90deg, #00f0ff, #00dbe9);
  color: #003237; font-family: var(--font-headline); font-size: 14px; font-weight: 700;
  padding: 12px 26px; border-radius: 8px;
  box-shadow: 0 0 20px rgba(0, 219, 233, 0.35);
  transition: transform 0.15s ease, box-shadow 0.15s ease;
}
.cg-dbhome-btn-primary:hover { transform: translateY(-1px) scale(1.02); box-shadow: 0 0 32px rgba(0, 219, 233, 0.55); color: #003237; }
.cg-dbhome .cg-metric-card {
  border: 1px solid rgba(185, 202, 203, 0.08);
  transition: transform 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
}
.cg-dbhome .cg-metric-card:hover {
  transform: translateY(-2px);
  border-color: rgba(0, 219, 233, 0.35);
  box-shadow: 0 0 18px rgba(0, 219, 233, 0.12);
}
.cg-dbhome-headbar {
  display: block; width: 30px; height: 4px; border-radius: 2px;
  background: linear-gradient(90deg, #00f0ff, #cf5cff);
  margin-bottom: 10px;
}

/* ── Section 21 — Directory search (Search\DirectorySearch) ──────────────
 * The results page and the nav's search box. Scoped to .cg-searchpage and
 * .cg-nav-search so nothing here can reach the article/theme search. */
.cg-searchpage .cg-page-title,
.cg-shellpage .cg-page-title {
  font-family: var(--font-headline);
  font-size: 32px; font-weight: 800; line-height: 1.15;
  color: #e5e2e3; letter-spacing: -0.02em;
}
@media (min-width: 768px) {
  .cg-searchpage .cg-page-title,
  .cg-shellpage .cg-page-title { font-size: 40px; }
}
.cg-searchpage .cg-page-sub,
.cg-shellpage .cg-page-sub { font-size: 15px; color: #b9cacb; }

.cg-search-form { display: flex; gap: 12px; align-items: center; max-width: 640px; }
.cg-search-form .cg-search-input { padding-left: 24px; }

.cg-search-rows { display: flex; flex-direction: column; gap: 12px; }
.cg-search-row {
  display: flex; align-items: center; gap: 16px;
  padding: 14px 16px; text-decoration: none;
}
.cg-search-row-img {
  width: 48px; height: 48px; border-radius: 10px;
  object-fit: cover; flex-shrink: 0;
}
.cg-search-row-body { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
.cg-search-row-title {
  font-family: var(--font-headline); font-size: 15px; font-weight: 700;
  color: #e5e2e3; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cg-search-row-meta { font-size: 12px; color: #b9cacb; }

/* Delisted is a LABEL, never a reason to hide the row — his s123 ruling. */
.cg-badge-dead { background: #353436; color: #b9cacb; opacity: 0.9; }

/* The nav's search box: it replaced two buttons that were wired to nothing. */
.cg-nav-search { display: flex; align-items: center; gap: 8px; }
.cg-nav-search .cg-search-input {
  padding: 8px 16px; font-size: 13px; width: 190px;
}
@media (max-width: 900px) { .cg-nav-search .cg-search-input { width: 130px; } }
/* ⚠️ `padding: 0` around a 20px icon renders a 20×20 target. MEASURED at
 * 390px in the s193 sweep, on all four pages swept — under the 24×24 CSS px
 * WCAG 2.5.8 minimum, and this is the only way to search from a phone.
 * min-* grows the HIT AREA without moving the glyph, which stays centred. */
.cg-nav-search button {
  background: none; border: 0; padding: 0; cursor: pointer;
  color: #b9cacb; display: flex; align-items: center; justify-content: center;
  min-width: 24px; min-height: 24px;
}
.cg-nav-search button:hover { color: #00dbe9; }

/* ⚠️ The top nav had NO responsive rules at all — measured at 390px, the
 * 24px logo and five 32px-gapped links overflowed a fixed 64px bar and the
 * logo sat on top of "Games". Pre-existing, and inherited by every page the
 * directory shell brings in, so it is fixed here rather than worked around.
 * The links become a horizontally scrollable row instead of wrapping, which
 * would break the fixed height. */
@media (max-width: 900px) {
  .cg-top-nav { padding: 0 16px; gap: 12px; }
  .cg-nav-logo { font-size: 18px; flex-shrink: 0; }
  .cg-nav-links {
    gap: 18px; min-width: 0; overflow-x: auto;
    scrollbar-width: none; -ms-overflow-style: none;
  }
  .cg-nav-links::-webkit-scrollbar { display: none; }
  .cg-nav-actions { flex-shrink: 0; }
}
/* Below 640px the box becomes its icon. The input keeps being submitted
 * while display:none, so the icon lands on /?s= — the results page's own
 * "Search the database" state, which carries a full-width field. */
@media (max-width: 640px) {
  .cg-nav-search .cg-search-input { display: none; }
}

/* =============================================================================
   Section 20 — /home-v2, the homepage redesign preview.

   ⭐ THE REFERENCE IS topview.ai/home. What that page actually does, stripped
   of its subject matter: a very large condensed uppercase headline over a
   coloured glow; one big rounded input panel; rows of media cards inside
   rounded PANELS rather than loose on the background; a split brand-block /
   tabbed-grid section; and a pill-tabbed card grid at the end. The colour is
   the only thing that changes here — its violet is our cyan and orange.

   ⛔ CONTAINMENT, STATED PRECISELY, because Section 18's lesson cost a release
   to undo: that reset was scoped by an ENQUEUE rather than by a selector, and
   Base::get_style_depends() then handed the file to Elementor wherever a widget
   landed. So, exactly what holds here:

     1. Every selector below carries the `cg-hv2-` prefix, or is `.cg-hv2`
        itself — the class on this page's own content wrapper. There is no bare
        element selector, no :root, nothing on body, and no `*`.
     2. The shared classes it touches are all nested under a `.cg-hv2` or
        `.cg-home-v2` ancestor: the band's palette swap (`.cg-hv2 .cg-mod`) and
        the shell seam under the theme's header (`.cg-home-v2 .cg-main` /
        `.cg-sidebar`). Both render elsewhere on the site and must keep the look
        they already have there.
        ⚠️ Two former examples are gone with their markup: the `.cg-metric-*`
        overrides went with the count tiles, and the `.cg-nav-wpmenu` rules went
        when this page stopped rebuilding the header and started calling it.

   That is namespacing plus one guarded descendant, not a magic fence. Adding an
   unprefixed selector here would reach the whole site, and nothing would fail.
   ============================================================================= */

.cg-hv2 {
  --hv2-radius: 20px;
  --hv2-radius-sm: 12px;
  --hv2-panel: #17171a;
  --hv2-panel-2: #1d1d21;
  --hv2-line: rgba(185, 202, 203, 0.14);
  --hv2-line-lit: rgba(0, 219, 233, 0.38);
  --hv2-dim: #9aa8a9;
  max-width: 1360px;
}

/* ---------- 0. The header is the THEME'S, so this section mostly undoes ----
   ⭐⭐⭐⭐ "MAKE IT AS IS". The page calls foxiz_render_header() now, exactly as
   the live site does, so there is no bar of ours to style — the logo, the menu,
   the dark/light toggle, the search icon and the Telegram button are all
   Foxiz's and are already styled by Foxiz.

   ⚠️ WHAT IS LEFT IS PURELY THE SEAM. Our shell was built around `.cg-top-nav`,
   a 64px bar FIXED to the viewport, so the rail and the content were pushed
   down by 64px of padding that nothing occupies any more. Foxiz's header is
   ~60px and sits in NORMAL FLOW, taking its own space. Undo our offset, and
   start the rail below the header instead of behind it.

   ⭐ `--cg-hd` rather than a literal in three places: the theme's header height
   is a setting, and when it changes this is the one line to change. */
/* s249: the three rules that stood here (`--cg-hd: 60px`, `.cg-main
   { padding-top: 0 }`, the rail's top/height) moved to Section 4 as the
   default for EVERY page, because every page now renders this header. */

/* ⛔ ~70 LINES OF BAR CSS STOOD HERE AND ARE GONE. They dressed wp_nav_menu()'s
   markup inside our own `.cg-top-nav` — horizontal top level, hover dropdowns,
   a caret on the parents, hidden below 900px. Every one of them was work spent
   rebuilding a header the theme already renders, and the result still had our
   wordmark instead of the logo and our field instead of the search icon.

   ⭐⭐⭐ THE LESSON, AND IT COST THE OWNER TWO ROUNDS TO GET THROUGH TO ME:
   "the same menu" did not mean the same LINKS. It meant the same HEADER. The
   only way two things are reliably identical is for them to be one thing.
   nav.php's `wp` mode is left in place for any future caller but nothing uses
   it now, and /home-v2 calls foxiz_render_header() instead. */


/* The preview says so, at the top, before anything else. A design mockup that
   does not announce itself is a page someone will eventually mistake for live. */
.cg-hv2-flag {
  display: flex; flex-wrap: wrap; gap: 8px 14px; align-items: center;
  margin: 0 0 28px; padding: 10px 16px;
  /* ⚠️ NOT 999px: at 390px this wraps to two lines, and a stadium curve
     around a two-line block reads as a mistake. */
  border: 1px dashed var(--hv2-line-lit); border-radius: 14px;
  background: rgba(0, 219, 233, 0.05);
  font-size: 13px; color: var(--hv2-dim);
}
.cg-hv2-flag a { color: #00dbe9; font-weight: 600; }

.cg-hv2-sec { margin: 0 0 72px; }

.cg-hv2-head {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 16px 24px; margin: 0 0 20px;
}
.cg-hv2-h2 {
  margin: 0; font-family: var(--font-headline, 'Space Grotesk', sans-serif);
  font-size: clamp(22px, 2.4vw, 30px); font-weight: 700; letter-spacing: -0.02em;
  color: #e5e2e3;
}
.cg-hv2-more { font-size: 14px; font-weight: 600; color: #00dbe9; white-space: nowrap; }
.cg-hv2-more:hover { color: #ff6a00; }

/* ---------- 1. The latest-articles strip ---------- */

/* ⚠️ A FLEX ITEM'S min-width IS auto AND IT REFUSES TO SHRINK. The titles here
   are long enough to force the rail wider than its parent without this. */
.cg-hv2-strip {
  display: flex; gap: 18px; overflow-x: auto; min-width: 0;
  scroll-snap-type: x proximity;
  /* ⚠️ MEASURED LIVE: the scrollbar track painted as a solid grey slab under
     the row and read as a broken element, not as a control. The nav does the
     same thing for the same reason. */
  scrollbar-width: none; -ms-overflow-style: none;
}
.cg-hv2-strip::-webkit-scrollbar { display: none; }
.cg-hv2-scard { flex: 0 0 260px; min-width: 0; scroll-snap-align: start; }
.cg-hv2-sframe {
  display: block; position: relative; aspect-ratio: 16 / 9; overflow: hidden;
  border-radius: var(--hv2-radius-sm); background: var(--hv2-panel-2);
  border: 1px solid var(--hv2-line);
}
.cg-hv2-sframe img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .35s ease; }
.cg-hv2-scard:hover .cg-hv2-sframe img { transform: scale(1.045); }
.cg-hv2-stitle {
  display: block; margin-top: 12px;
  font-family: var(--font-headline, 'Space Grotesk', sans-serif);
  font-size: 15px; font-weight: 600; line-height: 1.35; color: #e5e2e3;
  /* ⚠️ Titles run from four words to fourteen. Unclamped, the date under a
     three-line card sat a whole line below the date beside it and the grid
     read as broken alignment rather than as varied copy. */
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}
.cg-hv2-scard:hover .cg-hv2-stitle { color: #00dbe9; }

/* ---------- 2 & 3. THE HERO AND THE FOUR COUNTS ----------
   ⛔ BOTH GONE, ON THE OWNER'S INSTRUCTION: "actually remove that only leave
   search on top right corner (move it to top right)".

   What these rules dressed was the uppercase headline over its two-radial
   glow, the strapline, the small search field, the ten facet chips and
   CatalogCounts' four tiles — about 900px before a visitor reached an article
   or a game. The bar and the rail already say what the site is.

   ⚠️ AND THE SEARCH MOVED BY BEING DELETED. nav.php has always rendered one at
   the top right in `.cg-nav-actions`; the hero's was the second one on the
   page. Nothing was added to the bar.

   ⭐ The `.cg-metric-*` overrides went with the tiles, which matters for the
   containment note at the top of this section: those were the only shared
   classes Section 20 touched. Every selector left here is `cg-hv2-` prefixed
   again, with the one documented exception of the band's palette swap. */


/* ---------- 4. The games, as the PlayToEarn-shaped ranking table ----------
   ⭐⭐⭐ THERE ARE NO TABLE RULES HERE, AND THAT IS THE POINT. The games
   section renders DirectoryModules::render_games_band(), whose markup is
   Catalog\GamesTable's and whose styling is modules.css's. Round one of this
   page hand-rolled a second ranking and ~90 lines of CSS to dress it; the
   owner then asked for playtoearn-grade detail, which that copy would have had
   to grow column by column. Deleting it was the smaller change.

   ⭐⭐ WHAT IS LEFT IS A PALETTE SWAP, AND ONLY BECAUSE modules.css ASKED FOR
   ONE. That file deliberately expresses itself in custom properties bound to
   the THEME's variables — `--cg-ink: var(--body-fcolor, #333)` — so Foxiz's
   light and dark modes both work without a second rule set. This page is
   neither: it is a dark shell that does not set Foxiz's variables, so the band
   would inherit #333 ink on a #0e0e0f panel and read as an empty table.
   Redefining seven variables re-themes the whole band, which is exactly the
   affordance modules.css was built to offer.

   ⚠️ AND THERE IS NOW EXACTLY ONE LAYOUT RULE, BY THE OWNER'S CHOICE — see
   the Game cap below. It was worth stating this rule and then stating its one
   exception, rather than quietly having two. */

.cg-hv2 .cg-mod {
  --cg-ink: #e5e2e3;
  --cg-muted: #9aa8a9;
  --cg-accent: #00dbe9;
  --cg-hair: rgba(185, 202, 203, 0.14);
  --cg-surface: rgba(185, 202, 203, 0.07);
  /* ⚠️ The two signal colours are LIFTED, not re-chosen. modules.css
     hard-codes #2f9e68 and #c0453e; restated here only a shade brighter so they
     carry on a near-black panel. A different PAIR would mean green said one
     thing on the homepage and another here. */
  --cg-live: #35b477;
  --cg-down: #d65a52;
}
/* The band paints itself on the theme's page colour, which this page does not
   set. Give it the panel it sits on. */
.cg-hv2 .cg-mod.cg-band {
  background: var(--hv2-panel);
  border: 1px solid var(--hv2-line);
  border-radius: var(--hv2-radius);
  padding: 16px;
}
.cg-hv2 .cg-mod .cg-band-title { color: #e5e2e3; }

/* ⭐⭐⭐ THE GAME CAP — the one layout rule, and the owner picked it.
   The seven columns wanted 1,216px and this page has 1,069 once the 256px left
   rail and the shell's gutters are out, so "Token 7d" — the sparkline he asked
   for by name — sat behind a horizontal scroll. Of the three ways to buy the
   difference (drop Device, cap Game, bleed through the gutters) he chose to cap
   Game and keep all seven columns.

   ⭐⭐ WHY THE CAP GOES ON `.cg-dt-ident` AND NOT ON THE CELL. The tagline is
   `white-space: nowrap` with an ellipsis already, and an ellipsis only fires
   when the containing block has a DEFINITE width. In an auto-layout table the
   cell takes its width from its content, so `max-width` on the `td` is advice
   the browser is free to ignore — the text simply asks for 479px and gets it.
   Capping the flex column that actually holds the two lines gives the tagline
   a real width to truncate against, and the cell shrinks to follow.

   ⚠️ 270px, MEASURED, NOT GUESSED. Stepping the cap live: 320 -> table 1,091
   (still clipped); 300 -> 1,071 (clipped by 2px); 280 -> 1,069, the first value
   that fits exactly; 260 and 240 fit too but buy nothing — the table has hit
   the floor its other six columns set, and only the tagline gets shorter. 280
   is therefore the longest tagline that fits and 270 is that with a margin,
   because an exact fit is one font-swap or scrollbar away from clipping again.

   ⚠️ DESKTOP ONLY. Below 1100px the table scrolls by design and modules.css
   gives the tagline its own phone rule; a fixed 270px cap there would truncate
   for no gain. */
@media (min-width: 1100px) {
  .cg-hv2 .cg-band .cg-dt-ident { max-width: 270px; }
}

/* Kept from the deleted block: the magazine's lead and side thumbnails still
   fall back to this when a post has no featured image. */
.cg-hv2-noart { display: block; width: 100%; height: 100%; background: linear-gradient(150deg, #1d1d21, #121214); }

/* ---------- 5. The split panel ---------- */

.cg-hv2-split {
  display: grid; grid-template-columns: minmax(0, 320px) minmax(0, 1fr); gap: 0;
  border-radius: var(--hv2-radius); overflow: hidden;
  border: 1px solid var(--hv2-line); background: var(--hv2-panel);
}
.cg-hv2-brand {
  display: flex; flex-direction: column; gap: 14px; padding: 34px 30px;
  border-right: 1px solid var(--hv2-line);
  background:
    radial-gradient(120% 70% at 20% 0%, rgba(0, 219, 233, 0.12), transparent 62%),
    linear-gradient(180deg, #191a1e, #131314);
}
.cg-hv2-brandkicker {
  margin: 0; font-size: 12px; font-weight: 600; letter-spacing: 0.14em;
  text-transform: uppercase; color: #6f7c7d;
}
.cg-hv2-brandmark {
  margin: 0; font-family: var(--font-headline, 'Space Grotesk', sans-serif);
  font-size: clamp(34px, 4.6vw, 58px); font-weight: 800; line-height: 0.95;
  letter-spacing: -0.04em; text-transform: uppercase; color: #f4f2f3;
}
.cg-hv2-brandmark span {
  background: linear-gradient(96deg, #00dbe9, #ff6a00);
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
.cg-hv2-brandline { margin: 0; font-size: 14px; line-height: 1.55; color: var(--hv2-dim); }
.cg-hv2-explore {
  margin-top: auto; align-self: flex-start;
  display: inline-flex; align-items: center; gap: 10px;
  padding: 12px 22px; border-radius: 999px;
  border: 1px solid var(--hv2-line-lit); color: #e5e2e3;
  font-size: 13px; font-weight: 700; letter-spacing: 0.1em; text-transform: uppercase;
  transition: background .18s ease, color .18s ease;
}
.cg-hv2-explore:hover { background: #00dbe9; color: #06181b; }
.cg-hv2-explore .material-symbols-outlined { font-size: 18px; }

.cg-hv2-panelright { padding: 26px 28px 30px; min-width: 0; }
.cg-hv2-tabs { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 22px; }
.cg-hv2-tab {
  padding: 8px 18px; border-radius: 999px; cursor: pointer;
  border: 1px solid transparent; background: transparent; color: var(--hv2-dim);
  font-family: inherit; font-size: 14px; font-weight: 600;
  transition: background .18s ease, color .18s ease;
}
.cg-hv2-tab:hover { color: #e5e2e3; }
.cg-hv2-tab.active { background: rgba(185, 202, 203, 0.1); color: #e5e2e3; }

.cg-hv2-pane { display: none; }
.cg-hv2-pane.active { display: block; }

.cg-hv2-tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 14px; }
.cg-hv2-tile {
  display: flex; flex-direction: column; gap: 6px; padding: 18px;
  border-radius: var(--hv2-radius-sm); border: 1px solid var(--hv2-line);
  background: var(--hv2-panel-2);
  transition: border-color .18s ease, transform .18s ease;
}
.cg-hv2-tile:hover { border-color: var(--hv2-line-lit); transform: translateY(-2px); }
.cg-hv2-tileicon { font-size: 22px; color: #00dbe9; }
.cg-hv2-tilelabel {
  font-family: var(--font-headline, 'Space Grotesk', sans-serif);
  font-size: 15px; font-weight: 700; color: #e5e2e3;
}
.cg-hv2-tileline { font-size: 12.5px; line-height: 1.45; color: var(--hv2-dim); }

/* ---------- 6. The magazine ----------
   ⭐⭐⭐ THIS IS THE LIVE HOMEPAGE'S BLOCK, MEASURED AND REBUILT. The owner:
   "the articles section need to look like more like the current homepage". So
   the shape is not chosen here — it is read off that page. Foxiz renders each
   category as `.block-wrap.block-grid.rb-col-4`: a heading with a "Read more"
   link opposite, then ONE ROW OF FOUR equal cards, each a 16:9 image with its
   category chips over the bottom-left, a bold title, then date and read time.

   ⛔ TWO SHAPES HAVE NOW BEEN DELETED FROM THIS SECTION and both were fine in
   the abstract: 64 identical cards under a pill filter (no editorial claim,
   4,000px tall), then a lead story with a headline list beside it (a magazine
   shape, but not THIS site's). The site already had an answer; the job was to
   match it, not to improve on it. */

.cg-hv2-mag { margin-top: 38px; }
.cg-hv2-mag:first-of-type { margin-top: 4px; }
.cg-hv2-maghead {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 16px; flex-wrap: wrap;
  margin-bottom: 18px; padding-bottom: 10px;
  border-bottom: 1px solid var(--hv2-line);
}
.cg-hv2-magtitle {
  margin: 0;
  font-family: var(--font-headline, 'Space Grotesk', sans-serif);
  font-size: clamp(17px, 2vw, 21px); font-weight: 700;
  letter-spacing: -0.02em; color: #e5e2e3;
}

/* Four across, the homepage's own count. ⚠️ `auto-fit` is deliberately NOT
   used: it would leave a category holding three posts stretching them across
   the full width, so that block's cards would be visibly larger than every
   other block's. A fixed four keeps every card on the page the same size. */
.cg-hv2-magrow {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 22px 20px;
}
@media (max-width: 1000px) { .cg-hv2-magrow { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 520px)  { .cg-hv2-magrow { grid-template-columns: minmax(0, 1fr); gap: 18px; } }

.cg-hv2-acard { display: block; min-width: 0; }
.cg-hv2-aframe {
  display: block; position: relative; aspect-ratio: 16 / 9; overflow: hidden;
  border-radius: var(--hv2-radius-sm); background: var(--hv2-panel-2);
  border: 1px solid var(--hv2-line);
}
.cg-hv2-aframe img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform .35s ease; }
.cg-hv2-acard:hover .cg-hv2-aframe img { transform: scale(1.05); }

/* The chips sit ON the picture, bottom-left, exactly as the homepage's do.
   ⚠️ `nowrap` with the row clipped: two long category names would otherwise
   stack into a second line and climb the image. */
.cg-hv2-achips {
  position: absolute; left: 10px; right: 10px; bottom: 10px;
  display: flex; gap: 6px; flex-wrap: nowrap; overflow: hidden;
}
/* ⚠️ SHRINKABLE, AND THAT IS THE WHOLE RULE. With `flex-shrink: 0` both chips
   kept their full width, the ROW overflowed, and the container's `overflow:
   hidden` sliced the second one mid-word — "BLOCKCHAIN NE" sitting on the
   image. A chip's own `text-overflow: ellipsis` cannot fire while it is being
   clipped by an ancestor rather than sized down. `min-width: 0` is the other
   half: a flex child will not shrink below its content without it. */
.cg-hv2-achip {
  flex-shrink: 1; min-width: 0; max-width: 100%;
  padding: 3px 9px; border-radius: 6px;
  font-size: 10px; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase;
  color: #e5e2e3; background: rgba(12, 12, 14, 0.78);
  backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.cg-hv2-atitle {
  display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical;
  overflow: hidden; margin-top: 12px;
  font-family: var(--font-headline, 'Space Grotesk', sans-serif);
  font-size: 15px; font-weight: 700; line-height: 1.35;
  letter-spacing: -0.01em; color: #e5e2e3;
  transition: color .18s ease;
}
.cg-hv2-acard:hover .cg-hv2-atitle { color: #00dbe9; }

/* Date and reading time on one line, the homepage's meta row. */
.cg-hv2-ameta {
  display: flex; align-items: center; gap: 7px; flex-wrap: wrap;
  margin-top: 8px;
  font-size: 11px; letter-spacing: 0.03em; text-transform: uppercase; color: #6f7c7d;
}
.cg-hv2-asep { opacity: .7; }
.cg-hv2-adate { display: inline; }

/* ---------- 7. The closing band ---------- */

.cg-hv2-outro {
  text-align: center; padding: 60px 24px; border-radius: 28px;
  border: 1px solid var(--hv2-line);
  background:
    radial-gradient(90% 120% at 50% 100%, rgba(255, 106, 0, 0.13), transparent 60%),
    linear-gradient(180deg, #0e0e0f, #16171b);
}
.cg-hv2-outro-title {
  margin: 0 0 12px; font-family: var(--font-headline, 'Space Grotesk', sans-serif);
  font-size: clamp(26px, 3.6vw, 42px); font-weight: 800; letter-spacing: -0.03em;
  text-transform: uppercase; color: #f4f2f3;
}
.cg-hv2-outro-ctas { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; margin-top: 26px; }
.cg-hv2-btn {
  padding: 13px 26px; border-radius: 999px; font-size: 14px; font-weight: 700;
  border: 1px solid var(--hv2-line); color: #e5e2e3;
  transition: border-color .18s ease, color .18s ease;
}
.cg-hv2-btn:hover { border-color: var(--hv2-line-lit); color: #00dbe9; }
.cg-hv2-btn-primary { background: linear-gradient(135deg, #00dbe9, #00a8d6); border-color: transparent; color: #06181b; }
.cg-hv2-btn-primary:hover { color: #06181b; filter: brightness(1.08); }

/* ---------- narrow screens ---------- */

/* ⚠️ THE PREVIEW WAS BUILT WIDE AND MOST OF THE SITE'S TRAFFIC IS NOT. The
   split panel is the only section that cannot survive a single column by
   itself — its 320px brand column would squeeze the tiles to one each. */
@media (max-width: 900px) {
  .cg-hv2-split { grid-template-columns: minmax(0, 1fr); }
  .cg-hv2-brand { border-right: 0; border-bottom: 1px solid var(--hv2-line); }
  .cg-hv2-explore { margin-top: 6px; }
  .cg-hv2-sec { margin-bottom: 56px; }
}
@media (max-width: 600px) {
  .cg-hv2-scard { flex-basis: 220px; }
  /* ⛔ The band is NOT given a phone rule here. GamesTable's table scrolls
     horizontally on a narrow screen by its own design (`.cg-dt-scroll`), and a
     width or padding set from this file would be the first of the layout
     overrides the section above exists to forbid. */
  .cg-hv2 .cg-mod.cg-band { padding: 14px; }
  .cg-hv2-head { flex-direction: column; align-items: flex-start; }
}


/* =============================================================
 * CROSS-CUTTING: THE SWIPE AFFORDANCE
 * =============================================================
 * ⭐⭐⭐⭐ s193 — THE SAME SILENT SCROLL IN THREE PLACES, DECLARED ONCE.
 *
 * s191 found it on the games table: 71% of the band was one swipe away at
 * 390px and nothing said so. s193 swept the game singles and found two more.
 * MEASURED at 390px: the section tab nav is 713px inside a 390px window on The
 * Sandbox — 45% of the page's OWN NAVIGATION off screen — 538px on Axie, 472px
 * on Head Coin; the header link row is 313px inside 181px (42%) on every page
 * of the site. All three already scrolled. None of them said so, and
 * `.cg-nav-links` hides its scrollbar outright (`scrollbar-width: none`), so
 * not even a desktop mouse gets a hint.
 *
 * ⭐⭐⭐ THREE COPIES OF FOUR GRADIENTS IS HOW THEY DRIFT APART. Two things are
 * reliably identical only when they are ONE thing — so this is one declaration
 * with three selectors, and each caller supplies only `--cg-swipe-bg`.
 *
 * ⚠️⚠️ IT LIVES AT THE END OF THE FILE ON PURPOSE. `.cg-tab-nav-sticky`
 * declares its own `background` around line 2231; an equally-specific rule
 * placed earlier loses to it and paints nothing — silently, on the caller whose
 * scroll hides the most. Moving this block upward re-breaks that one only.
 *
 * ⚠️⚠️ `--cg-swipe-bg` IS THE MECHANISM, NOT DECORATION. The two `local`
 * covers hide the shadows at rest by being indistinguishable from the box
 * behind them; a value that does not match its own container reads as a grey
 * bar welded to the edge, at every width, and still looks fine in a screenshot
 * taken mid-scroll. Set it to the container's OWN background, every time.
 *
 * ⚠️ THE LAST LAYER RESTATES THAT COLOUR AS THE BACKGROUND-COLOUR, because
 * this is a `background` shorthand: without it a caller that had a solid
 * background before — `.cg-tab-nav-sticky` is `position: sticky` and needs one
 * — would be reset to transparent and let the page scroll through it.
 *
 * ⭐⭐ NO MEDIA QUERY, BECAUSE IT CANNOT LIE. The covers scroll with the content
 * (`local`), the shadows are pinned to the box (`scroll`). With nothing to
 * scroll the covers sit exactly on the shadows and neither edge paints; at the
 * left end the left shadow is covered, at the right end the right one is. That
 * is why all three callers can take it unconditionally — the tab nav and the
 * header row only overflow below 1024px and 900px, and above those widths this
 * rule is invisible without being told the width.
 *
 * ⚠️ The fade stop is `transparent` where the s191 original wrote the colour at
 * zero alpha. Gradients interpolate in PREMULTIPLIED sRGB in every browser
 * shipped this decade, so the two render identically — and only the literal
 * form survives being written with a custom property, short of `color-mix`,
 * whose absence would invalidate the whole declaration and take the
 * background-colour down with it.
 *
 * ⚠️ Literal colours, not Foxiz custom properties: these can be dropped on an
 * Elementor Canvas page where the theme never loads, and a var() that falls
 * back to its light-page default renders #333 on #201f20. */
.cg-swipe-x,
.cg-tab-nav-sticky,
.cg-nav-links,
.cg-games-table .cg-dt-scroll,
.cg-tokens-table .cg-dt-scroll {
  background:
    linear-gradient(to right, var(--cg-swipe-bg) 28%, transparent) left  center / 34px 100% no-repeat local,
    linear-gradient(to left,  var(--cg-swipe-bg) 28%, transparent) right center / 34px 100% no-repeat local,
    linear-gradient(to right, rgba(0,0,0,.60), rgba(0,0,0,0)) left  center / 26px 100% no-repeat scroll,
    linear-gradient(to left,  rgba(0,0,0,.60), rgba(0,0,0,0)) right center / 26px 100% no-repeat scroll,
    var(--cg-swipe-bg);
}

/* Each caller names the colour of the box it sits in. `.cg-data-table-wrap` is
 * #201f20; `.cg-tab-nav-sticky` is var(--color-background) and `.cg-top-nav`,
 * which `.cg-nav-links` sits inside, is #131314 — and --color-background is
 * #131314 too, declared at the top of this file. */
.cg-games-table .cg-dt-scroll,
.cg-tokens-table .cg-dt-scroll { --cg-swipe-bg: #201f20; }
.cg-tab-nav-sticky            { --cg-swipe-bg: #131314; }
.cg-nav-links                 { --cg-swipe-bg: #131314; }
