/* ==========================================================================
   Kobra redesign v2 — full visual pass. Restyles + selectively rebuilds
   Splash's markup (nav, hero, results) via classes added by redesign.js,
   on top of the real page content. No WordPress data is changed.
   ========================================================================== */

/* ---------- Fonts ----------
   Bricolage Grotesque is the one font used everywhere — headings, body,
   nav, numbers — for consistency, with a slight playful character in
   its bolder weights that plain Archivo didn't have. Big Shoulders is
   reserved for exactly one spot: the "Kobra ženy" hero title, where a
   big condensed scoreboard-style face earns its place as a one-off
   statement rather than a second everyday font.
   Both were machine-verified (actual glyph inspection, not just
   metadata) to contain the full Czech diacritic set. Two subsets each:
   latin-ext is required for č š ž ě ř ů ď ť ň — without it they'd
   fall back to a system font. */
@font-face {
	font-family: 'Bricolage Grotesque';
	font-style: normal;
	font-weight: 400 800;
	font-display: swap;
	src: url('../fonts/bricolage-latinext.woff2') format('woff2');
	unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
	font-family: 'Bricolage Grotesque';
	font-style: normal;
	font-weight: 400 800;
	font-display: swap;
	src: url('../fonts/bricolage-latin.woff2') format('woff2');
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
	font-family: 'Big Shoulders';
	font-style: normal;
	font-weight: 100 900;
	font-display: swap;
	src: url('../fonts/big-shoulders-latinext.woff2') format('woff2');
	unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
	font-family: 'Big Shoulders';
	font-style: normal;
	font-weight: 100 900;
	font-display: swap;
	src: url('../fonts/big-shoulders-latin.woff2') format('woff2');
	unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}

/* ---------- Palette — sampled straight from the real Kobra logo ---------- */
:root {
	--kobra-ink:    #071b30;
	--kobra-navy:   #0c3865;
	--kobra-navy-2: #123f6e;
	--kobra-yellow: #f1e813;
	--kobra-sky:    #53a9dc;
	--kobra-ice:    #eaf1f8;
	--kobra-mist:   #90a4bf;
	--kobra-line:   rgba(234, 241, 248, 0.14);
	--kobra-ice-texture: url('../images/ice-texture.png');

	/* Editable photos. These are the shipped defaults; functions.php prints
	   an inline :root block after this file that overrides them with
	   whatever the admin picked in Vzhled -> Přizpůsobit. */
	--kobra-hero-photo:    url('../images/hero-default.jpg');
	--kobra-results-photo: url('../images/stock-action.jpg');
}

/* ---------- Base type & page ground ---------- */
html { scroll-behavior: smooth; }
body {
	background-color: var(--kobra-ink) !important;
	background-image: var(--kobra-ice-texture) !important;
	background-repeat: repeat !important;
	color: var(--kobra-ice) !important;
	font-family: 'Bricolage Grotesque', 'Poppins', sans-serif !important;
}
#wrapper { background-color: transparent !important; }

h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6, .heading-font {
	font-family: 'Bricolage Grotesque', sans-serif !important;
	color: var(--kobra-ice) !important;
	letter-spacing: 0.01em;
}

a { transition: color .18s ease, border-color .18s ease, background-color .18s ease; }

.kobra-eyebrow {
	display: block;
	font-family: 'Bricolage Grotesque', sans-serif;
	font-weight: 800;
	font-size: 13px;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--kobra-sky);
}

/* **`a.kobra-btn` as well as `.kobra-btn`.** `.hockey a { display: inline }`
   is (0,1,1) and beats a one-class rule on an anchor — the single most repeated
   trap in this project. On the 404 page the consequence was not just a wrong
   display: **vertical margins do not apply to an inline box**, so the button's
   `margin-top` did nothing and it overlapped the search field above it. Measured
   before: `display: inline`, gap to the form **-10px**. The buttons injected by
   redesign.js sit in containers that happened to hide this. */
a.kobra-btn,
.kobra-btn {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	padding: 14px 26px;
	border-radius: 3px;
	font-family: 'Bricolage Grotesque', sans-serif;
	font-weight: 700;
	font-size: 13px;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	border: 1.5px solid transparent;
	cursor: pointer;
	transition: transform .18s ease, box-shadow .18s ease, background .18s ease, color .18s ease, border-color .18s ease;
	text-decoration: none;
}
/* **The modifiers have to name the element too, now that the base rule does.**
   Adding `a.kobra-btn` above took the base to (0,1,1), which outranked
   `.kobra-btn-ghost` at (0,1,0) — and the base sets `border: 1.5px solid
   transparent`, so **every ghost anchor on the site lost its border at rest**
   while `.kobra-btn-ghost:hover` at (0,2,0) still won, making the outline appear
   only under the cursor. The user reported it on the 404 page; measured, it was
   also both hero buttons on the homepage.

   A regression of my own making, and the shape is worth remembering: **raising a
   base rule's specificity silently promotes it over its own modifiers.** Naming
   the element in both puts them back on equal footing, where source order
   decides and the modifier is written last on purpose. */
a.kobra-btn-primary,
.kobra-btn-primary { background: var(--kobra-yellow); color: #101a08 !important; }
a.kobra-btn-primary:hover,
.kobra-btn-primary:hover { transform: translateY(-2px); box-shadow: 0 10px 28px -6px rgba(241,232,19,0.45); color: #101a08 !important; }
a.kobra-btn-ghost,
.kobra-btn-ghost { background: transparent; color: var(--kobra-ice) !important; border-color: rgba(234,241,248,0.4); }
a.kobra-btn-ghost:hover,
.kobra-btn-ghost:hover { border-color: var(--kobra-sky); color: var(--kobra-sky) !important; }

/* ==========================================================================
   Legacy inline text colours — masked site-wide
   --------------------------------------------------------------------------
   Content all over this site carries the editor's colour baked into the markup
   as `<span style="color: #000000">`, pasted in from Word or Docs. Invisible on
   the old white pages, unreadable here. Counted in the database:

     sp_event   135 of 140     ← had no mask at all until v0.48.0
     sp_player   42 of 64
     page         8 of 22
     post         7 of 16

   post.css, pages.css and player.css each grew their own copy of this block for
   their own template. The match pages never got one, which is why a black dash
   was sitting in the venue list of 135 matches. Rather than add a fourth copy,
   the base treatment lives here once and covers every template, present and
   future; those files keep their own refinements on top.

   **`!important` is the mechanism here, not a shortcut.** An inline style
   outranks every author rule however long the selector; an important author
   declaration is the single thing in the cascade that beats a normal inline one.

   **Anchored with `^=` and `*="; color…"`, never a plain `*=`.**
   `[style*="color: #000000"]` also matches `background-color: #000000`, which
   would repaint the text of anything given a dark background. Anchoring removes
   the trap rather than trusting that nothing on the site has one.

   Matched on the exact declarations that occur, so a colour someone chose on
   purpose still works — the deliberate `#ffcc00` in one article is untouched.
   ========================================================================== */
body.hockey [style^="color: #000000"],
body.hockey [style^="color:#000000"],
body.hockey [style*="; color: #000000"],
body.hockey [style^="color: #333333"],
body.hockey [style^="color:#333333"],
body.hockey [style*="; color: #333333"] {
	color: var(--kobra-ice) !important;
}

/* Links keep looking like links. `a[style]` is one class heavier than the bare
   attribute rule above, so this wins regardless of source order. */
body.hockey a[style^="color: #000000"],
body.hockey a[style^="color:#000000"],
body.hockey a[style^="color: #333333"],
body.hockey a[style^="color:#333333"],
body.hockey [style^="color: #0000ff"],
body.hockey [style^="color:#0000ff"],
/* #3366ff, four times on the Nábor page, on the words "Facebooku" and
   "Instagramu" — a link blue someone picked by hand. */
body.hockey [style^="color: #3366ff"],
body.hockey [style^="color:#3366ff"] {
	color: var(--kobra-sky) !important;
}

/* ---------- Near-miss brand colours (v0.67.0) ----------
   Two colours in the content are *almost* the theme's and that is exactly the
   problem: side by side with the real ones they read as a mistake rather than as
   a different colour. Counted in the database:

     color:#e8e120            10 x   theme yellow is #f1e813
     background-color:#044066 10 x   theme navy   is #0c3865

   All twenty are on the myWorld page. **Note the missing space after the colon**
   — these were pasted from a different editor than the #000000 runs above, so
   the `^="color: #..."` patterns would never have matched them. The declaration
   is matched as it actually occurs, which is the rule this whole block follows.

   Masking rather than editing the page: a content fix would live in this local
   database and **would not travel to production in the theme zip**, so the same
   two colours would be back on the live site. */
body.hockey [style^="color:#e8e120"],
body.hockey [style^="color: #e8e120"],
body.hockey [style*="; color:#e8e120"] {
	color: var(--kobra-yellow) !important;
}
/* Both separator forms, with and without the space: the ten elements are
   Gutenberg buttons whose attribute is exactly
   `color:#e8e120;background-color:#044066` — no space after the semicolon. The
   spaced pattern alone matched none of them, which is the same lesson as the
   missing space after the colon one line up. **Match the declaration as the
   database actually stores it, not as it would be written by hand.** */
body.hockey [style^="background-color:#044066"],
body.hockey [style^="background-color: #044066"],
body.hockey [style*=";background-color:#044066"],
body.hockey [style*="; background-color:#044066"] {
	background-color: var(--kobra-navy) !important;
}

/* ---------- Gutenberg's horizontal rule (v0.67.0) ----------
   `<hr class="wp-block-separator">` ships with a grey `#808080` border from
   WordPress's own block styles. Five of them on the myWorld page, and every
   other divider on this site is `--kobra-line` — found by the palette sweep, not
   by looking, because a grey hairline on navy is quiet rather than wrong.

   Both the border and the background are set: the block draws itself as a
   border on some themes and a 1px filled box on others, and which one shows
   depends on rules outside this theme. */
body.hockey hr,
body.hockey hr.wp-block-separator {
	border-color: var(--kobra-line);
	background-color: transparent;
}

/* ==========================================================================
   Empty states — shared by the 404 page and a search that found nothing
   --------------------------------------------------------------------------
   Both say the same kind of thing: what you were looking for is not here, and
   here is what to do next. So they are one component, in redesign.css rather
   than blog.css, because **404 does not load blog.css** — it is neither
   is_home() nor is_archive() nor is_search().
   ========================================================================== */
.kobra-empty-state {
	max-width: 640px;
	margin: 0 auto;
	padding: 72px 24px 96px;
	text-align: center;
}
.kobra-empty-state h1,
.kobra-empty-state h2 {
	margin: 14px 0 0 !important;
	font-family: 'Bricolage Grotesque', sans-serif !important;
	font-weight: 800 !important;
	font-size: clamp(28px, 4vw, 44px) !important;
	line-height: 1.08 !important;
	color: var(--kobra-ice) !important;
}
.kobra-empty-state p {
	margin: 16px 0 0;
	font-size: 16px;
	line-height: 1.65;
	color: var(--kobra-mist);
}
/* The link sits under the search field, so it needs more than a paragraph's
   worth of space or it reads as part of the form. */
/* `a.` again, and this was the third instance in one sitting: as a bare class the
   rule lost `display` to `.hockey a`, the box went inline, and **an inline box
   ignores vertical margins** — so the 40px measured as 5. */
a.kobra-empty-state-link,
.kobra-empty-state-link {
	display: inline-block;
	margin-top: 40px;
	font-family: 'Bricolage Grotesque', sans-serif;
	font-weight: 700;
	font-size: 13px;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--kobra-sky) !important;
	text-decoration: none;
}
.kobra-empty-state-link:hover { color: var(--kobra-yellow) !important; }

/* The 404 gets the face-off motif behind it — the page is mostly empty by
   definition, and an empty dark screen reads as a broken site rather than a
   wrong address. */
.kobra-404 {
	position: relative;
	overflow: hidden;
}
.kobra-404::before {
	content: '';
	position: absolute;
	top: 50%;
	left: 50%;
	width: 520px;
	height: 520px;
	transform: translate(-50%, -50%);
	background: url('../images/faceoff-motif.png') center / contain no-repeat;
	opacity: 0.07;
	pointer-events: none;
}
.kobra-404 .kobra-empty-state { position: relative; z-index: 1; }
.kobra-404 a.kobra-btn { margin-top: 36px; }

/* ---------- The search field ----------
   Splash's own search input lives in the header behind a toggle. This is a
   plain form of our own, so nothing depends on that widget's markup or its
   JavaScript being present on a 404. */
.kobra-searchform {
	display: flex;
	gap: 10px;
	max-width: 460px;
	margin: 30px auto 0;
}
.kobra-searchform input[type="search"] {
	flex: 1 1 auto;
	min-width: 0;
	padding: 13px 16px;
	background: rgba(234, 241, 248, 0.06);
	border: 1px solid var(--kobra-line);
	border-radius: 3px;
	font-size: 15px;
	color: var(--kobra-ice);
	transition: border-color .18s ease, background .18s ease;
}
.kobra-searchform input[type="search"]::placeholder { color: var(--kobra-mist); }
.kobra-searchform input[type="search"]:focus {
	outline: none;
	border-color: var(--kobra-sky);
	background: rgba(234, 241, 248, 0.09);
}
/* Splash's `.hockey #wrapper button` sits at (1,1,1) and has eaten four
   properties in this redesign already — font-size, letter-spacing,
   text-transform and display. An id in the selector beats any number of
   classes, so this rule carries one too rather than trying to out-class it. */
body.hockey #wrapper .kobra-searchform button {
	flex: 0 0 auto;
	/* **Splash puts `margin-left: 10px` on every button through `#wrapper`.**
	   In the row layout that simply widened the 10px gap to 20; stacked, it
	   pushed the button 10px right of the field directly above it — measured
	   input at 90 and button at 100 with identical widths, which is the
	   misalignment the user photographed. The same declaration that indented the
	   comment submit button in v0.52.1. */
	margin: 0;
	padding: 13px 22px;
	background: transparent;
	border: 1.5px solid rgba(234, 241, 248, 0.4);
	border-radius: 3px;
	font-family: 'Bricolage Grotesque', sans-serif;
	font-weight: 700;
	font-size: 13px;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--kobra-ice);
	cursor: pointer;
	transition: border-color .18s ease, color .18s ease;
}
body.hockey #wrapper .kobra-searchform button:hover {
	border-color: var(--kobra-sky);
	color: var(--kobra-sky);
}
/* Splash draws a skewed red slab on buttons through both pseudo-elements. It
   needs `content: none` as well as `display: none` — this is the fifth place in
   the redesign that has had to say both. */
body.hockey #wrapper .kobra-searchform button::before,
body.hockey #wrapper .kobra-searchform button::after {
	display: none;
	content: none;
}

@media (max-width: 700px) {
	.kobra-empty-state { padding: 48px 18px 64px; }
	/* Stacked, and both boxes forced to the same width: `align-items: stretch`
	   ought to do it, but the field measured 324px against the button's 314 —
	   they sit directly above each other, so 10px shows. */
	.kobra-searchform { flex-direction: column; }
	.kobra-searchform input[type="search"],
	body.hockey #wrapper .kobra-searchform button { width: 100%; box-sizing: border-box; }
	.kobra-404::before { width: 340px; height: 340px; }
}

/* ==========================================================================
   Splash's red accent — repainted yellow, site-wide
   --------------------------------------------------------------------------
   Splash's accent colour is red, in two shades: `#f53837` in hockey.css and
   `#e21e22` in styles.css. It lands on icons and list markers all over the
   theme, and on a navy/yellow palette it reads as an error state.

   **Mirroring Splash's own selectors rather than writing one blanket icon
   rule, and that distinction matters.** A rule like `.hockey i::before` would
   also catch `.vc_btn3-icon` — the icon inside a button — and the primary
   button is yellow, so its icon would become yellow on yellow, i.e. invisible.
   Anywhere this design has already chosen an icon colour, it must keep it.
   Matching only where Splash paints red cannot reach those.

   Scoped `body.hockey` (0,1,1) so it clears hockey.css's own `.hockey …`
   (0,1,0) prefix outright rather than tying and depending on source order.
   Where Splash uses `!important` — the `.af-ul-wrap` rule does — so does this.

   Checked against every page before writing: `ul.stm-list-icon` exists only on
   Stadion, the contact widget only on Kontakty, and `.af-ul-wrap`,
   `.fa-check` and `widget_contacts` are on no page at all — those last three
   are covered anyway, cheaply, so a page built with them later is not a
   surprise.
   ========================================================================== */

/* Icon lists — Stadion's facilities list is nine of these. Splash colours both
   the marker and the icon glyph inside it. */
body.hockey ul.stm-list-icon li::before,
body.hockey ul.stm-list-icon li i::before,
body.hockey ul.stm-list-icon li > .fa {
	color: var(--kobra-yellow);
}

/* Bullets and numbers in ordinary content.
   ----------------------------------------------------------------------------
   **`background-color` is the line that matters, and v0.46.0 missed it**
   (fixed in v0.53.1, found because the user spotted a red dot beside every
   news-grid category filter). Splash's bullet is not a glyph — it is an empty
   3×3px absolutely positioned block:

     styles.css  ul li::before        (0,0,3)  the 3×3 box, background #e21e22
     hockey.css  .hockey ul li::before (0,1,3) color AND background #f53837

   so the only thing anyone sees is the **background**, and this rule set only
   `color`. It won its specificity contest at (0,1,4) and repainted a property
   that has no visible effect on an empty box — every bullet on the site stayed
   Splash red. Measured on /aktuality/: 22 list items with a visible `::before`,
   all 22 still red, including the nav dropdowns.

   `color` is kept because `ol li::before` prints a real number, where colour is
   what shows and background is what doesn't. One rule, both mechanisms. */
body.hockey ul li::before,
body.hockey ol li::before,
body.hockey .stm-gray-bg .vc_column-inner .wpb_wrapper ul li::before {
	color: var(--kobra-yellow);
	background-color: var(--kobra-yellow);
}

/* Tick marks, accordion arrows, and the contact widget's icons. The contact
   rule is also stated (longer) in pages.css, which only loads on the text
   pages — this covers the widget anywhere else it is used. */
