/* Powershift header — v5, the glass bar back on its own terms (Wayne, 16 Oct 2026).

   THE SHAPE HAS MOVED FOUR TIMES. This file is the fourth, and it is v2's bar again — the
   floating capped-width sheet of glass with a text toggle at each end — with five changes and
   nothing else. The two shapes in between were built, looked at, and dropped:

     v3  no bar at all: two glass chips at the rail's edges, a hero lockup that left on scroll.
         Rejected the day it was built ("this is what we asked for but no one likes it").
     v4  a full-bleed bar with the lockup in it and brand-coloured buttons. Also dropped: a
         full-width bar stopped reading as an object, and keeping it over the open sheet put
         glass on glass, which flattens both.

   WHAT v5 CHANGES AGAINST v2, and it is only this:

     1 · PINNED TO THE TOP of the browser — no top margin. The bar's side insets and its width
         are v2's, untouched; only the gap above it is gone.
     2 · NOTCHES AT BOTTOM-LEFT AND BOTTOM-RIGHT. v2 cut top-left + bottom-right; v1 cut both
         bottom corners, which is where this returns to.
     3 · The open menu is the FULL-SCREEN SHEET (v3's): the whole viewport, square, the menu
         list in two columns and the social row, and nothing else.
     4 · WHILE THE SHEET IS OPEN THE BAR ITSELF IS GONE. Its glass, its stroke and its shadow
         all switch off and only the Menu-turned-Close, Hire now and the lockup stay, each
         exactly where it sits on the bar. Glass over glass reads as neither.
     5 · The contact region is out of the sheet — social only. Gated, not deleted; see
         blocks/header-contact/render.php.

   Everything else here is v2's, including the two text toggles, the 40px lockup and the 78px
   row. There is no JavaScript in this header: assets/js/header-glass.js went when the sheet
   stopped being part of the bar (nothing left to measure), and v3's header-logo.js went with
   v3. The lockup's animated build still plays once on load, from inside the SVG.

   COLOUR LIVES IN assets/css/glass.css, not here. .pwr-header carries `.pwr-glass-dark` or
   `.pwr-glass-light`, set by `pwr/header_scheme` in functions.php, and this file names no
   preset colour at all — only tokens. Read that file before changing any colour here.

   Structure, outside in:
     .pwr-header            pinned by the template part; its ::before IS the open sheet's glass
       .pwr-header__frame   the floating box: width, and the two painted glass layers
         .pwr-header__cast  the shadow — a blurred strip tucked under the bar
           .pwr-header__bar   the content layer (no paint of its own; see trap 1)
             .pwr-header__rail  → .pwr-header__row  → menu · logo · CTA
   The sheet is core's overlay, now the whole viewport, and it opens UNDER the bar's contents. */

/* ══════════════════════════════════════════════════════════════════════════════════════
   FIVE TRAPS (v2 §2, plus two found since). Each fails SILENTLY: the page still
   renders, the glass just isn't glass. Read these before changing anything above the tokens.

   1 · `filter` OR `backdrop-filter` ON AN ANCESTOR KILLS `backdrop-filter`.
       Both make an element a "backdrop root", so a descendant's backdrop-filter samples only
       inside that ancestor and collapses to a flat tint. This is why there is no
       `filter: drop-shadow()` anywhere on the header, and why a chip gets no cast: the drop
       shadow would switch off the chip's own glass.

       It also decides WHERE each layer lives. The sheet's glass is `.pwr-header::before` — a
       pseudo-element, so it is a SIBLING of the open panel in the box tree, not an ancestor,
       and the panel's contents are not sampled into it. A chip paints the same way one level
       down: the chip's own background is the stroke and its ::before is the glass, and the
       chip is a sibling of the overlay, never a parent of it.

   2 · `clip-path` LEAVES THE CHAMFER DIAGONALS UNSTROKED.
       `box-shadow: inset 0 0 0 1px` follows the border box, so on a chamfered element the two
       diagonals get no line and the notches read as holes. The fix is two stacked chamfered
       layers: the outer one is the stroke colour, the inner one is inset 1px and clipped 1px
       tighter. The inner layer's backdrop-filter samples the outer's translucent white too,
       which is why the fill reads slightly lighter than its stated value — that is accounted
       for. On a chip the outer layer is the element's own background and the inner is its
       ::before at `z-index: -1`, which paints after the background and before the label.

   3 · GLASS NEEDS SOMETHING BEHIND IT.
       Over a flat page the blur has nothing to do and a chip reads as a plain tint. On page
       types that open on a flat light ground, `body.pwr-header-flat` raises the fill (see
       functions.php and glass.css). Browsers without backdrop-filter get the same via
       @supports at the end of glass.css.

   4 · `backdrop-filter` IS INERT INSIDE CORE'S OVERLAY — and v3 is why that stopped mattering.
       Declared anywhere inside `.wp-block-navigation__responsive-container.is-menu-open` it
       computes correctly and blurs NOTHING: measured 2.5% edge-softening against blur switched
       off, i.e. none. Eliminated individually: ancestor filter / backdrop-filter / opacity
       (there are none), the chamfer clip-paths, the container's identity transform, the nested
       stacking contexts, the header's fixed positioning, the `overflow: hidden` core puts on
       <html> via `has-modal-open`, and moving the glass to a pseudo or to an injected div.
       Every one: still 0–2%. The same recipe OUTSIDE the overlay measures 50–82% on the same
       page with the menu open. It is the overlay SUBTREE, nothing else.

       v2 worked around it by stretching the bar's own glass down over the open panel, which
       needed the panel's height published from JavaScript (assets/js/header-glass.js, now
       deleted). The sheet is the viewport, so `.pwr-header::before` can be `position: fixed;
       inset: 0` and no measurement is needed. DO NOT move the sheet's glass back inside the
       overlay to "simplify" it — it will render flat.

   5 · INSIDE THIS FIXED HEADER, ONLY A FIXED BOX GETS A BACKDROP.
       Measured 15 Oct 2026, Chromium, over the front page's photographic hero, while building
       v3's chips — and it is why THE BAR'S TWO LAYERS ARE `position: fixed` rather than
       absolutely positioned inside the frame:

         · `backdrop-filter` on an absolutely-positioned layer anywhere inside the fixed
           header, while that layer lies within the header's own box, blurs NOTHING. Tried and
           failed: on the element, on its ::before, on a real injected <span>, at `z-index: -1`
           and `0`, with and without clip-path on either, with `will-change: backdrop-filter`,
           with `translateZ(0)`, with `isolation: isolate`, with the radius dropped to 12px,
           and with every stacking context between it and the header flattened one at a time.
         · the SAME element blurs correctly once it is positioned outside the header's box, and
           a `position: fixed` box blurs correctly at the very same coordinates inside it.

       So: anything in this header that has to blur is `position: fixed`. That costs nothing
       here — the bar is pinned to the top of the viewport and the sheet is the viewport — but
       it is not optional, and "tidying" either layer back to `absolute` will quietly flatten
       the glass.
   ══════════════════════════════════════════════════════════════════════════════════════ */

