/* =========================================================
   BangkokByStation — base stylesheet (mobile-first)
   Table of contents:
   1. Custom properties / design tokens
   2. Reset & base elements
   3. Utilities
   4. Buttons & form controls
   5. Header & navigation
   6. Hero
   7. Transit lines
   8. Promo banners
   9. Why section
   10. Blog
   11. Footer
   ========================================================= */

/* ---------- 1. Custom properties ---------- */
:root {
  /* Brand colors */
  --color-primary: #0064A8;
  --color-primary-dark: #004D82;
  --color-accent: #77CC00;
  --color-accent-dark: #5FA300;

  /* Text */
  --color-text: #2F2F2F;
  --color-text-soft: #1F1F1F;
  --color-muted: #6B6B6B;
  --color-white: #FFFFFF;

  /* Surfaces */
  --color-bg: #FFFFFF;
  --color-bg-soft: #F2F9FD;
  --color-bg-tint: #EAF6FB;
  --color-border: #E2E8F0;

  /* Status */
  --color-danger: #C0392B;

  /* Transit line colors */ 
  --line-sukhumvit: #66CC33;
  --line-silom: #006666;
  --line-gold: #C79F30;
  --line-blue: #0066CC;
  --line-purple: #663399;
  --line-yellow: #FFCC00;
  --line-pink: #FF99CC;
  --line-arl: #660033;

  /* Type */
  --font-base: 'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;
  --font-script: 'Caveat', cursive;

  /* Layout */
  --container-max: 1400px;
  --container-pad: 1.25rem;
  --radius-sm: 8px;
  --radius-md: 14px;
  --radius-lg: 24px;
  --shadow-sm: 0 6px 18px rgba(0, 40, 70, .08);
  --shadow-md: 0 14px 34px rgba(0, 40, 70, .12);

  /* Motion */
  --transition-fast: 220ms cubic-bezier(.4, 0, .2, 1);
  --transition-med: 400ms cubic-bezier(.16, 1, .3, 1);
  --ease-smooth: cubic-bezier(.16, 1, .3, 1);
}

/* ---------- 2. Reset & base elements ---------- */
*, *::before, *::after {
  box-sizing: border-box;
}

html {
  scroll-behavior: smooth;
  -webkit-text-size-adjust: 100%;
}

body {
  margin: 0;
  font-family: var(--font-base);
  color: var(--color-text);
  background: var(--color-bg);
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
  animation: page-fade-in .5s var(--ease-smooth) both;
}

/* Horizontal-overflow clipping (decorative swirls/blobs that bleed past
   their container edge, wide off-canvas carousels, etc.) used to live
   on html/body above - moved to #main instead. Per spec, giving an
   element overflow-x:hidden while leaving overflow-y unset forces the
   browser to compute overflow-y as auto too (not visible), and ANY
   ancestor with a non-"visible" overflow breaks position:sticky for
   every descendant relative to the viewport - .site-header is
   position:sticky (see below) but was never actually sticking because
   of exactly this, on html/body, two of its ancestors. #main is a
   *sibling* of <header>/<footer> (see inc/header.php/footer.php), not
   an ancestor of either, so clipping overflow here has zero effect on
   their own sticky/layout behavior while still containing anything
   inside <main> that would otherwise bleed past the viewport edge. */
#main {
  overflow-x: hidden;
}

/* opacity-only: previously also animated `transform: translateY(...)`,
   but with fill-mode `both` that leaves a (visually identical, but
   non-`none`) transform permanently applied to <body> after the
   animation ends. Per spec, ANY transform value other than `none` on
   an ancestor makes that ancestor the containing block for
   position:fixed descendants - so every fixed-position element on the
   site (e.g. .search-tooltip) was silently positioning itself relative
   to <body>'s document-flow box instead of the real viewport, which is
   why it jumped to the wrong spot once the page was scrolled. Dropping
   the transform keeps the fade but removes the hijack entirely. */
@keyframes page-fade-in {
  from { opacity: 0; }
  to   { opacity: 1; }
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
}

h1, h2, h3, h4, dl, dd, p, ul, figure {
  margin: 0;
}

ul {
  list-style: none;
  padding: 0;
}

a {
  color: inherit;
  text-decoration: none;
}

img, svg {
  max-width: 100%;
  display: block;
}

button, input {
  font-family: inherit;
  font-size: inherit;
  color: inherit;
}

button {
  cursor: pointer;
  background: none;
  border: none;
}

/* ---------- 3. Utilities ---------- */
/* .page-section is a bare hook applied to every <section> site-wide so
   any section can be targeted generically (CSS/JS) alongside its own
   more specific class (e.g. page-section--about, hero, lines). No
   styles of its own by design. */
.page-section {}

.container {
  width: 100%;
  max-width: var(--container-max);
  margin-inline: auto;
  padding-inline: var(--container-pad);
}

.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.skip-link {
  position: absolute;
  left: 1rem;
  top: -3rem;
  background: var(--color-primary);
  color: #fff;
  padding: .6rem 1rem;
  border-radius: var(--radius-sm);
  transition: top var(--transition-fast);
  z-index: 1000;
}

.skip-link:focus {
  top: 1rem;
}

.script-accent {
  font-family: var(--font-script);
  font-weight: 700;
  color: var(--color-accent);
}

/* ---------- 4. Buttons & form controls ---------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .5rem;
  padding: .8rem 1.6rem;
  border-radius: var(--radius-sm);
  font-weight: 600;
  font-size:1.2rem;
  white-space: nowrap;
  transition: background var(--transition-fast), transform var(--transition-fast), box-shadow var(--transition-fast);
}

.btn--primary {
  background: var(--color-primary);
  color: #fff;
}

.btn--primary:hover,
.btn--primary:focus-visible {
  background: var(--color-primary-dark);
  transform: translateY(-1px);
  box-shadow: var(--shadow-sm);
}

/* Disabled state for any .btn - used while an ajax-validated form
   (Contact Us, List Your Business - see initAjaxValidatedForms() in
   js/site.js) is submitting, so a second click visibly does nothing
   instead of looking identical to the enabled button. */
.btn:disabled,
.btn[disabled] {
  opacity: .6;
  cursor: not-allowed;
  pointer-events: none;
  transform: none !important;
  box-shadow: none !important;
}

.btn--green {
  background: var(--color-accent);
  color: #fff;
}

.btn--green:hover,
.btn--green:focus-visible {
  background: var(--color-accent-dark);
  transform: translateY(-1px);
}

.btn--outline {
  background: #fff;
  color: var(--color-primary);
  border: 1.5px solid var(--color-primary);
}

.btn--outline:hover,
.btn--outline:focus-visible {
  background: var(--color-bg-tint);
}

/* ---------- 5. Header & navigation ---------- */
.site-header {
  position: sticky;
  top: 0;
  z-index: 100;
  background:linear-gradient(to right, rgba(255,255,255,1) -30%,rgb(231, 244, 255) 100%);
  /* backdrop-filter removed - both gradient stops above are fully
     opaque (no alpha), so it was a no-op visually, but per spec any
     ancestor with filter/backdrop-filter/transform/perspective creates
     a new containing block for position:fixed descendants. #mainNav
     (the mobile off-canvas menu) is fixed and nested inside this
     header, so it was being positioned/sized relative to THIS ~72px
     box instead of the viewport - collapsing its "inset:72px 0 0 0"
     down to a ~40px sliver instead of the full screen height. */
}

.site-header__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  min-height: 72px;
}

.logo {
  display: flex;
  align-items: center;
  flex-shrink: 0;
}

.logo__img {
  height: 32px;
  width: auto;
}

.main-nav {
  display: flex;
  flex-direction: column;
  gap: 0;
}

.main-nav__link {
  font-weight: 600;
  font-size: .95rem;
  padding: 1rem 0;
  border-bottom: 1px solid #EEF2F5;
  position: relative;
  transition: color var(--transition-fast);
}

.main-nav__link.is-active {
  color: var(--color-primary);
}

.main-nav__link:hover {
  color: var(--color-primary);
}

.main-nav__link::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: -1px;
  width: 100%;
  height: 2px;
  background: var(--color-primary);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform var(--transition-fast);
}

.main-nav__link:hover::after,
.main-nav__link.is-active::after {
  transform: scaleX(1);
}

/* "Explore Bangkok" nav dropdown (Directory/Places to Visit/Things to
   Do) - the toggle is a <button> wearing the same .main-nav__link class
   as every plain link beside it (so it inherits that same font/hover/
   active-underline styling for free), reset back to look like inline
   text instead of a button. js/site.js toggles .is-open on
   .main-nav__item--dropdown (click, not hover-only) so it works the
   same way on touch as it does with a mouse/keyboard. Mobile-first base
   below; responsive.css turns the submenu into an absolutely positioned
   panel once the nav itself goes horizontal at 1024px+. */
.main-nav__item--dropdown {
  position: relative;
}

.main-nav__link--toggle {
  display: flex;
  align-items: center;
  gap: .4rem;
  width: 100%;
  background: none;
  border: none;
  border-bottom: 1px solid #EEF2F5;
  font-family: inherit;
  cursor: pointer;
  text-align: left;
}

.main-nav__caret {
  font-size: .7rem;
  transition: transform var(--transition-fast);
}

.main-nav__item--dropdown.is-open .main-nav__caret {
  transform: rotate(180deg);
}

.main-nav__submenu {
  display: none;
  list-style: none;
  padding: 0 0 0 1rem;
}

.main-nav__item--dropdown.is-open .main-nav__submenu {
  display: block;
}

.main-nav__submenu a {
  display: block;
  padding: .8rem 0;
  font-size: .9rem;
  font-weight: 600;
  color: var(--color-text-soft);
  border-bottom: 1px solid #EEF2F5;
  transition: color var(--transition-fast);
}

.main-nav__submenu a:hover,
.main-nav__submenu a.is-active {
  color: var(--color-primary);
}

.site-header {
  transition: box-shadow var(--transition-fast), background var(--transition-fast);
}

.site-header.is-scrolled {
  box-shadow: var(--shadow-sm);
}

/* Mobile nav dropdown (overridden for larger screens in responsive.css) -
   sized to its own content (however many links/open submenu items are
   actually showing), not stretched to fill the rest of the screen below
   them. max-height + overflow-y:auto is just a safety cap for the rare
   case content is taller than the viewport, not the normal sizing
   mechanism. */
.main-nav {
  position: fixed;
  top: 72px;
  left: 0;
  right: 0;
  max-height: calc(100vh - 72px);
  background: #fff;
  padding: .5rem var(--container-pad) 2rem;
  transform: translateX(100%);
  transition: transform .25s ease;
  overflow-y: auto;
  box-shadow: var(--shadow-md);
}

.main-nav.is-open {
  transform: translateX(0);
}

.nav-toggle {
  display: flex;
  flex-direction: column;
  gap: 5px;
  padding: .5rem;
  z-index: 200;
}

.nav-toggle span {
  width: 22px;
  height: 2px;
  background: var(--color-text-soft);
  border-radius: 2px;
  transition: transform var(--transition-fast), opacity var(--transition-fast);
}

.nav-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.nav-toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

/* ---------- 6. Hero ---------- */
.hero {
	/* background: linear-gradient(135deg, #FAFBF6 0%, #E4F2FF 100%); */
	/* border-radius: 0 0 8% 60% / 0 0 40px 260px; */
	padding: 3rem 0 1.5rem;
	position: relative;
	overflow: visible;
	background: url(../images/header-bg.png) no-repeat;
	background-size: cover;
	background-position: bottom;
	margin-bottom: 100px;
}

.hero__inner {
  position: relative;
  max-width: 1180px;
  margin-inline: auto;
  text-align: center;
}

.hero__title-wrap {
  display: block;
}

.hero__tag {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  font-family: var(--font-script);
  font-weight: 700;
  color: var(--color-accent);
  font-size:1.3rem;
  line-height: 1;
}

.hero__tag-arrow {
  flex-shrink: 0;
}

/* Home hero: playful little bounce on the "Getting around" arrow, and a
   gentle wobble on the handwritten "by station" accent so the hero feels
   alive without being distracting. Both pause automatically under
   prefers-reduced-motion (see the global override in §2). */
#home .hero__tag .hero__tag-arrow {
  animation: hero-arrow-bounce 2.2s var(--ease-smooth) infinite;
  transform-origin: 70% 70%;
}

@keyframes hero-arrow-bounce {
  0%, 100% { transform: translateY(0) rotate(0deg); }
  50%      { transform: translateY(-7px) rotate(-6deg); }
}

#home .hero__title .script-accent {
  display: inline-block;
  animation: hero-accent-wobble 3.4s ease-in-out infinite;
  transform-origin: 50% 80%;
}

@keyframes hero-accent-wobble {
  0%, 100% { transform: rotate(0deg) scale(1); }
  50%      { transform: rotate(-3deg) scale(1.04); }
}

.hero__title {
  font-size: clamp(2rem, 6vw, 4rem);
  font-weight: 800;
  letter-spacing: -0.02em;
  line-height: 1.05;
  color: var(--color-text-soft);
  margin-top: .25rem;
}

.hero__lead {
  margin: 1.1rem auto 0;
  max-width: 900px;
  font-size: clamp(.9rem, 2vw, 1.05rem);
  color: var(--color-text);
  white-space: normal;
}

.search-bar {
  margin: 1.75rem auto 0;
  max-width: 720px;
  background: #fff;
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-md);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .6rem;
  padding: .2rem;
}

.search-bar__icon {
  flex-shrink: 0;
  margin-left: .4rem;
}

.search-bar input {
  flex: 1 1 100%;
  min-width: 140px;
  border: none;
  outline: none;
  padding: .7rem .5rem;
  font-size: .95rem;
  background: transparent;
  order: 1;
}

/* Selected search scope (e.g. "Directory" once picked from the
   .search-scope-menu below) - sits between the input and the filter
   icon, so the icon itself never needs to change appearance to show
   an active state (see .search-bar__filter, which is intentionally
   NOT restyled when a scope is selected - this chip is the only
   indicator now). Toggled via #heroScopeChip's [hidden] attribute in
   initHeroSearchScope() (js/script.js). */