body.hockey .fa.fa-check,
body.hockey .fa-check-square::before,
body.hockey .vc_tta-container .vc_tta.vc_general .vc_tta-panel-heading .vc_tta-panel-title a::before,
body.hockey .stm-contacts .stm-single-contact i,
body.hockey .footer-widgets-wrapper .stm-cols-3 .widget_contacts table tr td .icon,
body.hockey .stm-carousel-with-data-wrapp .stm-cwd-data-wrapp .stm-data-row table tr td i {
	color: var(--kobra-yellow);
}

/* Splash puts `!important` on this one, so importance is the only thing that
   beats it. */
body.hockey .af-ul-wrap ul li i {
	color: var(--kobra-yellow) !important;
}

/* ==========================================================================
   Team history timeline — site-wide (Historie is the only page using it today)
   --------------------------------------------------------------------------
   Splash builds each entry as a white 21px ring with a **red** 15px dot inside
   it (`#e21e22` in styles.css, `#f53837` at 10px in hockey.css) on a grey
   1px connector. On navy that reads as a white blob with a red centre.

   The text was worse than the marker: the year is `#1f3b79`, a dark navy that is
   all but invisible on this page's own navy, and the body copy is `#777777` at
   15px — both sized and coloured for a white page.
   ========================================================================== */

/* The node: a navy disc on the line rather than a white one, with the accent
   moved to the dot inside it. */
body.hockey .stm-team-history .stm-team-history-single .stm-team-history-linked span {
	background-color: var(--kobra-navy-2);
	box-shadow: none;
	border: 1px solid var(--kobra-line);
}

body.hockey .stm-team-history .stm-team-history-single .stm-team-history-linked span::after {
	background-color: var(--kobra-yellow);
}

/* The connector. styles.css draws it white and 3px, hockey.css narrows it to
   1px grey — both need clearing, hence the two properties. */
body.hockey .stm-team-history .stm-team-history-single .stm-team-history-linked::after {
	background-color: var(--kobra-line);
	width: 1px;
}

/* The year is the timeline's marker, so it carries the accent — a judgement
   call, since the user asked for "texts in ice and red elements in yellow" and
   the year was neither: it was `#1f3b79`, invisible here. Ice would have made it
   identical to the title beside it at the same 24px, leaving the timeline with
   no rhythm.

   `!important` is against **this very file**: the year carries class
   `heading-font`, and `.heading-font { color: var(--kobra-ice) !important }`
   above outranks any non-important rule however long. Written without it, the
   weight applied and the colour silently did not — so the rule looked like it
   was working. Same trap as h5, h4 and the SportsPress table captions. */
body.hockey .stm-team-history .stm-team-history-single .year {
	color: var(--kobra-yellow) !important;
	font-weight: 800;
}

body.hockey .stm-team-history .stm-team-history-single .stm-team-history-content .title {
	color: var(--kobra-ice);
}

/* Body copy, at the size body copy is everywhere else — it was 15px/23px grey. */
body.hockey .stm-team-history .stm-team-history-single .stm-team-history-content .content {
	color: var(--kobra-ice);
	font-size: 17px;
	line-height: 1.75;
	text-align: justify;
	hyphens: auto;
	-webkit-hyphens: auto;
}

/* Any heading inside the timeline copy stays left — the justification below is
   set on the block, so it would otherwise inherit. */
body.hockey .stm-team-history .stm-team-history-single .stm-team-history-content .content h1,
body.hockey .stm-team-history .stm-team-history-single .stm-team-history-content .content h2,
body.hockey .stm-team-history .stm-team-history-single .stm-team-history-content .content h3,
body.hockey .stm-team-history .stm-team-history-single .stm-team-history-content .content h4 {
	text-align: left;
}

/* The timeline copy stays justified at every width, at the user's request:
   "u historie se akorát text při zmenšení místo do bloku rovná doleva - chci ho
   vždy do bloku". This block used to drop it to `text-align: left` below 767px,
   on the same reasoning the text pages and the article detail still use — a
   phone-width column has too few characters per line to absorb the extra space
   without visible rivers. She has seen both and prefers the block, so the
   override is gone rather than merely widened; `hyphens: auto` above is what
   keeps the gaps in check, and Czech hyphenation needs the document's
   `lang="cs"`, which is present.

   Deliberately scoped to the timeline. The article detail, the match reports
   and the text pages still left-align on a phone — those were not what she
   was looking at, and changing them unasked would be a site-wide restyle. */

/* ==========================================================================
   "Load more" — site-wide
   --------------------------------------------------------------------------
   Splash renders it `<a class="button btn-primary btn-sm btn-style-1">`, its own
   red button component, and prints the label in **English** on a Czech site (the
   Czech comes from a gettext filter in functions.php).

   Given the site's own button component rather than a one-off restyle, so it
   matches every other button here. Only the gallery on Historie uses it today,
   but it belongs with the rest of the button work.
   ========================================================================== */
body.hockey #wrapper .stm-load-more-images-grid a.button {
	display: inline-flex;
	align-items: center;
	gap: 10px;
	padding: 14px 26px;
	border-radius: 3px;
	font-family: 'Bricolage Grotesque', sans-serif;
	font-weight: 700;
	font-size: 13px;
	line-height: 1;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	background: transparent;
	background-image: none;
	color: var(--kobra-ice);
	border: 1.5px solid rgba(234, 241, 248, 0.4);
	box-shadow: none;
	text-decoration: none;
	transition: transform .18s ease, color .18s ease, border-color .18s ease;
}

body.hockey #wrapper .stm-load-more-images-grid a.button:hover {
	background: transparent;
	color: var(--kobra-sky);
	border-color: var(--kobra-sky);
	transform: translateY(-2px);
}

/* Splash hangs its skewed red slab off this button as pseudo-elements, the same
   way it does on the squad tabs. On a transparent ghost button it shows
   straight through. */
body.hockey #wrapper .stm-load-more-images-grid a.button::before,
body.hockey #wrapper .stm-load-more-images-grid a.button::after {
	display: none;
}

/* The zoom overlay on each gallery thumbnail — Splash's is a red-tinted
   circle. */
body.hockey .stm-images-grid .stm-images-grid-single .stm-images-grid-zoom i {
	color: var(--kobra-yellow);
}

/* ==========================================================================
   Page masthead — injected by redesign.js on every template that needs one
   --------------------------------------------------------------------------
   Splash prints no page title on these layouts, so template after template
   arrived with a heading outline and no subject: the only h1s in the document
   are four copies of the site name inside the native header this file hides,
   all measuring 0x0. This is the shared answer to that, used by the text
   pages, the news listing, the squad page, the coaching staff and the team
   statistics page.

   It lives here rather than in pages.css because five templates need it and
   only pages.css loads on the text ones. Which pages get a heading is decided
   in PHP by kobra_page_heading(); an empty value means none.

   Free-standing type, no panel: the first version boxed it in a navy card and
   the user asked for it loose — a boxed title carried the same visual weight
   as the cards below it, so the page read as a stack of panels with no clear
   top. The yellow rule is the same motif the article detail uses under its
   headline, so a page and an article read as one site.
   ========================================================================== */
.kobra-page-head {
	/* Top space is padding, not margin. Splash prints
	   `#main { padding: 0 !important }` inline, so the header ends and the
	   content begins at the same y; a top margin on the first child of a
	   container with no padding or border would collapse straight up through
	   .container and #main instead of opening a gap here. */
	margin: 0 0 40px;
	padding-top: 56px;
}

/* `h1.kobra-page-title`, not the class alone: hockey.css sets `.hockey h1` at
   (0,1,1), which outranks a lone .kobra-page-title at (0,1,0) — one class plus
   one type beats one class. Shipped that way first and the heading came out at
   weight 700 in mixed case instead of 800 uppercase, with nothing in the
   stylesheet looking wrong. */
h1.kobra-page-title {
	margin: 0;
	font-family: 'Bricolage Grotesque', sans-serif;
	font-weight: 800;
	font-size: 46px;
	line-height: 1.08;
	letter-spacing: -0.01em;
	text-transform: uppercase;
	color: var(--kobra-ice);
	/* Czech page names are long ("Realizační tým", "Aktuální soupiska") and
	   this runs full width on a phone. hyphens needs the document's lang
	   attribute to do anything; the pages have lang="cs". */
	hyphens: auto;
	-webkit-hyphens: auto;
}

/* The optional line under the heading — the competition and season on a
   fixture list. Sky and letterspaced, the same treatment the 45px headings on
   O týmu and Stadion were turned into, so a subtitle looks the same wherever it
   comes from. */
.kobra-page-subtitle {
	margin: 12px 0 0;
	font-family: 'Bricolage Grotesque', sans-serif;
	font-size: 15px;
	font-weight: 700;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: var(--kobra-sky);
}

.kobra-page-title-rule {
	display: block;
	width: 64px;
	height: 3px;
	margin: 20px 0 0;
	background: var(--kobra-yellow);
	border: 0;
}

/* One origin for that 56px, on every template.
   Splash wraps the news listing — and only the news listing — in
   `.stm-default-page`, which carries `padding-top: 10px`. Nothing else does:
   checked across the text pages, the squad page, the coaching staff, the team
   archive, the homepage, the calendar and the tag archives, and it is absent
   from all of them. So /aktuality/ measured a 66px gap above its heading where
   every other page measured 56, which is exactly the kind of difference that
   shows up when two pages are compared side by side.
   Zeroed here rather than subtracting 10px from the masthead's own padding on
   that one template, so the gap has a single source instead of a value that
   has to stay in step with Splash's.

   `body.hockey` and not just `.stm-default-page`: hockey.css declares
   `.hockey .stm-default-page` at (0,2,0), which beat a bare class at (0,1,0) —
   written short, this rule computed to nothing at all and the gap stayed 66px.
   (0,2,1) clears it outright rather than tying and relying on source order. */
body.hockey .stm-default-page {
	padding-top: 0;
}

@media (max-width: 767px) {
	.kobra-page-head {
		margin-bottom: 30px;
		padding-top: 34px;
	}

	/* Must repeat `h1.` — a media query grants no extra weight, so at (0,1,0)
	   this lost to the rule above at (0,2,1) and the title stayed 46px on a
	   phone. Narrowing the viewport is not a test of a mobile rule that never
	   applied at any width. */
	h1.kobra-page-title {
		/* 26, down from 31: part of the phone-wide trim the user asked for —
		   "když je to na mobilu, je potřeba ty věci na stránkách prostě o něco
		   zmenšit, aby to nebylo tak obrovský". The desktop title is 46px, so
		   the phone still gets a clear step down from the rest of the page.

		   **`!important`, and it is not optional.** hockey.css carries
		   `.hockey h1, .hockey h2 { font-size: 30px !important }` under
		   `@media (max-width: 640px)` at (0,1,1) — the same specificity as this
		   rule, but important, so it wins outright. The consequence is worth
		   stating: this mobile size has only ever applied between 641 and 767px
		   and every real phone got Splash's 30px. Resolved by enumerating the
		   matching rules rather than by guessing, after the declared 26 kept
		   computing to 30. */
		font-size: 26px !important;
	}
}

/* ==========================================================================
   Header / nav — Splash's native header markup has multiple overlapping
   variants for different header styles (a text logo, an in-menu logo
   item, mobile-only duplicates) that are shown/hidden by very specific
   CSS this redesign doesn't preserve, and it collapses when restyled.
   Rather than fight that, redesign.js hides the whole native header and
   builds one clean, fully custom nav bar from the real menu data.
   ========================================================================== */
.stm-header-inner { display: none !important; }
/* Splash renders a second, entirely separate mobile header block
   (.stm-header-mobile, with its own red hamburger .stm-menu-toggle),
   normally shown only under a JS-measured breakpoint — but that
   measurement reads the now-hidden desktop header's width, so it can
   misfire and show this at any width. The custom .kobra-navbar above
   already has its own mobile toggle, so this native one is redundant
   regardless — hide it unconditionally. */
.stm-header-mobile { display: none !important; }

/* A top bar with the real horizontal link list on wide screens (with
   hover dropdowns for sub-items), and a single menu trigger that opens
   the full-screen overlay only on narrow/mobile screens — one is a
   normal desktop nav, the other a distinct mobile-appropriate pattern,
   rather than forcing the same interaction at every width. */
/* ==========================================================================
   Header: menu — logo — menu, with the logo overhanging the bar (v0.59.0)
   --------------------------------------------------------------------------
   Rebuilt at the user's request, after WHC Valkyries' header: the club mark
   centred and larger than the bar, with the menu split either side of it.

   **The split point comes from the menu, not from this file.** redesign.js
   reads it from the position of the header menu's own "logo" item — see the
   note there. So the bar arranges itself, and dragging that item in
   Vzhled → Menu moves the break.

   `overflow` is deliberately never set on the bar: the logo hangs out of the
   bottom and any `overflow: hidden` here would slice it off. That is the same
   trap as Owl's viewport clipping the news cards' hover lift.
   ========================================================================== */
.kobra-navbar {
	position: sticky;
	top: 0;
	z-index: 500;
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 20px;
	padding: 14px 32px;
	background-color: var(--kobra-ink);
	background-image: var(--kobra-ice-texture);
	background-repeat: repeat;
	border-bottom: 1px solid var(--kobra-line);
}

/* The two lists share whatever the logo leaves, so the logo stays on the
   page's centre line no matter how long the labels are — pushing it there with
   `margin: auto` instead would move it whenever a menu item is renamed.

   **`.kobra-navbar >` is doing real work in these selectors.** Written as bare
   `.kobra-navbar-links-right` they tie at (0,1,0) with the shared
   `.kobra-navbar-links { justify-content: flex-end }` further down this file,
   and lost on source order — so the right-hand list stayed pinned to the far
   right of the page instead of sitting beside the logo, which is exactly what
   the user reported. The child combinator takes these to (0,2,0) and they win
   wherever they sit in the file.

   The inner `padding` is the gap between the last/first label and the logo.
   Without it the labels touch the mark, and — worse — "Soutěže" is the last
   item on the left, so its dropdown opened directly under the logo. */
/* ---------- Never two lines (v0.60.3) ----------
   The user caught the bar wrapping to two rows while resizing. The cause was a
   20px gap between two numbers:

     the bar needs   920px   to lay both lists out on one line
     the burger took over at 900px

   so between 900 and 920 the lists were shown, did not fit, and
   `flex-wrap: wrap` broke them onto a second row. The breakpoint is 1000px now
   — see the note on the media query — and `nowrap` here means the shared
   `.kobra-navbar-links { flex-wrap: wrap }` can never do it again.

   How the 920 was measured, for when the menu changes: sum each list's `<li>`
   widths, add `gap × (items − 1)` and the list's own 34px of inner padding,
   then add the 132px logo, the bar's two 20px flex gaps and its 64px of
   horizontal padding. Left came to 322, right to 362.

   **Rename or add a menu item and this needs redoing.** The headroom is 80px of
   viewport but only **18px inside the right-hand list box at 1010px** — that is
   the tightest width where the links show, measured. A right-side label ~20px
   wider would overflow there. Breakpoint 1000 was chosen over something safer
   so that a 1024px laptop still gets the real menu rather than the burger. */
.kobra-navbar > .kobra-navbar-links-left,
.kobra-navbar > .kobra-navbar-links-right {
	flex: 1 1 0;
	min-width: 0;
	flex-wrap: nowrap;
}

/* Splash's generic `ul li::before` bullet — a 3x3 dot absolutely placed at the
   item's left edge. It was red until v0.53.1 and yellow after, which is what
   made it visible enough for the user to spot beside every menu label. The nav
   is not a list of bullet points; switched off here, in the submenus, and in
   the mobile overlay. */
.kobra-navbar-links > li::before,
.kobra-navbar-links-sub li::before,
.kobra-menu-body li::before,
.kobra-menu-item::before {
	display: none;
	content: none;
}
.kobra-navbar > .kobra-navbar-links-left {
	justify-content: flex-end;
	padding-right: 34px;
}
.kobra-navbar > .kobra-navbar-links-right {
	justify-content: flex-start;
	padding-left: 34px;
}

/* The dropdowns have to clear the logo, which carries `z-index: 2`.
   The submenu is absolutely positioned inside its `<li>`, and that `<li>` has
   no z-index of its own — so the logo painted over any menu opened near the
   centre. Raising the hovered item lifts its submenu with it. */
.kobra-navbar-links > li:hover,
.kobra-navbar-links > li:focus-within {
	z-index: 10;
}
.kobra-navbar-links-sub {
	z-index: 10;
}

/* ---------- The brand ----------
   Logo only in the centre; the club name beside it would break the symmetry
   the whole layout is for. The text is still rendered, hidden from sight but
   left to screen readers, and the same markup is reused unhidden in the mobile
   overlay's top bar — so the two Customizer text fields still do something.

   The overhang is `margin-bottom: -34px`: the logo is 92px tall but only
   contributes 58px to the bar's height, so the bottom 34px hangs below the
   border. Change one and the other has to follow. */
/* The overhang is arithmetic, not a negative margin.
   The brand reserves an 82px-tall box in the bar; the image is taken out of flow
   at 132px, so the bar sizes to 82 + 28 padding and the rest of the image hangs
   past the border. A negative `margin-bottom` was tried first and did nothing
   useful: with `align-items: center` the flex algorithm centres the *margin*
   box, so shrinking it just re-centred the image inside the shorter bar instead
   of pushing it out of the bottom — measured 1px short of the border rather
   than 34px past it. Change the 46 and the 108 together.

   **The mark is bare, on the user's instruction (v0.59.2):** no disc behind it,
   no ring, no shadow. It was first drawn as a circular ink-and-texture badge
   with a hairline border, and she asked for the logo on its own and larger. It
   is a PNG with its own transparency, so it sits straight on the bar. */
.kobra-navbar-brand {
	position: relative;
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 12px;
	flex: none;
	text-decoration: none;
	z-index: 2;
	width: 132px;
	height: 82px;
}

.kobra-navbar > .kobra-navbar-brand img {
	position: absolute;
	top: 0;
	left: 0;
	height: 132px;
	width: 132px;
	display: block;
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
	box-shadow: none;
	transition: transform .18s ease;
}

/* With no frame left to light up, the hover cue is a nudge instead. */
.kobra-navbar-brand:hover img {
	transform: translateY(-2px) scale(1.03);
}

/* Visually hidden, not `display: none` — a screen reader should still read the
   club name, and the aria-label on the link only covers the link itself. */
