/* ==========================================================================
   MyCabin Functional Zoning Hub — Page Pack CSS
   Scoped entirely under .pp-functional-zoning (Page Pack Spec §5). Every
   selector in this file is nested under that root class — no bare element
   or utility selectors. Trimmed from the Claude Design export's shared
   styles.css: only the rules this page's own three sections actually use
   (hero + city finder, city-guide card grid, closing dark CTA). No rails,
   marquees, accordions, map, decision tree or other-page CSS is carried
   over, and none of the shared header / mobile-nav / footer CSS.

   01  Tokens (scoped custom properties, not :root)
   02  Base resets (scoped)
   03  Flow-layout margin neutralization (positioned/repeated-item groups)
   04  Section shell, eyebrow, scroll reveal
   05  Hero + city finder (search field + region pills)
   06  City guide grid + cards
   07  Closing dark CTA
   08  Desktop layer (min-width: 900px) + tablet grid step (640px)
   09  Reduced motion
   ========================================================================== */


/* ==========================================================================
   01  TOKENS — scoped to .pp-functional-zoning, never :root, so nothing
   leaks to the rest of the WordPress site (Page Pack Spec §5, layer 2).
   ========================================================================== */

.pp-functional-zoning {
  --pp-ink:         #27272C;
  --pp-bone:        #FFFFFF;
  --pp-surface:     #FBF6F3;
  --pp-olive:       #6E5C3C;
  --pp-accent:      #917EBC;
  --pp-accent-soft: #CDCBFF;
  --pp-tint:        #E6E6FF;
  --pp-scrim:       var(--pp-ink);

  --pp-stone:    color-mix(in oklab, var(--pp-ink) 11%, var(--pp-bone));
  --pp-ink-line: color-mix(in oklab, var(--pp-ink) 13%, var(--pp-bone));

  --pp-ink-72:  color-mix(in oklab, var(--pp-ink) 72%, transparent);
  /* 65%, not 56% — matches the site-wide WCAG AA fix already applied on
     every other MyCabin Page Pack for this anthracite/beige pairing. */
  --pp-ink-56:  color-mix(in oklab, var(--pp-ink) 65%, transparent);
  --pp-bone-60: color-mix(in oklab, var(--pp-bone) 60%, transparent);

  --pp-maxw:   1280px;
  --pp-gutter: clamp(18px, 4vw, 40px);
  --pp-hdr-h:  clamp(58px, 7vw, 74px);
  /* Centers content at --pp-maxw via padding on a full-bleed section, so a
     section's background runs edge to edge while its content stays in the
     same column as every other section — no nested "wrap" div. */
  --pp-section-pad: max(var(--pp-gutter), calc((100% - var(--pp-maxw)) / 2 + var(--pp-gutter)));

  --pp-r-pill: 999px;
  --pp-r-card: 11px;

  --pp-ease:  cubic-bezier(.22, 1, .36, 1);
  --pp-t-med: .25s;

  position: relative;
  background: var(--pp-bone);
  color: var(--pp-ink);
  font-family: "Poppins", "Helvetica Neue", Helvetica, sans-serif;
  font-size: 16px;
  font-weight: 400;
  line-height: normal;
  text-wrap: pretty;
  -webkit-font-smoothing: antialiased;
  overflow-x: clip;
}


/* ==========================================================================
   02  BASE RESETS (scoped)
   ========================================================================== */

.pp-functional-zoning,
.pp-functional-zoning *,
.pp-functional-zoning *::before,
.pp-functional-zoning *::after {
  box-sizing: border-box;
}

/* Headings/paragraphs take the page typeface rather than any theme heading
   font, and the source's own zeroed default margins (every real margin is
   re-asserted per component below). */
.pp-functional-zoning h1,
.pp-functional-zoning h2,
.pp-functional-zoning h3,
.pp-functional-zoning p {
  margin: 0;
  font-family: inherit;
  line-height: normal;
}
/* The site theme balances every heading (text-wrap: balance) and lets text break anywhere (overflow-wrap: break-word, hyphens: none); the
   design inherits `text-wrap: pretty` from the page, so line breaks differ without this. */