.search-bar__scope-chip {
  order: 2;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  gap: .35rem;
  background: var(--color-bg-tint, #F0F6FB);
  color: var(--color-primary, #0064A8);
  font-size: .8rem;
  font-weight: 700;
  padding: .35rem .5rem .35rem .65rem;
  border-radius: 999px;
  white-space: nowrap;
}

.search-bar__scope-chip[hidden] { display: none; }

.search-bar__scope-chip-clear {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  border: none;
  border-radius: 50%;
  background: rgba(0, 100, 168, .12);
  color: inherit;
  font-size: 1rem;
  line-height: 1;
  cursor: pointer;
  transition: background .15s ease;
}

.search-bar__scope-chip-clear:hover {
  background: rgba(0, 100, 168, .22);
}

.search-bar__filter-wrap {
	position: relative;
	order: 3;
	flex-shrink: 0;
}

/* Deliberately the same look whether or not a scope is selected - see
   .search-bar__scope-chip above, which is the only thing that changes
   when the user picks "Directory" etc. from the menu. Only the open/
   closed [aria-expanded] state (hover-style tint while the menu itself
   is open) still changes this icon's background. */
.search-bar__filter {
	width: 42px;
	height: 42px;
	border-radius: var(--radius-sm);
	background: transparent;
	border: none;
	display: flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	color: #0064A8;
	font-size: 19px;
	font-weight: 300;
	cursor: pointer;
	transition: background .15s ease;
}

.search-bar__filter[aria-expanded="true"] {
	background: var(--color-bg-tint, #F0F6FB);
}

.search-scope-menu {
	position: absolute;
	top: calc(100% + 10px);
	right: 0;
	z-index: 20;
	min-width: 190px;
	background: #fff;
	border-radius: var(--radius-sm);
	box-shadow: var(--shadow-md);
	padding: .5rem;
}

.search-scope-menu[hidden] { display: none; }

.search-scope-menu__label {
	margin: 0 0 .3rem;
	padding: .2rem .55rem;
	font-size: .72rem;
	font-weight: 700;
	text-transform: uppercase;
	letter-spacing: .04em;
	color: var(--color-text-light, #7A8996);
}

.search-scope-menu__item {
	display: block;
	width: 100%;
	text-align: left;
	border: none;
	background: transparent;
	padding: .55rem .6rem;
	border-radius: var(--radius-sm);
	font-size: .9rem;
	color: var(--color-text);
	cursor: pointer;
	transition: background .15s ease, color .15s ease;
}

.search-scope-menu__item:hover {
	background: var(--color-bg-tint, #F0F6FB);
}

.search-scope-menu__item[aria-checked="true"] {
	background: linear-gradient(90deg, #0064A8, #8DC63F);
	color: #fff;
	font-weight: 600;
}

.search-bar .btn--primary {
  flex: 1 1 100%;
  order: 4;
}

/* Minimum-length warning shown near a search input (see
   initSearchMinLengthGuard() in js/script.js) - positioned in JS via
   getBoundingClientRect() rather than anchored with CSS, since it's
   shared across several differently-structured search forms (header,
   hero, search results page, blog). */
.search-tooltip {
  /* top/left default off-screen: with no offsets at all, a
     position:fixed element with no other positioned ancestor is placed
     at its "static position" - i.e. wherever it would flow normally as
     a block appended to <body> - which pushes body's own content
     height taller and causes a second, independent scrollbar. Keeping
     it pinned off-screen until JS sets real coordinates avoids that
     entirely, regardless of visibility/opacity. */
  position: fixed;
  top: -9999px;
  left: -9999px;
  z-index: 999;
  max-width: 240px;
  background: var(--color-danger);
  color: #fff;
  font-size: .82rem;
  font-weight: 600;
  line-height: 1.35;
  padding: .55rem .85rem;
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow-md);
  opacity: 0;
  transform: translateY(-6px);
  transition: opacity var(--transition-fast), transform var(--transition-fast);
  pointer-events: none;
}

.search-tooltip::after {
  content: "";
  position: absolute;
  top: -6px;
  left: 20px;
  border-width: 0 6px 6px 6px;
  border-style: solid;
  border-color: transparent transparent var(--color-danger) transparent;
}

/* Flipped above the input (see showTooltip() in js/script.js) when
   there isn't enough room below it - arrow flips to point down instead. */
.search-tooltip--above::after {
  top: auto;
  bottom: -6px;
  border-width: 6px 6px 0 6px;
  border-color: var(--color-danger) transparent transparent transparent;
}

.search-tooltip.is-visible {
  opacity: 1;
  transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {
  .search-tooltip { transition: opacity .15s ease; transform: none; }
}

.stats-row {
  display: flex;
  justify-content: center;
  gap: clamp(1.5rem, 8vw, 6.5rem);
  margin-top: 2.75rem;
  flex-wrap: wrap;
}

.stats-row__item {
  text-align: center;
}

.stats-row__item dd {
  font-size:clamp(1.5rem, 4vw, 3rem);
  font-weight: 800;
  color: var(--color-accent);
}

.stats-row__item dt {
	font-size: 1.2rem;
	color: var(--color-text);
	font-weight: 500;
}

.operators-row {
	display: flex;
	justify-content: center;
	gap: 1.25rem;
	margin-top: 3.5rem;
	position: relative;
	z-index: 1;
	margin-bottom: -60px;
}

.operator-badge {
  width: 88px;
  height: 88px;
  border-radius: 50%;
  background: #fff;
  box-shadow: var(--shadow-sm);
  border: 1px solid var(--color-border);
  overflow: hidden;
  transition: transform var(--transition-fast), box-shadow var(--transition-fast), border-color var(--transition-fast);
}

.operator-badge a {
  width: 100%;
  height: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}

.operator-badge:hover,
.operator-badge:focus-within {
  transform: translateY(-4px);
  box-shadow: var(--shadow-md);
  border-color: var(--color-primary);
}

.operator-badge__img {
  object-fit: contain;
}

.operator-badge__img--bts {
  width: 43%;
  height: 52%;
}

.operator-badge__img--mrt {
  width: 74%;
  height: 74%;
}

.operator-badge__img--arl {
  width: 41%;
  height: 63%;
}

/* ---------- 7. Transit lines ---------- */
.lines { padding: 1.75rem 0 3.5rem; }

.section-head { margin-bottom: 1.75rem; }

.section-head h2 {
  font-size: clamp(1.5rem, 3.4vw, 3rem);
  font-weight: 800;
  color: var(--color-text-soft);
}

.section-head p {
	color: var(--color-text);
	margin-top: 0;
	font-size: .95rem;
	font-size: 20px;
}

.section-head--split {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 1rem;
  flex-wrap: wrap;
}

/* Centered variant with the larger Figma heading (List Your Business page) */
.section-head--center { text-align: center; margin-top: 3rem; }

.section-head--center h2 { font-size: clamp(1.8rem, 3.8vw, 2.5rem); }

.section-head--center p { max-width: 460px; margin-inline: auto; }

.filter-tabs {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	gap: 1rem;
	margin-bottom: 3rem;
}

.tab {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 19px 20px;
  border-radius: 20px;
  font-weight: 600;
  font-size: 1.25rem;
  border: 1px solid var(--tab-color, var(--color-border));
  background: #fff;
  color: var(--tab-color, var(--color-text-soft));
  transition: background var(--transition-fast), color var(--transition-fast), border-color var(--transition-fast);
}

.tab__dot {
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background: var(--tab-color, var(--color-primary));
  flex-shrink: 0;
  transition: background var(--transition-fast);
}

.tab.is-active {
  background: var(--tab-color, var(--color-primary));
  border-color: var(--tab-color, var(--color-primary));
  color: #fff;
  font-weight: 600;
}

.tab.is-active .tab__dot {
  background: #fff;
}

.tab:not(.is-active):hover {
  background: color-mix(in srgb, var(--tab-color, var(--color-primary)) 14%, white);
  border-color: var(--tab-color, var(--color-primary));
}

/* Transit System page line tabs ("Discover BTS" filter row) - two-line
   icon + station-count card style matching the Figma design, distinct
   from the simpler dot+label tabs used elsewhere (e.g. the Home page). */

.filter-tabs--stats{
	gap:1rem;
	margin-bottom:2.25rem;
}

.filter-tabs--stats.transitsystemfiltertabs{
	margin-top:-82px;
}

.filter-tabs--stats .tab {
  position: relative;
  gap: .5rem;
  padding: .8rem 1.4rem;
  border-radius: 14px;
  font-size: 1rem;
  font-weight: 400;
  text-align: left;
  border-width: 1.5px;
}

.tab__icon {
  font-size: 1.35rem;
  color: var(--tab-color, var(--color-text-soft));
  flex-shrink: 0;
}

.tab__text {
  display: flex;
  flex-direction: column;
  line-height: 1.3;
}

.tab__name {
  font-weight: 700;
  font-size: 1.25rem;
  color: var(--tab-color, var(--color-text-soft));
}

.tab__count {
  font-size: 0.85rem;
  color: var(--color-muted);
}

.filter-tabs--stats .tab.is-active {
  background: var(--tab-color, var(--color-primary));
  border-color: var(--tab-color, var(--color-primary));
}

.filter-tabs--stats .tab.is-active .tab__icon,
.filter-tabs--stats .tab.is-active .tab__name { color: #fff; }
.filter-tabs--stats .tab.is-active .tab__count { color: rgba(255, 255, 255, .85); }

.filter-tabs--stats .tab.is-active::after {
	content: "";
	position: absolute;
	bottom: -9px;
	left: 50%;
	transform: translateX(-50%);
	width: 0;
	height: 0;
	border-left: 16px solid transparent;
	border-right: 16px solid transparent;
	border-top: 11px solid var(--tab-color, var(--color-primary));
}

.line-card {
  background: #fff;
  border: 1.5px solid var(--line-color, var(--color-border));
  box-shadow: var(--shadow-sm);
  border-radius: 20px;
  padding: 1.5rem 1.75rem;
  margin-bottom: 1.25rem;
	border-left-width: 7px;
}

.line-card__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: .6rem;
  flex-wrap: wrap;
  margin-bottom: 1.1rem;
}

.line-card__name {
  font-weight: 700;
  font-size: 1rem;
  padding: .4rem .7rem;
  border-radius: 8px;
  background: color-mix(in srgb, var(--line-color, var(--color-primary)) 18%, white);
  color: var(--line-color, var(--color-primary));
}

.line-card__name--combined {
  white-space: normal;
}

.line-card__meta {
  font-size: 1rem;
  color: var(--color-text);
}

.line-card__meta b {
  font-weight: 700;
}

.line-card__meta-wrap {
  display: flex;
  align-items: center;
  gap: .6rem;
}

.line-card__reverse-btn {
  flex-shrink: 0;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  border: 1.5px solid var(--color-border);
  background: #fff;
  color: var(--color-muted);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: border-color var(--transition-fast), color var(--transition-fast), transform var(--transition-fast);
}

.line-card__reverse-btn:hover {
  border-color: var(--line-color, var(--color-primary));
  color: var(--line-color, var(--color-primary));
  transform: rotate(180deg);
}

.line-card__scroller {
  display: flex;
  align-items: center;
  gap: .5rem;
}

.line-card__nav-btn {
  flex-shrink: 0;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  border: 1.5px solid var(--color-border);
  background: #fff;
  color: var(--color-muted);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: border-color var(--transition-fast), color var(--transition-fast);
}

.line-card__nav-btn:hover {
  border-color: var(--line-color, var(--color-primary));
  color: var(--line-color, var(--color-primary));
}

.station-row {
  display: flex;
  align-items: flex-start;
  overflow-x: auto;
  scroll-behavior: smooth;
  flex: 1 1 auto;
  min-width: 0;
  scrollbar-width: none;
  -ms-overflow-style: none;
  position: relative;
}

.station-row::-webkit-scrollbar {
  display: none;
}

/* Edge-fade "there's more here" cue removed - it washed out whichever
   station sat at the scroll edge (station name became hard to read).
   The prev/next arrows + progress bar (see updateBar() in js/script.js)
   already communicate "there's more to scroll" without fading any
   station's text. */

.station {
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .35rem;
  padding-inline: 1rem;
  position: relative;
  font-size: .85rem;
  color: var(--color-text);
  font-weight: 400;
  white-space: nowrap;
  transition: color var(--transition-fast);
}

.station:hover,
.station:focus-visible {
  color: var(--line-color, var(--color-primary));
  font-weight: 600;
}

.station::before {
  content: "";
  position: absolute;
  top: calc(14px / 2 - 1px);
  left: 50%;
  transform: translateX(-50%);
  width: 40px;
  height: 2px;
  background: var(--line-color, var(--color-border));
}

.station:first-child::before {
  left: 50%;
  width: 20px;
  transform: none;
}

.station:last-child::before {
  left: auto;
  right: 50%;
  width: 20px;
  transform: none;
}

.station__dot {
  display: block;
  width: 14px;
  height: 14px;
  border-radius: 50%;
  background: var(--line-color, var(--color-primary));
  border: 1px solid var(--line-color, var(--color-primary));
  z-index: 1;
  transition: transform var(--transition-fast), box-shadow var(--transition-fast);
}

.station.is-interchange .station__dot {
  background: #fff;
  border-width: 2px;
}

.station:hover .station__dot,
.station:focus-visible .station__dot {
  transform: scale(1.35);
  box-shadow: 0 0 0 5px color-mix(in srgb, var(--line-color, var(--color-primary)) 22%, transparent);
}

.station__badge {
	margin-top: -3px;
	background: color-mix(in srgb, var(--line-color, var(--color-primary)) 16%, white);
	border: 1px solid color-mix(in srgb, var(--line-color, var(--color-primary)) 55%, white);
	color: var(--line-color, var(--color-primary));
	font-size: .7rem;
	font-weight: 400;
	padding: 1px 6px;
	border-radius: 3px;
	white-space: nowrap;
	transition: background var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast);
}

/* Only badges with a known connecting line (see createStationEl() in
   js/script.js) get role="link" + a click handler - these get a pointer
   cursor and a hover/focus cue; plain "Interchange" badges with no
   linkable target (rare/legacy data) stay non-interactive. */
.station__badge[role="link"] {
	cursor: pointer;
}

.station__badge[role="link"]:hover,
.station__badge[role="link"]:focus-visible {
	background: color-mix(in srgb, var(--line-color, var(--color-primary)) 30%, white);
	outline: none;
}

/* Custom "Interchange with X Line" tooltip (createStationEl() in
   js/script.js, showInterchangeTooltip()) - same fixed-position +
   JS-measured pattern as .search-tooltip, so it isn't clipped by
   .station-row's overflow-x:auto (which also clips the y-axis - a
   CSS-only ::after positioned above the badge would get cut off).
   --tooltip-color is set per-badge in JS to that station's own
   --line-color, so the bubble matches the connecting line's brand. */
.station-tooltip {
  position: fixed;
  top: -9999px;
  left: -9999px;
  z-index: 999;
  max-width: 220px;
  background: var(--tooltip-color, var(--color-primary));
  color: #fff;
  font-size: .78rem;
  font-weight: 600;
  line-height: 1.35;
  padding: .45rem .75rem;
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow-md);
  opacity: 0;
  transform: translateY(6px);
  transition: opacity var(--transition-fast), transform var(--transition-fast);
  pointer-events: none;
  text-align: center;
  /* Renders each "Interchange with X" entry set via textContent's \n
     joins on its own line when a station connects to 2+ lines, instead
     of collapsing them into one run-on line. Must be the LAST
     white-space declaration in this rule - an earlier "nowrap" here
     previously won the cascade and silently kept everything on one
     line despite the \n joins in script.js. */
  white-space: pre-line;
}

.station-tooltip::after {
  content: "";
  position: absolute;
  bottom: -6px;
  left: 50%;
  transform: translateX(-50%);
  border-width: 6px 6px 0 6px;
  border-style: solid;
  border-color: var(--tooltip-color, var(--color-primary)) transparent transparent transparent;
}

.station-tooltip.is-visible {
  opacity: 1;
  transform: translateY(0);
}

@media (prefers-reduced-motion: reduce) {
  .station-tooltip { transition: opacity .15s ease; transform: none; }
}

.line-card__bar {
  margin-top: .9rem;
  height: 6px;
  border-radius: 3px;
  background: #E8F5E9;
  overflow: hidden;
  cursor: pointer;
}

.line-card__bar span {
  display: block;
  height: 100%;
  width: 100%;
  background: var(--line-color, var(--color-primary));
  border-radius: 3px;
  cursor: grab;
  touch-action: none;
  transition: margin-left .1s linear;
}

.line-card__bar span.is-dragging {
  cursor: grabbing;
  transition: none;
}

/* ---------- 8. Promo banners ---------- */
/* Real exported banner images (from Figma) fill these containers directly. */
.promo {
  border-radius: var(--radius-lg);
  overflow: hidden;
  position: relative;
  /*margin-block: 2rem;*/
  box-shadow: var(--shadow-sm);
	margin-bottom: 80px;
}

.promo img {
  width: 100%;
  height: auto;
  display: block;
  /* Full, uncropped banner everywhere EXCEPT the Directory/Places to
     Visit/Things to Do listing pages (see .listing-layout .promo img
     below) - renders at the image's own natural ratio instead of
     forcing it into a fixed box. The 1064.84:181.23 short/wide crop
     used to apply here globally, which was cropping straight through
     banner images that were never designed for that ratio (logo/tagline
     text near the top and bottom edges getting cut off) on every page
     that isn't one of those 3 listing pages. */
}

/* Directory / Places to Visit / Things to Do only: banners rendered
   between listing results (render_banner() called from inside
   render_directory_results_panel(), always nested in this
   data-listing-app section's .listing-layout class) stay the shorter
   Figma-spec 1064.84:181.23 crop that fits compactly between listing
   cards. Everywhere else render_banner() is used (station pages, line
   pages, home, ...) is NOT inside .listing-layout, so it's unaffected
   and shows the image in full per the base rule above. */
.listing-layout .promo img {
  aspect-ratio: 1064.84 / 181.23;
  object-fit: cover;
}

/* Optional text/button overlay for admin-managed banners (Banner
   Management module) whose image doesn't already have text baked in. */
.promo__link {
  display: block;
  color: inherit;
  text-decoration: none;
}

.promo__overlay {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 0.5rem;
  padding: 2rem 2.5rem;
  background: linear-gradient(90deg, rgba(0, 0, 0, 0.6) 0%, rgba(0, 0, 0, 0.2) 55%, rgba(0, 0, 0, 0) 100%);
  color: var(--color-white);
}

.promo__heading {
  margin: 0;
  font-size: 1.5rem;
  font-weight: 700;
  color: var(--color-white);
}

.promo__subtitle {
  margin: 0;
  max-width: 32rem;
  font-size: 1rem;
  color: var(--color-white);
}

.promo__btn {
  align-self: flex-start;
  margin-top: 0.25rem;
}

/* ---------- 9. Why section ---------- */
.why {
  background: var(--color-bg-tint);
  padding:6rem 0;
}
.why__grid {
  display: grid;
  gap: 2.5rem;
  align-items: stretch;
}

.why__heading {
  text-align: center;
  font-size: clamp(1.8rem, 4.6vw, 5.5rem);
  font-weight: 700;
  color: var(--color-text-soft);
  margin-bottom: 3rem;
}
.why .container {
	text-align: center;
}
#why.why h2.why__heading {
	position: relative;
	display: inline-block;
}
#why.why h2.why__heading::before {
	content: "";
	position: absolute;
	background: url(../images/why-icon.svg) no-repeat;
	width: 139px;
	height: 106px;
	right: 0;
	vertical-align: top;
	transform: translateY(-.6em);
	margin-right: -1.05em;
}
#why.why h2.why__heading::after {
	content: "";
	position: absolute;
	background: url(../images/why-arrow.svg) no-repeat;
	width: 68px;
	height: 61px;
	right: 0;
	transform: translateY(1.2em);
	margin-right: -.8em;
}

.why__text p {
	color: var(--color-text);
	margin-bottom: 1.2rem;
	font-size: 1.1rem;
	text-align: left;
}

.checklist {
	margin-top: 1rem;
	display: grid;
	gap: .6rem;
	color: var(--color-text);
}

/* .why .container (2 class selectors) sets text-align:center for the
   section's centered heading, which otherwise wins over a plain
   `.checklist { text-align: left }` (1 class selector) regardless of
   source order, and inherits into each li's wrapped text. Single-line
   items hide this (the one line already fills the width, so centered
   vs left look the same), but any item long enough to wrap to a 2nd
   line visibly centers its shorter trailing line under the first
   instead of lining up with the arrow bullet like the rest of the
   list. Matching the 2-class specificity here (and staying later in
   the file) is what actually overrides it. */
.why .checklist {
	text-align: left;
}

.checklist li {
	display: flex;
	align-items: flex-start;
	gap: .6rem;
	font-weight: 500;
	font-size: 1.1rem;
	color: var(--color-text);
}

.checklist li::before {
	content: "";
	flex-shrink: 0;
	width: 21px;
	height: 22px;
	background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='1.5' y='8.5' width='7' height='7' rx='1.5' ry='1.5' fill='%231E88E5' transform='rotate(45 5 12)'/%3E%3Cline x1='9' y1='12' x2='22' y2='12' stroke='%231E88E5' stroke-width='2.5' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / contain;
	margin-top: 4px;
}

.why__gallery {
  display: flex;
  gap: 10px;
}

.why__gallery-col {
  display: flex;
  flex-direction: column;
  gap: 10px;
  flex: 1;
  min-width: 0;
}

.gallery-photo {
  display: block;
  position: relative;
  width: 100%;
  border-radius: var(--radius-md);
  overflow: hidden;
  flex: 3 3 0;
  min-height: 0;
}

.gallery-photo--tall { flex: 5 5 0; }

/* Inner zoom: the frame (.gallery-photo) stays put and clips via
   overflow:hidden, while just the image inside it scales up on hover -
   a contained zoom instead of the whole tile growing/lifting. */
.gallery-photo__img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform var(--transition-med);
}

.gallery-photo:hover .gallery-photo__img,
.gallery-photo:focus-within .gallery-photo__img {
  transform: scale(1.12);
}

/* ---------- 10. Blog ---------- */
.blog { padding: 3.5rem 0; }

.blog .btn.btn--primary {
	margin-bottom: 6px;
}

.blog-grid {
  display: grid;
  gap: 1.5rem;
}

.blog-card {
  position: relative; /* anchors the station ribbon, which overhangs the card edge */
  border-radius: var(--radius-md);
  border: 1px solid #D7EFFF;
  box-shadow: var(--shadow-sm);
  transition: transform var(--transition-fast), box-shadow var(--transition-fast);
}

.blog-card__img img { border-radius: var(--radius-md) var(--radius-md) 0 0; }

.blog-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-md); }

.blog-card__img {
  aspect-ratio: 16 / 10;
  position: relative;
}

/* Inner zoom: the <a> is a fixed, non-transformed frame that clips via
   overflow:hidden (not .blog-card__img itself, which would also cut
   off the green category tag - it deliberately hangs half below the
   image via translateY(50%) so it straddles the image/body seam).
   Only the <img> inside scales on hover, so the frame's rounded top
   corners stay put instead of growing along with the zoomed photo. */
.blog-card__img a {
  display: block;
  width: 100%;
  height: 100%;
  overflow: hidden;
  border-radius: var(--radius-md) var(--radius-md) 0 0;
}

.blog-card__img img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform var(--transition-med);
}

.blog-card:hover .blog-card__img img { transform: scale(1.12); }

.blog-card__img .tag {
	position: absolute;
	bottom: 0;
	left: 20px;
	transform: translateY(50%);
}

.tag {
  font-size: 1rem;
  font-weight: 500;
  padding: 5px 11px;
  border-radius: 5px;
  color: #fff;
  line-height: 1.2;
  z-index: 2;
}

.tag--green { background: var(--color-accent); }

.blog-card__body {
	padding: 1.25rem;
	background: #F4FAFE;
	border-radius: 0 0 var(--radius-md) var(--radius-md);
	border: 1px solid #D7EFFF;
}

.blog-card__body h3 {
	font-size: 1.6rem;
	font-weight: 700;
	color: var(--color-text-soft);
	margin-bottom: 16px;
	line-height: 100%;
	margin-top: 12px;
}

.blog-card__body p {
	font-size: 18px;
	color: #1F1F1F;
	margin-bottom: .9rem;
	line-height: 130%;
	font-weight: 400;
}

.blog-card__meta {
  font-size: .75rem;
  color: #9AA5B1;
  font-weight: 600;
}

/* "Near {Station} Station" ribbon on blog cards (admin: Blog Posts ->
   Nearby Station): green flag ribbon overhanging the card's top-left,
   with a notched tail and a dark fold under the overhang (Figma). */
