/*
Theme Name: DiceStrategies
Theme URI: https://dicestrategies.com
Author: DiceStrategies
Author URI: https://dicestrategies.com
Description: Server-side-rendered block theme for dicestrategies.com - a Dice casino strategy hub with in-depth strategy articles, interactive calculators and simulators, and affiliate casino lists. Dark analytics aesthetic. Two faces (2026-07-27): Russo One is the brand voice (wordmark, headings, CTAs); Space Grotesk carries everything else.
Requires at least: 6.6
Tested up to: 6.9
Requires PHP: 7.4
Version: 0.2.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: dicestrategies
Tags: full-site-editing, block-patterns, custom-colors, custom-menu, dark-mode, blog, one-column
*/

:root {
	color-scheme: dark;

	/* --- Design scale (2026-07-27) -------------------------------------
	   One source for radii, tracking and control heights. Before this,
	   border-radius was hand-written 29 times across 8 values and
	   letter-spacing 32 times across 6 - blocks each invented their own,
	   which is what read as "everything is slightly off". Blocks consume
	   these; they no longer declare the raw values themselves. Changing a
	   visual direction later means editing here, not in 8 stylesheets. */
	--ds-radius-chip: 6px;
	--ds-radius-control: 8px;
	--ds-radius-panel: 12px;
	--ds-radius-pill: 999px;

	--ds-track-caps: 0.08em;
	--ds-track-btn: 0.05em;
	--ds-track-data: 0.02em;

	/* Control heights are a closed set. Measured before the scale existed:
	   inputs came in 3 heights (29.8/32.8/48.4) and buttons in 6
	   (21/27.3/30/33.8/49.6/52). Text and icon buttons are NOT controls -
	   they take .ds-btn--inline and no height from this scale. */
	--ds-control-h-sm: 30px;
	--ds-control-h-md: 34px;
	--ds-control-h-lg: 48px;

	/* Prose line length. The content rail is 1240px (theme.json); prose
	   keeps this measure and anchors to the shared LEFT edge - it must
	   never centre itself inside a section, or headings and body text end
	   up on different verticals. */
	--ds-measure: 820px;
	/* Мера ДЛИННОГО материала — шире прозаической. 820 рассчитана на страницу,
	   где текст главное; в статье и на money-странице рядом с текстом стоят
	   таблицы и картинки, и на 820 у страницы получалось два правых края.
	   Одно число на обе поверхности: `.ds-games-money` и `.ds-article-body`. */
	--ds-doc-measure: 62.5rem;
}

