:root {
    --bg: #0d1117;
    --bg-elevated: #161b22;
    --text: #d9c9a3;
    --text-dim: #8c8270;
    --text-muted: #5e574a;
    --accent: #e0c96e;
    --border: rgb(255 255 255 / 0.06);
    --border-strong: rgb(255 255 255 / 0.12);
    --card-hover: rgb(224 201 110 / 0.4);
    --gradient-accent-divider: linear-gradient(90deg, transparent, #c9a84c 50%, transparent);
    --bw-hairline: 0.0625rem;
    --color-404: #6aaad6;
    --color-418: #9a321f;
    --color-420: #4a7c3a;
    --color-429: #d4894a;
    --color-500: #d97757;
    --color-502: #a78bd6;
    --color-503: #e8a948;
    --color-504: #8c9aa3;
    --color-666: #a20000;
    --color-707: #fce5a4;
    --color-830: #6ec072;
    --font-heading: "runescape-bold", system-ui, sans-serif;
    --font-body: "Cascadia Code", "JetBrains Mono", system-ui, sans-serif;
}

*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
html, main { scrollbar-width: none; overflow-x: hidden; }
html::-webkit-scrollbar, body::-webkit-scrollbar, main::-webkit-scrollbar { inline-size: 0; }

body {
    block-size: 100dvb;
    overflow: hidden;
    background-color: var(--bg);
    color: var(--text);
    font-family: var(--font-body);
    font-size: 0.875rem;
    line-height: 1.4;
    -webkit-font-smoothing: antialiased;
    display: flex;
    flex-direction: column;
}

.app-header {
    flex: 0 0 auto;
    padding: 0.75rem 1.5rem;
    border-block: var(--bw-hairline) solid transparent;
    border-image: var(--gradient-accent-divider) 1;
    border-image-width: 0 0 var(--bw-hairline) 0;
    background-color: var(--bg-elevated);
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

.app-header img {
    inline-size: 1.5rem;
    block-size: 1.5rem;
}

.app-header h1 {
    font-family: var(--font-heading);
    font-size: 1rem;
    color: var(--accent);
    letter-spacing: 0.08em;
    text-transform: uppercase;
}

.app-header .intro {
    margin-inline-start: auto;
    color: var(--text-muted);
    font-size: 0.75rem;
    text-transform: uppercase;
    letter-spacing: 0.08em;
}

main {
    flex: 1 1 auto;
    inline-size: 100%;
    overflow-y: auto;
}

.preview-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));
    gap: 1rem;
    padding: 1rem 1.5rem;
}

.preview-card {
    background-color: var(--bg-elevated);
    border: 1px solid var(--border);
    border-radius: 0.375rem;
    overflow: hidden;
    text-decoration: none;
    color: var(--text);
    display: flex;
    flex-direction: column;
    transition: border-color 120ms ease-out, transform 120ms ease-out, box-shadow 120ms ease-out;
}

.preview-card:hover {
    border-color: color-mix(in srgb, var(--card-accent, #c9a84c) 70%, transparent);
    transform: translateY(-2px);
    box-shadow: 0 4px 12px rgb(0 0 0 / 0.3);
}

.preview-card__frame {
    aspect-ratio: 16 / 9;
    overflow: hidden;
    position: relative;
    container-type: inline-size;
    background-color: var(--bg);
}

/* Iframe rendered at desktop dimensions (1920×1080) then scaled to fit the card's container width
   via container query units (cqi = 1% of container inline size). The transform: scale ratio is
   exactly container_width / 1920, so the iframe fills the card perfectly at any grid column size. */
.preview-card__frame iframe {
    position: absolute;
    inset-block-start: 0;
    inset-inline-start: 0;
    inline-size: 1920px;
    block-size: 1080px;
    border: 0;
    transform: scale(calc(100cqi / 1920px));
    transform-origin: top left;
}

.preview-card__label {
    padding: 0.625rem 0.875rem;
    border-block: var(--bw-hairline) solid transparent;
    border-image: linear-gradient(90deg, transparent, var(--card-accent, #c9a84c) 50%, transparent) 1;
    border-image-width: var(--bw-hairline) 0 0 0;
    display: flex;
    align-items: baseline;
    gap: 0.625rem;
    background-color: var(--bg-elevated);
}

.preview-card__code {
    font-family: var(--font-heading);
    font-size: 1rem;
    font-weight: 700;
    letter-spacing: -0.01em;
}

.preview-card__name {
    font-family: var(--font-heading);
    font-size: 0.6875rem;
    text-transform: uppercase;
    letter-spacing: 0.1em;
    color: var(--text-dim);
}

.code-404 { color: var(--color-404); }
.code-418 { color: var(--color-418); }
.code-420 { color: var(--color-420); }
.code-429 { color: var(--color-429); }
.code-500 { color: var(--color-500); }
.code-502 { color: var(--color-502); }
.code-503 { color: var(--color-503); }
.code-504 { color: var(--color-504); }
.code-666 { color: var(--color-666); }
.code-707 { color: var(--color-707); }
.code-830 { color: var(--color-830); }

/* Per-card accent — scoped via :has() so the label's hairline gradient picks up the matching
   code color. --card-accent is consumed by --gradient-card-divider at use time (variable
   resolution is lazy, so the gradient reads the cascaded value from the .preview-card scope). */
.preview-card:has(.code-404) { --card-accent: var(--color-404); }
.preview-card:has(.code-418) { --card-accent: var(--color-418); }
.preview-card:has(.code-420) { --card-accent: var(--color-420); }
.preview-card:has(.code-429) { --card-accent: var(--color-429); }
.preview-card:has(.code-500) { --card-accent: var(--color-500); }
.preview-card:has(.code-502) { --card-accent: var(--color-502); }
.preview-card:has(.code-503) { --card-accent: var(--color-503); }
.preview-card:has(.code-504) { --card-accent: var(--color-504); }
.preview-card:has(.code-666) { --card-accent: var(--color-666); }
.preview-card:has(.code-707) { --card-accent: var(--color-707); }
.preview-card:has(.code-830) { --card-accent: var(--color-830); }

.app-footer {
    flex: 0 0 auto;
    padding: 0.5rem 1.5rem;
    border-block: var(--bw-hairline) solid transparent;
    border-image: var(--gradient-accent-divider) 1;
    border-image-width: var(--bw-hairline) 0 0 0;
    background-color: var(--bg-elevated);
    font-size: 0.625rem;
    color: var(--text-muted);
    text-transform: uppercase;
    letter-spacing: 0.1em;
    display: flex;
    align-items: center;
    justify-content: space-between;
}
