/*
Theme Name: Trojmiasto
Theme URI: https://trojmiasto.online
Author: Trojmiasto Online
Author URI: https://trojmiasto.online
Description: Минималистичная block theme для новостного издания о Труймясте. Чистая типографика, карточки статей, сдержанная палитра.
Version: 0.1.0
Requires at least: 6.5
Tested up to: 6.9
Requires PHP: 8.1
License: GPL-2.0-or-later
License URI: https://www.gnu.org/licenses/gpl-2.0.html
Text Domain: trojmiasto
Tags: block-theme, full-site-editing, news, minimalist, russian
*/

/* Minimal extras on top of theme.json — most styling lives in theme.json. */

html { scroll-behavior: smooth; }

body {
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
}

a { text-decoration-thickness: 1px; text-underline-offset: 0.18em; }

/* Entry card hover */
.tm-card { transition: transform 160ms ease, box-shadow 160ms ease; }
.tm-card:hover { transform: translateY(-2px); box-shadow: 0 6px 24px rgba(0,0,0,0.06); }

/* Eyebrow category label */
.tm-eyebrow {
  display: inline-block;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-size: 0.72rem;
  font-weight: 600;
  color: var(--wp--preset--color--accent);
}

/* Section rule */
.tm-rule {
  border: 0;
  border-top: 1px solid var(--wp--preset--color--rule);
  margin: 2rem 0;
}

/* ---------- Header / top banner ---------- */

.tm-header__row { width: 100%; align-items: center; }

/* Banner replaces the site title block — lock height, keep proportions.
   Use !important to defeat any cached/global img rules (e.g. width:100%). */
.tm-site-banner {
  margin: 0;
  line-height: 0;
  flex: 0 0 auto;
  max-width: 60%;
}
.tm-site-banner a { display: inline-block; line-height: 0; }
.tm-site-banner img {
  display: block;
  height: clamp(32px, 4.6vw, 48px) !important;
  width: auto !important;
  max-width: 100% !important;
  object-fit: contain;
}

/* Group nav + search visually so they read as one cluster opposite the banner. */
.tm-header__nav {
  gap: var(--wp--preset--spacing--50);
  align-items: center;
  flex-wrap: nowrap;
  flex: 1 1 auto;
  justify-content: flex-end;
  min-width: 0;
}

/* Search compactness: fixed width on desktop, blends with header. */
.tm-header__search { width: 220px; max-width: 100%; }
.tm-header__search .wp-block-search__inside-wrapper {
  background: var(--wp--preset--color--surface);
  border: 1px solid var(--wp--preset--color--rule);
}
.tm-header__search .wp-block-search__input {
  background: transparent;
  border: 0;
  padding: 0.5rem 0.75rem;
  font-size: 0.9rem;
}
.tm-header__search .wp-block-search__button {
  background: transparent;
  color: var(--wp--preset--color--muted);
  padding: 0 0.5rem;
}
.tm-header__search .wp-block-search__button:hover {
  color: var(--wp--preset--color--ink);
  background: transparent;
}

/* Dark-bg banner variant: paint the whole header strip to match,
   so the banner image visually merges with the header. */
.has-tm-banner.tm-banner--banner-2-1 .tm-header,
.has-tm-banner.tm-banner--banner-2-2 .tm-header {
  background: #0e3756 !important;
  border-bottom-color: rgba(255,255,255,0.08) !important;
  color: #fff;
}
.has-tm-banner.tm-banner--banner-2-1 .tm-header a,
.has-tm-banner.tm-banner--banner-2-2 .tm-header a {
  color: #fff;
}
.has-tm-banner.tm-banner--banner-2-1 .tm-header .tm-header__search .wp-block-search__inside-wrapper,
.has-tm-banner.tm-banner--banner-2-2 .tm-header .tm-header__search .wp-block-search__inside-wrapper {
  background: rgba(255,255,255,0.08);
  border-color: rgba(255,255,255,0.18);
}
.has-tm-banner.tm-banner--banner-2-1 .tm-header .tm-header__search .wp-block-search__input,
.has-tm-banner.tm-banner--banner-2-2 .tm-header .tm-header__search .wp-block-search__input {
  color: #fff;
}
.has-tm-banner.tm-banner--banner-2-1 .tm-header .tm-header__search .wp-block-search__input::placeholder,
.has-tm-banner.tm-banner--banner-2-2 .tm-header .tm-header__search .wp-block-search__input::placeholder {
  color: rgba(255,255,255,0.6);
}
.has-tm-banner.tm-banner--banner-2-1 .tm-header .tm-header__search .wp-block-search__button,
.has-tm-banner.tm-banner--banner-2-2 .tm-header .tm-header__search .wp-block-search__button {
  color: rgba(255,255,255,0.75);
}