.kobra-navbar > .kobra-navbar-brand span {
	position: absolute;
	width: 1px;
	height: 1px;
	margin: -1px;
	padding: 0;
	overflow: hidden;
	clip: rect(0 0 0 0);
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

/* ---------- The pop-in ----------
   Runs once per page load, which is what the user asked for — and therefore
   replays on every navigation, so it is deliberately short and small: 520ms,
   14px of travel, 12% of scale.

   **It animates `transform` only, and carries no `animation-fill-mode`.** The
   first version faded in from `opacity: 0` with `fill-mode: both`, and that is
   a trap: `both` holds the *first* keyframe until the animation starts, so
   anything that stops it starting leaves the logo permanently invisible. Found
   for real — this browser throttles background tabs, the animation sat at
   `running @0ms`, and the logo was simply not there.

   With no fill mode the element renders normally before and after, so the worst
   case is "the logo doesn't animate" rather than "the logo doesn't exist". The
   cost is one frame at the final position before it starts, which is not
   noticeable. **Never let something's visibility depend on an animation
   completing.**

   Reduced-motion gets no animation at all — this is the one thing on the site
   that moves without being asked to. */
@keyframes kobra-logo-pop {
	0%   { transform: translateY(-14px) scale(0.88); }
	60%  { transform: translateY(2px) scale(1.04); }
	100% { transform: translateY(0) scale(1); }
}

.kobra-navbar > .kobra-navbar-brand img {
	animation: kobra-logo-pop 520ms cubic-bezier(0.22, 1, 0.36, 1);
}

@media (prefers-reduced-motion: reduce) {
	.kobra-navbar > .kobra-navbar-brand img {
		animation: none;
	}
}

/* The mobile overlay reuses the same brand markup, where the name should show
   and the logo should not overhang anything. */
.kobra-menu-overlay .kobra-navbar-brand {
	margin-bottom: 0;
}
.kobra-menu-overlay .kobra-navbar-brand img {
	height: 40px;
	width: 40px;
	padding: 0;
	border: 0;
	border-radius: 0;
	background: none;
	box-shadow: none;
	animation: none;
}
.kobra-menu-overlay .kobra-navbar-brand span {
	font-family: 'Bricolage Grotesque', sans-serif;
	font-size: 16px;
	color: var(--kobra-ice);
	white-space: nowrap;
}
.kobra-navbar-brand span b { color: var(--kobra-yellow); }

/* ---------- Desktop horizontal links (>1000px) ---------- */
.kobra-navbar-links {
	display: flex;
	align-items: center;
	gap: 28px;
	list-style: none;
	margin: 0;
	padding: 0;
	flex-wrap: wrap;
	justify-content: flex-end;
}
.kobra-navbar-links > li { position: relative; }
.kobra-navbar-links > li > a {
	display: inline-block;
	font-family: 'Bricolage Grotesque', sans-serif;
	font-weight: 700;
	font-size: 13px;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--kobra-ice);
	padding: 8px 0;
	position: relative;
	text-decoration: none;
}
.kobra-navbar-links > li > a::after {
	content: '';
	position: absolute;
	left: 0; right: 0; bottom: 2px;
	height: 2px;
	background: var(--kobra-yellow);
	transform: scaleX(0);
	transform-origin: left;
	transition: transform .22s ease;
}
.kobra-navbar-links > li:hover > a::after { transform: scaleX(1); }
/* ---------- The dropdown panel ----------
   Slightly translucent at the user's request (v0.59.5), so the page shows
   through the submenu instead of it reading as a solid slab.

   **Two background-colour declarations on purpose.** `color-mix()` keeps the
   alpha tied to `--kobra-navy`, so changing the palette token changes this too;
   the plain `rgba()` above it is the same colour for anything that does not
   understand `color-mix` yet, which would otherwise fall all the way back to
   the opaque token. Both are 92% — "trošičku", not see-through.

   `backdrop-filter` is what keeps it readable: the menu opens over article
   cards and photographs, and 8% of a busy image behind 13px text is enough to
   muddy it. Where the filter is unsupported the panel is simply a touch
   translucent, which is the same result minus the blur — nothing depends on it.

   The ice texture stays on top of the tint, so the panel keeps the same surface
   as every other navy block on the site. */
.kobra-navbar-links-sub {
	position: absolute;
	top: 100%;
	left: 0;
	min-width: 230px;
	background-color: rgba(12, 56, 101, 0.68);
	background-color: color-mix(in srgb, var(--kobra-navy) 68%, transparent);
	background-image: var(--kobra-ice-texture);
	background-repeat: repeat;
	backdrop-filter: blur(8px);
	-webkit-backdrop-filter: blur(8px);
	border: 1px solid var(--kobra-line);
	border-radius: 4px;
	padding: 8px 0;
	margin: 10px 0 0;
	list-style: none;
	box-shadow: 0 20px 40px -16px rgba(0,0,0,0.5);
	opacity: 0;
	visibility: hidden;
	transform: translateY(6px);
	transition: opacity .18s ease, transform .18s ease, visibility .18s ease;
}
.kobra-navbar-links > li:hover > .kobra-navbar-links-sub { opacity: 1; visibility: visible; transform: translateY(0); }
.kobra-navbar-links-sub li a {
	display: block;
	padding: 9px 18px;
	font-family: 'Bricolage Grotesque', sans-serif;
	font-size: 13px;
	font-weight: 600;
	color: var(--kobra-ice);
	white-space: nowrap;
	text-decoration: none;
}
.kobra-navbar-links-sub li a:hover { color: var(--kobra-yellow); }

/* ---------- Mobile menu trigger (<=1000px only) ---------- */
/* ---------- The menu button (v0.60.0) ----------
   Redesigned at the user's request: it was showing as "the classic red button",
   and it was — **Splash's skewed red slab, on the pseudo-elements.** The button's
   own background was already transparent with an ice border, and none of that
   was visible because the slab sat on top of it. Measured:

     ::after   background #f53837, skewX(-10deg), 109x78, absolute
     ::before  a 4px #f53837 outline, also skewed

   Exactly the same thing as the comment submit button and the statistics
   filters, and switched off the same way — `display: none` **and**
   `content: none`, because a generated box with only `display: none` is still
   generated and some Splash skins position these absolutely.

   With the slab gone the button is drawn in the site's own button language:
   the ghost treatment from `.kobra-btn-ghost` and the statistics filters —
   1.5px rgba(234,241,248,0.4), 3px radius, ice label, 13px/700 uppercase, sky
   on hover. **3px rather than the old 20px pill**, because every other button
   on this site is 3px and "fits the rest of the page" was the brief.

   `height` is explicit on purpose: the button measured 80px tall inside the
   111px bar, which is Splash's own sizing showing through rather than anything
   this file asked for. Pinning it makes the bar's right-hand side predictable
   whatever the bar's height becomes. */
.kobra-navbar-toggle {
	/* ---------- `display` is the fourth property that rule has eaten ----------
	   The burger and the "MENU" label stacked vertically and the label dropped
	   19px out through the bottom of the border. Cause: `display: flex` lost to
	   `hockey.css .hockey #wrapper button { display: inline-block }` at (1,1,1),
	   so the button was a *block* — and `.kobra-navbar-toggle-bars` is itself
	   `display: flex`, hence block-level, taking a full line with the inline
	   label pushed below it. `align-items`, `justify-content` and `gap` were all
	   present and all inert, because there was no flex container for them to
	   act on.

	   Same `#wrapper button` rule as the font-size, the letter-spacing and the
	   text-transform above. **When a `<button>` in this theme ignores something,
	   check that rule first** — it has now taken four properties. */
	display: flex !important;
	align-items: center;
	justify-content: center;
	gap: 10px;
	/* 64px, not 42: the user asked for a shape closer to square than to a
	   letterbox. The width is set by its contents (icon + gap + "MENU" ~141px),
	   so height is the only side that can move — 3.4:1 becomes 2.2:1. A true
	   square would mean dropping the label, and the label is what makes it
	   obvious. */
	height: 64px;
	padding: 0 18px;
	background: transparent !important;
	background-image: none !important;
	border: 1.5px solid rgba(234, 241, 248, 0.4) !important;
	border-radius: 3px;
	box-shadow: none !important;
	color: var(--kobra-ice) !important;
	/* ---------- Why the type carries !important too ----------
	   `font-size: 13px` and `letter-spacing: 0.06em` were written plainly first
	   and neither applied — the label rendered at 16px with no tracking. The
	   winner, read rather than guessed:

	     hockey.css   .hockey #wrapper button   (1,1,1)
	       { font-size: 16px; letter-spacing: 0 }

	   One ID against this rule's (0,1,0), and **an ID outranks any number of
	   classes**, so no longer class chain would have helped. Their declaration
	   carries no `!important`, so one here wins outright — the same reason the
	   background, border and colour above already have it, and the third time
	   this exact `#wrapper` rule has had to be answered (the comment submit
	   button and the statistics filters were the other two). */
	font-family: 'Bricolage Grotesque', sans-serif !important;
	font-weight: 700 !important;
	font-size: 13px !important;
	letter-spacing: 0.06em !important;
	text-transform: uppercase !important;
	cursor: pointer;
	transition: border-color .18s ease, color .18s ease;
}

/* ---------- The menu button is the icon alone ----------
   "tak tam to slovo MENU nemusí být nikde, to je v pohodě."

   This reverses the note above it, which argued the label is what makes the
   button obvious. That was a fair call when it was made and the user has now
   decided otherwise having seen both — and unlike the first version of this
   change, it applies at every width rather than only on phones, so there is no
   width where the button is a different shape.

   **Nothing is lost for a screen reader:** the button carries
   `aria-label="Otevřít menu"`, which is what is announced either way, and the
   label sits in its own span rather than as a bare text node, so it can be
   dropped outright instead of hidden behind a font-size trick.

   141x64 becomes a 48x48 square. The `#wrapper` prefix is not optional:
   `hockey.css .hockey #wrapper button` at (1,1,1) owns `padding` too, and
   without it the button measured 62x48 with `padding: 15px 35px 15px 25px` and
   the burger sat off-centre. That one declaration has now taken font-size,
   letter-spacing, text-transform, display, margin-left and padding in this
   project — an ID, so only an ID answers it. */
.kobra-navbar-toggle .kobra-navbar-toggle-label { display: none; }

.hockey #wrapper .kobra-navbar-toggle {
	width: 48px;
	height: 48px;
	padding: 0;
	gap: 0;
	justify-content: center;
}

/* Splash's slab and its offset outline. */
.kobra-navbar-toggle::before,
.kobra-navbar-toggle::after {
	display: none !important;
	content: none !important;
}

/* Sky, matching every other ghost control on the site — the bars follow
   because they are painted with `currentColor`. */
.kobra-navbar-toggle:hover,
.kobra-navbar-toggle:focus-visible {
	border-color: var(--kobra-sky) !important;
	color: var(--kobra-sky) !important;
}

/* Splash whitens button labels through `button:hover:focus`, a two-state rule
   that only appears after the button has been clicked once — the same trap the
   statistics filters hit. Answered here rather than discovered later. */
.kobra-navbar-toggle:hover:focus,
.kobra-navbar-toggle:hover:active {
	color: var(--kobra-sky) !important;
}
/* ==========================================================================
   Přeskočit na obsah (v0.76.0)
   --------------------------------------------------------------------------
   Audit finding G3. Off-screen until it takes focus, then a yellow chip in the
   top-left corner.

   **Moved off-screen rather than hidden**, which is the distinction that makes
   this work at all: `display: none` or `visibility: hidden` would take the link
   out of the tab order and there would be nothing to focus. `left: -9999px`
   keeps it focusable and unreadable, and `:focus` brings it back — the same
   technique Splash's own `.screen-reader-text` uses, drawn in this site's
   colours instead of WordPress's grey-on-blue default.

   `:focus`, not `:focus-visible`. This link exists only for people arriving by
   keyboard, so there is no case where it should be focused and invisible — and
   `:focus-visible` is exactly the rule that would hide it in some of them.

   Sits above the header's `z-index: 2` brand and the 900 the mobile overlay
   uses, so it cannot appear behind either. */
a.kobra-skip-link,
.kobra-skip-link {
	position: absolute;
	top: 8px;
	left: -9999px;
	z-index: 1000;
	padding: 12px 22px;
	border-radius: 3px;
	background: var(--kobra-yellow);
	color: var(--kobra-ink);
	font-family: 'Bricolage Grotesque', sans-serif;
	font-size: 13px;
	font-weight: 700;
	letter-spacing: 0.06em;
	line-height: 1.2;
	text-transform: uppercase;
	text-decoration: none;
}
a.kobra-skip-link:focus,
.kobra-skip-link:focus {
	left: 8px;
	outline: 2px solid var(--kobra-ink);
	outline-offset: 2px;
}
/* The target takes `tabindex="-1"` so focus can land on it; that would
   otherwise draw a focus ring round the whole page. */
#main:focus {
	outline: none;
}

/* ---------- Compact mode: burger instead of the two lists (v0.74.0) ----------
   **This used to be a media query at 1000px and now it is a class**, because a
   width is a guess about whether the menu fits and the menu is content.

   The 2026-08-28 audit measured what happens when a seventh top-level item is
   added, at 1010px — the tightest width where the lists still show:

     headroom before        right list 18px, left list 58px
     with a 7th item        the list's content overflows its box by 112px
     last item's right edge x=1075, against a bar that ends at x=995
     document.scrollWidth   unchanged — no scrollbar, the text simply paints
                            outside the header

   So 80px of menu rendered outside the bar with nothing to signal it. `nowrap`
   was put on these lists in v0.60.3 to stop them breaking onto a second row,
   which means overflow is now the failure mode instead of wrapping. Moving the
   breakpoint to 1100 would only relocate the cliff to the eighth item.

   `measureNavbarFit()` in redesign.js now measures the lists' real content width
   after the bar is built and adds `kobra-nav-compact` to <html> whenever they do
   not fit — at any viewport width. The 1000px rule is still there as a floor, so
   phones behave exactly as before, but the header can no longer be broken by
   renaming or adding a menu item.

   **Everything below is written twice on purpose**, once for the class and once
   for the media query, rather than being merged: a media query cannot be
   combined with a class selector in one block, and duplicating five declarations
   is cheaper than the alternative of putting the whole mobile layout behind JS,
   where a script error would leave a 132px overhanging logo on a phone. When one
   copy changes, change the other. */
/* A menu label must widen its item, not wrap inside it.
   Found while testing the fit measurement: the nav anchors inherit
   `white-space: normal`, so renaming an item to something much longer does not
   overflow the list — it wraps onto a second line and **grows the bar**, 111px
   to 127px, pushing the logo's overhang down onto the page heading. Different
   symptom from adding an item, same cause, and invisible to a width check
   because nothing is painted outside the bar.
   `nowrap` turns that back into an overflow, which measureNavbarFit() can see and
   answer with the burger. A no-op for the six labels the menu has today —
   verified, the bar is 111px with and without it. */
.kobra-navbar-links > li > a { white-space: nowrap; }

/* The dropdown's colour is set on the anchors, so anything that is *not* an
   anchor inside a submenu item inherits Splash's `ul li { color: #333333 }`
   instead — dark grey on a dark panel. Inert today, because no submenu item has
   its own text node (measured: every `li` reports an empty direct-text run), but
   a menu item description or a plain-text separator would land straight in it.
   Found by the 2026-08-28 audit, hardened here rather than left as a trap. */
.kobra-navbar-links-sub,
.kobra-navbar-links-sub li {
	color: var(--kobra-ice);
}

html.kobra-nav-compact .kobra-navbar-links { display: none !important; }
html.kobra-nav-compact .kobra-navbar-toggle { display: inline-flex !important; }
html.kobra-nav-compact .kobra-navbar { justify-content: space-between; }
html.kobra-nav-compact .kobra-navbar > .kobra-navbar-brand {
	width: auto;
	height: auto;
}
html.kobra-nav-compact .kobra-navbar > .kobra-navbar-brand img {
	position: static;
	height: 52px;
	width: 52px;
	padding: 5px;
	box-shadow: none;
}
html.kobra-nav-compact .kobra-navbar > .kobra-navbar-brand span {
	position: static;
	width: auto;
	height: auto;
	margin: 0;
	overflow: visible;
	clip: auto;
	clip-path: none;
	font-family: 'Bricolage Grotesque', sans-serif;
	font-size: 16px;
	color: var(--kobra-ice);
}

/* 1000px, not 901: the bar needs 920px to lay both lists out on one line, so
   handing over at 900 left a 20px window where they were shown, did not fit and
   wrapped onto a second row. This is now the floor rather than the whole
   decision — see the compact block above. */
@media (min-width: 1001px) {
	.kobra-navbar-toggle { display: none !important; }
}
@media (max-width: 1000px) {
	.kobra-navbar-links { display: none !important; }

	/* **The burger is shown by CSS here, not only by the JS class.**

	   `measureNavbarFit()` adds `html.kobra-nav-compact` below 1000px, and that
	   class is what used to reveal this button — so the header depended on the
	   script and the stylesheet agreeing about the viewport width. Found when a
	   headless render came back with *neither* the links (hidden by this media
	   query) nor the button (the class was never added, because `innerWidth`
	   there did not match the width the media query was resolving against): a
	   header with no way into the menu at all.

	   A real phone will not disagree with itself like that, so this is
	   hardening rather than a live bug — but the navigation is not the place to
	   rely on two systems reaching the same conclusion. Below 1000px the burger
	   is simply correct, and now the CSS says so on its own. */
	.kobra-navbar-toggle { display: inline-flex !important; }

	/* With both lists gone the bar is logo + burger, so it goes back to
	   `space-between` and the logo stops overhanging: a 92px mark hanging off a
	   phone-width bar would sit on top of the page heading underneath, and
	   there is no split menu left for it to be the centre of. */
	.kobra-navbar { justify-content: space-between; }
	/* The 18px left inset that went with the logo-only bar is gone too: with the
	   club name back beside the mark, the bar is symmetric again at 32px. */

	/* Back into flow, back to auto size — the desktop rule reserves a 46px box
	   for a 92px image, which only makes sense when something is overhanging. */
	.kobra-navbar > .kobra-navbar-brand {
		width: auto;
		height: auto;
	}
	.kobra-navbar > .kobra-navbar-brand img {
		position: static;
		height: 52px;
		width: 52px;
		padding: 5px;
		box-shadow: none;
	}
	/* The name comes back on the bar itself, since the logo is no longer
	   carrying the centre on its own.

	   It was briefly replaced by a larger mark alone and the user asked for
	   this back: "logo v hlavním menu - vrať ho, jak bylo, s tím nápisem hc
	   kobra ženy". It fits comfortably now that the MENU button is the icon
	   alone — 32 + 125 + 48 + 32 is 237 against 320. */
	.kobra-navbar > .kobra-navbar-brand span {
		position: static;
		width: auto;
		height: auto;
		margin: 0;
		overflow: visible;
		clip: auto;
		clip-path: none;
		font-family: 'Bricolage Grotesque', sans-serif;
		font-size: 16px;
		color: var(--kobra-ice);
	}


}