html {
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

/* --- Фоновый слой (2026-08-01) ------------------------------------------
   Присланный дизайн: background-layer.html. Разметку печатает
   dicestrategies_background_layer() на wp_body_open — там же объяснено, почему
   не template part.

   ПАЛИТРА ПЕРЕЛОЖЕНА НА ТОКЕНЫ, третий бриф подряд с тем же исправлением:
   зелёный дизайна #37e06b отстоит от нашего #14F46F на 41 единицу RGB (второй
   фирменный цвет, а не оттенок), фон #070907 против нашего --base #07090A.

   ⚠️ z-index:1 у .wp-site-blocks НЕСУЩИЙ, а не косметика. Позиционированный
   слой на z-index:0 рисуется ПОВЕРХ статичного контента, включая его текст:
   в порядке отрисовки позиционированные боксы идут после строчного содержимого
   потока. Без подъёма обёртки слой закрыл бы страницу.
   Обёртка взята готовая — .wp-site-blocks ядро печатает вокруг всего шаблона,
   поэтому разметку темы трогать не пришлось. */
.ds-bg{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden}
.wp-site-blocks{position:relative;z-index:1}

/* Сетка, замаскированная к верхнему левому углу. 56px — шаг дизайна; на рельс
   1240 он не ложится нацело, и это верно: сетка здесь текстура, а не разметка,
   и совпадение её линий с колонками читалось бы обещанием, которого нет. */
.ds-bg__grid{
	position:absolute;inset:0;
	background-image:
		linear-gradient(rgba(20,244,111,.05) 1px,transparent 1px),
		linear-gradient(90deg,rgba(20,244,111,.05) 1px,transparent 1px);
	background-size:56px 56px;
	-webkit-mask-image:radial-gradient(92% 70% at 18% 8%,#000 0%,transparent 78%);
	        mask-image:radial-gradient(92% 70% at 18% 8%,#000 0%,transparent 78%);
}

/* Главное свечение. Альфа .15 — из дизайна, оставлена по решению владельца при
   известной цене: в центре свечения `muted` уходит с 3.91 до 2.64 при пороге
   AA 4.5 (замер _pw/probe-bg-layer.mjs, таблица в DESIGN-SYSTEM). `muted` был
   ниже порога и до слоя — это записанный дефект, слой его углубляет, а не
   заводит. `text-dim` держится на 5.62 и в порядке.
   Слой fixed, поэтому свечение стоит в углу ВЬЮПОРТА, а не за героем: на
   скролле оно оказывается за тем, что там окажется. Читается виньеткой;
   комментарий дизайна «behind the hero headline» верен для первого экрана. */
.ds-bg__glow{
	position:absolute;top:-260px;left:-200px;width:1000px;height:820px;
	background:radial-gradient(closest-side,rgba(20,244,111,.15),transparent 70%);
}
.ds-bg__glow-side{
	position:absolute;top:38%;right:-320px;width:900px;height:900px;
	background:radial-gradient(closest-side,rgba(20,244,111,.06),transparent 70%);
}
/* Увод в плоский base к низу вьюпорта — иначе сетка тянется до подвала и
   спорит с его верхней зелёной линией. */
.ds-bg__fade{
	position:absolute;inset:0;
	background:linear-gradient(180deg,transparent 0%,transparent 55%,var(--wp--preset--color--base) 100%);
}

/* --- Layout rail (2026-07-27) ---------------------------------------------
   ONE rail: theme.json contentSize == wideSize == 1240px, so every section,
   the header and the footer share a left edge. Before this, content sat on
   820px and the frame on 1240px - the wordmark started at x=100 and the page
   H1 at x=310, which is what read as "crooked".

   Prose keeps its previous 820px measure (--ds-measure) but ANCHORS LEFT
   instead of centring. WP's constrained layout puts margin-inline:auto on any
   child narrower than the rail; that is precisely what would drop body copy
   onto a different vertical from its own heading.

   Scope note: only .is-layout-constrained children are centred by WP, so
   cards, tool panels and <details> (flow containers) are untouched here.
   RULE: any new max-width narrower than the rail ships with margin-inline:0. */
.is-layout-constrained > p:not(.has-text-align-center),
.is-layout-constrained > ul:not(.has-text-align-center),
.is-layout-constrained > ol:not(.has-text-align-center),
.is-layout-constrained > blockquote,
.is-layout-constrained > h2:not(.has-text-align-center),
.is-layout-constrained > h3:not(.has-text-align-center),
/* Хлебные крошки (2026-08-02) заняли слот надзаголовка, а тот был <p> и якорь
   получал отсюда. <nav> в список не входил, и ядро центрировало бы его своим
   `margin-left:auto !important`. Дописан СЮДА, а не отдельным правилом: левый
   якорь — одно число, и вторая формула с тем же max() стала бы вторым его
   источником. */
.is-layout-constrained > .ds-breadcrumbs {
	max-width: var(--ds-measure);
	/* Anchor to the RAIL's left edge, not the container's own content edge.
	   In a full-width padded container (e.g. <main>) the 1240 rail exists only
	   because WP auto-centres it, so a plain margin-inline:0 drops prose ~80px
	   to the LEFT of every 1240-wide sibling. This expression resolves to 0
	   inside a container already at rail width, and to the rail offset inside
	   a wider one; on mobile it clamps to 0.

	   !important is required, not sloppy: WP core ships
	   `.is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull))
	    { margin-left:auto !important; margin-right:auto !important }`
	   so nothing without !important can anchor a narrower child at all. */
	margin-left: max(0px, (100% - var(--wp--style--global--content-size)) / 2) !important;
	margin-right: 0 !important;
}

/* Зазор «след → H1» (2026-08-03). Крошки въехали в слот надзаголовка и вместе с
   ним унаследовали посадку вплотную к заголовку: 24px общего blockGap — ровно
   столько же, сколько между двумя абзацами одной мысли.

   Для надзаголовка это было верно, он ПОДПИСЬ к H1 и обязан читаться с ним
   одним блоком. След — не подпись, а навигация: он принадлежит шапке страницы,
   а не заголовку. На общем зазоре два разных по роли элемента слипались в
   двухэтажный заголовок, и заметно это стало ровно тогда, когда H1 сбавил
   кегль и перестал перебивать собой шов.

   3rem — ступень шкалы (0.5 · 1 · 1.5 · 2 · 3 · 4 · 6). Отрисованы 2rem и 3rem
   (`_pw/games-gap-variants.mjs`): на 2rem чернильный зазор 28px против 25px
   у «H1 → лид», то есть заголовок висит посередине и не решает, к чему он
   относится. На 3rem — 44 против 25, и H1 однозначно связан с текстом ПОД ним.

   ⚠️ Правило висит на САМОМ следе, а не на `.ds-breadcrumbs + h1`. Соседский
   селектор был первой версией, и он молча промахнулся мимо тулов: там H1 лежит
   не рядом с крошками, а внутри `.entry-content` → `section.wp-block-group`,
   поэтому шесть шаблонов раздвинулись, а страницы тулов остались на 20px. Поймал
   замер по всем типам страниц, глазом на одной странице это не видно вовсе.
   Отступ на следе не зависит от того, во что завёрнут заголовок.

   ⚠️ И ровно поэтому значение ОБЯЗАНО превышать blockGap: соседние margin
   схлопываются в максимум, так что любое значение ниже 1.5rem не сделало бы
   ничего — тоже молча, потому что max(24, 16) = 24.

   Мера сайтвайдная: крошки стоят на всех шаблонах кроме главной, и слипшийся
   шов был на каждом. */
.ds-breadcrumbs {
	margin-bottom: 3rem;
}

/* Текст только для скринридера. Заведена 2026-08-03 под таблицу /games/: там
   доступ к API показывает ЗАЛИТАЯ ТОЧКА, а рейтинг — длина полоски, и без
   словесного дубля обе колонки для скринридера просто не существуют. Своей
   утилиты у темы не было — проверено по всему CSS; `.screen-reader-text` в
   блочной теме тоже не приезжает сам.

   clip-path вместо `clip: rect(...)`: старое свойство задепрекейчено, а
   clip-path не ломает выделение и копирование текста. */
.ds-sr-only {
	position: absolute;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip-path: inset(50%);
	white-space: nowrap;
	border: 0;
}

::selection {
	background: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--base);
}

* {
	scrollbar-color: var(--wp--preset--color--border-strong) transparent;
}

::-webkit-scrollbar {
	width: 10px;
	height: 10px;
}

::-webkit-scrollbar-thumb {
	background: var(--wp--preset--color--border-strong);
	border-radius: 6px;
}

::-webkit-scrollbar-track {
	background: transparent;
}

a:focus-visible,
button:focus-visible,
.wp-block-button__link:focus-visible {
	outline: 2px solid var(--wp--preset--color--primary);
	outline-offset: 2px;
}

/* Outline button tuned for the dark surface.

   PADDING IS RESTORED HERE, and that is the whole point of the declaration.
   theme.json gives buttons 0.875rem / 1.5rem, but core ships
   `.wp-block-button.is-style-outline > .wp-block-button__link {padding:.667em 1.33em}`
   — three classes against theme.json's single `.wp-element-button`, so core
   wins and the outline button silently keeps WordPress defaults. Measured on
   the hero: 48.8px tall filled against 42.1px outlined, with padding 8.671 /
   17.29 — numbers that belong to no design decision of ours.

   The border width is SUBTRACTED rather than ignored: the outline button
   carries a 2px border the filled one does not, so equal padding would make it
   4px taller instead of equal. Same rule the control scale already states —
   the token means the OUTER size, and a border sits inside it, not on top. */
.wp-block-button.is-style-outline .wp-block-button__link {
	padding: calc(0.875rem - 2px) calc(1.5rem - 2px);
	border-color: var(--wp--preset--color--border-strong);
	color: var(--wp--preset--color--text);
	background: transparent;
}

.wp-block-button.is-style-outline .wp-block-button__link:hover {
	border-color: var(--wp--preset--color--primary);
	color: var(--wp--preset--color--primary);
}

/* --- Strategy archive filter (Phase 4) --- */
.ds-filter-group{display:flex;flex-wrap:wrap;gap:.5rem;margin:.5rem 0}
.ds-chip{cursor:pointer;padding:.3rem .8rem;border:1px solid var(--wp--preset--color--border-strong);border-radius:999px;background:transparent;color:var(--wp--preset--color--text-dim);font:inherit}
.ds-chip:hover{border-color:var(--wp--preset--color--primary);color:var(--wp--preset--color--primary)}
.ds-chip.is-active{border-color:var(--wp--preset--color--primary);color:var(--wp--preset--color--primary)}
.ds-strategy-grid [data-ds-type].is-hidden{display:none}

/* --- Strategy hub card (Phase 4) --- */
.ds-badge{display:inline-block;padding:.15rem .55rem;border:1px solid var(--wp--preset--color--border-strong);border-radius:999px;font-size:.8125rem;color:var(--wp--preset--color--text-dim)}
.ds-badge--risk{border-color:var(--wp--preset--color--danger);color:var(--wp--preset--color--danger)}
.ds-badge--rating{border-color:var(--wp--preset--color--primary);color:var(--wp--preset--color--primary)}
.ds-badge-row,.ds-quickjump{gap:.5rem;margin-top:1rem}
.ds-quickjump p{margin:0}
/* align-items:start, not the inherited center: when the strip wraps (mobile)
   a cell whose value runs to two lines is taller than its neighbours, and
   centring drops their labels ~17px below its own. Desktop hid this after the
   rail change removed the height difference; mobile still wraps. Caught by
   audit:layout. */
.ds-statstrip{gap:1rem;margin:2rem 0;padding:1.25rem;border:1px solid var(--wp--preset--color--border);border-radius:12px;background:var(--wp--preset--color--surface-2);align-items:flex-start}
.ds-stat{flex:1 1 8rem}
.ds-stat__label{margin:0;color:var(--wp--preset--color--muted);font-size:.8125rem}
.ds-stat__value{margin:.15rem 0 0;color:var(--wp--preset--color--contrast);font-weight:500}
.ds-section{scroll-margin-top:5rem;margin-block:2rem}
.ds-pillar-backlink{margin-top:3rem;color:var(--wp--preset--color--text-dim)}

/* --- Front page dual-pillar (Phase 4) --- */
/* 5rem = 80px, было 3rem = 48px (2026-08-02).
   Ритм секций сведён к ОДНОМУ числу: над первой секцией и так было 80 (24px
   блок-гэп ядра между пресс-лентой и <main> плюс 56px её padding-top), а между
   секциями стояло 48 — одна работа, два числа, и разница в 32px читалась.
   Заодно это дало разворачивающейся панели у колец место, которого ей не
   хватало: её низ заходил на заголовок соседней секции. Две правки решают
   друг друга — см. комментарий к .ds-strategy-ring__tldr. */
.ds-home-section{margin-block:5rem}

/* 2.125rem = 34px is not a new design constant, it is what theme.json already
   asks for: h2 → the x-large token. The site renders 42px because this is a v3
   theme.json that never set `defaultFontSizes: false`, so WP core's own
   x-large (42px, wp-includes/theme.json) wins over the theme's. This rule is a
   local undo of that override, NOT a new size.
   Scoped to the section wrapper rather than to .ds-section-head so that
   "Latest articles", which has no arrow and therefore no head row, shrinks
   with its neighbour — two headings of the same rank at two sizes on one page
   would read as a hierarchy that is not there.
   The sitewide cure is its own pass: the same switch moves prose 20px → 16 and
   h3 36 → 19. When it lands, this rule becomes a tautology and comes out. */
.ds-home-section h2{font-size:2.125rem;line-height:1.05}

/* Section header: heading left, "all of these" arrow at the right end of the
   rail. Replaces the earlier centred "View all" that sat under the grid — one
   destination gets one entry, and it belongs after nothing, beside the title.

   The flex wrapper is load-bearing beyond layout. Prose here is pinned to the
   820px measure by `.is-layout-constrained > h2`; inside a flex group the h2
   is no longer a direct child of the constrained layout, so the measure stops
   applying and the line sets at full width.
   (Until 2026-08-01 that was the ONLY thing holding the heading on one line:
   at the 42px the site was rendering it measured 826px against the 820 rail
   and wrapped by six pixels. At 2.125rem it clears the measure on its own —
   the wrapper now earns its keep for the arrow alone.) */
/* align-items остаётся baseline, хотя бриф колец просит flex-end: там справа
   текстовая ссылка, а здесь SVG-стрелка, посадка которой отмерена отдельно
   (docs/design-mockups/home-section-arrow.html). Менять выравнивание ради
   строки чужого брифа — переигрывать уже решённое вслепую. */
.ds-section-head{
	display:flex;align-items:baseline;justify-content:space-between;
	gap:2.5rem;margin-bottom:1.375rem;
}
.ds-section-head h2{margin:0}

/* Заголовок и подводка одной колонкой. Группа в разметке — flow, а не
   constrained: constrained прижал бы h2 к мере прозы 820px, ровно тому, ради
   обхода чего шапка и стала флексом. */
.ds-section-head__text{display:flex;flex-direction:column;gap:.75rem;min-width:0}
/* Явные 15px, а не пресет: глобальный размер прозы сейчас ядровый medium 20px
   (см. «Ядро WP давит четыре токена размера»), и подводка на нём спорила бы
   по весу с заголовком секции. Мера 56ch держит строку короче рельса — иначе
   она тянется под самую стрелку. */
.ds-section-lede{margin:0;font-size:.9375rem;line-height:1.55;max-width:56ch}

/* The arrow is an SVG, not the "92" glyph, and that is measured rather than
   preferred: Russo One has no U+2192, so the character falls back to a system
   font whose shaft is 1.8px against the heading's 3.6px stem — exactly half
   the weight, which is why it read as foreign next to it. The SVG takes its
   stroke from that same measured stem and so carries the heading's weight on
   any OS, with no substitution lottery. */
.ds-section-arrow{
	flex:none;display:inline-flex;align-items:center;
	color:var(--wp--preset--color--primary);
	/* Invisible hit area: the mark stays small, the target reaches the 44px
	   accessibility floor. The negative margin keeps layout unchanged.

	   ⚠️ Зона растёт ВЛЕВО и ВВЕРХ-ВНИЗ, но не вправо (2026-08-02). Симметричный
	   padding отодвигал СТРЕЛКУ на 12px внутрь рельса: её бокс кончался на
	   1333 вместе с рельсом, а чернила на 1321. Пока справа не было ничего
	   другого, это было незаметно; появилась пилюля промо-полосы — и стало
	   видно, что правый край страницы держат два разных числа.
	   Площадь нажатия при этом не уменьшилась ни на пиксель, она просто
	   переехала: 44px-порог держится теми же 24px, добавленными с одной
	   стороны вместо двух. */
	padding:.75rem 0 .75rem 1.5rem;
	/* ⚠️ ВТОРАЯ правка того же края (2026-08-02). Бокс на рельсе ещё не значит,
	   что на рельсе ЧЕРНИЛА: вершина головки стоит на x=34 из 38 единиц
	   вьюбокса, miter выносит остриё на (3.6/2)/sin(41.19°) = 2.72, чернила
	   кончаются на 36.72 — и оставшиеся 1.28px справа остаются пустым холстом.
	   Пилюля промо-полосы приходит к рельсу всей массой, поэтому правый край
	   страницы держали два разных числа, и владелец видел это глазом.
	   Мерить это можно ТОЛЬКО isPointInStroke: getBBox знает геометрию пути и
	   не знает ни про cap, ни про miter, а getBoundingClientRect у <svg> —
	   снова бокс, просто поменьше. Первая приёмка ровно на этом и разошлась с
	   глазом: она называлась «по чернилам», а мерила бокс <svg>, и зелёной была
	   всё то время, пока стрелка не дотягивалась. Замер — _pw/measure-ink-edge.mjs. */
	--ds-arrow-ink-gap:1.28px;
	transition:color .16s ease,filter .16s ease;
}
/* ⚠️ Селектор тяжелее одного класса — не вкусовщина, а единственный способ
   вообще ЗАДАТЬ здесь margin (2026-08-02).
   Ядро WP печатает для флекс-раскладок `.is-layout-flex > :is(*, div){margin:0}`.
   Это (0,1,1) против (0,1,0) у одного класса, поэтому shorthand `margin` на
   .ds-section-arrow проигрывал по весу и НЕ ПРИМЕНЯЛСЯ НИКОГДА — ни новый
   правый сдвиг к рельсу, ни исходная левая компенсация хит-зоны, та самая, про
   которую в комментарии выше написано «margin оставляет раскладку неизменной».
   Она не оставляла: её просто не было, и 24px левого padding'а всё это время
   съедали строку шапки. Показал CSS.getMatchedStylesForNode — правило темы
   стоит в каскаде первым и перебивается целиком.
   Стрелка во всех трёх местах (front-page.html, tools-teaser.php,
   latest-articles.php) — прямой ребёнок .ds-section-head, поэтому (0,2,0)
   хватает и !important не нужен.
   ⚠️ Восьмой случай той же семьи: раскладка ядра молча съедает то, что тема
   написала про свои отступы. */
.ds-section-head > .ds-section-arrow{
	margin:-.75rem calc(-1 * var(--ds-arrow-ink-gap)) -.75rem -1.5rem;
}
.ds-section-arrow svg{display:block}
.ds-section-arrow svg path{stroke:currentColor;fill:none;stroke-width:3.6;stroke-linecap:square}
/* Colour at rest is already the accent, so hover cannot be "brighter" — it
   glows, the same grammar as the wordmark and the nav links. */
.ds-section-arrow:hover{color:var(--wp--preset--color--contrast);filter:drop-shadow(0 0 10px rgba(20,244,111,.7))}

@media (max-width:48rem){ .ds-section-head{gap:1.25rem} }
/* --- Tools teaser (front page, design pass 2b) ---------------------------
   Один ответ на тул вместо описания тула — тот же ход, что стат-ряд героя:
   находка бьёт инвентарь. Разбор с арифметикой и отвергнутым —
   docs/design-mockups/home-tools-teaser.html, вариант «дерево вопросов» —
   home-tools-teaser-tree.html.

   gap:0 — колонки разделяют ЛИНИИ, а не пустота. Поэтому крайние края встают
   вровень с рельсом и видны только два внутренних делителя; с обычным gap
   первая колонка отъехала бы от левой вертикали, на которой стоит вся
   страница. */
.ds-tt{display:grid;grid-template-columns:repeat(4,1fr)}
.ds-tt__stat{
	display:flex;flex-direction:column;gap:1.125rem;
	text-decoration:none;color:inherit;
	padding:.5rem 1.75rem 2.125rem;
	border-left:1px solid var(--wp--preset--color--border);
	transition:transform .25s ease;
}
/* Крайние колонки без своего края и без внешнего отступа — так ряд начинается
   и кончается ровно на рельсе, а видны только внутренние делители. */
.ds-tt__stat:first-child{padding-left:0;border-left:0}
.ds-tt__stat:last-child{padding-right:0}
.ds-tt__stat:hover{transform:translateY(-4px)}
/* 44px, а НЕ 58 из брифа и не 38 как у колец.
   58 давало число КРУПНЕЕ заголовка секции (34px) на 24px — в блоке оказывалось
   два главных элемента, и побеждал не заголовок.
   38 — кегль оценки в кольцах, но там она стоит ВНУТРИ кольца 150px, и крупной
   её делает кольцо, а не кегль; здесь опереться не на что, и на 38 число
   садится вровень с подписью, а блок читается списком. Одинаковый кегль в
   разном окружении — имитация консистентности, а не она. */
.ds-tt__val{
	font-family:var(--wp--preset--font-family--display);
	font-size:2.75rem;line-height:1;
	color:var(--wp--preset--color--contrast);
	font-variant-numeric:tabular-nums;
}
.ds-tt__val--good{color:var(--wp--preset--color--primary)}
.ds-tt__val--bad{color:var(--wp--preset--color--danger)}
/* Подпись — вторая половина фразы, которую начинает число, а не ярлык.
   .9375rem = 15px, было 17: столько же теперь у описания в кольцах этажом
   выше и у `.ds-section-lede` над обеими сетками. Функционально это разные
   тексты (здесь половина утверждения, там блёрб), но приём один — крупное
   число, текст под ним, ссылка внизу, — и разница в кегле читалась
   расхождением, а не иерархией: читателю функциональное различие не видно.
   Меры нет: при четырёх колонках ширина 228px сама держит строку, а max-width
   290px из трёхколоночной версии просто не достигался бы. */
.ds-tt__cap{
	font-size:.9375rem;line-height:1.4;
	color:var(--wp--preset--color--text-dim);
	text-wrap:pretty;
}
/* margin-top:auto сажает три ссылки на одну линию независимо от того, во
   сколько строк лёг текст над ними. */
.ds-tt__link{
	margin-top:auto;
	font-family:var(--wp--preset--font-family--display);
	font-size:.75rem;letter-spacing:.12em;text-transform:uppercase;
	color:var(--wp--preset--color--primary);
}
.ds-tt__stat:hover .ds-tt__link{color:var(--wp--preset--color--contrast)}
@media (prefers-reduced-motion:reduce){
	.ds-tt__stat{transition:none}
	.ds-tt__stat:hover{transform:none}
}
/* Четыре колонки не доживают до планшета: на 1024px это 256px на колонку, и
   подпись начинает ломаться на слова. Промежуточная ступень 2x2 — делитель
   при этом остаётся только между парами, иначе линия висит там, где колонки
   уже нет. */
@media (max-width:75rem){
	.ds-tt{grid-template-columns:repeat(2,1fr);row-gap:2rem}
	.ds-tt__stat:nth-child(odd){padding-left:0;border-left:0}
	.ds-tt__stat:nth-child(even){padding-right:0}
	.ds-tt__stat:nth-child(3),
	.ds-tt__stat:nth-child(4){padding-bottom:0}
}
@media (max-width:48rem){
	.ds-tt{grid-template-columns:1fr;row-gap:0}
	.ds-tt__stat{padding:1.75rem 0!important;border-left:0!important;border-top:1px solid var(--wp--preset--color--border)}
	.ds-tt__stat:first-child{border-top:0;padding-top:.5rem!important}
	.ds-tt__val{font-size:2.375rem}
	.ds-tt__cap{font-size:1rem}
}

/* --- /tools/ — витрина инструментов (пересобрана 2026-08-12) ---------------

   Что чинилось и почему, по замеру, а не на глаз:
   • H1 был 56px. Решение 2026-08-03 («h1 и h2 чуть поменьше») понизило его до
     48 формулой clamp, но применялось скоупом — на статьях и /games/, — и сюда
     не дошло. Та же формула, тот же довод: заголовок внутренней страницы не
     должен кричать громче титульного экрана сайта (герой на 1440 — 52px).
   • Заголовок карточки был 36px, то есть крупнее самого крупного заголовка в
     статьях (h2 там 30) — при том что это подпись к карточке, а не раздел.
   • Шесть оранжевых кнопок подряд. 🔴 В дизайн-системе записано: «--cta
     оранжевый — ТОЛЬКО конверсионные кнопки». Открыть свой же калькулятор не
     конверсия, и шесть оранжевых на внутренней навигации обесценивают тот самый
     цвет, которым сайт зовёт играть. Кнопки переведены на акцент.

   ⚠️ А ВОТ КАРТОЧКИ ТРОГАТЬ НЕ ПРИШЛОСЬ, хотя в первом разборе я записал
   обратное. «Карточка без фона и рамки» было ошибкой ЗАМЕРА: селектор
   `[class*="tool"]` первым делом попадает в САМ КОНТЕЙНЕР `.ds-tools-launcher`,
   у которого фона и правда нет. У карточки всё это стояло и стоит — фон
   surface, рамка 1px, радиус 12. Мерить по точному классу, а не по подстроке. */

.ds-tools-launcher{gap:1rem;align-items:stretch}
.ds-tool-card{flex:1 1 14rem;display:flex;flex-direction:column;gap:.5rem;padding:1.5rem;border:1px solid var(--wp--preset--color--border);border-radius:12px;background:var(--wp--preset--color--surface);transition:border-color .16s ease}
.ds-tool-card:hover{border-color:var(--wp--preset--color--border-strong)}
.ds-tool-card h3{margin:0;font-size:1.25rem;line-height:1.2}
.ds-tool-card p{margin:0;font-size:.9rem;line-height:1.55}

/* H1 витрины — та же формула, что у статей и /games/. clamp, а не плоские 3rem:
   токен xx-large флюидный, и плоское значение подняло бы мобильный заголовок с
   36px до 48 — «уменьшили» обернулось бы ростом на телефоне.
   ⚠️ Скоуп — класс на секции, как у `.ds-games-money`. Первая версия правила
   стояла на `.ds-tools-launcher ~ *`, то есть на СОСЕДЯХ ПОСЛЕ контейнера, — а
   заголовок идёт ДО него, и правило не задело бы ничего нужного, зато задело бы
   лишнее. */
.ds-tools-page > h1{font-size:clamp(2.25rem,5vw,3rem);line-height:1.06}

/* Кнопка «Open tool» — заливка АКЦЕНТОМ, не оранжевым.
   ⚠️ Элемент не выдуман: в палитре темы есть `accent-ink #04120A` с подписью
   «тёмный текст на акцентных заливках», то есть заливка акцентом предусмотрена
   системой — класса под неё снаружи блока симулятора просто не было. Геометрия
   наследуется от кнопки WP и совпадает с `.ds-cta`: одна кнопка сайта в двух
   цветах, а не вторая система контролов.
   ⚠️ Зелёный — токен темы `primary`, а НЕ `#37E06B` с кнопки RUN симулятора:
   тот принят как цена соответствия макету 13a и действует только внутри блока.
   Наведение — свечением (приём стрелки секции на главной), а не подсветкой
   фона: «светлее зелёного» в палитре нет, и заводить его ради ховера незачем. */
.ds-tool-card .wp-block-button__link{
	background:var(--wp--preset--color--primary);
	color:var(--wp--preset--color--accent-ink);
}
.ds-tool-card .wp-block-button__link:hover,
.ds-tool-card .wp-block-button__link:focus-visible{
	background:var(--wp--preset--color--primary);
	color:var(--wp--preset--color--accent-ink);
	box-shadow:0 0 12px rgba(20,244,111,.45);
}

/* --- Главный инструмент: широкая карточка первой ---------------------------

   Решение владельца 2026-08-12: «ключевым симулятором показать DICE на фоне
   всех остальных». Выбрано из трёх отрисованных вариантов
   (`docs/design-mockups/tools-hub-variants.html`): ряд как был · широкая
   карточка сверху · плитка 2×2. Плитку отклонили на замере: описание симулятора
   короткое, и высокая плитка стояла полупустой.

   ⚠️ Контейнер становится СЕТКОЙ, и только здесь. Флекс с `flex:1 1 14rem`
   раскладывал шесть карточек 4+2 и не умеет «эта на всю ширину» без хаков с
   `flex-basis:100%`, которые ломают выравнивание соседей по высоте.

   ⚠️ Порядок в РАЗМЕТКЕ не тронут — карточка симулятора остаётся последней, а
   наверх её поднимает `order`. Под сеткой лежит поток чтения, и в нём инструменты
   идут от простого к составному; менять его ради визуального порядка значило бы
   чинить вид ценой смысла. */
/* ⚠️ СКОУП СТРАНИЦЫ ЗДЕСЬ НЕ УКРАШЕНИЕ, А ВЕС. WP печатает раскладку группы
   инлайном (`core-block-supports-inline-css`, правило вида
   `.wp-container-core-group-is-layout-XXX{display:flex}`) — специфичность та же
   (0,1,0), а в голове этот блок идёт ПОСЛЕ style.css, поэтому при равном весе
   выигрывает он. Первая версия правила стояла на голом `.ds-tools-launcher`, и
   контейнер остался флексом: `grid-template-columns` был выставлен и не работал,
   а карточки, у которых я снял `flex-basis`, разъехались по содержимому.
   `.ds-tools-page` даёт (0,2,0) и снимает вопрос. */
.ds-tools-page .ds-tools-launcher{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1.5rem}
.ds-tools-page .ds-tools-launcher > .ds-tool-card{flex:none;max-width:none}

/* ⚠️ РАСКЛАДКА ЗАДАНА ОБЛАСТЯМИ, А НЕ АВТОРАЗМЕЩЕНИЕМ, и это исправление
   дефекта, пойманного на живой странице. В макете надзаголовок был
   псевдоэлементом `::before` у заголовка, то есть детей у карточки было три; в
   теме он НАСТОЯЩИЙ АБЗАЦ (его читает поиск и озвучивает скринридер), детей
   стало четыре — и авторазмещение развалилось: кнопка уехала в первый ряд, а
   между надзаголовком и именем открылся провал. Явные области снимают вопрос и
   переживут добавление ещё одного узла. */
.ds-tool-card--key{
	grid-column:1 / -1;
	order:-1;
	border-color:var(--wp--preset--color--primary);
	display:grid;
	grid-template-columns:minmax(0,1fr) auto;
	grid-template-areas:
		"kicker action"
		"title  action"
		"desc   action";
	column-gap:2.5rem;
	row-gap:.5rem;
}
.ds-tool-card--key:hover{border-color:var(--wp--preset--color--primary)}
.ds-tool-card--key .ds-tool-card__kicker{grid-area:kicker;align-self:end}
.ds-tool-card--key h3{grid-area:title;font-size:2rem}
.ds-tool-card--key p{grid-area:desc;align-self:start;max-width:56ch}
.ds-tool-card--key .ds-tool-card__foot{grid-area:action;align-self:center;justify-self:end}

/* Надзаголовок — display-шрифтом капсом, акцентом. Тот же приём, что у надзаголовка
   страницы игры: маленькая строка над крупным именем. */
.ds-tool-card__kicker{
	grid-column:1 / -1;
	margin:0;
	font-family:var(--wp--preset--font-family--display);
	font-size:.6875rem;
	line-height:1;
	letter-spacing:.14em;
	text-transform:uppercase;
	color:var(--wp--preset--color--primary);
}

@media (max-width:60rem){
	.ds-tools-page .ds-tools-launcher{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:40rem){
	.ds-tools-page .ds-tools-launcher{grid-template-columns:1fr}
	/* На узком экране широкая карточка складывается в обычную: второй колонки
	   нет, действие возвращается под текст. Области сбрасываются вместе с
	   гридом — иначе `grid-area` продолжат ссылаться на несуществующие имена. */
	.ds-tool-card--key{display:flex;flex-direction:column;grid-template-areas:none}
	.ds-tool-card--key h3{font-size:1.5rem}
	.ds-tool-card--key .ds-tool-card__foot{justify-self:auto}
}

/* --- Post meta list block (DP-A) --- */
.ds-meta-list {
	list-style: none;
	margin: 0;
	padding: 0;
}
.ds-meta-list li {
	padding: .35rem 0 .35rem 1.4rem;
	line-height: 1.6;
	position: relative;
}
.ds-meta-list li::before {
	content: "▸";
	position: absolute;
	left: 0;
	color: var(--wp--preset--color--primary);
}

/* Pros & cons columns */
.ds-proscons { margin-block: 2rem }
.ds-proscons .wp-block-columns { gap: 2rem }
.ds-proscons__heading--pros { color: var(--wp--preset--color--primary) }
.ds-proscons__heading--cons { color: var(--wp--preset--color--danger) }

/* FAQ dl */
.ds-faq {
	margin: 0;
	padding: 0;
}
.ds-faq__q {
	font-weight: 700;
	color: var(--wp--preset--color--contrast);
	margin-top: 1.25rem;
}
.ds-faq__q:first-child { margin-top: 0 }
.ds-faq__a {
	margin: .3rem 0 .75rem 1rem;
	color: var(--wp--preset--color--text-dim);
	padding-bottom: .75rem;
	border-bottom: 1px solid var(--wp--preset--color--border);
}
.ds-faq dt:first-child + dd { border-bottom-color: transparent }

/* --- Game criteria table (DP-B), card-wrapped in R3 (see below) --- */
.ds-criteria { width: 100%; border-collapse: collapse; font-family: inherit }
.ds-criteria tbody tr { border-bottom: 1px solid var(--wp--preset--color--border) }
.ds-criteria tbody tr:last-child { border-bottom: none }
.ds-criteria th, .ds-criteria td { padding: .5rem .75rem; text-align: left; vertical-align: top }
.ds-criteria th[scope="row"] { color: var(--wp--preset--color--text-dim); font-weight: 500; width: 42% }
.ds-criteria td { color: var(--wp--preset--color--contrast) }
.ds-criteria__group th { color: var(--wp--preset--color--primary); font-size: .8125rem; text-transform: uppercase; letter-spacing: .05em; padding-top: 1.1rem; padding-bottom: .35rem; border-bottom: none; font-family: var(--wp--preset--font-family--body) }

/* best-casinos: extra disclosure row + chips (DP-C) */
.ds-bc-extra { background: transparent }
/* Compound on purpose (see the .ds-best-casinos__name note): a bare
   `.ds-bc-extra td` (0,1,1) lost to `.ds-best-casinos__table tbody td` (0,2,2),
   so each closed <details> row carried 27px of dead padding and read as an
   empty band between casinos. */
.ds-best-casinos__table tbody tr.ds-bc-extra td { padding: 0; border-bottom: 1px solid var(--wp--preset--color--border) }
/* The bonus cell is prose, not a datum - it must be allowed to wrap. With
   nowrap it forced the table to 1263px inside a 1240px rail on /games/, which
   pushed the Play column past the container edge. */
.ds-best-casinos__table .ds-best-casinos__bonus { white-space: normal; min-width: 16rem }
.ds-bc-details { padding: .5rem .75rem }
.ds-bc-details summary { cursor: pointer; font-size: .8125rem; color: var(--wp--preset--color--text-dim); user-select: none; list-style: none; display: flex; align-items: center; gap: .35rem }
.ds-bc-details summary::before { content: "›"; display: inline-block; transition: transform .15s }
.ds-bc-details[open] summary::before { transform: rotate(90deg) }
.ds-bc-details__methods { display: flex; flex-wrap: wrap; gap: .35rem; margin: .5rem 0 }
.ds-bc-chip { display: inline-block; padding: .15rem .55rem; border: 1px solid var(--wp--preset--color--border-strong); border-radius: 999px; font-size: .75rem; color: var(--wp--preset--color--text-dim); background: transparent }
.ds-bc-details__line { margin: .35rem 0; font-size: .8125rem; color: var(--wp--preset--color--text-dim) }
.ds-bc-details__line strong { color: var(--wp--preset--color--contrast); font-weight: 500 }

/* v2 design-system utilities (Outplayed-style) */
.ds-display{font-family:var(--wp--preset--font-family--display);font-weight:400;text-transform:uppercase;line-height:1.06}
/* --- Промо-полоса (главная, дизайн-проход 5a) ----------------------------
   Была тонкая полоса в одну строку 16px с подчёркнутой ссылкой — читалась
   системным уведомлением. Стала постерная: надзаголовок, крупное утверждение
   и чёрная пилюля справа. Разбор с отвергнутым — home-promo-ribbon.html,
   разметка — patterns/banner-games.php.
   Класс сохранён (.ds-banner-strip): его знают пять скриптов приёмки и замера,
   и переименование ради красоты стоило бы дороже, чем даёт. */
.ds-banner-strip{
	position:relative;overflow:hidden;
	background:var(--wp--preset--color--primary);
	color:var(--wp--preset--color--accent-ink);
	/* 2rem, а не 2.875rem из брифа: 46px сверху и снизу давали полосу в 205px,
	   то есть 22% первого экрана под одно утверждение в две строки. 32px
	   оставляют воздух вокруг текста и снимают с полосы четверть высоты.
	   ⚠️ Отступ здесь — ещё и ФАЗА точечной фактуры, см. ::before ниже. Менять
	   его переменной, а не литералом, иначе сетка пипсов уедет по буквам. */
	--ds-band-pad:2rem;
	padding-block:var(--ds-band-pad);
	/* ⚠️ padding-inline:0 обязателен. Полноширинная группа получает от WP
	   глобальный боковой отступ (`has-global-padding`), и он складывается с
	   отступом внутреннего рельса: на 1280 и уже контент вставал на 40px
	   против 20px у соседей. Шестой случай той же граблины — отступы
	   вычитаются из рельса, если не отыграны шириной. */
	padding-inline:0;
}
/* Фактура из пипсов — лучшая мысль брифа: именно она не даёт зелёному читаться
   системным алертом, и это дайс-мотив, а не абстрактный узор.

   ⚠️ ФАЗА СЕТКИ — не украшение, а условие читаемости надзаголовка.
   Слой лежит inset:0, то есть привязан к ВЕРХУ полосы, поэтому единственное,
   что решает, попадёт ряд точек в текст или ляжет между строк, — это
   padding-block. В макете он был 46px, и надзаголовок вставал на 46–60 между
   рядами 39 и 65. Живая полоса ужата до 32px ради высоты (205 → 177), текст
   уехал на 33–47 — и ряд 39 пошёл ровно по буквам, набивая точками просветы
   межбуквенного (.24em при кегле 11px). Крупному утверждению в 40px точки
   безразличны, надзаголовку — нет.

   Отсюда сдвиг: ряд должен попасть в ЗАЗОР между надзаголовком и утверждением.
   Чернила надзаголовка кончаются на pad+15, утверждение начинается на pad+25.6
   (замерено Range-ом, не боксом), середина зазора pad+21; центр первого ряда
   тайла стоит на 13, значит смещение = pad+21−13 = pad+8. При обоих отступах
   темы (32 и 38px) это даёт по 4.3px чистого поля сверху и снизу от текста.
   Замер и обе стороны сравнения — _pw/measure-pip-phase.mjs. */
.ds-banner-strip::before{
	content:"";position:absolute;inset:0;opacity:.14;pointer-events:none;
	background-image:radial-gradient(circle,var(--wp--preset--color--accent-ink) 1.6px,transparent 1.7px);
	background-size:26px 26px;
	background-position:0 calc(var(--ds-band-pad) + 8px);
}
/* ⚠️ Фон во всю ширину, содержимое НА РЕЛЬСЕ. Бриф отбивал полосу на 72px от
   края ОКНА; замер показал, что с рельсом сайта это совпадает ни при какой
   реальной ширине — на 1280 контент уезжает на 52px правее соседей, на 1920 на
   261px левее. Единый рельс — второе правило темы.
   Ширина = рельс ПЛЮС собственные отступы, иначе padding съедает рельс изнутри:
   тот же приём и та же причина, что у .ds-press__rail. */
.ds-banner-strip__inner{
	box-sizing:border-box;position:relative;
	width:calc(var(--wp--style--global--wide-size) + 2.5rem);
	max-width:100%;margin:0 auto;padding:0 1.25rem;
	display:flex;align-items:center;justify-content:space-between;gap:3rem;
}
.ds-banner-strip__text{display:flex;flex-direction:column;gap:.75rem;max-width:860px}
.ds-banner-strip__eyebrow{
	font-size:.6875rem;font-weight:700;letter-spacing:.24em;text-transform:uppercase;
	/* 60% от чернил, а не отдельный серый: на зелёном это 5.9:1 — выше порога,
	   и оттенок остаётся производным от фона, а не пятым серым в палитре. */
	color:color-mix(in srgb,var(--wp--preset--color--accent-ink) 60%,transparent);
}
/* Утверждение — <p>, а не заголовок: оно промо, а не часть структуры документа.
   text-wrap:pretty, потому что висячее слово в 40px видно с другого конца
   комнаты. */
.ds-banner-strip__title{
	margin:0;font-family:var(--wp--preset--font-family--display);
	font-size:2.5rem;line-height:1.04;text-transform:uppercase;text-wrap:pretty;
}
.ds-banner-strip__cta{
	flex:none;display:inline-flex;align-items:center;gap:.75rem;
	background:var(--wp--preset--color--accent-ink);
	color:var(--wp--preset--color--primary);text-decoration:none;
	font-family:var(--wp--preset--font-family--display);
	font-size:.875rem;letter-spacing:.12em;text-transform:uppercase;
	padding:1.25rem 1.875rem;border-radius:var(--ds-radius-pill);
	transition:transform .2s ease,color .2s ease;
}
.ds-banner-strip__cta:hover{transform:translateX(6px);color:var(--wp--preset--color--contrast)}
/* ⚠️ Фокус-ринг ЧЁРНЫЙ, а не теминый зелёный: на зелёном фоне зелёная обводка
   невидима. Находка брифа, и она верна. */
.ds-banner-strip__cta:focus-visible{
	outline:3px solid var(--wp--preset--color--accent-ink);outline-offset:3px;
}
.ds-banner-strip__cta span{font-size:1rem}
@media (prefers-reduced-motion:reduce){
	.ds-banner-strip__cta{transition:color .2s ease}
	.ds-banner-strip__cta:hover{transform:none}
}
@media (max-width:64rem){
	/* Через переменную, а не padding-block: отступ тянет за собой фазу пипсов. */
	.ds-banner-strip{--ds-band-pad:2.375rem}
	.ds-banner-strip__inner{gap:2rem}
	.ds-banner-strip__title{font-size:1.875rem}
}
/* Ниже 45rem в столбик: пилюля рядом с двухстрочным утверждением оставляет
   тексту меньше половины ширины, и он ломается на слова. */
@media (max-width:45rem){
	.ds-banner-strip{--ds-band-pad:2rem}
	.ds-banner-strip__inner{flex-direction:column;align-items:flex-start;gap:1.5rem}
	.ds-banner-strip__title{font-size:1.5rem}
	.ds-banner-strip__cta{padding:1rem 1.5rem;font-size:.8125rem}
}
.ds-eyebrow{font-family:var(--wp--preset--font-family--body);font-size:0.75rem;letter-spacing:0.22em;text-transform:uppercase;color:var(--wp--preset--color--primary)}
/* --- Хлебные крошки (2026-08-02) -----------------------------------------
   Заняли слот надзаголовка над H1: было «GAMES», стало «Home › Games».
   Гарнитура, кегль и трекинг — те же, что у .ds-eyebrow, и это не лень:
   слот тот же, высота строки та же (19.2px), поэтому H1 не двигается, а сайт
   не получает 18-й кегль — их уже 17 на одной главной (замер записан в
   DESIGN-SYSTEM). Меняется РОЛЬ: надзаголовок модифицировал H1, крошки
   навигируют, поэтому у них появляются состояния ссылки и приглушённая
   текущая страница. Четвёртая роль в таблице мелких капслок-подписей. */
.ds-breadcrumbs__list{
	display:flex;flex-wrap:wrap;align-items:baseline;
	margin:0;padding:0;list-style:none;
}
.ds-breadcrumbs__item{
	font-family:var(--wp--preset--font-family--body);
	font-size:.75rem;letter-spacing:.22em;text-transform:uppercase;line-height:1.6;
}
/* ⚠️ Разделитель рисует CSS, а не разметка: набранный «›» стал бы текстовым
   узлом внутри ссылки и уехал бы в её доступное имя. Альт-текст `/ ""` просит
   браузер не отдавать псевдоконтент в дерево доступности — там, где он ещё не
   поддержан, цена всего лишь лишний символ в озвучке, а не сломанное имя. */
.ds-breadcrumbs__item + .ds-breadcrumbs__item::before{
	content:"\203A" / "";
	margin:0 .5em 0 .35em;
	color:var(--wp--preset--color--text-dim);
	opacity:.7;
}
.ds-breadcrumbs__item a{color:var(--wp--preset--color--primary);text-decoration:none}
.ds-breadcrumbs__item a:hover,
.ds-breadcrumbs__item a:focus-visible{text-decoration:underline}
/* Текущая страница глушится до text-dim: «где я» должно читаться слабее, чем
   «куда можно уйти», иначе цепочка выглядит четырьмя равными ссылками. */
.ds-breadcrumbs__item--current{color:var(--wp--preset--color--text-dim)}
.ds-btn-outline .wp-block-button__link{border-radius:999px}

/* ==========================================================
   R2 — chrome: header, hero (chart + stat row), footer
   ========================================================== */

/* --- Header --- */
.ds-header-row{align-items:center;column-gap:1.75rem;row-gap:.75rem}

/* Wordmark hover: a glow instead of the global link underline.
   Two overrides are needed, not one. theme.json's elements.link.:hover sets
   BOTH textDecoration:underline and colour primary -> primary-dark, so the
   wordmark was also going DARKER on hover. A glow reads as "lit up"; letting
   the text dim underneath it cancels the effect out. Colour is pinned to
   primary here for that reason. */
.wp-block-site-title a{
	transition:text-shadow .18s ease,color .18s ease;
}
.wp-block-site-title a:hover,
.wp-block-site-title a:focus-visible{
	text-decoration:none;
	color:var(--wp--preset--color--primary);
	text-shadow:0 0 14px color-mix(in srgb, var(--wp--preset--color--primary) 60%, transparent);
}
.ds-header-nav{margin-left:.5rem}
.ds-header-nav .wp-block-navigation-item a,
.ds-header-nav .wp-block-navigation-item__content{
	color:var(--wp--preset--color--text-dim);
	font-size:.8125rem;
	font-weight:500;
	letter-spacing:.01em;
	transition:color .16s ease,text-shadow .16s ease;
}
/* NAV LINK HOVER — one rule for both navigations. The header menu and the
   footer's section list are the same kind of thing (a list of site sections),
   so they share a single grammar: dim at rest, brighten with a soft glow, no
   underline. Deliberately in `text` rather than `primary` — the accent stays
   reserved for the brand. Radius 10px, not the wordmark's 14: these are 13px
   glyphs and a wider halo just reads as blur.

   Keep both navigations in THIS rule. Splitting them is how they drifted apart
   in the first place — the footer list was green while the header was dim. */
.ds-header-nav .wp-block-navigation-item a:hover,
.ds-header-nav .wp-block-navigation-item__content:hover,
.ds-header-nav .wp-block-navigation-item a:focus-visible,
.ds-header-nav .wp-block-navigation-item__content:focus-visible,
.ds-footer-linklist a:hover,
.ds-footer-linklist a:focus-visible{
	text-decoration:none;
	color:var(--wp--preset--color--text);
	text-shadow:0 0 10px color-mix(in srgb, var(--wp--preset--color--text) 55%, transparent);
}
/* Compound, not bare: `.ds-header-search` (0,1,0) lost to WP core's
   `.is-layout-flex > :is(*, div) { margin: 0 }` (0,1,1) — `:is()` takes the
   specificity of its heaviest argument, so `div` costs an element there. The
   right-alignment was written into this file from the start and had simply
   never applied; everything sat packed left with 266px of dead rail on the
   right. Dropping back to the bare class silently re-breaks it. */
.ds-header-row .ds-header-search{margin-left:auto}
/* The wrapper owns the height so the field and the button cannot inflate it.
   Before this the search was 62px tall while nothing else in the row passed
   38.8px, which pushed the whole header — and its green rule — 23px down. The
   height is --ds-control-h-md, i.e. the header now sits on the same scale as
   the controls in the tools rather than carrying a number of its own. */
.ds-header-search .wp-block-search__inside-wrapper{
	background:var(--wp--preset--color--surface-2);
	border:1.5px solid var(--wp--preset--color--border-strong);
	border-radius:999px;
	overflow:hidden;
	min-width:15rem;
	box-sizing:border-box;
	height:var(--ds-control-h-md);
	padding:0;
}
.ds-header-search .wp-block-search__input{
	background:transparent;
	border:0;
	color:var(--wp--preset--color--text);
	font-size:.875rem;
	padding-left:1rem;
	/* The button-inside sits over the field's right end, so text ran under it
	   and the placeholder was clipped mid-word ("Search games, strategi"). The
	   field only claimed 188px of a 280px wrapper; let it fill, and reserve the
	   button's width so the text stops before it rather than under it. */
	flex:1 1 auto;
	min-width:0;
	padding-right:2.25rem;
	height:100%;
}
.ds-header-search .wp-block-search__input::placeholder{color:var(--wp--preset--color--muted)}
.ds-header-search .wp-block-search__button{
	background:transparent;
	border:0;
	color:var(--wp--preset--color--text-dim);
	fill:currentColor;
	box-shadow:none;
	height:100%;
	padding:0 .7rem;
}
.ds-header-search .wp-block-search__button:hover{color:var(--wp--preset--color--text)}
.ds-header-cta{flex:0 0 auto;margin:0}
/* Same token height as the search, so the header reads as one line of controls
   instead of three unrelated heights. */
.ds-header-cta .wp-block-button__link{
	box-sizing:border-box;
	display:inline-flex;
	align-items:center;
	height:var(--ds-control-h-md);
	padding:0 1.1rem;
	font-size:.75rem;
}

@media (max-width:781px){
	.ds-header-search{display:none}
	.ds-header-nav{display:none}
}

/* --- Hero --- */
.ds-hero-grid{align-items:center}
.ds-chart-card{width:100%}
.ds-chart-legend{column-gap:1.375rem;margin-bottom:.875rem}
.ds-legend-item{
	display:flex;
	align-items:center;
	gap:.5rem;
	margin:0;
	font-family:var(--wp--preset--font-family--body);
	font-size:.75rem;
	letter-spacing:.08em;
	text-transform:uppercase;
}
.ds-legend-item::before{content:"";display:inline-block;width:1rem;height:3px;border-radius:2px}
.ds-legend-item--ev{color:var(--wp--preset--color--cta)}
.ds-legend-item--ev::before{background:var(--wp--preset--color--cta)}
.ds-legend-item--actual{color:var(--wp--preset--color--primary);margin-left:auto}
.ds-legend-item--actual::before{background:var(--wp--preset--color--primary)}
.ds-chart-svg{display:block;width:100%;height:auto}

.ds-stat-row{column-gap:1.5rem;row-gap:1.5rem}
/* Tiles size to their CONTENT and the row justifies space-between, so the first
   number starts on the rail's left edge and the last label ends on its right —
   the same two verticals the H1 and the casino card above already sit on.
   Equal flex columns did the opposite: the boxes spanned the full rail while
   the text inside stayed left-aligned in each, so the last label stopped 160px
   short and the right side read as unfinished (measured).
   text-align centres the big number over its own label, which was never true
   before — "6" is 81px wide over a 120px caption. */
.ds-stat-big{flex:0 1 auto;text-align:center}
.ds-stat-big__num{margin:0;font-size:2.25rem}
/* Суффикс — ЧАСТЬ ЗНАЧЕНИЯ, а не подпись к нему, поэтому шрифт тот же, что у
   цифры (2026-08-01, было `body`). «10,000» и «BETS» читаются как одно целое,
   а разные гарнитуры внутри одного значения разрывают его на число и ярлык.
   Подпись под плиткой — вот она подпись, и она остаётся Space Grotesk: граница
   проходит там, а не между цифрой и её единицей.
   Кегль остаётся 17px: на 15 суффикс мельчает и снова начинает читаться
   подписью (замерено, _pw/measure-stat-suffix.mjs). Russo One на тех же 17px
   шире Grotesk примерно на 10% — «BETS» 40.9 → 44.8px, на раскладку не влияет,
   плитки сайзятся по контенту. */
.ds-stat-big__suffix{
	font-family:var(--wp--preset--font-family--display);
	font-size:1.0625rem;
	color:var(--wp--preset--color--primary);
	text-transform:uppercase;
	letter-spacing:0;
	margin-left:.125rem;
}
.ds-stat-big__label{margin:.625rem 0 0;font-size:.84375rem;letter-spacing:.02em}

/* --- Footer --- */
.ds-footer-columns{column-gap:3rem}
/* These two are BLOCK HEADINGS, not eyebrows, and the difference is
   structural rather than a matter of taste: every other label in this visual
   family either sits above an H1 and modifies it (STRATEGY, GAME REVIEW, Tool)
   or labels a datum (the statstrip cells). SECTIONS and PLAY RESPONSIBLY are
   the only ones that head a block of content — i.e. they are headings, and the
   type system gives headings the brand face.

   Tracking drops from the eyebrow's 0.22em to --ds-track-caps: Russo One is
   already wide, and eyebrow spacing on top of it reads as gaps, not rhythm. */
/* Scoped to the whole column row, not to named columns: any heading that leads
   a footer column is a block heading by definition, so a new column gets the
   treatment without anyone having to remember to add its class here. */
.ds-footer-columns .ds-eyebrow{
	margin-bottom:1.125rem;
	font-family:var(--wp--preset--font-family--display);
	letter-spacing:var(--ds-track-caps);
}
.ds-footer-linklist{list-style:none;margin:0;padding:0}
.ds-footer-linklist li{margin-bottom:.6875rem}
/* Section list = navigation. It used to sit on the global link colour, i.e. the
   exact same primary as its own SECTIONS label above it — no hierarchy at all.
   The <ul> in footer.html was already marked text-dim; the <a> children were
   overriding it, so this restores the markup's own intent.

   Scoped to this list on purpose: inline links inside the compliance prose
   (affiliate disclosure, methodology, authors) stay green. A list item is
   recognisable by its position, a link inside a paragraph only by its colour.

   The hover state lives with the header nav's — see NAV LINK HOVER above. */
/* text-dim, not muted: links have to be distinguishable from the prose around
   them — that difference IS what makes a link findable. Also fixes contrast,
   muted being 3.91:1 against this background where 4.5 is the AA floor for
   normal text; text-dim is 8.32:1. And it keeps the hover alive: dim -> white
   is a visible change, white -> white would not be. */
.ds-footer-linklist a{
	color:var(--wp--preset--color--text-dim);
	transition:color .16s ease,text-shadow .16s ease;
}
/* Contact line in the brand column. Same quiet-then-brighten grammar as the
   navigations and the badge row, so the footer keeps one interaction language.
   The @ mark carries the accent — it is the only coloured thing in this column
   below the wordmark, which is enough to make the line read as an address
   rather than another sentence. */
.ds-footer-contact{margin:1rem 0 0}
.ds-footer-contact a{
	display:inline-flex;
	align-items:center;
	gap:.45rem;
	color:var(--wp--preset--color--text-dim);
	font-size:.8125rem;
	text-decoration:none;
	transition:color .16s ease,text-shadow .16s ease;
}
.ds-footer-contact svg{display:block;color:var(--wp--preset--color--primary);flex:0 0 auto}
.ds-footer-contact a:hover,
.ds-footer-contact a:focus-visible{
	color:var(--wp--preset--color--text);
	text-decoration:none;
	text-shadow:0 0 10px color-mix(in srgb, var(--wp--preset--color--text) 55%, transparent);
}

.ds-footer-ftc,.ds-footer-author{margin-top:.875rem}
.ds-footer-bottom{
	border-top:1px solid var(--wp--preset--color--border);
	margin-top:2.5rem;
	padding-top:1.5rem;
	column-gap:1rem;
}
.ds-footer-bottom p{margin:0}
/* The © glyph is drawn small and thin in most faces — at 13px muted it all but
   disappeared next to the words beside it. Sized up on its own rather than
   raising the whole line, with the optical shift that a larger inline glyph
   needs so it still sits on the line instead of riding it. */
.ds-copy-mark{font-size:1.35em;line-height:0;vertical-align:-0.06em}

/* Responsible-gambling badge row. Quiet by default and brightening on hover —
   the same grammar as both navigations, so the footer has one interaction
   language rather than three. */
.ds-rg-badges{
	list-style:none;
	display:flex;
	align-items:center;
	flex-wrap:wrap;
	gap:1.25rem;
	margin:0;
	padding:0;
}
/* The <li> must be a flex box too, not just the row. align-items on the row
   centres the <li> boxes; inside a block <li> the text still sits on its own
   baseline, which put the wordmarks ~8px below the centre of the 18+ glyph.
   Centring at both levels is what actually lines them up. */
.ds-rg-badges li{display:flex;align-items:center}
.ds-rg-badge{
	display:inline-flex;
	align-items:center;
	gap:.4rem;
	color:var(--wp--preset--color--muted);
	font-size:.8125rem;
	text-decoration:none;
	transition:color .16s ease,text-shadow .16s ease;
}
.ds-rg-badge:hover,
.ds-rg-badge:focus-visible{
	color:var(--wp--preset--color--text);
	text-decoration:none;
	text-shadow:0 0 10px color-mix(in srgb, var(--wp--preset--color--text) 55%, transparent);
}
/* The age mark is a glyph and NOT a link — it states a fact, it does not lead
   anywhere. So it gets no hover state either: a hover affordance on something
   unclickable is a lie the cursor tells. */
.ds-rg-badge--age{cursor:default}
.ds-rg-badge--age svg{display:block}

@media (max-width:600px){
	.ds-rg-badges{gap:1rem}
}

@media (max-width:600px){
	.ds-footer-bottom{flex-direction:column;align-items:flex-start}
}

/* ==========================================================
   R3 — games surfaces: best-casinos table + orange CTA,
   criteria card, ftc disclosure, strategy pills, eyebrow shells
   ========================================================== */

/* --- Best-casinos table: same card+zebra+mono family as the super-table --- */
.ds-best-casinos{
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--border);
	border-radius:12px;
	padding:.25rem 0 0;
	overflow-x:auto;
	overflow-y:hidden;
}
.ds-best-casinos__table{
	width:100%;
	border-collapse:collapse;
}
.ds-best-casinos__table thead th{
	position:sticky;
	top:0;
	background:var(--wp--preset--color--base);
	font-family:var(--wp--preset--font-family--body);
	font-size:.75rem;
	font-weight:500;
	letter-spacing:.08em;
	text-transform:uppercase;
	color:var(--wp--preset--color--muted);
	text-align:right;
	padding:.85rem 1rem;
	border-bottom:1px solid var(--wp--preset--color--border);
	white-space:nowrap;
}
.ds-best-casinos__table thead th:first-child{text-align:left}
.ds-best-casinos__table tbody td,
.ds-best-casinos__table tbody th{
	padding:.85rem 1rem;
	border-bottom:1px solid var(--wp--preset--color--border);
	text-align:right;
	white-space:nowrap;
	font-family:var(--wp--preset--font-family--body);
	font-size:.84rem;
	color:var(--wp--preset--color--text-dim);
}
.ds-best-casinos__table tbody tr:nth-child(even){background:var(--wp--preset--color--surface-2)}
.ds-best-casinos__table tbody tr:hover{background:color-mix(in srgb, var(--wp--preset--color--primary) 8%, transparent)}
/* Specificity, not source order: `.ds-best-casinos__table tbody th` (0,2,2)
   was beating a bare `.ds-best-casinos__name` (0,1,0), so the CASINO header
   sat left while the casino names were pushed right inside the same column -
   the most visible "crooked" thing in the table. Same story one rule down for
   .ds-bc-extra. Keep these compound; dropping back to the bare class silently
   re-breaks both. */
.ds-best-casinos__table tbody th.ds-best-casinos__name{
	text-align:left;
	font-family:var(--wp--preset--font-family--body);
	font-size:.9375rem;
	font-weight:600;
	color:var(--wp--preset--color--contrast);
	white-space:nowrap;
}
.ds-best-casinos__logo{height:20px;width:auto;vertical-align:middle;margin-right:.5rem}
.ds-best-casinos__empty{color:var(--wp--preset--color--text-dim);font-style:italic;padding:1rem}

/* Play button — the money CTA; orange, must pop */
.ds-cta{
	display:inline-block;
	font-family:var(--wp--preset--font-family--display);
	text-transform:uppercase;
	font-size:.75rem;
	letter-spacing:.04em;
	background:var(--wp--preset--color--cta);
	color:var(--wp--preset--color--cta-ink);
	border-radius:8px;
	padding:.5rem 1rem;
	white-space:nowrap;
	transition:background-color .16s ease;
}
.ds-cta:hover,
.ds-cta:focus-visible{background:#FFB841;color:var(--wp--preset--color--cta-ink)}

/* Details disclosure row + payment chips — polish pass on existing DP-C rules */
.ds-bc-details summary{transition:color .16s ease}
.ds-bc-details summary:hover{color:var(--wp--preset--color--text)}
.ds-bc-chip{background:var(--wp--preset--color--surface-2);font-family:var(--wp--preset--font-family--body)}

/* FTC disclosure — рамка вместо серой строчки (2026-08-02).
   Раскрытие было набрано `muted` без единой границы и терялось между лидом и
   таблицей: FTC просит «clear and conspicuous», а неотличимое от служебной
   подписи этому не отвечает. Рамка + фон поднимают его в самостоятельный блок.

   ⚠️ ЦВЕТ — `caution`, а НЕ оранжевый, хотя оранжевый и просился.
   Оранжевый в теме зарезервирован под конверсию (правило записано там же, где
   заведён четвёртый семантический цвет). Дисклеймер, кричащий громче кнопки,
   разворачивает иерархию страницы против её же цели, а спутать раскрытие с
   призывом — худший исход для страницы с партнёрскими ссылками.
   `caution` — «обрати внимание» без обещания клика, и он не занят на этой
   странице ничем: шкалы риска здесь нет.

   Блок стоит на /games/ и на страницах стратегий; правило общее для обеих,
   потому что требование раскрытия одинаково везде, где есть /go/-ссылки. */
.ds-ftc-disclosure{
	font-size:.8125rem;
	line-height:1.55;
	color:var(--wp--preset--color--text-dim);
	padding:.75rem 1rem;
	border:1px solid color-mix(in srgb,var(--wp--preset--color--caution) 40%,transparent);
	border-left-width:3px;
	border-radius:8px;
	background:color-mix(in srgb,var(--wp--preset--color--caution) 6%,transparent);
}

/* Criteria table: wrap it in the same card look as the super-table/best-casinos */
.ds-criteria{
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--border);
	border-radius:12px;
	padding:1rem 1.25rem;
	border-collapse:separate;
	border-spacing:0;
}
.ds-criteria tbody tr:first-child th,
.ds-criteria tbody tr:first-child td{padding-top:.25rem}

/* "Strategies that work here" post-terms row, styled as outlined chip pills */
.ds-strategy-pills.wp-block-post-terms{display:flex;flex-wrap:wrap;gap:.5rem;align-items:center}
.ds-strategy-pills.wp-block-post-terms .wp-block-post-terms__separator{display:none}
.ds-strategy-pills.wp-block-post-terms a{
	display:inline-block;
	padding:.3rem .8rem;
	border:1px solid var(--wp--preset--color--border-strong);
	border-radius:999px;
	font-size:.8125rem;
	color:var(--wp--preset--color--text-dim);
	transition:border-color .16s ease,color .16s ease;
}
.ds-strategy-pills.wp-block-post-terms a:hover{
	border-color:var(--wp--preset--color--primary);
	color:var(--wp--preset--color--primary);
}

/* Archive/single-game shell rhythm */
.ds-game-intro{color:var(--wp--preset--color--text-dim)}

/* --- /games/ как money-страница: одна ширина на прозу и таблицу (2026-08-02)
   Жалоба владельца: проза кончалась на 913, таблица на 1334 — правая половина
   текстовых секций пустовала, и вёрстка читалась незаконченной.

   Взято СРЕДНЕЕ, а не крайность. Полный рельс 1240 для прозы отвергнут: строка
   Space Grotesk 16px даёт там ~150 знаков против типографской нормы 50–75
   (потолок рекомендаций ~90) — глаз теряет строку на возврате. 62.5rem = 1000px
   держит ~110 знаков: шире нормы осознанно, но читаемо.

   ⚠️ Это ТОКЕН СТРАНИЦЫ, а не подмена сайтового --ds-measure (820px). Тихо
   расширить глобальную меру значило бы решить спор об одной странице ценой
   всех остальных.

   ⚠️ Правило перебивает ядровое `.is-layout-constrained > :where(...)`
   с его `margin-left:auto !important` (то же, что съело margin у стрелки
   секции — дефект №4 в DESIGN-SYSTEM), поэтому селектор двухклассовый и
   отступы объявлены важными: иначе блок центрировался бы вместо левого якоря. */
/* ⚠️ Мера ДОКУМЕНТА, а не только money-страницы (расширено 2026-08-05).
   62.5rem = 1000px против общей меры прозы 820: длинный материал с таблицами
   и картинками на 820 читался колонкой в две трети рельса, а таблицы рядом
   стояли на 1240 — два разных правых края на одной странице.
   Второе имя добавлено, а не заведена копия правил: копия разъезжается, и
   именно так на сайте однажды появились две системы контролов. Тот же приём,
   что у заглушки обложки (`.ds-la__ph, .ds-ai__ph`).
   ⚠️ Переименовать `--ds-games-measure` нельзя без пересмотра
   `verify-games-money` — она сторожит правый край на 1000. */
/* ⚠️ `.ds-tool-prose` ДОБАВЛЕН 2026-08-24 РАДИ ОДНОГО ПРАВОГО КРАЯ. Замер до
   правки на пяти страницах калькуляторов: краёв было ТРИ — 862 у лида под H1
   (правило 60ch), 1093 у гайда и 1333 у всего остального, потому что текст вне
   гайда меры не имел вовсе и растягивался на весь рельс 1240. Ровно те «два
   правых края», ради устранения которых заводилась `--ds-doc-measure`, только
   здесь их было три. */
.ds-games-money,
.ds-article-body,
.ds-tool-prose,
.ds-sim-guide{--ds-games-measure:var(--ds-doc-measure)}

/* Шапка статьи едет на ту же меру, что и её текст.
   ⚠️ Без этого правил мало: заголовок, строка меты и обложка — СОСЕДИ
   `.ds-article-body` внутри `main`, а не его дети, поэтому мера на них не
   распространяется. Замер до правки: проза и таблицы кончались на 1093,
   заголовок и обложка — на 1333. Ровно те два правых края на одной странице,
   из-за которых страница и читалась развалившейся. */
.ds-article-title,
.ds-article-meta,
main > .wp-block-post-featured-image{
	box-sizing:border-box;
	max-width:var(--ds-doc-measure)!important;
	margin-left:max(0px,(100% - var(--wp--style--global--content-size)) / 2)!important;
	margin-right:0!important;
}
.ds-games-money > *:not(.alignfull):not(.alignwide),
.ds-article-body > *:not(.alignfull):not(.alignwide),
.ds-sim-guide > *:not(.alignfull):not(.alignwide),
.ds-tool-prose > *:not(.alignfull):not(.alignwide),
.ds-games-money > .ds-game-table-wrap{
	/* ⚠️ box-sizing ОБЯЗАТЕЛЕН, и его отсутствие уже стоило одного дефекта
	   (2026-08-03). У темы нет глобального border-box, поэтому боковой padding
	   карточек прибавлялся к max-width: формула, разбивка и график выходили на
	   1047/1062/1050 против 1000 у прозы — то есть ровно то расхождение краёв,
	   ради устранения которого вся эта мера и заводилась. Поймала приёмка,
	   когда стала сверять ПРАВЫЙ край, а не только левый.
	   Записанное правило темы: любой новый max-width уже рельса едет вместе с
	   box-sizing. */
	box-sizing:border-box;
	max-width:var(--ds-games-measure)!important;
	margin-left:max(0px,(100% - var(--wp--style--global--content-size)) / 2)!important;
	margin-right:0!important;
}
/* Таблица внутри своей обёртки тянется на всю ширину — обёртка её и ограничивает. */
.ds-games-money .ds-game-table-wrap{width:100%}
/* Плотность ячейки (0.75rem по бокам вместо 1rem — на девяти колонках это
   почти сто пикселей контенту) ПЕРЕЕХАЛА В САМ БЛОК 2026-08-03, в его правило
   `th, td`. Здесь правила больше нет, и это не уборка ради уборки: страничный
   селектор `.ds-games-money .ds-game-table td` весит (0,2,1) и перебивал
   мобильное `.ds-game-table tbody tr td` (0,1,3) — карточки на телефоне молча
   сохраняли боковой отступ таблицы, из-за чего кнопка Play не разворачивалась
   на всю ширину. Одно значение — одно место; страница больше не переопределяет
   геометрию, которой владеет блок. */

/* Тот же локальный откат ядровой подмены, что стоит на главной
   (`.ds-home-section h2`), — дефект №4: theme.json просит у h2 токен
   x-large = 2.125rem, а ядро подставляет свои 42px, потому что тема v3 не
   выключила defaultFontSizes. На 42px «Dice game comparison — the super-table»
   и «Why the price differs from casino to casino» ломались на две строки.
   Правило снимется само, когда пройдёт сайтвайдный проход по типографике.

   ⚠️ h3 ОБЯЗАН ехать следом, и это не украшение. Ядро держит h3 на 36px, то
   есть после починки одного лишь h2 (42 → 34) заголовок ТРЕТЬЕГО уровня стал
   бы КРУПНЕЕ второго — иерархия перевернулась бы вверх ногами, и заметно это
   ровно на этой странице, где семь h3 в FAQ стоят под h2 «FAQ».
   Поймано замером сразу после правки h2; порядок кеглей теперь сторожит
   приёмка (h1 > h2 > h3 > проза), чтобы следующая точечная правка кегля не
   перевернула его молча. 1.375rem держит h3 выше прозы (ядровые 20px), но
   ниже h2 — та же пропорция, что в шкале темы (19 при базе 16).

   ⚠️ h2 сбавлен ещё раз, 34 → 30 (2026-08-03), уже не как отмена ядра, а как
   выбор кегля: при H1 48 шаг 48/30 = 1.6 держит два уровня различимыми, а
   34 давало 1.41 — на глаз это «почти один размер». Ниже h3 22 и проза 20
   не тронуты, порядок сторожит приёмка. */
/* ⚠️ `.ds-article-body` УШЁЛ ОТСЮДА 2026-08-24 (просьба владельца: «может у
   articles так же сделаем h2 24 и текст 16, как в dice simulator»). Статьи
   перешли на лесенку гайда — правила ниже, ищите `.ds-sim-guide h2` рядом с
   `.ds-article-body`. Здесь остался ОДИН `.ds-games-money`: архив `/games/` и
   хаб `/tools/` — это страницы-витрины с таблицей, не длинный текст, и кегль им
   не трогали.

   Не возвращать сюда имя статей «для единообразия»: две записи на один элемент
   разъедутся, а побеждать будет нижняя по порядку — то есть правка тут окажется
   молча мёртвой. */
.ds-games-money h2{font-size:1.875rem;line-height:1.05}
.ds-games-money h3{font-size:1.375rem;line-height:1.2}
/* Четвёртый уровень в присланных статьях встречается; без правила он берёт
   ядровый `medium` 20px и садится вровень с прозой.

   ⚠️ 18 → 17 (2026-08-24), вынужденно: проза статей стала 16, а h3 — 18, и
   прежние 1.125rem поставили бы h4 ВРОВЕНЬ С h3. 1.0625rem держит его между
   ними. Замера у правила сейчас нет — h4 не встречается ни в одной из четырёх
   статей (проверено обходом), — поэтому число выбрано по лесенке, а не по
   экрану; появится h4 в тексте — посмотреть глазами. */
.ds-article-body h4{font-size:1.0625rem;line-height:1.3}

/* Картинка не бывает выше экрана (2026-08-24, решение владельца).

   ⚠️ ПОВОД — ЗАМЕР, А НЕ ВКУС. В статьях 12 картинок, все шириной в колонку
   (1000). Девять выходят 563 в высоту, две по 750, а одна — «How distributions
   change as dice» в `dice-probability-charts` — **1250**, то есть ВЫШЕ ОКНА
   ноутбука: увидеть её целиком нельзя, надо прокручивать саму иллюстрацию.
   Правило заводится ради неё и ради таких же в будущих статьях.

   ⚠️ 85vh, А НЕ 80 И НЕ 70, И ЧИСЛО ВЫБРАНО ЗАМЕРОМ. Порог обязан щадить
   НОРМАЛЬНЫЕ картинки: при 85vh обычные 563 остаются нетронутыми на любом окне
   выше 663px, то есть практически всегда, — а режется только выброс. При 80vh
   на окне 900 под нож попадают и две картинки по 750 ради выигрыша в 40px, и
   каждая срезанная становится уже колонки, то есть заводит второй правый край
   на странице. Цена ошибки здесь — не «чуть меньше», а рваный край у трёх
   картинок вместо одной.

   ⚠️ `width:auto` ОБЯЗАТЕЛЕН РЯДОМ С `max-height`, иначе картинка СПЛЮЩИТСЯ.
   У `<img>` в разметке есть атрибуты width/height, и они дают ширине заданное
   значение; при заданной ширине ограничение высоты не пересчитывает ширину, а
   давит пропорцию. С `width:auto` работает правило подгонки замещаемых
   элементов: ширина считается от высоты, пропорция цела. Проверено замером —
   1000×1250 становится 612×765, отношение сторон то же.

   ⚠️ Режем ПРОПОРЦИОНАЛЬНО, а не `object-fit:cover`. Все двенадцать картинок —
   схемы и графики, у них по краям подписи и оси; кроп съел бы данные. Лучше
   картинка уже колонки, чем картинка без половины смысла.

   Скоуп — статьи. У гайдов под инструментами (`.ds-sim-guide`) и на
   money-страницах картинок в тексте сейчас нет; понадобится — добавить имя
   сюда, а не заводить копию правила. */
.ds-article-body figure img{max-height:85vh;width:auto}

/* H1 сбавлен 56 → 48 (2026-08-03, замечание владельца «h1 и h2 чуть поменьше»).
   Замер, который решил вопрос: на всех шести внутренних шаблонах H1 = 56px, а
   собственный H1 ГЕРОЯ ГЛАВНОЙ на 1440 — 52px (`clamp(2.25rem,5vw,3.25rem)`).
   То есть заголовок внутренней страницы кричал ГРОМЧЕ титульного экрана сайта:
   иерархия вверх ногами, и на money-странице это било по главному — таблице,
   ради которой сюда и приходят.

   ⚠️ clamp, а не плоские 3rem, и это не педантизм. Токен xx-large флюидный
   (min 2.25rem), поэтому плоское значение подняло бы мобильный H1 с 36px до 48
   — «уменьшили заголовок» обернулось бы его ростом на телефоне. Формула
   повторяет ту, что уже стоит у `.ds-hero-h1`: тот же пол, ниже только потолок.

   Скоуп — страница, а не токен: 56px приходит из xx-large и живёт на шести
   шаблонах сразу. Правка токена — это сайтвайдный проход по типографике из
   очереди, и делать его боком, ради одной страницы, значило бы менять шесть
   шаблонов без замера каждого. Здесь действует записанное правило темы: до
   решения по defaultFontSizes размер, которому важна точность, ставится явным
   значением в скоуп-классе. */
/* ⚠️ `.ds-tool-prose h1` ДОБАВЛЕН 2026-08-24 — ЭТО НЕ НОВОЕ РЕШЕНИЕ, А ДОВЕДЁННОЕ
   СТАРОЕ. Разбор выше сделан 2026-08-03 и накрыл money-страницу и статьи, а пять
   калькуляторов остались на ядровых 56, потому что у них не было ни одного
   скоуп-класса, к которому можно было прицепиться. То есть довод «H1 внутренней
   страницы кричит громче героя главной» действовал и там, просто некуда было
   записать. Класс появился — правило доехало. Решение владельца 2026-08-24 из
   трёх вариантов (48 · 38 как у симулятора · оставить 56).

   ⚠️ Страница симулятора СЮДА НЕ ВХОДИТ и остаётся на 38: её H1 печатает сам
   блок в составе «головы» макета 13a, это отдельный компонент со своей мерой. */
/* ⚠️ `.ds-hub-title` ДОБАВЛЕН 2026-08-27 — ТРЕТИЙ РАЗ ТА ЖЕ ИСТОРИЯ, И ЭТО НЕ
   новое решение. Просьба владельца: «размер подгоним как у других страниц,
   заголовок сейчас большой, приведём к варианту как у tools / articles». Замер
   по шести шаблонам: везде 48, и только хаб `/strategies/` остался на 56 —
   ровно тот остаток, про который комментарий у `.ds-ai__title` писал
   «остальные листинги пока на 56, это сайтвайдный проход из очереди».
   Класса, к которому прицепиться, у архива не было — как у калькуляторов
   2026-08-24. Появился класс — правило доехало. */
.ds-games-money h1,
.ds-tool-prose > h1,
.ds-article-title{font-size:clamp(2.25rem,5vw,3rem);line-height:1.06}

/* Ритм секций. До этого страница жила НА ОДНОМ ЗАЗОРЕ: blockGap 24px стоял и
   между абзацами одной мысли, и между концом таблицы и заголовком новой
   секции. Поэтому «How we rank» читался подписью к таблице, а не началом
   раздела — воздуха над ним было ровно столько же, сколько над следующим
   абзацем.

   4rem — ступень шкалы; отрисованы 3 и 4 (`_pw/games-gap-variants.mjs`).
   3rem хватает после прозы, но здесь секция открывается ПОСЛЕ КАРТОЧКИ с
   рамкой и заливкой: тяжёлый край тянет заголовок к себе, и 45px чернил ещё
   читаются как подпись к ней. На 4rem — 61px, и шов однозначен.
   Ниже главной с её `margin-block:5rem`: там граница между разными секциями
   страницы, здесь — между частями одного материала. */
.ds-games-money > h2,
.ds-article-body > h2,
.ds-sim-guide > h2{margin-top:4rem}

/* FAQ двумя колонками (внешний макет 11a, 2026-08-03).

   Шелл намеренно тот же, что у супертаблицы выше: тот же фон страницы, та же
   рамка, тот же радиус 20px. Два блока читаются одним семейством объектов, а не
   двумя разными карточками.

   ⚠️ Пропорции ПЕРЕСЧИТАНЫ под нашу меру, а не взяты из макета. Там шелл 1440 и
   колонка ответа 660px; у нас мера 1000, и макетные 400 на вопрос плюс 56
   зазора оставили бы ответу 448px — около 55 знаков, то есть УЖЕ, чем в макете,
   при том что короткая строка и есть смысл раскладки. 300 + 40 дают ответу
   ~578px и искомые 65–70 знаков. */
/* ⚠️ Ни рамки, ни фона, ни паддингов (2026-08-03, второй проход правок).
   Карточка была лишним объектом: заголовок FAQ из-за неё сидел с отступом от
   левого края страницы, не совпадая с соседними секциями. Теперь блок — просто
   поток, а список держат разделители строк. */
.ds-qa{margin-top:1.5rem}
/* Линия сверху у КАЖДОЙ строки, включая первую: она отделяет список от
   заголовка, поэтому отдельного разделителя под ним не нужно. */
.ds-qa__row{
	display:grid;
	/* ⚠️ Ширины НЕ свободны. Левый край колонки вопроса обязан совпасть с краем
	   заголовка, правый край ответа — с краем прозы выше, поэтому сумма трёх
	   величин жёстко равна мере блока. На мере /games/ (1000px) это 360 + 40 +
	   600: ответу достаётся ~72 знака. При 300 на вопрос ответу досталось бы 660
	   и ~79 знаков, то есть выравнивание краёв покупалось бы более ДЛИННОЙ
	   строкой — ровно той, от которой двухколоночная раскладка и уходила.
	   Побочно 360 снимает переносы заголовков вопросов в три строки.

	   ⚠️ ДОЛИ, А НЕ ПИКСЕЛИ, и это не вкусовое. Блок поедет в статьи, а там
	   мера прозы 820px против 1000 здесь: фиксированные 360+600 вылезли бы за
	   правый край прозы на 180px и сломали бы ровно то выравнивание, ради
	   которого всё и затевалось. 36% + 4% + 60% держат обе границы на любой
	   мере; на 820 ответу останется ~59 знаков — короче, но в норме. */
	grid-template-columns:36% 60%;
	gap:4%;
	padding-top:1.625rem;
	margin-top:1.625rem;
	border-top:1px solid var(--wp--preset--color--border);
}
.ds-qa__row:first-child{margin-top:0}
.ds-qa__q{display:flex;gap:.875rem}
/* Номер приглушён намеренно: это индекс, а не место в рейтинге. Контраст
   ниже основного текста — и потому он aria-hidden, читателю скринридера
   порядковый номер даёт сам список. */
.ds-qa__num{
	font-family:var(--wp--preset--font-family--display);
	font-size:.75rem;
	line-height:1;
	padding-top:.3125rem;
	color:var(--wp--preset--color--primary-dark);
}
/* ⚠️ ВЕС СЕЛЕКТОРА ПОДНЯТ ЛИШНИМ `.ds-qa` (2026-08-24), и это не украшение.
   FAQ живёт ВНУТРИ `.ds-article-body`, а у статей 2026-08-24 появились свои
   правила на `h3` и `p` (18 и 16). Вес у `.ds-qa__q h3` и `.ds-article-body h3`
   одинаковый, поэтому побеждал тот, что ниже по файлу, — статейный, стоящий на
   700 строк дальше. Замер поймал это сразу после правки: вопрос FAQ вырос 17 →
   18, а ответ уехал бы 15 → 16.

   Компонент обязан владеть своим кеглем: у него собственная шкала (вопрос
   капслоком 17, ответ 15), не выведенная из статейной лесенки. Лишний класс
   даёт ему вес (0,2,1) против (0,1,1) и снимает зависимость от порядка строк —
   иначе любая будущая правка типографики статей молча двигала бы FAQ. */
.ds-qa .ds-qa__q h3{
	margin:0;
	font-family:var(--wp--preset--font-family--display);
	font-size:1.0625rem;
	line-height:1.3;
	text-transform:uppercase;
	color:var(--wp--preset--color--contrast);
	text-wrap:pretty;
}
.ds-qa__a{display:flex;flex-direction:column;gap:.875rem}
.ds-qa .ds-qa__a p{
	margin:0;
	font-size:.9375rem;
	line-height:1.65;
	color:var(--wp--preset--color--text-dim);
	text-wrap:pretty;
}
/* Плитка с числом: та же грамматика, что у врезки-формулы в «How we rank» —
   левая граница primary плюс подложка. Роль та же: «вот число, которое стоит
   запомнить», и второй визуальный язык для неё заводить незачем.
   ⚠️ Плитка не повторяет цифру из соседнего предложения — число вынесено ИЗ
   него, иначе одна величина печаталась бы дважды в трёх строках из семи. */
.ds-qa__fact{
	display:inline-flex;
	align-self:flex-start;
	align-items:center;
	gap:.625rem;
	background:color-mix(in srgb,var(--wp--preset--color--primary) 6%,transparent);
	border:1px solid var(--wp--preset--color--border);
	border-left:2px solid var(--wp--preset--color--primary);
	border-radius:0 8px 8px 0;
	padding:.6875rem 1rem;
}
.ds-qa__fact-value{
	font-family:var(--wp--preset--font-family--display);
	font-size:.9375rem;
	color:var(--wp--preset--color--primary);
}
.ds-qa__fact-label{
	font-family:var(--wp--preset--font-family--body);
	font-size:.6875rem;
	font-weight:700;
	letter-spacing:.14em;
	text-transform:uppercase;
	color:var(--wp--preset--color--muted);
}
/* Ниже 62rem колонки схлопываются, а ответ отступает под заголовок: без
   отступа он теряет связь с вопросом, к которому относится. */
/* Ниже 62rem фиксированные 360 + 600 не помещаются, колонки схлопываются.
   Ответ отступает под заголовок: без отступа он теряет связь с вопросом. */
@media (max-width:62rem){
	.ds-qa__row{grid-template-columns:1fr;gap:1rem;padding-top:1.375rem;margin-top:1.375rem}
	.ds-qa__a{padding-left:1.625rem}
}
@media (max-width:40rem){
	/* Вес поднят по той же причине, что у десктопного правила выше: медиазапрос
	   специфичности НЕ добавляет, а статейное `h3` стоит ниже по файлу и без
	   `.ds-qa` перебивало бы этот кегль на телефоне. */
	.ds-qa .ds-qa__q h3{font-size:1rem}
}

/* Стамп проверки данных (макет 9a, 2026-08-03). Заменил строку прозы
   «Data last verified: … · How we rank»: дата стояла предложением в ряду
   предложений, а это ПАСПОРТ материала. Пилюля отделяет его от текста, не
   повышая в кегле.

   ⚠️ Пульсации у точки нет намеренно. Пульсирующая точка — конвенция живого
   потока данных; здесь дата РУЧНОЙ проверки, и анимация обещала бы обновление
   в реальном времени, которого не существует.

   ⚠️ inline-flex, а не align-self:flex-start из макета: элемент не во
   флекс-контейнере, и ширину по содержимому даёт только он. Левый якорь
   наследуется от правила прозы .ds-games-money. */
/* ⚠️ margin-top 1rem, а не общий blockGap. H1 идёт с line-height 1.06, его
   бокс плотно обжимает строку, и пилюля на голом blockGap наезжала на чернила
   заголовка НА 1.2px — замерено, глазом читалось как «прилипла». Тот же закон,
   что у секции после карточки с рамкой: рамка на общем зазоре читается теснее
   текста, потому что у неё есть край.
   1rem — ступень шкалы. Она же держит правильную привязку: до H1 остаётся ~15px
   чернил, до лида 27, то есть стамп принадлежит заголовку, а не абзацу. */
.ds-verified{
	display:inline-flex;
	align-items:center;
	gap:.625rem;
	margin:1rem 0 0;
	padding:.5rem 1rem;
	border:1px solid color-mix(in srgb,var(--wp--preset--color--primary) 35%,var(--wp--preset--color--border));
	border-radius:999px;
	background:color-mix(in srgb,var(--wp--preset--color--primary) 7%,transparent);
}
.ds-verified__dot{
	width:7px;
	height:7px;
	border-radius:50%;
	background:var(--wp--preset--color--primary);
	box-shadow:0 0 10px color-mix(in srgb,var(--wp--preset--color--primary) 80%,transparent);
}
.ds-verified__label{
	font-family:var(--wp--preset--font-family--body);
	font-size:.6875rem;
	font-weight:700;
	letter-spacing:.16em;
	text-transform:uppercase;
	color:var(--wp--preset--color--muted);
}
.ds-verified__date{
	font-family:var(--wp--preset--font-family--display);
	font-size:.75rem;
	letter-spacing:.06em;
	color:var(--wp--preset--color--primary);
}
/* Устаревший стамп: зелёного не остаётся НИГДЕ — ни в точке, ни в дате, ни в
   рамке. Половинчатое приглушение (серая дата при зелёной точке) читалось бы
   оформлением, а не предупреждением. */
.ds-verified--stale{
	border-color:var(--wp--preset--color--border);
	background:transparent;
}
.ds-verified--stale .ds-verified__dot{
	background:var(--wp--preset--color--muted);
	box-shadow:none;
}
.ds-verified--stale .ds-verified__date{color:var(--wp--preset--color--muted)}

/* --- How we rank: формула + разбивка на одном примере (2026-08-03) --------
   Замена идеи «столбчатый график по шести казино» — она дублировала бы
   таблицу, которая и так стоит над блоком и сортируется лучше картинки.
   Вместо неё — врезка-формула и карточка с арифметикой ОДНОГО примера,
   в готовой грамматике сайта: border+surface+radius уже трижды несёт «сводка
   в рамке» (криterии, best-casinos, раскрытие FTC), здесь тот же приём с
   другим наполнением, а не новый визуальный язык. */

/* Формула: зелёная левая граница — та же конструкция, что у раскрытия FTC
   (border-left + tint фона), но другой цвет и потому другой смысл: caution
   там значит «внимание», primary здесь значит «вот механика», а не тревога. */
.ds-rank-formula{
	border-left:3px solid var(--wp--preset--color--primary);
	background:color-mix(in srgb,var(--wp--preset--color--primary) 7%,transparent);
	border-radius:0 8px 8px 0;
	padding:1rem 1.375rem;
	margin:1.4em 0;
}
.ds-rank-formula__main{
	margin:0;
	font-family:var(--wp--preset--font-family--display);
	font-size:1.0625rem;
	letter-spacing:.01em;
	text-transform:uppercase;
}
/* Вложенная строка: раскрывает ВТОРОЙ ЧЛЕН формулы выше. Кегль меньше, цвет
   приглушён, отступ слева — это подчинённая мысль, а не вторая равная формула.
   Так две одинаковые на вид врезки, стоявшие в разных концах секции, свелись
   в одну (замечание владельца: «а эти два бланка не про одно и то же?»). */
.ds-rank-formula__nested{
	margin:.375rem 0 0;
	padding-left:1.125rem;
	font-family:var(--wp--preset--font-family--display);
	font-size:.875rem;
	letter-spacing:.01em;
	text-transform:uppercase;
	color:var(--wp--preset--color--text-dim);
}
.ds-rank-formula__sub{
	margin:.625rem 0 0;
	font-family:var(--wp--preset--font-family--body);
	font-size:.84375rem;
	line-height:1.55;
	color:var(--wp--preset--color--text-dim);
}

/* Разбивка: карточка в грамматике .ds-criteria/.ds-hero-top5 (surface+border+
   radius), внутри — четыре шага арифметики со знаками действий, НЕ оси и
   столбцы графика. tabular-nums на значениях — та же конвенция, что у чисел
   в супертаблице и стат-ряде героя. */
.ds-rank-worked{
	border:1px solid var(--wp--preset--color--border);
	background:var(--wp--preset--color--surface);
	border-radius:12px;
	padding:1.625rem 1.875rem 1.5rem;
	margin:1.6em 0 1.8em;
}
.ds-rank-worked__label{
	margin:0 0 1.375rem;
	font-family:var(--wp--preset--font-family--display);
	font-size:.75rem;
	letter-spacing:.14em;
	text-transform:uppercase;
	color:var(--wp--preset--color--muted);
}
.ds-rank-worked__row{
	display:grid;
	grid-template-columns:1fr auto 1fr auto 1fr auto 1fr;
	align-items:center;
	gap:.625rem;
}
.ds-rank-worked__step{display:flex;flex-direction:column;gap:.375rem}
.ds-rank-worked__val{
	font-family:var(--wp--preset--font-family--display);
	font-size:1.625rem;
	line-height:1;
	letter-spacing:.01em;
	font-variant-numeric:tabular-nums;
}
/* ⚠️ Edge charged НЕ красный. Красный на странице значит «край заметно хуже
   нормы» (2.00% у BC.Game) — у дешевейшей строки край почти всегда один из
   лучших, и тревожный цвет здесь был бы неверным сигналом. Оставлен
   унаследованный `--ink` (нейтральный), окрашены только rakeback (находка) и
   результат (тот же primary, что у зелёной цены в колонке Cost/$1k). */
.ds-rank-worked__val--rakeback{color:var(--wp--preset--color--primary)}
.ds-rank-worked__val--result{color:var(--wp--preset--color--primary);font-size:1.9375rem}
.ds-rank-worked__cap{font-size:.75rem;color:var(--wp--preset--color--muted);line-height:1.4}
.ds-rank-worked__op{
	font-family:var(--wp--preset--font-family--display);
	font-size:1.25rem;
	color:var(--wp--preset--color--muted);
	text-align:center;
	padding-top:.875rem;
}
.ds-rank-worked__step--result{
	padding-left:1rem;
	border-left:1px solid var(--wp--preset--color--border);
}
@media (max-width:40rem){
	.ds-rank-worked__row{grid-template-columns:1fr;gap:1rem}
	.ds-rank-worked__op{display:none}
	.ds-rank-worked__step--result{
		padding-left:0;border-left:0;
		border-top:1px solid var(--wp--preset--color--border);padding-top:.875rem;
	}
}

/* --- Sources: тонкая линия сверху, а не рамка disclosure (2026-08-03) -----
   Рамка FTC-раскрытия несёт юридический вес (FTC требует «clear and
   conspicuous»), Sources — это доверие, а не требование закона. Покрасить их
   одной рамкой значило бы уравнять «обязано быть заметным» с «просто
   честность», а страница и так держит три рамки (disclosure, formula,
   worked) — четвёртая подряд превращает редакционную страницу в чек-лист.
   Черта сверху — конвенция сноски/цитаты в журнале: отделяет блок от текста,
   ничего не крадёт из веса легального раскрытия. */
.ds-games-sources{
	border-top:1px solid var(--wp--preset--color--border);
	padding-top:.875rem;
	margin-top:1.5em;
}

/* ==========================================================
   R4 — strategies surfaces: strategy-card component (fixes
   title-overlap: the card container never had a box), plus
   statstrip/quickjump/proscons/faq/equity-curve card polish
   ========================================================== */

/* --- Strategy card: the block wrapper article never had a box,
   so h3 titles overflowed into neighbouring grid cells. Block-flow
   layout (no flex) per design brief — simplest robust fix without
   markup changes. --- */
/* :not(.ds-strategy-ring) — the block renders two presentations of one record
   (see the block's render.php). Everything BOXY belongs to the card variant
   only; the risk-colour rules just below stay unscoped, because both variants
   colour themselves from the same --ds-risk. */
.wp-block-dicestrategies-strategy-card:not(.ds-strategy-ring){
	display:block;
	min-width:0;
	/* box-sizing is what makes height:100% mean 100%. Without it the card took
	   the grid cell's height and then ADDED its own 1.25rem padding and 1px
	   border on top: cell 227.22px, card 269.2px, overflowing its own cell by
	   exactly 42px (227.22 + 40 + 2, matched to the decimal).
	   It went unseen because nothing followed inside the section — the tools
	   launcher below has its own margin, which swallowed the overhang. It
	   surfaced the moment a "View all" link was placed under the grid and
	   landed 18px inside the cards.
	   Third instance of this exact trap in the theme after the press rail and
	   the control scale: a dimension token means the OUTER box, and padding
	   does not get to grow it. */
	box-sizing:border-box;
	height:100%;
	/* relative — база и для акцентной линии, и для растянутой ссылки;
	   overflow — чтобы линия не торчала за скруглённые углы. */
	position:relative;
	overflow:hidden;
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);
	padding:1.625rem 1.5rem 1.5rem;
	transition:border-color .25s ease,transform .25s ease,box-shadow .25s ease;
}
/* Риск красит всю карточку одним цветом — линию, шкалу, подпись и ОЦЕНКУ.
   В присланном дизайне цвет оценки был бинарным (красный при высоком риске,
   зелёный иначе), а шкала троичной, из-за чего карточка среднего риска
   говорила «MEDIUM» янтарём и «6.8» зелёным — два вердикта об одной
   стратегии. Одна переменная на всё убирает противоречие в корне.
   Средний — `caution`, а НЕ `cta`: оранжевый в системе зарезервирован под
   конверсионные кнопки, и 42px оранжевого стали бы самым крупным оранжевым
   объектом на экране (на /strategies/ — рядом с настоящей кнопкой). */
.wp-block-dicestrategies-strategy-card{--ds-risk:var(--wp--preset--color--muted)}
.wp-block-dicestrategies-strategy-card[data-ds-risk~="low"]{--ds-risk:var(--wp--preset--color--primary)}
.wp-block-dicestrategies-strategy-card[data-ds-risk~="medium"]{--ds-risk:var(--wp--preset--color--caution)}
.wp-block-dicestrategies-strategy-card[data-ds-risk~="high"]{--ds-risk:var(--wp--preset--color--danger)}

.wp-block-dicestrategies-strategy-card:not(.ds-strategy-ring):hover{
	border-color:var(--wp--preset--color--border-strong);
	transform:translateY(-4px);
	box-shadow:0 22px 44px -22px rgba(20,244,111,.45);
}
/* Подъём — движение, и оно снимается по просьбе системы. Рамка и тень
   остаются: наведение должно остаться заметным без анимации. */
@media (prefers-reduced-motion:reduce){
	.wp-block-dicestrategies-strategy-card:not(.ds-strategy-ring){transition:border-color .16s ease,box-shadow .16s ease}
	.wp-block-dicestrategies-strategy-card:not(.ds-strategy-ring):hover{transform:none}
}

.ds-strategy-card__accent{
	position:absolute;top:0;left:0;right:0;height:2px;
	background:linear-gradient(90deg,var(--ds-risk),transparent);
}
.ds-strategy-card__title{
	margin:0 0 1.25rem;
	font-family:var(--wp--preset--font-family--display);
	font-size:1.1875rem;
	line-height:1.2;
	letter-spacing:.02em;
	text-transform:uppercase;
}
.ds-strategy-card__title a{
	color:var(--wp--preset--color--contrast);
	text-decoration:none;
}
/* Растянутая ссылка: мишенью становится вся карточка, но ссылка остаётся
   ОДНА и её имя — заголовок. Второй, безымянный оверлей-линк дал бы
   скринридеру «ссылка» без единого слова о том, куда она ведёт. */
.ds-strategy-card__title a::after{content:"";position:absolute;inset:0}
.wp-block-dicestrategies-strategy-card:hover .ds-strategy-card__title a{color:var(--wp--preset--color--primary)}

.ds-strategy-card__score{
	margin:0 0 1.25rem;
	font-family:var(--wp--preset--font-family--display);
	font-size:2.625rem;
	line-height:1;
	color:var(--ds-risk);
	font-variant-numeric:tabular-nums;
}
.ds-strategy-card__score span{
	font-family:var(--wp--preset--font-family--body);
	font-size:.875rem;
	color:var(--wp--preset--color--muted);
	margin-left:.375rem;
}

.ds-strategy-card__meter{display:flex;flex-direction:column;gap:.5rem;margin:0 0 1.25rem}
.ds-strategy-card__meter-head{
	display:flex;justify-content:space-between;
	font-size:.625rem;letter-spacing:.18em;text-transform:uppercase;
	color:var(--wp--preset--color--muted);
}
.ds-strategy-card__risk{color:var(--ds-risk)}
/* Шкала несёт точность, которой слово не несёт: «medium» это 3 из 5, а не
   просто «между». Незажжённые деления остаются видимыми — иначе непонятно,
   из скольких. */
.ds-strategy-card__pips{display:flex;gap:.25rem}
.ds-strategy-card__pips i{flex:1;height:4px;border-radius:2px;background:var(--wp--preset--color--border)}
.ds-strategy-card__pips i.is-on{background:var(--ds-risk)}

.ds-strategy-card__tldr{
	margin:0;
	font-size:.84375rem;
	line-height:1.65;
	color:var(--wp--preset--color--text-dim);
	text-wrap:pretty;
}
.ds-strategy-grid .wp-block-post-template{gap:1rem}

/* --- Strategy RING (front page, design pass 2a) -------------------------
   Второе исполнение того же блока: не коробка, а коническая шкала. Разбор с
   отвергнутым — docs/design-mockups/home-strategy-rings.html.

   Ставка дизайна: одна фигура несёт обе метрики сразу — длина дуги это оценка,
   цвет дуги это риск. Карточка 1a говорила то же самое тремя элементами
   (число, шкала, подпись); здесь их два, и читаются они с расстояния, с
   которого текст ещё не читается вовсе. */
.ds-strategy-rings .wp-block-post-template{gap:1.75rem}

.ds-strategy-ring{
	display:flex;flex-direction:column;align-items:center;gap:1.25rem;
	padding:1.75rem 1.25rem;
	border-radius:var(--ds-radius-panel);
	text-align:center;
	position:relative;
	transition:background-color .25s ease;
	/* Подложка наведения — производная от цвета риска, а не третий цвет: тогда
	   развёрнутый текст может взять ЕЁ ЖЕ и совпасть с плиткой по построению,
	   а не по совпадению двух записанных значений. */
	--ds-tint:color-mix(in srgb,var(--wp--preset--color--primary) 5%,var(--wp--preset--color--base));
}
.ds-strategy-ring[data-ds-risk~="high"]{--ds-tint:color-mix(in srgb,var(--wp--preset--color--danger) 5%,var(--wp--preset--color--base))}
.ds-strategy-ring:hover,.ds-strategy-ring:focus-within{background:var(--ds-tint);z-index:2}

/* Два элемента вместо одного, и это замер, а не вкус: `mask` обрезает всё, что
   элемент рисует, включая box-shadow. С маской и свечением на одном узле у
   верхнего кольца свечения просто не было. */
.ds-strategy-ring__dial{
	position:relative;width:150px;height:150px;border-radius:50%;
	display:grid;place-items:center;
}
.ds-strategy-ring__track{
	position:absolute;inset:0;border-radius:50%;
	background:conic-gradient(var(--ds-risk) 0 var(--ds-arc,0%),var(--wp--preset--color--border) var(--ds-arc,0%) 100%);
	-webkit-mask:radial-gradient(closest-side,transparent 79%,#000 80%);
	        mask:radial-gradient(closest-side,transparent 79%,#000 80%);
}
/* Отверстие прорезано маской, а НЕ кружком цвета страницы. Кружок — это
   утверждение «под секцией всегда ровно этот цвет»; оно неверно уже сейчас
   (бриф рисовал на #070907, у темы --base #07090A) и сломается о любую
   подложку под секцией. Маска на одно правило дороже и устареть не может. */

.ds-strategy-ring__val{
	position:relative;
	font-family:var(--wp--preset--font-family--display);
	font-size:2.375rem;line-height:1;
	color:var(--wp--preset--color--contrast);
	font-variant-numeric:tabular-nums;
}
.ds-strategy-ring__max{
	display:block;margin-top:2px;
	font-family:var(--wp--preset--font-family--body);
	font-size:.6875rem;color:var(--wp--preset--color--muted);
}
/* Верхняя оценка сайта — не лучшая из четырёх на экране (см.
   dicestrategies_top_strategy_rating). Свечение и цифра берут цвет РИСКА, а не
   зелёный: это тот же урок, что развёл цвета в карточках 1a — иначе стратегия
   среднего риска светилась бы зелёным поверх янтарной дуги, два вердикта об
   одном. */
.ds-strategy-ring.is-top .ds-strategy-ring__dial{box-shadow:0 0 46px -14px color-mix(in srgb,var(--ds-risk) 55%,transparent)}
.ds-strategy-ring.is-top .ds-strategy-ring__val{color:var(--ds-risk)}

.ds-strategy-ring__meta{display:flex;flex-direction:column;align-items:center;gap:.5rem}
.ds-strategy-ring__name{
	margin:0;
	font-family:var(--wp--preset--font-family--display);
	font-size:1.125rem;line-height:1.2;
	text-transform:uppercase;
}
.ds-strategy-ring__name a{color:var(--wp--preset--color--contrast);text-decoration:none}
/* Растянутая ссылка — как в карточках: мишень вся плитка, ссылка одна, её имя
   заголовок. Она же тащит раскрытие текста на клавиатуру через :focus-within. */
.ds-strategy-ring__name a::after{content:"";position:absolute;inset:0;border-radius:inherit}
.ds-strategy-ring:hover .ds-strategy-ring__name a{color:var(--wp--preset--color--primary)}
.ds-strategy-ring__risk{
	font-size:.625rem;letter-spacing:.18em;text-transform:uppercase;
	color:var(--ds-risk);
}

/* Описание: в покое ровно две строки, режет CSS. Клэмп считает по реальной
   ширине колонки на любом брейкпоинте, чего бюджет в знаках не умеет, — и он
   уместен именно здесь, потому что наведение показывает остаток. В карточках
   1a многоточие убрали намеренно: там за обрывом ничего не было, и он читался
   как «карточка что-то прячет». Условие изменилось, а не мнение. */
/* .9375rem = 15px, а НЕ 13, с 2026-08-02. Это описание и подпись в тизере
   тулов этажом ниже — один и тот же приём (крупное число, текст под ним,
   ссылка внизу), и разные кегли в двух соседних секциях читались расхождением:
   читателю не видно, что одно блёрб, а другое половина фразы.
   15px выбраны не средним арифметическим: столько у `.ds-section-lede`,
   которая стоит прямо над обеими сетками, — так у «поддерживающей прозы»
   появляется ОДНО значение вместо трёх.
   Потолок здесь 15: на 16px обрезка начинает падать на конец предложения и
   возвращается артефакт «.…» (замерено, _pw/probe-caption-size.mjs). */
.ds-strategy-ring__tldr{
	position:relative;width:100%;
	margin:0;min-height:calc(3 * 1.6em);
	font-size:.9375rem;line-height:1.6;
	color:var(--wp--preset--color--text-dim);
}
/* ТРИ строки с отточием. Отточие вернулось по замечанию владельца: без него
   обрыв читается не как «дальше есть ещё», а как «предложение забыли
   дописать» — а наведение видят не все и не сразу.
   Оно же вернуло риск артефакта «.…»: -webkit-line-clamp дорисовывает точки
   всегда, и если видимый обрыв падает ровно на конец предложения, выходит
   точка и сразу отточие. На ТРЁХ строках ни один из четырёх текстов туда не
   попадает (замерено; на двух попадали два из четырёх) — но это свойство
   ДАННЫХ, а не вёрстки. Правя ds_short_summary_tldr, смотреть на живую
   страницу: артефакт вернётся молча.
   Клэмп, а не max-height: точки умеет дорисовать только он, и он же сам
   молчит, когда текст влезает целиком. */
.ds-strategy-ring__tldr span{
	display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;
	overflow:hidden;text-wrap:pretty;
}
/* Разворот ПОВЕРХ, а не в потоке. Высота ряда в гриде общая, поэтому разворот
   в потоке двигал бы все четыре плитки и всё, что ниже, — замерено на макете.
   Абзац держит высоту двух строк, текст выходит за неё абсолютом на подложке
   ровно того цвета, в который окрашена наведённая плитка.
   Вылет −1.25rem равен боковому padding плитки: панель садится на её края
   ровно, иначе видно ступеньку из двух одноцветных боксов разной ширины.
   Тень нужна не для красоты: у самого длинного описания разворот перекрывает
   лаунчер тулов ниже, и без подъёма это читается сбоем вёрстки, а не слоем. */
/* ⚠️ РАЗВЁРНУТАЯ ПАНЕЛЬ ОГРАНИЧЕНА ШЕСТЬЮ СТРОКАМИ, и это не вкусовое число.
   Панель абсолютная, то есть в покое не стоит ничего, но кончаться ей всё
   равно где-то надо — а под кольцами теперь не пустота, а заголовок соседней
   секции. Замер (_pw/measure-ring-overlap.mjs): при полном тексте панель
   Rakeback заходила на заголовок «Dice tools» на 32px, Martingale на 8px;
   двум другим места хватало.
   Лечится границей ПАНЕЛИ, а не отступом секции: высота панели зависела от
   длины текста, поэтому любой новый длинный tldr ломал бы вёрстку заново —
   ровно тот класс, что записан в «правило написано и молча не исполняется».
   Шесть строк это втрое больше покоя и максимум +3 строки (72px) поверх слота,
   что укладывается в 76px, которые есть под ним (28px собственного padding
   плитки + 48px отбивки секции).
   Клэмп сохраняется, значит у самых длинных текстов отточие остаётся и в
   развёрнутом виде — оно честно говорит «дальше на странице стратегии».
   Отточие уйдёт само, когда тексты сократят до 120–140 знаков из брифа
   (пункт 0 очереди): тогда всё влезает в 4 строки. */
.ds-strategy-ring:hover .ds-strategy-ring__tldr span,
.ds-strategy-ring:focus-within .ds-strategy-ring__tldr span{
	position:absolute;top:0;left:-1.25rem;right:-1.25rem;
	-webkit-line-clamp:6;overflow:hidden;
	padding:0 1.25rem 1.25rem;
	border-radius:0 0 var(--ds-radius-panel) var(--ds-radius-panel);
	background:var(--ds-tint);
	box-shadow:0 18px 32px -16px rgba(0,0,0,.85);
	color:var(--wp--preset--color--contrast);
}

/* 4 колонки ≥1200, 2 колонки 768–1199, 1 колонка ниже. Специфичность (0,2,0)
   бьёт сгенерированное WP правило .wp-container-* — тот же приём, что у
   мобильных брейкпоинтов ниже. */
@media (max-width:74.9375rem){
	.ds-strategy-rings .wp-block-post-template{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:47.9375rem){
	.ds-strategy-rings .wp-block-post-template{grid-template-columns:minmax(0,1fr)}
	.ds-strategy-ring__dial{width:120px;height:120px}
	.ds-strategy-ring__val{font-size:2rem}
	.ds-strategy-ring__tldr{max-width:20rem;margin-inline:auto}
}

/* --- Statstrip: card family (surface, not surface-2) ---
   ⚠️ Заголовок раздела до 2026-08-01 обещал «mono labels, display values», и
   ни то ни другое не соответствовало правилам ниже: mono ушёл из темы вместе с
   IBM Plex (осталось две гарнитуры), а значения стоят на body, а не на display.
   Комментарий поправлен по факту.
   ОТКРЫТО: значения здесь Space Grotesk, а в стат-ряду героя — Russo One.
   Компоненты разные и живут на разных страницах, но вопрос «должны ли числа на
   сайте говорить одним голосом» этим не закрыт, а отложен. */
.ds-statstrip{background:var(--wp--preset--color--surface)}
.ds-stat__label{
	font-family:var(--wp--preset--font-family--body);
	text-transform:uppercase;
	font-size:.75rem;
	letter-spacing:.12em;
	color:var(--wp--preset--color--muted);
}
.ds-stat__value{
	font-family:var(--wp--preset--font-family--body);
	font-size:1.375rem;
	color:var(--wp--preset--color--contrast);
}

/* --- Quickjump: chip pills, reusing .ds-chip look (markup unchanged) --- */
.ds-quickjump a{
	display:inline-block;
	padding:.3rem .8rem;
	border:1px solid var(--wp--preset--color--border-strong);
	border-radius:999px;
	color:var(--wp--preset--color--text-dim);
	text-decoration:none;
	transition:border-color .16s ease,color .16s ease;
}
.ds-quickjump a:hover{
	border-color:var(--wp--preset--color--primary);
	color:var(--wp--preset--color--primary);
}

/* --- Equity curve: card wrap --- */
#chart .wp-block-dicestrategies-equity-curve{
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--border);
	border-radius:12px;
	padding:1rem;
}

/* --- Pros & cons: subtle card per column --- */
.ds-proscons .wp-block-column{
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--border);
	border-radius:12px;
	padding:1rem 1.25rem;
}

/* --- FAQ: questions read better as body-bold, not display --- */
.ds-faq__q{
	font-family:var(--wp--preset--font-family--body);
	font-weight:600;
	color:var(--wp--preset--color--contrast);
}
.ds-faq__a{color:var(--wp--preset--color--text-dim)}

/* ============================================================
   v2 redesign — R5: tools surfaces
   ============================================================ */

/* --- Tool card foot: pins CTA/pill to the card bottom ---
   (child combinator beats WP's generated `.wp-container-* > * + *` gap rule) */
.ds-tool-card>.ds-tool-card__foot{margin-top:auto;padding-top:.75rem}
.ds-tool-card__foot .wp-block-button__link{padding:.6rem 1.1rem;font-size:.75rem}

/* Пилюля «Coming soon» СНЯТА 2026-08-12 вместе со своим единственным носителем —
   карточкой Per-Game Optimizer на /tools/ (решение владельца: инструмента нет,
   и обещать его на видном месте среди работающих незачем). Класс `.ds-soon`
   больше нигде не встречается; удаление доведено до конца по правилу темы —
   узел, осиротевшее правило, и проверка. Понадобится снова — правило целиком
   лежит в истории, коммит снятия карточки. */

/* --- Inline bet-optimizer panel (single-strategy #optimizer) --- */
.ds-strategy__calculator{
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--border);
	border-radius:12px;
	padding:1rem 1.25rem;
}