/* Desktop (≥1441px): keep nav items strictly on a single line.
   Without this, 6 items right-align inside the nav block but can still
   wrap when the available width tightens at the upper edge. */
@media (min-width: 1441px) {
  .tm-header__nav .wp-block-navigation__container {
    flex-wrap: nowrap;
    white-space: nowrap;
  }
}

/* Tablet / laptop / phone: banner on its own row, nav+search below.
   Trigger at ≤1440px so common MacBook viewports (1280–1440) get the
   clean stacked layout; only wide external monitors keep inline. */
@media (max-width: 1440px) {
  .tm-header__row {
    flex-direction: column;
    align-items: stretch;
    gap: var(--wp--preset--spacing--30);
  }
  .tm-site-banner {
    max-width: 100%;
    text-align: center;
  }
  .tm-site-banner a { display: block; }
  .tm-site-banner img {
    margin: 0 auto;
    height: clamp(34px, 6.5vw, 48px) !important;
  }
  /* In stacked mode: nav left, search right, side by side. */
  .tm-header__nav {
    justify-content: space-between;
    align-items: center;
    width: 100%;
    flex-wrap: wrap;
    gap: var(--wp--preset--spacing--40);
  }
  /* Override the nav block's right-alignment from header.html
     so items hug the left edge in stacked mode. */
  .tm-header__nav .wp-block-navigation,
  .tm-header__nav .wp-block-navigation > .wp-block-navigation__container {
    justify-content: flex-start;
  }
  /* Cap the search width so it never stretches across the full row. */
  .tm-header__search {
    flex: 0 0 auto;
    width: 240px;
    max-width: 100%;
  }
}

/* Phone: search on its own row, full width (acceptable when nav already wraps). */
@media (max-width: 560px) {
  .tm-header__nav { flex-direction: column; align-items: stretch; }
  .tm-header__search { width: 100%; }
}

/* ---------- Mobile navigation overlay (hamburger menu) ----------
   The WP core overlay inherits justifyContent:"right" from the desktop
   nav block, so items hug the right edge inside a full-screen modal.
   Center them and give the modal proper breathing room. */
.wp-block-navigation__responsive-container.is-menu-open {
  padding: clamp(1.5rem, 6vw, 2.5rem) clamp(1rem, 5vw, 2rem);
}
.wp-block-navigation__responsive-container.is-menu-open
  .wp-block-navigation__responsive-container-content {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  justify-content: flex-start;
  gap: var(--wp--preset--spacing--40);
  width: 100%;
}
.wp-block-navigation__responsive-container.is-menu-open
  .wp-block-navigation__container {
  display: flex !important;
  flex-direction: column;
  align-items: stretch;
  justify-content: flex-start;
  gap: var(--wp--preset--spacing--30);
  width: 100%;
}
.wp-block-navigation__responsive-container.is-menu-open
  .wp-block-navigation-item {
  text-align: left;
  width: 100%;
}
.wp-block-navigation__responsive-container.is-menu-open
  .wp-block-navigation-item__content {
  display: block;
  width: 100%;
  padding: 0.75rem 0;
  font-size: 1.125rem;
  font-weight: 500;
  border-bottom: 1px solid var(--wp--preset--color--rule);
}
/* Search inside the overlay (it's nested in the nav block on mobile). */
.wp-block-navigation__responsive-container.is-menu-open .wp-block-search {
  margin-top: var(--wp--preset--spacing--30);
}
.wp-block-navigation__responsive-container.is-menu-open
  .wp-block-search__inside-wrapper {
  background: var(--wp--preset--color--surface);
  border: 1px solid var(--wp--preset--color--rule);
}

/* Responsive tweaks */
@media (max-width: 640px) {
  .wp-block-post-title { font-size: clamp(1.25rem, 5vw, 1.75rem); }
}