.pp-functional-zoning :is(h1, h2, h3, p, .wp-block-heading, input) { text-wrap: pretty; overflow-wrap: normal; hyphens: manual; }
/* Chips, region labels and the guide link are <span>s in the design but <p> blocks here; a <p> carries the browser's `unicode-bidi: isolate`,
   which places the first glyphs of a run a sub-pixel differently. Same as a span: */
.pp-functional-zoning :is(.pp-chip, .pp-card__region, .pp-card__go) { unicode-bidi: normal; }
.pp-functional-zoning a { color: var(--pp-ink); text-decoration: none; }
.pp-functional-zoning a:hover { color: var(--pp-accent); }
.pp-functional-zoning em { font-style: normal; color: var(--pp-accent); }

/* Keyboard focus — never removed, only restyled (matches the source). */
.pp-functional-zoning :focus-visible {
  outline: 2px solid var(--pp-accent);
  outline-offset: 3px;
}


/* ==========================================================================
   03  FLOW-LAYOUT MARGIN NEUTRALIZATION
   --------------------------------------------------------------------------
   Every group below is a plain core/group with no explicit `layout`
   attribute in content.html, left that way so each stays a normal, fully
   editable Gutenberg container. WordPress's default "Flow" layout generates
   `<selector> > * + * { margin-block-start: <blockGap> }` on any such group
   with 2+ children, from the active theme's own spacing.blockGap global
   style — regardless of whether this Page Pack ever asked for a gap. That
   silently shifts later siblings of any group that positions its own
   children with CSS grid/flex (the city-card grid, the chip rows, the CTA
   row), opens a white strip between the page's full-bleed bands (the root
   group's own children: hero, city section, CTA), and would replace this
   design's exact internal spacing with a theme-dependent value. Confirmed mechanism — see
   docs/HOMEPAGE-WORDPRESS-FLOW-MARGIN-FIX-HANDOFF.md and
   docs/MYCABIN-GUTENBERG-REFERENCE-IMPLEMENTATION.md §5.

   Scoped narrowly to exactly these components' own direct children — never
   a sitewide reset. `!important` matches the fact that WordPress's own
   generated rule carries normal specificity with no :where() wrapper. Each
   component then re-asserts its real, source-matched spacing explicitly in
   §05–§07 (also with !important, at higher specificity), so nothing depends
   on the theme's blockGap value.

   core/buttons (.pp-regions, .pp-cta__btns) are *flex* layouts: their
   spacing comes from a `gap` shorthand, not a margin — a different
   mechanism (docs/CLAUDE-DESIGN-TO-GUTENBERG-MASTER-WORKFLOW.md §7.2). Both
   axes of `gap` are therefore set explicitly on those two containers below.
   ========================================================================== */

.pp-functional-zoning > *,
.pp-functional-zoning .pp-hero > *,
.pp-functional-zoning .pp-hero__text > *,
.pp-functional-zoning .pp-finder > *,
.pp-functional-zoning .pp-regions > *,
.pp-functional-zoning .pp-cities > *,
.pp-functional-zoning .pp-grid > *,
.pp-functional-zoning .pp-card > *,
.pp-functional-zoning .pp-chips > *,
.pp-functional-zoning .pp-cta > *,
.pp-functional-zoning .pp-cta__copy > *,
.pp-functional-zoning .pp-cta__btns > * {
  margin-block-start: 0 !important;
  margin-block-end: 0 !important;
}


/* ==========================================================================
   04  SECTION SHELL, EYEBROW, SCROLL REVEAL
   Each band is a full-bleed core/group (its background colour and, where a
   MyCabin preset fits, its vertical padding are native block attributes);
   horizontal padding centres the content at --pp-maxw. The selector carries
   .wp-block-group too so it reliably out-ranks core's own
   `.wp-block-group.has-background { padding: 1.25em 2.375em }`.
   ========================================================================== */

.pp-functional-zoning .wp-block-group.pp-hero,
.pp-functional-zoning .wp-block-group.pp-cities,
.pp-functional-zoning .wp-block-group.pp-cta {
  padding-inline: var(--pp-section-pad);
}

.pp-functional-zoning .pp-eyebrow {
  font-size: 11px;
  font-weight: 400;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--pp-ink-56);
}

/* Scroll reveal — fade up once, the first time a block is scrolled into
   view. Toggled by the IntersectionObserver in frontend.js; .pp-in-view is
   the only state it ever adds, never removed, so a reveal never re-triggers.
   editor.css settles this to its final visible state inside Gutenberg,
   since frontend.js never runs there. */