/* ============================================================
   v2 redesign — R6: articles / search / 404
   ============================================================ */

/* --- Article card family (posts index, search, archives, front-page grid) --- */
.ds-article-card{
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--border);
	border-radius:12px;
	padding:1.5rem;
	transition:border-color .16s ease;
}
.ds-article-card:hover{border-color:var(--wp--preset--color--border-strong)}
.ds-article-card .wp-block-post-title{
	font-family:var(--wp--preset--font-family--body);
	font-weight:600;
	font-size:1.1875rem;
	text-transform:none;
	letter-spacing:0;
	line-height:1.3;
	margin:0;
}
.ds-article-card .wp-block-post-title a{color:var(--wp--preset--color--contrast);text-decoration:none}
.ds-article-card .wp-block-post-title a:hover{color:var(--wp--preset--color--primary)}
.ds-article-card .wp-block-post-date,
.ds-article-meta .wp-block-post-date{
	font-family:var(--wp--preset--font-family--body);
	font-size:.75rem;
	text-transform:uppercase;
	letter-spacing:.08em;
}
.ds-article-card .wp-block-post-date a,
.ds-article-meta .wp-block-post-date a{color:inherit;text-decoration:none}
.ds-article-card .wp-block-post-excerpt{font-size:.9rem;line-height:1.55}
.ds-article-card .wp-block-post-excerpt__more-link{
	color:var(--wp--preset--color--primary);
	font-weight:600;
	font-size:.875rem;
	text-decoration:none;
}
.ds-article-grid .wp-block-post-template{gap:1.5rem}