/* ── tokens ──
   COLOUR IS NOT HERE — see the note above. Geometry only.

   The bar and the sheet carry DIFFERENT densities, which is v2's one deviation from its own
   handoff and still correct: `--pwr-glass-fill` is the bar, three short labels over whatever
   the page opens on; `--pwr-glass-fill-panel` is the sheet, a screen of type over the same.
   The two are never on screen together — the bar's glass switches off while the sheet is open
   (change 4), so there is still exactly one density visible at a time. */
:root {
	/* The bar's chamfer is its own size, not --wp--custom--chamfer (22px): the handoff
	   specifies 26px with the inner layer at 25px, and the 1px difference IS the stroke. */
	--pwr-chamfer: 26px;
	--pwr-chamfer-in: 25px;

	/* The bar row. ONE VALUE AT EVERY WIDTH, and that is measured rather than chosen: v2 wrote
	   66px and 62px into its two breakpoints and the bar rendered 78px anyway at 360, 390, 480,
	   639, 640, 768, 900, 1024, 1440 and 1920 — the CTA link's own box sets a floor the row
	   cannot go under, so the smaller values never reached the screen. v2's own note records
	   the symptom ("the bar stopped changing size at breakpoints") without the cause, and the
	   three per-breakpoint clearances it replaced were each 8–28px short because of it.

	   So the token now says what actually renders. Everything that has to line up with the bar
	   reads it — the sheet's top padding, the close button's height, the phone squares' offset
	   — and they are correct at every width for the first time. */
	--pwr-row-h: 78px;

	/* --pwr-bar-h is the distance from the top of the viewport to the BOTTOM of the bar — what
	   a band underneath has to clear. v2's was 102px because the bar floated 24px down; pinned
	   to the top (change 1), it is exactly the row. */
	--pwr-bar-h: var(--pwr-row-h);
	--pwr-bar-inset: var(--wp--preset--spacing--l);
	/* the row's inline padding: where a toggle's outer edge lands, and what the sheet's content
	   column has to match so the first menu label lines up under the Menu button */
	--pwr-row-pad: var(--wp--preset--spacing--l);
}

/* ══ pinning and clearance ══════════════════════════════════════════════════════════════
   Pinning lives on the TEMPLATE PART wrapper, not on .pwr-header: a sticky element can only
   travel inside its parent's box, and the template part is only as tall as the header — so
   sticking the inner element makes it scroll away with its parent. Fixed at all times: one
   geometry, always on screen.

   The transparent area either side of the floating bar must not eat clicks, so pointer events
   are off on the wrapper and back on for the frame — which covers the bar and everything on
   it. v3 proved how easily a transparent box across the top of a hero swallows a cover's own
   buttons. While the sheet is open the sheet itself takes the clicks, and it is inside the
   frame, so it is already covered. */
header.wp-block-template-part {
	position: fixed;
	inset: 0 0 auto 0;
	z-index: 100;
	pointer-events: none;
}
header.wp-block-template-part .pwr-header__frame { pointer-events: auto; }
.pwr-header__row .wp-block-navigation__responsive-container.is-menu-open { pointer-events: auto; }

/* EVERY template bleeds to the top of the browser so the header floats over it — nothing
   reserves space for it. Instead the first band carries top padding that clears the header at
   every breakpoint, from the token above. */

/* Skip pages whose first element is — or wraps — a full-bleed cover. A cover sizes itself
   and centres its content, so it should bleed to the browser top with the header floating over
   it. Without these `:has()` exclusions the rule lands on the post-content WRAPPER and
   pushes the cover down by the header's height.
   .pwr-b-srows is the series rows block (products index) and the series hero (range pages):
   a cover-shaped band that is not a core/cover, so :has() cannot see it. */
body:not(.home) main > .alignfull:first-child:not(.wp-block-cover):not(:has(> .wp-block-cover)):not(.pwr-b-srows),
body:not(.home) main > .wp-block-group:first-child:not(:has(> .wp-block-cover)) {
	padding-top: calc(var(--pwr-bar-h) + var(--wp--preset--spacing--l)) !important;
}
/* A top-of-page cover has room to spare on desktop, but on a phone its min-height box is
   short enough that the centred eyebrow lands under the header.

   The clearance goes on the cover's INNER CONTAINER, never on `main > :first-child`. On the
   front page that first child is the post-content wrapper, so padding there pushed the whole
   cover down the page and left a white gap above it with the header floating on nothing. The
   cover itself must keep bleeding to the top of the browser.

   No media query on purpose (2026-09-22). The trigger is a cover that is SHORT relative to its
   own content, and that is a function of viewport HEIGHT, not width: a 54vh cover on a
   1440x800 laptop is 432px, and once the heading wraps the centred block's top edge rises
   above the header. CSS cannot ask "is the content taller than the box", so it is
   unconditional. The cost is that cover text sits a little below true centre, which reads
   correctly anyway with a lockup floating over the top of the band. */
