@font-face{font-family:V2 Sans;src:url('/assets/fonts/v2-manrope.ttf') format('truetype');font-weight:200 800;font-display:swap;unicode-range:U+0-1F1E5,U+1F200-10FFFF}
@font-face{font-family:V2 Display;src:url('/assets/fonts/v2-barlow-condensed.ttf') format('truetype');font-weight:600;font-display:swap;unicode-range:U+0-1F1E5,U+1F200-10FFFF}
/* Country flags inside text set in either face: Windows has no glyphs for the regional indicators a flag is written in (theme.css, "Country flags"). The two faces above claim every character EXCEPT those letters — a face with no range claims them too, and the browser drew "RS" from the fallback stack rather than asking the flag face — so the face below is the only one that can draw a flag. Each carries exactly the weights of the face it joins: a face with other weights is, to the browser, another face altogether, and it was never asked. */
@font-face{font-family:V2 Sans;src:url('/assets/fonts/twemoji-country-flags.woff2') format('woff2');font-weight:200 800;font-display:swap;unicode-range:U+1F1E6-1F1FF}
@font-face{font-family:V2 Display;src:url('/assets/fonts/twemoji-country-flags.woff2') format('woff2');font-weight:600;font-display:swap;unicode-range:U+1F1E6-1F1FF}
/* THE BRAND. The colour this design is built on is the EVENT'S colour whenever
   the event has one: applyTheme() (supabase.js) writes --v2-brand beside the
   four white-label tokens and resetTheme() (admin.js) clears it, and every
   rule below reads the token or a mix of it. The first cut used literals, and
   painted Blanik's red competitions and the sample event's blue in vermilion
   (D11, the four-token contract).

   The readable forms are MIXED from the brand at theme.css's own ratios. An
   organizer can choose any colour, and a dark red that is fine as a fill is
   unreadable as text on a near-black ground:
     --v2-accent-ink  text on the page ground — 72% towards black by day,
                      55% towards white at night
     --v2-on-dark     text on a surface that is dark in BOTH themes (the hero,
                      the statistics band, the podium card)
   --v2-mark is the LANDING wordmark's tick. It is the platform's mark, not the
   event's, and does not brand — the line theme.css holds with --brand-ink. */