/* --- Latest articles (front page, design pass 1a) ------------------------
   Иерархия вместо шести равных карточек: ведущая с обложкой слева, остальные
   волосяным списком справа. Разбор с отвергнутым и замер —
   docs/design-mockups/home-latest-articles.html. Разметка —
   patterns/latest-articles.php. */
/* align-items:start, а не растяжение по большей колонке. На полном наборе
   колонки и так сходятся с точностью до пикселя, так что видимой разницы нет;
   разница появляется на КОРОТКОМ списке — растянутая колонка оставляла бы
   последнюю волосяную линию висеть в пустоте. */
.ds-la{display:grid;grid-template-columns:1.15fr 1fr;gap:2.75rem;align-items:start}

/* Одна статья на весь сайт: списка нет, и вторая колонка была бы пустой
   половиной рельса. Схлопываемся в одну колонку и снимаем растяжение обложки —
   21:9 во всю ширину 1240 это баннер, а не карточка статьи. */
.ds-la--solo{grid-template-columns:minmax(0,1fr)}
.ds-la--solo .ds-la__lead{max-width:640px}

.ds-la__lead{position:relative;display:flex;flex-direction:column;gap:1.375rem;transition:transform .25s ease}
.ds-la__lead:hover{transform:translateY(-4px)}
/* ⚠️ box-sizing НЕСУЩИЙ, и это ПЯТЫЙ случай той же граблины в теме после
   рельса пресс-ленты, шкалы контролов, карточки стратегии и аутлайн-кнопки.
   Без него бордер 1px прибавляется СНАРУЖИ: превью меряется 114x86 вместо
   112x84, а aspect-ratio у обложки считается по контент-боксу и даёт не 16:9.
   Правило прежнее: размер означает ВНЕШНИЙ бокс, бордер сидит внутри него.
   Поймано приёмкой, а не глазом — два пикселя не видны. */