.blog-card__station {
	position: absolute;
	top: 16px;
	left: -8px;
	z-index: 2;
	background: linear-gradient(90deg, #0575C8 0%, #2E9295 50%, #7CC33F 100%);
	color: #fff;
	font-size: 14px;
	font-weight: 700;
	line-height: 1;
	padding: .8rem .85rem .8rem 1rem;
	border-radius: 12px 0 0 0;
	filter: drop-shadow(0 2px 5px rgba(15, 45, 80, .25));
}

/* notched flag tail */
.blog-card__station::after {
  content: '';
  position: absolute;
  left: 100%;
  top: 0;
  width: 11px;
  height: 100%;
  background:
    linear-gradient(to bottom right, #7CC33F 49.6%, transparent 50%) top / 100% 50.4% no-repeat,
    linear-gradient(to top right, #7CC33F 49.6%, transparent 50%) bottom / 100% 50.4% no-repeat;
}

/* dark fold under the left overhang */
.blog-card__station::before {
  content: '';
  position: absolute;
  left: 0;
  top: 100%;
  width: 8px;
  height: 8px;
  background: #0A4E86;
  clip-path: polygon(0 0, 100% 0, 100% 100%);
}

/* ---------- 11. Footer ---------- */
.site-footer {
  background: var(--color-primary);
  color: #fff;
}

.site-footer__top {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: flex-start;
  gap: 2rem 2.5rem;
  padding-block: 3rem 2rem;
  border-bottom: 1px solid rgba(255, 255, 255, .15);
}

/* Matches Figma: with 3 flex items and justify-content:space-between,
   the middle item (nav) sits exactly centered in the gap between the
   logo block and the newsletter form, not centered on the full width. */

.footer-logo {
  display: flex;
  align-items: center;
  margin-bottom: .8rem;
  transition: opacity var(--transition-fast);
}

.footer-logo:hover { opacity: .8; }

.footer-logo__img {
  height: 32px;
  width: auto;
}

.site-footer__about p {
  font-size: .875rem;
  max-width: 320px;
}

.social-list {
  display: flex;
  gap: .6rem;
  margin-top: 1rem;
}

.social-list a {
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: var(--color-accent);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  transition: background var(--transition-fast), transform var(--transition-fast), box-shadow var(--transition-fast);
}

.social-list a:hover {
  background: var(--color-accent-dark);
  transform: translateY(-3px) scale(1.06);
  box-shadow: 0 8px 16px rgba(0, 0, 0, .28);
}

.site-footer__links h3, .newsletter h3 {
	color: #fff;
	font-size: 1.4rem;
	margin-bottom: .6rem;
	font-weight: 600;
}

.site-footer__links {
  align-self: center;
}

.site-footer__links ul {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 1.5rem 2rem;
}

.site-footer__links li {
  font-size: .9rem;
}

.site-footer__links a {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: .5rem;
	font-size:18px;
	text-align: center;
	color: rgba(255, 255, 255, .8);
	transition: color var(--transition-fast);
}

.site-footer__links a:hover { color: var(--color-accent); }

.site-footer__links-icon {
	width: 26px;
	height: 26px;
	transition: transform var(--transition-fast), filter var(--transition-fast);
}

.site-footer__links a:hover .site-footer__links-icon {
	transform: translateY(-4px);
	filter: drop-shadow(0 6px 10px rgba(0, 0, 0, .25));
}

.social-list img { display: block; max-width: 16px; max-height: 16px; }

/* Single white pill with the green Subscribe button docked inside (Figma) */
.newsletter__row {
	display: flex;
	flex-wrap: nowrap;
	align-items: center;
	gap: .45rem;
	background: #fff;
	border-radius: 10px;
	padding: .2rem;
	border: 2px solid rgba(255, 255, 255, .45);
}

.newsletter__row input {
	flex: 1 1 auto;
	min-width: 0;
	padding: .55rem .7rem;
	border-radius: 8px;
	border: none;
	font-size: 1rem;
	outline: none;
	color: #2f2f2f !important;
}


.newsletter__row .btn {
	flex-shrink: 0;
	padding: .55rem 1.8rem .55rem 1.05rem;
	font-size: 1rem;
	border-radius: 8px;
	background: var(--color-accent) url(https://mvmprojects1.com/bangkokbystation/images/subscribe-arrow.svg) no-repeat;
	background-position: right 12px center;
}


.site-footer__bottom {
  background: #004D82;
}

.site-footer__bottom-inner {
  display: flex;
  flex-direction: column;
  gap: .6rem;
  align-items: flex-start;
  padding-block: 1.25rem;
  font-size: .8rem;
  font-size: 1rem;
  color: #fff;
}

.legal-links {
  display: flex;
  gap: 1rem;
  flex-wrap: wrap;
}

.legal-links a {
  color: rgba(255, 255, 255, .75);
  position: relative;
  transition: color var(--transition-fast);
}

.legal-links a::after {
  content: "";
  position: absolute;
  left: 0;
  bottom: -3px;
  width: 100%;
  height: 1px;
  background: var(--color-accent);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform var(--transition-fast);
}

.legal-links a:hover {
  color: var(--color-accent);
}

.legal-links a:hover::after {
  transform: scaleX(1);
}

.legal-links__sep {
  color: #fff;
  user-select: none;
}

/* =========================================================
   INNER PAGES — shared components (BTS, Directory, Blog,
   legal pages, contact, list-your-business, etc.)
   Table of contents:
   12. Back button
   13. Page hero (inner pages) + breadcrumb
   14. Facilities / icon rail
   15. Station detail cards (exit guide / map)
   16. Category tiles (big image + count + arrow)
   17. POI cards (place-card / simple grid card)
   18. Sidebar station filter (Directory / Places / Things to do)
   19. Category pill filter (Blog)
   20. Legal page template
   21. Forms (Contact / List your business)
   22. FAQ accordion
   23. How it works steps
   24. Reviews carousel
   25. Blog detail (TOC, prev/next)
   26. Pagination
   27. List Your Business hero + stats
   28. Business promo banner (generic gradient CTA)
   ========================================================= */

/* ---------- 12. Back button ---------- */
.back-btn {
	position: absolute;
	top: 1.75rem;
	left: var(--container-pad);
	width: 50px;
	height: 50px;
	border-radius: 50%;
	background: #1F1F1F;
	color: #fff;
	display: flex;
	align-items: center;
	justify-content: center;
	z-index: 2;
	transition: background var(--transition-fast), transform var(--transition-fast);
	left: -210px;
	top: -10px;
}

.back-btn:hover { background: var(--color-primary); transform: translateX(-2px); }

/* ---------- 13. Page hero ---------- */
.page-hero {
	/* background: linear-gradient(135deg, #FAFBF6 0%, #E4F2FF 100%); */
	/* border-radius: 0 0 50% 50% / 0 0 90px 90px; */
	padding:3rem 0 6.5rem;
	position: relative;
	text-align: center;
	overflow: visible;
	background: url(../images/header-bg.png) no-repeat;
	background-position-x: 0%;
	background-position-y: 0%;
	background-size: auto;
	background-size: cover;
	background-position: bottom;
}

.page-hero__inner {
  max-width: 920px;
  margin-inline: auto;
  position: relative;
}

.page-hero__tag {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  font-family: var(--font-script);
  font-weight: 700;
  color: var(--color-accent);
  font-size: clamp(1.3rem, 3vw, 1.8rem);
}

.page-hero__title {
  font-size: clamp(1.9rem, 4.6vw, 3.1rem);
  font-weight: 800;
  color: var(--color-text-soft);
  line-height: 1.15;
  letter-spacing: -.01em;
}

.page-hero__title .script-accent { font-size:1.55em; }

/* Transit System pages ("Discover BTS/MRT/Airport Link") - matches the Figma hero's much larger
   127px/1920px-wide headline (~6.6vw) instead of the smaller default page-hero title. */
.page-hero__title--transit { font-size: clamp(2.4rem, 6.6vw, 5.5rem); font-weight: 700; }

/* /system/airport-link only: "Airport Link" is much longer than "BTS"/
   "MRT" (the only other labels this same heading renders), so at the
   shared clamp() size above it can wrap onto a second line mid-phrase
   inside the hero's normal container width. Scoped to this one page
   (see the page-hero--transit-system-{slug} class on the <section> in
   transitsystems.php) so BTS/MRT keep their existing size untouched -
   just a slightly smaller ceiling plus no-wrap for the line/system name
   itself so "Airport Link" always stays on one line like "BTS"/"MRT" do. */
.page-hero--transit-system-airport-link .page-hero__title--transit { font-size: clamp(2rem, 5.4vw, 4.4rem); }
/* nowrap on the whole heading, not just the "Airport Link" run itself -
   the earlier fix only stopped "Airport" and "Link" from breaking apart
   from EACH OTHER, but the browser could still wrap the line between
   "Discover"+icons and "Airport Link", landing "Airport Link" on its own
   second line - which is what was still happening. This keeps the full
   "Discover [icons] Airport Link" heading on one line like BTS/MRT's
   naturally-short "Discover BTS"/"Discover MRT" already are. Reverted
   back to normal wrapping below 479px (see responsive.css) as a safety
   net so it can still break rather than overflow on the narrowest phones. */
.page-hero--transit-system-airport-link .page-hero__title--transit { white-space: nowrap; }
.page-hero--transit-system-airport-link .page-hero__title--transit .script-accent { white-space: nowrap; }

.page-hero__badge-icons {
	display: inline-flex;
	align-items: center;
	vertical-align: top;
	transform:translateY(-.30em);
	margin-left: -.99em;
	margin-right: -.22em;
	right: -24px;
	position: relative;
}

.page-hero__badge {
	width: 0.82em;
	height: 0.82em;
	border-radius: 50%;
	display: inline-block;
	box-shadow: var(--shadow-sm);
}

.page-hero__badge--dark { position: relative; z-index: 2; }
.page-hero__badge--light {
	position: relative;
	z-index: 1;
	margin-left: -.17em;
	z-index: 111;
}
.page-hero__badge.page-hero__badge--dark {
	bottom: -13px;
}

.page-hero__swirl {
  display: inline-block;
  vertical-align: middle;
  width: .5em;
  margin-right: .15em;
  transform: translateY(-.05em);
}

.page-hero__swirl svg { width: 100%; height: auto; display: block; }

/* Transit System hero ("Discover BTS/MRT/Airport Link") - one-time
   entrance for the swirl arrow, the two badge icons (staggered), and
   the coloured system name, played once on page load rather than
   looping. Keyframe end-states include each element's normal resting
   transform (e.g. the swirl's translateY(-.05em)) so nothing shifts
   once the animation finishes. */
.page-hero--transit-system .page-hero__swirl {
  animation: hero-swirl-in .6s var(--ease-smooth) both;
}

@keyframes hero-swirl-in {
  from { opacity: 0; transform: translateY(-.05em) scale(.4) rotate(-25deg); }
  to   { opacity: 1; transform: translateY(-.05em) scale(1) rotate(0deg); }
}

.page-hero--transit-system .page-hero__badge--dark,
.page-hero--transit-system .page-hero__badge--light {
  animation: hero-badge-pop .5s var(--ease-smooth) both;
}

.page-hero--transit-system .page-hero__badge--dark { animation-delay: .3s; }
.page-hero--transit-system .page-hero__badge--light { animation-delay: .45s; }

@keyframes hero-badge-pop {
  0%   { opacity: 0; transform: scale(.3); }
  60%  { opacity: 1; transform: scale(1.15); }
  100% { opacity: 1; transform: scale(1); }
}

/* Chained, not simultaneous: hero-word-in plays first (the one-time
   slide/rotate entrance), then hero-accent-wobble (the same continuous
   gentle rotate+scale wobble used on the homepage's "by station" accent,
   see #home .hero__title .script-accent above) takes over once it ends -
   its 1.15s delay matches word-in's own .55s delay + .6s duration so the
   handoff has no visible jump. Both animate `transform`, so overlapping
   them would fight; non-overlapping windows avoid that. */
.page-hero--transit-system .page-hero__title--transit .script-accent {
  display: inline-block;
  animation: hero-word-in .6s var(--ease-smooth) .55s both,
             hero-accent-wobble 3.4s ease-in-out 1.15s infinite;
}

@keyframes hero-word-in {
  from { opacity: 0; transform: translateY(14px) rotate(-4deg); }
  to   { opacity: 1; transform: translateY(0) rotate(0deg); }
}

.page-hero__lead {
	margin: .5rem auto 0;
	max-width: 710px;
	color: var(--color-text);
	font-size: .95rem;
}

.page-hero__nav-btn {
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: var(--color-primary);
  color: #fff;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  vertical-align: middle;
  flex-shrink: 0;
  transition: background var(--transition-fast);
}

.page-hero__nav-btn:hover { background: var(--color-primary-dark); }

.page-hero__title-row {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 1rem;
  flex-wrap: wrap;
}

.breadcrumb {
  margin-top: 1rem;
  font-size: 1rem;
  color: var(--color-text);
  display: flex;
  justify-content: center;
  gap: .4rem;
  flex-wrap: wrap;
}

.breadcrumb a { color: var(--color-primary);}
.breadcrumb a:hover { text-decoration: underline; }
.breadcrumb span[aria-hidden] {
	color: #2f2f2f;
	font-size: 1.4rem;
	line-height: 21px;
}

/* Station hero "Interchange with {Line} (Station, Code)" line(s) - see
   station.php's $interchangeDisplay. A small solid circle in the target
   line's own color (--line-color elsewhere on the site, e.g.
   .station__dot) precedes each line name instead of the old single flat
   yellow chip background, so a station with 2+ interchanges correctly
   shows each one in its own line's real color. */
.station-interchange-chips {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  /* .page-hero (the ancestor) is text-align:center, same as .breadcrumb
     right above this - but a flex row's own alignment doesn't follow
     text-align, so without this it defaults to flex-start and sits
     flush left while everything else in the hero is centered. */
  justify-content: center;
  gap: .3rem;
  margin-top: 1rem;
  font-size: .9rem;
  font-weight: 600;
  color: var(--color-text-soft);
}

.station-interchange-chip {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  color: inherit;
  text-decoration: none;
}

a.station-interchange-chip:hover,
a.station-interchange-chip:focus-visible {
  text-decoration: underline;
}

.station-interchange-chip__dot {
  display: inline-block;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  flex: none;
}

.station-interchange-chips__sep {
  color: var(--color-border);
}

/* Contact-us style two-tone title */
.page-hero__title--split .accent-green { color: var(--color-accent); }
.page-hero__title--split .accent-blue { color: var(--color-primary); }

/* Legal-page style: big blue heading, no gradient text */
.page-hero--legal .page-hero__title { color: var(--color-primary); font-size: clamp(2.2rem, 5.4vw, 4rem); }
.page-hero--legal .page-hero__updated { margin-top: .75rem; color: var(--color-text); font-size: .95rem; }

/* Meta row above title (blog detail) */
.page-hero__meta {
  display: flex;
  justify-content: center;
  gap: 1.5rem;
  flex-wrap: wrap;
  /*font-size: .85rem;
  color: var(--color-muted);*/
  margin-bottom: 30px;
}

.page-hero__meta li { display: inline-flex; align-items: center; gap: .4rem; }

/* ---------- 14. Facilities / icon rail ---------- */
.icon-rail-card {
  /* Shared with .icon-rail's gap below AND the facilities-specific
     max-width calc() further down this file, so the "fits exactly 10
     icons" math and the actual visual gap between them can never drift
     out of sync again - bump this one value to change the spacing. */
  --icon-rail-gap: 50px;
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  padding: 1.5rem;
  margin-top: 1.5rem;
}

.icon-rail-card h3 {
  font-size: 1.15rem;
  font-weight: 700;
  color: var(--color-text-soft);
  margin-bottom: 1.1rem;
}

.icon-rail {
  display: flex;
  align-items: flex-start;
  justify-content: center;
  gap: var(--icon-rail-gap, 1.6rem);
  overflow-x: auto;
  scrollbar-width: none;
  /* overflow-x: auto forces the y-axis to clip too, which was slicing
     the top off the hover-lifted/scaled facility circle (and its
     box-shadow). Real padding - not a compensating negative margin,
     which doesn't move the clip boundary - gives it room. Same reason
     for the left/right padding: without it, the first/last item's
     hover scale(1.08) + box-shadow gets clipped flush against the
     track's own scroll boundary instead of having room to grow. */
  padding-top: 20px;
  padding-bottom: 8px;
  padding-left: 20px;
  padding-right: 20px;
  /* Caps the ROW itself (not the surrounding card - see .icon-rail-card,
     which stays full width to match other cards/sections on the page)
     at roughly 10 icons wide (10 * .icon-rail__item's 68px + 9 gaps of
     --icon-rail-gap + this row's own left/right padding above),
     centered via margin-inline: auto, so a station with more than ~10
     facilities always scrolls instead of the row just stretching to
     fill however wide the (full-width) card happens to be. A station
     with fewer facilities renders a narrower, centered row via
     justify-content: center above. */
  max-width: calc(68px * 10 + var(--icon-rail-gap, 1.6rem) * 9 + 20px * 2 + 8px);
  margin-inline: auto;
}

/* A station with enough facilities to actually overflow the rail (see
   .icon-rail-card__btn / initMediaCarousels()'s canScroll check in
   js/script.js, which toggles this class) reverts to left-aligned so
   scrolling starts from the first item, like any normal carousel -
   `justify-content: center` above is only meant for the common case of
   a station with too few facilities to fill the row, which otherwise
   hugs the left edge with an ugly gap on the right instead of sitting
   centered in the card. */
.icon-rail.is-scrollable {
  justify-content: flex-start;
}

.icon-rail::-webkit-scrollbar { display: none; }

.icon-rail__item {
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .5rem;
  width: 68px;
  text-align: center;
}

.icon-rail__circle {
  width: 48px;
  height: 48px;
  border-radius: 50%;
  background: var(--color-bg-tint);
  color: var(--color-primary);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: transform var(--transition-fast), background var(--transition-fast), box-shadow var(--transition-fast);
}

.icon-rail__item span {
  font-size: .75rem;
  color: var(--color-muted);
  font-weight: 500;
  transition: color var(--transition-fast);
}

.icon-rail__item:hover .icon-rail__circle,
.icon-rail__item:focus-within .icon-rail__circle {
  transform: translateY(-4px) scale(1.08);
  background: var(--color-primary);
  color: #fff;
  box-shadow: 0 8px 16px rgba(0, 100, 168, .28);
}

/* Facility icons come in two flavours: the built-in vector set
   (facility_icon_svg() in inc/functions.php, inlined as <svg
   fill/stroke="currentColor">) which happily turns white against the
   solid-blue hover background above, and an admin-uploaded custom icon
   (Facilities screen "Icon" field), rendered as a plain <img> whose
   colours are baked into the file and can't respond to `color: #fff`.
   Left alone, that <img> would just keep rendering in its own baked-in
   color against the new dark circle - inconsistent with every other
   icon's white-on-blue hover state (and illegible if the icon happens
   to be drawn in the same blue as --color-primary, blending into its
   own background). `filter: brightness(0) invert(1)` forces the <img>
   to render as flat white on hover regardless of its original colors,
   so every facility icon - built-in or admin-uploaded - gets the same
   hover treatment. */
.icon-rail__item:hover .icon-rail__circle:has(img) img,
.icon-rail__item:focus-within .icon-rail__circle:has(img) img {
  filter: brightness(0) invert(1);
}

.icon-rail__item:hover span,
.icon-rail__item:focus-within span {
  color: var(--color-primary);
  font-weight: 700;
}
.icon-rail__circle .icon-facility svg {
	display: block;
	width: 28px;
	height: 28px;
}
/* ---------- 15. Station detail cards ---------- */
.station-detail {
  display: grid;
  gap: 2rem;
  margin-top: 2rem;
  align-items: start;
}

.station-detail__text h2 {
  font-size: 1.9rem;
  font-weight: 800;
  margin-bottom: .9rem;
}

.station-detail__text h2 .accent { color: var(--color-accent); }

.station-detail__text p {
  color: var(--color-muted);
  font-size: .92rem;
}

.station-detail__media {
  position: relative;
  border-radius: var(--radius-md);
  overflow: hidden;
  box-shadow: var(--shadow-sm);
}

.station-detail__media img { width: 100%; aspect-ratio: 4/3; object-fit: cover; }

.media-nav-btn {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: #fff;
  box-shadow: var(--shadow-sm);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--color-text-soft);
}

.media-nav-btn--prev { left: 12px; }
.media-nav-btn--next { right: 12px; }

.info-cards-row {
  display: grid;
  gap: 1.5rem;
  margin-top: 1.5rem;
}

.info-card {
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
  padding: 1.25rem;
}

.info-card h3 {
  font-size: 1.05rem;
  font-weight: 700;
  margin-bottom: .9rem;
}

.exit-guide__media {
  position: relative;
  border-radius: var(--radius-sm);
  overflow: hidden;
  margin-bottom: .75rem;
}

.exit-guide__media img { width: 100%; aspect-ratio: 16/9; object-fit: cover; }

.exit-guide__badge {
  position: absolute;
  bottom: .5rem;
  left: .5rem;
  background: var(--color-accent);
  color: #fff;
  font-size: .7rem;
  font-weight: 700;
  padding: .2rem .6rem;
  border-radius: 5px;
}

.exit-guide h4 { font-size: .95rem; font-weight: 700; margin-bottom: .4rem; }

.exit-guide ul { font-size: .85rem; color: var(--color-muted); display: grid; gap: .3rem; }
.exit-guide ul li { padding-left: 1rem; position: relative; }
.exit-guide ul li::before {
  content: "";
  position: absolute;
  left: 0;
  top: .5em;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--color-muted);
}

.map-card img { width: 100%; aspect-ratio: 16/11; object-fit: cover; border-radius: var(--radius-sm); margin-bottom: .6rem; }
.map-card a { color: var(--color-primary); font-weight: 600; font-size: .85rem; }

.info-card--promo { padding: 0; overflow: hidden; }
.info-card--promo img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* ---------- 16. Category tiles ---------- */
.category-tiles {
  display: grid;
  gap: 1.25rem;
  margin-top: 2rem;
}

.category-tile {
  position: relative;
  border-radius: var(--radius-md);
  aspect-ratio: 4/3;
  box-shadow: var(--shadow-sm);
}

.category-tile img { width: 100%; height: 100%; object-fit: cover; }

.category-tile::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgba(0,0,0,.72) 0%, rgba(0,0,0,.15) 55%, transparent 100%);
	border-radius: 20px;
}

.category-tile__label {
  position: absolute;
  left: 1rem;
  bottom: 1.2rem;
  z-index: 1;
  color: #fff;
}

.category-tile__label strong {
  display: block;
  font-size: 1.15rem;
  font-weight: 700;
}

.category-tile__label span {
  font-size: .8rem;
  opacity: .9;
}

.category-tile__arrow {
  position: absolute;
  left: 50%;
  bottom: 0;
  transform: translate(-50%, 50%);
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: var(--color-primary);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  z-index: 2;
  box-shadow: var(--shadow-sm);
}

/* ---------- 17. POI cards ---------- */
.poi-grid {
  display: grid;
  gap: 1.25rem;
  margin-top: 1.5rem;
}

.poi-card {
  background: #fff;
  border-radius: var(--radius-md);
  overflow: hidden;
  border: 1px solid var(--color-border);
  box-shadow: var(--shadow-sm);
  transition: transform var(--transition-fast), box-shadow var(--transition-fast);
}

.poi-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-md); }

.poi-card__img { position: relative; aspect-ratio: 4/3; }
/* No overflow:hidden here - .poi-card (the outer card) already clips
   at its own edge, and clipping this inner box too would also cut off
   .poi-card__transit, which intentionally overlaps down into the card
   body below. */
.poi-card__img img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform var(--transition-med); }
.poi-card:hover .poi-card__img img { transform: scale(1.06); }

.poi-card__tag {
	position: absolute;
	top: 1.5rem;
	left: 1.5rem;
	background: var(--color-accent);
	color: #fff;
	font-size: 1rem;
	padding: 0.2rem 0.7rem;
	border-radius: 5px;
}

.poi-card__transit {
	position: absolute;
	bottom: -21px;
	right: .7rem;
	width: 48px;
	height: 48px;
	border-radius: 50%;
	background: #fff;
	box-shadow: var(--shadow-sm);
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 9px;
	border: 1px #D5E4EF solid;
}