main > .wp-block-cover:first-child > .wp-block-cover__inner-container,
main > :first-child > .wp-block-cover:first-child > .wp-block-cover__inner-container {
	padding-top: var(--pwr-bar-h);
}

/* The products index and the range pages open on .pwr-b-srows — a cover-shaped band that is not
   a core/cover, so neither :has() nor the selectors above can see it. Same treatment, its own
   hook. */
main > .pwr-b-srows:first-child .pwr-b-srow__cover:first-of-type .pwr-b-srow__rail,
main > :first-child > .pwr-b-srows:first-child .pwr-b-srow__cover:first-of-type .pwr-b-srow__rail {
	padding-top: var(--pwr-bar-h);
}

/* ══ the bar ════════════════════════════════════════════════════════════════════════════
   v2's floating box, pinned to the top of the browser (change 1). Unpinned from the sides it
   is only a little wider than its own content rail, so on a big screen it reads as a floating
   bar rather than a stretched one, and it stops growing past ~1504px. Below that it falls back
   to the side inset. Centred either way. That width is v2's and is explicitly unchanged.

   The two layers are ABSOLUTE on the frame, which is where v2 had them and where the blur is
   known to work (measured 50% there, and again when this shape came back). Trap 5 is about
   layers deeper in the row — do not move these down there.

   `:root` prefix on purpose. WP's reset is `:root :where(.is-layout-flow) > :first-child
   { margin-block-start: 0 }` — 0,2,0 — so a doubled class only TIES and loses on order. */
:root .pwr-header .pwr-header__frame {
	position: relative;
	z-index: 0; /* a stacking context, so the cast can sit at -1 without escaping */
	margin: 0 auto;
	width: min(
		100% - var(--pwr-bar-inset) * 2,
		calc(var(--wp--style--global--wide-size, 1440px) + var(--wp--preset--spacing--l) * 2)
	);
}

/* WP's layout gap puts `margin-block-start` on .pwr-header__bar (the frame's second child,
   after the cast). With nothing to stop it the margin collapses straight out through the
   frame and the whole header sits lower than it asks for. Doubled class for 0,2,0. */
.pwr-header__frame.pwr-header__frame > * { margin-block-start: 0; }

/* layer 1 — the stroke. This IS the chamfer outline (trap 2); there is no border anywhere.
   BOTH BOTTOM CORNERS are cut (change 2). */
.pwr-header__frame::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: 0;
	background: var(--pwr-glass-stroke);
	clip-path: polygon(
		0 0, 100% 0,
		100% calc(100% - var(--pwr-chamfer)), calc(100% - var(--pwr-chamfer)) 100%,
		var(--pwr-chamfer) 100%, 0 calc(100% - var(--pwr-chamfer))
	);
}
/* layer 2 — the glass. Inset 1px and clipped 1px tighter, so layer 1 shows as a hairline on
   every edge INCLUDING the two diagonals — EXCEPT THE TOP, where it runs right to the edge.

   That exception is change 1 catching up with itself. While the bar floated, the 1px of stroke
   along its top was a hairline on an edge you could see. Pinned to the browser, that same 1px
   sits hard against the top of the screen with the page scrolling underneath it — and the
   stroke is translucent and does NOT blur, so it read as a 1px window of sharp photograph
   sliding along above the glass. There is no edge up there to outline any more: the glass
   covers it, and the `inset 0 1px 0` highlight below still draws the lit top line. */
.pwr-header__frame::after {
	content: "";
	position: absolute;
	inset: 0 1px 1px;
	z-index: 0;
	background: var(--pwr-glass-fill);
	-webkit-backdrop-filter: blur(var(--pwr-glass-blur)) saturate(1.3);
	backdrop-filter: blur(var(--pwr-glass-blur)) saturate(1.3);
	box-shadow: inset 0 1px 0 var(--pwr-glass-lit);
	clip-path: polygon(
		0 0, 100% 0,
		100% calc(100% - var(--pwr-chamfer-in)), calc(100% - var(--pwr-chamfer-in)) 100%,
		var(--pwr-chamfer-in) 100%, 0 calc(100% - var(--pwr-chamfer-in))
	);
}

/* the shadow — a blurred strip tucked UNDER the bar, never a drop-shadow (trap 1) */
.pwr-header__cast {
	position: absolute;
	left: 22px;
	right: 22px;
	bottom: -18px;
	height: 46px;
	z-index: -1;
	background: var(--pwr-glass-cast);
	filter: blur(17px);
	pointer-events: none;
}

/* ══ the bar is gone while the sheet is open (change 4) ═════════════════════════════════
   Glass over glass reads as neither, so the bar stops painting entirely the moment the menu
   opens: no fill, no stroke, no shadow. What stays is everything ON the bar — Menu (which
   core swaps for Close), Hire now and the lockup — each exactly where it was, so the sheet
   opens underneath them rather than replacing them. This is v2's rule, kept for a different
   reason: v2 switched the bar off because the panel took over painting the whole sheet. */
.pwr-header:has(.is-menu-open) .pwr-header__frame::before,
.pwr-header:has(.is-menu-open) .pwr-header__frame::after,
.pwr-header:has(.is-menu-open) .pwr-header__cast { display: none; }

/* the content layer. No paint of its own — it exists so the row sits above both glass layers,
   and so the sheet inside it is NOT a descendant of anything filtered or clipped. */
.pwr-header__bar {
	position: relative;
	z-index: 1;
	color: var(--pwr-glass-ink);
}

.pwr-header__rail {
	max-width: var(--wp--style--global--wide-size, 1440px);
	margin-inline: auto;
}

/* Three-slot GRID, not flex: the centre column is `auto` and the outer columns absorb
   everything, so the logo is optically centred and can never be compressed the way a nowrap
   flex row compressed it to zero width between 600 and 1140px. */