/* 21:9, а не 16:9 из брифа: секция занимала 675px, из них 360 — пустая рамка.
   ⚠️ Замер показал неочевидное: урезать что-то ОДНО не даёт ничего. Колонки
   уравнены по большей, и на четырёх статьях вместо пяти высоту начинала
   держать левая — секция оставалась ровно 675. Работает только пара
   «уже рамка + короче список»: 21:9 + четыре = 590px, минус 85 (13%), и обе
   колонки сходятся с точностью до пикселя. Замер — _pw/probe-articles-height.mjs.
   Та же экономия достижима на ПЯТИ статьях, если ужать строки списка до .7rem
   (тоже 590), но строки там встают вплотную; выбран вариант с четырьмя. */
.ds-la__cover{
	box-sizing:border-box;
	display:block;width:100%;aspect-ratio:21/9;overflow:hidden;
	border-radius:var(--ds-radius-panel);border:1px solid var(--wp--preset--color--border);
}
.ds-la__cover img{width:100%;height:100%;object-fit:cover;display:block}
.ds-la__body{display:flex;flex-direction:column;gap:.875rem}
.ds-la__date{font-size:.75rem;letter-spacing:.1em;text-transform:uppercase;color:var(--wp--preset--color--muted)}
.ds-la__title{
	margin:0;font-family:var(--wp--preset--font-family--display);
	font-size:1.875rem;line-height:1.15;font-weight:400;
}
.ds-la__title a,.ds-la__item-title a{color:var(--wp--preset--color--contrast);text-decoration:none}
/* Растянутая ссылка — та же конструкция, что в карточках стратегий: одна
   ссылка на запись, её имя — заголовок. */
.ds-la__title a::after,.ds-la__item-title a::after{content:"";position:absolute;inset:0}
.ds-la__lead:hover .ds-la__title a{color:var(--wp--preset--color--primary)}
.ds-la__excerpt{
	margin:0;font-size:.9375rem;line-height:1.6;
	color:var(--wp--preset--color--text-dim);max-width:560px;text-wrap:pretty;
}
.ds-la__more{
	font-family:var(--wp--preset--font-family--display);
	font-size:.75rem;letter-spacing:.1em;text-transform:uppercase;
	color:var(--wp--preset--color--primary);
}

.ds-la__list{display:flex;flex-direction:column}
.ds-la__item{
	position:relative;display:flex;gap:1.25rem;align-items:center;
	padding:1.25rem 0;border-top:1px solid var(--wp--preset--color--border);
	transition:opacity .2s ease;
}
.ds-la__item:hover{opacity:.8}
.ds-la__item:first-child{padding-top:0;border-top:0}
.ds-la__item:last-child{padding-bottom:0}
.ds-la__thumb{
	box-sizing:border-box;
	flex:none;width:112px;height:84px;overflow:hidden;
	border-radius:10px;border:1px solid var(--wp--preset--color--border);
}
.ds-la__thumb img{width:100%;height:100%;object-fit:cover;display:block}
.ds-la__text{flex:1;min-width:0;display:flex;flex-direction:column;gap:.5rem}
.ds-la__item .ds-la__date{font-size:.6875rem}
.ds-la__item-title{
	margin:0;font-family:var(--wp--preset--font-family--display);
	font-size:1.0625rem;line-height:1.25;font-weight:400;
}
.ds-la__item:hover .ds-la__item-title a{color:var(--wp--preset--color--primary)}

/* Заглушка вместо обложки. Диагональ, а не плоская заливка: плоский прямоугольник
   в цвет фона читается дырой в вёрстке, а штриховка — намеренно пустым местом.
   Свап на брифовский пустой стейт (плоский фон + монограмма) — это одно
   правило здесь и ничего больше. */
.ds-la__ph{
	display:block;width:100%;height:100%;
	background:repeating-linear-gradient(135deg,
		var(--wp--preset--color--surface) 0 12px,
		var(--wp--preset--color--base) 12px 24px);
}
@media (prefers-reduced-motion:reduce){
	.ds-la__lead{transition:opacity .2s ease}
	.ds-la__lead:hover{transform:none;opacity:.8}
}
/* Планшет: ведущая во всю ширину, список под ней в две колонки — колонка 1fr
   рядом с обложкой 16:9 к этой ширине сжимается до нечитаемой. */
@media (max-width:75rem){
	.ds-la{grid-template-columns:1fr;gap:2.5rem}
	.ds-la__list{display:grid;grid-template-columns:1fr 1fr;column-gap:2rem}
	.ds-la__item:nth-child(2){padding-top:0;border-top:0}
}
@media (max-width:48rem){
	.ds-la__list{grid-template-columns:1fr}
	.ds-la__item:nth-child(2){padding-top:1.25rem;border-top:1px solid var(--wp--preset--color--border)}
	.ds-la__title{font-size:1.5rem}
	.ds-la__thumb{width:88px;height:66px}
}

/* --- Articles index /articles/ (design pass 2a, 2026-08-05) ----------------
   Присланный макет — docs/design-mockups/_source/articles-index-2a.html,
   разбор — docs/DESIGN-SYSTEM.md, «Индекс статей».
   Разметка — patterns/articles-index.php, приёмка — _pw/verify-articles-index.mjs.

   Стояла колонка одинаковых текстовых карточек в меру прозы 820px. Стало:
   шапка страницы, ведущая статья и сетка 3x2 — во всю ширину рельса 1240.

   ⚠️ Чипов тем и тегов на обложке в этом проходе НЕТ. Оба висят на таксономии
   section, у которой сегодня ноль термов; решение владельца — не заводить тему
   ради шести статей, где на каждую тему пришлось бы по одной. Вернутся вместе.
   Макет их рисует — расхождение намеренное, а не пропуск. */
.ds-ai{display:flex;flex-direction:column;gap:2.75rem}
/* Ритм секций держит gap контейнера. Поток ядра (is-layout-flow) добавляет
   детям свой margin-block-start в размер blockGap — на флексе он лёг бы
   ПОВЕРХ зазора, и шов между шапкой и ведущей стал бы 44+24. */
.ds-ai > *{margin-block:0}

/* Шапка: заголовок с подводкой слева, стамп в правом конце строки. */
/* Строка заголовка листинга: текст слева, стамп в правом конце, по нижней
   линии. Общая с хабом `/strategies/` c 2026-08-27 — просьба владельца «добавим
   такую же кнопку как у articles». Список селекторов, а не копия. */
.ds-ai__head-row,.ds-hub-head{display:flex;align-items:flex-end;justify-content:space-between;gap:3.75rem}
.ds-ai__head-text,.ds-hub-head-text{display:flex;flex-direction:column;gap:.875rem;min-width:0}
/* Кегль тот же, что у H1 money-страницы, а не токен xx-large (56px).
   Причина записана там же: на 56 заголовок внутренней страницы кричит громче
   H1 героя главной (52 на 1440), то есть иерархия встаёт вверх ногами. Раздел
   статей приводится к тому же значению, чтобы индекс и страница статьи не
   спорили друг с другом.

   🟢 Обновлено 2026-08-27: хаб `/strategies/` сведён к 48 тоже (`.ds-hub-title`,
   правило стоит рядом с остальными). ⚠️ Прежняя запись «остальные листинги
   (/strategies/, /tools/) пока на 56» к этому дню устарела наполовину: замер по
   шести шаблонам дал у `/tools/` 48 — его закрыло собственное правило
   `.ds-tools-page > h1` выше по файлу. То есть на 56 оставался ОДИН хаб
   стратегий, и теперь листинги сведены все. */
/* ⚠️ `.ds-hub-title` ВЗЯТ СЮДА 2026-08-27, а из общего списка кеглей ниже убран.
   Оба заголовка теперь рисуются сырой разметкой внутри `wp:html` (шапка хаба
   уехала в паттерн, чтобы считать данные стампа), а сырому h1 не достаются ни
   обнулённый margin, ни прочее, что блочный заголовок берёт от ядра. Одно
   правило на два листинга закрывает всё сразу — и кегль в нём тот же
   clamp(2.25rem,5vw,3rem), что стоял у хаба отдельной строкой. */
.ds-ai__title,.ds-hub-title{
	margin:0;font-family:var(--wp--preset--font-family--display);
	font-size:clamp(2.25rem,5vw,3rem);
	line-height:1.06;font-weight:400;text-transform:uppercase;
	letter-spacing:.01em;color:var(--wp--preset--color--contrast);
}
/* Подводка листинга: кегль, интерлиньяж и цвет — общие со хабом `/strategies/`
   (просьба владельца 2026-08-27 «текст под заголовком привести к варианту как у
   articles»). Список селекторов, а не копия: разъехались бы на первой правке.

   ⚠️ `margin:0` ПЕРЕЕХАЛ В ОБЩЕЕ ПРАВИЛО 2026-08-27, И ЭТО НЕ ПЕРЕДУМАЛИ.
   Полдня он стоял отдельно у статей с пометкой «layout-local»: подводка хаба
   жила в обычном потоке, и обнуление схлопнуло бы шов под H1. Потом хаб получил
   стамп и вместе с ним ту же флекс-колонку, что у статей, — зазор теперь держит
   `gap`, а собственный margin в нём лишний у ОБОИХ. Основание пометки исчезло
   вместе с раскладкой.

   ⚠️ А `max-width:600px` так и остаётся у статей: он про их флекс-СТРОКУ, где на
   общей мере 820 подводка упиралась бы в стамп. У хаба стамп в правом конце той
   же строки, но подводка короткая и до него не достаёт. Сузить меру хаба — это
   часть открытого вопроса про ширину колонки (104 знака), и решать его боком,
   ради одной страницы, значило бы предрешить за владельца. */
.ds-ai__lede,
.ds-hub-lede{
	margin:0;font-size:1rem;line-height:1.6;
	color:var(--wp--preset--color--text-dim);text-wrap:pretty;
}
.ds-ai__lede{max-width:600px}
/* ⚠️ margin гасится: у .ds-verified он 1rem сверху, потому что там пилюля
   стоит ПОД H1. Здесь она элемент флекс-строки, и собственный отступ сдвинул
   бы её относительно базовой линии заголовка. */
.ds-ai__stamp,.ds-hub-stamp{margin:0;flex:none}

.ds-ai__empty{margin:0;color:var(--wp--preset--color--text-dim)}

/* Чипы тем. Пилюли-контролы, а не CTA, поэтому Space Grotesk, а не Russo One —
   правило §«Шрифты»: бренд-шрифт появляется там, где говорит бренд.
   Радиус из шкалы (pill), высота под неё НЕ равняется: чип следует за длиной
   подписи, и это записанное исключение (§«Шкала и контролы»). */
/* ⚠️ Фильтры `/strategies/` ездят на ЭТИХ ЖЕ правилах с 2026-08-27 (просьба
   владельца: «у strategies они другие, посмотри дизайн у articles»). Список
   селекторов, а не копия рецепта: у копии два вида разошлись бы на первой же
   правке одного из них.
   Скоуп — ТОЛЬКО `.ds-filter-group .ds-chip`. Базовый `.ds-chip` трогать нельзя:
   на нём живут чипы симулятора и калькуляторов, у которых свои утверждённые
   метрики (35px, радиус 9, см. решения владельца в STATE.md). `.ds-filter-group`
   не встречается больше нигде — проверено grep'ом по теме. */
.ds-ai__chips,.ds-filter-group{display:flex;flex-wrap:wrap;gap:.625rem}
.ds-ai__chips{padding-top:.5rem}
.ds-ai__chip,.ds-filter-group .ds-chip{
	font-size:.75rem;font-weight:700;letter-spacing:var(--ds-track-caps);
	text-transform:uppercase;text-decoration:none;
	color:var(--wp--preset--color--text-dim);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-pill);
	padding:.5rem 1.125rem;
	transition:border-color .2s ease,color .2s ease;
}
.ds-ai__chip:hover,.ds-filter-group .ds-chip:hover{border-color:var(--wp--preset--color--border-strong);color:var(--wp--preset--color--contrast);text-decoration:none}
.ds-ai__chip.is-active,.ds-ai__chip.is-active:hover,
.ds-filter-group .ds-chip.is-active,.ds-filter-group .ds-chip.is-active:hover{
	color:var(--wp--preset--color--accent-ink);
	background:var(--wp--preset--color--primary);
	border-color:var(--wp--preset--color--primary);
}

/* Тег темы на обложке. pointer-events:none — карточка это ОДНА ссылка, и тег
   не должен перехватывать клик у растянутой ссылки заголовка. */
.ds-ai__tag{
	position:absolute;left:.875rem;top:.875rem;z-index:2;pointer-events:none;
	font-size:.625rem;font-weight:700;letter-spacing:var(--ds-track-caps);
	text-transform:uppercase;
	color:var(--wp--preset--color--contrast);
	background:color-mix(in srgb,var(--wp--preset--color--base) 85%,transparent);
	border:1px solid var(--wp--preset--color--border-strong);
	border-radius:var(--ds-radius-chip);
	padding:.3125rem .5625rem;
}

/* Ведущая. Наведение только по бордеру, без подъёма: блок широкий, и сдвиг
   на нём читается рывком, а не откликом. У карточек подъём есть — там он
   работает, потому что двигается плитка, а не полоса во всю страницу. */
.ds-ai__lead{
	position:relative;display:grid;grid-template-columns:1.1fr minmax(0,1fr);
	gap:2.75rem;align-items:center;
	padding:1.75rem;
	background:linear-gradient(120deg,var(--wp--preset--color--surface) 0%,var(--wp--preset--color--base) 100%);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);
	transition:border-color .25s ease;
}
.ds-ai__lead:hover{border-color:var(--wp--preset--color--border-strong)}
/* ⚠️ box-sizing НЕСУЩИЙ — шестой случай той же граблины в теме. Без него
   бордер 1px прибавляется снаружи и aspect-ratio считается по контент-боксу,
   то есть рамка перестаёт быть 16:9. Размер означает ВНЕШНИЙ бокс. */
.ds-ai__lead-cover{
	box-sizing:border-box;
	display:block;width:100%;aspect-ratio:16/9;overflow:hidden;
	border-radius:var(--ds-radius-control);
	border:1px solid var(--wp--preset--color--border);
}
.ds-ai__lead-cover img{width:100%;height:100%;object-fit:cover;display:block}
.ds-ai__lead-body{display:flex;flex-direction:column;gap:1rem;padding-right:1.5rem}
/* ⚠️ Кегли ЯВНЫЕ, а не пресетами `x-large`/`large`, и это вынужденно.
   `defaultFontSizes` в theme.json v3 не выключен, поэтому ядро WP давит
   четыре одноимённых токена своими: `large` становится 36px вместо наших 19,
   `x-large` — 42 вместо 34 (см. DESIGN-SYSTEM, «Ядро WP давит четыре токена
   размера»). Первая версия этого блока стояла на пресетах, и замер против
   макета дал заголовок карточки 36px против 19 и высоту карточки 713 против
   409 — то есть страница раздувалась вдвое молча.
   Так же поступают .ds-la__title и .ds-la__item-title на главной. Снимать эти
   заплатки — только ПАРОЙ с общим проходом по типографике (пункт 8 очереди):
   правка одного уровня переворачивает иерархию. */
.ds-ai__lead-title{
	margin:0;font-family:var(--wp--preset--font-family--display);
	font-size:2.125rem;
	line-height:1.1;font-weight:400;text-transform:uppercase;
}
.ds-ai__lead-excerpt{
	margin:0;font-size:.9375rem;line-height:1.65;
	color:var(--wp--preset--color--text-dim);text-wrap:pretty;
}
.ds-ai__more{
	font-family:var(--wp--preset--font-family--display);
	font-size:.75rem;letter-spacing:.1em;text-transform:uppercase;
	color:var(--wp--preset--color--primary);
}

/* ⚠️ minmax(0,1fr), а НЕ 1fr — и это не вкусовщина. `1fr` разворачивается в
   `minmax(auto,1fr)`, где auto — min-content содержимого; с обложкой на
   aspect-ratio внутри получается круговая зависимость (ширина от высоты,
   высота от родителя, родитель от ширины), браузер разрывает её через высоту,
   и та переносится в ширину колонки. Ровно эта конструкция стоит главной
   31 нарушения в audit:layout — замер и арифметика в DESIGN-SYSTEM,
   «Базовая линия гварда», причина 1. Здесь она закрыта с рождения. */
.ds-ai__grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1.5rem}
.ds-ai__card{
	position:relative;display:flex;flex-direction:column;
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);
	overflow:hidden;
	transition:border-color .25s ease,transform .25s ease;
}
.ds-ai__card:hover{border-color:var(--wp--preset--color--border-strong);transform:translateY(-4px)}
/* Подъём 4px, а не 5 из макета: ведущая карточка на главной поднимается на 4,
   и два соседних числа на одну работу — это дрейф, а не нюанс. */
.ds-ai__card-cover{
	box-sizing:border-box;
	display:block;width:100%;aspect-ratio:16/9;overflow:hidden;
	border-bottom:1px solid var(--wp--preset--color--border);
}
.ds-ai__card-cover img{width:100%;height:100%;object-fit:cover;display:block}
.ds-ai__card-body{display:flex;flex-direction:column;gap:.6875rem;padding:1.375rem 1.5rem 1.5rem}
.ds-ai__card-title{
	margin:0;font-family:var(--wp--preset--font-family--display);
	font-size:1.1875rem;
	line-height:1.25;font-weight:400;text-transform:uppercase;
}
/* Две строки жёстко: карточки обязаны держать один ритм, а excerpt'ы в базе
   разной длины — без клампа нижние края в ряду разъезжаются. */
.ds-ai__card-excerpt{
	margin:0;font-size:.84375rem;line-height:1.6;
	color:var(--wp--preset--color--text-dim);text-wrap:pretty;
	display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;
}

.ds-ai__date{
	font-size:.75rem;letter-spacing:.1em;text-transform:uppercase;
	color:var(--wp--preset--color--muted);
}
.ds-ai__card .ds-ai__date{font-size:.6875rem}

/* ⚠️ overflow-wrap:anywhere, а не break-word, и это не перестраховка.
   Заголовок — пользовательские данные: в нём может оказаться длинный
   неразрывный токен (адрес, идентификатор), а колонка карточки на мобилке
   всего 350px. `break-word` переносит при отрисовке, но НЕ уменьшает
   min-content, поэтому грид-колонка всё равно раздувается по самому длинному
   слову; уменьшает его только `anywhere`.
   Поймано гвардом на живых данных: заголовок с 66-символьным токеном давал
   overflows-container на 295px на десктопе и на 644 на мобилке. */
.ds-ai__lead-title,.ds-ai__card-title,.ds-ai__lead-excerpt,.ds-ai__card-excerpt{overflow-wrap:anywhere}

/* Растянутая ссылка — та же конструкция, что в секции главной и в карточках
   стратегий: одна ссылка на запись, и её имя — заголовок. */
.ds-ai__lead-title a,.ds-ai__card-title a{color:var(--wp--preset--color--contrast);text-decoration:none}
.ds-ai__lead-title a::after,.ds-ai__card-title a::after{content:"";position:absolute;inset:0}
.ds-ai__lead:hover .ds-ai__lead-title a,
.ds-ai__card:hover .ds-ai__card-title a{color:var(--wp--preset--color--primary)}
/* Фокус живёт на карточке, а не на пустом растянутом <a>: у ссылки нулевой
   бокс в потоке, и её собственное кольцо нарисовалось бы точкой в углу. */
.ds-ai__lead:focus-within,.ds-ai__card:focus-within{
	outline:2px solid var(--wp--preset--color--primary);outline-offset:4px;
}
.ds-ai__lead-title a:focus-visible,.ds-ai__card-title a:focus-visible{outline:none}

/* Заглушка общая с секцией главной — одно правило на два имени, чтобы две
   страницы не разъехались. Переименовать .ds-la__ph нельзя: на нём стоит
   verify-latest-articles. */
.ds-ai__ph{
	display:block;width:100%;height:100%;
	background:repeating-linear-gradient(135deg,
		var(--wp--preset--color--surface) 0 12px,
		var(--wp--preset--color--base) 12px 24px);
}