/* The bar runs out of room before the phone does. Measured at the three widths
   that matter, with the brand at 125px and the MENU button at 141px:

       390   32 + 125 + 141 + 32 = 330   fits, 60px spare
       360                               fits, 30px spare
       320                               overflows by 8px — the button's right
                                         border sits outside the viewport

   320 is exactly the width the Customizer's own mobile preview uses, which is
   where the user saw it: "menu je moc nalepené vpravo, takže okraj buttonu není
   vidět". The padding is what gives way rather than the button, because the
   label is what makes the button obvious — dropping it would leave a bare icon
   to be guessed at. At 16px the same arithmetic gives 298 in 320, so the border
   is visible again with 16px of air beside it.

   **359px, not 400.** Written at 400 this also narrowed the padding at 360 and
   390, where 32px fits perfectly well — tightening the bar on the widths that
   were never the problem. The breakpoint sits just under 360 so it reaches the
   widths that overflow and nothing else. */
/* The padding no longer has to give way. With the club name off the bar the
   arithmetic at 320px is 32 + 68 + 141 + 32 = 273 against 320, so the MENU
   button keeps its full 32px of air at every phone width and this override —
   added earlier in this same pass — became dead weight. Removed rather than
   left in place: a rule that no longer does anything reads as a rule something
   depends on. */

.kobra-navbar-toggle-bars {
	display: flex;
	flex-direction: column;
	justify-content: center;
	gap: 4px;
	width: 26px;
	height: 26px;
	padding: 6px;
	box-sizing: border-box;
}
.kobra-navbar-toggle-bars span {
	display: block;
	height: 2px;
	background: currentColor;
	border-radius: 1px;
	transition: transform .25s ease, opacity .2s ease;
}
.kobra-menu-open .kobra-navbar-toggle-bars span:nth-child(1) { transform: translateY(6px) rotate(45deg); }
.kobra-menu-open .kobra-navbar-toggle-bars span:nth-child(2) { opacity: 0; }
.kobra-menu-open .kobra-navbar-toggle-bars span:nth-child(3) { transform: translateY(-6px) rotate(-45deg); }

/* ---------- Full-screen nav overlay ---------- */
.kobra-menu-overlay {
	position: fixed;
	inset: 0;
	z-index: 900;
	background-color: var(--kobra-ink);
	background-image: var(--kobra-ice-texture);
	background-repeat: repeat;
	opacity: 0;
	visibility: hidden;
	transform: translateY(-12px);
	transition: opacity .32s ease, transform .32s ease, visibility .32s ease;
	overflow-y: auto;
}
.kobra-menu-open .kobra-menu-overlay {
	opacity: 1;
	visibility: visible;
	transform: translateY(0);
}
.kobra-menu-overlay-topbar {
	display: flex;
	align-items: center;
	justify-content: space-between;
	padding: 14px 32px;
	border-bottom: 1px solid var(--kobra-line);
}
.kobra-menu-motif {
	position: absolute;
	z-index: 0;
	top: 50%;
	right: -12%;
	height: 120%;
	width: auto;
	max-width: none;
	opacity: 0.14;
	pointer-events: none;
	transform: translateY(-50%);
}
.kobra-menu-body {
	position: relative;
	z-index: 1;
	max-width: 980px;
	margin: 0 auto;
	padding: 50px 32px 70px;
	display: grid;
	grid-template-columns: repeat(2, 1fr);
	gap: 8px 60px;
}
.kobra-menu-item {
	border-bottom: 1px solid var(--kobra-line);
	padding: 18px 0;
	opacity: 0;
	transform: translateY(14px);
	transition: opacity .4s ease, transform .4s ease;
}
.kobra-menu-open .kobra-menu-item { opacity: 1; transform: translateY(0); }
.kobra-menu-item:nth-child(1) { transition-delay: .05s; }
.kobra-menu-item:nth-child(2) { transition-delay: .1s; }
.kobra-menu-item:nth-child(3) { transition-delay: .15s; }
.kobra-menu-item:nth-child(4) { transition-delay: .2s; }
.kobra-menu-item:nth-child(5) { transition-delay: .25s; }
.kobra-menu-item:nth-child(6) { transition-delay: .3s; }
.kobra-menu-item:nth-child(7) { transition-delay: .35s; }
.kobra-menu-item:nth-child(8) { transition-delay: .4s; }
.kobra-menu-item > a {
	display: block;
	font-family: 'Bricolage Grotesque', sans-serif;
	font-weight: 800;
	font-size: clamp(24px, 3vw, 32px);
	letter-spacing: 0.01em;
	text-transform: uppercase;
	color: var(--kobra-ice);
	text-decoration: none;
	transition: color .18s ease;
}
.kobra-menu-item > a:hover,
.kobra-menu-item > a:focus-visible { color: var(--kobra-yellow); }
.kobra-menu-sub {
	list-style: none;
	margin: 10px 0 0;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	gap: 6px 18px;
}
.kobra-menu-sub a {
	font-family: 'Bricolage Grotesque', sans-serif;
	font-size: 13px;
	font-weight: 600;
	color: var(--kobra-mist);
	text-decoration: none;
}
.kobra-menu-sub a:hover { color: var(--kobra-sky); }
.kobra-menu-close {
	background: transparent;
	border: none;
	color: var(--kobra-ice);
	font-size: 28px;
	line-height: 1;
	cursor: pointer;
	padding: 4px 8px;
	transition: color .18s ease, transform .18s ease;
}
.kobra-menu-close:hover { color: var(--kobra-yellow); transform: rotate(90deg); }
body.kobra-menu-open { overflow: hidden; }

@media (max-width: 720px) {
	.kobra-menu-body { grid-template-columns: 1fr; padding: 30px 24px 50px; }
	.kobra-menu-item > a { font-size: 26px; }
}
@media (prefers-reduced-motion: reduce) {
	.kobra-menu-overlay, .kobra-menu-item { transition: none !important; }
}

#stm-top-bar { display: none !important; }

/* ==========================================================================
   Footer — put it back in the document flow.

   Splash pins the footer with `position: fixed; bottom: 0` and floats the
   page over it on a higher z-index, so it sits revealed behind everything:
   a dark strip permanently visible along the bottom of the viewport, not
   something you scroll down to. Wanted: an ordinary footer you reach at the
   end of the page.

   Two halves, and both are needed. Unpinning alone would leave a gap,
   because Splash's JS measures the footer and reserves the same height as
   an *inline* `padding-bottom` on <body> — hence the !important there,
   which is the one thing that reliably outranks an inline style and holds
   even when that JS re-runs on resize. The footer rule needs no !important;
   `body .stm-footer` simply outranks Splash's `.stm-footer`.
   ========================================================================== */
body {
	padding-bottom: 0 !important;
}
body .stm-footer {
	position: relative;
	z-index: auto;
}

/* Overscroll is deliberately left alone. Dragging past the end rubber-bands
   the page and briefly shows the canvas behind it, painted with body's
   --kobra-ink — the footer appears to lift off a blank blue strip.
   `overscroll-behavior-y: none` was tried (v0.22.1) and reverted at the
   user's request: it also removes the elastic bounce everywhere and
   pull-to-refresh on mobile, and native scrolling behaving natively matters
   more than the strip. If it's ever worth removing the strip *without*
   touching the scroll behaviour, paint the overscroll area with a tall
   `box-shadow` beneath the footer — but that hard-codes a colour which then
   has to keep matching the footer's own. */

/* ==========================================================================
   Rows the redesign drops entirely, hidden here as well as in redesign.js.
   The JS has to stay (it reads the slider's row before inserting the hero
   in its place, and it's the fallback for browsers without :has()), but JS
   only runs at DOMContentLoaded — long enough for the ticker to visibly
   flash its "LIVE" headlines, and for the slider and the full-height
   gallery row to reserve, then give up, a screenful of space. Hiding them
   in CSS means they never paint at all: same elements, same result, just
   sooner and without the layout jump.

   Each selector deliberately mirrors what the JS matches, and each is
   scoped so it cannot swallow the hero — .kobra-hero is inserted as a
   sibling of these rows, not inside one, and the Fotogalerie rule also
   requires .vc_row-o-full-height so it can't match the hero's own
   (now admin-editable) gallery button.

   Note these three must stay in one rule with no non-:has() selector added
   to the list: a browser that doesn't understand :has() discards the whole
   list, and the JS fallback is what covers it.
   ========================================================================== */
.vc_row:has(.stm-ticker-social),
.vc_row:has(#rev_slider_1_1_wrapper),
.vc_row.vc_row-o-full-height:has(a[href*="rajce.idnes.cz"]) {
	display: none !important;
}

/* ==========================================================================
   Hero — a plain, fully own div (redesign.js hides Revolution Slider's
   row entirely and inserts this instead of trying to work inside/around
   it). Same real photo as a CSS background, no slider JS involved at
   all, so there's nothing that can fight this for visibility or z-index.
   ========================================================================== */
/* redesign.js inserts .kobra-hero, .kobra-stats, and .kobra-results-section
   as siblings of the row they replace/follow, so they inherit WPBakery's
   centered, max-width .container from that row's parent instead of
   spanning the viewport — break them back out to full width. */
.kobra-hero,
.kobra-stats,
.kobra-results-section {
	width: 100vw !important;
	margin-left: calc(50% - 50vw) !important;
	margin-right: calc(50% - 50vw) !important;
	max-width: 100vw !important;
}
.kobra-hero {
	position: relative;
	min-height: 640px;
	display: flex;
	align-items: flex-end;
	background-color: var(--kobra-ink);
	background-image: var(--kobra-hero-photo);
	background-size: cover;
	background-position: center 30%;
	overflow: hidden;
}
.kobra-hero-scrim {
	position: absolute;
	inset: 0;
	background:
		linear-gradient(90deg, rgba(7,20,36,0.88) 0%, rgba(7,20,36,0.35) 55%, rgba(7,20,36,0.55) 100%),
		linear-gradient(180deg, rgba(7,20,36,0.1) 0%, rgba(7,20,36,0.35) 75%, var(--kobra-ink) 100%);
}
.kobra-hero-overlay {
	position: relative;
	z-index: 1;
	width: 100%;
	padding: 0 48px 64px;
	box-sizing: border-box;
}
.kobra-hero-overlay-inner { max-width: 620px; }
.kobra-hero-overlay h2 {
	/* The one deliberate exception to the site-wide Bricolage Grotesque —
	   a big, condensed, scoreboard-style face just for these two words. */
	font-family: 'Big Shoulders', 'Bricolage Grotesque', sans-serif !important;
	font-weight: 800 !important;
	font-size: clamp(52px, 9vw, 108px) !important;
	letter-spacing: 0.01em !important;
	color: var(--kobra-yellow) !important;
	line-height: 0.92 !important;
	margin: 14px 0 0 !important;
	text-shadow: 0 0 40px rgba(241,232,19,0.25);
}
.kobra-hero-overlay p {
	margin: 20px 0 30px;
	max-width: 44ch;
	color: var(--kobra-mist);
	font-size: 16px;
	line-height: 1.5;
}
.kobra-hero-actions { display: flex; gap: 14px; flex-wrap: wrap; }

/* ---------- Facebook and Instagram under the hero buttons (v0.58.0) ----------
   Icon-only circles rather than another pair of buttons: there are already two
   buttons directly above, and four button-shaped things in a column would read
   as a menu. Quiet at rest, sky on hover, so they are findable without
   competing with "Rozpis zápasů".

   The `a.kobra-social-link` shape is deliberate — `.hockey a { display: inline }`
   in hockey.css is (0,1,1) and beats any single-class rule on an anchor, which
   this project has already lost three times (`.kobra-btn`,
   `.kobra-sponsor-tile`, and these same social links on the text pages). Adding
   the element takes it to (0,2,1). Without it `display: inline-flex` is
   discarded and the centring inside the circle silently does nothing. */
.kobra-hero-socials {
	display: flex;
	gap: 10px;
	margin: 20px 0 0;
	padding: 0;
	list-style: none;
}

.kobra-hero-socials li {
	margin: 0;
	padding: 0;
	list-style: none;
}

/* Splash's generic `ul li::before` bullet dot, which would otherwise sit beside
   each circle — the same one that turned up red beside the news filters. */
.kobra-hero-socials li::before {
	display: none;
	content: none;
}

.kobra-hero a.kobra-social-link {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	border: 1.5px solid rgba(234, 241, 248, 0.4);
	border-radius: 50%;
	color: var(--kobra-ice);
	text-decoration: none;
	transition: color .18s ease, border-color .18s ease, transform .18s ease;
}

.kobra-hero a.kobra-social-link:hover,
.kobra-hero a.kobra-social-link:focus {
	border-color: var(--kobra-sky);
	color: var(--kobra-sky);
	transform: translateY(-2px);
}
.kobra-hero-credit {
	position: absolute;
	z-index: 1;
	right: 20px;
	bottom: 16px;
	font-size: 10px;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: rgba(234,241,248,0.45);
}
@media (max-width: 700px) {
	.kobra-hero-overlay { padding: 0 24px 36px; }
}

/* ==========================================================================
   Stats strip — injected by redesign.js right after the hero, using real
   counts pulled from the site's own data (years since 1987, players,
   competitions), animated with a slot-machine-style settle.
   ========================================================================== */
.kobra-stats {
	background-color: var(--kobra-navy);
	background-image: var(--kobra-ice-texture);
	background-repeat: repeat;
	border-bottom: 1px solid var(--kobra-line);
	padding: 56px 24px;
}
.kobra-stats-grid {
	max-width: 1080px;
	margin: 0 auto;
	display: grid;
	grid-template-columns: repeat(3, 1fr);
}
/* Column count follows however many stats actually have a label, so an
   admin can clear one in the Customizer without leaving a gap. */
.kobra-stats-grid.kobra-cols-1 { grid-template-columns: 1fr; }
.kobra-stats-grid.kobra-cols-2 { grid-template-columns: repeat(2, 1fr); }
.kobra-stats-grid.kobra-cols-3 { grid-template-columns: repeat(3, 1fr); }
.kobra-stat { text-align: center; padding: 0 20px; position: relative; }
.kobra-stat + .kobra-stat::before {
	content: '';
	position: absolute; left: 0; top: 6px; bottom: 6px; width: 1px;
	background: var(--kobra-line);
}
.kobra-stat .kobra-stat-num {
	font-family: 'Bricolage Grotesque', sans-serif;
	font-size: clamp(42px, 6vw, 68px);
	color: var(--kobra-yellow);
	font-variant-numeric: tabular-nums;
	line-height: 1;
}
.kobra-stat .kobra-stat-label {
	margin-top: 10px;
	font-size: 12px;
	font-weight: 700;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--kobra-mist);
}
@media (max-width: 700px) {
	/* Matches the .kobra-cols-N specificity above (two classes) and comes
	   later in the file, so it wins the tie — piling on !important here
	   would not have, since the tie is decided by source order. */
	.kobra-stats-grid,
	.kobra-stats-grid.kobra-cols-1,
	.kobra-stats-grid.kobra-cols-2,
	.kobra-stats-grid.kobra-cols-3 { grid-template-columns: 1fr; gap: 26px; }
	.kobra-stat + .kobra-stat::before { display: none; }
}

/* ==========================================================================
   Results — the original SportsPress carousel (uneven card widths, fiddly
   arrow paging) is hidden; redesign.js reads its real data and rebuilds it
   as a plain, even, static grid.
   ========================================================================== */
.stm-latest-results-units-carousel { display: none !important; }

.kobra-results-section {
	position: relative;
	padding: 0 0 80px;
	background: var(--kobra-ink);
}
.kobra-results-banner {
	position: relative;
	background-image: var(--kobra-results-photo);
	background-size: cover;
	background-position: center 35%;
	min-height: 320px;
	display: flex;
	align-items: flex-end;
	margin-bottom: 44px;
}
.kobra-results-banner::after {
	content: '';
	position: absolute;
	inset: 0;
	background: linear-gradient(180deg, rgba(7,27,48,0.35) 0%, rgba(7,27,48,0.85) 80%, var(--kobra-ink) 100%);
}
/* ---------- The two competition buttons (v0.72.0) ----------
   One per competition, pointing at the competition pages rather than at a
   season's calendar — so neither link carries a year and neither can go stale.

   **Both are always exactly as wide as the longer label**, which the user asked
   for. `grid-auto-columns: 1fr` with `width: max-content` is what does it: under
   a max-content constraint every `1fr` track resolves to the largest max-content
   contribution among them, so the shorter label's button grows to match the
   longer one rather than each sizing to its own text. No measuring in JS, and it
   stays true when either label is reworded.

   The consequence is worth knowing and is in the field's own description: a long
   label widens *both* buttons.

   With one button the grid has one track and behaves exactly as the single
   button did. */
.kobra-results-actions {
	display: grid;
	grid-auto-flow: column;
	grid-auto-columns: 1fr;
	gap: 10px;
	width: max-content;
	flex: 0 0 auto;
}
.kobra-results-actions .kobra-btn {
	justify-content: center;
	text-align: center;
}