.pwr-header__row {
	display: grid;
	grid-template-columns: 1fr auto 1fr;
	align-items: center;
	column-gap: var(--wp--preset--spacing--s);
	min-height: var(--pwr-row-h);
	padding-inline: var(--pwr-row-pad);
}
/* Group block-gap puts margin-block-start on siblings; harmless in a stack, but in this grid
   it added 24px to the row and defeated the min-height. Doubled class because WP's rule is
   `:where(...) > :not(:first-child)` — also 0,1,0, and printed after this file. */
.pwr-header__row.pwr-header__row > * { margin-block: 0; }

/* Lockup and CTA are raised so the open sheet — also positioned, and earlier in the DOM —
   passes BEHIND them. The nav is deliberately not raised: the panel lives inside it, and
   raising the nav would carry the panel up over the lockup with it. */
.pwr-header-logo,
.pwr-header__cta { position: relative; z-index: 1; }

/* ── slot 1: the menu button (core/navigation's overlay opener) ── */
/* CHILD COMBINATOR, ALWAYS. core copies the block's className onto the inner <ul> as well as
   the <nav>, so `.pwr-header__nav` matches TWO elements: the nav in this row, and the menu list
   inside the open sheet. A bare class here reaches both — which is how a `grid-area` meant for
   this slot landed on the list and threw the social row above it on phones. */
.pwr-header__row > .pwr-header__nav {
	justify-self: start;
	/* core positions .wp-block-navigation, which would make it the panel's containing block
	   and size the panel to this narrow slot. The frame is the intended anchor. */
	position: static;
}
.pwr-header__row .wp-block-navigation__responsive-container-open {
	display: flex;
	align-items: center;
	gap: var(--wp--preset--spacing--s);
	min-height: 46px;
	padding: var(--wp--preset--spacing--s) 0;
	font-family: var(--wp--preset--font-family--red-hat-display);
	font-weight: 700;
	font-size: var(--wp--preset--font-size--m); /* a step up from s with the bigger logo (Website To-Do, 28 Oct: "make the words Menu and Hire now bigger") */
	letter-spacing: var(--wp--custom--tracking--normal);
	text-transform: uppercase;
	color: var(--pwr-glass-ink);
	transition: color var(--wp--custom--motion--fast) var(--wp--custom--motion--ease-standard);
}
/* Core sets `font-size: inherit` on these buttons with the class written three times (0,3,0),
   which beat the rule above, so the label only ever showed the nav's 14px. The size is restated
   at 0,4,0 for both buttons; it is the one property here core fights. */
.pwr-header__row .wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open,
.pwr-header__row .wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close.wp-block-navigation__responsive-container-close {
	font-size: var(--wp--preset--font-size--m);
}
.pwr-header__row .wp-block-navigation__responsive-container-open:hover { color: var(--pwr-glass-accent); }
/* core ships an SVG hamburger; the word earns its keep in a bar with no visible nav */
.pwr-header__row .wp-block-navigation__responsive-container-open::after { content: "Menu"; }
.pwr-header__row .wp-block-navigation__responsive-container-open svg { width: 22px; height: 22px; }

/* Open, the button's job is done — core's own close button takes its place in the slot, so
   the toggle stays core's behaviour and is not reimplemented. `visibility` rather than
   `display` keeps the grid slot's width, so the logo does not shift as the panel opens. */
.pwr-header:has(.is-menu-open) .wp-block-navigation__responsive-container-open { visibility: hidden; }

/* ── slot 2: the logo, dead centre ── */
.pwr-header-logo {
	justify-self: center;
	margin: 0;
	display: flex;
}
/* Desktop: as big as the 78px row allows (web catch-up, 23 Oct: "max it out, don't grow the
   bar"). The SVG's viewBox is 42.52 tall but the artwork is only 25.5 of it (8.5 → 34), so a
   76px image puts a ~46px wordmark in the bar with ~16px clear above and below, and the image
   box itself still fits inside the row. The breakpoints below step it back down. */
.pwr-header-logo img {
	display: block;
	height: 76px;
	width: auto;
}

/* The animated lockup ships with a STILL twin for `prefers-reduced-motion` (functions.php
   explains why the SVG's own rule cannot do this job through an <img>). Page-level CSS picks
   one, because the media query has to be evaluated in the document that knows the preference.
   Default is the animated copy; the still one is hidden and aria-hidden so the pair reads as
   one logo. Both are `display` toggles rather than opacity so only one occupies the slot. */
/* Qualified with `img` on purpose: `.pwr-header-logo img` above is 0,1,1 and a bare class is
   0,1,0, so an unqualified toggle LOSES and both lockups render side by side. */
.pwr-header-logo img.pwr-header-logo__still { display: none; }

@media (prefers-reduced-motion: reduce) {
	.pwr-header-logo img.pwr-header-logo__anim { display: none; }
	.pwr-header-logo img.pwr-header-logo__still { display: block; }
}

/* ── slot 3: the CTA ── */
/* A text link with the arrow, not a button (Wayne, 18 Sep 2026) — the same device as the
   card foot's "View series →" (`.pwr-b-textlink` in the content-model plugin), redrawn here
   rather than reused because that class colours itself in fixed brand oranges and this one
   has to follow the glass scheme like everything else on the bar. Type matches the Menu
   opener in slot 1 so the two ends of the row read as a pair; the 46px min-height keeps the
   tap target the button used to give. */
.pwr-header__cta {
	justify-self: end;
	margin: 0;
	line-height: 1;
}
.pwr-header__cta-link {
	display: inline-flex;
	align-items: center;
	min-height: 46px;
	padding: var(--wp--preset--spacing--s) 0;
	font-family: var(--wp--preset--font-family--red-hat-display);
	font-weight: 800;
	font-size: var(--wp--preset--font-size--m); /* a step up from s with the bigger logo (Website To-Do, 28 Oct: "make the words Menu and Hire now bigger") */
	letter-spacing: var(--wp--custom--tracking--normal);
	text-transform: uppercase;
	white-space: nowrap;
	text-decoration: none;
	color: var(--pwr-glass-ink);
	transition: color var(--wp--custom--motion--fast) var(--wp--custom--motion--ease-standard);
}
/* Its arrow is the shared one in assets/css/links.css, so it matches every text link. */
.pwr-header__cta-link:hover,
.pwr-header__cta-link:focus-visible { color: var(--pwr-glass-accent); }