.ds-ai__more-nav{display:flex;justify-content:center;align-items:center;gap:1.5rem}
.ds-ai__more-nav a{
	font-family:var(--wp--preset--font-family--display);
	font-size:.8125rem;letter-spacing:.12em;text-transform:uppercase;
	color:var(--wp--preset--color--primary);text-decoration:none;
	border:1px solid var(--wp--preset--color--border-strong);
	border-radius:var(--ds-radius-pill);
	padding:.875rem 2.125rem;
	transition:background-color .2s ease,border-color .2s ease;
}
.ds-ai__more-nav a:hover{
	background-color:color-mix(in srgb,var(--wp--preset--color--primary) 8%,transparent);
	border-color:var(--wp--preset--color--primary);
	text-decoration:none;
}

@media (prefers-reduced-motion:reduce){
	.ds-ai__card{transition:border-color .25s ease}
	.ds-ai__card:hover{transform:none}
}

/* Планшет: ведущая в одну колонку (обложка сверху), сетка в две. Колонка
   карточки к 1024px сжимается до ~300px, где заголовок в Russo One начинает
   ломаться на слова. */
@media (max-width:75rem){
	.ds-ai{gap:2.5rem}
	.ds-ai__head-row,.ds-hub-head{flex-direction:column;align-items:flex-start;gap:1.125rem}
	.ds-ai__lead{grid-template-columns:minmax(0,1fr);gap:1.5rem;align-items:start}
	.ds-ai__lead-body{padding-right:0}
	.ds-ai__grid{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:48rem){
	.ds-ai__grid{grid-template-columns:minmax(0,1fr)}
	.ds-ai__lead{padding:1rem}
	.ds-ai__more-nav{flex-direction:column;gap:1rem}
}

/* --- Grid mobile breakpoints: front-page articles + single-strategy #related
       (columnCount:3 grids have no native breakpoint; specificity (0,2,0)
       beats WP's generated .wp-container-* rule — same trick as the R5 foot pin) --- */
@media (max-width:781px){
	.ds-article-grid .wp-block-post-template,
	/* :not(.ds-strategy-rings) — у колец собственная лестница 4/2/1 с порогом
	   768, и на 768…781px она просит ДВЕ колонки там, где это правило дало бы
	   одну. Исключение вместо расчёта на порядок правил: так поведение не
	   зависит от того, кто в файле ниже. */
	.ds-strategy-grid:not(.ds-strategy-rings) .wp-block-post-template{display:grid;grid-template-columns:1fr}
}

/* --- 404 quick links as chip pills (quickjump family) --- */
.ds-404-links{list-style:none;margin:1rem 0 0;padding:0;display:flex;flex-wrap:wrap;gap:.5rem}
.ds-404-links li{margin:0}
.ds-404-links a{
	display:inline-block;
	padding:.3rem .8rem;
	border:1px solid var(--wp--preset--color--border-strong);
	border-radius:999px;
	color:var(--wp--preset--color--text-dim);
	text-decoration:none;
	transition:border-color .16s ease,color .16s ease;
}
.ds-404-links a:hover{
	border-color:var(--wp--preset--color--primary);
	color:var(--wp--preset--color--primary);
}

/* --- Wide tool pages: hero intro keeps a readable line length --- */
.wp-block-post-content .alignwide > h1 + p{
	max-width:60ch;
	margin-inline:0; /* anchored left, never centred - see the prose rail rule */
}

/* --- Гайды под инструментами: та же проза, что в статьях (2026-08-12) ---

   ⚠️ ЭТО РАЗВОРОТ РЕШЕНИЯ 2026-07-20 (мокап G2), и он сознательный. Тогда был
   выбран «мелкий кегль, приглушённый, воздушный»: 13px, `text-dim`, мера 820,
   собственные размеры заголовков от ядра (h2 выходил 42px при прозе 13px —
   отношение 3.2, тогда как в статьях ТОГДА было 30/20 = 1.5; с 2026-08-24 там
   24/16, то же отношение). Владелец 2026-08-12 попросил ровно обратного:
   «SEO-текст под симулятором такой же, как у блога — ширина, размеры
   заголовков и т.д.»

   Сделано ДОБАВЛЕНИЕМ ИМЕНИ к правилам статей выше, а не копией значений: копия
   разъезжается, и на этом сайте так уже появлялись две системы контролов. Ищите
   `.ds-sim-guide` рядом с `.ds-article-body` в блоке про меру и заголовки.
   Отсюда снято всё, что расходилось: мера `--ds-measure` (820 → `--ds-doc-measure`
   1000), кегль 13px, `line-height` 1.85, `letter-spacing`, цвет `text-dim` и
   осиротевший вместе с ним `strong` (он existed, чтобы жирное читалось на
   приглушённом фоне текста; текст больше не приглушён).

   Действует на ВСЕ шесть страниц `/tools/` — одна грамматика, как и было. */
.ds-sim-guide li::marker{
	color:var(--wp--preset--color--primary);
}

/* Шов «панель → текст» (2026-08-12, выбор владельца по
   `docs/design-mockups/dice-sim-seam-variants.html`).

   ⚠️ ВОЗДУХ ЗДЕСЬ — ДОЛГ, А НЕ ВКУС. Замер до правки: **24px**, ровно столько
   же, сколько между двумя абзацами одной мысли — потому текст и читался
   продолжением панели. Записанное правило темы (§«Ритм секций») требует, чтобы
   шов секции был ВДВОЕ больше зазора прозы, то есть ≥48px. 3rem — минимальная
   ступень, которая правилу удовлетворяет; владелец выбрал именно её, а не 4/5rem.

   Черта — вкус, и выбрана из трёх (нет · линия на всю рельсу · короткая слева).
   64px = ступень шкалы, accent — единственный яркий цвет сайта. Подложку
   («карточка, как у панели») владелец отклонил; она и стоила бы дороже —
   внутренние отступы сдвигают левый край прозы относительно панели и H1. */
.ds-sim-guide{margin-top:3rem}
.ds-sim-guide::before{
	content:'';display:block;
	width:64px;height:3px;
	background:var(--wp--preset--color--primary);
	margin-bottom:2rem;
}

/* Шкала гайда — ТЕПЕРЬ ОНА ЖЕ И СТАТЕЙНАЯ (гайд 2026-08-12, статьи 2026-08-24).

   ⚠️ ЭТО НЕ РАСХОЖДЕНИЕ С САЙТОМ, А ШАГ К ЕГО ЗАДУМАННОЙ ТИПОГРАФИКЕ. В
   `theme.json` базовый размер прозы — `medium: 1rem`, то есть **16px**; на
   экране 20px только потому, что тема не выключила `defaultFontSizes`, и
   ядровый `medium` (20px) перебивает свой же токен.

   ⚠️ ЗДЕСЬ БЫЛО НАПИСАНО «сайтвайдный проход („проза 20 → 16“) однажды приведёт
   сюда и статьи; гайды инструментов приходят первыми». 2026-08-24 владелец
   попросил ровно этого — «может у articles так же сделаем h2 24 и текст 16, как
   в dice simulator», — и статьи пришли вторыми. Обещанное сбылось, строка
   переписана в факт.

   Сделано ДОБАВЛЕНИЕМ ИМЕНИ, а не копией значений — тем же приёмом, каким сюда
   в прошлый раз приезжал сам гайд. Копия разъезжается: на этом сайте так уже
   появлялись две системы контролов.

   Значения ЯВНЫЕ, а не пресетом — по записанному правилу темы: до решения по
   `defaultFontSizes` размер, которому важна точность, ставится явным значением
   в скоуп-классе (иначе пресет отдаст ядровые 20px).

   ⚠️ h3 СПУСТИЛСЯ ВМЕСТЕ С h2, И ЭТО НЕ САМОДЕЯТЕЛЬНОСТЬ. Владелец назвал два
   числа, 24 и 16, но h3 в статьях стоял 22: при h2 24 шаг стал бы 1.09 — «на
   глаз почти один размер», ровно тот дефект, из-за которого в 2026-08-03 h2
   сбавляли с 34 до 30 (разбор выше, у `.ds-games-money h2`). 24/18 = 1.33
   сохраняет ступень. Субъект у правила есть: пять h3 вне FAQ в двух статьях.

   ⚠️ НЕ ЗАДЕТЫ: обзоры игр и стратегии (h2 30, проза 17) — у них своей обёртки
   нет, они на ядровых правилах, и владельцу это показано отдельным вопросом.
   Ширина колонки (1000px), ритм секций и левый якорь — ОБЩИЕ, они выше, в
   блоке про меру. */
/* ⚠️ У `.ds-tool-prose` СЕЛЕКТОР ЧЕРЕЗ `>`, И ЭТО НЕ СТИЛЬ, А ПОЧИНКА ПОЛОМКИ
   (замечание владельца 2026-08-24, в тот же день). Секция `.ds-tool-prose`
   ОБЁРНУТА ВОКРУГ ПАНЕЛИ калькулятора и симулятора, поэтому потомковый
   `.ds-tool-prose p` доставал ВНУТРЬ приборов. Вес: у правил блока селектор в
   один класс (`.ds-dice-sim__strategy-note`), у потомкового — в два, поэтому
   выигрывал он. Замер: **20 из 22** текстовых узлов внутри панелей взяли 16px
   от прозы вместо своих кеглей — подписи шагов, лимиты стола, правило стратегии,
   заголовок графика, дисклеймеры. Уцелели только два, у которых селектор сам в
   два класса (`.ds-dice-sim--inline .ds-dice-sim__clamp`).

   Почему поймал владелец, а не я: свои замеры я делал с фильтром «не внутри
   панели» — ровно там, где поломка и жила. Урок: правило, которое вешается на
   секцию С ПРИБОРОМ ВНУТРИ, обязано быть на `>`, а проверять надо и то, что
   исключил из замера.

   `>` здесь ничего не теряет, проверено обходом пяти страниц: вся проза этих
   секций — ПРЯМЫЕ дети (18 · 4 · 4 · 17 · 4 узла), вложенной прозы вне панели
   нет ни одной. Списков сейчас нет тоже, но `> ul li` / `> ol li` оставлены на
   будущее: список появится прямым ребёнком секции, а список внутри прибора
   лежит в `.ds-tool-panel` и под правило не попадёт.

   ⚠️ У `.ds-sim-guide`, `.ds-article-body` и `.ds-games-money` селектор остаётся
   потомковым НАМЕРЕННО: проверено обходом — ни одна из этих обёрток прибора в
   себе не держит, а внутри них проза бывает вложенной (WP заворачивает блоки в
   figure/group). Менять их на `>` — сломать то, что работает. */
.ds-sim-guide h2,
.ds-tool-prose > h2,
.ds-article-body h2{font-size:1.5rem;line-height:1.15}
.ds-sim-guide h3,
.ds-tool-prose > h3,
.ds-article-body h3{font-size:1.125rem;line-height:1.3}
.ds-sim-guide p,
.ds-sim-guide li,
.ds-tool-prose > p,
.ds-tool-prose > ul li,
.ds-tool-prose > ol li,
.ds-article-body p,
.ds-article-body li{font-size:1rem;line-height:1.6}

/* Palette-slug collision counter-rule (design round 2026-07-23). The palette
   slug "border" makes WP global styles emit the preset TEXT class
   .has-border-color{color:var(--wp--preset--color--border)!important} — the
   same class name WP adds as a border-support MARKER to every block with a
   border color. Net effect: any bordered group (ds-tool-panel!) forces its
   inherited text to the border color, and every element without an explicit
   color goes dark-on-dark (rakeback spans/values, the D'Alembert ladder td
   were all this one bug). Same specificity + !important — this wins by
   source order (style.css enqueues after global-styles, verified live).
   :not(.has-text-color) keeps a deliberately picked "Border" text color
   working: WP adds .has-text-color alongside real text-color picks. */
.has-border-color:not(.has-text-color){color:inherit !important}

/* ==========================================================================
   HERO TOP-5 — the best-casinos block's `hero` variant (2026-07-31)
   Ranked by dicestrategies_ranked_casinos(); markup in the block's render.php.
   Mockup of record: docs/design-mockups/hero-FINAL.html.
   ========================================================================== */
.ds-hero-top5{
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);
	padding:1.125rem 1.125rem .875rem;
}
.ds-hero-top5__kicker{
	font-family:var(--wp--preset--font-family--display);
	font-size:.75rem;letter-spacing:.11em;text-transform:uppercase;line-height:1.35;margin:0;
}

/* --- the pinned editorial slot ------------------------------------------- */
.ds-hero-top5__slot{
	margin-top:1rem;padding:.75rem .8125rem;
	border:1px solid color-mix(in srgb, var(--wp--preset--color--primary) 35%, transparent);
	border-radius:10px;
	background:linear-gradient(180deg, color-mix(in srgb, var(--wp--preset--color--primary) 6%, transparent), transparent 72%);
}
.ds-hero-top5__head{display:flex;align-items:center;gap:.75rem}
.ds-hero-top5__slot .ds-hero-top5__rk{
	font-family:var(--wp--preset--font-family--display);font-size:.8125rem;
	color:var(--wp--preset--color--accent-ink);background:var(--wp--preset--color--primary);
	border-radius:var(--ds-radius-chip);width:24px;height:24px;
	display:grid;place-items:center;flex:none;
}
.ds-hero-top5__id{flex:1;min-width:0}
.ds-hero-top5__crown{
	display:flex;align-items:center;gap:3px;
	font-size:.59375rem;letter-spacing:var(--ds-track-caps);text-transform:uppercase;
	line-height:1.3;color:var(--wp--preset--color--primary);
}
/* The caps tracking is meant for the TEXT. Left on, it hangs a 0.08em tail off
   the diamond itself and, with the glyph not filling its box, opened the gap to
   7.5px against a 1.0px inter-letter gap — the marker read as a separate
   element. Measured, not guessed: _pw/measure-slot.mjs. Do not simplify away. */
.ds-hero-top5__crown i{font-style:normal;letter-spacing:0}
/* display:block is load-bearing: this is a <span>, and inline elements IGNORE
   vertical margins. Without it margin-top silently does nothing here while the
   flex siblings above and below honour theirs, so the name sits 7px under the
   crown and 13px above the score — and it looks intentional. */
.ds-hero-top5__nm{
	display:block;font-family:var(--wp--preset--font-family--display);
	font-size:1.125rem;line-height:1;margin-top:3px;
}
.ds-hero-top5__rate{display:flex;align-items:center;gap:.4375rem;margin-top:4px;line-height:1}
.ds-hero-top5__rate b{font-family:var(--wp--preset--font-family--display);font-size:.75rem;font-weight:400;color:var(--wp--preset--color--primary)}
.ds-hero-top5__rate span:last-child{font-size:.625rem;color:var(--wp--preset--color--muted)}
.ds-hero-top5__bar{width:66px;height:3px;border-radius:var(--ds-radius-pill);background:var(--wp--preset--color--surface-3);overflow:hidden}
.ds-hero-top5__bar i{display:block;height:100%;background:var(--wp--preset--color--primary)}
.ds-hero-top5__blurb{
	font-size:.71875rem;color:var(--wp--preset--color--text-dim);line-height:1.5;margin:.625rem 0 0;
}

/* --- stat tiles ----------------------------------------------------------
   space-between keeps the first tile on the card LEFT RAIL, where the kicker,
   the blurb and the rows all start; an inset there reads as broken alignment
   before it reads as air. min-width gives the narrow tiles their breathing room
   INSIDE the box instead, so the right edge is honest too. Measured: first
   label at 0.0px, last 27px clear of the edge, gaps even at 43px. */
.ds-hero-top5__stats{
	display:flex;justify-content:space-between;gap:.75rem;
	margin-top:.6875rem;padding-top:.625rem;
	border-top:1px solid color-mix(in srgb, var(--wp--preset--color--primary) 18%, transparent);
}
.ds-hero-top5__stat{flex:0 1 auto;min-width:72px;text-align:center}
.ds-hero-top5__stat b{
	font-family:var(--wp--preset--font-family--display);font-size:.90625rem;font-weight:400;
	display:block;line-height:1;font-variant-numeric:tabular-nums;
}
.ds-hero-top5__stat i{
	font-style:normal;font-size:.5625rem;letter-spacing:.06em;text-transform:uppercase;
	color:var(--wp--preset--color--muted);display:block;margin-top:5px;line-height:1.35;
}

/* --- ranked rows ---------------------------------------------------------- */
.ds-hero-top5__list{list-style:none;margin:.75rem 0 0;padding:0}
.ds-hero-top5__row{
	display:flex;align-items:center;gap:.75rem;
	padding:.5625rem .5rem;margin:0 -.5rem;
	border-radius:var(--ds-radius-control);
	border-bottom:1px solid var(--wp--preset--color--border);
	transition:background .12s ease;
}
.ds-hero-top5__list li:last-child .ds-hero-top5__row{border-bottom:0}
.ds-hero-top5__row:hover{background:var(--wp--preset--color--surface-2)}
.ds-hero-top5__main{
	display:flex;align-items:center;gap:.75rem;flex:1;min-width:0;
	text-decoration:none;color:inherit;
}
.ds-hero-top5__main:hover{text-decoration:none}
.ds-hero-top5__main:focus-visible{outline:2px solid var(--wp--preset--color--primary);outline-offset:2px}
.ds-hero-top5__row .ds-hero-top5__rk{
	font-family:var(--wp--preset--font-family--display);font-size:.65625rem;
	color:var(--wp--preset--color--muted);width:17px;flex:none;
}
.ds-hero-top5__row .ds-hero-top5__crown{display:block}
.ds-hero-top5__line{
	display:block;font-size:.8125rem;line-height:1.35;margin-top:3px;
	color:var(--wp--preset--color--muted);
	white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
/* 12.5px, not 13.5: Russo One is wider, and at 13.5 the evidence line ran into
   the ellipsis. Fourth role for the display face — see DESIGN-SYSTEM.md. */
.ds-hero-top5__line b{
	color:var(--wp--preset--color--text);
	font-family:var(--wp--preset--font-family--display);font-weight:400;font-size:.78125rem;
}

/* --- logo tiles ----------------------------------------------------------
   Square is the point: a wordmark slot of arbitrary proportion puts every name
   on a different vertical — the defect already on record for the super-table
   external favicons. Our own radius unifies marks that ship different corners. */
.ds-hero-top5__logo{
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-control);
	flex:none;display:block;object-fit:cover;background:var(--wp--preset--color--base);
}
.ds-hero-top5__logo--40{width:40px;height:40px}
.ds-hero-top5__logo--48{width:48px;height:48px}
.ds-hero-top5__logo--empty{
	display:grid;place-items:center;
	font-family:var(--wp--preset--font-family--display);font-size:.8125rem;
	color:var(--wp--preset--color--border-strong);
}

/* --- Play ---------------------------------------------------------------- */
.ds-hero-top5__play{
	font-family:var(--wp--preset--font-family--display);font-size:.6875rem;
	letter-spacing:var(--ds-track-btn);text-transform:uppercase;
	border-radius:var(--ds-radius-control);height:34px;padding:0 1.0625rem;
	display:grid;place-items:center;text-decoration:none;flex:none;white-space:nowrap;
	position:relative;background:var(--wp--preset--color--primary);color:var(--wp--preset--color--accent-ink);
}
.ds-hero-top5__play:hover{filter:brightness(1.1);text-decoration:none}
/* Pulsing glow. The shadow sits on a pseudo-element with no fill, so it paints
   OUTSIDE the button and never under the label; opacity is animated because it
   composites without repainting the button each frame.
   A deliberate exception to the site hover grammar (where a glow MEANS hover)
   and it only works while exactly one button on the screen pulses — the same
   scarce resource as the orange CTA. */
.ds-hero-top5__play::after{
	content:'';position:absolute;inset:0;border-radius:inherit;pointer-events:none;
	box-shadow:0 0 26px 2px color-mix(in srgb, var(--wp--preset--color--primary) 70%, transparent);
	opacity:.3;
}
@media (prefers-reduced-motion: no-preference){
	.ds-hero-top5__play::after{animation:ds-play-pulse 2.2s ease-in-out infinite}
}
@keyframes ds-play-pulse{0%,100%{opacity:.3}50%{opacity:1}}
.ds-hero-top5__play--ghost{
	background:none;border:1px solid var(--wp--preset--color--border-strong);
	color:var(--wp--preset--color--text);font-size:.65625rem;padding:0 .875rem;height:32px;
}
.ds-hero-top5__play--ghost:hover{border-color:var(--wp--preset--color--primary);color:var(--wp--preset--color--primary);filter:none}
.ds-hero-top5__play--ghost::after{display:none}

/* --- footer and empty state ----------------------------------------------- */
.ds-hero-top5__foot{
	display:flex;justify-content:space-between;align-items:center;gap:.625rem;
	margin-top:.75rem;padding-top:.625rem;
	border-top:1px solid var(--wp--preset--color--border);font-size:.71875rem;
}
.ds-hero-top5__method{
	color:var(--wp--preset--color--text-dim);text-decoration:none;
	border-bottom:1px dotted var(--wp--preset--color--border-strong);
}
.ds-hero-top5__method:hover{color:var(--wp--preset--color--primary);border-color:var(--wp--preset--color--primary);text-decoration:none}
.ds-hero-top5__stamp{color:var(--wp--preset--color--muted);font-size:.65625rem;white-space:nowrap}
.ds-hero-top5__stamp b{color:var(--wp--preset--color--text-dim);font-weight:500}
.ds-hero-top5__msg{
	color:var(--wp--preset--color--muted);font-size:.8125rem;line-height:1.6;margin-top:.875rem;
	border:1px dashed var(--wp--preset--color--border-strong);
	border-radius:var(--ds-radius-control);padding:1rem;text-align:center;
}

/* Narrow: the score bar goes first, then the tiles wrap. */
@media (max-width:30rem){
	.ds-hero-top5__stats{flex-wrap:wrap;row-gap:.75rem;justify-content:flex-start;gap:1.25rem}
	.ds-hero-top5__bar{display:none}
	.ds-hero-top5__play{padding:0 .875rem}
}

/* --- hero headline and lede (2026-07-31) ---------------------------------
   Sized HERE rather than on a preset, deliberately.

   The lede used to reference the `large` preset and rendered at 36px — larger
   than the site's own H2 — which nobody chose. Under theme.json v3 the slugs
   small/medium/large/x-large are RESERVED by core, so while defaultFontSizes
   is on, core's values win over the theme's: `large` resolves to core's 36px
   cap, not the theme's 19px. Pinning the hero to that preset means the hero
   silently follows whatever that argument settles on. An explicit size here
   does not.

   Both stay fluid because the originals were: a flat 52px headline would not
   survive a 360px phone. The clamps reach their cap at ~1040px and ~1077px, so
   the desktop hero is a stable 52 / 32 — measured, in
   docs/design-mockups/hero-left.html and hero-lede-copy.html. */
.ds-hero .ds-hero-h1{font-size:clamp(2.25rem, 5vw, 3.25rem)}
/* The lede's FOUR lines are load-bearing, not incidental. The left column has
   to reach the bottom of the casino card beside it, and at line-height 1.6 four
   lines of 32px are exactly the 205px that were missing — raising the spacing
   instead just opened a hole under the buttons.
   Which makes the copy's LENGTH structural: roughly 120 characters. A shorter,
   punchier line will not wrap to four here — it would need ~48px, larger than
   the site's own H2, which is the defect this pass set out to fix. Shorten the
   copy and the column drops ~50px short again. */
.ds-hero .ds-hero-lede{font-size:clamp(1.125rem, 3vw, 2rem);line-height:1.6}

/* ==========================================================================
   PRESS BAND — the "Featured in" strip (2026-07-31, reworked 2026-08-01)
   Markup in patterns/press-band.php. Replaces the old claim strip: the eyebrow
   and the H1 already say "we use math", and a third claim about ourselves
   proves nothing a reader can check.

   Canonical mockup: docs/design-mockups/hero-press-CURRENT.html. The arc that
   led there — full-green fills, six rival concepts, a pill ticker, the accent
   blot, the four-mark row, the label study — is in hero-press-{bg,concepts,
   ticker,glow,four,label}.html, each with what was rejected and why. Worth
   reading before reinventing any of it.
   ========================================================================== */
.ds-press{
	/* The knobs. Pill height is deliberately OUTSIDE the control scale
	   {30,34,48}, and that price is named rather than hidden: with four marks
	   48px leaves a quarter of the rail empty, while 64px fills 95% of it and
	   is exactly twice --ds-control-h-md. The ceiling is measured, not felt —
	   76px breaks the row onto a second line. */
	--ds-press-pill-h:4rem;
	--ds-press-pill-px:2.125rem;
	--ds-press-gap:1rem;
	/* Marks scale by MULTIPLIER, never by a shared height: each mark carries
	   its own ink-derived base from the pattern, and a common height would
	   throw that work away. */
	--ds-press-scale:1.5;
	--ds-press-ink:.78;
	/* Фона НЕТ намеренно (2026-08-01): здесь стоял непрозрачный base, и вместе
	   с шапкой и героем он давал 1042px сплошной плашки поверх фонового слоя.
	   Лента и так очерчена линиями сверху и снизу — плашка ей была не нужна. */
	/* No border-top: the rule below IS the top edge, with the label set into
	   its gap. Only the bottom edge stays a plain border. */
	border-bottom:1px solid var(--wp--preset--color--border);
	padding:0 0 1.75rem;
	/* Kill the block gap above. The 88px that sat between the stat row and
	   this band were two numbers of different kinds: 64px is the hero's own
	   padding-bottom, chosen and inline in patterns/hero.php, and 24px was
	   --wp--style--block-gap — a WP default nobody picked. Only the second one
	   is ours to remove. The band is a footnote to the hero, not a section
	   after it, so its space above should stay under the 80px that separates
	   it from the H2 below. */
	margin-top:0;
}
/* box-sizing is load-bearing, not boilerplate: without it the 1.25rem side
   padding is ADDED to max-width:100%, and the front page picked up exactly
   40px of horizontal scroll on mobile — 1.25rem x 2. Caught by audit:layout,
   and it is the same trap DESIGN-SYSTEM already records for controls. */
/* Ширина = рельс ПЛЮС собственные отступы. Иначе padding съедает рельс
   изнутри, и контент встаёт на 20px уже соседей: замерено — пилюли шли
   120…1254 против стат-полосы героя на 100…1340, то есть лента не держала
   левую вертикаль, на которой стоит вся страница. Отступы при этом нужны:
   на узком экране они не дают пилюлям упереться в край. */
.ds-press__rail{
	box-sizing:border-box;
	width:calc(var(--wp--style--global--wide-size) + 2.5rem);
	max-width:100%;margin:0 auto;padding:0 1.25rem;
}

/* Label IN THE TOP RULE, not on a line of its own — the band gets its top
   edge and its heading out of the same pixel row.
   Built from flex segments with the text between them, NOT a label absolutely
   positioned over a border: the gap then lands exactly on the word, needs no
   background colour to punch through, and survives the background changing.
   Russo One because the role table says so: it heads content, which makes it a
   BLOCK HEADING, and those get the brand face.
   text-dim, not muted: muted measures 3.91:1 here, under the 4.5 floor for
   small text. That miss is recorded site-wide in DESIGN-SYSTEM; this label is
   not the place to fix it globally, but it is no reason to repeat it. */
.ds-press__rule{display:flex;align-items:center;margin:0}
.ds-press__line{flex:1;height:1px;background:var(--wp--preset--color--border)}
/* The lead segment stops the rule exactly where the rail begins, less the
   breathing gap — so the LABEL, not the line, lands on the left vertical that
   H1, the lede and the stat row all stand on. Same left-anchor expression the
   theme already uses for prose; max() clamps it on narrow screens, where the
   rail offset goes negative. */
.ds-press__lead{
	flex:0 0 max(0px, calc((100% - var(--wp--style--global--wide-size)) / 2 - .875rem));
	height:1px;background:var(--wp--preset--color--border);
}
.ds-press__label{
	flex:none;padding:0 .875rem;white-space:nowrap;
	font-family:var(--wp--preset--font-family--display);
	font-size:.8125rem;letter-spacing:var(--ds-track-caps);text-transform:uppercase;
	color:var(--wp--preset--color--text-dim);margin:0;
}