.kobra-results-banner-inner {
	position: relative;
	z-index: 1;
	max-width: 1220px;
	margin: 0 auto;
	width: 100%;
	padding: 0 24px 30px;
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 20px;
	flex-wrap: wrap;
}
.kobra-results-banner h2 { font-size: clamp(28px, 4vw, 42px) !important; margin: 6px 0 0 !important; }
.kobra-results-credit {
	position: absolute;
	z-index: 1;
	right: 16px;
	top: 14px;
	font-size: 10px;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: rgba(234,241,248,0.5);
}
.kobra-results-grid {
	max-width: 1220px;
	margin: 0 auto;
	padding: 0 24px;
	display: grid;
	grid-template-columns: repeat(4, 1fr);
	gap: 18px;
}
@media (max-width: 980px) { .kobra-results-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 560px) { .kobra-results-grid { grid-template-columns: 1fr; } }

.kobra-result-card {
	background-color: var(--kobra-navy);
	background-image: var(--kobra-ice-texture);
	background-repeat: repeat;
	border: 1px solid var(--kobra-line);
	border-radius: 4px;
	padding: 20px;
	transition: transform .2s ease, border-color .2s ease;
	display: flex;
	flex-direction: column;
	gap: 14px;
}
/* The card is an <a> to the match detail whenever SportsPress has one, so
   it has to shed the theme's link styling. The hover lift and the pointer
   are keyed off [href] rather than the class: before this, every card
   lifted on hover while none of them was clickable.

   The compound selector is load-bearing, not tidiness: SportsPress's
   hockey.css has `.hockey a { display: inline }`, which outranks the plain
   `.kobra-result-card` class rule above (class+element beats class). As a
   grid item that inline then blockifies to `display: block`, silently
   dropping the flex column and its 14px gap. Beating it needs *higher
   specificity* — an equal-specificity !important would just tie and be
   settled by load order, the trap this project has hit twice before. */
.kobra-results-grid a.kobra-result-card {
	display: flex;
	text-decoration: none;
	color: inherit;
}
.kobra-result-card[href] { cursor: pointer; }
.kobra-result-card[href]:hover { transform: translateY(-4px); border-color: var(--kobra-sky); }
.kobra-result-card[href]:focus-visible {
	outline: 2px solid var(--kobra-yellow);
	outline-offset: 3px;
	border-color: var(--kobra-sky);
}
.kobra-result-meta {
	font-size: 11px;
	letter-spacing: 0.05em;
	text-transform: uppercase;
	color: var(--kobra-mist);
}

/* The competition, on its own line above the date. Sky and bold, because the
   type scale reserves sky for eyebrows and this is one — a label naming what
   you are looking at, rather than another piece of metadata like the venue.
   Mist would have made it indistinguishable from the date beneath it.

   `min-height` is load-bearing: redesign.js emits this element even when a
   match has no competition, and without a reserved line an empty one would
   leave that card's scores sitting a line higher than its neighbours'. That is
   the same misalignment that put the competition on its own line in the first
   place — 24px, measured, when one long venue name wrapped the shared line. */
.kobra-result-comp {
	min-height: 1.45em;
	color: var(--kobra-sky);
	font-size: 11px;
	font-weight: 700;
	letter-spacing: 0.05em;
	text-transform: uppercase;
}
.kobra-result-teams { display: flex; flex-direction: column; gap: 6px; }
.kobra-result-team {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	font-family: 'Bricolage Grotesque', sans-serif;
	font-weight: 700;
	font-size: 14px;
	color: var(--kobra-ice);
}
.kobra-result-team .score {
	font-family: 'Bricolage Grotesque', sans-serif;
	font-size: 20px;
	color: var(--kobra-ice);
	font-variant-numeric: tabular-nums;
}
.kobra-result-team.is-winner .score { color: var(--kobra-yellow); }
.kobra-result-badge {
	align-self: flex-start;
	font-size: 11px;
	font-weight: 800;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	padding: 5px 10px;
	border-radius: 2px;
}
.kobra-result-badge.win { background: var(--kobra-yellow); color: #101a08; }
.kobra-result-badge.loss { background: transparent; border: 1px solid var(--kobra-mist); color: var(--kobra-mist); }

/* Countdown on a fixture card, in the slot a played match uses for its
   Výhra/Prohra badge.

   **Centred and unframed at the user's request (v0.56.2).** It first carried a
   thin yellow outline to echo the badge's shape; she asked for the frame gone
   and the line centred, which reads better anyway — with no box around it there
   is no edge for `flex-start` to align to, so left-aligned just looked like it
   had slipped. `align-self: center` rather than `text-align`, because the card
   is a flex column and the element is only as wide as its text.

   Deliberately still not filled yellow: the solid yellow badge means "we won",
   and a fixture has not won anything.

   `tabular-nums` is load-bearing — without it the seconds change width every
   tick and the line shifts once a second. `padding` is kept on the vertical
   axis only, so the countdown occupies the same height as the badge it stands
   in for and a row of fixtures matches a row of results. */
.kobra-result-countdown {
	align-self: center;
	padding: 6px 0;
	border: 0;
	color: var(--kobra-yellow);
	font-family: 'Bricolage Grotesque', sans-serif;
	font-size: 11px;
	font-weight: 800;
	letter-spacing: 0.06em;
	text-align: center;
	text-transform: uppercase;
	white-space: nowrap;
	font-variant-numeric: tabular-nums;
	font-feature-settings: 'tnum' 1;
}

/* ==========================================================================
   News grid + category filter
   ========================================================================== */
/* ---------- Category filter: the same button as the statistics filters ----------
   On the user's instruction, matched to `.kobra-team-filter-btn.kobra-btn-ghost`
   on the squad/statistics page — 42px tall, 1.5px rgba(234,241,248,0.4), 3px
   radius, transparent, ice label, 13px/700 with 0.06em tracking, sky border and
   sky label on hover, yellow fill for the selected one. These were pills:
   20px radius, mist labels, 30px tall.

   **Selector weight, because the old rules were losing two declarations
   silently.** They were written as a bare `.vc_grid-filter-item` (0,1,0), and
   js_composer sizes these through
   `.vc_grid-filter.vc_grid-filter-size-md .vc_grid-filter-item` at (0,3,0) —
   so `font-size: 12px` and the padding never applied, and the filters rendered
   at 15px with 2px 10px padding. The colour and radius did apply, because those
   carried `!important`. Leading with `.hockey` and matching the size class
   through `[class*=]` takes this to (0,4,0) and wins outright, so the layout no
   longer needs `!important` at all.

   The container is Splash's `display: block; text-align: center`; flex with a
   gap is what gives the same even 8px spacing as the statistics page, rather
   than relying on inline-block whitespace. */
.hockey .vc_grid-filter[class*="vc_grid-filter-size"] {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	gap: 8px;
}

/* WPBakery hides the whole filter on a phone, and it is not subtle about it:

       js_composer.min.css   @media (max-width: 768px)
       .vc_responsive .vc_grid-filter:not(.vc_gitem-post-data)
       { display: none !important }

   So the rubrics have never been reachable on a phone — the user reported it as
   "u sekce článků se nezobrazuje filtr na kategorie", and the element was there
   the whole time with its four items, at `display: none`.

   Their selector is (0,3,0) *with* `!important`, so only another important
   declaration at equal-or-higher specificity wins. `.hockey` and
   `.vc_responsive` are both body classes, so naming the element takes this to
   (0,4,1). The four chips are 74px wide and already wrap and centre from the
   rule above, so nothing else is needed — at 390 they sit on one row, at 320
   they wrap onto two. */
@media (max-width: 768px) {
	body.hockey.vc_responsive .vc_grid-filter[class*="vc_grid-filter-size"] {
		display: flex !important;
	}

	/* WPBakery does not simply hide the chips on a phone — it swaps them for a
	   native `<select>` it emits alongside them (`.vc_grid-filter-select`,
	   hidden by a bare `display: none` at desktop widths and shown here). So
	   un-hiding the chips without this left *both* on the page: the user's
	   screenshot showed the four chips and, under them, an unstyled white
	   dropdown. The select goes; the chips are the site's own component and
	   already match the competition tabs. */
	body.hockey.vc_responsive .vc_grid-filter-select,
	body.hockey.vc_responsive .vc_grid-filter-dropdown {
		display: none !important;
	}
}

.hockey .vc_grid-filter[class*="vc_grid-filter-size"] .vc_grid-filter-item {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	float: none;
	margin: 0;
	padding: 12px 22px;
	border: 1.5px solid rgba(234, 241, 248, 0.4);
	border-radius: 3px;
	background: transparent;
	color: var(--kobra-ice);
	font-family: 'Bricolage Grotesque', sans-serif;
	font-weight: 700;
	font-size: 13px;
	line-height: 1.2;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	transition: color .18s ease, border-color .18s ease, background .18s ease;
}

.hockey .vc_grid-filter[class*="vc_grid-filter-size"] .vc_grid-filter-item:hover,
.hockey .vc_grid-filter[class*="vc_grid-filter-size"] .vc_grid-filter-item:focus {
	background: transparent;
	border-color: var(--kobra-sky);
	color: var(--kobra-sky);
}

.hockey .vc_grid-filter[class*="vc_grid-filter-size"] .vc_grid-filter-item.vc_active {
	background: var(--kobra-yellow);
	border-color: var(--kobra-yellow);
	color: #101a08;
}

/* The label of the *selected* filter lives in a `<span>`, and js_composer paints
   that span white — so the rule above set the right colour on the `<li>` and the
   text rendered white on yellow anyway (v0.76.1, reported by the user as hard to
   read, and it is: white on #f1e813 is about 1.1:1, against the 4.5 AA wants).

   The giveaway in the measurement is that the `<li>` already computed
   `rgb(16, 26, 8)` correctly while its `<span>` computed `rgb(255, 255, 255)` —
   **the rule was applying and the text was not the element it applied to.** The
   same shape as the red bullet that stayed red for seven versions because the
   colour was set on a box whose background did the painting.

   Theirs is `.vc_grid-filter.vc_grid-filter-color-black > .vc_grid-filter-item
   .vc_active > span` at (0,4,1) with no `!important`, so matching its shape and
   adding `.hockey` settles it at (0,5,1) — specificity, not force.

   Written for the span only. The inactive items' spans inherit ice from the `li`
   and need nothing; giving them a rule too would be a second thing to keep in
   step with the button component. */
.hockey .vc_grid-filter[class*="vc_grid-filter-size"] .vc_grid-filter-item.vc_active > span {
	color: #101a08;
}

/* No bullet on a button. These filters are `<li>`s, so Splash's generic
   `ul li::before` bullet applied to them — a 3×3 dot at `left: 0`, which is
   what the user saw as "a red dot beside every category". The site-wide bullet
   rule above turns it yellow rather than red, but a filter button should have
   no bullet at all: the statistics filters it is matched to are `<button>`s and
   have none. Removed here rather than recoloured. (0,4,1) against Splash's
   (0,1,3) and (0,0,3). */
.hockey .vc_grid-filter[class*="vc_grid-filter-size"] .vc_grid-filter-item::before,
.hockey .vc_grid-filter[class*="vc_grid-filter-size"] .vc_grid-filter-item::after {
	display: none;
	content: none;
}
/* The grid's real card boundary is .vc_grid-item-mini, not .vc_gitem-col
   (which is just an inner title/date/button row). Some posts have real
   featured photos at varying aspect ratios, which was the actual source
   of the uneven card heights — not just title length. Fixing the image
   to one height and reserving a fixed 2-line slot for the title (rather
   than hard-clipping the whole card) makes every card the same height
   without cutting off the "Přečíst článek" button. */
/* ---------- The card surface (v0.53.0) ----------
   The cards were `--kobra-navy-2` sitting on a news row that is **also**
   `--kobra-navy-2`, with the same ice texture at the same scale. Measured:
   card `rgb(18,63,110)`, row `rgb(18,63,110)` — literally the same colour, so
   the only thing separating a card from its background was a 1px hairline at
   alpha .14. That is why the section read flat.

   Cards are `--kobra-ink` now: the darkest surface in the palette, so a card
   reads as an inset panel in the lighter section rather than as a rectangle
   drawn on it. The texture stays, per the design-system rule that every navy
   surface carries it.

   `overflow: hidden` fixes a real defect rather than being tidiness. The card
   has a 4px radius and the featured photo is flush against its top corners
   with `border-radius: 0` of its own — with the card at `overflow: visible`
   the photo's square corners sat on top of the rounded ones, so the top of
   every card was subtly un-rounded. Verified before and after. */
.vc_grid-item-mini {
	background-color: var(--kobra-ink) !important;
	background-image: var(--kobra-ice-texture) !important;
	background-repeat: repeat !important;
	border: 1px solid var(--kobra-line) !important;
	border-radius: 4px;
	overflow: hidden;
	transition: transform .2s ease, border-color .2s ease;
	display: flex !important;
	flex-direction: column;
}
/* The cards lift 3px on hover, but Owl's viewport clips at exactly their top
   edge — so the lift carried the top border straight out of the visible
   area, and the highlight appeared on three sides only. This opens 6px of
   clipping room above the row without moving anything: the padding pushes
   the content down, the equal negative margin pulls the container back up,
   so the cards stay put while the clip edge rises above them. */
/* "Všechny články" under the carousel. position:relative keeps it above the
   faceoff watermark, which is absolutely positioned inside the same row. */
/* padding-bottom rather than margin, so the space is guaranteed to sit
   inside the row's coloured panel instead of collapsing out of it. */
.kobra-news-more {
	position: relative;
	z-index: 2;
	margin-top: 30px;
	padding-bottom: 58px;
	text-align: center;
}

.kobra-news-row .owl-stage-outer {
	padding-top: 6px;
	margin-top: -6px;
}

.vc_grid-item-mini:hover { transform: translateY(-3px); border-color: var(--kobra-sky) !important; }
.vc_gitem-zone-img {
	height: 170px !important;
	width: 100% !important;
	object-fit: cover !important;
}

/* ---------- Why the card looked flat, and it was not the card (v0.53.2) ----------
   The user said the card was "a flat surface". Changing the card's own
   background to `--kobra-ink` in v0.53.0 barely showed, because the card's
   background is almost entirely covered. Walking the real DOM:

     .vc_grid-item-mini   387px   ink + ice texture — mostly hidden
     .vc_gitem-zone-a     170px   the photo
     .vc_gitem-zone-b     170px   rgba(0,0,0,0.5) flat black over the whole photo
     .vc_gitem-zone-c     215px   rgb(4,64,102), a hardcoded blue

   So 215 of 387px was one flat slab of `#044066` — **not a palette colour** —
   and the only non-blue thing in the section, the photograph, was dimmed 50% by
   a black sheet. That is the monotony, and neither value came from this theme.

   **Both are content, not theme.** They are inline rules WPBakery generates from
   the grid shortcode's own `css=` attribute — `.vc_custom_1419328999899` and
   `.vc_custom_1673219664871`, each `!important` at (0,1,0). They live in the
   database, so they exist on production too and do **not** travel in the zip.
   Worked around here; the cleaner fix is to clear those two colours in the page
   builder, after which these rules become harmless.

   Beating them needs `!important` plus more than one class — (0,3,0) here.

   Zone B keeps its element and its background is merely repainted: **it holds
   `a.vc_gitem-link`, the click target for the whole card**, so hiding it would
   make the cards unclickable. The flat sheet becomes a bottom-only gradient, so
   the photo keeps its colour and its lower edge dissolves into the panel below
   instead of meeting it at a hard seam. */
.hockey .vc_grid-item-mini .vc_gitem-zone-b {
	background: linear-gradient(180deg,
		rgba(7, 27, 48, 0) 45%,
		rgba(7, 27, 48, 0.72) 100%) !important;
}

/* The text panel: **one flat colour carrying the ice texture** (v0.53.3).
   v0.53.2 tried a navy-to-ink gradient here and the user preferred a single
   colour with the texture on it, which is also the design-system rule — the
   crossing-lines texture belongs on every navy surface, and it is the thing
   that stops a flat fill reading as flat. No gradient, so nothing to keep in
   step with the photo scrim below.

   `--kobra-navy` replaces the content's hardcoded `#044066`: near enough that
   the panel looks like the colour it always was, but an actual palette token
   rather than a value typed into the page builder years ago.

   **`background-image` needs its own `!important`.** The content rule is the
   *shorthand* `background: rgb(4,64,102) !important`, which also sets
   `background-image: none` at important — so declaring only the colour here
   would have won the fill and silently lost the texture, and the panel would
   have looked flat again for a reason nothing in this file explained. */
.hockey .vc_grid-item-mini .vc_gitem-zone-c {
	background-color: var(--kobra-navy) !important;
	background-image: var(--kobra-ice-texture) !important;
	background-repeat: repeat !important;
	border-top: 1px solid var(--kobra-line);
}
.vc_gitem-col h4,
.vc_gitem-col [style*="color"] {
	color: var(--kobra-ice) !important;
}
/* ---------- Card headline: 20px, and three lines that actually fit ----------
   It was 24px — not by choice, but because nothing here declared a size and
   `styles.css h4` (0,0,1) supplied 24px. 20px is the sub-heading step on the
   type scale, which is the right rank for a card title; 24px was between two
   steps and outsized the copy around it.

   **The `-webkit-box` line clamp this replaces never worked.** It won the
   cascade — our own `display: -webkit-box !important` was the winning
   declaration — and the computed value was still `flow-root`, even when set
   inline as a test. No rule anywhere declares `flow-root`; the browser simply
   does not accept `-webkit-box` as a display value, so `-webkit-line-clamp`
   was inert and the titles were **hard-clipped mid-word with no ellipsis**.
   That is the overflow the user reported. Do not reintroduce a `-webkit-box`
   clamp here without checking the computed `display` first.

   With no working clamp available the answer is to make the text fit. Measured
   at the real 338px card width: at 24px the longest current headline needs
   **four** lines, at 20px it needs **three**, and every other headline needs
   two. So the slot is three lines — `4.05em` at `line-height: 1.35` — and
   nothing is truncated at all today.

   The slot is fixed rather than flexible on purpose. Owl does equalise the
   cards, so a flexible title also produced equal 360px cards — but it did so
   by letting the three-line headline overflow its own card silently. A fixed
   slot is the predictable version: cards go 371px -> 387px, every headline is
   fully visible, and `overflow: hidden` stays only as a backstop for a future
   headline longer than three lines. If those 27px of reserved space ever
   matter more than showing one long headline in full, shortening that headline
   in wp-admin is what lets this drop back to two lines. */
.vc_gitem-col h4 {
	font-size: 20px;
	line-height: 1.35;
	min-height: 4.05em;
	max-height: 4.05em;
	overflow: hidden;
}
.vc_gitem-post-data-source-post_date [style*="color"] {
	color: var(--kobra-mist) !important;
	font-family: 'Bricolage Grotesque', sans-serif !important;
}
.vc_gitem-col .vc_btn3 {
	background: transparent !important;
	color: var(--kobra-sky) !important;
	border: 1px solid var(--kobra-sky) !important;
	margin-top: auto;
}

/* Snake watermark — injected by redesign.js behind the news-grid row. */
/* The news row's surface, from the first paint (v0.76.3)
   --------------------------------------------------------------------------
   **The user reported the homepage flashing a white band before it finished
   loading, and this row was it.** WPBakery generates per-row custom CSS from the
   page content — here `.vc_custom_1673023947178 { background-color: #ffffff
   !important }` — and the navy below only arrived with `.kobra-news-row`, a class
   `injectWatermarkAndReveal()` adds. That function waits for `.vc_grid-filter`,
   i.e. **until the grid's AJAX response lands**, so the white showed for as long
   as that request took, on an otherwise finished page.

   Simulated to find it rather than guessed at: the page was fetched, every
   `<script>` stripped, the rest rendered in an iframe, and every visible box
   measured for a light background. Exactly one came back — this row, 1170x75 at
   48,41, `rgb(255,255,255)` — which is the band in the screenshot.

   So the surface is declared on the row's own markup instead. Every homepage row
   holding a `vc_grid-container-wrapper` is the news row: `vc_basic_grid` appears
   on this page and nowhere else on the site (checked against every published
   post). `:has()` in a rule of its own, deliberately not added to the
   hide-before-JS list above — that list must stay pure so a browser without
   `:has()` discards nothing else with it.

   `.kobra-news-row` keeps the same declarations. It is not redundant: it is what
   still applies if the markup ever stops carrying a grid wrapper, and it is the
   selector the watermark and reveal already key on. */
div.vc_row:has(> .wpb_column .vc_grid-container-wrapper),
div.kobra-news-row.vc_row {
	position: relative;
	overflow: hidden;
	background-color: var(--kobra-navy-2) !important;
	background-image: var(--kobra-ice-texture) !important;
	background-repeat: repeat !important;
}
.kobra-watermark {
	position: absolute;
	z-index: 0;
	top: 50%;
	right: -8%;
	height: 135%;
	width: auto;
	max-width: none;
	opacity: 0.16;
	pointer-events: none;
	transform: translateY(-50%);
	animation: kobraSnakeDrift 16s ease-in-out infinite alternate;
}
@keyframes kobraSnakeDrift {
	from { transform: translateY(-50%) translateX(0) rotate(0deg); }
	to   { transform: translateY(-50%) translateX(10px) rotate(1.5deg); }
}
.kobra-news-row .wpb_column,
.kobra-news-row .vc_grid { position: relative; z-index: 1; }

/* ---------- Footer ---------- */
.footer-widgets-wrapper, #stm-footer-bottom {
	font-family: 'Bricolage Grotesque', sans-serif !important;
	background-image: var(--kobra-ice-texture) !important;
	background-repeat: repeat !important;
}
.footer-widgets-wrapper a:hover { color: var(--kobra-sky) !important; }