/* ── Menu ORANGE, Hire now GREEN (30 Oct) ──
   Check-in with Claire and Meg: with the bigger logo the two words lost their weight. Buttons
   were tried the same day and Wayne turned them down — they stay TEXT LINKS, coloured: Menu in
   orange (the menu's own highlight colour), Hire now in green (go, and the logo's green). Each
   hovers to the deeper step of its OWN colour (14 Oct) — the arrow and hamburger follow,
   being currentColor. Doubled classes: the rules above are 0,3,0 on the opener and 0,2,0 on
   the link's hover. */
.pwr-header__row .wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open { color: var(--wp--preset--color--orange); }
.pwr-header__row .wp-block-navigation__responsive-container-open.wp-block-navigation__responsive-container-open:is(:hover, :focus-visible) { color: var(--wp--preset--color--orange-dark); }
.pwr-header__cta-link.pwr-header__cta-link { color: var(--wp--preset--color--green-light); }
.pwr-header__cta-link.pwr-header__cta-link:is(:hover, :focus-visible) { color: var(--wp--preset--color--green); }

/* ══ the sheet ══════════════════════════════════════════════════════════════════════════
   Core's overlay, restyled from its own full-screen white sheet into the full-screen GLASS
   sheet: square, no notches, no margin, edge to edge (Wayne, 15 Oct). The glass itself is
   painted by `.pwr-header::before` — see trap 4 for why it cannot be painted from inside.

   The pseudo is `position: fixed`, which works because nothing above it carries a transform or
   a filter (trap 1 keeps it that way). It paints before .pwr-header__frame in DOM order, both
   at `z-index: 0` in the template part's stacking context, so the sheet lands behind the chips
   and the lockup without either needing to be raised further. */
.pwr-header::before {
	content: "";
	position: fixed;
	inset: 0;
	z-index: 0;
	background: var(--pwr-glass-fill-panel);
	-webkit-backdrop-filter: blur(var(--pwr-glass-blur)) saturate(1.3);
	backdrop-filter: blur(var(--pwr-glass-blur)) saturate(1.3);
	opacity: 0;
	visibility: hidden;
	pointer-events: none;
	transition: opacity var(--wp--custom--motion--base) var(--wp--custom--motion--ease-standard),
	            visibility 0s linear var(--wp--custom--motion--base);
}
.pwr-header:has(.is-menu-open)::before {
	opacity: 1;
	visibility: visible;
	transition-delay: 0s, 0s;
}

/* Panel colours are set here rather than on the block's overlayBackgroundColor (those render
   as classes a stylesheet cannot beat cleanly). Core ships its own default overlay at FIVE
   classes — `.wp-block-navigation:not(.has-background) .wp-block-navigation__responsive-container.is-menu-open:not(.disable-default-overlay)`
   forcing #fff — so this is deliberately heavier than that. */
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open:not(.disable-default-overlay) {
	background: transparent;
	color: var(--pwr-glass-ink);
}
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open {
	/* FIXED, not absolute: in v2 the sheet was the bar's own box and had to be positioned
	   against the frame. In v3 the sheet is the viewport, which is also why nothing measures
	   its height any more. */
	position: fixed;
	inset: 0;
	z-index: 0;
	display: block;
	width: auto;
	height: auto;
	padding: 0;
	overflow: visible;
}
/* v2's three painted layers inside the overlay — the cast, the stroke on __responsive-close and
   the glass on __responsive-dialog — are all off: the sheet is square and painted from outside. */
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-close {
	position: relative;
	max-width: none;
	height: 100%;
	padding: 0;
	background: transparent;
	clip-path: none;
}
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-dialog {
	position: relative;
	z-index: 1;
	max-width: none;
	height: 100%;
	box-sizing: border-box;
	display: flex;
	flex-direction: column;
	margin: 0;
	/* the bar row's height: the sheet's content begins exactly where the bar's contents end,
	   which is what keeps Menu/Close, Hire now and the lockup readable on top of it */
	padding: var(--pwr-row-h) 0 0;
	background: transparent;
	-webkit-backdrop-filter: none;
	backdrop-filter: none;
	box-shadow: none;
	clip-path: none;
}

/* core's close button, moved into the bar's slot 1 so it lands exactly where the Menu button
   was — same type, same place, so the swap reads as the button changing its label. v2 could
   position it against the dialog, which carried the bar's own rail; the sheet is the whole
   viewport now, so the horizontal sum is written against the viewport instead: the bar's inset
   or its centred rail, plus the row's inline padding. The same expression the rail resolves to.
   Vertically it keeps v2's answer — the full row height, contents centred in it. */
.pwr-header__row .wp-block-navigation__responsive-container-close {
	position: absolute;
	top: 0;
	height: var(--pwr-row-h);
	left: calc(
		max(var(--pwr-bar-inset), (100vw - var(--wp--style--global--wide-size, 1440px)) / 2)
		+ var(--pwr-row-pad)
	);
	/* core sets `right: 0` on this button. Left alone, the button stretches the full width of
	   the row and swallows every click meant for the lockup or the Hire now button. */
	right: auto;
	width: max-content;
	align-items: center;
	gap: var(--wp--preset--spacing--s);
	padding: 0;
	color: var(--pwr-glass-accent);
	font-family: var(--wp--preset--font-family--red-hat-display);
	font-weight: 700;
	font-size: var(--wp--preset--font-size--m); /* a step up from s with the bigger logo (Website To-Do, 28 Oct: "make the words Menu and Hire now bigger") */
	letter-spacing: var(--wp--custom--tracking--normal);
	text-transform: uppercase;
	transition: color var(--wp--custom--motion--fast) var(--wp--custom--motion--ease-standard);
}
.pwr-header__row .wp-block-navigation__responsive-container-close { display: flex; }
.pwr-header__row .wp-block-navigation__responsive-container-close::after { content: "Close"; }
.pwr-header__row .wp-block-navigation__responsive-container-close svg { width: 22px; height: 22px; }
.pwr-header__row .wp-block-navigation__responsive-container-close:hover { color: var(--pwr-glass-accent-hi); }
.pwr-header__row .wp-block-navigation__responsive-container-close:hover { color: var(--pwr-glass-accent-hi); }

