@font-face { font-family: "IBM Plex Sans"; src: url("./assets/fonts/IBMPlexSans-Regular.woff2") format("woff2"); font-weight: 400; font-display: swap; }
@font-face { font-family: "IBM Plex Sans"; src: url("./assets/fonts/IBMPlexSans-Medium.woff2") format("woff2"); font-weight: 500; font-display: swap; }
@font-face { font-family: "IBM Plex Sans"; src: url("./assets/fonts/IBMPlexSans-SemiBold.woff2") format("woff2"); font-weight: 600 800; font-display: swap; }
@font-face { font-family: "IBM Plex Sans Condensed"; src: url("./assets/fonts/IBMPlexSansCondensed-SemiBold.woff2") format("woff2"); font-weight: 600; font-display: swap; }
@font-face { font-family: "IBM Plex Sans Condensed"; src: url("./assets/fonts/IBMPlexSansCondensed-Bold.woff2") format("woff2"); font-weight: 700 800; font-display: swap; }
@font-face { font-family: "IBM Plex Mono"; src: url("./assets/fonts/IBMPlexMono-Regular.woff2") format("woff2"); font-weight: 400; font-display: swap; }
@font-face { font-family: "IBM Plex Mono"; src: url("./assets/fonts/IBMPlexMono-SemiBold.woff2") format("woff2"); font-weight: 600 800; font-display: swap; }

:root {
  --ink: #2b2a29;
  --muted: #615f5a;
  --line: #deddd8;
  --paper: #f6f6f4;
  --card: #fbfbfa;
  --accent: #363688;
  --accent-dark: #303172;
  --accent-pressed: #2a2b6b;
  --accent-tint: #f1f1f8;
  --blue: #363688;
  font-family: "IBM Plex Sans", sans-serif;
  color: var(--ink);
  background: var(--paper);
}

* { box-sizing: border-box; }
body { margin: 0; min-width: 320px; }
button, input, textarea { font: inherit; }
button, .secondary-action { cursor: pointer; }

.topbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  min-height: 72px;
  padding: 0 5vw;
  border-bottom: 1px solid var(--line);
  background: rgba(255, 254, 250, .92);
}

.home, .site-link { color: inherit; text-decoration: none; }
.home { display: flex; align-items: center; gap: 14px; font-weight: 600; }
.isham-logo { display: block; width: 142px; height: auto; }
.divider { width: 1px; height: 28px; background: var(--line); }
.site-link { color: var(--muted); font-size: 14px; }

main { width: min(1480px, 94vw); margin: 0 auto; padding: 72px 0 120px; }
.hero { position: relative; overflow: hidden; max-width: 880px; }
/* ISH-036: тот же слой hero-bg, что на главной и демо ISHAM
   (isham.css в проекте витрины) — клетчатая подложка первого экрана,
   скопирована byte-for-byte по механике (grid-градиент + радиальная mask),
   не растянута на всю страницу: она заполняет ровно .hero, а высота .hero
   задаётся его собственным содержимым, не вьюпортом и не документом.
   #EDECE9 — то же значение, что --gray-100 в isham.css (общая палитра бренда). */