.poi-card__transit img { width: 100%; height: 100%; object-fit: contain; }

.poi-card__body { padding: 1rem .9rem .9rem; }
.listing-layout .poi-card__body {
	padding-right: 60px;
}

.poi-card__body h3 {
	font-size: 1.3rem;
	font-weight: 700;
	color: var(--color-text);
	margin-bottom: .3rem;
	line-height: 24px;
}

.poi-card__body p {
	font-size: 1rem;
	color: var(--color-muted);
	line-height: 16px;
	margin:10px 0 14px;
}

.poi-card__loc {
  font-size: .78rem;
  color: #C08A2E;
  font-weight: 600;
  display: flex;
  align-items: center;
  gap: .3rem;
  margin-top: .3rem;
}

.poi-card__loc svg { flex-shrink: 0; color: #C08A2E; }

/* Simple variant: no tag/transit badge, used for "Featured Restaurants" grids */
.poi-card--simple .poi-card__body p { color: var(--color-muted); }

/* "Get Free!" ribbon badge (Things to Do) */
.poi-card__ribbon {
  position: absolute;
  top: .7rem;
  left: -2rem;
  background: #FF7A00;
  color: #fff;
  font-size: .65rem;
  font-weight: 700;
  padding: .25rem 2.2rem;
  transform: rotate(-45deg);
  z-index: 1;
}

/* Category browse tiles (photo + count) - e.g. "Explore Near BTS" on each Transit System page */
.category-tile-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 1.25rem;
  margin-top: 1.5rem;
}

.category-tile-grid--wide { grid-template-columns: 1fr; margin-top: 2rem; }

@media (min-width: 1024px) {
  .category-tile-grid { grid-template-columns: repeat(4, 1fr); }
  .category-tile-grid.category-tile-grid--wide { grid-template-columns: repeat(2, 1fr); }
}

.category-tile {
  position: relative;
  display: block;
  aspect-ratio: 8/9;
  border-radius:20px;
  background: var(--color-text-soft);
  box-shadow: var(--shadow-sm);
  transition: transform var(--transition-fast), box-shadow var(--transition-fast);
}

.category-tile--wide { aspect-ratio: 21/9; }

.category-tile:hover { transform: translateY(-5px); box-shadow: var(--shadow-md); }

/* Inner zoom: .category-tile__frame is a fixed, non-transformed box
   that clips via overflow:hidden (not .category-tile itself, which
   would also clip the category-tile__btn arrow badge that
   intentionally hangs below the tile edge). Only the <img> inside
   scales on hover, so the frame's rounded corners stay put instead of
   growing along with the zoomed photo. */
.category-tile__frame {
  position: absolute;
  inset: 0;
  display: block;
  overflow: hidden;
  border-radius: var(--radius-md);
}

.category-tile img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform var(--transition-med);
}

.category-tile:hover img { transform: scale(1.1); }

.category-tile__overlay {
  position: absolute;
  inset: auto 0 0 0;
  padding:2.5rem 1rem 2.7rem;
  background: linear-gradient(to top, rgba(0, 0, 0, .82) 0%, rgba(0, 0, 0, .35) 60%, transparent 100%);
  display: flex;
  flex-direction: column;
  gap: .2rem;
  text-align: center;
  border-radius: 0 0 var(--radius-md) var(--radius-md);
	z-index: 111111;
}
.category-tile__btn svg {
	width: 18px;
	height: 18px;
}
.category-tile__title {
  color: #fff;
  font-weight: 700;
  font-size:28px;
}

.category-tile__count {
  color: rgba(255, 255, 255, .85);
  font-size:18px;
}

.category-tile__btn {
	position: absolute;
	left: 50%;
	bottom: -16px;
	transform: translateX(-50%);
	width: 42px;
	height: 42px;
	border-radius: 50%;
	background: var(--color-primary);
	display: flex;
	align-items: center;
	justify-content: center;
	z-index: 9999999999999;
}

/* ---------- 18. Sidebar station filter ---------- */
.listing-layout {
	display: grid;
	gap: 2rem;
	margin-top: 4.5rem;
	/* js/site.js's initListingFilters() scrolls back to this section
	   (scrollIntoView) after an AJAX station/system/category filter, so
	   a visitor picking a station far down the sidebar list isn't left
	   looking at blank space below the (possibly short) new results.
	   Without this, that scroll would tuck the section's top edge
	   directly under the sticky .site-header (72px, see its
	   .site-header__inner min-height) instead of just below it. */
	scroll-margin-top: 90px;
	/* Sidebar height is capped to ~4 rows of the listing grid, not the
	   whole results column (which also has pagination/promo banners
	   below the cards) - measured live off the rendered grid by
	   syncSidebarHeight() in js/site.js and applied as an inline
	   max-height, so this stays at the default start (sidebar sized to
	   its own natural/JS-set height, not stretched to the row). */
	align-items: start;
	margin-bottom: 5.5rem;
}

/* stations.php's results section has no sidebar (unlike .listing-layout
   above), so it needs its own bottom spacing before the footer - same
   margin as .listing-layout for a consistent gap sitewide. */
.stations-results {
	margin-bottom: 5.5rem;
}

.station-filter {
	background: #fff;
	border: 1px solid #B5DCFF;
	border-radius: 25px;
	box-shadow: var(--shadow-sm);
	padding: 0;
	/* js/site.js's syncSidebarHeight() sets max-height inline to match
	   ~4 rows of the listing grid beside it - flex column + the
	   station-filter__list flex-grow below lets the scrollable station
	   list itself fill that height (title/tabs stay their own natural
	   size, the list takes whatever's left and scrolls internally if
	   the station list is still longer than that). */
	display: flex;
	flex-direction: column;
	overflow: hidden;
}

.station-filter h3 {
	font-size: 1.6rem;
	font-weight: 700;
	color: var(--color-text);
	/* No margin-bottom here on purpose - this <h3> lives inside
	   .station-filter__summary (the toggle button), and a margin here
	   would get trapped inside the button's own box (buttons don't
	   collapse a child's trailing margin through), inflating the
	   button taller than its visible blue bar. On mobile that showed up
	   as a blank white sliver below the bar even while collapsed, and
	   as the chevron (centered on the button's full, inflated height)
	   sitting visibly lower than the bar's actual center. The equivalent
	   gap below the bar is added instead on .station-filter__current /
	   .station-filter__summary + .station-filter__search-wrap below,
	   which are real siblings of the button and only take up space when
	   they're actually visible. This has to stay an explicit 0 (not just
	   omitted) - there's an unrelated, different .station-filter__title
	   rule elsewhere in this file (a generic sidebar-widget heading style)
	   that also sets margin-bottom, and without an explicit override here
	   its 1rem leaks in since .station-filter h3 no longer contests that
	   property on its own. */
	margin-bottom: 0;
	text-align: center;
	background: #E6F3FF;
	border-bottom: 1px solid #B5DCFF;
	border-top-left-radius: 25px;
	border-top-right-radius: 25px;
	padding: 13px 0;
	position: relative;
}

/* The "Search Near Station" bar is a real <button> (see
   render_directory_page(), inc/functions.php) that toggles a collapse on
   mobile only (js/site.js's initStationFilterCollapse(), responsive.css) -
   deliberately a plain button + .is-open class on .station-filter itself,
   NOT a <details> wrapper: .station-filter__list depends on being a
   direct flex item of .station-filter's flex column (flex:1 1 auto below)
   so js/site.js's syncSidebarHeight() can cap it to ~4 result rows and let
   it scroll internally - wrapping the search/tabs/list in any extra real
   layout element in between broke that sizing chain in testing (even
   display:contents, which has known flex-item-promotion bugs in some
   engines). Every child here stays a direct, unwrapped flex item of
   .station-filter, exactly as before this feature existed. On desktop
   this button/class has no visual effect at all - the collapse only
   exists inside the mobile media query in responsive.css. */
.station-filter__summary {
	display: block;
	width: 100%;
	background: none;
	border: 0;
	margin: 0;
	padding: 0;
	font: inherit;
	text-align: inherit;
	cursor: default;
	/* .station-filter__current/.station-filter__chevron (siblings of the
	   <h3>, not descendants - all 3 are direct children of this button)
	   are position:absolute with no containing block of their own
	   otherwise - without this they position against the viewport
	   instead of this bar, landing wherever the bar happened to scroll
	   to instead of pinned to its right edge. */
	position: relative;
}

/* Collapse-only affordance - shown only below the mobile breakpoint
   (responsive.css), where the button is actually clickable/functional. */
.station-filter__chevron {
	display: none;
	position: absolute;
	top: 50%;
	right: 20px;
	transform: translateY(-50%);
	color: var(--color-primary);
	transition: transform .2s ease;
}

/* Current-selection readout - lives in the collapsible body itself (a
   direct child of .station-filter, right after the toggle button), not
   overlaid on the header bar above - so it only shows once the panel is
   actually open, next to the controls that change it, rather than
   floating over "Search Near Station" like a second, competing control.
   Collapse-only like the chevron above (responsive.css shows it, and
   only while .station-filter.is-open). */
.station-filter__current {
	display: none;
	margin: 0;
	margin-top: 1.3rem;
	padding: 0 20px 10px;
	font-size: .8rem;
	color: var(--color-muted);
}

.station-filter__current span {
	font-weight: 700;
	color: var(--color-primary);
}

.station-filter.is-open .station-filter__chevron {
	transform: translateY(-50%) rotate(180deg);
}

.station-filter__search-wrap {
	position: relative;
	padding: 0 20px;
	/* Bottom spacing as margin, not padding - padding here would be
	   inside this element's own box, which is what .station-filter__search-icon's
	   top:50% centers against, so it'd center against box-height-plus-
	   padding instead of just the input, throwing the icon off-center. */
	margin-bottom: 12px;
}

/* Gap below the header bar, only when this is the first thing after it
   (desktop, and the collapsed-on-mobile header itself) - moved off the
   <h3> above for the trapped-margin reason explained there. When
   .station-filter__current is visible instead (mobile, expanded) it
   already carries this same top gap plus its own padding-bottom before
   this element, so this rule intentionally does NOT match then. */
.station-filter__summary + .station-filter__search-wrap {
	margin-top: 1.3rem;
}

.station-filter__search-icon {
	position: absolute;
	left: 32px;
	top: 50%;
	transform: translateY(-50%);
	color: var(--color-muted);
	font-size: .8rem;
	pointer-events: none;
}

.station-filter__search {
	width: 100%;
	padding: .55rem .8rem .55rem 2.1rem;
	border: 1px solid #B5DCFF;
	border-radius: 999px;
	font-size: .9rem;
	font-family: inherit;
	color: var(--color-text);
	background: #fff;
}

.station-filter__search:focus {
	outline: none;
	border-color: var(--color-primary);
}

.station-filter__no-match {
	padding: .5rem 10px 0;
	font-size: .85rem;
	color: var(--color-muted);
	text-align: center;
}

.station-filter__tabs {
	display: flex;
	gap: 1.25rem;
	border-bottom: 0;
	margin-bottom: 1rem;
	font-size: .85rem;
	font-weight: 600;
	color: var(--color-muted);
	justify-content: space-between;
	padding: 0px 20px;
}

.station-filter__tabs a, .station-filter__tabs button {
	padding: 0 0 1px !important;
	display: inline-block;
	font-weight: 600;
	color: var(--color-text);
	font-size: 18px;
}

.station-filter__tabs a.is-active, .station-filter__tabs button.is-active {
	color: var(--color-primary);
	border-bottom: 3px solid var(--color-primary);
}

.station-filter__all {
	display: block;
	background: linear-gradient(90deg, #0064A8, #8DC63F);
	color: #fff;
	font-weight: 700;
	font-size: .85rem;
	padding: .6rem .8rem;
	border-radius: var(--radius-sm);
	margin-bottom: .5rem;
	padding: 0.7rem 23px !important;
	position: relative;
}

.station-filter__all::before {
	content: "";
	position: absolute;
	width: 4px;
	height: 18px;
	background: #7C0;
	left: -2px;
	top: 14px;
	border-radius: 40px;
}
.station-filter__all::after {
	content: "";
	position: absolute;
	width: 4px;
	height: 18px;
	background: #0064A8;
	right: -1px;
	top: 14px;
	border-radius: 40px;
}

.station-filter__list {
	display: grid;
	gap: .1rem;
	padding: 0px 20px;
	/* Grows to fill whatever height .station-filter's flex column has
	   left, up to the max-height js/site.js's syncSidebarHeight() sets
	   on .station-filter itself (matching ~4 rows of the listing grid
	   beside it). min-height:0 overrides flexbox's default
	   min-height:auto, which would otherwise let this item's own content
	   size force it (and the whole sidebar) taller than that cap instead
	   of scrolling internally - overflow-y:auto still kicks in for
	   station lists too long even for that height (e.g. "All" with every
	   BTS+MRT+ARL station). align-content: start keeps the rows
	   themselves packed at the top rather than spread out with gaps.
	   grid-auto-rows: min-content is required here - Grid's default
	   auto row tracks get their "automatic minimum size" clamped to 0
	   whenever the grid container has a definite height AND isn't
	   overflow:visible (both true here), so every row was being
	   squashed to fit the capped height instead of keeping natural size
	   and letting the list scroll - min-content opts each row back into
	   sizing off its real content regardless of the container's height. */
	flex: 1 1 auto;
	min-height: 0;
	grid-auto-rows: min-content;
	overflow-y: auto;
	align-content: start;
	/* Themed scrollbar (Firefox) - thin, primary-blue thumb on a soft-tint
	   track so it reads as part of the design instead of a bare OS default. */
	scrollbar-width: thin;
	scrollbar-color: var(--color-primary) var(--color-bg-tint);
}

/* Themed scrollbar (WebKit/Chromium/Safari/Edge) - same blue-on-tint look,
   with a rounded thumb and a subtle hover state for the primary color. */
.station-filter__list::-webkit-scrollbar {
	width: 8px;
}

.station-filter__list::-webkit-scrollbar-track {
	background: var(--color-bg-tint);
	border-radius: 40px;
}

.station-filter__list::-webkit-scrollbar-thumb {
	background: var(--color-primary);
	border-radius: 40px;
}

.station-filter__list::-webkit-scrollbar-thumb:hover {
	background: var(--color-primary-dark);
}

.station-filter__list a {
  display: block;
  padding:0.5rem 10px;
  border-radius: 6px;
  font-size: 18px;
  /* Long station names ("Bhumibol Adulyadej Hospital", "11th Infantry
     Regiment"...) used to wrap to 2 lines here and break the list's
     one-row rhythm - truncated with an ellipsis instead, full name
     still available via the link's title attribute (hover/long-press). */
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.station-filter__list a:hover {background: var(--color-bg-tint); color: var(--color-primary);}

/* js/site.js's initStationFilterSearch() toggles this for a non-matching
   station while the search box has text in it. !important because the
   BTS/MRT/ARL system-tab filter (initListingFilters()) independently
   toggles the same links' inline style.display - this must keep winning
   regardless of which one last touched a given link. */
.station-filter__list a.is-search-hidden { display: none !important; }

/* "All Stations" became a real link (was a plain non-clickable div) so
   it could clear the ?station filter, but it must keep looking exactly
   like it did before: its own smaller font size, gradient pill always
   on, no hover state - these override the generic .station-filter__list
   a / a:hover rules above via higher selector specificity. */
.station-filter__list a.station-filter__all {
  font-size: .85rem;
  /* Hidden per request. Needs this more specific selector (not the
     plain .station-filter__all rule above) to actually win - the
     generic .station-filter__list a { display: block } rule further up
     this file out-specifies a single-class selector regardless of
     source order, which is why a plain display:none up there had no
     effect. The "All" tab in the BTS/MRT/ARL system-tab row above
     already resets the station filter the same way (see js/site.js's
     initListingFilters(), which still targets .station-filter__all for
     that reset logic) - only the visual pill is hidden here, the
     element/behavior stays intact for that code path and for any old
     bookmarked link pointing straight at it. */
  display: none;
}

.station-filter__list a.station-filter__all:hover {
  background: linear-gradient(90deg, #0064A8, #8DC63F);
  color: #fff;
}

/* Now holds just the Browse + Category dropdowns side by side - the
   "X records found" heading used to live in here too (see
   .listing-results__count below) but was moved to sit on its own full
   line underneath instead, so this row no longer needs to make room
   for a long heading beside a fixed-width dropdown. */
.listing-results__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: .75rem;
  margin-bottom: .75rem;
  /* Scroll-reveal (.reveal/.is-visible) gives this element a transform
     and will-change, which makes it a stacking context - but it stays
     position:static, so z-index has NO effect on a static element even
     though it forms its own context. That let plain-static .poi-grid
     images win the paint order and cover the open category dropdown
     inside here regardless of the dropdown's own z-index. Making this
     element positioned lets z-index actually apply. */
  position: relative;
  z-index: 30;
}

/* Module switcher (Directory / Places to Visit / Things to Do) - now the
   same .category-dropdown component as the Category dropdown beside it
   (see .category-dropdown--browse further down), not a styled-to-match
   plain <select> - native <option> list styling was never fully
   reproducible, so the two never quite matched. */

.listing-results__count {
	font-size: 2.2rem;
	font-weight: 700;
	margin-bottom: 1.25rem;
}

.listing-results__count strong { color: var(--color-accent); }

.category-dropdown {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: .6rem;
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  padding: .6rem 1rem;
  font-size: .85rem;
  font-weight: 600;
  box-shadow: var(--shadow-sm);
  /* The open .category-dropdown__menu has z-index:20, but that only
     wins stacking fights *inside* this box. Later siblings elsewhere on
     the page (.poi-card, which gets will-change: transform from
     .reveal - see style.css §30) create their own stacking contexts
     and would otherwise paint over the whole dropdown regardless of
     the menu's own z-index. Elevating the box itself fixes that. */
  z-index: 25;
}

.category-dropdown__label { color: var(--color-muted); font-weight: 500; }

/* Wraps just the trigger button + menu (not the "Category" label), so
   the menu's absolute positioning is relative to the button's own box
   instead of the whole pill - keeps the open menu the same width as
   the "All Categories" button, not the full Category+value pill. */
/* Custom category dropdown menu - replaces the native <select> option
   list (browsers don't let CSS restyle that popup at all), so this is
   a real listbox instead, fully brand-styled and consistent across
   browsers. js/site.js toggles [hidden] and aria-expanded. */
.category-dropdown__menu {
  position: absolute;
  top: calc(100% + 8px);
  /* The trigger's own left padding (--cat-dd-offset) is what makes room
     for the absolutely-positioned "Category" label/blue box drawn over
     it, so the menu needs the same offset to start right under the
     "All Categories" box instead of under the blue label too. */
  left: var(--cat-dd-offset, 140px);
  right: 0;
  z-index: 20;
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-md);
  padding: .4rem;
  max-height: 280px;
  overflow-y: auto;
  animation: category-menu-in .18s var(--ease-smooth) both;
}

@keyframes category-menu-in {
  from { opacity: 0; transform: translateY(-6px); }
  to   { opacity: 1; transform: translateY(0); }
}

.category-dropdown__menu[hidden] { display: none; }

.category-dropdown__menu [role="option"] {
  padding: .6rem .8rem;
  border-radius: var(--radius-sm);
  font-size: .95rem;
  font-weight: 500;
  color: var(--color-text-soft);
  cursor: pointer;
  transition: background var(--transition-fast), color var(--transition-fast);
}

.category-dropdown__menu [role="option"]:hover,
.category-dropdown__menu [role="option"].is-focused {
  background: var(--color-bg-tint);
  color: var(--color-primary);
}

.category-dropdown__menu [role="option"].is-selected {
  background: var(--color-primary);
  color: #fff;
  font-weight: 700;
}

/* ---------- 19. Category pill filter (Blog) ---------- */
.pill-filter {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: .6rem;
  margin-top: 1.75rem;
}

.pill {
  padding: .6rem 1.3rem;
  border-radius: 999px;
  border: 1px solid var(--color-border);
  background: #fff;
  font-size: .85rem;
  font-weight: 600;
  color: var(--color-text-soft);
}

.pill.is-active { background: var(--color-primary); color: #fff; border-color: var(--color-primary); }

.search-blog {
  max-width: 720px;
  margin: 1.75rem auto 0;
  display: flex;
  gap: .6rem;
  background: #fff;
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow-md);
  padding: .5rem;
}

.search-blog input {
  flex: 1;
  border: none;
  outline: none;
  padding: .7rem .8rem;
  font-size: .9rem;
}

/* ---------- 20. Legal page template ---------- */
.legal-layout {
  display: grid;
  gap: 2rem;
  margin-top: 0;
  align-items: start;
  padding: 20px 0 90px;
}

.legal-nav {
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
  padding: .6rem;
  display: grid;
  gap: .2rem;
}

.legal-nav a {
  display: flex;
  align-items: center;
  gap: .7rem;
  padding: .8rem .9rem;
  border-radius: var(--radius-sm);
  font-size: .9rem;
  font-weight: 600;
  color: var(--color-text-soft);
}

.legal-nav a.is-active { background: var(--color-primary); color: #fff; }
.legal-nav a:not(.is-active):hover { background: var(--color-bg-tint); }

.legal-nav__icon { width: 16px; height: 16px; flex-shrink: 0; }
.legal-nav a.is-active .legal-nav__icon { filter: brightness(0) invert(1); }

.legal-content {
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
  padding: 2rem;
}

.legal-content > h1 {
	font-size: 2.24rem;
	font-weight: 700;
	padding-bottom: 0;
	margin-bottom: 1.25rem;
}

.legal-content__updated {
	color: #9CA3AF;
	font-size: 14px;
	display: block;
	margin-bottom: .5rem;
}

.legal-content > p:first-of-type {
	font-size: 15px;
	color: var(--color-text);
	margin-bottom: 1.5rem;
}

.legal-section { margin-top: 1.75rem; }

.legal-section h2 {
  font-size: 1.05rem;
  font-weight: 700;
  color: var(--color-primary);
  border-left: 3px solid var(--color-accent);
  padding-left: .7rem;
  margin-bottom: .7rem;
}

.legal-section p {
  font-size: .9rem;
  color: var(--color-text);
  margin-bottom: .6rem;
}

.legal-section ul {
  display: grid;
  gap: .35rem;
  margin: .5rem 0 .75rem;
}

.legal-section li {
  font-size: .9rem;
  color: var(--color-text);
  padding-left: 1.1rem;
  position: relative;
}

.legal-section li::before {
  content: "";
  position: absolute;
  left: 0;
  top: .55em;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--color-primary);
}

.legal-section h3 { font-size: .92rem; font-weight: 700; margin: .9rem 0 .3rem; }

/* Same styling applied to raw CMS rich-text (admin Pages content isn't
   wrapped in .legal-section divs): blue headings with the green bar,
   dotted lists, muted paragraphs — per the legal-page Figma design. */

.legal-content h2 {
	font-size: 18px;
	font-weight: 700;
	color: var(--color-primary);
	border-left: 4px solid var(--color-accent);
	padding-left: 0.7rem;
	margin: 1.75rem 0 .7rem;
	line-height: 1.2;
}

.legal-content p { font-size: .9rem; color: var(--color-text); margin-bottom: .6rem; }

.legal-content ul {
  display: grid;
  gap: .35rem;
  margin:0.6rem 0 1.75rem;
  list-style: none;
  padding: 0;
}

.legal-content li {
  font-size: .9rem;
  color: var(--color-text);
  padding-left: 1.1rem;
  position: relative;
}

.legal-content li::before {
  content: "";
  position: absolute;
  left: 0;
  top: .55em;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--color-primary);
}