/* The sheet's content column. */
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content {
	/* One centred column (Wayne, 12 Oct): the menu list — itself two columns — and under it the
	   social row. Centred in the sheet vertically too; `safe` keeps a tall menu scrollable from
	   its top instead of centring it off-screen. */
	display: grid;
	grid-template-columns: minmax(0, var(--pwr-menu-w, 1040px));
	justify-content: center;
	align-content: safe center;
	row-gap: var(--wp--preset--spacing--xl);
	width: 100%;
	box-sizing: border-box;
	flex: 1;
	min-height: 0;
	max-width: var(--wp--style--global--wide-size, 1440px);
	margin-inline: auto;
	padding-block: var(--wp--preset--spacing--l) var(--wp--preset--spacing--xl);
	/* v2 drew a rule here to mark the bar's bottom edge. There is no bar to mark in v3, and on a
	   full-screen sheet the line floated in the middle of the screen — the list's own top rule
	   does the job. */
	/* The menu is client-managed and can grow, and on a phone the two columns stack — so the
	   sheet can outgrow the screen. Scroll the CONTENT, not the panel. */
	overflow-y: auto;
	overscroll-behavior: contain;
}

/* ── nav rows (left column) ──
   Selectors are deep on purpose: core's own open-overlay rules set the list to flex and let
   items shrink to their label width, which leaves the row rules and chevrons in mid-air. */
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container {
	grid-column: 1;
	display: block;
	width: 100%;
	gap: 0;
	/* Two columns, read down then across; labels left-aligned. The rule above spans both. */
	columns: 2;
	column-gap: var(--wp--preset--spacing--xl);
	/* No rule above the list and none under it (Wayne, 20 Oct: "top and bottom borders around
	   the menu need to go — the only lines are on the menu items"): each item draws its own. */
}
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item {
	display: block;
	width: 100%;
	break-inside: avoid;
	border-bottom: 1px solid var(--pwr-rule);
}
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content { width: 100%; }
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content {
	display: flex;
	/* theme.json gives core/navigation a 3px transparent bottom border that turns orange on
	   the current page — a horizontal-nav device with nothing to sit under in a list, and it
	   painted over this row's own 1px rule. The current page is marked by the orange left
	   edge below instead. */
	border-bottom: 0;
	align-items: center;
	justify-content: space-between;
	gap: var(--wp--preset--spacing--s);
	/* xxl, up from l (design review, 15 Oct: "increase link font size, especially at full-screen").
	   It steps down with the viewport below — xl under 1024, l on a phone. */
	min-height: 60px;
	padding-inline: 4px;
	font-weight: 800;
	font-size: var(--wp--preset--font-size--xxl);
	letter-spacing: var(--wp--custom--tracking--tight);
	text-transform: uppercase;
	text-decoration: none;
}
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content.wp-block-navigation-item__content {
	color: var(--pwr-glass-ink);
}
/* Two baked fills rather than a recoloured mask: `mask-image` on this file proved unreliable
   (v2 §3). */
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content::after {
	content: "";
	flex: none;
	width: 9px;
	height: 17px;
	/* Orange at rest, not grey (check-in, 30 Oct): the arrows are always orange, and hover
	   deepens them — so the hover now reads as a change of the same colour. */
	background: url("../images/shapes/arrow-single-orange.svg") center / contain no-repeat;
}
/* The label goes white → orange on hover; the arrow beside it goes orange → dark orange. */
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content.wp-block-navigation-item__content:hover { color: var(--pwr-glass-accent); }
/* The arrow hovers to the DARK orange (Wayne, 20 Oct); a third baked fill, since the mask
   route is out (v2 §3). */
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content:hover::after {
	background-image: url("../images/shapes/arrow-single-orange-dark.svg");
}
/* current page: the orange label alone. The 3px orange left edge it also had is gone
   (check-in, 30 Oct: "remove the vertical line on the selected page"). */
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .current-menu-item > .wp-block-navigation-item__content.wp-block-navigation-item__content,
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content.wp-block-navigation-item__content[aria-current="page"] {
	color: var(--pwr-glass-accent);
}
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .current-menu-item > .wp-block-navigation-item__content::after,
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content[aria-current="page"]::after {
	background-image: url("../images/shapes/arrow-single-orange.svg");
}
/* v1 put the four series pages in the right column; v2 §3 replaced them with contact, so a
   submenu — if the client ever adds one in the Site Editor — stays a plain indented list
   rather than claiming a column it no longer owns. */
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container {
	position: static;
	display: grid;
	gap: var(--wp--preset--spacing--s);
	opacity: 1;
	visibility: visible;
	width: auto;
	min-width: 0;
	background: transparent;
	border: 0;
	box-shadow: none;
	padding: var(--wp--preset--spacing--s) 0 var(--wp--preset--spacing--s);
}
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container .wp-block-navigation-item {
	border-bottom: 0;
	padding-left: var(--wp--preset--spacing--s);
	border-left: 3px solid var(--wp--preset--color--green-light);
}
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container .wp-block-navigation-item__content {
	min-height: 0;
	font-size: var(--wp--preset--font-size--m);
	font-weight: 700;
}
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__submenu-container .wp-block-navigation-item__content::after { content: none; }

/* ══ the contact region (v2 §3) ══════════════════════════════════════════════════════════
   The markup is injected into core's overlay by functions.php, so it is a plain grid cell
   here: column 2 of the same grid the menu list sits in column 1 of. It was positioned over
   the panel from outside at first — see the note on the filter for the two things that broke.
   In flow, the panel is sized by whichever column is taller and the two stack by themselves
   below 1024px, so there is no min-height to guess and nothing to keep in sync. */