.pp-functional-zoning .pp-io-fade {
  opacity: 0;
  transform: translateY(24px) scale(.97);
  transition: opacity .8s var(--pp-ease), transform .8s var(--pp-ease);
}
.pp-functional-zoning .pp-io-fade.pp-in-view { opacity: 1; transform: none; }


/* ==========================================================================
   05  HERO + CITY FINDER
   Plain text hero on a flat surface-colour band, no photo. Top padding
   clears the fixed global header; the title/lead are capped for
   readability, the finder row runs the page's normal full width.
   ========================================================================== */

.pp-functional-zoning .wp-block-group.pp-hero {
  padding-top: calc(var(--pp-hdr-h) + clamp(28px, 6vw, 48px));
  padding-bottom: clamp(32px, 5vw, 48px);
  background-color: var(--pp-surface);
}

.pp-functional-zoning .pp-hero__text { max-width: 640px; }
.pp-functional-zoning .pp-hero__text > .pp-hero__title { margin-block-start: 10px !important; }
.pp-functional-zoning .pp-hero__text > .pp-hero__lead  { margin-block-start: 14px !important; }

.pp-functional-zoning .pp-hero__title {
  max-width: 22ch;
  font-size: clamp(34px, 8.6vw, 46px);
  line-height: 1.06;
  letter-spacing: -.026em;
  font-weight: 500;
  color: var(--pp-ink);
}
.pp-functional-zoning .pp-hero__lead {
  line-height: 1.55;
  color: var(--pp-ink-72);
  font-weight: 300;
}

/* Finder: search field + region pills. Stacked on mobile, one wrapping row
   on desktop (§08). */
.pp-functional-zoning .pp-hero > .pp-finder { margin-block-start: clamp(22px, 3vw, 32px) !important; }
.pp-functional-zoning .pp-finder {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 12px;
}

/* In the block editor a Custom HTML block is wrapped in its own element; that wrapper takes the search field's flex role (live page: the .pp-search itself). */
.pp-functional-zoning .pp-finder > :is(.pp-search, .wp-block-html) { position: relative; width: 100%; }
.pp-functional-zoning .pp-search { position: relative; width: 100%; }
.pp-functional-zoning .pp-search svg {
  position: absolute;
  left: 15px;
  top: 50%;
  transform: translateY(-50%);
  color: var(--pp-ink-56);
  pointer-events: none;
}
.pp-functional-zoning .pp-search .pp-search__input {
  display: block;
  width: 100%;
  height: 44px;
  margin: 0;
  padding: 0 16px 0 42px;
  border-radius: var(--pp-r-pill);
  border: 1px solid var(--pp-ink-line);
  background: var(--pp-bone);
  box-shadow: none;
  font: inherit;
  font-size: 15px;
  line-height: normal;
  color: var(--pp-ink);
  outline: none;
  appearance: none;
  -webkit-appearance: none;
  transition: border-color var(--pp-t-med), box-shadow var(--pp-t-med);
}
.pp-functional-zoning .pp-search .pp-search__input::placeholder { color: var(--pp-ink-56); font-weight: 300; opacity: 1; }
.pp-functional-zoning .pp-search .pp-search__input:focus {
  border-color: var(--pp-accent);
  box-shadow: 0 0 0 3px var(--pp-tint);
}
.pp-functional-zoning .pp-search .pp-search__input::-webkit-search-cancel-button { -webkit-appearance: none; }

/* Region pills — a native core/buttons row. The container is a flex layout,
   so WordPress writes its own `gap` here; both axes are set explicitly to
   the source's 8px. */
.pp-functional-zoning .pp-regions {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-start;
  align-items: center;
  gap: 8px;
  margin: 0;
}
.pp-functional-zoning .pp-tab .wp-block-button__link.wp-element-button {
  position: relative;
  text-align: center;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: 30px;
  padding: 0 14px;
  border: 1px solid var(--pp-ink-line);
  border-radius: var(--pp-r-pill);
  background: var(--pp-bone);
  color: var(--pp-ink);
  font-size: 14px;
  font-weight: 500;
  line-height: normal;
  white-space: nowrap;
  text-decoration: none;
  cursor: pointer;
  transition: background var(--pp-t-med), color var(--pp-t-med), border-color var(--pp-t-med);
}
.pp-functional-zoning .pp-tab .wp-block-button__link.wp-element-button:hover {
  background: var(--pp-bone);
  color: var(--pp-ink);
}
.pp-functional-zoning .pp-tab--active .wp-block-button__link.wp-element-button,
.pp-functional-zoning .pp-tab--active .wp-block-button__link.wp-element-button:hover {
  background: var(--pp-ink);
  border-color: var(--pp-ink);
  color: var(--pp-bone);
}