.legal-content h3,
.legal-content h4 { font-size: .92rem; font-weight: 700; margin: .9rem 0 .3rem; color: var(--color-text-soft); }

/* ---------- 20b. 404 page ---------- */

.error-page { padding: 5rem 0; }

.error-page__inner {
  max-width: 560px;
  margin: 0 auto;
  text-align: center;
}

.error-page__code {
  font-size: clamp(4rem, 12vw, 7rem);
  font-weight: 800;
  line-height: 1;
  margin: 0 0 .5rem;
  color: var(--color-primary);
  opacity: .15;
}

.error-page__title {
  font-size: clamp(1.5rem, 3.6vw, 2rem);
  font-weight: 700;
  color: var(--color-text-soft, var(--color-text));
  margin: 0 0 .75rem;
}

.error-page__content { color: var(--color-text); margin-bottom: 1rem; }
.error-page__content p { font-size: .95rem; line-height: 1.6; }

.error-page__links {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 1.5rem 2.25rem;
  margin: 1.5rem 0 2.25rem;
  padding: 0;
  list-style: none;
}

.error-page__link {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: .5rem;
  font-size: .9rem;
  font-weight: 600;
  color: var(--color-text-soft, var(--color-text));
  text-decoration: none;
}

.error-page__link:hover { color: var(--color-primary); }

/* The footer's icon SVGs are hardcoded fill="white" (designed to sit on
   the footer's dark blue background) - reusing them here on a light
   background needs an explicit dark circle behind each one. */
.error-page__link-icon {
  width: 48px;
  height: 48px;
  padding: 11px;
  box-sizing: border-box;
  border-radius: 50%;
  background: var(--color-primary);
  transition: transform var(--transition-fast), background var(--transition-fast);
}

.error-page__link:hover .error-page__link-icon {
  transform: translateY(-4px);
  background: var(--color-primary-dark);
}

.error-page__actions {
  display: flex;
  flex-wrap: wrap;
  gap: .75rem;
  justify-content: center;
}

/* ---------- 20c. Search results (row layout) ---------- */
.search-page-results {
  padding-top: 1.5rem;
  padding-bottom: 4.5rem; /* breathing room before the footer - this section can end right after a short row list */
}

/* Not reusing .header-search here: that class is position:absolute,
   right:20px (scoped for the fixed-height site nav bar), which made
   this page's own search box float disconnected in the hero instead
   of sitting inline with the results text. */
.search-inline-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 1rem;
}

.search-inline-bar__text {
  margin: 0;
  color: var(--color-text);
}

.search-inline-form {
  display: flex;
  align-items: center;
  gap: .55rem;
  flex-shrink: 0;
  width: 100%;
  max-width: 320px;
  background: var(--color-white);
  border: 1px solid #C8C8C8;
  border-radius: 15px;
  padding: .6rem 1.1rem;
}

.search-inline-form i { color: var(--color-primary); }

.search-inline-form input {
  flex: 1;
  min-width: 0;
  border: none;
  outline: none;
  background: none;
  font-family: var(--font-base);
  font-size: .92rem;
  color: var(--color-text);
}

/* Each module (Directory/Places to Visit/Things to Do/Blog) is a native
   <details> accordion - open by default, collapsible by the user,
   same disclosure mechanism as the FAQ accordion (§22) above but with
   a bold gradient heading instead of a plain white one. */
.search-accordion {
  margin-top: 2rem;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  overflow: hidden;
  box-shadow: var(--shadow-sm);
}

.search-accordion__summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  flex-wrap: wrap;
  padding: 1rem 1.5rem;
  background: linear-gradient(90deg, var(--color-primary), var(--color-accent-dark));
  color: var(--color-white);
  cursor: pointer;
  list-style: none;
}

.search-accordion__summary::-webkit-details-marker { display: none; }

.search-accordion__summary-left {
  display: flex;
  align-items: center;
  gap: .75rem;
}

.search-accordion__summary h2 {
  margin: 0;
  font-size: 1.1rem;
  color: var(--color-white);
}

.search-accordion__icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  flex-shrink: 0;
  background: rgba(255, 255, 255, .22);
  border-radius: 50%;
}

.search-accordion__icon img { width: 18px; height: 18px; filter: brightness(0) invert(1); }

.search-accordion__count {
  flex-shrink: 0;
  background: rgba(255, 255, 255, .25);
  color: var(--color-white);
  font-size: .78rem;
  font-weight: 700;
  padding: .2rem .6rem;
  border-radius: 999px;
}

.search-accordion__summary-right {
  display: flex;
  align-items: center;
  gap: 1rem;
  flex-shrink: 0;
}

.search-accordion__viewall {
  flex-shrink: 0;
  font-size: .82rem;
  font-weight: 700;
  color: var(--color-primary);
  background: var(--color-white);
  padding: .4rem .9rem;
  border-radius: 999px;
  transition: transform var(--transition-fast), box-shadow var(--transition-fast);
}

.search-accordion__viewall:hover {
  transform: translateY(-1px);
  box-shadow: 0 4px 10px rgba(0, 0, 0, .18);
}

.search-accordion__chev {
  width: 10px;
  height: 10px;
  border-right: 2px solid var(--color-white);
  border-bottom: 2px solid var(--color-white);
  transform: rotate(45deg);
  transition: transform var(--transition-fast);
  flex-shrink: 0;
}

.search-accordion[open] .search-accordion__chev { transform: rotate(-135deg); }

.search-accordion__body {
  padding: 1.25rem 1.5rem 1.5rem;
  background: var(--color-white);
}

.search-results-list {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: .65rem 1rem;
}

.search-result-row {
  display: flex;
  align-items: center;
  gap: 1rem;
  min-width: 0; /* grid items default to a min-content min-width, which lets a long nowrap excerpt blow the column way past 1fr - this lets it shrink and truncate instead */
  padding: .8rem 1rem;
  background: var(--color-white);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  text-decoration: none;
  color: inherit;
  transition: box-shadow var(--transition-fast), border-color var(--transition-fast), transform var(--transition-fast);
}

.search-result-row:hover {
  box-shadow: var(--shadow-sm);
  border-color: var(--color-primary);
  transform: translateX(3px);
}

.search-result-row__img {
  flex-shrink: 0;
  width: 68px;
  height: 68px;
  border-radius: var(--radius-sm);
  overflow: hidden;
  background: var(--color-bg-soft);
}

.search-result-row__img img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.search-result-row__body {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: .2rem;
}

.search-result-row__head {
  display: flex;
  align-items: center;
  gap: .6rem;
}