/* The column now sits inside core/navigation, and theme.json styles that block site-wide:
   uppercase, 0.04em tracking, weight 700, plus a `& a{padding:6px 2px;border-bottom:3px solid
   transparent}` rule. All of it inherits down here and none of it is wanted — an uppercased
   email address and a 3px ghost border under every button. Reset once; each piece below
   states its own type. */
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .pwr-header__contact {
	grid-column: 1;
	text-transform: none;
	letter-spacing: normal;
	font-weight: 400;
	font-size: var(--wp--preset--font-size--m);
}
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .pwr-header__contact a { border-bottom: 0; }
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .pwr-header__phone,
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .pwr-header__email,
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .pwr-header__social a { padding: 0; }
/* the button keeps its own inline padding — a blanket `padding: 0` on the column's links
   collapsed it to the width of its label */
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .pwr-header__contact-btn { padding: 0 var(--wp--custom--button--pad-x); }
.pwr-header__contact-cols {
	/* The footer under the menu: Talk to us | Get in touch on the menu's own two columns and
	   column gap, so the contact lines up under the list. */
	display: grid;
	grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
	column-gap: var(--wp--preset--spacing--xl);
	row-gap: var(--wp--preset--spacing--m);
	padding-top: var(--wp--preset--spacing--l);
	border-top: 1px solid var(--pwr-rule);
}
.pwr-header__talk { display: grid; gap: var(--wp--preset--spacing--s); align-content: start; }
.pwr-header__touch { display: grid; gap: var(--wp--preset--spacing--m); align-content: start; justify-items: start; }

.pwr-header__eyebrow {
	margin: 0;
	font-family: var(--wp--preset--font-family--syncopate);
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 700;
	letter-spacing: var(--wp--custom--tracking--eyebrow);
	text-transform: uppercase;
	color: var(--pwr-glass-eyebrow);
}
.pwr-header__field { display: grid; gap: 4px; }
.pwr-header__flabel {
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 700;
	letter-spacing: var(--wp--custom--tracking--wide);
	text-transform: uppercase;
	color: var(--pwr-glass-ink-soft);
}
.pwr-header__phone,
.pwr-header__email { text-decoration: none; color: var(--pwr-glass-ink); }
/* the primary action for a hire enquiry, so it gets heading-scale type, not body (v2 §3) */
.pwr-header__phone { font-size: var(--wp--preset--font-size--l); font-weight: 800; }
/* AU and NZ, per v1 §2. The country tag is a fixed width so the two numbers align on their
   first digit rather than on the tag's own width. */
.pwr-header__tel {
	display: flex;
	align-items: baseline;
	gap: var(--wp--preset--spacing--s);
	margin: 0;
}
.pwr-header__cc {
	flex: none;
	width: 1.9em;
	font-size: var(--wp--preset--font-size--xs);
	font-weight: 700;
	letter-spacing: var(--wp--custom--tracking--wide);
	color: var(--pwr-glass-ink-soft);
}
/* NZ sits a step down: Australia is the primary market and the number above it is the one
   the panel is built around. */
.pwr-header__phone--alt { font-size: var(--wp--preset--font-size--m); font-weight: 700; }
.pwr-header__email { font-size: var(--wp--preset--font-size--m); font-weight: 400; word-break: break-word; }
.pwr-header__phone:hover,
.pwr-header__email:hover { color: var(--pwr-glass-accent); }
.pwr-header__address {
	margin: 0;
	font-weight: 300;
	color: var(--pwr-glass-ink);
}
.pwr-header__hours {
	margin: 0;
	font-size: var(--wp--preset--font-size--s);
	color: var(--pwr-glass-ink-soft);
}

/* Deliberately opaque: it is the one conversion control in the panel, and a translucent fill
   would lose it against the blur (v2 §3). */
.pwr-header__contact-btn {
	display: inline-flex;
	align-items: center;
	min-height: 46px;
	padding-inline: var(--wp--custom--button--pad-x);
	background: var(--pwr-glass-btn-bg);
	color: var(--pwr-glass-btn-ink);
	font-family: var(--wp--preset--font-family--red-hat-display);
	font-weight: 700;
	font-size: var(--wp--preset--font-size--s);
	letter-spacing: var(--wp--custom--tracking--normal);
	text-transform: uppercase;
	text-decoration: none;
	/* measured: it wraps to two lines without this, with zero slack at 22px padding */
	white-space: nowrap;
	clip-path: polygon(0 0, 100% 0, 100% calc(100% - 9px), calc(100% - 9px) 100%, 0 100%);
	transition: background var(--wp--custom--motion--fast) var(--wp--custom--motion--ease-standard),
	            color var(--wp--custom--motion--fast) var(--wp--custom--motion--ease-standard);
}
/* The hover is the brand button in both schemes — orange plate, Deep Grey label — so it is
   NOT a scheme token: it is the same two colours whichever ground the bar is on. */
.pwr-header__contact-btn:hover {
	background: var(--pwr-glass-accent);
	color: var(--wp--preset--color--contrast);
}

.pwr-header__social {
	display: flex;
	flex-wrap: wrap;
	gap: var(--wp--preset--spacing--s);
	margin: 0;
	padding: 0;
	list-style: none;
}
.pwr-header__social a {
	display: grid;
	place-items: center;
	/* No frame: the 1px squares came off in the 15 Oct design review ("centre the icons, remove
	   the square boxes"). The 64px box is the hit target; only the glyph is drawn. */
	box-sizing: border-box;
	width: 64px;
	height: 64px;
	border: 0;
	color: var(--pwr-glass-accent);
	transition: color var(--wp--custom--motion--fast) var(--wp--custom--motion--ease-standard);
}
/* the glyphs are authored fill="currentColor", so the mark takes the hover colour itself */
/* 48px, twice the 24 they were (Wayne, 20 Oct: "social icons double the size") */
.pwr-header__social svg { width: 48px; height: 48px; display: block; }
.pwr-header__social a:hover,
.pwr-header__social a:focus-visible {
	color: var(--pwr-glass-accent-hi);
}