/* Touch targets — the compact pills/buttons are under the 44px a fingertip
   wants; this invisible overlay restores a 44px tap area on touch screens
   without changing anything you can see (same technique as the source). */
@media (hover: none) and (pointer: coarse) {
  .pp-functional-zoning .pp-tab .wp-block-button__link::before,
  .pp-functional-zoning .pp-cta .wp-block-button__link::before {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    top: 50%;
    height: 44px;
    transform: translateY(-50%);
  }
}


/* ==========================================================================
   06  CITY GUIDE GRID + CARDS
   13 identical cards (CSS grid of native core/group blocks). Card radius,
   border, typography and chip styling are shared across all 13 instances,
   so they stay in this one class rather than 13 separate block attributes.
   ========================================================================== */

.pp-functional-zoning .wp-block-group.pp-cities {
  padding-top: clamp(36px, 6vw, 64px);
  /* padding-bottom is the native "Section — Compact" preset (block attr) */
  background-color: var(--pp-bone);
  scroll-margin-top: calc(var(--pp-hdr-h) + 8px);
}
.pp-functional-zoning .pp-cities > .pp-cities__title { margin-block-start: 10px !important; }
.pp-functional-zoning .pp-cities > .pp-cities__sub   { margin-block-start: 12px !important; }
.pp-functional-zoning .pp-cities > .pp-grid          { margin-block-start: clamp(24px, 4vw, 40px) !important; }
.pp-functional-zoning .pp-cities > .pp-nohit         { margin-block-start: 26px !important; }

.pp-functional-zoning .pp-cities__title {
  max-width: 24ch;
  font-size: clamp(26px, 4.6vw, 40px);
  line-height: 1.08;
  letter-spacing: -.022em;
  font-weight: 500;
  color: var(--pp-ink);
}
.pp-functional-zoning .pp-cities__sub {
  max-width: 52ch;
  font-size: 15px;
  line-height: 1.6;
  font-weight: 300;
  color: var(--pp-ink-72);
}

.pp-functional-zoning .pp-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 14px;
}

.pp-functional-zoning .pp-card {
  display: flex;
  flex-direction: column;
  padding: 20px;
  background: var(--pp-bone);
  border: 1px solid var(--pp-stone);
  border-radius: var(--pp-r-card);
  transition: border-color var(--pp-t-med), box-shadow var(--pp-t-med), transform var(--pp-t-med);
}
/* In the design the whole card is one <a>, so keyboard focus rings the entire card (the site's global :focus-visible).
   Here the card is a group with one real link; the ring is drawn on the card while that link has keyboard focus. */
.pp-functional-zoning .pp-card:has(.pp-card__go a:focus-visible) {
  outline: 2px solid var(--pp-accent);
  outline-offset: 3px;
}
.pp-functional-zoning .pp-card__go a:focus-visible { outline: none; }
/* .pp-card's own display:flex (an author rule) otherwise overrides the
   browser's default [hidden]{display:none} once frontend.js filters a card
   out. */
.pp-functional-zoning .pp-card[hidden] { display: none; }
.pp-functional-zoning .pp-card.pp-is-clickable { cursor: pointer; }

.pp-functional-zoning .pp-card__region {
  font-size: 10.5px;
  letter-spacing: .16em;
  text-transform: uppercase;
  font-weight: 500;
  color: var(--pp-accent);
}
.pp-functional-zoning .pp-card > .pp-card__title { margin-block-start: 9px !important; }
.pp-functional-zoning .pp-card__title {
  font-size: clamp(20px, 2.4vw, 23px);
  font-weight: 500;
  letter-spacing: -.018em;
  line-height: 1.15;
  color: var(--pp-ink);
}
.pp-functional-zoning .pp-card > .pp-card__one { margin-block-start: 9px !important; }
.pp-functional-zoning .pp-card__one {
  font-size: 14.5px;
  line-height: 1.55;
  font-weight: 300;
  color: var(--pp-ink-72);
}