/* ---------- Scroll reveal ---------- */
.kobra-reveal { opacity: 0; transform: translateY(22px); transition: opacity .6s ease, transform .6s ease; }
.kobra-reveal.kobra-visible { opacity: 1; transform: translateY(0); }

@keyframes kobraPulse {
	0%, 100% { box-shadow: 0 0 0 0 rgba(241,232,19,0.55); }
	50% { box-shadow: 0 0 0 6px rgba(241,232,19,0); }
}

@media (prefers-reduced-motion: reduce) {
	.kobra-watermark { animation: none !important; }
	.kobra-reveal { opacity: 1 !important; transform: none !important; transition: none !important; }
}

@media (max-width: 860px) {
	.kobra-watermark { display: none; }
}

/* ==========================================================================
   Pagination — one component, both places that have it
   --------------------------------------------------------------------------
   Two paginations exist and they had drifted apart, which is what the user
   actually reported (v0.51.0):

     /aktuality/          `ul.page-numbers`   — WordPress core, in blog.css
     /kalendar/…/         `ul.custom-paginate` — built by splash.js, in
                                                 calendar.css

   Both are declared here rather than in their own template stylesheets, for
   the same reason the page masthead lives in redesign.css: two copies of one
   component drift, and this one already had. The type scale went the same way
   — four sizes doing one job, none of it a decision. blog.css and calendar.css
   no longer style pagination at all; if a third pagination ever appears, add
   its hook to these selector lists and it inherits the component.

   The target is the squad/statistics filter buttons, on the user's
   instruction: `.kobra-team-filter-btn.kobra-btn-ghost`. Measured there and
   matched here — 42px tall, 1.5px rgba(234,241,248,0.4) border, 3px radius,
   transparent fill, ice label, 13px/700 Bricolage, sky on hover.

   Three separate faults were fixed, only the first of which was reported:

   1. **The red hover.** Splash paints it in two places — `hockey.css
      .hockey .page-numbers li a:hover { background: #f53837 }` and
      `styles.css .custom-paginate li a:hover { background-color: #e21e22 }`.
      Both old hover rules set `border-color` and `color` but never
      `background-color`, so the red simply won by default. This is the red the
      v0.46.0 "red accent → yellow" pass missed: that pass mirrored Splash's
      icon and list-marker selectors, and pagination is neither.
   2. **65px and 63px tall** against the filters' 42px, because `styles.css`
      gives both a `line-height: 45px`. Neutralised with an explicit
      `line-height` plus `inline-flex` centring, which also centres the
      `fa-angle-right` next/prev glyph without anyone having to know its
      height — the same fix the vc_btn3 icon needed.
   3. **Two different resting treatments** — `--kobra-line` (alpha .14) borders
      and `--kobra-mist` labels, where the ghost button uses alpha .4 and ice.
      The numbers were legible but visibly quieter than the filters they are
      meant to match.

   Selector weight: Splash's strongest here is `.hockey .page-numbers li a`
   at (0,3,2), which a plain `.stm-default-page-grid .page-numbers a` (0,2,1)
   loses to. Leading with `.hockey` and keeping `li` takes it to (0,3,2) and
   ties, then `ul` makes it (0,3,3) and wins outright, so nothing here depends
   on stylesheet order. Only `.current` needs `!important`, and only because
   hockey.css paints it `#f1f1f1` with one of its own.

   `min-width` with symmetric 14px padding keeps a single digit square (42×42)
   rather than the wide slab a literal copy of the filter's 22px padding would
   give. Digits are not words; the filters say "2024-25".
   ========================================================================== */

.hockey .stm-default-page-grid ul.page-numbers,
.hockey .stm-single-sp_calendar .custom-paginate {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	gap: 8px;
	margin: 36px 0 0;
	padding: 0;
	list-style: none;
}

/* /aktuality/ only: hockey.css draws a divider above the pagination —
   `.hockey .page-numbers { border-top: 1px …; padding-top: 20px }` — and that
   padding is the only thing keeping the line off the numbers. Zeroing the
   container's padding in v0.51.0 left the line sitting directly on the chips,
   which the user reported. The room is given back here, deliberately and a
   little larger than Splash's 20px, so the reading order is cards → 36px →
   line → 24px → numbers.

   The line's own colour was Splash's `#d8d8d8`, a light grey that belongs to
   no palette here and read brighter than every other divider on the site.
   Brought to `--kobra-line`, the same token as the card and table rules.

   Scoped to `.page-numbers` on purpose: the calendar's `.custom-paginate` has
   no such divider, and adding padding there would space the two paginations
   differently for no visible reason. */
.hockey .stm-default-page-grid ul.page-numbers {
	padding-top: 24px;
	border-top: 1px solid var(--kobra-line);
}

/* The white square behind every number on the calendar (v0.51.1). The chip is
   transparent, so what showed through was the **`li`**, which styles.css
   paints `#f0f0f0` at rest and `#fff` on hover via
   `.stm-upcoming-events_list ul li`. Setting the chip transparent in v0.51.0
   was not enough — the ghost treatment only reads as ghost if everything
   behind it is transparent too. `.hockey … .custom-paginate li` is (0,3,1)
   against their (0,1,2) and (0,2,2), so it wins in both states; the hover
   selector is spelled out anyway so the pair cannot be split by a later edit.
   Harmless on /aktuality/, whose `li` was already transparent. */
.hockey .stm-default-page-grid ul.page-numbers li,
.hockey .stm-default-page-grid ul.page-numbers li:hover,
.hockey .stm-single-sp_calendar .custom-paginate li,
.hockey .stm-single-sp_calendar .custom-paginate li:hover {
	margin: 0;
	padding: 0;
	list-style: none;
	background-color: transparent;
	background-image: none;
	box-shadow: none;
}

/* The chip. `span` is in the list because WordPress renders the current page
   as a `<span>`, and the dots between page ranges as one too. */
.hockey .stm-default-page-grid ul.page-numbers li a,
.hockey .stm-default-page-grid ul.page-numbers li span,
.hockey .stm-default-page-grid .page-numbers a,
.hockey .stm-default-page-grid .page-numbers span,
.hockey .stm-single-sp_calendar .custom-paginate li a,
.hockey .stm-single-sp_calendar .custom-paginate a {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-width: 42px;
	/* `min-height` is not decoration: `styles.css ul.page-numbers li a` sets
	   `min-height: 45px` alongside the `line-height: 45px`, and with
	   `box-sizing: border-box` that alone held the chip at 45px after the
	   line-height was already won — 3px taller than the filters, which is
	   exactly the kind of drift this block exists to end. Measured, not
	   assumed. 12+12 padding + 15.6 line + 2 border is 41.6, so 42px is the
	   governing value rather than a second source of truth. */
	min-height: 42px;
	padding: 12px 14px;
	border: 1.5px solid rgba(234, 241, 248, 0.4);
	border-radius: 3px;
	background-color: transparent;
	background-image: none;
	color: var(--kobra-ice);
	font-family: 'Bricolage Grotesque', sans-serif;
	font-size: 13px;
	font-weight: 700;
	line-height: 1.2;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	text-align: center;
	text-decoration: none;
	transition: border-color .2s ease, color .2s ease;
}

/* `background-color` is the line that was missing. Without it Splash's red
   wins on both pages — see fault 1 above. */
.hockey .stm-default-page-grid ul.page-numbers li a:hover,
.hockey .stm-default-page-grid ul.page-numbers li a:focus,
.hockey .stm-default-page-grid .page-numbers a:hover,
.hockey .stm-default-page-grid .page-numbers a:focus,
.hockey .stm-single-sp_calendar .custom-paginate li a:hover,
.hockey .stm-single-sp_calendar .custom-paginate li a:focus,
.hockey .stm-single-sp_calendar .custom-paginate a:hover,
.hockey .stm-single-sp_calendar .custom-paginate a:focus {
	background-color: transparent;
	background-image: none;
	border-color: var(--kobra-sky);
	color: var(--kobra-sky);
}

/* The current page. Yellow fill, exactly as the filters' selected state, and
   `!important` because hockey.css paints `.current` `#f1f1f1` with one. */
.hockey .stm-default-page-grid ul.page-numbers li .current,
.hockey .stm-default-page-grid .page-numbers .current,
.hockey .stm-default-page-grid .page-numbers span.current,
.hockey .stm-single-sp_calendar .custom-paginate li a.active,
.hockey .stm-single-sp_calendar .custom-paginate a.active {
	border-color: var(--kobra-yellow) !important;
	background-color: var(--kobra-yellow) !important;
	background-image: none !important;
	color: #101a08 !important;
}

/* ---------- The ellipsis (v0.67.0) ----------
   `<span class="page-numbers dots">…</span>`, which WordPress emits only when
   there are more pages than the links shown. The news listing has two pages, so
   **this chip had never once appeared** — it surfaced on the search page, which
   paginates 87 results into nine. A grey `#f1f1f1` box with `#1f3b79` text
   sitting in a row of ghost chips.

   `hockey.css .hockey .page-numbers li span` sets both **with `!important`**,
   and the component's base rule for `li a, li span` does not — so the base rule
   won its specificity contest and was still overridden. The `.current` chip has
   carried `!important` for exactly this reason since v0.51.0; the ellipsis was
   the same fight, just never visible.

   Drawn as bare text rather than a chip: it is not a page you can go to, so a
   box around it would say otherwise. The 42px width keeps the row even. */
.hockey .stm-default-page-grid ul.page-numbers li span.dots,
.hockey .stm-default-page-grid .page-numbers span.dots {
	min-width: 42px;
	background-color: transparent !important;
	border-color: transparent !important;
	color: var(--kobra-mist) !important;
}

/* The current page is not a link, so it must not answer to hover. */
.hockey .stm-default-page-grid .page-numbers .current:hover,
.hockey .stm-single-sp_calendar .custom-paginate a.active:hover {
	border-color: var(--kobra-yellow) !important;
	color: #101a08 !important;
}

/* Splash's skewed red slab hangs off anything it thinks is a button, the same
   pseudo-element pair already switched off on the filters and squad tabs. */
.hockey .stm-default-page-grid .page-numbers a::before,
.hockey .stm-default-page-grid .page-numbers a::after,
.hockey .stm-single-sp_calendar .custom-paginate a::before,
.hockey .stm-single-sp_calendar .custom-paginate a::after {
	display: none !important;
	content: none !important;
}

/* ==========================================================================
   Blockquote / callout — stm_block_quote, site-wide (v0.52.0)
   --------------------------------------------------------------------------
   Declared here rather than in post.css because the user asked for it "napříč
   theme": `stm_block_quote` is a WPBakery widget an editor can drop on any
   page or article, so styling it per template would leave the next one grey.

   **This is not the plain `<blockquote>` treatment and must not become it.**
   `<blockquote>` already has its own look — a yellow left rule, no panel, set
   in pages.css for O týmu in v0.45 and settled with the user. It is finished;
   leave it alone. This block styles Splash's shortcode only.

   What the user asked for, precisely: she likes the centring and the quotation
   marks and wanted **only the grey gone**. So the structure Splash draws is
   kept — centred text, the quote glyph, the hairline either side of it — and
   only the three greys are repainted:

     #f0f0f0  the panel behind it   ->  nothing, no panel at all
     #d8d8d8  the glyph + hairlines ->  yellow glyph, --kobra-line hairlines
     #404040  the quote text        ->  --kobra-ice

   The first draft of this block threw the centring away and rebuilt it as the
   left-rule pull quote used on O týmu. That was wrong — consistency with the
   other quote is worth less than the treatment the user actually likes, and
   she had to say so. Ask before "unifying" two things that only look alike.

   The glyph is safe to keep: it is `icon-icon_testimonials` from
   `stm-splash-icons`, the parent theme's **own** icon font, so it ships with
   Splash and does not depend on which Font Awesome build production runs —
   unlike the select2 arrow, which was a FA4 name on an FA5 site and rendered
   as a missing-character box.

   All four `style_N` variants are covered through `[class*="style_"]` rather
   than named one at a time: the attribute selector also lifts these to
   (0,3,0)/(0,4,0) against Splash's (0,2,0)/(0,3,0), so nothing depends on
   stylesheet order. style_4's own `::before`/`::after` quote glyphs are
   switched off — it draws its own pair, which would double up with the icon.
   ========================================================================== */

.hockey .stm-block-quote-wrapper[class*="style_"] {
	margin: 10px 0 16px;
	padding: 4px 0 0;
	background: none;
	background-color: transparent;
	border: 0;
}

/* The hairlines flanking the glyph. Splash draws them as the icon row's own
   two pseudo-elements, 38% wide each, and paints them #d8d8d8. */
.hockey .stm-block-quote-wrapper[class*="style_"] .stm-block-quote-icon::before,
.hockey .stm-block-quote-wrapper[class*="style_"] .stm-block-quote-icon::after {
	background-color: var(--kobra-line);
}

/* The quotation marks the user singled out as worth keeping. Yellow, because
   that is the accent every other quote marker on this site uses — the rule
   under the article headline, and the left rule on O týmu's blockquote. */
.hockey .stm-block-quote-wrapper[class*="style_"] .stm-block-quote-icon i::before {
	color: var(--kobra-yellow);
	font-size: 28px;
}

.hockey .stm-block-quote-wrapper[class*="style_"] .stm-block-quote {
	background: none;
	background-color: transparent;
	color: var(--kobra-ice);
	/* Splash asks for Roboto, which this site never loads. Naming the real
	   font makes what renders a decision instead of a fallback. */
	font-family: 'Bricolage Grotesque', sans-serif;
	font-size: 20px;
	font-weight: 400;
	/* Italic is Splash's and it stays — the user likes this quote as it reads.
	   Note that `<blockquote>` deliberately goes the other way and sets
	   `font-style: normal`; the two are different components. */
	font-style: italic;
	line-height: 1.6;
	letter-spacing: 0;
	text-align: center;
	padding: 5px 0;
}

/* style_4 draws its own pair of quote glyphs on the text box, which would sit
   on top of the icon row's. One set of quotation marks is enough. */
.hockey .stm-block-quote-wrapper[class*="style_"] .stm-block-quote::before,
.hockey .stm-block-quote-wrapper[class*="style_"] .stm-block-quote::after {
	display: none;
	content: none;
}

/* The attribution, and a bug worth knowing about. Splash's template writes
   `if ($blockquote_style == 'style_3' || 'style_4')`, which is **always true**
   — `'style_4'` is a truthy string — so `<div class="author">` is emitted on
   every quote whether or not an author was given. The empty one holds only
   whitespace, so it is *not* `:empty` and cannot be hidden by selector.

   It collapses to zero height on its own, so the fix is arithmetic instead:
   the 14px lives on the author's margin and the wrapper's bottom margin is
   16px, which totals the intended 30px whether the author is there or not.
   Change one and change the other. */
.hockey .stm-block-quote-wrapper[class*="style_"] .stm-block-quote .author {
	margin-top: 14px;
	color: var(--kobra-sky);
	font-size: 15px;
	font-weight: 700;
	font-style: normal;
	line-height: 1.4;
}