.hero-bg {
  position: absolute;
  inset: 0;
  background-image:
    linear-gradient(#EDECE9 1px, transparent 1px),
    linear-gradient(90deg, #EDECE9 1px, transparent 1px);
  background-size: 34px 34px;
  mask-image: radial-gradient(ellipse 60% 75% at 78% 35%, #000, transparent 72%);
  opacity: .75;
  z-index: 0;
}
.hero > .eyebrow, .hero > h1 { position: relative; z-index: 1; }
.eyebrow, .brand-label, .result-brand {
  margin: 0 0 12px;
  color: var(--accent-dark);
  font-size: 13px;
  font-family: "IBM Plex Mono", monospace;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
}
h1 { margin: 0; font-family: "IBM Plex Sans Condensed", sans-serif; font-size: clamp(42px, 6vw, 82px); font-weight: 700; line-height: .98; letter-spacing: -.03em; }
h2 { margin: 0; font-family: "IBM Plex Sans Condensed", sans-serif; font-size: clamp(30px, 4vw, 48px); font-weight: 700; letter-spacing: -.02em; }

.search-form { position: sticky; top: 12px; z-index: 20; width: min(880px, 100%); margin-top: 52px; padding: 18px 20px; border: 1px solid var(--line); border-radius: 8px; background: rgba(251, 251, 250, .97); box-shadow: 0 10px 28px rgba(43, 42, 41, .08); backdrop-filter: blur(10px); }
.search-form label { display: block; margin-bottom: 10px; font-weight: 700; }
.search-row { display: grid; grid-template-columns: 1fr auto; gap: 10px; }
.search-row input { min-width: 0; padding: 18px 20px; border: 1px solid #a6a49d; border-radius: 3px; font-size: 18px; }
.search-row button, .secondary-action, .primary-action { padding: 15px 22px; border: 0; border-radius: 3px; color: white; background: var(--accent); font-weight: 600; }
.search-row button:hover { background: var(--accent-dark); }
.search-form p, .filename, .result-file, figcaption { color: var(--muted); }
.search-form p { margin: 12px 0 0; font-size: 14px; }

/* ISH-043: взведённый фильтр каталога виден и снимается одной кнопкой. */
.catalog-scope { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; margin-top: 12px; padding: 10px 14px; border-left: 4px solid var(--accent); border-radius: 3px; background: #e1e1f0; font-size: 14px; }
.catalog-scope-text { color: var(--ink); }
.catalog-scope-hint { color: var(--muted); }
.catalog-scope-clear { min-height: 34px; margin-left: auto; padding: 4px 14px; border: 1px solid var(--accent); border-radius: 3px; background: var(--paper); color: var(--accent-dark); font-size: 13px; font-weight: 600; cursor: pointer; }
.catalog-scope-clear:hover { background: var(--paper); border-color: var(--accent-dark); color: var(--accent-dark); }
@media (max-width: 900px) { .catalog-scope-clear { min-height: 44px; margin-left: 0; } }

.status { margin: 34px 0; padding: 18px 20px; border-left: 4px solid var(--accent); background: var(--card); }
.status[data-kind="error"] { border-color: #a82020; }
.results-section, .showcase, .workspace { margin-top: 86px; }
.section-head { display: flex; justify-content: space-between; align-items: end; gap: 24px; margin-bottom: 28px; }
.count { color: var(--muted); }
.search-workbench { display: grid; grid-template-columns: minmax(300px, 380px) minmax(0, 1fr); gap: 24px; align-items: start; }
/* ISH-048 п.3: липкая колонка встаёт под липкой строкой поиска по ЕЁ настоящей
   высоте, а не под жёстко вписанным числом. Строка растёт (плашка каталога
   ISH-043, перенос подписи на узком экране) — и прежние 154px прятали под ней
   верх найденного, в том числе само слово, по которому идёт поиск. Значение
   --sticky-top ведёт JS (syncStickyOffset); 154px остаётся честным запасом на
   случай, если скрипт ещё не отработал. */
:root { --sticky-top: 154px; }
.results-pane { position: sticky; top: var(--sticky-top); max-height: calc(100dvh - var(--sticky-top) - 24px); overflow: auto; border: 1px solid var(--line); border-radius: 5px; background: var(--card); }
/* Прокрутка к найденному (scrollIntoView) обязана оставлять место под липкой
   строкой: без этого браузер честно прижимает блок к верху окна — прямо под неё.
   Отступ нужен только тем, кого прокручивают ОТНОСИТЕЛЬНО СТРАНИЦЫ; карточки
   выдачи ездят внутри своей колонки, и такой отступ сдвигал бы их к её низу. */
#context-search, .evidence { scroll-margin-top: calc(var(--sticky-top) + 12px); }
.results { display: grid; }
.result-card { display: block; width: 100%; padding: 17px 18px; border: 0; border-bottom: 1px solid var(--line); border-left: 4px solid transparent; border-radius: 0; background: transparent; color: var(--ink); text-align: left; }
.result-card:last-child { border-bottom: 0; }
.result-card:hover { background: #f1f1f8; }
.result-card.is-active { border-left-color: var(--accent); background: #e1e1f0; }
.result-line { display: flex; justify-content: space-between; gap: 12px; align-items: baseline; }
.result-brand { margin: 0; }
.result-title { margin: 4px 0 0; font-size: 17px; line-height: 1.25; }
.result-file { margin: 5px 0 0; font-family: "IBM Plex Mono", monospace; font-size: 11px; overflow-wrap: anywhere; }
.result-page { flex: 0 0 auto; color: var(--muted); font-size: 12px; font-weight: 700; }
.result-snippets { display: grid; gap: 4px; margin-top: 12px; color: #4d4b46; font-size: 13px; }
.result-snippets span::before { content: "↳ "; color: var(--accent-dark); }
.result-snippets .result-more { color: var(--muted); font-size: 11px; }
.result-snippets .result-more::before { content: ""; }

.evidence { min-width: 0; }
/* Единственная колонка ограничена шириной контейнера: лента миниатюр со
   своим max-content не распирает просмотрщик, а прокручивается внутри себя. */
.evidence:not([hidden]) { display: grid; grid-template-columns: minmax(0, 1fr); gap: 14px; }
.evidence-copy { padding: 18px 20px; border: 1px solid var(--line); border-radius: 5px; background: var(--card); }
.evidence-heading { display: flex; justify-content: space-between; gap: 20px; align-items: start; }
.evidence-heading h2 { font-size: clamp(22px, 2.4vw, 32px); }
.evidence-page { flex: 0 0 auto; padding-top: 2px; font-weight: 800; }
.back { display: none; margin-bottom: 18px; padding: 0; border: 0; background: none; color: var(--muted); }
.filename { font-family: "IBM Plex Mono", monospace; overflow-wrap: anywhere; }
.evidence-snippets { display: flex; flex-wrap: wrap; gap: 7px; margin: 16px 0; }
mark { padding: 7px 9px; background: #e1e1f0; border-radius: 3px; font-size: 14px; font-weight: 600; }
.secondary-action { display: inline-block; text-decoration: none; }
.evidence-actions { display: flex; flex-wrap: wrap; gap: 10px; }
.primary-action { background: var(--blue); }
.page-preview { margin: 0; padding: 12px; border: 1px solid var(--line); border-radius: 5px; background: var(--card); }
.page-preview img { display: block; width: 100%; height: auto; background: white; }
.page-preview figcaption { margin: 12px 4px 2px; font-size: 13px; }
/* Тот же .page-canvas несёт и статическое позиционирование hit-area (ниже),
   и transform-origin для зума (Viewer 2.0, см. .zoom-scroll) — одно правило,
   а не два в разных секциях. */
.page-canvas { position: relative; transform-origin: 0 0; }
.page-interactions { position: absolute; inset: 0; }
.page-hit { position: absolute; min-width: 3px; min-height: 3px; padding: 0; border: 1px solid transparent; border-radius: 2px; background: transparent; }
.page-hit:hover, .page-hit:focus-visible { border-color: var(--accent); background: rgba(54, 54, 136, .14); }

.context-search { position: relative; padding: 18px; border-bottom: 1px solid var(--line); background: #f1f1f8; box-shadow: inset 4px 0 0 var(--accent); }
.context-search.is-loading { opacity: .78; }
.context-head { display: flex; justify-content: space-between; gap: 14px; }
.context-head h3 { margin: 0; font-size: 22px; overflow-wrap: anywhere; }
.icon-button, .text-action { border: 0; background: transparent; color: var(--blue); }
.icon-button { align-self: start; font-size: 24px; }
.text-action { padding: 8px 0; text-decoration: underline; text-underline-offset: 3px; }
.context-scope, .context-empty { color: var(--muted); font-size: 14px; }
.context-results { display: grid; gap: 8px; margin: 16px 0; }
.context-result { display: grid; gap: 5px; width: 100%; padding: 12px; border: 1px solid var(--line); border-radius: 3px; background: white; text-align: left; }
.context-result:hover { border-color: var(--blue); }
.context-result span { color: var(--muted); font-size: 13px; }

.workspace-manage { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin-bottom: 16px; }
.workspace-switch-label { color: var(--muted); font-size: 13px; font-weight: 700; }
.workspace-switcher { min-width: 190px; max-width: 100%; padding: 9px 12px; border: 1px solid var(--line); border-radius: 8px; background: white; color: var(--ink); font: inherit; }
.workspace-limit-note { margin: 0 0 14px; color: var(--muted); font-size: 13px; }
.workspace-rename { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin: 0 0 16px; }
.workspace-rename label { color: var(--muted); font-size: 13px; font-weight: 700; }
.workspace-rename input { min-width: 220px; padding: 9px 12px; border: 1px solid var(--line); border-radius: 8px; background: white; color: var(--ink); font: inherit; }
.workspace-empty { padding: 22px; border: 1px dashed #a6a49d; border-radius: 5px; color: var(--muted); }
.workspace-list { display: grid; gap: 14px; }
.workspace-card { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 24px; padding: 22px; border: 1px solid var(--line); border-radius: 5px; background: var(--card); }
.workspace-brand { margin: 0 0 8px; color: var(--accent-dark); font-weight: 800; letter-spacing: .08em; text-transform: uppercase; }
.workspace-title { margin: 0; font-size: 22px; }
.workspace-file, .workspace-context { color: var(--muted); font-size: 13px; overflow-wrap: anywhere; }
.workspace-snippet { margin: 14px 0; font-weight: 700; }
.workspace-card label { display: grid; gap: 7px; color: var(--muted); font-size: 13px; }
.workspace-note { width: 100%; resize: vertical; padding: 10px; border: 1px solid var(--line); border-radius: 8px; background: white; color: var(--ink); }
.workspace-card-actions { display: grid; align-content: start; justify-items: end; gap: 10px; }
.workspace-open, .workspace-cite, .secondary-button, .danger-button { padding: 10px 14px; border: 1px solid var(--line); border-radius: 8px; background: white; font-weight: 700; }
.secondary-button:disabled { opacity: .45; cursor: default; }
.workspace-page { font-weight: 800; }
.workspace-actions { display: flex; gap: 10px; margin-top: 18px; }
.danger-button { color: #8f1d1d; }

.brand-list { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; align-items: start; }
.brand-card { overflow: hidden; border: 1px solid var(--line); border-radius: 5px; background: var(--card); }
.brand-toggle { display: grid; grid-template-columns: 128px minmax(0, 1fr) 28px; align-items: center; gap: 20px; width: 100%; padding: 18px 20px; border: 0; background: transparent; color: var(--ink); text-align: left; }
.brand-toggle:hover { background: var(--accent-tint); }
.brand-logo-box { display: grid; place-items: center; width: 128px; height: 64px; padding: 8px; border: 1px solid var(--line); border-radius: 8px; background: white; }
.brand-logo-box--canela { background: #172334; }
.brand-logo { display: block; max-width: 100%; max-height: 100%; object-fit: contain; }
.brand-logo-fallback { color: var(--accent-dark); font-weight: 800; letter-spacing: .02em; }
.brand-identity { display: grid; gap: 5px; min-width: 0; }
.brand-card h3 { margin: 0; font-size: 22px; }
.brand-catalog-count { color: var(--muted); font-size: 13px; }
.brand-toggle-indicator::before { content: "+"; display: block; color: var(--accent-dark); font-size: 26px; font-weight: 400; line-height: 1; text-align: center; }
.brand-toggle[aria-expanded="true"] .brand-toggle-indicator::before { content: "−"; }
.brand-catalogs { margin: 0; padding: 0 20px 16px; border-top: 1px solid var(--line); list-style: none; }
.brand-catalogs li { display: grid; gap: 4px; padding: 13px 0; border-bottom: 1px solid var(--line); }
.brand-catalogs li:last-child { border-bottom: 0; }
.brand-catalogs li span { color: var(--muted); font-family: "IBM Plex Mono", monospace; font-size: 12px; overflow-wrap: anywhere; }

[hidden] { display: none !important; }
:focus-visible { outline: 3px solid var(--blue); outline-offset: 3px; }

@media (max-width: 900px) {
  main { padding-top: 44px; }
  .search-row, .search-workbench, .brand-list, .workspace-card { grid-template-columns: 1fr; }
  .search-form { top: 8px; padding: 16px; }
  .results-pane { position: static; max-height: 46dvh; }
  .back { display: inline-block; }
  .evidence-heading { display: grid; gap: 6px; }
  .workspace-card-actions { justify-items: stretch; }
  .workspace-switcher { flex: 1 1 100%; }
  .brand-toggle { grid-template-columns: 96px minmax(0, 1fr) 24px; gap: 14px; padding: 14px; }
  .brand-head { flex-wrap: wrap; padding-right: 14px; }
  .brand-logo-box { width: 96px; height: 54px; }
  .brand-card h3 { font-size: 19px; }
  .brand-catalogs { padding-inline: 14px; }
  .topbar { padding-inline: 4vw; }
  .site-link { display: none; }
}

@media (prefers-reduced-motion: reduce) {
  * { scroll-behavior: auto !important; }
}

.page-pager { display: flex; align-items: center; justify-content: center; gap: 14px; margin: 0 0 10px; }
.pager-button { min-width: 44px; min-height: 36px; border: 1px solid var(--line); border-radius: 3px; background: var(--card); color: var(--ink); font-size: 16px; }
.pager-button:disabled { opacity: .35; cursor: default; }
.pager-button:not(:disabled):hover { border-color: var(--accent); color: var(--accent); }
.page-position { color: var(--muted); font-size: 14px; font-variant-numeric: tabular-nums; }
/* ---------- U6: свободный просмотр каталога ---------- */
.page-jump { display: inline-flex; align-items: center; gap: 6px; margin: 0; padding: 0; }
.page-jump-label { color: var(--muted); font-size: 13px; }
.page-jump-input { width: 3.5em; padding: 6px 8px; border: 1px solid #a6a49d; border-radius: 3px; font: inherit; text-align: center; }
.page-jump-input:disabled, .page-jump-submit:disabled { opacity: .35; cursor: default; }
.page-jump-submit { min-height: 32px; padding: 4px 12px; font-size: 13px; }
.page-jump-hint { margin: -4px 0 10px; text-align: center; color: #8a5a17; font-size: 13px; }
.landing-browse-cta { margin-left: 10px; }
.manual-copy { margin-top: 12px; padding: 12px 14px; border: 1px dashed var(--line); border-radius: 6px; background: var(--card); }
.manual-copy label { display: block; font-size: 13px; color: var(--muted); }
.manual-copy input { width: 100%; margin-top: 6px; padding: 8px 10px; border: 1px solid var(--line); border-radius: 3px; font: inherit; }
.status[data-kind="warn"] { border-color: #8a5a17; }

.result-card { position: relative; display: block; width: 100%; text-align: left; cursor: pointer; }
.result-card:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.result-group-head { margin: 26px 0 10px; font-family: "IBM Plex Mono", monospace; font-size: 12px; font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: var(--accent-dark); }
.result-group-head:first-child { margin-top: 0; }
.result-badges { display: flex; flex-wrap: wrap; gap: 6px; }
.badge { display: inline-block; padding: 2px 8px; border: 1px solid var(--line); border-radius: 3px; font-size: 12px; font-weight: 600; color: var(--muted); background: var(--paper); }
.badge-match[data-strength="strong"] { color: #2e6b46; border-color: #2e6b4655; background: #e7f0ea; }
.badge-match[data-strength="medium"] { color: #8a5a17; border-color: #8a5a1755; background: #f5edde; }
.badge-match[data-strength="weak"] { color: var(--muted); }
.badge-note { color: #8a5a17; border-color: #8a5a1755; background: #f5edde; }
.result-note { margin: 0 0 14px; padding: 10px 14px; border-left: 4px solid #8a5a17; background: var(--card); color: var(--ink); font-size: 14px; }
.thumb-pop { position: absolute; z-index: 30; top: 8px; right: -8px; transform: translateX(100%); width: 260px; padding: 6px; border: 1px solid var(--line); border-radius: 6px; background: var(--card); box-shadow: 0 10px 28px rgba(43, 42, 41, .16); pointer-events: none; }
.thumb-pop img { display: block; width: 100%; height: auto; }
@media (max-width: 1200px) { .thumb-pop { display: none; } }

.facets { margin: 0 0 16px; padding: 12px 14px; border: 1px solid var(--line); border-radius: 6px; background: var(--card); }
.facet-group { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: 8px; }
.facet-group:last-child { margin-bottom: 0; }
.facet-title { min-width: 64px; font-family: "IBM Plex Mono", monospace; font-size: 11px; font-weight: 600; letter-spacing: .1em; text-transform: uppercase; color: var(--muted); }
.facet-chip { display: inline-flex; align-items: center; min-height: 34px; padding: 4px 12px; border: 1px solid var(--line); border-radius: 3px; background: var(--paper); color: var(--ink); font-size: 13px; cursor: pointer; }
.facet-chip:hover { border-color: var(--accent); color: var(--accent); }
.facet-chip[aria-pressed="true"] { border-color: var(--accent); background: #e1e1f0; color: var(--accent-dark); font-weight: 600; }
.facets .text-action { margin-top: 6px; }
.variants { margin: 0 0 16px; padding: 12px 14px; border-left: 4px solid var(--accent); background: var(--card); }
.variants-title { margin: 0 0 10px; font-weight: 600; }
.variant-list { display: flex; flex-wrap: wrap; gap: 8px; }
.variant-chip { min-height: 40px; padding: 6px 14px; border: 1px solid var(--accent); border-radius: 3px; background: var(--paper); color: var(--accent-dark); font-family: "IBM Plex Mono", monospace; font-size: 14px; font-weight: 600; cursor: pointer; }
.variant-chip:hover { background: #e1e1f0; }
@media (max-width: 900px) { .facet-chip, .variant-chip { min-height: 44px; } }

.card-cite { margin-top: 10px; padding: 6px 12px; border: 1px solid var(--line); border-radius: 3px; background: var(--paper); color: var(--accent-dark); font-size: 13px; font-weight: 600; cursor: pointer; }
.card-cite:hover { border-color: var(--accent); }
.catalog-meta { display: block; margin-top: 2px; color: var(--muted); font-size: 13px; }
.catalog-official { display: inline-block; margin-top: 4px; color: var(--accent-dark); font-size: 13px; }
.showcase-error { display: flex; align-items: center; gap: 14px; padding: 16px 18px; border-left: 4px solid #a82020; background: var(--card); margin-bottom: 20px; }
.showcase-error p { margin: 0; }
.status a { color: var(--accent-dark); font-weight: 600; }

.search-row { position: relative; }
.suggest { position: absolute; z-index: 40; top: calc(100% + 4px); left: 0; right: 0; display: flex; flex-direction: column; border: 1px solid var(--line); border-radius: 6px; background: var(--card); box-shadow: 0 10px 28px rgba(43, 42, 41, .12); overflow: hidden; }
.suggest-option { min-height: 40px; padding: 8px 16px; border: 0; background: transparent; color: var(--ink); font-family: "IBM Plex Mono", monospace; font-size: 15px; text-align: left; cursor: pointer; }
.suggest-option:hover, .suggest-option.is-active { background: #e1e1f0; color: var(--accent-dark); }

/* ---------- печатная сводка ---------- */
.print-summary { width: min(880px, 94vw); margin: 0 auto; padding: 48px 0 96px; }
body.is-print-mode { background: white; }
/* Печатный режим скрывает рабочий интерфейс и на экране (предпросмотр), и на
   печати; display гасится адресно, чтобы скрытие было проверяемо поэлементно. */
body.is-print-mode .topbar,
body.is-print-mode main,
body.is-print-mode .hero,
body.is-print-mode .search-form,
body.is-print-mode #status,
body.is-print-mode #results-section,
body.is-print-mode #search-workbench,
body.is-print-mode #evidence,
body.is-print-mode #workspace,
body.is-print-mode #showcase,
body.is-print-mode #landing-view { display: none !important; }
.workspace-print-row { margin-top: 10px; align-items: center; }
/* ISH-048 п.2: ответ на нажатие стоит вплотную к кнопке. Общий #status —
   наверху страницы, а кнопка внизу: на длинной странице человек нажимает и не
   видит ничего, а сводка тем временем собирается. */
.print-progress { margin: 0; color: var(--accent-dark); font-size: 13px; font-weight: 600; }
/* Сколько уже собрано — видно у самой кнопки, добавляющей в подборку. */
.pin-count { align-self: center; color: var(--muted); font-size: 13px; }
.print-controls { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; margin-bottom: 30px; }
.print-hint { color: var(--muted); font-size: 13px; }
.print-cover { padding-bottom: 22px; border-bottom: 2px solid var(--ink); }
.print-cover h1 { margin: 0; font-family: "IBM Plex Sans Condensed", sans-serif; font-size: clamp(30px, 4vw, 44px); font-weight: 700; letter-spacing: -.02em; }
.print-workspace-name { margin: 10px 0 4px; font-size: 20px; font-weight: 700; }
.print-meta { margin: 0 0 14px; color: var(--muted); font-size: 13px; }
.print-cover-line { margin: 4px 0; font-size: 14px; }
.print-rows { display: grid; gap: 18px; margin-top: 26px; }
.print-row { padding: 16px 18px; border: 1px solid var(--line); border-radius: 5px; background: var(--card); break-inside: avoid; page-break-inside: avoid; }
.print-citation { margin: 0; font-weight: 700; }
.print-snippet { margin: 10px 0 0; font-size: 14px; }
.print-note { margin: 8px 0 0; color: var(--muted); font-size: 13px; }
.print-thumb { display: block; width: min(360px, 100%); margin-top: 12px; border: 1px solid var(--line); background: white; }
.print-unavailable { margin: 12px 0 0; padding: 10px 12px; border: 1px dashed #a6a49d; color: var(--muted); font-size: 13px; }

@media print {
  /* Чёрным по белому вендоренными IBM Plex; интерактив сводки не печатается. */
  :root { --ink: #000; --muted: #333; --line: #767676; --paper: #fff; --card: #fff; --accent: #000; --accent-dark: #000; --accent-pressed: #000; --accent-tint: #fff; --blue: #000; }
  body { background: white; }
  .print-summary { width: auto; padding: 0; font-family: "IBM Plex Sans", sans-serif; }
  .print-controls { display: none !important; }
  .print-row { border-color: #767676; border-radius: 0; }
}

@media (prefers-reduced-motion: no-preference) {
  .hero h1 { transition: font-size .25s ease; }
  main { transition: padding .25s ease; }
}
body.is-working main { padding: 26px 0 80px; }
body.is-working .hero .eyebrow { margin-bottom: 4px; }
body.is-working .hero h1 { font-size: clamp(22px, 3vw, 34px); line-height: 1.1; letter-spacing: -.01em; }
body.is-working .hero h1 br { display: none; }
body.is-working .search-form { margin-top: 16px; }
body.is-working .results-section, body.is-working .workspace, body.is-working .showcase { margin-top: 44px; }
#workspace.is-empty { margin-top: 44px; }
#workspace.is-empty .section-head { margin-bottom: 4px; }
#workspace.is-empty .workspace-empty { margin: 0; font-size: 14px; }

/* ---------- Viewer 2.0: лента миниатюр, зум, выбор текста ---------- */
/* Лента тап-доступна и остаётся на узких экранах: горизонтальный скролл
   внутри самой ленты, никакого hover-гейта. */
.thumb-strip { display: flex; gap: 6px; margin: 0 0 10px; padding: 6px; overflow-x: auto; border: 1px solid var(--line); border-radius: 5px; background: var(--paper); }
.strip-cell { display: grid; flex: 0 0 auto; gap: 2px; justify-items: center; align-content: start; min-width: 44px; min-height: 44px; padding: 4px; border: 1px solid var(--line); border-radius: 3px; background: white; color: var(--muted); font-size: 11px; cursor: pointer; }
.strip-cell:hover { border-color: var(--accent); color: var(--accent-dark); }
.strip-cell[aria-current="page"] { border-color: var(--accent); box-shadow: inset 0 0 0 1px var(--accent); color: var(--accent-dark); font-weight: 700; }
.strip-thumb { display: grid; place-items: center; width: 46px; height: 58px; overflow: hidden; border-radius: 2px; background: var(--paper); font-size: 14px; }
.strip-thumb img { display: block; width: 100%; height: 100%; object-fit: cover; }
.strip-cell[data-state="loading"] .strip-thumb { background: #e9e8e4; }
@media (prefers-reduced-motion: no-preference) {
  .strip-cell[data-state="loading"] .strip-thumb { animation: strip-pulse 1.2s ease-in-out infinite; }
}
@keyframes strip-pulse { 50% { opacity: .5; } }
.strip-cell[data-state="limited"] .strip-thumb { color: #8a5a17; background: #f5edde; }
.strip-page { font-variant-numeric: tabular-nums; }

.viewer-tools { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin: 0 0 10px; }
.zoom-controls { display: inline-flex; gap: 6px; }
/* Прокрутка при зуме живёт на внешнем контейнере; сама трансформация — на
   обёртке изображения и hit-area (.page-canvas выше), от верхнего левого угла. */
.zoom-scroll { overflow: auto; }
.select-toggle[aria-pressed="true"] { border-color: var(--accent); background: #e1e1f0; color: var(--accent-dark); }
.select-bar { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 10px; }
.select-count { color: var(--muted); font-size: 13px; }
.evidence.is-selecting .page-hit { cursor: copy; }
.page-hit.is-selected { border-color: var(--accent); background: rgba(54, 54, 136, .3); }

/* ---------- U9: карточки брендов и каталогов ---------- */
/* Карточка замещает выдачу: рабочая область, подборка (вместе с кнопкой
   печатной сводки внутри) и витрина гасятся адресно (см. .is-print-mode
   выше — тот же приём), сама карточка — отдельная секция-сосед, поэтому
   список выборочный, а не main целиком. */
body.is-landing .hero,
body.is-landing #results-section,
body.is-landing #search-workbench,
body.is-landing #workspace,
body.is-landing #showcase { display: none !important; }
/* ISH-043: пока открыта карточка, плашка области поиска молчит — иначе она
   показывала бы каталог, из которого человек уже ушёл. */
body.is-landing #catalog-scope { display: none !important; }

.landing-view { width: min(880px, 100%); margin: 44px 0 0; }
.landing-back { display: inline-block; margin-bottom: 18px; padding: 0; border: 0; background: none; color: var(--muted); cursor: pointer; }
.landing-back:hover { color: var(--accent-dark); }
.landing-status { margin: 0; padding: 18px 20px; border-left: 4px solid var(--accent); background: var(--card); }
.landing-missing { border-color: #8a5a17; }
.landing-card { padding: 22px 24px; border: 1px solid var(--line); border-radius: 5px; background: var(--card); }
.landing-brand-head { display: flex; align-items: center; gap: 20px; margin-bottom: 18px; }
.landing-brand-head h2 { margin: 0; }
.landing-catalog-list { display: grid; gap: 4px; margin: 16px 0 0; padding: 0; list-style: none; }
.landing-catalog-list li { padding: 13px 0; border-bottom: 1px solid var(--line); }
.landing-catalog-list li:last-child { border-bottom: 0; }
.landing-catalog-link { display: grid; gap: 4px; width: 100%; padding: 6px 0; border: 0; background: none; color: var(--ink); text-align: left; cursor: pointer; }
.landing-catalog-link:hover strong, .landing-catalog-link:focus-visible strong { color: var(--accent-dark); text-decoration: underline; }
.landing-brand-link { display: block; margin: 16px 0; }
.landing-cta { margin-top: 8px; }

/* Заголовок карточки бренда в аккордеоне витрины: toggle (раскрытие списка
   каталогов) и «Карточка» (открытие карточки, U9) — соседи, не вложенность:
   button внутри button невалиден и ломает раскрытие. */
.brand-head { display: flex; align-items: center; gap: 8px; padding-right: 20px; }
.brand-head .brand-toggle { flex: 1 1 auto; min-width: 0; }
.brand-card-link { flex: 0 0 auto; align-self: center; white-space: nowrap; }

/* Титул каталога в аккордеоне — тоже кнопка (U9): открывает карточку
   каталога, сохраняя прежний жирный вид простого текста. */
.catalog-title-link { display: block; margin: 0; padding: 0; border: 0; background: none; color: inherit; font: inherit; font-weight: 700; text-align: left; cursor: pointer; }
.catalog-title-link:hover, .catalog-title-link:focus-visible { color: var(--accent-dark); text-decoration: underline; }

@media (max-width: 900px) {
  .landing-brand-head { flex-direction: column; align-items: flex-start; gap: 10px; }
}

/* ---------- U10: сравнение двух страниц ---------- */
/* Сравнение замещает рабочую область (приём .is-print-mode/.is-landing —
   адресное гашение): список выдачи, подборка, витрина, hero и глобальная
   строка поиска скрыты; #status остаётся видимым для сообщений панели A.
   Панели — две отдельные рамки в общем grid; между ними нет никаких
   сводных строк, таблиц или подписей — только gap. */
body.is-comparing .hero,
body.is-comparing .search-form,
body.is-comparing #results-section .section-head,
body.is-comparing #result-note,
body.is-comparing #results-export,
body.is-comparing .results-pane,
body.is-comparing #workspace,
body.is-comparing #showcase { display: none !important; }
body.is-comparing #results-section { margin-top: 30px; }
body.is-comparing #search-workbench { grid-template-columns: repeat(2, minmax(0, 1fr)); }
/* Каждая панель — своя рамка: источники визуально разделены (R14). */
body.is-comparing .evidence:not([hidden]) { align-content: start; padding: 14px; border: 1px solid var(--line); border-radius: 6px; background: var(--paper); }
/* Кнопка «Скрыть просмотр» панели A в сравнении не участвует: выход из
   режима — только «Закрыть сравнение»/Esc/Back (единый путь через историю). */
body.is-comparing .back { display: none !important; }

/* ---------- U6: свободный просмотр каталога (без предварительного поиска) ----------
   Тот же приём, что у сравнения выше: список выдачи и её шапка/баннер/
   выгрузка скрыты адресно — искать было нечего, поэтому нечего и
   показывать, — а #search-workbench остаётся видимым и сжимается в одну
   колонку под просмотрщик. */
body.is-browsing #results-section .section-head,
body.is-browsing #result-note,
body.is-browsing #results-export { display: none !important; }
/* ISH-048 п.1: колонка гасится, только пока в ней нечего показывать. Раньше
   здесь стояла безусловная `.results-pane { display: none }`, а контекстная
   панель — та самая, куда клик по надписи кладёт найденное, — живёт ВНУТРИ этой
   колонки. Клик исправно уходил на сервер, ответ исправно приходил и рисовался
   внутрь display:none: для человека «поиск не происходит». Теперь при открытой
   контекстной панели колонка возвращается, а список выдачи (искать было нечего)
   остаётся скрытым. */
body.is-browsing:not(.has-context-search) .results-pane { display: none !important; }
body.is-browsing #results,
body.is-browsing #variants,
body.is-browsing #facets { display: none !important; }
body.is-browsing #search-workbench { grid-template-columns: minmax(0, 1fr); }
body.is-browsing.has-context-search #search-workbench { grid-template-columns: minmax(300px, 380px) minmax(0, 1fr); }
/* Сравнение, открытое поверх свободного просмотра (обе панели свободного
   просмотра — обычный ctx.result, ничто не мешает нажать «Сравнить»):
   двухколоночная раскладка сравнения обязана победить одноколоночную
   раскладку browsing. Явное higher-specificity правило — не полагаемся на
   порядок объявления между секциями U6/U10. */
body.is-comparing.is-browsing #search-workbench { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.panel-caption { margin: 0; font-size: 15px; font-weight: 700; }
/* Панель B до первого открытого результата: подпись и мини-поиск без
   пустого каркаса просмотрщика. */
.evidence.is-empty .evidence-copy,
.evidence.is-empty .page-preview { display: none !important; }
.compare-tools { display: grid; gap: 10px; padding: 14px 16px; border: 1px solid var(--line); border-radius: 5px; background: var(--card); }
.compare-tools-head { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; }
.compare-tools-body { display: grid; gap: 10px; }
/* ISH-048 п.5: свёрнутые инструменты занимают одну строку — страница панели B
   встаёт рядом со страницей панели A, а не под её списком найденного. */
.compare-tools[data-collapsed="true"] .compare-tools-body { display: none; }
.compare-close { justify-self: start; }
.compare-search { display: grid; gap: 8px; }
.compare-search-label { display: grid; gap: 6px; color: var(--muted); font-size: 13px; font-weight: 700; }
.compare-search-input { padding: 10px 12px; border: 1px solid #a6a49d; border-radius: 3px; font-size: 15px; }
.compare-scope { display: flex; align-items: center; gap: 8px; color: var(--ink); font-size: 13px; }
.compare-scope-hint { margin: 0; color: var(--muted); font-size: 12px; }
.compare-search button[type="submit"] { justify-self: start; }
.compare-search-note { margin: 0; color: var(--muted); font-size: 13px; }
/* Список найденного прокручивается ВНУТРИ себя: сколько бы строк ни пришло,
   он не может отодвинуть страницу панели вниз (ISH-048 п.5). */
.compare-results { display: grid; gap: 8px; max-height: 26vh; overflow-y: auto; }
.compare-results:empty { display: none; }
/* Статус в рамке панели: та же семантика data-kind, что у #status, но без
   его наружных отступов. */
.panel-status { margin: 0; padding: 12px 14px; font-size: 14px; }