.pp-functional-zoning .pp-card > .pp-chips { margin-block-start: 16px !important; }
.pp-functional-zoning .pp-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 7px;
  min-width: 0;
}
/* The source's closing overflow-protection block lets a chip wrap instead of
   forcing a card wider (white-space: normal; height: auto; min-height: 27px;
   padding-block: 3px; max-width: 100%) — on every real viewport the chips fit
   on one line at exactly 27px, but a very narrow card now grows gracefully. */
.pp-functional-zoning .pp-chip {
  display: inline-flex;
  align-items: center;
  max-width: 100%;
  height: auto;
  min-height: 27px;
  padding: 3px 11px;
  border-radius: var(--pp-r-pill);
  font-size: 12.5px;
  line-height: normal;
  white-space: normal;
}
.pp-functional-zoning .pp-chip--fee   { background: var(--pp-tint); color: var(--pp-ink); }
.pp-functional-zoning .pp-chip--note  { border: 1px solid var(--pp-ink-line); color: var(--pp-ink-56); }
.pp-functional-zoning .pp-chip--olive { background: color-mix(in oklab, var(--pp-olive) 12%, var(--pp-bone)); color: var(--pp-olive); }

/* "Lasīt ceļvedi →" — a real, editable link; the arrow is a CSS mask so no
   inline SVG has to live inside editable text. Pinned to the card's bottom
   edge so all cards in a grid row end on the same line. */
.pp-functional-zoning .pp-card > .pp-card__go { margin-block-start: auto !important; }
.pp-functional-zoning .pp-card__go {
  display: flex;
  align-items: center;
  padding-top: 20px;
}
.pp-functional-zoning .pp-card__go a {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  font-size: 15px;
  font-weight: 500;
  line-height: normal;
  color: var(--pp-ink);
  text-decoration: none;
  transition: color var(--pp-t-med);
}
.pp-functional-zoning .pp-card__go a::after {
  content: "";
  flex: 0 0 auto;
  width: 15px;
  height: 15px;
  background-color: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M2 8h11M9 4l4 4-4 4' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / 100% 100% no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M2 8h11M9 4l4 4-4 4' fill='none' stroke='%23000' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center / 100% 100% no-repeat;
  transition: transform var(--pp-t-med);
}

/* Empty-state message — hidden until frontend.js finds zero matching cards.
   editor.css shows it statically so it stays editable. */
.pp-functional-zoning .pp-nohit {
  display: none;
  font-size: 15.5px;
  font-weight: 300;
  color: var(--pp-ink-56);
}
.pp-functional-zoning .pp-nohit.pp-is-visible { display: block; }

@media (hover: hover) {
  .pp-functional-zoning .pp-card:hover {
    border-color: var(--pp-accent-soft);
    box-shadow: 0 14px 34px -18px color-mix(in oklab, var(--pp-ink) 30%, transparent);
    transform: translateY(-3px);
  }
  /* The source wraps each card in a single <a>, so its own :hover colour
     reaches the card title as well as the link — reproduced here. */
  .pp-functional-zoning .pp-card:hover .pp-card__title { color: var(--pp-accent); }
  .pp-functional-zoning .pp-card:hover .pp-card__go a { color: var(--pp-accent); }
  .pp-functional-zoning .pp-card:hover .pp-card__go a::after { transform: translateX(4px); }
}


/* ==========================================================================
   07  CLOSING DARK CTA
   Full-width ink band: copy left, two buttons right (stacked, full width on
   mobile). Background colour, white heading, both buttons' base colours and
   the vertical padding ("Section — Compact") are native block attributes;
   only what a block attribute cannot express (translucent ghost fill,
   hairline border, hover states) lives here.
   ========================================================================== */

.pp-functional-zoning .wp-block-group.pp-cta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 28px;
}
.pp-functional-zoning .pp-cta__copy {
  display: flex;
  flex-direction: column;
  gap: 12px;
  flex: 1 1 300px;
  min-width: 0;
}
.pp-functional-zoning .pp-cta__title {
  font-size: clamp(25px, 7vw, 42px);
  line-height: 1.16;
  letter-spacing: -.03em;
  font-weight: 500;
}
.pp-functional-zoning .pp-cta__text {
  font-size: clamp(13px, 2.8vw, 15px);
  line-height: 1.65;
  font-weight: 300;
  color: var(--pp-bone-60);
}
/* In the source the closing band's `p` rule out-ranks .eyebrow--soft, so the
   eyebrow renders at body-copy size and colour (letter-spacing + uppercase
   still come from .eyebrow). Reproduced as rendered — see manifest notes. */