/* ==========================================================================
   Site footer (v0.61.0)
   --------------------------------------------------------------------------
   Splash's footer was 110px of #222 holding one line — "Copyright (c) 2026
   Splash Theme for WordPress by StylemixThemes" — so it advertised the theme
   vendor and said nothing about the club. That string is a Splash theme option
   in the database, so fixing it in wp-admin would not travel in the zip;
   replacing the footer here does.

   **Splash's own markup is hidden, not removed.** `body .stm-footer
   { position: relative }` and `body { padding-bottom: 0 }` are what un-pinned
   the footer from the bottom of the viewport in v0.22.0, and both key off
   `.stm-footer` still existing. Its children are hidden instead.

   **The surface is the navbar's, exactly (v0.63.0).** It went ink → navy →
   back, and the round trip is worth recording. Ink first; the user said the
   footer was "visually too little separated from the rest", which it was —
   the page body is *also* ink, so there was no edge. Navy fixed that but she
   then asked for the header's specs, having seen both. So: same colour, same
   texture, same repeat, same size, and the navbar's `--kobra-line` hairline
   mirrored onto the top edge. **The header and footer now read as one pair
   bracketing the page**, which is a better answer to "not separated" than a
   different colour was — a matching band top and bottom is itself the frame.
   Either way it keeps the deferred "footer is #222 and off-palette" question
   settled.

   **`background-size: auto` is a fix, not boilerplate.** Splash sets `cover` on
   `.stm-footer` because it expects a photograph there, and `cover` stretched
   the tileable ice texture across the whole 1280px width — the user saw its
   individual pixels. Every other navy surface on this site computes `auto`;
   this one was the exception because the earlier rule set the image and the
   repeat but never the size. Measured against the navbar and the cards, which
   were correct all along.
   ========================================================================== */
.kobra-footer-host {
	background-color: var(--kobra-ink) !important;
	background-image: var(--kobra-ice-texture) !important;
	background-repeat: repeat !important;
	background-size: auto !important;
	/* Declared, and it has to be: Splash pairs its `cover` with
	   `background-position: 50% 50%`, so dropping this line does not inherit
	   the navbar's origin — it hands the tile Splash's centre instead. Tried it
	   both ways and measured. (`0 0` computes to `0px 0px` where the navbar's
	   initial value reads `0% 0%`; that is the same place written two ways, not
	   a difference.) */
	background-position: 0 0 !important;
	/* The navbar's own hairline, mirrored to the top edge. */
	border-top: 1px solid var(--kobra-line);
}

/* Everything Splash put in there. `:not()` so the injected footer survives —
   a blanket `> *` would have hidden the replacement along with the original. */
.kobra-footer-host > *:not(.kobra-footer) {
	display: none !important;
}

/* And the same thing again by Splash's own ids, which is what actually covers the
   paint before the script runs (v0.76.3).
   --------------------------------------------------------------------------
   The rule above keys on `.kobra-footer-host`, and **that class is added by
   `buildFooter()`** — so it cannot possibly hide anything before the JS it is
   meant to cover for. The note in CLAUDE.md claiming this rule "covers the paint
   before the script runs" was simply wrong, and the user caught the consequence:
   on a slow load the page showed Splash's own footer band, complete with
   "Copyright (c) 2026 Splash — Theme for WordPress by StylemixThemes".

   Measured in the script-free simulation: `#stm-footer-bottom` visible and
   **110px tall**, with the vendor credit rendered.

   These two ids come from Splash's own template and are in the served HTML, so
   they match at the first paint. The rule above stays: it is what catches
   anything else Splash or a plugin drops into that host. */
.stm-footer > #stm-footer-top,
.stm-footer > #stm-footer-bottom {
	display: none !important;
}

.kobra-footer {
	max-width: 1170px;
	margin: 0 auto;
	padding: 44px 24px 0;
	box-sizing: border-box;
	font-family: 'Bricolage Grotesque', sans-serif;
	/* Centred throughout, at the user's request (v0.63.3). The block itself was
	   already centred — 1170px with `margin: 0 auto`, 48px clear on each side —
	   so what was left-aligned was the content inside the columns.

	   `text-align` handles the headings, the paragraphs and the copyright. It
	   does **not** handle the four flex rows in here: the brand, the social
	   icons, the partner strip and its list all need `justify-content`, because
	   `text-align` has no effect on how a flex container distributes its items.
	   Each of them is set explicitly below. */
	text-align: center;
}

/* `auto-fit` with a min track, so the columns reflow on their own as blocks are
   cleared in the Customizer — four, three or two columns all lay out without a
   breakpoint per case. */
.kobra-footer-inner {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(190px, 100%), 1fr));
	gap: 32px;
	padding-bottom: 36px;
}

.kobra-footer-col p { margin: 0; }

/* ---------- Identity ---------- */
.kobra-footer .kobra-footer-brand {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 10px;
	text-decoration: none;
	margin-bottom: 12px;
}
.kobra-footer .kobra-footer-brand img {
	width: 40px;
	height: 40px;
	display: block;
	flex: none;
}
.kobra-footer .kobra-footer-brand span {
	font-size: 15px;
	font-weight: 700;
	color: var(--kobra-ice);
	white-space: nowrap;
}
.kobra-footer .kobra-footer-brand span b { color: var(--kobra-yellow); }

.kobra-footer-tagline {
	color: var(--kobra-mist);
	font-size: 13px;
	line-height: 1.6;
	margin: 0 0 16px !important;
}

/* The social row is the hero's component, restyled smaller — heroSocials()
   builds it, so the icons and the URLs are the same ones in both places. */
.kobra-footer .kobra-footer-socials {
	display: flex;
	justify-content: center;
	gap: 8px;
	margin: 0;
	padding: 0;
	list-style: none;
}
.kobra-footer .kobra-footer-socials li { margin: 0; padding: 0; list-style: none; }
.kobra-footer .kobra-footer-socials li::before { display: none; content: none; }
.kobra-footer a.kobra-social-link {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 34px;
	height: 34px;
	border: 1.5px solid rgba(234, 241, 248, 0.4);
	border-radius: 50%;
	color: var(--kobra-ice);
	text-decoration: none;
	transition: color .18s ease, border-color .18s ease;
}
.kobra-footer a.kobra-social-link:hover,
.kobra-footer a.kobra-social-link:focus {
	border-color: var(--kobra-sky);
	color: var(--kobra-sky);
}

/* ---------- Link column ----------
   Two narrow sub-columns inside the one grid cell, at the user's request: six
   links in a single stack is what made the footer read as a very wide, very
   sparse row. `1fr 1fr` rather than auto-fit — this is a deliberate pair, not a
   reflowing set, and auto-fit would have collapsed it back to one column at the
   cell widths this sits in. */
.kobra-footer-links-split {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 0 18px;
}

.kobra-footer .kobra-footer-links {
	margin: 12px 0 0;
	padding: 0;
	list-style: none;
}
.kobra-footer .kobra-footer-links li {
	margin: 0 0 9px;
	padding: 0;
	list-style: none;
}
/* Splash's 3x3 bullet dot, the same one that turned up beside the nav labels
   and the news filters. */
.kobra-footer li::before { display: none; content: none; }

.kobra-footer .kobra-footer-links a {
	color: var(--kobra-ice);
	font-size: 13px;
	text-decoration: none;
	transition: color .18s ease;
}
.kobra-footer .kobra-footer-links a:hover { color: var(--kobra-yellow); }

/* ---------- Address ---------- */
.kobra-footer-address {
	color: var(--kobra-ice);
	font-size: 13px;
	line-height: 1.7;
	margin: 12px 0 10px !important;
}
/* Phone and e-mail, read from the Kontakty page's own widget. */
.kobra-footer-contact {
	margin: 0 0 10px !important;
	font-size: 13px;
	line-height: 1.8;
}
.kobra-footer .kobra-footer-contact a {
	color: var(--kobra-ice);
	text-decoration: none;
	transition: color .18s ease;
}
.kobra-footer .kobra-footer-contact a:hover { color: var(--kobra-yellow); }

.kobra-footer a.kobra-footer-maplink {
	color: var(--kobra-sky);
	font-size: 13px;
	font-weight: 700;
	text-decoration: none;
}
.kobra-footer a.kobra-footer-maplink:hover { color: var(--kobra-yellow); }

/* ---------- Next match ---------- */
.kobra-footer a.kobra-footer-next,
.kobra-footer .kobra-footer-next {
	display: block;
	margin-top: 12px;
	text-decoration: none;
}
.kobra-footer-next-teams {
	display: block;
	color: var(--kobra-ice);
	font-size: 13px;
	font-weight: 700;
	line-height: 1.6;
}
/* `tabular-nums` for the same reason as every other instance of this
   countdown: without it the seconds change width and the line jitters. */
.kobra-footer-countdown {
	display: block;
	margin-top: 6px;
	color: var(--kobra-yellow);
	font-size: 12px;
	font-weight: 700;
	letter-spacing: 0.03em;
	white-space: nowrap;
	font-variant-numeric: tabular-nums;
	font-feature-settings: 'tnum' 1;
}
.kobra-footer a.kobra-footer-next:hover .kobra-footer-next-teams { color: var(--kobra-yellow); }

/* ---------- Partner strip ---------- */
/* Stacked rather than a label-then-logos row: with everything else centred, a
   left-hand label beside a centred strip reads as the one thing that missed the
   line. */
.kobra-footer-partners {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 12px;
	padding: 18px 0;
	border-top: 1px solid var(--kobra-line);
}
.kobra-footer .kobra-footer-partner-list {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 14px;
	flex-wrap: wrap;
	margin: 0;
	padding: 0;
	list-style: none;
}
.kobra-footer .kobra-footer-partner-list li { margin: 0; padding: 0; list-style: none; }
/* The logos are colour artwork on a dark ground; held back a little at rest so
   the strip reads as a credit rather than competing with the columns above,
   and brought fully up on hover.

   34px, not 26: at 26 the five logos rendered ~46x26 each, and a wordmark that
   small is decoration rather than a credit — measured, then raised. They are
   1024x576 and 1024x724 originals, so height is the safe side to size on and
   the strip stays on one row at 1170px. */
.kobra-footer .kobra-footer-partner-list img {
	display: block;
	height: 34px;
	width: auto;
	opacity: 0.75;
	transition: opacity .18s ease;
}
.kobra-footer .kobra-footer-partner-list a:hover img,
.kobra-footer .kobra-footer-partner-list img:hover { opacity: 1; }

/* ---------- Bottom line ---------- */
.kobra-footer-bottom {
	padding: 14px 0 22px;
	border-top: 1px solid var(--kobra-line);
	color: var(--kobra-mist);
	font-size: 12px;
}

@media (max-width: 700px) {
	.kobra-footer { padding: 32px 20px 0; }
	.kobra-footer-inner { gap: 26px; padding-bottom: 26px; }
}

/* ==========================================================================
   Upcoming match — its own section on the homepage (v0.65.0)
   --------------------------------------------------------------------------
   Rebuilt after the user called the first version "fakt špatnej". Three of her
   four points turned out to be one underlying problem, and it measured
   cleanly at a confirmed 1280px viewport:

     gap to the stats panel above     0px
     gap to the results below         0px
     this section                  1140px wide, inset 63px
     hero / stats / results        1280px wide, full-bleed

   **It was the only inset section in a stack of full-bleed ones, with nothing
   between it and its neighbours** — so it read as a panel dropped onto the page
   rather than a part of it. Not a colour problem at all, which is why the first
   attempt at restyling the card inside it changed nothing that mattered.

   Now it borrows the results section's language wholesale: full-bleed, a banner
   header carrying an eyebrow and an h2 over an optional photograph, the same
   gradient settling into --kobra-ink, then the match on the page ground so it
   flows into the results below instead of butting against them.

   The photo is a Customizer image with **no shipped default** — the results
   banner already uses the one photograph the theme carries, and the same image
   twice in a row would look like a bug. With no photo the banner is a navy
   textured band, which still reads as a section header.
   ========================================================================== */

/* Full-bleed, the same escape as .kobra-results-section. These sections sit
   inside WPBakery's centred .container, so breaking out needs the viewport
   width and a negative margin — `width: 100%` would only fill the column. */
.kobra-upcoming {
	position: relative;
	width: 100vw !important;
	margin-left: calc(50% - 50vw) !important;
	margin-right: calc(50% - 50vw) !important;
	max-width: 100vw !important;
	background-color: var(--kobra-ink);
}

/* The stats panel above ends in a 1px --kobra-line border; this picks that line
   back up, so the two sections are parted by an edge instead of running
   straight into each other. */
.kobra-upcoming { border-top: 1px solid var(--kobra-line); }

/* ---------- Banner header ----------
   **Deliberately NOT navy + ice texture.** That is the stats panel's exact
   surface, and the first attempt used it here too — so the two sections merged
   into one continuous navy blob with a countdown floating in it. That is what
   "nalepene na ten panel s cisly" actually was: not a missing gap so much as a
   missing *change of surface*. On the darker ink ground the band reads as a new
   section even with no photograph in it. */
.kobra-upcoming-banner {
	position: relative;
	display: flex;
	align-items: flex-end;
	min-height: 200px;
	overflow: hidden;
	background-color: var(--kobra-ink);
	background-image: radial-gradient(120% 150% at 12% -30%, rgba(18,63,110,0.85) 0%, rgba(7,27,48,0) 62%);
}

/* The theme's face-off motif, already used as a watermark on the match page.
   Large, dim and bleeding off the right edge, it gives the band something of its
   own when no photo is set — the alternative was an empty dark strip. */
.kobra-upcoming-banner::before {
	content: '';
	position: absolute;
	top: 50%;
	right: -70px;
	width: 300px;
	height: 300px;
	transform: translateY(-50%);
	background: url('../images/faceoff-motif.png') center / contain no-repeat;
	opacity: 0.10;
	pointer-events: none;
}

/* Only when a photo was actually chosen. A separate rule rather than a var()
   fallback because the two states differ in more than the image: the photo band
   is taller, and the glow and the motif come off so the photograph is the only
   thing behind the words. */
.kobra-upcoming-banner.has-photo {
	min-height: 320px;
	background-image: var(--kobra-upcoming-photo);
	background-size: cover;
	background-position: center 35%;
	background-repeat: no-repeat;
	background-color: var(--kobra-ink);
}
.kobra-upcoming-banner.has-photo::before { display: none; }

/* The same scrim as .kobra-results-banner: readable text at the bottom, and the
   band resolving into the page colour so the content below continues it rather
   than starting again. */
.kobra-upcoming-banner.has-photo::after {
	content: '';
	position: absolute;
	inset: 0;
	background: linear-gradient(180deg, rgba(7,27,48,0.30) 0%, rgba(7,27,48,0.85) 80%, var(--kobra-ink) 100%);
}

.kobra-upcoming-banner-inner {
	position: relative;
	z-index: 1;
	width: 100%;
	max-width: 1220px;
	margin: 0 auto;
	/* The top padding is the breathing room above the eyebrow. The band is
	   bottom-aligned, so without it the text can sit against the border. */
	padding: 56px 24px 26px;
	box-sizing: border-box;
}

.kobra-upcoming-banner-inner h2 {
	margin: 6px 0 0 !important;
	font-family: 'Bricolage Grotesque', sans-serif !important;
	font-weight: 800 !important;
	font-size: clamp(28px, 4vw, 42px) !important;
	line-height: 1.05 !important;
	color: var(--kobra-ice) !important;
}

/* ---------- The match ----------
   **v0.65.1: three of Splash's own colours were still showing through.** The
   first pass styled the wrapper and the countdown and left the widget's insides
   alone, so the card was three nested rectangles of three different darknesses:

     .vc_next_match .commands      background rgb(37,43,50)  + 3px rgb(0,170,255)
     .vc_next_match a .match_info  background rgb(57,65,73)
     .kobra-cd-box                 --kobra-ink, near black on navy

   A charcoal slab behind the teams with a cyan rule under it, a grey block
   behind the date, and four near-black chips. **I had checked the colours of the
   elements I wrote rules for, not the ones the visitor actually sees.** Measure
   the whole component, not your own declarations. */
.kobra-upcoming-inner {
	max-width: 1170px;
	margin: 0 auto;
	/* The bottom padding is the gap to the results section, which had none. */
	padding: 6px 24px 64px;
	box-sizing: border-box;
	text-align: center;
}

/* ---------- One card per fixture (v0.70.0) ----------
   Splash emits every fixture into one `.vc_next_match` as a flat run of
   `p.countdown` + `.commands` + `a`, with no wrapper per match — so the card
   used to be the widget itself, and a second fixture would have doubled every
   hairline and date pill inside it. redesign.js now groups each run into a
   `.kobra-upcoming-match`, and that is the card.

   The widget keeps only the job of holding them. */
.kobra-upcoming .vc_next_match {
	max-width: 760px;
	margin: 0 auto;
	background: none;
	border: 0;
}

/* Two or more, and the class comes from redesign.js: one fixture is a card
   centred under the banner, several are a row of equal cards. `auto-fit` on its
   own cannot express that — with one item it would stretch to the full width. */
.kobra-upcoming .kobra-upcoming-many .vc_next_match {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(min(320px, 100%), 1fr));
	gap: 22px;
	max-width: 100%;
	align-items: start;
}

/* One surface, not a stack of boxes: the same navy-and-ice panel the stats
   section uses, with hairlines doing all the dividing inside it. */
.kobra-upcoming .kobra-upcoming-match {
	padding: 42px 34px 36px;
	background-color: var(--kobra-navy);
	background-image: var(--kobra-ice-texture);
	background-repeat: repeat;
	background-position: 50% 50%;
	border: 1px solid var(--kobra-line);
	border-radius: 6px;
	box-shadow: 0 24px 50px -30px rgba(0,0,0,0.8);
}

/* Tighter once they share the width, and the countdown figures come down with
   them — four units at 40px in a 320px card would have nowhere to go. */
.kobra-upcoming .kobra-upcoming-many .kobra-upcoming-match {
	padding: 30px 22px 26px;
}
.kobra-upcoming .kobra-upcoming-many .kobra-cd-box b { font-size: clamp(24px, 2.4vw, 30px); }
.kobra-upcoming .kobra-upcoming-many .kobra-cd-box small { font-size: 10px; letter-spacing: 0.05em; }
.kobra-upcoming .kobra-upcoming-many .countdown time { max-width: none; }
.kobra-upcoming .kobra-upcoming-many .commands .command .logo img { width: 70px; height: 70px; max-height: 70px; }
.kobra-upcoming .kobra-upcoming-many .commands .command h5 { font-size: 15px !important; }
.kobra-upcoming .kobra-upcoming-many .commands .command_vs { padding: 0 12px; }