/* ── the social row ──
   All that is left of the contact region in the sheet (Wayne, 15 Oct). The rest of that block
   still renders behind `pwr/header_contact_full` — see blocks/header-contact/render.php — and
   the styles for it are directly above, untouched, so turning the filter on restores the v2
   panel without any CSS work. */
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .pwr-header__contact--social {
	padding-top: var(--wp--preset--spacing--l);
	/* no rule here either — the lines belong to the menu items alone (Wayne, 20 Oct) */
}
/* centred under the two-column list (20 Oct web catch-up) */
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .pwr-header__contact--social .pwr-header__social {
	justify-content: center;
}

/* ══ breakpoints ════════════════════════════════════════════════════════════════════════
   Viewport media queries by design: the bar cannot container-query itself — an element never
   matches @container against its own size. v2's values, minus the two row heights it set and
   never got (see --pwr-row-h): what actually steps down is the inset, the row's padding, the
   logo and the chamfer. */
@media (max-width: 1023px) {
	:root {
		--pwr-bar-inset: var(--wp--preset--spacing--m);
		--pwr-row-pad: var(--wp--preset--spacing--m);
	}
	/* the desktop's old 40px (Wayne, 23 Oct: "logo on mobile can be the size it was on
	   desktop"), here and on phones below, so a tablet is never smaller than a phone */
	.pwr-header-logo img { height: 40px; }

	/* the sheet's menu labels: one step down from the desktop's xxl */
	.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content { font-size: var(--wp--preset--font-size--xl); }

	/* One column: the social row stacks under the menu list rather than beside it. */
	.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .pwr-header__contact { grid-column: 1; }
}

@media (max-width: 639px) {
	:root {
		--pwr-bar-inset: var(--wp--preset--spacing--s);
		--pwr-row-pad: var(--wp--preset--spacing--s);
		--pwr-chamfer: 18px;
		--pwr-chamfer-in: 17px;
	}
	/* mock 1d: menu left, logo optically centred, Hire now right — the same three-slot
	   composition as desktop at mobile scale (v2 §4, the client's instruction). */
	.pwr-header__row { column-gap: var(--wp--preset--spacing--s); }
	.pwr-header-logo img { height: 40px; }

	/* No box (23 Oct): the bordered square read as a stray button. "Menu" stays down to
	   480px, its icon closer than on desktop; under that it is the icon alone (below). */
	.pwr-header__row .wp-block-navigation__responsive-container-open,
	.pwr-header__row .wp-block-navigation__responsive-container-close {
		min-height: 46px;
		height: 46px;
		gap: 6px;
	}
	.pwr-header__row .wp-block-navigation__responsive-container-close { top: calc((var(--pwr-row-h) - 46px) / 2); }

	.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item__content { min-height: 52px; font-size: var(--wp--preset--font-size--l); }
	/* Phones: the list goes to one column, like everything else in the sheet. */
	.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__container { columns: 1; }
	.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content { row-gap: var(--wp--preset--spacing--l); }
	.pwr-header__contact-cols { grid-template-columns: 1fr; gap: var(--wp--preset--spacing--m); }

	/* the cast is proportionally tighter at this size (v2 §1) */
	.pwr-header__cast { left: 14px; right: 14px; bottom: -12px; height: 32px; filter: blur(12px); }
}

/* Small phones: the icon alone (Wayne, 23 Oct). The 40px lockup is 160px wide and there is
   not room for it between "Menu" and "Hire now" under ~480px; the word went rather than the
   logo shrinking back. Core's buttons keep their aria-labels, so nothing is lost to a reader. */
@media (max-width: 479px) {
	.pwr-header__row .wp-block-navigation__responsive-container-open::after,
	.pwr-header__row .wp-block-navigation__responsive-container-close::after { content: none; }
	/* The logo then sits evenly between the icon and Hire now rather than on the screen's
	   axis (about 30px left of it on a 390 phone). Forcing it to the axis was tried: Hire now
	   ran into the lockup below ~430px, so the even gaps win. */
}

/* The sheet's content follows the row's inline padding at every width, so the first menu label
   lines up under the Menu button. One rule, one token. */
.pwr-header__row .pwr-header__nav .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation__responsive-container-content {
	padding-inline: var(--pwr-row-pad);
}

/* ── the editor canvas ──
   The bar's layers are absolute on the frame, so the Site Editor renders them in place without
   help. Only the shadow is dropped: it hangs 18px below the part and reads as a smudge against
   the canvas rather than as depth over a page. */
.editor-styles-wrapper .pwr-header__cast { display: none; }

/* ══ fallbacks ══════════════════════════════════════════════════════════════════════════
   Trap 3 (glass needs something behind it) and the no-backdrop-filter fallback both live in
   assets/css/glass.css, because each needs a value PER SCHEME: `body.pwr-header-flat` raises a
   light chip toward white and a dark chip toward ink, and they are not the same number. The
   page-type signal that sets that body class is unchanged, in functions.php. */

@media (prefers-reduced-motion: reduce) {
	.pwr-header *,
	.pwr-header::before,
	.pwr-header::after { transition: none !important; }
	/* The lockup still leaves on scroll — it just cuts rather than travels. */
}

@media print {
	header.wp-block-template-part { position: static; }
	/* Every painted layer is fixed, which print cannot place — and a glass bar is nothing on
	   paper anyway. The lockup prints, at its old size. */
	.pwr-header::before,
	.pwr-header__frame::before,
	.pwr-header__frame::after,
	.pwr-header__cast { display: none; }
	.pwr-header .pwr-header__frame { margin: 0; width: auto; }
	.pwr-header__nav, .pwr-header__cta { display: none; }
	.pwr-header__row { min-height: 0; }
	.pwr-header-logo img { height: 40px; }
}