/* Edge to edge on the rail, exactly like the hero stat row directly above —
   same `space-between`, same left vertical, same right one. The first mark's
   left edge and the last mark's right edge land on the rail, so the band reads
   as the same width as everything else on the page instead of trailing off.
   `gap` stays as the FLOOR, not the actual spacing: it is what mobile falls
   back to once the row centres and wraps. */
.ds-press__row{
	display:flex;justify-content:space-between;align-items:center;
	gap:var(--ds-press-gap);flex-wrap:wrap;
	/* Отбивка от линии живёт здесь: подпись больше не отдельная строка и
	   собственного margin-bottom не даёт. */
	margin-top:1.5rem;
}

/* The pill. Ring at full primary, and NO hover state anywhere — the marks are
   not links yet, and a cursor must not promise a click that will not happen.
   That is also why the pattern emits <span>, not <a>. */
.ds-press__pill{
	/* box-sizing обязателен, и это записанная грабля, а не перестраховка:
	   токен означает ВНЕШНЮЮ высоту, а без него бордер ложится поверх неё —
	   64px превращались в 66, а мобильные 48 в 50, то есть значение молча
	   переставало принадлежать шкале. Поймано verify-press-live.mjs. */
	box-sizing:border-box;
	display:flex;align-items:center;justify-content:center;flex:none;
	height:var(--ds-press-pill-h);padding:0 var(--ds-press-pill-px);
	border:1px solid var(--wp--preset--color--primary);
	border-radius:var(--ds-radius-pill);background:transparent;
}

/* Height, never width — and a height set PER LOGO, from the pattern, scaled by
   one shared multiplier. Wordmarks arrive between 5.8:1 and 11.4:1. Pinning a
   common width would blow up the narrow ones and crush the wide ones; pinning
   a common HEIGHT looks fair but is not — at equal height Business Insider ran
   nearly twice Yahoo's width and simply read as bigger. */
.ds-press__logo{
	display:block;width:auto;
	height:calc(var(--ds-press-h,19px) * var(--ds-press-scale));
	/* One filter for any incoming colour. brightness(0) flattens to black,
	   invert(1) lifts to white, opacity mutes — alpha survives. grayscale()
	   would NOT work here: it keeps lightness, so Business Insider's #0a0a0a
	   would stay invisible on our #07090A and MarketWatch's #3f0 would still
	   fight the site's own accent green.
	   The opacity term is per-logo on purpose: CoinMarketCap's thin icon ring
	   carries 39% of the others' ink and reads broken at the shared value, and
	   paying that in weight rather than in size leaves the row width alone. */
	filter:brightness(0) invert(1) opacity(var(--ds-press-ink));
}

@media (max-width:48rem){
	/* 48px is not a smaller guess, it is the scale's own large control height.
	   Four marks at 64px do not fit a 390px screen by any wrapping. */
	.ds-press{--ds-press-pill-h:3rem;--ds-press-pill-px:1.25rem;--ds-press-scale:1.1;--ds-press-gap:.75rem}
	.ds-press__row{justify-content:center;margin-top:1.25rem}
	/* Левый якорь на узком экране схлопывается в ноль, и подпись упёрлась бы
	   в край. Отрезок становится обычным флексом — разрыв встаёт по центру,
	   туда же, куда на мобилке центрируется и сам ряд. */
	.ds-press__lead{flex:1}
	.ds-press__pill{max-width:100%}
	.ds-press__logo{max-width:100%;object-fit:contain}
}

/* --- Страница игры /games/{slug}/ (дизайн-проход 13a, 2026-08-05) ----------
   Макет — docs/design-mockups/_source/game-page-13a.html, разбор —
   docs/DESIGN-SYSTEM.md, «Страница игры». Разметка — patterns/game-page.php.

   ⚠️ Рельс 1240, а не макетные 1440: инвариант темы. Радиусы взяты из шкалы
   (panel 12 / control 8 / chip 6 / pill 999), а не макетные 22/18/16/14/11/9/5
   — шкала это закрытое множество, и семь новых значений ради одной страницы
   развалили бы её. Кегли заголовков те же, что на /games/: одна система на
   обе страницы про игры. */
.ds-gp{display:flex;flex-direction:column;gap:3.25rem}
.ds-gp > *{margin-block:0}

/* шапка */
.ds-gp__head-cols{display:grid;grid-template-columns:minmax(0,1fr) 380px;gap:2.75rem;align-items:start}
.ds-gp__id{display:flex;flex-direction:column;gap:1.375rem;min-width:0}
.ds-gp__idline{display:flex;align-items:center;gap:1.25rem}
.ds-gp__logo{
	box-sizing:border-box;flex:none;display:flex;align-items:center;justify-content:center;
	width:64px;height:64px;overflow:hidden;
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);
}
.ds-gp__logo img{width:100%;height:100%;object-fit:contain;display:block}
/* Монограмма — запасной вариант, когда файла логотипа нет. */
.ds-gp__logo--mono{
	font-family:var(--wp--preset--font-family--display);
	font-size:1.1875rem;color:var(--wp--preset--color--primary);
}
.ds-gp__idtext{display:flex;flex-direction:column;gap:.625rem;min-width:0}
.ds-gp__title{
	margin:0;font-family:var(--wp--preset--font-family--display);
	font-size:clamp(2.25rem,5vw,3rem);line-height:1.06;font-weight:400;
	text-transform:uppercase;color:var(--wp--preset--color--contrast);
}
.ds-gp__idmeta{display:flex;align-items:center;flex-wrap:wrap;gap:.875rem}
/* Стамп — общий компонент; здесь он в ряду, а не под H1, поэтому без margin. */
.ds-gp__stamp{margin:0}
.ds-gp__rating{
	display:flex;align-items:center;gap:.5625rem;
	font-size:.5625rem;font-weight:700;letter-spacing:var(--ds-track-caps);
	text-transform:uppercase;color:var(--wp--preset--color--muted);
}
.ds-gp__rating b{
	font-family:var(--wp--preset--font-family--display);font-weight:400;
	font-size:.8125rem;letter-spacing:0;color:var(--wp--preset--color--primary);
}
.ds-gp__bar{width:110px;height:4px;border-radius:2px;background:var(--wp--preset--color--surface-2);overflow:hidden}
.ds-gp__bar span{display:block;height:100%;background:var(--wp--preset--color--primary)}

/* Введение. Кегль выше прозы намеренно — это обещание страницы, а не текст. */
.ds-gp__intro{
	display:flex;flex-direction:column;gap:.875rem;
	border-left:2px solid var(--wp--preset--color--border-strong);padding-left:1.5rem;
}
.ds-gp__intro p{
	margin:0;max-width:700px;font-size:1.0625rem;line-height:1.65;
	color:var(--wp--preset--color--text-dim);text-wrap:pretty;
}
.ds-gp__eyebrow{
	font-size:.625rem;font-weight:700;letter-spacing:.2em;text-transform:uppercase;
	color:var(--wp--preset--color--primary);
}
.ds-gp__eyebrow--dim{color:var(--wp--preset--color--muted)}

/* buy-box */
.ds-gp__buy{
	box-sizing:border-box;display:flex;flex-direction:column;gap:.875rem;
	background:var(--wp--preset--color--base);
	border:1px solid var(--wp--preset--color--border-strong);
	border-radius:var(--ds-radius-panel);padding:1.5rem;
	box-shadow:0 0 44px color-mix(in srgb,var(--wp--preset--color--primary) 9%,transparent);
}
.ds-gp__price{display:flex;align-items:baseline;justify-content:space-between;gap:.75rem}
.ds-gp__price b{
	font-family:var(--wp--preset--font-family--display);font-weight:400;
	font-size:1.875rem;line-height:1;color:var(--wp--preset--color--contrast);
}
.ds-gp__price span{
	font-size:.625rem;font-weight:700;letter-spacing:var(--ds-track-caps);
	text-transform:uppercase;color:var(--wp--preset--color--muted);text-align:right;
}
.ds-gp__note{
	font-size:.8125rem;line-height:1.55;color:var(--wp--preset--color--text-dim);
	padding-bottom:.25rem;border-bottom:1px solid var(--wp--preset--color--border);text-wrap:pretty;
}
.ds-gp__fine{font-size:.6875rem;line-height:1.5;color:var(--wp--preset--color--muted);text-wrap:pretty}
/* ⚠️ Кнопка ЗЕЛЁНАЯ, а не оранжевая CTA. Оранжевый в системе — дефицитный
   конверсионный цвет, 1–2 на экран, и он уже занят кнопкой в шапке сайта. */
.ds-gp__play{
	display:inline-flex;align-items:center;justify-content:center;gap:.5625rem;
	background:var(--wp--preset--color--primary);color:var(--wp--preset--color--accent-ink);
	font-family:var(--wp--preset--font-family--display);font-size:.8125rem;
	letter-spacing:.1em;text-transform:uppercase;text-decoration:none;
	padding:.9375rem 1.25rem;border-radius:var(--ds-radius-control);
	transition:background-color .2s ease;
}
.ds-gp__play:hover{background:var(--wp--preset--color--primary-dark);color:var(--wp--preset--color--accent-ink);text-decoration:none}

/* полоса спеков — волосяная сетка через gap на подложке */
.ds-gp__specs{
	display:grid;grid-template-columns:repeat(var(--ds-gp-cols,6),minmax(0,1fr));gap:1px;margin:0;
	background:var(--wp--preset--color--border);border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);overflow:hidden;
}
.ds-gp__specs > div{display:flex;flex-direction:column;gap:.4375rem;background:var(--wp--preset--color--surface);padding:1.125rem 1.25rem}
.ds-gp__specs dt{margin:0;font-size:.5625rem;font-weight:700;letter-spacing:var(--ds-track-caps);text-transform:uppercase;color:var(--wp--preset--color--muted)}
.ds-gp__specs dd{margin:0;font-family:var(--wp--preset--font-family--display);font-size:1.0625rem;line-height:1.15;color:var(--wp--preset--color--contrast);overflow-wrap:anywhere}
/* Зелёное значение — «лучший из шести». Оно ВЫВЕДЕНО сравнением
   (dicestrategies_game_spec_bests()), а не проставлено руками, поэтому не
   может остаться у прежнего чемпиона после правки данных. */
.ds-gp__specs dd.is-best{color:var(--wp--preset--color--primary)}
/* Ячейка, у которой короткого значения нет и в слот попала проза. Дисплейная
   гарнитура рассчитана на «$50,000»; «API up to ~500 bets/min; UI autobet
   ~180/min» она разгоняет на три строки, и ячейка читается недоделанной.
   Класс ставится ПО ИСТОЧНИКУ значения (короткое поле пусто), а не по длине
   строки: гадать по виду текста — то же, что разбирать его. */
.ds-gp__specs dd.is-prose{
	font-family:var(--wp--preset--font-family--body);
	font-size:.875rem;line-height:1.45;
}
.ds-gp__specs small{font-size:.6875rem;line-height:1.4;color:var(--wp--preset--color--muted)}

/* заголовок секции */
.ds-gp__sechead{display:flex;align-items:baseline;flex-wrap:wrap;gap:1rem}
.ds-gp__sechead h2{margin:0;font-size:1.875rem;line-height:1.05}
.ds-gp__sechead span{font-size:.75rem;font-weight:700;letter-spacing:var(--ds-track-caps);text-transform:uppercase;color:var(--wp--preset--color--muted)}

/* симулятор: наша обёртка вокруг НАСТОЯЩЕГО блока */
.ds-gp__simwrap{display:flex;flex-direction:column;gap:1.25rem}
/* ⚠️ Тот же приём, что у `.ds-gp > *`, и по той же причине. Обёртка — блочная
   группа, и ядро само раздаёт её детям, начиная со второго, `margin-top:24px`
   (правило `:where(.wp-block-group.is-layout-flow) > * + *`). Он ложится
   ПОВЕРХ нашего gap:20px, и шов под заголовком секции становился 44px вместо
   двадцати — на глаз читалось так, будто симулятор оторвался от подписи. */
.ds-gp__simwrap > *{margin-block:0}
.ds-gp__simbar{
	display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1.25rem;
	padding:.8125rem 1.625rem;
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel) var(--ds-radius-panel) 0 0;
	border-bottom:0;
}
.ds-gp__led{
	display:flex;align-items:center;gap:.625rem;
	font-family:var(--wp--preset--font-family--display);font-size:.6875rem;
	letter-spacing:.18em;text-transform:uppercase;color:var(--wp--preset--color--contrast);
}
/* ⚠️ Точка НЕ пульсирует — та же оговорка, что у стампа проверки данных:
   пульсация обещает живой поток, а пресет статичен. */
.ds-gp__led i{
	width:7px;height:7px;border-radius:50%;background:var(--wp--preset--color--primary);
	box-shadow:0 0 10px color-mix(in srgb,var(--wp--preset--color--primary) 80%,transparent);
}
.ds-gp__limits{font-size:.6875rem;letter-spacing:.04em;color:var(--wp--preset--color--muted)}
/* Блок симулятора примыкает к полосе — они читаются одной панелью. */
.ds-gp__simwrap .wp-block-dicestrategies-dice-simulator{margin-block:0}

/* плюсы и минусы */
.ds-gp__pc{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;align-items:start}
.ds-gp__pros,.ds-gp__cons{
	display:flex;flex-direction:column;gap:1rem;
	background:var(--wp--preset--color--base);
	border:1px solid var(--wp--preset--color--border);
	border-radius:0 var(--ds-radius-panel) var(--ds-radius-panel) 0;
	padding:1.75rem 1.875rem;
}
.ds-gp__pros{border-left:2px solid var(--wp--preset--color--primary)}
.ds-gp__cons{border-left:2px solid var(--wp--preset--color--muted)}
.ds-gp__pc h2{margin:0;font-family:var(--wp--preset--font-family--body);font-size:.6875rem;font-weight:700;letter-spacing:.18em;text-transform:uppercase;line-height:1.4}
.ds-gp__pros h2{color:var(--wp--preset--color--primary)}
.ds-gp__cons h2{color:var(--wp--preset--color--text-dim)}
.ds-gp__pc ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1rem}
.ds-gp__pc li{display:flex;gap:.75rem;font-size:.875rem;line-height:1.55;color:var(--wp--preset--color--text-dim);text-wrap:pretty}
.ds-gp__mark{flex:none;color:var(--wp--preset--color--primary)}
.ds-gp__cons .ds-gp__mark{color:var(--wp--preset--color--muted)}

/* критерии: рельс плюс карточки групп */
.ds-gp__criteria-wrap,.ds-gp__strats-wrap{display:flex;flex-direction:column;gap:1.375rem}
.ds-gp__criteria{display:grid;grid-template-columns:220px minmax(0,1fr);gap:2.5rem;align-items:start}
.ds-gp__rail{display:flex;flex-direction:column;gap:2px;position:sticky;top:1.5rem}
.ds-gp__rail a{
	display:flex;align-items:baseline;justify-content:space-between;gap:.625rem;
	padding:.75rem .875rem;border-radius:var(--ds-radius-control);
	border-left:2px solid transparent;text-decoration:none;
	font-size:.6875rem;font-weight:700;letter-spacing:var(--ds-track-caps);
	text-transform:uppercase;color:var(--wp--preset--color--text-dim);
}
.ds-gp__rail a:hover{background:color-mix(in srgb,var(--wp--preset--color--primary) 6%,transparent);color:var(--wp--preset--color--contrast);text-decoration:none}
/* Текущая группа. Селектор по `aria-current`, а не по классу: состояние одно,
   и знать о нём должны и глаз, и экранный диктор — второй атрибут ради
   подсветки завёл бы два источника одной правды. */
.ds-gp__rail a[aria-current]{
	background:color-mix(in srgb,var(--wp--preset--color--primary) 7%,transparent);
	border-left-color:var(--wp--preset--color--primary);
	color:var(--wp--preset--color--primary);
}
.ds-gp__rail a b{font-family:var(--wp--preset--font-family--display);font-weight:400;font-size:.6875rem;letter-spacing:0;color:var(--wp--preset--color--muted)}
.ds-gp__groups{display:flex;flex-direction:column;gap:1rem;min-width:0}
.ds-gp__group{
	display:flex;flex-direction:column;
	background:var(--wp--preset--color--base);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);overflow:hidden;
	/* Якорь рельса, а не scrollIntoView: шапка сайта не перекрывает заголовок. */
	scroll-margin-top:1.5rem;
}
.ds-gp__group > header{display:flex;align-items:baseline;flex-wrap:wrap;gap:.75rem;padding:1.125rem 1.625rem;border-bottom:1px solid var(--wp--preset--color--border)}
.ds-gp__group > header b{font-family:var(--wp--preset--font-family--display);font-weight:400;font-size:.875rem;letter-spacing:.06em;text-transform:uppercase;color:var(--wp--preset--color--contrast)}
/* Подзаголовок группы — что она отвечает. Кегль и тон те же, что у подписи в
   шапке секции: это та же работа этажом ниже, и второй голос тут был бы
   вторым уровнем иерархии, которого нет. */
.ds-gp__group > header span{font-size:.625rem;font-weight:700;letter-spacing:var(--ds-track-caps);text-transform:uppercase;color:var(--wp--preset--color--muted)}
.ds-gp__crow{
	display:grid;grid-template-columns:280px minmax(0,1fr);gap:2.25rem;
	padding:.875rem 1.625rem;border-bottom:1px solid var(--wp--preset--color--border);
}
.ds-gp__crow:last-child{border-bottom:0}
.ds-gp__k{display:flex;flex-direction:column;gap:.3125rem;font-size:.8125rem;color:var(--wp--preset--color--text-dim)}
.ds-gp__v{display:flex;flex-direction:column;gap:.5rem;max-width:620px;font-size:.875rem;line-height:1.55;color:var(--wp--preset--color--text-dim);text-wrap:pretty;overflow-wrap:anywhere}
/* Notable-строка: засечка слева внутренней тенью, а не border — рамка сдвинула
   бы содержимое строки на два пикселя относительно соседних. */
.ds-gp__crow--notable{
	background:color-mix(in srgb,var(--wp--preset--color--primary) 4%,transparent);
	box-shadow:inset 2px 0 0 var(--wp--preset--color--primary);
}
.ds-gp__crow--notable .ds-gp__v{color:var(--wp--preset--color--contrast);font-weight:500}
.ds-gp__tag{
	font-size:.5625rem;font-weight:700;letter-spacing:var(--ds-track-caps);
	text-transform:uppercase;color:var(--wp--preset--color--primary);
}
/* Правило .ds-gp__src снято 2026-08-11 вместе с показом источника — решение
   владельца, «юзеру ни к чему». Провенанс остался в ds_criteria_sources. */

/* стратегии */
.ds-gp__strats{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem}
.ds-gp__scard{
	display:flex;flex-direction:column;gap:.875rem;text-decoration:none;
	background:var(--wp--preset--color--base);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);padding:1.625rem 1.75rem;
	transition:border-color .2s ease;
}
/* ⚠️ Зелёная рамка на наведении ТОЛЬКО ЗДЕСЬ, скоупом на карточку стратегии.
   Сайтвайдная грамматика наведения — серая `border-strong`, и менять её тут
   значило бы менять её везде. На этой странице зелёное наведение оправдано
   тем, что карточки уже несут зелёные состояния (бейдж, рамка лучшей), и
   серая подсветка читалась бы выключением, а не откликом. */
.ds-gp__scard:hover{border-color:var(--wp--preset--color--primary);text-decoration:none}
/* Лучшая на этой игре: рамка зелёная, но приглушённая, а не в полный primary.
   В полный она сравнялась бы с наведением, и на карточке было бы нечем
   показать отклик — состояние «лучшая» съело бы состояние «под курсором». */
.ds-gp__scard.is-best{border-color:color-mix(in srgb,var(--wp--preset--color--primary) 45%,var(--wp--preset--color--border))}
.ds-gp__st{display:flex;align-items:center;justify-content:space-between;gap:.75rem}
.ds-gp__st b{font-family:var(--wp--preset--font-family--display);font-weight:400;font-size:1.1875rem;color:var(--wp--preset--color--contrast)}
/* Бейдж: контур у «works», заливка у «best here». Разница именно в заливке,
   а не в цвете — два зелёных оттенка рядом читались бы шумом, а «залито
   против обведено» видно с любого расстояния. */
.ds-gp__badge{
	flex:none;
	font-size:.5625rem;font-weight:700;letter-spacing:var(--ds-track-caps);text-transform:uppercase;
	color:var(--wp--preset--color--primary);
	background:color-mix(in srgb,var(--wp--preset--color--primary) 8%,transparent);
	border:1px solid var(--wp--preset--color--border-strong);
	border-radius:var(--ds-radius-chip);padding:.25rem .5rem;
}
.ds-gp__badge.is-best{
	color:var(--wp--preset--color--accent-ink);
	background:var(--wp--preset--color--primary);
	border-color:var(--wp--preset--color--primary);
}
.ds-gp__scard p{margin:0;font-size:.875rem;line-height:1.6;color:var(--wp--preset--color--text-dim);text-wrap:pretty}
.ds-gp__sstat{
	display:flex;align-items:baseline;gap:.625rem;padding-top:.75rem;
	border-top:1px solid var(--wp--preset--color--border);
	font-size:.625rem;font-weight:700;letter-spacing:var(--ds-track-caps);
	text-transform:uppercase;color:var(--wp--preset--color--muted);
}
.ds-gp__sstat b{font-family:var(--wp--preset--font-family--display);font-weight:400;font-size:1.125rem;letter-spacing:0;color:var(--wp--preset--color--contrast)}

/* закрывающий блок */
.ds-gp__close{display:grid;grid-template-columns:1.25fr minmax(0,1fr);gap:1rem;align-items:start}
.ds-gp__verdict{
	display:flex;flex-direction:column;gap:1rem;
	background:var(--wp--preset--color--base);
	border:1px solid var(--wp--preset--color--border);
	border-left:2px solid var(--wp--preset--color--primary);
	border-radius:0 var(--ds-radius-panel) var(--ds-radius-panel) 0;
	padding:1.75rem 1.875rem;
}
/* Заголовок вердикта. Кегль 24 — ниже h2 секции (30), потому что это вывод
   внутри блока, а не заголовок ещё одной секции: сравнявшись с h2, он завёл
   бы на странице второй уровень «Verdict» поверх надзаголовка. */
.ds-gp__vhead{
	margin:0;font-family:var(--wp--preset--font-family--display);font-weight:400;
	font-size:1.5rem;line-height:1.25;color:var(--wp--preset--color--contrast);text-wrap:pretty;
}
.ds-gp__verdict p{margin:0;font-size:.9375rem;line-height:1.65;color:var(--wp--preset--color--text-dim);max-width:640px;text-wrap:pretty}
.ds-gp__chips{display:flex;flex-wrap:wrap;gap:.625rem}
.ds-gp__chip{
	font-size:.625rem;font-weight:700;letter-spacing:var(--ds-track-caps);text-transform:uppercase;
	color:var(--wp--preset--color--text-dim);
	border:1px solid var(--wp--preset--color--border-strong);
	border-radius:var(--ds-radius-chip);padding:.3125rem .625rem;
}
.ds-gp__method{
	display:flex;flex-direction:column;gap:.875rem;
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);padding:1.75rem 1.875rem;
}
.ds-gp__method p{margin:0;font-size:.875rem;line-height:1.65;color:var(--wp--preset--color--text-dim);text-wrap:pretty}
.ds-gp__stampline{
	font-size:.6875rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;
	color:var(--wp--preset--color--muted);padding-top:.75rem;
	border-top:1px solid var(--wp--preset--color--border);
}

@media (max-width:75rem){
	.ds-gp{gap:2.5rem}
	.ds-gp__head-cols,.ds-gp__criteria,.ds-gp__pc,.ds-gp__strats,.ds-gp__close{grid-template-columns:minmax(0,1fr)}
	/* Рельс перестаёт быть колонкой и становится рядом чипов — липкость в
	   одноколоночной раскладке съедала бы верх экрана. */
	.ds-gp__rail{position:static;flex-direction:row;flex-wrap:wrap}
	.ds-gp__specs{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media (max-width:48rem){
	.ds-gp__specs{grid-template-columns:repeat(2,minmax(0,1fr))}
	.ds-gp__crow{grid-template-columns:minmax(0,1fr);gap:.5rem}
	.ds-gp__idline{gap:.875rem}
	.ds-gp__logo{width:48px;height:48px}
}

/* --- Страница стратегии /strategies/{slug}/ (проход 16a, 2026-08-05) -------
   Макет — docs/design-mockups/_source/strategy-page-16a.html, бриф — рядом,
   разбор — docs/DESIGN-SYSTEM.md, «Страница стратегии». Разметка —
   patterns/strategy-page.php.

   ЧТО ПЕРЕЛОЖЕНО, А НЕ ВЗЯТО ИЗ МАКЕТА:
   — рельс 1240, а не макетные 1440: инвариант темы;
   — радиусы 20/18/16/14/12/11/10/5 → шкала (panel 12 / control 8 / chip 6 /
     pill 999). Восемь новых значений ради одной страницы развалили бы шкалу,
     которая для того и закрыта;
   — цвета токенами: зелёный макета #37e06b отстоит от нашего #14F46F на
     41 единицу RGB, это второй фирменный цвет, а не оттенок. То же с фоном,
     хайрлайнами и амброй;
   — ⚠️ IBM PLEX MONO В ТЕМЕ НЕТ И НЕ БУДЕТ. Гарнитур две: Russo One для
     заголовков и CTA, Space Grotesk для всего остального. Чего макет хотел от
     моноширинного — выравнивания цифр в столбик — даёт
     `font-variant-numeric:tabular-nums`, и даёт в любой гарнитуре;
   — ⚠️ КЕГЛИ ЗАДАНЫ ЯВНО, БЕЗ ПРЕСЕТОВ. `defaultFontSizes` в theme.json v3 не
     выключён, и ядро подменяет large/x-large/medium своими значениями:
     `large` приезжает 36px вместо наших 19. На этом уже трижды обжигались
     (разбор — DESIGN-SYSTEM, «Ядро WP давит четыре токена размера»).
     Заголовки взяты те же, что на /games/ и на странице игры: h1
     clamp(2.25rem,5vw,3rem), h2 1.875rem. */
.ds-sp{display:flex;flex-direction:column;gap:3.25rem}
/* ⚠️ Ядро раздаёт детям блочной группы `margin-top:24px` правилом
   `:where(.wp-block-group.is-layout-flow) > * + *`. Он ложится ПОВЕРХ нашего
   gap, и каждый шов страницы становился бы на 24px больше заявленного. */
.ds-sp > *{margin-block:0}

/* ── шапка ─────────────────────────────────────────────────────────────── */
.ds-sp__head{display:flex;flex-direction:column;gap:1.5rem}
.ds-sp__head-cols{display:grid;grid-template-columns:minmax(0,1fr) 380px;gap:2.75rem;align-items:start}
.ds-sp__id{display:flex;flex-direction:column;gap:1.375rem;min-width:0}
.ds-sp__titlerow{display:flex;align-items:center;flex-wrap:wrap;gap:1.125rem}
.ds-sp__title{
	margin:0;font-family:var(--wp--preset--font-family--display);
	font-size:clamp(2.25rem,5vw,3rem);line-height:1.06;font-weight:400;
	text-transform:uppercase;color:var(--wp--preset--color--contrast);
}
.ds-sp__pill{
	display:inline-flex;align-items:center;gap:.5625rem;
	border:1px solid var(--wp--preset--color--border-strong);
	border-radius:var(--ds-radius-pill);padding:.375rem .8125rem;
	font-size:.625rem;font-weight:700;letter-spacing:.16em;text-transform:uppercase;
	color:var(--wp--preset--color--muted);
}
/* Риск — единственная пилюля с цветом: она сообщает величину, а не категорию. */
.ds-sp__pill--risk{
	border-color:color-mix(in srgb,var(--wp--preset--color--caution) 40%,transparent);
	background:color-mix(in srgb,var(--wp--preset--color--caution) 8%,transparent);
	color:var(--wp--preset--color--caution);
}
/* Введение. Кегль выше прозы намеренно — это обещание страницы, а не текст.
   Тот же компонент, что лид на странице игры. */
.ds-sp__lead{
	display:flex;flex-direction:column;gap:.875rem;
	border-left:2px solid var(--wp--preset--color--border-strong);padding-left:1.5rem;
	scroll-margin-top:1.5rem;
}
.ds-sp__lead p{
	margin:0;max-width:720px;font-size:1.0625rem;line-height:1.65;
	color:var(--wp--preset--color--text-dim);text-wrap:pretty;
}
.ds-sp__eyebrow{
	font-size:.625rem;font-weight:700;letter-spacing:.2em;text-transform:uppercase;
	color:var(--wp--preset--color--primary);
}
.ds-sp__anchors{display:flex;flex-wrap:wrap;gap:.5rem}
.ds-sp__anchors a{
	font-size:.6875rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-pill);padding:.5rem .9375rem;
	color:var(--wp--preset--color--text-dim);
}
.ds-sp__anchors a:hover{
	border-color:var(--wp--preset--color--border-strong);
	color:var(--wp--preset--color--contrast);text-decoration:none;
}
/* Текущая секция отмечена `aria-current="location"`, и стиль висит НА НЁМ, а
   не на классе: диктору и глазу полагается одно и то же знание, и держать их
   в двух атрибутах значит однажды их развести. */
.ds-sp__anchors a[aria-current],
.ds-sp__anchors a[aria-current]:hover{
	background:var(--wp--preset--color--primary);
	border-color:var(--wp--preset--color--primary);
	color:var(--wp--preset--color--accent-ink);
}

/* ── скоркарта ─────────────────────────────────────────────────────────── */
.ds-sp__scorecard{
	box-sizing:border-box;display:flex;flex-direction:column;gap:1rem;
	background:var(--wp--preset--color--base);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);padding:1.5rem 1.625rem;
}
.ds-sp__sctop{
	display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:.75rem;
	font-size:.625rem;font-weight:700;letter-spacing:.18em;text-transform:uppercase;
	color:var(--wp--preset--color--muted);
}
.ds-sp__stamp{margin:0}
.ds-sp__score{display:flex;align-items:baseline;flex-wrap:wrap;gap:.75rem}
.ds-sp__score b{
	font-family:var(--wp--preset--font-family--display);font-weight:400;
	font-size:2.75rem;line-height:1;font-variant-numeric:tabular-nums;
}
.ds-sp__score span{font-size:.8125rem;color:var(--wp--preset--color--muted)}
.ds-sp__scfacts{
	margin:0;display:flex;flex-direction:column;gap:.6875rem;
	padding-top:1rem;border-top:1px solid var(--wp--preset--color--border);
}
.ds-sp__scfacts div{display:flex;align-items:baseline;justify-content:space-between;gap:.875rem}
.ds-sp__scfacts dt{font-size:.75rem;color:var(--wp--preset--color--muted)}
.ds-sp__scfacts dd{
	margin:0;font-family:var(--wp--preset--font-family--display);font-weight:400;
	font-size:.8125rem;text-align:right;color:var(--wp--preset--color--contrast);
	font-variant-numeric:tabular-nums;
}
/* Три состояния значения — одна пара классов на всю страницу: балл стратегии,
   балл казино и ячейки фактов красятся ОДНИМ порогом, иначе «8.4» было бы
   зелёным в скоркарте и жёлтым в карточке. */