.search-result-row__title {
  flex: 1;
  min-width: 0;
  font-weight: 600;
  color: var(--color-text-soft);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.search-result-row__tag {
  flex-shrink: 0;
  font-size: .72rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .02em;
  color: var(--color-primary);
  background: var(--color-bg-tint);
  padding: .2rem .55rem;
  border-radius: 999px;
}

.search-result-row__meta {
  font-size: .82rem;
  color: var(--color-accent-dark);
}

.search-result-row__excerpt {
  font-size: .85rem;
  color: var(--color-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.search-result-row__chevron {
  flex-shrink: 0;
  color: var(--color-muted);
  transition: transform var(--transition-fast), color var(--transition-fast);
}

.search-result-row:hover .search-result-row__chevron {
  transform: translateX(3px);
  color: var(--color-primary);
}

@media (max-width: 900px) {
  .search-results-list { grid-template-columns: 1fr; }
}

@media (max-width: 640px) {
  .search-result-row__excerpt { display: none; }
  .search-result-row__img { width: 56px; height: 56px; }
}

/* ---------- 21. Forms ---------- */
.form-card {
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
  padding: 2rem;
}

.form-card h2 {
  font-size: 1.4rem;
  font-weight: 700;
  margin-bottom: .5rem;
}

.form-card > p {
	/* color: var(--color-muted); */
	/* font-size: .9rem; */
	margin-bottom: 1.5rem;
	max-width: 370px;
}

.field { margin-bottom: 1.1rem; }

.field label {
  display: block;
  font-size: 16px;
  font-weight: 600;
  margin-bottom: .45rem;
}

.field label .req { color: #E63946; }

.field input,
.field select,
.field textarea {
  width: 100%;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  padding: .75rem .9rem;
  font-size:14px;
  outline: none;
  background: #fff;
  font-family: inherit;
}

.field input:focus,
.field select:focus,
.field textarea:focus { border-color: var(--color-primary); }

.field textarea { resize: vertical; min-height: 110px; }

.field-row {
  display: grid;
  gap: 1.1rem;
}

.checkbox-field {
  display: flex;
  align-items: flex-start;
  gap: .6rem;
  font-size: .85rem;
  color: var(--color-muted);
  margin-bottom: .7rem;
}

.checkbox-field input { width: 16px; height: 16px; margin-top: 2px; flex-shrink: 0; }
.checkbox-field a { color: var(--color-primary); font-weight: 600; }

.form-card .btn { width: 100%; padding: .95rem; font-size: 1rem; margin-top: .5rem; }

/* Contact info card */
.contact-info-card {
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
  padding:2rem 2rem 4.1rem;
}
.contact-info-card .contact-info-card__divider {
	margin-bottom: 31px;
}
.contact-info-card h2 { font-size: 1.4rem; font-weight: 700; margin-bottom: 1.5rem; }

.contact-info-list { display: grid; gap: 1.4rem; }

.contact-info-list li { display: flex; gap: 1rem; align-items: flex-start; }

.contact-info-list .icon-circle {
  width: 42px;
  height: 42px;
  border-radius: 50%;
  background: var(--color-bg-tint);
  color: var(--color-primary);
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}

.contact-info-list strong { display: block; font-size: 16px; margin-bottom: .15rem; }
.contact-info-list span, .contact-info-list p { font-size:18px; }

.contact-info-card__divider { height: 1px; background: var(--color-border); margin: 1.75rem 0 1.25rem; }

.contact-info-card h3 { font-size: .95rem; font-weight: 700; margin-bottom: .8rem; }

/* Contact page: form card + info card side by side (Figma) */
.contact-layout {
  display: grid;
  gap: 1.5rem;
  align-items: start;
  margin-top: 1rem;
}

@media (min-width: 860px) {
  .contact-layout { grid-template-columns:1fr 1fr; gap: 2rem; }
}

/* Info list icons alternate blue / green like the design */
.contact-info-list li:nth-child(even) .icon-circle { background: #EAF9E0; color: var(--color-accent); }

.contact-social { display: flex; gap: .7rem; }

.contact-social a {
  width: 38px;
  height: 38px;
  border-radius: 50%;
  background: var(--color-accent);
  color: #fff;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: .95rem;
  transition: transform var(--transition-fast), filter var(--transition-fast);
}

.contact-social a:hover { transform: translateY(-2px); filter: brightness(1.05); }

/* ---------- 22. FAQ accordion ---------- */
.faq-list { display: grid; gap: .75rem; margin-top: 1.5rem; }

.faq-item {
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  overflow: hidden;
}

.faq-item summary {
  padding: 1rem 1.25rem;
  font-size:15px;
  font-weight: 600;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: space-between;
  list-style: none;
}

.faq-item summary::-webkit-details-marker { display: none; }

.faq-item summary::after {
	content: "";
	width: 10px;
	height: 10px;
	border-right: 2px solid #9CA3AF;
	border-bottom: 2px solid #9CA3AF;
	transform: rotate(45deg);
	transition: transform var(--transition-fast);
	flex-shrink: 0;
	margin-left: 1rem;
}

.faq-item[open] summary::after { transform: rotate(-135deg); }

.faq-item__body { padding: 0 1.25rem 1rem;}

/* ---------- 23. How it works ---------- */
.steps-row {
  display: grid;
  gap: 1.5rem;
  margin-top: 2rem;
  position: relative;
}

.step-card {
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
  padding: 1.75rem 1.25rem;
  text-align: center;
  position: relative;
  transition: transform var(--transition-med), box-shadow var(--transition-med), border-color var(--transition-med);
}

.step-card:hover {
  transform: translateY(-6px);
  box-shadow: var(--shadow-md);
  border-color: var(--color-primary);
}

.step-card__num {
	width: 52px;
	height: 52px;
	border-radius: 50%;
	background: var(--color-primary);
	color: #fff;
	font-weight: 700;
	display: flex;
	align-items: center;
	justify-content: center;
	margin: 0 auto .9rem;
	font-size: 20px;
	box-shadow: 0 5px 10px rgba(0,0,0,.2);
	transition: transform var(--transition-med);
}

.step-card:hover .step-card__num {
	transform: scale(1.12) rotate(-6deg);
}

.step-card:nth-child(2) .step-card__num,
.step-card:nth-child(4) .step-card__num { background: var(--color-accent); }

.step-card h3 { font-size: 18px; font-weight: 700; margin-bottom: .5rem; }
.step-card p { font-size: 16px; color: var(--color-muted); }

/* Connector line between step cards (Figma), alternating green/blue */
@media (min-width: 1024px) {
.steps-row .step-card:not(:last-child)::after {
	content: '';
	position: absolute;
	top: 22%;
	left: 100%;
	width: 1.5rem;
	height: 5px;
	background: #2C8580;
}

  .steps-row .step-card:nth-child(even):not(:last-child)::after { background:#77CC00; }
}

/* Feature icon cards (Free Listing, Local Business Expertise...) */
.feature-cards {
  display: grid;
  gap: 1.5rem;
  margin-top: 2.5rem;
}

.feature-card {
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
  padding: 2rem 1.5rem;
  text-align: center;
  transition: transform var(--transition-med), box-shadow var(--transition-med), border-color var(--transition-med);
}

.feature-card:hover {
  transform: translateY(-6px);
  box-shadow: var(--shadow-md);
  border-color: var(--color-primary);
}

.feature-card__icon {
  width: 56px;
  height: 56px;
  border-radius: 50%;
  background: var(--color-bg-tint);
  color: var(--color-primary);
  display: flex;
  align-items: center;
  justify-content: center;
  transition: transform var(--transition-med);
  margin: 0 auto 1rem;
}

.feature-card:hover .feature-card__icon {
  transform: scale(1.12) rotate(-6deg);
}

.feature-card:nth-child(2) .feature-card__icon { background:rgba(123,203,36,.11); color: var(--color-accent); }
.feature-card:nth-child(4) .feature-card__icon { background:rgba(123,203,36,.11); color: var(--color-accent); }

.feature-card h3 { font-size: 1rem; font-weight: 700; margin-bottom: .5rem; }
.feature-card p { font-size: .85rem; color: var(--color-muted); }

/* ---------- 24. Reviews ---------- */
.reviews-row {
  display: grid;
  gap: 1.1rem;
  margin-top: 1.5rem;
}

.review-card {
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
  padding: 1.1rem;
}

.review-card__head { display: flex; align-items: center; gap: .6rem; margin-bottom: .5rem; }
.review-card__avatar { width: 34px; height: 34px; border-radius: 50%; object-fit: cover; }
.review-card__name { font-size: .85rem; font-weight: 700; display: flex; align-items: center; gap: .3rem; }
.review-card__date { font-size: .72rem; color: var(--color-muted); }
.review-card__stars { color: #FFB800; font-size: .8rem; margin-bottom: .4rem; }

.review-card a { color: var(--color-primary); font-weight: 600; font-size: .82rem; }

/* ---------- 25. Blog detail ---------- */
.article-layout {
  display: grid;
  gap: 2rem;
  margin-top: 2.5rem;
  align-items: start;
}

.article-body > p { margin-bottom: 1.25rem; }

.article-body__hero { width: 100%; border-radius: 20px; overflow: hidden; margin-bottom: 1.5rem; box-shadow: var(--shadow-sm); }
.article-body__hero img { width: 100%; display: block; /*aspect-ratio: 16/9; object-fit: cover;*/ }

.article-body__content-image { width: 100%; border-radius: 20px; overflow: hidden; margin: 1.75rem 0; box-shadow: var(--shadow-sm); }
.article-body__content-image img { width: 100%; display: block; }

.article-section { margin-bottom: 1.75rem; }
.article-section h2 { font-size: 1.2rem; font-weight: 700; margin-bottom: .6rem; }
.article-section > p { font-size: .9rem; color: var(--color-muted); margin-bottom: .6rem; }
.article-section h4 { font-size: .88rem; font-weight: 700; margin-bottom: .4rem; }
.article-section ul { display: grid; gap: .3rem; }
.article-section li { font-size: .88rem; color: var(--color-muted); padding-left: 1.1rem; position: relative; }
.article-section li::before {
  content: "";
  position: absolute;
  left: 0;
  top: .55em;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--color-primary);
}

.toc-card {
  background: #1F1F1F;
  color: #fff;
  border-radius: var(--radius-md);
  padding:32px 40px 35px;
}

.toc-card h3 {
	font-size: 26px;
	font-weight: 600;
	margin-bottom: 1rem;
}
.toc-card ul {
	display: grid;
	gap: .7rem;
	margin-left: 2px;
	border-left: 1px #fff solid;
	padding-left: 21px;
}
.toc-card li {
	color: #fff;
	line-height: 1.2;
	margin-left: 0px;
	margin-bottom: 7px;
}
.toc-card li.is-active {
	color: #fff;
	font-weight: 700;
	border-left: 0;
	padding-left: 0;
	margin-left: 0;
	position: relative;
}
.toc-card li.is-active::before {
	content: "";
	position: absolute;
	width: 3px;
	height: 100%;
	background: #fff;
	left: -23px;
}
.toc-card ul li:last-child {
	margin-bottom: 0;
}
.toc-card a { color: inherit; }
.toc-card a:hover { color: #fff; }

/* Rich-text article content (admin WYSIWYG isn't wrapped in
   .article-section divs): same styling applied directly. */
.article-body h2 { font-size: 1.2rem; font-weight: 700; margin: 1.75rem 0 .6rem; scroll-margin-top: 6.5rem; }
.article-body h3,
.article-body h4 { font-size: .92rem; font-weight: 700; margin: 1rem 0 .4rem; }
/*.article-body p { font-size: .92rem; color: var(--color-muted); margin-bottom: 1rem; }*/

.article-body ul {
  display: grid;
  gap: .3rem;
  margin: .5rem 0 1rem;
  list-style: none;
  padding: 0;
}

.article-body li {
  /*font-size: .88rem;
  color: var(--color-muted);*/
  padding-left: 1.1rem;
  position: relative;
}

.article-body li::before {
  content: "";
  position: absolute;
  left: 0;
  top: .55em;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--color-text-soft);
}

.toc-promo { margin-top: 1.5rem; border-radius: var(--radius-md); overflow: hidden; box-shadow: var(--shadow-sm); }
.toc-promo img { width: 100%; display: block; }

.blog-nav-row {
  display: grid;
  gap: 4rem;
  margin-top: 2.5rem;
}

.blog-nav-card {
	display: flex;
	align-items: center;
	gap: 1rem;
	background: var(--color-bg-tint);
	border-radius: var(--radius-md);
	padding: 0;
	justify-content: space-between;
}
.blog-nav-card--next { flex-direction: row-reverse; text-align: right; }

/* Prev always occupies the left half, Next the right half - even when
   only one of the two exists (first/last post). */
@media (min-width: 640px) {
  .blog-nav-row .blog-nav-card:not(.blog-nav-card--next) { grid-column: 1; }
  .blog-nav-row .blog-nav-card--next { grid-column: 2; }
}

.blog-nav-card img {
	width: 140px;
	height: 165px;
	border-radius: var(--radius-sm);
	object-fit: cover;
	flex-shrink: 0;
}

.blog-nav-card span {
	font-size: 20px;
	display: block;
	margin-bottom: .3rem;
}
.blog-nav-card strong {
	font-size: 32px;
	line-height: 120%;
}

/* ---------- 26. Pagination ---------- */
.pagination {
  display: flex;
  justify-content: center;
  gap: .4rem;
  margin-top: 2.5rem;
  flex-wrap: wrap;
}

.pagination a, .pagination span {
  width: 36px;
  height: 36px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  font-size: .85rem;
  font-weight: 600;
}

.pagination a.is-active { background: var(--color-primary); color: #fff; border-color: var(--color-primary); }
.pagination a:hover:not(.is-active) { background: var(--color-bg-tint); }
.pagination span { border: none; color: var(--color-muted); }

/* ---------- 27. List Your Business hero ---------- */
/* Centered hero with "List Your Business for free" on one line (Figma) */
.lyb-hero .page-hero__title { font-size: clamp(2.2rem, 5vw, 4.25rem); font-weight: 700; }
.lyb-hero .page-hero__title .script-accent { white-space: nowrap; }

/* One-time load-in for the hero title, lead paragraph and CTA button -
   above the fold, so this plays on page load rather than on scroll
   (unlike the stats/feature-card/step-card reveals below it, which use
   the scroll-triggered .reveal system since they sit further down). */
.lyb-hero .page-hero__title,
.lyb-hero .page-hero__lead,
.lyb-hero .btn {
  animation: lyb-hero-in .7s var(--ease-smooth) both;
}
.lyb-hero .page-hero__lead { animation-delay: .12s; }
.lyb-hero .btn { animation-delay: .24s; }

@keyframes lyb-hero-in {
  from { opacity: 0; transform: translateY(18px); }
  to   { opacity: 1; transform: translateY(0); }
}

.lyb-stats {
  display: flex;
  justify-content: center;
  text-align: center;
  gap: clamp(2rem, 6vw, 5rem);
  margin-top: 2rem;
  flex-wrap: wrap;
}

.lyb-stats__item dd {
  font-size: clamp(1.6rem, 3.6vw, 2.3rem);
  font-weight: 800;
  color: var(--color-accent);
}

.lyb-stats__item dt { font-size: .85rem; color: var(--color-muted); font-weight: 500; }

.lyb-hero .btn { margin-top: 1.75rem; }

/* ---------- 28. Business promo banner (generic gradient CTA) ---------- */
.biz-promo {
  border-radius: var(--radius-lg);
  position: relative;
  margin-block: 2rem;
  box-shadow: var(--shadow-sm);
  border: 4px solid transparent;
  background-image: linear-gradient(120deg, #EAF6FB 0%, #E8F9E4 100%), linear-gradient(135deg, #7ECA3D, #1D6CD1);
  background-origin: border-box;
  background-clip: padding-box, border-box;
  padding: 2.5rem 1.75rem;
  display: grid;
  gap: 1.5rem;
}

.biz-promo__text h2 {
  font-size: clamp(1.5rem, 3.6vw, 2.1rem);
  font-weight: 800;
  color: var(--color-text-soft);
  line-height: 1.2;
}

.biz-promo__text h2 .accent { color: var(--color-accent); }

.biz-promo__text p { color: var(--color-muted); margin-top: .6rem; font-size: .92rem; }

.biz-promo__features {
  display: flex;
  gap: 1.75rem;
  margin-top: 1.5rem;
  flex-wrap: wrap;
}

.biz-promo__features li {
  position: relative;
  text-align: center;
  font-size: .8rem;
  font-weight: 600;
  color: var(--color-text-soft);
  padding-right: 1.75rem;
}

.biz-promo__features li:last-child { padding-right: 0; }

.biz-promo__features li:not(:last-child)::after {
  content: '';
  position: absolute;
  top: 2px;
  right: 0;
  bottom: 2px;
  border-right: 1px dashed rgba(31, 31, 31, .25);
}

.biz-promo__features .icon-circle {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: #fff;
  border: 1.5px solid var(--color-accent);
  color: var(--color-accent);
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 0 auto .5rem;
  transition: transform var(--transition-fast), box-shadow var(--transition-fast);
}

.biz-promo__features .icon-circle--green { border-color: var(--color-accent); color: var(--color-accent); }
.biz-promo__features .icon-circle--blue { border-color: #0C7CD9; color: #0C7CD9; }

.biz-promo__features li:hover .icon-circle {
  transform: translateY(-4px) scale(1.08);
  box-shadow: 0 8px 16px rgba(12, 60, 110, .18);
}

.biz-promo .btn { margin-top: 1.5rem; }

.biz-promo__cta {
  background: linear-gradient(90deg, #0C7CD9 0%, #84CE35 100%);
  color: #fff;
  border-radius: 999px;
  padding: .9rem 1.9rem;
  border: none;
}

.biz-promo__cta:hover,
.biz-promo__cta:focus-visible {
  filter: brightness(1.05);
  transform: translateY(-1px);
  box-shadow: var(--shadow-sm);
}

.biz-promo__media {
  position: relative;
  aspect-ratio: 16/10;
}

.biz-promo__media-photo {
  position: absolute;
  inset: 0;
  display: block;
  border-radius: var(--radius-lg);
  overflow: hidden;
}

.biz-promo__media-photo img { width: 100%; height: 100%; object-fit: cover; display: block; }

.biz-promo__badge {
  position: absolute;
  top: 12px;
  left: 12px;
  width: 84px;
  height: 84px;
  border-radius: 50%;
  background-image: linear-gradient(#fff, #fff), linear-gradient(135deg, #A3DEFD, #5D9FA4);
  background-origin: border-box;
  background-clip: padding-box, border-box;
  border: 5px solid transparent;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: var(--shadow-sm);
  z-index: 2;
}

.biz-promo__badge img { width: 62%; height: 62%; object-fit: contain; }

.biz-promo__badge::after {
  content: '';
  position: absolute;
  right: -4px;
  bottom: -2px;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: linear-gradient(135deg, #077FEC, #61D667);
  border: 2px solid #fff;
}

/* ---------- 28b. Transit-system promo variant (bts.png design):
   map-pattern backdrop, circular gradient-ring photo, train badge ---------- */
.biz-promo--map {
  border: 0;
  overflow: hidden;
  /*background:
    radial-gradient(circle at 10% 108%, rgba(132, 206, 53, .22) 0%, rgba(132, 206, 53, 0) 32%),
    radial-gradient(circle at 52% 122%, rgba(132, 206, 53, .18) 0%, rgba(132, 206, 53, 0) 26%),
    linear-gradient(112deg, #FDFEFF 0%, #EFF6FC 45%, #E3EFF9 100*/
	background: url(../images/business-free-bg.png) no-repeat;
	background-size: 100% 100%;
}

/* faint street-map grid watermark */
.biz-promo--map::before {
  content: '';
  position: absolute;
  inset: 0;
    /*linear-gradient(rgba(255, 255, 255, .45) 2px, transparent 2px),
  background-image:
    linear-gradient(90deg, rgba(255, 255, 255, .45) 2px, transparent 2px),
    linear-gradient(45deg, transparent 48.5%, rgba(255, 255, 255, .3) 49.5%, rgba(255, 255, 255, .3) 50.5%, transparent 51.5%);*/
  background-size: 84px 84px, 84px 84px, 210px 210px;
  pointer-events: none;
	
}

/* dotted grid decoration, left edge */
.biz-promo--map::after {
  content: '';
  position: absolute;
  left: 16px;
  top: 58%;
  width: 44px;
  height: 78px;
  /*background-image: radial-gradient(rgba(31, 31, 31, .16) 2.4px, transparent 2.9px);*/
  background-size: 15px 15px;
  pointer-events: none;
}

.biz-promo--map .biz-promo__text { position: relative; z-index: 1; }

.biz-promo--map .biz-promo__text h2 {
  font-size: clamp(1.65rem, 3.4vw, 2.45rem);
  color: #2F3137;
  line-height: 1.18;
}

.biz-promo--map .biz-promo__text p {
	font-size: 1.6rem;
	margin-top: 0.3rem;
	color: var(--color-text);
}

.biz-promo--map .biz-promo__features { gap: 0; margin-top: 1.75rem; }

.biz-promo--map .biz-promo__features li {
  padding-inline: 1.5rem;
  font-size: .9rem;
  font-weight: 700;
}

.biz-promo--map .biz-promo__features li:first-child { padding-left: 0; }

.biz-promo--map .biz-promo__features li:not(:last-child)::after {
  border-right: 1px solid rgba(31, 31, 31, .13);
  top: 0;
  bottom: 0;
}

.biz-promo--map .biz-promo__features .icon-circle {
  width: 76px;
  height: 76px;
  margin-bottom: .65rem;
  box-shadow: 0 4px 12px rgba(12, 60, 110, .08);
}

.biz-promo--map .biz-promo__features .icon-circle i { font-size: 1.3rem; }

.biz-promo--map .biz-promo__features .icon-circle--green {
	border-color: #D7FF9E;
	color: #65B32E;
	border-width: 3px;
}
.biz-promo--map .biz-promo__features .icon-circle--blue {
	border-color: #C3E7FF;
	color: #1D74D8;
	border-width: 3px;
}
.biz-promo--map .biz-promo__cta {
	border-radius: 14px;
	padding: 0.7rem 5.4rem;
	font-size: 1.6rem;
	font-weight: 700;
	margin-top: 2.4rem;
}

/* circular photo with gradient ring */
.biz-promo--map .biz-promo__media {
  aspect-ratio: auto;
  /* static so the photo circle positions against the card itself and
     can span its full height (ring tangent to top/bottom edges, Figma) */
  position: static;
}

/* The site-wide scroll-reveal system (§30) adds `.reveal` to this element
   and gives it `will-change: transform` (and later `transform: translateY(0)`
   once visible) for the fade-in animation. Either one, regardless of value,
   makes the browser treat it as a CSS containing block for its absolutely-
   positioned `.biz-promo__media-photo` child - which breaks the circle's
   percentage-based sizing (it's meant to size against `.biz-promo--map`,
   not this staging wrapper). Cancel both so it stays a non-containing,
   position:static box like the rule above intends; opacity fade still works. */
.biz-promo--map .biz-promo__media.reveal {
  will-change: auto;
  transform: none;
}

.biz-promo--map .biz-promo__media-photo {
  position: relative;
  inset: auto;
  display: block;
  overflow: visible; /* badge + route ride outside the circle */
  width: min(100%, 400px);
  aspect-ratio: 1;
  margin-inline: auto;
  border-radius: 50%;
  padding: 7px;
  background: linear-gradient(150deg, #8ED04B 0%, #46B0E6 55%, #0C7CD9 100%);
}

.biz-promo--map .biz-promo__media-photo img { border-radius: 50%; }

/* train badge: white ring around the light-blue disc, riding the
   lower-left edge of the photo circle (sizes scale with the circle) */
.biz-promo--map .biz-promo__badge {
  top: auto;
  left: -9%;
  bottom: 23%;
  transform: none;
  width: 21%;
  height: auto;
  aspect-ratio: 1 / 1;
  border: 0;
  padding: .6rem;
  background: #fff;
  box-shadow: 0 12px 26px rgba(12, 60, 110, .18);
}

.biz-promo--map .biz-promo__badge::after { display: none; }

.biz-promo__badge-disc {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  background: linear-gradient(160deg, #DCF0FC 0%, #BFE1F8 100%);
  display: flex;
  align-items: center;
  justify-content: center;
  color: #0064A8;
  font-size: 2.1rem;
}

.biz-promo__pin {
  position: absolute;
  right: -8%;
  bottom: -2%;
  width: 32%;
  height: 40%;
  filter: drop-shadow(0 4px 6px rgba(12, 60, 110, .25));
}

.biz-promo__pin svg { width: 100%; height: 100%; }

/* Single pre-composed illustration (ring + dashed route + pin) that
   replaces the badge/pin combo above for the biz-promo--map variant. */
.biz-promo__map-icon {
	position: absolute;
	left: -20%;
	bottom: 4%;
	width: 34%;
	height: auto;
	aspect-ratio: 193 / 180;
	z-index: 2;
	filter: drop-shadow(0 8px 16px rgba(12, 60, 110, .18));
	animation: biz-train-float 2.6s ease-in-out infinite;
}

@keyframes biz-train-float {
	0%, 100% { transform: translateY(0); }
	50%      { transform: translateY(-8px); }
}

.biz-promo__map-icon img { width: 100%; height: 100%; display: block; }

/* dashed route curl next to the badge */
.biz-promo__route {
  position: absolute;
  left: -22%;
  bottom: 9%;
  width: 38%;
  height: auto;
  aspect-ratio: 170 / 100;
  z-index: 1;
  pointer-events: none;
}

.biz-promo__route svg { width: 100%; height: 100%; }

@media (min-width: 640px) {
  .biz-promo--map { padding: 3.5rem 3rem; }

  /* circle diameter = full card height (ring touches top and bottom
     edges), bleeding past the card's right edge where overflow clips it */
  .biz-promo--map .biz-promo__media { min-height: 340px; }

  .biz-promo--map .biz-promo__media-photo {
	position: absolute;
	top: -18%;
	bottom: 60px;
	width: auto;
	height: auto;
	aspect-ratio: 1;
	right: -6%;
	transform: none;
	margin-inline: 0;
}

  .biz-promo--map .biz-promo__badge-disc { font-size: 2.6rem; }
}

/* ---------- 29. Venue detail (place page) ---------- */
.venue-hero {
  position: relative;
  border-radius: 40px;
  margin-top: 2rem;
}
.venue-hero img { width: 100%; aspect-ratio: 1437.74/614; object-fit: cover; display: block; border-radius: 40px;}

.venue-hero__stats {
	position: absolute;
	top: 2rem;
	left: 2rem;
	display: flex;
	gap: 1.3rem;
}

.venue-hero__stat {
	background: rgba(0,0,0,.55);
	color: #fff;
	font-size: 16px;
	font-weight: 600;
	padding: 9px 9.14px;
	border-radius: 7px;
	display: flex;
	align-items: center;
	gap: .35rem;
}

.venue-hero__claim {
  position: absolute;
  bottom: 1rem;
  right: 1rem;
}

/* Clickable like chip */
button.venue-hero__stat--like { cursor: pointer; transition: background var(--transition-fast); }
button.venue-hero__stat--like:hover { background: rgba(0, 0, 0, .75); }
button.venue-hero__stat--like.is-liked { background: var(--color-primary); }
button.venue-hero__stat--like:disabled { opacity: .7; cursor: wait; }

.venue-hero__badge {
	position: absolute;
	bottom: -38px;
	left: 3.2rem;
	width: 94px;
	height: 94px;
	border-radius: 50%;
	background: #C8E4F6;
	display: flex;
	align-items: center;
	justify-content: center;
}
.venue-hero .venue-hero__badge img {
	height: 54px !important;
	width: auto !important;
}
.venue-updated {
	text-align: right;
	margin-top: 2rem;
	margin-bottom: 28px;
}
.venue-info__desc p {
	margin-bottom: 16px;
}
.venue-info { display: grid; gap: 2rem; margin-top: 1rem; }
.venue-info__desc h2 { font-size: 1.3rem; font-weight: 700; margin-bottom: .75rem; }

.venue-info__card { display: grid; gap: 1rem; }
.venue-info__card li { display: flex; gap: .5rem; align-items: flex-start;}
.venue-info__card li svg { flex-shrink: 0; color: var(--color-primary); margin-top: .1rem; }
.venue-info__card img { width: 100%; border-radius: var(--radius-sm); aspect-ratio: 16/9; object-fit: cover; margin-top: .5rem; }

.venue-gallery {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: .75rem;
  margin-top: 2rem;
  position: relative;
}

.venue-gallery img { width: 100%; aspect-ratio: 1; object-fit: cover; border-radius: var(--radius-sm); }

.additional-info-list { display: grid; gap: 1rem; margin-top: 1.25rem; }
.additional-info-list li { display: flex; align-items: center; gap: .75rem; font-size: .88rem; }
.additional-info-list li svg { color: var(--color-primary); flex-shrink: 0; }
.additional-info-list a {
	/* font-weight: 600; */
	color: var(--color-text);
	font-size: 18px;
	position: relative;
}
.venue-carousel { position: relative; margin-top: 1.5rem; }
.venue-carousel__track { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1.25rem; }

/* Listing detail (Place) page additions - Figma */
.venue-title { font-size: clamp(2rem, 4.6vw, 3.6rem); font-weight: 800; color: #2F3137; }
.venue-title .script-accent { font-size: 1.02em; margin-right: .15em; }

.venue-subtitle { font-size: 1.15rem; font-weight: 700; color: var(--color-text-soft); margin-top: .4rem; }

@media (min-width: 860px) {
  .venue-info { grid-template-columns: 1.8fr 1fr; }
}

.venue-info__aside {
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: 25px;
  padding: 1.25rem;
}

.venue-info__map{margin-top:1rem;position:relative;}

.venue-info__map iframe {
  width: 100%;
  height: 190px;
  border: 0;
  border-radius: 20px;
  display: block;
}

.venue-info__map .station-map__link { margin-top: .6rem; font-size: .85rem; }

/* 4-across photo carousel with round arrows */
.venue-gallery-carousel { margin-top: 2rem; }

.venue-gallery-carousel__item { width: calc(25% - .75rem); flex-shrink: 0; }

.venue-gallery-carousel__item img {
  width: 100%;
  aspect-ratio: 1 / 1.05;
  object-fit: cover;
  border-radius: var(--radius-md);
  display: block;
}

.venue-gallery-carousel .media-carousel__btn--prev { left: -14px; }
.venue-gallery-carousel .media-carousel__btn--next { right: -14px; }

.venue-additional {
	background: #fff;
	border: 1px solid var(--color-border);
	border-radius: 30px;
	padding: 1.8rem;
	margin-top: 2rem;
}

.venue-additional h2 {
	font-size: 30px;
	font-weight: 800;
}

.review-card__avatar--initial {
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: var(--color-bg-tint);
  color: var(--color-primary);
  font-weight: 700;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}

/* ---------- 30. Station content: overview, gallery/exit-guide carousels, map ---------- */

.page-section--station-overview {
  /* This section (the "{Station} Station" heading + gallery, right
     below the hero/breadcrumb/interchange-chips section above) had no
     top spacing of its own - .page-section is an empty base class, and
     nothing else here set a margin/padding-top, so the heading and
     gallery image sat flush against the hero's bottom curve. Matches
     the 70px .page-section--facilities already uses further down this
     page for the same "gap above a section" purpose. */
  margin-top: 70px;
}

.station-overview {
  display: grid;
  grid-template-columns:1fr 2fr;
  gap: 2rem;
  align-items: start;
}

.station-overview--text-only {
  grid-template-columns: 1fr;
}

.station-overview__desc h2 {
	font-size: 3.8rem;
	font-weight: 800;
	margin-bottom: 1.2rem;
	color: var(--color-text-soft);
	line-height: 62px;
}

.station-overview__desc p {margin-bottom: .85rem; }
.station-overview__facts { display: grid; gap: .4rem; margin-top: 1rem; font-size: .92rem; }

/* Generic horizontal carousel, reused for the station gallery (multi-item
   thumbnail track) and the exit-guide carousel (one full-width card at a
   time) - see [data-carousel] init in js/script.js. */
.media-carousel { position: relative; }

.media-carousel__track {
  display: flex;
  gap: 1rem;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
  border-radius: var(--radius-lg);
}

.media-carousel__track::-webkit-scrollbar { display: none; }

.media-carousel__item {
  flex: 0 0 auto;
  scroll-snap-align: start;
}

.media-carousel__item--gallery {
  width: 220px;
}

.media-carousel__item--gallery img {
  width: 100%;
  aspect-ratio: 4/3;
  object-fit: cover;
  border-radius: var(--radius-lg);
  display: block;
}

.media-carousel__item--exit {
  width: 100%;
}

/* Full-bleed single-slide carousel (Transit System "About" gallery) -
   one large photo at a time instead of the multi-thumbnail strip used
   for station galleries. */
.media-carousel__item--wide {
  width: 100%;
}

.media-carousel__item--wide img {
  width: 100%;
  aspect-ratio: 949.37 / 501.15;
  object-fit: cover;
  border-radius: var(--radius-lg);
  display: block;
}

.media-carousel__btn {
  position: absolute;
  top: 40%;
  transform: translateY(-50%);
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: #fff;
  border: 1px solid var(--color-border);
  box-shadow: var(--shadow-sm);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--color-text-soft);
  z-index: 2;
  transition: background var(--transition-fast), color var(--transition-fast);
}

.media-carousel__btn:hover { background: var(--color-primary); color: #fff; }
.media-carousel__btn--prev { left: -8px; }
.media-carousel__btn--next { right: -8px; }

/* Exit guide card */
.exit-card { background: #fff; border: 1px solid var(--color-border); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); overflow: hidden; }
.exit-card__media { position: relative; }
.exit-card__media img { width: 100%; aspect-ratio: 16/8; object-fit: cover; display: block; }
.exit-card__badge {
  position: absolute;
  left: 1rem;
  bottom: -14px;
  background: var(--color-accent, #7CB342);
  color: #fff;
  font-weight: 700;
  font-size: .82rem;
  padding: .4rem 1rem;
  border-radius: 5px;
  box-shadow: var(--shadow-sm);
}
.exit-card__body { padding: 1.75rem 1.5rem 1.25rem; }
.exit-card__body h3 { font-size: 1.15rem; font-weight: 700; margin-bottom: .6rem; }
.exit-card__body ul { list-style: disc; padding-left: 1.2rem; display: grid; gap: .3rem;}

/* Station map */
.station-map { border-radius: var(--radius-lg); overflow: hidden; box-shadow: var(--shadow-sm); border: 1px solid var(--color-border); }
.station-map iframe, .station-map img { width: 100%; height: 360px; border: 0; display: block; object-fit: cover; }
.station-map__link { display: inline-block; margin-top: .9rem; font-weight: 600; color: var(--color-primary); }

@media (max-width: 820px) {
  .station-overview { grid-template-columns: 1fr; }
}

/* ---------- 33. Station detail page (BTS Skytrain Stations Figma) ---------- */

/* Hero: green script "Discover" + dark "{System} Stations" + pin badge */
.station-hero__title { font-size: clamp(2rem, 4.6vw, 3.9rem); }

.station-hero__title .script-accent { font-size: 1.05em; }

.station-hero__main { color: #2F3137; font-weight: 800; }

.station-hero__pin {
  font-size: .3em;
  width: 2.1em;
  height: 2.1em;
  margin-left: .3em;
  transform: translateY(.55em);
}

/* Current station highlighted in the line strip: light line-colour
   speech bubble drawn BEHIND the dot + name (so the track line keeps
   running through it), with a pointer tail below (Figma). */
.line-card .station.is-current {
  z-index: 0; /* own stacking context so the bubble stays inside the card */
  color: var(--color-text-soft);
  font-weight: 700;
}

.line-card .station.is-current::after {
  content: '';
  position: absolute;
  inset: -5px 8px -9px;
  z-index: -1;
  background: color-mix(in srgb, var(--line-color, var(--color-accent)) 16%, #fff);
  border: 1.5px solid var(--line-color, var(--color-accent));
  border-radius: 10px;
  box-shadow: var(--shadow-sm);
}

.station__tail {
  position: absolute;
  top: calc(100% + 8px);
  left: 50%;
  transform: translateX(-50%);
  width: 0;
  height: 0;
  border: 7px solid transparent;
  border-top-color: var(--line-color, var(--color-accent));
  border-bottom: none;
}

/* Room for the bubble tail below the strip, and for the hover glow
   ring above (.station:hover .station__dot's box-shadow). overflow-x:
   auto on .station-row forces the y-axis to clip too, so this row
   needs real top/bottom padding - not a compensating negative margin -
   or that glow (and the bubble tail) get sliced off by the clip. */
.line-card .station-row { padding-bottom: 16px; padding-top: 16px; }

/* Category icon pills (station category page, Figma) */
.cat-pills {
  display: flex;
  justify-content: center;
  gap: clamp(1.25rem, 4vw, 2.5rem);
  flex-wrap: wrap;
  margin-top: .5rem;
}

.cat-pills a {
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: .5rem;
	transition: color var(--transition-fast);
	/* font-size: .82rem; */
	/* font-weight: 600; */
	/* color: var(--color-text-soft); */
}

.cat-pills__circle {
  width: 84px;
  height: 84px;
  border-radius: 50%;
  background: #C8E4F6;
  color: #33475C;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.2rem;
  box-shadow: var(--shadow-sm);
  transition: background var(--transition-fast), color var(--transition-fast), transform var(--transition-fast), box-shadow var(--transition-fast);
}

.cat-pills__circle svg,
.cat-pills__circle img,
.cat-pills__circle i {
  transition: transform var(--transition-fast);
}

.cat-pills a:hover .cat-pills__circle {
  background: #D9E8F4;
  transform: translateY(-6px) scale(1.08);
  box-shadow: 0 12px 22px rgba(0, 100, 168, .22);
}

.cat-pills a:hover .cat-pills__circle svg,
.cat-pills a:hover .cat-pills__circle img,
.cat-pills a:hover .cat-pills__circle i {
  transform: scale(1.12);
}

.cat-pills a:hover:not(.is-active) { color: var(--color-primary); }

.cat-pills a.is-active { color: var(--color-primary); font-weight: 700; }

.cat-pills a.is-active:hover .cat-pills__circle {
  background: var(--color-primary-dark);
}

.cat-pills a.is-active .cat-pills__circle {
  background: var(--color-primary);
  color: #fff;
}

/* Facilities & Services rail with scroll arrows */
.icon-rail-card { position: relative; padding-inline: 3rem; }

.icon-rail-card__btn { top: 55%; }
.icon-rail-card__btn--prev { left: .75rem; }
.icon-rail-card__btn--next { right: .75rem; }

.icon-rail-card__btn.media-carousel__btn { position: absolute; }

/* Exit Guide / Map / Ad three-column row */
.station-detail-row {
  display: grid;
  gap: 1.25rem;
  margin-top: 1rem;
  align-items: stretch;
}

@media (min-width: 1024px) {
  .station-detail-row { grid-template-columns: 1fr 1fr 1fr; }
}

.station-panel {
  background: #fff;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
  padding: 1.25rem;
}

.page-section.page-section--exit-map h3 {
	font-size: 28px;
}
.station-panel > h3 { font-size: 1.05rem; font-weight: 800; margin-bottom: 1rem; }

.station-panel .exit-card--panel { border: 1px solid var(--color-border); box-shadow: none; }
.station-panel .exit-card--panel .exit-card__media img { aspect-ratio: 16/9; }
.station-panel .exit-card--panel .exit-card__body { padding: 1.6rem 1.1rem 1rem; }
.station-panel .exit-card--panel .exit-card__body h3 { font-size: 1rem; margin-bottom: .45rem; font-size: 20px;}

.station-map--panel iframe,
.station-map--panel img { height: 300px; }

.station-panel--ad { padding: 0; overflow: hidden; display: flex; }
.station-panel--ad a { display: flex; width: 100%; }
.station-panel--ad img { width: 100%; height: 100%; object-fit: cover; min-height: 300px; }

/* ---------- 30. Transit System page polish (bts.png design match) ---------- */

/* Header search pill ("Search here....") */
.header-search {
	display: none;
	align-items: center;
	gap: .55rem;
	background: #fff;
	border: 1px solid #C8C8C8;
	border-radius: 15px;
	padding: .7rem 1.1rem;
	flex-shrink: 0;
}

.header-search i { color: var(--color-primary); font-size: 1.1rem; }

.header-search input {
	border: none;
	background: transparent;
	outline: none;
	font-size: .88rem;
	color: var(--color-text-soft);
	width: 130px;
}

.header-search input::placeholder { color: #9AA7B4; }

@media (min-width: 1150px) {
  .header-search { display: inline-flex; }
}

/* Line filter tabs: inactive tabs neutral (dark text, light border);
   only the active tab takes the line colour (Figma) */
.filter-tabs--stats .tab { border-color: #E7ECF2; box-shadow: 0 2px 8px rgba(15, 45, 80, .06); }

.filter-tabs--stats .tab:not(.is-active) .tab__icon,
.filter-tabs--stats .tab:not(.is-active) .tab__name { color: #25313F; }

/* Section heading: round icon chip + green system accent */
.section-head h2 .accent { color: var(--color-accent); }

.section-head__icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 50px;
	height: 50px;
	border-radius: 50%;
	background: #fff;
	box-shadow: var(--shadow-sm);
	color: #fff;
	font-size: 1.05rem;
	margin-right: 1rem;
	vertical-align: middle;
	flex-shrink: 0;
	background: #C8E4F6;
}

.section-head__icon img {
	width: 22px !important;
	height: 22px !important;
}

.section-head--split h2 { display: flex; align-items: center; gap: .3em; }

/* ---------- 32. Blog & News page (Figma) ---------- */
.blog-hero__title {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: .4em;
  flex-wrap: wrap;
  font-size: clamp(2.2rem, 5.6vw, 4.4rem);
  font-weight: 800;
  color: #2F3137;
}

.blog-hero__amp { color: #2F3137; }

/* Green script side note with the little arrow pointing at the title */
.blog-hero__note {
	position: relative;
	font-family: var(--font-script);
	color: var(--color-accent);
	font-size: 22px;
	line-height: 1.2;
	transform: translateY(-.5em);
	text-align: center;
	top: 40px;
	right: 20px;
}
.blog-hero__note img {
	width: 90px;
	left: 100px;
	position: relative;
	bottom: 8px;
}
.blog-hero__note svg {
  position: absolute;
  right: .2em;
  bottom: -1.6em;
  width: 3em;
  height: auto;
}

.blog-hero__badge-wrap {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  gap: .25em;
  transform: translateY(-.7em);
}

.blog-hero__badge-wrap small {
	font-size: 12px;
	color: var(--color-text-soft);
	white-space: nowrap;
	position: absolute;
	top: 41px;
	right: 125px;
	background: #ECF2F7;
	padding: 4px 10px;
	border-radius: 50px;
	font-weight: 300;
}

.blog-hero__badge-wrap .dir-hero__badge {
	transform: none;
	font-size: .34em;
	right: 50px;
	top: 31px;
}

/* Blog hero ("Blog &News") - one-time entrance for the curvy arrow
   next to "What's Happening in Bangkok" and the round icon chip next
   to "#CityByStation", played once on page load rather than looping. */
.blog-hero__note img {
  animation: blog-hero-arrow-in .6s var(--ease-smooth) both;
}

@keyframes blog-hero-arrow-in {
  from { opacity: 0; transform: scale(.4) rotate(-25deg); }
  to   { opacity: 1; transform: scale(1) rotate(0deg); }
}

.blog-hero__badge-wrap .dir-hero__badge {
  animation: blog-hero-badge-pop .5s var(--ease-smooth) .35s both;
}

@keyframes blog-hero-badge-pop {
  0%   { opacity: 0; transform: scale(.3) rotate(-20deg); }
  60%  { opacity: 1; transform: scale(1.15) rotate(4deg); }
  100% { opacity: 1; transform: scale(1) rotate(0deg); }
}

/* Pill search bar inside the hero */
.blog-search {
	display: flex;
	align-items: center;
	gap: .6rem;
	max-width: 830px;
	margin: 1.9rem auto 34px;
	background: #fff;
	border-radius: 20px;
	padding: .35rem .4rem .35rem 1.1rem;
	box-shadow: 0 0 0;
}

.blog-search i { color: #9AA7B4; font-size: .9rem; }

.blog-search input {
  flex: 1;
  min-width: 0;
  border: none;
  outline: none;
  background: transparent;
  font-size: .92rem;
  font-family: inherit;
}

/* Category pills */
.blog-cats {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: .7rem;
  margin-top: 1.5rem;
}

.blog-cats a {
	background: #fff;
	border: 1px solid #0064A8;
	border-radius: 16px;
	padding: .55rem 1.65rem;
	font-size: 18px;
	color: var(--color-text-soft);
	transition: background var(--transition-fast), color var(--transition-fast);
	background: transparent;
}

.blog-cats a:hover { background: var(--color-bg-tint); }

.blog-cats a.is-active {
  background: var(--color-primary);
  border-color: var(--color-primary);
  color: #fff;
}

/* Condensed pagination (‹ 1 2 … 9 10 ›) */
.pagination--blog {
  display: flex;
  gap: 0.6rem;
  justify-content: center;
  align-items: center;
  margin-top: 2.5rem;
  flex-wrap: wrap;
}

.pagination--blog a, .pagination--blog .dots {
	min-width: 42px;
	height: 40px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	border-radius: 5px;
	color: var(--color-text-soft);
	font-weight: 600;
	font-size: 18px;
	padding: 0 .5rem;
	border-color: #DFE3E8;
}

.pagination--blog .dots { background: transparent; }

.pagination--blog a:hover { background: var(--color-bg-tint); }

.pagination--blog a.is-current {
  background: #fff;
  border: 1.5px solid var(--color-primary);
  color: var(--color-primary);
}

.pagination--blog a.is-disabled {
	opacity: .45;
	pointer-events: none;
	background: #919EAB;
	color: #fff;
	font-size: 24px;
	border: 1px #919EAB solid;
}
.pagination--blog a:last-child {
	font-size: 24px;
}
/* ---------- 31. Directory-style pages (Directory / Places / Things) ---------- */

/* Hero: green script line + bold dark line with small round badge */
.dir-hero__title { display: flex; flex-direction: column; align-items: center; line-height: 1.02; }

.dir-hero__script {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .08em;
  font-family: var(--font-script);
  font-weight: 700;
  color: var(--color-accent);
  font-size: 2em;
}

.dir-hero__script .script-accent { font-size: 1em; }

.dir-hero__script .page-hero__swirl {
	width: 0.62em;
	margin-right: -0.02em;
	transform: translateY(.08em);
}

/* Station category hero ("Restaurants near Khu Khot Station") -
   one-time entrance for the swirl arrow, the category word, and the
   icon chip, played once on page load (left-to-right reading order:
   arrow, then word, then badge). Scoped to .stationcategorypagehero
   only, since .dir-hero__script/.dir-hero__badge/.script-accent are
   shared with other hero variants (directory, places-to-visit,
   things-to-do, blog) that shouldn't get this animation. Keyframe
   end-states include each element's normal resting transform (e.g.
   the swirl's translateY(.08em)) so nothing shifts once it finishes. */
.stationcategorypagehero .dir-hero__script .page-hero__swirl {
  animation: catnhero-swirl-in .6s var(--ease-smooth) both;
}

@keyframes catnhero-swirl-in {
  from { opacity: 0; transform: translateY(.08em) scale(.4) rotate(-25deg); }
  to   { opacity: 1; transform: translateY(.08em) scale(1) rotate(0deg); }
}

.stationcategorypagehero .dir-hero__script .script-accent {
  display: inline-block;
  animation: catnhero-word-in .6s var(--ease-smooth) .15s both;
}

@keyframes catnhero-word-in {
  from { opacity: 0; transform: translateY(14px) rotate(-4deg); }
  to   { opacity: 1; transform: translateY(0) rotate(0deg); }
}

.stationcategorypagehero .dir-hero__badge {
  animation: catnhero-badge-pop .5s var(--ease-smooth) .35s both;
}

@keyframes catnhero-badge-pop {
  0%   { opacity: 0; transform: translateY(-1em) scale(.3) rotate(-20deg); }
  60%  { opacity: 1; transform: translateY(-1em) scale(1.15) rotate(4deg); }
  100% { opacity: 1; transform: translateY(-1em) scale(1) rotate(0deg); }
}

/* Directory / Places to Visit / Things to Do hero ("Bangkok Directory"
   etc.) - same one-time swirl-arrow + icon-badge entrance as the
   station-category hero above, reusing its keyframes. The word itself
   ("Directory"/"Places to Visit"/"Things to Do") is plain black text
   here rather than the script-accent line, so only the arrow and the
   icon chip animate - scoped to these three hero title classes so the
   station-category and transit-system heroes (which already have
   their own animation) aren't affected. */
.directory_hero_title .page-hero__swirl,
.places_to_visit_hero_title .page-hero__swirl,
.things_to_do_hero_title .page-hero__swirl {
  animation: catnhero-swirl-in .6s var(--ease-smooth) both;
}

.directory_hero_title .dir-hero__badge,
.places_to_visit_hero_title .dir-hero__badge,
.things_to_do_hero_title .dir-hero__badge {
  animation: catnhero-badge-pop .5s var(--ease-smooth) .35s both;
}

/* Round light-blue chip with the small blue icon, floating at the
   script line's top-right (icon is half the circle's diameter). */
.dir-hero__badge {
	font-size: .3em;
	width: 2.4em;
	height: 2.3em;
	border-radius: 50%;
	background: #C8E4F6;
	color: #0064A8;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	flex-shrink: 0;
	transform: translateY(-1em);
	box-shadow: var(--shadow-sm);
	bottom: -50px;
	position: relative;
	right: -36px;
}

.dir-hero__main { color: #2F3137; font-weight: 800; font-size: 2em;}

/* Station category hero ("Near Kheha Station") - keep the bold main
   line itself on one line instead of wrapping ("Near Kheha" / "Station")
   at typical widths, while leaving the script line above it (and the
   rest of .dir-hero__title's stacked layout) untouched. Scoped to
   .stationcategorypagehero only - the Directory/Places to Visit/Things
   to Do hub heroes keep their own default wrapping behavior. */
.stationcategorypagehero .dir-hero__main {
  white-space: nowrap;
  font-size: calc(clamp(1.1em, 4.2vw, 2em) + 14px);
}

.station-filter__title { font-size: 1.05rem; font-weight: 800; color: var(--color-text-soft); margin-bottom: 1rem; }

.category-dropdown label { font-weight: 700; }

.category-dropdown select,
.category-dropdown__trigger {
	border: none;
	outline: none;
	background: transparent;
	font-size: 19px;
	color: var(--color-text-soft);
	font-family: inherit;
	padding-left: var(--cat-dd-offset, 140px);
	width: 100%;
	padding-top: 14px;
	padding-bottom: 14px;
}

.category-dropdown__trigger {
	display: block;
	text-align: left;
	cursor: pointer;
}

.station-filter__list a.is-active { font-weight: 700; color: var(--color-primary); background: var(--color-bg-tint); }

.station-filter__all.is-current{/*outline:2px solid rgba(12, 124, 217, .35);*/}

/* POI card transit row: train icon + "{Station} - {Line}" in line colour */
.poi-card__line,
.poi-card__body p.poi-card__line {
  display: flex;
  align-items: center;
  gap: .45rem;
  margin-top: .5rem;
  font-size: .9rem;
  font-weight: 700;
  color: var(--poi-line-color, var(--color-accent));
}

.poi-card__line i { font-size: .85rem; flex-shrink: 0; }

.newsletter__row input::placeholder {
	color: #2f2f2f !important;
	font-size: 18px;
}


.page-section.page-section--poi-restaurant.container {
	margin: 80px auto;
}
.page-section.page-section--poi-cafe.container {
	margin-bottom: 80px;
}
.page-section.page-section--poi-hotel.container {
	margin: 70px auto 80px;
}
.page-section.page-section--biz-promo.container {
	margin-bottom: 80px;
}

.page-section .btn.btn--primary {
	padding: 0.2rem 1.1rem;
	font-weight: normal;
	bottom: 12px;
	position: relative;
}

.page-section.page-section--biz-promo.container .biz-promo--map .biz-promo__text h2 {
	font-size:clamp(1.65rem, 3.6vw, 4.2rem);
}

.page-section.page-section--biz-promo.container .biz-promo__route {
	display: none;
}

.page-section.page-section--biz-promo .biz-promo__map-icon img {
	border-radius: 0;
}


.dir-hero__script svg {
	transform: rotate(90deg);
}

.category-dropdown {
	width: 380px;
	padding: 0;
	padding-right: 0;
}
.category-dropdown label {
	position: absolute;
	left: 0;
	font-size: 19px;
	top: 0;
	bottom: 0;
	padding: 11px 18px;
	background: url(../images/label-bg.svg) no-repeat;
	background-position: right;
}

/* Transit Systems filter (stations.php) - the stock .category-dropdown
   label is absolutely positioned and overlaid on top of the trigger,
   with a fixed-width pill graphic (label-bg.svg) sized for the short
   word "Category" and a matching --cat-dd-offset magic number reserving
   space for it. "Transit Systems" is a lot wider, and re-tuning that
   offset per breakpoint proved fragile (it broke again at mid-size
   viewports between the two overrides that existed here before). This
   variant instead makes the label a normal (non-absolute) flex child
   that sizes itself to its own text, so the pill and the trigger next
   to it always fit correctly at any label length - no offset tuning
   needed, ever. The pill keeps a fixed overall width (matching the
   Category dropdown's own fixed 380px) so it doesn't visibly shrink
   when a short value like "BTS" is selected instead of the long
   default "All Transit Systems" - the trigger (flex:1) just absorbs
   the extra room instead of the whole pill getting narrower.
 */
.category-dropdown--systems {
	width: 430px;
	padding: 0;
}

.category-dropdown--systems label {
	position: static;
	flex-shrink: 0;
	display: flex;
	align-items: center;
	align-self: stretch;
	padding: 0 1.25rem;
	background: #E6F3FF;
	border-radius: var(--radius-sm) 0 0 var(--radius-sm);
	white-space: nowrap;
}

/* Wraps just the trigger + menu (not the label), and is itself the
   positioned ancestor the menu's `left/right: 0` resolve against - so
   the open menu spans only the white trigger area (like the original
   Category dropdown), not the whole pill including the blue label. */
.category-dropdown--systems .category-dropdown__control {
	position: relative;
	display: flex;
	align-items: center;
	flex: 1;
	min-width: 0;
}

.category-dropdown--systems .category-dropdown__trigger {
	padding: 14px 2.4rem 14px 1rem;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
}

/* Module switcher (Directory / Places to Visit / Things to Do,
   .listing-results__browse in render_directory_results_panel()) - same
   .category-dropdown box/trigger/menu/chevron as the Category dropdown
   right beside it, but with no label pill at all (there's nothing to
   label - "Directory"/"Places to Visit"/"Things to Do" reads fine on its
   own, same as the plain <select> it replaces used to). Sized to its own
   text instead of the Category dropdown's fixed 380px, so it doesn't
   stretch a short label like "Directory" out to match. */
.category-dropdown--browse {
	width: auto;
	padding: 0;
}
.category-dropdown--browse .category-dropdown__trigger {
	padding: 14px 2.4rem 14px 1.1rem;
	white-space: nowrap;
}
.category-dropdown--browse .category-dropdown__menu {
	left: 0;
	right: auto;
	min-width: 100%;
}
/* The menu is only as wide as the trigger (min-width:100%, above) - fine
   while "Directory" is selected, but the trigger (and so the menu) is
   sized to whichever label is currently showing, so "Places to Visit"
   wrapped onto two lines whenever a shorter label like "Directory" was
   selected. Keeping every option on one line lets the menu grow wider
   than the trigger to fit its longest option instead. */
.category-dropdown--browse .category-dropdown__menu [role="option"] {
	white-space: nowrap;
}

.category-dropdown--systems .category-dropdown__menu {
	left: 0;
}


.category-dropdown select,
.category-dropdown__trigger {
	appearance: none;
	-webkit-appearance: none;
	-moz-appearance: none;
	background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'><path d='M1 1l5 5 5-5' stroke='%23333' stroke-width='2' fill='none' stroke-linecap='round'/></svg>");
	background-repeat: no-repeat;
	background-position: right 12px center;
	background-size: 12px 8px;
	transition: background-image var(--transition-fast);
}

.category-dropdown__trigger[aria-expanded="true"] {
	background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'><path d='M1 7l5-5 5 5' stroke='%230064A8' stroke-width='2' fill='none' stroke-linecap='round'/></svg>");
}

.container.listing-layout .container {
	padding: 0;
}

.container.listing-layout .container .promo {
	margin: 46px 0;
}

.search-bar .btn.btn--primary {
	bottom: 0;
	font-size: 18px;
	padding: 10px 28px;
	border-radius: 14px;
}

.page-hero__swirl {
	width: 78px;
	bottom: 9px;
	position: relative;
}

.page-section.page-hero.lyb-hero {
	padding-bottom: 11em;
}
.feature-cards {
	margin-top: -110px;
	position: relative;
}
.page-section.page-hero.lyb-hero .btn--primary {
	font-size: 18px;
	padding: 15px 32px;
}

#submit-your-business .form-card {
	max-width: 100% !important;
}

.page-section.page-section--contact-form.container {
	margin-top: -134px;
	position: relative;
}

.page-section.page-section--contact-form.container {
	margin-top: -134px;
	position: relative;
	margin-bottom: 80px;
}

.page-section.page-hero.contactusbanner {
	padding-bottom: 11em;
}

.page-section .contact-layout .btn.btn--primary {
	background: #0072CE;
	border-radius: 14px;
	height: 56px;
	transition:.5s ease;
}
.page-section .contact-layout .btn.btn--primary:hover {
	background: var(--color-primary);
	transition:.5s ease;
}

.page-section.page-hero.lyb-hero .btn--primary {
	background: #0072CE;
	transition:.5s ease;
}
.page-section.page-hero.lyb-hero .btn--primary:hover {
	background: var(--color-primary);
	transition:.5s ease;
}

#submit-your-business .form-card .btn.btn--primary {
	background: #0072CE;
	transition: .5s ease;
	font-size: 18px;
	padding: 17px 134px !important;
	min-width: auto !important;
	margin-top: 30px;
	transition:.5s ease;
}

#submit-your-business .form-card .btn.btn--primary:hover {
	background: var(--color-primary);
	transition:.5s ease;
}

.page-section.page-section--faq.container {
	margin-bottom: 86px !important;
}


.biz-promo.biz-promo--map .icon-circle img {
	width: auto !important;
	height: auto !important;
}

#home .hero__tag .hero__tag-arrow {
	height: 75px;
	width: 54px;
	bottom: 10px;
	position: relative;
	left: 12px;
}

.containerdivblognews .promo {
	margin: 0;
}
.containerdivblognews {
	margin: 20px 0px 40px;
}

.page-section.page-section--blog-grid.container {
	margin-bottom: 60px;
}

.pagination--blog a:first-child {
	font-size: 24px;
}

.page-section.container.article-layout .article-body {
	padding-right: 24px;
}

.page-section.page-section--blog-nav.container {
	margin-bottom: 74px;
}


.page-section.container.article-layout .article-body {
	padding-right: 24px;
}

.page-section.container.article-layout {
	margin-top: 70px;
}

.blog-nav-row .blog-nav-card:nth-child(1) {
	padding-left: 30px;
	background: linear-gradient(to right, rgba(255,255,255,1) 0%,rgba(228,242,255,1) 100%);
}
.blog-nav-row .blog-nav-card:nth-child(1) img {
	border-bottom-left-radius: 0;
	border-top-left-radius: 0;
}
.blog-nav-row .blog-nav-card.blog-nav-card--next {
	justify-content: left;
	padding-right: 30px;
	text-align: left;
	background: linear-gradient(to right, rgba(255,255,255,1) 0%,rgba(228,242,255,1) 100%);
}
.blog-nav-row .blog-nav-card.blog-nav-card--next img {
	border-bottom-right-radius: 0;
	border-top-right-radius: 0;
}
.blog-nav-row .blog-nav-card.blog-nav-card--next > div {
	padding-left: 12px;
}

.blog-nav-card{
	transition:.5s ease;
	overflow: hidden;
}
.blog-nav-card:hover {
	background:#E4F2FF !important;
	transition:.5s ease;
}
.article-layout.containerblogdetails h2 {
	font-size: 28px;
}

.back-btn svg {
	width: 24px !important;
	height: 24px !important;
}

.blog-nav-row .blog-nav-card.blog-nav-card--next {
	padding-left: 0;
}


.page-hero__title.page-hero__title--transit.station-hero__title .dir-hero__badge.station-hero__pin {
	bottom: 0;
	position: relative;
	right: 0;
}
.page-hero__title.page-hero__title--transit.station-hero__title .dir-hero__badge.station-hero__pin .fa-solid {
	transform: rotate(26deg);
}

.page-section.page-section--category-pills {
	margin: -62px auto 56px;
	position: relative;
}


.page-hero__title.dir-hero__title .dir-hero__badge {
	right: 5px;
	box-shadow: 0 0 0;
	top: -5px;
	width: 80px;
	height: 80px;
}

.page-section.page-section--category-pills .cat-pills__circle {
	box-shadow: 0 0 0;
}

.page-section.page-hero.stationcategorypagehero {
	padding-bottom: 8em;
}

.page-hero__nav-btn.page-hero__nav-btn--next {
	width: 55px !important;
	height: 55px !important;
}
.page-hero__nav-btn.page-hero__nav-btn--next svg {
	width: 20px;
	height: 20px;
}

.page-hero__nav-btn.page-hero__nav-btn--prev {
	width: 55px !important;
	height: 55px !important;
}
.page-hero__nav-btn.page-hero__nav-btn--prev svg {
	width: 20px;
	height: 20px;
}

.page-section.page-section--featured-listings.container {
	margin-bottom: 80px;
}
.page-section.page-section--more-listings.container {
	margin-bottom: 80px;
}
.page-section.lines.stationcategorypagesectionlines .section-head.section-head--center {
	margin-top: 0;
}


.filter-tabs--stats .icon-train svg {
	width: 13px;
	position: relative;
	top: -8px;
}

.icon-train svg {
	width: 13px;
}

.page-section.page-hero.listingdetailpagehero {
	padding-bottom: 15em;
}

.page-section.page-section--venue-detail.container {
	margin-top: -210px;
}

.venue-hero .btn.btn--primary.venue-hero__claim {
	position: absolute;
	font-size: 18px;
	padding: 12px 29px;
	bottom: 50px;
	right: 50px;
}

.page-section.page-section--category-pills .cat-pills__circle svg {
	width: 35px;
}

.page-section.page-hero.stationcategorypagehero .page-hero__title .dir-hero__badge svg {
	transform: rotate(0deg);
	width: 40px;
}

.venue-info__card li svg {
	width: 21px !important;
	height: 21px !important;
}

.venue-info__map a.station-map__link {
	position: absolute;
	left: 0;
	right: 0;
	width: 148px;
	height: 44px;
	background: #fff;
	display: flex;
	justify-content: center;
	align-items: center;
	border-radius: 8px;
	margin: 0 auto;
	bottom: 30px;
	box-shadow: 0 3px 2px rgba(0,0,0,.2);
	transition: .5s ease;
}
.venue-info__map a.station-map__link:hover {
	background: var(--color-primary);
	color: #fff;
}

.media-carousel.venue-gallery-carousel {
	margin: 80px 0;
}

.media-carousel.venue-gallery-carousel .media-carousel__btn.media-carousel__btn--prev {
	left: -100px;
	background: #0064A8;
	color: #fff;
	width: 60px;
	height: 60px;
	box-shadow: 0 0 0 !important;
	border: 0;
	top: 50%;
}

.media-carousel.venue-gallery-carousel .media-carousel__btn.media-carousel__btn--next {
	right: -100px;
	background: #0064A8;
	color: #fff;
	width: 60px;
	height: 60px;
	box-shadow: 0 0 0 !important;
	border: 0;
	top: 50%;
}
.media-carousel.venue-gallery-carousel .media-carousel__btn svg {
	width: 20px !important;
	height: 20px !important;
}

.page-section.page-section--reviews.container {
	margin: 60px auto;
}

/* Review platform buttons (Google/Wongnai/Facebook/Tripadvisor) - sit
   where the old static review cards used to, one button per platform
   URL the admin has filled in (see listingdetail.php). */
.review-platform-links {
	display: flex;
	flex-wrap: wrap;
	gap: 1rem;
	margin-top: 1.5rem;
}
.review-platform-btn {
	display: inline-flex;
	align-items: center;
	gap: .7rem;
	padding: 1rem 1.9rem;
	border-radius: 12px;
	font-weight: 700;
	font-size: 1.05rem;
	text-decoration: none;
	border: 1px solid transparent;
	box-shadow: var(--shadow-sm);
	transition: transform .15s ease, box-shadow .15s ease;
}
.review-platform-btn:hover {
	transform: translateY(-2px);
	box-shadow: 0 10px 20px rgba(0,0,0,.12);
}
.review-platform-btn__icon {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 22px;
	height: 22px;
	font-size: 1.2rem;
	flex-shrink: 0;
}
.review-platform-btn--google {
	/* Google's own brand guidelines don't put the multi-color "G" on a
	   solid blue (or any single-brand-color) background - blue is just
	   one of Google's four colors, and reads as "another blue button"
	   next to Facebook's. Their actual approved backgrounds for the
	   full-color mark are white or this neutral near-black ("Google
	   Grey 900", the same color their own dark-mode "Sign in with
	   Google" button uses) - distinct from Facebook/Wongnai/Tripadvisor
	   without pretending Google has a single brand blue the way they do. */
	background: #202124;
	color: #fff;
}
/* The full-color "G" mark is only approved on white - a small white
   backing behind it here (matching Google's own dark-theme "Sign in
   with Google" button) keeps the mark itself correct even though the
   button around it is dark. */
.review-platform-btn--google .review-platform-btn__icon {
	background: #fff;
	border-radius: 4px;
	padding: 3px;
	width: 22px;
	height: 22px;
	box-sizing: border-box;
}
.review-platform-btn--facebook {
	background: #1877F2;
	color: #fff;
}
.review-platform-btn--wongnai {
	background: #0070A8;
	color: #fff;
}
.review-platform-btn--tripadvisor {
	background: #00AF87;
	color: #fff;
}
.reviews-google-rating {
	display: flex;
	align-items: center;
	gap: .4rem;
	font-size: 1rem !important;
	margin-top: .5rem !important;
}
.page-section.page-section--other-listings.container {
	margin-bottom: 70px;
}

.additional-info-list a:hover {
	color: var(--color-primary);
}

.additional-info-list a span {
	font-size: 36px;
	font-weight: 300normal;
	position: absolute;
	top: -15px;
	right: -20px;
	color: #0064A8;
}




.media-carousel.other-listings-carousel .media-carousel__btn.media-carousel__btn--prev {
	left: -100px;
	background: #0064A8;
	color: #fff;
	width: 60px;
	height: 60px;
	box-shadow: 0 0 0 !important;
	border: 0;
	top: 50%;
}

.media-carousel.other-listings-carousel .media-carousel__btn.media-carousel__btn--next {
	right: -100px;
	background: #0064A8;
	color: #fff;
	width: 60px;
	height: 60px;
	box-shadow: 0 0 0 !important;
	border: 0;
	top: 50%;
}
.media-carousel.other-listings-carousel .media-carousel__btn svg {
	width: 20px !important;
	height: 20px !important;
}

.venue-hero__stats svg {
	width: 16px;
}


.venue-hero__stat .icon-view svg, .venue-hero__stat .icon-like svg {
    display: inline-block;
    height: .85em;
    width: auto;
}

.other-listings-carousel__item { width: calc(25% - .75rem); flex-shrink: 0; }

.page-section.lines.stationpagesectionlines {
	margin-top: -80px;
}

.page-hero.stationpagehero .page-hero__badge-icons.page-hero__badge-icons--combo {
	width: 87px;
	position: relative;
	left: 0;
	bottom: 7px;
}

.page-hero.stationpagehero .dir-hero__badge.station-hero__pin {
	width: 54px;
}


.station-overview .media-carousel__btn {
	width: 46px;
	height: 46px;
}
.station-overview .media-carousel__btn:hover{background-color:#fff;}
.station-overview .media-carousel__btn svg path {
	stroke: #0064A8 !important;
}
.station-overview .media-carousel__btn svg {
	width: 27px;
	height: 27px;
}
.station-overview .media-carousel__btn.media-carousel__btn--prev {
	left: 40px;
	top: 50%;
}
.station-overview .media-carousel__btn.media-carousel__btn--next {
	right: 40px;
	top: 50%;
}

.page-section.page-section--facilities.container {
	margin: 70px auto;
}

.page-section.page-section--facilities.container h3 {
	font-size: 28px;
}

.page-section.page-section--facilities.container .icon-rail-card {
	border-radius: 20px;
	padding-left: 2rem !important;
	padding-right: 2rem !important;
	/* Card itself stays full width (matching the hero image / Exit
	   Guide / Map cards elsewhere on this page) - the "show ~10 icons,
	   scroll for the rest" cap lives on .icon-rail (the row inside this
	   card) instead, so it centers as a fixed-width scrollable strip
	   within this full-width card rather than shrinking the whole card
	   down to the row's width. */
}
.page-section.page-section--facilities.container .icon-rail__circle {
	width: 70px;
	height: 70px;
}
.page-section.page-section--facilities.container .icon-rail__circle .fa-solid {
	font-size: 20px;
}
.page-section.page-section--facilities.container .icon-rail__circle img {
	width: 26px !important;
	border-radius: 0 !important;
	height: 26px !important;
}

.page-section.page-section--facilities.container .media-carousel__btn--prev {
	left:-21px;
}
.page-section.page-section--facilities.container .media-carousel__btn--next {
	right:-21px;
}

.page-section.page-section--exit-map .station-detail-row {
	display: flex;
}
.page-section.page-section--exit-map .station-detail-row .station-panel {
	width: 33.33%;
	position: relative;
	/* Without this, the row's height (flex align-items:stretch default)
	   is only ever as tall as whichever panel's own content happens to
	   be tallest - e.g. an Exit Guide with just 1-2 bare entries and no
	   photos collapses down to almost nothing, and the Map panel next
	   to it (sized off that same stretched height via the 88% rule
	   below) shrinks along with it. A fixed min-height keeps the Map/
	   Exit Guide/Ad panels a consistent, generous size regardless of
	   how much content any one of them happens to have. */
	min-height: 475px;
}

.page-section.page-section--exit-map .station-detail-row .station-panel .station-map.station-map--panel, .page-section.page-section--exit-map .station-detail-row .station-panel .station-map.station-map--panel iframe {
	height: 88%;
}

.page-section.page-section--exit-map .station-detail-row a.station-map__link {
	position: absolute;
	left: 0;
	right: 0;
	width: 148px;
	height: 44px;
	background: #fff;
	display: flex;
	justify-content: center;
	align-items: center;
	border-radius: 8px;
	margin: 0 auto;
	bottom: 60px;
	box-shadow: 0 3px 2px rgba(0,0,0,.2);
	transition: .5s ease;
}
.page-section.page-section--exit-map .station-detail-row a.station-map__link:hover {
	background: var(--color-primary);
	color: #fff;
}

.page-section.page-section--explore-near.container {
	margin: 70px auto;
}

.page-section.page-section--explore-near.container .category-tile-grid {
	margin-bottom: 60px;
}

.header-search {
	position: absolute;
	right: 20px;
}

.site-header .container.site-header__inner {
	position: relative;
}

.legal-content p {
	margin-bottom: 22px;
}

.listing-layout .pagination .btn.btn--primary {
	bottom: 0;
	border: 0;
}
.page-hero__title.dir-hero__title.places_to_visit_hero_title .dir-hero__badge {
	top: 60px;
	right: 0;
}

.page-hero__title.dir-hero__title.things_to_do_hero_title .dir-hero__badge {
	top: 53px;
	right: -17px;
}
.page-hero__title.dir-hero__title.directory_hero_title .dir-hero__badge {
	top: 53px;
	right: -17px;
}
.page-section.page-section--about.container.transitsystemspagesectionabout {
	margin-bottom: 70px;
}
.page-section.page-section--about.container.transitsystemspagesectionabout .media-carousel__btn {
	top: 50%;
}

/* =========================================================
   30. Scroll-reveal animations
   Applied by js/script.js: `.reveal` elements start hidden/offset
   and animate in (`.is-visible`) once they enter the viewport via
   IntersectionObserver. Falls back to always-visible if JS never
   runs, and is fully disabled under prefers-reduced-motion.
   ========================================================= */
.reveal {
  opacity: 0;
  transform: translateY(28px);
  transition: opacity .7s var(--ease-smooth), transform .7s var(--ease-smooth);
  will-change: opacity, transform;
}

.reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}

/* Slight stagger for siblings revealed together (grids of cards) */
.reveal[data-reveal-delay="1"] { transition-delay: .08s; }
.reveal[data-reveal-delay="2"] { transition-delay: .16s; }
.reveal[data-reveal-delay="3"] { transition-delay: .24s; }
.reveal[data-reveal-delay="4"] { transition-delay: .32s; }
.reveal[data-reveal-delay="5"] { transition-delay: .4s; }

@media (prefers-reduced-motion: reduce) {
  .reveal {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

/* =========================================================
   34. Cookie consent notice
   Informational-only disclosure (see inc/footer.php's docblock right
   above the markup) - a fixed bar pinned to the bottom of the viewport,
   shown/hidden by js/site.js based on a localStorage flag so it only
   ever appears once per visitor until dismissed.
   ========================================================= */
.cookie-consent {
	position: fixed;
	left: 0;
	right: 0;
	bottom: 0;
	z-index: 9999;
	background: var(--color-text, #16324f);
	color: #fff;
	box-shadow: 0 -4px 18px rgba(0, 0, 0, .18);
}

.cookie-consent[hidden] {
	display: none;
}

.cookie-consent__inner {
	max-width: 1200px;
	margin: 0 auto;
	padding: 16px 20px;
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 20px;
	flex-wrap: wrap;
}

.cookie-consent__text {
	margin: 0;
	font-size: .9rem;
	line-height: 1.5;
	flex: 1 1 420px;
}

.cookie-consent__text a {
	color: #fff;
	text-decoration: underline;
}

.cookie-consent__accept {
	flex: 0 0 auto;
	white-space: nowrap;
}