.pp-functional-zoning .pp-cta .pp-eyebrow {
  font-size: clamp(13px, 2.8vw, 15px);
  line-height: 1.65;
  font-weight: 300;
  color: var(--pp-bone-60);
}

.pp-functional-zoning .pp-cta .pp-cta__btns {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  justify-content: flex-start;
  gap: 10px;
  width: 100%;
  margin: 0;
}
.pp-functional-zoning .pp-cta .pp-cta__btns .wp-block-button { width: 100%; margin: 0; }
.pp-functional-zoning .pp-btn--48 .wp-block-button__link.wp-element-button {
  position: relative;
  text-align: start;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  width: 100%;
  height: 38px;
  padding: 0 19px;
  border: 0;
  border-radius: var(--pp-r-pill);
  font-size: 15px;
  font-weight: 500;
  line-height: normal;
  white-space: nowrap;
  text-decoration: none;
  cursor: pointer;
  transform: scale(1);
  transition: background var(--pp-t-med), color var(--pp-t-med), border-color var(--pp-t-med), transform .15s var(--pp-ease);
}
.pp-functional-zoning .pp-btn--48 .wp-block-button__link:active { transform: scale(.96); }

/* Base fill/text colours are native colour attributes (inline style), so
   :hover needs !important — an inline style otherwise always beats a
   class-based :hover rule regardless of specificity. */
.pp-functional-zoning .pp-btn-light .wp-block-button__link:hover {
  background-color: var(--pp-accent-soft) !important;
  color: var(--pp-ink) !important;
}
.pp-functional-zoning .pp-btn-ghost .wp-block-button__link.wp-element-button {
  background: color-mix(in oklab, var(--pp-scrim) 30%, transparent);
  border: 1px solid var(--pp-bone-60);
}
.pp-functional-zoning .pp-btn-ghost .wp-block-button__link.wp-element-button:hover {
  background: color-mix(in oklab, var(--pp-bone) 14%, transparent);
  border-color: var(--pp-bone);
  color: var(--pp-bone) !important;
}


/* ==========================================================================
   08  RESPONSIVE LAYERS
   The source's own cuts: a 2-column grid from 640px, and its single desktop
   layer at 900px (finder becomes one row, 3-column grid, CTA buttons side
   by side). These are the source's breakpoints, not Gutenberg's 782px.
   ========================================================================== */

@media (min-width: 640px) {
  .pp-functional-zoning .pp-grid { grid-template-columns: repeat(2, 1fr); gap: 16px; }
  .pp-functional-zoning .pp-card { padding: 24px; }
}

@media (min-width: 900px) {
  .pp-functional-zoning .pp-finder {
    flex-direction: row;
    align-items: center;
    flex-wrap: wrap;
    gap: 14px;
  }
  .pp-functional-zoning .pp-finder > :is(.pp-search, .wp-block-html) { flex: 0 1 340px; width: auto; }
  .pp-functional-zoning .pp-search { width: 100%; }

  .pp-functional-zoning .pp-grid { grid-template-columns: repeat(3, 1fr); gap: 20px; }
  .pp-functional-zoning .pp-card { padding: 26px; }

  /* Grid, not flex — 1fr 1fr sizes both columns to match whichever button's
     label is longer, so the pair stays equal-width. */
  .pp-functional-zoning .pp-cta .pp-cta__btns {
    display: grid;
    grid-template-columns: 1fr 1fr;
    width: auto;
  }
}


/* ==========================================================================
   09  REDUCED MOTION
   ========================================================================== */

@media (prefers-reduced-motion: reduce) {
  .pp-functional-zoning,
  .pp-functional-zoning *,
  .pp-functional-zoning *::before,
  .pp-functional-zoning *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
  }
  .pp-functional-zoning .pp-card:hover { transform: none; }
  .pp-functional-zoning .pp-card:hover .pp-card__go a::after { transform: none; }
}