/* The widget's own title is redundant now that the banner names the section. */
.kobra-upcoming .vc_next_match .title { display: none; }

/* The competition, in the same 11px letterspaced sky blue as .kobra-result-comp
   on the result cards below — the same fact should not look like two different
   kinds of fact in two places on one page. No min-height here, unlike that
   rule: the result cards need one to keep a grid of cards aligned when a match
   has no competition, and this is a single card that simply omits the line. */
.kobra-upcoming .kobra-upcoming-comp {
	margin: 0 0 22px;
	font-family: 'Bricolage Grotesque', sans-serif;
	font-weight: 700;
	font-size: 11px;
	letter-spacing: 0.05em;
	text-transform: uppercase;
	color: var(--kobra-sky);
}

/* ---------- Countdown ----------
   **Deliberately the same treatment as the stats panel's three numbers**: big
   yellow figure, small uppercase label under it, units parted by a 1px hairline
   and nothing else. The first version made them filled chips in --kobra-ink,
   which on navy read as four black blocks pasted onto the card — that was the
   "pozadi za odpoctem". A row of numbers already has a house style on this site;
   this is it, so the countdown reads as family with "Jak si stojime".

   The boxes are built once and only the characters inside them change — see
   renderBoxes() in redesign.js. */
.kobra-upcoming .countdown {
	display: flex;
	justify-content: center;
	margin: 0 0 32px !important;
	padding: 0;
	border: 0;
}
.kobra-upcoming .countdown time {
	display: flex;
	justify-content: center;
	width: 100%;
	max-width: 520px;
}

/* **Four classes and an element, to beat Splash's `.vc_next_match .countdown
   time span { display: block }` at (0,2,2).** My earlier `.kobra-cd-box` was
   (0,1,0), so the box stayed a block, `flex-direction: column` was inert, and
   the `<b>` and `<small>` sat side by side inline — "04DNY" instead of the
   number over its label. The rule looked applied because the box itself was
   visibly styled; only the two children gave it away. */
.kobra-upcoming .countdown time span.kobra-cd-box {
	position: relative;
	flex: 1 1 0;
	min-width: 0;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: flex-start;
	margin: 0;
	padding: 0 12px;
	background: none;
	border: 0;
	border-radius: 0;
}

/* The divider, exactly as .kobra-stat + .kobra-stat::before draws it. */
.kobra-upcoming .countdown time span.kobra-cd-box + span.kobra-cd-box::before {
	content: '';
	position: absolute;
	left: 0;
	top: 4px;
	bottom: 8px;
	width: 1px;
	background: var(--kobra-line);
}

.kobra-upcoming .kobra-cd-box b {
	font-family: 'Bricolage Grotesque', sans-serif;
	font-weight: 800;
	font-size: clamp(30px, 3.4vw, 40px);
	line-height: 1;
	color: var(--kobra-yellow);
	/* Without tabular figures each column changes width as its digits change
	   and the row shuffles once a second. */
	font-variant-numeric: tabular-nums;
	font-feature-settings: 'tnum' 1;
}
.kobra-upcoming .kobra-cd-box small {
	margin-top: 9px;
	font-family: 'Bricolage Grotesque', sans-serif;
	font-weight: 700;
	font-size: 11px;
	letter-spacing: 0.09em;
	line-height: 1.2;
	text-transform: uppercase;
	color: var(--kobra-mist);
}

/* ---------- Teams ----------
   Splash lays this out as a `display: table` row of three cells — crest+name,
   VS, crest+name — and that stays: it is three fixed slots and the table
   already centres them. What goes is its charcoal background and the 3px cyan
   rule under it. Three classes here, against the theme's two. */
.kobra-upcoming .kobra-upcoming-match .commands {
	width: 100%;
	margin: 0 auto;
	padding: 30px 0 0;
	background: none;
	border: 0;
	border-top: 1px solid var(--kobra-line);
}

.kobra-upcoming .commands .command { padding: 0; }
.kobra-upcoming .commands .command .logo { margin: 0 0 14px; }

/* The max-height is the operative declaration, not the height: Splash caps
   these crests with `.vc_next_match .command .logo img { max-height: 50px }`,
   and a max-height beats a plain height however tall it is. Measured 84 wide by
   50 tall before this — the crest was squashed, not resized. */
.kobra-upcoming .commands .command .logo img {
	width: 92px;
	height: 92px;
	max-height: 92px;
	object-fit: contain;
}
.kobra-upcoming .commands .command h5 {
	margin: 0 !important;
	font-family: 'Bricolage Grotesque', sans-serif !important;
	font-weight: 800 !important;
	font-size: 18px !important;
	line-height: 1.25 !important;
	letter-spacing: 0.01em;
	color: var(--kobra-ice) !important;
}
/* No rules for `h5 a` here on purpose: buildUpcoming() unwraps the team links,
   so there is no anchor inside the name any more. Dead selectors left behind
   read as "this is still a link" to whoever edits the file next. */

/* The cell's text is literally "- VS -", so it is styled rather than rewritten:
   small, letterspaced and mist, it separates the two crests without competing
   with them. */
.kobra-upcoming .commands .command_vs {
	margin: 0;
	padding: 0 20px;
	font-family: 'Bricolage Grotesque', sans-serif;
	font-weight: 800;
	font-size: 12px;
	letter-spacing: 0.14em;
	color: var(--kobra-mist);
	white-space: nowrap;
	vertical-align: middle;
}

/* ---------- Date and venue ----------
   The widget closes with an anchor to the match holding
   `<div class="match_info">30. 8. 2026<br><span class="venue">ZS Kobra</span></div>`
   — two lines already, via a <br>. (Reading it with textContent shows
   "30. 8. 2026ZS Kobra" and looks like a missing separator; it is not, the line
   break simply does not survive that property.) The section's one call to
   action, ghost-styled like the rest of the site. */
.kobra-upcoming .kobra-upcoming-match > a {
	display: inline-block;
	margin: 30px 0 0;
	padding: 13px 26px;
	border: 1.5px solid rgba(234, 241, 248, 0.4);
	border-radius: 3px;
	font-family: 'Bricolage Grotesque', sans-serif;
	font-weight: 700;
	font-size: 14px;
	letter-spacing: 0.07em;
	line-height: 1.4;
	text-transform: uppercase;
	color: var(--kobra-ice) !important;
	text-decoration: none;
	transition: border-color .18s ease, color .18s ease;
}
.kobra-upcoming .kobra-upcoming-match > a:hover {
	border-color: var(--kobra-sky);
	color: var(--kobra-sky) !important;
}

/* Splash gives .match_info a grey background of its own — `.vc_next_match a
   .match_info { background: rgb(57,65,73) }` — plus `padding: 20px 0 14px` and
   `margin-bottom: 30px`, which is what made the pill 132px tall with a grey
   slab inside a ghost outline. Three classes and an element beats its two and
   one. */
.kobra-upcoming .kobra-upcoming-match > a .match_info {
	margin: 0;
	padding: 0;
	background: none;
	/* Splash also sets `color: #fff` here, and the date is a direct text node of
	   this div — so the anchor's own colour never reached it. A palette sweep of
	   all 43 elements in the section found this; spot-checking would not have. */
	color: var(--kobra-ice);
	line-height: 1.45;
}
.kobra-upcoming .kobra-upcoming-match > a .venue {
	display: block;
	margin-top: 3px;
	background: none;
	font-weight: 400;
	font-size: 11px;
	letter-spacing: 0.07em;
	text-transform: none;
	color: var(--kobra-mist);
}
.kobra-upcoming .kobra-upcoming-match > a:hover .venue { color: var(--kobra-sky); }

/* The kick-off time, injected next to the date by buildUpcoming(). The middot
   is drawn here rather than written into the text so its spacing is a style
   decision and the span holds nothing but the time. */
.kobra-upcoming .kobra-kickoff-time::before {
	content: '·';
	margin: 0 8px;
	color: var(--kobra-mist);
	font-weight: 400;
}

/* Splash sets `color: #fff` on .match_info itself, so the date does not inherit
   the anchor's colour — including on hover, where the border and the venue
   changed and the date stayed put. This carries it across with them. */
.kobra-upcoming .kobra-upcoming-match > a:hover .match_info { color: var(--kobra-sky); }

/* Splash's generic bullet dot, which would otherwise sit beside anything the
   widget happens to render as a list item. */
.kobra-upcoming li::before { display: none; content: none; }

@media (max-width: 700px) {
	.kobra-upcoming-banner { min-height: 150px; }
	.kobra-upcoming-banner.has-photo { min-height: 220px; }
	.kobra-upcoming-banner-inner { padding: 38px 18px 20px; }
	.kobra-upcoming-banner::before { width: 200px; height: 200px; right: -60px; }
	.kobra-upcoming-inner { padding: 6px 14px 44px; }
	.kobra-upcoming .kobra-upcoming-match { padding: 30px 14px 28px; }
	.kobra-upcoming .kobra-upcoming-many .kobra-upcoming-match { padding: 24px 14px 22px; }
	/* One column on a phone whatever the setting says: two of these side by
	   side would be about 170px each, and four countdown units do not fit. */
	.kobra-upcoming .kobra-upcoming-many .vc_next_match { grid-template-columns: 1fr; gap: 16px; }
	.kobra-upcoming .kobra-upcoming-comp { margin-bottom: 18px; font-size: 10px; }
	.kobra-upcoming .countdown { margin: 0 0 26px !important; }
	.kobra-upcoming .countdown time span.kobra-cd-box { padding: 0 5px; }
	.kobra-upcoming .kobra-cd-box b { font-size: 26px; }
	.kobra-upcoming .kobra-cd-box small { font-size: 9px; letter-spacing: 0.05em; margin-top: 7px; }
	.kobra-upcoming .kobra-upcoming-match .commands { padding-top: 24px; }
	.kobra-upcoming .commands .command .logo img { width: 62px; height: 62px; max-height: 62px; }
	.kobra-upcoming .commands .command h5 { font-size: 14px !important; }
	.kobra-upcoming .commands .command_vs { padding: 0 8px; font-size: 10px; letter-spacing: 0.08em; }
	.kobra-upcoming .kobra-upcoming-match > a { margin-top: 24px; padding: 12px 20px; font-size: 13px; }
}

/* ==========================================================================
   Filter buttons — one component, three places (v0.71.1)
   --------------------------------------------------------------------------
   The season/competition filters on the team statistics page, the group tabs on
   the squad, and now the season switcher on a Soutěže page.

   **Moved here from team.css because the third place proved it had to be.** The
   competition tabs were given `.kobra-btn` and came out as Splash's skewed red
   slabs with a border — the user photographed them. The reason: every defence
   against Splash's own `<button>` styling lived in team.css and roster.css,
   neither of which loads on a text page. `.kobra-btn` in redesign.css sets the
   shape but cannot answer these:

     hockey.css   .hockey #wrapper button   (1,1,1)  padding, font-size, bg
     styles.css   button                    !important on background-color
     hockey.css   the skewed red slab on ::before and ::after
     hockey.css   button:hover:focus        white label, a two-state rule

   An id beats any number of classes, and an important declaration can only be
   beaten by another one — hence `#wrapper` and the `!important`s below. Same
   pattern as the pagination component, moved here in v0.51.0 for exactly this
   reason: two copies of one thing drift.

   `.kobra-team-filter-btn` is kept as an alias so team.css's markup needs no
   change.
   ========================================================================== */
.kobra-filter-btn {
	cursor: pointer;
	font-family: 'Bricolage Grotesque', sans-serif;
}
.kobra-filter-btn:focus-visible {
	outline: 2px solid var(--kobra-sky);
	outline-offset: 2px;
}

.hockey #wrapper .kobra-filter-btn.kobra-btn {
	display: inline-flex;
	align-items: center;
	/* **Splash puts `margin-left: 10px` on every button through `#wrapper`.**
	   In a row of filters it merely widens the gap before the second one, so it
	   hides — what gives it away is the *first* button sitting ten pixels right
	   of whatever the filters belong to. Fourth occurrence in this project after
	   the comment submit button (v0.52.1), the search form (v0.68.6) and the
	   competition tabs (v0.72.1); it lives on the shared component now so a
	   fifth filter cannot inherit the fault. */
	margin: 0;
	padding: 12px 22px;
	border-width: 1.5px;
	border-style: solid;
	border-radius: 3px;
	font-size: 13px;
	font-weight: 700;
	letter-spacing: 0.06em;
	line-height: 1.2;
	text-transform: uppercase;
	background-color: transparent !important;
}
.hockey #wrapper .kobra-filter-btn.kobra-btn-primary {
	border-color: var(--kobra-yellow);
	background-color: var(--kobra-yellow) !important;
}
.hockey #wrapper .kobra-filter-btn.kobra-btn-ghost {
	border-color: rgba(234, 241, 248, 0.4);
}
.hockey #wrapper .kobra-filter-btn.kobra-btn-ghost:hover {
	border-color: var(--kobra-sky);
}
/* On a phone the same chips are far too heavy: measured at 320px, four season
   tabs at 138x44 filled two rows and 94px of height before a single fixture —
   "filtry jsou na to, že to je zobrazené na mobilu, strašně velké a zabírají
   moc místa". Tightened to roughly 95px wide and 34px tall, which puts three on
   a row instead of two and takes the block to about 74px. The label keeps its
   uppercase weight and the count chip stays; only the air around them goes. */
@media (max-width: 700px) {
	.hockey #wrapper .kobra-filter-btn.kobra-btn {
		padding: 8px 12px;
		font-size: 12px;
		letter-spacing: 0.04em;
	}
	.hockey #wrapper .kobra-filter-btn .kobra-competition-count,
	.hockey #wrapper .kobra-filter-btn .kobra-team-filter-count {
		font-size: 11px;
	}
}

/* Splash's skewed red slab hangs off every button; removed, as on the squad
   tabs, because `.kobra-btn` draws its own flat shape. */
.hockey #wrapper .kobra-filter-btn.kobra-btn::before,
.hockey #wrapper .kobra-filter-btn.kobra-btn::after {
	display: none !important;
	content: none !important;
}
/* `button:hover:focus` whitens the label — a two-state rule, so it only shows
   up after the button has been clicked. Answered at (1,5,0) vs its (1,3,1). */
.hockey #wrapper .kobra-filter-btn.kobra-btn-primary:hover,
.hockey #wrapper .kobra-filter-btn.kobra-btn-primary:focus,
.hockey #wrapper .kobra-filter-btn.kobra-btn-primary:hover:focus,
.hockey #wrapper .kobra-filter-btn.kobra-btn-primary:hover:active {
	color: #101a08 !important;
}
.hockey #wrapper .kobra-filter-btn.kobra-btn-ghost:hover,
.hockey #wrapper .kobra-filter-btn.kobra-btn-ghost:hover:focus,
.hockey #wrapper .kobra-filter-btn.kobra-btn-ghost:hover:active {
	color: var(--kobra-sky) !important;
}
.hockey #wrapper .kobra-filter-btn.kobra-btn-ghost:focus {
	color: var(--kobra-ice) !important;
}

@media (max-width: 700px) {
	/* Stacked and full width on a phone: two of these side by side would each be
	   under 170px and "Celý rozpis 1. ligy" does not fit that. */
	.kobra-results-actions {
		grid-auto-flow: row;
		width: 100%;
	}
}

/* ==========================================================================
   The phone-wide trim — homepage sections
   --------------------------------------------------------------------------
   "neboj se toho, klidně zkus zmenšit i homepage … ale jen pro to mobilní
   zobrazení."

   Nothing here touches a width above 700px: every declaration sits inside the
   phone media query, so the desktop homepage she has already signed off on is
   untouched. Measured at 360px before this, the sections were carrying almost
   their full desktop sizing — a 640px hero on an 800px screen, a 52px title,
   56px of padding above three statistics, and 20px inside every result card.

   The reductions keep each section's proportions and take roughly a fifth off:

       hero band        640 -> 520
       hero title       52  -> ~40   (clamp floor, so it still scales)
       stats padding    56  -> 34      stat number  42 -> 32
       banner padding   38  -> 26
       result card      20  -> 16      grid gap     18 -> 14
       fixture card     30  -> 22
   ========================================================================== */
@media (max-width: 700px) {
	.kobra-hero { min-height: 520px; }
	.kobra-hero-overlay { padding: 0 20px 28px; }
	/* Their own declaration carries `!important`, so this one has to as well —
	   the clamp keeps the type fluid, only the floor and ceiling come down. */
	.kobra-hero-overlay h2 { font-size: clamp(38px, 11vw, 52px) !important; }
	.kobra-hero-overlay p { font-size: 15px; }
	.kobra-hero-actions .kobra-btn { padding: 12px 18px; }

	.kobra-stats { padding: 34px 20px; }
	.kobra-stats-grid,
	.kobra-stats-grid.kobra-cols-1,
	.kobra-stats-grid.kobra-cols-2,
	.kobra-stats-grid.kobra-cols-3 { gap: 18px; }
	/* `.kobra-stat .kobra-stat-num`, not the class alone: the base rule is
	   (0,2,0) and a lone `.kobra-stat-num` at (0,1,0) loses to it even inside a
	   media query — measured 42px after the first attempt, unchanged. */
	.kobra-stat .kobra-stat-num { font-size: 32px; }

	.kobra-upcoming-banner-inner,
	.kobra-results-banner-inner { padding: 26px 20px 16px; }
	/* `!important` because our own base rule for these two headings carries one
	   (it had to, to beat Splash) — measured 28px without it. */
	.kobra-upcoming-banner-inner h2,
	.kobra-results-banner-inner h2 { font-size: 22px !important; }

	.kobra-upcoming-inner { padding: 6px 12px 32px; }
	.kobra-upcoming .kobra-upcoming-match { padding: 22px 12px 20px; }
	.kobra-upcoming .kobra-upcoming-many .kobra-upcoming-match { padding: 18px 12px 16px; }
	.kobra-upcoming .kobra-cd-box b { font-size: 22px; }

	.kobra-results-grid { padding: 0 20px; gap: 14px; }
	.kobra-result-card { padding: 16px; gap: 10px; }
}