.ds-sp .is-good{color:var(--wp--preset--color--primary)}
.ds-sp .is-warn{color:var(--wp--preset--color--caution)}
.ds-sp .is-bad{color:var(--wp--preset--color--danger)}

/* ── заголовок секции ──────────────────────────────────────────────────── */
.ds-sp__sechead{display:flex;align-items:baseline;flex-wrap:wrap;gap:1rem}
.ds-sp__sechead h2{margin:0;font-size:1.875rem;line-height:1.05}
.ds-sp__sechead span{
	font-size:.75rem;font-weight:700;letter-spacing:var(--ds-track-caps);
	text-transform:uppercase;color:var(--wp--preset--color--muted);
}
.ds-sp__sechead-row{display:flex;align-items:flex-end;justify-content:space-between;flex-wrap:wrap;gap:1.875rem}
.ds-sp__allsix{
	font-size:.75rem;font-weight:700;letter-spacing:.1em;text-transform:uppercase;white-space:nowrap;
}

/* ── лестница ──────────────────────────────────────────────────────────── */
.ds-sp__ladder-wrap{display:flex;flex-direction:column;gap:1.125rem;scroll-margin-top:1.5rem}
/* Прокрутка на узком экране лежит НА СВОЁМ контейнере, а не на самой полосе:
   гвард вёрстки не считает нарушением то, что торчит внутри прокрутки, но
   всё, что торчит из неподвижного бокса, считает — и правильно делает. */
.ds-sp__ladder-scroll{
	overflow-x:auto;
	background:var(--wp--preset--color--base);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);
}
.ds-sp__ladder{display:flex;align-items:flex-end;gap:.5rem;padding:1.625rem 1.75rem 1.375rem}
.ds-sp__step{flex:1;min-width:42px;display:flex;flex-direction:column;align-items:center;gap:.5625rem}
.ds-sp__step b{
	font-family:var(--wp--preset--font-family--display);font-weight:400;
	font-size:.8125rem;color:var(--wp--preset--color--text-dim);
	font-variant-numeric:tabular-nums;
}
/* Столбик проигранной ставки — амбра, выигранной — зелень. Цвет тут значение,
   а не украшение, поэтому подпись под столбиком повторяет его словом: цветом
   одним информацию не передают. */
.ds-sp__step i{
	width:100%;display:block;border-radius:var(--ds-radius-chip) var(--ds-radius-chip) 0 0;
	background:color-mix(in srgb,var(--wp--preset--color--caution) 16%,transparent);
}
.ds-sp__step small{font-size:.6875rem;color:var(--wp--preset--color--muted)}
.ds-sp__step.is-win b,.ds-sp__step.is-win small{color:var(--wp--preset--color--primary)}
.ds-sp__step.is-win i{background:color-mix(in srgb,var(--wp--preset--color--primary) 22%,transparent)}
/* Многоточие «ряд продолжается» — не столбик: рисовать его высотой значило бы
   назвать высоту ставки, которой в базе нет. */
.ds-sp__step--more{flex:0 0 auto;min-width:1.5rem;justify-content:flex-end}
.ds-sp__step--more b{color:var(--wp--preset--color--muted)}
.ds-sp__step--more i{background:none}
.ds-sp__ladder-note{
	margin:0;max-width:var(--ds-measure);font-size:.8125rem;line-height:1.6;
	color:var(--wp--preset--color--muted);text-wrap:pretty;
}

/* ── плюсы и минусы ────────────────────────────────────────────────────── */
.ds-sp__pc{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1rem;align-items:start;scroll-margin-top:1.5rem}
.ds-sp__pros,.ds-sp__cons{
	display:flex;flex-direction:column;gap:1rem;
	background:var(--wp--preset--color--base);
	border:1px solid var(--wp--preset--color--border);
	border-radius:0 var(--ds-radius-panel) var(--ds-radius-panel) 0;
	padding:1.75rem 1.875rem;
}
.ds-sp__pros{border-left:2px solid var(--wp--preset--color--primary)}
.ds-sp__cons{border-left:2px solid var(--wp--preset--color--muted)}
/* «Works because» / «Breaks because» набраны подписью, а не заголовком: на
   странице уже есть уровень h2 у секций, и второй дисплейный кегль рядом
   спорил бы с ним за старшинство. */
.ds-sp__pc h2{
	margin:0;font-family:var(--wp--preset--font-family--body);
	font-size:.6875rem;font-weight:700;letter-spacing:.18em;text-transform:uppercase;line-height:1.4;
}
.ds-sp__pros h2{color:var(--wp--preset--color--primary)}
.ds-sp__cons h2{color:var(--wp--preset--color--text-dim)}
.ds-sp__pc ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1rem}
.ds-sp__pc li{display:flex;gap:.75rem;font-size:.875rem;line-height:1.55;color:var(--wp--preset--color--text-dim);text-wrap:pretty}
.ds-sp__mark{flex:none;color:var(--wp--preset--color--primary)}
.ds-sp__cons .ds-sp__mark{color:var(--wp--preset--color--muted)}

/* ── калькулятор: наша обёртка вокруг НАСТОЯЩЕГО блока ─────────────────── */
.ds-sp__calcwrap{display:flex;flex-direction:column;gap:1.25rem;scroll-margin-top:1.5rem}
/* ⚠️ Та же мина, что у обёртки симулятора на странице игры, и я на ней тоже
   попался: ядро добавляет детям потоковой группы `margin-top:24px` поверх
   нашего gap, и шов под полосой статуса становится 44px вместо двадцати. */
.ds-sp__calcwrap > *{margin-block:0}
.ds-sp__calcbar{
	display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:1.25rem;
	padding:.8125rem 1.625rem;
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel) var(--ds-radius-panel) 0 0;
	border-bottom:0;
}
.ds-sp__led{
	display:flex;align-items:center;gap:.625rem;
	font-family:var(--wp--preset--font-family--display);font-size:.6875rem;
	letter-spacing:.18em;text-transform:uppercase;color:var(--wp--preset--color--contrast);
}
/* ⚠️ Точка НЕ пульсирует — та же оговорка, что у стампа и у полосы
   симулятора: пульсация обещает живой поток, а тут пересчёт по вводу. */
.ds-sp__led i{
	width:7px;height:7px;border-radius:50%;background:var(--wp--preset--color--primary);
	box-shadow:0 0 10px color-mix(in srgb,var(--wp--preset--color--primary) 80%,transparent);
}
.ds-sp__calcnums{font-size:.6875rem;letter-spacing:.04em;color:var(--wp--preset--color--muted);font-variant-numeric:tabular-nums}
/* Блок примыкает к полосе и получает её же рамку без верхней стороны — вдвоём
   они читаются одной панелью, как консоль в макете. Рамка нужна ИМЕННО ЗДЕСЬ:
   у самого блока её нет, прежде её давала обёртка .ds-strategy__calculator, и
   без неё полоса статуса висела крышкой без коробки.
   ⚠️ Правило узко скоупнуто на страницу стратегии. Внутренности блока не
   трогаем: те же поля стоят на пяти встройках-калькуляторах и на /tools/. */
.ds-sp__calcwrap .wp-block-dicestrategies-bet-optimizer{
	margin-block:0;
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--border);
	border-top:0;
	border-radius:0 0 var(--ds-radius-panel) var(--ds-radius-panel);
	padding:1.375rem 1.625rem 1.5rem;
}
/* Строка выплаты — это подпись под полем, а не величина: в телесном кегле 16px
   она перевешивала собственные метрики панели. Бриф просит её строкой-читалкой
   мелким кеглем, и цифры выравниваются tabular-nums, а не моноширинным. */
.ds-sp__calcwrap .ds-betopt__payout{
	font-size:.6875rem;color:var(--wp--preset--color--muted);
	font-variant-numeric:tabular-nums;letter-spacing:var(--ds-track-data);opacity:1;
}
/* Ссылка на полный калькулятор приходит существующим паттерном обычным
   абзацем; призрачную кнопку из него делает обёртка, а не правка паттерна —
   карта «стратегия → её тул» обязана остаться в одном месте. */
.ds-sp__calclink p{margin:0}
.ds-sp__calclink a{
	display:inline-flex;align-items:center;justify-content:center;gap:.5625rem;
	border:1px solid var(--wp--preset--color--border-strong);
	border-radius:var(--ds-radius-control);padding:.8125rem 1.375rem;
	font-family:var(--wp--preset--font-family--display);font-size:.75rem;
	letter-spacing:var(--ds-track-btn);text-transform:uppercase;
}
.ds-sp__calclink a:hover{
	background:color-mix(in srgb,var(--wp--preset--color--primary) 8%,transparent);
	border-color:var(--wp--preset--color--primary);text-decoration:none;
}

/* ── казино тремя карточками ───────────────────────────────────────────── */
.ds-sp__casinos-wrap{display:flex;flex-direction:column;gap:1.25rem;scroll-margin-top:1.5rem}
/* Раскрытие — строка с амброй слева, а не коробка: оно обязано быть перед
   кликом, но не обязано быть громче карточек, которые объясняет. Текст общий
   на весь сайт, поэтому переопределяется только оболочка. */
.ds-sp__casinos-wrap .ds-ftc-disclosure{
	max-width:900px;padding:0 0 0 .875rem;background:none;border:0;
	border-left:2px solid color-mix(in srgb,var(--wp--preset--color--caution) 45%,transparent);
	border-radius:0;font-size:.75rem;line-height:1.6;color:var(--wp--preset--color--muted);
}
.ds-sp__casinos{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}
.ds-sp__casino{
	box-sizing:border-box;display:flex;flex-direction:column;gap:1rem;
	background:var(--wp--preset--color--base);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);padding:1.625rem 1.625rem 1.5rem;
	transition:border-color .2s ease;
}
.ds-sp__casino:hover{border-color:var(--wp--preset--color--border-strong)}
/* Победитель отмечен рамкой и свечением, а не заливкой: заливка сделала бы
   карточку рекламным блоком, а она такая же карточка, просто первая. */
.ds-sp__casino.is-top{
	border-color:color-mix(in srgb,var(--wp--preset--color--primary) 45%,var(--wp--preset--color--border));
	box-shadow:0 0 44px color-mix(in srgb,var(--wp--preset--color--primary) 7%,transparent);
}
.ds-sp__cid{display:flex;align-items:center;gap:.875rem;min-width:0}
.ds-sp__clogo{
	box-sizing:border-box;flex:none;width:46px;height:46px;object-fit:contain;
	display:flex;align-items:center;justify-content:center;
	background:var(--wp--preset--color--surface);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-control);
	font-family:var(--wp--preset--font-family--display);font-size:.875rem;
	color:var(--wp--preset--color--primary);
}
.ds-sp__cname{display:flex;flex-direction:column;gap:.3125rem;min-width:0}
.ds-sp__cname b{
	font-family:var(--wp--preset--font-family--display);font-weight:400;
	font-size:1.1875rem;color:var(--wp--preset--color--contrast);
}
/* Номер лицензии — длинный токен без пробелов («OGL/2024/1451/0918»), и
   переносить его браузер сам не станет: неразрывный токен уже рвал у нас
   таблицу на мобилке (разбор — CLAUDE.md, история гварда вёрстки). */
.ds-sp__cname small{
	font-size:.6875rem;letter-spacing:.1em;text-transform:uppercase;
	color:var(--wp--preset--color--muted);overflow-wrap:anywhere;
}
.ds-sp__cscore{margin-left:auto;display:flex;flex-direction:column;align-items:flex-end;gap:.25rem;text-align:right}
.ds-sp__cscore b{
	font-family:var(--wp--preset--font-family--display);font-weight:400;
	font-size:1.375rem;line-height:1;font-variant-numeric:tabular-nums;
}
.ds-sp__cscore span{font-size:.5625rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;color:var(--wp--preset--color--muted)}
.ds-sp__rank{
	align-self:flex-start;
	font-size:.59375rem;font-weight:700;letter-spacing:.16em;text-transform:uppercase;
	border:1px solid var(--wp--preset--color--border-strong);
	border-radius:var(--ds-radius-chip);padding:.3125rem .625rem;
	color:var(--wp--preset--color--muted);
}
.ds-sp__rank.is-solid{
	background:var(--wp--preset--color--primary);border-color:var(--wp--preset--color--primary);
	color:var(--wp--preset--color--accent-ink);
}
.ds-sp__why{margin:0;font-size:.84375rem;line-height:1.6;color:var(--wp--preset--color--text-dim);text-wrap:pretty}
.ds-sp__cfacts{
	margin:0;display:flex;flex-direction:column;gap:1px;overflow:hidden;
	background:var(--wp--preset--color--border);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);
}
.ds-sp__cfacts div{
	display:flex;align-items:baseline;justify-content:space-between;gap:.75rem;
	background:var(--wp--preset--color--surface);padding:.6875rem .875rem;
}
.ds-sp__cfacts dt{margin:0;font-size:.6875rem;letter-spacing:.06em;color:var(--wp--preset--color--muted)}
/* ⚠️ Моноширинного в теме нет; выравнивание цифр в столбик даёт
   tabular-nums, и оно же не заводит третью гарнитуру. */
.ds-sp__cfacts dd{
	margin:0;font-size:.75rem;text-align:right;
	color:var(--wp--preset--color--contrast);
	font-variant-numeric:tabular-nums;letter-spacing:var(--ds-track-data);
}
.ds-sp__caveat{font-size:.75rem;line-height:1.5;color:var(--wp--preset--color--muted);text-wrap:pretty}
/* Кнопки прижаты к низу карточки — иначе три карточки разной длины дают три
   разные высоты призыва, и ряд читается кривым. */
.ds-sp__ctas{display:flex;flex-direction:column;gap:.5rem;margin-top:auto}
.ds-sp__play{
	display:inline-flex;align-items:center;justify-content:center;gap:.5625rem;
	background:var(--wp--preset--color--primary);color:var(--wp--preset--color--accent-ink);
	border:1px solid var(--wp--preset--color--primary);
	border-radius:var(--ds-radius-control);padding:.8125rem 1.125rem;
	font-family:var(--wp--preset--font-family--display);font-size:.75rem;
	letter-spacing:var(--ds-track-btn);text-transform:uppercase;text-align:center;
}
.ds-sp__play:hover{
	background:var(--wp--preset--color--primary-dark);border-color:var(--wp--preset--color--primary-dark);
	color:var(--wp--preset--color--contrast);text-decoration:none;
}
/* Заливная кнопка только у первой карточки: три одинаково громких призыва —
   это ряд рекламы, а не ранжирование. */
.ds-sp__play.is-outline{
	background:none;color:var(--wp--preset--color--primary);
	border-color:color-mix(in srgb,var(--wp--preset--color--primary) 45%,var(--wp--preset--color--border));
}
.ds-sp__play.is-outline:hover{
	background:color-mix(in srgb,var(--wp--preset--color--primary) 8%,transparent);
	color:var(--wp--preset--color--primary);
}
.ds-sp__creview{
	display:inline-flex;align-items:center;justify-content:center;
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-control);padding:.6875rem 1.125rem;
	font-family:var(--wp--preset--font-family--display);font-size:.6875rem;
	letter-spacing:var(--ds-track-btn);text-transform:uppercase;
	color:var(--wp--preset--color--text-dim);text-align:center;
}
.ds-sp__creview:hover{border-color:var(--wp--preset--color--primary);color:var(--wp--preset--color--primary);text-decoration:none}

/* ── кривая доходности ─────────────────────────────────────────────────── */
.ds-sp__chartwrap{display:flex;flex-direction:column;gap:1.25rem;scroll-margin-top:1.5rem}
.ds-sp__chartwrap > *{margin-block:0}
.ds-sp__chartcard{
	display:flex;flex-direction:column;gap:1rem;
	background:var(--wp--preset--color--base);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);padding:1.5rem 1.625rem 1.25rem;
}
.ds-sp__chartcard > *{margin-block:0}
/* Оси и кадр — сетка, а не флекс: колонка подписей Y обязана быть ровно той же
   высоты, что кадр, и в гриде она такой становится сама. */
.ds-sp__chartrow{display:grid;grid-template-columns:62px minmax(0,1fr);gap:.4375rem .75rem}
.ds-sp__chartrow > *{margin-block:0}
.ds-sp__yticks{
	grid-column:1;grid-row:1;
	display:flex;flex-direction:column;justify-content:space-between;align-items:flex-end;
	font-size:.625rem;color:var(--wp--preset--color--muted);
	font-variant-numeric:tabular-nums;
}
.ds-sp__plot{
	grid-column:2;grid-row:1;position:relative;overflow:hidden;
	background:var(--wp--preset--color--base);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-control);
	/* Три линии сетки на четвертях. Фоном, а не разметкой: они ничего не
	   сообщают отдельно от кадра и в дерево доступности попадать не должны. */
	background-image:
		linear-gradient(var(--wp--preset--color--border),var(--wp--preset--color--border)),
		linear-gradient(var(--wp--preset--color--border),var(--wp--preset--color--border)),
		linear-gradient(var(--wp--preset--color--border),var(--wp--preset--color--border));
	background-size:100% 1px;background-repeat:no-repeat;
	background-position:0 25%,0 50%,0 75%;
}
/* ⚠️ margin, а не margin-block: у <figure> браузерное поле есть и по бокам
   (`margin:1em 40px`), и без сброса кривая уехала бы на 40px внутрь кадра. */
.ds-sp__plot > *{margin:0}
/* Пунктир стартового баланса. Доля от низа приходит инлайном из паттерна — она
   считается той же формулой, что кладёт точки кривой. */
.ds-sp__beline{
	position:absolute;left:0;right:0;height:0;pointer-events:none;
	border-top:1px dashed color-mix(in srgb,var(--wp--preset--color--primary) 40%,var(--wp--preset--color--border));
}
.ds-sp__xticks{
	grid-column:2;grid-row:2;display:flex;justify-content:space-between;
	font-size:.625rem;color:var(--wp--preset--color--muted);font-variant-numeric:tabular-nums;
}
/* ⚠️ Подпись ОБЯЗАТЕЛЬНА и снимается только вместе с графиком: без неё одна
   сидированная сессия читается прогнозом. */
.ds-sp__caption{
	margin:0;max-width:900px;font-size:.78125rem;line-height:1.6;
	color:var(--wp--preset--color--muted);text-wrap:pretty;
}

/* ── варианты и лимиты ─────────────────────────────────────────────────── */
/* ⚠️ auto-fit, а не repeat(2,…): панелей может быть ОДНА (нет варианта), и
   бриф требует, чтобы она развернулась на всю ширину, а не встала рядом с
   пустой рамкой. auto-fit делает это сам, без модификатора в разметке. */
.ds-sp__panels{display:grid;grid-template-columns:repeat(auto-fit,minmax(20rem,1fr));gap:1rem;align-items:start;scroll-margin-top:1.5rem}
.ds-sp__panel{
	display:flex;flex-direction:column;gap:.875rem;
	background:var(--wp--preset--color--base);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);padding:1.75rem 1.875rem;
}
/* 19px — ниже h2 секции (30): это заголовок панели внутри секции, а не
   заголовок ещё одной секции. Тот же довод, что у заголовка вердикта на
   странице игры. */
.ds-sp__panel h3{
	margin:0;font-family:var(--wp--preset--font-family--display);font-weight:400;
	font-size:1.1875rem;line-height:1.25;color:var(--wp--preset--color--contrast);
}
.ds-sp__panel p{margin:0;font-size:.875rem;line-height:1.65;color:var(--wp--preset--color--text-dim);text-wrap:pretty}
.ds-sp__stat{
	display:flex;align-items:baseline;flex-wrap:wrap;gap:.625rem;
	padding-top:.75rem;border-top:1px solid var(--wp--preset--color--border);
	font-size:.625rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;
	color:var(--wp--preset--color--muted);
}
.ds-sp__stat b{
	font-family:var(--wp--preset--font-family--display);font-weight:400;
	font-size:1.125rem;letter-spacing:0;color:var(--wp--preset--color--caution);
	font-variant-numeric:tabular-nums;
}

/* ── родственные стратегии ─────────────────────────────────────────────── */
.ds-sp__related-wrap{display:flex;flex-direction:column;gap:1.25rem;scroll-margin-top:1.5rem}
.ds-sp__related{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1rem}
.ds-sp__rcard{
	box-sizing:border-box;display:flex;flex-direction:column;gap:.875rem;
	background:var(--wp--preset--color--base);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);padding:1.5rem 1.625rem;
	color:inherit;transition:border-color .2s ease;
}
.ds-sp__rcard:hover{border-color:var(--wp--preset--color--primary);color:inherit;text-decoration:none}
.ds-sp__rt{display:flex;align-items:baseline;justify-content:space-between;gap:.75rem}
.ds-sp__rt b{font-family:var(--wp--preset--font-family--display);font-weight:400;font-size:1.0625rem;color:var(--wp--preset--color--contrast)}
.ds-sp__rt i{font-family:var(--wp--preset--font-family--display);font-style:normal;font-size:1.25rem;font-variant-numeric:tabular-nums}
/* ⚠️ Полоса риска — ЭТО НАРИСОВАННЫЙ ТЕРМ, а не измерение: «Low / Medium /
   High / Extreme» шкала порядковая, чисел у неё нет. Поэтому слово стоит
   рядом с полосой и всегда — полоса без слова читалась бы процентом чего-то,
   а неизвестный терм печатается словом вовсе без полосы. */
.ds-sp__rrisk{
	display:flex;align-items:center;gap:.625rem;
	font-size:.5625rem;font-weight:700;letter-spacing:.14em;text-transform:uppercase;
	color:var(--wp--preset--color--muted);
}
.ds-sp__rbar{flex:1;height:4px;border-radius:2px;background:var(--wp--preset--color--surface-2);overflow:hidden}
.ds-sp__rbar i{display:block;height:100%;background:var(--wp--preset--color--primary)}
.ds-sp__rbar i.is-bad{background:var(--wp--preset--color--danger)}
.ds-sp__rcard p{margin:0;font-size:.8125rem;line-height:1.6;color:var(--wp--preset--color--text-dim);text-wrap:pretty}

/* ── FAQ ───────────────────────────────────────────────────────────────── */
.ds-sp__faq-wrap{display:flex;flex-direction:column;gap:1.25rem;scroll-margin-top:1.5rem}
.ds-sp__faq{
	margin:0;display:flex;flex-direction:column;overflow:hidden;
	background:var(--wp--preset--color--base);
	border:1px solid var(--wp--preset--color--border);
	border-radius:var(--ds-radius-panel);
}
.ds-sp__faq div{
	display:grid;grid-template-columns:320px minmax(0,1fr);gap:2.25rem;
	padding:1.375rem 1.75rem;border-bottom:1px solid var(--wp--preset--color--border);
}
.ds-sp__faq div:last-child{border-bottom:0}
.ds-sp__faq dt{
	margin:0;font-family:var(--wp--preset--font-family--display);font-weight:400;
	font-size:.9375rem;line-height:1.35;color:var(--wp--preset--color--contrast);text-wrap:pretty;
}
.ds-sp__faq dd{margin:0;font-size:.875rem;line-height:1.65;color:var(--wp--preset--color--text-dim);max-width:720px;text-wrap:pretty}

.ds-sp__backlink{margin:0;font-size:.8125rem;color:var(--wp--preset--color--muted)}

@media (max-width:75rem){
	.ds-sp{gap:2.5rem}
	.ds-sp__head-cols,.ds-sp__pc,.ds-sp__casinos,.ds-sp__related{grid-template-columns:minmax(0,1fr)}
	.ds-sp__faq div{grid-template-columns:minmax(0,1fr);gap:.625rem}
}
@media (max-width:48rem){
	/* Колонка подписей оси съедает четверть узкого экрана; кадр важнее
	   подписей, и они уезжают под него одной строкой. */
	.ds-sp__chartrow{grid-template-columns:minmax(0,1fr)}
	.ds-sp__yticks{display:none}
	.ds-sp__plot{grid-column:1;grid-row:1}
	.ds-sp__xticks{grid-column:1;grid-row:2}
	/* ⚠️ Кадр блока задан viewBox 600×160, то есть 3.75:1, и на 390px это
	   80 пикселей высоты — полоска, а не график. `aspect-ratio` перебивает
	   СОБСТВЕННОЕ отношение сторон картинки, поэтому кадр растягивается без
	   !important поверх инлайнового `height:auto`; кривая при этом не врёт —
	   у блока стоит preserveAspectRatio="none", он и рассчитан на растяжение. */
	.ds-sp__plot svg{aspect-ratio:2/1}
	.ds-sp__faq div{padding:1.25rem 1.25rem}
	.ds-sp__casino,.ds-sp__panel,.ds-sp__rcard{padding:1.375rem 1.25rem}
}