:root{--v2-brand:#ff4b27;--v2-mark:#ff4b27;--v2-paper:#f4f5f7;--v2-card:#ffffff;--v2-ink:#090b10;--v2-muted:#647080;--v2-line:#d9dee5;--v2-citron:var(--v2-brand);--v2-dark:#090b10;--v2-inverse:#f4f5f7;--v2-accent-ink:#ba2c11;--v2-accent-ink:color-mix(in srgb,var(--v2-brand) 72%,#000);--v2-on-dark:#ff785e;--v2-on-dark:color-mix(in srgb,var(--v2-brand) 75%,#fff)}
html:not([data-theme="light"]){--v2-paper:#090b10;--v2-card:#141820;--v2-ink:#f4f5f7;--v2-muted:#a3adba;--v2-line:#303743;--v2-accent-ink:#ff9684;--v2-accent-ink:color-mix(in srgb,var(--v2-brand) 55%,#fff)}
/* Everything below is SCREEN only. The pages that print — the console's start
   lists, referee sheets and boards, the public results and registered lists,
   the QR poster — print from theme.css, and a design layer that reached the
   printer would change the sheets people take to the field. The font faces
   and tokens above stay unconditional: they define, they do not draw.
   Tick boxes, radios and file pickers are not text fields and keep
   theme.css's own drawing. Table CELL metrics skip the console, through
   :where() so the public pages keep their specificity: its run list is held
   to fitting a 1280px screen (tests/run_probe.js) and admin-v2.css sets its
   rows at the proportions that do. */
@media screen{
html{scroll-behavior:smooth}
body.v2-site{--font:'V2 Sans',Arial,sans-serif;--font-display:'V2 Sans',Arial,sans-serif;--text:var(--v2-ink);--muted:var(--v2-muted);--bg:var(--v2-paper);--card:var(--v2-card);--line:var(--v2-line);--surface-2:var(--v2-paper);--accent:var(--v2-brand);--accent-ink:var(--v2-accent-ink);--accent-soft:color-mix(in srgb,var(--v2-brand) 16%,transparent);--accent-solid:var(--v2-brand);--accent-deep:color-mix(in srgb,var(--v2-brand) 70%,#000);--focus-ring:color-mix(in srgb,var(--v2-brand) 28%,transparent);--radius:4px;--radius-md:4px;background:var(--v2-paper);color:var(--v2-ink);font-family:var(--font);font-size:14px;line-height:1.65;margin:0;overflow-x:clip}
.v2-site *, .v2-site *:before,.v2-site *:after{box-sizing:border-box}
body.v2-site::before,body.v2-site::after{display:none}
:root[data-theme="light"] .v2-site .ev-go{color:var(--v2-ink)}
.v2-site .lang-pill{border-radius:3px;border:0;background:none;box-shadow:none}.v2-site .lang-pill button.active{background:var(--v2-ink);color:var(--v2-paper);border-radius:2px}
.v2-site .lang .active,.v2-site .lang .on{border-radius:2px}
.v2-site [hidden]{display:none!important}.v2-site a{color:inherit}.v2-site button,.v2-site input,.v2-site select,.v2-site textarea{font-family:inherit}
.v2-site ::selection{background:var(--v2-citron);color:#090b10}.v2-site :focus-visible{outline:3px solid var(--v2-accent-ink);outline-offset:5px}
.v2-site .topbar{position:sticky;top:0;z-index:45;height:auto;min-height:88px;background:var(--v2-paper);border-bottom:1px solid var(--v2-line);padding:20px 4vw;display:flex;align-items:center;justify-content:space-between;gap:24px;box-shadow:none;backdrop-filter:blur(14px)}
.v2-brand{display:inline-flex;align-items:center;flex-shrink:0;text-decoration:none}.v2-brand img{width:174px;height:32px;display:block}html:not([data-theme="light"]) .v2-brand img{filter:invert(1)}
.v2-site .topbar-controls{display:flex;align-items:center;gap:14px}.v2-toplinks{display:flex;align-items:center;gap:32px;margin-left:auto;margin-right:28px;font-size:12px;font-weight:700}.v2-toplinks a{text-decoration:none;position:relative}.v2-toplinks a:after{content:'';position:absolute;bottom:-7px;height:2px;left:0;right:100%;background:var(--v2-ink);transition:right .25s}.v2-toplinks a:hover:after{right:0}
.v2-site .lang{border:1px solid var(--v2-line);border-radius:3px;background:transparent}.v2-site .lang button{color:var(--v2-ink);background:transparent;border:0;font-size:11px;min-height:38px}.v2-site .lang button.active,.v2-site .lang button.on{background:var(--v2-ink);color:var(--v2-paper)}.v2-site .lang-menu{background:var(--v2-card);border-color:var(--v2-line)}
.v2-site .theme-toggle,.v2-site .icon-btn{border:1px solid var(--v2-line);border-radius:3px;width:40px;height:40px;min-width:40px;background:transparent;color:var(--v2-ink);box-shadow:none}.v2-site .icon-btn:hover,.v2-site .theme-toggle:hover{background:var(--v2-line)}
.v2-site main.wrap{max-width:1600px;width:auto;margin:0 auto;padding:32px 4vw 72px}.v2-site h1,.v2-site h2,.v2-site h3,.v2-site p{color:inherit}.v2-site h1,.v2-site h2{font-family:'V2 Display',Arial,sans-serif;font-weight:600;letter-spacing:-.02em;line-height:1;text-wrap:balance}.v2-site h1{font-size:clamp(40px,5.2vw,76px);text-transform:uppercase;font-style:italic;margin:0}.v2-site h2{font-size:clamp(26px,2.4vw,36px);margin:0 0 18px}.v2-site h3{font-family:'V2 Sans',Arial,sans-serif;letter-spacing:-.025em;font-size:20px;font-weight:700}.v2-site .section-label,.v2-kicker{font-size:10px;line-height:1.4;letter-spacing:.16em;font-weight:800;text-transform:uppercase;color:var(--v2-muted)}
.v2-site .btn{display:inline-flex;align-items:center;justify-content:center;gap:18px;background:transparent;color:var(--v2-ink);border:1px solid var(--v2-line);border-radius:3px;padding:14px 22px;min-height:50px;font-size:12px;font-weight:800;line-height:1.5;text-decoration:none;box-shadow:none;transition:background .2s,transform .2s,border-color .2s;white-space:normal}.v2-site .btn:hover{background:var(--v2-line);transform:translateY(-2px)}.v2-site .btn-primary{background:var(--v2-citron);color:#fff;border-color:var(--v2-citron)}.v2-site .btn-primary:hover{background:color-mix(in srgb,var(--v2-brand) 92%,#000);border-color:color-mix(in srgb,var(--v2-brand) 92%,#000)}.v2-site .btn-lg{min-height:54px;padding:16px 24px}.v2-site .btn-sm{min-height:40px;padding:10px 16px}.v2-site .btn-ghost{background:transparent}.v2-site .btn:disabled{opacity:.5;transform:none}
.v2-site .badge,.v2-site .hb{border:1px solid var(--v2-line);background:transparent;color:var(--v2-muted);border-radius:2px;display:inline-flex;gap:6px;align-items:center;padding:5px 8px;font-size:9px;font-weight:700;line-height:1.3;letter-spacing:.04em;text-transform:uppercase}.v2-site .badge-ok{background:color-mix(in srgb,var(--v2-brand) 14%,transparent);color:var(--v2-accent-ink);border-color:color-mix(in srgb,var(--v2-brand) 31%,transparent)}.v2-site .dot{background:var(--v2-citron);box-shadow:none}
.v2-site .card{background:var(--v2-card);border:1px solid var(--v2-line);border-radius:4px;box-shadow:none;padding:28px;margin:22px 0 0;backdrop-filter:none}.v2-site .small,.v2-site .hint{color:var(--v2-muted);font-size:12px;line-height:1.7}
.v2-site input:where(:not([type="checkbox"],[type="radio"],[type="file"],[type="range"],[type="color"])),.v2-site select,.v2-site textarea,.v2-site .pick-btn{border-radius:3px;border:1px solid var(--v2-line);background:var(--v2-card);color:var(--v2-ink);min-height:48px;padding:12px 14px;box-shadow:none}.v2-site input:focus,.v2-site select:focus,.v2-site textarea:focus{border-color:var(--v2-accent-ink);box-shadow:0 0 0 2px color-mix(in srgb,var(--v2-brand) 19%,transparent)}.v2-site .field{gap:8px}.v2-site .field > label,.v2-site label.filter-label{font-size:12px;font-weight:750}.v2-site .grid{gap:20px}.v2-site .notice{border-radius:3px}.v2-site .hp-field{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.v2-site .req{color:var(--v2-accent-ink)}
.v2-site .plat-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:0;margin:0;padding:0;border:0;background:transparent}.v2-site .plat-stat{display:flex;flex-direction:column;padding:26px 28px;border-right:1px solid var(--v2-line);border-left:0;min-width:0}.v2-site .plat-stat:last-child{border-right:0}.v2-site .plat-stat .n{font-family:'V2 Display',Arial,sans-serif;font-size:58px;font-weight:600;line-height:1.05;letter-spacing:-.02em;color:inherit}.v2-site .plat-stat .k{font-size:9px;letter-spacing:.14em;text-transform:uppercase;margin-top:8px;color:inherit;opacity:.8}.v2-site .stat-sub{display:flex;align-items:baseline;gap:5px;flex-wrap:wrap;font-size:10px;color:inherit;margin-top:12px;line-height:1.5}.v2-site .stat-sub strong{font-weight:800;font-size:12px}
.v2-site table{color:var(--v2-ink)}.v2-site th{background:var(--v2-paper);color:var(--v2-muted);border-color:var(--v2-line)}.v2-site td{border-color:var(--v2-line)}.v2-site:where(:not(.console)) table{font-size:12px}.v2-site:where(:not(.console)) th{font-size:9px;letter-spacing:.12em;padding:16px}.v2-site:where(:not(.console)) td{padding:18px 16px}.v2-site .tablewrap{border:1px solid var(--v2-line);border-radius:3px}.v2-site .mini-list{gap:0}.v2-site .mini-row{padding:20px 0;border:0;border-bottom:1px solid var(--v2-line);border-radius:0;background:none}.v2-site .mini-name{font-size:14px;font-weight:700}.v2-site .mini-rank{background:var(--v2-citron);color:#090b10;border-radius:2px;font-family:'V2 Display';font-size:23px}.v2-site .mini-meta{font-size:11px;color:var(--v2-muted)}.v2-site .mini-score{font-family:'V2 Display';font-size:28px;color:var(--v2-ink)}
.v2-site .powered{margin:0;justify-content:flex-start;color:var(--v2-muted)}.v2-site .powered-logo{width:96px}.v2-footer{display:flex;align-items:center;justify-content:space-between;gap:24px;padding-top:36px;border-top:1px solid var(--v2-line);margin-top:80px}.v2-footer .plat-foot{margin:0;max-width:520px;font-size:11px;color:var(--v2-muted)}
.v2-site .modal{background:var(--v2-card);color:var(--v2-ink);border-radius:4px}.v2-site .modal-head,.v2-site .modal-foot{border-color:var(--v2-line)}.v2-site .modal-backdrop{backdrop-filter:blur(8px)}
.v2-site .card,.v2-site .ev-card{animation:none}
.v2-site .busybar-fill{background:var(--v2-citron);box-shadow:0 0 10px color-mix(in srgb,var(--v2-brand) 25%,transparent)}

@media(max-width:900px){.v2-toplinks{display:none}.v2-site .topbar{padding:16px 4vw;min-height:76px}.v2-brand img{width:146px}.v2-site .plat-stat{padding:22px 18px}.v2-site .plat-stat .n{font-size:48px}}
@media(max-width:600px){.v2-site .topbar{gap:12px;padding:14px 20px}.v2-site .topbar-controls{gap:7px}.v2-brand img{width:122px;height:27px}.v2-site .lang button{min-height:36px;padding:6px 8px}.v2-site .theme-toggle,.v2-site .icon-btn{min-width:36px;width:36px;height:36px}.v2-site main.wrap{padding:22px 20px 40px}.v2-site h1{font-size:44px}.v2-site h2{font-size:28px}.v2-site .card{padding:22px 18px;margin-top:18px}.v2-site .plat-stats{grid-template-columns:repeat(2,minmax(0,1fr))}.v2-site .plat-stat{padding:20px 18px;border-bottom:1px solid var(--v2-line)}.v2-site .plat-stat:nth-child(2){border-right:0}.v2-site .plat-stat:nth-child(n+3){border-bottom:0}.v2-footer{align-items:flex-start;flex-direction:column;gap:24px;margin-top:50px}.v2-site .grid{grid-template-columns:1fr}.v2-site .field.full{grid-column:1}.v2-site:where(:not(.console)) th,.v2-site:where(:not(.console)) td{padding:14px 10px}}
@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}.v2-site *, .v2-site *:before,.v2-site *:after{animation:none!important;transition:none!important}.v2-reveal{opacity:1;transform:none}}

/* Arena identity: precision rules, tactile controls, disciplined contrast. */
.v2-site .topbar{background:color-mix(in srgb,var(--v2-paper) 92%,transparent);min-height:80px;padding-top:16px;padding-bottom:16px}
.v2-brand{position:relative}.v2-brand:after{content:'';height:5px;width:18px;background:var(--v2-mark);transform:skewX(-18deg);margin-left:12px;align-self:flex-end;margin-bottom:5px}
.v2-site .topbar-controls{gap:10px}.v2-toplinks a:after{background:var(--v2-brand);height:3px}
.v2-site .btn{border-radius:2px;letter-spacing:.015em;min-height:52px}
.v2-site .btn-primary{box-shadow:0 4px 20px color-mix(in srgb,var(--v2-brand) 10%,transparent)}
.v2-site .btn-primary:hover{box-shadow:0 8px 28px color-mix(in srgb,var(--v2-brand) 21%,transparent)}
.v2-site .badge-ok{background:#27cc8815;color:#14814e;border-color:#27cc8840}
html:not([data-theme="light"]) .v2-site .badge-ok{color:#62dfa3}
.v2-site .dot{background:#41d694}
.v2-site input:where(:not([type="checkbox"],[type="radio"],[type="file"],[type="range"],[type="color"])),.v2-site select,.v2-site textarea{transition:border-color .2s,box-shadow .2s;background:var(--v2-card)}
.v2-site input:focus,.v2-site select:focus,.v2-site textarea:focus{box-shadow:0 0 0 3px color-mix(in srgb,var(--v2-brand) 9%,transparent)}
.v2-site .plat-stat .n{font-style:italic;font-variant-numeric:tabular-nums}
.v2-site .tablewrap{border-radius:4px}.v2-site tbody tr{transition:background .2s}.v2-site tbody tr:hover{background:color-mix(in srgb,var(--v2-brand) 3%,transparent)}
.v2-site .mini-rank{color:white}
.v2-footer{position:relative;padding-top:48px}.v2-footer:before{content:'';position:absolute;left:0;top:-2px;width:64px;height:3px;background:var(--v2-brand)}
@media(max-width:600px){.v2-brand:after{width:10px;margin-left:6px}.v2-site .topbar{min-height:72px}.v2-site .btn{min-height:50px}}
/* ---- the drawn hero backdrop (assets/js/heroart.js) --------------------
   A scene and a photograph sit in the same box: either one may be what a
   given sport shows. The .9s here is FADE in heroart.js — the script drops
   the outgoing scene on a timer, and a stylesheet that disagreed would
   either cut the fade short or leave two scenes stacked. */
.v2-site .v2-hero-scene,.v2-site .v2-hero-photo{position:absolute;inset:0;width:100%;height:100%;display:block;object-fit:cover;transition:opacity .9s ease}
.v2-site .v2-hero-scene.is-entering,.v2-site .v2-hero-photo.is-entering{opacity:0}
@media(prefers-reduced-motion:reduce){.v2-site .v2-hero-scene,.v2-site .v2-hero-photo{transition:none}.v2-site .v2-hero-scene.is-entering,.v2-site .v2-hero-photo.is-entering{opacity:1}}
/* The hero art's accent, from the brand. heroart.js writes each accent surface
   with a vermilion presentation attribute AND one of these classes: a
   stylesheet rule outranks a presentation attribute, so the page's brand wins
   wherever this file is loaded, and the literal is the fallback where it is
   not. A custom property cannot go in the attribute itself — fill="var(...)"
   is not valid SVG and paints black. */
.v2-hero-scene .hx-s{stroke:var(--v2-brand)}.v2-hero-scene .hx-f{fill:var(--v2-brand)}
.v2-hero-scene .hx-stop{stop-color:var(--v2-brand)}.v2-hero-scene .hx-stop-lt{stop-color:color-mix(in srgb,var(--v2-brand) 83%,#fff)}
/* ---- THE DOCK -------------------------------------------------------------
   The shared .tabbar, drawn as this design's floating bar. It is ONE markup on
   every public page (docs/REDESIGN.md, D12), and admin.js, i18n.js and qr.js
   all query .tabbar and .tab — so the design restyles it rather than replacing
   it. The owner chose a floating bar at the foot of the screen at every width;
   theme.css's full-width phone bar and desktop pill both give way to it here.
   The console keeps its rail and competition dock (body.console), which are
   styled with the console. */
body.v2-site:not(.console) .tabbar{position:fixed;left:50%;right:auto;top:auto;bottom:max(14px,env(safe-area-inset-bottom));transform:translateX(-50%);z-index:45;width:min(640px,calc(100vw - 28px));max-width:none;height:auto;padding:6px;background:#0e141df2;-webkit-backdrop-filter:blur(22px);backdrop-filter:blur(22px);border:1px solid #ffffff26;border-radius:5px;box-shadow:0 16px 46px #00000061}
body.v2-site:not(.console) .tabbar .tabbar-inner{display:flex;gap:2px;max-width:none;margin:0;grid-template-columns:none}
body.v2-site:not(.console) .tabbar .tab{flex:1 1 0;min-width:0;min-height:0;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;gap:6px;padding:10px 4px;border-radius:3px;background:none;color:#c3cedb;font-family:var(--font);font-size:9.5px;font-weight:750;letter-spacing:.07em;line-height:1.25;text-transform:uppercase;text-align:center;text-decoration:none;transition:background .2s,color .2s}
body.v2-site:not(.console) .tabbar .tab-ico{width:21px;height:21px;flex:none}
body.v2-site:not(.console) .tabbar .tab>span:not(.tab-fab){display:block;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
body.v2-site:not(.console) .tabbar .tab:hover{background:#ffffff16;color:#fff;text-decoration:none}
body.v2-site:not(.console) .tabbar .tab.active{background:var(--v2-brand);color:#fff}
body.v2-site:not(.console) .tabbar .tab:focus-visible{outline:2px solid #fff;outline-offset:2px}
/* The raised action keeps its mark in a filled square, so the primary door still
   reads as primary without breaking the bar's line. On the page it opens, the
   tab is lit in the brand, so the square turns white to stay visible. */
body.v2-site:not(.console) .tabbar .tab-cta{color:#c3cedb}
body.v2-site:not(.console) .tab-fab{display:inline-flex;align-items:center;justify-content:center;width:25px;height:25px;margin:0 0 -2px;border:0;border-radius:3px;background:var(--v2-brand);color:#fff;box-shadow:none;flex:none}
body.v2-site:not(.console) .tab-fab svg{width:15px;height:15px}
body.v2-site:not(.console) .tabbar .tab.active .tab-fab{background:#fff;color:var(--v2-brand)}
/* the bar floats over the page, so the page has to stop above it. It and the top
   bar sit at theme.css's top-bar layer (45): above the sticky section nav (30),
   below dialogs (50), toasts (60) and the picker sheet (200) — at 60 they covered
   every dialog's title and close button. */
body.v2-site:not(.console):has(.tabbar){padding-bottom:calc(104px + env(safe-area-inset-bottom))}
@media(max-width:520px){body.v2-site:not(.console) .tabbar{width:calc(100vw - 16px);bottom:max(8px,env(safe-area-inset-bottom));padding:5px}body.v2-site:not(.console) .tabbar .tabbar-inner{gap:1px}body.v2-site:not(.console) .tabbar .tab{font-size:8.5px;letter-spacing:.03em;padding:9px 2px;gap:5px}body.v2-site:not(.console) .tabbar .tab-ico{width:19px;height:19px}}
}
